123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- //
- // Copyright (c) 2011-2013, ARM Limited. All rights reserved.
- //
- // SPDX-License-Identifier: BSD-2-Clause-Patent
- //
- //
- #include <Base.h>
- #include <Library/ArmLib.h>
- #include <Library/PcdLib.h>
- #include <Chipset/ArmCortexA9.h>
- #include <AutoGen.h>
- INCLUDE AsmMacroIoLib.inc
- EXPORT ArmPlatformPeiBootAction
- EXPORT ArmGetCpuCountPerCluster
- EXPORT ArmPlatformIsPrimaryCore
- EXPORT ArmPlatformGetPrimaryCoreMpId
- EXPORT ArmPlatformGetCorePosition
- AREA RTSMHelper, CODE, READONLY
- ArmPlatformPeiBootAction FUNCTION
- bx lr
- ENDFUNC
- // IN None
- // OUT r0 = SCU Base Address
- ArmGetScuBaseAddress FUNCTION
- // Read Configuration Base Address Register. ArmCBar cannot be called to get
- // the Configuration BAR as a stack is not necessary setup. The SCU is at the
- // offset 0x0000 from the Private Memory Region.
- mrc p15, 4, r0, c15, c0, 0
- bx lr
- ENDFUNC
- //UINTN
- //ArmPlatformGetPrimaryCoreMpId (
- // VOID
- // );
- ArmPlatformGetPrimaryCoreMpId FUNCTION
- mov32 r0, FixedPcdGet32(PcdArmPrimaryCore)
- bx lr
- ENDFUNC
- // IN None
- // OUT r0 = number of cores present in the system
- ArmGetCpuCountPerCluster FUNCTION
- stmfd SP!, {r1-r2}
- // Read CP15 MIDR
- mrc p15, 0, r1, c0, c0, 0
- // Check if the CPU is A15
- mov r1, r1, LSR #4
- mov r0, #ARM_CPU_TYPE_MASK
- and r1, r1, r0
- mov r0, #ARM_CPU_TYPE_A15
- cmp r1, r0
- beq _Read_cp15_reg
- _CPU_is_not_A15
- mov r2, lr ; Save link register
- bl ArmGetScuBaseAddress ; Read SCU Base Address
- mov lr, r2 ; Restore link register val
- ldr r0, [r0, #A9_SCU_CONFIG_OFFSET] ; Read SCU Config reg to get CPU count
- b _Return
- _Read_cp15_reg
- mrc p15, 1, r0, c9, c0, 2 ; Read C9 register of CP15 to get CPU count
- lsr r0, #24
- _Return
- and r0, r0, #3
- // Add '1' to the number of CPU on the Cluster
- add r0, r0, #1
- ldmfd SP!, {r1-r2}
- bx lr
- ENDFUNC
- //UINTN
- //ArmPlatformIsPrimaryCore (
- // IN UINTN MpId
- // );
- ArmPlatformIsPrimaryCore FUNCTION
- mov32 r1, FixedPcdGet32(PcdArmPrimaryCoreMask)
- and r0, r0, r1
- mov32 r1, FixedPcdGet32(PcdArmPrimaryCore)
- ldr r1, [r1]
- cmp r0, r1
- moveq r0, #1
- movne r0, #0
- bx lr
- ENDFUNC
- //UINTN
- //ArmPlatformGetCorePosition (
- // IN UINTN MpId
- // );
- ArmPlatformGetCorePosition FUNCTION
- and r1, r0, #ARM_CORE_MASK
- and r0, r0, #ARM_CLUSTER_MASK
- add r0, r1, r0, LSR #7
- bx lr
- ENDFUNC
- END
|