.../bindings/iommu/riscv,iommu.yaml | 147 ++ MAINTAINERS | 9 + drivers/iommu/Kconfig | 1 + drivers/iommu/Makefile | 2 +- drivers/iommu/riscv/Kconfig | 20 + drivers/iommu/riscv/Makefile | 3 + drivers/iommu/riscv/iommu-bits.h | 784 ++++++++ drivers/iommu/riscv/iommu-pci.c | 120 ++ drivers/iommu/riscv/iommu-platform.c | 92 + drivers/iommu/riscv/iommu.c | 1661 +++++++++++++++++ drivers/iommu/riscv/iommu.h | 88 + 11 files changed, 2926 insertions(+), 1 deletion(-) create mode 100644 Documentation/devicetree/bindings/iommu/riscv,iommu.yaml create mode 100644 drivers/iommu/riscv/Kconfig create mode 100644 drivers/iommu/riscv/Makefile create mode 100644 drivers/iommu/riscv/iommu-bits.h create mode 100644 drivers/iommu/riscv/iommu-pci.c create mode 100644 drivers/iommu/riscv/iommu-platform.c create mode 100644 drivers/iommu/riscv/iommu.c create mode 100644 drivers/iommu/riscv/iommu.h
This patch series introduces support for RISC-V IOMMU architected
hardware into the Linux kernel.
The RISC-V IOMMU specification, which this series is based on, is
ratified and available at GitHub/riscv-non-isa [1].
At a high level, the RISC-V IOMMU specification defines:
1) Data structures:
- Device-context: Associates devices with address spaces and holds
per-device parameters for address translations.
- Process-contexts: Associates different virtual address spaces based
on device-provided process identification numbers.
- MSI page table configuration used to direct an MSI to a guest
interrupt file in an IMSIC.
2) In-memory queue interface:
- Command-queue for issuing commands to the IOMMU.
- Fault/event queue for reporting faults and events.
- Page-request queue for reporting "Page Request" messages received
from PCIe devices.
- Message-signaled and wire-signaled interrupt mechanisms.
3) Memory-mapped programming interface:
- Mandatory and optional register layout and description.
- Software guidelines for device initialization and capabilities discovery.
This series introduces RISC-V IOMMU hardware initialization and complete
single-stage translation with paging domain support.
The patches are organized as follows:
Patch 1: Introduces minimal required device tree bindings for the driver.
Patch 2: Defines RISC-V IOMMU data structures, hardware programming interface
registers layout, and minimal initialization code for enabling global
pass-through for all connected masters.
Patch 3: Implements the device driver for PCIe implementation of RISC-V IOMMU
architected hardware.
Patch 4: Introduces IOMMU interfaces to the kernel subsystem.
Patch 5: Implements device directory management with discovery sequences for
I/O mapped or in-memory device directory table location, hardware
capabilities discovery, and device to domain attach implementation.
Patch 6: Implements command and fault queue, and introduces directory cache
invalidation sequences.
Patch 7: Implements paging domain, using highest page-table mode advertised
by the hardware. This series enables only 4K mappings; complete support
for large page mappings will be introduced in follow-up patch series.
Follow-up patch series providing MSI interrupt remapping, complete ATS/PRI/SVA
and VFIO/IOMMUFD support are available at the GitHub [2], and has been tested
with published QEMU RISC-V IOMMU device model [3].
Changes from v9:
- rebase on v6.12-rc3
- #6 Memory ordering fix and updated commentary, based on Will’s suggestions.
- #7 Remove riscv_iommu_device_domain_type() and use head-less kfree_rcu in
riscv_iommu_release_device(), based on Jason's suggestions.
Best regards,
Tomasz Jeznach
[1] link: https://github.com/riscv-non-isa/riscv-iommu
[2] link: https://github.com/tjeznach/linux/riscv_iommu.next
[3] link: https://lore.kernel.org/qemu-devel/20241004155721.2154626-1-dbarboza@ventanamicro.com/
v9 link: https://lore.kernel.org/linux-iommu/cover.1728579958.git.tjeznach@rivosinc.com/
v8 link: https://lore.kernel.org/linux-iommu/cover.1718388908.git.tjeznach@rivosinc.com/
v7 link: https://lore.kernel.org/linux-iommu/cover.1717612298.git.tjeznach@rivosinc.com/
v6 link: https://lore.kernel.org/linux-iommu/cover.1716578450.git.tjeznach@rivosinc.com/
v5 link: https://lore.kernel.org/linux-iommu/cover.1715708679.git.tjeznach@rivosinc.com/
v4 link: https://lore.kernel.org/linux-iommu/cover.1714752293.git.tjeznach@rivosinc.com/
v3 link: https://lore.kernel.org/linux-iommu/cover.1714494653.git.tjeznach@rivosinc.com/
v2 link: https://lore.kernel.org/linux-iommu/cover.1713456597.git.tjeznach@rivosinc.com/
v1 link: https://lore.kernel.org/linux-iommu/cover.1689792825.git.tjeznach@rivosinc.com/
Tomasz Jeznach (7):
dt-bindings: iommu: riscv: Add bindings for RISC-V IOMMU
iommu/riscv: Add RISC-V IOMMU platform device driver
iommu/riscv: Add RISC-V IOMMU PCIe device driver
iommu/riscv: Enable IOMMU registration and device probe.
iommu/riscv: Device directory management.
iommu/riscv: Command and fault queue support
iommu/riscv: Paging domain support
.../bindings/iommu/riscv,iommu.yaml | 147 ++
MAINTAINERS | 9 +
drivers/iommu/Kconfig | 1 +
drivers/iommu/Makefile | 2 +-
drivers/iommu/riscv/Kconfig | 20 +
drivers/iommu/riscv/Makefile | 3 +
drivers/iommu/riscv/iommu-bits.h | 784 ++++++++
drivers/iommu/riscv/iommu-pci.c | 120 ++
drivers/iommu/riscv/iommu-platform.c | 92 +
drivers/iommu/riscv/iommu.c | 1661 +++++++++++++++++
drivers/iommu/riscv/iommu.h | 88 +
11 files changed, 2926 insertions(+), 1 deletion(-)
create mode 100644 Documentation/devicetree/bindings/iommu/riscv,iommu.yaml
create mode 100644 drivers/iommu/riscv/Kconfig
create mode 100644 drivers/iommu/riscv/Makefile
create mode 100644 drivers/iommu/riscv/iommu-bits.h
create mode 100644 drivers/iommu/riscv/iommu-pci.c
create mode 100644 drivers/iommu/riscv/iommu-platform.c
create mode 100644 drivers/iommu/riscv/iommu.c
create mode 100644 drivers/iommu/riscv/iommu.h
base-commit: 8e929cb546ee42c9a61d24fae60605e9e3192354
--
2.34.1
Hi Tomasz, On 10/16/24 14:52, Tomasz Jeznach wrote: > This patch series introduces support for RISC-V IOMMU architected > hardware into the Linux kernel. > > [...] > > Follow-up patch series providing MSI interrupt remapping, complete ATS/PRI/SVA > and VFIO/IOMMUFD support are available at the GitHub [2], and has been tested > with published QEMU RISC-V IOMMU device model [3]. I'm currently looking into building drivers for some "accelerator" style devices, and I'm trying to figure out the current situation of drivers for the more advanced IOMMU features, specifically the ATS/PRI/SVA combo. I see that the GitHub branch has been rebased in May to 6.15, but seemingly hasn't been touched since. Is this still the latest version of these patches? Aside from other IOMMU subsystem-wide changes since v6.15, is there any other code/information that I should take into account? This isn't super urgent or anything, but I'm pretty new to this, and given that a year has passed since this series has been merged, I'm not sure if there's some other development I've missed. Thanks for your help. Vivian "dramforever" Wang
On Tue, Oct 15, 2024 at 11:52:12PM -0700, Tomasz Jeznach wrote: > Tomasz Jeznach (7): > dt-bindings: iommu: riscv: Add bindings for RISC-V IOMMU > iommu/riscv: Add RISC-V IOMMU platform device driver > iommu/riscv: Add RISC-V IOMMU PCIe device driver > iommu/riscv: Enable IOMMU registration and device probe. > iommu/riscv: Device directory management. > iommu/riscv: Command and fault queue support > iommu/riscv: Paging domain support Applied, thanks.
On Tue, Oct 15, 2024 at 11:52:12PM -0700, Tomasz Jeznach wrote: > This patch series introduces support for RISC-V IOMMU architected > hardware into the Linux kernel. > > The RISC-V IOMMU specification, which this series is based on, is > ratified and available at GitHub/riscv-non-isa [1]. > > At a high level, the RISC-V IOMMU specification defines: > > 1) Data structures: > - Device-context: Associates devices with address spaces and holds > per-device parameters for address translations. > - Process-contexts: Associates different virtual address spaces based > on device-provided process identification numbers. > - MSI page table configuration used to direct an MSI to a guest > interrupt file in an IMSIC. > 2) In-memory queue interface: > - Command-queue for issuing commands to the IOMMU. > - Fault/event queue for reporting faults and events. > - Page-request queue for reporting "Page Request" messages received > from PCIe devices. > - Message-signaled and wire-signaled interrupt mechanisms. > 3) Memory-mapped programming interface: > - Mandatory and optional register layout and description. > - Software guidelines for device initialization and capabilities discovery. > > > This series introduces RISC-V IOMMU hardware initialization and complete > single-stage translation with paging domain support. > > The patches are organized as follows: > > Patch 1: Introduces minimal required device tree bindings for the driver. > Patch 2: Defines RISC-V IOMMU data structures, hardware programming interface > registers layout, and minimal initialization code for enabling global > pass-through for all connected masters. > Patch 3: Implements the device driver for PCIe implementation of RISC-V IOMMU > architected hardware. > Patch 4: Introduces IOMMU interfaces to the kernel subsystem. > Patch 5: Implements device directory management with discovery sequences for > I/O mapped or in-memory device directory table location, hardware > capabilities discovery, and device to domain attach implementation. > Patch 6: Implements command and fault queue, and introduces directory cache > invalidation sequences. > Patch 7: Implements paging domain, using highest page-table mode advertised > by the hardware. This series enables only 4K mappings; complete support > for large page mappings will be introduced in follow-up patch series. > > Follow-up patch series providing MSI interrupt remapping, complete ATS/PRI/SVA > and VFIO/IOMMUFD support are available at the GitHub [2], and has been tested > with published QEMU RISC-V IOMMU device model [3]. > > Changes from v9: > - rebase on v6.12-rc3 > - #6 Memory ordering fix and updated commentary, based on Will’s suggestions. > - #7 Remove riscv_iommu_device_domain_type() and use head-less kfree_rcu in > riscv_iommu_release_device(), based on Jason's suggestions. Thanks, looks ok to me now. Will
On Tue, 15 Oct 2024 23:52:12 PDT (-0700), tjeznach@rivosinc.com wrote: > This patch series introduces support for RISC-V IOMMU architected > hardware into the Linux kernel. > > The RISC-V IOMMU specification, which this series is based on, is > ratified and available at GitHub/riscv-non-isa [1]. > > At a high level, the RISC-V IOMMU specification defines: > > 1) Data structures: > - Device-context: Associates devices with address spaces and holds > per-device parameters for address translations. > - Process-contexts: Associates different virtual address spaces based > on device-provided process identification numbers. > - MSI page table configuration used to direct an MSI to a guest > interrupt file in an IMSIC. > 2) In-memory queue interface: > - Command-queue for issuing commands to the IOMMU. > - Fault/event queue for reporting faults and events. > - Page-request queue for reporting "Page Request" messages received > from PCIe devices. > - Message-signaled and wire-signaled interrupt mechanisms. > 3) Memory-mapped programming interface: > - Mandatory and optional register layout and description. > - Software guidelines for device initialization and capabilities discovery. > > > This series introduces RISC-V IOMMU hardware initialization and complete > single-stage translation with paging domain support. > > The patches are organized as follows: > > Patch 1: Introduces minimal required device tree bindings for the driver. > Patch 2: Defines RISC-V IOMMU data structures, hardware programming interface > registers layout, and minimal initialization code for enabling global > pass-through for all connected masters. > Patch 3: Implements the device driver for PCIe implementation of RISC-V IOMMU > architected hardware. > Patch 4: Introduces IOMMU interfaces to the kernel subsystem. > Patch 5: Implements device directory management with discovery sequences for > I/O mapped or in-memory device directory table location, hardware > capabilities discovery, and device to domain attach implementation. > Patch 6: Implements command and fault queue, and introduces directory cache > invalidation sequences. > Patch 7: Implements paging domain, using highest page-table mode advertised > by the hardware. This series enables only 4K mappings; complete support > for large page mappings will be introduced in follow-up patch series. > > Follow-up patch series providing MSI interrupt remapping, complete ATS/PRI/SVA > and VFIO/IOMMUFD support are available at the GitHub [2], and has been tested > with published QEMU RISC-V IOMMU device model [3]. > > Changes from v9: > - rebase on v6.12-rc3 > - #6 Memory ordering fix and updated commentary, based on Will’s suggestions. > - #7 Remove riscv_iommu_device_domain_type() and use head-less kfree_rcu in > riscv_iommu_release_device(), based on Jason's suggestions. > > Best regards, > Tomasz Jeznach > > [1] link: https://github.com/riscv-non-isa/riscv-iommu > [2] link: https://github.com/tjeznach/linux/riscv_iommu.next > [3] link: https://lore.kernel.org/qemu-devel/20241004155721.2154626-1-dbarboza@ventanamicro.com/ > v9 link: https://lore.kernel.org/linux-iommu/cover.1728579958.git.tjeznach@rivosinc.com/ > v8 link: https://lore.kernel.org/linux-iommu/cover.1718388908.git.tjeznach@rivosinc.com/ > v7 link: https://lore.kernel.org/linux-iommu/cover.1717612298.git.tjeznach@rivosinc.com/ > v6 link: https://lore.kernel.org/linux-iommu/cover.1716578450.git.tjeznach@rivosinc.com/ > v5 link: https://lore.kernel.org/linux-iommu/cover.1715708679.git.tjeznach@rivosinc.com/ > v4 link: https://lore.kernel.org/linux-iommu/cover.1714752293.git.tjeznach@rivosinc.com/ > v3 link: https://lore.kernel.org/linux-iommu/cover.1714494653.git.tjeznach@rivosinc.com/ > v2 link: https://lore.kernel.org/linux-iommu/cover.1713456597.git.tjeznach@rivosinc.com/ > v1 link: https://lore.kernel.org/linux-iommu/cover.1689792825.git.tjeznach@rivosinc.com/ > > Tomasz Jeznach (7): > dt-bindings: iommu: riscv: Add bindings for RISC-V IOMMU > iommu/riscv: Add RISC-V IOMMU platform device driver > iommu/riscv: Add RISC-V IOMMU PCIe device driver > iommu/riscv: Enable IOMMU registration and device probe. > iommu/riscv: Device directory management. > iommu/riscv: Command and fault queue support > iommu/riscv: Paging domain support > > .../bindings/iommu/riscv,iommu.yaml | 147 ++ > MAINTAINERS | 9 + > drivers/iommu/Kconfig | 1 + > drivers/iommu/Makefile | 2 +- > drivers/iommu/riscv/Kconfig | 20 + > drivers/iommu/riscv/Makefile | 3 + > drivers/iommu/riscv/iommu-bits.h | 784 ++++++++ > drivers/iommu/riscv/iommu-pci.c | 120 ++ > drivers/iommu/riscv/iommu-platform.c | 92 + > drivers/iommu/riscv/iommu.c | 1661 +++++++++++++++++ > drivers/iommu/riscv/iommu.h | 88 + > 11 files changed, 2926 insertions(+), 1 deletion(-) > create mode 100644 Documentation/devicetree/bindings/iommu/riscv,iommu.yaml > create mode 100644 drivers/iommu/riscv/Kconfig > create mode 100644 drivers/iommu/riscv/Makefile > create mode 100644 drivers/iommu/riscv/iommu-bits.h > create mode 100644 drivers/iommu/riscv/iommu-pci.c > create mode 100644 drivers/iommu/riscv/iommu-platform.c > create mode 100644 drivers/iommu/riscv/iommu.c > create mode 100644 drivers/iommu/riscv/iommu.h > > > base-commit: 8e929cb546ee42c9a61d24fae60605e9e3192354 Acked-by: Palmer Dabbelt <palmer@rivosinc.com> if anyone was waiting on me. IIUC the plan here was to aim this at the IOMMU tree, but I'm happy to look closer and take it through the RISC-V tree if people want. Just LMK, for now I'm going to do nothing ;)
© 2016 - 2026 Red Hat, Inc.