xref: /rk3399_ARM-atf/plat/qti/msm8916/aarch64/msm8916_helpers.S (revision d1b5ada8887c767c39eceaf816eefbf303e0dcd8)
1dddba19aSStephan Gerhold/*
27e002c8aSStephan Gerhold * Copyright (c) 2021-2023, Stephan Gerhold <stephan@gerhold.net>
3dddba19aSStephan Gerhold *
4dddba19aSStephan Gerhold * SPDX-License-Identifier: BSD-3-Clause
5dddba19aSStephan Gerhold */
6dddba19aSStephan Gerhold
7dddba19aSStephan Gerhold#include <arch.h>
8dddba19aSStephan Gerhold#include <asm_macros.S>
91d7ed58fSStephan Gerhold#include <platform_def.h>
10dddba19aSStephan Gerhold
11dddba19aSStephan Gerhold#include <msm8916_mmap.h>
12dddba19aSStephan Gerhold
13*d9e565eaSStephan Gerhold#if PLATFORM_CORE_COUNT > 1
14dddba19aSStephan Gerhold#define APCS_TCM_START_ADDR	0x10
15*d9e565eaSStephan Gerhold#else
16*d9e565eaSStephan Gerhold#define APCS_TCM_START_ADDR	0x34
17*d9e565eaSStephan Gerhold#endif
18dddba19aSStephan Gerhold#define APCS_TCM_REDIRECT_EN_0	BIT_32(0)
19dddba19aSStephan Gerhold
20dddba19aSStephan Gerhold	.globl	plat_crash_console_init
21dddba19aSStephan Gerhold	.globl	plat_crash_console_putc
22dddba19aSStephan Gerhold	.globl	plat_crash_console_flush
23dddba19aSStephan Gerhold	.globl	plat_panic_handler
24dddba19aSStephan Gerhold	.globl	plat_my_core_pos
25dddba19aSStephan Gerhold	.globl	plat_get_my_entrypoint
26dddba19aSStephan Gerhold	.globl	plat_reset_handler
27dddba19aSStephan Gerhold	.globl	platform_mem_init
28dddba19aSStephan Gerhold	.globl	msm8916_entry_point
29dddba19aSStephan Gerhold
30dddba19aSStephan Gerhold	/* -------------------------------------------------
31dddba19aSStephan Gerhold	 * int plat_crash_console_init(void)
32dddba19aSStephan Gerhold	 * Initialize the crash console.
33dddba19aSStephan Gerhold	 * Out: x0 - 1 on success, 0 on error
34dddba19aSStephan Gerhold	 * Clobber list : x0 - x4
35dddba19aSStephan Gerhold	 * -------------------------------------------------
36dddba19aSStephan Gerhold	 */
37dddba19aSStephan Gerholdfunc plat_crash_console_init
38aad23f1aSStephan Gerhold	mov_imm	x1, BLSP_UART_BASE
39dddba19aSStephan Gerhold	mov	x0, #1
40dddba19aSStephan Gerhold	b	console_uartdm_core_init
41dddba19aSStephan Gerholdendfunc plat_crash_console_init
42dddba19aSStephan Gerhold
43dddba19aSStephan Gerhold	/* -------------------------------------------------
44dddba19aSStephan Gerhold	 * int plat_crash_console_putc(int c)
45dddba19aSStephan Gerhold	 * Print a character on the crash console.
46dddba19aSStephan Gerhold	 * In : w0 - character to be printed
47dddba19aSStephan Gerhold	 * Out: w0 - printed character on success
48dddba19aSStephan Gerhold	 * Clobber list : x1, x2
49dddba19aSStephan Gerhold	 * -------------------------------------------------
50dddba19aSStephan Gerhold	 */
51dddba19aSStephan Gerholdfunc plat_crash_console_putc
52aad23f1aSStephan Gerhold	mov_imm	x1, BLSP_UART_BASE
53dddba19aSStephan Gerhold	b	console_uartdm_core_putc
54dddba19aSStephan Gerholdendfunc plat_crash_console_putc
55dddba19aSStephan Gerhold
56dddba19aSStephan Gerhold	/* -------------------------------------------------
57dddba19aSStephan Gerhold	 * void plat_crash_console_flush(void)
58dddba19aSStephan Gerhold	 * Force a write of all buffered data that has not
59dddba19aSStephan Gerhold	 * been output.
60dddba19aSStephan Gerhold	 * Clobber list : x1, x2
61dddba19aSStephan Gerhold	 * -------------------------------------------------
62dddba19aSStephan Gerhold	 */
63dddba19aSStephan Gerholdfunc plat_crash_console_flush
64aad23f1aSStephan Gerhold	mov_imm	x1, BLSP_UART_BASE
65dddba19aSStephan Gerhold	b	console_uartdm_core_flush
66dddba19aSStephan Gerholdendfunc plat_crash_console_flush
67dddba19aSStephan Gerhold
68dddba19aSStephan Gerhold	/* -------------------------------------------------
69dddba19aSStephan Gerhold	 * void plat_panic_handler(void) __dead
70dddba19aSStephan Gerhold	 * Called when an unrecoverable error occurs.
71dddba19aSStephan Gerhold	 * -------------------------------------------------
72dddba19aSStephan Gerhold	 */
73dddba19aSStephan Gerholdfunc plat_panic_handler
74dddba19aSStephan Gerhold	/* Try to shutdown/reset */
75dddba19aSStephan Gerhold	mov_imm	x0, MPM_PS_HOLD
76dddba19aSStephan Gerhold	str	wzr, [x0]
77dddba19aSStephan Gerhold1:	b	1b
78dddba19aSStephan Gerholdendfunc plat_panic_handler
79dddba19aSStephan Gerhold
80dddba19aSStephan Gerhold	/* -------------------------------------------------
81dddba19aSStephan Gerhold	 * unsigned int plat_my_core_pos(void)
82dddba19aSStephan Gerhold	 * Out: x0 - index of the calling CPU
83dddba19aSStephan Gerhold	 * -------------------------------------------------
84dddba19aSStephan Gerhold	 */
85dddba19aSStephan Gerholdfunc plat_my_core_pos
86*d9e565eaSStephan Gerhold	.if PLATFORM_CORE_COUNT > 1
871d7ed58fSStephan Gerhold		mrs	x1, mpidr_el1
881d7ed58fSStephan Gerhold		and	x0, x1, #MPIDR_CPU_MASK
891d7ed58fSStephan Gerhold		.if PLATFORM_CLUSTER_COUNT > 1
901d7ed58fSStephan Gerhold			and	x1, x1, #MPIDR_CLUSTER_MASK
911d7ed58fSStephan Gerhold			orr	x0, x0, x1, LSR #(MPIDR_AFFINITY_BITS - \
921d7ed58fSStephan Gerhold						  PLATFORM_CPU_PER_CLUSTER_SHIFT)
931d7ed58fSStephan Gerhold		.endif
94*d9e565eaSStephan Gerhold	.else
95*d9e565eaSStephan Gerhold		/* There is just a single core so always 0 */
96*d9e565eaSStephan Gerhold		mov	x0, #0
97*d9e565eaSStephan Gerhold	.endif
98dddba19aSStephan Gerhold	ret
99dddba19aSStephan Gerholdendfunc plat_my_core_pos
100dddba19aSStephan Gerhold
101dddba19aSStephan Gerhold	/* -------------------------------------------------
102dddba19aSStephan Gerhold	 * uintptr_t plat_get_my_entrypoint(void)
103dddba19aSStephan Gerhold	 * Distinguish cold and warm boot and return warm boot
104dddba19aSStephan Gerhold	 * entry address if available.
105dddba19aSStephan Gerhold	 * Out: x0 - warm boot entry point or 0 on cold boot
106dddba19aSStephan Gerhold	 * -------------------------------------------------
107dddba19aSStephan Gerhold	 */
108dddba19aSStephan Gerholdfunc plat_get_my_entrypoint
109dddba19aSStephan Gerhold	ldr	x0, msm8916_entry_point
11025132f78SStephan Gerhold	cbz	x0, 1f
11125132f78SStephan Gerhold	ret
11225132f78SStephan Gerhold1:
11325132f78SStephan Gerhold	/*
11425132f78SStephan Gerhold	 * Cold boot: Disable TCM redirect to L2 cache as early as
11525132f78SStephan Gerhold	 * possible to avoid crashes when making use of the cache.
11625132f78SStephan Gerhold	 */
1171d7ed58fSStephan Gerhold	mov_imm	x1, APCS_CFG(0)
11825132f78SStephan Gerhold	ldr	w2, [x1, #APCS_TCM_START_ADDR]
11925132f78SStephan Gerhold	and	w2, w2, #~APCS_TCM_REDIRECT_EN_0
12025132f78SStephan Gerhold	str	w2, [x1, #APCS_TCM_START_ADDR]
12125132f78SStephan Gerhold
12225132f78SStephan Gerhold	/*
12325132f78SStephan Gerhold	 * After reset the CPU always starts executing at the fixed reset
12425132f78SStephan Gerhold	 * address (0x0), which does not match the link address of BL31.
12525132f78SStephan Gerhold	 * The "boot remapper" redirects all memory accesses to the real
12625132f78SStephan Gerhold	 * physical address in DRAM.
12725132f78SStephan Gerhold	 *
12825132f78SStephan Gerhold	 * For warm boots, this is already handled by loading the real
12925132f78SStephan Gerhold	 * entry point address above.
13025132f78SStephan Gerhold	 *
13125132f78SStephan Gerhold	 * For cold boots, check if the CPU is using the boot remapper,
13225132f78SStephan Gerhold	 * i.e. if bl31_entrypoint appears to be at the reset address (0x0).
13325132f78SStephan Gerhold	 */
13425132f78SStephan Gerhold	adr	x1, bl31_entrypoint
13525132f78SStephan Gerhold	cbnz	x1, 2f
13625132f78SStephan Gerhold
13725132f78SStephan Gerhold	/*
13825132f78SStephan Gerhold	 * Add the real BL31_BASE offset to the return address in the link
13925132f78SStephan Gerhold	 * register so the CPU will continue at the real address after return.
14025132f78SStephan Gerhold	 */
14125132f78SStephan Gerhold	mov_imm	x1, BL31_BASE
14225132f78SStephan Gerhold	add	lr, lr, x1
14325132f78SStephan Gerhold2:
144dddba19aSStephan Gerhold	ret
145dddba19aSStephan Gerholdendfunc plat_get_my_entrypoint
146dddba19aSStephan Gerhold
147dddba19aSStephan Gerhold	/* -------------------------------------------------
148dddba19aSStephan Gerhold	 * void platform_mem_init(void)
149dddba19aSStephan Gerhold	 * Performs additional memory initialization early
150dddba19aSStephan Gerhold	 * in the boot process.
151dddba19aSStephan Gerhold	 * -------------------------------------------------
152dddba19aSStephan Gerhold	 */
153dddba19aSStephan Gerholdfunc platform_mem_init
154dddba19aSStephan Gerhold	/* Nothing to do here, all memory is already initialized */
155dddba19aSStephan Gerhold	ret
156dddba19aSStephan Gerholdendfunc platform_mem_init
157dddba19aSStephan Gerhold
158dddba19aSStephan Gerhold	.data
159dddba19aSStephan Gerhold	.align	3
160dddba19aSStephan Gerhold
161dddba19aSStephan Gerhold	/* -------------------------------------------------
162dddba19aSStephan Gerhold	 * Warm boot entry point for CPU. Set by PSCI code.
163dddba19aSStephan Gerhold	 * -------------------------------------------------
164dddba19aSStephan Gerhold	 */
165dddba19aSStephan Gerholdmsm8916_entry_point:
166dddba19aSStephan Gerhold	.quad	0
167