ArmPlatformPkg/ArmPlatformLib: Added support for ArmPlatformIsPrimaryCore()

Checking if a core if the primary/boot core used to be done with the macro
IS_PRIMARY_CORE().
Some platforms exposes configuration registers to change the primary core.
Replacing the macro IS_PRIMARY_CORE() by ArmPlatformIsPrimaryCore() allows
some flexibility in the way to check the primary core.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
Acked-by: Ryan Harkin <ryan.harkin@linaro.org>


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14344 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
oliviermartin
2013-05-10 12:41:27 +00:00
parent bc7b889a03
commit bebda7ceec
59 changed files with 554 additions and 267 deletions

View File

@ -55,7 +55,7 @@ ArmCpuSetupSmpNonSecure (
) )
{ {
/*// Make the SCU accessible in Non Secure world /*// Make the SCU accessible in Non Secure world
if (IS_PRIMARY_CORE(MpId)) { if (ArmPlatformIsPrimaryCore (MpId)) {
ScuBase = ArmGetScuBaseAddress(); ScuBase = ArmGetScuBaseAddress();
// Allow NS access to SCU register // Allow NS access to SCU register

View File

@ -31,10 +31,5 @@
[Sources.common] [Sources.common]
ArmCortexA15Lib.c ArmCortexA15Lib.c
[FeaturePcd]
[FixedPcd] [FixedPcd]
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore
gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz

View File

@ -15,6 +15,7 @@
#include <Base.h> #include <Base.h>
#include <Library/ArmLib.h> #include <Library/ArmLib.h>
#include <Library/ArmCpuLib.h> #include <Library/ArmCpuLib.h>
#include <Library/ArmPlatformLib.h>
#include <Library/IoLib.h> #include <Library/IoLib.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
@ -64,7 +65,7 @@ ArmCpuSetupSmpNonSecure (
INTN ScuBase; INTN ScuBase;
// Make the SCU accessible in Non Secure world // Make the SCU accessible in Non Secure world
if (IS_PRIMARY_CORE(MpId)) { if (ArmPlatformIsPrimaryCore (MpId)) {
ScuBase = ArmGetScuBaseAddress(); ScuBase = ArmGetScuBaseAddress();
// Allow NS access to SCU register // Allow NS access to SCU register

View File

@ -1,5 +1,5 @@
#/* @file #/* @file
# Copyright (c) 2011-2012, ARM Limited. All rights reserved. # Copyright (c) 2011-2013, ARM Limited. All rights reserved.
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -22,9 +22,11 @@
[Packages] [Packages]
MdePkg/MdePkg.dec MdePkg/MdePkg.dec
ArmPkg/ArmPkg.dec ArmPkg/ArmPkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
[LibraryClasses] [LibraryClasses]
ArmLib ArmLib
ArmPlatformLib
IoLib IoLib
PcdLib PcdLib
@ -33,8 +35,3 @@
ArmCortexA9Helper.asm | RVCT ArmCortexA9Helper.asm | RVCT
ArmCortexA9Helper.S | GCC ArmCortexA9Helper.S | GCC
[FeaturePcd]
[FixedPcd]
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore

View File

@ -1,6 +1,6 @@
/** @file /** @file
* *
* Copyright (c) 2011-2012, ARM Limited. All rights reserved. * Copyright (c) 2011-2013, ARM Limited. All rights reserved.
* *
* This program and the accompanying materials * This program and the accompanying materials
* are licensed and made available under the terms and conditions of the BSD License * are licensed and made available under the terms and conditions of the BSD License
@ -14,6 +14,7 @@
#include <Base.h> #include <Base.h>
#include <Library/ArmLib.h> #include <Library/ArmLib.h>
#include <Library/ArmPlatformLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/IoLib.h> #include <Library/IoLib.h>
#include <Library/ArmGicLib.h> #include <Library/ArmGicLib.h>
@ -51,7 +52,7 @@ ArmGicSetupNonSecure (
} }
// Only the primary core should set the Non Secure bit to the SPIs (Shared Peripheral Interrupt). // Only the primary core should set the Non Secure bit to the SPIs (Shared Peripheral Interrupt).
if (IS_PRIMARY_CORE(MpId)) { if (ArmPlatformIsPrimaryCore (MpId)) {
// Ensure all GIC interrupts are Non-Secure // Ensure all GIC interrupts are Non-Secure
for (Index = 0; Index < (ArmGicGetMaxNumInterrupts (GicDistributorBase) / 32); Index++) { for (Index = 0; Index < (ArmGicGetMaxNumInterrupts (GicDistributorBase) / 32); Index++) {
MmioWrite32 (GicDistributorBase + ARM_GIC_ICDISR + (Index * 4), 0xffffffff); MmioWrite32 (GicDistributorBase + ARM_GIC_ICDISR + (Index * 4), 0xffffffff);

View File

@ -25,14 +25,14 @@
[Packages] [Packages]
ArmPkg/ArmPkg.dec ArmPkg/ArmPkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
MdePkg/MdePkg.dec MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
[LibraryClasses] [LibraryClasses]
ArmLib ArmLib
ArmPlatformLib
DebugLib DebugLib
IoLib IoLib
PcdLib PcdLib
[FixedPcd.common]
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore

View File

@ -122,7 +122,10 @@
// Convert the (ClusterId,CoreId) into a Core Position // Convert the (ClusterId,CoreId) into a Core Position
// We assume there are 4 cores per cluster // We assume there are 4 cores per cluster
// Note: 0xFFFF is the magic value for ARM_CORE_MASK | ARM_CLUSTER_MASK
#define GetCorePositionFromMpId(Pos, MpId, Tmp) \ #define GetCorePositionFromMpId(Pos, MpId, Tmp) \
ldr Tmp, =0xFFFF \
and MpId, Tmp \
lsr Pos, MpId, #6 ; \ lsr Pos, MpId, #6 ; \
and Tmp, MpId, #3 ; \ and Tmp, MpId, #3 ; \
add Pos, Pos, Tmp add Pos, Pos, Tmp
@ -208,7 +211,12 @@ _InitializePrimaryStackEnd:
#define LoadConstantToReg(Data, Reg) \ #define LoadConstantToReg(Data, Reg) \
ldr Reg, =Data ldr Reg, =Data
// Convert the (ClusterId,CoreId) into a Core Position
// We assume there are 4 cores per cluster
// Note: 0xFFFF is the magic value for ARM_CORE_MASK | ARM_CLUSTER_MASK
#define GetCorePositionFromMpId(Pos, MpId, Tmp) \ #define GetCorePositionFromMpId(Pos, MpId, Tmp) \
ldr Tmp, =0xFFFF ; \
and MpId, Tmp ; \
lsr Pos, MpId, #6 ; \ lsr Pos, MpId, #6 ; \
and Tmp, MpId, #3 ; \ and Tmp, MpId, #3 ; \
add Pos, Pos, Tmp add Pos, Pos, Tmp

View File

@ -82,6 +82,10 @@
MACRO MACRO
GetCorePositionFromMpId $Pos, $MpId, $Tmp GetCorePositionFromMpId $Pos, $MpId, $Tmp
;Note: The ARM macro does not support the pre-processing. 0xFF and (0xFF << 8) are the values of
; ARM_CORE_MASK and ARM_CLUSTER_MASK
mov $Tmp, #(0xFF :OR: (0xFF << 8))
and $MpId, $Tmp
lsr $Pos, $MpId, #6 lsr $Pos, $MpId, #6
and $Tmp, $MpId, #3 and $Tmp, $MpId, #3
add $Pos, $Pos, $Tmp add $Pos, $Pos, $Tmp

View File

@ -112,7 +112,6 @@ typedef enum {
// //
// ARM MP Core IDs // ARM MP Core IDs
// //
#define IS_PRIMARY_CORE(MpId) (((MpId) & PcdGet32(PcdArmPrimaryCoreMask)) == PcdGet32(PcdArmPrimaryCore))
#define ARM_CORE_MASK 0xFF #define ARM_CORE_MASK 0xFF
#define ARM_CLUSTER_MASK (0xFF << 8) #define ARM_CLUSTER_MASK (0xFF << 8)
#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK) #define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)

View File

@ -74,7 +74,7 @@ ArmPlatformInitialize (
IN UINTN MpId IN UINTN MpId
) )
{ {
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -0,0 +1,49 @@
//
// Copyright (c) 2012, ARM Limited. All rights reserved.
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
//
#include <AsmMacroIoLib.h>
#include <Library/ArmLib.h>
.text
.align 3
GCC_ASM_EXPORT(ArmPlatformGetCorePosition)
GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
//UINTN
//ArmPlatformGetCorePosition (
// IN UINTN MpId
// );
ASM_PFX(ArmPlatformGetCorePosition):
and r1, r0, #ARM_CORE_MASK
and r0, r0, #ARM_CLUSTER_MASK
add r0, r1, r0, LSR #7
bx lr
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ASM_PFX(ArmPlatformIsPrimaryCore):
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)
ldr r1, [r1]
and r0, r0, r1
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)
ldr r1, [r1]
cmp r0, r1
moveq r0, #1
movne r0, #0
bx lr

View File

@ -0,0 +1,56 @@
//
// Copyright (c) 2012, ARM Limited. All rights reserved.
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
//
#include <AsmMacroIoLib.h>
#include <Library/ArmLib.h>
INCLUDE AsmMacroIoLib.inc
EXPORT ArmPlatformGetCorePosition
EXPORT ArmPlatformIsPrimaryCore
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask
PRESERVE8
AREA ArmPlatformNullHelper, CODE, READONLY
//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
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ArmPlatformIsPrimaryCore FUNCTION
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)
ldr r1, [r1]
and r0, r0, r1
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)
ldr r1, [r1]
cmp r0, r1
moveq r0, #1
movne r0, #0
bx lr
ENDFUNC
END

View File

@ -34,6 +34,8 @@
[Sources.common] [Sources.common]
ArmRealViewEb.c ArmRealViewEb.c
ArmRealViewEbMem.c ArmRealViewEbMem.c
ArmRealViewEbHelper.asm | RVCT
ArmRealViewEbHelper.S | GCC
[FeaturePcd] [FeaturePcd]
gEmbeddedTokenSpaceGuid.PcdCacheEnable gEmbeddedTokenSpaceGuid.PcdCacheEnable

View File

@ -32,6 +32,8 @@
[Sources.common] [Sources.common]
ArmRealViewEb.c ArmRealViewEb.c
ArmRealViewEbHelper.asm | RVCT
ArmRealViewEbHelper.S | GCC
[FeaturePcd] [FeaturePcd]
gEmbeddedTokenSpaceGuid.PcdCacheEnable gEmbeddedTokenSpaceGuid.PcdCacheEnable

View File

@ -14,6 +14,7 @@
#include <Library/IoLib.h> #include <Library/IoLib.h>
#include <Library/ArmLib.h> #include <Library/ArmLib.h>
#include <Library/ArmPlatformLib.h>
#include <Library/ArmPlatformSecLib.h> #include <Library/ArmPlatformSecLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
@ -51,7 +52,7 @@ ArmPlatformSecInitialize (
) )
{ {
// If it is not the primary core then there is nothing to do // If it is not the primary core then there is nothing to do
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -29,6 +29,7 @@
[LibraryClasses] [LibraryClasses]
IoLib IoLib
ArmLib ArmLib
ArmPlatformLib
[Sources.common] [Sources.common]
ArmRealViewEbSec.c ArmRealViewEbSec.c
@ -41,5 +42,3 @@
[FixedPcd] [FixedPcd]
gArmTokenSpaceGuid.PcdFvBaseAddress gArmTokenSpaceGuid.PcdFvBaseAddress
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore

View File

@ -51,6 +51,3 @@
gArmTokenSpaceGuid.PcdSystemMemoryBase gArmTokenSpaceGuid.PcdSystemMemoryBase
gArmTokenSpaceGuid.PcdSystemMemorySize gArmTokenSpaceGuid.PcdSystemMemorySize
gArmTokenSpaceGuid.PcdFvBaseAddress gArmTokenSpaceGuid.PcdFvBaseAddress
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore

View File

@ -140,7 +140,7 @@ ArmPlatformInitialize (
IN UINTN MpId IN UINTN MpId
) )
{ {
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2012, ARM Limited. All rights reserved. // Copyright (c) 2012-2013, ARM Limited. All rights reserved.
// //
// This program and the accompanying materials // This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License // are licensed and made available under the terms and conditions of the BSD License
@ -11,12 +11,16 @@
// //
// //
#include <AsmMacroIoLib.h>
#include <Library/ArmLib.h> #include <Library/ArmLib.h>
#include <ArmPlatform.h>
.text .text
.align 3 .align 3
GCC_ASM_EXPORT(ArmPlatformGetCorePosition) GCC_ASM_EXPORT(ArmPlatformGetCorePosition)
GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
//UINTN //UINTN
//ArmPlatformGetCorePosition ( //ArmPlatformGetCorePosition (
@ -28,3 +32,33 @@ ASM_PFX(ArmPlatformGetCorePosition):
add r0, r1, r0, LSR #7 add r0, r1, r0, LSR #7
bx lr bx lr
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ASM_PFX(ArmPlatformIsPrimaryCore):
// Extract cpu_id and cluster_id from ARM_SCC_CFGREG48
// with cpu_id[0:3] and cluster_id[4:7]
LoadConstantToReg (ARM_CTA15A7_SCC_CFGREG48, r1)
ldr r1, [r1]
lsr r1, #24
// Shift the SCC value to get the cluster ID at the offset #8
lsl r2, r1, #4
and r2, r2, #0xF00
// Keep only the cpu ID from the original SCC
and r1, r1, #0x0F
// Add the Cluster ID to the Cpu ID
orr r1, r1, r2
// Keep the Cluster ID and Core ID from the MPID
LoadConstantToReg (ARM_CLUSTER_MASK | ARM_CORE_MASK, r2)
and r0, r0, r2
// Compare mpid and boot cpu from ARM_SCC_CFGREG48
cmp r0, r1
moveq r0, #1
movne r0, #0
bx lr

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2012, ARM Limited. All rights reserved. // Copyright (c) 2012-2013, ARM Limited. All rights reserved.
// //
// This program and the accompanying materials // This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License // are licensed and made available under the terms and conditions of the BSD License
@ -11,11 +11,15 @@
// //
// //
#include <AsmMacroIoLib.h>
#include <Library/ArmLib.h> #include <Library/ArmLib.h>
#include <ArmPlatform.h>
INCLUDE AsmMacroIoLib.inc INCLUDE AsmMacroIoLib.inc
EXPORT ArmPlatformGetCorePosition EXPORT ArmPlatformGetCorePosition
EXPORT ArmPlatformIsPrimaryCore
PRESERVE8 PRESERVE8
AREA CTA15A7Helper, CODE, READONLY AREA CTA15A7Helper, CODE, READONLY
@ -31,4 +35,35 @@ ArmPlatformGetCorePosition FUNCTION
bx lr bx lr
ENDFUNC ENDFUNC
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ArmPlatformIsPrimaryCore FUNCTION
// Extract cpu_id and cluster_id from ARM_SCC_CFGREG48
// with cpu_id[0:3] and cluster_id[4:7]
LoadConstantToReg (ARM_CTA15A7_SCC_CFGREG48, r1)
ldr r1, [r1]
lsr r1, #24
// Shift the SCC value to get the cluster ID at the offset #8
lsl r2, r1, #4
and r2, r2, #0xF00
// Keep only the cpu ID from the original SCC
and r1, r1, #0x0F
// Add the Cluster ID to the Cpu ID
orr r1, r1, r2
// Keep the Cluster ID and Core ID from the MPID
LoadConstantToReg (ARM_CLUSTER_MASK | ARM_CORE_MASK, r2)
and r0, r0, r2
// Compare mpid and boot cpu from ARM_SCC_CFGREG48
cmp r0, r1
moveq r0, #1
movne r0, #0
bx lr
ENDFUNC
END END

View File

@ -39,6 +39,8 @@
[Sources.common] [Sources.common]
CTA9x4.c CTA9x4.c
CTA9x4Mem.c CTA9x4Mem.c
CTA9x4Helper.S | GCC
CTA9x4Helper.asm | RVCT
[FeaturePcd] [FeaturePcd]
gEmbeddedTokenSpaceGuid.PcdCacheEnable gEmbeddedTokenSpaceGuid.PcdCacheEnable

View File

@ -36,6 +36,8 @@
[Sources.common] [Sources.common]
CTA9x4.c CTA9x4.c
CTA9x4Helper.S | GCC
CTA9x4Helper.asm | RVCT
[FeaturePcd] [FeaturePcd]
gEmbeddedTokenSpaceGuid.PcdCacheEnable gEmbeddedTokenSpaceGuid.PcdCacheEnable

View File

@ -136,7 +136,7 @@ ArmPlatformInitialize (
IN UINTN MpId IN UINTN MpId
) )
{ {
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -0,0 +1,39 @@
#
# Copyright (c) 2011-2013, ARM Limited. All rights reserved.
#
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
#
#include <AsmMacroIoLib.h>
.text
.align 2
GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ASM_PFX(ArmPlatformIsPrimaryCore):
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)
ldr r1, [r1]
and r0, r0, r1
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)
ldr r1, [r1]
cmp r0, r1
moveq r0, #1
movne r0, #0
bx lr
ASM_FUNCTION_REMOVE_IF_UNREFERENCED

View File

@ -0,0 +1,43 @@
//
// Copyright (c) 2013, ARM Limited. All rights reserved.
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
//
#include <AsmMacroIoLib.h>
#include <AutoGen.h>
INCLUDE AsmMacroIoLib.inc
EXPORT ArmPlatformIsPrimaryCore
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask
AREA CTA9x4Helper, CODE, READONLY
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ArmPlatformIsPrimaryCore FUNCTION
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)
ldr r1, [r1]
and r0, r0, r1
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)
ldr r1, [r1]
cmp r0, r1
moveq r0, #1
movne r0, #0
bx lr
ENDFUNC
END

View File

@ -1,10 +1,10 @@
# #
# Copyright (c) 2011, ARM Limited. All rights reserved. # Copyright (c) 2011-2013, ARM Limited. All rights reserved.
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at # which accompanies this distribution. The full text of the license may be found at
# http:#opensource.org/licenses/bsd-license.php # http://opensource.org/licenses/bsd-license.php
# #
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
@ -15,7 +15,6 @@
#include <Base.h> #include <Base.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
#include <AutoGen.h> #include <AutoGen.h>
#.include AsmMacroIoLib.inc
#include <Chipset/ArmCortexA9.h> #include <Chipset/ArmCortexA9.h>
@ -23,6 +22,10 @@
.align 2 .align 2
GCC_ASM_EXPORT(ArmGetCpuCountPerCluster) GCC_ASM_EXPORT(ArmGetCpuCountPerCluster)
GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
# IN None # IN None
# OUT r0 = SCU Base Address # OUT r0 = SCU Base Address
@ -68,4 +71,19 @@ _Return:
ldmfd SP!, {r1-r2} ldmfd SP!, {r1-r2}
bx lr bx lr
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ASM_PFX(ArmPlatformIsPrimaryCore):
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)
ldr r1, [r1]
and r0, r0, r1
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)
ldr r1, [r1]
cmp r0, r1
moveq r0, #1
movne r0, #0
bx lr
ASM_FUNCTION_REMOVE_IF_UNREFERENCED ASM_FUNCTION_REMOVE_IF_UNREFERENCED

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2011, ARM Limited. All rights reserved. // Copyright (c) 2011-2012, ARM Limited. All rights reserved.
// //
// This program and the accompanying materials // This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License // are licensed and made available under the terms and conditions of the BSD License
@ -22,21 +22,26 @@
INCLUDE AsmMacroIoLib.inc INCLUDE AsmMacroIoLib.inc
EXPORT ArmGetCpuCountPerCluster EXPORT ArmGetCpuCountPerCluster
EXPORT ArmPlatformIsPrimaryCore
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask
AREA RTSMHelper, CODE, READONLY AREA RTSMHelper, CODE, READONLY
// IN None // IN None
// OUT r0 = SCU Base Address // OUT r0 = SCU Base Address
ArmGetScuBaseAddress ArmGetScuBaseAddress FUNCTION
// Read Configuration Base Address Register. ArmCBar cannot be called to get // 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 // the Configuration BAR as a stack is not necessary setup. The SCU is at the
// offset 0x0000 from the Private Memory Region. // offset 0x0000 from the Private Memory Region.
mrc p15, 4, r0, c15, c0, 0 mrc p15, 4, r0, c15, c0, 0
bx lr bx lr
ENDFUNC
// IN None // IN None
// OUT r0 = number of cores present in the system // OUT r0 = number of cores present in the system
ArmGetCpuCountPerCluster ArmGetCpuCountPerCluster FUNCTION
stmfd SP!, {r1-r2} stmfd SP!, {r1-r2}
// Read CP15 MIDR // Read CP15 MIDR
@ -69,5 +74,22 @@ _Return
add r0, r0, #1 add r0, r0, #1
ldmfd SP!, {r1-r2} ldmfd SP!, {r1-r2}
bx lr bx lr
ENDFUNC
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ArmPlatformIsPrimaryCore FUNCTION
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)
ldr r1, [r1]
and r0, r0, r1
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)
ldr r1, [r1]
cmp r0, r1
moveq r0, #1
movne r0, #0
bx lr
ENDFUNC
END END

View File

@ -97,7 +97,7 @@ ArmPlatformInitialize (
IN UINTN MpId IN UINTN MpId
) )
{ {
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -36,7 +36,7 @@ ArmPlatformSecTrustzoneInit (
) )
{ {
// Nothing to do // Nothing to do
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return; return;
} }
@ -120,7 +120,7 @@ ArmPlatformSecInitialize (
) )
{ {
// If it is not the primary core then there is nothing to do // If it is not the primary core then there is nothing to do
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -1,71 +0,0 @@
#
# Copyright (c) 2011-2012, ARM Limited. All rights reserved.
#
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http:#opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
#
#include <AsmMacroIoLib.h>
#include <Base.h>
#include <Library/PcdLib.h>
#include <AutoGen.h>
#.include AsmMacroIoLib.inc
#include <Chipset/ArmCortexA9.h>
.text
.align 2
GCC_ASM_EXPORT(ArmGetCpuCountPerCluster)
# IN None
# OUT r0 = SCU Base Address
ASM_PFX(ArmGetScuBaseAddress):
# 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
# IN None
# OUT r0 = number of cores present in the system
ASM_PFX(ArmGetCpuCountPerCluster):
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
LoadConstantToReg (ARM_CPU_TYPE_MASK, r0)
and r1, r1, r0
LoadConstantToReg (ARM_CPU_TYPE_A15, r0)
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
ASM_FUNCTION_REMOVE_IF_UNREFERENCED

View File

@ -1,73 +0,0 @@
//
// Copyright (c) 2011-2012, ARM Limited. All rights reserved.
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
//
#include <AsmMacroIoLib.h>
#include <Base.h>
#include <Library/PcdLib.h>
#include <Chipset/ArmCortexA9.h>
#include <AutoGen.h>
INCLUDE AsmMacroIoLib.inc
EXPORT ArmGetCpuCountPerCluster
AREA RTSMHelper, CODE, READONLY
// IN None
// OUT r0 = SCU Base Address
ArmGetScuBaseAddress
// 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
// IN None
// OUT r0 = number of cores present in the system
ArmGetCpuCountPerCluster
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
END

View File

@ -37,8 +37,6 @@
[Sources.ARM] [Sources.ARM]
Arm/RTSMBoot.asm | RVCT Arm/RTSMBoot.asm | RVCT
Arm/RTSMBoot.S | GCC Arm/RTSMBoot.S | GCC
Arm/RTSMHelper.asm | RVCT
Arm/RTSMHelper.S | GCC
[FeaturePcd] [FeaturePcd]
gEmbeddedTokenSpaceGuid.PcdCacheEnable gEmbeddedTokenSpaceGuid.PcdCacheEnable

View File

@ -50,7 +50,7 @@ ArmPlatformSecInitialize (
) )
{ {
// If it is not the primary core then there is nothing to do // If it is not the primary core then there is nothing to do
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -40,11 +40,35 @@ typedef struct {
UINT64 NumberOfBytes; UINT64 NumberOfBytes;
} ARM_SYSTEM_MEMORY_REGION_DESCRIPTOR; } ARM_SYSTEM_MEMORY_REGION_DESCRIPTOR;
/**
Return the core position from the value of its MpId register
This function returns the core position from the position 0 in the processor.
This function might be called from assembler before any stack is set.
@return Return the core position
**/
UINTN UINTN
ArmPlatformGetCorePosition ( ArmPlatformGetCorePosition (
IN UINTN MpId IN UINTN MpId
); );
/**
Return a non-zero value if the callee is the primary core
This function returns a non-zero value if the callee is the primary core.
The primary core is the core responsible to initialize the hardware and run UEFI.
This function might be called from assembler before any stack is set.
@return Return a non-zero value if the callee is the primary core.
**/
UINTN
ArmPlatformIsPrimaryCore (
IN UINTN MpId
);
/** /**
Return the current Boot Mode Return the current Boot Mode

View File

@ -11,12 +11,17 @@
// //
// //
#include <AsmMacroIoLib.h>
#include <Library/ArmLib.h> #include <Library/ArmLib.h>
.text .text
.align 3 .align 3
GCC_ASM_EXPORT(ArmPlatformGetCorePosition) GCC_ASM_EXPORT(ArmPlatformGetCorePosition)
GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
//UINTN //UINTN
//ArmPlatformGetCorePosition ( //ArmPlatformGetCorePosition (
@ -28,3 +33,18 @@ ASM_PFX(ArmPlatformGetCorePosition):
add r0, r1, r0, LSR #7 add r0, r1, r0, LSR #7
bx lr bx lr
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ASM_PFX(ArmPlatformIsPrimaryCore):
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)
ldr r1, [r1]
and r0, r0, r1
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)
ldr r1, [r1]
cmp r0, r1
moveq r0, #1
movne r0, #0
bx lr

View File

@ -17,6 +17,10 @@
INCLUDE AsmMacroIoLib.inc INCLUDE AsmMacroIoLib.inc
EXPORT ArmPlatformGetCorePosition EXPORT ArmPlatformGetCorePosition
EXPORT ArmPlatformIsPrimaryCore
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask
PRESERVE8 PRESERVE8
AREA ArmPlatformNullHelper, CODE, READONLY AREA ArmPlatformNullHelper, CODE, READONLY
@ -32,5 +36,21 @@ ArmPlatformGetCorePosition FUNCTION
bx lr bx lr
ENDFUNC ENDFUNC
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ArmPlatformIsPrimaryCore FUNCTION
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)
ldr r1, [r1]
and r0, r0, r1
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)
ldr r1, [r1]
cmp r0, r1
moveq r0, #1
movne r0, #0
bx lr
ENDFUNC
END END

View File

@ -97,7 +97,7 @@ ArmPlatformInitialize (
IN UINTN MpId IN UINTN MpId
) )
{ {
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -29,7 +29,7 @@ ArmPlatformSecTrustzoneInit (
) )
{ {
// Secondary cores might have to set the Secure SGIs into the GICD_IGROUPR0 // Secondary cores might have to set the Secure SGIs into the GICD_IGROUPR0
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return; return;
} }
@ -49,7 +49,7 @@ ArmPlatformSecInitialize (
) )
{ {
// If it is not the primary core then there is nothing to do // If it is not the primary core then there is nothing to do
if (!IS_PRIMARY_CORE(MpId)) { if (!ArmPlatformIsPrimaryCore (MpId)) {
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -16,6 +16,7 @@
#include <Library/ArmLib.h> #include <Library/ArmLib.h>
#include <Library/ArmGicLib.h> #include <Library/ArmGicLib.h>
#include <Library/ArmPlatformLib.h>
#include <Library/ArmPlatformSecLib.h> #include <Library/ArmPlatformSecLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
@ -70,7 +71,7 @@ ArmPlatformSecExtraAction (
// Warning: This code assumes the DRAM has already been initialized by ArmPlatformSecLib // Warning: This code assumes the DRAM has already been initialized by ArmPlatformSecLib
// //
if (IS_PRIMARY_CORE(MpId)) { if (ArmPlatformIsPrimaryCore (MpId)) {
UINTN* StartAddress = (UINTN*)PcdGet32(PcdFvBaseAddress); UINTN* StartAddress = (UINTN*)PcdGet32(PcdFvBaseAddress);
// Patch the DRAM to make an infinite loop at the start address // Patch the DRAM to make an infinite loop at the start address
@ -96,7 +97,7 @@ ArmPlatformSecExtraAction (
// Warning: This code assumes the DRAM has already been initialized by ArmPlatformSecLib // Warning: This code assumes the DRAM has already been initialized by ArmPlatformSecLib
// //
if (IS_PRIMARY_CORE(MpId)) { if (ArmPlatformIsPrimaryCore (MpId)) {
// Signal the secondary cores they can jump to PEI phase // Signal the secondary cores they can jump to PEI phase
ArmGicSendSgiTo (PcdGet32(PcdGicDistributorBase), ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E, PcdGet32 (PcdGicSgiIntId)); ArmGicSendSgiTo (PcdGet32(PcdGicDistributorBase), ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E, PcdGet32 (PcdGicSgiIntId));

View File

@ -30,10 +30,12 @@
[Packages] [Packages]
MdePkg/MdePkg.dec MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
ArmPkg/ArmPkg.dec ArmPkg/ArmPkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec
[LibraryClasses] [LibraryClasses]
ArmPlatformLib
DebugLib DebugLib
PcdLib PcdLib
ArmGicLib ArmGicLib
@ -47,9 +49,6 @@
[FixedPcd] [FixedPcd]
gArmTokenSpaceGuid.PcdFvBaseAddress gArmTokenSpaceGuid.PcdFvBaseAddress
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore
gArmTokenSpaceGuid.PcdGicDistributorBase gArmTokenSpaceGuid.PcdGicDistributorBase
gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
gArmTokenSpaceGuid.PcdGicSgiIntId gArmTokenSpaceGuid.PcdGicSgiIntId

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2011, ARM Limited. All rights reserved. // Copyright (c) 2011-2013, ARM Limited. All rights reserved.
// //
// This program and the accompanying materials // This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License // are licensed and made available under the terms and conditions of the BSD License
@ -20,6 +20,7 @@
.align 3 .align 3
GCC_ASM_IMPORT(CEntryPoint) GCC_ASM_IMPORT(CEntryPoint)
GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(ArmReadMpidr) GCC_ASM_IMPORT(ArmReadMpidr)
GCC_ASM_EXPORT(_ModuleEntryPoint) GCC_ASM_EXPORT(_ModuleEntryPoint)
@ -28,18 +29,19 @@ StartupAddr: .word CEntryPoint
ASM_PFX(_ModuleEntryPoint): ASM_PFX(_ModuleEntryPoint):
// Identify CPU ID // Identify CPU ID
bl ASM_PFX(ArmReadMpidr) bl ASM_PFX(ArmReadMpidr)
// Get ID of this CPU in Multicore system // Keep a copy of the MpId register value
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) mov r5, r0
and r5, r0, r1
// Is it the Primary Core ?
bl ASM_PFX(ArmPlatformIsPrimaryCore)
// Get the top of the primary stacks (and the base of the secondary stacks) // Get the top of the primary stacks (and the base of the secondary stacks)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoresStackBase), r1) LoadConstantToReg (FixedPcdGet32(PcdCPUCoresStackBase), r1)
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
add r1, r1, r2 add r1, r1, r2
// Is it the Primary Core ? // r0 is equal to 1 if I am the primary core
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r3) cmp r0, #1
cmp r5, r3
beq _SetupPrimaryCoreStack beq _SetupPrimaryCoreStack
_SetupSecondaryCoreStack: _SetupSecondaryCoreStack:

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2011, ARM Limited. All rights reserved. // Copyright (c) 2011-2013, ARM Limited. All rights reserved.
// //
// This program and the accompanying materials // This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License // are licensed and made available under the terms and conditions of the BSD License
@ -19,6 +19,7 @@
INCLUDE AsmMacroIoLib.inc INCLUDE AsmMacroIoLib.inc
IMPORT CEntryPoint IMPORT CEntryPoint
IMPORT ArmPlatformIsPrimaryCore
IMPORT ArmReadMpidr IMPORT ArmReadMpidr
EXPORT _ModuleEntryPoint EXPORT _ModuleEntryPoint
@ -30,18 +31,19 @@ StartupAddr DCD CEntryPoint
_ModuleEntryPoint _ModuleEntryPoint
// Identify CPU ID // Identify CPU ID
bl ArmReadMpidr bl ArmReadMpidr
// Get ID of this CPU in Multicore system // Keep a copy of the MpId register value
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) mov r5, r0
and r5, r0, r1
// Is it the Primary Core ?
bl ArmPlatformIsPrimaryCore
// Get the top of the primary stacks (and the base of the secondary stacks) // Get the top of the primary stacks (and the base of the secondary stacks)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoresStackBase), r1) LoadConstantToReg (FixedPcdGet32(PcdCPUCoresStackBase), r1)
LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)
add r1, r1, r2 add r1, r1, r2
// Is it the Primary Core ? // r0 is equal to 1 if I am the primary core
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r3) cmp r0, #1
cmp r5, r3
beq _SetupPrimaryCoreStack beq _SetupPrimaryCoreStack
_SetupSecondaryCoreStack _SetupSecondaryCoreStack

View File

@ -93,7 +93,7 @@ CEntryPoint (
//Note: The MMU will be enabled by MemoryPeim. Only the primary core will have the MMU on. //Note: The MMU will be enabled by MemoryPeim. Only the primary core will have the MMU on.
// If not primary Jump to Secondary Main // If not primary Jump to Secondary Main
if (IS_PRIMARY_CORE(MpId)) { if (ArmPlatformIsPrimaryCore (MpId)) {
// Initialize the Debug Agent for Source Level Debugging // Initialize the Debug Agent for Source Level Debugging
InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL); InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL);
SaveAndSetDebugTimerInterrupt (TRUE); SaveAndSetDebugTimerInterrupt (TRUE);

View File

@ -62,7 +62,6 @@
gArmTokenSpaceGuid.PcdFvBaseAddress gArmTokenSpaceGuid.PcdFvBaseAddress
gArmTokenSpaceGuid.PcdFvSize gArmTokenSpaceGuid.PcdFvSize
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore gArmTokenSpaceGuid.PcdArmPrimaryCore
gArmTokenSpaceGuid.PcdGicPrimaryCoreId gArmTokenSpaceGuid.PcdGicPrimaryCoreId

View File

@ -60,9 +60,6 @@
gArmTokenSpaceGuid.PcdFvBaseAddress gArmTokenSpaceGuid.PcdFvBaseAddress
gArmTokenSpaceGuid.PcdFvSize gArmTokenSpaceGuid.PcdFvSize
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore
gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase
gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize
gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize

View File

@ -22,6 +22,7 @@
.align 3 .align 3
GCC_ASM_IMPORT(CEntryPoint) GCC_ASM_IMPORT(CEntryPoint)
GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(ArmReadMpidr) GCC_ASM_IMPORT(ArmReadMpidr)
GCC_ASM_IMPORT(ArmPlatformStackSet) GCC_ASM_IMPORT(ArmPlatformStackSet)
GCC_ASM_EXPORT(_ModuleEntryPoint) GCC_ASM_EXPORT(_ModuleEntryPoint)
@ -32,8 +33,8 @@ StartupAddr: .word CEntryPoint
ASM_PFX(_ModuleEntryPoint): ASM_PFX(_ModuleEntryPoint):
// Get ID of this CPU in Multicore system // Get ID of this CPU in Multicore system
bl ASM_PFX(ArmReadMpidr) bl ASM_PFX(ArmReadMpidr)
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) // Keep a copy of the MpId register value
and r6, r0, r1 mov r6, r0
_SetSVCMode: _SetSVCMode:
// Enter SVC mode, Disable FIQ and IRQ // Enter SVC mode, Disable FIQ and IRQ
@ -118,8 +119,9 @@ _GetStackBase:
bl ASM_PFX(ArmPlatformStackSet) bl ASM_PFX(ArmPlatformStackSet)
// Is it the Primary Core ? // Is it the Primary Core ?
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r4) mov r0, r6
cmp r6, r4 bl ASM_PFX(ArmPlatformIsPrimaryCore)
cmp r0, #1
bne _PrepareArguments bne _PrepareArguments
_ReserveGlobalVariable: _ReserveGlobalVariable:

View File

@ -21,6 +21,7 @@
INCLUDE AsmMacroIoLib.inc INCLUDE AsmMacroIoLib.inc
IMPORT CEntryPoint IMPORT CEntryPoint
IMPORT ArmPlatformIsPrimaryCore
IMPORT ArmReadMpidr IMPORT ArmReadMpidr
IMPORT ArmPlatformStackSet IMPORT ArmPlatformStackSet
@ -34,8 +35,8 @@ StartupAddr DCD CEntryPoint
_ModuleEntryPoint _ModuleEntryPoint
// Get ID of this CPU in Multicore system // Get ID of this CPU in Multicore system
bl ArmReadMpidr bl ArmReadMpidr
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) // Keep a copy of the MpId register value
and r6, r0, r1 mov r6, r0
_SetSVCMode _SetSVCMode
// Enter SVC mode, Disable FIQ and IRQ // Enter SVC mode, Disable FIQ and IRQ
@ -120,8 +121,9 @@ _GetStackBase
bl ArmPlatformStackSet bl ArmPlatformStackSet
// Is it the Primary Core ? // Is it the Primary Core ?
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r4) mov r0, r6
cmp r6, r4 bl ArmPlatformIsPrimaryCore
cmp r0, #1
bne _PrepareArguments bne _PrepareArguments
_ReserveGlobalVariable _ReserveGlobalVariable

View File

@ -95,7 +95,6 @@
gArmPlatformTokenSpaceGuid.PcdCoreCount gArmPlatformTokenSpaceGuid.PcdCoreCount
gArmPlatformTokenSpaceGuid.PcdClusterCount gArmPlatformTokenSpaceGuid.PcdClusterCount
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore gArmTokenSpaceGuid.PcdArmPrimaryCore
gArmTokenSpaceGuid.PcdGicPrimaryCoreId gArmTokenSpaceGuid.PcdGicPrimaryCoreId

View File

@ -90,8 +90,6 @@
gArmPlatformTokenSpaceGuid.PcdCoreCount gArmPlatformTokenSpaceGuid.PcdCoreCount
gArmPlatformTokenSpaceGuid.PcdClusterCount gArmPlatformTokenSpaceGuid.PcdClusterCount
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore
gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize
gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize

View File

@ -217,7 +217,7 @@ CEntryPoint (
// Initialize the platform specific controllers // Initialize the platform specific controllers
ArmPlatformInitialize (MpId); ArmPlatformInitialize (MpId);
if (IS_PRIMARY_CORE(MpId) && PerformanceMeasurementEnabled ()) { if (ArmPlatformIsPrimaryCore (MpId) && PerformanceMeasurementEnabled ()) {
// Initialize the Timer Library to setup the Timer HW controller // Initialize the Timer Library to setup the Timer HW controller
TimerConstructor (); TimerConstructor ();
// We cannot call yet the PerformanceLib because the HOB List has not been initialized // We cannot call yet the PerformanceLib because the HOB List has not been initialized
@ -240,7 +240,7 @@ CEntryPoint (
// Define the Global Variable region when we are not running in XIP // Define the Global Variable region when we are not running in XIP
if (!IS_XIP()) { if (!IS_XIP()) {
if (IS_PRIMARY_CORE(MpId)) { if (ArmPlatformIsPrimaryCore (MpId)) {
mGlobalVariableBase = GlobalVariableBase; mGlobalVariableBase = GlobalVariableBase;
if (ArmIsMpCore()) { if (ArmIsMpCore()) {
// Signal the Global Variable Region is defined (event: ARM_CPU_EVENT_DEFAULT) // Signal the Global Variable Region is defined (event: ARM_CPU_EVENT_DEFAULT)
@ -253,7 +253,7 @@ CEntryPoint (
} }
// If not primary Jump to Secondary Main // If not primary Jump to Secondary Main
if (IS_PRIMARY_CORE(MpId)) { if (ArmPlatformIsPrimaryCore (MpId)) {
// Goto primary Main. // Goto primary Main.
PrimaryMain (UefiMemoryBase, StacksBase, GlobalVariableBase, StartTimeStamp); PrimaryMain (UefiMemoryBase, StacksBase, GlobalVariableBase, StartTimeStamp);
} else { } else {

View File

@ -1,10 +1,10 @@
#======================================================================================== #========================================================================================
# Copyright (c) 2011-2012, ARM Limited. All rights reserved. # Copyright (c) 2011-2013, ARM Limited. All rights reserved.
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at # which accompanies this distribution. The full text of the license may be found at
# http:#opensource.org/licenses/bsd-license.php # http://opensource.org/licenses/bsd-license.php
# #
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2011-2012, ARM Limited. All rights reserved. // Copyright (c) 2011-2013, ARM Limited. All rights reserved.
// //
// This program and the accompanying materials // This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License // are licensed and made available under the terms and conditions of the BSD License
@ -19,6 +19,7 @@
.align 3 .align 3
GCC_ASM_IMPORT(CEntryPoint) GCC_ASM_IMPORT(CEntryPoint)
GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(ArmPlatformSecBootAction) GCC_ASM_IMPORT(ArmPlatformSecBootAction)
GCC_ASM_IMPORT(ArmPlatformSecBootMemoryInit) GCC_ASM_IMPORT(ArmPlatformSecBootMemoryInit)
GCC_ASM_IMPORT(ArmDisableInterrupts) GCC_ASM_IMPORT(ArmDisableInterrupts)
@ -45,13 +46,12 @@ ASM_PFX(_ModuleEntryPoint):
_IdentifyCpu: _IdentifyCpu:
// Identify CPU ID // Identify CPU ID
bl ASM_PFX(ArmReadMpidr) bl ASM_PFX(ArmReadMpidr)
// Get ID of this CPU in Multicore system // Keep a copy of the MpId register value
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) mov r9, r0
and r5, r0, r1
// Is it the Primary Core ? // Is it the Primary Core ?
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r3) bl ASM_PFX(ArmPlatformIsPrimaryCore)
cmp r5, r3 cmp r0, #1
// Only the primary core initialize the memory (SMC) // Only the primary core initialize the memory (SMC)
beq _InitMem beq _InitMem
@ -74,9 +74,6 @@ _InitMem:
// Initialize Init Boot Memory // Initialize Init Boot Memory
bl ASM_PFX(ArmPlatformSecBootMemoryInit) bl ASM_PFX(ArmPlatformSecBootMemoryInit)
// Only Primary CPU could run this line (the secondary cores have jumped from _IdentifyCpu to _SetupStack)
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r5)
_SetupPrimaryCoreStack: _SetupPrimaryCoreStack:
// Get the top of the primary stacks (and the base of the secondary stacks) // Get the top of the primary stacks (and the base of the secondary stacks)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1) LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1)
@ -97,7 +94,7 @@ _SetupSecondaryCoreStack:
add r1, r1, r2 add r1, r1, r2
// Get the Core Position (ClusterId * 4) + CoreId // Get the Core Position (ClusterId * 4) + CoreId
GetCorePositionFromMpId(r0, r5, r2) GetCorePositionFromMpId(r0, r9, r2)
// The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack // The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack
add r0, r0, #1 add r0, r0, #1
@ -115,7 +112,7 @@ _PrepareArguments:
// Jump to SEC C code // Jump to SEC C code
// r0 = mp_id // r0 = mp_id
// r1 = Boot Mode // r1 = Boot Mode
mov r0, r5 mov r0, r9
mov r1, r10 mov r1, r10
blx r3 blx r3

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2011-2012, ARM Limited. All rights reserved. // Copyright (c) 2011-2013, ARM Limited. All rights reserved.
// //
// This program and the accompanying materials // This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License // are licensed and made available under the terms and conditions of the BSD License
@ -18,6 +18,7 @@
INCLUDE AsmMacroIoLib.inc INCLUDE AsmMacroIoLib.inc
IMPORT CEntryPoint IMPORT CEntryPoint
IMPORT ArmPlatformIsPrimaryCore
IMPORT ArmPlatformSecBootAction IMPORT ArmPlatformSecBootAction
IMPORT ArmPlatformSecBootMemoryInit IMPORT ArmPlatformSecBootMemoryInit
IMPORT ArmDisableInterrupts IMPORT ArmDisableInterrupts
@ -47,13 +48,12 @@ _ModuleEntryPoint FUNCTION
_IdentifyCpu _IdentifyCpu
// Identify CPU ID // Identify CPU ID
bl ArmReadMpidr bl ArmReadMpidr
// Get ID of this CPU in Multicore system // Keep a copy of the MpId register value
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) mov r9, r0
and r5, r0, r1
// Is it the Primary Core ? // Is it the Primary Core ?
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r3) bl ArmPlatformIsPrimaryCore
cmp r5, r3 cmp r0, #1
// Only the primary core initialize the memory (SMC) // Only the primary core initialize the memory (SMC)
beq _InitMem beq _InitMem
@ -76,9 +76,6 @@ _InitMem
// Initialize Init Boot Memory // Initialize Init Boot Memory
bl ArmPlatformSecBootMemoryInit bl ArmPlatformSecBootMemoryInit
// Only Primary CPU could run this line (the secondary cores have jumped from _IdentifyCpu to _SetupStack)
LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r5)
_SetupPrimaryCoreStack _SetupPrimaryCoreStack
// Get the top of the primary stacks (and the base of the secondary stacks) // Get the top of the primary stacks (and the base of the secondary stacks)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1) LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1)
@ -99,7 +96,7 @@ _SetupSecondaryCoreStack
add r1, r1, r2 add r1, r1, r2
// Get the Core Position (ClusterId * 4) + CoreId // Get the Core Position (ClusterId * 4) + CoreId
GetCorePositionFromMpId(r0, r5, r2) GetCorePositionFromMpId(r0, r9, r2)
// The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack // The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack
add r0, r0, #1 add r0, r0, #1
@ -117,7 +114,7 @@ _PrepareArguments
// Jump to SEC C code // Jump to SEC C code
// r0 = mp_id // r0 = mp_id
// r1 = Boot Mode // r1 = Boot Mode
mov r0, r5 mov r0, r9
mov r1, r10 mov r1, r10
blx r3 blx r3
ENDFUNC ENDFUNC

View File

@ -56,7 +56,7 @@ CEntryPoint (
ArmPlatformSecInitialize (MpId); ArmPlatformSecInitialize (MpId);
// Primary CPU clears out the SCU tag RAMs, secondaries wait // Primary CPU clears out the SCU tag RAMs, secondaries wait
if (IS_PRIMARY_CORE(MpId) && (SecBootMode == ARM_SEC_COLD_BOOT)) { if (ArmPlatformIsPrimaryCore (MpId) && (SecBootMode == ARM_SEC_COLD_BOOT)) {
if (ArmIsMpCore()) { if (ArmIsMpCore()) {
// Signal for the initial memory is configured (event: BOOT_MEM_INIT) // Signal for the initial memory is configured (event: BOOT_MEM_INIT)
ArmCallSEV (); ArmCallSEV ();
@ -108,7 +108,7 @@ CEntryPoint (
// Enter Monitor Mode // Enter Monitor Mode
enter_monitor_mode ((UINTN)TrustedWorldInitialization, MpId, SecBootMode, (VOID*)(PcdGet32(PcdCPUCoresSecMonStackBase) + (PcdGet32(PcdCPUCoreSecMonStackSize) * (GET_CORE_POS(MpId) + 1)))); enter_monitor_mode ((UINTN)TrustedWorldInitialization, MpId, SecBootMode, (VOID*)(PcdGet32(PcdCPUCoresSecMonStackBase) + (PcdGet32(PcdCPUCoreSecMonStackSize) * (GET_CORE_POS(MpId) + 1))));
} else { } else {
if (IS_PRIMARY_CORE(MpId)) { if (ArmPlatformIsPrimaryCore (MpId)) {
SerialPrint ("Trust Zone Configuration is disabled\n\r"); SerialPrint ("Trust Zone Configuration is disabled\n\r");
} }
@ -147,7 +147,7 @@ TrustedWorldInitialization (
// Setup the Trustzone Chipsets // Setup the Trustzone Chipsets
if (SecBootMode == ARM_SEC_COLD_BOOT) { if (SecBootMode == ARM_SEC_COLD_BOOT) {
if (IS_PRIMARY_CORE(MpId)) { if (ArmPlatformIsPrimaryCore (MpId)) {
if (ArmIsMpCore()) { if (ArmIsMpCore()) {
// Signal the secondary core the Security settings is done (event: EVENT_SECURE_INIT) // Signal the secondary core the Security settings is done (event: EVENT_SECURE_INIT)
ArmCallSEV (); ArmCallSEV ();

View File

@ -38,6 +38,7 @@
[LibraryClasses] [LibraryClasses]
ArmCpuLib ArmCpuLib
ArmLib ArmLib
ArmPlatformLib
ArmPlatformSecLib ArmPlatformSecLib
ArmTrustedMonitorLib ArmTrustedMonitorLib
BaseLib BaseLib
@ -61,9 +62,6 @@
gArmTokenSpaceGuid.PcdArmNsacr gArmTokenSpaceGuid.PcdArmNsacr
gArmTokenSpaceGuid.PcdArmNonSecModeTransition gArmTokenSpaceGuid.PcdArmNonSecModeTransition
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore
gArmTokenSpaceGuid.PcdSecureFvBaseAddress gArmTokenSpaceGuid.PcdSecureFvBaseAddress
gArmTokenSpaceGuid.PcdSecureFvSize gArmTokenSpaceGuid.PcdSecureFvSize

View File

@ -19,6 +19,7 @@
#include <Base.h> #include <Base.h>
#include <Library/ArmLib.h> #include <Library/ArmLib.h>
#include <Library/ArmCpuLib.h> #include <Library/ArmCpuLib.h>
#include <Library/ArmPlatformLib.h>
#include <Library/ArmPlatformSecLib.h> #include <Library/ArmPlatformSecLib.h>
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>

View File

@ -0,0 +1,31 @@
#
# Copyright (c) 2012, ARM Limited. All rights reserved.
#
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
#
#include <AsmMacroIoLib.h>
#include <AutoGen.h>
.text
.align 2
GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ASM_PFX(ArmPlatformIsPrimaryCore):
// BeagleBoard has a single core. We must always return 1.
mov r0, #1
bx lr
ASM_FUNCTION_REMOVE_IF_UNREFERENCED

View File

@ -0,0 +1,36 @@
//
// Copyright (c) 2012, ARM Limited. All rights reserved.
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
//
#include <AsmMacroIoLib.h>
#include <Base.h>
#include <AutoGen.h>
INCLUDE AsmMacroIoLib.inc
EXPORT ArmPlatformIsPrimaryCore
AREA BeagleBoardHelper, CODE, READONLY
//UINTN
//ArmPlatformIsPrimaryCore (
// IN UINTN MpId
// );
ArmPlatformIsPrimaryCore FUNCTION
// BeagleBoard has a single core. We must always return 1.
mov r0, #1
bx lr
ENDFUNC
END

View File

@ -39,6 +39,8 @@
BeagleBoardMem.c BeagleBoardMem.c
PadConfiguration.c PadConfiguration.c
Clock.c Clock.c
BeagleBoardHelper.S | GCC
BeagleBoardHelper.asm | RVCT
[Protocols] [Protocols]