Add two wrappers host_iommu_device_iommufd_pasid_[at|de]tach_hwpt to
wrap the two callbacks.

Use assert to ensure the corresponding callbacks exist.

Signed-off-by: Yi Liu <[email protected]>
Signed-off-by: Zhenzhong Duan <[email protected]>
---
 include/system/iommufd.h | 40 ++++++++++++++++++++++++++++++++++++++++
 backends/iommufd.c       | 23 +++++++++++++++++++++++
 2 files changed, 63 insertions(+)

diff --git a/include/system/iommufd.h b/include/system/iommufd.h
index 80d72469a9..615be10aed 100644
--- a/include/system/iommufd.h
+++ b/include/system/iommufd.h
@@ -145,10 +145,50 @@ struct HostIOMMUDeviceIOMMUFDClass {
      * Returns: true on success, false on failure.
      */
     bool (*detach_hwpt)(HostIOMMUDeviceIOMMUFD *idev, Error **errp);
+    /**
+     * @attach_hwpt: attach host IOMMU device's pasid to IOMMUFD hardware page
+     * table. VFIO and VDPA device can have different implementation.
+     *
+     * Mandatory callback.
+     *
+     * @idev: host IOMMU device backed by IOMMUFD backend.
+     *
+     * @pasid: pasid of host IOMMU device.
+     *
+     * @hwpt_id: ID of IOMMUFD hardware page table.
+     *
+     * @errp: pass an Error out when attachment fails.
+     *
+     * Returns: true on success, false on failure.
+     */
+    bool (*pasid_attach_hwpt)(HostIOMMUDeviceIOMMUFD *idev, uint32_t pasid,
+                              uint32_t hwpt_id, Error **errp);
+    /**
+     * @detach_hwpt: detach host IOMMU device's from IOMMUFD hardware page
+     * table. VFIO and VDPA device can have different implementation.
+     *
+     * Mandatory callback.
+     *
+     * @idev: host IOMMU device backed by IOMMUFD backend.
+     *
+     * @pasid: pasid of host IOMMU device.
+     *
+     * @errp: pass an Error out when attachment fails.
+     *
+     * Returns: true on success, false on failure.
+     */
+    bool (*pasid_detach_hwpt)(HostIOMMUDeviceIOMMUFD *idev, uint32_t pasid,
+                              Error **errp);
 };
 
 bool host_iommu_device_iommufd_attach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
                                            uint32_t hwpt_id, Error **errp);
 bool host_iommu_device_iommufd_detach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
                                            Error **errp);
+bool host_iommu_device_iommufd_pasid_attach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
+                                                 uint32_t pasid,
+                                                 uint32_t hwpt_id,
+                                                 Error **errp);
+bool host_iommu_device_iommufd_pasid_detach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
+                                                 uint32_t pasid, Error **errp);
 #endif
diff --git a/backends/iommufd.c b/backends/iommufd.c
index 13822df82f..93d3612471 100644
--- a/backends/iommufd.c
+++ b/backends/iommufd.c
@@ -539,6 +539,29 @@ static int hiod_iommufd_get_cap(HostIOMMUDevice *hiod, int 
cap, Error **errp)
     }
 }
 
+bool host_iommu_device_iommufd_pasid_attach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
+                                                 uint32_t pasid,
+                                                 uint32_t hwpt_id,
+                                                 Error **errp)
+{
+    HostIOMMUDeviceIOMMUFDClass *idevc =
+        HOST_IOMMU_DEVICE_IOMMUFD_GET_CLASS(idev);
+
+    g_assert(idevc->pasid_attach_hwpt);
+    return idevc->pasid_attach_hwpt(idev, pasid, hwpt_id, errp);
+}
+
+bool host_iommu_device_iommufd_pasid_detach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
+                                                 uint32_t pasid,
+                                                 Error **errp)
+{
+    HostIOMMUDeviceIOMMUFDClass *idevc =
+        HOST_IOMMU_DEVICE_IOMMUFD_GET_CLASS(idev);
+
+    g_assert(idevc->pasid_detach_hwpt);
+    return idevc->pasid_detach_hwpt(idev, pasid, errp);
+}
+
 static bool hiod_iommufd_get_pasid_info(HostIOMMUDevice *hiod,
                                         PasidInfo *pasid_info)
 {
-- 
2.47.3


Reply via email to