xref: /qemu/docs/specs/riscv-iommu.rst (revision 0f15892acaf3f50ecc20c6dad4b3ebdd701aa93e)
177cfbf5dSDaniel Henrique Barboza.. _riscv-iommu:
277cfbf5dSDaniel Henrique Barboza
377cfbf5dSDaniel Henrique BarbozaRISC-V IOMMU support for RISC-V machines
477cfbf5dSDaniel Henrique Barboza========================================
577cfbf5dSDaniel Henrique Barboza
677cfbf5dSDaniel Henrique BarbozaQEMU implements a RISC-V IOMMU emulation based on the RISC-V IOMMU spec
7*e768f024Shemanshu.khilari.fossversion 1.0 `iommu1.0.0`_.
877cfbf5dSDaniel Henrique Barboza
91c187ad5SDaniel Henrique BarbozaThe emulation includes a PCI reference device (riscv-iommu-pci) and a platform
101c187ad5SDaniel Henrique Barbozabus device (riscv-iommu-sys) that QEMU RISC-V boards can use.  The 'virt'
111c187ad5SDaniel Henrique BarbozaRISC-V machine is compatible with both devices.
1277cfbf5dSDaniel Henrique Barboza
1377cfbf5dSDaniel Henrique Barbozariscv-iommu-pci reference device
1477cfbf5dSDaniel Henrique Barboza--------------------------------
1577cfbf5dSDaniel Henrique Barboza
1677cfbf5dSDaniel Henrique BarbozaThis device implements the RISC-V IOMMU emulation as recommended by the section
17*e768f024Shemanshu.khilari.foss"Integrating an IOMMU as a PCIe device" of `iommu1.0.0`_: a PCI device with base
1877cfbf5dSDaniel Henrique Barbozaclass 08h, sub-class 06h and programming interface 00h.
1977cfbf5dSDaniel Henrique Barboza
2077cfbf5dSDaniel Henrique BarbozaAs a reference device it doesn't implement anything outside of the specification,
2177cfbf5dSDaniel Henrique Barbozaso it uses a generic default PCI ID given by QEMU: 1b36:0014.
2277cfbf5dSDaniel Henrique Barboza
2377cfbf5dSDaniel Henrique BarbozaTo include the device in the 'virt' machine:
2477cfbf5dSDaniel Henrique Barboza
2577cfbf5dSDaniel Henrique Barboza.. code-block:: bash
2677cfbf5dSDaniel Henrique Barboza
2777cfbf5dSDaniel Henrique Barboza  $ qemu-system-riscv64 -M virt -device riscv-iommu-pci,[optional_pci_opts] (...)
2877cfbf5dSDaniel Henrique Barboza
2977cfbf5dSDaniel Henrique BarbozaThis will add a RISC-V IOMMU PCI device in the board following any additional
3077cfbf5dSDaniel Henrique BarbozaPCI parameters (like PCI bus address).  The behavior of the RISC-V IOMMU is
3177cfbf5dSDaniel Henrique Barbozadefined by the spec but its operation is OS dependent.
3277cfbf5dSDaniel Henrique Barboza
3377cfbf5dSDaniel Henrique BarbozaAs of this writing the existing Linux kernel support `linux-v8`_, not yet merged,
3477cfbf5dSDaniel Henrique Barbozadoes not have support for features like VFIO passthrough.  The IOMMU emulation
3577cfbf5dSDaniel Henrique Barbozawas tested using a public Ventana Micro Systems kernel repository in
3677cfbf5dSDaniel Henrique Barboza`ventana-linux`_.  This kernel is based on `linux-v8`_ with additional patches that
3777cfbf5dSDaniel Henrique Barbozaenable features like KVM VFIO passthrough with irqbypass.  Until the kernel support
3877cfbf5dSDaniel Henrique Barbozais feature complete feel free to use the kernel available in the Ventana Micro Systems
3977cfbf5dSDaniel Henrique Barbozamirror.
4077cfbf5dSDaniel Henrique Barboza
4177cfbf5dSDaniel Henrique BarbozaThe current Linux kernel support will use the IOMMU device to create IOMMU groups
4277cfbf5dSDaniel Henrique Barbozawith any eligible cards available in the system, regardless of factors such as the
4377cfbf5dSDaniel Henrique Barbozaorder in which the devices are added in the command line.
4477cfbf5dSDaniel Henrique Barboza
4577cfbf5dSDaniel Henrique BarbozaThis means that these command lines are equivalent as far as the current
4677cfbf5dSDaniel Henrique BarbozaIOMMU kernel driver behaves:
4777cfbf5dSDaniel Henrique Barboza
4877cfbf5dSDaniel Henrique Barboza.. code-block:: bash
4977cfbf5dSDaniel Henrique Barboza
5077cfbf5dSDaniel Henrique Barboza  $ qemu-system-riscv64 \
5177cfbf5dSDaniel Henrique Barboza        -M virt,aia=aplic-imsic,aia-guests=5 \
5277cfbf5dSDaniel Henrique Barboza        -device riscv-iommu-pci,addr=1.0,vendor-id=0x1efd,device-id=0xedf1 \
5377cfbf5dSDaniel Henrique Barboza        -device e1000e,netdev=net1 -netdev user,id=net1,net=192.168.0.0/24 \
5477cfbf5dSDaniel Henrique Barboza        -device e1000e,netdev=net2 -netdev user,id=net2,net=192.168.200.0/24 \
5577cfbf5dSDaniel Henrique Barboza        (...)
5677cfbf5dSDaniel Henrique Barboza
5777cfbf5dSDaniel Henrique Barboza  $ qemu-system-riscv64 \
5877cfbf5dSDaniel Henrique Barboza        -M virt,aia=aplic-imsic,aia-guests=5 \
5977cfbf5dSDaniel Henrique Barboza        -device e1000e,netdev=net1 -netdev user,id=net1,net=192.168.0.0/24 \
6077cfbf5dSDaniel Henrique Barboza        -device e1000e,netdev=net2 -netdev user,id=net2,net=192.168.200.0/24 \
6177cfbf5dSDaniel Henrique Barboza        -device riscv-iommu-pci,addr=1.0,vendor-id=0x1efd,device-id=0xedf1 \
6277cfbf5dSDaniel Henrique Barboza        (...)
6377cfbf5dSDaniel Henrique Barboza
6477cfbf5dSDaniel Henrique BarbozaBoth will create iommu groups for the two e1000e cards.
6577cfbf5dSDaniel Henrique Barboza
6677cfbf5dSDaniel Henrique BarbozaAnother thing to notice on `linux-v8`_ and `ventana-linux`_ is that the kernel driver
6777cfbf5dSDaniel Henrique Barbozaconsiders an IOMMU identified as a Rivos device, i.e. it uses Rivos vendor ID.  To
6877cfbf5dSDaniel Henrique Barbozause the riscv-iommu-pci device with the existing kernel support we need to emulate
6977cfbf5dSDaniel Henrique Barbozaa Rivos PCI IOMMU by setting 'vendor-id' and 'device-id':
7077cfbf5dSDaniel Henrique Barboza
7177cfbf5dSDaniel Henrique Barboza.. code-block:: bash
7277cfbf5dSDaniel Henrique Barboza
7377cfbf5dSDaniel Henrique Barboza  $ qemu-system-riscv64 -M virt	\
7477cfbf5dSDaniel Henrique Barboza     -device riscv-iommu-pci,vendor-id=0x1efd,device-id=0xedf1 (...)
7577cfbf5dSDaniel Henrique Barboza
7677cfbf5dSDaniel Henrique BarbozaSeveral options are available to control the capabilities of the device, namely:
7777cfbf5dSDaniel Henrique Barboza
7877cfbf5dSDaniel Henrique Barboza- "bus": the bus that the IOMMU device uses
7977cfbf5dSDaniel Henrique Barboza- "ioatc-limit": size of the Address Translation Cache (default to 2Mb)
8077cfbf5dSDaniel Henrique Barboza- "intremap": enable/disable MSI support
8177cfbf5dSDaniel Henrique Barboza- "ats": enable ATS support
8277cfbf5dSDaniel Henrique Barboza- "off" (Out-of-reset translation mode: 'on' for DMA disabled, 'off' for 'BARE' (passthrough))
8377cfbf5dSDaniel Henrique Barboza- "s-stage": enable s-stage support
8477cfbf5dSDaniel Henrique Barboza- "g-stage": enable g-stage support
85beeb56a4SDaniel Henrique Barboza- "hpm-counters": number of hardware performance counters available. Maximum value is 31.
86beeb56a4SDaniel Henrique Barboza  Default value is 31. Use 0 (zero) to disable HPM support
8777cfbf5dSDaniel Henrique Barboza
881c187ad5SDaniel Henrique Barbozariscv-iommu-sys device
891c187ad5SDaniel Henrique Barboza----------------------
901c187ad5SDaniel Henrique Barboza
911c187ad5SDaniel Henrique BarbozaThis device implements the RISC-V IOMMU emulation as a platform bus device that
921c187ad5SDaniel Henrique BarbozaRISC-V boards can use.
931c187ad5SDaniel Henrique Barboza
941c187ad5SDaniel Henrique BarbozaFor the 'virt' board the device is disabled by default.  To enable it use the
951c187ad5SDaniel Henrique Barboza'iommu-sys' machine option:
961c187ad5SDaniel Henrique Barboza
971c187ad5SDaniel Henrique Barboza.. code-block:: bash
981c187ad5SDaniel Henrique Barboza
991c187ad5SDaniel Henrique Barboza  $ qemu-system-riscv64 -M virt,iommu-sys=on (...)
1001c187ad5SDaniel Henrique Barboza
1011c187ad5SDaniel Henrique BarbozaThere is no options to configure the capabilities of this device in the 'virt'
1021c187ad5SDaniel Henrique Barbozaboard using the QEMU command line.  The device is configured with the following
1031c187ad5SDaniel Henrique Barbozariscv-iommu options:
1041c187ad5SDaniel Henrique Barboza
1051c187ad5SDaniel Henrique Barboza- "ioatc-limit": default value (2Mb)
1061c187ad5SDaniel Henrique Barboza- "intremap": enabled
1071c187ad5SDaniel Henrique Barboza- "ats": enabled
1081c187ad5SDaniel Henrique Barboza- "off": on (DMA disabled)
1091c187ad5SDaniel Henrique Barboza- "s-stage": enabled
1101c187ad5SDaniel Henrique Barboza- "g-stage": enabled
1111c187ad5SDaniel Henrique Barboza
112*e768f024Shemanshu.khilari.foss.. _iommu1.0.0: https://github.com/riscv-non-isa/riscv-iommu/releases/download/v1.0.0/riscv-iommu.pdf
11377cfbf5dSDaniel Henrique Barboza
11477cfbf5dSDaniel Henrique Barboza.. _linux-v8: https://lore.kernel.org/linux-riscv/cover.1718388908.git.tjeznach@rivosinc.com/
11577cfbf5dSDaniel Henrique Barboza
11677cfbf5dSDaniel Henrique Barboza.. _ventana-linux: https://github.com/ventanamicro/linux/tree/dev-upstream
117