131 lines
4.6 KiB
Diff
131 lines
4.6 KiB
Diff
|
|
From 0e0956cb785f868dfe48201fcdead71dbdd234b0 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Date: Mon, 15 Jan 2024 15:05:19 +0800
|
||
|
|
Subject: [PATCH] vfio/iommufd: Add properties and handlers to
|
||
|
|
TYPE_HOST_IOMMU_DEVICE_IOMMUFD
|
||
|
|
|
||
|
|
New added properties include IOMMUFD handle and devid, ioas.
|
||
|
|
IOMMUFD handle and devid are used to allocate/free ioas, hwpt.
|
||
|
|
ioas is used to re-attach IOMMUFD backed device to its
|
||
|
|
default ioas id, i.e., when vIOMMU is disabled by guest.
|
||
|
|
These properties are initialized in .realize() handler.
|
||
|
|
|
||
|
|
New added handlers include [at|de]tach_hwpt. They are used to
|
||
|
|
attaching/detaching hwpt. VFIO and VDPA have different way to
|
||
|
|
attach and detach, so implementation will be in sub-class
|
||
|
|
instead of HostIOMMUDeviceIOMMUFD.
|
||
|
|
|
||
|
|
Add two wrappers host_iommu_device_iommufd_[at|de]tach_hwpt to
|
||
|
|
wrap the two handlers.
|
||
|
|
|
||
|
|
This is a prerequisite patch for following ones.
|
||
|
|
|
||
|
|
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
---
|
||
|
|
backends/iommufd.c | 22 ++++++++++++++++++
|
||
|
|
include/sysemu/iommufd.h | 50 ++++++++++++++++++++++++++++++++++++++++
|
||
|
|
2 files changed, 72 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/backends/iommufd.c b/backends/iommufd.c
|
||
|
|
index cf24370385..c10aa9b011 100644
|
||
|
|
--- a/backends/iommufd.c
|
||
|
|
+++ b/backends/iommufd.c
|
||
|
|
@@ -360,6 +360,26 @@ int iommufd_backend_invalidate_cache(IOMMUFDBackend *be, uint32_t hwpt_id,
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
+bool host_iommu_device_iommufd_attach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
|
||
|
|
+ uint32_t hwpt_id, Error **errp)
|
||
|
|
+{
|
||
|
|
+ HostIOMMUDeviceIOMMUFDClass *idevc =
|
||
|
|
+ HOST_IOMMU_DEVICE_IOMMUFD_GET_CLASS(idev);
|
||
|
|
+
|
||
|
|
+ g_assert(idevc->attach_hwpt);
|
||
|
|
+ return idevc->attach_hwpt(idev, hwpt_id, errp);
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+bool host_iommu_device_iommufd_detach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
|
||
|
|
+ Error **errp)
|
||
|
|
+{
|
||
|
|
+ HostIOMMUDeviceIOMMUFDClass *idevc =
|
||
|
|
+ HOST_IOMMU_DEVICE_IOMMUFD_GET_CLASS(idev);
|
||
|
|
+
|
||
|
|
+ g_assert(idevc->detach_hwpt);
|
||
|
|
+ return idevc->detach_hwpt(idev, errp);
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static int hiod_iommufd_get_cap(HostIOMMUDevice *hiod, int cap, Error **errp)
|
||
|
|
{
|
||
|
|
HostIOMMUDeviceCaps *caps = &hiod->caps;
|
||
|
|
@@ -398,6 +418,8 @@ static const TypeInfo types[] = {
|
||
|
|
}, {
|
||
|
|
.name = TYPE_HOST_IOMMU_DEVICE_IOMMUFD,
|
||
|
|
.parent = TYPE_HOST_IOMMU_DEVICE,
|
||
|
|
+ .instance_size = sizeof(HostIOMMUDeviceIOMMUFD),
|
||
|
|
+ .class_size = sizeof(HostIOMMUDeviceIOMMUFDClass),
|
||
|
|
.class_init = hiod_iommufd_class_init,
|
||
|
|
.abstract = true,
|
||
|
|
}
|
||
|
|
diff --git a/include/sysemu/iommufd.h b/include/sysemu/iommufd.h
|
||
|
|
index f6596f6338..3dc6934144 100644
|
||
|
|
--- a/include/sysemu/iommufd.h
|
||
|
|
+++ b/include/sysemu/iommufd.h
|
||
|
|
@@ -68,4 +68,54 @@ int iommufd_backend_invalidate_cache(IOMMUFDBackend *be, uint32_t hwpt_id,
|
||
|
|
uint32_t *entry_num, void *data_ptr);
|
||
|
|
|
||
|
|
#define TYPE_HOST_IOMMU_DEVICE_IOMMUFD TYPE_HOST_IOMMU_DEVICE "-iommufd"
|
||
|
|
+OBJECT_DECLARE_TYPE(HostIOMMUDeviceIOMMUFD, HostIOMMUDeviceIOMMUFDClass,
|
||
|
|
+ HOST_IOMMU_DEVICE_IOMMUFD)
|
||
|
|
+
|
||
|
|
+/* Abstract of host IOMMU device with iommufd backend */
|
||
|
|
+struct HostIOMMUDeviceIOMMUFD {
|
||
|
|
+ HostIOMMUDevice parent_obj;
|
||
|
|
+
|
||
|
|
+ IOMMUFDBackend *iommufd;
|
||
|
|
+ uint32_t devid;
|
||
|
|
+ uint32_t ioas_id;
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+struct HostIOMMUDeviceIOMMUFDClass {
|
||
|
|
+ HostIOMMUDeviceClass parent_class;
|
||
|
|
+
|
||
|
|
+ /**
|
||
|
|
+ * @attach_hwpt: attach host IOMMU device to IOMMUFD hardware page table.
|
||
|
|
+ * VFIO and VDPA device can have different implementation.
|
||
|
|
+ *
|
||
|
|
+ * Mandatory callback.
|
||
|
|
+ *
|
||
|
|
+ * @idev: host IOMMU device backed by IOMMUFD backend.
|
||
|
|
+ *
|
||
|
|
+ * @hwpt_id: ID of IOMMUFD hardware page table.
|
||
|
|
+ *
|
||
|
|
+ * @errp: pass an Error out when attachment fails.
|
||
|
|
+ *
|
||
|
|
+ * Returns: true on success, false on failure.
|
||
|
|
+ */
|
||
|
|
+ bool (*attach_hwpt)(HostIOMMUDeviceIOMMUFD *idev, uint32_t hwpt_id,
|
||
|
|
+ Error **errp);
|
||
|
|
+ /**
|
||
|
|
+ * @detach_hwpt: detach host IOMMU device from IOMMUFD hardware page table.
|
||
|
|
+ * VFIO and VDPA device can have different implementation.
|
||
|
|
+ *
|
||
|
|
+ * Mandatory callback.
|
||
|
|
+ *
|
||
|
|
+ * @idev: host IOMMU device backed by IOMMUFD backend.
|
||
|
|
+ *
|
||
|
|
+ * @errp: pass an Error out when attachment fails.
|
||
|
|
+ *
|
||
|
|
+ * Returns: true on success, false on failure.
|
||
|
|
+ */
|
||
|
|
+ bool (*detach_hwpt)(HostIOMMUDeviceIOMMUFD *idev, 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);
|
||
|
|
#endif
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|