]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSysConfigLib/ArmVExpressSysConfig.c
ArmPlatformPkg/ArmPlatformSysConfigLib: Add function 'ArmPlatformSysConfigGetValues'
[mirror_edk2.git] / ArmPlatformPkg / ArmVExpressPkg / Library / ArmVExpressSysConfigLib / ArmVExpressSysConfig.c
1 /** @file SysCfgArmVExpress.c
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 #include <Library/IoLib.h>
16 #include <Library/DebugLib.h>
17
18 #include <Library/ArmPlatformSysConfigLib.h>
19 #include <ArmPlatform.h>
20
21 //
22 // SYS_CFGCTRL Bits
23 //
24 #define SYS_CFGCTRL_START BIT31
25 #define SYS_CFGCTRL_READ (0 << 30)
26 #define SYS_CFGCTRL_WRITE (1 << 30)
27 #define SYS_CFGCTRL_FUNCTION(fun) (((fun ) & 0x3F) << 20)
28 #define SYS_CFGCTRL_SITE(site) (((site) & 0x3) << 16)
29 #define SYS_CFGCTRL_POSITION(pos) (((pos ) & 0xF) << 12)
30 #define SYS_CFGCTRL_DEVICE(dev) ((dev ) & 0xFFF)
31
32 //
33 // SYS_CFGSTAT Bits
34 //
35 #define SYS_CFGSTAT_ERROR BIT1
36 #define SYS_CFGSTAT_COMPLETE BIT0
37
38 /****************************************************************************
39 *
40 * This file makes it easier to access the System Configuration Registers
41 * in the ARM Versatile Express motherboard.
42 *
43 ****************************************************************************/
44
45 EFI_STATUS
46 ArmPlatformSysConfigInitialize (
47 VOID
48 )
49 {
50 return EFI_SUCCESS;
51 }
52
53 /***************************************
54 * GENERAL FUNCTION: AccessSysCfgRegister
55 * Interacts with
56 * SYS_CFGSTAT
57 * SYS_CFGDATA
58 * SYS_CFGCTRL
59 * for setting and for reading out values
60 ***************************************/
61
62 EFI_STATUS
63 AccessSysCfgRegister (
64 IN UINT32 ReadWrite,
65 IN UINT32 Function,
66 IN UINT32 Site,
67 IN UINT32 Position,
68 IN UINT32 Device,
69 IN OUT UINT32* Data
70 )
71 {
72 UINT32 SysCfgCtrl;
73
74 // Clear the COMPLETE bit
75 MmioAnd32(ARM_VE_SYS_CFGSTAT_REG, ~SYS_CFGSTAT_COMPLETE);
76
77 // If writing, then set the data value
78 if(ReadWrite == SYS_CFGCTRL_WRITE) {
79 MmioWrite32(ARM_VE_SYS_CFGDATA_REG, *Data);
80 }
81
82 // Set the control value
83 SysCfgCtrl = SYS_CFGCTRL_START | ReadWrite | SYS_CFGCTRL_FUNCTION(Function) | SYS_CFGCTRL_SITE(Site) |
84 SYS_CFGCTRL_POSITION(Position) | SYS_CFGCTRL_DEVICE(Device);
85 MmioWrite32(ARM_VE_SYS_CFGCTRL_REG, SysCfgCtrl);
86
87 // Wait until the COMPLETE bit is set
88 while ((MmioRead32(ARM_VE_SYS_CFGSTAT_REG) & SYS_CFGSTAT_COMPLETE) == 0);
89
90 // Check for errors
91 if(MmioRead32(ARM_VE_SYS_CFGSTAT_REG) & SYS_CFGSTAT_ERROR) {
92 return EFI_DEVICE_ERROR;
93 }
94
95 // If reading then get the data value
96 if(ReadWrite == SYS_CFGCTRL_READ) {
97 *Data = MmioRead32(ARM_VE_SYS_CFGDATA_REG);
98 }
99
100 return EFI_SUCCESS;
101 }
102
103 EFI_STATUS
104 ArmPlatformSysConfigGet (
105 IN SYS_CONFIG_FUNCTION Function,
106 OUT UINT32* Value
107 )
108 {
109 UINT32 Site;
110 UINT32 Position;
111 UINT32 Device;
112
113 Position = 0;
114 Device = 0;
115
116 // Intercept some functions
117 switch(Function) {
118
119 case SYS_CFG_OSC_SITE1:
120 Function = SYS_CFG_OSC;
121 Site = ARM_VE_DAUGHTERBOARD_1_SITE;
122 break;
123
124 case SYS_CFG_OSC_SITE2:
125 Function = SYS_CFG_OSC;
126 Site = ARM_VE_DAUGHTERBOARD_2_SITE;
127 break;
128
129 case SYS_CFG_MUXFPGA:
130 Site = *Value;
131 break;
132
133 case SYS_CFG_OSC:
134 case SYS_CFG_VOLT:
135 case SYS_CFG_AMP:
136 case SYS_CFG_TEMP:
137 case SYS_CFG_RESET:
138 case SYS_CFG_SCC:
139 case SYS_CFG_DVIMODE:
140 case SYS_CFG_POWER:
141 Site = ARM_VE_MOTHERBOARD_SITE;
142 break;
143
144 case SYS_CFG_SHUTDOWN:
145 case SYS_CFG_REBOOT:
146 case SYS_CFG_RTC:
147 default:
148 return EFI_UNSUPPORTED;
149 }
150
151 return AccessSysCfgRegister (SYS_CFGCTRL_READ, Function, Site, Position, Device, Value);
152 }
153
154 EFI_STATUS
155 ArmPlatformSysConfigGetValues (
156 IN SYS_CONFIG_FUNCTION Function,
157 IN UINTN Size,
158 OUT UINT32* Values
159 )
160 {
161 return EFI_UNSUPPORTED;
162 }
163
164 EFI_STATUS
165 ArmPlatformSysConfigSet (
166 IN SYS_CONFIG_FUNCTION Function,
167 IN UINT32 Value
168 )
169 {
170 UINT32 Site;
171 UINT32 Position;
172 UINT32 Device;
173
174 Position = 0;
175 Device = 0;
176
177 // Intercept some functions
178 switch(Function) {
179
180 case SYS_CFG_OSC_SITE1:
181 Function = SYS_CFG_OSC;
182 Site = ARM_VE_DAUGHTERBOARD_1_SITE;
183 break;
184
185 case SYS_CFG_OSC_SITE2:
186 Function = SYS_CFG_OSC;
187 Site = ARM_VE_DAUGHTERBOARD_2_SITE;
188 break;
189
190 case SYS_CFG_MUXFPGA:
191 Site = Value;
192 break;
193
194 case SYS_CFG_RESET:
195 case SYS_CFG_SCC:
196 case SYS_CFG_SHUTDOWN:
197 case SYS_CFG_REBOOT:
198 case SYS_CFG_DVIMODE:
199 case SYS_CFG_POWER:
200 Site = ARM_VE_MOTHERBOARD_SITE;
201 break;
202
203 case SYS_CFG_OSC:
204 case SYS_CFG_VOLT:
205 case SYS_CFG_AMP:
206 case SYS_CFG_TEMP:
207 case SYS_CFG_RTC:
208 default:
209 return(EFI_UNSUPPORTED);
210 }
211
212 return AccessSysCfgRegister (SYS_CFGCTRL_WRITE, Function, Site, Position, Device, &Value);
213 }
214
215 EFI_STATUS
216 ArmPlatformSysConfigSetDevice (
217 IN SYS_CONFIG_FUNCTION Function,
218 IN UINT32 Device,
219 IN UINT32 Value
220 )
221 {
222 UINT32 Site;
223 UINT32 Position;
224
225 Position = 0;
226
227 // Intercept some functions
228 switch(Function) {
229 case SYS_CFG_SCC:
230 #ifdef ARM_VE_SCC_BASE
231 MmioWrite32 ((ARM_VE_SCC_BASE + (Device * 4)),Value);
232 return EFI_SUCCESS;
233 #else
234 // There is no System Configuration Controller on the Model
235 return EFI_UNSUPPORTED;
236 #endif
237
238 case SYS_CFG_OSC_SITE1:
239 Function = SYS_CFG_OSC;
240 Site = ARM_VE_DAUGHTERBOARD_1_SITE;
241 break;
242
243 case SYS_CFG_OSC_SITE2:
244 Function = SYS_CFG_OSC;
245 Site = ARM_VE_DAUGHTERBOARD_2_SITE;
246 break;
247
248 case SYS_CFG_MUXFPGA:
249 Site = Value;
250 break;
251
252 case SYS_CFG_RTC:
253 return(EFI_UNSUPPORTED);
254 //break;
255
256 case SYS_CFG_OSC:
257 case SYS_CFG_VOLT:
258 case SYS_CFG_AMP:
259 case SYS_CFG_TEMP:
260 case SYS_CFG_RESET:
261 case SYS_CFG_SHUTDOWN:
262 case SYS_CFG_REBOOT:
263 case SYS_CFG_DVIMODE:
264 case SYS_CFG_POWER:
265 Site = ARM_VE_MOTHERBOARD_SITE;
266 break;
267 default:
268 return EFI_UNSUPPORTED;
269 }
270
271 return AccessSysCfgRegister (SYS_CFGCTRL_WRITE, Function, Site, Position, Device, &Value);
272 }