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 131c62509eSVarun Wadekar#define TEGRA194_SMMU_CTX_SIZE 0x490 1441612559SVarun Wadekar 1541612559SVarun Wadekar .align 4 161c62509eSVarun Wadekar .globl tegra194_cpu_reset_handler 1741612559SVarun Wadekar 1841612559SVarun Wadekar/* CPU reset handler routine */ 191c62509eSVarun Wadekarfunc tegra194_cpu_reset_handler 2041612559SVarun Wadekar /* 2141612559SVarun Wadekar * The TZRAM loses state during System Suspend. We use this 2241612559SVarun Wadekar * information to decide if the reset handler is running after a 2341612559SVarun Wadekar * System Suspend. Resume from system suspend requires restoring 2441612559SVarun Wadekar * the entire state from TZDRAM to TZRAM. 2541612559SVarun Wadekar */ 2641612559SVarun Wadekar mov x0, #BL31_BASE 2741612559SVarun Wadekar ldr x0, [x0] 2841612559SVarun Wadekar cbnz x0, boot_cpu 2941612559SVarun Wadekar 3041612559SVarun Wadekar /* resume from system suspend */ 3141612559SVarun Wadekar mov x0, #BL31_BASE 321c62509eSVarun Wadekar adr x1, __tegra194_cpu_reset_handler_end 331c62509eSVarun Wadekar adr x2, __tegra194_cpu_reset_handler_data 3441612559SVarun Wadekar ldr x2, [x2, #8] 3541612559SVarun Wadekar 3641612559SVarun Wadekar /* memcpy16 */ 3741612559SVarun Wadekarm_loop16: 3841612559SVarun Wadekar cmp x2, #16 3941612559SVarun Wadekar b.lt m_loop1 4041612559SVarun Wadekar ldp x3, x4, [x1], #16 4141612559SVarun Wadekar stp x3, x4, [x0], #16 4241612559SVarun Wadekar sub x2, x2, #16 4341612559SVarun Wadekar b m_loop16 4441612559SVarun Wadekar /* copy byte per byte */ 4541612559SVarun Wadekarm_loop1: 4641612559SVarun Wadekar cbz x2, boot_cpu 4741612559SVarun Wadekar ldrb w3, [x1], #1 4841612559SVarun Wadekar strb w3, [x0], #1 4941612559SVarun Wadekar subs x2, x2, #1 5041612559SVarun Wadekar b.ne m_loop1 5141612559SVarun Wadekar 5241612559SVarun Wadekarboot_cpu: 531c62509eSVarun Wadekar adr x0, __tegra194_cpu_reset_handler_data 5441612559SVarun Wadekar ldr x0, [x0] 5541612559SVarun Wadekar br x0 561c62509eSVarun Wadekarendfunc tegra194_cpu_reset_handler 5741612559SVarun Wadekar 5841612559SVarun Wadekar /* 591c62509eSVarun Wadekar * Tegra194 reset data (offset 0x0 - 0x2490) 6041612559SVarun Wadekar * 61ddbf946fSStefan Kristiansson * 0x0000: secure world's entrypoint 62ddbf946fSStefan Kristiansson * 0x0008: BL31 size (RO + RW) 63ddbf946fSStefan Kristiansson * 0x0010: SMMU context start 64ddbf946fSStefan Kristiansson * 0x2490: SMMU context end 6541612559SVarun Wadekar */ 6641612559SVarun Wadekar 6741612559SVarun Wadekar .align 4 681c62509eSVarun Wadekar .type __tegra194_cpu_reset_handler_data, %object 691c62509eSVarun Wadekar .globl __tegra194_cpu_reset_handler_data 701c62509eSVarun Wadekar__tegra194_cpu_reset_handler_data: 7141612559SVarun Wadekar .quad tegra_secure_entrypoint 7241612559SVarun Wadekar .quad __BL31_END__ - BL31_BASE 73*653fc380SVarun Wadekar 74*653fc380SVarun Wadekar .align 4 75*653fc380SVarun Wadekar__tegra194_smmu_context: 761c62509eSVarun Wadekar .rept TEGRA194_SMMU_CTX_SIZE 7741612559SVarun Wadekar .quad 0 7841612559SVarun Wadekar .endr 791c62509eSVarun Wadekar .size __tegra194_cpu_reset_handler_data, \ 801c62509eSVarun Wadekar . - __tegra194_cpu_reset_handler_data 8141612559SVarun Wadekar 8241612559SVarun Wadekar .align 4 831c62509eSVarun Wadekar .globl __tegra194_cpu_reset_handler_end 841c62509eSVarun Wadekar__tegra194_cpu_reset_handler_end: 85*653fc380SVarun Wadekar 86*653fc380SVarun Wadekar .globl tegra194_get_cpu_reset_handler_size 87*653fc380SVarun Wadekar .globl tegra194_get_cpu_reset_handler_base 88*653fc380SVarun Wadekar .globl tegra194_get_smmu_ctx_offset 89*653fc380SVarun Wadekar 90*653fc380SVarun Wadekar/* return size of the CPU reset handler */ 91*653fc380SVarun Wadekarfunc tegra194_get_cpu_reset_handler_size 92*653fc380SVarun Wadekar adr x0, __tegra194_cpu_reset_handler_end 93*653fc380SVarun Wadekar adr x1, tegra194_cpu_reset_handler 94*653fc380SVarun Wadekar sub x0, x0, x1 95*653fc380SVarun Wadekar ret 96*653fc380SVarun Wadekarendfunc tegra194_get_cpu_reset_handler_size 97*653fc380SVarun Wadekar 98*653fc380SVarun Wadekar/* return the start address of the CPU reset handler */ 99*653fc380SVarun Wadekarfunc tegra194_get_cpu_reset_handler_base 100*653fc380SVarun Wadekar adr x0, tegra194_cpu_reset_handler 101*653fc380SVarun Wadekar ret 102*653fc380SVarun Wadekarendfunc tegra194_get_cpu_reset_handler_base 103*653fc380SVarun Wadekar 104*653fc380SVarun Wadekar/* return the size of the SMMU context */ 105*653fc380SVarun Wadekarfunc tegra194_get_smmu_ctx_offset 106*653fc380SVarun Wadekar adr x0, __tegra194_smmu_context 107*653fc380SVarun Wadekar adr x1, tegra194_cpu_reset_handler 108*653fc380SVarun Wadekar sub x0, x0, x1 109*653fc380SVarun Wadekar ret 110*653fc380SVarun Wadekarendfunc tegra194_get_smmu_ctx_offset 111