1// 2// Copyright (c) 2011-2013, ARM Limited. All rights reserved. 3// 4// This program and the accompanying materials 5// are licensed and made available under the terms and conditions of the BSD License 6// which accompanies this distribution. The full text of the license may be found at 7// http://opensource.org/licenses/bsd-license.php 8// 9// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11// 12// 13 14#include <Base.h> 15#include <Library/ArmLib.h> 16#include <Library/PcdLib.h> 17 18#include <Chipset/ArmCortexA9.h> 19 20#include <AutoGen.h> 21 22 INCLUDE AsmMacroIoLib.inc 23 24 EXPORT ArmPlatformPeiBootAction 25 EXPORT ArmGetCpuCountPerCluster 26 EXPORT ArmPlatformIsPrimaryCore 27 EXPORT ArmPlatformGetPrimaryCoreMpId 28 EXPORT ArmPlatformGetCorePosition 29 30 AREA RTSMHelper, CODE, READONLY 31 32ArmPlatformPeiBootAction FUNCTION 33 bx lr 34 ENDFUNC 35 36// IN None 37// OUT r0 = SCU Base Address 38ArmGetScuBaseAddress FUNCTION 39 // Read Configuration Base Address Register. ArmCBar cannot be called to get 40 // the Configuration BAR as a stack is not necessary setup. The SCU is at the 41 // offset 0x0000 from the Private Memory Region. 42 mrc p15, 4, r0, c15, c0, 0 43 bx lr 44 ENDFUNC 45 46//UINTN 47//ArmPlatformGetPrimaryCoreMpId ( 48// VOID 49// ); 50ArmPlatformGetPrimaryCoreMpId FUNCTION 51 mov32 r0, FixedPcdGet32(PcdArmPrimaryCore) 52 bx lr 53 ENDFUNC 54 55// IN None 56// OUT r0 = number of cores present in the system 57ArmGetCpuCountPerCluster FUNCTION 58 stmfd SP!, {r1-r2} 59 60 // Read CP15 MIDR 61 mrc p15, 0, r1, c0, c0, 0 62 63 // Check if the CPU is A15 64 mov r1, r1, LSR #4 65 mov r0, #ARM_CPU_TYPE_MASK 66 and r1, r1, r0 67 68 mov r0, #ARM_CPU_TYPE_A15 69 cmp r1, r0 70 beq _Read_cp15_reg 71 72_CPU_is_not_A15 73 mov r2, lr ; Save link register 74 bl ArmGetScuBaseAddress ; Read SCU Base Address 75 mov lr, r2 ; Restore link register val 76 ldr r0, [r0, #A9_SCU_CONFIG_OFFSET] ; Read SCU Config reg to get CPU count 77 b _Return 78 79_Read_cp15_reg 80 mrc p15, 1, r0, c9, c0, 2 ; Read C9 register of CP15 to get CPU count 81 lsr r0, #24 82 83 84_Return 85 and r0, r0, #3 86 // Add '1' to the number of CPU on the Cluster 87 add r0, r0, #1 88 ldmfd SP!, {r1-r2} 89 bx lr 90 ENDFUNC 91 92//UINTN 93//ArmPlatformIsPrimaryCore ( 94// IN UINTN MpId 95// ); 96ArmPlatformIsPrimaryCore FUNCTION 97 mov32 r1, FixedPcdGet32(PcdArmPrimaryCoreMask) 98 and r0, r0, r1 99 mov32 r1, FixedPcdGet32(PcdArmPrimaryCore) 100 ldr r1, [r1] 101 cmp r0, r1 102 moveq r0, #1 103 movne r0, #0 104 bx lr 105 ENDFUNC 106 107//UINTN 108//ArmPlatformGetCorePosition ( 109// IN UINTN MpId 110// ); 111ArmPlatformGetCorePosition FUNCTION 112 and r1, r0, #ARM_CORE_MASK 113 and r0, r0, #ARM_CLUSTER_MASK 114 add r0, r1, r0, LSR #7 115 bx lr 116 ENDFUNC 117 118 END 119