On 2/26/26 11:50 AM, Shameer Kolothum wrote:
> Use IOMMU_GET_HW_INFO to check whether the host supports Tegra241 CMDQV.
>
> Validate the returned data type, version, number of vCMDQs and SIDs per
> VM. Fail the probe if the host does not meet the expected requirements.

Can you explain why it is important to checkĀ 

number of vCMDQs and SIDs per VM? 

>
> Signed-off-by: Shameer Kolothum <[email protected]>
> ---
>  hw/arm/tegra241-cmdqv.h |  5 +++++
>  hw/arm/tegra241-cmdqv.c | 32 ++++++++++++++++++++++++++++++--
>  2 files changed, 35 insertions(+), 2 deletions(-)
>
> diff --git a/hw/arm/tegra241-cmdqv.h b/hw/arm/tegra241-cmdqv.h
> index 07e10e86ee..312064a081 100644
> --- a/hw/arm/tegra241-cmdqv.h
> +++ b/hw/arm/tegra241-cmdqv.h
> @@ -10,6 +10,11 @@
>  #ifndef HW_ARM_TEGRA241_CMDQV_H
>  #define HW_ARM_TEGRA241_CMDQV_H
>  
> +#define TEGRA241_CMDQV_VERSION             1
> +#define TEGRA241_CMDQV_NUM_CMDQ_LOG2       1
> +#define TEGRA241_CMDQV_MAX_CMDQ            (1U << 
> TEGRA241_CMDQV_NUM_CMDQ_LOG2)
> +#define TEGRA241_CMDQV_NUM_SID_PER_VM_LOG2 4
> +
>  const SMMUv3AccelCmdqvOps *tegra241_cmdqv_get_ops(void);
>  
>  #endif /* HW_ARM_TEGRA241_CMDQV_H */
> diff --git a/hw/arm/tegra241-cmdqv.c b/hw/arm/tegra241-cmdqv.c
> index ad5a0d4611..a270fa7ce4 100644
> --- a/hw/arm/tegra241-cmdqv.c
> +++ b/hw/arm/tegra241-cmdqv.c
> @@ -38,8 +38,36 @@ static bool tegra241_cmdqv_init(SMMUv3State *s, Error 
> **errp)
>  static bool tegra241_cmdqv_probe(SMMUv3State *s, HostIOMMUDeviceIOMMUFD 
> *idev,
>                                   Error **errp)
>  {
> -    error_setg(errp, "NVIDIA Tegra241 CMDQV is unsupported");
> -    return false;
> +    uint32_t data_type = IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV;
> +    struct iommu_hw_info_tegra241_cmdqv cmdqv_info;
> +    uint64_t caps;
> +
> +    if (!iommufd_backend_get_device_info(idev->iommufd, idev->devid, 
> &data_type,
> +                                         &cmdqv_info, sizeof(cmdqv_info), 
> &caps,
> +                                         NULL, errp)) {
> +        return false;
> +    }
> +    if (data_type != IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV) {
> +        error_setg(errp, "Host CMDQV: unexpected data type %u (expected %u)",
> +                   data_type, IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV);
> +        return false;
> +    }
> +    if (cmdqv_info.version != TEGRA241_CMDQV_VERSION) {
> +        error_setg(errp, "Host CMDQV: unsupported version %u (expected %u)",
> +                   cmdqv_info.version, TEGRA241_CMDQV_VERSION);
> +        return false;
> +    }
> +    if (cmdqv_info.log2vcmdqs < TEGRA241_CMDQV_NUM_CMDQ_LOG2) {
> +        error_setg(errp, "Host CMDQV: insufficient vCMDQs log2=%u (need >= 
> %u)",
> +                   cmdqv_info.log2vcmdqs, TEGRA241_CMDQV_NUM_CMDQ_LOG2);
> +        return false;
> +    }
> +    if (cmdqv_info.log2vsids < TEGRA241_CMDQV_NUM_SID_PER_VM_LOG2) {
> +        error_setg(errp, "Host CMDQV: insufficient SIDs log2=%u (need >= 
> %u)",
> +                   cmdqv_info.log2vsids, TEGRA241_CMDQV_NUM_SID_PER_VM_LOG2);
> +        return false;
> +    }
> +    return true;
>  }
>  
>  static const SMMUv3AccelCmdqvOps tegra241_cmdqv_ops = {
Besides
Reviewed-by: Eric Auger <[email protected]>
Eric


Reply via email to