Rename pci_device_iommu_address_space() into pci_device_iommu_info(). In the new function return a new type PCIAddressSpace that encapsulates the AddressSpace pointer that originally was returned.
The new type is added in preparation to expanding it to include the IOMMU memory region as a new field, such that we are able to fetch attributes of the vIOMMU e.g. at vfio migration setup. Signed-off-by: Joao Martins <joao.m.mart...@oracle.com> --- hw/pci/pci.c | 9 ++++++--- include/hw/pci/pci.h | 21 ++++++++++++++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 1cc7c89036b5..ecf8a543aa77 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -2633,11 +2633,12 @@ static void pci_device_class_base_init(ObjectClass *klass, void *data) } } -AddressSpace *pci_device_iommu_address_space(PCIDevice *dev) +PCIAddressSpace pci_device_iommu_info(PCIDevice *dev) { PCIBus *bus = pci_get_bus(dev); PCIBus *iommu_bus = bus; uint8_t devfn = dev->devfn; + AddressSpace *as = NULL; while (iommu_bus && !iommu_bus->iommu_fn && iommu_bus->parent_dev) { PCIBus *parent_bus = pci_get_bus(iommu_bus->parent_dev); @@ -2678,10 +2679,12 @@ AddressSpace *pci_device_iommu_address_space(PCIDevice *dev) iommu_bus = parent_bus; } + + as = &address_space_memory; if (!pci_bus_bypass_iommu(bus) && iommu_bus && iommu_bus->iommu_fn) { - return iommu_bus->iommu_fn(bus, iommu_bus->iommu_opaque, devfn); + as = iommu_bus->iommu_fn(bus, iommu_bus->iommu_opaque, devfn); } - return &address_space_memory; + return as_to_pci_as(as); } void pci_setup_iommu(PCIBus *bus, PCIIOMMUFunc fn, void *opaque) diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index e6d0574a2999..9ffaf47fe2ab 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -363,9 +363,28 @@ void pci_bus_get_w64_range(PCIBus *bus, Range *range); void pci_device_deassert_intx(PCIDevice *dev); +typedef struct PCIAddressSpace { + AddressSpace *as; +} PCIAddressSpace; + typedef AddressSpace *(*PCIIOMMUFunc)(PCIBus *, void *, int); +static inline PCIAddressSpace as_to_pci_as(AddressSpace *as) +{ + PCIAddressSpace ret = { .as = as }; + + return ret; +} +static inline AddressSpace *pci_as_to_as(PCIAddressSpace pci_as) +{ + return pci_as.as; +} + +PCIAddressSpace pci_device_iommu_info(PCIDevice *dev); +static inline AddressSpace *pci_device_iommu_address_space(PCIDevice *dev) +{ + return pci_as_to_as(pci_device_iommu_info(dev)); +} -AddressSpace *pci_device_iommu_address_space(PCIDevice *dev); void pci_setup_iommu(PCIBus *bus, PCIIOMMUFunc fn, void *opaque); pcibus_t pci_bar_address(PCIDevice *d, -- 2.39.3