125 lines
4.3 KiB
Diff
125 lines
4.3 KiB
Diff
|
|
From a152921f6d534f2a515b4e88304ad115fae8fa8f Mon Sep 17 00:00:00 2001
|
||
|
|
From: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Date: Wed, 5 Jun 2024 16:30:37 +0800
|
||
|
|
Subject: [PATCH] vfio: Create host IOMMU device instance
|
||
|
|
MIME-Version: 1.0
|
||
|
|
Content-Type: text/plain; charset=UTF-8
|
||
|
|
Content-Transfer-Encoding: 8bit
|
||
|
|
|
||
|
|
Create host IOMMU device instance in vfio_attach_device() and call
|
||
|
|
.realize() to initialize it further.
|
||
|
|
|
||
|
|
Introuduce attribute VFIOIOMMUClass::hiod_typename and initialize
|
||
|
|
it based on VFIO backend type. It will facilitate HostIOMMUDevice
|
||
|
|
creation in vfio_attach_device().
|
||
|
|
|
||
|
|
Suggested-by: Cédric Le Goater <clg@redhat.com>
|
||
|
|
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||
|
|
---
|
||
|
|
hw/vfio/common.c | 18 +++++++++++++++++-
|
||
|
|
hw/vfio/container.c | 2 ++
|
||
|
|
hw/vfio/iommufd.c | 2 ++
|
||
|
|
include/hw/vfio/vfio-common.h | 1 +
|
||
|
|
include/hw/vfio/vfio-container-base.h | 3 +++
|
||
|
|
5 files changed, 25 insertions(+), 1 deletion(-)
|
||
|
|
|
||
|
|
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
|
||
|
|
index b5d02df0c2..d5ff65f90a 100644
|
||
|
|
--- a/hw/vfio/common.c
|
||
|
|
+++ b/hw/vfio/common.c
|
||
|
|
@@ -1650,6 +1650,8 @@ int vfio_attach_device(char *name, VFIODevice *vbasedev,
|
||
|
|
{
|
||
|
|
const VFIOIOMMUClass *ops =
|
||
|
|
VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_LEGACY));
|
||
|
|
+ HostIOMMUDevice *hiod = NULL;
|
||
|
|
+ int ret;
|
||
|
|
|
||
|
|
if (vbasedev->iommufd) {
|
||
|
|
ops = VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_IOMMUFD));
|
||
|
|
@@ -1657,7 +1659,20 @@ int vfio_attach_device(char *name, VFIODevice *vbasedev,
|
||
|
|
|
||
|
|
assert(ops);
|
||
|
|
|
||
|
|
- return ops->attach_device(name, vbasedev, as, errp);
|
||
|
|
+ ret = ops->attach_device(name, vbasedev, as, errp);
|
||
|
|
+ if (ret) {
|
||
|
|
+ return ret;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ hiod = HOST_IOMMU_DEVICE(object_new(ops->hiod_typename));
|
||
|
|
+ if (!HOST_IOMMU_DEVICE_GET_CLASS(hiod)->realize(hiod, vbasedev, errp)) {
|
||
|
|
+ object_unref(hiod);
|
||
|
|
+ ops->detach_device(vbasedev);
|
||
|
|
+ return -1;
|
||
|
|
+ }
|
||
|
|
+ vbasedev->hiod = hiod;
|
||
|
|
+
|
||
|
|
+ return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
void vfio_detach_device(VFIODevice *vbasedev)
|
||
|
|
@@ -1665,5 +1680,6 @@ void vfio_detach_device(VFIODevice *vbasedev)
|
||
|
|
if (!vbasedev->bcontainer) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
+ object_unref(vbasedev->hiod);
|
||
|
|
vbasedev->bcontainer->ops->detach_device(vbasedev);
|
||
|
|
}
|
||
|
|
diff --git a/hw/vfio/container.c b/hw/vfio/container.c
|
||
|
|
index ed54ce6d0c..10f7635425 100644
|
||
|
|
--- a/hw/vfio/container.c
|
||
|
|
+++ b/hw/vfio/container.c
|
||
|
|
@@ -1240,6 +1240,8 @@ static void vfio_iommu_legacy_class_init(ObjectClass *klass, void *data)
|
||
|
|
{
|
||
|
|
VFIOIOMMUClass *vioc = VFIO_IOMMU_CLASS(klass);
|
||
|
|
|
||
|
|
+ vioc->hiod_typename = TYPE_HOST_IOMMU_DEVICE_LEGACY_VFIO;
|
||
|
|
+
|
||
|
|
vioc->setup = vfio_legacy_setup;
|
||
|
|
vioc->dma_map = vfio_legacy_dma_map;
|
||
|
|
vioc->dma_unmap = vfio_legacy_dma_unmap;
|
||
|
|
diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
|
||
|
|
index 2efdba5565..7cbf0e44f1 100644
|
||
|
|
--- a/hw/vfio/iommufd.c
|
||
|
|
+++ b/hw/vfio/iommufd.c
|
||
|
|
@@ -629,6 +629,8 @@ static void vfio_iommu_iommufd_class_init(ObjectClass *klass, void *data)
|
||
|
|
{
|
||
|
|
VFIOIOMMUClass *vioc = VFIO_IOMMU_CLASS(klass);
|
||
|
|
|
||
|
|
+ vioc->hiod_typename = TYPE_HOST_IOMMU_DEVICE_IOMMUFD_VFIO;
|
||
|
|
+
|
||
|
|
vioc->dma_map = iommufd_cdev_map;
|
||
|
|
vioc->dma_unmap = iommufd_cdev_unmap;
|
||
|
|
vioc->attach_device = iommufd_cdev_attach;
|
||
|
|
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
|
||
|
|
index 376b8350b9..d45d40c329 100644
|
||
|
|
--- a/include/hw/vfio/vfio-common.h
|
||
|
|
+++ b/include/hw/vfio/vfio-common.h
|
||
|
|
@@ -140,6 +140,7 @@ typedef struct VFIODevice {
|
||
|
|
OnOffAuto pre_copy_dirty_page_tracking;
|
||
|
|
bool dirty_pages_supported;
|
||
|
|
bool dirty_tracking;
|
||
|
|
+ HostIOMMUDevice *hiod;
|
||
|
|
int devid;
|
||
|
|
IOMMUFDBackend *iommufd;
|
||
|
|
} VFIODevice;
|
||
|
|
diff --git a/include/hw/vfio/vfio-container-base.h b/include/hw/vfio/vfio-container-base.h
|
||
|
|
index b2813b0c11..7a4c575115 100644
|
||
|
|
--- a/include/hw/vfio/vfio-container-base.h
|
||
|
|
+++ b/include/hw/vfio/vfio-container-base.h
|
||
|
|
@@ -109,6 +109,9 @@ DECLARE_CLASS_CHECKERS(VFIOIOMMUClass, VFIO_IOMMU, TYPE_VFIO_IOMMU)
|
||
|
|
struct VFIOIOMMUClass {
|
||
|
|
InterfaceClass parent_class;
|
||
|
|
|
||
|
|
+ /* Properties */
|
||
|
|
+ const char *hiod_typename;
|
||
|
|
+
|
||
|
|
/* basic feature */
|
||
|
|
int (*setup)(VFIOContainerBase *bcontainer, Error **errp);
|
||
|
|
int (*dma_map)(const VFIOContainerBase *bcontainer,
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|