141612559SVarun Wadekar/* 2*844e6cc5SPritesh Raithatha * Copyright (c) 2019-2020, 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 13040529e9SVarun Wadekar#define TEGRA194_STATE_SYSTEM_SUSPEND 0x5C7 14040529e9SVarun Wadekar#define TEGRA194_STATE_SYSTEM_RESUME 0x600D 15*844e6cc5SPritesh Raithatha#define TEGRA194_SMMU_CTX_SIZE 0x80D 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 22040529e9SVarun Wadekar /* check if we are exiting system suspend state */ 23040529e9SVarun Wadekar adr x0, __tegra194_system_suspend_state 24040529e9SVarun Wadekar ldr x1, [x0] 25040529e9SVarun Wadekar mov x2, #TEGRA194_STATE_SYSTEM_SUSPEND 26040529e9SVarun Wadekar lsl x2, x2, #16 27040529e9SVarun Wadekar add x2, x2, #TEGRA194_STATE_SYSTEM_SUSPEND 28040529e9SVarun Wadekar cmp x1, x2 29040529e9SVarun Wadekar bne boot_cpu 3041612559SVarun Wadekar 31040529e9SVarun Wadekar /* set system resume state */ 32040529e9SVarun Wadekar mov x1, #TEGRA194_STATE_SYSTEM_RESUME 33040529e9SVarun Wadekar lsl x1, x1, #16 34040529e9SVarun Wadekar mov x2, #TEGRA194_STATE_SYSTEM_RESUME 35040529e9SVarun Wadekar add x1, x1, x2 36040529e9SVarun Wadekar str x1, [x0] 37040529e9SVarun Wadekar dsb sy 38040529e9SVarun Wadekar 39040529e9SVarun 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 83040529e9SVarun Wadekar .globl __tegra194_system_suspend_state 84040529e9SVarun Wadekar__tegra194_system_suspend_state: 85040529e9SVarun Wadekar .quad 0 86040529e9SVarun 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 102040529e9SVarun 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 125040529e9SVarun Wadekar 126040529e9SVarun Wadekar/* set system suspend state before SC7 entry */ 127040529e9SVarun Wadekarfunc tegra194_set_system_suspend_entry 128040529e9SVarun Wadekar mov x0, #TEGRA_MC_BASE 129040529e9SVarun Wadekar mov x3, #MC_SECURITY_CFG3_0 130040529e9SVarun Wadekar ldr w1, [x0, x3] 131040529e9SVarun Wadekar lsl x1, x1, #32 132040529e9SVarun Wadekar mov x3, #MC_SECURITY_CFG0_0 133040529e9SVarun Wadekar ldr w2, [x0, x3] 134040529e9SVarun Wadekar orr x3, x1, x2 /* TZDRAM base */ 135040529e9SVarun Wadekar adr x0, __tegra194_system_suspend_state 136040529e9SVarun Wadekar adr x1, tegra194_cpu_reset_handler 137040529e9SVarun Wadekar sub x2, x0, x1 /* offset in TZDRAM */ 138040529e9SVarun Wadekar mov x0, #TEGRA194_STATE_SYSTEM_SUSPEND 139040529e9SVarun Wadekar lsl x0, x0, #16 140040529e9SVarun Wadekar add x0, x0, #TEGRA194_STATE_SYSTEM_SUSPEND 141040529e9SVarun Wadekar str x0, [x3, x2] /* set value in TZDRAM */ 142040529e9SVarun Wadekar dsb sy 143040529e9SVarun Wadekar ret 144040529e9SVarun Wadekarendfunc tegra194_set_system_suspend_entry 145