Message ID | 20250219082228.3303163-8-zhenzhong.duan@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | intel_iommu: Enable stage-1 translation for passthrough device | expand |
On 2/19/25 9:22 AM, Zhenzhong Duan wrote: > Implement query of HOST_IOMMU_DEVICE_CAP_[NESTING|FS1GP] for IOMMUFD > backed host IOMMU device. > > Query on these two capabilities is not supported for legacy backend > because there is no plan to support nesting with leacy backend backed > host device. > > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > --- > hw/i386/intel_iommu_internal.h | 1 + > backends/iommufd.c | 4 ++++ > hw/vfio/iommufd.c | 11 +++++++++++ > 3 files changed, 16 insertions(+) > > diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h > index e8b211e8b0..2cda744786 100644 > --- a/hw/i386/intel_iommu_internal.h > +++ b/hw/i386/intel_iommu_internal.h > @@ -191,6 +191,7 @@ > #define VTD_ECAP_PT (1ULL << 6) > #define VTD_ECAP_SC (1ULL << 7) > #define VTD_ECAP_MHMV (15ULL << 20) > +#define VTD_ECAP_NEST (1ULL << 26) > #define VTD_ECAP_SRS (1ULL << 31) > #define VTD_ECAP_PASID (1ULL << 40) > #define VTD_ECAP_SMTS (1ULL << 43) > diff --git a/backends/iommufd.c b/backends/iommufd.c > index 574f330c27..0a1a40cbba 100644 > --- a/backends/iommufd.c > +++ b/backends/iommufd.c > @@ -370,6 +370,10 @@ static int hiod_iommufd_get_cap(HostIOMMUDevice *hiod, int cap, Error **errp) > return caps->type; > case HOST_IOMMU_DEVICE_CAP_AW_BITS: > return vfio_device_get_aw_bits(hiod->agent); > + case HOST_IOMMU_DEVICE_CAP_NESTING: > + return caps->nesting; > + case HOST_IOMMU_DEVICE_CAP_FS1GP: > + return caps->fs1gp; this is vtd specific so those caps shouldn't be return for other iommus, no? Eric > default: > error_setg(errp, "%s: unsupported capability %x", hiod->name, cap); > return -EINVAL; > diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c > index 175c4fe1f4..df6a12d200 100644 > --- a/hw/vfio/iommufd.c > +++ b/hw/vfio/iommufd.c > @@ -26,6 +26,7 @@ > #include "qemu/chardev_open.h" > #include "pci.h" > #include "exec/ram_addr.h" > +#include "hw/i386/intel_iommu_internal.h" > > static int iommufd_cdev_map(const VFIOContainerBase *bcontainer, hwaddr iova, > ram_addr_t size, void *vaddr, bool readonly) > @@ -843,6 +844,16 @@ static bool hiod_iommufd_vfio_realize(HostIOMMUDevice *hiod, void *opaque, > caps->type = type; > caps->hw_caps = hw_caps; > > + switch (type) { > + case IOMMU_HW_INFO_TYPE_INTEL_VTD: > + caps->nesting = !!(data.vtd.ecap_reg & VTD_ECAP_NEST); > + caps->fs1gp = !!(data.vtd.cap_reg & VTD_CAP_FS1GP); > + break; > + case IOMMU_HW_INFO_TYPE_ARM_SMMUV3: > + case IOMMU_HW_INFO_TYPE_NONE: > + break; > + } > + > return true; > } >
diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h index e8b211e8b0..2cda744786 100644 --- a/hw/i386/intel_iommu_internal.h +++ b/hw/i386/intel_iommu_internal.h @@ -191,6 +191,7 @@ #define VTD_ECAP_PT (1ULL << 6) #define VTD_ECAP_SC (1ULL << 7) #define VTD_ECAP_MHMV (15ULL << 20) +#define VTD_ECAP_NEST (1ULL << 26) #define VTD_ECAP_SRS (1ULL << 31) #define VTD_ECAP_PASID (1ULL << 40) #define VTD_ECAP_SMTS (1ULL << 43) diff --git a/backends/iommufd.c b/backends/iommufd.c index 574f330c27..0a1a40cbba 100644 --- a/backends/iommufd.c +++ b/backends/iommufd.c @@ -370,6 +370,10 @@ static int hiod_iommufd_get_cap(HostIOMMUDevice *hiod, int cap, Error **errp) return caps->type; case HOST_IOMMU_DEVICE_CAP_AW_BITS: return vfio_device_get_aw_bits(hiod->agent); + case HOST_IOMMU_DEVICE_CAP_NESTING: + return caps->nesting; + case HOST_IOMMU_DEVICE_CAP_FS1GP: + return caps->fs1gp; default: error_setg(errp, "%s: unsupported capability %x", hiod->name, cap); return -EINVAL; diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c index 175c4fe1f4..df6a12d200 100644 --- a/hw/vfio/iommufd.c +++ b/hw/vfio/iommufd.c @@ -26,6 +26,7 @@ #include "qemu/chardev_open.h" #include "pci.h" #include "exec/ram_addr.h" +#include "hw/i386/intel_iommu_internal.h" static int iommufd_cdev_map(const VFIOContainerBase *bcontainer, hwaddr iova, ram_addr_t size, void *vaddr, bool readonly) @@ -843,6 +844,16 @@ static bool hiod_iommufd_vfio_realize(HostIOMMUDevice *hiod, void *opaque, caps->type = type; caps->hw_caps = hw_caps; + switch (type) { + case IOMMU_HW_INFO_TYPE_INTEL_VTD: + caps->nesting = !!(data.vtd.ecap_reg & VTD_ECAP_NEST); + caps->fs1gp = !!(data.vtd.cap_reg & VTD_CAP_FS1GP); + break; + case IOMMU_HW_INFO_TYPE_ARM_SMMUV3: + case IOMMU_HW_INFO_TYPE_NONE: + break; + } + return true; }
Implement query of HOST_IOMMU_DEVICE_CAP_[NESTING|FS1GP] for IOMMUFD backed host IOMMU device. Query on these two capabilities is not supported for legacy backend because there is no plan to support nesting with leacy backend backed host device. Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> --- hw/i386/intel_iommu_internal.h | 1 + backends/iommufd.c | 4 ++++ hw/vfio/iommufd.c | 11 +++++++++++ 3 files changed, 16 insertions(+)