xref: /rk3399_ARM-atf/plat/st/stm32mp1/stm32mp1_helper.S (revision a9eda77c22d045dc7f09272b3cba76225177f9f5)
14353bb20SYann Gautier/*
2*a9eda77cSYann Gautier * Copyright (c) 2015-2020, 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)
151fc2130cSYann Gautier#define GPIO_TX_ALT_SHIFT	((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2)
164353bb20SYann Gautier
174353bb20SYann Gautier	.globl	platform_mem_init
184353bb20SYann Gautier	.globl	plat_report_exception
194353bb20SYann Gautier	.globl	plat_get_my_entrypoint
204353bb20SYann Gautier	.globl	plat_secondary_cold_boot_setup
214353bb20SYann Gautier	.globl	plat_reset_handler
224353bb20SYann Gautier	.globl	plat_is_my_cpu_primary
234353bb20SYann Gautier	.globl	plat_my_core_pos
24278c34dfSYann Gautier	.globl	plat_crash_console_init
25278c34dfSYann Gautier	.globl	plat_crash_console_flush
26278c34dfSYann Gautier	.globl	plat_crash_console_putc
274353bb20SYann Gautier	.globl	plat_panic_handler
284353bb20SYann Gautier
294353bb20SYann Gautierfunc platform_mem_init
304353bb20SYann Gautier	/* Nothing to do, don't need to init SYSRAM */
314353bb20SYann Gautier	bx	lr
324353bb20SYann Gautierendfunc platform_mem_init
334353bb20SYann Gautier
344353bb20SYann Gautierfunc plat_report_exception
35*a9eda77cSYann Gautier#if DEBUG
36*a9eda77cSYann Gautier	mov	r8, lr
37*a9eda77cSYann Gautier
38*a9eda77cSYann Gautier	/* Test if an abort occurred */
39*a9eda77cSYann Gautier	cmp	r0, #MODE32_abt
40*a9eda77cSYann Gautier	bne	undef_inst_lbl
41*a9eda77cSYann Gautier	ldr	r4, =abort_str
42*a9eda77cSYann Gautier	bl	asm_print_str
43*a9eda77cSYann Gautier	mrs	r4, lr_abt
44*a9eda77cSYann Gautier	sub	r4, r4, #4
45*a9eda77cSYann Gautier	b	print_exception_info
46*a9eda77cSYann Gautier
47*a9eda77cSYann Gautierundef_inst_lbl:
48*a9eda77cSYann Gautier	/* Test for an undefined instruction */
49*a9eda77cSYann Gautier	cmp	r0, #MODE32_und
50*a9eda77cSYann Gautier	bne	other_exception_lbl
51*a9eda77cSYann Gautier	ldr	r4, =undefined_str
52*a9eda77cSYann Gautier	bl	asm_print_str
53*a9eda77cSYann Gautier	mrs	r4, lr_und
54*a9eda77cSYann Gautier	b	print_exception_info
55*a9eda77cSYann Gautier
56*a9eda77cSYann Gautierother_exception_lbl:
57*a9eda77cSYann Gautier	/* Other exceptions */
58*a9eda77cSYann Gautier	mov	r9, r0
59*a9eda77cSYann Gautier	ldr	r4, =exception_start_str
60*a9eda77cSYann Gautier	bl	asm_print_str
61*a9eda77cSYann Gautier	mov	r4, r9
62*a9eda77cSYann Gautier	bl	asm_print_hex
63*a9eda77cSYann Gautier	ldr	r4, =exception_end_str
64*a9eda77cSYann Gautier	bl	asm_print_str
65*a9eda77cSYann Gautier	mov	r4, r6
66*a9eda77cSYann Gautier
67*a9eda77cSYann Gautierprint_exception_info:
68*a9eda77cSYann Gautier	bl	asm_print_hex
69*a9eda77cSYann Gautier
70*a9eda77cSYann Gautier	ldr	r4, =end_error_str
71*a9eda77cSYann Gautier	bl	asm_print_str
72*a9eda77cSYann Gautier
73*a9eda77cSYann Gautier	bx	r8
74*a9eda77cSYann Gautier#else
754353bb20SYann Gautier	bx	lr
76*a9eda77cSYann Gautier#endif
774353bb20SYann Gautierendfunc plat_report_exception
784353bb20SYann Gautier
794353bb20SYann Gautierfunc plat_reset_handler
804353bb20SYann Gautier	bx	lr
814353bb20SYann Gautierendfunc plat_reset_handler
824353bb20SYann Gautier
834353bb20SYann Gautier	/* ------------------------------------------------------------------
844353bb20SYann Gautier	 * unsigned long plat_get_my_entrypoint (void);
854353bb20SYann Gautier	 *
864353bb20SYann Gautier	 * Main job of this routine is to distinguish between a cold and warm
874353bb20SYann Gautier	 * boot.
884353bb20SYann Gautier	 *
894353bb20SYann Gautier	 * Currently supports only cold boot
904353bb20SYann Gautier	 * ------------------------------------------------------------------
914353bb20SYann Gautier	 */
924353bb20SYann Gautierfunc plat_get_my_entrypoint
934353bb20SYann Gautier	mov	r0, #0
944353bb20SYann Gautier	bx	lr
954353bb20SYann Gautierendfunc plat_get_my_entrypoint
964353bb20SYann Gautier
974353bb20SYann Gautier	/* ---------------------------------------------
984353bb20SYann Gautier	 * void plat_secondary_cold_boot_setup (void);
994353bb20SYann Gautier	 *
1004353bb20SYann Gautier	 * Cold-booting secondary CPUs is not supported.
1014353bb20SYann Gautier	 * ---------------------------------------------
1024353bb20SYann Gautier	 */
1034353bb20SYann Gautierfunc plat_secondary_cold_boot_setup
1044353bb20SYann Gautier	b	.
1054353bb20SYann Gautierendfunc plat_secondary_cold_boot_setup
1064353bb20SYann Gautier
1074353bb20SYann Gautier	/* -----------------------------------------------------
1084353bb20SYann Gautier	 * unsigned int plat_is_my_cpu_primary (void);
1094353bb20SYann Gautier	 *
1104353bb20SYann Gautier	 * Find out whether the current cpu is the primary cpu.
1114353bb20SYann Gautier	 * -----------------------------------------------------
1124353bb20SYann Gautier	 */
1134353bb20SYann Gautierfunc plat_is_my_cpu_primary
1144353bb20SYann Gautier	ldcopr	r0, MPIDR
1154353bb20SYann Gautier	ldr	r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
1164353bb20SYann Gautier	and	r0, r1
1173f9c9784SYann Gautier	cmp	r0, #STM32MP_PRIMARY_CPU
1184353bb20SYann Gautier	moveq	r0, #1
1194353bb20SYann Gautier	movne	r0, #0
1204353bb20SYann Gautier	bx	lr
1214353bb20SYann Gautierendfunc plat_is_my_cpu_primary
1224353bb20SYann Gautier
1234353bb20SYann Gautier	/* -------------------------------------------
1244353bb20SYann Gautier	 *  int plat_stm32mp1_get_core_pos(int mpidr);
1254353bb20SYann Gautier	 *
1264353bb20SYann Gautier	 *  Return CorePos = (ClusterId * 4) + CoreId
1274353bb20SYann Gautier	 * -------------------------------------------
1284353bb20SYann Gautier	 */
1294353bb20SYann Gautierfunc plat_stm32mp1_get_core_pos
1304353bb20SYann Gautier	and	r1, r0, #MPIDR_CPU_MASK
1314353bb20SYann Gautier	and	r0, r0, #MPIDR_CLUSTER_MASK
1324353bb20SYann Gautier	add	r0, r1, r0, LSR #6
1334353bb20SYann Gautier	bx	lr
1344353bb20SYann Gautierendfunc plat_stm32mp1_get_core_pos
1354353bb20SYann Gautier
1364353bb20SYann Gautier	/* ------------------------------------
1374353bb20SYann Gautier	 *  unsigned int plat_my_core_pos(void)
1384353bb20SYann Gautier	 * ------------------------------------
1394353bb20SYann Gautier	 */
1404353bb20SYann Gautierfunc plat_my_core_pos
1414353bb20SYann Gautier	ldcopr	r0, MPIDR
1424353bb20SYann Gautier	b	plat_stm32mp1_get_core_pos
1434353bb20SYann Gautierendfunc plat_my_core_pos
144278c34dfSYann Gautier
145278c34dfSYann Gautier	/* ---------------------------------------------
146278c34dfSYann Gautier	 * int plat_crash_console_init(void)
147278c34dfSYann Gautier	 *
148278c34dfSYann Gautier	 * Initialize the crash console without a C Runtime stack.
149278c34dfSYann Gautier	 * ---------------------------------------------
150278c34dfSYann Gautier	 */
151278c34dfSYann Gautierfunc plat_crash_console_init
1521fc2130cSYann Gautier	/* Enable GPIOs for UART TX */
1531fc2130cSYann Gautier	ldr	r1, =(RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG)
154278c34dfSYann Gautier	ldr	r2, [r1]
1551fc2130cSYann Gautier	/* Configure GPIO */
1561fc2130cSYann Gautier	orr	r2, r2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN
157278c34dfSYann Gautier	str	r2, [r1]
1581fc2130cSYann Gautier	ldr	r1, =DEBUG_UART_TX_GPIO_BANK_ADDRESS
159278c34dfSYann Gautier	/* Set GPIO mode alternate */
160278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_MODE_OFFSET]
161278c34dfSYann Gautier	bic	r2, r2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT)
162278c34dfSYann Gautier	orr	r2, r2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT)
163278c34dfSYann Gautier	str	r2, [r1, #GPIO_MODE_OFFSET]
164278c34dfSYann Gautier	/* Set GPIO speed low */
165278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_SPEED_OFFSET]
166278c34dfSYann Gautier	bic	r2, r2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT)
167278c34dfSYann Gautier	str	r2, [r1, #GPIO_SPEED_OFFSET]
168278c34dfSYann Gautier	/* Set no-pull */
169278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_PUPD_OFFSET]
170278c34dfSYann Gautier	bic	r2, r2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT)
171278c34dfSYann Gautier	str	r2, [r1, #GPIO_PUPD_OFFSET]
1721fc2130cSYann Gautier	/* Set alternate */
173278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_AFRH_OFFSET]
174278c34dfSYann Gautier	bic	r2, r2, #(GPIO_ALTERNATE_MASK << GPIO_TX_ALT_SHIFT)
1751fc2130cSYann Gautier	orr	r2, r2, #(DEBUG_UART_TX_GPIO_ALTERNATE << GPIO_TX_ALT_SHIFT)
176278c34dfSYann Gautier	str	r2, [r1, #GPIO_AFRH_OFFSET]
1771fc2130cSYann Gautier	/* Enable UART clock, with its source */
1781fc2130cSYann Gautier	ldr	r1, =(RCC_BASE + DEBUG_UART_TX_CLKSRC_REG)
1791fc2130cSYann Gautier	mov	r2, #DEBUG_UART_TX_CLKSRC
180278c34dfSYann Gautier	str	r2, [r1]
1811fc2130cSYann Gautier	ldr	r1, =(RCC_BASE + DEBUG_UART_TX_EN_REG)
182278c34dfSYann Gautier	ldr	r2, [r1]
1831fc2130cSYann Gautier	orr	r2, r2, #DEBUG_UART_TX_EN
184278c34dfSYann Gautier	str	r2, [r1]
185278c34dfSYann Gautier
1863f9c9784SYann Gautier	ldr	r0, =STM32MP_DEBUG_USART_BASE
1873f9c9784SYann Gautier	ldr	r1, =STM32MP_DEBUG_USART_CLK_FRQ
1883f9c9784SYann Gautier	ldr	r2, =STM32MP_UART_BAUDRATE
189cce37d44SYann Gautier	b	console_stm32_core_init
190278c34dfSYann Gautierendfunc plat_crash_console_init
191278c34dfSYann Gautier
192278c34dfSYann Gautier	/* ---------------------------------------------
193278c34dfSYann Gautier	 * int plat_crash_console_flush(void)
194278c34dfSYann Gautier	 *
195278c34dfSYann Gautier	 * Flush the crash console without a C Runtime stack.
196278c34dfSYann Gautier	 * ---------------------------------------------
197278c34dfSYann Gautier	 */
198278c34dfSYann Gautierfunc plat_crash_console_flush
1993f9c9784SYann Gautier	ldr	r1, =STM32MP_DEBUG_USART_BASE
200cce37d44SYann Gautier	b	console_stm32_core_flush
201278c34dfSYann Gautierendfunc plat_crash_console_flush
202278c34dfSYann Gautier
203278c34dfSYann Gautier	/* ---------------------------------------------
204278c34dfSYann Gautier	 * int plat_crash_console_putc(int c)
205278c34dfSYann Gautier	 *
206278c34dfSYann Gautier	 * Print a character on the crash console without a C Runtime stack.
207278c34dfSYann Gautier	 * Clobber list : r1 - r3
208278c34dfSYann Gautier	 *
209278c34dfSYann Gautier	 * In case of bootloading through uart, we keep console crash as this.
210278c34dfSYann Gautier	 * Characters could be sent to the programmer, but will be ignored.
211278c34dfSYann Gautier	 * No specific code in that case.
212278c34dfSYann Gautier	 * ---------------------------------------------
213278c34dfSYann Gautier	 */
214278c34dfSYann Gautierfunc plat_crash_console_putc
2153f9c9784SYann Gautier	ldr	r1, =STM32MP_DEBUG_USART_BASE
216cce37d44SYann Gautier	b	console_stm32_core_putc
217278c34dfSYann Gautierendfunc plat_crash_console_putc
218*a9eda77cSYann Gautier
219*a9eda77cSYann Gautier#if DEBUG
220*a9eda77cSYann Gautier.section .rodata.rev_err_str, "aS"
221*a9eda77cSYann Gautierabort_str:
222*a9eda77cSYann Gautier	.asciz "\nAbort at: 0x"
223*a9eda77cSYann Gautierundefined_str:
224*a9eda77cSYann Gautier	.asciz "\nUndefined instruction at: 0x"
225*a9eda77cSYann Gautierexception_start_str:
226*a9eda77cSYann Gautier	.asciz "\nException mode=0x"
227*a9eda77cSYann Gautierexception_end_str:
228*a9eda77cSYann Gautier	.asciz " at: 0x"
229*a9eda77cSYann Gautierend_error_str:
230*a9eda77cSYann Gautier	.asciz "\n\r"
231*a9eda77cSYann Gautier#endif
232