14f6ad66aSAchin Gupta/* 2*6c09af9fSZelalem Aweke * Copyright (c) 2013-2021, Arm Limited and Contributors. All rights reserved. 34f6ad66aSAchin Gupta * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 54f6ad66aSAchin Gupta */ 64f6ad66aSAchin Gupta 7c10bd2ceSSandrine Bailleux#include <arch.h> 8*6c09af9fSZelalem Aweke#include <common/bl_common.h> 952010cc7SSandrine Bailleux#include <el3_common_macros.S> 104f6ad66aSAchin Gupta 119f98aa1aSJeenu Viswambharan .globl bl1_entrypoint 12*6c09af9fSZelalem Aweke .globl bl1_run_bl2_in_root 134f6ad66aSAchin Gupta 144f6ad66aSAchin Gupta 154f6ad66aSAchin Gupta /* ----------------------------------------------------- 169f98aa1aSJeenu Viswambharan * bl1_entrypoint() is the entry point into the trusted 174f6ad66aSAchin Gupta * firmware code when a cpu is released from warm or 184f6ad66aSAchin Gupta * cold reset. 194f6ad66aSAchin Gupta * ----------------------------------------------------- 204f6ad66aSAchin Gupta */ 214f6ad66aSAchin Gupta 220a30cf54SAndrew Thoelkefunc bl1_entrypoint 23bf031bbaSSandrine Bailleux /* --------------------------------------------------------------------- 24bf031bbaSSandrine Bailleux * If the reset address is programmable then bl1_entrypoint() is 25bf031bbaSSandrine Bailleux * executed only on the cold boot path. Therefore, we can skip the warm 26bf031bbaSSandrine Bailleux * boot mailbox mechanism. 27bf031bbaSSandrine Bailleux * --------------------------------------------------------------------- 28bf031bbaSSandrine Bailleux */ 2952010cc7SSandrine Bailleux el3_entrypoint_common \ 3018f2efd6SDavid Cunado _init_sctlr=1 \ 31bf031bbaSSandrine Bailleux _warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS \ 32a9bec67dSSandrine Bailleux _secondary_cold_boot=!COLD_BOOT_SINGLE_CPU \ 3352010cc7SSandrine Bailleux _init_memory=1 \ 3452010cc7SSandrine Bailleux _init_c_runtime=1 \ 35da90359bSManish Pandey _exception_vectors=bl1_exceptions \ 36da90359bSManish Pandey _pie_fixup_size=0 374f6ad66aSAchin Gupta 38cd7d6b0eSAntonio Nino Diaz /* -------------------------------------------------------------------- 39cd7d6b0eSAntonio Nino Diaz * Perform BL1 setup 40cd7d6b0eSAntonio Nino Diaz * -------------------------------------------------------------------- 414f6ad66aSAchin Gupta */ 42cd7d6b0eSAntonio Nino Diaz bl bl1_setup 43dbad1bacSVikram Kanigiri 44ed108b56SAlexei Fedorov#if ENABLE_PAUTH 45cd7d6b0eSAntonio Nino Diaz /* -------------------------------------------------------------------- 46ed108b56SAlexei Fedorov * Program APIAKey_EL1 and enable pointer authentication. 47cd7d6b0eSAntonio Nino Diaz * -------------------------------------------------------------------- 48cd7d6b0eSAntonio Nino Diaz */ 49ed108b56SAlexei Fedorov bl pauth_init_enable_el3 50cd7d6b0eSAntonio Nino Diaz#endif /* ENABLE_PAUTH */ 51cd7d6b0eSAntonio Nino Diaz 52cd7d6b0eSAntonio Nino Diaz /* -------------------------------------------------------------------- 53dbad1bacSVikram Kanigiri * Initialize platform and jump to our c-entry point 547baff11fSYatharth Kochar * for this type of reset. 55cd7d6b0eSAntonio Nino Diaz * -------------------------------------------------------------------- 56dbad1bacSVikram Kanigiri */ 57dbad1bacSVikram Kanigiri bl bl1_main 587baff11fSYatharth Kochar 59ed108b56SAlexei Fedorov#if ENABLE_PAUTH 60cd7d6b0eSAntonio Nino Diaz /* -------------------------------------------------------------------- 61ed108b56SAlexei Fedorov * Disable pointer authentication before jumping to next boot image. 62cd7d6b0eSAntonio Nino Diaz * -------------------------------------------------------------------- 63cd7d6b0eSAntonio Nino Diaz */ 64ed108b56SAlexei Fedorov bl pauth_disable_el3 65cd7d6b0eSAntonio Nino Diaz#endif /* ENABLE_PAUTH */ 66cd7d6b0eSAntonio Nino Diaz 677baff11fSYatharth Kochar /* -------------------------------------------------- 687baff11fSYatharth Kochar * Do the transition to next boot image. 697baff11fSYatharth Kochar * -------------------------------------------------- 707baff11fSYatharth Kochar */ 71*6c09af9fSZelalem Aweke#if ENABLE_RME 72*6c09af9fSZelalem Aweke b bl1_run_bl2_in_root 73*6c09af9fSZelalem Aweke#else 747baff11fSYatharth Kochar b el3_exit 75*6c09af9fSZelalem Aweke#endif 768b779620SKévin Petitendfunc bl1_entrypoint 77*6c09af9fSZelalem Aweke 78*6c09af9fSZelalem Aweke /* ----------------------------------------------------- 79*6c09af9fSZelalem Aweke * void bl1_run_bl2_in_root(); 80*6c09af9fSZelalem Aweke * This function runs BL2 in root/EL3 when RME is enabled. 81*6c09af9fSZelalem Aweke * ----------------------------------------------------- 82*6c09af9fSZelalem Aweke */ 83*6c09af9fSZelalem Aweke 84*6c09af9fSZelalem Awekefunc bl1_run_bl2_in_root 85*6c09af9fSZelalem Aweke /* read bl2_ep_info */ 86*6c09af9fSZelalem Aweke adrp x20, bl2_ep_info 87*6c09af9fSZelalem Aweke add x20, x20, :lo12:bl2_ep_info 88*6c09af9fSZelalem Aweke ldr x20, [x20] 89*6c09af9fSZelalem Aweke 90*6c09af9fSZelalem Aweke /* --------------------------------------------- 91*6c09af9fSZelalem Aweke * MMU needs to be disabled because BL2 executes 92*6c09af9fSZelalem Aweke * in EL3. It will initialize the address space 93*6c09af9fSZelalem Aweke * according to its own requirements. 94*6c09af9fSZelalem Aweke * --------------------------------------------- 95*6c09af9fSZelalem Aweke */ 96*6c09af9fSZelalem Aweke bl disable_mmu_icache_el3 97*6c09af9fSZelalem Aweke tlbi alle3 98*6c09af9fSZelalem Aweke 99*6c09af9fSZelalem Aweke ldp x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET] 100*6c09af9fSZelalem Aweke msr elr_el3, x0 101*6c09af9fSZelalem Aweke msr spsr_el3, x1 102*6c09af9fSZelalem Aweke 103*6c09af9fSZelalem Aweke ldp x6, x7, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x30)] 104*6c09af9fSZelalem Aweke ldp x4, x5, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x20)] 105*6c09af9fSZelalem Aweke ldp x2, x3, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x10)] 106*6c09af9fSZelalem Aweke ldp x0, x1, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x0)] 107*6c09af9fSZelalem Aweke exception_return 108*6c09af9fSZelalem Awekeendfunc bl1_run_bl2_in_root 109