From: Keir Fraser Date: Thu, 9 Oct 2008 11:47:31 +0000 (+0100) Subject: vtd: Make some pci access functions architecture independent. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14091^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b79e6e11f8aee9491f6cf60ae21669ce66d4b4e4;p=xen.git vtd: Make some pci access functions architecture independent. Signed-off-by: Anthony Xu Signed-off-by: Dexuan Cui --- diff --git a/xen/arch/x86/pci.c b/xen/arch/x86/pci.c index e139313e5f..e7e5f81dd4 100644 --- a/xen/arch/x86/pci.c +++ b/xen/arch/x86/pci.c @@ -1,12 +1,9 @@ /****************************************************************************** * pci.c * - * PCI access functions. + * Architecture-dependent PCI access functions. */ -#include -#include -#include #include #include @@ -118,59 +115,3 @@ void pci_conf_write32( pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), 0, 4, data); } -int pci_find_cap_offset(u8 bus, u8 dev, u8 func, u8 cap) -{ - u8 id; - int max_cap = 48; - u8 pos = PCI_CAPABILITY_LIST; - u16 status; - - status = pci_conf_read16(bus, dev, func, PCI_STATUS); - if ( (status & PCI_STATUS_CAP_LIST) == 0 ) - return 0; - - while ( max_cap-- ) - { - pos = pci_conf_read8(bus, dev, func, pos); - if ( pos < 0x40 ) - break; - - pos &= ~3; - id = pci_conf_read8(bus, dev, func, pos + PCI_CAP_LIST_ID); - - if ( id == 0xff ) - break; - else if ( id == cap ) - return pos; - - pos += PCI_CAP_LIST_NEXT; - } - - return 0; -} - -int pci_find_next_cap(u8 bus, unsigned int devfn, u8 pos, int cap) -{ - u8 id; - int ttl = 48; - - while ( ttl-- ) - { - pos = pci_conf_read8(bus, PCI_SLOT(devfn), PCI_FUNC(devfn), pos); - if ( pos < 0x40 ) - break; - - pos &= ~3; - id = pci_conf_read8(bus, PCI_SLOT(devfn), PCI_FUNC(devfn), - pos + PCI_CAP_LIST_ID); - - if ( id == 0xff ) - break; - if ( id == cap ) - return pos; - - pos += PCI_CAP_LIST_NEXT; - } - return 0; -} - diff --git a/xen/drivers/Makefile b/xen/drivers/Makefile index e88cd2ffe8..14c74611ba 100644 --- a/xen/drivers/Makefile +++ b/xen/drivers/Makefile @@ -1,5 +1,6 @@ subdir-y += char subdir-y += cpufreq +subdir-y += pci subdir-$(x86) += passthrough subdir-$(HAS_ACPI) += acpi subdir-$(HAS_VGA) += video diff --git a/xen/drivers/pci/Makefile b/xen/drivers/pci/Makefile new file mode 100644 index 0000000000..a98035df4c --- /dev/null +++ b/xen/drivers/pci/Makefile @@ -0,0 +1 @@ +obj-y += pci.o diff --git a/xen/drivers/pci/pci.c b/xen/drivers/pci/pci.c new file mode 100644 index 0000000000..278f6b536d --- /dev/null +++ b/xen/drivers/pci/pci.c @@ -0,0 +1,64 @@ +/****************************************************************************** + * pci.c + * + * Architecture-independent PCI access functions. + */ + +#include +#include + +int pci_find_cap_offset(u8 bus, u8 dev, u8 func, u8 cap) +{ + u8 id; + int max_cap = 48; + u8 pos = PCI_CAPABILITY_LIST; + u16 status; + + status = pci_conf_read16(bus, dev, func, PCI_STATUS); + if ( (status & PCI_STATUS_CAP_LIST) == 0 ) + return 0; + + while ( max_cap-- ) + { + pos = pci_conf_read8(bus, dev, func, pos); + if ( pos < 0x40 ) + break; + + pos &= ~3; + id = pci_conf_read8(bus, dev, func, pos + PCI_CAP_LIST_ID); + + if ( id == 0xff ) + break; + else if ( id == cap ) + return pos; + + pos += PCI_CAP_LIST_NEXT; + } + + return 0; +} + +int pci_find_next_cap(u8 bus, unsigned int devfn, u8 pos, int cap) +{ + u8 id; + int ttl = 48; + + while ( ttl-- ) + { + pos = pci_conf_read8(bus, PCI_SLOT(devfn), PCI_FUNC(devfn), pos); + if ( pos < 0x40 ) + break; + + pos &= ~3; + id = pci_conf_read8(bus, PCI_SLOT(devfn), PCI_FUNC(devfn), + pos + PCI_CAP_LIST_ID); + + if ( id == 0xff ) + break; + if ( id == cap ) + return pos; + + pos += PCI_CAP_LIST_NEXT; + } + return 0; +}