[PATCH v6 00/31] hw/arm/virt: Introduce Tegra241 CMDQV support for accelerated SMMUv3

Shameer Kolothum posted 31 patches 6 days, 17 hours ago
Failed in applying to current master (apply log)
hw/arm/smmuv3-accel.h         |   48 ++
hw/arm/tegra241-cmdqv.h       |  384 +++++++++++
include/hw/arm/smmuv3.h       |    3 +
include/hw/arm/virt.h         |    1 +
include/system/iommufd.h      |   17 +-
include/system/memory.h       |   21 +
backends/iommufd.c            |   64 ++
hw/arm/smmuv3-accel-stubs.c   |   12 +
hw/arm/smmuv3-accel.c         |  194 ++++--
hw/arm/smmuv3.c               |   10 +
hw/arm/tegra241-cmdqv-stubs.c |   16 +
hw/arm/tegra241-cmdqv.c       | 1122 +++++++++++++++++++++++++++++++++
hw/arm/virt-acpi-build.c      |  127 ++--
hw/arm/virt.c                 |   37 ++
hw/vfio/iommufd.c             |    4 +-
hw/vfio/listener.c            |    6 +
system/memory.c               |   10 +
backends/trace-events         |    4 +-
hw/arm/Kconfig                |    5 +
hw/arm/meson.build            |    2 +
hw/arm/trace-events           |   11 +
hw/vfio/trace-events          |    1 +
qemu-options.hx               |    8 +
23 files changed, 2027 insertions(+), 80 deletions(-)
create mode 100644 hw/arm/tegra241-cmdqv.h
create mode 100644 hw/arm/tegra241-cmdqv-stubs.c
create mode 100644 hw/arm/tegra241-cmdqv.c
[PATCH v6 00/31] hw/arm/virt: Introduce Tegra241 CMDQV support for accelerated SMMUv3
Posted by Shameer Kolothum 6 days, 17 hours ago
Hi,

Changes from v5:
 https://lore.kernel.org/qemu-devel/20260519103727.899332-1-skolothumtho@nvidia.com/

 - Addressed v5 feedback and picked up Reviewed-by tags. Thanks!
 - Added documentation for design and lifecycle details. Please see patch #30.
 - Changed probe() and alloc_viommu() CMDQV ops both mandatory (patches #6, #8)
 - Fixed build on windows failure (patch #11)
 - Improved tracing with "Direct" vs "VI" info (patches #15, #16)
 - Removed vcmdq_enabled() check on BASE reprogramming (patch #16)
 - Dropped address_space_range_is_ram() check; record error on setup_vcmdq()
   failure (patch #18)
 - Dropped qemu_ram_backend_pagesize_min() and instead uses
   qemu_minrampagesize()- patch #25
 - Based on top of Nathan's "Resolve AUTO properties" v4 series [0].

Please find the complete branch here:
https://github.com/shamiali2008/qemu-master/tree/master-vcmdq-v6-ext

Sanity tested on NVIDIA Grace. Further testing in progress.

Feedback and testing are very welcome.

Thanks,
Shameer
[0] https://lore.kernel.org/qemu-devel/20260527221631.612026-1-nathanc@nvidia.com/

---
Background(from RFCv1):
https://lore.kernel.org/qemu-devel/20251210133737.78257-1-skolothumtho@nvidia.com/

Thanks to Nicolin for the initial patches and testing on which this
is based.

Tegra241 CMDQV extends SMMUv3 by allocating per-VM "virtual interfaces"
(VINTFs), each hosting up to 128 VCMDQs.

Each VINTF exposes two 64KB MMIO pages:
 - Page0 – guest owned control and status registers (directly mapped
           into the VM)
 - Page1 – queue configuration registers (trapped/emulated by QEMU)

Unlike the standard SMMU CMDQ, a guest owned Tegra241 VCMDQ does not
support the full command set. Only a subset, primarily invalidation
related commands, is accepted by the CMDQV hardware. For this reason,
a distinct CMDQV device must be exposed to the guest, and the guest OS
must include a Tegra241 CMDQV aware driver to take advantage of the
hardware acceleration.

VCMDQ support is integrated via the IOMMU_HW_QUEUE_ALLOC mechanism,
allowing QEMU to attach guest configured VCMDQ buffers to the
underlying CMDQV hardware through IOMMUFD. The Linux kernel already
supports the full CMDQV virtualisation model via IOMMUFD[0].
---

Nicolin Chen (15):
  backends/iommufd: Update iommufd_backend_get_device_info
  backends/iommufd: Update iommufd_backend_alloc_viommu to allow user
    ptr
  backends/iommufd: Introduce iommufd_backend_alloc_hw_queue
  backends/iommufd: Introduce iommufd_backend_viommu_mmap
  hw/arm/tegra241-cmdqv: Implement CMDQV init
  hw/arm/tegra241-cmdqv: Implement CMDQV vIOMMU alloc/free
  hw/arm/tegra241-cmdqv: Emulate CMDQ-V Config region
  hw/arm/tegra241-cmdqv: Emulate VCMDQ register reads
  hw/arm/tegra241-cmdqv: Emulate VCMDQ register writes
  hw/arm/tegra241-cmdqv: mmap VINTF Page0 for CMDQV
  hw/arm/tegra241-cmdqv: Allocate HW VCMDQs once configured
  hw/arm/tegra241-cmdqv: Map VINTF page0 into guest MMIO space
  hw/arm/tegra241-cmdqv: Add reset handler
  hw/arm/tegra241-cmdqv: Limit queue size based on backend page size
  hw/arm/virt-acpi: Advertise Tegra241 CMDQV nodes in DSDT

Shameer Kolothum (16):
  system/iommufd: Remove unused viommu pointer from IOMMUFDVeventq
  hw/arm/smmuv3-accel: Introduce CMDQV ops interface
  hw/arm/tegra241-cmdqv: Add Tegra241 CMDQV ops backend stub
  hw/arm/smmuv3-accel: Wire CMDQV ops into accel lifecycle
  hw/arm/virt: Use stored SMMUv3 device list for IORT build
  hw/arm/tegra241-cmdqv: Probe host Tegra241 CMDQV support
  hw/arm/virt: Link SMMUv3 CMDQV resources to platform bus
  hw/arm/tegra241-cmdqv: Use mmap'd VINTF page0 as VCMDQ backing
  memory: Allow RAM device regions to skip IOMMU mapping
  hw/arm/smmuv3-accel: Introduce common helper for veventq read
  hw/arm/tegra241-cmdqv: Read and propagate Tegra241 CMDQV errors
  hw/arm/smmuv3: Add per-device identifier property
  hw/arm/smmuv3-accel: Introduce helper to query CMDQV type
  hw/arm/smmuv3-accel: Enforce viommu association when CMDQV is active
  hw/arm/tegra241-cmdqv: Document the CMDQV design and lifecycle
  hw/arm/smmuv3: Add cmdqv property for SMMUv3 device

 hw/arm/smmuv3-accel.h         |   48 ++
 hw/arm/tegra241-cmdqv.h       |  384 +++++++++++
 include/hw/arm/smmuv3.h       |    3 +
 include/hw/arm/virt.h         |    1 +
 include/system/iommufd.h      |   17 +-
 include/system/memory.h       |   21 +
 backends/iommufd.c            |   64 ++
 hw/arm/smmuv3-accel-stubs.c   |   12 +
 hw/arm/smmuv3-accel.c         |  194 ++++--
 hw/arm/smmuv3.c               |   10 +
 hw/arm/tegra241-cmdqv-stubs.c |   16 +
 hw/arm/tegra241-cmdqv.c       | 1122 +++++++++++++++++++++++++++++++++
 hw/arm/virt-acpi-build.c      |  127 ++--
 hw/arm/virt.c                 |   37 ++
 hw/vfio/iommufd.c             |    4 +-
 hw/vfio/listener.c            |    6 +
 system/memory.c               |   10 +
 backends/trace-events         |    4 +-
 hw/arm/Kconfig                |    5 +
 hw/arm/meson.build            |    2 +
 hw/arm/trace-events           |   11 +
 hw/vfio/trace-events          |    1 +
 qemu-options.hx               |    8 +
 23 files changed, 2027 insertions(+), 80 deletions(-)
 create mode 100644 hw/arm/tegra241-cmdqv.h
 create mode 100644 hw/arm/tegra241-cmdqv-stubs.c
 create mode 100644 hw/arm/tegra241-cmdqv.c

-- 
2.43.0


Re: [PATCH v6 00/31] hw/arm/virt: Introduce Tegra241 CMDQV support for accelerated SMMUv3
Posted by Nicolin Chen 6 days, 8 hours ago
On Mon, Jun 01, 2026 at 12:41:50PM +0100, Shameer Kolothum wrote:
> Please find the complete branch here:
> https://github.com/shamiali2008/qemu-master/tree/master-vcmdq-v6-ext

Sanity on my side looks good:

Tested-by: Nicolin Chen <nicolinc@nvidia.com>