On 12/12/2017 06:46, Alex Williamson wrote: >> +enum IOMMUMemoryRegionAttr { >> + IOMMU_ATTR_KVM_FD > > You're generalizing the wrong thing here, this is specifically a > SPAPR_TCE_FD, call it that.
... and you're not even implementing set_attr, so let's drop it. My suggestion is to add a function in hw/vfio: int vfio_container_attach_kvm_spapr_tce(VFIOContainer *cont, int tablefd); and an IOMMUMemoryRegionClass member: int (*set_vfio_container_attrs)(IOMMUMemoryRegion *iommu, VFIOContainer *cont) Then your implementation for the latter is as simple as this: if (!kvm_enabled() || !kvmppc_has_cap_spapr_vfio()) { sPAPRTCETable *tcet = container_of(iommu, sPAPRTCETable, iommu); return vfio_container_attach_kvm_spapr_tce(cont, tcet->fd); } Thanks, Paolo >> +}; >> + >> typedef struct IOMMUMemoryRegionClass { >> /* private */ >> struct DeviceClass parent_class; >> @@ -210,6 +214,12 @@ typedef struct IOMMUMemoryRegionClass { >> IOMMUNotifierFlag new_flags); >> /* Set this up to provide customized IOMMU replay function */ >> void (*replay)(IOMMUMemoryRegion *iommu, IOMMUNotifier *notifier); >> + >> + /* Get/set IOMMU misc attributes */ >> + int (*get_attr)(IOMMUMemoryRegion *iommu, enum IOMMUMemoryRegionAttr, >> + void *data); >> + int (*set_attr)(IOMMUMemoryRegion *iommu, enum IOMMUMemoryRegionAttr, >> + void *data);