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*ddbf946fSStefan Kristiansson#define TEGRA186_SMMU_CTX_SIZE 0x490 1441612559SVarun Wadekar 1541612559SVarun Wadekar .align 4 1641612559SVarun Wadekar .globl tegra186_cpu_reset_handler 1741612559SVarun Wadekar 1841612559SVarun Wadekar/* CPU reset handler routine */ 1941612559SVarun Wadekarfunc tegra186_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 3241612559SVarun Wadekar adr x1, __tegra186_cpu_reset_handler_end 3341612559SVarun Wadekar adr x2, __tegra186_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: 5341612559SVarun Wadekar adr x0, __tegra186_cpu_reset_handler_data 5441612559SVarun Wadekar ldr x0, [x0] 5541612559SVarun Wadekar br x0 5641612559SVarun Wadekarendfunc tegra186_cpu_reset_handler 5741612559SVarun Wadekar 5841612559SVarun Wadekar /* 59*ddbf946fSStefan Kristiansson * Tegra186 reset data (offset 0x0 - 0x2490) 6041612559SVarun Wadekar * 61*ddbf946fSStefan Kristiansson * 0x0000: secure world's entrypoint 62*ddbf946fSStefan Kristiansson * 0x0008: BL31 size (RO + RW) 63*ddbf946fSStefan Kristiansson * 0x0010: SMMU context start 64*ddbf946fSStefan Kristiansson * 0x2490: SMMU context end 6541612559SVarun Wadekar */ 6641612559SVarun Wadekar 6741612559SVarun Wadekar .align 4 6841612559SVarun Wadekar .type __tegra186_cpu_reset_handler_data, %object 6941612559SVarun Wadekar .globl __tegra186_cpu_reset_handler_data 7041612559SVarun Wadekar__tegra186_cpu_reset_handler_data: 7141612559SVarun Wadekar .quad tegra_secure_entrypoint 7241612559SVarun Wadekar .quad __BL31_END__ - BL31_BASE 7341612559SVarun Wadekar .globl __tegra186_smmu_ctx_start 7441612559SVarun Wadekar__tegra186_smmu_ctx_start: 7541612559SVarun Wadekar .rept TEGRA186_SMMU_CTX_SIZE 7641612559SVarun Wadekar .quad 0 7741612559SVarun Wadekar .endr 7841612559SVarun Wadekar .size __tegra186_cpu_reset_handler_data, \ 7941612559SVarun Wadekar . - __tegra186_cpu_reset_handler_data 8041612559SVarun Wadekar 8141612559SVarun Wadekar .align 4 8241612559SVarun Wadekar .globl __tegra186_cpu_reset_handler_end 8341612559SVarun Wadekar__tegra186_cpu_reset_handler_end: 84