Home | History | Annotate | Download | only in ArmVExpressLibRTSM
      1 /** @file
      2 *
      3 *  Copyright (c) 2011-2013, ARM Limited. All rights reserved.
      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 <Library/IoLib.h>
     16 #include <Library/ArmPlatformLib.h>
     17 #include <Library/DebugLib.h>
     18 #include <Library/PcdLib.h>
     19 
     20 #include <Ppi/ArmMpCoreInfo.h>
     21 
     22 #include <ArmPlatform.h>
     23 
     24 ARM_CORE_INFO mVersatileExpressMpCoreInfoTable[] = {
     25   {
     26     // Cluster 0, Core 0
     27     0x0, 0x0,
     28 
     29     // MP Core MailBox Set/Get/Clear Addresses and Clear Value
     30     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
     31     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
     32     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
     33     (UINT64)0xFFFFFFFF
     34   },
     35   {
     36     // Cluster 0, Core 1
     37     0x0, 0x1,
     38 
     39     // MP Core MailBox Set/Get/Clear Addresses and Clear Value
     40     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
     41     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
     42     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
     43     (UINT64)0xFFFFFFFF
     44   },
     45   {
     46     // Cluster 0, Core 2
     47     0x0, 0x2,
     48 
     49     // MP Core MailBox Set/Get/Clear Addresses and Clear Value
     50     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
     51     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
     52     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
     53     (UINT64)0xFFFFFFFF
     54   },
     55   {
     56     // Cluster 0, Core 3
     57     0x0, 0x3,
     58 
     59     // MP Core MailBox Set/Get/Clear Addresses and Clear Value
     60     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
     61     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
     62     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
     63     (UINT64)0xFFFFFFFF
     64   },
     65   {
     66     // Cluster 1, Core 0
     67     0x1, 0x0,
     68 
     69     // MP Core MailBox Set/Get/Clear Addresses and Clear Value
     70     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
     71     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
     72     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
     73     (UINT64)0xFFFFFFFF
     74   },
     75   {
     76     // Cluster 1, Core 1
     77     0x1, 0x1,
     78 
     79     // MP Core MailBox Set/Get/Clear Addresses and Clear Value
     80     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
     81     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
     82     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
     83     (UINT64)0xFFFFFFFF
     84   },
     85   {
     86     // Cluster 1, Core 2
     87     0x1, 0x2,
     88 
     89     // MP Core MailBox Set/Get/Clear Addresses and Clear Value
     90     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
     91     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
     92     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
     93     (UINT64)0xFFFFFFFF
     94   },
     95   {
     96     // Cluster 1, Core 3
     97     0x1, 0x3,
     98 
     99     // MP Core MailBox Set/Get/Clear Addresses and Clear Value
    100     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
    101     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
    102     (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
    103     (UINT64)0xFFFFFFFF
    104   }
    105 };
    106 
    107 /**
    108   Return the current Boot Mode
    109 
    110   This function returns the boot reason on the platform
    111 
    112   @return   Return the current Boot Mode of the platform
    113 
    114 **/
    115 EFI_BOOT_MODE
    116 ArmPlatformGetBootMode (
    117   VOID
    118   )
    119 {
    120   return BOOT_WITH_FULL_CONFIGURATION;
    121 }
    122 
    123 /**
    124   Initialize controllers that must setup in the normal world
    125 
    126   This function is called by the ArmPlatformPkg/Pei or ArmPlatformPkg/Pei/PlatformPeim
    127   in the PEI phase.
    128 
    129 **/
    130 RETURN_STATUS
    131 ArmPlatformInitialize (
    132   IN  UINTN                     MpId
    133   )
    134 {
    135   if (!ArmPlatformIsPrimaryCore (MpId)) {
    136     return RETURN_SUCCESS;
    137   }
    138 
    139   // Disable memory remapping and return to normal mapping
    140   MmioOr32 (SP810_CTRL_BASE, BIT8);
    141 
    142   return RETURN_SUCCESS;
    143 }
    144 
    145 /**
    146   Initialize the system (or sometimes called permanent) memory
    147 
    148   This memory is generally represented by the DRAM.
    149 
    150 **/
    151 VOID
    152 ArmPlatformInitializeSystemMemory (
    153   VOID
    154   )
    155 {
    156   // Nothing to do here
    157 }
    158 
    159 EFI_STATUS
    160 PrePeiCoreGetMpCoreInfo (
    161   OUT UINTN                   *CoreCount,
    162   OUT ARM_CORE_INFO           **ArmCoreTable
    163   )
    164 {
    165   UINT32   ProcType;
    166 
    167   ProcType = MmioRead32 (ARM_VE_SYS_PROCID0_REG) & ARM_VE_SYS_PROC_ID_MASK;
    168   if ((ProcType == ARM_VE_SYS_PROC_ID_CORTEX_A9) || (ProcType == ARM_VE_SYS_PROC_ID_CORTEX_A15)) {
    169     // Only support one cluster on all but ARMv8 FVP platform. FVP still uses CortexA9 ID.
    170     *CoreCount    = ArmGetCpuCountPerCluster ();
    171     *ArmCoreTable = mVersatileExpressMpCoreInfoTable;
    172     return EFI_SUCCESS;
    173   } else {
    174     return EFI_UNSUPPORTED;
    175   }
    176 }
    177 
    178 ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };
    179 
    180 EFI_PEI_PPI_DESCRIPTOR      gPlatformPpiTable[] = {
    181   {
    182     EFI_PEI_PPI_DESCRIPTOR_PPI,
    183     &gArmMpCoreInfoPpiGuid,
    184     &mMpCoreInfoPpi
    185   }
    186 };
    187 
    188 VOID
    189 ArmPlatformGetPlatformPpiList (
    190   OUT UINTN                   *PpiListSize,
    191   OUT EFI_PEI_PPI_DESCRIPTOR  **PpiList
    192   )
    193 {
    194   *PpiListSize = sizeof(gPlatformPpiTable);
    195   *PpiList = gPlatformPpiTable;
    196 }
    197