-/*++\r
+/** @file\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
-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
\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
\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
\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
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
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
\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
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
{\r
EFI_STATUS Status;\r
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- UINTN Index;\r
\r
\r
GraphicsOutput = &Private->GraphicsOutput;\r
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