This series implements the QEMU virtio-iommu device. This matches the v0.12 spec (voted) and the corresponding virtio-iommu driver upstreamed in 5.3. All kernel dependencies are resolved for DT integration. The virtio-iommu can be instantiated in ARM virt using "-device virtio-iommu-pci".
Non DT mode is not yet supported as it has non resolved kernel dependencies [1]. This feature targets 5.0. Integration with vhost devices and vfio devices is not part of this series. Please follow Bharat's respins [2]. Best Regards Eric This series can be found at: https://github.com/eauger/qemu/tree/v4.2-virtio-iommu-v13 References: [1] [RFC 00/13] virtio-iommu on non-devicetree platforms [2] [PATCH RFC v5 0/5] virtio-iommu: VFIO integration Testing: - tested with guest using virtio-net-pci (,vhost=off,iommu_platform,disable-modern=off,disable-legacy=on) and virtio-blk-pci - migration History: v12 -> v13: - Take into account Peter's comments - fix qtest error and accomodate for directory changes in test - remove "[PATCH v12 01/13] migration: Support QLIST migration" which is now upstream - fix iommu_find_iommu_pcibus() - squash commits as requested by Peter - remove spurious guest log v11 -> v12: - took into account Peter and Jean's comments - use guest features - restore as_by_bus_num and when attaching devices, check they are actually protected by the IOMMU. Updated the tests accordingly. - fix the mapping ref counting and make sure mappings are properly cleaned. - Use CamelCase for data types - simplify postload callback as suggested by Peter - add R-bs - fix mingw compilation issue - add IOMMU migration priority - qlist migration load simplified following Juan's suggestion v10 -> v11: - introduce virtio_iommu_handle_req macro - migration support - introduce DEFINE_PROP_INTERVAL and pass reserved regions through an array of those - domain gtree simplification v9 -> v10: - rebase on 4.1.0-rc2, compliance with 0.12 spec - removed ACPI part - cleanup (see individual change logs) - moved to a PATCH series v8 -> v9: - virtio-iommu-pci device needs to be instantiated from the command line (RID is not imposed anymore). - tail structure properly initialized v7 -> v8: - virtio-iommu-pci added - virt instantiation modified - DT and ACPI modified to exclude the iommu RID from the mapping - VIRTIO_IOMMU_F_BYPASS, VIRTIO_F_VERSION_1 features exposed v6 -> v7: - rebase on qemu 3.0.0-rc3 - minor update against v0.7 - fix issue with EP not on pci.0 and ACPI probing - change the instantiation method v5 -> v6: - minor update against v0.6 spec - fix g_hash_table_lookup in virtio_iommu_find_add_as - replace some error_reports by qemu_log_mask(LOG_GUEST_ERROR, ...) v4 -> v5: - event queue and fault reporting - we now return the IOAPIC MSI region if the virtio-iommu is instantiated in a PC machine. - we bypass transactions on MSI HW region and fault on reserved ones. - We support ACPI boot with mach-virt (based on IORT proposal) - We moved to the new driver naming conventions - simplified mach-virt instantiation - worked around the disappearing of pci_find_primary_bus - in virtio_iommu_translate, check the dev->as is not NULL - initialize as->device_list in virtio_iommu_get_as - initialize bufstate.error to false in virtio_iommu_probe v3 -> v4: - probe request support although no reserved region is returned at the moment - unmap semantics less strict, as specified in v0.4 - device registration, attach/detach revisited - split into smaller patches to ease review - propose a way to inform the IOMMU mr about the page_size_mask of underlying HW IOMMU, if any - remove warning associated with the translation of the MSI doorbell v2 -> v3: - rebase on top of 2.10-rc0 and especially [PATCH qemu v9 0/2] memory/iommu: QOM'fy IOMMU MemoryRegion - add mutex init - fix as->mappings deletion using g_tree_ref/unref - when a dev is attached whereas it is already attached to another address space, first detach it - fix some error values - page_sizes = TARGET_PAGE_MASK; - I haven't changed the unmap() semantics yet, waiting for the next virtio-iommu spec revision. v1 -> v2: - fix redefinition of viommu_as typedef Eric Auger (10): virtio-iommu: Add skeleton virtio-iommu: Decode the command payload virtio-iommu: Implement attach/detach command virtio-iommu: Implement map/unmap virtio-iommu: Implement translate virtio-iommu: Implement fault reporting virtio-iommu-pci: Add virtio iommu pci support hw/arm/virt: Add the virtio-iommu device tree mappings virtio-iommu: Support migration tests: Add virtio-iommu test hw/arm/virt.c | 54 +- hw/virtio/Kconfig | 5 + hw/virtio/Makefile.objs | 2 + hw/virtio/trace-events | 20 + hw/virtio/virtio-iommu-pci.c | 88 +++ hw/virtio/virtio-iommu.c | 897 ++++++++++++++++++++++++++++++ include/hw/arm/virt.h | 2 + include/hw/pci/pci.h | 1 + include/hw/virtio/virtio-iommu.h | 61 ++ qdev-monitor.c | 1 + tests/qtest/Makefile.include | 2 + tests/qtest/libqos/virtio-iommu.c | 177 ++++++ tests/qtest/libqos/virtio-iommu.h | 45 ++ tests/qtest/virtio-iommu-test.c | 306 ++++++++++ 14 files changed, 1653 insertions(+), 8 deletions(-) create mode 100644 hw/virtio/virtio-iommu-pci.c create mode 100644 hw/virtio/virtio-iommu.c create mode 100644 include/hw/virtio/virtio-iommu.h create mode 100644 tests/qtest/libqos/virtio-iommu.c create mode 100644 tests/qtest/libqos/virtio-iommu.h create mode 100644 tests/qtest/virtio-iommu-test.c -- 2.20.1