[edk2] [PATCH v2 00/21] OvmfPkg/Virtio: introduce IOMMU-like member functions

Brijesh Singh posted 21 patches 6 years, 8 months ago
Failed in applying to current master (apply log)
There is a newer version of this series
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(-)
[edk2] [PATCH v2 00/21] OvmfPkg/Virtio: introduce IOMMU-like member functions
Posted by Brijesh Singh 6 years, 8 months ago
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] 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.biesheuvel@linaro.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Laszlo Ersek <lersek@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