Exemplo n.º 1
0
/**
  Get information about the VExpress platform the firmware is running on.

  @param[out]  Platform   Address where the pointer to the platform information
                          (type ARM_VEXPRESS_PLATFORM*) should be stored.
                          The returned pointer does not point to an allocated
                          memory area.

  @retval  EFI_SUCCESS    The platform information was returned.
  @retval  EFI_NOT_FOUND  The platform was not recognised.

**/
EFI_STATUS
ArmVExpressGetPlatform (
  OUT CONST ARM_VEXPRESS_PLATFORM** Platform
  )
{
  UINT32                SysId;
  UINTN                 CpuType;
  EFI_STATUS            Status;
  UINTN                 CoreCount;

  ASSERT (Platform != NULL);

  CpuType   = 0;
  Status    = EFI_NOT_FOUND;
  *Platform = NULL;

  SysId = MmioRead32 (ARM_VE_SYS_ID_REG);
  if (SysId == ARM_RTSM_SYS_ID) {
    // Get the Cortex-A version
    CpuType = (ArmReadMidr () >> 4) & ARM_CPU_TYPE_MASK;
    if (CpuType == ARM_CPU_TYPE_A9) {
      Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A9x4, Platform);
    } else if (CpuType == ARM_CPU_TYPE_A15) {
      CoreCount = ArmGetCpuCountPerCluster ();
      if (CoreCount == 1) {
        Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A15x1, Platform);
      } else if (CoreCount == 2) {
        Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A15x2, Platform);
      } else if (CoreCount == 4) {
        Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A15x4, Platform);
      }
    }
  }
Exemplo n.º 2
0
EFI_STATUS
PrePeiCoreGetMpCoreInfo (
  OUT UINTN                   *CoreCount,
  OUT ARM_CORE_INFO           **ArmCoreTable
  )
{
  UINT32   ProcType;

  ProcType = MmioRead32 (ARM_VE_SYS_PROCID0_REG) & ARM_VE_SYS_PROC_ID_MASK;
  if ((ProcType == ARM_VE_SYS_PROC_ID_CORTEX_A9) || (ProcType == ARM_VE_SYS_PROC_ID_CORTEX_A15)) {
    // Only support one cluster on all but ARMv8 FVP platform. FVP still uses CortexA9 ID.
    *CoreCount    = ArmGetCpuCountPerCluster ();
    *ArmCoreTable = mVersatileExpressMpCoreInfoTable;
    return EFI_SUCCESS;
  } else {
    return EFI_UNSUPPORTED;
  }
}