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 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 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 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 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 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 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