1 /** @file SysCfgArmVExpress.c
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
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.
15 #include <Library/IoLib.h>
16 #include <Library/DebugLib.h>
18 #include <Library/ArmPlatformSysConfigLib.h>
19 #include <ArmPlatform.h>
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)
35 #define SYS_CFGSTAT_ERROR BIT1
36 #define SYS_CFGSTAT_COMPLETE BIT0
38 /****************************************************************************
40 * This file makes it easier to access the System Configuration Registers
41 * in the ARM Versatile Express motherboard.
43 ****************************************************************************/
46 ArmPlatformSysConfigInitialize (
53 /***************************************
54 * GENERAL FUNCTION: AccessSysCfgRegister
59 * for setting and for reading out values
60 ***************************************/
63 AccessSysCfgRegister (
74 // Clear the COMPLETE bit
75 MmioAnd32(ARM_VE_SYS_CFGSTAT_REG
, ~SYS_CFGSTAT_COMPLETE
);
77 // If writing, then set the data value
78 if(ReadWrite
== SYS_CFGCTRL_WRITE
) {
79 MmioWrite32(ARM_VE_SYS_CFGDATA_REG
, *Data
);
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
);
87 // Wait until the COMPLETE bit is set
88 while ((MmioRead32(ARM_VE_SYS_CFGSTAT_REG
) & SYS_CFGSTAT_COMPLETE
) == 0);
91 if(MmioRead32(ARM_VE_SYS_CFGSTAT_REG
) & SYS_CFGSTAT_ERROR
) {
92 return EFI_DEVICE_ERROR
;
95 // If reading then get the data value
96 if(ReadWrite
== SYS_CFGCTRL_READ
) {
97 *Data
= MmioRead32(ARM_VE_SYS_CFGDATA_REG
);
104 ArmPlatformSysConfigGet (
105 IN SYS_CONFIG_FUNCTION Function
,
116 // Intercept some functions
119 case SYS_CFG_OSC_SITE1
:
120 Function
= SYS_CFG_OSC
;
121 Site
= ARM_VE_DAUGHTERBOARD_1_SITE
;
124 case SYS_CFG_OSC_SITE2
:
125 Function
= SYS_CFG_OSC
;
126 Site
= ARM_VE_DAUGHTERBOARD_2_SITE
;
129 case SYS_CFG_MUXFPGA
:
139 case SYS_CFG_DVIMODE
:
141 Site
= ARM_VE_MOTHERBOARD_SITE
;
144 case SYS_CFG_SHUTDOWN
:
148 return EFI_UNSUPPORTED
;
151 return AccessSysCfgRegister (SYS_CFGCTRL_READ
, Function
, Site
, Position
, Device
, Value
);
155 ArmPlatformSysConfigSet (
156 IN SYS_CONFIG_FUNCTION Function
,
167 // Intercept some functions
170 case SYS_CFG_OSC_SITE1
:
171 Function
= SYS_CFG_OSC
;
172 Site
= ARM_VE_DAUGHTERBOARD_1_SITE
;
175 case SYS_CFG_OSC_SITE2
:
176 Function
= SYS_CFG_OSC
;
177 Site
= ARM_VE_DAUGHTERBOARD_2_SITE
;
180 case SYS_CFG_MUXFPGA
:
186 case SYS_CFG_SHUTDOWN
:
188 case SYS_CFG_DVIMODE
:
190 Site
= ARM_VE_MOTHERBOARD_SITE
;
199 return(EFI_UNSUPPORTED
);
202 return AccessSysCfgRegister (SYS_CFGCTRL_WRITE
, Function
, Site
, Position
, Device
, &Value
);
206 ArmPlatformSysConfigSetDevice (
207 IN SYS_CONFIG_FUNCTION Function
,
217 // Intercept some functions
220 case SYS_CFG_OSC_SITE1
:
221 Function
= SYS_CFG_OSC
;
222 Site
= ARM_VE_DAUGHTERBOARD_1_SITE
;
225 case SYS_CFG_OSC_SITE2
:
226 Function
= SYS_CFG_OSC
;
227 Site
= ARM_VE_DAUGHTERBOARD_2_SITE
;
230 case SYS_CFG_MUXFPGA
:
235 return(EFI_UNSUPPORTED
);
244 case SYS_CFG_SHUTDOWN
:
246 case SYS_CFG_DVIMODE
:
248 Site
= ARM_VE_MOTHERBOARD_SITE
;
251 return EFI_UNSUPPORTED
;
254 return AccessSysCfgRegister (SYS_CFGCTRL_WRITE
, Function
, Site
, Position
, Device
, &Value
);