From: Andrew Jones <andrew.jones@oss.qualcomm.com>
To: linux-riscv@lists.infradead.org, iommu@lists.linux.dev
Cc: linux-kernel@vger.kernel.org, tomasz.jeznach@linux.dev,
tjeznach@rivosinc.com, jgg@ziepe.ca, jgg@nvidia.com,
joro@8bytes.org, will@kernel.org, robin.murphy@arm.com,
pjw@kernel.org, palmer@dabbelt.com, anup@brainfault.org,
tglx@kernel.org, kevin.tian@intel.com,
fangyu.yu@linux.alibaba.com
Subject: [PATCH v3 00/19] iommu/riscv: Enable MSI remapping, IOMMU_DMA and VFIO
Date: Fri, 7 Aug 2026 20:16:54 +0200 [thread overview]
Message-ID: <20260807181713.228535-1-andrew.jones@oss.qualcomm.com> (raw)
This series adds MSI remapping for IMSIC so a device's MSI target gets
translated the same way its DMA does, allowing RISC-V to enable IOMMU_DMA
and paging domains by default.
v1[1] used get_resv_regions() with IOMMU_RESV_DIRECT_RELAXABLE to identity
map IMSIC pages, but that was rejected as only a workaround, and the
proposal for v2 was to follow ARM's approach. ARM calls
iommu_dma_prepare_msi() once at IRQ-alloc time, caches the IOVA on the
msi_desc, and lets compose replay it via msi_msg_set_addr(). This series
follows that structure by introducing an IRQ domain and a new
iommu_dma_map_msi(). Like iommu_dma_prepare_msi(), it dispatches on the
same domain cookie types. Unlike iommu_dma_prepare_msi(), it returns the
IOVA to the caller instead of caching it on a descriptor. That allows the
caller to collect all IOVAs needed (since IMSIC needs one IOVA per host
IMSIC page). Like ARM, msi_msg_set_addr() is used at compose time to
direct MSIs to the appropriate IOVAs.
The divergence from ARM is required due to where the target address
actually lives. ARM's doorbell PA is fixed per ITS instance (affinity
changes only retarget hardware routing, never the composed address) so
one IOVA cached at alloc time stays valid for the descriptor's lifetime.
IMSIC doesn't have a fixed target, the MSI address itself changes on
irq_set_affinity(), and that runs in atomic context, so mapping a fresh
IOVA isn't an option. This series pre-maps every IMSIC page into a
domain-wide PA-to-IOVA table at first IRQ-alloc time, and compose does an
O(1) lookup to pick the right one.
With the DMA path in place, v3 also carries the remaining plumbing needed
for RISC-V PCIe device assignment through VFIO/KVM: the RISC-V IOMMU
reports DMA cache-coherency capability, VFIO type1 and KVM_VFIO are
enabled for RISC-V, defconfig enables IOMMUFD/VFIO as modules with cdev
support, and the generic VFIO/iommufd selftests can be built for RISC-V.
The interrupt-remapping domain does not yet validate MSI data, so VFIO
still requires allow_unsafe_interrupts=1. Direct MSI routing to guest
interrupt files (irqbypass) is not yet supported by this series.
irqbypass will be posted separately on top.
LLM-based coding assistants were used during development for code
exploration ("super grep" as one of my colleagues calls it), patch review,
test execution, and commit-message iteration, but all resulting code and
commit messages were selected, reviewed, and finalized by me. Per-patch
Assisted-by tags are omitted in light of the ongoing discussion about
simplifying coding-assistant attribution[2].
Thanks,
drew
[1] https://lore.kernel.org/all/20260508212339.381933-1-andrew.jones@oss.qualcomm.com/
[2] https://lore.kernel.org/all/20260701-work-coding-assistants-v1-1-a20a94d1d606@kernel.org/
v3:
- Addressed Sashiko's v2 comments[3]
- Added RISC-V VFIO/KVM enablement patches and VFIO selftest build support
- Capped SW MSI bitmap growth at 16K entries to simplify the growth arithmetic
- Tracked live MSI allocations so domain replacement can rebuild MSI IOVA
tables when no iommufd table can be copied
- Add a patch to guard against identity <-> paging domain changes with
in-flight MSIs
[3] https://sashiko.dev/#/patchset/20260724151218.965929-1-andrew.jones@oss.qualcomm.com
Andrew Jones (15):
iommufd: Convert struct iommufd_sw_msi_maps to a growable bitmap
iommufd: Add iommufd_sw_map_msi()
iommu/dma: Add iommu_dma_sw_map_msi()
iommu/dma: Add iommu_dma_map_msi()
genirq/msi: Provide DOMAIN_BUS_MSI_REMAP
irqchip/riscv-imsic: Compose MSI updates through the hierarchy
iommu/riscv: Add IRQ domain for interrupt remapping
iommu/riscv: Prepare info->domain for concurrent RCU read access
iommu/riscv: Publish IOMMU_RESV_SW_MSI region for iommufd MSI
remapping
iommu/riscv: Pre-map IMSIC MSI targets
iommu/riscv: Copy MSI IOVA table when replacing an iommufd domain
iommu/riscv: Gate identity boundary switches with live MSIs
iommu/riscv: Implement irq_compose_msi_msg for IMSIC remapping
riscv: defconfig: Enable IOMMUFD and VFIO
selftests/vfio: Allow building on RISC-V
Tomasz Jeznach (4):
iommu/dma: Enable IOMMU_DMA for 64-bit RISC-V
iommu/riscv: report iommu capabilities
vfio: enable IOMMU_TYPE1 for RISC-V
RISC-V: KVM: Enable KVM_VFIO interfaces on RISC-V arch
arch/riscv/configs/defconfig | 4 +
arch/riscv/kvm/Kconfig | 1 +
drivers/iommu/Kconfig | 2 +-
drivers/iommu/dma-iommu.c | 32 +-
drivers/iommu/dma-iommu.h | 12 +-
drivers/iommu/iommu-priv.h | 11 +-
drivers/iommu/iommu.c | 104 +++++-
drivers/iommu/iommufd/device.c | 3 +-
drivers/iommu/iommufd/driver.c | 79 +++--
drivers/iommu/iommufd/hw_pagetable.c | 1 +
drivers/iommu/iommufd/iommufd_private.h | 41 ++-
drivers/iommu/riscv/Kconfig | 1 +
drivers/iommu/riscv/Makefile | 2 +-
drivers/iommu/riscv/iommu-ir.c | 353 +++++++++++++++++++++
drivers/iommu/riscv/iommu.c | 100 ++++--
drivers/iommu/riscv/iommu.h | 41 +++
drivers/irqchip/irq-msi-lib.c | 8 +-
drivers/irqchip/irq-riscv-imsic-platform.c | 27 +-
drivers/vfio/Kconfig | 2 +-
include/linux/iommu.h | 31 ++
include/linux/irqchip/riscv-imsic.h | 7 +
include/linux/irqdomain_defs.h | 1 +
tools/testing/selftests/vfio/Makefile | 2 +-
23 files changed, 749 insertions(+), 116 deletions(-)
create mode 100644 drivers/iommu/riscv/iommu-ir.c
--
2.43.0
next reply other threads:[~2026-08-07 18:17 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-07 18:16 Andrew Jones [this message]
2026-08-07 18:16 ` [PATCH v3 01/19] iommufd: Convert struct iommufd_sw_msi_maps to a growable bitmap Andrew Jones
2026-08-07 18:16 ` [PATCH v3 02/19] iommufd: Add iommufd_sw_map_msi() Andrew Jones
2026-08-07 18:16 ` [PATCH v3 03/19] iommu/dma: Add iommu_dma_sw_map_msi() Andrew Jones
2026-08-07 18:16 ` [PATCH v3 04/19] iommu/dma: Add iommu_dma_map_msi() Andrew Jones
2026-08-07 18:16 ` [PATCH v3 05/19] genirq/msi: Provide DOMAIN_BUS_MSI_REMAP Andrew Jones
2026-08-07 18:17 ` [PATCH v3 06/19] irqchip/riscv-imsic: Compose MSI updates through the hierarchy Andrew Jones
2026-08-07 20:25 ` Thomas Gleixner
2026-08-10 8:01 ` Andrew Jones
2026-08-07 18:17 ` [PATCH v3 07/19] iommu/riscv: Add IRQ domain for interrupt remapping Andrew Jones
2026-08-07 20:32 ` Thomas Gleixner
2026-08-07 20:36 ` Thomas Gleixner
2026-08-10 8:11 ` Andrew Jones
2026-08-07 18:17 ` [PATCH v3 08/19] iommu/riscv: Prepare info->domain for concurrent RCU read access Andrew Jones
2026-08-07 18:17 ` [PATCH v3 09/19] iommu/riscv: Publish IOMMU_RESV_SW_MSI region for iommufd MSI remapping Andrew Jones
2026-08-07 18:17 ` [PATCH v3 10/19] iommu/riscv: Pre-map IMSIC MSI targets Andrew Jones
2026-08-07 18:17 ` [PATCH v3 11/19] iommu/riscv: Copy MSI IOVA table when replacing an iommufd domain Andrew Jones
2026-08-07 18:17 ` [PATCH v3 12/19] iommu/riscv: Gate identity boundary switches with live MSIs Andrew Jones
2026-08-07 18:17 ` [PATCH v3 13/19] iommu/riscv: Implement irq_compose_msi_msg for IMSIC remapping Andrew Jones
2026-08-07 18:17 ` [PATCH v3 14/19] iommu/dma: Enable IOMMU_DMA for 64-bit RISC-V Andrew Jones
2026-08-07 18:17 ` [PATCH v3 15/19] iommu/riscv: report iommu capabilities Andrew Jones
2026-08-07 18:17 ` [PATCH v3 16/19] vfio: enable IOMMU_TYPE1 for RISC-V Andrew Jones
2026-08-07 18:17 ` [PATCH v3 17/19] RISC-V: KVM: Enable KVM_VFIO interfaces on RISC-V arch Andrew Jones
2026-08-07 18:17 ` [PATCH v3 18/19] riscv: defconfig: Enable IOMMUFD and VFIO Andrew Jones
2026-08-07 18:17 ` [PATCH v3 19/19] selftests/vfio: Allow building on RISC-V Andrew Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260807181713.228535-1-andrew.jones@oss.qualcomm.com \
--to=andrew.jones@oss.qualcomm.com \
--cc=anup@brainfault.org \
--cc=fangyu.yu@linux.alibaba.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=jgg@ziepe.ca \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=palmer@dabbelt.com \
--cc=pjw@kernel.org \
--cc=robin.murphy@arm.com \
--cc=tglx@kernel.org \
--cc=tjeznach@rivosinc.com \
--cc=tomasz.jeznach@linux.dev \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®