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 [v1]: * Patch 2, use build_append_int_noprefix() to generate the ACPI table. * Patch 7, check that only one IOMMU is instantiated on x86. * Added patch 5 that rejects multiple instantations of virtio-iommu on Arm. It's not crucial to the series but it matches the check added to x86 and is very simple. * Added patch 8 documenting that interrupt remapping is not supported. There is an important caveat at the moment: when virtio-iommu is instantiated, device DMA faults until the guest configures the IOMMU. Firmware is therefore unable to access storage devices and load the bootloader and OS. Upcoming patches will align virtio-iommu with other vIOMMUs and let DMA bypass the IOMMU during boot. In the meantime there are several ways to circumvent the problem: * Use plain old virtio-blk as storage, without enabling the 'iommu_platform' property. DMA from the device bypasses the IOMMU. * Place the storage device behind a PCI bus that bypasses the IOMMU, using the new 'bypass_iommu' bridge property. See docs/bypass-iommu.txt * Use non-PCI storage devices, for example virtio-blk-device on the arm64 virt machine. 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 [v1] https://lore.kernel.org/qemu-devel/[email protected]/ Eric Auger (1): pc: Allow instantiating a virtio-iommu device Jean-Philippe Brucker (7): acpi: Add VIOT structure definitions 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 pc: Add VIOT table for virtio-iommu docs: Add '-device virtio-iommu' entry hw/acpi/Kconfig | 4 ++ hw/arm/Kconfig | 1 + hw/i386/Kconfig | 1 + hw/acpi/viot.h | 13 ++++ include/hw/acpi/acpi-defs.h | 60 +++++++++++++++++++ include/hw/i386/pc.h | 2 + hw/acpi/viot.c | 112 +++++++++++++++++++++++++++++++++++ hw/arm/virt-acpi-build.c | 7 +++ hw/arm/virt.c | 15 +++-- hw/i386/acpi-build.c | 5 ++ hw/i386/pc.c | 28 ++++++++- hw/virtio/virtio-iommu-pci.c | 7 --- hw/acpi/meson.build | 1 + qemu-options.hx | 3 + 14 files changed, 243 insertions(+), 16 deletions(-) create mode 100644 hw/acpi/viot.h create mode 100644 hw/acpi/viot.c -- 2.33.0
