xref: /rk3399_ARM-atf/plat/qti/msm8916/aarch64/msm8916_helpers.S (revision 7e002c8a13172c44f55ab49062861479b6622884)
1dddba19aSStephan Gerhold/*
2*7e002c8aSStephan 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>
9dddba19aSStephan Gerhold
10dddba19aSStephan Gerhold#include <msm8916_mmap.h>
11dddba19aSStephan Gerhold
12dddba19aSStephan Gerhold#define APCS_TCM_START_ADDR	0x10
13dddba19aSStephan Gerhold#define APCS_TCM_REDIRECT_EN_0	BIT_32(0)
14dddba19aSStephan Gerhold
15dddba19aSStephan Gerhold	.globl	plat_crash_console_init
16dddba19aSStephan Gerhold	.globl	plat_crash_console_putc
17dddba19aSStephan Gerhold	.globl	plat_crash_console_flush
18dddba19aSStephan Gerhold	.globl	plat_panic_handler
19dddba19aSStephan Gerhold	.globl	plat_my_core_pos
20dddba19aSStephan Gerhold	.globl	plat_get_my_entrypoint
21dddba19aSStephan Gerhold	.globl	plat_reset_handler
22dddba19aSStephan Gerhold	.globl	platform_mem_init
23dddba19aSStephan Gerhold	.globl	msm8916_entry_point
24dddba19aSStephan Gerhold
25dddba19aSStephan Gerhold	/* -------------------------------------------------
26dddba19aSStephan Gerhold	 * int plat_crash_console_init(void)
27dddba19aSStephan Gerhold	 * Initialize the crash console.
28dddba19aSStephan Gerhold	 * Out: x0 - 1 on success, 0 on error
29dddba19aSStephan Gerhold	 * Clobber list : x0 - x4
30dddba19aSStephan Gerhold	 * -------------------------------------------------
31dddba19aSStephan Gerhold	 */
32dddba19aSStephan Gerholdfunc plat_crash_console_init
33dddba19aSStephan Gerhold	mov	x1, #BLSP_UART2_BASE
34dddba19aSStephan Gerhold	mov	x0, #1
35dddba19aSStephan Gerhold	b	console_uartdm_core_init
36dddba19aSStephan Gerholdendfunc plat_crash_console_init
37dddba19aSStephan Gerhold
38dddba19aSStephan Gerhold	/* -------------------------------------------------
39dddba19aSStephan Gerhold	 * int plat_crash_console_putc(int c)
40dddba19aSStephan Gerhold	 * Print a character on the crash console.
41dddba19aSStephan Gerhold	 * In : w0 - character to be printed
42dddba19aSStephan Gerhold	 * Out: w0 - printed character on success
43dddba19aSStephan Gerhold	 * Clobber list : x1, x2
44dddba19aSStephan Gerhold	 * -------------------------------------------------
45dddba19aSStephan Gerhold	 */
46dddba19aSStephan Gerholdfunc plat_crash_console_putc
47dddba19aSStephan Gerhold	mov	x1, #BLSP_UART2_BASE
48dddba19aSStephan Gerhold	b	console_uartdm_core_putc
49dddba19aSStephan Gerholdendfunc plat_crash_console_putc
50dddba19aSStephan Gerhold
51dddba19aSStephan Gerhold	/* -------------------------------------------------
52dddba19aSStephan Gerhold	 * void plat_crash_console_flush(void)
53dddba19aSStephan Gerhold	 * Force a write of all buffered data that has not
54dddba19aSStephan Gerhold	 * been output.
55dddba19aSStephan Gerhold	 * Clobber list : x1, x2
56dddba19aSStephan Gerhold	 * -------------------------------------------------
57dddba19aSStephan Gerhold	 */
58dddba19aSStephan Gerholdfunc plat_crash_console_flush
59dddba19aSStephan Gerhold	mov	x1, #BLSP_UART2_BASE
60dddba19aSStephan Gerhold	b	console_uartdm_core_flush
61dddba19aSStephan Gerholdendfunc plat_crash_console_flush
62dddba19aSStephan Gerhold
63dddba19aSStephan Gerhold	/* -------------------------------------------------
64dddba19aSStephan Gerhold	 * void plat_panic_handler(void) __dead
65dddba19aSStephan Gerhold	 * Called when an unrecoverable error occurs.
66dddba19aSStephan Gerhold	 * -------------------------------------------------
67dddba19aSStephan Gerhold	 */
68dddba19aSStephan Gerholdfunc plat_panic_handler
69dddba19aSStephan Gerhold	/* Try to shutdown/reset */
70dddba19aSStephan Gerhold	mov_imm	x0, MPM_PS_HOLD
71dddba19aSStephan Gerhold	str	wzr, [x0]
72dddba19aSStephan Gerhold1:	b	1b
73dddba19aSStephan Gerholdendfunc plat_panic_handler
74dddba19aSStephan Gerhold
75dddba19aSStephan Gerhold	/* -------------------------------------------------
76dddba19aSStephan Gerhold	 * unsigned int plat_my_core_pos(void)
77dddba19aSStephan Gerhold	 * Out: x0 - index of the calling CPU
78dddba19aSStephan Gerhold	 * -------------------------------------------------
79dddba19aSStephan Gerhold	 */
80dddba19aSStephan Gerholdfunc plat_my_core_pos
81dddba19aSStephan Gerhold	/* There is just a single cluster so this is very simple */
82dddba19aSStephan Gerhold	mrs	x0, mpidr_el1
83dddba19aSStephan Gerhold	and	x0, x0, #MPIDR_CPU_MASK
84dddba19aSStephan Gerhold	ret
85dddba19aSStephan Gerholdendfunc plat_my_core_pos
86dddba19aSStephan Gerhold
87dddba19aSStephan Gerhold	/* -------------------------------------------------
88dddba19aSStephan Gerhold	 * uintptr_t plat_get_my_entrypoint(void)
89dddba19aSStephan Gerhold	 * Distinguish cold and warm boot and return warm boot
90dddba19aSStephan Gerhold	 * entry address if available.
91dddba19aSStephan Gerhold	 * Out: x0 - warm boot entry point or 0 on cold boot
92dddba19aSStephan Gerhold	 * -------------------------------------------------
93dddba19aSStephan Gerhold	 */
94dddba19aSStephan Gerholdfunc plat_get_my_entrypoint
95dddba19aSStephan Gerhold	ldr	x0, msm8916_entry_point
96dddba19aSStephan Gerhold	ret
97dddba19aSStephan Gerholdendfunc plat_get_my_entrypoint
98dddba19aSStephan Gerhold
99dddba19aSStephan Gerhold	/* -------------------------------------------------
100dddba19aSStephan Gerhold	 * void plat_reset_handler(void)
101dddba19aSStephan Gerhold	 * Perform additional initialization after reset.
102dddba19aSStephan Gerhold	 * Clobber list : x0 - x18, x30
103dddba19aSStephan Gerhold	 * -------------------------------------------------
104dddba19aSStephan Gerhold	 */
105dddba19aSStephan Gerholdfunc plat_reset_handler
106dddba19aSStephan Gerhold	/*
107dddba19aSStephan Gerhold	 * Check if the CPU is running at the correct address.
108dddba19aSStephan Gerhold	 * During cold boot the CPU enters here at the wrong address
109dddba19aSStephan Gerhold	 * using the "boot remapper". (It remaps the BL31_BASE to
110dddba19aSStephan Gerhold	 * the CPU reset address 0x0).
111dddba19aSStephan Gerhold	 */
112dddba19aSStephan Gerhold	mov	x0, #BL31_BASE
113dddba19aSStephan Gerhold	adr	x1, bl31_entrypoint
114dddba19aSStephan Gerhold	cmp	x0, x1
115dddba19aSStephan Gerhold	b.ne	_remapped_cold_boot
116dddba19aSStephan Gerhold	/* Already running at correct address, just return directly */
117dddba19aSStephan Gerhold	ret
118dddba19aSStephan Gerhold
119dddba19aSStephan Gerhold_remapped_cold_boot:
120dddba19aSStephan Gerhold	/*
121dddba19aSStephan Gerhold	 * The previous boot stage seems to use the L2 cache as TCM.
122dddba19aSStephan Gerhold	 * Disable the TCM redirect before enabling caches to avoid
123dddba19aSStephan Gerhold	 * strange crashes.
124dddba19aSStephan Gerhold	 */
125dddba19aSStephan Gerhold	mov	x2, #APCS_CFG
126dddba19aSStephan Gerhold	ldr	w3, [x2, #APCS_TCM_START_ADDR]
127dddba19aSStephan Gerhold	and	w3, w3, #~APCS_TCM_REDIRECT_EN_0
128dddba19aSStephan Gerhold	str	w3, [x2, #APCS_TCM_START_ADDR]
129dddba19aSStephan Gerhold
130dddba19aSStephan Gerhold	/* Enter BL31 again at the real address */
131dddba19aSStephan Gerhold	br	x0
132dddba19aSStephan Gerholdendfunc plat_reset_handler
133dddba19aSStephan Gerhold
134dddba19aSStephan Gerhold	/* -------------------------------------------------
135dddba19aSStephan Gerhold	 * void platform_mem_init(void)
136dddba19aSStephan Gerhold	 * Performs additional memory initialization early
137dddba19aSStephan Gerhold	 * in the boot process.
138dddba19aSStephan Gerhold	 * -------------------------------------------------
139dddba19aSStephan Gerhold	 */
140dddba19aSStephan Gerholdfunc platform_mem_init
141dddba19aSStephan Gerhold	/* Nothing to do here, all memory is already initialized */
142dddba19aSStephan Gerhold	ret
143dddba19aSStephan Gerholdendfunc platform_mem_init
144dddba19aSStephan Gerhold
145dddba19aSStephan Gerhold	.data
146dddba19aSStephan Gerhold	.align	3
147dddba19aSStephan Gerhold
148dddba19aSStephan Gerhold	/* -------------------------------------------------
149dddba19aSStephan Gerhold	 * Warm boot entry point for CPU. Set by PSCI code.
150dddba19aSStephan Gerhold	 * -------------------------------------------------
151dddba19aSStephan Gerhold	 */
152dddba19aSStephan Gerholdmsm8916_entry_point:
153dddba19aSStephan Gerhold	.quad	0
154