Currently, virtio drivers provides the system physical address to the device. However, some systems may feature an IOMMU that requires the drivers to pass the device addresses to the device - which are then translated by the IOMMU into physical addresses in memory. The patch series introduces new member functions in VIRTIO_DEVICE_PROTOCOL which can be used for mapping a system physical address to device address.
The approach that this patch series takes is to maps the system physical address to device address for buffers (including rings, device specifc request and response pointed by vring descriptor, and any further memory reference by those request and response). Patch 1 - 5: miscellaneous fixes Patch 6 - 9: Defines and implements new member functions to map a system physical address to device address. The patch implements Laszlo's suggestion [1]. [1] 841bec5f-6f6e-8b1f-25ba-0fd37a915b72@redhat.com">http://mid.mail-archive.com/841bec5f-6f6e-8b1f-25ba-0fd37a915b72@redhat.com Patch 10 - 16: Add some helper functions and allocate the vring using newly added member functions. Patch 17: Update the virtio-rng driver to use newly added member functions to map the addresses. Verified using the following qemu cli # $QEMU \ -device virtio-rng-pci # $QEMU \ -device virtio-rng-pci,disable-legacy=on # $QEMU \ -device virtio-rng-pci,disable-legacy=on,iommu_platform=true And succesfully ran RngTest.efi from SecurityPkg/Application Patch 18: Update the virtio-blk driver to use newly added member functions to map the addresses. Verified using the following qemu cli # $QEMU \ -drive file=${IMAGE},if=none,id=disk0 \ -device virtio-blk-pci,drive=disk0 # $QEMU \ -drive file=${IMAGE},if=none,id=disk0 \ -device virtio-blk-pci,drive=disk0,disable-legacy=on # $QEMU \ -drive file=${IMAGE},if=none,id=disk0 \ -device virtio-blk-pci,drive=disk0,disable-legacy=on,iommu_platform=true Patch 19: Update the virtio-scsi driver to use newly added member functions to map the addresses. Verified using the following qemu cli # $QEMU \ -drive file=${IMAGE},if=none,id=disk0 \ -device scsi-hd,drive=disk0 \ -device virtio-scsi-pci,id=scsi # $QEMU \ -drive file=${IMAGE},if=none,id=disk0 \ -device scsi-hd,drive=disk0 \ -device virtio-scsi-pci,id=scsi,disable-legacy=on # $QEMU \ -drive file=${IMAGE},if=none,id=disk0 \ -device scsi-hd,drive=disk0 \ -device virtio-scsi-pci,id=scsi,disable-legacy=on,iommu_platform=true Patch 20 - 22: Update the virtio-net driver to use newly added member functions to map the addresses. Verified using the following qemu cli # $QEMU \ -netdev type=tap,id=net0 \ -device virtio-net-pci,netdev=net0,romfile= # $QEMU \ -netdev type=tap,id=net0 \ -device virtio-net-pci,netdev=net0,disable-legacy=on,romfile= # $QEMU \ -netdev type=tap,id=net0 \ -device virtio-net-pci,netdev=net0,disable-legacy=on,iommu_platform=true,romfile= Patch 23: Add support for VIRTIO_F_IOMMU_FEATURE bit Repo: https://github.com/codomania/edk2 Branch: virtio-support-v2 Cc: Ard Biesheuvel <ard.biesheu...@linaro.org> Cc: Jordan Justen <jordan.l.jus...@intel.com> Cc: Tom Lendacky <thomas.lenda...@amd.com> Cc: Laszlo Ersek <ler...@redhat.com> TODO: * Update VirtioGpuDxe * Runtime test on aarch64 Changes since v1: * changes to address v2 feedbacks * add VIRTIO_F_IOMMU_PLATFORM feature bit Brijesh Singh (23): OvmfPkg/VirtioPciDeviceDxe: supply missing BUS_MASTER attribute OvmfPkg/Virtio10Dxe: supply missing BUS_MASTER attribute OvmfPkg/VirtioPciDeviceDxe: add missing IN and OUT decoration OvmfPkg/VirtioMmioDeviceLib: add missing IN and OUT decoration OvmfPkg/Virtio: fix comment style OvmfPkg/Virtio: introduce IOMMU-like member functions to VIRTIO_DEVICE_PROTOCOL OvmfPkg/Virtio10Dxe: implement IOMMU-like member functions OvmfPkg/VirtioPciDeviceDxe: implement IOMMU-like member functions OvmfPkg/VirtioMmioDeviceLib: implement IOMMU-like member functions OvmfPkg/VirtioLib: add VirtioMapAllBytesInSharedBuffer() helper function OvmfPkg/VirtioLib: take VirtIo instance in VirtioRingInit/VirtioRingUninit OvmfPkg/VirtioLib: add functions to map/unmap VRING OvmfPkg/Virtio: take RingBaseShift in VirtioSetQueueAddress() OvmfPkg/Virtio10Dxe: add the RingBaseShift offset OvmfPkg/VirtioLib: alloc vring buffer with AllocateSharedPages() OvmfPkg/VirtioRngDxe: map host address to device address OvmfPkg/VirtioBlkDxe: map host address to device address OvmfPkg/VirtioScsiDxe: Use DeviceAddresses in vring descriptors OvmfPkg/VirtioNetDxe: alloc Tx and Rx rings using AllocateSharedPage() OvmfPkg/VirtioNetDxe: alloc RxBuf using AllocateSharedPages() OvmfPkg/VirtioNetDxe: dynamically alloc transmit header OvmfPkg/VirtioNetDxe: map transmit buffer host address to device address OvmfPkg/Virtio: define VIRITO_F_IOMMU_PLATFORM feature bit OvmfPkg/Include/IndustryStandard/Virtio10.h | 5 + OvmfPkg/Include/Library/VirtioLib.h | 83 +++++++++- OvmfPkg/Include/Protocol/VirtioDevice.h | 170 ++++++++++++++++++-- OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h | 65 ++++++-- OvmfPkg/VirtioBlkDxe/VirtioBlk.h | 1 + OvmfPkg/VirtioNetDxe/VirtioNet.h | 25 ++- OvmfPkg/VirtioPciDeviceDxe/VirtioPciDevice.h | 61 +++++-- OvmfPkg/VirtioRngDxe/VirtioRng.h | 1 + OvmfPkg/VirtioScsiDxe/VirtioScsi.h | 1 + OvmfPkg/Library/VirtioLib/VirtioLib.c | 150 ++++++++++++++++- OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c | 92 +++++++++-- OvmfPkg/Virtio10Dxe/Virtio10.c | 127 ++++++++++++++- OvmfPkg/VirtioBlkDxe/VirtioBlk.c | 131 +++++++++++++-- OvmfPkg/VirtioGpuDxe/Commands.c | 10 +- OvmfPkg/VirtioNetDxe/Events.c | 19 +++ OvmfPkg/VirtioNetDxe/SnpGetStatus.c | 19 ++- OvmfPkg/VirtioNetDxe/SnpInitialize.c | 168 +++++++++++++++---- OvmfPkg/VirtioNetDxe/SnpSharedHelpers.c | 127 ++++++++++++++- OvmfPkg/VirtioNetDxe/SnpShutdown.c | 5 +- OvmfPkg/VirtioNetDxe/SnpTransmit.c | 26 ++- OvmfPkg/VirtioPciDeviceDxe/VirtioPciDevice.c | 11 +- OvmfPkg/VirtioPciDeviceDxe/VirtioPciFunctions.c | 87 ++++++++-- OvmfPkg/VirtioRngDxe/VirtioRng.c | 74 +++++++-- OvmfPkg/VirtioScsiDxe/VirtioScsi.c | 160 +++++++++++++++--- 24 files changed, 1437 insertions(+), 181 deletions(-) -- 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel