/** 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); } } }
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; } }