Home | History | Annotate | Download | only in ArmVExpressSysConfigLib
      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