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