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.d...@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;
> }
>