]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/Driver.c
MdePkg: Add 3 macro defined in latest TPM2 specification.
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Driver.c
index 508e1acb1018becf6715400f0677857c0c1b8e2f..8d962b4438982ffbae4e838dd07be4d812a57111 100644 (file)
@@ -52,6 +52,11 @@ QEMU_VIDEO_CARD gQemuVideoCardList[] = {
         0x0100,\r
         QEMU_VIDEO_BOCHS,\r
         L"QEMU QXL VGA"\r
+    },{\r
+        0x1af4,\r
+        0x1050,\r
+        QEMU_VIDEO_BOCHS_MMIO,\r
+        L"QEMU VirtIO VGA"\r
     },{\r
         0 /* end of list */\r
     }\r
@@ -170,20 +175,25 @@ QemuVideoControllerDriverStart (
   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
   )\r
 {\r
+  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
   QEMU_VIDEO_CARD                   *Card;\r
   EFI_PCI_IO_PROTOCOL               *ChildPciIo;\r
 \r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+\r
   //\r
   // Allocate Private context data for GOP inteface.\r
   //\r
   Private = AllocateZeroPool (sizeof (QEMU_VIDEO_PRIVATE_DATA));\r
   if (Private == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto RestoreTpl;\r
   }\r
 \r
   //\r
@@ -230,6 +240,12 @@ QemuVideoControllerDriverStart (
   }\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
@@ -350,7 +366,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
@@ -394,6 +410,14 @@ 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
 UninstallGop:\r
@@ -424,6 +448,9 @@ ClosePciIo:
 FreePrivate:\r
   FreePool (Private);\r
 \r
+RestoreTpl:\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
@@ -454,8 +481,26 @@ QemuVideoControllerDriverStop (
   EFI_STATUS                      Status;\r
   QEMU_VIDEO_PRIVATE_DATA  *Private;\r
 \r
+  if (NumberOfChildren == 0) {\r
+    //\r
+    // Close the PCI I/O Protocol\r
+    //\r
+    gBS->CloseProtocol (\r
+          Controller,\r
+          &gEfiPciIoProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          Controller\r
+          );\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  //\r
+  // free all resources for whose access we need the child handle, because the\r
+  // child handle is going away\r
+  //\r
+  ASSERT (NumberOfChildren == 1);\r
   Status = gBS->OpenProtocol (\r
-                  Controller,\r
+                  ChildHandleBuffer[0],\r
                   &gEfiGraphicsOutputProtocolGuid,\r
                   (VOID **) &GraphicsOutput,\r
                   This->DriverBindingHandle,\r
@@ -470,6 +515,7 @@ QemuVideoControllerDriverStop (
   // Get our private context information\r
   //\r
   Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput);\r
+  ASSERT (Private->Handle == ChildHandleBuffer[0]);\r
 \r
   QemuVideoGraphicsOutputDestructor (Private);\r
   //\r
@@ -496,16 +542,6 @@ QemuVideoControllerDriverStop (
                   NULL\r
                   );\r
 \r
-  //\r
-  // Close the PCI I/O Protocol\r
-  //\r
-  gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiPciIoProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Controller\r
-        );\r
-\r
   gBS->CloseProtocol (\r
         Controller,\r
         &gEfiPciIoProtocolGuid,\r
@@ -513,6 +549,11 @@ QemuVideoControllerDriverStop (
         Private->Handle\r
         );\r
 \r
+  FreePool (Private->ModeData);\r
+  gBS->UninstallProtocolInterface (Private->Handle,\r
+         &gEfiDevicePathProtocolGuid, Private->GopDevicePath);\r
+  FreePool (Private->GopDevicePath);\r
+\r
   //\r
   // Free our instance data\r
   //\r