]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/Gop.c
BaseTools: remove uncalled function
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Gop.c
index 532f20e6446ca383c5acf8fbd8ca4966cd2734fe..d51efc2a83d56a4496c9de592ad1863b86f18224 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Graphics Output Protocol functions for the QEMU video controller.\r
 \r
 /** @file\r
   Graphics Output Protocol functions for the QEMU video controller.\r
 \r
-  Copyright (c) 2007 - 2016, 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
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -13,6 +13,7 @@
 \r
 **/\r
 \r
 \r
 **/\r
 \r
+#include <IndustryStandard/VmwareSvga.h>\r
 #include "Qemu.h"\r
 \r
 STATIC\r
 #include "Qemu.h"\r
 \r
 STATIC\r
@@ -75,6 +76,42 @@ QemuVideoCompleteModeData (
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
+STATIC\r
+EFI_STATUS\r
+QemuVideoVmwareSvgaCompleteModeData (\r
+  IN  QEMU_VIDEO_PRIVATE_DATA           *Private,\r
+  OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode\r
+  )\r
+{\r
+  EFI_STATUS                            Status;\r
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info;\r
+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR     *FrameBufDesc;\r
+  UINT32                                BytesPerLine, FbOffset, BytesPerPixel;\r
+\r
+  Info = Mode->Info;\r
+  CopyMem (Info, &Private->VmwareSvgaModeInfo[Mode->Mode], sizeof (*Info));\r
+  BytesPerPixel = Private->ModeData[Mode->Mode].ColorDepth / 8;\r
+  BytesPerLine = Info->PixelsPerScanLine * BytesPerPixel;\r
+\r
+  FbOffset = VmwareSvgaRead (Private, VmwareSvgaRegFbOffset);\r
+\r
+  Status = Private->PciIo->GetBarAttributes (\r
+                             Private->PciIo,\r
+                             PCI_BAR_IDX1,\r
+                             NULL,\r
+                             (VOID**) &FrameBufDesc\r
+                             );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  Mode->FrameBufferBase = FrameBufDesc->AddrRangeMin + FbOffset;\r
+  Mode->FrameBufferSize = BytesPerLine * Info->VerticalResolution;\r
+\r
+  FreePool (FrameBufDesc);\r
+  return Status;\r
+}\r
+\r
 \r
 //\r
 // Graphics Output Protocol Member Functions\r
 \r
 //\r
 // Graphics Output Protocol Member Functions\r
@@ -124,10 +161,14 @@ Routine Description:
 \r
   *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
 \r
 \r
   *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
 \r
-  ModeData = &Private->ModeData[ModeNumber];\r
-  (*Info)->HorizontalResolution = ModeData->HorizontalResolution;\r
-  (*Info)->VerticalResolution   = ModeData->VerticalResolution;\r
-  QemuVideoCompleteModeInfo (ModeData, *Info);\r
+  if (Private->Variant == QEMU_VIDEO_VMWARE_SVGA) {\r
+    CopyMem (*Info, &Private->VmwareSvgaModeInfo[ModeNumber], sizeof (**Info));\r
+  } else {\r
+    ModeData = &Private->ModeData[ModeNumber];\r
+    (*Info)->HorizontalResolution = ModeData->HorizontalResolution;\r
+    (*Info)->VerticalResolution   = ModeData->VerticalResolution;\r
+    QemuVideoCompleteModeInfo (ModeData, *Info);\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -155,9 +196,10 @@ Routine Description:
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
-  QEMU_VIDEO_PRIVATE_DATA    *Private;\r
-  QEMU_VIDEO_MODE_DATA       *ModeData;\r
-  RETURN_STATUS              Status;\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
 \r
   Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
 \r
@@ -167,15 +209,6 @@ Routine Description:
 \r
   ModeData = &Private->ModeData[ModeNumber];\r
 \r
 \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
   switch (Private->Variant) {\r
   case QEMU_VIDEO_CIRRUS_5430:\r
   case QEMU_VIDEO_CIRRUS_5446:\r
@@ -185,10 +218,14 @@ Routine Description:
   case QEMU_VIDEO_BOCHS:\r
     InitializeBochsGraphicsMode (Private, &QemuVideoBochsModes[ModeData->InternalModeIndex]);\r
     break;\r
   case QEMU_VIDEO_BOCHS:\r
     InitializeBochsGraphicsMode (Private, &QemuVideoBochsModes[ModeData->InternalModeIndex]);\r
     break;\r
+  case QEMU_VIDEO_VMWARE_SVGA:\r
+    InitializeVmwareSvgaGraphicsMode (\r
+      Private,\r
+      &QemuVideoBochsModes[ModeData->InternalModeIndex]\r
+      );\r
+    break;\r
   default:\r
     ASSERT (FALSE);\r
   default:\r
     ASSERT (FALSE);\r
-    gBS->FreePool (Private->LineBuffer);\r
-    Private->LineBuffer = NULL;\r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
@@ -197,34 +234,58 @@ Routine Description:
   This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;\r
   This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
 \r
   This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;\r
   This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
 \r
-  QemuVideoCompleteModeData (Private, This->Mode);\r
+  if (Private->Variant == QEMU_VIDEO_VMWARE_SVGA) {\r
+    QemuVideoVmwareSvgaCompleteModeData (Private, This->Mode);\r
+  } else {\r
+    QemuVideoCompleteModeData (Private, This->Mode);\r
+  }\r
 \r
   //\r
 \r
   //\r
-  // Allocate when using first time.\r
+  // Re-initialize the frame buffer configure when mode changes.\r
   //\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
+  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
     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
   }\r
+  ASSERT (Status == RETURN_SUCCESS);\r
 \r
   //\r
 \r
   //\r
-  // Create the configuration for FrameBufferBltLib\r
+  // Per UEFI Spec, need to clear the visible portions of the output display to black.\r
   //\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
+  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
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -305,7 +366,7 @@ Returns:
 \r
   default:\r
     Status = EFI_INVALID_PARAMETER;\r
 \r
   default:\r
     Status = EFI_INVALID_PARAMETER;\r
-    ASSERT (FALSE);\r
+    break;\r
   }\r
 \r
   gBS->RestoreTPL (OriginalTPL);\r
   }\r
 \r
   gBS->RestoreTPL (OriginalTPL);\r
@@ -349,7 +410,6 @@ QemuVideoGraphicsOutputConstructor (
   }\r
   Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode;\r
   Private->GraphicsOutput.Mode->Mode    = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;\r
   }\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
   Private->FrameBufferBltConfigure      = NULL;\r
   Private->FrameBufferBltConfigureSize  = 0;\r
 \r
@@ -395,10 +455,6 @@ Returns:
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
-  if (Private->LineBuffer != NULL) {\r
-    FreePool (Private->LineBuffer);\r
-  }\r
-\r
   if (Private->FrameBufferBltConfigure != NULL) {\r
     FreePool (Private->FrameBufferBltConfigure);\r
   }\r
   if (Private->FrameBufferBltConfigure != NULL) {\r
     FreePool (Private->FrameBufferBltConfigure);\r
   }\r