Allow instantiating a virtio-iommu device on ACPI systems by adding a Virtual I/O Translation table (VIOT). Enable x86 support for VIOT.
Changes since v3 [1]: * Cleaned the IOMMU-uniqueness checks. Added patch 6 to have a single check on x86. * Added patch 5 that allows to gracefully propagate errors when setting resv_mem properties. * Squashed table blobs into patch 11. * Addressed all other comments from v3. Caveats: * Series depends on "acpi: refactor error prone build_header() and packed structures usage in ACPI tables" [2] * Since virtio-iommu doesn't support boot-bypass at the moment, firmware can't access storage behind the IOMMU to load bootloader or kernel. This will be solved by another series currently in flight [3]. In the meantime you can use a storage device that bypasses the IOMMU such as virtio-blk-pci (without iommu_platform property) or a bypass bridge (docs/iommu-bypass.txt). You can find a description of the VIOT table, which will be included in next ACPI version, here: https://jpbrucker.net/virtio-iommu/viot/viot-v9.pdf [1] https://lore.kernel.org/qemu-devel/20210914142004.2433568-1-jean-phili...@linaro.org/ [2] https://lore.kernel.org/qemu-devel/20210924122802.1455362-1-imamm...@redhat.com/ [3] https://lore.kernel.org/qemu-devel/20210930185050.262759-1-jean-phili...@linaro.org/ Jean-Philippe Brucker (11): hw/acpi: Add VIOT table hw/arm/virt-acpi-build: Add VIOT table for virtio-iommu hw/arm/virt: Remove device tree restriction for virtio-iommu hw/arm/virt: Reject instantiation of multiple IOMMUs hw/arm/virt: Use object_property_set instead of qdev_prop_set hw/i386: Move vIOMMU uniqueness check into pc.c pc: Allow instantiating a virtio-iommu device tests/acpi: allow updates of VIOT expected data files tests/acpi: add test cases for VIOT tests/acpi: add expected blob for VIOT test on virt machine tests/acpi: add expected blobs for VIOT test on q35 machine hw/acpi/viot.h | 13 ++++ include/hw/i386/pc.h | 2 + hw/acpi/viot.c | 112 +++++++++++++++++++++++++++++++++ hw/arm/virt-acpi-build.c | 7 +++ hw/arm/virt.c | 20 +++--- hw/i386/acpi-build.c | 5 ++ hw/i386/pc.c | 30 ++++++++- hw/i386/x86-iommu.c | 6 -- hw/virtio/virtio-iommu-pci.c | 7 --- tests/qtest/bios-tables-test.c | 38 +++++++++++ hw/acpi/Kconfig | 4 ++ hw/acpi/meson.build | 1 + hw/arm/Kconfig | 1 + hw/i386/Kconfig | 1 + tests/data/acpi/q35/DSDT.viot | Bin 0 -> 9398 bytes tests/data/acpi/q35/VIOT.viot | Bin 0 -> 112 bytes tests/data/acpi/virt/VIOT | Bin 0 -> 88 bytes 17 files changed, 223 insertions(+), 24 deletions(-) create mode 100644 hw/acpi/viot.h create mode 100644 hw/acpi/viot.c create mode 100644 tests/data/acpi/q35/DSDT.viot create mode 100644 tests/data/acpi/q35/VIOT.viot create mode 100644 tests/data/acpi/virt/VIOT -- 2.33.0