]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPlatformPkg: Fix and Implement ArmPlatformGetPrimaryCoreMpId
authorOlivier Martin <olivier.martin@arm.com>
Fri, 6 Dec 2013 16:11:34 +0000 (16:11 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 6 Dec 2013 16:11:34 +0000 (16:11 +0000)
- Used correct PCD
- Implement the function for AArch64, BeagleBoard, CTA15A7

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14937 6f19259b-4bc3-4df7-8a09-765794883524

ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA15-A7/CTA15-A7Helper.S
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA15-A7/CTA15-A7Helper.asm
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.S
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.asm
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/AArch64/RTSMHelper.S
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.S
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.asm
ArmPlatformPkg/Library/ArmPlatformLibNull/Arm/ArmPlatformHelper.S
ArmPlatformPkg/Library/ArmPlatformLibNull/Arm/ArmPlatformHelper.asm
BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.S
BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.asm

index b560f56c51352ba1f61f35c2ae83949ef17620c0..ac5378a622d0b16d539a79bd2a480c09bff728c3 100644 (file)
@@ -22,6 +22,7 @@
 GCC_ASM_EXPORT(ArmPlatformPeiBootAction)\r
 GCC_ASM_EXPORT(ArmPlatformGetCorePosition)\r
 GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)\r
+GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)\r
 \r
 ASM_PFX(ArmPlatformPeiBootAction):\r
   bx    lr\r
@@ -66,3 +67,23 @@ ASM_PFX(ArmPlatformIsPrimaryCore):
   movne r0, #0\r
   bx    lr\r
 \r
+//UINTN\r
+//ArmPlatformGetPrimaryCoreMpId (\r
+//  VOID\r
+//  );\r
+ASM_PFX(ArmPlatformGetPrimaryCoreMpId):\r
+  // Extract cpu_id and cluster_id from ARM_SCC_CFGREG48\r
+  // with cpu_id[0:3] and cluster_id[4:7]\r
+  LoadConstantToReg (ARM_CTA15A7_SCC_CFGREG48, r0)\r
+  ldr   r0, [r0]\r
+  lsr   r0, #24\r
+\r
+  // Shift the SCC value to get the cluster ID at the offset #8\r
+  lsl   r1, r0, #4\r
+  and   r1, r1, #0xF00\r
+\r
+  // Keep only the cpu ID from the original SCC\r
+  and   r0, r0, #0x0F\r
+  // Add the Cluster ID to the Cpu ID\r
+  orr   r0, r0, r1\r
+  bx    lr\r
index ec2093adc9ce61553aa23294dcd964ae49d172f9..2e323a1dd2d09f5a88cbc3c6d183aa29bd6cba6a 100644 (file)
@@ -21,6 +21,7 @@
   EXPORT  ArmPlatformPeiBootAction\r
   EXPORT  ArmPlatformGetCorePosition\r
   EXPORT  ArmPlatformIsPrimaryCore\r
+  EXPORT  ArmPlatformGetPrimaryCoreMpId\r
 \r
   PRESERVE8\r
   AREA    CTA15A7Helper, CODE, READONLY\r
@@ -71,4 +72,26 @@ ArmPlatformIsPrimaryCore FUNCTION
   bx    lr\r
   ENDFUNC\r
 \r
+//UINTN\r
+//ArmPlatformGetPrimaryCoreMpId (\r
+//  VOID\r
+//  );\r
+ArmPlatformGetPrimaryCoreMpId FUNCTION\r
+  // Extract cpu_id and cluster_id from ARM_SCC_CFGREG48\r
+  // with cpu_id[0:3] and cluster_id[4:7]\r
+  LoadConstantToReg (ARM_CTA15A7_SCC_CFGREG48, r0)\r
+  ldr   r0, [r0]\r
+  lsr   r0, #24\r
+\r
+  // Shift the SCC value to get the cluster ID at the offset #8\r
+  lsl   r1, r0, #4\r
+  and   r1, r1, #0xF00\r
+\r
+  // Keep only the cpu ID from the original SCC\r
+  and   r0, r0, #0x0F\r
+  // Add the Cluster ID to the Cpu ID\r
+  orr   r0, r0, r1\r
+  bx    lr\r
+  ENDFUNC\r
+\r
   END\r
index e12b8cd4e9439f8206e08e2b53fed16a0a7e5a1f..d419bcfeaf067c819b4bd93a8ff3e0ae60bd0e82 100644 (file)
@@ -19,6 +19,7 @@
 \r
 GCC_ASM_EXPORT(ArmPlatformPeiBootAction)\r
 GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)\r
+GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)\r
 GCC_ASM_EXPORT(ArmPlatformGetCorePosition)\r
 \r
 GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)\r
@@ -29,7 +30,7 @@ GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
 //  VOID\r
 //  );\r
 ASM_PFX(ArmPlatformGetPrimaryCoreMpId):\r
-  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r0)\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0)\r
   ldr   r0, [r0]\r
   bx    lr\r
 \r
index 9508cedd84e7024fc1051353e99a41b459a6ce7d..e969db87446b3978fe41121ec332278f87ea42c0 100644 (file)
@@ -33,7 +33,7 @@
 //  VOID\r
 //  );\r
 ArmPlatformGetPrimaryCoreMpId FUNCTION\r
-  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r0)\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0)\r
   ldr     r0, [r0]\r
   bx     lr\r
   ENDFUNC\r
index 50703ec275157efcd89ba7dcf61afc3bb98d5d9b..b24085cb248f2c5b33dac259ac2d3ce275d9dd23 100644 (file)
@@ -22,6 +22,7 @@
 \r
 GCC_ASM_EXPORT(ArmPlatformPeiBootAction)\r
 GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)\r
+GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)\r
 GCC_ASM_EXPORT(ArmPlatformGetCorePosition)\r
 GCC_ASM_EXPORT(ArmGetCpuCountPerCluster)\r
 \r
@@ -32,6 +33,15 @@ GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdCoreCount)
 ASM_PFX(ArmPlatformPeiBootAction):\r
   ret\r
 \r
+//UINTN\r
+//ArmPlatformGetPrimaryCoreMpId (\r
+//  VOID\r
+//  );\r
+ASM_PFX(ArmPlatformGetPrimaryCoreMpId):\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, x0)\r
+  ldrh   w0, [x0]\r
+  ret\r
+\r
 # IN None\r
 # OUT x0 = number of cores present in the system\r
 ASM_PFX(ArmGetCpuCountPerCluster):\r
index 95006c5f250df1d2ad41759934afa92abd1347e1..04651e7eaa7e53031f60590ae2087ab6d6a67845 100644 (file)
@@ -49,7 +49,7 @@ ASM_PFX(ArmGetScuBaseAddress):
 //  VOID\r
 //  );\r
 ASM_PFX(ArmPlatformGetPrimaryCoreMpId):\r
-  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r0)\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0)\r
   ldr   r0, [r0]\r
   bx    lr\r
 \r
index 5befec31ef477c7d64aff4b54bd4246cc7201aaf..bcc56ca56db61effc42abd45d1a07acff0c999b6 100644 (file)
@@ -52,7 +52,7 @@ ArmGetScuBaseAddress FUNCTION
 //  VOID\r
 //  );\r
 ArmPlatformGetPrimaryCoreMpId FUNCTION\r
-  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r0)\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0)\r
   ldr   r0, [r0]\r
   bx    lr\r
   ENDFUNC\r
index 49f3fde66722d56ac7fd982b7ad742ffc4797f82..1fc6b7af5c473b52f11b68e51169b2e2cb7c5b4a 100644 (file)
@@ -43,7 +43,7 @@ ASM_PFX(ArmPlatformGetCorePosition):
 //  VOID\r
 //  );\r
 ASM_PFX(ArmPlatformGetPrimaryCoreMpId):\r
-  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r0)\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0)\r
   ldr   r0, [r0]\r
   bx    lr\r
 \r
index 6047ca25c49cdf53ca60ecadb4c9119b7d3c22a4..5cdf6fa1a69ff5dcf25f95c0e6a8a5396aab9a35 100644 (file)
@@ -47,7 +47,7 @@ ArmPlatformGetCorePosition FUNCTION
 //  VOID\r
 //  );\r
 ArmPlatformGetPrimaryCoreMpId FUNCTION\r
-  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r0)\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0)\r
   ldr   r0, [r0]\r
   bx    lr\r
   ENDFUNC\r
index 1d0b090774bb3554a003b3f6238ad257206e2338..0d50cbd45a0a9cea0c6fb0eb86bc7639efe1e51f 100644 (file)
 .align 2\r
 \r
 GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)\r
+GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)\r
 GCC_ASM_EXPORT(ArmPlatformPeiBootAction)\r
 \r
+GCC_ASM_IMPORT(ArmReadMpidr)\r
+\r
 //UINTN\r
 //ArmPlatformIsPrimaryCore (\r
 //  IN UINTN MpId\r
@@ -32,4 +35,13 @@ ASM_PFX(ArmPlatformIsPrimaryCore):
 ASM_PFX(ArmPlatformPeiBootAction):\r
   bx    lr\r
 \r
+//UINTN\r
+//ArmPlatformGetPrimaryCoreMpId (\r
+//  VOID\r
+//  );\r
+ASM_PFX(ArmPlatformGetPrimaryCoreMpId):\r
+  // The BeagleBoard is a uniprocessor platform. The MPIDR of primary core is\r
+  // always the MPIDR of the calling CPU.\r
+  b    ASM_PFX(ArmReadMpidr)\r
+\r
 ASM_FUNCTION_REMOVE_IF_UNREFERENCED \r
index a05747717fba523c54367373d78286597abbc494..b850d9858ee17f6b62d0e41a3211dc17ac8a0f12 100644 (file)
@@ -20,6 +20,9 @@
 \r
   EXPORT    ArmPlatformPeiBootAction\r
   EXPORT    ArmPlatformIsPrimaryCore\r
+  EXPORT    ArmPlatformGetPrimaryCoreMpId\r
+\r
+  IMPORT       ArmReadMpidr\r
 \r
   AREA BeagleBoardHelper, CODE, READONLY\r
 \r
@@ -37,4 +40,14 @@ ArmPlatformPeiBootAction FUNCTION
   bx    lr\r
   ENDFUNC\r
 \r
+//UINTN\r
+//ArmPlatformGetPrimaryCoreMpId (\r
+//  VOID\r
+//  );\r
+ArmPlatformGetPrimaryCoreMpId FUNCTION\r
+  // The BeagleBoard is a uniprocessor platform. The MPIDR of primary core is\r
+  // always the MPIDR of the calling CPU.\r
+  b            ArmReadMpidr\r
+  ENDFUNC\r
+\r
   END\r