1 /** @file ArmVExpressSysConfig.c
3 Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>
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
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.
16 #include <Library/IoLib.h>
17 #include <Library/DebugLib.h>
19 #include <Library/ArmPlatformSysConfigLib.h>
20 #include <ArmPlatform.h>
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)
36 #define SYS_CFGSTAT_ERROR BIT1
37 #define SYS_CFGSTAT_COMPLETE BIT0
39 /****************************************************************************
41 * This file makes it easier to access the System Configuration Registers
42 * in the ARM Versatile Express motherboard.
44 ****************************************************************************/
47 ArmPlatformSysConfigInitialize (
51 return RETURN_SUCCESS
;
54 /***************************************
55 * GENERAL FUNCTION: AccessSysCfgRegister
60 * for setting and for reading out values
61 ***************************************/
64 AccessSysCfgRegister (
75 // Clear the COMPLETE bit
76 MmioAnd32(ARM_VE_SYS_CFGSTAT_REG
, ~SYS_CFGSTAT_COMPLETE
);
78 // If writing, then set the data value
79 if(ReadWrite
== SYS_CFGCTRL_WRITE
) {
80 MmioWrite32(ARM_VE_SYS_CFGDATA_REG
, *Data
);
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
);
88 // Wait until the COMPLETE bit is set
89 while ((MmioRead32(ARM_VE_SYS_CFGSTAT_REG
) & SYS_CFGSTAT_COMPLETE
) == 0);
92 if(MmioRead32(ARM_VE_SYS_CFGSTAT_REG
) & SYS_CFGSTAT_ERROR
) {
93 return RETURN_DEVICE_ERROR
;
96 // If reading then get the data value
97 if(ReadWrite
== SYS_CFGCTRL_READ
) {
98 *Data
= MmioRead32(ARM_VE_SYS_CFGDATA_REG
);
101 return RETURN_SUCCESS
;
105 ArmPlatformSysConfigGet (
106 IN SYS_CONFIG_FUNCTION Function
,
117 // Intercept some functions
120 case SYS_CFG_OSC_SITE1
:
121 Function
= SYS_CFG_OSC
;
122 Site
= ARM_VE_DAUGHTERBOARD_1_SITE
;
125 case SYS_CFG_OSC_SITE2
:
126 Function
= SYS_CFG_OSC
;
127 Site
= ARM_VE_DAUGHTERBOARD_2_SITE
;
130 case SYS_CFG_MUXFPGA
:
140 case SYS_CFG_DVIMODE
:
142 Site
= ARM_VE_MOTHERBOARD_SITE
;
145 case SYS_CFG_SHUTDOWN
:
149 return RETURN_UNSUPPORTED
;
152 return AccessSysCfgRegister (SYS_CFGCTRL_READ
, Function
, Site
, Position
, Device
, Value
);
156 ArmPlatformSysConfigGetValues (
157 IN SYS_CONFIG_FUNCTION Function
,
162 return RETURN_UNSUPPORTED
;
166 ArmPlatformSysConfigSet (
167 IN SYS_CONFIG_FUNCTION Function
,
178 // Intercept some functions
181 case SYS_CFG_OSC_SITE1
:
182 Function
= SYS_CFG_OSC
;
183 Site
= ARM_VE_DAUGHTERBOARD_1_SITE
;
186 case SYS_CFG_OSC_SITE2
:
187 Function
= SYS_CFG_OSC
;
188 Site
= ARM_VE_DAUGHTERBOARD_2_SITE
;
191 case SYS_CFG_MUXFPGA
:
197 case SYS_CFG_SHUTDOWN
:
199 case SYS_CFG_DVIMODE
:
201 Site
= ARM_VE_MOTHERBOARD_SITE
;
210 return RETURN_UNSUPPORTED
;
213 return AccessSysCfgRegister (SYS_CFGCTRL_WRITE
, Function
, Site
, Position
, Device
, &Value
);
217 ArmPlatformSysConfigSetDevice (
218 IN SYS_CONFIG_FUNCTION Function
,
228 // Intercept some functions
231 #ifdef ARM_VE_SCC_BASE
232 MmioWrite32 ((ARM_VE_SCC_BASE
+ (Device
* 4)),Value
);
233 return RETURN_SUCCESS
;
235 // There is no System Configuration Controller on the Model
236 return RETURN_UNSUPPORTED
;
239 case SYS_CFG_OSC_SITE1
:
240 Function
= SYS_CFG_OSC
;
241 Site
= ARM_VE_DAUGHTERBOARD_1_SITE
;
244 case SYS_CFG_OSC_SITE2
:
245 Function
= SYS_CFG_OSC
;
246 Site
= ARM_VE_DAUGHTERBOARD_2_SITE
;
249 case SYS_CFG_MUXFPGA
:
254 return RETURN_UNSUPPORTED
;
262 case SYS_CFG_SHUTDOWN
:
264 case SYS_CFG_DVIMODE
:
266 Site
= ARM_VE_MOTHERBOARD_SITE
;
269 return RETURN_UNSUPPORTED
;
272 return AccessSysCfgRegister (SYS_CFGCTRL_WRITE
, Function
, Site
, Position
, Device
, &Value
);