OvmfPkg: Virtio10Dxe: non-transitional driver for virtio-1.0 PCI devices
authorLaszlo Ersek <lersek@redhat.com>
Fri, 11 Mar 2016 23:11:55 +0000 (00:11 +0100)
committerLaszlo Ersek <lersek@redhat.com>
Wed, 6 Apr 2016 17:21:51 +0000 (19:21 +0200)
commit9399f68ae359234b142c293ad1bef75f470ced30
tree9a497f15908042e1f01df281b542ae9e9c26de43
parentc6e2d064ab5c34b87c25fa801eadb9f76c15c3ca
OvmfPkg: Virtio10Dxe: non-transitional driver for virtio-1.0 PCI devices

This driver implements the VIRTIO_DEVICE_PROTOCOL for non-transitional PCI
devices, based on the virtio-1.0 specification (csprd05). Non-transitional
means that it only binds QEMU's virtio-xxx-pci devices that receive the
",disable-legacy=on,disable-modern=off" properties on the QEMU command
line. These devices have distinct PCI Device IDs from those that are bound
by VirtioPciDeviceDxe.

The central abstraction of this driver is the VIRTIO_1_0_CONFIG type. It
is practically a "fat pointer" to a register block. The pointed-to
register block
- may or may not exist (the latter being mostly useful for virtio-1.0
  devices that have no device-specific registers),
- lives in one of the device's BARs,
- lives in an IO or MMIO BAR,
- lives at an offset relative to the BAR start,
- has its size also maintained.

Such VIRTIO_1_0_CONFIG "fat pointers" (i.e., the locations of the register
blocks) are parsed from vendor capabilities that reside in the device's
standard PCI capabilities list (in PCI config space).

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Acked-by: Jordan Justen <jordan.l.justen@intel.com>
OvmfPkg/Virtio10Dxe/Virtio10.c [new file with mode: 0644]
OvmfPkg/Virtio10Dxe/Virtio10.h [new file with mode: 0644]
OvmfPkg/Virtio10Dxe/Virtio10.inf [new file with mode: 0644]