1 /** @file 2 3 Copyright (c) 2014, ARM Ltd. All rights reserved. 4 5 This program and the accompanying materials are licensed and made available 6 under the terms and conditions of the BSD License which accompanies this 7 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, WITHOUT 11 WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include "ArmVExpressInternal.h" 16 #include <Library/ArmPlatformLib.h> // To get Core Count 17 18 // 19 // Description of the four ARM model platforms : 20 // Platform ids are defined in ArmVExpressInternal.h for 21 // all "ArmVExpress-like" platforms (AARCH64 or ARM architecture, 22 // model or hardware platforms). 23 // 24 CONST ARM_VEXPRESS_PLATFORM ArmVExpressPlatforms[] = { 25 { ARM_FVP_VEXPRESS_A9x4, FixedPcdGetPtr (PcdFdtVExpressFvpA9x4), L"rtsm_ve-cortex_a9x4.dtb" }, 26 { ARM_FVP_VEXPRESS_A15x1, FixedPcdGetPtr (PcdFdtVExpressFvpA15x1), L"rtsm_ve-cortex_a15x1.dtb" }, 27 { ARM_FVP_VEXPRESS_A15x2, FixedPcdGetPtr (PcdFdtVExpressFvpA15x2), L"rtsm_ve-cortex_a15x2.dtb" }, 28 { ARM_FVP_VEXPRESS_A15x4, FixedPcdGetPtr (PcdFdtVExpressFvpA15x4), L"rtsm_ve-cortex_a15x4.dtb" }, 29 { ARM_FVP_VEXPRESS_UNKNOWN, } 30 }; 31 32 /** 33 Get information about the VExpress platform the firmware is running on. 34 35 @param[out] Platform Address where the pointer to the platform information 36 (type ARM_VEXPRESS_PLATFORM*) should be stored. 37 The returned pointer does not point to an allocated 38 memory area. 39 40 @retval EFI_SUCCESS The platform information was returned. 41 @retval EFI_NOT_FOUND The platform was not recognised. 42 43 **/ 44 EFI_STATUS 45 ArmVExpressGetPlatform ( 46 OUT CONST ARM_VEXPRESS_PLATFORM** Platform 47 ) 48 { 49 UINT32 SysId; 50 UINTN CpuType; 51 EFI_STATUS Status; 52 UINTN CoreCount; 53 54 ASSERT (Platform != NULL); 55 56 CpuType = 0; 57 Status = EFI_NOT_FOUND; 58 *Platform = NULL; 59 60 SysId = MmioRead32 (ARM_VE_SYS_ID_REG); 61 if (SysId == ARM_RTSM_SYS_ID) { 62 // Get the Cortex-A version 63 CpuType = (ArmReadMidr () >> 4) & ARM_CPU_TYPE_MASK; 64 if (CpuType == ARM_CPU_TYPE_A9) { 65 Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A9x4, Platform); 66 } else if (CpuType == ARM_CPU_TYPE_A15) { 67 CoreCount = ArmGetCpuCountPerCluster (); 68 if (CoreCount == 1) { 69 Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A15x1, Platform); 70 } else if (CoreCount == 2) { 71 Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A15x2, Platform); 72 } else if (CoreCount == 4) { 73 Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A15x4, Platform); 74 } 75 } 76 } 77 78 if (EFI_ERROR (Status)) { 79 DEBUG ((EFI_D_ERROR, "Unsupported platform (SysId:0x%X, CpuType:0x%X)\n", SysId, CpuType)); 80 ASSERT_EFI_ERROR (Status); 81 } 82 83 return Status; 84 } 85