]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430GraphicsOutput.c
Fix comparisons of enumerated types which may cause warnings for some compilers.
[mirror_edk2.git] / OptionRomPkg / CirrusLogic5430Dxe / CirrusLogic5430GraphicsOutput.c
index 7fdb3e0f0adfbc443fc549bee28e01117fb0ce48..4550b25010477fc281822b419594c36e327f1897 100644 (file)
@@ -1,13 +1,12 @@
-/*++\r
+/** @file\r
+Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>\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
-Copyright (c) 2007, Intel Corporation                                                         \r
-All rights reserved. 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
+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
 \r
 Module Name:\r
 \r
@@ -15,13 +14,57 @@ Module Name:
 \r
 Abstract:\r
 \r
-  This file produces the graphics abstration of Graphics Output Protocol. It is called by \r
-  CirrusLogic5430.c file which deals with the EFI 1.1 driver model. \r
+  This file produces the graphics abstration of Graphics Output Protocol. It is called by\r
+  CirrusLogic5430.c file which deals with the EFI 1.1 driver model.\r
   This file just does graphics.\r
 \r
---*/\r
-\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
@@ -74,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
@@ -106,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
@@ -127,17 +168,14 @@ Routine Description:
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  InitializeGraphicsMode (Private, &CirrusLogic5430VideoModes[ModeNumber]);\r
+  InitializeGraphicsMode (Private, &CirrusLogic5430VideoModes[ModeData->ModeNumber]);\r
 \r
   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
@@ -202,7 +240,7 @@ Returns:
 \r
   Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
 \r
-  if ((BltOperation < 0) || (BltOperation >= EfiGraphicsOutputBltOperationMax)) {\r
+  if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -291,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
@@ -346,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
@@ -401,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
@@ -444,7 +488,6 @@ CirrusLogic5430GraphicsOutputConstructor (
 {\r
   EFI_STATUS                   Status;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
-  UINTN                        Index;\r
 \r
 \r
   GraphicsOutput            = &Private->GraphicsOutput;\r
@@ -471,22 +514,16 @@ CirrusLogic5430GraphicsOutputConstructor (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
-  Private->GraphicsOutput.Mode->MaxMode = CIRRUS_LOGIC_5430_MODE_COUNT;\r
-  Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;\r
-  for (Index = 0; Index < Private->GraphicsOutput.Mode->MaxMode; Index++) {\r
-    Private->ModeData[Index].HorizontalResolution = CirrusLogic5430VideoModes[Index].Width;\r
-    Private->ModeData[Index].VerticalResolution   = CirrusLogic5430VideoModes[Index].Height;\r
-    Private->ModeData[Index].ColorDepth           = 32;\r
-    Private->ModeData[Index].RefreshRate          = CirrusLogic5430VideoModes[Index].RefreshRate;\r
-  }\r
-\r
-  Private->HardwareNeedsStarting  = TRUE;\r
-  Private->LineBuffer             = NULL;\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
 \r
   //\r
   // Initialize the hardware\r
   //\r
   GraphicsOutput->SetMode (GraphicsOutput, 0);\r
+  ASSERT (Private->GraphicsOutput.Mode->Mode < CIRRUS_LOGIC_5430_MODE_COUNT);\r
   DrawLogo (\r
     Private,\r
     Private->ModeData[Private->GraphicsOutput.Mode->Mode].HorizontalResolution,\r