]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/Driver.c
NetworkPkg: Move Network library header file from MdeModulePkg to NetworkPkg
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Driver.c
index c44b8b2603008634be3c0f49699cccbaed8c4339..e8a613ef336a164b63cba7f40cfa93048f15a4d4 100644 (file)
@@ -2,15 +2,9 @@
   This driver is a sample implementation of the Graphics Output Protocol for\r
   the QEMU (Cirrus Logic 5446) video controller.\r
 \r
-  Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution. The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -28,30 +22,53 @@ EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriverBinding = {
 \r
 QEMU_VIDEO_CARD gQemuVideoCardList[] = {\r
     {\r
+        PCI_CLASS_DISPLAY_VGA,\r
         CIRRUS_LOGIC_VENDOR_ID,\r
         CIRRUS_LOGIC_5430_DEVICE_ID,\r
         QEMU_VIDEO_CIRRUS_5430,\r
         L"Cirrus 5430"\r
     },{\r
+        PCI_CLASS_DISPLAY_VGA,\r
         CIRRUS_LOGIC_VENDOR_ID,\r
         CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID,\r
         QEMU_VIDEO_CIRRUS_5430,\r
         L"Cirrus 5430"\r
     },{\r
+        PCI_CLASS_DISPLAY_VGA,\r
         CIRRUS_LOGIC_VENDOR_ID,\r
         CIRRUS_LOGIC_5446_DEVICE_ID,\r
         QEMU_VIDEO_CIRRUS_5446,\r
         L"Cirrus 5446"\r
     },{\r
+        PCI_CLASS_DISPLAY_VGA,\r
         0x1234,\r
         0x1111,\r
         QEMU_VIDEO_BOCHS_MMIO,\r
         L"QEMU Standard VGA"\r
     },{\r
+        PCI_CLASS_DISPLAY_OTHER,\r
+        0x1234,\r
+        0x1111,\r
+        QEMU_VIDEO_BOCHS_MMIO,\r
+        L"QEMU Standard VGA (secondary)"\r
+    },{\r
+        PCI_CLASS_DISPLAY_VGA,\r
         0x1b36,\r
         0x0100,\r
         QEMU_VIDEO_BOCHS,\r
         L"QEMU QXL VGA"\r
+    },{\r
+        PCI_CLASS_DISPLAY_VGA,\r
+        0x1af4,\r
+        0x1050,\r
+        QEMU_VIDEO_BOCHS_MMIO,\r
+        L"QEMU VirtIO VGA"\r
+    },{\r
+        PCI_CLASS_DISPLAY_VGA,\r
+        0x15ad,\r
+        0x0405,\r
+        QEMU_VIDEO_VMWARE_SVGA,\r
+        L"QEMU VMWare SVGA"\r
     },{\r
         0 /* end of list */\r
     }\r
@@ -59,6 +76,7 @@ QEMU_VIDEO_CARD gQemuVideoCardList[] = {
 \r
 static QEMU_VIDEO_CARD*\r
 QemuVideoDetect(\r
+  IN UINT8 SubClass,\r
   IN UINT16 VendorId,\r
   IN UINT16 DeviceId\r
   )\r
@@ -66,7 +84,8 @@ QemuVideoDetect(
   UINTN Index = 0;\r
 \r
   while (gQemuVideoCardList[Index].VendorId != 0) {\r
-    if (gQemuVideoCardList[Index].VendorId == VendorId &&\r
+    if (gQemuVideoCardList[Index].SubClass == SubClass &&\r
+        gQemuVideoCardList[Index].VendorId == VendorId &&\r
         gQemuVideoCardList[Index].DeviceId == DeviceId) {\r
       return gQemuVideoCardList + Index;\r
     }\r
@@ -129,7 +148,10 @@ QemuVideoControllerDriverSupported (
   }\r
 \r
   Status = EFI_UNSUPPORTED;\r
-  Card = QemuVideoDetect(Pci.Hdr.VendorId, Pci.Hdr.DeviceId);\r
+  if (!IS_PCI_DISPLAY (&Pci)) {\r
+    goto Done;\r
+  }\r
+  Card = QemuVideoDetect(Pci.Hdr.ClassCode[1], Pci.Hdr.VendorId, Pci.Hdr.DeviceId);\r
   if (Card != NULL) {\r
     DEBUG ((EFI_D_INFO, "QemuVideo: %s detected\n", Card->Name));\r
     Status = EFI_SUCCESS;\r
@@ -173,6 +195,7 @@ QemuVideoControllerDriverStart (
   EFI_TPL                           OldTpl;\r
   EFI_STATUS                        Status;\r
   QEMU_VIDEO_PRIVATE_DATA           *Private;\r
+  BOOLEAN                           IsQxl;\r
   EFI_DEVICE_PATH_PROTOCOL          *ParentDevicePath;\r
   ACPI_ADR_DEVICE_PATH              AcpiDeviceNode;\r
   PCI_TYPE00                        Pci;\r
@@ -227,13 +250,19 @@ QemuVideoControllerDriverStart (
   //\r
   // Determine card variant.\r
   //\r
-  Card = QemuVideoDetect(Pci.Hdr.VendorId, Pci.Hdr.DeviceId);\r
+  Card = QemuVideoDetect(Pci.Hdr.ClassCode[1], Pci.Hdr.VendorId, Pci.Hdr.DeviceId);\r
   if (Card == NULL) {\r
     Status = EFI_DEVICE_ERROR;\r
     goto ClosePciIo;\r
   }\r
   Private->Variant = Card->Variant;\r
 \r
+  //\r
+  // IsQxl is based on the detected Card->Variant, which at a later point might\r
+  // not match Private->Variant.\r
+  //\r
+  IsQxl = (BOOLEAN)(Card->Variant == QEMU_VIDEO_BOCHS);\r
+\r
   //\r
   // Save original PCI attributes\r
   //\r
@@ -287,6 +316,14 @@ QemuVideoControllerDriverStart (
     }\r
   }\r
 \r
+  //\r
+  // VMWare SVGA is handled like Bochs (with port IO only).\r
+  //\r
+  if (Private->Variant == QEMU_VIDEO_VMWARE_SVGA) {\r
+    Private->Variant = QEMU_VIDEO_BOCHS;\r
+    Private->FrameBufferVramBarIndex = PCI_BAR_IDX1;\r
+  }\r
+\r
   //\r
   // Check if accessing the bochs interface works.\r
   //\r
@@ -354,7 +391,7 @@ QemuVideoControllerDriverStart (
     break;\r
   case QEMU_VIDEO_BOCHS_MMIO:\r
   case QEMU_VIDEO_BOCHS:\r
-    Status = QemuVideoBochsModeSetup (Private);\r
+    Status = QemuVideoBochsModeSetup (Private, IsQxl);\r
     break;\r
   default:\r
     ASSERT (FALSE);\r
@@ -398,6 +435,13 @@ QemuVideoControllerDriverStart (
     goto UninstallGop;\r
   }\r
 \r
+#if defined MDE_CPU_IA32 || defined MDE_CPU_X64\r
+  if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO ||\r
+      Private->Variant == QEMU_VIDEO_BOCHS) {\r
+    InstallVbeShim (Card->Name, Private->GraphicsOutput.Mode->FrameBufferBase);\r
+  }\r
+#endif\r
+\r
   gBS->RestoreTPL (OldTpl);\r
   return EFI_SUCCESS;\r
 \r
@@ -728,7 +772,7 @@ ClearScreen (
   Private->PciIo->Mem.Write (\r
                         Private->PciIo,\r
                         EfiPciIoWidthFillUint32,\r
-                        0,\r
+                        Private->FrameBufferVramBarIndex,\r
                         0,\r
                         0x400000 >> 2,\r
                         &Color\r
@@ -938,18 +982,5 @@ InitializeQemuVideo (
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  //\r
-  // Install EFI Driver Supported EFI Version Protocol required for\r
-  // EFI drivers that are on PCI and other plug in cards.\r
-  //\r
-  gQemuVideoDriverSupportedEfiVersion.FirmwareVersion = PcdGet32 (PcdDriverSupportedEfiVersion);\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &ImageHandle,\r
-                  &gEfiDriverSupportedEfiVersionProtocolGuid,\r
-                  &gQemuVideoDriverSupportedEfiVersion,\r
-                  NULL\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
   return Status;\r
 }\r