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