Add support for iommufd, init the vdpa_iommufd in vdpa_start
in this step, driver will bind to the iommufd device
and attach the default ASID(asid 0) to iommufd

Signed-off-by: Cindy Lu <l...@redhat.com>
---
 hw/virtio/vhost-vdpa.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
index 85240926b2..6c01e3b44f 100644
--- a/hw/virtio/vhost-vdpa.c
+++ b/hw/virtio/vhost-vdpa.c
@@ -1158,6 +1158,24 @@ static int vhost_vdpa_dev_start(struct vhost_dev *dev, 
bool started)
     trace_vhost_vdpa_dev_start(dev, started);
 
     if (started) {
+        if ((v->enable_iommufd) && (vhost_vdpa_first_dev(dev))) {
+            struct vdpa_iommufd *vdpa_iommufd;
+
+            vdpa_backend_iommufd_ops_class_init(v);
+
+            if (dev->vdev->iommufd_ptr == NULL) {
+                vdpa_iommufd = g_malloc(sizeof(VDPAIOMMUFDState));
+
+                vdpa_iommufd->iommufd = g_malloc(sizeof(IOMMUFDBackend));
+                dev->vdev->iommufd_ptr = vdpa_iommufd;
+
+                qemu_mutex_init(&vdpa_iommufd->iommufd->lock);
+                iommufd_backend_connect(vdpa_iommufd->iommufd, NULL);
+
+                v->ops->attach_device(v, dev->vdev->dma_as, NULL);
+            }
+        }
+
         vhost_vdpa_host_notifiers_init(dev);
         ok = vhost_vdpa_svqs_start(dev);
         if (unlikely(!ok)) {
-- 
2.34.3


Reply via email to