diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index fea901bfb1..bf8b52d111 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -2162,7 +2162,7 @@ int map_domain_pirq( if ( !cpu_has_apic ) goto done; - pdev = pci_get_pdev_by_domain(d, msi->seg, msi->bus, msi->devfn); + pdev = pci_get_pdev(d, PCI_SBDF(msi->seg, msi->bus, msi->devfn)); if ( !pdev ) goto done; diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index 6be81e6c3b..62c4fbcfbe 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -683,7 +683,8 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, u8 func, u8 bir, int vf) if ( vf >= 0 ) { - struct pci_dev *pdev = pci_get_pdev(seg, bus, PCI_DEVFN(slot, func)); + struct pci_dev *pdev = pci_get_pdev(NULL, + PCI_SBDF(seg, bus, slot, func)); unsigned int pos = pci_find_ext_capability(seg, bus, PCI_DEVFN(slot, func), PCI_EXT_CAP_ID_SRIOV); @@ -1000,7 +1001,7 @@ static int __pci_enable_msi(struct msi_info *msi, struct msi_desc **desc) struct msi_desc *old_desc; ASSERT(pcidevs_locked()); - pdev = pci_get_pdev(msi->seg, msi->bus, msi->devfn); + pdev = pci_get_pdev(NULL, PCI_SBDF(msi->seg, msi->bus, msi->devfn)); if ( !pdev ) return -ENODEV; @@ -1055,7 +1056,7 @@ static int __pci_enable_msix(struct msi_info *msi, struct msi_desc **desc) struct msi_desc *old_desc; ASSERT(pcidevs_locked()); - pdev = pci_get_pdev(msi->seg, msi->bus, msi->devfn); + pdev = pci_get_pdev(NULL, PCI_SBDF(msi->seg, msi->bus, msi->devfn)); if ( !pdev || !pdev->msix ) return -ENODEV; @@ -1146,7 +1147,7 @@ int pci_prepare_msix(u16 seg, u8 bus, u8 devfn, bool off) return 0; pcidevs_lock(); - pdev = pci_get_pdev(seg, bus, devfn); + pdev = pci_get_pdev(NULL, PCI_SBDF(seg, bus, devfn)); if ( !pdev ) rc = -ENODEV; else if ( pdev->msix->used_entries != !!off ) diff --git a/xen/arch/x86/pci.c b/xen/arch/x86/pci.c index 9a2354e887..97b792e578 100644 --- a/xen/arch/x86/pci.c +++ b/xen/arch/x86/pci.c @@ -90,7 +90,7 @@ int pci_conf_write_intercept(unsigned int seg, unsigned int bdf, pcidevs_lock(); - pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN(bdf)); + pdev = pci_get_pdev(NULL, PCI_SBDF(seg, bdf)); if ( pdev ) rc = pci_msi_conf_write_intercept(pdev, reg, size, data); diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c index 3837926728..3a50d9d0c9 100644 --- a/xen/arch/x86/physdev.c +++ b/xen/arch/x86/physdev.c @@ -531,7 +531,8 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) break; pcidevs_lock(); - pdev = pci_get_pdev(0, restore_msi.bus, restore_msi.devfn); + pdev = pci_get_pdev(NULL, + PCI_SBDF(0, restore_msi.bus, restore_msi.devfn)); ret = pdev ? pci_restore_msi_state(pdev) : -ENODEV; pcidevs_unlock(); break; @@ -546,7 +547,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) break; pcidevs_lock(); - pdev = pci_get_pdev(dev.seg, dev.bus, dev.devfn); + pdev = pci_get_pdev(NULL, PCI_SBDF(dev.seg, dev.bus, dev.devfn)); ret = pdev ? pci_restore_msi_state(pdev) : -ENODEV; pcidevs_unlock(); break; diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index 1ad3c29351..02505ab044 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -447,7 +447,7 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) } pcidevs_lock(); - pdev = pci_get_pdev(dev.seg, dev.bus, dev.devfn); + pdev = pci_get_pdev(NULL, PCI_SBDF(dev.seg, dev.bus, dev.devfn)); if ( !pdev ) node = XEN_INVALID_DEV; else if ( pdev->node == NUMA_NO_NODE ) diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c index e2166f534f..14f8af7ea8 100644 --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -748,8 +748,7 @@ static bool_t __init set_iommu_interrupt_handler(struct amd_iommu *iommu) } pcidevs_lock(); - iommu->msi.dev = pci_get_pdev(iommu->seg, PCI_BUS(iommu->bdf), - PCI_DEVFN(iommu->bdf)); + iommu->msi.dev = pci_get_pdev(NULL, PCI_SBDF(iommu->seg, iommu->bdf)); pcidevs_unlock(); if ( !iommu->msi.dev ) { @@ -1286,7 +1285,7 @@ static int __init cf_check amd_iommu_setup_device_table( if ( !pci_init ) continue; pcidevs_lock(); - pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN(bdf)); + pdev = pci_get_pdev(NULL, PCI_SBDF(seg, bdf)); pcidevs_unlock(); } diff --git a/xen/drivers/passthrough/amd/iommu_map.c b/xen/drivers/passthrough/amd/iommu_map.c index f2157e0043..993bac6f88 100644 --- a/xen/drivers/passthrough/amd/iommu_map.c +++ b/xen/drivers/passthrough/amd/iommu_map.c @@ -727,7 +727,7 @@ int cf_check amd_iommu_get_reserved_device_memory( const struct pci_dev *pdev; pcidevs_lock(); - pdev = pci_get_pdev(seg, sbdf.bus, sbdf.devfn); + pdev = pci_get_pdev(NULL, sbdf); pcidevs_unlock(); if ( pdev ) diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index 085cd82941..0722f8d571 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -576,23 +576,6 @@ int __init pci_ro_device(int seg, int bus, int devfn) return 0; } -struct pci_dev *pci_get_pdev(uint16_t seg, uint8_t bus, uint8_t devfn) -{ - const struct pci_seg *pseg = get_pseg(seg); - struct pci_dev *pdev; - - ASSERT(pcidevs_locked()); - - if ( !pseg ) - return NULL; - - list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) - if ( pdev->bus == bus && pdev->devfn == devfn ) - return pdev; - - return NULL; -} - struct pci_dev *pci_get_real_pdev(int seg, int bus, int devfn) { struct pci_dev *pdev; @@ -601,12 +584,12 @@ struct pci_dev *pci_get_real_pdev(int seg, int bus, int devfn) if ( seg < 0 || bus < 0 || devfn < 0 ) return NULL; - for ( pdev = pci_get_pdev(seg, bus, devfn), stride = 4; + for ( pdev = pci_get_pdev(NULL, PCI_SBDF(seg, bus, devfn)), stride = 4; !pdev && stride; stride >>= 1 ) { if ( !(devfn & (8 - stride)) ) continue; - pdev = pci_get_pdev(seg, bus, devfn & ~(8 - stride)); + pdev = pci_get_pdev(NULL, PCI_SBDF(seg, bus, devfn & ~(8 - stride))); if ( pdev && stride != pdev->phantom_stride ) pdev = NULL; } @@ -614,32 +597,33 @@ struct pci_dev *pci_get_real_pdev(int seg, int bus, int devfn) return pdev; } -struct pci_dev *pci_get_pdev_by_domain(const struct domain *d, uint16_t seg, - uint8_t bus, uint8_t devfn) +struct pci_dev *pci_get_pdev(const struct domain *d, pci_sbdf_t sbdf) { struct pci_dev *pdev; + ASSERT(d || pcidevs_locked()); + /* * The hardware domain owns the majority of the devices in the system. * When there are multiple segments, traversing the per-segment list is * likely going to be faster, whereas for a single segment the difference * shouldn't be that large. */ - if ( is_hardware_domain(d) ) + if ( !d || is_hardware_domain(d) ) { - const struct pci_seg *pseg = get_pseg(seg); + const struct pci_seg *pseg = get_pseg(sbdf.seg); if ( !pseg ) return NULL; list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) - if ( pdev->bus == bus && pdev->devfn == devfn && - pdev->domain == d ) + if ( pdev->sbdf.bdf == sbdf.bdf && + (!d || pdev->domain == d) ) return pdev; } else list_for_each_entry ( pdev, &d->pdev_list, domain_list ) - if ( pdev->bus == bus && pdev->devfn == devfn ) + if ( pdev->sbdf.bdf == sbdf.bdf ) return pdev; return NULL; @@ -746,7 +730,9 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, else if ( info->is_virtfn ) { pcidevs_lock(); - pdev = pci_get_pdev(seg, info->physfn.bus, info->physfn.devfn); + pdev = pci_get_pdev(NULL, + PCI_SBDF(seg, info->physfn.bus, + info->physfn.devfn)); if ( pdev ) pf_is_extfn = pdev->info.is_extfn; pcidevs_unlock(); @@ -924,7 +910,7 @@ static int deassign_device(struct domain *d, uint16_t seg, uint8_t bus, return -EINVAL; ASSERT(pcidevs_locked()); - pdev = pci_get_pdev_by_domain(d, seg, bus, devfn); + pdev = pci_get_pdev(d, PCI_SBDF(seg, bus, devfn)); if ( !pdev ) return -ENODEV; @@ -1201,7 +1187,8 @@ static int __hwdom_init cf_check _setup_hwdom_pci_devices( { for ( devfn = 0; devfn < 256; devfn++ ) { - struct pci_dev *pdev = pci_get_pdev(pseg->nr, bus, devfn); + struct pci_dev *pdev = pci_get_pdev(NULL, + PCI_SBDF(pseg->nr, bus, devfn)); if ( !pdev ) continue; @@ -1475,7 +1462,7 @@ static int device_assigned(u16 seg, u8 bus, u8 devfn) int rc = 0; ASSERT(pcidevs_locked()); - pdev = pci_get_pdev(seg, bus, devfn); + pdev = pci_get_pdev(NULL, PCI_SBDF(seg, bus, devfn)); if ( !pdev ) rc = -ENODEV; @@ -1506,7 +1493,7 @@ static int assign_device(struct domain *d, u16 seg, u8 bus, u8 devfn, u32 flag) /* device_assigned() should already have cleared the device for assignment */ ASSERT(pcidevs_locked()); - pdev = pci_get_pdev(seg, bus, devfn); + pdev = pci_get_pdev(NULL, PCI_SBDF(seg, bus, devfn)); ASSERT(pdev && (pdev->domain == hardware_domain || pdev->domain == dom_io)); diff --git a/xen/drivers/passthrough/vtd/quirks.c b/xen/drivers/passthrough/vtd/quirks.c index 603ad41d5b..fcc8f73e8b 100644 --- a/xen/drivers/passthrough/vtd/quirks.c +++ b/xen/drivers/passthrough/vtd/quirks.c @@ -417,7 +417,7 @@ static int __must_check map_me_phantom_function(struct domain *domain, int rc; /* find ME VT-d engine base on a real ME device */ - pdev = pci_get_pdev(0, 0, PCI_DEVFN(dev, 0)); + pdev = pci_get_pdev(NULL, PCI_SBDF(0, 0, dev, 0)); drhd = acpi_find_matched_drhd_unit(pdev); /* map or unmap ME phantom function */ diff --git a/xen/drivers/video/vga.c b/xen/drivers/video/vga.c index d993e68d31..29a88e8241 100644 --- a/xen/drivers/video/vga.c +++ b/xen/drivers/video/vga.c @@ -118,7 +118,7 @@ void __init video_endboot(void) u8 b = bus, df = devfn, sb; pcidevs_lock(); - pdev = pci_get_pdev(0, bus, devfn); + pdev = pci_get_pdev(NULL, PCI_SBDF(0, bus, devfn)); pcidevs_unlock(); if ( !pdev || diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c index 9fb3c05b2b..3467c0de86 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -325,7 +325,7 @@ uint32_t vpci_read(pci_sbdf_t sbdf, unsigned int reg, unsigned int size) } /* Find the PCI dev matching the address. */ - pdev = pci_get_pdev_by_domain(d, sbdf.seg, sbdf.bus, sbdf.devfn); + pdev = pci_get_pdev(d, sbdf); if ( !pdev ) return vpci_read_hw(sbdf, reg, size); @@ -435,7 +435,7 @@ void vpci_write(pci_sbdf_t sbdf, unsigned int reg, unsigned int size, * Find the PCI dev matching the address. * Passthrough everything that's not trapped. */ - pdev = pci_get_pdev_by_domain(d, sbdf.seg, sbdf.bus, sbdf.devfn); + pdev = pci_get_pdev(d, sbdf); if ( !pdev ) { vpci_write_hw(sbdf, reg, size, data); diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index 0eaa5f3938..30fead8f7e 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -177,10 +177,8 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, int pci_remove_device(u16 seg, u8 bus, u8 devfn); int pci_ro_device(int seg, int bus, int devfn); int pci_hide_device(unsigned int seg, unsigned int bus, unsigned int devfn); -struct pci_dev *pci_get_pdev(uint16_t seg, uint8_t bus, uint8_t devfn); +struct pci_dev *pci_get_pdev(const struct domain *d, pci_sbdf_t sbdf); struct pci_dev *pci_get_real_pdev(int seg, int bus, int devfn); -struct pci_dev *pci_get_pdev_by_domain(const struct domain *, uint16_t seg, - uint8_t bus, uint8_t devfn); void pci_check_disable_device(u16 seg, u8 bus, u8 devfn); uint8_t pci_conf_read8(pci_sbdf_t sbdf, unsigned int reg);