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);



Reply via email to