3 Copyright (c) 2011, ARM Ltd. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include <Library/DebugLib.h>
17 #include <Library/IoLib.h>
18 #include <Library/LcdPlatformLib.h>
19 #include <Library/UefiBootServicesTableLib.h>
21 #include <Protocol/EdidDiscovered.h>
22 #include <Protocol/EdidActive.h>
24 #include <Drivers/PL111Lcd.h>
26 #include <ArmPlatform.h>
30 UINT32 HorizontalResolution
;
31 UINT32 VerticalResolution
;
44 CLCD_RESOLUTION mResolutions
[] = {
45 { // Mode 0 : VGA : 640 x 480 x 24 bpp
46 VGA
, VGA_H_RES_PIXELS
, VGA_V_RES_PIXELS
, LCD_BITS_PER_PIXEL_24
, 0x2C77,
47 VGA_H_SYNC
, VGA_H_BACK_PORCH
, VGA_H_FRONT_PORCH
,
48 VGA_V_SYNC
, VGA_V_BACK_PORCH
, VGA_V_FRONT_PORCH
50 { // Mode 1 : SVGA : 800 x 600 x 24 bpp
51 SVGA
, SVGA_H_RES_PIXELS
, SVGA_V_RES_PIXELS
, LCD_BITS_PER_PIXEL_24
, 0x2CAC,
52 SVGA_H_SYNC
, SVGA_H_BACK_PORCH
, SVGA_H_FRONT_PORCH
,
53 SVGA_V_SYNC
, SVGA_V_BACK_PORCH
, SVGA_V_FRONT_PORCH
57 EFI_EDID_DISCOVERED_PROTOCOL mEdidDiscovered
= {
62 EFI_EDID_ACTIVE_PROTOCOL mEdidActive
= {
68 LcdPlatformInitializeDisplay (
74 MmioWrite32(ARM_EB_SYS_CLCD_REG
, 1);
76 // Install the EDID Protocols
77 Status
= gBS
->InstallMultipleProtocolInterfaces(
79 &gEfiEdidDiscoveredProtocolGuid
, &mEdidDiscovered
,
80 &gEfiEdidActiveProtocolGuid
, &mEdidActive
,
89 OUT EFI_PHYSICAL_ADDRESS
* VramBaseAddress
,
93 *VramBaseAddress
= PL111_CLCD_VRAM_BASE
;
94 *VramSize
= SIZE_8MB
; //FIXME: Can this size change ?
99 LcdPlatformGetMaxMode (
103 return (sizeof(mResolutions
) / sizeof(CLCD_RESOLUTION
));
111 if (ModeNumber
>= LcdPlatformGetMaxMode ()) {
112 return EFI_INVALID_PARAMETER
;
115 MmioWrite32(ARM_EB_SYS_LOCK_REG
,0x0000A05F);
116 MmioWrite32(ARM_EB_SYS_OSC4_REG
,mResolutions
[ModeNumber
].ClcdClk
);
117 MmioWrite32(ARM_EB_SYS_LOCK_REG
,0x0);
123 LcdPlatformQueryMode (
124 IN UINT32 ModeNumber
,
125 OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
*Info
130 if (ModeNumber
>= LcdPlatformGetMaxMode ()) {
131 return EFI_INVALID_PARAMETER
;
134 Status
= EFI_UNSUPPORTED
;
137 Info
->HorizontalResolution
= mResolutions
[ModeNumber
].HorizontalResolution
;
138 Info
->VerticalResolution
= mResolutions
[ModeNumber
].VerticalResolution
;
139 Info
->PixelsPerScanLine
= mResolutions
[ModeNumber
].HorizontalResolution
;
141 switch (mResolutions
[ModeNumber
].Bpp
) {
142 case LCD_BITS_PER_PIXEL_24
:
143 Info
->PixelFormat
= PixelRedGreenBlueReserved8BitPerColor
;
144 Info
->PixelInformation
.RedMask
= LCD_24BPP_RED_MASK
;
145 Info
->PixelInformation
.GreenMask
= LCD_24BPP_GREEN_MASK
;
146 Info
->PixelInformation
.BlueMask
= LCD_24BPP_BLUE_MASK
;
147 Info
->PixelInformation
.ReservedMask
= LCD_24BPP_RESERVED_MASK
;
148 Status
= EFI_SUCCESS
;
151 case LCD_BITS_PER_PIXEL_16_555
:
152 Info
->PixelFormat
= PixelBitMask
;
153 Info
->PixelInformation
.RedMask
= LCD_16BPP_555_RED_MASK
;
154 Info
->PixelInformation
.GreenMask
= LCD_16BPP_555_GREEN_MASK
;
155 Info
->PixelInformation
.BlueMask
= LCD_16BPP_555_BLUE_MASK
;
156 Info
->PixelInformation
.ReservedMask
= LCD_16BPP_555_RESERVED_MASK
;
157 Status
= EFI_SUCCESS
;
160 case LCD_BITS_PER_PIXEL_16_565
:
161 Info
->PixelFormat
= PixelBitMask
;
162 Info
->PixelInformation
.RedMask
= LCD_16BPP_565_RED_MASK
;
163 Info
->PixelInformation
.GreenMask
= LCD_16BPP_565_GREEN_MASK
;
164 Info
->PixelInformation
.BlueMask
= LCD_16BPP_565_BLUE_MASK
;
165 Info
->PixelInformation
.ReservedMask
= LCD_16BPP_565_RESERVED_MASK
;
166 Status
= EFI_SUCCESS
;
169 case LCD_BITS_PER_PIXEL_12_444
:
170 Info
->PixelFormat
= PixelBitMask
;
171 Info
->PixelInformation
.RedMask
= LCD_12BPP_444_RED_MASK
;
172 Info
->PixelInformation
.GreenMask
= LCD_12BPP_444_GREEN_MASK
;
173 Info
->PixelInformation
.BlueMask
= LCD_12BPP_444_BLUE_MASK
;
174 Info
->PixelInformation
.ReservedMask
= LCD_12BPP_444_RESERVED_MASK
;
175 Status
= EFI_SUCCESS
;
178 case LCD_BITS_PER_PIXEL_8
:
179 case LCD_BITS_PER_PIXEL_4
:
180 case LCD_BITS_PER_PIXEL_2
:
181 case LCD_BITS_PER_PIXEL_1
:
183 // These are not supported
191 LcdPlatformGetTimings (
192 IN UINT32 ModeNumber
,
195 OUT UINT32
* HBackPorch
,
196 OUT UINT32
* HFrontPorch
,
199 OUT UINT32
* VBackPorch
,
200 OUT UINT32
* VFrontPorch
203 if (ModeNumber
>= LcdPlatformGetMaxMode ()) {
204 return EFI_INVALID_PARAMETER
;
207 *HRes
= mResolutions
[ModeNumber
].HorizontalResolution
;
208 *HSync
= mResolutions
[ModeNumber
].HSync
;
209 *HBackPorch
= mResolutions
[ModeNumber
].HBackPorch
;
210 *HFrontPorch
= mResolutions
[ModeNumber
].HFrontPorch
;
211 *VRes
= mResolutions
[ModeNumber
].VerticalResolution
;
212 *VSync
= mResolutions
[ModeNumber
].VSync
;
213 *VBackPorch
= mResolutions
[ModeNumber
].VBackPorch
;
214 *VFrontPorch
= mResolutions
[ModeNumber
].VFrontPorch
;
221 IN UINT32 ModeNumber
,
225 if (ModeNumber
>= LcdPlatformGetMaxMode ()) {
226 return EFI_INVALID_PARAMETER
;
229 *Bpp
= mResolutions
[ModeNumber
].Bpp
;