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