From: Laszlo Ersek Date: Thu, 18 Aug 2016 11:52:26 +0000 (+0200) Subject: OvmfPkg/Virtio10Dxe: don't bind virtio-vga X-Git-Tag: edk2-stable201903~5911 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=76569ca855916d528fa7abd034e880e114d6d5cd 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 Cc: Jordan Justen Ref: https://tianocore.acgmultimedia.com/show_bug.cgi?id=66 Fixes: 9399f68ae359234b142c293ad1bef75f470ced30 Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Reviewed-by: Jordan Justen --- 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: