>-----Original Message----- >From: Cédric Le Goater <c...@redhat.com> >Sent: Friday, December 8, 2023 4:46 PM >Subject: [PATCH for-9.0 07/10] vfio/spapr: Introduce a sPAPR VFIOIOMMU >QOM interface > >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. > >Signed-off-by: Cédric Le Goater <c...@redhat.com> >--- > include/hw/vfio/vfio-container-base.h | 1 + > hw/vfio/container.c | 18 ++++-------- > hw/vfio/spapr.c | 40 +++++++++++++++++---------- > 3 files changed, 32 insertions(+), 27 deletions(-) > >diff --git a/include/hw/vfio/vfio-container-base.h b/include/hw/vfio/vfio- >container-base.h >index >870e7dc48e542ddbfc52e12b0ab5fab4771a1ebd..4012360c07b7c0a23f170f >94a19455c79d3504b1 100644 >--- a/include/hw/vfio/vfio-container-base.h >+++ b/include/hw/vfio/vfio-container-base.h >@@ -96,6 +96,7 @@ typedef struct VFIOIOMMU VFIOIOMMU; > > #define TYPE_VFIO_IOMMU "vfio-iommu" > #define TYPE_VFIO_IOMMU_LEGACY TYPE_VFIO_IOMMU "-legacy" >+#define TYPE_VFIO_IOMMU_SPAPR TYPE_VFIO_IOMMU "-spapr" > > #define VFIO_IOMMU(obj) INTERFACE_CHECK(VFIOIOMMU, (obj), >TYPE_VFIO_IOMMU) > DECLARE_CLASS_CHECKERS(VFIOIOMMUClass, VFIO_IOMMU, >TYPE_VFIO_IOMMU) >diff --git a/hw/vfio/container.c b/hw/vfio/container.c >index >5f5ad8479f083db0be5207f179f3056ae67c49c3..ce5a731ba74600fbb331a8 >0f5148a88e2e43b068 100644 >--- a/hw/vfio/container.c >+++ b/hw/vfio/container.c >@@ -381,6 +381,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(); > }; >@@ -623,19 +627,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: >- 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); >- 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 >44617dfc6b5f1a2a3a1c37436b76042aebda8b63..46aa14bd2ae6d580c16bb >a75838cb6aca7d4047f 100644 >--- a/hw/vfio/spapr.c >+++ b/hw/vfio/spapr.c >@@ -458,20 +458,11 @@ static void >vfio_spapr_container_release(VFIOContainerBase *bcontainer) > } > } > >-static VFIOIOMMUOps vfio_iommu_spapr_ops; >- >-static void setup_spapr_ops(VFIOContainerBase *bcontainer) >-{ >- vfio_iommu_spapr_ops = *bcontainer->ops; >- vfio_iommu_spapr_ops.add_window = >vfio_spapr_container_add_section_window; >- vfio_iommu_spapr_ops.del_window = >vfio_spapr_container_del_section_window; >- vfio_iommu_spapr_ops.release = vfio_spapr_container_release; >- bcontainer->ops = &vfio_iommu_spapr_ops; >-} >- >-int vfio_spapr_container_init(VFIOContainer *container, Error **errp) >+static int vfio_spapr_container_setup(VFIOContainerBase *bcontainer, >+ Error **errp) > { >- VFIOContainerBase *bcontainer = &container->bcontainer; >+ VFIOContainer *container = container_of(bcontainer, VFIOContainer, >+ bcontainer); > VFIOSpaprContainer *scontainer = container_of(container, >VFIOSpaprContainer, > container); > struct vfio_iommu_spapr_tce_info info; >@@ -536,8 +527,6 @@ int vfio_spapr_container_init(VFIOContainer >*container, Error **errp) > 0x1000); > } > >- setup_spapr_ops(bcontainer); >- > return 0; > > listener_unregister_exit: >@@ -546,3 +535,24 @@ listener_unregister_exit: > } > return ret; > } >+ >+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, >+ .class_size = sizeof(VFIOIOMMUClass),
Inherit parent class_size is enough? Otherwise, Reviewed-by: Zhenzhong Duan <zhenzhong.d...@intel.com> Thanks Zhenzhong >+ }, >+}; >+ >+DEFINE_TYPES(types) >-- >2.43.0