83 lines
2.8 KiB
Diff
83 lines
2.8 KiB
Diff
|
|
From 4b0bff002d93d8785ccec8020667dc559bda4e9c Mon Sep 17 00:00:00 2001
|
||
|
|
From: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Date: Sat, 11 Jan 2025 10:52:33 +0800
|
||
|
|
Subject: [PATCH] vfio/spapr: Introduce spapr backend and target interface
|
||
|
|
MIME-Version: 1.0
|
||
|
|
Content-Type: text/plain; charset=UTF-8
|
||
|
|
Content-Transfer-Encoding: 8bit
|
||
|
|
|
||
|
|
Introduce an empty spapr backend which will hold spapr specific
|
||
|
|
content, currently only prereg_listener and hostwin_list.
|
||
|
|
|
||
|
|
Also introduce two spapr specific callbacks add/del_window into
|
||
|
|
VFIOIOMMUOps. Instantiate a spapr ops with a helper setup_spapr_ops
|
||
|
|
and assign it to bcontainer->ops.
|
||
|
|
|
||
|
|
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Reviewed-by: Cédric Le Goater <clg@redhat.com>
|
||
|
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||
|
|
Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com>
|
||
|
|
---
|
||
|
|
hw/vfio/spapr.c | 14 ++++++++++++++
|
||
|
|
include/hw/vfio/vfio-container-base.h | 6 ++++++
|
||
|
|
2 files changed, 20 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c
|
||
|
|
index 7a50975f25..e1a6b35563 100644
|
||
|
|
--- a/hw/vfio/spapr.c
|
||
|
|
+++ b/hw/vfio/spapr.c
|
||
|
|
@@ -24,6 +24,10 @@
|
||
|
|
#include "qapi/error.h"
|
||
|
|
#include "trace.h"
|
||
|
|
|
||
|
|
+typedef struct VFIOSpaprContainer {
|
||
|
|
+ VFIOContainer container;
|
||
|
|
+} VFIOSpaprContainer;
|
||
|
|
+
|
||
|
|
static bool vfio_prereg_listener_skipped_section(MemoryRegionSection *section)
|
||
|
|
{
|
||
|
|
if (memory_region_is_iommu(section->mr)) {
|
||
|
|
@@ -421,6 +425,14 @@ void vfio_container_del_section_window(VFIOContainer *container,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
+static VFIOIOMMUOps vfio_iommu_spapr_ops;
|
||
|
|
+
|
||
|
|
+static void setup_spapr_ops(VFIOContainerBase *bcontainer)
|
||
|
|
+{
|
||
|
|
+ vfio_iommu_spapr_ops = *bcontainer->ops;
|
||
|
|
+ bcontainer->ops = &vfio_iommu_spapr_ops;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
int vfio_spapr_container_init(VFIOContainer *container, Error **errp)
|
||
|
|
{
|
||
|
|
VFIOContainerBase *bcontainer = &container->bcontainer;
|
||
|
|
@@ -486,6 +498,8 @@ int vfio_spapr_container_init(VFIOContainer *container, Error **errp)
|
||
|
|
0x1000);
|
||
|
|
}
|
||
|
|
|
||
|
|
+ setup_spapr_ops(bcontainer);
|
||
|
|
+
|
||
|
|
return 0;
|
||
|
|
|
||
|
|
listener_unregister_exit:
|
||
|
|
diff --git a/include/hw/vfio/vfio-container-base.h b/include/hw/vfio/vfio-container-base.h
|
||
|
|
index 9658ffb526..f62a14ac73 100644
|
||
|
|
--- a/include/hw/vfio/vfio-container-base.h
|
||
|
|
+++ b/include/hw/vfio/vfio-container-base.h
|
||
|
|
@@ -101,5 +101,11 @@ struct VFIOIOMMUOps {
|
||
|
|
int (*set_dirty_page_tracking)(VFIOContainerBase *bcontainer, bool start);
|
||
|
|
int (*query_dirty_bitmap)(VFIOContainerBase *bcontainer, VFIOBitmap *vbmap,
|
||
|
|
hwaddr iova, hwaddr size);
|
||
|
|
+ /* SPAPR specific */
|
||
|
|
+ int (*add_window)(VFIOContainerBase *bcontainer,
|
||
|
|
+ MemoryRegionSection *section,
|
||
|
|
+ Error **errp);
|
||
|
|
+ void (*del_window)(VFIOContainerBase *bcontainer,
|
||
|
|
+ MemoryRegionSection *section);
|
||
|
|
};
|
||
|
|
#endif /* HW_VFIO_VFIO_CONTAINER_BASE_H */
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|