xref: /rk3399_ARM-atf/plat/nvidia/tegra/soc/t194/plat_trampoline.S (revision ddbf946f7b5251bf9106dcbd1166801dffd290e7)
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