40#include <sys/endian.h>
41#include <sys/eventhandler.h>
43#include <sys/kernel.h>
44#include <sys/limits.h>
45#include <sys/linker.h>
46#include <sys/malloc.h>
47#include <sys/module.h>
50#include <sys/sysctl.h>
52#include <sys/taskqueue.h>
57#include <vm/vm_extern.h>
60#include <machine/bus.h>
62#include <machine/resource.h>
63#include <machine/stdarg.h>
65#if defined(__i386__) || defined(__amd64__) || defined(__powerpc__)
66#include <machine/intr_machdep.h>
79#include <dev/usb/controller/xhcireg.h>
80#include <dev/usb/controller/ehcireg.h>
81#include <dev/usb/controller/ohcireg.h>
82#include <dev/usb/controller/uhcireg.h>
84#include <dev/iommu/iommu.h>
89#define PCIR_IS_BIOS(cfg, reg) \
90 (((cfg)->hdrtype == PCIM_HDRTYPE_NORMAL && reg == PCIR_BIOS) || \
91 ((cfg)->hdrtype == PCIM_HDRTYPE_BRIDGE && reg == PCIR_BIOS_1))
107 struct resource_list *rl,
int force,
int prefetch);
111 int *device,
char **
desc);
113static int pci_modevent(module_t mod,
int what,
void *arg);
133 const char *
name,
int *unitp);
142 int b,
int s,
int f, uint16_t
vid, uint16_t
did);
149 DEVMETHOD(device_shutdown, bus_generic_shutdown),
150 DEVMETHOD(device_suspend, bus_generic_suspend),
167 DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource),
168 DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource),
171 DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource),
240#define PCI_QUIRK_MAP_REG 1
241#define PCI_QUIRK_DISABLE_MSI 2
242#define PCI_QUIRK_ENABLE_MSI_VM 3
243#define PCI_QUIRK_UNMAP_REG 4
244#define PCI_QUIRK_DISABLE_MSIX 5
245#define PCI_QUIRK_MSI_INTX_BUG 6
246#define PCI_QUIRK_REALLOC_BAR 7
330#define PCI_MAPMEM 0x01
331#define PCI_MAPMEMP 0x02
332#define PCI_MAPPORT 0x04
341 "PCI bus tuning parameters");
346 "Enable I/O and memory bits in the config register. Some BIOSes do not"
347 " enable these bits correctly. We'd like to do this all the time, but"
348 " there are some peripherals that this causes problems with.");
353 "Attempt to allocate a new range for any BARs whose original "
354 "firmware-assigned ranges fail to allocate during the initial device scan.");
357SYSCTL_INT(_hw_pci, OID_AUTO, do_power_nodriver, CTLFLAG_RWTUN,
359 "Place a function into D3 state when no driver attaches to it. 0 means"
360 " disable. 1 means conservatively place devices into D3 state. 2 means"
361 " aggressively place devices into D3 state. 3 means put absolutely"
362 " everything in D3 state.");
367 "Transition from D3 -> D0 on resume.");
370SYSCTL_INT(_hw_pci, OID_AUTO, do_power_suspend, CTLFLAG_RWTUN,
372 "Transition from D0 -> D3 on suspend.");
376 "Enable support for MSI interrupts");
380 "Enable support for MSI-X interrupts");
383SYSCTL_INT(_hw_pci, OID_AUTO, msix_rewrite_table, CTLFLAG_RWTUN,
385 "Rewrite entire MSI-X table when updating MSI-X entries");
388SYSCTL_INT(_hw_pci, OID_AUTO, honor_msi_blacklist, CTLFLAG_RDTUN,
391#if defined(__i386__) || defined(__amd64__)
396SYSCTL_INT(_hw_pci, OID_AUTO, usb_early_takeover, CTLFLAG_RDTUN,
398 "Enable early takeover of USB controllers. Disable this if you depend on"
399 " BIOS emulation of USB devices, that is you use USB devices (like"
400 " keyboard or mouse) but do not load USB drivers");
404 "Ignore firmware-assigned resources for BARs.");
406#if defined(NEW_PCIB) && defined(PCI_RES_BUS)
407static int pci_clear_buses;
408SYSCTL_INT(_hw_pci, OID_AUTO, clear_buses, CTLFLAG_RDTUN, &pci_clear_buses, 0,
409 "Ignore firmware-assigned bus numbers.");
414 0,
"Enable support for PCIe Alternative RID Interpretation");
418 0,
"Enable support for PCIe Active State Power Management");
421SYSCTL_INT(_hw_pci, OID_AUTO, clear_aer_on_attach, CTLFLAG_RWTUN,
423 "Clear port and device AER state on driver attach");
451 struct pci_devinfo *dinfo = NULL;
453 STAILQ_FOREACH(dinfo, &
pci_devq, pci_links) {
454 if ((dinfo->cfg.domain == domain) &&
455 (dinfo->cfg.bus ==
bus) &&
456 (dinfo->cfg.slot ==
slot) &&
457 (dinfo->cfg.func ==
func)) {
462 return (dinfo != NULL ? dinfo->cfg.dev : NULL);
470 struct pci_devinfo *dinfo;
472 STAILQ_FOREACH(dinfo, &
pci_devq, pci_links) {
473 if ((dinfo->cfg.vendor == vendor) &&
474 (dinfo->cfg.device == device)) {
475 return (dinfo->cfg.dev);
485 struct pci_devinfo *dinfo;
487 STAILQ_FOREACH(dinfo, &
pci_devq, pci_links) {
488 if (dinfo->cfg.baseclass ==
class &&
490 return (dinfo->cfg.dev);
500 struct pci_devinfo *dinfo;
503 STAILQ_FOREACH(dinfo, &
pci_devq, pci_links) {
504 if (from != NULL && found ==
false) {
505 if (from != dinfo->cfg.dev)
510 if (dinfo->cfg.baseclass ==
class &&
512 return (dinfo->cfg.dev);
525 retval = printf(
"pci%d:%d:%d:%d: ", cfg->
domain, cfg->
bus, cfg->
slot,
528 retval += vprintf(fmt, ap);
554 return (
"Prefetchable Memory");
568 while ((testval & 1) == 0)
596 while ((testval & 1) == 0)
647#define REG(n, w) PCIB_READ_CONFIG(pcib, b, s, f, n, w)
682#define REG(n, w) PCIB_READ_CONFIG(pcib, b, s, f, n, w)
698 return (malloc(
sizeof(
struct pci_devinfo), M_DEVBUF,
702static struct pci_devinfo *
704 uint16_t
vid, uint16_t
did)
706 struct pci_devinfo *devlist_entry;
709 devlist_entry = PCI_ALLOC_DEVINFO(
bus);
711 cfg = &devlist_entry->cfg;
733 STAILQ_INIT(&cfg->maps);
743 STAILQ_INSERT_TAIL(&
pci_devq, devlist_entry, pci_links);
745 devlist_entry->conf.pc_sel.pc_domain = cfg->
domain;
746 devlist_entry->conf.pc_sel.pc_bus = cfg->
bus;
747 devlist_entry->conf.pc_sel.pc_dev = cfg->
slot;
748 devlist_entry->conf.pc_sel.pc_func = cfg->
func;
749 devlist_entry->conf.pc_hdr = cfg->
hdrtype;
751 devlist_entry->conf.pc_subvendor = cfg->
subvendor;
752 devlist_entry->conf.pc_subdevice = cfg->
subdevice;
753 devlist_entry->conf.pc_vendor = cfg->
vendor;
754 devlist_entry->conf.pc_device = cfg->
device;
756 devlist_entry->conf.pc_class = cfg->
baseclass;
757 devlist_entry->conf.pc_subclass = cfg->
subclass;
758 devlist_entry->conf.pc_progif = cfg->
progif;
759 devlist_entry->conf.pc_revid = cfg->
revid;
764 return (devlist_entry);
771#define REG(n, w) PCIB_READ_CONFIG(pcib, cfg->bus, cfg->slot, cfg->func, \
772 cfg->ea.ea_location + (n), w)
779 uint64_t base, max_offset;
785 STAILQ_INIT(&cfg->
ea.ea_entries);
798 for (a = 0; a < num_ent; a++) {
799 eae = malloc(
sizeof(*eae), M_DEVBUF, M_WAITOK | M_ZERO);
807 for (b = 0; b < ent_size; b++) {
816 max_offset = dw[1] | ~PCIM_EA_FIELD_MASK;
819 base |= (uint64_t)dw[b] << 32UL;
824 max_offset |= (uint64_t)dw[b] << 32UL;
831 STAILQ_INSERT_TAIL(&cfg->
ea.ea_entries, eae, eae_link);
834 printf(
"PCI(EA) dev %04x:%04x, bei %d, flags #%x, base #%jx, max_offset #%jx\n",
845#define REG(n, w) PCIB_READ_CONFIG(pcib, cfg->bus, cfg->slot, cfg->func, n, w)
846#define WREG(n, v, w) PCIB_WRITE_CONFIG(pcib, cfg->bus, cfg->slot, cfg->func, n, v, w)
847#if defined(__i386__) || defined(__amd64__) || defined(__powerpc__)
851 int ptr, nextptr, ptrptr;
864 nextptr =
REG(ptrptr, 1);
869 while (nextptr != 0) {
872 printf(
"illegal PCI extended capability offset %d\n",
898#if defined(__i386__) || defined(__amd64__) || defined(__powerpc__)
908 if (
addr != MSI_INTEL_ADDR_BASE)
910 "HT device at pci%d:%d:%d:%d has non-default MSI window 0x%llx\n",
915 addr = MSI_INTEL_ADDR_BASE;
988#if defined(__powerpc__)
997 "Enabling MSI window for HyperTransport slave at pci%d:%d:%d:%d\n",
1011#define PCI_VPD_TIMEOUT 1000000
1018 KASSERT((
reg & 3) == 0, (
"VPD register must by 4 byte aligned"));
1038 KASSERT((
reg & 3) == 0, (
"VPD register must by 4 byte aligned"));
1052#undef PCI_VPD_TIMEOUT
1074 byte = vrs->
val & 0xff;
1077 vrs->
val = vrs->
val >> 8;
1078 byte = vrs->
val & 0xff;
1110 name = remain = i = 0;
1115 while (
state >= 0) {
1122 pci_printf(
cfg,
"vpd: val: %#x, off: %d, bytesinval: %d, byte: "
1123 "%#hhx, state: %d, remain: %d, name: %#x, i: %d\n", vrs.
val,
1138 remain |= byte2 << 8;
1141 remain =
byte & 0x7;
1142 name = (
byte >> 3) & 0xf;
1147 "start with ident (%#x)\n",
name);
1155 "VPD data overflow, remain %#x\n", remain);
1163 "duplicate VPD ident record\n");
1169 "VPD ident length %d exceeds 255\n",
1175 M_DEVBUF, M_WAITOK);
1218 M_DEVBUF, M_WAITOK | M_ZERO);
1242 }
else if (dflen == 0) {
1245 M_DEVBUF, M_WAITOK);
1251 M_DEVBUF, M_WAITOK);
1255 if (dflen == 0 && remain == 0)
1257 else if (dflen == 0)
1266 "RV", 2) == 0 && cksumvalid == -1) {
1272 "bad VPD cksum, remain %hhu\n",
1284 if (dflen == 0 && remain == 0) {
1288 M_DEVBUF, M_WAITOK | M_ZERO);
1290 }
else if (dflen == 0)
1304 M_DEVBUF, M_WAITOK | M_ZERO);
1320 M_DEVBUF, M_WAITOK);
1324 if (dflen == 0 && remain == 0)
1326 else if (dflen == 0)
1339 if (dflen == 0 && remain == 0) {
1343 M_DEVBUF, M_WAITOK | M_ZERO);
1345 }
else if (dflen == 0)
1361 if (cksumvalid <= 0 ||
state < -1) {
1392 struct pci_devinfo *dinfo = device_get_ivars(
child);
1410 struct pci_devinfo *dinfo = device_get_ivars(
child);
1431 struct pci_devinfo *dinfo = device_get_ivars(
dev);
1492 (
"start capability is not HyperTransport capability"));
1529 struct pci_devinfo *dinfo = device_get_ivars(
child);
1556 ptr = pci_read_config(
child, ptr, 1);
1585 (
"start capability is not expected capability"));
1609 struct pci_devinfo *dinfo = device_get_ivars(
child);
1619 ecap = pci_read_config(
child, ptr, 4);
1620 if (ecap == 0xffffffff || ecap == 0)
1631 ecap = pci_read_config(
child, ptr, 4);
1646 struct pci_devinfo *dinfo = device_get_ivars(
child);
1657 (
"start extended capability is not expected capability"));
1660 ecap = pci_read_config(
child, ptr, 4);
1678 struct pci_devinfo *dinfo = device_get_ivars(
dev);
1695 struct pci_devinfo *dinfo = device_get_ivars(
child);
1706 pci_write_config(
child,
1720 struct pci_devinfo *dinfo = device_get_ivars(
dev);
1722 uint32_t offset,
val;
1739 struct pci_devinfo *dinfo = device_get_ivars(
dev);
1741 uint32_t offset,
val;
1746 val &= ~PCIM_MSIX_VCTRL_MASK;
1758 struct pci_devinfo *dinfo = device_get_ivars(
dev);
1760 uint32_t offset, bit;
1764 bit = 1 <<
index % 32;
1776 struct pci_devinfo *dinfo = device_get_ivars(
dev);
1810 struct pci_devinfo *dinfo = device_get_ivars(
child);
1812 struct resource_list_entry *rle;
1813 int actual, error, i,
irq, max;
1820 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, 0);
1821 if (rle != NULL && rle->res != NULL)
1837 rle = resource_list_find(&dinfo->resources, SYS_RES_MEMORY,
1839 if (rle == NULL || rle->res == NULL ||
1840 !(rman_get_flags(rle->res) & RF_ACTIVE))
1844 rle = resource_list_find(&dinfo->resources, SYS_RES_MEMORY,
1846 if (rle == NULL || rle->res == NULL ||
1847 !(rman_get_flags(rle->res) & RF_ACTIVE))
1853 device_printf(
child,
1854 "attempting to allocate %d MSI-X vectors (%d supported)\n",
1857 for (i = 0; i < max; i++) {
1859 error = PCIB_ALLOC_MSIX(device_get_parent(
dev),
child, &
irq);
1865 resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1,
irq,
1871 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, 1);
1873 device_printf(
child,
"using IRQ %ju for MSI-X\n",
1883 device_printf(
child,
"using IRQs %ju", rle->start);
1886 for (i = 1; i < actual; i++) {
1887 rle = resource_list_find(&dinfo->resources,
1888 SYS_RES_IRQ, i + 1);
1891 if (rle->start ==
irq + 1) {
1904 printf(
",%ju", rle->start);
1911 printf(
" for MSI-X\n");
1921 M_DEVBUF, M_WAITOK | M_ZERO);
1923 M_DEVBUF, M_WAITOK | M_ZERO);
1924 for (i = 0; i < actual; i++) {
1925 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, i + 1);
1985 struct pci_devinfo *dinfo = device_get_ivars(
child);
1987 struct resource_list_entry *rle;
1988 int i,
irq, j, *used;
1999 for (i = 0; i <
count; i++)
2008 used = malloc(
sizeof(
int) * msix->
msix_alloc, M_DEVBUF, M_WAITOK |
2010 for (i = 0; i <
count; i++)
2014 if (used[i] == 0 && used[i + 1] == 1) {
2015 free(used, M_DEVBUF);
2019 free(used, M_DEVBUF);
2028 free(used, M_DEVBUF);
2031 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, i + 1);
2032 KASSERT(rle != NULL, (
"missing resource"));
2033 if (rle->res != NULL) {
2034 free(used, M_DEVBUF);
2043 resource_list_delete(&dinfo->resources, SYS_RES_IRQ, i + 1);
2052 M_DEVBUF, M_WAITOK | M_ZERO);
2053 for (i = 0; i <
count; i++)
2062 while (used[j] == 0) {
2063 PCIB_RELEASE_MSIX(device_get_parent(
dev),
child,
2067 vec = malloc(
sizeof(
struct msix_vector) * (j + 1), M_DEVBUF,
2075 free(used, M_DEVBUF);
2078 for (i = 0; i <
count; i++) {
2082 resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1,
irq,
2087 device_printf(
child,
"Remapped MSI-X IRQs as: ");
2088 for (i = 0; i <
count; i++) {
2106 struct pci_devinfo *dinfo = device_get_ivars(
child);
2108 struct resource_list_entry *rle;
2121 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, i + 1);
2122 KASSERT(rle != NULL, (
"missing resource"));
2123 if (rle->res != NULL)
2128 msix->
msix_ctrl &= ~PCIM_MSIXCTRL_MSIX_ENABLE;
2136 resource_list_delete(&dinfo->resources, SYS_RES_IRQ, i + 1);
2143 PCIB_RELEASE_MSIX(device_get_parent(
dev),
child,
2159 struct pci_devinfo *dinfo = device_get_ivars(
child);
2170 struct pci_devinfo *dinfo = device_get_ivars(
child);
2181 struct pci_devinfo *dinfo = device_get_ivars(
child);
2195 struct pci_devinfo *dinfo = device_get_ivars(
dev);
2220 struct pci_devinfo *dinfo = device_get_ivars(
dev);
2224 cap = dinfo->cfg.pcie.pcie_location;
2235 struct pci_devinfo *dinfo = device_get_ivars(
dev);
2239 cap = dinfo->cfg.pcie.pcie_location;
2245 return (1 << (
val + 7));
2251 struct pci_devinfo *dinfo = device_get_ivars(
dev);
2255 cap = dinfo->cfg.pcie.pcie_location;
2261 return (1 << (
val + 7));
2267 struct pci_devinfo *dinfo = device_get_ivars(
dev);
2271 cap = dinfo->cfg.pcie.pcie_location;
2278 size = (1 << (fls(size) - 1));
2280 val &= ~PCIEM_CTL_MAX_READ_REQUEST;
2281 val |= (fls(size) - 8) << 12;
2289 struct pci_devinfo *dinfo = device_get_ivars(
dev);
2292 cap = dinfo->cfg.pcie.pcie_location;
2296 return (0xffffffff);
2305 struct pci_devinfo *dinfo = device_get_ivars(
dev);
2308 cap = dinfo->cfg.pcie.pcie_location;
2325 struct pci_devinfo *dinfo = device_get_ivars(
dev);
2329 cap = dinfo->cfg.pcie.pcie_location;
2333 return (0xffffffff);
2338 new |= (
value & mask);
2350 struct pci_devinfo *dinfo = device_get_ivars(
child);
2377 struct pci_devinfo *dinfo = device_get_ivars(
child);
2384 msi->
msi_ctrl &= ~PCIM_MSICTRL_MSI_ENABLE;
2397 struct pci_devinfo *dinfo = device_get_ivars(
dev);
2423 struct pci_devinfo *dinfo = device_get_ivars(
dev);
2425 struct resource_list_entry *rle;
2442 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ,
2444 if (rle->start ==
irq) {
2445 error = PCIB_MAP_MSI(device_get_parent(
bus),
2449 pci_disable_msi(
dev);
2450 dinfo->cfg.msi.msi_addr =
addr;
2451 dinfo->cfg.msi.msi_data =
data;
2468 error = PCIB_MAP_MSI(device_get_parent(
bus),
2523 if (vm_guest != VM_GUEST_NO) {
2589 struct pci_devinfo *dinfo = device_get_ivars(
child);
2591 struct resource_list_entry *rle;
2592 int actual, error, i,
irqs[32];
2600 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, 0);
2601 if (rle != NULL && rle->res != NULL)
2617 device_printf(
child,
2618 "attempting to allocate %d MSI vectors (%d supported)\n",
2625 actual = min(actual, 32);
2628 if (!powerof2(actual))
2633 error = PCIB_ALLOC_MSI(device_get_parent(
dev),
child, actual,
2649 for (i = 0; i < actual; i++)
2650 resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1,
2655 device_printf(
child,
"using IRQ %d for MSI\n",
irqs[0]);
2664 device_printf(
child,
"using IRQs %d",
irqs[0]);
2666 for (i = 1; i < actual; i++) {
2675 printf(
"-%d",
irqs[i - 1]);
2680 printf(
",%d",
irqs[i]);
2685 printf(
"-%d",
irqs[actual - 1]);
2686 printf(
" for MSI\n");
2692 ctrl &= ~PCIM_MSICTRL_MME_MASK;
2693 ctrl |= (ffs(actual) - 1) << 4;
2708 struct pci_devinfo *dinfo = device_get_ivars(
child);
2710 struct resource_list_entry *rle;
2711 int error, i,
irqs[32];
2715 if (error != ENODEV)
2721 KASSERT(msi->
msi_alloc <= 32, (
"more than 32 alloc'd messages"));
2727 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, i + 1);
2728 KASSERT(rle != NULL, (
"missing MSI resource"));
2729 if (rle->res != NULL)
2731 irqs[i] = rle->start;
2736 (
"%s: MSI still enabled", __func__));
2737 msi->
msi_ctrl &= ~PCIM_MSICTRL_MME_MASK;
2744 resource_list_delete(&dinfo->resources, SYS_RES_IRQ, i + 1);
2762 struct pci_devinfo *dinfo = device_get_ivars(
child);
2775 struct devlist *devlist_head;
2781 if (dinfo->cfg.vpd.vpd_reg) {
2782 free(dinfo->cfg.vpd.vpd_ident, M_DEVBUF);
2783 for (i = 0; i < dinfo->cfg.vpd.vpd_rocnt; i++)
2784 free(dinfo->cfg.vpd.vpd_ros[i].value, M_DEVBUF);
2785 free(dinfo->cfg.vpd.vpd_ros, M_DEVBUF);
2786 for (i = 0; i < dinfo->cfg.vpd.vpd_wcnt; i++)
2787 free(dinfo->cfg.vpd.vpd_w[i].value, M_DEVBUF);
2788 free(dinfo->cfg.vpd.vpd_w, M_DEVBUF);
2790 STAILQ_FOREACH_SAFE(pm, &dinfo->cfg.maps, pm_link, next) {
2793 STAILQ_REMOVE(devlist_head, dinfo, pci_devinfo, pci_links);
2794 free(dinfo, M_DEVBUF);
2810 struct pci_devinfo *dinfo = device_get_ivars(
child);
2813 int oldstate, highest, delay;
2816 return (EOPNOTSUPP);
2823 oldstate = pci_get_powerstate(
child);
2824 if (oldstate ==
state)
2839 highest = (oldstate >
state) ? oldstate :
state;
2840 if (highest == PCI_POWERSTATE_D3)
2842 else if (highest == PCI_POWERSTATE_D2)
2847 & ~PCIM_PSTAT_DMASK;
2849 case PCI_POWERSTATE_D0:
2852 case PCI_POWERSTATE_D1:
2854 return (EOPNOTSUPP);
2857 case PCI_POWERSTATE_D2:
2859 return (EOPNOTSUPP);
2862 case PCI_POWERSTATE_D3:
2870 pci_printf(cfg,
"Transition from D%d to D%d\n", oldstate,
2882 struct pci_devinfo *dinfo = device_get_ivars(
child);
2891 result = PCI_POWERSTATE_D0;
2894 result = PCI_POWERSTATE_D1;
2897 result = PCI_POWERSTATE_D2;
2900 result = PCI_POWERSTATE_D3;
2903 result = PCI_POWERSTATE_UNKNOWN;
2908 result = PCI_POWERSTATE_D0;
2957 case SYS_RES_IOPORT:
2960 case SYS_RES_MEMORY:
2976 case SYS_RES_IOPORT:
2979 case SYS_RES_MEMORY:
3001 printf(
"found->\tvendor=0x%04x, dev=0x%04x, revid=0x%02x\n",
3003 printf(
"\tdomain=%d, bus=%d, slot=%d, func=%d\n",
3005 printf(
"\tclass=%02x-%02x-%02x, hdrtype=0x%02x, mfdev=%d\n",
3008 printf(
"\tcmdreg=0x%04x, statreg=0x%04x, cachelnsz=%d (dwords)\n",
3010 printf(
"\tlattimer=0x%02x (%d ns), mingnt=0x%02x (%d ns), maxlat=0x%02x (%d ns)\n",
3014 printf(
"\tintpin=%c, irq=%d\n",
3020 printf(
"\tpowerspec %d supports D0%s%s D3 current D%d\n",
3030 printf(
"\tMSI supports %d message%s%s%s\n",
3037 printf(
"\tMSI-X supports %d message%s ",
3041 printf(
"in map 0x%x\n",
3044 printf(
"in maps 0x%x and 0x%x\n",
3067 struct pci_devinfo *dinfo;
3077 dinfo = device_get_ivars(
dev);
3079 map = pci_read_config(
dev,
reg, 4);
3080 pci_write_config(
dev,
reg, 0xfffffffe, 4);
3081 testval = pci_read_config(
dev,
reg, 4);
3082 pci_write_config(
dev,
reg, map, 4);
3084 *testvalp = testval;
3090 map = pci_read_config(
dev,
reg, 4);
3117 pci_write_config(
dev,
reg, 0xffffffff, 4);
3118 if (ln2range == 64) {
3119 pci_write_config(
dev,
reg + 4, 0xffffffff, 4);
3122 testval |= pci_read_config(
dev,
reg, 4);
3129 pci_write_config(
dev,
reg, map, 4);
3131 pci_write_config(
dev,
reg + 4, map >> 32, 4);
3135 *testvalp = testval;
3137 *bar64 = (ln2range == 64);
3143 struct pci_devinfo *dinfo;
3147 dinfo = device_get_ivars(
dev);
3152 pci_write_config(
dev, pm->
pm_reg, base, 4);
3154 pci_write_config(
dev, pm->
pm_reg + 4, base >> 32, 4);
3158 pm->
pm_reg + 4, 4) << 32;
3164 struct pci_devinfo *dinfo;
3167 dinfo = device_get_ivars(
dev);
3168 STAILQ_FOREACH(pm, &dinfo->cfg.maps, pm_link) {
3178 struct pci_devinfo *dinfo;
3181 dinfo = device_get_ivars(
dev);
3186 if ((dinfo->cfg.flags &
PCICFG_VF) != 0) {
3189 iov = dinfo->cfg.iov;
3190 cmd = pci_read_config(iov->
iov_pf,
3205 struct pci_devinfo *dinfo;
3208 dinfo = device_get_ivars(
dev);
3209 pm = malloc(
sizeof(*pm), M_DEVBUF, M_WAITOK | M_ZERO);
3213 STAILQ_FOREACH(prev, &dinfo->cfg.maps, pm_link) {
3214 KASSERT(prev->
pm_reg != pm->
pm_reg, (
"duplicate map %02x",
3216 if (STAILQ_NEXT(prev, pm_link) == NULL ||
3221 STAILQ_INSERT_AFTER(&dinfo->cfg.maps, prev, pm, pm_link);
3223 STAILQ_INSERT_TAIL(&dinfo->cfg.maps, pm, pm_link);
3230 struct pci_devinfo *dinfo;
3234 dinfo = device_get_ivars(
dev);
3235 STAILQ_FOREACH(pm, &dinfo->cfg.maps, pm_link) {
3253 int force,
int prefetch)
3258 int barlen, basezero, flags, maprange, mapsize,
type;
3260 struct resource *res;
3269 barlen = maprange == 64 ? 2 : 1;
3275 type = SYS_RES_MEMORY;
3279 type = SYS_RES_IOPORT;
3282#ifdef __PCI_BAR_ZERO_VALID
3285 basezero = base == 0;
3288 barlen = maprange == 64 ? 2 : 1;
3299 if ((
type == SYS_RES_MEMORY && mapsize < 4) ||
3300 (
type == SYS_RES_IOPORT && mapsize < 2))
3306 printf(
"\tmap[%02x]: type %s, range %2d, base %#jx, size %2d",
3309 printf(
", port disabled\n");
3311 printf(
", memory disabled\n");
3313 printf(
", enabled\n");
3327 if (!force && (basezero || map == testval))
3329 if ((u_long)base != base) {
3331 "pci%d:%d:%d:%d bar %#x too many address bits",
3332 pci_get_domain(
dev), pci_get_bus(
dev), pci_get_slot(
dev),
3333 pci_get_function(
dev),
reg);
3364 flags = RF_ALIGNMENT_LOG2(mapsize);
3366 flags |= RF_PREFETCHABLE;
3372 end = base +
count - 1;
3386 && res == NULL && (
start != 0 || end != ~0)) {
3393 resource_list_delete(rl,
type,
reg);
3395 res = resource_list_reserve(rl,
bus,
dev,
type, &
reg, 0, ~0,
3407 resource_list_delete(rl,
type,
reg);
3411 "pci%d:%d:%d:%d bar %#x failed to allocate\n",
3412 pci_get_domain(
dev), pci_get_bus(
dev),
3413 pci_get_slot(
dev), pci_get_function(
dev),
reg);
3415 start = rman_get_start(res);
3430 uint32_t prefetchmask)
3436 if ((progif & 0x8a) == 0x8a) {
3439 printf(
"Trying ATA native PCI addressing mode\n");
3445 type = SYS_RES_IOPORT;
3448 prefetchmask & (1 << 0));
3450 prefetchmask & (1 << 1));
3453 resource_list_add(rl,
type,
rid, 0x1f0, 0x1f7, 8);
3454 (void)resource_list_reserve(rl,
bus,
dev,
type, &
rid, 0x1f0,
3457 resource_list_add(rl,
type,
rid, 0x3f6, 0x3f6, 1);
3458 (void)resource_list_reserve(rl,
bus,
dev,
type, &
rid, 0x3f6,
3463 prefetchmask & (1 << 2));
3465 prefetchmask & (1 << 3));
3468 resource_list_add(rl,
type,
rid, 0x170, 0x177, 8);
3469 (void)resource_list_reserve(rl,
bus,
dev,
type, &
rid, 0x170,
3472 resource_list_add(rl,
type,
rid, 0x376, 0x376, 1);
3473 (void)resource_list_reserve(rl,
bus,
dev,
type, &
rid, 0x376,
3477 prefetchmask & (1 << 4));
3479 prefetchmask & (1 << 5));
3485 struct pci_devinfo *dinfo = device_get_ivars(
dev);
3487 char tunable_name[64];
3495 irq = PCI_INVALID_IRQ;
3496 snprintf(tunable_name,
sizeof(tunable_name),
3497 "hw.pci%d.%d.%d.INT%c.irq",
3499 if (TUNABLE_INT_FETCH(tunable_name, &
irq) && (
irq >= 255 ||
irq <= 0))
3500 irq = PCI_INVALID_IRQ;
3509 if (!PCI_INTERRUPT_VALID(
irq)) {
3510 if (!PCI_INTERRUPT_VALID(cfg->
intline) || force_route)
3512 if (!PCI_INTERRUPT_VALID(
irq))
3517 if (!PCI_INTERRUPT_VALID(
irq))
3527 resource_list_add(&dinfo->resources, SYS_RES_IRQ, 0,
irq,
irq, 1);
3534 struct resource *res;
3540 res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &
rid, RF_ACTIVE);
3544 ctl = bus_read_4(res, OHCI_CONTROL);
3545 if (ctl & OHCI_IR) {
3547 printf(
"ohci early: "
3548 "SMM active, request owner change\n");
3549 bus_write_4(res, OHCI_COMMAND_STATUS, OHCI_OCR);
3550 for (i = 0; (i < 100) && (ctl & OHCI_IR); i++) {
3552 ctl = bus_read_4(res, OHCI_CONTROL);
3554 if (ctl & OHCI_IR) {
3556 printf(
"ohci early: "
3557 "SMM does not respond, resetting\n");
3558 bus_write_4(res, OHCI_CONTROL, OHCI_HCFS_RESET);
3561 bus_write_4(res, OHCI_INTERRUPT_DISABLE, OHCI_ALL_INTRS);
3564 bus_release_resource(self, SYS_RES_MEMORY,
rid, res);
3571 struct resource *res;
3580 pci_write_config(self, PCI_LEGSUP, PCI_LEGSUP_USBPIRQDEN, 2);
3583 rid = PCI_UHCI_BASE_REG;
3584 res = bus_alloc_resource_any(self, SYS_RES_IOPORT, &
rid, RF_ACTIVE);
3586 bus_write_2(res, UHCI_INTR, 0);
3587 bus_release_resource(self, SYS_RES_IOPORT,
rid, res);
3595 struct resource *res;
3605 res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &
rid, RF_ACTIVE);
3609 cparams = bus_read_4(res, EHCI_HCCPARAMS);
3612 for (eecp = EHCI_HCC_EECP(cparams); eecp != 0;
3613 eecp = EHCI_EECP_NEXT(eec)) {
3614 eec = pci_read_config(self, eecp, 4);
3615 if (EHCI_EECP_ID(eec) != EHCI_EC_LEGSUP) {
3618 bios_sem = pci_read_config(self, eecp +
3619 EHCI_LEGSUP_BIOS_SEM, 1);
3620 if (bios_sem == 0) {
3624 printf(
"ehci early: "
3625 "SMM active, request owner change\n");
3627 pci_write_config(self, eecp + EHCI_LEGSUP_OS_SEM, 1, 1);
3629 for (i = 0; (i < 100) && (bios_sem != 0); i++) {
3631 bios_sem = pci_read_config(self, eecp +
3632 EHCI_LEGSUP_BIOS_SEM, 1);
3635 if (bios_sem != 0) {
3637 printf(
"ehci early: "
3638 "SMM does not respond\n");
3641 offs = EHCI_CAPLENGTH(bus_read_4(res, EHCI_CAPLEN_HCIVERSION));
3642 bus_write_4(res, offs + EHCI_USBINTR, 0);
3644 bus_release_resource(self, SYS_RES_MEMORY,
rid, res);
3651 struct resource *res;
3661 res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &
rid, RF_ACTIVE);
3665 cparams = bus_read_4(res, XHCI_HCSPARAMS0);
3670 for (eecp = XHCI_HCS0_XECP(cparams) << 2; eecp != 0 && XHCI_XECP_NEXT(eec);
3671 eecp += XHCI_XECP_NEXT(eec) << 2) {
3672 eec = bus_read_4(res, eecp);
3674 if (XHCI_XECP_ID(eec) != XHCI_ID_USB_LEGACY)
3677 bios_sem = bus_read_1(res, eecp + XHCI_XECP_BIOS_SEM);
3682 printf(
"xhci early: "
3683 "SMM active, request owner change\n");
3685 bus_write_1(res, eecp + XHCI_XECP_OS_SEM, 1);
3689 for (i = 0; (i < 5000) && (bios_sem != 0); i++) {
3691 bios_sem = bus_read_1(res, eecp +
3692 XHCI_XECP_BIOS_SEM);
3695 if (bios_sem != 0) {
3697 printf(
"xhci early: "
3698 "SMM does not respond\n");
3702 offs = bus_read_1(res, XHCI_CAPLENGTH);
3703 bus_write_4(res, offs + XHCI_USBCMD, 0);
3704 bus_read_4(res, offs + XHCI_USBSTS);
3706 bus_release_resource(self, SYS_RES_MEMORY,
rid, res);
3709#if defined(NEW_PCIB) && defined(PCI_RES_BUS)
3712 struct resource_list *rl)
3714 struct resource *res;
3717 int rid, sec_bus, sec_reg, sub_bus, sub_reg, sup_bus;
3741 sec_bus = PCI_READ_CONFIG(
bus,
dev, sec_reg, 1);
3742 sub_bus = PCI_READ_CONFIG(
bus,
dev, sub_reg, 1);
3745 switch (pci_get_devid(
dev)) {
3747 sup_bus = pci_read_config(
dev, 0x41, 1);
3748 if (sup_bus != 0xff) {
3749 sec_bus = sup_bus + 1;
3750 sub_bus = sup_bus + 1;
3751 PCI_WRITE_CONFIG(
bus,
dev, sec_reg, sec_bus, 1);
3752 PCI_WRITE_CONFIG(
bus,
dev, sub_reg, sub_bus, 1);
3758 if ((cp = kern_getenv(
"smbios.planar.maker")) == NULL)
3760 if (strncmp(cp,
"Compal", 6) != 0) {
3765 if ((cp = kern_getenv(
"smbios.planar.product")) == NULL)
3767 if (strncmp(cp,
"08A0", 4) != 0) {
3772 if (sub_bus < 0xa) {
3774 PCI_WRITE_CONFIG(
bus,
dev, sub_reg, sub_bus, 1);
3780 printf(
"\tsecbus=%d, subbus=%d\n", sec_bus, sub_bus);
3781 if (sec_bus > 0 && sub_bus >= sec_bus) {
3786 resource_list_add(rl, PCI_RES_BUS, 0, 0, ~0,
count);
3794 if (pci_clear_buses)
3798 res = resource_list_reserve(rl,
bus,
dev, PCI_RES_BUS, &
rid,
3805 "pci%d:%d:%d:%d secbus failed to allocate\n",
3806 pci_get_domain(
dev), pci_get_bus(
dev),
3807 pci_get_slot(
dev), pci_get_function(
dev));
3811 PCI_WRITE_CONFIG(
bus,
dev, sec_reg, 0, 1);
3812 PCI_WRITE_CONFIG(
bus,
dev, sub_reg, 0, 1);
3815static struct resource *
3817 rman_res_t end, rman_res_t
count, u_int flags)
3819 struct pci_devinfo *dinfo;
3821 struct resource_list *rl;
3822 struct resource *res;
3823 int sec_reg, sub_reg;
3825 dinfo = device_get_ivars(
child);
3827 rl = &dinfo->resources;
3844 if (resource_list_find(rl, PCI_RES_BUS, *
rid) == NULL)
3845 resource_list_add(rl, PCI_RES_BUS, *
rid,
start, end,
count);
3846 if (!resource_list_reserved(rl, PCI_RES_BUS, *
rid)) {
3847 res = resource_list_reserve(rl,
dev,
child, PCI_RES_BUS,
rid,
3850 resource_list_delete(rl, PCI_RES_BUS, *
rid);
3851 device_printf(
child,
"allocating %ju bus%s failed\n",
3856 device_printf(
child,
3857 "Lazy allocation of %ju bus%s at %ju\n",
count,
3858 count == 1 ?
"" :
"es", rman_get_start(res));
3859 PCI_WRITE_CONFIG(
dev,
child, sec_reg, rman_get_start(res), 1);
3860 PCI_WRITE_CONFIG(
dev,
child, sub_reg, rman_get_end(res), 1);
3863 end,
count, flags));
3871 struct pci_devinfo *dinfo;
3875 dinfo = device_get_ivars(
dev);
3876 iov = dinfo->cfg.iov;
3907 struct pci_devinfo *dinfo;
3909 dinfo = device_get_ivars(
dev);
3911 STAILQ_FOREACH(ea, &dinfo->cfg.ea.ea_entries, eae_link) {
3923 struct pci_devinfo *dinfo;
3925 struct resource_list *rl;
3927 struct resource *res;
3933 dinfo = device_get_ivars(
dev);
3934 rl = &dinfo->resources;
3938 iov = dinfo->cfg.iov;
3941 if (dinfo->cfg.ea.ea_location == 0)
3944 STAILQ_FOREACH(ea, &dinfo->cfg.ea.ea_entries, eae_link) {
3959 flags = RF_PREFETCHABLE;
3963 type = SYS_RES_MEMORY;
3966 type = SYS_RES_IOPORT;
3972 if (alloc_iov != 0) {
3994 if ((resource_list_find(rl, SYS_RES_MEMORY,
rid) != NULL) ||
3995 (resource_list_find(rl, SYS_RES_IOPORT,
rid) != NULL))
4012 resource_list_delete(rl,
type,
rid);
4020 tmp &= ~PCIM_EA_ENABLE;
4033 pci_write_config(
dev,
rid, 0, 4);
4040 struct pci_devinfo *dinfo;
4042 struct resource_list *rl;
4047 dinfo = device_get_ivars(
dev);
4049 rl = &dinfo->resources;
4063 for (i = 0; i < cfg->
nummaps;) {
4065 if ((resource_list_find(rl, SYS_RES_MEMORY,
PCIR_BAR(i)) != NULL) ||
4066 (resource_list_find(rl, SYS_RES_IOPORT,
PCIR_BAR(i)) != NULL) ||
4080 if (q->
devid != 0) {
4085 prefetchmask & (1 << i));
4096#ifdef __PCI_REROUTE_INTERRUPT
4121#if defined(NEW_PCIB) && defined(PCI_RES_BUS)
4126 pci_reserve_secbus(
bus,
dev, cfg, rl);
4130static struct pci_devinfo *
4134 struct pci_devinfo *dinfo;
4146#define REG(n, w) PCIB_READ_CONFIG(pcib, busno, s, f, n, w)
4147 device_t
pcib = device_get_parent(
dev);
4148 struct pci_devinfo *dinfo;
4150 int s, f, pcifunchigh;
4162 PCIB_TRY_ENABLE_ARI(
pcib, dinfo->cfg.dev);
4171 for (s = 0; s <=
maxslots; s++, first_func = 0) {
4183 pcifunchigh = PCIB_MAXFUNCS(
pcib);
4184 for (f = first_func; f <= pcifunchigh; f++)
4193#define REG(n, w) PCIB_READ_CONFIG(pcib, busno, s, f, n, w)
4194 device_t
pcib = device_get_parent(
dev);
4195 device_t
child, *devlist, *unchanged;
4196 int devcount, error, i, j,
maxslots, oldcount;
4197 int busno, domain, s, f, pcifunchigh;
4201 error = device_get_children(
dev, &devlist, &devcount);
4204 if (devcount != 0) {
4205 unchanged = malloc(devcount *
sizeof(device_t), M_TEMP,
4207 if (unchanged == NULL) {
4208 free(devlist, M_TEMP);
4214 domain = pcib_get_domain(
dev);
4215 busno = pcib_get_bus(
dev);
4227 pcifunchigh = PCIB_MAXFUNCS(
pcib);
4228 for (f = 0; f <= pcifunchigh; f++) {
4236 for (i = 0; i < devcount; i++) {
4240 if (pci_get_slot(
child) == s &&
4241 pci_get_function(
child) == f) {
4242 unchanged[i] =
child;
4253 for (i = 0; i < devcount; i++) {
4254 if (unchanged[i] != NULL)
4256 device_delete_child(
dev, devlist[i]);
4259 free(devlist, M_TEMP);
4260 oldcount = devcount;
4263 error = device_get_children(
dev, &devlist, &devcount);
4265 free(unchanged, M_TEMP);
4269 for (i = 0; i < devcount; i++) {
4270 for (j = 0; j < oldcount; j++) {
4271 if (devlist[i] == unchanged[j])
4275 device_probe_and_attach(devlist[i]);
4279 free(unchanged, M_TEMP);
4280 free(devlist, M_TEMP);
4290 struct pci_devinfo *vf_dinfo;
4294 pcib = device_get_parent(
bus);
4304 return (vf_dinfo->cfg.dev);
4309 uint16_t
vid, uint16_t
did)
4322 struct pci_devinfo *dinfo = device_get_ivars(
dev);
4324 uint16_t rmps, mmps, mps;
4326 if (dinfo->cfg.pcie.pcie_location == 0)
4362 if (dinfo->cfg.pcie.pcie_location != 0 &&
4364 r2 = pci_read_config(
dev, dinfo->cfg.pcie.pcie_location +
4368 pci_write_config(
dev, dinfo->cfg.pcie.pcie_location +
4374 if (r != 0 && bootverbose) {
4376 "clearing AER UC 0x%08x -> 0x%08x\n",
4403 if (r != 0 && bootverbose) {
4405 "clearing AER COR 0x%08x -> 0x%08x\n",
4421 r = pci_read_config(
dev, dinfo->cfg.pcie.pcie_location +
4425 pci_write_config(
dev, dinfo->cfg.pcie.pcie_location +
4435 dinfo->cfg.dev =
dev = device_add_child(
bus, NULL, -1);
4436 device_set_ivars(
dev, dinfo);
4437 resource_list_init(&dinfo->resources);
4443 pci_child_added(dinfo->cfg.dev);
4448 EVENTHANDLER_INVOKE(pci_add_device, dinfo->cfg.dev);
4461 device_set_desc(
dev,
"PCI bus");
4464 return (BUS_PROBE_GENERIC);
4476 sc = device_get_softc(
dev);
4477 domain = pcib_get_domain(
dev);
4478 busno = pcib_get_bus(
dev);
4481 sc->sc_bus = bus_alloc_resource(
dev, PCI_RES_BUS, &
rid, busno, busno,
4483 if (sc->sc_bus == NULL) {
4484 device_printf(
dev,
"failed to allocate bus number\n");
4489 device_printf(
dev,
"domain=%d, physical bus=%d\n",
4498 int busno, domain, error;
4510 domain = pcib_get_domain(
dev);
4511 busno = pcib_get_bus(
dev);
4513 return (bus_generic_attach(
dev));
4524 error = bus_generic_detach(
dev);
4528 sc = device_get_softc(
dev);
4529 error = bus_release_resource(
dev, PCI_RES_BUS, 0, sc->sc_bus);
4533 return (device_delete_children(
dev));
4541 char me1[24], me2[32];
4544 device_location_cache_t *cache;
4546 d = pci_get_domain(
child);
4547 b = pci_get_bus(
child);
4548 s = pci_get_slot(
child);
4549 f = pci_get_function(
child);
4550 snprintf(me1,
sizeof(me1),
"pci%u:%u:%u", b, s, f);
4551 snprintf(me2,
sizeof(me2),
"pci%u:%u:%u:%u", d, b, s, f);
4553 cache = dev_wired_cache_init();
4554 while (resource_find_dev(&line,
name, &unit,
"at", NULL) == 0) {
4555 resource_string_value(
name, unit,
"at", &at);
4556 if (strcmp(at, me1) == 0 || strcmp(at, me2) == 0) {
4560 if (dev_wired_cache_match(cache,
child, at)) {
4565 dev_wired_cache_fini(cache);
4581 pcib = device_get_parent(
dev);
4583 if (device_is_attached(
child) &&
4584 PCIB_POWER_FOR_SLEEP(
pcib,
child, &dstate) == 0)
4585 pci_set_powerstate(
child, dstate);
4591 struct pci_devinfo *dinfo;
4592 struct resource_list_entry *rle;
4595 dinfo = device_get_ivars(
child);
4604 error = bus_generic_suspend_child(
dev,
child);
4617 rle = resource_list_find(&dinfo->resources,
4619 if (rle != NULL && rle->res != NULL)
4620 (void)bus_suspend_intr(
child, rle->res);
4630 struct pci_devinfo *dinfo;
4631 struct resource_list_entry *rle;
4636 dinfo = device_get_ivars(
child);
4638 if (!device_is_attached(
child))
4641 bus_generic_resume_child(
dev,
child);
4648 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, 0);
4649 if (rle != NULL && rle->res != NULL)
4650 (void)bus_resume_intr(
child, rle->res);
4659 device_t
child, *devlist;
4660 int error, i, numdevs;
4662 if ((error = device_get_children(
dev, &devlist, &numdevs)) != 0)
4668 for (i = 0; i < numdevs; i++) {
4670 switch (pci_get_class(
child)) {
4679 for (i = 0; i < numdevs; i++) {
4681 switch (pci_get_class(
child)) {
4691 free(devlist, M_TEMP);
4702 data = preload_search_by_type(
"pci_vendor_data");
4704 ptr = preload_fetch_addr(
data);
4705 sz = preload_fetch_size(
data);
4706 if (ptr != NULL && sz != 0) {
4721 struct pci_devinfo *dinfo;
4725 device_printf(
dev,
"driver added\n");
4726 DEVICE_IDENTIFY(driver,
dev);
4727 if (device_get_children(
dev, &devlist, &numdevs) != 0)
4729 for (i = 0; i < numdevs; i++) {
4731 if (device_get_state(
child) != DS_NOTPRESENT)
4733 dinfo = device_get_ivars(
child);
4736 pci_printf(&dinfo->cfg,
"reprobing on driver added\n");
4738 if (device_probe_and_attach(
child) != 0)
4741 free(devlist, M_TEMP);
4746 driver_filter_t *filter, driver_intr_t *intr,
void *arg,
void **cookiep)
4748 struct pci_devinfo *dinfo;
4756 error = bus_generic_setup_intr(
dev,
child,
irq, flags, filter, intr,
4762 if (device_get_parent(
child) !=
dev) {
4779 dinfo = device_get_ivars(
child);
4780 if (dinfo->cfg.msi.msi_alloc > 0) {
4781 if (dinfo->cfg.msi.msi_addr == 0) {
4782 KASSERT(dinfo->cfg.msi.msi_handlers == 0,
4783 (
"MSI has handlers, but vectors not mapped"));
4784 error = PCIB_MAP_MSI(device_get_parent(
dev),
4788 dinfo->cfg.msi.msi_addr =
addr;
4789 dinfo->cfg.msi.msi_data =
data;
4791 if (dinfo->cfg.msi.msi_handlers == 0)
4792 pci_enable_msi(
child, dinfo->cfg.msi.msi_addr,
4793 dinfo->cfg.msi.msi_data);
4794 dinfo->cfg.msi.msi_handlers++;
4796 KASSERT(dinfo->cfg.msix.msix_alloc > 0,
4797 (
"No MSI or MSI-X interrupts allocated"));
4799 (
"MSI-X index too high"));
4800 mte = &dinfo->cfg.msix.msix_table[
rid - 1];
4801 KASSERT(mte->
mte_vector != 0, (
"no message vector"));
4802 mv = &dinfo->cfg.msix.msix_vectors[mte->
mte_vector - 1];
4803 KASSERT(mv->
mv_irq == rman_get_start(
irq),
4807 (
"MSI-X table entry has handlers, but vector not mapped"));
4808 error = PCIB_MAP_MSI(device_get_parent(
dev),
4857 struct resource_list_entry *rle;
4858 struct pci_devinfo *dinfo;
4861 if (
irq == NULL || !(rman_get_flags(
irq) & RF_ACTIVE))
4865 if (device_get_parent(
child) !=
dev)
4866 return(bus_generic_teardown_intr(
dev,
child,
irq, cookie));
4879 dinfo = device_get_ivars(
child);
4880 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ,
rid);
4881 if (rle->res !=
irq)
4883 if (dinfo->cfg.msi.msi_alloc > 0) {
4885 (
"MSI-X index too high"));
4886 if (dinfo->cfg.msi.msi_handlers == 0)
4888 dinfo->cfg.msi.msi_handlers--;
4889 if (dinfo->cfg.msi.msi_handlers == 0)
4890 pci_disable_msi(
child);
4892 KASSERT(dinfo->cfg.msix.msix_alloc > 0,
4893 (
"No MSI or MSI-X interrupts allocated"));
4895 (
"MSI-X index too high"));
4896 mte = &dinfo->cfg.msix.msix_table[
rid - 1];
4904 error = bus_generic_teardown_intr(
dev,
child,
irq, cookie);
4907 (
"%s: generic teardown failed for MSI/MSI-X", __func__));
4914 struct pci_devinfo *dinfo;
4915 struct resource_list *rl;
4918 dinfo = device_get_ivars(
child);
4919 rl = &dinfo->resources;
4921 retval += bus_print_child_header(
dev,
child);
4923 retval += resource_list_print_type(rl,
"port", SYS_RES_IOPORT,
"%#jx");
4924 retval += resource_list_print_type(rl,
"mem", SYS_RES_MEMORY,
"%#jx");
4925 retval += resource_list_print_type(rl,
"irq", SYS_RES_IRQ,
"%jd");
4926 if (device_get_flags(
dev))
4927 retval += printf(
" flags %#x", device_get_flags(
dev));
4929 retval += printf(
" at device %d.%d", pci_get_slot(
child),
4930 pci_get_function(
child));
4932 retval += bus_print_child_domain(
dev,
child);
4933 retval += bus_print_child_footer(
dev,
child);
5040 const char *cp, *scp;
5048 device_printf(
dev,
"<%s>", device);
5049 free(device, M_DEVBUF);
5063 pci_get_subclass(
child)) {
5069 if (
report || bootverbose) {
5070 device_printf(
dev,
"<%s%s%s>",
5072 ((cp != NULL) && (scp != NULL)) ?
", " :
"",
5076 if (
report || bootverbose) {
5077 printf(
" at device %d.%d (no driver attached)\n",
5078 pci_get_slot(
child), pci_get_function(
child));
5086 struct pci_devinfo *dinfo;
5087 struct resource_list *rl;
5089 dinfo = device_get_ivars(
child);
5090 rl = &dinfo->resources;
5097 if (resource_list_release_active(rl,
dev,
child, SYS_RES_IRQ) != 0)
5098 pci_printf(&dinfo->cfg,
"Device leaked IRQ resources\n");
5099 if (dinfo->cfg.msi.msi_alloc != 0 || dinfo->cfg.msix.msix_alloc != 0) {
5100 if (dinfo->cfg.msi.msi_alloc != 0)
5101 pci_printf(&dinfo->cfg,
"Device leaked %d MSI "
5102 "vectors\n", dinfo->cfg.msi.msi_alloc);
5104 pci_printf(&dinfo->cfg,
"Device leaked %d MSI-X "
5105 "vectors\n", dinfo->cfg.msix.msix_alloc);
5106 (void)pci_release_msi(
child);
5108 if (resource_list_release_active(rl,
dev,
child, SYS_RES_MEMORY) != 0)
5109 pci_printf(&dinfo->cfg,
"Device leaked memory resources\n");
5110 if (resource_list_release_active(rl,
dev,
child, SYS_RES_IOPORT) != 0)
5111 pci_printf(&dinfo->cfg,
"Device leaked I/O resources\n");
5113 if (resource_list_release_active(rl,
dev,
child, PCI_RES_BUS) != 0)
5114 pci_printf(&dinfo->cfg,
"Device leaked PCI bus numbers\n");
5166 sscanf(cp,
"%x\t%80[^\n]", vendor, *
desc) == 2)
5170 sscanf(cp,
"%x\t%80[^\n]", device, *
desc) == 2)
5174 while (*cp !=
'\n' && left > 0) {
5184 while (*cp !=
'\n' && left > 0) {
5188 if (*cp ==
'\n' && left > 0)
5198 char *
desc, *vp, *dp, *line;
5200 desc = vp = dp = NULL;
5212 if ((vp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL)
5217 if (vendor == pci_get_vendor(
dev))
5220 if ((dp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL)
5231 if (device == pci_get_device(
dev))
5235 snprintf(dp, 80,
"0x%x", pci_get_device(
dev));
5236 if ((
desc = malloc(strlen(vp) + strlen(dp) + 3, M_DEVBUF, M_NOWAIT)) !=
5238 sprintf(
desc,
"%s, %s", vp, dp);
5250 struct pci_devinfo *dinfo;
5253 dinfo = device_get_ivars(
child);
5257 case PCI_IVAR_ETHADDR:
5262 *((uint8_t **) result) = NULL;
5264 case PCI_IVAR_SUBVENDOR:
5267 case PCI_IVAR_SUBDEVICE:
5270 case PCI_IVAR_VENDOR:
5273 case PCI_IVAR_DEVICE:
5276 case PCI_IVAR_DEVID:
5279 case PCI_IVAR_CLASS:
5282 case PCI_IVAR_SUBCLASS:
5285 case PCI_IVAR_PROGIF:
5288 case PCI_IVAR_REVID:
5289 *result = cfg->
revid;
5291 case PCI_IVAR_INTPIN:
5297 case PCI_IVAR_DOMAIN:
5304 *result = cfg->
slot;
5306 case PCI_IVAR_FUNCTION:
5307 *result = cfg->
func;
5309 case PCI_IVAR_CMDREG:
5312 case PCI_IVAR_CACHELNSZ:
5315 case PCI_IVAR_MINGNT:
5322 case PCI_IVAR_MAXLAT:
5329 case PCI_IVAR_LATTIMER:
5341 struct pci_devinfo *dinfo;
5343 dinfo = device_get_ivars(
child);
5346 case PCI_IVAR_INTPIN:
5347 dinfo->cfg.intpin =
value;
5349 case PCI_IVAR_ETHADDR:
5350 case PCI_IVAR_SUBVENDOR:
5351 case PCI_IVAR_SUBDEVICE:
5352 case PCI_IVAR_VENDOR:
5353 case PCI_IVAR_DEVICE:
5354 case PCI_IVAR_DEVID:
5355 case PCI_IVAR_CLASS:
5356 case PCI_IVAR_SUBCLASS:
5357 case PCI_IVAR_PROGIF:
5358 case PCI_IVAR_REVID:
5360 case PCI_IVAR_DOMAIN:
5363 case PCI_IVAR_FUNCTION:
5374#include <sys/cons.h>
5380DB_SHOW_COMMAND(pciregs, db_pci_dump)
5382 struct pci_devinfo *dinfo;
5383 struct devlist *devlist_head;
5386 int i, error, none_count;
5395 for (error = 0, i = 0,
5396 dinfo = STAILQ_FIRST(devlist_head);
5397 (dinfo != NULL) && (error == 0) && (i <
pci_numdevs) && !db_pager_quit;
5398 dinfo = STAILQ_NEXT(dinfo, pci_links), i++) {
5402 name = device_get_name(dinfo->cfg.dev);
5405 db_printf(
"%s%d@pci%d:%d:%d:%d:\tclass=0x%06x card=0x%08x "
5406 "chip=0x%08x rev=0x%02x hdr=0x%02x\n",
5408 (
name && *
name) ? (
int)device_get_unit(dinfo->cfg.dev) :
5410 p->pc_sel.pc_domain, p->pc_sel.pc_bus, p->pc_sel.pc_dev,
5411 p->pc_sel.pc_func, (p->pc_class << 16) |
5412 (p->pc_subclass << 8) | p->pc_progif,
5413 (p->pc_subdevice << 16) | p->pc_subvendor,
5414 (p->pc_device << 16) | p->pc_vendor,
5415 p->pc_revid, p->pc_hdr);
5422 rman_res_t
start, rman_res_t end, rman_res_t
count, u_int num,
5425 struct pci_devinfo *dinfo = device_get_ivars(
child);
5426 struct resource_list *rl = &dinfo->resources;
5427 struct resource *res;
5469 if (
type != SYS_RES_MEMORY) {
5472 "child %s requested type %d for rid %#x,"
5473 " but the BAR says it is an memio\n",
5478 if (
type != SYS_RES_IOPORT) {
5481 "child %s requested type %d for rid %#x,"
5482 " but the BAR says it is an ioport\n",
5496 if (RF_ALIGNMENT(flags) < mapsize)
5497 flags = (flags & ~RF_ALIGNMENT_MASK) | RF_ALIGNMENT_LOG2(mapsize);
5499 flags |= RF_PREFETCHABLE;
5507 count, flags & ~RF_ACTIVE);
5509 resource_list_delete(rl,
type, *
rid);
5510 device_printf(
child,
5511 "%#jx bytes of rid %#x res %d failed (%#jx, %#jx).\n",
5516 device_printf(
child,
5517 "Lazy allocation of %#jx bytes rid %#x type %d at %#jx\n",
5525 map = rman_get_start(res);
5536 rman_res_t
start, rman_res_t end, rman_res_t
count, u_long num,
5539 struct pci_devinfo *dinfo;
5540 struct resource_list *rl;
5541 struct resource_list_entry *rle;
5542 struct resource *res;
5548 dinfo = device_get_ivars(
child);
5549 rl = &dinfo->resources;
5552#if defined(NEW_PCIB) && defined(PCI_RES_BUS)
5571 if (*
rid == 0 && !PCI_INTERRUPT_VALID(cfg->
intline) &&
5575 case SYS_RES_IOPORT:
5576 case SYS_RES_MEMORY:
5592 return (bus_generic_alloc_resource(
dev,
child,
5598 rle = resource_list_find(rl,
type, *
rid);
5612 rman_res_t
start, rman_res_t end, rman_res_t
count, u_int flags)
5615 struct pci_devinfo *dinfo;
5618 if (device_get_parent(
child) !=
dev)
5619 return (BUS_ALLOC_RESOURCE(device_get_parent(
dev),
child,
5623 dinfo = device_get_ivars(
child);
5627 case SYS_RES_IOPORT:
5629 case SYS_RES_MEMORY:
5646 struct pci_devinfo *dinfo;
5647 struct resource_list *rl;
5650 if (device_get_parent(
child) !=
dev)
5651 return (BUS_RELEASE_RESOURCE(device_get_parent(
dev),
child,
5654 dinfo = device_get_ivars(
child);
5661 case SYS_RES_IOPORT:
5663 case SYS_RES_MEMORY:
5678 (
type == SYS_RES_IOPORT ||
type == SYS_RES_MEMORY)) {
5689 rl = &dinfo->resources;
5697 struct pci_devinfo *dinfo;
5705 if (device_get_parent(
child) ==
dev) {
5707 dinfo = device_get_ivars(
child);
5712 case SYS_RES_IOPORT:
5713 case SYS_RES_MEMORY:
5723 int rid,
struct resource *r)
5725 struct pci_devinfo *dinfo;
5733 if (device_get_parent(
child) ==
dev) {
5734 dinfo = device_get_ivars(
child);
5745 struct resource_list_entry *rle;
5746 struct resource_list *rl;
5747 struct pci_devinfo *dinfo;
5749 dinfo = device_get_ivars(
child);
5750 rl = &dinfo->resources;
5752 EVENTHANDLER_INVOKE(pci_delete_device,
child);
5755 if (bus_child_present(
child) != 0) {
5759 pci_disable_busmaster(
child);
5763 STAILQ_FOREACH(rle, rl, link) {
5765 if (rman_get_flags(rle->res) & RF_ACTIVE ||
5766 resource_list_busy(rl, rle->type, rle->rid)) {
5768 "Resource still owned, oops. "
5769 "(type=%d, rid=%d, addr=%lx)\n",
5770 rle->type, rle->rid,
5771 rman_get_start(rle->res));
5772 bus_release_resource(
child, rle->type, rle->rid,
5775 resource_list_unreserve(rl,
dev,
child, rle->type,
5779 resource_list_free(rl);
5787 struct pci_devinfo *dinfo;
5788 struct resource_list *rl;
5789 struct resource_list_entry *rle;
5791 if (device_get_parent(
child) !=
dev)
5794 dinfo = device_get_ivars(
child);
5795 rl = &dinfo->resources;
5796 rle = resource_list_find(rl,
type,
rid);
5801 if (rman_get_flags(rle->res) & RF_ACTIVE ||
5802 resource_list_busy(rl,
type,
rid)) {
5803 device_printf(
dev,
"delete_resource: "
5804 "Resource still owned by child, oops. "
5805 "(type=%d, rid=%d, addr=%jx)\n",
5806 type,
rid, rman_get_start(rle->res));
5811 resource_list_delete(rl,
type,
rid);
5814struct resource_list *
5817 struct pci_devinfo *dinfo = device_get_ivars(
child);
5819 return (&dinfo->resources);
5829 if (device_get_parent(
dev) ==
bus) {
5831 tag = iommu_get_dma_tag(
bus,
dev);
5835 sc = device_get_softc(
bus);
5853 struct pci_devinfo *dinfo = device_get_ivars(
child);
5869 return (cfg->
vendor & 0xff);
5871 return (0xffffffff);
5879 return (cfg->
device & 0xff);
5881 return (0xffffffff);
5887 return (PCIB_READ_CONFIG(device_get_parent(
dev),
5895 struct pci_devinfo *dinfo = device_get_ivars(
child);
5898 PCIB_WRITE_CONFIG(device_get_parent(
dev),
5906 sbuf_printf(sb,
"slot=%d function=%d dbsf=pci%d:%d:%d:%d",
5915 struct pci_devinfo *dinfo;
5918 dinfo = device_get_ivars(
child);
5920 sbuf_printf(sb,
"vendor=0x%04x device=0x%04x subvendor=0x%04x "
5921 "subdevice=0x%04x class=0x%02x%02x%02x", cfg->
vendor, cfg->
device,
5931 device_t parent = device_get_parent(
bus);
5934 if (strcmp(locator, BUS_LOCATOR_UEFI) == 0) {
5935 rv = bus_generic_get_device_path(parent,
bus, locator, sb);
5937 sbuf_printf(sb,
"/Pci(0x%x,0x%x)", pci_get_slot(
child),
5938 pci_get_function(
child));
5942 return (bus_generic_get_device_path(
bus,
child, locator, sb));
5948 struct pci_devinfo *dinfo = device_get_ivars(
child);
5951 return (PCIB_ROUTE_INTERRUPT(device_get_parent(
dev),
child,
5970 if (strncmp(
name,
"pci", 3) != 0)
5972 val = strtol(
name + 3, &end, 10);
5973 if (val < 0 || val > INT_MAX || *end !=
':')
5976 val = strtol(end + 1, &end, 10);
5977 if (val < 0 || val > INT_MAX || *end !=
':')
5980 val = strtol(end + 1, &end, 10);
5981 if (val < 0 || val > INT_MAX)
5985 val = strtol(end + 1, &end, 10);
5986 if (val < 0 || val > INT_MAX || *end !=
'\0')
5989 }
else if (*end ==
'\0') {
6007 static struct cdev *pci_cdev;
6008 static eventhandler_tag tag;
6014 pci_cdev = make_dev(&
pcicdev, 0, UID_ROOT, GID_WHEEL, 0644,
6017 tag = EVENTHANDLER_REGISTER(dev_lookup,
pci_lookup, NULL,
6023 EVENTHANDLER_DEREGISTER(dev_lookup, tag);
6024 destroy_dev(pci_cdev);
6034#define WREG(n, v) pci_write_config(dev, pos + (n), (v), 2)
6038 cfg = &dinfo->cfg.pcie;
6071 dinfo->cfg.pcix.pcix_command, 2);
6086 if (pci_get_powerstate(
dev) != PCI_POWERSTATE_D0)
6087 pci_set_powerstate(
dev, PCI_POWERSTATE_D0);
6101 dinfo->cfg.bridge.br_seclat, 1);
6103 dinfo->cfg.bridge.br_subbus, 1);
6105 dinfo->cfg.bridge.br_secbus, 1);
6107 dinfo->cfg.bridge.br_pribus, 1);
6109 dinfo->cfg.bridge.br_control, 2);
6113 dinfo->cfg.bridge.br_seclat, 1);
6115 dinfo->cfg.bridge.br_subbus, 1);
6117 dinfo->cfg.bridge.br_secbus, 1);
6119 dinfo->cfg.bridge.br_pribus, 1);
6121 dinfo->cfg.bridge.br_control, 2);
6132 if (dinfo->cfg.pcie.pcie_location != 0)
6134 if (dinfo->cfg.pcix.pcix_location != 0)
6138 if (dinfo->cfg.msi.msi_location != 0)
6140 if (dinfo->cfg.msix.msix_location != 0)
6144 if (dinfo->cfg.iov != NULL)
6152#define RREG(n) pci_read_config(dev, pos + (n), 2)
6156 cfg = &dinfo->cfg.pcie;
6190 dinfo->cfg.pcix.pcix_command = pci_read_config(
dev,
6226 dinfo->cfg.bridge.br_seclat = pci_read_config(
dev,
6228 dinfo->cfg.bridge.br_subbus = pci_read_config(
dev,
6230 dinfo->cfg.bridge.br_secbus = pci_read_config(
dev,
6232 dinfo->cfg.bridge.br_pribus = pci_read_config(
dev,
6234 dinfo->cfg.bridge.br_control = pci_read_config(
dev,
6238 dinfo->cfg.bridge.br_seclat = pci_read_config(
dev,
6240 dinfo->cfg.bridge.br_subbus = pci_read_config(
dev,
6242 dinfo->cfg.bridge.br_secbus = pci_read_config(
dev,
6244 dinfo->cfg.bridge.br_pribus = pci_read_config(
dev,
6246 dinfo->cfg.bridge.br_control = pci_read_config(
dev,
6253 if (dinfo->cfg.pcie.pcie_location != 0)
6256 if (dinfo->cfg.pcix.pcix_location != 0)
6260 if (dinfo->cfg.iov != NULL)
6272 cls = pci_get_class(
dev);
6295 ps = pci_get_powerstate(
dev);
6296 if (ps != PCI_POWERSTATE_D0 && ps != PCI_POWERSTATE_D3)
6297 pci_set_powerstate(
dev, PCI_POWERSTATE_D0);
6298 if (pci_get_powerstate(
dev) != PCI_POWERSTATE_D3)
6299 pci_set_powerstate(
dev, PCI_POWERSTATE_D3);
6306 struct pci_devinfo *dinfo;
6308 dinfo = device_get_ivars(
dev);
6315 struct pci_devinfo *dinfo;
6317 dinfo = device_get_ivars(
dev);
6326 return (PCIB_GET_ID(device_get_parent(
dev),
child,
type,
id));
6333 struct pci_devinfo *dinfo;
6334 devclass_t pci_class;
6337 pci_class = devclass_find(
"pci");
6338 KASSERT(device_get_devclass(device_get_parent(
dev)) == pci_class,
6339 (
"%s: non-pci device %s", __func__, device_get_nameunit(
dev)));
6346 bus = device_get_parent(
dev);
6347 KASSERT(
bus != NULL, (
"%s: null parent of %s", __func__,
6348 device_get_nameunit(
dev)));
6350 pcib = device_get_parent(
bus);
6351 KASSERT(
pcib != NULL, (
"%s: null bridge of %s", __func__,
6352 device_get_nameunit(
bus)));
6358 if (device_get_devclass(device_get_parent(
pcib)) != pci_class)
6361 dinfo = device_get_ivars(
pcib);
6362 if (dinfo->cfg.pcie.pcie_location != 0 &&
6382 struct pci_devinfo *dinfo = device_get_ivars(
dev);
6386 cap = dinfo->cfg.pcie.pcie_location;
6396 if (max_delay > 100) {
6397 pause_sbt(
"pcietp", 100 * SBT_1MS, 0, C_HARDCLOCK);
6400 pause_sbt(
"pcietp", max_delay * SBT_1MS, 0,
6418 struct pci_devinfo *dinfo = device_get_ivars(
dev);
6421 cap = dinfo->cfg.pcie.pcie_location;
6444 return (210 * 1000);
6446 return (900 * 1000);
6448 return (3500 * 1000);
6450 return (13 * 1000 * 1000);
6452 return (64 * 1000 * 1000);
6461 struct pci_devinfo *dinfo = device_get_ivars(
dev);
6470 s =
"Uncorrectable (Non-Fatal)";
6472 s =
"Uncorrectable (Fatal)";
6473 device_printf(
dev,
"%s PCIe error reported by APEI\n", s);
6482 device_printf(
dev,
"status 0x%08x mask 0x%08x", r, r1);
6486 printf(
" severity 0x%08x first %d\n",
6497 device_printf(
dev,
"Clearing UC AER errors 0x%08x\n", r);
6503 device_printf(
dev,
"Clearing COR AER errors 0x%08x\n", r);
6506 if (dinfo->cfg.pcie.pcie_location != 0) {
6507 rs = pci_read_config(
dev, dinfo->cfg.pcie.pcie_location +
6512 pci_write_config(
dev, dinfo->cfg.pcie.pcie_location +
6514 device_printf(
dev,
"Clearing PCIe errors 0x%04x\n", rs);
6538 struct pci_devinfo *dinfo = device_get_ivars(
dev);
6543 cap = dinfo->cfg.pcie.pcie_location;
6564 "Resetting with transactions pending after %d ms\n",
6574 if (compl_delay < 10)
6585 pause_sbt(
"pcieflr", (100 + compl_delay) * SBT_1MS, 0, C_HARDCLOCK);
6589 pci_printf(&dinfo->cfg,
"Transactions pending after FLR!\n");
6603 ps = pci_get_powerstate(
dev);
6604 if (ps != PCI_POWERSTATE_D0 && ps != PCI_POWERSTATE_D3)
6605 pci_set_powerstate(
dev, PCI_POWERSTATE_D0);
6606 pci_set_powerstate(
dev, PCI_POWERSTATE_D3);
6607 pci_set_powerstate(
dev, ps);
6626 pause_sbt(
"pcier1", mstosbt(20), 0, 0);
6627 v &= ~PCIEM_LINK_CTL_LINK_DIS;
6630 pause_sbt(
"pcier2", mstosbt(100), 0, 0);
6639 if (
dev == device_get_parent(
child))
6648 if (
dev == device_get_parent(
child))
6658 if (
dev == NULL || device_get_parent(
child) !=
dev)
6660 if ((flags & DEVF_RESET_DETACH) != 0) {
6661 error = device_get_state(
child) == DS_ATTACHED ?
6662 device_detach(
child) : 0;
6664 error = BUS_SUSPEND_CHILD(
dev,
child);
6668 error = BUS_RESET_PREPARE(
dev,
child);
6673 if ((flags & DEVF_RESET_DETACH) != 0)
6674 device_probe_and_attach(
child);
6691 class = pci_get_class(child);
6693 revid = pci_get_revid(
child);
6694 while (nelt-- > 0) {
6696 if (
id->match_flag_vendor)
6697 match &= vendor ==
id->vendor;
6698 if (
id->match_flag_device)
6699 match &= device ==
id->device;
6700 if (
id->match_flag_subvendor)
6701 match &= subvendor ==
id->subvendor;
6702 if (
id->match_flag_subdevice)
6703 match &= subdevice ==
id->subdevice;
6704 if (
id->match_flag_class)
6705 match &=
class ==
id->class_id;
6706 if (
id->match_flag_subclass)
6708 if (
id->match_flag_revid)
6709 match &= revid ==
id->revid;
6720 const char *dev_name;
6723 dev = dinfo->cfg.dev;
6724 printf(
"pci%d:%d:%d:%d", dinfo->cfg.domain, dinfo->cfg.bus,
6725 dinfo->cfg.slot, dinfo->cfg.func);
6726 dev_name = device_get_name(
dev);
6727 if (dev_name != NULL)
6728 printf(
" (%s%d)", dev_name, device_get_unit(
dev));
6734 struct pci_devinfo *dinfo;
6740 STAILQ_FOREACH(dinfo, &
pci_devq, pci_links) {
6741 dev = dinfo->cfg.dev;
6748 printf(
" error 0x%04x\n",
status);
6750 if (dinfo->cfg.pcie.pcie_location != 0) {
6752 dinfo->cfg.pcie.pcie_location +
6758 printf(
" PCIe DEVCTL 0x%04x DEVSTA 0x%04x\n",
6759 pci_read_config(
dev,
6760 dinfo->cfg.pcie.pcie_location +
6768 if (r1 != 0 || r2 != 0) {
6770 printf(
" AER UC 0x%08x Mask 0x%08x Svr 0x%08x\n"
6771 " COR 0x%08x Mask 0x%08x Ctl 0x%08x\n",
6772 r1, pci_read_config(
dev, aer +
6774 pci_read_config(
dev, aer +
6776 r2, pci_read_config(
dev, aer +
6778 pci_read_config(
dev, aer +
6780 for (i = 0; i < 4; i++) {
6781 r1 = pci_read_config(
dev, aer +
6783 printf(
" HL%d: 0x%08x\n", i, r1);
6791DB_SHOW_COMMAND(pcierr, pci_print_faulted_dev_db)
6798db_clear_pcie_errors(
const struct pci_devinfo *dinfo)
6804 dev = dinfo->cfg.dev;
6805 r = pci_read_config(
dev, dinfo->cfg.pcie.pcie_location +
6807 pci_write_config(
dev, dinfo->cfg.pcie.pcie_location +
6820DB_COMMAND(pci_clearerr, db_pci_clearerr)
6822 struct pci_devinfo *dinfo;
6824 uint16_t
status, status1;
6826 STAILQ_FOREACH(dinfo, &
pci_devq, pci_links) {
6827 dev = dinfo->cfg.dev;
6836 if (dinfo->cfg.pcie.pcie_location != 0)
6837 db_clear_pcie_errors(dinfo);
struct resource * pci_reserve_map(device_t dev, device_t child, int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int num, u_int flags)
device_t pci_find_pcie_root_port(device_t dev)
static int pci_msi_blacklisted(void)
int pci_remap_msix_method(device_t dev, device_t child, int count, const u_int *vectors)
void pci_child_deleted(device_t dev, device_t child)
DEFINE_CLASS_0(pci, pci_driver, pci_methods, sizeof(struct pci_softc))
static void pci_cfg_save_pcix(device_t dev, struct pci_devinfo *dinfo)
static int pci_reset_post(device_t dev, device_t child)
static devclass_t pci_devclass
void pci_probe_nomatch(device_t dev, device_t child)
int pci_detach(device_t dev)
static int pci_ea_bei_to_rid(device_t dev, int bei)
int pci_msix_count_method(device_t dev, device_t child)
static struct pci_devinfo * pci_fill_devinfo(device_t pcib, device_t bus, int d, int b, int s, int f, uint16_t vid, uint16_t did)
int pci_teardown_intr(device_t dev, device_t child, struct resource *irq, void *cookie)
void pci_enable_msix_method(device_t dev, device_t child, u_int index, uint64_t address, uint32_t data)
static int pci_porten(device_t dev)
static int pci_get_id_method(device_t dev, device_t child, enum pci_id_type type, uintptr_t *rid)
static int pci_usb_takeover
int pcie_link_reset(device_t port, int pcie_location)
struct pci_devinfo * pci_alloc_devinfo_method(device_t dev)
static void pci_assign_interrupt(device_t bus, device_t dev, int force_route)
int pci_ea_is_enabled(device_t dev, int rid)
struct pci_map * pci_find_bar(device_t dev, int reg)
static int pci_msix_blacklisted(void)
int pci_activate_resource(device_t dev, device_t child, int type, int rid, struct resource *r)
void pci_enable_msi_method(device_t dev, device_t child, uint64_t address, uint16_t data)
static int pci_read_vpd_reg(device_t pcib, pcicfgregs *cfg, int reg, uint32_t *data)
void pcie_apei_error(device_t dev, int sev, uint8_t *aerp)
void pci_print_verbose(struct pci_devinfo *dinfo)
static void pci_hint_device_unit(device_t acdev, device_t child, const char *name, int *unitp)
#define PCIR_IS_BIOS(cfg, reg)
int pci_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
static device_method_t pci_methods[]
static void uhci_early_takeover(device_t self)
device_t pci_find_dbsf(uint32_t domain, uint8_t bus, uint8_t slot, uint8_t func)
uint32_t pcie_read_config(device_t dev, int reg, int width)
static int pci_reset_prepare(device_t dev, device_t child)
device_t pci_find_class(uint8_t class, uint8_t subclass)
static pci_addr_t pci_mapbase(uint64_t mapreg)
static size_t pci_vendordata_size
int pci_release_resource(device_t dev, device_t child, int type, int rid, struct resource *r)
#define PCI_QUIRK_MSI_INTX_BUG
int pci_find_cap_method(device_t dev, device_t child, int capability, int *capreg)
void pci_cfg_save(device_t dev, struct pci_devinfo *dinfo, int setstate)
int pci_release_msi_method(device_t dev, device_t child)
int pci_find_next_extcap_method(device_t dev, device_t child, int capability, int start, int *capreg)
static int pci_has_quirk(uint32_t devid, int quirk)
static void pci_mask_msix(device_t dev, u_int index)
static void pci_lookup(void *arg, const char *name, device_t *dev)
int pci_msi_device_blacklisted(device_t dev)
#define PCI_QUIRK_DISABLE_MSI
int pci_get_max_read_req(device_t dev)
static void pci_ea_fill_info(device_t pcib, pcicfgregs *cfg)
static char * pci_describe_device(device_t dev)
int pci_alloc_msix_method(device_t dev, device_t child, int *count)
int pci_resume(device_t dev)
static int pci_clear_aer_on_attach
device_t pci_find_class_from(uint8_t class, uint8_t subclass, device_t from)
int pci_attach(device_t dev)
void pci_child_added_method(device_t dev, device_t child)
static void pci_cfg_restore_pcie(device_t dev, struct pci_devinfo *dinfo)
static void pcie_setup_mps(device_t dev)
static __inline void pci_clear_command_bit(device_t dev, device_t child, uint16_t bit)
void pci_add_resources(device_t bus, device_t dev, int force, uint32_t prefetchmask)
uint32_t pci_read_config_method(device_t dev, device_t child, int reg, int width)
static void pci_write_msix_entry(device_t dev, u_int index, uint64_t address, uint32_t data)
int pci_enable_busmaster_method(device_t dev, device_t child)
static void pci_cfg_save_pcie(device_t dev, struct pci_devinfo *dinfo)
void pci_print_faulted_dev(void)
static void ehci_early_takeover(device_t self)
struct resource_list * pci_get_resource_list(device_t dev, device_t child)
void pci_delete_resource(device_t dev, device_t child, int type, int rid)
static __inline void pci_set_command_bit(device_t dev, device_t child, uint16_t bit)
int pci_assign_interrupt_method(device_t dev, device_t child)
static const struct pci_quirk pci_quirks[]
int pci_set_max_read_req(device_t dev, int size)
bool pcie_wait_for_pending_transactions(device_t dev, u_int max_delay)
int pci_mapsize(uint64_t testval)
int pci_get_device_path_method(device_t bus, device_t child, const char *locator, struct sbuf *sb)
struct resource * pci_alloc_resource(device_t dev, device_t child, int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
int pci_pending_msix(device_t dev, u_int index)
static int vpd_nextbyte(struct vpd_readstate *vrs, uint8_t *data)
int pci_setup_intr(device_t dev, device_t child, struct resource *irq, int flags, driver_filter_t *filter, driver_intr_t *intr, void *arg, void **cookiep)
struct resource * pci_alloc_multi_resource(device_t dev, device_t child, int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_long num, u_int flags)
static struct pci_devinfo * pci_identify_function(device_t pcib, device_t dev, int domain, int busno, int slot, int func)
int pci_print_child(device_t dev, device_t child)
static void pci_write_bar(device_t dev, struct pci_map *pm, pci_addr_t base)
int pci_bar_enabled(device_t dev, struct pci_map *pm)
int pci_msi_count_method(device_t dev, device_t child)
int pci_enable_io_method(device_t dev, device_t child, int space)
static void pci_read_vpd(device_t pcib, pcicfgregs *cfg)
int pci_find_next_htcap_method(device_t dev, device_t child, int capability, int start, int *capreg)
static void pci_resume_msix(device_t dev)
void pci_child_detached(device_t dev, device_t child)
void pci_disable_msi_method(device_t dev, device_t child)
device_t pci_find_device(uint16_t vendor, uint16_t device)
SYSCTL_NODE(_hw, OID_AUTO, pci, CTLFLAG_RD|CTLFLAG_MPSAFE, 0, "PCI bus tuning parameters")
static void pci_cfg_restore_pcix(device_t dev, struct pci_devinfo *dinfo)
int pci_power_reset(device_t dev)
int pci_get_powerstate_method(device_t dev, device_t child)
void pci_add_children(device_t dev, int domain, int busno)
int pci_get_max_payload(device_t dev)
int pci_deactivate_resource(device_t dev, device_t child, int type, int rid, struct resource *r)
#define PCI_QUIRK_DISABLE_MSIX
int pci_msix_table_bar_method(device_t dev, device_t child)
static int pci_reset_child(device_t dev, device_t child, int flags)
static void pci_read_cap(device_t pcib, pcicfgregs *cfg)
static int pci_describe_parse_line(char **ptr, int *vendor, int *device, char **desc)
#define PCI_QUIRK_UNMAP_REG
static int pci_enable_ari
int pci_msix_pba_bar_method(device_t dev, device_t child)
int pci_freecfg(struct pci_devinfo *dinfo)
static pci_addr_t pci_rombase(uint64_t mapreg)
static void pci_fixancient(pcicfgregs *cfg)
int pci_find_extcap_method(device_t dev, device_t child, int capability, int *capreg)
void pcie_write_config(device_t dev, int reg, uint32_t value, int width)
static void pci_resume_msi(device_t dev)
int pci_resume_child(device_t dev, device_t child)
int pci_disable_busmaster_method(device_t dev, device_t child)
void pci_add_child(device_t bus, struct pci_devinfo *dinfo)
int pci_get_vpd_ident_method(device_t dev, device_t child, const char **identptr)
int pci_get_relaxed_ordering_enabled(device_t dev)
static int pci_memen(device_t dev)
int pci_child_pnpinfo_method(device_t dev, device_t child, struct sbuf *sb)
EARLY_DRIVER_MODULE(pci, pcib, pci_driver, pci_devclass, pci_modevent, NULL, BUS_PASS_BUS)
static void pci_set_power_child(device_t dev, device_t child, int state)
static void xhci_early_takeover(device_t self)
int pci_rescan_method(device_t dev)
static int pci_printf(pcicfgregs *cfg, const char *fmt,...)
bus_dma_tag_t pci_get_dma_tag(device_t bus, device_t dev)
bool pcie_flr(device_t dev, u_int max_delay, bool force)
static int pci_modevent(module_t mod, int what, void *arg)
void pci_add_resources_ea(device_t bus, device_t dev, int alloc_iov)
int pci_attach_common(device_t dev)
uint32_t pcie_adjust_config(device_t dev, int reg, uint32_t mask, uint32_t value, int width)
static int pci_enable_io_modes
static int pci_honor_msi_blacklist
static int pci_romsize(uint64_t testval)
static int pci_maprange(uint64_t mapreg)
static void pci_add_child_clear_aer(device_t dev, struct pci_devinfo *dinfo)
struct pci_map * pci_add_bar(device_t dev, int reg, pci_addr_t value, pci_addr_t size)
void pci_restore_state(device_t dev)
static int pci_do_power_nodriver
void pci_write_config_method(device_t dev, device_t child, int reg, uint32_t val, int width)
static char * pci_vendordata
static void pci_restore_bars(device_t dev)
void pci_cfg_restore(device_t dev, struct pci_devinfo *dinfo)
struct pcicfg_vpd * pci_fetch_vpd_list(device_t dev)
int pci_msix_device_blacklisted(device_t dev)
static int pci_remap_intr_method(device_t bus, device_t dev, u_int irq)
struct pci_devinfo * pci_read_device(device_t pcib, device_t bus, int d, int b, int s, int f)
device_t pci_find_bsf(uint8_t bus, uint8_t slot, uint8_t func)
#define PCI_QUIRK_MAP_REG
static int pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl, int force, int prefetch)
#define PCI_QUIRK_ENABLE_MSI_VM
#define PCI_QUIRK_REALLOC_BAR
static const struct @0 pci_nomatch_tab[]
int pci_child_location_method(device_t dev, device_t child, struct sbuf *sb)
static void pci_load_vendor_data(void)
static int pci_release_msix(device_t dev, device_t child)
int pci_get_vpd_readonly_method(device_t dev, device_t child, const char *kw, const char **vptr)
int pci_alloc_msi_method(device_t dev, device_t child, int *count)
int pci_disable_io_method(device_t dev, device_t child, int space)
static void ohci_early_takeover(device_t self)
void pci_driver_added(device_t dev, driver_t *driver)
const struct pci_device_table * pci_match_device(device_t child, const struct pci_device_table *id, size_t nelt)
int pci_find_next_cap_method(device_t dev, device_t child, int capability, int start, int *capreg)
int pci_find_htcap_method(device_t dev, device_t child, int capability, int *capreg)
void pci_read_bar(device_t dev, int reg, pci_addr_t *mapp, pci_addr_t *testvalp, int *bar64)
void pci_ht_map_msi(device_t dev, uint64_t addr)
static int pci_msix_rewrite_table
int pcie_get_max_completion_timeout(device_t dev)
static const char * pci_maptype(uint64_t mapreg)
static void pci_unmask_msix(device_t dev, u_int index)
static int pci_probe(device_t dev)
int pci_suspend_child(device_t dev, device_t child)
static int pci_do_realloc_bars
static void pci_print_faulted_dev_name(const struct pci_devinfo *dinfo)
void pci_save_state(device_t dev)
SYSCTL_INT(_hw_pci, OID_AUTO, enable_io_modes, CTLFLAG_RWTUN, &pci_enable_io_modes, 1, "Enable I/O and memory bits in the config register. Some BIOSes do not" " enable these bits correctly. We'd like to do this all the time, but" " there are some peripherals that this causes problems with.")
int pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
int pci_set_powerstate_method(device_t dev, device_t child, int state)
static void pci_ata_maps(device_t bus, device_t dev, struct resource_list *rl, int force, uint32_t prefetchmask)
static int pci_clear_bars
static void pci_hdrtypedata(device_t pcib, int b, int s, int f, pcicfgregs *cfg)
int pci_iov_attach_method(device_t bus, device_t dev, nvlist_t *pf_schema, nvlist_t *vf_schema, const char *name)
int pci_iov_detach_method(device_t bus, device_t dev)
struct resource * pci_vf_alloc_mem_resource(device_t dev, device_t child, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
void pci_iov_cfg_save(device_t dev, struct pci_devinfo *dinfo)
int pci_vf_release_mem_resource(device_t dev, device_t child, int rid, struct resource *r)
void pci_iov_cfg_restore(device_t dev, struct pci_devinfo *dinfo)
static __inline int pci_iov_detach(device_t dev)
int static __inline int pci_iov_attach(device_t dev, struct nvlist *pf_schema, struct nvlist *vf_schema)
device_t pci_create_iov_child_method(device_t bus, device_t pf, uint16_t rid, uint16_t vid, uint16_t did)
device_t pci_add_iov_child(device_t bus, device_t pf, uint16_t rid, uint16_t vid, uint16_t did)
#define PCIM_AER_COR_REPLAY_TIMEOUT
#define PCIR_MSI_DATA_64BIT
#define PCIM_CMD_BUSMASTEREN
#define PCIS_SATCOM_AUDIO
#define PCIM_AER_UC_POISONED_TLP
#define PCIS_MULTIMEDIA_TELE
#define PCIS_SERIALBUS_SSA
#define PCIS_INPUTDEV_GAMEPORT
#define PCIM_EA_FIELD_MASK
#define PCIM_AER_UC_RECEIVER_OVERFLOW
#define PCIEM_CAP2_COMP_TIMO_RANGES
#define PCIM_AER_UC_UNEXPECTED_COMPLETION
#define PCIM_BAR_MEM_PREFETCH
#define PCIS_BRIDGE_RACEWAY
#define PCIEM_CTL2_COMP_TIMO_55MS
#define PCIEM_CTL2_COMP_TIMO_3500MS
#define PCIS_MULTIMEDIA_HDA
#define PCIM_AER_UC_ATOMIC_EGRESS_BLK
#define PCIM_AER_COR_REPLAY_ROLLOVER
#define PCIM_HTCMD_CAP_MASK
#define PCIS_BRIDGE_CARDBUS
#define PCIS_BASEPERIPH_TIMER
#define PCIEM_CTL_NFER_ENABLE
#define PCIS_CRYPTO_NETCOMP
#define PCIR_MSI_ADDR_HIGH
#define PCIEM_TYPE_DOWNSTREAM_PORT
#define PCIS_BRIDGE_PCMCIA
#define PCIS_SIMPLECOMM_UART
#define PCIM_EA_BEI_VF_BAR_0
#define PCIEM_CTL_RELAXED_ORD_ENABLE
#define PCIEM_CTL2_COMP_TIMO_900MS
#define PCIER_DEVICE_CTL2
#define PCIS_SATCOM_VOICE
#define PCIS_BASEPERIPH_IOMMU
#define PCIM_EA_BEI_BAR_5
#define PCIM_AER_COR_INTERNAL_ERROR
#define PCIR_AER_COR_MASK
#define PCIM_AER_COR_HEADER_LOG_OVFLOW
#define PCIS_STORAGE_RAID
#define PCI_EXTCAP_NEXTPTR(ecap)
#define PCIM_STATUS_MDPERR
#define PCIS_MEMORY_FLASH
#define PCIEM_CAP_MAX_PAYLOAD
#define PCIS_BASEPERIPH_PIC
#define PCIM_AER_UC_TLP_PREFIX_BLOCKED
#define PCIM_AER_UC_ACS_VIOLATION
#define PCIM_BAR_IO_RESERVED
#define PCIM_MSICTRL_MSI_ENABLE
#define PCIM_AER_COR_BAD_TLP
#define PCIS_INPUTDEV_MOUSE
#define PCIEM_ROOT_CTL_SERR_CORR
#define PCIM_HTCMD_MSI_ENABLE
#define PCIM_AER_UC_ECRC_ERROR
#define PCIEM_CTL_COR_ENABLE
#define PCIS_NETWORK_ETHERNET
#define PCIEM_CTL2_COMP_TIMO_100US
#define PCIM_AER_COR_BAD_DLLP
#define PCIP_SERIALBUS_USB_XHCI
#define PCIR_AER_UC_SEVERITY
#define PCIS_INTELLIIO_I2O
#define PCIEM_TYPE_LEGACY_ENDPOINT
#define PCIEM_STA_FATAL_ERROR
#define PCIEM_CTL2_COMP_TIMO_210MS
#define PCIS_NETWORK_TOKENRING
#define PCIS_BRIDGE_NUBUS
#define PCIEM_CTL_INITIATE_FLR
#define PCIEM_CTL2_COMP_TIMO_13S
#define PCIM_MSIX_BIR_MASK
#define PCIR_SRIOV_BAR(x)
#define PCIM_AER_UC_MALFORMED_TLP
#define PCIEM_LINK_CTL_LINK_DIS
#define PCIM_HDRTYPE_NORMAL
#define PCIEM_FLAGS_VERSION
#define PCIM_EA_BEI_OFFSET
#define PCIM_AER_UC_FC_PROTOCOL_ERROR
#define PCIP_SERIALBUS_USB_EHCI
#define PCIM_EA_BEI_VF_BAR_5
#define PCIR_EA_FIRST_ENT
#define PCIM_EA_BEI_BAR_0
#define PCIR_AER_CAP_CONTROL
#define PCIS_BASEPERIPH_RTC
#define PCIM_BAR_MEM_BASE
#define PCIM_STATUS_RTABORT
#define PCIM_MSIXCTRL_MSIX_ENABLE
#define PCIS_STORAGE_ATA_ADMA
#define PCIS_MULTIMEDIA_VIDEO
#define PCIER_DEVICE_CAP2
#define PCIM_HTCMD_MSI_FIXED
#define PCIEM_TYPE_ROOT_EC
#define PCIP_SERIALBUS_USB_OHCI
#define PCIEM_ROOT_CTL_SERR_FATAL
#define PCIM_MSICTRL_64BIT
#define PCIEM_CTL_FER_ENABLE
#define PCIS_SIMPLECOMM_PAR
#define PCIS_INPUTDEV_KEYBOARD
#define PCIR_HTMSI_ADDRESS_HI
#define PCIM_EA_P_VF_MEM_PREFETCH
#define PCIS_SERIALBUS_SMBUS
#define PCIS_INPUTDEV_DIGITIZER
#define PCIS_STORAGE_SATA
#define PCIEM_LINK_STA_TRAINING
#define PCIM_STATUS_STABORT
#define PCIM_STATUS_RMABORT
#define PCIM_AER_COR_ADVISORY_NF_ERROR
#define PCIS_BASEPERIPH_SDHC
#define PCIM_EA_NUM_ENT_MASK
#define PCIM_EA_P_MEM_PREFETCH
#define PCIM_BAR_MEM_TYPE
#define PCIS_DASP_PERFCNTRS
#define PCIM_AER_UC_INTERNAL_ERROR
#define PCIR_HTMSI_ADDRESS_LO
#define PCIEM_TYPE_ROOT_PORT
#define PCIS_SERIALBUS_ACCESS
#define PCIEM_CTL2_COMP_TIMO_64S
#define PCIM_AER_UC_COMPLETION_TIMEOUT
#define PCIM_HDRTYPE_BRIDGE
#define PCIS_INPUTDEV_SCANNER
#define PCIP_STORAGE_IDE_MASTERDEV
#define PCIM_AER_UC_UNSUPPORTED_REQUEST
#define PCIR_AER_COR_STATUS
#define PCIM_MSICTRL_VECTOR
#define PCIM_MSIX_VCTRL_MASK
#define PCIS_BASEPERIPH_DMA
#define PCIS_SERIALBUS_USB
#define PCIEM_STA_CORRECTABLE_ERROR
#define PCIEM_CTL2_COMP_TIMO_VAL
#define PCIS_BASEPERIPH_PCIHOT
#define PCIM_AER_UC_TRAINING_ERROR
#define PCIEM_STA_TRANSACTION_PND
#define PCIM_HDRTYPE_CARDBUS
#define PCIM_AER_UC_DL_PROTOCOL_ERROR
#define PCIEM_CTL2_COMP_TIMO_10MS
#define PCIR_AER_UC_STATUS
#define PCIEM_CTL_URR_ENABLE
#define PCIEM_ROOT_CTL_SERR_NONFATAL
#define PCIM_AER_UC_COMPLETER_ABORT
#define PCIEM_STA_UNSUPPORTED_REQ
#define PCIEM_STA_NON_FATAL_ERROR
#define PCIEM_LINK_CTL_RETRAIN_LINK
#define PCIEM_CTL_MAX_PAYLOAD
#define PCIM_MSIXCTRL_TABLE_SIZE
#define PCIS_NETWORK_FDDI
#define PCIM_EA_PP_OFFSET
#define PCIS_SIMPLECOMM_MULSER
#define PCIP_STORAGE_IDE_MODESEC
#define PCIS_STORAGE_FLOPPY
#define PCIS_WIRELESS_IRDA
#define PCIR_POWER_STATUS
#define PCIM_MSICTRL_MMC_MASK
#define PCIM_AER_UC_MC_BLOCKED_TLP
#define PCIR_AER_HEADER_LOG
#define PCIS_DASP_COMM_SYNC
#define PCIS_SERIALBUS_FC
#define PCIS_NETWORK_ISDN
#define PCIS_MULTIMEDIA_AUDIO
#define PCIM_BIOS_ADDR_MASK
#define PCIM_HTCAP_MSI_MAPPING
#define PCIM_AER_COR_RECEIVER_ERROR
#define PCIEM_TYPE_ENDPOINT
#define PCIS_CRYPTO_ENTERTAIN
#define PCIS_STORAGE_SCSI
#define PCIR_SUBVENDCAP_ID
#define PCIP_SERIALBUS_USB_UHCI
#define PCIS_DASP_MGMT_CARD
#define PCIM_AER_UC_SURPRISE_LINK_DOWN
#define PCIM_SRIOV_VF_MSE
#define PCIS_SERIALBUS_FW
#define PCIEM_CTL_MAX_READ_REQUEST
#define PCI_EXTCAP_ID(ecap)
#define PCIM_STATUS_CAPPRESENT
#define PCIS_SIMPLECOMM_MODEM
#define PCIP_STORAGE_IDE_MODEPRIM
struct msix_vector * msix_vectors
struct msix_table_entry * msix_table
uint32_t msix_table_offset
struct resource * msix_table_res
struct resource * msix_pba_res
uint16_t pcie_device_ctl2
struct vpd_readonly * vpd_ros
struct pcicfg_bridge bridge