]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Virtio10Dxe/Virtio10.c
OvmfPkg/Virtio10Dxe: don't bind virtio-vga
[mirror_edk2.git] / OvmfPkg / Virtio10Dxe / Virtio10.c
index 06f0699077535f8e8f7351d2827d2604697a5fbf..a8a6a58c3f1da75b58bb98d1be6beb4b81623853 100644 (file)
@@ -822,6 +822,7 @@ Virtio10BindingSupported (
     goto CloseProtocol;\r
   }\r
 \r
+  Status = EFI_UNSUPPORTED;\r
   //\r
   // Recognize non-transitional modern devices. Also, we'll have to parse the\r
   // PCI capability list, so make sure the CapabilityPtr field will be valid.\r
@@ -832,9 +833,20 @@ Virtio10BindingSupported (
       Pci.Hdr.RevisionID >= 0x01 &&\r
       Pci.Device.SubsystemID >= 0x40 &&\r
       (Pci.Hdr.Status & EFI_PCI_STATUS_CAPABILITY) != 0) {\r
-    Status = EFI_SUCCESS;\r
-  } else {\r
-    Status = EFI_UNSUPPORTED;\r
+    //\r
+    // The virtio-vga device is special. It can be driven both as a VGA device\r
+    // with a linear framebuffer, and through its underlying, modern,\r
+    // virtio-gpu-pci device, which has no linear framebuffer itself. For\r
+    // compatibility with guest OSes that insist on inheriting a linear\r
+    // framebuffer from the firmware, we should leave virtio-vga to\r
+    // QemuVideoDxe, and support only virtio-gpu-pci here.\r
+    //\r
+    // Both virtio-vga and virtio-gpu-pci have DeviceId 0x1050, but only the\r
+    // former has device class PCI_CLASS_DISPLAY_VGA.\r
+    //\r
+    if (Pci.Hdr.DeviceId != 0x1050 || !IS_PCI_VGA (&Pci)) {\r
+      Status = EFI_SUCCESS;\r
+    }\r
   }\r
 \r
 CloseProtocol:\r