summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/Virtio10Dxe/Virtio10.c
diff options
context:
space:
mode:
authorLaszlo Ersek <lersek@redhat.com>2016-08-18 13:52:26 +0200
committerLaszlo Ersek <lersek@redhat.com>2016-09-01 22:54:47 +0200
commit76569ca855916d528fa7abd034e880e114d6d5cd (patch)
tree489383f0a21cc2e5078b658c0aacb0256baad28c /OvmfPkg/Virtio10Dxe/Virtio10.c
parent442c2ab81e87766f49a0f5656f39512bf1908028 (diff)
downloadedk2-76569ca855916d528fa7abd034e880e114d6d5cd.tar.gz
edk2-76569ca855916d528fa7abd034e880e114d6d5cd.tar.bz2
edk2-76569ca855916d528fa7abd034e880e114d6d5cd.zip
OvmfPkg/Virtio10Dxe: don't bind virtio-vga
Commit 9399f68ae359 ("OvmfPkg: Virtio10Dxe: non-transitional driver for virtio-1.0 PCI devices") created a "competition" between Virtio10Dxe and QemuVideoDxe for virtio-vga devices. The binding order between these drivers is unspecified, and the wrong order effectively breaks commit 94210dc95e9f ("OvmfPkg: QemuVideoDxe: add virtio-vga support"). Thus, never bind virtio-vga in Virtio10Dxe; QemuVideoDxe provides better compatibility for guest OSes that insist on inheriting a linear framebuffer. Users who prefer the VirtIo GPU interface at boot time should specify virtio-gpu-pci, which is exactly virtio-vga, minus the VGA compatibility (such as the framebuffer). Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Jordan Justen <jordan.l.justen@intel.com> Ref: https://tianocore.acgmultimedia.com/show_bug.cgi?id=66 Fixes: 9399f68ae359234b142c293ad1bef75f470ced30 Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Diffstat (limited to 'OvmfPkg/Virtio10Dxe/Virtio10.c')
-rw-r--r--OvmfPkg/Virtio10Dxe/Virtio10.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/OvmfPkg/Virtio10Dxe/Virtio10.c b/OvmfPkg/Virtio10Dxe/Virtio10.c
index 06f0699077..a8a6a58c3f 100644
--- a/OvmfPkg/Virtio10Dxe/Virtio10.c
+++ b/OvmfPkg/Virtio10Dxe/Virtio10.c
@@ -822,6 +822,7 @@ Virtio10BindingSupported (
goto CloseProtocol;
}
+ Status = EFI_UNSUPPORTED;
//
// Recognize non-transitional modern devices. Also, we'll have to parse the
// PCI capability list, so make sure the CapabilityPtr field will be valid.
@@ -832,9 +833,20 @@ Virtio10BindingSupported (
Pci.Hdr.RevisionID >= 0x01 &&
Pci.Device.SubsystemID >= 0x40 &&
(Pci.Hdr.Status & EFI_PCI_STATUS_CAPABILITY) != 0) {
- Status = EFI_SUCCESS;
- } else {
- Status = EFI_UNSUPPORTED;
+ //
+ // The virtio-vga device is special. It can be driven both as a VGA device
+ // with a linear framebuffer, and through its underlying, modern,
+ // virtio-gpu-pci device, which has no linear framebuffer itself. For
+ // compatibility with guest OSes that insist on inheriting a linear
+ // framebuffer from the firmware, we should leave virtio-vga to
+ // QemuVideoDxe, and support only virtio-gpu-pci here.
+ //
+ // Both virtio-vga and virtio-gpu-pci have DeviceId 0x1050, but only the
+ // former has device class PCI_CLASS_DISPLAY_VGA.
+ //
+ if (Pci.Hdr.DeviceId != 0x1050 || !IS_PCI_VGA (&Pci)) {
+ Status = EFI_SUCCESS;
+ }
}
CloseProtocol: