This new callback will be used to convey usable IOVA regions from VFIO-PCI devices to vIOMMUS (esp. virtio-iommu). The advantage is that this callback can be called very early, once the device has is known to be protected by a vIOMMU, after the get_address_space() has been called by the parent device. Current solution to convey IOVA regions relies on IOMMU MR callbacks but this requires an IOMMU MR to be connected with the VFIO-PCI device which generally comes with the enablement of the IOMMU MR (vIOMMU protection activated). The downside is that is comes pretty late and in case of virtio-iommu, after the probe.
Signed-off-by: Eric Auger <eric.au...@redhat.com> --- include/hw/pci/pci.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index fa6313aabc..63c018b35a 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -385,6 +385,21 @@ typedef struct PCIIOMMUOps { * @devfn: device and function number */ AddressSpace * (*get_address_space)(PCIBus *bus, void *opaque, int devfn); + + /** + * @set_host_iova_ranges: convey the usable iova ranges for a given device + * + * Optional callback which returns 0 on success or an error value if any + * should be called after @get_address_space() + * + * @bus: the #PCIBus being accessed. + * @opaque: the data passed to pci_setup_iommu(). + * @devfn: device and function number + * @iova_ranges: list of IOVA ranges usable by the device + * @errp: error handle + */ + int (*set_host_iova_ranges)(PCIBus *bus, void *opaque, int devfn, + GList *iova_ranges, Error **errp); } PCIIOMMUOps; AddressSpace *pci_device_iommu_address_space(PCIDevice *dev); -- 2.41.0