xref: /rk3399_ARM-atf/plat/st/stm32mp1/stm32mp1_helper.S (revision b38e2ed29ef791dad0cb61fed81b74d612f58b01)
14353bb20SYann Gautier/*
2*b38e2ed2SYann Gautier * Copyright (c) 2015-2021, ARM Limited and Contributors. All rights reserved.
34353bb20SYann Gautier *
44353bb20SYann Gautier * SPDX-License-Identifier: BSD-3-Clause
54353bb20SYann Gautier */
64353bb20SYann Gautier
709d40e0eSAntonio Nino Diaz#include <platform_def.h>
809d40e0eSAntonio Nino Diaz
94353bb20SYann Gautier#include <arch.h>
104353bb20SYann Gautier#include <asm_macros.S>
1109d40e0eSAntonio Nino Diaz#include <common/bl_common.h>
1209d40e0eSAntonio Nino Diaz#include <drivers/st/stm32_gpio.h>
13278c34dfSYann Gautier
141fc2130cSYann Gautier#define GPIO_TX_SHIFT		(DEBUG_UART_TX_GPIO_PORT << 1)
154353bb20SYann Gautier
164353bb20SYann Gautier	.globl	platform_mem_init
174353bb20SYann Gautier	.globl	plat_report_exception
184353bb20SYann Gautier	.globl	plat_get_my_entrypoint
194353bb20SYann Gautier	.globl	plat_secondary_cold_boot_setup
204353bb20SYann Gautier	.globl	plat_reset_handler
214353bb20SYann Gautier	.globl	plat_is_my_cpu_primary
224353bb20SYann Gautier	.globl	plat_my_core_pos
23278c34dfSYann Gautier	.globl	plat_crash_console_init
24278c34dfSYann Gautier	.globl	plat_crash_console_flush
25278c34dfSYann Gautier	.globl	plat_crash_console_putc
264353bb20SYann Gautier	.globl	plat_panic_handler
274353bb20SYann Gautier
284353bb20SYann Gautierfunc platform_mem_init
294353bb20SYann Gautier	/* Nothing to do, don't need to init SYSRAM */
304353bb20SYann Gautier	bx	lr
314353bb20SYann Gautierendfunc platform_mem_init
324353bb20SYann Gautier
334353bb20SYann Gautierfunc plat_report_exception
34a9eda77cSYann Gautier#if DEBUG
35a9eda77cSYann Gautier	mov	r8, lr
36a9eda77cSYann Gautier
37a9eda77cSYann Gautier	/* Test if an abort occurred */
38a9eda77cSYann Gautier	cmp	r0, #MODE32_abt
39a9eda77cSYann Gautier	bne	undef_inst_lbl
40a9eda77cSYann Gautier	ldr	r4, =abort_str
41a9eda77cSYann Gautier	bl	asm_print_str
42a9eda77cSYann Gautier	mrs	r4, lr_abt
43a9eda77cSYann Gautier	sub	r4, r4, #4
44a9eda77cSYann Gautier	b	print_exception_info
45a9eda77cSYann Gautier
46a9eda77cSYann Gautierundef_inst_lbl:
47a9eda77cSYann Gautier	/* Test for an undefined instruction */
48a9eda77cSYann Gautier	cmp	r0, #MODE32_und
49a9eda77cSYann Gautier	bne	other_exception_lbl
50a9eda77cSYann Gautier	ldr	r4, =undefined_str
51a9eda77cSYann Gautier	bl	asm_print_str
52a9eda77cSYann Gautier	mrs	r4, lr_und
53a9eda77cSYann Gautier	b	print_exception_info
54a9eda77cSYann Gautier
55a9eda77cSYann Gautierother_exception_lbl:
56a9eda77cSYann Gautier	/* Other exceptions */
57a9eda77cSYann Gautier	mov	r9, r0
58a9eda77cSYann Gautier	ldr	r4, =exception_start_str
59a9eda77cSYann Gautier	bl	asm_print_str
60a9eda77cSYann Gautier	mov	r4, r9
61a9eda77cSYann Gautier	bl	asm_print_hex
62a9eda77cSYann Gautier	ldr	r4, =exception_end_str
63a9eda77cSYann Gautier	bl	asm_print_str
64a9eda77cSYann Gautier	mov	r4, r6
65a9eda77cSYann Gautier
66a9eda77cSYann Gautierprint_exception_info:
67a9eda77cSYann Gautier	bl	asm_print_hex
68a9eda77cSYann Gautier
69a9eda77cSYann Gautier	ldr	r4, =end_error_str
70a9eda77cSYann Gautier	bl	asm_print_str
71a9eda77cSYann Gautier
72a9eda77cSYann Gautier	bx	r8
73a9eda77cSYann Gautier#else
744353bb20SYann Gautier	bx	lr
75a9eda77cSYann Gautier#endif
764353bb20SYann Gautierendfunc plat_report_exception
774353bb20SYann Gautier
784353bb20SYann Gautierfunc plat_reset_handler
794353bb20SYann Gautier	bx	lr
804353bb20SYann Gautierendfunc plat_reset_handler
814353bb20SYann Gautier
824353bb20SYann Gautier	/* ------------------------------------------------------------------
834353bb20SYann Gautier	 * unsigned long plat_get_my_entrypoint (void);
844353bb20SYann Gautier	 *
854353bb20SYann Gautier	 * Main job of this routine is to distinguish between a cold and warm
864353bb20SYann Gautier	 * boot.
874353bb20SYann Gautier	 *
884353bb20SYann Gautier	 * Currently supports only cold boot
894353bb20SYann Gautier	 * ------------------------------------------------------------------
904353bb20SYann Gautier	 */
914353bb20SYann Gautierfunc plat_get_my_entrypoint
924353bb20SYann Gautier	mov	r0, #0
934353bb20SYann Gautier	bx	lr
944353bb20SYann Gautierendfunc plat_get_my_entrypoint
954353bb20SYann Gautier
964353bb20SYann Gautier	/* ---------------------------------------------
974353bb20SYann Gautier	 * void plat_secondary_cold_boot_setup (void);
984353bb20SYann Gautier	 *
994353bb20SYann Gautier	 * Cold-booting secondary CPUs is not supported.
1004353bb20SYann Gautier	 * ---------------------------------------------
1014353bb20SYann Gautier	 */
1024353bb20SYann Gautierfunc plat_secondary_cold_boot_setup
1034353bb20SYann Gautier	b	.
1044353bb20SYann Gautierendfunc plat_secondary_cold_boot_setup
1054353bb20SYann Gautier
1064353bb20SYann Gautier	/* -----------------------------------------------------
1074353bb20SYann Gautier	 * unsigned int plat_is_my_cpu_primary (void);
1084353bb20SYann Gautier	 *
1094353bb20SYann Gautier	 * Find out whether the current cpu is the primary cpu.
1104353bb20SYann Gautier	 * -----------------------------------------------------
1114353bb20SYann Gautier	 */
1124353bb20SYann Gautierfunc plat_is_my_cpu_primary
1134353bb20SYann Gautier	ldcopr	r0, MPIDR
1144353bb20SYann Gautier	ldr	r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
1154353bb20SYann Gautier	and	r0, r1
1163f9c9784SYann Gautier	cmp	r0, #STM32MP_PRIMARY_CPU
1174353bb20SYann Gautier	moveq	r0, #1
1184353bb20SYann Gautier	movne	r0, #0
1194353bb20SYann Gautier	bx	lr
1204353bb20SYann Gautierendfunc plat_is_my_cpu_primary
1214353bb20SYann Gautier
1224353bb20SYann Gautier	/* -------------------------------------------
1234353bb20SYann Gautier	 *  int plat_stm32mp1_get_core_pos(int mpidr);
1244353bb20SYann Gautier	 *
1254353bb20SYann Gautier	 *  Return CorePos = (ClusterId * 4) + CoreId
1264353bb20SYann Gautier	 * -------------------------------------------
1274353bb20SYann Gautier	 */
1284353bb20SYann Gautierfunc plat_stm32mp1_get_core_pos
1294353bb20SYann Gautier	and	r1, r0, #MPIDR_CPU_MASK
1304353bb20SYann Gautier	and	r0, r0, #MPIDR_CLUSTER_MASK
1314353bb20SYann Gautier	add	r0, r1, r0, LSR #6
1324353bb20SYann Gautier	bx	lr
1334353bb20SYann Gautierendfunc plat_stm32mp1_get_core_pos
1344353bb20SYann Gautier
1354353bb20SYann Gautier	/* ------------------------------------
1364353bb20SYann Gautier	 *  unsigned int plat_my_core_pos(void)
1374353bb20SYann Gautier	 * ------------------------------------
1384353bb20SYann Gautier	 */
1394353bb20SYann Gautierfunc plat_my_core_pos
1404353bb20SYann Gautier	ldcopr	r0, MPIDR
1414353bb20SYann Gautier	b	plat_stm32mp1_get_core_pos
1424353bb20SYann Gautierendfunc plat_my_core_pos
143278c34dfSYann Gautier
144278c34dfSYann Gautier	/* ---------------------------------------------
145278c34dfSYann Gautier	 * int plat_crash_console_init(void)
146278c34dfSYann Gautier	 *
147278c34dfSYann Gautier	 * Initialize the crash console without a C Runtime stack.
148278c34dfSYann Gautier	 * ---------------------------------------------
149278c34dfSYann Gautier	 */
150278c34dfSYann Gautierfunc plat_crash_console_init
151*b38e2ed2SYann Gautier	/* Reset UART peripheral */
152*b38e2ed2SYann Gautier	ldr	r1, =(RCC_BASE + DEBUG_UART_RST_REG)
153*b38e2ed2SYann Gautier	ldr	r2, =DEBUG_UART_RST_BIT
154*b38e2ed2SYann Gautier	str	r2, [r1]
155*b38e2ed2SYann Gautier1:
156*b38e2ed2SYann Gautier	ldr	r0, [r1]
157*b38e2ed2SYann Gautier	ands	r2, r0, r2
158*b38e2ed2SYann Gautier	beq	1b
159*b38e2ed2SYann Gautier	str	r2, [r1, #4] /* RSTCLR register */
160*b38e2ed2SYann Gautier2:
161*b38e2ed2SYann Gautier	ldr	r0, [r1]
162*b38e2ed2SYann Gautier	ands	r2, r0, r2
163*b38e2ed2SYann Gautier	bne	2b
1641fc2130cSYann Gautier	/* Enable GPIOs for UART TX */
1651fc2130cSYann Gautier	ldr	r1, =(RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG)
166278c34dfSYann Gautier	ldr	r2, [r1]
1671fc2130cSYann Gautier	/* Configure GPIO */
1681fc2130cSYann Gautier	orr	r2, r2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN
169278c34dfSYann Gautier	str	r2, [r1]
1701fc2130cSYann Gautier	ldr	r1, =DEBUG_UART_TX_GPIO_BANK_ADDRESS
171278c34dfSYann Gautier	/* Set GPIO mode alternate */
172278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_MODE_OFFSET]
173278c34dfSYann Gautier	bic	r2, r2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT)
174278c34dfSYann Gautier	orr	r2, r2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT)
175278c34dfSYann Gautier	str	r2, [r1, #GPIO_MODE_OFFSET]
176278c34dfSYann Gautier	/* Set GPIO speed low */
177278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_SPEED_OFFSET]
178278c34dfSYann Gautier	bic	r2, r2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT)
179278c34dfSYann Gautier	str	r2, [r1, #GPIO_SPEED_OFFSET]
180278c34dfSYann Gautier	/* Set no-pull */
181278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_PUPD_OFFSET]
182278c34dfSYann Gautier	bic	r2, r2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT)
183278c34dfSYann Gautier	str	r2, [r1, #GPIO_PUPD_OFFSET]
1841fc2130cSYann Gautier	/* Set alternate */
1854170079aSYann Gautier#if DEBUG_UART_TX_GPIO_PORT >= GPIO_ALT_LOWER_LIMIT
186278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_AFRH_OFFSET]
1874170079aSYann Gautier	bic	r2, r2, #(GPIO_ALTERNATE_MASK << \
1884170079aSYann Gautier				((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2))
1894170079aSYann Gautier	orr	r2, r2, #(DEBUG_UART_TX_GPIO_ALTERNATE << \
1904170079aSYann Gautier				((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2))
191278c34dfSYann Gautier	str	r2, [r1, #GPIO_AFRH_OFFSET]
1924170079aSYann Gautier#else
1934170079aSYann Gautier	ldr	r2, [r1, #GPIO_AFRL_OFFSET]
1944170079aSYann Gautier	bic	r2, r2, #(GPIO_ALTERNATE_MASK << (DEBUG_UART_TX_GPIO_PORT << 2))
1954170079aSYann Gautier	orr	r2, r2, #(DEBUG_UART_TX_GPIO_ALTERNATE << (DEBUG_UART_TX_GPIO_PORT << 2))
1964170079aSYann Gautier	str	r2, [r1, #GPIO_AFRL_OFFSET]
1974170079aSYann Gautier#endif
1981fc2130cSYann Gautier	/* Enable UART clock, with its source */
1991fc2130cSYann Gautier	ldr	r1, =(RCC_BASE + DEBUG_UART_TX_CLKSRC_REG)
2001fc2130cSYann Gautier	mov	r2, #DEBUG_UART_TX_CLKSRC
201278c34dfSYann Gautier	str	r2, [r1]
2021fc2130cSYann Gautier	ldr	r1, =(RCC_BASE + DEBUG_UART_TX_EN_REG)
203278c34dfSYann Gautier	ldr	r2, [r1]
2041fc2130cSYann Gautier	orr	r2, r2, #DEBUG_UART_TX_EN
205278c34dfSYann Gautier	str	r2, [r1]
206278c34dfSYann Gautier
2073f9c9784SYann Gautier	ldr	r0, =STM32MP_DEBUG_USART_BASE
2083f9c9784SYann Gautier	ldr	r1, =STM32MP_DEBUG_USART_CLK_FRQ
2093f9c9784SYann Gautier	ldr	r2, =STM32MP_UART_BAUDRATE
210cce37d44SYann Gautier	b	console_stm32_core_init
211278c34dfSYann Gautierendfunc plat_crash_console_init
212278c34dfSYann Gautier
213278c34dfSYann Gautier	/* ---------------------------------------------
214831b0e98SJimmy Brisson	 * void plat_crash_console_flush(void)
215278c34dfSYann Gautier	 *
216278c34dfSYann Gautier	 * Flush the crash console without a C Runtime stack.
217278c34dfSYann Gautier	 * ---------------------------------------------
218278c34dfSYann Gautier	 */
219278c34dfSYann Gautierfunc plat_crash_console_flush
220aeb727f3SYann Gautier	ldr	r0, =STM32MP_DEBUG_USART_BASE
221cce37d44SYann Gautier	b	console_stm32_core_flush
222278c34dfSYann Gautierendfunc plat_crash_console_flush
223278c34dfSYann Gautier
224278c34dfSYann Gautier	/* ---------------------------------------------
225278c34dfSYann Gautier	 * int plat_crash_console_putc(int c)
226278c34dfSYann Gautier	 *
227278c34dfSYann Gautier	 * Print a character on the crash console without a C Runtime stack.
228278c34dfSYann Gautier	 * Clobber list : r1 - r3
229278c34dfSYann Gautier	 *
230278c34dfSYann Gautier	 * In case of bootloading through uart, we keep console crash as this.
231278c34dfSYann Gautier	 * Characters could be sent to the programmer, but will be ignored.
232278c34dfSYann Gautier	 * No specific code in that case.
233278c34dfSYann Gautier	 * ---------------------------------------------
234278c34dfSYann Gautier	 */
235278c34dfSYann Gautierfunc plat_crash_console_putc
2363f9c9784SYann Gautier	ldr	r1, =STM32MP_DEBUG_USART_BASE
237cce37d44SYann Gautier	b	console_stm32_core_putc
238278c34dfSYann Gautierendfunc plat_crash_console_putc
239a9eda77cSYann Gautier
2406397423eSYann Gautier	/* ----------------------------------------------------------
2416397423eSYann Gautier	 * void plat_panic_handler(void) __dead2;
2426397423eSYann Gautier	 * Report exception + endless loop.
2436397423eSYann Gautier	 *
2446397423eSYann Gautier	 * r6 holds the address where the fault occurred.
2456397423eSYann Gautier	 * Filling lr with this value allows debuggers to reconstruct
2466397423eSYann Gautier	 * the backtrace.
2476397423eSYann Gautier	 * ----------------------------------------------------------
2486397423eSYann Gautier	 */
2496397423eSYann Gautierfunc plat_panic_handler
2506397423eSYann Gautier	mrs	r0, cpsr
2516397423eSYann Gautier	and	r0, #MODE32_MASK
2526397423eSYann Gautier	bl	plat_report_exception
2536397423eSYann Gautier	mov	lr, r6
2546397423eSYann Gautier	b	.
2556397423eSYann Gautierendfunc plat_panic_handler
2566397423eSYann Gautier
257a9eda77cSYann Gautier#if DEBUG
258a9eda77cSYann Gautier.section .rodata.rev_err_str, "aS"
259a9eda77cSYann Gautierabort_str:
260a9eda77cSYann Gautier	.asciz "\nAbort at: 0x"
261a9eda77cSYann Gautierundefined_str:
262a9eda77cSYann Gautier	.asciz "\nUndefined instruction at: 0x"
263a9eda77cSYann Gautierexception_start_str:
264a9eda77cSYann Gautier	.asciz "\nException mode=0x"
265a9eda77cSYann Gautierexception_end_str:
266a9eda77cSYann Gautier	.asciz " at: 0x"
267a9eda77cSYann Gautierend_error_str:
268a9eda77cSYann Gautier	.asciz "\n\r"
269a9eda77cSYann Gautier#endif
270