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