diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2015-12-23 21:51:10 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2015-12-23 21:51:10 +0000 |
| commit | ce204e1bd813047e5f70fadcc9e703b89dac0f32 (patch) | |
| tree | 925479f2c6af1dcc8bc487ad50187443dbe117a7 /sys | |
| parent | 9e8d8b4b0c85f0457e39e219126cfd0cc03558d0 (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/dev/pci/pci.c | 24 | ||||
| -rw-r--r-- | sys/dev/pci/pci_if.m | 18 | ||||
| -rw-r--r-- | sys/dev/pci/pci_private.h | 2 | ||||
| -rw-r--r-- | sys/dev/pci/pcivar.h | 12 |
4 files changed, 55 insertions, 1 deletions
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c index f5e8470de3aca..261aa0cd96d99 100644 --- a/sys/dev/pci/pci.c +++ b/sys/dev/pci/pci.c @@ -187,6 +187,8 @@ static device_method_t pci_methods[] = { DEVMETHOD(pci_release_msi, pci_release_msi_method), DEVMETHOD(pci_msi_count, pci_msi_count_method), DEVMETHOD(pci_msix_count, pci_msix_count_method), + DEVMETHOD(pci_msix_pba_bar, pci_msix_pba_bar_method), + DEVMETHOD(pci_msix_table_bar, pci_msix_table_bar_method), DEVMETHOD(pci_get_rid, pci_get_rid_method), DEVMETHOD(pci_child_added, pci_child_added_method), #ifdef PCI_IOV @@ -1851,6 +1853,28 @@ pci_msix_count_method(device_t dev, device_t child) return (0); } +int +pci_msix_pba_bar_method(device_t dev, device_t child) +{ + struct pci_devinfo *dinfo = device_get_ivars(child); + struct pcicfg_msix *msix = &dinfo->cfg.msix; + + if (pci_do_msix && msix->msix_location != 0) + return (msix->msix_pba_bar); + return (-1); +} + +int +pci_msix_table_bar_method(device_t dev, device_t child) +{ + struct pci_devinfo *dinfo = device_get_ivars(child); + struct pcicfg_msix *msix = &dinfo->cfg.msix; + + if (pci_do_msix && msix->msix_location != 0) + return (msix->msix_table_bar); + return (-1); +} + /* * HyperTransport MSI mapping control */ diff --git a/sys/dev/pci/pci_if.m b/sys/dev/pci/pci_if.m index aeeff2cf3258f..7049b9feefd50 100644 --- a/sys/dev/pci/pci_if.m +++ b/sys/dev/pci/pci_if.m @@ -36,7 +36,13 @@ CODE { { return (0); } - + + static int + null_msix_bar(device_t dev, device_t child) + { + return (-1); + } + static device_t null_create_iov_child(device_t bus, device_t pf, uint16_t rid, uint16_t vid, uint16_t did) @@ -192,6 +198,16 @@ METHOD int msix_count { device_t child; } DEFAULT null_msi_count; +METHOD int msix_pba_bar { + device_t dev; + device_t child; +} DEFAULT null_msix_bar; + +METHOD int msix_table_bar { + device_t dev; + device_t child; +} DEFAULT null_msix_bar; + METHOD uint16_t get_rid { device_t dev; device_t child; diff --git a/sys/dev/pci/pci_private.h b/sys/dev/pci/pci_private.h index cc4515686cb00..7795747bd2191 100644 --- a/sys/dev/pci/pci_private.h +++ b/sys/dev/pci/pci_private.h @@ -102,6 +102,8 @@ int pci_remap_msix_method(device_t dev, device_t child, int pci_release_msi_method(device_t dev, device_t child); int pci_msi_count_method(device_t dev, device_t child); int pci_msix_count_method(device_t dev, device_t child); +int pci_msix_pba_bar_method(device_t dev, device_t child); +int pci_msix_table_bar_method(device_t dev, device_t child); struct resource *pci_alloc_resource(device_t dev, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags); diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h index 8b1d6a9893abc..d8df42fea2e13 100644 --- a/sys/dev/pci/pcivar.h +++ b/sys/dev/pci/pcivar.h @@ -516,6 +516,18 @@ pci_msix_count(device_t dev) return (PCI_MSIX_COUNT(device_get_parent(dev), dev)); } +static __inline int +pci_msix_pba_bar(device_t dev) +{ + return (PCI_MSIX_PBA_BAR(device_get_parent(dev), dev)); +} + +static __inline int +pci_msix_table_bar(device_t dev) +{ + return (PCI_MSIX_TABLE_BAR(device_get_parent(dev), dev)); +} + static __inline uint16_t pci_get_rid(device_t dev) { |
