/** @file ArmVExpressSysConfig.c Copyright (c) 2011-2012, ARM Ltd. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include // // SYS_CFGCTRL Bits // #define SYS_CFGCTRL_START BIT31 #define SYS_CFGCTRL_READ (0 << 30) #define SYS_CFGCTRL_WRITE (1 << 30) #define SYS_CFGCTRL_FUNCTION(fun) (((fun ) & 0x3F) << 20) #define SYS_CFGCTRL_SITE(site) (((site) & 0x3) << 16) #define SYS_CFGCTRL_POSITION(pos) (((pos ) & 0xF) << 12) #define SYS_CFGCTRL_DEVICE(dev) ((dev ) & 0xFFF) // // SYS_CFGSTAT Bits // #define SYS_CFGSTAT_ERROR BIT1 #define SYS_CFGSTAT_COMPLETE BIT0 /**************************************************************************** * * This file makes it easier to access the System Configuration Registers * in the ARM Versatile Express motherboard. * ****************************************************************************/ RETURN_STATUS ArmPlatformSysConfigInitialize ( VOID ) { return RETURN_SUCCESS; } /*************************************** * GENERAL FUNCTION: AccessSysCfgRegister * Interacts with * SYS_CFGSTAT * SYS_CFGDATA * SYS_CFGCTRL * for setting and for reading out values ***************************************/ RETURN_STATUS AccessSysCfgRegister ( IN UINT32 ReadWrite, IN UINT32 Function, IN UINT32 Site, IN UINT32 Position, IN UINT32 Device, IN OUT UINT32* Data ) { UINT32 SysCfgCtrl; // Clear the COMPLETE bit MmioAnd32(ARM_VE_SYS_CFGSTAT_REG, ~SYS_CFGSTAT_COMPLETE); // If writing, then set the data value if(ReadWrite == SYS_CFGCTRL_WRITE) { MmioWrite32(ARM_VE_SYS_CFGDATA_REG, *Data); } // Set the control value SysCfgCtrl = SYS_CFGCTRL_START | ReadWrite | SYS_CFGCTRL_FUNCTION(Function) | SYS_CFGCTRL_SITE(Site) | SYS_CFGCTRL_POSITION(Position) | SYS_CFGCTRL_DEVICE(Device); MmioWrite32(ARM_VE_SYS_CFGCTRL_REG, SysCfgCtrl); // Wait until the COMPLETE bit is set while ((MmioRead32(ARM_VE_SYS_CFGSTAT_REG) & SYS_CFGSTAT_COMPLETE) == 0); // Check for errors if(MmioRead32(ARM_VE_SYS_CFGSTAT_REG) & SYS_CFGSTAT_ERROR) { return RETURN_DEVICE_ERROR; } // If reading then get the data value if(ReadWrite == SYS_CFGCTRL_READ) { *Data = MmioRead32(ARM_VE_SYS_CFGDATA_REG); } return RETURN_SUCCESS; } RETURN_STATUS ArmPlatformSysConfigGet ( IN SYS_CONFIG_FUNCTION Function, OUT UINT32* Value ) { UINT32 Site; UINT32 Position; UINT32 Device; Position = 0; Device = 0; // Intercept some functions switch(Function) { case SYS_CFG_OSC_SITE1: Function = SYS_CFG_OSC; Site = ARM_VE_DAUGHTERBOARD_1_SITE; break; case SYS_CFG_OSC_SITE2: Function = SYS_CFG_OSC; Site = ARM_VE_DAUGHTERBOARD_2_SITE; break; case SYS_CFG_MUXFPGA: Site = *Value; break; case SYS_CFG_OSC: case SYS_CFG_VOLT: case SYS_CFG_AMP: case SYS_CFG_TEMP: case SYS_CFG_RESET: case SYS_CFG_SCC: case SYS_CFG_DVIMODE: case SYS_CFG_POWER: Site = ARM_VE_MOTHERBOARD_SITE; break; case SYS_CFG_SHUTDOWN: case SYS_CFG_REBOOT: case SYS_CFG_RTC: default: return RETURN_UNSUPPORTED; } return AccessSysCfgRegister (SYS_CFGCTRL_READ, Function, Site, Position, Device, Value); } RETURN_STATUS ArmPlatformSysConfigGetValues ( IN SYS_CONFIG_FUNCTION Function, IN UINTN Size, OUT UINT32* Values ) { return RETURN_UNSUPPORTED; } RETURN_STATUS ArmPlatformSysConfigSet ( IN SYS_CONFIG_FUNCTION Function, IN UINT32 Value ) { UINT32 Site; UINT32 Position; UINT32 Device; Position = 0; Device = 0; // Intercept some functions switch(Function) { case SYS_CFG_OSC_SITE1: Function = SYS_CFG_OSC; Site = ARM_VE_DAUGHTERBOARD_1_SITE; break; case SYS_CFG_OSC_SITE2: Function = SYS_CFG_OSC; Site = ARM_VE_DAUGHTERBOARD_2_SITE; break; case SYS_CFG_MUXFPGA: Site = Value; break; case SYS_CFG_RESET: case SYS_CFG_SCC: case SYS_CFG_SHUTDOWN: case SYS_CFG_REBOOT: case SYS_CFG_DVIMODE: case SYS_CFG_POWER: Site = ARM_VE_MOTHERBOARD_SITE; break; case SYS_CFG_OSC: case SYS_CFG_VOLT: case SYS_CFG_AMP: case SYS_CFG_TEMP: case SYS_CFG_RTC: default: return RETURN_UNSUPPORTED; } return AccessSysCfgRegister (SYS_CFGCTRL_WRITE, Function, Site, Position, Device, &Value); } RETURN_STATUS ArmPlatformSysConfigSetDevice ( IN SYS_CONFIG_FUNCTION Function, IN UINT32 Device, IN UINT32 Value ) { UINT32 Site; UINT32 Position; Position = 0; // Intercept some functions switch(Function) { case SYS_CFG_SCC: #ifdef ARM_VE_SCC_BASE MmioWrite32 ((ARM_VE_SCC_BASE + (Device * 4)),Value); return RETURN_SUCCESS; #else // There is no System Configuration Controller on the Model return RETURN_UNSUPPORTED; #endif case SYS_CFG_OSC_SITE1: Function = SYS_CFG_OSC; Site = ARM_VE_DAUGHTERBOARD_1_SITE; break; case SYS_CFG_OSC_SITE2: Function = SYS_CFG_OSC; Site = ARM_VE_DAUGHTERBOARD_2_SITE; break; case SYS_CFG_MUXFPGA: Site = Value; break; case SYS_CFG_RTC: return RETURN_UNSUPPORTED; //break; case SYS_CFG_OSC: case SYS_CFG_VOLT: case SYS_CFG_AMP: case SYS_CFG_TEMP: case SYS_CFG_RESET: case SYS_CFG_SHUTDOWN: case SYS_CFG_REBOOT: case SYS_CFG_DVIMODE: case SYS_CFG_POWER: Site = ARM_VE_MOTHERBOARD_SITE; break; default: return RETURN_UNSUPPORTED; } return AccessSysCfgRegister (SYS_CFGCTRL_WRITE, Function, Site, Position, Device, &Value); }