]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/Gop.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Gop.c
index b479d24a87634a31c4d563dd542fa3ef637c7c8a..7a9fe208c99c8753b7c0855b924149029f2b3a78 100644 (file)
 \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 <IndustryStandard/VmwareSvga.h>\r
 #include "Qemu.h"\r
 \r
 STATIC\r
 VOID\r
 QemuVideoCompleteModeInfo (\r
-  IN  QEMU_VIDEO_MODE_DATA           *ModeData,\r
+  IN  QEMU_VIDEO_MODE_DATA                  *ModeData,\r
   OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info\r
   )\r
 {\r
   Info->Version = 0;\r
   if (ModeData->ColorDepth == 8) {\r
-    Info->PixelFormat = PixelBitMask;\r
-    Info->PixelInformation.RedMask = PIXEL_RED_MASK;\r
-    Info->PixelInformation.GreenMask = PIXEL_GREEN_MASK;\r
-    Info->PixelInformation.BlueMask = PIXEL_BLUE_MASK;\r
+    Info->PixelFormat                   = PixelBitMask;\r
+    Info->PixelInformation.RedMask      = PIXEL_RED_MASK;\r
+    Info->PixelInformation.GreenMask    = PIXEL_GREEN_MASK;\r
+    Info->PixelInformation.BlueMask     = PIXEL_BLUE_MASK;\r
     Info->PixelInformation.ReservedMask = 0;\r
   } else if (ModeData->ColorDepth == 24) {\r
-    Info->PixelFormat = PixelBitMask;\r
-    Info->PixelInformation.RedMask = PIXEL24_RED_MASK;\r
-    Info->PixelInformation.GreenMask = PIXEL24_GREEN_MASK;\r
-    Info->PixelInformation.BlueMask = PIXEL24_BLUE_MASK;\r
+    Info->PixelFormat                   = PixelBitMask;\r
+    Info->PixelInformation.RedMask      = PIXEL24_RED_MASK;\r
+    Info->PixelInformation.GreenMask    = PIXEL24_GREEN_MASK;\r
+    Info->PixelInformation.BlueMask     = PIXEL24_BLUE_MASK;\r
     Info->PixelInformation.ReservedMask = 0;\r
   } else if (ModeData->ColorDepth == 32) {\r
-    DEBUG ((EFI_D_INFO, "PixelBlueGreenRedReserved8BitPerColor\n"));\r
-    Info->PixelFormat = PixelBlueGreenRedReserved8BitPerColor;\r
+    DEBUG ((DEBUG_INFO, "PixelBlueGreenRedReserved8BitPerColor\n"));\r
+    Info->PixelFormat                   = PixelBlueGreenRedReserved8BitPerColor;\r
+    Info->PixelInformation.RedMask      = 0;\r
+    Info->PixelInformation.GreenMask    = 0;\r
+    Info->PixelInformation.BlueMask     = 0;\r
+    Info->PixelInformation.ReservedMask = 0;\r
+  } else {\r
+    DEBUG ((DEBUG_ERROR, "%a: Invalid ColorDepth %u", __FUNCTION__, ModeData->ColorDepth));\r
+    ASSERT (FALSE);\r
   }\r
+\r
   Info->PixelsPerScanLine = Info->HorizontalResolution;\r
 }\r
 \r
-\r
 STATIC\r
 EFI_STATUS\r
 QemuVideoCompleteModeData (\r
-  IN  QEMU_VIDEO_PRIVATE_DATA           *Private,\r
-  OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode\r
+  IN  QEMU_VIDEO_PRIVATE_DATA            *Private,\r
+  OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE  *Mode\r
   )\r
 {\r
   EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info;\r
   EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR     *FrameBufDesc;\r
-  QEMU_VIDEO_MODE_DATA           *ModeData;\r
+  QEMU_VIDEO_MODE_DATA                  *ModeData;\r
 \r
   ModeData = &Private->ModeData[Mode->Mode];\r
-  Info = Mode->Info;\r
+  Info     = Mode->Info;\r
   QemuVideoCompleteModeInfo (ModeData, Info);\r
 \r
   Private->PciIo->GetBarAttributes (\r
-                        Private->PciIo,\r
-                        0,\r
-                        NULL,\r
-                        (VOID**) &FrameBufDesc\r
-                        );\r
+                    Private->PciIo,\r
+                    Private->FrameBufferVramBarIndex,\r
+                    NULL,\r
+                    (VOID **)&FrameBufDesc\r
+                    );\r
 \r
   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%Lx, FrameBufferSize: 0x%Lx\n",\r
-    Mode->FrameBufferBase, (UINT64)Mode->FrameBufferSize));\r
+  Mode->FrameBufferSize = EFI_PAGES_TO_SIZE (\r
+                            EFI_SIZE_TO_PAGES (Mode->FrameBufferSize)\r
+                            );\r
+  DEBUG ((\r
+    DEBUG_INFO,\r
+    "FrameBufferBase: 0x%Lx, FrameBufferSize: 0x%Lx\n",\r
+    Mode->FrameBufferBase,\r
+    (UINT64)Mode->FrameBufferSize\r
+    ));\r
 \r
   FreePool (FrameBufDesc);\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
@@ -124,6 +94,7 @@ QemuVideoGraphicsOutputQueryMode (
   OUT UINTN                                 *SizeOfInfo,\r
   OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info\r
   )\r
+\r
 /*++\r
 \r
 Routine Description:\r
@@ -150,7 +121,7 @@ Routine Description:
 \r
   Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
 \r
-  if (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {\r
+  if ((Info == NULL) || (SizeOfInfo == NULL) || (ModeNumber >= This->Mode->MaxMode)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -161,14 +132,10 @@ Routine Description:
 \r
   *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
 \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
+  ModeData                      = &Private->ModeData[ModeNumber];\r
+  (*Info)->HorizontalResolution = ModeData->HorizontalResolution;\r
+  (*Info)->VerticalResolution   = ModeData->VerticalResolution;\r
+  QemuVideoCompleteModeInfo (ModeData, *Info);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -176,9 +143,10 @@ Routine Description:
 EFI_STATUS\r
 EFIAPI\r
 QemuVideoGraphicsOutputSetMode (\r
-  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
-  IN  UINT32                       ModeNumber\r
+  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL  *This,\r
+  IN  UINT32                        ModeNumber\r
   )\r
+\r
 /*++\r
 \r
 Routine Description:\r
@@ -196,10 +164,10 @@ Routine Description:
 \r
 --*/\r
 {\r
-  QEMU_VIDEO_PRIVATE_DATA       *Private;\r
-  QEMU_VIDEO_MODE_DATA          *ModeData;\r
-  RETURN_STATUS                 Status;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Black;\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
@@ -210,41 +178,31 @@ Routine Description:
   ModeData = &Private->ModeData[ModeNumber];\r
 \r
   switch (Private->Variant) {\r
-  case QEMU_VIDEO_CIRRUS_5430:\r
-  case QEMU_VIDEO_CIRRUS_5446:\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
-  case QEMU_VIDEO_VMWARE_SVGA:\r
-    InitializeVmwareSvgaGraphicsMode (\r
-      Private,\r
-      &QemuVideoBochsModes[ModeData->InternalModeIndex]\r
-      );\r
-    break;\r
-  default:\r
-    ASSERT (FALSE);\r
-    return EFI_DEVICE_ERROR;\r
+    case QEMU_VIDEO_CIRRUS_5430:\r
+    case QEMU_VIDEO_CIRRUS_5446:\r
+      InitializeCirrusGraphicsMode (Private, &QemuVideoCirrusModes[ModeData->InternalModeIndex]);\r
+      break;\r
+    case QEMU_VIDEO_BOCHS_MMIO:\r
+    case QEMU_VIDEO_BOCHS:\r
+      InitializeBochsGraphicsMode (Private, ModeData);\r
+      break;\r
+    default:\r
+      ASSERT (FALSE);\r
+      return EFI_DEVICE_ERROR;\r
   }\r
 \r
-  This->Mode->Mode = ModeNumber;\r
+  This->Mode->Mode                       = ModeNumber;\r
   This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;\r
-  This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;\r
-  This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
+  This->Mode->Info->VerticalResolution   = ModeData->VerticalResolution;\r
+  This->Mode->SizeOfInfo                 = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
 \r
-  if (Private->Variant == QEMU_VIDEO_VMWARE_SVGA) {\r
-    QemuVideoVmwareSvgaCompleteModeData (Private, This->Mode);\r
-  } else {\r
-    QemuVideoCompleteModeData (Private, This->Mode);\r
-  }\r
+  QemuVideoCompleteModeData (Private, This->Mode);\r
 \r
   //\r
   // Re-initialize the frame buffer configure when mode changes.\r
   //\r
   Status = FrameBufferBltConfigure (\r
-             (VOID*) (UINTN) This->Mode->FrameBufferBase,\r
+             (VOID *)(UINTN)This->Mode->FrameBufferBase,\r
              This->Mode->Info,\r
              Private->FrameBufferBltConfigure,\r
              &Private->FrameBufferBltConfigureSize\r
@@ -256,6 +214,7 @@ Routine Description:
     if (Private->FrameBufferBltConfigure != NULL) {\r
       FreePool (Private->FrameBufferBltConfigure);\r
     }\r
+\r
     Private->FrameBufferBltConfigure =\r
       AllocatePool (Private->FrameBufferBltConfigureSize);\r
     ASSERT (Private->FrameBufferBltConfigure != NULL);\r
@@ -264,12 +223,13 @@ Routine Description:
     // 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
+               (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
@@ -280,9 +240,12 @@ Routine Description:
              Private->FrameBufferBltConfigure,\r
              &Black,\r
              EfiBltVideoFill,\r
-             0, 0,\r
-             0, 0,\r
-             This->Mode->Info->HorizontalResolution, This->Mode->Info->VerticalResolution,\r
+             0,\r
+             0,\r
+             0,\r
+             0,\r
+             This->Mode->Info->HorizontalResolution,\r
+             This->Mode->Info->VerticalResolution,\r
              0\r
              );\r
   ASSERT_RETURN_ERROR (Status);\r
@@ -293,17 +256,18 @@ Routine Description:
 EFI_STATUS\r
 EFIAPI\r
 QemuVideoGraphicsOutputBlt (\r
-  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,\r
-  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer, OPTIONAL\r
-  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION     BltOperation,\r
-  IN  UINTN                                 SourceX,\r
-  IN  UINTN                                 SourceY,\r
-  IN  UINTN                                 DestinationX,\r
-  IN  UINTN                                 DestinationY,\r
-  IN  UINTN                                 Width,\r
-  IN  UINTN                                 Height,\r
-  IN  UINTN                                 Delta\r
+  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL       *This,\r
+  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL      *BltBuffer  OPTIONAL,\r
+  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION  BltOperation,\r
+  IN  UINTN                              SourceX,\r
+  IN  UINTN                              SourceY,\r
+  IN  UINTN                              DestinationX,\r
+  IN  UINTN                              DestinationY,\r
+  IN  UINTN                              Width,\r
+  IN  UINTN                              Height,\r
+  IN  UINTN                              Delta\r
   )\r
+\r
 /*++\r
 \r
 Routine Description:\r
@@ -333,9 +297,9 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_STATUS                      Status;\r
-  EFI_TPL                         OriginalTPL;\r
-  QEMU_VIDEO_PRIVATE_DATA         *Private;\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
@@ -346,27 +310,27 @@ Returns:
   OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);\r
 \r
   switch (BltOperation) {\r
-  case EfiBltVideoToBltBuffer:\r
-  case EfiBltBufferToVideo:\r
-  case EfiBltVideoFill:\r
-  case EfiBltVideoToVideo:\r
-    Status = FrameBufferBlt (\r
-      Private->FrameBufferBltConfigure,\r
-      BltBuffer,\r
-      BltOperation,\r
-      SourceX,\r
-      SourceY,\r
-      DestinationX,\r
-      DestinationY,\r
-      Width,\r
-      Height,\r
-      Delta\r
-      );\r
-    break;\r
-\r
-  default:\r
-    Status = EFI_INVALID_PARAMETER;\r
-    ASSERT (FALSE);\r
+    case EfiBltVideoToBltBuffer:\r
+    case EfiBltBufferToVideo:\r
+    case EfiBltVideoFill:\r
+    case EfiBltVideoToVideo:\r
+      Status = FrameBufferBlt (\r
+                 Private->FrameBufferBltConfigure,\r
+                 BltBuffer,\r
+                 BltOperation,\r
+                 SourceX,\r
+                 SourceY,\r
+                 DestinationX,\r
+                 DestinationY,\r
+                 Width,\r
+                 Height,\r
+                 Delta\r
+                 );\r
+      break;\r
+\r
+    default:\r
+      Status = EFI_INVALID_PARAMETER;\r
+      break;\r
   }\r
 \r
   gBS->RestoreTPL (OriginalTPL);\r
@@ -379,9 +343,8 @@ QemuVideoGraphicsOutputConstructor (
   QEMU_VIDEO_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
-\r
+  EFI_STATUS                    Status;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
 \r
   GraphicsOutput            = &Private->GraphicsOutput;\r
   GraphicsOutput->QueryMode = QemuVideoGraphicsOutputQueryMode;\r
@@ -394,7 +357,7 @@ QemuVideoGraphicsOutputConstructor (
   Status = gBS->AllocatePool (\r
                   EfiBootServicesData,\r
                   sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE),\r
-                  (VOID **) &Private->GraphicsOutput.Mode\r
+                  (VOID **)&Private->GraphicsOutput.Mode\r
                   );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
@@ -403,12 +366,13 @@ QemuVideoGraphicsOutputConstructor (
   Status = gBS->AllocatePool (\r
                   EfiBootServicesData,\r
                   sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION),\r
-                  (VOID **) &Private->GraphicsOutput.Mode->Info\r
+                  (VOID **)&Private->GraphicsOutput.Mode->Info\r
                   );\r
   if (EFI_ERROR (Status)) {\r
     goto FreeMode;\r
   }\r
-  Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode;\r
+\r
+  Private->GraphicsOutput.Mode->MaxMode = (UINT32)Private->MaxMode;\r
   Private->GraphicsOutput.Mode->Mode    = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;\r
   Private->FrameBufferBltConfigure      = NULL;\r
   Private->FrameBufferBltConfigureSize  = 0;\r
@@ -443,6 +407,7 @@ EFI_STATUS
 QemuVideoGraphicsOutputDestructor (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private\r
   )\r
+\r
 /*++\r
 \r
 Routine Description:\r
@@ -463,10 +428,9 @@ Returns:
     if (Private->GraphicsOutput.Mode->Info != NULL) {\r
       gBS->FreePool (Private->GraphicsOutput.Mode->Info);\r
     }\r
+\r
     gBS->FreePool (Private->GraphicsOutput.Mode);\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
-\r
-\r