+/** @file\r
+\r
+ Copyright (c) 2011, ARM Ltd. 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
+ 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
+**/\r
+\r
+#include <PiDxe.h>\r
+\r
+#include <Library/LcdPlatformLib.h>\r
+#include <Library/IoLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+#include <Drivers/PL111Lcd.h>\r
+\r
+#include <ArmPlatform.h>\r
+\r
+typedef struct {\r
+ UINT32 Mode;\r
+ UINT32 HorizontalResolution;\r
+ UINT32 VerticalResolution;\r
+ LCD_BPP Bpp;\r
+ UINT32 ClcdClk;\r
+\r
+ UINT32 HSync;\r
+ UINT32 HBackPorch;\r
+ UINT32 HFrontPorch;\r
+ UINT32 VSync;\r
+ UINT32 VBackPorch;\r
+ UINT32 VFrontPorch;\r
+} CLCD_RESOLUTION;\r
+\r
+\r
+CLCD_RESOLUTION mResolutions[] = {\r
+ { // Mode 0 : VGA : 640 x 480 x 24 bpp\r
+ VGA, VGA_H_RES_PIXELS, VGA_V_RES_PIXELS, LCD_BITS_PER_PIXEL_24, 0x2C77,\r
+ VGA_H_SYNC, VGA_H_BACK_PORCH, VGA_H_FRONT_PORCH,\r
+ VGA_V_SYNC, VGA_V_BACK_PORCH, VGA_V_FRONT_PORCH\r
+ },\r
+ { // Mode 1 : SVGA : 800 x 600 x 24 bpp\r
+ SVGA, SVGA_H_RES_PIXELS, SVGA_V_RES_PIXELS, LCD_BITS_PER_PIXEL_24, 0x2CAC,\r
+ SVGA_H_SYNC, SVGA_H_BACK_PORCH, SVGA_H_FRONT_PORCH,\r
+ SVGA_V_SYNC, SVGA_V_BACK_PORCH, SVGA_V_FRONT_PORCH\r
+ }\r
+};\r
+\r
+\r
+EFI_STATUS\r
+LcdPlatformInitializeDisplay (\r
+ VOID\r
+ )\r
+{\r
+ MmioWrite32(ARM_EB_SYS_CLCD_REG, 1);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+LcdPlatformGetVram (\r
+ OUT EFI_PHYSICAL_ADDRESS* VramBaseAddress,\r
+ OUT UINTN* VramSize\r
+ )\r
+{\r
+ *VramBaseAddress = PL111_CLCD_VRAM_BASE;\r
+ *VramSize = SIZE_8MB; //FIXME: Can this size change ?\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+UINT32\r
+LcdPlatformGetMaxMode (\r
+ VOID\r
+ )\r
+{\r
+ return (sizeof(mResolutions) / sizeof(CLCD_RESOLUTION));\r
+}\r
+\r
+EFI_STATUS\r
+LcdPlatformSetMode (\r
+ IN UINT32 ModeNumber\r
+ )\r
+{\r
+ if (ModeNumber >= LcdPlatformGetMaxMode ()) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ MmioWrite32(ARM_EB_SYS_LOCK_REG,0x0000A05F);\r
+ MmioWrite32(ARM_EB_SYS_OSC4_REG,mResolutions[ModeNumber].ClcdClk);\r
+ MmioWrite32(ARM_EB_SYS_LOCK_REG,0x0);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+LcdPlatformQueryMode (\r
+ IN UINT32 ModeNumber,\r
+ OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ if (ModeNumber >= LcdPlatformGetMaxMode ()) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Status = EFI_UNSUPPORTED;\r
+\r
+ Info->Version = 0;\r
+ Info->HorizontalResolution = mResolutions[ModeNumber].HorizontalResolution;\r
+ Info->VerticalResolution = mResolutions[ModeNumber].VerticalResolution;\r
+ Info->PixelsPerScanLine = mResolutions[ModeNumber].HorizontalResolution;\r
+\r
+ switch (mResolutions[ModeNumber].Bpp) {\r
+ case LCD_BITS_PER_PIXEL_24:\r
+ Info->PixelFormat = PixelRedGreenBlueReserved8BitPerColor;\r
+ Info->PixelInformation.RedMask = LCD_24BPP_RED_MASK;\r
+ Info->PixelInformation.GreenMask = LCD_24BPP_GREEN_MASK;\r
+ Info->PixelInformation.BlueMask = LCD_24BPP_BLUE_MASK;\r
+ Info->PixelInformation.ReservedMask = LCD_24BPP_RESERVED_MASK;\r
+ Status = EFI_SUCCESS;\r
+ break;\r
+\r
+ case LCD_BITS_PER_PIXEL_16_555:\r
+ Info->PixelFormat = PixelBitMask;\r
+ Info->PixelInformation.RedMask = LCD_16BPP_555_RED_MASK;\r
+ Info->PixelInformation.GreenMask = LCD_16BPP_555_GREEN_MASK;\r
+ Info->PixelInformation.BlueMask = LCD_16BPP_555_BLUE_MASK;\r
+ Info->PixelInformation.ReservedMask = LCD_16BPP_555_RESERVED_MASK;\r
+ Status = EFI_SUCCESS;\r
+ break;\r
+\r
+ case LCD_BITS_PER_PIXEL_16_565:\r
+ Info->PixelFormat = PixelBitMask;\r
+ Info->PixelInformation.RedMask = LCD_16BPP_565_RED_MASK;\r
+ Info->PixelInformation.GreenMask = LCD_16BPP_565_GREEN_MASK;\r
+ Info->PixelInformation.BlueMask = LCD_16BPP_565_BLUE_MASK;\r
+ Info->PixelInformation.ReservedMask = LCD_16BPP_565_RESERVED_MASK;\r
+ Status = EFI_SUCCESS;\r
+ break;\r
+\r
+ case LCD_BITS_PER_PIXEL_12_444:\r
+ Info->PixelFormat = PixelBitMask;\r
+ Info->PixelInformation.RedMask = LCD_12BPP_444_RED_MASK;\r
+ Info->PixelInformation.GreenMask = LCD_12BPP_444_GREEN_MASK;\r
+ Info->PixelInformation.BlueMask = LCD_12BPP_444_BLUE_MASK;\r
+ Info->PixelInformation.ReservedMask = LCD_12BPP_444_RESERVED_MASK;\r
+ Status = EFI_SUCCESS;\r
+ break;\r
+\r
+ case LCD_BITS_PER_PIXEL_8:\r
+ case LCD_BITS_PER_PIXEL_4:\r
+ case LCD_BITS_PER_PIXEL_2:\r
+ case LCD_BITS_PER_PIXEL_1:\r
+ default:\r
+ // These are not supported\r
+ break;\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+EFI_STATUS\r
+LcdPlatformGetTimings (\r
+ IN UINT32 ModeNumber,\r
+ OUT UINT32* HRes,\r
+ OUT UINT32* HSync,\r
+ OUT UINT32* HBackPorch,\r
+ OUT UINT32* HFrontPorch,\r
+ OUT UINT32* VRes,\r
+ OUT UINT32* VSync,\r
+ OUT UINT32* VBackPorch,\r
+ OUT UINT32* VFrontPorch\r
+ )\r
+{\r
+ if (ModeNumber >= LcdPlatformGetMaxMode ()) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *HRes = mResolutions[ModeNumber].HorizontalResolution;\r
+ *HSync = mResolutions[ModeNumber].HSync;\r
+ *HBackPorch = mResolutions[ModeNumber].HBackPorch;\r
+ *HFrontPorch = mResolutions[ModeNumber].HFrontPorch;\r
+ *VRes = mResolutions[ModeNumber].VerticalResolution;\r
+ *VSync = mResolutions[ModeNumber].VSync;\r
+ *VBackPorch = mResolutions[ModeNumber].VBackPorch;\r
+ *VFrontPorch = mResolutions[ModeNumber].VFrontPorch;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+LcdPlatformGetBpp (\r
+ IN UINT32 ModeNumber,\r
+ OUT LCD_BPP * Bpp\r
+ )\r
+{\r
+ if (ModeNumber >= LcdPlatformGetMaxMode ()) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *Bpp = mResolutions[ModeNumber].Bpp;\r
+\r
+ return EFI_SUCCESS;\r
+}\r