]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430GraphicsOutput.c
Use PixelFormat PixelBitMask in CirrusLogic5430Dxe driver.
[mirror_edk2.git] / OptionRomPkg / CirrusLogic5430Dxe / CirrusLogic5430GraphicsOutput.c
index fceb419198a3822b8252e1679fc20b18a910910b..86535b7964686765d157026c8ebc22a731417aeb 100644 (file)
@@ -20,6 +20,51 @@ Abstract:
 \r
 **/\r
 #include "CirrusLogic5430.h"\r
+#include <IndustryStandard/Acpi.h>\r
+\r
+\r
+STATIC\r
+VOID\r
+CirrusLogic5430CompleteModeInfo (\r
+  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info\r
+  )\r
+{\r
+  Info->Version = 0;\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
+  Info->PixelsPerScanLine = Info->HorizontalResolution;\r
+}\r
+\r
+\r
+STATIC\r
+EFI_STATUS\r
+CirrusLogic5430CompleteModeData (\r
+  IN  CIRRUS_LOGIC_5430_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
+\r
+  Info = Mode->Info;\r
+  CirrusLogic5430CompleteModeInfo (Info);\r
+\r
+  Private->PciIo->GetBarAttributes (\r
+                        Private->PciIo,\r
+                        0,\r
+                        NULL,\r
+                        (VOID**) &FrameBufDesc\r
+                        );\r
+\r
+  Mode->FrameBufferBase = FrameBufDesc->AddrRangeMin;\r
+  Mode->FrameBufferSize = Info->HorizontalResolution * Info->VerticalResolution;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 \r
 //\r
 // Graphics Output Protocol Member Functions\r
@@ -72,11 +117,9 @@ Routine Description:
 \r
   *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
 \r
-  (*Info)->Version = 0;\r
   (*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;\r
   (*Info)->VerticalResolution   = Private->ModeData[ModeNumber].VerticalResolution;\r
-  (*Info)->PixelFormat = PixelBltOnly;\r
-  (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;\r
+  CirrusLogic5430CompleteModeInfo (*Info);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -104,8 +147,8 @@ Routine Description:
 \r
 --*/\r
 {\r
-  CIRRUS_LOGIC_5430_PRIVATE_DATA  *Private;\r
-  CIRRUS_LOGIC_5430_MODE_DATA     *ModeData;\r
+  CIRRUS_LOGIC_5430_PRIVATE_DATA    *Private;\r
+  CIRRUS_LOGIC_5430_MODE_DATA       *ModeData;\r
 \r
   Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
 \r
@@ -130,12 +173,9 @@ Routine Description:
   This->Mode->Mode = ModeNumber;\r
   This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;\r
   This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;\r
-  This->Mode->Info->PixelFormat = PixelBltOnly;\r
-  This->Mode->Info->PixelsPerScanLine =  ModeData->HorizontalResolution;\r
   This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
 \r
-  This->Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS)(UINTN)NULL;\r
-  This->Mode->FrameBufferSize = 0;\r
+  CirrusLogic5430CompleteModeData (Private, This->Mode);\r
 \r
   Private->HardwareNeedsStarting  = FALSE;\r
 \r
@@ -289,9 +329,9 @@ Returns:
       for (X = 0; X < Width; X++) {\r
         Blt         = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) ((UINT8 *) BltBuffer + (DstY * Delta) + (DestinationX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
 \r
-        Blt->Red    = (UINT8) (Private->LineBuffer[X] & 0xe0);\r
-        Blt->Green  = (UINT8) ((Private->LineBuffer[X] & 0x1c) << 3);\r
-        Blt->Blue   = (UINT8) ((Private->LineBuffer[X] & 0x03) << 6);\r
+        Blt->Red    = PIXEL_TO_RED_BYTE (Private->LineBuffer[X]);\r
+        Blt->Green  = PIXEL_TO_GREEN_BYTE (Private->LineBuffer[X]);\r
+        Blt->Blue   = PIXEL_TO_BLUE_BYTE (Private->LineBuffer[X]);\r
       }\r
     }\r
     break;\r
@@ -344,7 +384,7 @@ Returns:
 \r
   case EfiBltVideoFill:\r
     Blt       = BltBuffer;\r
-    Pixel     = (UINT8) ((Blt->Red & 0xe0) | ((Blt->Green >> 3) & 0x1c) | ((Blt->Blue >> 6) & 0x03));\r
+    Pixel     = RGB_BYTES_TO_PIXEL (Blt->Red, Blt->Green, Blt->Blue);\r
     WidePixel = (Pixel << 8) | Pixel;\r
     WidePixel = (WidePixel << 16) | WidePixel;\r
 \r
@@ -399,8 +439,14 @@ Returns:
     for (SrcY = SourceY, DstY = DestinationY; SrcY < (Height + SourceY); SrcY++, DstY++) {\r
 \r
       for (X = 0; X < Width; X++) {\r
-        Blt                     = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) ((UINT8 *) BltBuffer + (SrcY * Delta) + (SourceX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
-        Private->LineBuffer[X]  = (UINT8) ((Blt->Red & 0xe0) | ((Blt->Green >> 3) & 0x1c) | ((Blt->Blue >> 6) & 0x03));\r
+        Blt =\r
+          (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) (\r
+              (UINT8 *) BltBuffer +\r
+              (SrcY * Delta) +\r
+              ((SourceX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))\r
+            );\r
+        Private->LineBuffer[X]  =\r
+          RGB_BYTES_TO_PIXEL (Blt->Red, Blt->Green, Blt->Blue);\r
       }\r
 \r
       Offset = (DstY * Private->ModeData[CurrentMode].HorizontalResolution) + DestinationX;\r