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
ArmPlatformSysConfigInitialize(VOID)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
AccessSysCfgRegister(IN UINT32 ReadWrite,IN UINT32 Function,IN UINT32 Site,IN UINT32 Position,IN UINT32 Device,IN OUT UINT32 * Data)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
ArmPlatformSysConfigGet(IN SYS_CONFIG_FUNCTION Function,OUT UINT32 * Value)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
ArmPlatformSysConfigGetValues(IN SYS_CONFIG_FUNCTION Function,IN UINTN Size,OUT UINT32 * Values)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
ArmPlatformSysConfigSet(IN SYS_CONFIG_FUNCTION Function,IN UINT32 Value)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
ArmPlatformSysConfigSetDevice(IN SYS_CONFIG_FUNCTION Function,IN UINT32 Device,IN UINT32 Value)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 }
274