]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/Gop.c
NetworkPkg: Move Network library header file from MdeModulePkg to NetworkPkg
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Gop.c
index 18d0779896ca494c1765577cfede6ad428710a29..e49ec32cf16dfcee6027a3cdf328ffb7305d6de7 100644 (file)
@@ -1,21 +1,13 @@
 /** @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 - 2018, 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
 #include "Qemu.h"\r
-#include <IndustryStandard/Acpi.h>\r
-#include <Library/BltLib.h>\r
 \r
 STATIC\r
 VOID\r
@@ -62,7 +54,7 @@ QemuVideoCompleteModeData (
 \r
   Private->PciIo->GetBarAttributes (\r
                         Private->PciIo,\r
-                        0,\r
+                        Private->FrameBufferVramBarIndex,\r
                         NULL,\r
                         (VOID**) &FrameBufDesc\r
                         );\r
@@ -70,6 +62,9 @@ QemuVideoCompleteModeData (
   Mode->FrameBufferBase = FrameBufDesc->AddrRangeMin;\r
   Mode->FrameBufferSize = Info->HorizontalResolution * Info->VerticalResolution;\r
   Mode->FrameBufferSize = Mode->FrameBufferSize * ((ModeData->ColorDepth + 7) / 8);\r
+  Mode->FrameBufferSize = EFI_PAGES_TO_SIZE (\r
+                            EFI_SIZE_TO_PAGES (Mode->FrameBufferSize)\r
+                            );\r
   DEBUG ((EFI_D_INFO, "FrameBufferBase: 0x%Lx, FrameBufferSize: 0x%Lx\n",\r
     Mode->FrameBufferBase, (UINT64)Mode->FrameBufferSize));\r
 \r
@@ -77,7 +72,6 @@ QemuVideoCompleteModeData (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 //\r
 // Graphics Output Protocol Member Functions\r
 //\r
@@ -157,9 +151,10 @@ Routine Description:
 \r
 --*/\r
 {\r
-  QEMU_VIDEO_PRIVATE_DATA    *Private;\r
-  QEMU_VIDEO_MODE_DATA       *ModeData;\r
-//  UINTN                             Count;\r
+  QEMU_VIDEO_PRIVATE_DATA       *Private;\r
+  QEMU_VIDEO_MODE_DATA          *ModeData;\r
+  RETURN_STATUS                 Status;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Black;\r
 \r
   Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
 \r
@@ -169,15 +164,6 @@ Routine Description:
 \r
   ModeData = &Private->ModeData[ModeNumber];\r
 \r
-  if (Private->LineBuffer) {\r
-    gBS->FreePool (Private->LineBuffer);\r
-  }\r
-\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
@@ -189,8 +175,6 @@ Routine Description:
     break;\r
   default:\r
     ASSERT (FALSE);\r
-    gBS->FreePool (Private->LineBuffer);\r
-    Private->LineBuffer = NULL;\r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
@@ -201,10 +185,52 @@ Routine Description:
 \r
   QemuVideoCompleteModeData (Private, This->Mode);\r
 \r
-  BltLibConfigure (\r
-    (VOID*)(UINTN) This->Mode->FrameBufferBase,\r
-    This->Mode->Info\r
-    );\r
+  //\r
+  // Re-initialize the frame buffer configure when mode changes.\r
+  //\r
+  Status = FrameBufferBltConfigure (\r
+             (VOID*) (UINTN) This->Mode->FrameBufferBase,\r
+             This->Mode->Info,\r
+             Private->FrameBufferBltConfigure,\r
+             &Private->FrameBufferBltConfigureSize\r
+             );\r
+  if (Status == RETURN_BUFFER_TOO_SMALL) {\r
+    //\r
+    // Frame buffer configure may be larger in new mode.\r
+    //\r
+    if (Private->FrameBufferBltConfigure != NULL) {\r
+      FreePool (Private->FrameBufferBltConfigure);\r
+    }\r
+    Private->FrameBufferBltConfigure =\r
+      AllocatePool (Private->FrameBufferBltConfigureSize);\r
+    ASSERT (Private->FrameBufferBltConfigure != NULL);\r
+\r
+    //\r
+    // Create the configuration for FrameBufferBltLib\r
+    //\r
+    Status = FrameBufferBltConfigure (\r
+                (VOID*) (UINTN) This->Mode->FrameBufferBase,\r
+                This->Mode->Info,\r
+                Private->FrameBufferBltConfigure,\r
+                &Private->FrameBufferBltConfigureSize\r
+                );\r
+  }\r
+  ASSERT (Status == RETURN_SUCCESS);\r
+\r
+  //\r
+  // Per UEFI Spec, need to clear the visible portions of the output display to black.\r
+  //\r
+  ZeroMem (&Black, sizeof (Black));\r
+  Status = FrameBufferBlt (\r
+             Private->FrameBufferBltConfigure,\r
+             &Black,\r
+             EfiBltVideoFill,\r
+             0, 0,\r
+             0, 0,\r
+             This->Mode->Info->HorizontalResolution, This->Mode->Info->VerticalResolution,\r
+             0\r
+             );\r
+  ASSERT_RETURN_ERROR (Status);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -254,7 +280,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
@@ -267,7 +295,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
@@ -282,7 +311,7 @@ Returns:
 \r
   default:\r
     Status = EFI_INVALID_PARAMETER;\r
-    ASSERT (FALSE);\r
+    break;\r
   }\r
 \r
   gBS->RestoreTPL (OriginalTPL);\r
@@ -326,7 +355,8 @@ QemuVideoGraphicsOutputConstructor (
   }\r
   Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode;\r
   Private->GraphicsOutput.Mode->Mode    = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;\r
-  Private->LineBuffer                   = NULL;\r
+  Private->FrameBufferBltConfigure      = NULL;\r
+  Private->FrameBufferBltConfigureSize  = 0;\r
 \r
   //\r
   // Initialize the hardware\r
@@ -370,8 +400,8 @@ Returns:
 \r
 --*/\r
 {\r
-  if (Private->LineBuffer != NULL) {\r
-    FreePool (Private->LineBuffer);\r
+  if (Private->FrameBufferBltConfigure != NULL) {\r
+    FreePool (Private->FrameBufferBltConfigure);\r
   }\r
 \r
   if (Private->GraphicsOutput.Mode != NULL) {\r