qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 19/37] vfio/spapr: Introduce spapr backend and target inte


From: Cédric Le Goater
Subject: Re: [PATCH v3 19/37] vfio/spapr: Introduce spapr backend and target interface
Date: Fri, 27 Oct 2023 18:04:34 +0200
User-agent: Mozilla Thunderbird

On 10/26/23 12:30, Zhenzhong Duan wrote:
Introduce an empry spapr backend which will hold spapr specific
content, currently only prereg_listener and hostwin_list.

Also introduce and instantiate a spapr specific target interface,
currently only has add/del_window callbacks.

Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
---
  include/hw/vfio/vfio-common.h         | 8 ++++++++
  include/hw/vfio/vfio-container-base.h | 2 ++
  hw/vfio/spapr.c                       | 8 ++++++++
  3 files changed, 18 insertions(+)

diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
index 938f75e70c..a74e60e677 100644
--- a/include/hw/vfio/vfio-common.h
+++ b/include/hw/vfio/vfio-common.h
@@ -169,6 +169,14 @@ VFIOAddressSpace *vfio_get_address_space(AddressSpace *as);
  void vfio_put_address_space(VFIOAddressSpace *space);
/* SPAPR specific */
+typedef struct VFIOIOMMUSpaprOps {
+    int (*add_window)(VFIOContainerBase *bcontainer,
+                      MemoryRegionSection *section,
+                      Error **errp);
+    void (*del_window)(VFIOContainerBase *bcontainer,
+                       MemoryRegionSection *section);
+} VFIOIOMMUSpaprOps;

I don't think we need a new structure type.

If possible, these callbacks should be under VFIOIOMMUOps and only
defined in the VFIOIOMMUOps struct for spapr. This struct would a
copy of vfio_legacy_ops plus the two add/del_window  handlers.

Thanks,

C.


+
  int vfio_container_add_section_window(VFIOContainer *container,
                                        MemoryRegionSection *section,
                                        Error **errp);
diff --git a/include/hw/vfio/vfio-container-base.h 
b/include/hw/vfio/vfio-container-base.h
index 2ffafb0d58..1e1854d24f 100644
--- a/include/hw/vfio/vfio-container-base.h
+++ b/include/hw/vfio/vfio-container-base.h
@@ -31,6 +31,7 @@
typedef struct VFIODevice VFIODevice;
  typedef struct VFIOIOMMUOps VFIOIOMMUOps;
+typedef struct VFIOIOMMUSpaprOps VFIOIOMMUSpaprOps;
typedef struct {
      unsigned long *bitmap;
@@ -49,6 +50,7 @@ typedef struct VFIOAddressSpace {
   */
  typedef struct VFIOContainerBase {
      const VFIOIOMMUOps *ops;
+    const VFIOIOMMUSpaprOps *spapr_ops;
      VFIOAddressSpace *space;
      MemoryListener listener;
      Error *error;
diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c
index 5786377317..3739004151 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)) {
@@ -384,6 +388,8 @@ void vfio_container_del_section_window(VFIOContainer 
*container,
      }
  }
+const VFIOIOMMUSpaprOps vfio_iommu_spapr_ops;
+
  bool vfio_spapr_container_init(VFIOContainer *container, Error **errp)
  {
      VFIOContainerBase *bcontainer = &container->bcontainer;
@@ -447,6 +453,8 @@ bool vfio_spapr_container_init(VFIOContainer *container, 
Error **errp)
                            0x1000);
      }
+ bcontainer->spapr_ops = &vfio_iommu_spapr_ops;
+
  listener_unregister_exit:
      if (v2) {
          memory_listener_unregister(&container->prereg_listener);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]