@samitouri / QOSamiQemu / commits / 61e7de8420

hw/arm/tegra241-cmdqv: Probe host Tegra241 CMDQV support

Use IOMMU_GET_HW_INFO to query host support for Tegra241 CMDQV. Validate the returned data type, version, and minimum number of vCMDQs and SIDs per Tegra241 CMDQ Virtual Interface(VI). Fail the probe if the host does not meet these requirements. The QEMU model supports one Virtual Interface(VI) per VM with 2 vCMDQs and 16 SIDs per VI, so the probe ensures the host implementation is compatible with these limits. Reviewed-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Nicolin Chen <nicolinc@nvidia.com> Tested-by: Nicolin Chen <nicolinc@nvidia.com> Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com> Tested-by: Eric Auger <eric.auger@redhat.com> Message-id: 20260609112552.378999-11-skolothumtho@nvidia.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Shameer Kolothum committed Jun 9, 2026 at 12:25 UTC 61e7de842085f313cab0be4f1b296f3dec52b5a2
2 files changed +34 -2
hw/arm/tegra241-cmdqv.c
+30 -2
@@ -38,8 +38,36 @@ static bool tegra241_cmdqv_init(SMMUv3State *s, Error **errp)
38 static bool tegra241_cmdqv_probe(SMMUv3State *s, HostIOMMUDeviceIOMMUFD *idev,
39 Error **errp)
40 {
41 - error_setg(errp, "NVIDIA Tegra241 CMDQV is unsupported");
42 - return false;
41 + uint32_t data_type = IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV;
42 + struct iommu_hw_info_tegra241_cmdqv cmdqv_info;
43 + uint64_t caps;
44 +
45 + if (!iommufd_backend_get_device_info(idev->iommufd, idev->devid, &data_type,
46 + &cmdqv_info, sizeof(cmdqv_info), &caps,
47 + NULL, errp)) {
48 + return false;
49 + }
50 + if (data_type != IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV) {
51 + error_setg(errp, "Host CMDQV: unexpected data type %u (expected %u)",
52 + data_type, IOMMU_HW_INFO_TYPE_TEGRA241_CMDQV);
53 + return false;
54 + }
55 + if (cmdqv_info.version != CMDQV_VER) {
56 + error_setg(errp, "Host CMDQV: unsupported version %u (expected %u)",
57 + cmdqv_info.version, CMDQV_VER);
58 + return false;
59 + }
60 + if (cmdqv_info.log2vcmdqs < CMDQV_NUM_CMDQ_LOG2) {
61 + error_setg(errp, "Host CMDQV: insufficient vCMDQs log2=%u (need >= %u)",
62 + cmdqv_info.log2vcmdqs, CMDQV_NUM_CMDQ_LOG2);
63 + return false;
64 + }
65 + if (cmdqv_info.log2vsids < CMDQV_NUM_SID_PER_VI_LOG2) {
66 + error_setg(errp, "Host CMDQV: insufficient SIDs log2=%u (need >= %u)",
67 + cmdqv_info.log2vsids, CMDQV_NUM_SID_PER_VI_LOG2);
68 + return false;
69 + }
70 + return true;
71 }
72
73 static const SMMUv3AccelCmdqvOps tegra241_cmdqv_ops = {
hw/arm/tegra241-cmdqv.h
+4
@@ -10,6 +10,10 @@
10 #ifndef HW_ARM_TEGRA241_CMDQV_H
11 #define HW_ARM_TEGRA241_CMDQV_H
12
13 +#define CMDQV_VER 1
14 +#define CMDQV_NUM_CMDQ_LOG2 1
15 +#define CMDQV_NUM_SID_PER_VI_LOG2 4
16 +
17 const SMMUv3AccelCmdqvOps *tegra241_cmdqv_get_ops(void);
18
19 #endif /* HW_ARM_TEGRA241_CMDQV_H */