On 30/05/2023 23:04, Philippe Mathieu-Daudé wrote: > Hi Joao, > > On 30/5/23 19:59, Joao Martins wrote: >> 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 ++++++++++++++++++++- > > Please consider using scripts/git.orderfile. > Will do -- wasn't aware of that script.
>> 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) >> { > > This function is PCI specific, ... > >> } >> 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; > > ... but here I fail to understand what is PCI specific in this > structure. You are just trying to an AS with a IOMMU MR, right? > Right. The patch is trying to better split the changes to use one function to return everything (via pci_device_iommu_info) with the PCIAddressSpace intermediate structure as retval, such that patch 3 just adds a IOMMUMemoryRegion* in the latter for usage with the pci_device_iommu_memory_region(). I've named the structure with a 'PCI' prefix, because it seemed to me that it is the only case (AIUI) that cares about whether a PCI has a different address space that the memory map. >> +} 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, >