xref: /arm-trusted-firmware/plat/nvidia/tegra/soc/t194/plat_trampoline.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu
7*91f16700Schasinglulu#include <arch.h>
8*91f16700Schasinglulu#include <asm_macros.S>
9*91f16700Schasinglulu#include <plat/common/common_def.h>
10*91f16700Schasinglulu#include <memctrl_v2.h>
11*91f16700Schasinglulu#include <tegra_def.h>
12*91f16700Schasinglulu
13*91f16700Schasinglulu#define TEGRA194_STATE_SYSTEM_SUSPEND	0x5C7
14*91f16700Schasinglulu#define TEGRA194_STATE_SYSTEM_RESUME	0x600D
15*91f16700Schasinglulu#define TEGRA194_MC_CTX_SIZE		0xFB
16*91f16700Schasinglulu
17*91f16700Schasinglulu	.align 4
18*91f16700Schasinglulu	.globl	tegra194_cpu_reset_handler
19*91f16700Schasinglulu
20*91f16700Schasinglulu/* CPU reset handler routine */
21*91f16700Schasinglulufunc tegra194_cpu_reset_handler
22*91f16700Schasinglulu	/* check if we are exiting system suspend state */
23*91f16700Schasinglulu	adr	x0, __tegra194_system_suspend_state
24*91f16700Schasinglulu	ldr	x1, [x0]
25*91f16700Schasinglulu	mov	x2, #TEGRA194_STATE_SYSTEM_SUSPEND
26*91f16700Schasinglulu	lsl	x2, x2, #16
27*91f16700Schasinglulu	add	x2, x2, #TEGRA194_STATE_SYSTEM_SUSPEND
28*91f16700Schasinglulu	cmp	x1, x2
29*91f16700Schasinglulu	bne	boot_cpu
30*91f16700Schasinglulu
31*91f16700Schasinglulu	/* set system resume state */
32*91f16700Schasinglulu	mov	x1, #TEGRA194_STATE_SYSTEM_RESUME
33*91f16700Schasinglulu	lsl	x1, x1, #16
34*91f16700Schasinglulu	mov	x2, #TEGRA194_STATE_SYSTEM_RESUME
35*91f16700Schasinglulu	add	x1, x1, x2
36*91f16700Schasinglulu	str	x1, [x0]
37*91f16700Schasinglulu	dsb	sy
38*91f16700Schasinglulu
39*91f16700Schasinglulu	/* prepare to relocate to TZSRAM */
40*91f16700Schasinglulu	mov	x0, #BL31_BASE
41*91f16700Schasinglulu	adr	x1, __tegra194_cpu_reset_handler_end
42*91f16700Schasinglulu	adr	x2, __tegra194_cpu_reset_handler_data
43*91f16700Schasinglulu	ldr	x2, [x2, #8]
44*91f16700Schasinglulu
45*91f16700Schasinglulu	/* memcpy16 */
46*91f16700Schasinglulum_loop16:
47*91f16700Schasinglulu	cmp	x2, #16
48*91f16700Schasinglulu	b.lt	m_loop1
49*91f16700Schasinglulu	ldp	x3, x4, [x1], #16
50*91f16700Schasinglulu	stp	x3, x4, [x0], #16
51*91f16700Schasinglulu	sub	x2, x2, #16
52*91f16700Schasinglulu	b	m_loop16
53*91f16700Schasinglulu	/* copy byte per byte */
54*91f16700Schasinglulum_loop1:
55*91f16700Schasinglulu	cbz	x2, boot_cpu
56*91f16700Schasinglulu	ldrb	w3, [x1], #1
57*91f16700Schasinglulu	strb	w3, [x0], #1
58*91f16700Schasinglulu	subs	x2, x2, #1
59*91f16700Schasinglulu	b.ne	m_loop1
60*91f16700Schasinglulu
61*91f16700Schasinglulu	/*
62*91f16700Schasinglulu	 * Synchronization barriers to make sure that memory is flushed out
63*91f16700Schasinglulu	 * before we start execution in SysRAM.
64*91f16700Schasinglulu	 */
65*91f16700Schasinglulu	dsb	sy
66*91f16700Schasinglulu	isb
67*91f16700Schasinglulu
68*91f16700Schasingluluboot_cpu:
69*91f16700Schasinglulu	adr	x0, __tegra194_cpu_reset_handler_data
70*91f16700Schasinglulu	ldr	x0, [x0]
71*91f16700Schasinglulu	br	x0
72*91f16700Schasingluluendfunc tegra194_cpu_reset_handler
73*91f16700Schasinglulu
74*91f16700Schasinglulu	/*
75*91f16700Schasinglulu	 * Tegra194 reset data (offset 0x0 - 0x2490)
76*91f16700Schasinglulu	 *
77*91f16700Schasinglulu	 * 0x0000: secure world's entrypoint
78*91f16700Schasinglulu	 * 0x0008: BL31 size (RO + RW)
79*91f16700Schasinglulu	 * 0x0010: MC context start
80*91f16700Schasinglulu	 * 0x2490: MC context end
81*91f16700Schasinglulu	 */
82*91f16700Schasinglulu
83*91f16700Schasinglulu	.align 4
84*91f16700Schasinglulu	.type	__tegra194_cpu_reset_handler_data, %object
85*91f16700Schasinglulu	.globl	__tegra194_cpu_reset_handler_data
86*91f16700Schasinglulu__tegra194_cpu_reset_handler_data:
87*91f16700Schasinglulu	.quad	tegra_secure_entrypoint
88*91f16700Schasinglulu	.quad	__BL31_END__ - BL31_BASE
89*91f16700Schasinglulu	.globl	__tegra194_system_suspend_state
90*91f16700Schasinglulu__tegra194_system_suspend_state:
91*91f16700Schasinglulu	.quad	0
92*91f16700Schasinglulu
93*91f16700Schasinglulu	.align 4
94*91f16700Schasinglulu__tegra194_mc_context:
95*91f16700Schasinglulu	.rept	TEGRA194_MC_CTX_SIZE
96*91f16700Schasinglulu	.quad	0
97*91f16700Schasinglulu	.endr
98*91f16700Schasinglulu	.size	__tegra194_cpu_reset_handler_data, \
99*91f16700Schasinglulu		. - __tegra194_cpu_reset_handler_data
100*91f16700Schasinglulu
101*91f16700Schasinglulu	.align 4
102*91f16700Schasinglulu	.globl	__tegra194_cpu_reset_handler_end
103*91f16700Schasinglulu__tegra194_cpu_reset_handler_end:
104*91f16700Schasinglulu
105*91f16700Schasinglulu	.globl tegra194_get_cpu_reset_handler_size
106*91f16700Schasinglulu	.globl tegra194_get_cpu_reset_handler_base
107*91f16700Schasinglulu	.globl tegra194_get_mc_ctx_offset
108*91f16700Schasinglulu	.globl tegra194_set_system_suspend_entry
109*91f16700Schasinglulu
110*91f16700Schasinglulu/* return size of the CPU reset handler */
111*91f16700Schasinglulufunc tegra194_get_cpu_reset_handler_size
112*91f16700Schasinglulu	adr	x0, __tegra194_cpu_reset_handler_end
113*91f16700Schasinglulu	adr	x1, tegra194_cpu_reset_handler
114*91f16700Schasinglulu	sub	x0, x0, x1
115*91f16700Schasinglulu	ret
116*91f16700Schasingluluendfunc tegra194_get_cpu_reset_handler_size
117*91f16700Schasinglulu
118*91f16700Schasinglulu/* return the start address of the CPU reset handler */
119*91f16700Schasinglulufunc tegra194_get_cpu_reset_handler_base
120*91f16700Schasinglulu	adr	x0, tegra194_cpu_reset_handler
121*91f16700Schasinglulu	ret
122*91f16700Schasingluluendfunc tegra194_get_cpu_reset_handler_base
123*91f16700Schasinglulu
124*91f16700Schasinglulu/* return the size of the MC context */
125*91f16700Schasinglulufunc tegra194_get_mc_ctx_offset
126*91f16700Schasinglulu	adr	x0, __tegra194_mc_context
127*91f16700Schasinglulu	adr	x1, tegra194_cpu_reset_handler
128*91f16700Schasinglulu	sub	x0, x0, x1
129*91f16700Schasinglulu	ret
130*91f16700Schasingluluendfunc tegra194_get_mc_ctx_offset
131*91f16700Schasinglulu
132*91f16700Schasinglulu/* set system suspend state before SC7 entry */
133*91f16700Schasinglulufunc tegra194_set_system_suspend_entry
134*91f16700Schasinglulu	mov	x0, #TEGRA_MC_BASE
135*91f16700Schasinglulu	mov	x3, #MC_SECURITY_CFG3_0
136*91f16700Schasinglulu	ldr	w1, [x0, x3]
137*91f16700Schasinglulu	lsl	x1, x1, #32
138*91f16700Schasinglulu	mov	x3, #MC_SECURITY_CFG0_0
139*91f16700Schasinglulu	ldr	w2, [x0, x3]
140*91f16700Schasinglulu	orr	x3, x1, x2			/* TZDRAM base */
141*91f16700Schasinglulu	adr	x0, __tegra194_system_suspend_state
142*91f16700Schasinglulu	adr	x1, tegra194_cpu_reset_handler
143*91f16700Schasinglulu	sub	x2, x0, x1			/* offset in TZDRAM */
144*91f16700Schasinglulu	mov	x0, #TEGRA194_STATE_SYSTEM_SUSPEND
145*91f16700Schasinglulu	lsl	x0, x0, #16
146*91f16700Schasinglulu	add	x0, x0, #TEGRA194_STATE_SYSTEM_SUSPEND
147*91f16700Schasinglulu	str	x0, [x3, x2]			/* set value in TZDRAM */
148*91f16700Schasinglulu	dsb	sy
149*91f16700Schasinglulu	ret
150*91f16700Schasingluluendfunc tegra194_set_system_suspend_entry
151