xref: /rk3399_ARM-atf/plat/nvidia/tegra/soc/t194/plat_trampoline.S (revision 859df7d55bc5176c8c1dac69920de22809fa600d)
141612559SVarun Wadekar/*
2844e6cc5SPritesh 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
15a391d494SPritesh Raithatha#define TEGRA194_MC_CTX_SIZE		0xFB
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
61*1740ed12SVarun Wadekar	/*
62*1740ed12SVarun Wadekar	 * Synchronization barriers to make sure that memory is flushed out
63*1740ed12SVarun Wadekar	 * before we start execution in SysRAM.
64*1740ed12SVarun Wadekar	 */
65*1740ed12SVarun Wadekar	dsb	sy
66*1740ed12SVarun Wadekar	isb
67*1740ed12SVarun Wadekar
6841612559SVarun Wadekarboot_cpu:
691c62509eSVarun Wadekar	adr	x0, __tegra194_cpu_reset_handler_data
7041612559SVarun Wadekar	ldr	x0, [x0]
7141612559SVarun Wadekar	br	x0
721c62509eSVarun Wadekarendfunc tegra194_cpu_reset_handler
7341612559SVarun Wadekar
7441612559SVarun Wadekar	/*
751c62509eSVarun Wadekar	 * Tegra194 reset data (offset 0x0 - 0x2490)
7641612559SVarun Wadekar	 *
77ddbf946fSStefan Kristiansson	 * 0x0000: secure world's entrypoint
78ddbf946fSStefan Kristiansson	 * 0x0008: BL31 size (RO + RW)
79a391d494SPritesh Raithatha	 * 0x0010: MC context start
80a391d494SPritesh Raithatha	 * 0x2490: MC context end
8141612559SVarun Wadekar	 */
8241612559SVarun Wadekar
8341612559SVarun Wadekar	.align 4
841c62509eSVarun Wadekar	.type	__tegra194_cpu_reset_handler_data, %object
851c62509eSVarun Wadekar	.globl	__tegra194_cpu_reset_handler_data
861c62509eSVarun Wadekar__tegra194_cpu_reset_handler_data:
8741612559SVarun Wadekar	.quad	tegra_secure_entrypoint
8841612559SVarun Wadekar	.quad	__BL31_END__ - BL31_BASE
89040529e9SVarun Wadekar	.globl	__tegra194_system_suspend_state
90040529e9SVarun Wadekar__tegra194_system_suspend_state:
91040529e9SVarun Wadekar	.quad	0
92040529e9SVarun Wadekar
93653fc380SVarun Wadekar	.align 4
94a391d494SPritesh Raithatha__tegra194_mc_context:
95a391d494SPritesh Raithatha	.rept	TEGRA194_MC_CTX_SIZE
9641612559SVarun Wadekar	.quad	0
9741612559SVarun Wadekar	.endr
981c62509eSVarun Wadekar	.size	__tegra194_cpu_reset_handler_data, \
991c62509eSVarun Wadekar		. - __tegra194_cpu_reset_handler_data
10041612559SVarun Wadekar
10141612559SVarun Wadekar	.align 4
1021c62509eSVarun Wadekar	.globl	__tegra194_cpu_reset_handler_end
1031c62509eSVarun Wadekar__tegra194_cpu_reset_handler_end:
104653fc380SVarun Wadekar
105653fc380SVarun Wadekar	.globl tegra194_get_cpu_reset_handler_size
106653fc380SVarun Wadekar	.globl tegra194_get_cpu_reset_handler_base
107a391d494SPritesh Raithatha	.globl tegra194_get_mc_ctx_offset
108040529e9SVarun Wadekar	.globl tegra194_set_system_suspend_entry
109653fc380SVarun Wadekar
110653fc380SVarun Wadekar/* return size of the CPU reset handler */
111653fc380SVarun Wadekarfunc tegra194_get_cpu_reset_handler_size
112653fc380SVarun Wadekar	adr	x0, __tegra194_cpu_reset_handler_end
113653fc380SVarun Wadekar	adr	x1, tegra194_cpu_reset_handler
114653fc380SVarun Wadekar	sub	x0, x0, x1
115653fc380SVarun Wadekar	ret
116653fc380SVarun Wadekarendfunc tegra194_get_cpu_reset_handler_size
117653fc380SVarun Wadekar
118653fc380SVarun Wadekar/* return the start address of the CPU reset handler */
119653fc380SVarun Wadekarfunc tegra194_get_cpu_reset_handler_base
120653fc380SVarun Wadekar	adr	x0, tegra194_cpu_reset_handler
121653fc380SVarun Wadekar	ret
122653fc380SVarun Wadekarendfunc tegra194_get_cpu_reset_handler_base
123653fc380SVarun Wadekar
124a391d494SPritesh Raithatha/* return the size of the MC context */
125a391d494SPritesh Raithathafunc tegra194_get_mc_ctx_offset
126a391d494SPritesh Raithatha	adr	x0, __tegra194_mc_context
127653fc380SVarun Wadekar	adr	x1, tegra194_cpu_reset_handler
128653fc380SVarun Wadekar	sub	x0, x0, x1
129653fc380SVarun Wadekar	ret
130a391d494SPritesh Raithathaendfunc tegra194_get_mc_ctx_offset
131040529e9SVarun Wadekar
132040529e9SVarun Wadekar/* set system suspend state before SC7 entry */
133040529e9SVarun Wadekarfunc tegra194_set_system_suspend_entry
134040529e9SVarun Wadekar	mov	x0, #TEGRA_MC_BASE
135040529e9SVarun Wadekar	mov	x3, #MC_SECURITY_CFG3_0
136040529e9SVarun Wadekar	ldr	w1, [x0, x3]
137040529e9SVarun Wadekar	lsl	x1, x1, #32
138040529e9SVarun Wadekar	mov	x3, #MC_SECURITY_CFG0_0
139040529e9SVarun Wadekar	ldr	w2, [x0, x3]
140040529e9SVarun Wadekar	orr	x3, x1, x2			/* TZDRAM base */
141040529e9SVarun Wadekar	adr	x0, __tegra194_system_suspend_state
142040529e9SVarun Wadekar	adr	x1, tegra194_cpu_reset_handler
143040529e9SVarun Wadekar	sub	x2, x0, x1			/* offset in TZDRAM */
144040529e9SVarun Wadekar	mov	x0, #TEGRA194_STATE_SYSTEM_SUSPEND
145040529e9SVarun Wadekar	lsl	x0, x0, #16
146040529e9SVarun Wadekar	add	x0, x0, #TEGRA194_STATE_SYSTEM_SUSPEND
147040529e9SVarun Wadekar	str	x0, [x3, x2]			/* set value in TZDRAM */
148040529e9SVarun Wadekar	dsb	sy
149040529e9SVarun Wadekar	ret
150040529e9SVarun Wadekarendfunc tegra194_set_system_suspend_entry
151