1/** @file
2*
3*  Copyright (c) 2013-2014, ARM Limited. All rights reserved.
4*
5*  This program and the accompanying materials
6*  are licensed and made available under the terms and conditions of the BSD License
7*  which accompanies this distribution.  The full text of the license may be found at
8*  http://opensource.org/licenses/bsd-license.php
9*
10*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12*
13**/
14
15#include <AsmMacroIoLibV8.h>
16#include <Library/ArmLib.h>
17
18.text
19.align 3
20
21GCC_ASM_EXPORT(ArmPlatformPeiBootAction)
22GCC_ASM_EXPORT(ArmPlatformGetCorePosition)
23GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)
24GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
25
26GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
27
28
29PrimaryCoreMpid:  .word    0x0
30
31//
32// Return the core position from the value of its MpId register
33//
34// This function returns the core position from the position 0 in the processor.
35// This function might be called from assembler before any stack is set.
36//
37// @return   Return the core position
38//
39//UINTN
40//ArmPlatformGetCorePosition (
41//  IN UINTN MpId
42//  );
43// With this function: CorePos = (ClusterId * 2) + CoreId
44ASM_PFX(ArmPlatformGetCorePosition):
45  and   r1, r0, #ARM_CORE_MASK
46  and   r0, r0, #ARM_CLUSTER_MASK
47  add   r0, r1, r0, LSR #7
48  bx    lr
49
50//
51// Return the MpId of the primary core
52//
53// This function returns the MpId of the primary core.
54// This function might be called from assembler before any stack is set.
55//
56// @return   Return the MpId of the primary core
57//
58//UINTN
59//ArmPlatformGetPrimaryCoreMpId (
60//  VOID
61//  );
62ASM_PFX(ArmPlatformGetPrimaryCoreMpId):
63  ldr   r0, =PrimaryCoreMpid
64  ldr   r0, [r0]
65  bx    lr
66
67//
68// Return a non-zero value if the callee is the primary core
69//
70// This function returns a non-zero value if the callee is the primary core.
71// The primary core is the core responsible to initialize the hardware and run UEFI.
72// This function might be called from assembler before any stack is set.
73//
74//  @return   Return a non-zero value if the callee is the primary core.
75//
76//UINTN
77//ArmPlatformIsPrimaryCore (
78//  IN UINTN MpId
79//  );
80ASM_PFX(ArmPlatformIsPrimaryCore):
81  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)
82  ldr   r1, [r1]
83  and   r0, r0, r1
84
85  ldr   r1, =PrimaryCoreMpid
86  ldr   r1, [r1]
87
88  cmp   r0, r1
89  moveq r0, #1
90  movne r0, #0
91  bx    lr
92
93//
94// First platform specific function to be called in the PEI phase
95//
96// This function is actually the first function called by the PrePi
97// or PrePeiCore modules. It allows to retrieve arguments passed to
98// the UEFI firmware through the CPU registers.
99//
100ASM_PFX(ArmPlatformPeiBootAction):
101  // The trusted firmware passes the primary CPU MPID through r0 register.
102  // Save it in a variable.
103  ldr  r1, =PrimaryCoreMpid
104  str  r0, [r1]
105  bx   lr
106