141612559SVarun Wadekar/* 241612559SVarun Wadekar * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. 341612559SVarun Wadekar * 441612559SVarun Wadekar * SPDX-License-Identifier: BSD-3-Clause 541612559SVarun Wadekar */ 641612559SVarun Wadekar 741612559SVarun Wadekar#include <arch.h> 841612559SVarun Wadekar#include <asm_macros.S> 941612559SVarun Wadekar#include <plat/common/common_def.h> 1041612559SVarun Wadekar#include <memctrl_v2.h> 1141612559SVarun Wadekar#include <tegra_def.h> 1241612559SVarun Wadekar 13*040529e9SVarun Wadekar#define TEGRA194_STATE_SYSTEM_SUSPEND 0x5C7 14*040529e9SVarun Wadekar#define TEGRA194_STATE_SYSTEM_RESUME 0x600D 151c62509eSVarun Wadekar#define TEGRA194_SMMU_CTX_SIZE 0x490 1641612559SVarun Wadekar 1741612559SVarun Wadekar .align 4 181c62509eSVarun Wadekar .globl tegra194_cpu_reset_handler 1941612559SVarun Wadekar 2041612559SVarun Wadekar/* CPU reset handler routine */ 211c62509eSVarun Wadekarfunc tegra194_cpu_reset_handler 22*040529e9SVarun Wadekar /* check if we are exiting system suspend state */ 23*040529e9SVarun Wadekar adr x0, __tegra194_system_suspend_state 24*040529e9SVarun Wadekar ldr x1, [x0] 25*040529e9SVarun Wadekar mov x2, #TEGRA194_STATE_SYSTEM_SUSPEND 26*040529e9SVarun Wadekar lsl x2, x2, #16 27*040529e9SVarun Wadekar add x2, x2, #TEGRA194_STATE_SYSTEM_SUSPEND 28*040529e9SVarun Wadekar cmp x1, x2 29*040529e9SVarun Wadekar bne boot_cpu 3041612559SVarun Wadekar 31*040529e9SVarun Wadekar /* set system resume state */ 32*040529e9SVarun Wadekar mov x1, #TEGRA194_STATE_SYSTEM_RESUME 33*040529e9SVarun Wadekar lsl x1, x1, #16 34*040529e9SVarun Wadekar mov x2, #TEGRA194_STATE_SYSTEM_RESUME 35*040529e9SVarun Wadekar add x1, x1, x2 36*040529e9SVarun Wadekar str x1, [x0] 37*040529e9SVarun Wadekar dsb sy 38*040529e9SVarun Wadekar 39*040529e9SVarun Wadekar /* prepare to relocate to TZSRAM */ 4041612559SVarun Wadekar mov x0, #BL31_BASE 411c62509eSVarun Wadekar adr x1, __tegra194_cpu_reset_handler_end 421c62509eSVarun Wadekar adr x2, __tegra194_cpu_reset_handler_data 4341612559SVarun Wadekar ldr x2, [x2, #8] 4441612559SVarun Wadekar 4541612559SVarun Wadekar /* memcpy16 */ 4641612559SVarun Wadekarm_loop16: 4741612559SVarun Wadekar cmp x2, #16 4841612559SVarun Wadekar b.lt m_loop1 4941612559SVarun Wadekar ldp x3, x4, [x1], #16 5041612559SVarun Wadekar stp x3, x4, [x0], #16 5141612559SVarun Wadekar sub x2, x2, #16 5241612559SVarun Wadekar b m_loop16 5341612559SVarun Wadekar /* copy byte per byte */ 5441612559SVarun Wadekarm_loop1: 5541612559SVarun Wadekar cbz x2, boot_cpu 5641612559SVarun Wadekar ldrb w3, [x1], #1 5741612559SVarun Wadekar strb w3, [x0], #1 5841612559SVarun Wadekar subs x2, x2, #1 5941612559SVarun Wadekar b.ne m_loop1 6041612559SVarun Wadekar 6141612559SVarun Wadekarboot_cpu: 621c62509eSVarun Wadekar adr x0, __tegra194_cpu_reset_handler_data 6341612559SVarun Wadekar ldr x0, [x0] 6441612559SVarun Wadekar br x0 651c62509eSVarun Wadekarendfunc tegra194_cpu_reset_handler 6641612559SVarun Wadekar 6741612559SVarun Wadekar /* 681c62509eSVarun Wadekar * Tegra194 reset data (offset 0x0 - 0x2490) 6941612559SVarun Wadekar * 70ddbf946fSStefan Kristiansson * 0x0000: secure world's entrypoint 71ddbf946fSStefan Kristiansson * 0x0008: BL31 size (RO + RW) 72ddbf946fSStefan Kristiansson * 0x0010: SMMU context start 73ddbf946fSStefan Kristiansson * 0x2490: SMMU context end 7441612559SVarun Wadekar */ 7541612559SVarun Wadekar 7641612559SVarun Wadekar .align 4 771c62509eSVarun Wadekar .type __tegra194_cpu_reset_handler_data, %object 781c62509eSVarun Wadekar .globl __tegra194_cpu_reset_handler_data 791c62509eSVarun Wadekar__tegra194_cpu_reset_handler_data: 8041612559SVarun Wadekar .quad tegra_secure_entrypoint 8141612559SVarun Wadekar .quad __BL31_END__ - BL31_BASE 82653fc380SVarun Wadekar 83*040529e9SVarun Wadekar .globl __tegra194_system_suspend_state 84*040529e9SVarun Wadekar__tegra194_system_suspend_state: 85*040529e9SVarun Wadekar .quad 0 86*040529e9SVarun Wadekar 87653fc380SVarun Wadekar .align 4 88653fc380SVarun Wadekar__tegra194_smmu_context: 891c62509eSVarun Wadekar .rept TEGRA194_SMMU_CTX_SIZE 9041612559SVarun Wadekar .quad 0 9141612559SVarun Wadekar .endr 921c62509eSVarun Wadekar .size __tegra194_cpu_reset_handler_data, \ 931c62509eSVarun Wadekar . - __tegra194_cpu_reset_handler_data 9441612559SVarun Wadekar 9541612559SVarun Wadekar .align 4 961c62509eSVarun Wadekar .globl __tegra194_cpu_reset_handler_end 971c62509eSVarun Wadekar__tegra194_cpu_reset_handler_end: 98653fc380SVarun Wadekar 99653fc380SVarun Wadekar .globl tegra194_get_cpu_reset_handler_size 100653fc380SVarun Wadekar .globl tegra194_get_cpu_reset_handler_base 101653fc380SVarun Wadekar .globl tegra194_get_smmu_ctx_offset 102*040529e9SVarun Wadekar .globl tegra194_set_system_suspend_entry 103653fc380SVarun Wadekar 104653fc380SVarun Wadekar/* return size of the CPU reset handler */ 105653fc380SVarun Wadekarfunc tegra194_get_cpu_reset_handler_size 106653fc380SVarun Wadekar adr x0, __tegra194_cpu_reset_handler_end 107653fc380SVarun Wadekar adr x1, tegra194_cpu_reset_handler 108653fc380SVarun Wadekar sub x0, x0, x1 109653fc380SVarun Wadekar ret 110653fc380SVarun Wadekarendfunc tegra194_get_cpu_reset_handler_size 111653fc380SVarun Wadekar 112653fc380SVarun Wadekar/* return the start address of the CPU reset handler */ 113653fc380SVarun Wadekarfunc tegra194_get_cpu_reset_handler_base 114653fc380SVarun Wadekar adr x0, tegra194_cpu_reset_handler 115653fc380SVarun Wadekar ret 116653fc380SVarun Wadekarendfunc tegra194_get_cpu_reset_handler_base 117653fc380SVarun Wadekar 118653fc380SVarun Wadekar/* return the size of the SMMU context */ 119653fc380SVarun Wadekarfunc tegra194_get_smmu_ctx_offset 120653fc380SVarun Wadekar adr x0, __tegra194_smmu_context 121653fc380SVarun Wadekar adr x1, tegra194_cpu_reset_handler 122653fc380SVarun Wadekar sub x0, x0, x1 123653fc380SVarun Wadekar ret 124653fc380SVarun Wadekarendfunc tegra194_get_smmu_ctx_offset 125*040529e9SVarun Wadekar 126*040529e9SVarun Wadekar/* set system suspend state before SC7 entry */ 127*040529e9SVarun Wadekarfunc tegra194_set_system_suspend_entry 128*040529e9SVarun Wadekar mov x0, #TEGRA_MC_BASE 129*040529e9SVarun Wadekar mov x3, #MC_SECURITY_CFG3_0 130*040529e9SVarun Wadekar ldr w1, [x0, x3] 131*040529e9SVarun Wadekar lsl x1, x1, #32 132*040529e9SVarun Wadekar mov x3, #MC_SECURITY_CFG0_0 133*040529e9SVarun Wadekar ldr w2, [x0, x3] 134*040529e9SVarun Wadekar orr x3, x1, x2 /* TZDRAM base */ 135*040529e9SVarun Wadekar adr x0, __tegra194_system_suspend_state 136*040529e9SVarun Wadekar adr x1, tegra194_cpu_reset_handler 137*040529e9SVarun Wadekar sub x2, x0, x1 /* offset in TZDRAM */ 138*040529e9SVarun Wadekar mov x0, #TEGRA194_STATE_SYSTEM_SUSPEND 139*040529e9SVarun Wadekar lsl x0, x0, #16 140*040529e9SVarun Wadekar add x0, x0, #TEGRA194_STATE_SYSTEM_SUSPEND 141*040529e9SVarun Wadekar str x0, [x3, x2] /* set value in TZDRAM */ 142*040529e9SVarun Wadekar dsb sy 143*040529e9SVarun Wadekar ret 144*040529e9SVarun Wadekarendfunc tegra194_set_system_suspend_entry 145