1*91f16700Schasinglulu/* 2*91f16700Schasinglulu * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu#include <arch.h> 8*91f16700Schasinglulu#include <asm_macros.S> 9*91f16700Schasinglulu#include <plat/common/common_def.h> 10*91f16700Schasinglulu#include <memctrl_v2.h> 11*91f16700Schasinglulu#include <tegra_def.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu#define TEGRA194_STATE_SYSTEM_SUSPEND 0x5C7 14*91f16700Schasinglulu#define TEGRA194_STATE_SYSTEM_RESUME 0x600D 15*91f16700Schasinglulu#define TEGRA194_MC_CTX_SIZE 0xFB 16*91f16700Schasinglulu 17*91f16700Schasinglulu .align 4 18*91f16700Schasinglulu .globl tegra194_cpu_reset_handler 19*91f16700Schasinglulu 20*91f16700Schasinglulu/* CPU reset handler routine */ 21*91f16700Schasinglulufunc tegra194_cpu_reset_handler 22*91f16700Schasinglulu /* check if we are exiting system suspend state */ 23*91f16700Schasinglulu adr x0, __tegra194_system_suspend_state 24*91f16700Schasinglulu ldr x1, [x0] 25*91f16700Schasinglulu mov x2, #TEGRA194_STATE_SYSTEM_SUSPEND 26*91f16700Schasinglulu lsl x2, x2, #16 27*91f16700Schasinglulu add x2, x2, #TEGRA194_STATE_SYSTEM_SUSPEND 28*91f16700Schasinglulu cmp x1, x2 29*91f16700Schasinglulu bne boot_cpu 30*91f16700Schasinglulu 31*91f16700Schasinglulu /* set system resume state */ 32*91f16700Schasinglulu mov x1, #TEGRA194_STATE_SYSTEM_RESUME 33*91f16700Schasinglulu lsl x1, x1, #16 34*91f16700Schasinglulu mov x2, #TEGRA194_STATE_SYSTEM_RESUME 35*91f16700Schasinglulu add x1, x1, x2 36*91f16700Schasinglulu str x1, [x0] 37*91f16700Schasinglulu dsb sy 38*91f16700Schasinglulu 39*91f16700Schasinglulu /* prepare to relocate to TZSRAM */ 40*91f16700Schasinglulu mov x0, #BL31_BASE 41*91f16700Schasinglulu adr x1, __tegra194_cpu_reset_handler_end 42*91f16700Schasinglulu adr x2, __tegra194_cpu_reset_handler_data 43*91f16700Schasinglulu ldr x2, [x2, #8] 44*91f16700Schasinglulu 45*91f16700Schasinglulu /* memcpy16 */ 46*91f16700Schasinglulum_loop16: 47*91f16700Schasinglulu cmp x2, #16 48*91f16700Schasinglulu b.lt m_loop1 49*91f16700Schasinglulu ldp x3, x4, [x1], #16 50*91f16700Schasinglulu stp x3, x4, [x0], #16 51*91f16700Schasinglulu sub x2, x2, #16 52*91f16700Schasinglulu b m_loop16 53*91f16700Schasinglulu /* copy byte per byte */ 54*91f16700Schasinglulum_loop1: 55*91f16700Schasinglulu cbz x2, boot_cpu 56*91f16700Schasinglulu ldrb w3, [x1], #1 57*91f16700Schasinglulu strb w3, [x0], #1 58*91f16700Schasinglulu subs x2, x2, #1 59*91f16700Schasinglulu b.ne m_loop1 60*91f16700Schasinglulu 61*91f16700Schasinglulu /* 62*91f16700Schasinglulu * Synchronization barriers to make sure that memory is flushed out 63*91f16700Schasinglulu * before we start execution in SysRAM. 64*91f16700Schasinglulu */ 65*91f16700Schasinglulu dsb sy 66*91f16700Schasinglulu isb 67*91f16700Schasinglulu 68*91f16700Schasingluluboot_cpu: 69*91f16700Schasinglulu adr x0, __tegra194_cpu_reset_handler_data 70*91f16700Schasinglulu ldr x0, [x0] 71*91f16700Schasinglulu br x0 72*91f16700Schasingluluendfunc tegra194_cpu_reset_handler 73*91f16700Schasinglulu 74*91f16700Schasinglulu /* 75*91f16700Schasinglulu * Tegra194 reset data (offset 0x0 - 0x2490) 76*91f16700Schasinglulu * 77*91f16700Schasinglulu * 0x0000: secure world's entrypoint 78*91f16700Schasinglulu * 0x0008: BL31 size (RO + RW) 79*91f16700Schasinglulu * 0x0010: MC context start 80*91f16700Schasinglulu * 0x2490: MC context end 81*91f16700Schasinglulu */ 82*91f16700Schasinglulu 83*91f16700Schasinglulu .align 4 84*91f16700Schasinglulu .type __tegra194_cpu_reset_handler_data, %object 85*91f16700Schasinglulu .globl __tegra194_cpu_reset_handler_data 86*91f16700Schasinglulu__tegra194_cpu_reset_handler_data: 87*91f16700Schasinglulu .quad tegra_secure_entrypoint 88*91f16700Schasinglulu .quad __BL31_END__ - BL31_BASE 89*91f16700Schasinglulu .globl __tegra194_system_suspend_state 90*91f16700Schasinglulu__tegra194_system_suspend_state: 91*91f16700Schasinglulu .quad 0 92*91f16700Schasinglulu 93*91f16700Schasinglulu .align 4 94*91f16700Schasinglulu__tegra194_mc_context: 95*91f16700Schasinglulu .rept TEGRA194_MC_CTX_SIZE 96*91f16700Schasinglulu .quad 0 97*91f16700Schasinglulu .endr 98*91f16700Schasinglulu .size __tegra194_cpu_reset_handler_data, \ 99*91f16700Schasinglulu . - __tegra194_cpu_reset_handler_data 100*91f16700Schasinglulu 101*91f16700Schasinglulu .align 4 102*91f16700Schasinglulu .globl __tegra194_cpu_reset_handler_end 103*91f16700Schasinglulu__tegra194_cpu_reset_handler_end: 104*91f16700Schasinglulu 105*91f16700Schasinglulu .globl tegra194_get_cpu_reset_handler_size 106*91f16700Schasinglulu .globl tegra194_get_cpu_reset_handler_base 107*91f16700Schasinglulu .globl tegra194_get_mc_ctx_offset 108*91f16700Schasinglulu .globl tegra194_set_system_suspend_entry 109*91f16700Schasinglulu 110*91f16700Schasinglulu/* return size of the CPU reset handler */ 111*91f16700Schasinglulufunc tegra194_get_cpu_reset_handler_size 112*91f16700Schasinglulu adr x0, __tegra194_cpu_reset_handler_end 113*91f16700Schasinglulu adr x1, tegra194_cpu_reset_handler 114*91f16700Schasinglulu sub x0, x0, x1 115*91f16700Schasinglulu ret 116*91f16700Schasingluluendfunc tegra194_get_cpu_reset_handler_size 117*91f16700Schasinglulu 118*91f16700Schasinglulu/* return the start address of the CPU reset handler */ 119*91f16700Schasinglulufunc tegra194_get_cpu_reset_handler_base 120*91f16700Schasinglulu adr x0, tegra194_cpu_reset_handler 121*91f16700Schasinglulu ret 122*91f16700Schasingluluendfunc tegra194_get_cpu_reset_handler_base 123*91f16700Schasinglulu 124*91f16700Schasinglulu/* return the size of the MC context */ 125*91f16700Schasinglulufunc tegra194_get_mc_ctx_offset 126*91f16700Schasinglulu adr x0, __tegra194_mc_context 127*91f16700Schasinglulu adr x1, tegra194_cpu_reset_handler 128*91f16700Schasinglulu sub x0, x0, x1 129*91f16700Schasinglulu ret 130*91f16700Schasingluluendfunc tegra194_get_mc_ctx_offset 131*91f16700Schasinglulu 132*91f16700Schasinglulu/* set system suspend state before SC7 entry */ 133*91f16700Schasinglulufunc tegra194_set_system_suspend_entry 134*91f16700Schasinglulu mov x0, #TEGRA_MC_BASE 135*91f16700Schasinglulu mov x3, #MC_SECURITY_CFG3_0 136*91f16700Schasinglulu ldr w1, [x0, x3] 137*91f16700Schasinglulu lsl x1, x1, #32 138*91f16700Schasinglulu mov x3, #MC_SECURITY_CFG0_0 139*91f16700Schasinglulu ldr w2, [x0, x3] 140*91f16700Schasinglulu orr x3, x1, x2 /* TZDRAM base */ 141*91f16700Schasinglulu adr x0, __tegra194_system_suspend_state 142*91f16700Schasinglulu adr x1, tegra194_cpu_reset_handler 143*91f16700Schasinglulu sub x2, x0, x1 /* offset in TZDRAM */ 144*91f16700Schasinglulu mov x0, #TEGRA194_STATE_SYSTEM_SUSPEND 145*91f16700Schasinglulu lsl x0, x0, #16 146*91f16700Schasinglulu add x0, x0, #TEGRA194_STATE_SYSTEM_SUSPEND 147*91f16700Schasinglulu str x0, [x3, x2] /* set value in TZDRAM */ 148*91f16700Schasinglulu dsb sy 149*91f16700Schasinglulu ret 150*91f16700Schasingluluendfunc tegra194_set_system_suspend_entry 151