Home | History | Annotate | Download | only in Arm
      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 <AsmMacroIoLib.h>
     16 #include <Library/ArmLib.h>
     17 
     18 //
     19 // Return the core position from the value of its MpId register
     20 //
     21 // This function returns the core position from the position 0 in the processor.
     22 // This function might be called from assembler before any stack is set.
     23 //
     24 // @return   Return the core position
     25 //
     26 //UINTN
     27 //ArmPlatformGetCorePosition (
     28 //  IN UINTN MpId
     29 //  );
     30 // With this function: CorePos = (ClusterId * 2) + CoreId
     31 ASM_FUNC(ArmPlatformGetCorePosition)
     32   and   r1, r0, #ARM_CORE_MASK
     33   and   r0, r0, #ARM_CLUSTER_MASK
     34   add   r0, r1, r0, LSR #7
     35   bx    lr
     36 
     37 //
     38 // Return the MpId of the primary core
     39 //
     40 // This function returns the MpId of the primary core.
     41 // This function might be called from assembler before any stack is set.
     42 //
     43 // @return   Return the MpId of the primary core
     44 //
     45 //UINTN
     46 //ArmPlatformGetPrimaryCoreMpId (
     47 //  VOID
     48 //  );
     49 ASM_FUNC(ArmPlatformGetPrimaryCoreMpId)
     50   LDRL  (r0, PrimaryCoreMpid)
     51   bx    lr
     52 
     53 //
     54 // Return a non-zero value if the callee is the primary core
     55 //
     56 // This function returns a non-zero value if the callee is the primary core.
     57 // The primary core is the core responsible to initialize the hardware and run UEFI.
     58 // This function might be called from assembler before any stack is set.
     59 //
     60 //  @return   Return a non-zero value if the callee is the primary core.
     61 //
     62 //UINTN
     63 //ArmPlatformIsPrimaryCore (
     64 //  IN UINTN MpId
     65 //  );
     66 ASM_FUNC(ArmPlatformIsPrimaryCore)
     67   MOV32 (r1, FixedPcdGet32 (PcdArmPrimaryCoreMask))
     68   and   r0, r0, r1
     69 
     70   LDRL  (r1, PrimaryCoreMpid)
     71 
     72   cmp   r0, r1
     73   moveq r0, #1
     74   movne r0, #0
     75   bx    lr
     76 
     77 //
     78 // First platform specific function to be called in the PEI phase
     79 //
     80 // This function is actually the first function called by the PrePi
     81 // or PrePeiCore modules. It allows to retrieve arguments passed to
     82 // the UEFI firmware through the CPU registers.
     83 //
     84 ASM_FUNC(ArmPlatformPeiBootAction)
     85   // The trusted firmware passes the primary CPU MPID through r0 register.
     86   // Save it in a variable.
     87   adr  r1, PrimaryCoreMpid
     88   str  r0, [r1]
     89   bx   lr
     90 
     91 PrimaryCoreMpid:  .word    0x0
     92