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 - 3:
 Defines and implements new member functions to map a system physical address
 to device address. The patch implements Laszlo's suggestion [1].

Patch 4 - 7:
 Allocates the vring buffer using newly added member functions and provides
 some helper functions.

Patch 8:
 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

Patch 9:
 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 \

Patch 10 - 13:
 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=

Patch 14:
 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

 And succesfully ran RngTest.efi from SecurityPkg/Application

Repo: https://github.com/codomania/edk2
Branch: virtio-support

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>

Brijesh Singh (14):
  OvmfPkg/Virtio: Introduce new member functions in
    VIRTIO_DEVICE_PROTOCOL
  OvmfPkg/Virtio10Dxe: Implement new member functions
  OvmfPkg/VirtioPciDeviceDxe: Implement new member functions
  OvmfPkg/VirtioLib: Add SharedBuffer helper functions
  OvmfPkg/VirtioLib: Pass VirtIo instance in VringInit/Uinit()
  OvmfPkg/VirtioLib: Add functions to map/unmap VRING
  OvmfPkg/VirtioLib: Use AllocateShared() to allocate vring buffer
  OvmfPkg/VirtioBlkDxe: Use DeviceAddresses in vring descriptors
  OvmfPkg/VirtioScsiDxe: Use DeviceAddresses in vring descriptors
  OvmfPkg/VirtioNetDxe: Allocate Tx and Rx ring using
    AllocateSharedPage()
  OvmfPkg/VirtioNetDxe: Allocate RxBuf using AllocateSharedPages()
  OvmfPkg/VirtioNetDxe: Dynamically allocate transmit header
  OvmfPkg/VirtioNetDxe: Use DeviceAddress in transmit vring descriptors
  OvmfPkg/VirtioRngDxe: Use DeviceAddresses in vring descriptors

 OvmfPkg/Include/Library/VirtioLib.h             | 198 ++++++++++++-
 OvmfPkg/Include/Protocol/VirtioDevice.h         | 121 ++++++++
 OvmfPkg/VirtioBlkDxe/VirtioBlk.h                |   1 +
 OvmfPkg/VirtioNetDxe/VirtioNet.h                |  25 +-
 OvmfPkg/VirtioPciDeviceDxe/VirtioPciDevice.h    |  34 +++
 OvmfPkg/VirtioRngDxe/VirtioRng.h                |   1 +
 OvmfPkg/VirtioScsiDxe/VirtioScsi.h              |   1 +
 OvmfPkg/Library/VirtioLib/VirtioLib.c           | 296 +++++++++++++++++++-
 OvmfPkg/Virtio10Dxe/Virtio10.c                  | 114 +++++++-
 OvmfPkg/VirtioBlkDxe/VirtioBlk.c                | 104 ++++++-
 OvmfPkg/VirtioGpuDxe/Commands.c                 |   7 +-
 OvmfPkg/VirtioNetDxe/Events.c                   |  24 ++
 OvmfPkg/VirtioNetDxe/SnpGetStatus.c             |  19 +-
 OvmfPkg/VirtioNetDxe/SnpInitialize.c            | 102 +++++--
 OvmfPkg/VirtioNetDxe/SnpSharedHelpers.c         | 119 +++++++-
 OvmfPkg/VirtioNetDxe/SnpShutdown.c              |  16 +-
 OvmfPkg/VirtioNetDxe/SnpTransmit.c              |  22 +-
 OvmfPkg/VirtioPciDeviceDxe/VirtioPciDevice.c    |   7 +-
 OvmfPkg/VirtioPciDeviceDxe/VirtioPciFunctions.c |  66 +++++
 OvmfPkg/VirtioRngDxe/VirtioRng.c                |  54 +++-
 OvmfPkg/VirtioScsiDxe/VirtioScsi.c              | 121 +++++++-
 21 files changed, 1378 insertions(+), 74 deletions(-)

-- 
2.7.4

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to