163 lines
5.4 KiB
Diff
163 lines
5.4 KiB
Diff
|
|
From 626698a1e9edff6a1032f496858555e1a4614fbe Mon Sep 17 00:00:00 2001
|
||
|
|
From: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Date: Wed, 5 Jun 2024 16:30:27 +0800
|
||
|
|
Subject: [PATCH] backends: Introduce HostIOMMUDevice abstract
|
||
|
|
MIME-Version: 1.0
|
||
|
|
Content-Type: text/plain; charset=UTF-8
|
||
|
|
Content-Transfer-Encoding: 8bit
|
||
|
|
|
||
|
|
A HostIOMMUDevice is an abstraction for an assigned device that is protected
|
||
|
|
by a physical IOMMU (aka host IOMMU). The userspace interaction with this
|
||
|
|
physical IOMMU can be done either through the VFIO IOMMU type 1 legacy
|
||
|
|
backend or the new iommufd backend. The assigned device can be a VFIO device
|
||
|
|
or a VDPA device. The HostIOMMUDevice is needed to interact with the host
|
||
|
|
IOMMU that protects the assigned device. It is especially useful when the
|
||
|
|
device is also protected by a virtual IOMMU as this latter use the translation
|
||
|
|
services of the physical IOMMU and is constrained by it. In that context the
|
||
|
|
HostIOMMUDevice can be passed to the virtual IOMMU to collect physical IOMMU
|
||
|
|
capabilities such as the supported address width. In the future, the virtual
|
||
|
|
IOMMU will use the HostIOMMUDevice to program the guest page tables in the
|
||
|
|
first translation stage of the physical IOMMU.
|
||
|
|
|
||
|
|
Introduce .realize() to initialize HostIOMMUDevice further after instance init.
|
||
|
|
|
||
|
|
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>
|
||
|
|
---
|
||
|
|
MAINTAINERS | 2 ++
|
||
|
|
backends/host_iommu_device.c | 33 +++++++++++++++++++
|
||
|
|
backends/meson.build | 1 +
|
||
|
|
include/sysemu/host_iommu_device.h | 53 ++++++++++++++++++++++++++++++
|
||
|
|
4 files changed, 89 insertions(+)
|
||
|
|
create mode 100644 backends/host_iommu_device.c
|
||
|
|
create mode 100644 include/sysemu/host_iommu_device.h
|
||
|
|
|
||
|
|
diff --git a/MAINTAINERS b/MAINTAINERS
|
||
|
|
index 0ddb20a35f..ada87bfa9e 100644
|
||
|
|
--- a/MAINTAINERS
|
||
|
|
+++ b/MAINTAINERS
|
||
|
|
@@ -2174,6 +2174,8 @@ M: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
S: Supported
|
||
|
|
F: backends/iommufd.c
|
||
|
|
F: include/sysemu/iommufd.h
|
||
|
|
+F: backends/host_iommu_device.c
|
||
|
|
+F: include/sysemu/host_iommu_device.h
|
||
|
|
F: include/qemu/chardev_open.h
|
||
|
|
F: util/chardev_open.c
|
||
|
|
F: docs/devel/vfio-iommufd.rst
|
||
|
|
diff --git a/backends/host_iommu_device.c b/backends/host_iommu_device.c
|
||
|
|
new file mode 100644
|
||
|
|
index 0000000000..8f2dda1beb
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/backends/host_iommu_device.c
|
||
|
|
@@ -0,0 +1,33 @@
|
||
|
|
+/*
|
||
|
|
+ * Host IOMMU device abstract
|
||
|
|
+ *
|
||
|
|
+ * Copyright (C) 2024 Intel Corporation.
|
||
|
|
+ *
|
||
|
|
+ * Authors: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
+ *
|
||
|
|
+ * This work is licensed under the terms of the GNU GPL, version 2. See
|
||
|
|
+ * the COPYING file in the top-level directory.
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+#include "qemu/osdep.h"
|
||
|
|
+#include "sysemu/host_iommu_device.h"
|
||
|
|
+
|
||
|
|
+OBJECT_DEFINE_ABSTRACT_TYPE(HostIOMMUDevice,
|
||
|
|
+ host_iommu_device,
|
||
|
|
+ HOST_IOMMU_DEVICE,
|
||
|
|
+ OBJECT)
|
||
|
|
+
|
||
|
|
+static void host_iommu_device_class_init(ObjectClass *oc, void *data)
|
||
|
|
+{
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+static void host_iommu_device_init(Object *obj)
|
||
|
|
+{
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+static void host_iommu_device_finalize(Object *obj)
|
||
|
|
+{
|
||
|
|
+ HostIOMMUDevice *hiod = HOST_IOMMU_DEVICE(obj);
|
||
|
|
+
|
||
|
|
+ g_free(hiod->name);
|
||
|
|
+}
|
||
|
|
diff --git a/backends/meson.build b/backends/meson.build
|
||
|
|
index 9a5cea480d..68b5e34e04 100644
|
||
|
|
--- a/backends/meson.build
|
||
|
|
+++ b/backends/meson.build
|
||
|
|
@@ -13,6 +13,7 @@ system_ss.add([files(
|
||
|
|
system_ss.add(when: 'CONFIG_POSIX', if_true: files('rng-random.c'))
|
||
|
|
system_ss.add(when: 'CONFIG_POSIX', if_true: files('hostmem-file.c'))
|
||
|
|
system_ss.add(when: 'CONFIG_LINUX', if_true: files('hostmem-memfd.c'))
|
||
|
|
+system_ss.add(when: 'CONFIG_LINUX', if_true: files('host_iommu_device.c'))
|
||
|
|
if keyutils.found()
|
||
|
|
system_ss.add(keyutils, files('cryptodev-lkcf.c'))
|
||
|
|
endif
|
||
|
|
diff --git a/include/sysemu/host_iommu_device.h b/include/sysemu/host_iommu_device.h
|
||
|
|
new file mode 100644
|
||
|
|
index 0000000000..db47a16189
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/include/sysemu/host_iommu_device.h
|
||
|
|
@@ -0,0 +1,53 @@
|
||
|
|
+/*
|
||
|
|
+ * Host IOMMU device abstract declaration
|
||
|
|
+ *
|
||
|
|
+ * Copyright (C) 2024 Intel Corporation.
|
||
|
|
+ *
|
||
|
|
+ * Authors: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
+ *
|
||
|
|
+ * This work is licensed under the terms of the GNU GPL, version 2. See
|
||
|
|
+ * the COPYING file in the top-level directory.
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+#ifndef HOST_IOMMU_DEVICE_H
|
||
|
|
+#define HOST_IOMMU_DEVICE_H
|
||
|
|
+
|
||
|
|
+#include "qom/object.h"
|
||
|
|
+#include "qapi/error.h"
|
||
|
|
+
|
||
|
|
+#define TYPE_HOST_IOMMU_DEVICE "host-iommu-device"
|
||
|
|
+OBJECT_DECLARE_TYPE(HostIOMMUDevice, HostIOMMUDeviceClass, HOST_IOMMU_DEVICE)
|
||
|
|
+
|
||
|
|
+struct HostIOMMUDevice {
|
||
|
|
+ Object parent_obj;
|
||
|
|
+
|
||
|
|
+ char *name;
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * struct HostIOMMUDeviceClass - The base class for all host IOMMU devices.
|
||
|
|
+ *
|
||
|
|
+ * Different types of host devices (e.g., VFIO or VDPA device) or devices
|
||
|
|
+ * with different backend (e.g., VFIO legacy container or IOMMUFD backend)
|
||
|
|
+ * will have different implementations of the HostIOMMUDeviceClass.
|
||
|
|
+ */
|
||
|
|
+struct HostIOMMUDeviceClass {
|
||
|
|
+ ObjectClass parent_class;
|
||
|
|
+
|
||
|
|
+ /**
|
||
|
|
+ * @realize: initialize host IOMMU device instance further.
|
||
|
|
+ *
|
||
|
|
+ * Mandatory callback.
|
||
|
|
+ *
|
||
|
|
+ * @hiod: pointer to a host IOMMU device instance.
|
||
|
|
+ *
|
||
|
|
+ * @opaque: pointer to agent device of this host IOMMU device,
|
||
|
|
+ * e.g., VFIO base device or VDPA device.
|
||
|
|
+ *
|
||
|
|
+ * @errp: pass an Error out when realize fails.
|
||
|
|
+ *
|
||
|
|
+ * Returns: true on success, false on failure.
|
||
|
|
+ */
|
||
|
|
+ bool (*realize)(HostIOMMUDevice *hiod, void *opaque, Error **errp);
|
||
|
|
+};
|
||
|
|
+#endif
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|