mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
vtd: Make some pci access functions architecture independent.
Signed-off-by: Anthony Xu <anthony.xu@intel.com> Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
This commit is contained in:
1 parent
aa2c2fc508
commit
b79e6e11f8
4 files changed
+67
-60
No files matched your search
+1
-60
@@ -1,12 +1,9 @@
|
||||
/******************************************************************************
|
||||
* pci.c
|
||||
*
|
||||
* PCI access functions.
|
||||
* Architecture-dependent PCI access functions.
|
||||
*/
|
||||
|
||||
#include <xen/config.h>
|
||||
#include <xen/pci.h>
|
||||
#include <xen/pci_regs.h>
|
||||
#include <xen/spinlock.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
subdir-y += char
|
||||
subdir-y += cpufreq
|
||||
subdir-y += pci
|
||||
subdir-$(x86) += passthrough
|
||||
subdir-$(HAS_ACPI) += acpi
|
||||
subdir-$(HAS_VGA) += video
|
||||
@@ -0,0 +1 @@
|
||||
obj-y += pci.o
|
||||
@@ -0,0 +1,64 @@
|
||||
/******************************************************************************
|
||||
* pci.c
|
||||
*
|
||||
* Architecture-independent PCI access functions.
|
||||
*/
|
||||
|
||||
#include <xen/pci.h>
|
||||
#include <xen/pci_regs.h>
|
||||
|
||||
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;
|
||||
}
|
||||