]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSysConfigLib/ArmVExpressSysConfig.c
ArmPlatformPkg: Introduce ArmPlatformSysConfigLib
[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 ArmPlatformSysConfigSet (
156 IN SYS_CONFIG_FUNCTION Function,
157 IN UINT32 Value
158 )
159 {
160 UINT32 Site;
161 UINT32 Position;
162 UINT32 Device;
163
164 Position = 0;
165 Device = 0;
166
167 // Intercept some functions
168 switch(Function) {
169
170 case SYS_CFG_OSC_SITE1:
171 Function = SYS_CFG_OSC;
172 Site = ARM_VE_DAUGHTERBOARD_1_SITE;
173 break;
174
175 case SYS_CFG_OSC_SITE2:
176 Function = SYS_CFG_OSC;
177 Site = ARM_VE_DAUGHTERBOARD_2_SITE;
178 break;
179
180 case SYS_CFG_MUXFPGA:
181 Site = Value;
182 break;
183
184 case SYS_CFG_RESET:
185 case SYS_CFG_SCC:
186 case SYS_CFG_SHUTDOWN:
187 case SYS_CFG_REBOOT:
188 case SYS_CFG_DVIMODE:
189 case SYS_CFG_POWER:
190 Site = ARM_VE_MOTHERBOARD_SITE;
191 break;
192
193 case SYS_CFG_OSC:
194 case SYS_CFG_VOLT:
195 case SYS_CFG_AMP:
196 case SYS_CFG_TEMP:
197 case SYS_CFG_RTC:
198 default:
199 return(EFI_UNSUPPORTED);
200 }
201
202 return AccessSysCfgRegister (SYS_CFGCTRL_WRITE, Function, Site, Position, Device, &Value);
203 }
204
205 EFI_STATUS
206 ArmPlatformSysConfigSetDevice (
207 IN SYS_CONFIG_FUNCTION Function,
208 IN UINT32 Device,
209 IN UINT32 Value
210 )
211 {
212 UINT32 Site;
213 UINT32 Position;
214
215 Position = 0;
216
217 // Intercept some functions
218 switch(Function) {
219
220 case SYS_CFG_OSC_SITE1:
221 Function = SYS_CFG_OSC;
222 Site = ARM_VE_DAUGHTERBOARD_1_SITE;
223 break;
224
225 case SYS_CFG_OSC_SITE2:
226 Function = SYS_CFG_OSC;
227 Site = ARM_VE_DAUGHTERBOARD_2_SITE;
228 break;
229
230 case SYS_CFG_MUXFPGA:
231 Site = Value;
232 break;
233
234 case SYS_CFG_RTC:
235 return(EFI_UNSUPPORTED);
236 //break;
237
238 case SYS_CFG_OSC:
239 case SYS_CFG_VOLT:
240 case SYS_CFG_AMP:
241 case SYS_CFG_TEMP:
242 case SYS_CFG_RESET:
243 case SYS_CFG_SCC:
244 case SYS_CFG_SHUTDOWN:
245 case SYS_CFG_REBOOT:
246 case SYS_CFG_DVIMODE:
247 case SYS_CFG_POWER:
248 Site = ARM_VE_MOTHERBOARD_SITE;
249 break;
250 default:
251 return EFI_UNSUPPORTED;
252 }
253
254 return AccessSysCfgRegister (SYS_CFGCTRL_WRITE, Function, Site, Position, Device, &Value);
255 }