]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPlatformPkg/ArmRealViewEbPkg/Library/PL111LcdArmRealViewEbLib/PL111LcdArmRealViewEb.c
ArmPlatformPkg/ArmRealViewEb: Add support for PL111 Lcd controller
[mirror_edk2.git] / ArmPlatformPkg / ArmRealViewEbPkg / Library / PL111LcdArmRealViewEbLib / PL111LcdArmRealViewEb.c
1 /** @file
2
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
8
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.
11
12 **/
13
14 #include <PiDxe.h>
15
16 #include <Library/LcdPlatformLib.h>
17 #include <Library/IoLib.h>
18 #include <Library/DebugLib.h>
19
20 #include <Drivers/PL111Lcd.h>
21
22 #include <ArmPlatform.h>
23
24 typedef struct {
25 UINT32 Mode;
26 UINT32 HorizontalResolution;
27 UINT32 VerticalResolution;
28 LCD_BPP Bpp;
29 UINT32 ClcdClk;
30
31 UINT32 HSync;
32 UINT32 HBackPorch;
33 UINT32 HFrontPorch;
34 UINT32 VSync;
35 UINT32 VBackPorch;
36 UINT32 VFrontPorch;
37 } CLCD_RESOLUTION;
38
39
40 CLCD_RESOLUTION mResolutions[] = {
41 { // Mode 0 : VGA : 640 x 480 x 24 bpp
42 VGA, VGA_H_RES_PIXELS, VGA_V_RES_PIXELS, LCD_BITS_PER_PIXEL_24, 0x2C77,
43 VGA_H_SYNC, VGA_H_BACK_PORCH, VGA_H_FRONT_PORCH,
44 VGA_V_SYNC, VGA_V_BACK_PORCH, VGA_V_FRONT_PORCH
45 },
46 { // Mode 1 : SVGA : 800 x 600 x 24 bpp
47 SVGA, SVGA_H_RES_PIXELS, SVGA_V_RES_PIXELS, LCD_BITS_PER_PIXEL_24, 0x2CAC,
48 SVGA_H_SYNC, SVGA_H_BACK_PORCH, SVGA_H_FRONT_PORCH,
49 SVGA_V_SYNC, SVGA_V_BACK_PORCH, SVGA_V_FRONT_PORCH
50 }
51 };
52
53
54 EFI_STATUS
55 LcdPlatformInitializeDisplay (
56 VOID
57 )
58 {
59 MmioWrite32(ARM_EB_SYS_CLCD_REG, 1);
60
61 return EFI_SUCCESS;
62 }
63
64 EFI_STATUS
65 LcdPlatformGetVram (
66 OUT EFI_PHYSICAL_ADDRESS* VramBaseAddress,
67 OUT UINTN* VramSize
68 )
69 {
70 *VramBaseAddress = PL111_CLCD_VRAM_BASE;
71 *VramSize = SIZE_8MB; //FIXME: Can this size change ?
72 return EFI_SUCCESS;
73 }
74
75 UINT32
76 LcdPlatformGetMaxMode (
77 VOID
78 )
79 {
80 return (sizeof(mResolutions) / sizeof(CLCD_RESOLUTION));
81 }
82
83 EFI_STATUS
84 LcdPlatformSetMode (
85 IN UINT32 ModeNumber
86 )
87 {
88 if (ModeNumber >= LcdPlatformGetMaxMode ()) {
89 return EFI_INVALID_PARAMETER;
90 }
91
92 MmioWrite32(ARM_EB_SYS_LOCK_REG,0x0000A05F);
93 MmioWrite32(ARM_EB_SYS_OSC4_REG,mResolutions[ModeNumber].ClcdClk);
94 MmioWrite32(ARM_EB_SYS_LOCK_REG,0x0);
95
96 return EFI_SUCCESS;
97 }
98
99 EFI_STATUS
100 LcdPlatformQueryMode (
101 IN UINT32 ModeNumber,
102 OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info
103 )
104 {
105 EFI_STATUS Status;
106
107 if (ModeNumber >= LcdPlatformGetMaxMode ()) {
108 return EFI_INVALID_PARAMETER;
109 }
110
111 Status = EFI_UNSUPPORTED;
112
113 Info->Version = 0;
114 Info->HorizontalResolution = mResolutions[ModeNumber].HorizontalResolution;
115 Info->VerticalResolution = mResolutions[ModeNumber].VerticalResolution;
116 Info->PixelsPerScanLine = mResolutions[ModeNumber].HorizontalResolution;
117
118 switch (mResolutions[ModeNumber].Bpp) {
119 case LCD_BITS_PER_PIXEL_24:
120 Info->PixelFormat = PixelRedGreenBlueReserved8BitPerColor;
121 Info->PixelInformation.RedMask = LCD_24BPP_RED_MASK;
122 Info->PixelInformation.GreenMask = LCD_24BPP_GREEN_MASK;
123 Info->PixelInformation.BlueMask = LCD_24BPP_BLUE_MASK;
124 Info->PixelInformation.ReservedMask = LCD_24BPP_RESERVED_MASK;
125 Status = EFI_SUCCESS;
126 break;
127
128 case LCD_BITS_PER_PIXEL_16_555:
129 Info->PixelFormat = PixelBitMask;
130 Info->PixelInformation.RedMask = LCD_16BPP_555_RED_MASK;
131 Info->PixelInformation.GreenMask = LCD_16BPP_555_GREEN_MASK;
132 Info->PixelInformation.BlueMask = LCD_16BPP_555_BLUE_MASK;
133 Info->PixelInformation.ReservedMask = LCD_16BPP_555_RESERVED_MASK;
134 Status = EFI_SUCCESS;
135 break;
136
137 case LCD_BITS_PER_PIXEL_16_565:
138 Info->PixelFormat = PixelBitMask;
139 Info->PixelInformation.RedMask = LCD_16BPP_565_RED_MASK;
140 Info->PixelInformation.GreenMask = LCD_16BPP_565_GREEN_MASK;
141 Info->PixelInformation.BlueMask = LCD_16BPP_565_BLUE_MASK;
142 Info->PixelInformation.ReservedMask = LCD_16BPP_565_RESERVED_MASK;
143 Status = EFI_SUCCESS;
144 break;
145
146 case LCD_BITS_PER_PIXEL_12_444:
147 Info->PixelFormat = PixelBitMask;
148 Info->PixelInformation.RedMask = LCD_12BPP_444_RED_MASK;
149 Info->PixelInformation.GreenMask = LCD_12BPP_444_GREEN_MASK;
150 Info->PixelInformation.BlueMask = LCD_12BPP_444_BLUE_MASK;
151 Info->PixelInformation.ReservedMask = LCD_12BPP_444_RESERVED_MASK;
152 Status = EFI_SUCCESS;
153 break;
154
155 case LCD_BITS_PER_PIXEL_8:
156 case LCD_BITS_PER_PIXEL_4:
157 case LCD_BITS_PER_PIXEL_2:
158 case LCD_BITS_PER_PIXEL_1:
159 default:
160 // These are not supported
161 break;
162 }
163
164 return Status;
165 }
166
167 EFI_STATUS
168 LcdPlatformGetTimings (
169 IN UINT32 ModeNumber,
170 OUT UINT32* HRes,
171 OUT UINT32* HSync,
172 OUT UINT32* HBackPorch,
173 OUT UINT32* HFrontPorch,
174 OUT UINT32* VRes,
175 OUT UINT32* VSync,
176 OUT UINT32* VBackPorch,
177 OUT UINT32* VFrontPorch
178 )
179 {
180 if (ModeNumber >= LcdPlatformGetMaxMode ()) {
181 return EFI_INVALID_PARAMETER;
182 }
183
184 *HRes = mResolutions[ModeNumber].HorizontalResolution;
185 *HSync = mResolutions[ModeNumber].HSync;
186 *HBackPorch = mResolutions[ModeNumber].HBackPorch;
187 *HFrontPorch = mResolutions[ModeNumber].HFrontPorch;
188 *VRes = mResolutions[ModeNumber].VerticalResolution;
189 *VSync = mResolutions[ModeNumber].VSync;
190 *VBackPorch = mResolutions[ModeNumber].VBackPorch;
191 *VFrontPorch = mResolutions[ModeNumber].VFrontPorch;
192
193 return EFI_SUCCESS;
194 }
195
196 EFI_STATUS
197 LcdPlatformGetBpp (
198 IN UINT32 ModeNumber,
199 OUT LCD_BPP * Bpp
200 )
201 {
202 if (ModeNumber >= LcdPlatformGetMaxMode ()) {
203 return EFI_INVALID_PARAMETER;
204 }
205
206 *Bpp = mResolutions[ModeNumber].Bpp;
207
208 return EFI_SUCCESS;
209 }