Home | History | Annotate | Download | only in ArmVExpressSysConfigRuntimeLib
      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 #include <Uefi.h>
     23 #include <Library/UefiRuntimeLib.h>
     24 
     25 //
     26 // SYS_CFGCTRL Bits
     27 //
     28 #define SYS_CFGCTRL_START                 BIT31
     29 #define SYS_CFGCTRL_READ                  (0 << 30)
     30 #define SYS_CFGCTRL_WRITE                 (1 << 30)
     31 #define SYS_CFGCTRL_FUNCTION(fun)         (((fun ) &  0x3F) << 20)
     32 #define SYS_CFGCTRL_SITE(site)            (((site) &   0x3) << 16)
     33 #define SYS_CFGCTRL_POSITION(pos)         (((pos ) &   0xF) << 12)
     34 #define SYS_CFGCTRL_DEVICE(dev)            ((dev ) & 0xFFF)
     35 
     36 //
     37 // SYS_CFGSTAT Bits
     38 //
     39 #define SYS_CFGSTAT_ERROR                 BIT1
     40 #define SYS_CFGSTAT_COMPLETE              BIT0
     41 
     42 /****************************************************************************
     43  *
     44  *  This file makes it easier to access the System Configuration Registers
     45  *  in the ARM Versatile Express motherboard.
     46  *
     47  ****************************************************************************/
     48 
     49 RETURN_STATUS
     50 ArmPlatformSysConfigInitialize (
     51   VOID
     52   )
     53 {
     54   return RETURN_SUCCESS;
     55 }
     56 
     57 /***************************************
     58  * GENERAL FUNCTION: AccessSysCfgRegister
     59  * Interacts with
     60  *    SYS_CFGSTAT
     61  *    SYS_CFGDATA
     62  *    SYS_CFGCTRL
     63  * for setting and for reading out values
     64  ***************************************/
     65 
     66 RETURN_STATUS
     67 AccessSysCfgRegister (
     68   IN     UINT32   ReadWrite,
     69   IN     UINT32   Function,
     70   IN     UINT32   Site,
     71   IN     UINT32   Position,
     72   IN     UINT32   Device,
     73   IN OUT UINT32*  Data
     74   )
     75 {
     76   UINT32          SysCfgCtrl;
     77 
     78   if (EfiAtRuntime ()) {
     79     return RETURN_UNSUPPORTED;
     80   }
     81 
     82   // Clear the COMPLETE bit
     83   MmioAnd32(ARM_VE_SYS_CFGSTAT_REG, ~SYS_CFGSTAT_COMPLETE);
     84 
     85   // If writing, then set the data value
     86   if(ReadWrite == SYS_CFGCTRL_WRITE) {
     87     MmioWrite32(ARM_VE_SYS_CFGDATA_REG, *Data);
     88   }
     89 
     90   // Set the control value
     91   SysCfgCtrl = SYS_CFGCTRL_START | ReadWrite | SYS_CFGCTRL_FUNCTION(Function) | SYS_CFGCTRL_SITE(Site) |
     92       SYS_CFGCTRL_POSITION(Position) | SYS_CFGCTRL_DEVICE(Device);
     93   MmioWrite32(ARM_VE_SYS_CFGCTRL_REG, SysCfgCtrl);
     94 
     95   // Wait until the COMPLETE bit is set
     96   while ((MmioRead32(ARM_VE_SYS_CFGSTAT_REG) & SYS_CFGSTAT_COMPLETE) == 0);
     97 
     98   // Check for errors
     99   if(MmioRead32(ARM_VE_SYS_CFGSTAT_REG) & SYS_CFGSTAT_ERROR) {
    100     return RETURN_DEVICE_ERROR;
    101   }
    102 
    103   // If reading then get the data value
    104   if(ReadWrite == SYS_CFGCTRL_READ) {
    105     *Data = MmioRead32(ARM_VE_SYS_CFGDATA_REG);
    106   }
    107 
    108   return RETURN_SUCCESS;
    109 }
    110 
    111 RETURN_STATUS
    112 ArmPlatformSysConfigGet (
    113   IN  SYS_CONFIG_FUNCTION   Function,
    114   OUT UINT32*               Value
    115   )
    116 {
    117   UINT32          Site;
    118   UINT32          Position;
    119   UINT32          Device;
    120 
    121   Position = 0;
    122   Device = 0;
    123 
    124   // Intercept some functions
    125   switch(Function) {
    126 
    127   case SYS_CFG_OSC_SITE1:
    128     Function = SYS_CFG_OSC;
    129     Site = ARM_VE_DAUGHTERBOARD_1_SITE;
    130     break;
    131 
    132   case SYS_CFG_OSC_SITE2:
    133     Function = SYS_CFG_OSC;
    134     Site = ARM_VE_DAUGHTERBOARD_2_SITE;
    135     break;
    136 
    137   case SYS_CFG_MUXFPGA:
    138     Site = *Value;
    139     break;
    140 
    141   case SYS_CFG_OSC:
    142   case SYS_CFG_VOLT:
    143   case SYS_CFG_AMP:
    144   case SYS_CFG_TEMP:
    145   case SYS_CFG_RESET:
    146   case SYS_CFG_SCC:
    147   case SYS_CFG_DVIMODE:
    148   case SYS_CFG_POWER:
    149     Site = ARM_VE_MOTHERBOARD_SITE;
    150     break;
    151 
    152   case SYS_CFG_SHUTDOWN:
    153   case SYS_CFG_REBOOT:
    154   case SYS_CFG_RTC:
    155   default:
    156     return RETURN_UNSUPPORTED;
    157   }
    158 
    159   return AccessSysCfgRegister (SYS_CFGCTRL_READ, Function, Site, Position, Device, Value);
    160 }
    161 
    162 RETURN_STATUS
    163 ArmPlatformSysConfigGetValues (
    164   IN  SYS_CONFIG_FUNCTION   Function,
    165   IN  UINTN                 Size,
    166   OUT UINT32*               Values
    167   )
    168 {
    169   return RETURN_UNSUPPORTED;
    170 }
    171 
    172 RETURN_STATUS
    173 ArmPlatformSysConfigSet (
    174   IN  SYS_CONFIG_FUNCTION   Function,
    175   IN  UINT32                Value
    176   )
    177 {
    178   UINT32          Site;
    179   UINT32          Position;
    180   UINT32          Device;
    181 
    182   Position = 0;
    183   Device = 0;
    184 
    185   // Intercept some functions
    186   switch(Function) {
    187 
    188   case SYS_CFG_OSC_SITE1:
    189     Function = SYS_CFG_OSC;
    190     Site = ARM_VE_DAUGHTERBOARD_1_SITE;
    191     break;
    192 
    193   case SYS_CFG_OSC_SITE2:
    194     Function = SYS_CFG_OSC;
    195     Site = ARM_VE_DAUGHTERBOARD_2_SITE;
    196     break;
    197 
    198   case SYS_CFG_MUXFPGA:
    199     Site = Value;
    200     break;
    201 
    202   case SYS_CFG_RESET:
    203   case SYS_CFG_SCC:
    204   case SYS_CFG_SHUTDOWN:
    205   case SYS_CFG_REBOOT:
    206   case SYS_CFG_DVIMODE:
    207   case SYS_CFG_POWER:
    208     Site = ARM_VE_MOTHERBOARD_SITE;
    209     break;
    210 
    211   case SYS_CFG_OSC:
    212   case SYS_CFG_VOLT:
    213   case SYS_CFG_AMP:
    214   case SYS_CFG_TEMP:
    215   case SYS_CFG_RTC:
    216   default:
    217     return RETURN_UNSUPPORTED;
    218   }
    219 
    220   return AccessSysCfgRegister (SYS_CFGCTRL_WRITE, Function, Site, Position, Device, &Value);
    221 }
    222 
    223 RETURN_STATUS
    224 ArmPlatformSysConfigSetDevice (
    225   IN  SYS_CONFIG_FUNCTION   Function,
    226   IN  UINT32                Device,
    227   IN  UINT32                Value
    228   )
    229 {
    230   UINT32          Site;
    231   UINT32          Position;
    232 
    233   Position = 0;
    234 
    235   // Intercept some functions
    236   switch(Function) {
    237   case SYS_CFG_SCC:
    238 #ifdef ARM_VE_SCC_BASE
    239     if (EfiAtRuntime ()) {
    240       return RETURN_UNSUPPORTED;
    241     }
    242     MmioWrite32 ((ARM_VE_SCC_BASE + (Device * 4)),Value);
    243     return RETURN_SUCCESS;
    244 #else
    245     // There is no System Configuration Controller on the Model
    246     return RETURN_UNSUPPORTED;
    247 #endif
    248 
    249   case SYS_CFG_OSC_SITE1:
    250     Function = SYS_CFG_OSC;
    251     Site = ARM_VE_DAUGHTERBOARD_1_SITE;
    252     break;
    253 
    254   case SYS_CFG_OSC_SITE2:
    255     Function = SYS_CFG_OSC;
    256     Site = ARM_VE_DAUGHTERBOARD_2_SITE;
    257     break;
    258 
    259   case SYS_CFG_MUXFPGA:
    260     Site = Value;
    261     break;
    262 
    263   case SYS_CFG_RTC:
    264     return RETURN_UNSUPPORTED;
    265     //break;
    266 
    267   case SYS_CFG_OSC:
    268   case SYS_CFG_VOLT:
    269   case SYS_CFG_AMP:
    270   case SYS_CFG_TEMP:
    271   case SYS_CFG_RESET:
    272   case SYS_CFG_SHUTDOWN:
    273   case SYS_CFG_REBOOT:
    274   case SYS_CFG_DVIMODE:
    275   case SYS_CFG_POWER:
    276     Site = ARM_VE_MOTHERBOARD_SITE;
    277     break;
    278   default:
    279     return RETURN_UNSUPPORTED;
    280   }
    281 
    282   return AccessSysCfgRegister (SYS_CFGCTRL_WRITE, Function, Site, Position, Device, &Value);
    283 }
    284