xref: /rk3399_ARM-atf/plat/qti/msm8916/aarch64/msm8916_helpers.S (revision 1d7ed58ff7eb3ee7016c95fb4813651c59e8c7d9)
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>
9*1d7ed58fSStephan Gerhold#include <platform_def.h>
10dddba19aSStephan Gerhold
11dddba19aSStephan Gerhold#include <msm8916_mmap.h>
12dddba19aSStephan Gerhold
13dddba19aSStephan Gerhold#define APCS_TCM_START_ADDR	0x10
14dddba19aSStephan Gerhold#define APCS_TCM_REDIRECT_EN_0	BIT_32(0)
15dddba19aSStephan Gerhold
16dddba19aSStephan Gerhold	.globl	plat_crash_console_init
17dddba19aSStephan Gerhold	.globl	plat_crash_console_putc
18dddba19aSStephan Gerhold	.globl	plat_crash_console_flush
19dddba19aSStephan Gerhold	.globl	plat_panic_handler
20dddba19aSStephan Gerhold	.globl	plat_my_core_pos
21dddba19aSStephan Gerhold	.globl	plat_get_my_entrypoint
22dddba19aSStephan Gerhold	.globl	plat_reset_handler
23dddba19aSStephan Gerhold	.globl	platform_mem_init
24dddba19aSStephan Gerhold	.globl	msm8916_entry_point
25dddba19aSStephan Gerhold
26dddba19aSStephan Gerhold	/* -------------------------------------------------
27dddba19aSStephan Gerhold	 * int plat_crash_console_init(void)
28dddba19aSStephan Gerhold	 * Initialize the crash console.
29dddba19aSStephan Gerhold	 * Out: x0 - 1 on success, 0 on error
30dddba19aSStephan Gerhold	 * Clobber list : x0 - x4
31dddba19aSStephan Gerhold	 * -------------------------------------------------
32dddba19aSStephan Gerhold	 */
33dddba19aSStephan Gerholdfunc plat_crash_console_init
34aad23f1aSStephan Gerhold	mov_imm	x1, BLSP_UART_BASE
35dddba19aSStephan Gerhold	mov	x0, #1
36dddba19aSStephan Gerhold	b	console_uartdm_core_init
37dddba19aSStephan Gerholdendfunc plat_crash_console_init
38dddba19aSStephan Gerhold
39dddba19aSStephan Gerhold	/* -------------------------------------------------
40dddba19aSStephan Gerhold	 * int plat_crash_console_putc(int c)
41dddba19aSStephan Gerhold	 * Print a character on the crash console.
42dddba19aSStephan Gerhold	 * In : w0 - character to be printed
43dddba19aSStephan Gerhold	 * Out: w0 - printed character on success
44dddba19aSStephan Gerhold	 * Clobber list : x1, x2
45dddba19aSStephan Gerhold	 * -------------------------------------------------
46dddba19aSStephan Gerhold	 */
47dddba19aSStephan Gerholdfunc plat_crash_console_putc
48aad23f1aSStephan Gerhold	mov_imm	x1, BLSP_UART_BASE
49dddba19aSStephan Gerhold	b	console_uartdm_core_putc
50dddba19aSStephan Gerholdendfunc plat_crash_console_putc
51dddba19aSStephan Gerhold
52dddba19aSStephan Gerhold	/* -------------------------------------------------
53dddba19aSStephan Gerhold	 * void plat_crash_console_flush(void)
54dddba19aSStephan Gerhold	 * Force a write of all buffered data that has not
55dddba19aSStephan Gerhold	 * been output.
56dddba19aSStephan Gerhold	 * Clobber list : x1, x2
57dddba19aSStephan Gerhold	 * -------------------------------------------------
58dddba19aSStephan Gerhold	 */
59dddba19aSStephan Gerholdfunc plat_crash_console_flush
60aad23f1aSStephan Gerhold	mov_imm	x1, BLSP_UART_BASE
61dddba19aSStephan Gerhold	b	console_uartdm_core_flush
62dddba19aSStephan Gerholdendfunc plat_crash_console_flush
63dddba19aSStephan Gerhold
64dddba19aSStephan Gerhold	/* -------------------------------------------------
65dddba19aSStephan Gerhold	 * void plat_panic_handler(void) __dead
66dddba19aSStephan Gerhold	 * Called when an unrecoverable error occurs.
67dddba19aSStephan Gerhold	 * -------------------------------------------------
68dddba19aSStephan Gerhold	 */
69dddba19aSStephan Gerholdfunc plat_panic_handler
70dddba19aSStephan Gerhold	/* Try to shutdown/reset */
71dddba19aSStephan Gerhold	mov_imm	x0, MPM_PS_HOLD
72dddba19aSStephan Gerhold	str	wzr, [x0]
73dddba19aSStephan Gerhold1:	b	1b
74dddba19aSStephan Gerholdendfunc plat_panic_handler
75dddba19aSStephan Gerhold
76dddba19aSStephan Gerhold	/* -------------------------------------------------
77dddba19aSStephan Gerhold	 * unsigned int plat_my_core_pos(void)
78dddba19aSStephan Gerhold	 * Out: x0 - index of the calling CPU
79dddba19aSStephan Gerhold	 * -------------------------------------------------
80dddba19aSStephan Gerhold	 */
81dddba19aSStephan Gerholdfunc plat_my_core_pos
82*1d7ed58fSStephan Gerhold	mrs	x1, mpidr_el1
83*1d7ed58fSStephan Gerhold	and	x0, x1, #MPIDR_CPU_MASK
84*1d7ed58fSStephan Gerhold	.if PLATFORM_CLUSTER_COUNT > 1
85*1d7ed58fSStephan Gerhold		and	x1, x1, #MPIDR_CLUSTER_MASK
86*1d7ed58fSStephan Gerhold		orr	x0, x0, x1, LSR #(MPIDR_AFFINITY_BITS - \
87*1d7ed58fSStephan Gerhold					  PLATFORM_CPU_PER_CLUSTER_SHIFT)
88*1d7ed58fSStephan Gerhold	.endif
89dddba19aSStephan Gerhold	ret
90dddba19aSStephan Gerholdendfunc plat_my_core_pos
91dddba19aSStephan Gerhold
92dddba19aSStephan Gerhold	/* -------------------------------------------------
93dddba19aSStephan Gerhold	 * uintptr_t plat_get_my_entrypoint(void)
94dddba19aSStephan Gerhold	 * Distinguish cold and warm boot and return warm boot
95dddba19aSStephan Gerhold	 * entry address if available.
96dddba19aSStephan Gerhold	 * Out: x0 - warm boot entry point or 0 on cold boot
97dddba19aSStephan Gerhold	 * -------------------------------------------------
98dddba19aSStephan Gerhold	 */
99dddba19aSStephan Gerholdfunc plat_get_my_entrypoint
100dddba19aSStephan Gerhold	ldr	x0, msm8916_entry_point
10125132f78SStephan Gerhold	cbz	x0, 1f
10225132f78SStephan Gerhold	ret
10325132f78SStephan Gerhold1:
10425132f78SStephan Gerhold	/*
10525132f78SStephan Gerhold	 * Cold boot: Disable TCM redirect to L2 cache as early as
10625132f78SStephan Gerhold	 * possible to avoid crashes when making use of the cache.
10725132f78SStephan Gerhold	 */
108*1d7ed58fSStephan Gerhold	mov_imm	x1, APCS_CFG(0)
10925132f78SStephan Gerhold	ldr	w2, [x1, #APCS_TCM_START_ADDR]
11025132f78SStephan Gerhold	and	w2, w2, #~APCS_TCM_REDIRECT_EN_0
11125132f78SStephan Gerhold	str	w2, [x1, #APCS_TCM_START_ADDR]
11225132f78SStephan Gerhold
11325132f78SStephan Gerhold	/*
11425132f78SStephan Gerhold	 * After reset the CPU always starts executing at the fixed reset
11525132f78SStephan Gerhold	 * address (0x0), which does not match the link address of BL31.
11625132f78SStephan Gerhold	 * The "boot remapper" redirects all memory accesses to the real
11725132f78SStephan Gerhold	 * physical address in DRAM.
11825132f78SStephan Gerhold	 *
11925132f78SStephan Gerhold	 * For warm boots, this is already handled by loading the real
12025132f78SStephan Gerhold	 * entry point address above.
12125132f78SStephan Gerhold	 *
12225132f78SStephan Gerhold	 * For cold boots, check if the CPU is using the boot remapper,
12325132f78SStephan Gerhold	 * i.e. if bl31_entrypoint appears to be at the reset address (0x0).
12425132f78SStephan Gerhold	 */
12525132f78SStephan Gerhold	adr	x1, bl31_entrypoint
12625132f78SStephan Gerhold	cbnz	x1, 2f
12725132f78SStephan Gerhold
12825132f78SStephan Gerhold	/*
12925132f78SStephan Gerhold	 * Add the real BL31_BASE offset to the return address in the link
13025132f78SStephan Gerhold	 * register so the CPU will continue at the real address after return.
13125132f78SStephan Gerhold	 */
13225132f78SStephan Gerhold	mov_imm	x1, BL31_BASE
13325132f78SStephan Gerhold	add	lr, lr, x1
13425132f78SStephan Gerhold2:
135dddba19aSStephan Gerhold	ret
136dddba19aSStephan Gerholdendfunc plat_get_my_entrypoint
137dddba19aSStephan Gerhold
138dddba19aSStephan Gerhold	/* -------------------------------------------------
139dddba19aSStephan Gerhold	 * void platform_mem_init(void)
140dddba19aSStephan Gerhold	 * Performs additional memory initialization early
141dddba19aSStephan Gerhold	 * in the boot process.
142dddba19aSStephan Gerhold	 * -------------------------------------------------
143dddba19aSStephan Gerhold	 */
144dddba19aSStephan Gerholdfunc platform_mem_init
145dddba19aSStephan Gerhold	/* Nothing to do here, all memory is already initialized */
146dddba19aSStephan Gerhold	ret
147dddba19aSStephan Gerholdendfunc platform_mem_init
148dddba19aSStephan Gerhold
149dddba19aSStephan Gerhold	.data
150dddba19aSStephan Gerhold	.align	3
151dddba19aSStephan Gerhold
152dddba19aSStephan Gerhold	/* -------------------------------------------------
153dddba19aSStephan Gerhold	 * Warm boot entry point for CPU. Set by PSCI code.
154dddba19aSStephan Gerhold	 * -------------------------------------------------
155dddba19aSStephan Gerhold	 */
156dddba19aSStephan Gerholdmsm8916_entry_point:
157dddba19aSStephan Gerhold	.quad	0
158