114 lines
3.8 KiB
Diff
114 lines
3.8 KiB
Diff
|
|
From 2692ea754863364731e5712ebf83208690179089 Mon Sep 17 00:00:00 2001
|
||
|
|
From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= <clg@redhat.com>
|
||
|
|
Date: Tue, 19 Dec 2023 07:58:22 +0100
|
||
|
|
Subject: [PATCH] vfio/spapr: Introduce a sPAPR VFIOIOMMU QOM interface
|
||
|
|
MIME-Version: 1.0
|
||
|
|
Content-Type: text/plain; charset=UTF-8
|
||
|
|
Content-Transfer-Encoding: 8bit
|
||
|
|
|
||
|
|
Move vfio_spapr_container_setup() to a VFIOIOMMUClass::setup handler
|
||
|
|
and convert the sPAPR VFIOIOMMUOps struct to a QOM interface. The
|
||
|
|
sPAPR QOM interface inherits from the legacy QOM interface because
|
||
|
|
because both have the same basic needs. The sPAPR interface is then
|
||
|
|
extended with the handlers specific to the sPAPR IOMMU.
|
||
|
|
|
||
|
|
This allows reuse and provides better abstraction of the backends. It
|
||
|
|
will be useful to avoid compiling the sPAPR IOMMU backend on targets
|
||
|
|
not supporting it.
|
||
|
|
|
||
|
|
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Tested-by: Eric Farman <farman@linux.ibm.com>
|
||
|
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||
|
|
---
|
||
|
|
hw/vfio/container.c | 24 ++++++------------------
|
||
|
|
hw/vfio/spapr.c | 20 ++++++++++++++++++++
|
||
|
|
include/hw/vfio/vfio-container-base.h | 1 +
|
||
|
|
3 files changed, 27 insertions(+), 18 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/hw/vfio/container.c b/hw/vfio/container.c
|
||
|
|
index 845239eff4..e245d5a082 100644
|
||
|
|
--- a/hw/vfio/container.c
|
||
|
|
+++ b/hw/vfio/container.c
|
||
|
|
@@ -441,6 +441,10 @@ static const VFIOIOMMUClass *vfio_get_iommu_class(int iommu_type, Error **errp)
|
||
|
|
case VFIO_TYPE1_IOMMU:
|
||
|
|
klass = object_class_by_name(TYPE_VFIO_IOMMU_LEGACY);
|
||
|
|
break;
|
||
|
|
+ case VFIO_SPAPR_TCE_v2_IOMMU:
|
||
|
|
+ case VFIO_SPAPR_TCE_IOMMU:
|
||
|
|
+ klass = object_class_by_name(TYPE_VFIO_IOMMU_SPAPR);
|
||
|
|
+ break;
|
||
|
|
default:
|
||
|
|
g_assert_not_reached();
|
||
|
|
};
|
||
|
|
@@ -716,25 +720,9 @@ static int vfio_connect_container(VFIOGroup *group, AddressSpace *as,
|
||
|
|
goto free_container_exit;
|
||
|
|
}
|
||
|
|
|
||
|
|
- switch (container->iommu_type) {
|
||
|
|
- case VFIO_TYPE1v2_IOMMU:
|
||
|
|
- case VFIO_TYPE1_IOMMU:
|
||
|
|
- case VFIO_TYPE1v2_S_IOMMU:
|
||
|
|
- ret = vfio_legacy_setup(bcontainer, errp);
|
||
|
|
- break;
|
||
|
|
- case VFIO_SPAPR_TCE_v2_IOMMU:
|
||
|
|
- case VFIO_SPAPR_TCE_IOMMU:
|
||
|
|
- {
|
||
|
|
- ret = vfio_spapr_container_init(container, errp);
|
||
|
|
- if (ret) {
|
||
|
|
- goto enable_discards_exit;
|
||
|
|
- }
|
||
|
|
- break;
|
||
|
|
- }
|
||
|
|
- default:
|
||
|
|
- g_assert_not_reached();
|
||
|
|
- }
|
||
|
|
+ assert(bcontainer->ops->setup);
|
||
|
|
|
||
|
|
+ ret = bcontainer->ops->setup(bcontainer, errp);
|
||
|
|
if (ret) {
|
||
|
|
goto enable_discards_exit;
|
||
|
|
}
|
||
|
|
diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c
|
||
|
|
index 5c6426e697..3694dfb874 100644
|
||
|
|
--- a/hw/vfio/spapr.c
|
||
|
|
+++ b/hw/vfio/spapr.c
|
||
|
|
@@ -543,3 +543,23 @@ void vfio_spapr_container_deinit(VFIOContainer *container)
|
||
|
|
g_free(hostwin);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
+
|
||
|
|
+static void vfio_iommu_spapr_class_init(ObjectClass *klass, void *data)
|
||
|
|
+{
|
||
|
|
+ VFIOIOMMUClass *vioc = VFIO_IOMMU_CLASS(klass);
|
||
|
|
+
|
||
|
|
+ vioc->add_window = vfio_spapr_container_add_section_window;
|
||
|
|
+ vioc->del_window = vfio_spapr_container_del_section_window;
|
||
|
|
+ //vioc->release = vfio_spapr_container_release;
|
||
|
|
+ //vioc->setup = vfio_spapr_container_setup;
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+static const TypeInfo types[] = {
|
||
|
|
+ {
|
||
|
|
+ .name = TYPE_VFIO_IOMMU_SPAPR,
|
||
|
|
+ .parent = TYPE_VFIO_IOMMU_LEGACY,
|
||
|
|
+ .class_init = vfio_iommu_spapr_class_init,
|
||
|
|
+ },
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
+DEFINE_TYPES(types)
|
||
|
|
diff --git a/include/hw/vfio/vfio-container-base.h b/include/hw/vfio/vfio-container-base.h
|
||
|
|
index 614de90767..1085109d0c 100644
|
||
|
|
--- a/include/hw/vfio/vfio-container-base.h
|
||
|
|
+++ b/include/hw/vfio/vfio-container-base.h
|
||
|
|
@@ -95,6 +95,7 @@ void vfio_container_destroy(VFIOContainerBase *bcontainer);
|
||
|
|
|
||
|
|
#define TYPE_VFIO_IOMMU "vfio-iommu"
|
||
|
|
#define TYPE_VFIO_IOMMU_LEGACY TYPE_VFIO_IOMMU "-legacy"
|
||
|
|
+#define TYPE_VFIO_IOMMU_SPAPR TYPE_VFIO_IOMMU "-spapr"
|
||
|
|
|
||
|
|
/*
|
||
|
|
* VFIOContainerBase is not an abstract QOM object because it felt
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|