blob: 111fc1524eae007f252a00b5531d06a7496b59a8 [file] [log] [blame]
Varun Wadekarecd6a5a2018-04-09 17:48:58 -07001/*
2 * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
9#include <plat/common/common_def.h>
10#include <memctrl_v2.h>
11#include <tegra_def.h>
12
Varun Wadekar362a6b22017-11-10 11:04:42 -080013#define TEGRA194_SMMU_CTX_SIZE 0x490
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070014
15 .align 4
Varun Wadekar362a6b22017-11-10 11:04:42 -080016 .globl tegra194_cpu_reset_handler
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070017
18/* CPU reset handler routine */
Varun Wadekar362a6b22017-11-10 11:04:42 -080019func tegra194_cpu_reset_handler
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070020 /*
21 * The TZRAM loses state during System Suspend. We use this
22 * information to decide if the reset handler is running after a
23 * System Suspend. Resume from system suspend requires restoring
24 * the entire state from TZDRAM to TZRAM.
25 */
26 mov x0, #BL31_BASE
27 ldr x0, [x0]
28 cbnz x0, boot_cpu
29
30 /* resume from system suspend */
31 mov x0, #BL31_BASE
Varun Wadekar362a6b22017-11-10 11:04:42 -080032 adr x1, __tegra194_cpu_reset_handler_end
33 adr x2, __tegra194_cpu_reset_handler_data
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070034 ldr x2, [x2, #8]
35
36 /* memcpy16 */
37m_loop16:
38 cmp x2, #16
39 b.lt m_loop1
40 ldp x3, x4, [x1], #16
41 stp x3, x4, [x0], #16
42 sub x2, x2, #16
43 b m_loop16
44 /* copy byte per byte */
45m_loop1:
46 cbz x2, boot_cpu
47 ldrb w3, [x1], #1
48 strb w3, [x0], #1
49 subs x2, x2, #1
50 b.ne m_loop1
51
52boot_cpu:
Varun Wadekar362a6b22017-11-10 11:04:42 -080053 adr x0, __tegra194_cpu_reset_handler_data
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070054 ldr x0, [x0]
55 br x0
Varun Wadekar362a6b22017-11-10 11:04:42 -080056endfunc tegra194_cpu_reset_handler
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070057
58 /*
Varun Wadekar362a6b22017-11-10 11:04:42 -080059 * Tegra194 reset data (offset 0x0 - 0x2490)
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070060 *
Stefan Kristianssonfa871a62017-03-20 14:19:46 +020061 * 0x0000: secure world's entrypoint
62 * 0x0008: BL31 size (RO + RW)
63 * 0x0010: SMMU context start
64 * 0x2490: SMMU context end
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070065 */
66
67 .align 4
Varun Wadekar362a6b22017-11-10 11:04:42 -080068 .type __tegra194_cpu_reset_handler_data, %object
69 .globl __tegra194_cpu_reset_handler_data
70__tegra194_cpu_reset_handler_data:
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070071 .quad tegra_secure_entrypoint
72 .quad __BL31_END__ - BL31_BASE
Varun Wadekar362a6b22017-11-10 11:04:42 -080073 .globl __tegra194_smmu_ctx_start
74__tegra194_smmu_ctx_start:
75 .rept TEGRA194_SMMU_CTX_SIZE
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070076 .quad 0
77 .endr
Varun Wadekar362a6b22017-11-10 11:04:42 -080078 .size __tegra194_cpu_reset_handler_data, \
79 . - __tegra194_cpu_reset_handler_data
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070080
81 .align 4
Varun Wadekar362a6b22017-11-10 11:04:42 -080082 .globl __tegra194_cpu_reset_handler_end
83__tegra194_cpu_reset_handler_end: