xref: /rk3399_ARM-atf/plat/nvidia/tegra/soc/t194/plat_trampoline.S (revision 844e6cc5e73d081f0709d6cf39de6c4b0ff9c08b)
141612559SVarun Wadekar/*
2*844e6cc5SPritesh 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
15*844e6cc5SPritesh Raithatha#define TEGRA194_SMMU_CTX_SIZE		0x80D
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
6141612559SVarun Wadekarboot_cpu:
621c62509eSVarun Wadekar	adr	x0, __tegra194_cpu_reset_handler_data
6341612559SVarun Wadekar	ldr	x0, [x0]
6441612559SVarun Wadekar	br	x0
651c62509eSVarun Wadekarendfunc tegra194_cpu_reset_handler
6641612559SVarun Wadekar
6741612559SVarun Wadekar	/*
681c62509eSVarun Wadekar	 * Tegra194 reset data (offset 0x0 - 0x2490)
6941612559SVarun Wadekar	 *
70ddbf946fSStefan Kristiansson	 * 0x0000: secure world's entrypoint
71ddbf946fSStefan Kristiansson	 * 0x0008: BL31 size (RO + RW)
72ddbf946fSStefan Kristiansson	 * 0x0010: SMMU context start
73ddbf946fSStefan Kristiansson	 * 0x2490: SMMU context end
7441612559SVarun Wadekar	 */
7541612559SVarun Wadekar
7641612559SVarun Wadekar	.align 4
771c62509eSVarun Wadekar	.type	__tegra194_cpu_reset_handler_data, %object
781c62509eSVarun Wadekar	.globl	__tegra194_cpu_reset_handler_data
791c62509eSVarun Wadekar__tegra194_cpu_reset_handler_data:
8041612559SVarun Wadekar	.quad	tegra_secure_entrypoint
8141612559SVarun Wadekar	.quad	__BL31_END__ - BL31_BASE
82653fc380SVarun Wadekar
83040529e9SVarun Wadekar	.globl	__tegra194_system_suspend_state
84040529e9SVarun Wadekar__tegra194_system_suspend_state:
85040529e9SVarun Wadekar	.quad	0
86040529e9SVarun Wadekar
87653fc380SVarun Wadekar	.align 4
88653fc380SVarun Wadekar__tegra194_smmu_context:
891c62509eSVarun Wadekar	.rept	TEGRA194_SMMU_CTX_SIZE
9041612559SVarun Wadekar	.quad	0
9141612559SVarun Wadekar	.endr
921c62509eSVarun Wadekar	.size	__tegra194_cpu_reset_handler_data, \
931c62509eSVarun Wadekar		. - __tegra194_cpu_reset_handler_data
9441612559SVarun Wadekar
9541612559SVarun Wadekar	.align 4
961c62509eSVarun Wadekar	.globl	__tegra194_cpu_reset_handler_end
971c62509eSVarun Wadekar__tegra194_cpu_reset_handler_end:
98653fc380SVarun Wadekar
99653fc380SVarun Wadekar	.globl tegra194_get_cpu_reset_handler_size
100653fc380SVarun Wadekar	.globl tegra194_get_cpu_reset_handler_base
101653fc380SVarun Wadekar	.globl tegra194_get_smmu_ctx_offset
102040529e9SVarun Wadekar	.globl tegra194_set_system_suspend_entry
103653fc380SVarun Wadekar
104653fc380SVarun Wadekar/* return size of the CPU reset handler */
105653fc380SVarun Wadekarfunc tegra194_get_cpu_reset_handler_size
106653fc380SVarun Wadekar	adr	x0, __tegra194_cpu_reset_handler_end
107653fc380SVarun Wadekar	adr	x1, tegra194_cpu_reset_handler
108653fc380SVarun Wadekar	sub	x0, x0, x1
109653fc380SVarun Wadekar	ret
110653fc380SVarun Wadekarendfunc tegra194_get_cpu_reset_handler_size
111653fc380SVarun Wadekar
112653fc380SVarun Wadekar/* return the start address of the CPU reset handler */
113653fc380SVarun Wadekarfunc tegra194_get_cpu_reset_handler_base
114653fc380SVarun Wadekar	adr	x0, tegra194_cpu_reset_handler
115653fc380SVarun Wadekar	ret
116653fc380SVarun Wadekarendfunc tegra194_get_cpu_reset_handler_base
117653fc380SVarun Wadekar
118653fc380SVarun Wadekar/* return the size of the SMMU context */
119653fc380SVarun Wadekarfunc tegra194_get_smmu_ctx_offset
120653fc380SVarun Wadekar	adr	x0, __tegra194_smmu_context
121653fc380SVarun Wadekar	adr	x1, tegra194_cpu_reset_handler
122653fc380SVarun Wadekar	sub	x0, x0, x1
123653fc380SVarun Wadekar	ret
124653fc380SVarun Wadekarendfunc tegra194_get_smmu_ctx_offset
125040529e9SVarun Wadekar
126040529e9SVarun Wadekar/* set system suspend state before SC7 entry */
127040529e9SVarun Wadekarfunc tegra194_set_system_suspend_entry
128040529e9SVarun Wadekar	mov	x0, #TEGRA_MC_BASE
129040529e9SVarun Wadekar	mov	x3, #MC_SECURITY_CFG3_0
130040529e9SVarun Wadekar	ldr	w1, [x0, x3]
131040529e9SVarun Wadekar	lsl	x1, x1, #32
132040529e9SVarun Wadekar	mov	x3, #MC_SECURITY_CFG0_0
133040529e9SVarun Wadekar	ldr	w2, [x0, x3]
134040529e9SVarun Wadekar	orr	x3, x1, x2			/* TZDRAM base */
135040529e9SVarun Wadekar	adr	x0, __tegra194_system_suspend_state
136040529e9SVarun Wadekar	adr	x1, tegra194_cpu_reset_handler
137040529e9SVarun Wadekar	sub	x2, x0, x1			/* offset in TZDRAM */
138040529e9SVarun Wadekar	mov	x0, #TEGRA194_STATE_SYSTEM_SUSPEND
139040529e9SVarun Wadekar	lsl	x0, x0, #16
140040529e9SVarun Wadekar	add	x0, x0, #TEGRA194_STATE_SYSTEM_SUSPEND
141040529e9SVarun Wadekar	str	x0, [x3, x2]			/* set value in TZDRAM */
142040529e9SVarun Wadekar	dsb	sy
143040529e9SVarun Wadekar	ret
144040529e9SVarun Wadekarendfunc tegra194_set_system_suspend_entry
145