From 0787bc6184631f20f8bf3b4abd61630a4a9bc672 Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Thu, 22 Sep 2011 23:01:13 +0000 Subject: ArmPlatformPkg: Introduce Primary core macros On MpCore system, the primary core can now be any core of the system. To identify the primary core, you can use 'gArmTokenSpaceGuid.PcdArmPrimaryCoreMask' and 'gArmTokenSpaceGuid.PcdArmPrimaryCore'. These PCDs by default use the ClusterId and CoreId to identify the core. And the primary core is defined as the ClusetrId=0 and CoreId=0. The helper macros are: IS_PRIMARY_CORE(MpId), GET_CORE_ID(MpId), GET_CLUSTER_ID(MpId), GET_CORE_POS(MpId), PRIMARY_CORE_ID. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12412 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPlatformPkg/PrePi/MainMPCore.c | 4 ++-- ArmPlatformPkg/PrePi/MainUniCore.c | 2 +- ArmPlatformPkg/PrePi/ModuleEntryPoint.S | 10 ++++++---- ArmPlatformPkg/PrePi/ModuleEntryPoint.asm | 10 ++++++---- ArmPlatformPkg/PrePi/PeiUniCore.inf | 5 ++++- ArmPlatformPkg/PrePi/PrePi.c | 8 ++++---- ArmPlatformPkg/PrePi/PrePi.h | 3 +-- 7 files changed, 24 insertions(+), 18 deletions(-) (limited to 'ArmPlatformPkg/PrePi') diff --git a/ArmPlatformPkg/PrePi/MainMPCore.c b/ArmPlatformPkg/PrePi/MainMPCore.c index 82d31905fe..2f1f86a4b7 100644 --- a/ArmPlatformPkg/PrePi/MainMPCore.c +++ b/ArmPlatformPkg/PrePi/MainMPCore.c @@ -41,7 +41,7 @@ PrimaryMain ( VOID SecondaryMain ( - IN UINTN CoreId + IN UINTN MpId ) { // Function pointer to Secondary Core entry point @@ -54,7 +54,7 @@ SecondaryMain ( while (secondary_entry_addr = ArmGetMPCoreMailbox(), secondary_entry_addr == 0) { ArmCallWFI(); // Acknowledge the interrupt and send End of Interrupt signal. - ArmGicAcknowledgeSgiFrom(PcdGet32(PcdGicInterruptInterfaceBase),0/*CoreId*/); + ArmGicAcknowledgeSgiFrom (PcdGet32(PcdGicInterruptInterfaceBase), PRIMARY_CORE_ID); } secondary_start = (VOID (*)())secondary_entry_addr; diff --git a/ArmPlatformPkg/PrePi/MainUniCore.c b/ArmPlatformPkg/PrePi/MainUniCore.c index c92d9a55b3..f1dff8af37 100644 --- a/ArmPlatformPkg/PrePi/MainUniCore.c +++ b/ArmPlatformPkg/PrePi/MainUniCore.c @@ -28,7 +28,7 @@ PrimaryMain ( VOID SecondaryMain ( - IN UINTN CoreId + IN UINTN MpId ) { // We must never get into this function on UniCore system diff --git a/ArmPlatformPkg/PrePi/ModuleEntryPoint.S b/ArmPlatformPkg/PrePi/ModuleEntryPoint.S index a8c779fba9..4d64aa7e86 100755 --- a/ArmPlatformPkg/PrePi/ModuleEntryPoint.S +++ b/ArmPlatformPkg/PrePi/ModuleEntryPoint.S @@ -21,15 +21,17 @@ # Global symbols referenced by this module GCC_ASM_IMPORT(CEntryPoint) +GCC_ASM_IMPORT(ArmReadMpidr) GCC_ASM_EXPORT(_ModuleEntryPoint) StartupAddr: .word CEntryPoint ASM_PFX(_ModuleEntryPoint): - // Identify CPU ID - mrc p15, 0, r0, c0, c0, 5 - and r0, #0xf + // Get ID of this CPU in Multicore system + bl ASM_PFX(ArmReadMpidr) + LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) + and r0, r0, r1 _SetSVCMode: // Enter SVC mode @@ -94,7 +96,7 @@ _PrepareArguments: ldr r2, StartupAddr // Jump to PrePiCore C code - // r0 = core_id + // r0 = MpId // r1 = UefiMemoryBase blx r2 diff --git a/ArmPlatformPkg/PrePi/ModuleEntryPoint.asm b/ArmPlatformPkg/PrePi/ModuleEntryPoint.asm index 00abcb304a..881871d34e 100644 --- a/ArmPlatformPkg/PrePi/ModuleEntryPoint.asm +++ b/ArmPlatformPkg/PrePi/ModuleEntryPoint.asm @@ -19,6 +19,7 @@ INCLUDE AsmMacroIoLib.inc IMPORT CEntryPoint + IMPORT ArmReadMpidr EXPORT _ModuleEntryPoint PRESERVE8 @@ -27,9 +28,10 @@ StartupAddr DCD CEntryPoint _ModuleEntryPoint - // Identify CPU ID - mrc p15, 0, r0, c0, c0, 5 - and r0, #0xf + // Get ID of this CPU in Multicore system + bl ArmReadMpidr + LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) + and r5, r0, r1 _SetSVCMode // Enter SVC mode @@ -94,7 +96,7 @@ _PrepareArguments ldr r2, StartupAddr // Jump to PrePiCore C code - // r0 = core_id + // r0 = MpId // r1 = UefiMemoryBase blx r2 diff --git a/ArmPlatformPkg/PrePi/PeiUniCore.inf b/ArmPlatformPkg/PrePi/PeiUniCore.inf index 2439452d61..5882afc13a 100755 --- a/ArmPlatformPkg/PrePi/PeiUniCore.inf +++ b/ArmPlatformPkg/PrePi/PeiUniCore.inf @@ -78,7 +78,10 @@ gArmTokenSpaceGuid.PcdSystemMemorySize gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize - gArmPlatformTokenSpaceGuid.PcdMPCoreMaxCores + gArmPlatformTokenSpaceGuid.PcdClusterCount + gArmTokenSpaceGuid.PcdArmPrimaryCoreMask + gArmTokenSpaceGuid.PcdArmPrimaryCore + gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize diff --git a/ArmPlatformPkg/PrePi/PrePi.c b/ArmPlatformPkg/PrePi/PrePi.c index c4060d9b63..a0198d89b8 100755 --- a/ArmPlatformPkg/PrePi/PrePi.c +++ b/ArmPlatformPkg/PrePi/PrePi.c @@ -136,13 +136,13 @@ PrePiMain ( VOID CEntryPoint ( - IN UINTN CoreId, + IN UINTN MpId, IN UINTN UefiMemoryBase ) { UINT64 StartTimeStamp; - if ((CoreId == ARM_PRIMARY_CORE) && PerformanceMeasurementEnabled ()) { + if (IS_PRIMARY_CORE(MpId) && PerformanceMeasurementEnabled ()) { // Initialize the Timer Library to setup the Timer HW controller TimerConstructor (); // We cannot call yet the PerformanceLib because the HOB List has not been initialized @@ -168,11 +168,11 @@ CEntryPoint ( ArmWriteVBar ((UINT32)PrePiVectorTable); // If not primary Jump to Secondary Main - if (CoreId == ARM_PRIMARY_CORE) { + if (IS_PRIMARY_CORE(MpId)) { // Goto primary Main. PrimaryMain (UefiMemoryBase, StartTimeStamp); } else { - SecondaryMain (CoreId); + SecondaryMain (MpId); } // DXE Core should always load and never return diff --git a/ArmPlatformPkg/PrePi/PrePi.h b/ArmPlatformPkg/PrePi/PrePi.h index f62e263571..9cf953a796 100644 --- a/ArmPlatformPkg/PrePi/PrePi.h +++ b/ArmPlatformPkg/PrePi/PrePi.h @@ -27,7 +27,6 @@ #include -#define ARM_PRIMARY_CORE 0 #define SerialPrint(txt) SerialPortWrite (txt, AsciiStrLen(txt)+1); // Vector Table for PrePi Phase @@ -69,7 +68,7 @@ PrimaryMain ( VOID SecondaryMain ( - IN UINTN CoreId + IN UINTN MpId ); // Either implemented by PrePiLib or by MemoryInitPei -- cgit v1.2.3