]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPlatformPkg/ArmRealViewEbPkg/Library/PL111LcdArmRealViewEbLib/PL111LcdArmRealViewEb.c
ArmPlatformPkg/LcdPlatformLib: Produce the protocols EFI_EDID_DISCOVERED_PROTOCOL...
[mirror_edk2.git] / ArmPlatformPkg / ArmRealViewEbPkg / Library / PL111LcdArmRealViewEbLib / PL111LcdArmRealViewEb.c
CommitLineData
9bc6ef02 1/** @file\r
2\r
3 Copyright (c) 2011, ARM Ltd. All rights reserved.<BR>\r
4 This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution. The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php\r
8\r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12**/\r
13\r
14#include <PiDxe.h>\r
15\r
9bc6ef02 16#include <Library/DebugLib.h>\r
6d8d7363 17#include <Library/IoLib.h>\r
18#include <Library/LcdPlatformLib.h>\r
19#include <Library/UefiBootServicesTableLib.h>\r
20\r
21#include <Protocol/EdidDiscovered.h>\r
22#include <Protocol/EdidActive.h>\r
9bc6ef02 23\r
24#include <Drivers/PL111Lcd.h>\r
25\r
26#include <ArmPlatform.h>\r
27\r
28typedef struct {\r
29 UINT32 Mode;\r
30 UINT32 HorizontalResolution;\r
31 UINT32 VerticalResolution;\r
32 LCD_BPP Bpp;\r
33 UINT32 ClcdClk;\r
34\r
35 UINT32 HSync;\r
36 UINT32 HBackPorch;\r
37 UINT32 HFrontPorch;\r
38 UINT32 VSync;\r
39 UINT32 VBackPorch;\r
40 UINT32 VFrontPorch;\r
41} CLCD_RESOLUTION;\r
42\r
43\r
44CLCD_RESOLUTION mResolutions[] = {\r
45 { // Mode 0 : VGA : 640 x 480 x 24 bpp\r
46 VGA, VGA_H_RES_PIXELS, VGA_V_RES_PIXELS, LCD_BITS_PER_PIXEL_24, 0x2C77,\r
47 VGA_H_SYNC, VGA_H_BACK_PORCH, VGA_H_FRONT_PORCH,\r
48 VGA_V_SYNC, VGA_V_BACK_PORCH, VGA_V_FRONT_PORCH\r
49 },\r
50 { // Mode 1 : SVGA : 800 x 600 x 24 bpp\r
51 SVGA, SVGA_H_RES_PIXELS, SVGA_V_RES_PIXELS, LCD_BITS_PER_PIXEL_24, 0x2CAC,\r
52 SVGA_H_SYNC, SVGA_H_BACK_PORCH, SVGA_H_FRONT_PORCH,\r
53 SVGA_V_SYNC, SVGA_V_BACK_PORCH, SVGA_V_FRONT_PORCH\r
54 }\r
55};\r
56\r
6d8d7363 57EFI_EDID_DISCOVERED_PROTOCOL mEdidDiscovered = {\r
58 0,\r
59 NULL\r
60};\r
61\r
62EFI_EDID_ACTIVE_PROTOCOL mEdidActive = {\r
63 0,\r
64 NULL\r
65};\r
9bc6ef02 66\r
67EFI_STATUS\r
68LcdPlatformInitializeDisplay (\r
6d8d7363 69 IN EFI_HANDLE Handle\r
9bc6ef02 70 )\r
71{\r
6d8d7363 72 EFI_STATUS Status;\r
73\r
9bc6ef02 74 MmioWrite32(ARM_EB_SYS_CLCD_REG, 1);\r
75\r
6d8d7363 76 // Install the EDID Protocols\r
77 Status = gBS->InstallMultipleProtocolInterfaces(\r
78 &Handle,\r
79 &gEfiEdidDiscoveredProtocolGuid, &mEdidDiscovered,\r
80 &gEfiEdidActiveProtocolGuid, &mEdidActive,\r
81 NULL\r
82 );\r
83\r
9bc6ef02 84 return EFI_SUCCESS;\r
85}\r
86\r
87EFI_STATUS\r
88LcdPlatformGetVram (\r
89 OUT EFI_PHYSICAL_ADDRESS* VramBaseAddress,\r
90 OUT UINTN* VramSize\r
91 )\r
92{\r
93 *VramBaseAddress = PL111_CLCD_VRAM_BASE;\r
94 *VramSize = SIZE_8MB; //FIXME: Can this size change ?\r
95 return EFI_SUCCESS;\r
96}\r
97\r
98UINT32\r
99LcdPlatformGetMaxMode (\r
100 VOID\r
101 )\r
102{\r
103 return (sizeof(mResolutions) / sizeof(CLCD_RESOLUTION));\r
104}\r
105\r
106EFI_STATUS\r
107LcdPlatformSetMode (\r
108 IN UINT32 ModeNumber\r
109 )\r
110{\r
111 if (ModeNumber >= LcdPlatformGetMaxMode ()) {\r
112 return EFI_INVALID_PARAMETER;\r
113 }\r
114\r
115 MmioWrite32(ARM_EB_SYS_LOCK_REG,0x0000A05F);\r
116 MmioWrite32(ARM_EB_SYS_OSC4_REG,mResolutions[ModeNumber].ClcdClk);\r
117 MmioWrite32(ARM_EB_SYS_LOCK_REG,0x0);\r
118\r
119 return EFI_SUCCESS;\r
120}\r
121\r
122EFI_STATUS\r
123LcdPlatformQueryMode (\r
124 IN UINT32 ModeNumber,\r
125 OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info\r
126 )\r
127{\r
128 EFI_STATUS Status;\r
129\r
130 if (ModeNumber >= LcdPlatformGetMaxMode ()) {\r
131 return EFI_INVALID_PARAMETER;\r
132 }\r
133\r
134 Status = EFI_UNSUPPORTED;\r
135\r
136 Info->Version = 0;\r
137 Info->HorizontalResolution = mResolutions[ModeNumber].HorizontalResolution;\r
138 Info->VerticalResolution = mResolutions[ModeNumber].VerticalResolution;\r
139 Info->PixelsPerScanLine = mResolutions[ModeNumber].HorizontalResolution;\r
140\r
141 switch (mResolutions[ModeNumber].Bpp) {\r
142 case LCD_BITS_PER_PIXEL_24:\r
143 Info->PixelFormat = PixelRedGreenBlueReserved8BitPerColor;\r
144 Info->PixelInformation.RedMask = LCD_24BPP_RED_MASK;\r
145 Info->PixelInformation.GreenMask = LCD_24BPP_GREEN_MASK;\r
146 Info->PixelInformation.BlueMask = LCD_24BPP_BLUE_MASK;\r
147 Info->PixelInformation.ReservedMask = LCD_24BPP_RESERVED_MASK;\r
148 Status = EFI_SUCCESS;\r
149 break;\r
150\r
151 case LCD_BITS_PER_PIXEL_16_555:\r
152 Info->PixelFormat = PixelBitMask;\r
153 Info->PixelInformation.RedMask = LCD_16BPP_555_RED_MASK;\r
154 Info->PixelInformation.GreenMask = LCD_16BPP_555_GREEN_MASK;\r
155 Info->PixelInformation.BlueMask = LCD_16BPP_555_BLUE_MASK;\r
156 Info->PixelInformation.ReservedMask = LCD_16BPP_555_RESERVED_MASK;\r
157 Status = EFI_SUCCESS;\r
158 break;\r
159\r
160 case LCD_BITS_PER_PIXEL_16_565:\r
161 Info->PixelFormat = PixelBitMask;\r
162 Info->PixelInformation.RedMask = LCD_16BPP_565_RED_MASK;\r
163 Info->PixelInformation.GreenMask = LCD_16BPP_565_GREEN_MASK;\r
164 Info->PixelInformation.BlueMask = LCD_16BPP_565_BLUE_MASK;\r
165 Info->PixelInformation.ReservedMask = LCD_16BPP_565_RESERVED_MASK;\r
166 Status = EFI_SUCCESS;\r
167 break;\r
168\r
169 case LCD_BITS_PER_PIXEL_12_444:\r
170 Info->PixelFormat = PixelBitMask;\r
171 Info->PixelInformation.RedMask = LCD_12BPP_444_RED_MASK;\r
172 Info->PixelInformation.GreenMask = LCD_12BPP_444_GREEN_MASK;\r
173 Info->PixelInformation.BlueMask = LCD_12BPP_444_BLUE_MASK;\r
174 Info->PixelInformation.ReservedMask = LCD_12BPP_444_RESERVED_MASK;\r
175 Status = EFI_SUCCESS;\r
176 break;\r
177\r
178 case LCD_BITS_PER_PIXEL_8:\r
179 case LCD_BITS_PER_PIXEL_4:\r
180 case LCD_BITS_PER_PIXEL_2:\r
181 case LCD_BITS_PER_PIXEL_1:\r
182 default:\r
183 // These are not supported\r
184 break;\r
185 }\r
186\r
187 return Status;\r
188}\r
189\r
190EFI_STATUS\r
191LcdPlatformGetTimings (\r
192 IN UINT32 ModeNumber,\r
193 OUT UINT32* HRes,\r
194 OUT UINT32* HSync,\r
195 OUT UINT32* HBackPorch,\r
196 OUT UINT32* HFrontPorch,\r
197 OUT UINT32* VRes,\r
198 OUT UINT32* VSync,\r
199 OUT UINT32* VBackPorch,\r
200 OUT UINT32* VFrontPorch\r
201 )\r
202{\r
203 if (ModeNumber >= LcdPlatformGetMaxMode ()) {\r
204 return EFI_INVALID_PARAMETER;\r
205 }\r
206\r
207 *HRes = mResolutions[ModeNumber].HorizontalResolution;\r
208 *HSync = mResolutions[ModeNumber].HSync;\r
209 *HBackPorch = mResolutions[ModeNumber].HBackPorch;\r
210 *HFrontPorch = mResolutions[ModeNumber].HFrontPorch;\r
211 *VRes = mResolutions[ModeNumber].VerticalResolution;\r
212 *VSync = mResolutions[ModeNumber].VSync;\r
213 *VBackPorch = mResolutions[ModeNumber].VBackPorch;\r
214 *VFrontPorch = mResolutions[ModeNumber].VFrontPorch;\r
215\r
216 return EFI_SUCCESS;\r
217}\r
218\r
219EFI_STATUS\r
220LcdPlatformGetBpp (\r
221 IN UINT32 ModeNumber,\r
222 OUT LCD_BPP * Bpp\r
223 )\r
224{\r
225 if (ModeNumber >= LcdPlatformGetMaxMode ()) {\r
226 return EFI_INVALID_PARAMETER;\r
227 }\r
228\r
229 *Bpp = mResolutions[ModeNumber].Bpp;\r
230\r
231 return EFI_SUCCESS;\r
232}\r