Index: sys/dev/pci/pci.c =================================================================== --- sys/dev/pci/pci.c +++ sys/dev/pci/pci.c @@ -122,7 +122,8 @@ static int pci_remap_intr_method(device_t bus, device_t dev, u_int irq); -static uint16_t pci_get_rid_method(device_t dev, device_t child); +static int pci_get_id_method(device_t dev, device_t child, + int type, uintptr_t *rid); 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); @@ -190,7 +191,7 @@ 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_get_id, pci_get_id_method), DEVMETHOD(pci_alloc_devinfo, pci_alloc_devinfo_method), DEVMETHOD(pci_child_added, pci_child_added_method), #ifdef PCI_IOV @@ -5822,11 +5823,11 @@ pci_cfg_restore(dev, dinfo); } -static uint16_t -pci_get_rid_method(device_t dev, device_t child) +static int +pci_get_id_method(device_t dev, device_t child, int type, uintptr_t *id) { - return (PCIB_GET_RID(device_get_parent(dev), child)); + return (PCIB_GET_ID(device_get_parent(dev), child, type, id)); } /* Find the upstream port of a given PCI device in a root complex. */ Index: sys/dev/pci/pci_if.m =================================================================== --- sys/dev/pci/pci_if.m +++ sys/dev/pci/pci_if.m @@ -208,9 +208,11 @@ device_t child; } DEFAULT null_msix_bar; -METHOD uint16_t get_rid { +METHOD int get_id { device_t dev; device_t child; + int type; + uintptr_t *id; }; METHOD struct pci_devinfo * alloc_devinfo { Index: sys/dev/pci/pci_pci.c =================================================================== --- sys/dev/pci/pci_pci.c +++ sys/dev/pci/pci_pci.c @@ -59,7 +59,8 @@ static int pcib_resume(device_t dev); static int pcib_power_for_sleep(device_t pcib, device_t dev, int *pstate); -static uint16_t pcib_ari_get_rid(device_t pcib, device_t dev); +static int pcib_ari_get_id(device_t pcib, device_t dev, int type, + uintptr_t *id); static uint32_t pcib_read_config(device_t dev, u_int b, u_int s, u_int f, u_int reg, int width); static void pcib_write_config(device_t dev, u_int b, u_int s, @@ -114,7 +115,7 @@ DEVMETHOD(pcib_release_msix, pcib_release_msix), DEVMETHOD(pcib_map_msi, pcib_map_msi), DEVMETHOD(pcib_power_for_sleep, pcib_power_for_sleep), - DEVMETHOD(pcib_get_rid, pcib_ari_get_rid), + DEVMETHOD(pcib_get_id, pcib_ari_get_id), DEVMETHOD(pcib_try_enable_ari, pcib_try_enable_ari), DEVMETHOD(pcib_ari_enabled, pcib_ari_enabled), DEVMETHOD(pcib_decode_rid, pcib_ari_decode_rid), @@ -2574,26 +2575,31 @@ return ((sc->flags & PCIB_ENABLE_ARI) != 0); } -static uint16_t -pcib_ari_get_rid(device_t pcib, device_t dev) +static int +pcib_ari_get_id(device_t pcib, device_t dev, int type, uintptr_t *id) { struct pcib_softc *sc; uint8_t bus, slot, func; + if (type != PCI_ID_RID) + return (ENXIO); + sc = device_get_softc(pcib); if (sc->flags & PCIB_ENABLE_ARI) { bus = pci_get_bus(dev); func = pci_get_function(dev); - return (PCI_ARI_RID(bus, func)); + *id = (PCI_ARI_RID(bus, func)); } else { bus = pci_get_bus(dev); slot = pci_get_slot(dev); func = pci_get_function(dev); - return (PCI_RID(bus, slot, func)); + *id = (PCI_RID(bus, slot, func)); } + + return (0); } /* Index: sys/dev/pci/pcib_if.m =================================================================== --- sys/dev/pci/pcib_if.m +++ sys/dev/pci/pcib_if.m @@ -175,10 +175,12 @@ # # Return the PCI Routing Identifier (RID) for the device. # -METHOD uint16_t get_rid { +METHOD int get_id { device_t pcib; device_t dev; -} DEFAULT pcib_get_rid; + int type; + uintptr_t *id; +} DEFAULT pcib_get_id; # # Enable Alternative RID Interpretation if both the downstream port (pcib) Index: sys/dev/pci/pcib_private.h =================================================================== --- sys/dev/pci/pcib_private.h +++ sys/dev/pci/pcib_private.h @@ -190,7 +190,7 @@ int pcib_alloc_msix(device_t pcib, device_t dev, int *irq); int pcib_release_msix(device_t pcib, device_t dev, int irq); int pcib_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr, uint32_t *data); -uint16_t pcib_get_rid(device_t pcib, device_t dev); +uint16_t pcib_get_id(device_t pcib, device_t dev, int type, uintptr_t *id); void pcib_decode_rid(device_t pcib, uint16_t rid, int *bus, int *slot, int *func); Index: sys/dev/pci/pcib_support.c =================================================================== --- sys/dev/pci/pcib_support.c +++ sys/dev/pci/pcib_support.c @@ -55,15 +55,19 @@ } uint16_t -pcib_get_rid(device_t pcib, device_t dev) +pcib_get_id(device_t pcib, device_t dev, int type, uintptr_t *id) { uint8_t bus, slot, func; + if (id != PCI_ID_RID) + return (ENXIO); + bus = pci_get_bus(dev); slot = pci_get_slot(dev); func = pci_get_function(dev); - return (PCI_RID(bus, slot, func)); + *id = (PCI_RID(bus, slot, func)); + return (0); } void Index: sys/dev/pci/pcivar.h =================================================================== --- sys/dev/pci/pcivar.h +++ sys/dev/pci/pcivar.h @@ -270,6 +270,9 @@ #include "pci_if.h" +/* ID types that can be read by pci_get_id */ +#define PCI_ID_RID 0 + enum pci_device_ivars { PCI_IVAR_SUBVENDOR, PCI_IVAR_SUBDEVICE, @@ -542,10 +545,26 @@ return (PCI_MSIX_TABLE_BAR(device_get_parent(dev), dev)); } +static __inline int +pci_get_id(device_t dev, int type, uintptr_t *id) +{ + return (PCI_GET_ID(device_get_parent(dev), dev, type, id)); +} + +/* + * This is the deprecated interface, there is no way to tell the difference + * between a failure and a valid value that happens to be the same as the + * failure value. + */ static __inline uint16_t pci_get_rid(device_t dev) { - return (PCI_GET_RID(device_get_parent(dev), dev)); + uintptr_t rid; + + if (pci_get_id(dev, PCI_ID_RID, &rid) != 0) + return (0); + + return (rid); } static __inline void