1*91f16700Schasinglulu/* 2*91f16700Schasinglulu * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * Copyright (c) 2020, NVIDIA Corporation. All rights reserved. 4*91f16700Schasinglulu * 5*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu#include <arch.h> 9*91f16700Schasinglulu#include <asm_macros.S> 10*91f16700Schasinglulu#include <assert_macros.S> 11*91f16700Schasinglulu#include <cortex_a57.h> 12*91f16700Schasinglulu#include <cpu_macros.S> 13*91f16700Schasinglulu 14*91f16700Schasinglulu#include <platform_def.h> 15*91f16700Schasinglulu#include <tegra_def.h> 16*91f16700Schasinglulu#include <tegra_platform.h> 17*91f16700Schasinglulu 18*91f16700Schasinglulu#define MIDR_PN_CORTEX_A57 0xD07 19*91f16700Schasinglulu 20*91f16700Schasinglulu/******************************************************************************* 21*91f16700Schasinglulu * Implementation defined ACTLR_EL3 bit definitions 22*91f16700Schasinglulu ******************************************************************************/ 23*91f16700Schasinglulu#define ACTLR_ELx_L2ACTLR_BIT (U(1) << 6) 24*91f16700Schasinglulu#define ACTLR_ELx_L2ECTLR_BIT (U(1) << 5) 25*91f16700Schasinglulu#define ACTLR_ELx_L2CTLR_BIT (U(1) << 4) 26*91f16700Schasinglulu#define ACTLR_ELx_CPUECTLR_BIT (U(1) << 1) 27*91f16700Schasinglulu#define ACTLR_ELx_CPUACTLR_BIT (U(1) << 0) 28*91f16700Schasinglulu#define ACTLR_ELx_ENABLE_ALL_ACCESS (ACTLR_ELx_L2ACTLR_BIT | \ 29*91f16700Schasinglulu ACTLR_ELx_L2ECTLR_BIT | \ 30*91f16700Schasinglulu ACTLR_ELx_L2CTLR_BIT | \ 31*91f16700Schasinglulu ACTLR_ELx_CPUECTLR_BIT | \ 32*91f16700Schasinglulu ACTLR_ELx_CPUACTLR_BIT) 33*91f16700Schasinglulu 34*91f16700Schasinglulu /* Global functions */ 35*91f16700Schasinglulu .globl plat_is_my_cpu_primary 36*91f16700Schasinglulu .globl plat_my_core_pos 37*91f16700Schasinglulu .globl plat_get_my_entrypoint 38*91f16700Schasinglulu .globl plat_secondary_cold_boot_setup 39*91f16700Schasinglulu .globl platform_mem_init 40*91f16700Schasinglulu .globl plat_crash_console_init 41*91f16700Schasinglulu .globl plat_crash_console_putc 42*91f16700Schasinglulu .globl plat_crash_console_flush 43*91f16700Schasinglulu .weak plat_core_pos_by_mpidr 44*91f16700Schasinglulu .globl tegra_secure_entrypoint 45*91f16700Schasinglulu .globl plat_reset_handler 46*91f16700Schasinglulu 47*91f16700Schasinglulu /* Global variables */ 48*91f16700Schasinglulu .globl tegra_sec_entry_point 49*91f16700Schasinglulu .globl ns_image_entrypoint 50*91f16700Schasinglulu .globl tegra_bl31_phys_base 51*91f16700Schasinglulu .globl tegra_console_base 52*91f16700Schasinglulu 53*91f16700Schasinglulu /* --------------------- 54*91f16700Schasinglulu * Common CPU init code 55*91f16700Schasinglulu * --------------------- 56*91f16700Schasinglulu */ 57*91f16700Schasinglulu.macro cpu_init_common 58*91f16700Schasinglulu 59*91f16700Schasinglulu /* ------------------------------------------------ 60*91f16700Schasinglulu * We enable procesor retention, L2/CPUECTLR NS 61*91f16700Schasinglulu * access and ECC/Parity protection for A57 CPUs 62*91f16700Schasinglulu * ------------------------------------------------ 63*91f16700Schasinglulu */ 64*91f16700Schasinglulu mrs x0, midr_el1 65*91f16700Schasinglulu mov x1, #(MIDR_PN_MASK << MIDR_PN_SHIFT) 66*91f16700Schasinglulu and x0, x0, x1 67*91f16700Schasinglulu lsr x0, x0, #MIDR_PN_SHIFT 68*91f16700Schasinglulu cmp x0, #MIDR_PN_CORTEX_A57 69*91f16700Schasinglulu b.ne 1f 70*91f16700Schasinglulu 71*91f16700Schasinglulu /* --------------------------- 72*91f16700Schasinglulu * Enable processor retention 73*91f16700Schasinglulu * --------------------------- 74*91f16700Schasinglulu */ 75*91f16700Schasinglulu mrs x0, CORTEX_A57_L2ECTLR_EL1 76*91f16700Schasinglulu mov x1, #RETENTION_ENTRY_TICKS_512 77*91f16700Schasinglulu bic x0, x0, #CORTEX_A57_L2ECTLR_RET_CTRL_MASK 78*91f16700Schasinglulu orr x0, x0, x1 79*91f16700Schasinglulu msr CORTEX_A57_L2ECTLR_EL1, x0 80*91f16700Schasinglulu isb 81*91f16700Schasinglulu 82*91f16700Schasinglulu mrs x0, CORTEX_A57_ECTLR_EL1 83*91f16700Schasinglulu mov x1, #RETENTION_ENTRY_TICKS_512 84*91f16700Schasinglulu bic x0, x0, #CORTEX_A57_ECTLR_CPU_RET_CTRL_MASK 85*91f16700Schasinglulu orr x0, x0, x1 86*91f16700Schasinglulu msr CORTEX_A57_ECTLR_EL1, x0 87*91f16700Schasinglulu isb 88*91f16700Schasinglulu 89*91f16700Schasinglulu /* ------------------------------------------------------- 90*91f16700Schasinglulu * Enable L2 and CPU ECTLR RW access from non-secure world 91*91f16700Schasinglulu * ------------------------------------------------------- 92*91f16700Schasinglulu */ 93*91f16700Schasinglulu mrs x0, actlr_el3 94*91f16700Schasinglulu mov x1, #ACTLR_ELx_ENABLE_ALL_ACCESS 95*91f16700Schasinglulu orr x0, x0, x1 96*91f16700Schasinglulu msr actlr_el3, x0 97*91f16700Schasinglulu mrs x0, actlr_el2 98*91f16700Schasinglulu mov x1, #ACTLR_ELx_ENABLE_ALL_ACCESS 99*91f16700Schasinglulu orr x0, x0, x1 100*91f16700Schasinglulu msr actlr_el2, x0 101*91f16700Schasinglulu isb 102*91f16700Schasinglulu 103*91f16700Schasinglulu /* -------------------------------- 104*91f16700Schasinglulu * Enable the cycle count register 105*91f16700Schasinglulu * -------------------------------- 106*91f16700Schasinglulu */ 107*91f16700Schasinglulu1: mrs x0, pmcr_el0 108*91f16700Schasinglulu ubfx x0, x0, #11, #5 // read PMCR.N field 109*91f16700Schasinglulu mov x1, #1 110*91f16700Schasinglulu lsl x0, x1, x0 111*91f16700Schasinglulu sub x0, x0, #1 // mask of event counters 112*91f16700Schasinglulu orr x0, x0, #0x80000000 // disable overflow intrs 113*91f16700Schasinglulu msr pmintenclr_el1, x0 114*91f16700Schasinglulu msr pmuserenr_el0, x1 // enable user mode access 115*91f16700Schasinglulu 116*91f16700Schasinglulu /* ---------------------------------------------------------------- 117*91f16700Schasinglulu * Allow non-privileged access to CNTVCT: Set CNTKCTL (Kernel Count 118*91f16700Schasinglulu * register), bit 1 (EL0VCTEN) to enable access to CNTVCT/CNTFRQ 119*91f16700Schasinglulu * registers from EL0. 120*91f16700Schasinglulu * ---------------------------------------------------------------- 121*91f16700Schasinglulu */ 122*91f16700Schasinglulu mrs x0, cntkctl_el1 123*91f16700Schasinglulu orr x0, x0, #EL0VCTEN_BIT 124*91f16700Schasinglulu msr cntkctl_el1, x0 125*91f16700Schasinglulu.endm 126*91f16700Schasinglulu 127*91f16700Schasinglulu /* ----------------------------------------------------- 128*91f16700Schasinglulu * bool plat_is_my_cpu_primary(void); 129*91f16700Schasinglulu * 130*91f16700Schasinglulu * This function checks if this is the Primary CPU 131*91f16700Schasinglulu * 132*91f16700Schasinglulu * Registers clobbered: x0, x1 133*91f16700Schasinglulu * ----------------------------------------------------- 134*91f16700Schasinglulu */ 135*91f16700Schasinglulufunc plat_is_my_cpu_primary 136*91f16700Schasinglulu mrs x0, mpidr_el1 137*91f16700Schasinglulu adr x1, tegra_primary_cpu_mpid 138*91f16700Schasinglulu ldr x1, [x1] 139*91f16700Schasinglulu cmp x0, x1 140*91f16700Schasinglulu cset x0, eq 141*91f16700Schasinglulu ret 142*91f16700Schasingluluendfunc plat_is_my_cpu_primary 143*91f16700Schasinglulu 144*91f16700Schasinglulu /* ---------------------------------------------------------- 145*91f16700Schasinglulu * unsigned int plat_my_core_pos(void); 146*91f16700Schasinglulu * 147*91f16700Schasinglulu * result: CorePos = CoreId + (ClusterId * cpus per cluster) 148*91f16700Schasinglulu * Registers clobbered: x0, x8 149*91f16700Schasinglulu * ---------------------------------------------------------- 150*91f16700Schasinglulu */ 151*91f16700Schasinglulufunc plat_my_core_pos 152*91f16700Schasinglulu mov x8, x30 153*91f16700Schasinglulu mrs x0, mpidr_el1 154*91f16700Schasinglulu bl plat_core_pos_by_mpidr 155*91f16700Schasinglulu ret x8 156*91f16700Schasingluluendfunc plat_my_core_pos 157*91f16700Schasinglulu 158*91f16700Schasinglulu /* ----------------------------------------------------- 159*91f16700Schasinglulu * unsigned long plat_get_my_entrypoint (void); 160*91f16700Schasinglulu * 161*91f16700Schasinglulu * Main job of this routine is to distinguish between 162*91f16700Schasinglulu * a cold and warm boot. If the tegra_sec_entry_point for 163*91f16700Schasinglulu * this CPU is present, then it's a warm boot. 164*91f16700Schasinglulu * 165*91f16700Schasinglulu * ----------------------------------------------------- 166*91f16700Schasinglulu */ 167*91f16700Schasinglulufunc plat_get_my_entrypoint 168*91f16700Schasinglulu adr x1, tegra_sec_entry_point 169*91f16700Schasinglulu ldr x0, [x1] 170*91f16700Schasinglulu ret 171*91f16700Schasingluluendfunc plat_get_my_entrypoint 172*91f16700Schasinglulu 173*91f16700Schasinglulu /* ----------------------------------------------------- 174*91f16700Schasinglulu * void plat_secondary_cold_boot_setup (void); 175*91f16700Schasinglulu * 176*91f16700Schasinglulu * This function performs any platform specific actions 177*91f16700Schasinglulu * needed for a secondary cpu after a cold reset. Right 178*91f16700Schasinglulu * now this is a stub function. 179*91f16700Schasinglulu * ----------------------------------------------------- 180*91f16700Schasinglulu */ 181*91f16700Schasinglulufunc plat_secondary_cold_boot_setup 182*91f16700Schasinglulu mov x0, #0 183*91f16700Schasinglulu ret 184*91f16700Schasingluluendfunc plat_secondary_cold_boot_setup 185*91f16700Schasinglulu 186*91f16700Schasinglulu /* -------------------------------------------------------- 187*91f16700Schasinglulu * void platform_mem_init (void); 188*91f16700Schasinglulu * 189*91f16700Schasinglulu * Any memory init, relocation to be done before the 190*91f16700Schasinglulu * platform boots. Called very early in the boot process. 191*91f16700Schasinglulu * -------------------------------------------------------- 192*91f16700Schasinglulu */ 193*91f16700Schasinglulufunc platform_mem_init 194*91f16700Schasinglulu mov x0, #0 195*91f16700Schasinglulu ret 196*91f16700Schasingluluendfunc platform_mem_init 197*91f16700Schasinglulu 198*91f16700Schasinglulu /* --------------------------------------------------- 199*91f16700Schasinglulu * Function to handle a platform reset and store 200*91f16700Schasinglulu * input parameters passed by BL2. 201*91f16700Schasinglulu * --------------------------------------------------- 202*91f16700Schasinglulu */ 203*91f16700Schasinglulufunc plat_reset_handler 204*91f16700Schasinglulu 205*91f16700Schasinglulu /* ---------------------------------------------------- 206*91f16700Schasinglulu * Verify if we are running from BL31_BASE address 207*91f16700Schasinglulu * ---------------------------------------------------- 208*91f16700Schasinglulu */ 209*91f16700Schasinglulu adr x18, bl31_entrypoint 210*91f16700Schasinglulu mov x17, #BL31_BASE 211*91f16700Schasinglulu cmp x18, x17 212*91f16700Schasinglulu b.eq 1f 213*91f16700Schasinglulu 214*91f16700Schasinglulu /* ---------------------------------------------------- 215*91f16700Schasinglulu * Copy the entire BL31 code to BL31_BASE if we are not 216*91f16700Schasinglulu * running from it already 217*91f16700Schasinglulu * ---------------------------------------------------- 218*91f16700Schasinglulu */ 219*91f16700Schasinglulu mov x0, x17 220*91f16700Schasinglulu mov x1, x18 221*91f16700Schasinglulu adr x2, __RELA_END__ 222*91f16700Schasinglulu sub x2, x2, x18 223*91f16700Schasinglulu_loop16: 224*91f16700Schasinglulu cmp x2, #16 225*91f16700Schasinglulu b.lo _loop1 226*91f16700Schasinglulu ldp x3, x4, [x1], #16 227*91f16700Schasinglulu stp x3, x4, [x0], #16 228*91f16700Schasinglulu sub x2, x2, #16 229*91f16700Schasinglulu b _loop16 230*91f16700Schasinglulu /* copy byte per byte */ 231*91f16700Schasinglulu_loop1: 232*91f16700Schasinglulu cbz x2, _end 233*91f16700Schasinglulu ldrb w3, [x1], #1 234*91f16700Schasinglulu strb w3, [x0], #1 235*91f16700Schasinglulu subs x2, x2, #1 236*91f16700Schasinglulu b.ne _loop1 237*91f16700Schasinglulu 238*91f16700Schasinglulu /* ---------------------------------------------------- 239*91f16700Schasinglulu * Jump to BL31_BASE and start execution again 240*91f16700Schasinglulu * ---------------------------------------------------- 241*91f16700Schasinglulu */ 242*91f16700Schasinglulu_end: mov x0, x20 243*91f16700Schasinglulu mov x1, x21 244*91f16700Schasinglulu br x17 245*91f16700Schasinglulu1: 246*91f16700Schasinglulu 247*91f16700Schasinglulu /* ----------------------------------- 248*91f16700Schasinglulu * derive and save the phys_base addr 249*91f16700Schasinglulu * ----------------------------------- 250*91f16700Schasinglulu */ 251*91f16700Schasinglulu adr x17, tegra_bl31_phys_base 252*91f16700Schasinglulu ldr x18, [x17] 253*91f16700Schasinglulu cbnz x18, 1f 254*91f16700Schasinglulu adr x18, bl31_entrypoint 255*91f16700Schasinglulu str x18, [x17] 256*91f16700Schasinglulu 257*91f16700Schasinglulu /* ----------------------------------- 258*91f16700Schasinglulu * save the boot CPU MPID value 259*91f16700Schasinglulu * ----------------------------------- 260*91f16700Schasinglulu */ 261*91f16700Schasinglulu mrs x0, mpidr_el1 262*91f16700Schasinglulu adr x1, tegra_primary_cpu_mpid 263*91f16700Schasinglulu str x0, [x1] 264*91f16700Schasinglulu 265*91f16700Schasinglulu1: cpu_init_common 266*91f16700Schasinglulu 267*91f16700Schasinglulu ret 268*91f16700Schasingluluendfunc plat_reset_handler 269*91f16700Schasinglulu 270*91f16700Schasinglulu /* ------------------------------------------------------ 271*91f16700Schasinglulu * int32_t plat_core_pos_by_mpidr(u_register_t mpidr) 272*91f16700Schasinglulu * 273*91f16700Schasinglulu * This function implements a part of the critical 274*91f16700Schasinglulu * interface between the psci generic layer and the 275*91f16700Schasinglulu * platform that allows the former to query the platform 276*91f16700Schasinglulu * to convert an MPIDR to a unique linear index. An error 277*91f16700Schasinglulu * code (-1) is returned in case the MPIDR is invalid. 278*91f16700Schasinglulu * 279*91f16700Schasinglulu * Clobbers: x0-x3 280*91f16700Schasinglulu * ------------------------------------------------------ 281*91f16700Schasinglulu */ 282*91f16700Schasinglulufunc plat_core_pos_by_mpidr 283*91f16700Schasinglulu lsr x1, x0, #MPIDR_AFF0_SHIFT 284*91f16700Schasinglulu and x1, x1, #MPIDR_AFFLVL_MASK /* core id */ 285*91f16700Schasinglulu lsr x2, x0, #MPIDR_AFF1_SHIFT 286*91f16700Schasinglulu and x2, x2, #MPIDR_AFFLVL_MASK /* cluster id */ 287*91f16700Schasinglulu 288*91f16700Schasinglulu /* core_id >= PLATFORM_MAX_CPUS_PER_CLUSTER */ 289*91f16700Schasinglulu mov x0, #-1 290*91f16700Schasinglulu cmp x1, #(PLATFORM_MAX_CPUS_PER_CLUSTER - 1) 291*91f16700Schasinglulu b.gt 1f 292*91f16700Schasinglulu 293*91f16700Schasinglulu /* cluster_id >= PLATFORM_CLUSTER_COUNT */ 294*91f16700Schasinglulu cmp x2, #(PLATFORM_CLUSTER_COUNT - 1) 295*91f16700Schasinglulu b.gt 1f 296*91f16700Schasinglulu 297*91f16700Schasinglulu /* CorePos = CoreId + (ClusterId * cpus per cluster) */ 298*91f16700Schasinglulu mov x3, #PLATFORM_MAX_CPUS_PER_CLUSTER 299*91f16700Schasinglulu mul x3, x3, x2 300*91f16700Schasinglulu add x0, x1, x3 301*91f16700Schasinglulu 302*91f16700Schasinglulu1: 303*91f16700Schasinglulu ret 304*91f16700Schasingluluendfunc plat_core_pos_by_mpidr 305*91f16700Schasinglulu 306*91f16700Schasinglulu /* ---------------------------------------- 307*91f16700Schasinglulu * Secure entrypoint function for CPU boot 308*91f16700Schasinglulu * ---------------------------------------- 309*91f16700Schasinglulu */ 310*91f16700Schasinglulufunc tegra_secure_entrypoint _align=6 311*91f16700Schasinglulu 312*91f16700Schasinglulu#if ERRATA_TEGRA_INVALIDATE_BTB_AT_BOOT 313*91f16700Schasinglulu 314*91f16700Schasinglulu /* -------------------------------------------------------- 315*91f16700Schasinglulu * Skip the invalidate BTB workaround for Tegra210B01 SKUs. 316*91f16700Schasinglulu * -------------------------------------------------------- 317*91f16700Schasinglulu */ 318*91f16700Schasinglulu mov x0, #TEGRA_MISC_BASE 319*91f16700Schasinglulu add x0, x0, #HARDWARE_REVISION_OFFSET 320*91f16700Schasinglulu ldr w1, [x0] 321*91f16700Schasinglulu lsr w1, w1, #CHIP_ID_SHIFT 322*91f16700Schasinglulu and w1, w1, #CHIP_ID_MASK 323*91f16700Schasinglulu cmp w1, #TEGRA_CHIPID_TEGRA21 /* T210? */ 324*91f16700Schasinglulu b.ne 2f 325*91f16700Schasinglulu ldr w1, [x0] 326*91f16700Schasinglulu lsr w1, w1, #MAJOR_VERSION_SHIFT 327*91f16700Schasinglulu and w1, w1, #MAJOR_VERSION_MASK 328*91f16700Schasinglulu cmp w1, #0x02 /* T210 B01? */ 329*91f16700Schasinglulu b.eq 2f 330*91f16700Schasinglulu 331*91f16700Schasinglulu /* ------------------------------------------------------- 332*91f16700Schasinglulu * Invalidate BTB along with I$ to remove any stale 333*91f16700Schasinglulu * entries from the branch predictor array. 334*91f16700Schasinglulu * ------------------------------------------------------- 335*91f16700Schasinglulu */ 336*91f16700Schasinglulu mrs x0, CORTEX_A57_CPUACTLR_EL1 337*91f16700Schasinglulu orr x0, x0, #1 338*91f16700Schasinglulu msr CORTEX_A57_CPUACTLR_EL1, x0 /* invalidate BTB and I$ together */ 339*91f16700Schasinglulu dsb sy 340*91f16700Schasinglulu isb 341*91f16700Schasinglulu ic iallu /* actual invalidate */ 342*91f16700Schasinglulu dsb sy 343*91f16700Schasinglulu isb 344*91f16700Schasinglulu 345*91f16700Schasinglulu mrs x0, CORTEX_A57_CPUACTLR_EL1 346*91f16700Schasinglulu bic x0, x0, #1 347*91f16700Schasinglulu msr CORTEX_A57_CPUACTLR_EL1, X0 /* restore original CPUACTLR_EL1 */ 348*91f16700Schasinglulu dsb sy 349*91f16700Schasinglulu isb 350*91f16700Schasinglulu 351*91f16700Schasinglulu .rept 7 352*91f16700Schasinglulu nop /* wait */ 353*91f16700Schasinglulu .endr 354*91f16700Schasinglulu 355*91f16700Schasinglulu /* ----------------------------------------------- 356*91f16700Schasinglulu * Extract OSLK bit and check if it is '1'. This 357*91f16700Schasinglulu * bit remains '0' for A53 on warm-resets. If '1', 358*91f16700Schasinglulu * turn off regional clock gating and request warm 359*91f16700Schasinglulu * reset. 360*91f16700Schasinglulu * ----------------------------------------------- 361*91f16700Schasinglulu */ 362*91f16700Schasinglulu mrs x0, oslsr_el1 363*91f16700Schasinglulu and x0, x0, #2 364*91f16700Schasinglulu mrs x1, mpidr_el1 365*91f16700Schasinglulu bics xzr, x0, x1, lsr #7 /* 0 = slow cluster or warm reset */ 366*91f16700Schasinglulu b.eq restore_oslock 367*91f16700Schasinglulu mov x0, xzr 368*91f16700Schasinglulu msr oslar_el1, x0 /* os lock stays 0 across warm reset */ 369*91f16700Schasinglulu mov x3, #3 370*91f16700Schasinglulu movz x4, #0x8000, lsl #48 371*91f16700Schasinglulu msr CORTEX_A57_CPUACTLR_EL1, x4 /* turn off RCG */ 372*91f16700Schasinglulu isb 373*91f16700Schasinglulu msr rmr_el3, x3 /* request warm reset */ 374*91f16700Schasinglulu isb 375*91f16700Schasinglulu dsb sy 376*91f16700Schasinglulu1: wfi 377*91f16700Schasinglulu b 1b 378*91f16700Schasinglulu 379*91f16700Schasinglulu /* -------------------------------------------------- 380*91f16700Schasinglulu * These nops are here so that speculative execution 381*91f16700Schasinglulu * won't harm us before we are done with warm reset. 382*91f16700Schasinglulu * -------------------------------------------------- 383*91f16700Schasinglulu */ 384*91f16700Schasinglulu .rept 65 385*91f16700Schasinglulu nop 386*91f16700Schasinglulu .endr 387*91f16700Schasinglulu2: 388*91f16700Schasinglulu /* -------------------------------------------------- 389*91f16700Schasinglulu * Do not insert instructions here 390*91f16700Schasinglulu * -------------------------------------------------- 391*91f16700Schasinglulu */ 392*91f16700Schasinglulu#endif 393*91f16700Schasinglulu 394*91f16700Schasinglulu /* -------------------------------------------------- 395*91f16700Schasinglulu * Restore OS Lock bit 396*91f16700Schasinglulu * -------------------------------------------------- 397*91f16700Schasinglulu */ 398*91f16700Schasinglulurestore_oslock: 399*91f16700Schasinglulu mov x0, #1 400*91f16700Schasinglulu msr oslar_el1, x0 401*91f16700Schasinglulu 402*91f16700Schasinglulu /* -------------------------------------------------- 403*91f16700Schasinglulu * Get secure world's entry point and jump to it 404*91f16700Schasinglulu * -------------------------------------------------- 405*91f16700Schasinglulu */ 406*91f16700Schasinglulu bl plat_get_my_entrypoint 407*91f16700Schasinglulu br x0 408*91f16700Schasingluluendfunc tegra_secure_entrypoint 409*91f16700Schasinglulu 410*91f16700Schasinglulu .data 411*91f16700Schasinglulu .align 3 412*91f16700Schasinglulu 413*91f16700Schasinglulu /* -------------------------------------------------- 414*91f16700Schasinglulu * CPU Secure entry point - resume from suspend 415*91f16700Schasinglulu * -------------------------------------------------- 416*91f16700Schasinglulu */ 417*91f16700Schasinglulutegra_sec_entry_point: 418*91f16700Schasinglulu .quad 0 419*91f16700Schasinglulu 420*91f16700Schasinglulu /* -------------------------------------------------- 421*91f16700Schasinglulu * NS world's cold boot entry point 422*91f16700Schasinglulu * -------------------------------------------------- 423*91f16700Schasinglulu */ 424*91f16700Schasingluluns_image_entrypoint: 425*91f16700Schasinglulu .quad 0 426*91f16700Schasinglulu 427*91f16700Schasinglulu /* -------------------------------------------------- 428*91f16700Schasinglulu * BL31's physical base address 429*91f16700Schasinglulu * -------------------------------------------------- 430*91f16700Schasinglulu */ 431*91f16700Schasinglulutegra_bl31_phys_base: 432*91f16700Schasinglulu .quad 0 433*91f16700Schasinglulu 434*91f16700Schasinglulu /* -------------------------------------------------- 435*91f16700Schasinglulu * UART controller base for console init 436*91f16700Schasinglulu * -------------------------------------------------- 437*91f16700Schasinglulu */ 438*91f16700Schasinglulutegra_console_base: 439*91f16700Schasinglulu .quad 0 440*91f16700Schasinglulu 441*91f16700Schasinglulu /* -------------------------------------------------- 442*91f16700Schasinglulu * MPID value for the boot CPU 443*91f16700Schasinglulu * -------------------------------------------------- 444*91f16700Schasinglulu */ 445*91f16700Schasinglulutegra_primary_cpu_mpid: 446*91f16700Schasinglulu .quad 0 447