]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/Gop.c
OvmfPkg/PlatformBds: Dispatch deferred images after EndOfDxe
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Gop.c
index bd49ee91391fb6e995465b8868a5eb258e9c5ff8..5485ba3c28716c524be53b291e6804492fad62ed 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Graphics Output Protocol functions for the QEMU video controller.\r
 \r
-  Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2007 - 2016, 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
@@ -14,8 +14,6 @@
 **/\r
 \r
 #include "Qemu.h"\r
-#include <IndustryStandard/Acpi.h>\r
-#include <Library/BltLib.h>\r
 \r
 STATIC\r
 VOID\r
@@ -70,8 +68,10 @@ QemuVideoCompleteModeData (
   Mode->FrameBufferBase = FrameBufDesc->AddrRangeMin;\r
   Mode->FrameBufferSize = Info->HorizontalResolution * Info->VerticalResolution;\r
   Mode->FrameBufferSize = Mode->FrameBufferSize * ((ModeData->ColorDepth + 7) / 8);\r
-  DEBUG ((EFI_D_INFO, "FrameBufferBase: 0x%x, FrameBufferSize: 0x%x\n", Mode->FrameBufferBase, Mode->FrameBufferSize));\r
+  DEBUG ((EFI_D_INFO, "FrameBufferBase: 0x%Lx, FrameBufferSize: 0x%Lx\n",\r
+    Mode->FrameBufferBase, (UINT64)Mode->FrameBufferSize));\r
 \r
+  FreePool (FrameBufDesc);\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -113,10 +113,6 @@ Routine Description:
 \r
   Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
 \r
-  if (Private->HardwareNeedsStarting) {\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
   if (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
@@ -161,7 +157,7 @@ Routine Description:
 {\r
   QEMU_VIDEO_PRIVATE_DATA    *Private;\r
   QEMU_VIDEO_MODE_DATA       *ModeData;\r
-//  UINTN                             Count;\r
+  RETURN_STATUS              Status;\r
 \r
   Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
 \r
@@ -171,25 +167,17 @@ Routine Description:
 \r
   ModeData = &Private->ModeData[ModeNumber];\r
 \r
-  if (Private->LineBuffer) {\r
-    gBS->FreePool (Private->LineBuffer);\r
-  }\r
-\r
-  Private->LineBuffer = NULL;\r
-  Private->LineBuffer = AllocatePool (4 * ModeData->HorizontalResolution);\r
-  if (Private->LineBuffer == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
   switch (Private->Variant) {\r
   case QEMU_VIDEO_CIRRUS_5430:\r
   case QEMU_VIDEO_CIRRUS_5446:\r
-    InitializeCirrusGraphicsMode (Private, &QemuVideoCirrusModes[ModeData->ModeNumber]);\r
+    InitializeCirrusGraphicsMode (Private, &QemuVideoCirrusModes[ModeData->InternalModeIndex]);\r
+    break;\r
+  case QEMU_VIDEO_BOCHS_MMIO:\r
+  case QEMU_VIDEO_BOCHS:\r
+    InitializeBochsGraphicsMode (Private, &QemuVideoBochsModes[ModeData->InternalModeIndex]);\r
     break;\r
   default:\r
     ASSERT (FALSE);\r
-    gBS->FreePool (Private->LineBuffer);\r
-    Private->LineBuffer = NULL;\r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
@@ -200,12 +188,32 @@ Routine Description:
 \r
   QemuVideoCompleteModeData (Private, This->Mode);\r
 \r
-  BltLibConfigure (\r
-    (VOID*)(UINTN) This->Mode->FrameBufferBase,\r
-    This->Mode->Info\r
-    );\r
+  //\r
+  // Allocate when using first time.\r
+  //\r
+  if (Private->FrameBufferBltConfigure == NULL) {\r
+    Status = FrameBufferBltConfigure (\r
+               (VOID*) (UINTN) This->Mode->FrameBufferBase,\r
+               This->Mode->Info,\r
+               Private->FrameBufferBltConfigure,\r
+               &Private->FrameBufferBltConfigureSize\r
+               );\r
+    ASSERT (Status == RETURN_BUFFER_TOO_SMALL);\r
+    Private->FrameBufferBltConfigure =\r
+      AllocatePool (Private->FrameBufferBltConfigureSize);\r
+  }\r
 \r
-  Private->HardwareNeedsStarting  = FALSE;\r
+  //\r
+  // Create the configuration for FrameBufferBltLib\r
+  //\r
+  ASSERT (Private->FrameBufferBltConfigure != NULL);\r
+  Status = FrameBufferBltConfigure (\r
+              (VOID*) (UINTN) This->Mode->FrameBufferBase,\r
+              This->Mode->Info,\r
+              Private->FrameBufferBltConfigure,\r
+              &Private->FrameBufferBltConfigureSize\r
+              );\r
+  ASSERT (Status == RETURN_SUCCESS);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -255,7 +263,9 @@ Returns:
 {\r
   EFI_STATUS                      Status;\r
   EFI_TPL                         OriginalTPL;\r
+  QEMU_VIDEO_PRIVATE_DATA         *Private;\r
 \r
+  Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
   //\r
   // We have to raise to TPL Notify, so we make an atomic write the frame buffer.\r
   // We would not want a timer based event (Cursor, ...) to come in while we are\r
@@ -268,7 +278,8 @@ Returns:
   case EfiBltBufferToVideo:\r
   case EfiBltVideoFill:\r
   case EfiBltVideoToVideo:\r
-    Status = BltLibGopBlt (\r
+    Status = FrameBufferBlt (\r
+      Private->FrameBufferBltConfigure,\r
       BltBuffer,\r
       BltOperation,\r
       SourceX,\r
@@ -316,23 +327,28 @@ QemuVideoGraphicsOutputConstructor (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
+\r
   Status = gBS->AllocatePool (\r
                   EfiBootServicesData,\r
                   sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION),\r
                   (VOID **) &Private->GraphicsOutput.Mode->Info\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto FreeMode;\r
   }\r
   Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode;\r
   Private->GraphicsOutput.Mode->Mode    = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;\r
-  Private->HardwareNeedsStarting        = TRUE;\r
-  Private->LineBuffer                   = NULL;\r
+  Private->FrameBufferBltConfigure      = NULL;\r
+  Private->FrameBufferBltConfigureSize  = 0;\r
 \r
   //\r
   // Initialize the hardware\r
   //\r
-  GraphicsOutput->SetMode (GraphicsOutput, 0);\r
+  Status = GraphicsOutput->SetMode (GraphicsOutput, 0);\r
+  if (EFI_ERROR (Status)) {\r
+    goto FreeInfo;\r
+  }\r
+\r
   DrawLogo (\r
     Private,\r
     Private->ModeData[Private->GraphicsOutput.Mode->Mode].HorizontalResolution,\r
@@ -340,6 +356,15 @@ QemuVideoGraphicsOutputConstructor (
     );\r
 \r
   return EFI_SUCCESS;\r
+\r
+FreeInfo:\r
+  FreePool (Private->GraphicsOutput.Mode->Info);\r
+\r
+FreeMode:\r
+  FreePool (Private->GraphicsOutput.Mode);\r
+  Private->GraphicsOutput.Mode = NULL;\r
+\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -358,6 +383,10 @@ Returns:
 \r
 --*/\r
 {\r
+  if (Private->FrameBufferBltConfigure != NULL) {\r
+    FreePool (Private->FrameBufferBltConfigure);\r
+  }\r
+\r
   if (Private->GraphicsOutput.Mode != NULL) {\r
     if (Private->GraphicsOutput.Mode->Info != NULL) {\r
       gBS->FreePool (Private->GraphicsOutput.Mode->Info);\r