[RFC 1/7] hw/pci: Introduce PCIIOMMUOps::set_host_iova_regions

Eric Auger posted 7 patches 10 months, 2 weeks ago
Maintainers: "Michael S. Tsirkin" <mst@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Alex Williamson <alex.williamson@redhat.com>, "Cédric Le Goater" <clg@redhat.com>, Eric Auger <eric.auger@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Peter Xu <peterx@redhat.com>, David Hildenbrand <david@redhat.com>, "Philippe Mathieu-Daudé" <philmd@linaro.org>
There is a newer version of this series
[RFC 1/7] hw/pci: Introduce PCIIOMMUOps::set_host_iova_regions
Posted by Eric Auger 10 months, 2 weeks ago
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.auger@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