xref: /rk3399_ARM-atf/plat/st/stm32mp2/aarch64/stm32mp2_helper.S (revision 64187603b20d39cc0568e83ef165b81ad254bb1b)
135527fb4SYann Gautier/*
24da462dcSYann Gautier * Copyright (c) 2023-2024, STMicroelectronics - All Rights Reserved
335527fb4SYann Gautier *
435527fb4SYann Gautier * SPDX-License-Identifier: BSD-3-Clause
535527fb4SYann Gautier */
635527fb4SYann Gautier
735527fb4SYann Gautier#include <asm_macros.S>
887a940e0SYann Gautier#include <drivers/st/stm32_gpio.h>
935527fb4SYann Gautier
1035527fb4SYann Gautier#include <platform_def.h>
1135527fb4SYann Gautier
1287a940e0SYann Gautier#define GPIO_TX_SHIFT		(DEBUG_UART_TX_GPIO_PORT << 1)
1387a940e0SYann Gautier
1435527fb4SYann Gautier	.globl	platform_mem_init
1535527fb4SYann Gautier	.globl	plat_secondary_cold_boot_setup
1635527fb4SYann Gautier	.globl	plat_is_my_cpu_primary
17d1c85da8SYann Gautier	.globl	plat_my_core_pos
1835527fb4SYann Gautier	.globl	plat_crash_console_init
1935527fb4SYann Gautier	.globl	plat_crash_console_flush
2035527fb4SYann Gautier	.globl	plat_crash_console_putc
2187a940e0SYann Gautier	.globl	plat_report_exception
2235527fb4SYann Gautier
2335527fb4SYann Gautierfunc platform_mem_init
2435527fb4SYann Gautier	/* Nothing to do, don't need to init SYSRAM */
2535527fb4SYann Gautier	ret
2635527fb4SYann Gautierendfunc platform_mem_init
2735527fb4SYann Gautier
2835527fb4SYann Gautier	/* ---------------------------------------------
2935527fb4SYann Gautier	 * void plat_secondary_cold_boot_setup (void);
3035527fb4SYann Gautier	 *
3135527fb4SYann Gautier	 * Set secondary core in WFI waiting for core reset.
3235527fb4SYann Gautier	 * ---------------------------------------------
3335527fb4SYann Gautier	 */
3435527fb4SYann Gautierfunc plat_secondary_cold_boot_setup
3535527fb4SYann Gautier	dsb	sy
362331a34fSAntonio Borneo1:
3735527fb4SYann Gautier	wfi
382331a34fSAntonio Borneo	/*
392331a34fSAntonio Borneo	 * This shouldn't be reached, but when a debugger halts the
402331a34fSAntonio Borneo	 * secondary core it causes exit from wfi.
412331a34fSAntonio Borneo	 * Put back the core in wfi.
422331a34fSAntonio Borneo	 */
432331a34fSAntonio Borneo	b	1b
4435527fb4SYann Gautierendfunc plat_secondary_cold_boot_setup
4535527fb4SYann Gautier
4635527fb4SYann Gautier	/* ----------------------------------------------
4735527fb4SYann Gautier	 * unsigned int plat_is_my_cpu_primary(void);
4835527fb4SYann Gautier	 * This function checks if this is the primary CPU
4935527fb4SYann Gautier	 * ----------------------------------------------
5035527fb4SYann Gautier	 */
5135527fb4SYann Gautierfunc plat_is_my_cpu_primary
5235527fb4SYann Gautier	mrs	x0, mpidr_el1
5335527fb4SYann Gautier	and	x0, x0, #(MPIDR_CPU_MASK)
5435527fb4SYann Gautier	cmp	x0, #STM32MP_PRIMARY_CPU
5535527fb4SYann Gautier	cset	x0, eq
5635527fb4SYann Gautier	ret
5735527fb4SYann Gautierendfunc plat_is_my_cpu_primary
5835527fb4SYann Gautier
59d1c85da8SYann Gautier	/* -----------------------------------------------------------
60d1c85da8SYann Gautier	 *  unsigned int plat_stm32mp_get_core_pos(u_register_t mpidr)
61d1c85da8SYann Gautier	 *  Helper function to calculate the core position.
62d1c85da8SYann Gautier	 *  With this function: CorePos = (ClusterId * 4) +
63d1c85da8SYann Gautier	 *  				  CoreId
64d1c85da8SYann Gautier	 * -----------------------------------------------------------
65d1c85da8SYann Gautier	 */
66d1c85da8SYann Gautierfunc plat_stm32mp_get_core_pos
67d1c85da8SYann Gautier	and	x1, x0, #MPIDR_CPU_MASK
68d1c85da8SYann Gautier	and	x0, x0, #MPIDR_CLUSTER_MASK
69d1c85da8SYann Gautier	add	x0, x1, x0, LSR #6
70d1c85da8SYann Gautier	ret
71d1c85da8SYann Gautierendfunc plat_stm32mp_get_core_pos
72d1c85da8SYann Gautier
73d1c85da8SYann Gautier	/* -----------------------------------------------------
74d1c85da8SYann Gautier	 *  unsigned int plat_my_core_pos(void)
75d1c85da8SYann Gautier	 *  This function uses the plat_stm32mp_get_core_pos()
76d1c85da8SYann Gautier	 *  definition to get the index of the calling CPU.
77d1c85da8SYann Gautier	 * -----------------------------------------------------
78d1c85da8SYann Gautier	 */
79d1c85da8SYann Gautierfunc plat_my_core_pos
80d1c85da8SYann Gautier	mrs	x0, mpidr_el1
81d1c85da8SYann Gautier	b	plat_stm32mp_get_core_pos
82d1c85da8SYann Gautierendfunc plat_my_core_pos
83d1c85da8SYann Gautier
8435527fb4SYann Gautier	/* ---------------------------------------------
8535527fb4SYann Gautier	 * int plat_crash_console_init(void)
8635527fb4SYann Gautier	 *
8735527fb4SYann Gautier	 * Initialize the crash console without a C Runtime stack.
8835527fb4SYann Gautier	 * ---------------------------------------------
8935527fb4SYann Gautier	 */
9035527fb4SYann Gautierfunc plat_crash_console_init
9187a940e0SYann Gautier	/* Reset UART peripheral */
9287a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_RST_REG)
93*23647bd5SBoerge Struempfel	ldr	w2, =DEBUG_UART_RST_BIT
94*23647bd5SBoerge Struempfel	ldr	w0, [x1]
95*23647bd5SBoerge Struempfel	orr	w0, w0, w2
96*23647bd5SBoerge Struempfel	str	w0, [x1]
9787a940e0SYann Gautier1:
98*23647bd5SBoerge Struempfel	ldr	w0, [x1]
99*23647bd5SBoerge Struempfel	tst	w0, #DEBUG_UART_RST_BIT
10087a940e0SYann Gautier	beq	1b
101*23647bd5SBoerge Struempfel	bic	w0, w0, #DEBUG_UART_RST_BIT
102*23647bd5SBoerge Struempfel	str	w0, [x1]
10387a940e0SYann Gautier2:
104*23647bd5SBoerge Struempfel	ldr	w0, [x1]
105*23647bd5SBoerge Struempfel	tst	w0, #DEBUG_UART_RST_BIT
10687a940e0SYann Gautier	bne	2b
10787a940e0SYann Gautier	/* Enable GPIOs for UART TX */
10887a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG)
10987a940e0SYann Gautier	ldr	w2, [x1]
11087a940e0SYann Gautier	/* Configure GPIO */
11187a940e0SYann Gautier	orr	w2, w2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN
11287a940e0SYann Gautier	str	w2, [x1]
11387a940e0SYann Gautier	mov_imm	x1, DEBUG_UART_TX_GPIO_BANK_ADDRESS
11487a940e0SYann Gautier	/* Set GPIO mode alternate */
11587a940e0SYann Gautier	ldr	w2, [x1, #GPIO_MODE_OFFSET]
11687a940e0SYann Gautier	bic	w2, w2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT)
11787a940e0SYann Gautier	orr	w2, w2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT)
11887a940e0SYann Gautier	str	w2, [x1, #GPIO_MODE_OFFSET]
11987a940e0SYann Gautier	/* Set GPIO speed low */
12087a940e0SYann Gautier	ldr	w2, [x1, #GPIO_SPEED_OFFSET]
12187a940e0SYann Gautier	bic	w2, w2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT)
12287a940e0SYann Gautier	str	w2, [x1, #GPIO_SPEED_OFFSET]
12387a940e0SYann Gautier	/* Set no-pull */
12487a940e0SYann Gautier	ldr	w2, [x1, #GPIO_PUPD_OFFSET]
12587a940e0SYann Gautier	bic	w2, w2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT)
12687a940e0SYann Gautier	str	w2, [x1, #GPIO_PUPD_OFFSET]
12787a940e0SYann Gautier	/* Set alternate */
12887a940e0SYann Gautier#if DEBUG_UART_TX_GPIO_PORT >= GPIO_ALT_LOWER_LIMIT
12987a940e0SYann Gautier	ldr	w2, [x1, #GPIO_AFRH_OFFSET]
13087a940e0SYann Gautier	bic	w2, w2, #(GPIO_ALTERNATE_MASK << \
13187a940e0SYann Gautier				((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2))
13287a940e0SYann Gautier	orr	w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << \
13387a940e0SYann Gautier				((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2))
13487a940e0SYann Gautier	str	w2, [x1, #GPIO_AFRH_OFFSET]
13587a940e0SYann Gautier#else
13687a940e0SYann Gautier	ldr	w2, [x1, #GPIO_AFRL_OFFSET]
13787a940e0SYann Gautier	bic	w2, w2, #(GPIO_ALTERNATE_MASK << (DEBUG_UART_TX_GPIO_PORT << 2))
13887a940e0SYann Gautier	orr	w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << (DEBUG_UART_TX_GPIO_PORT << 2))
13987a940e0SYann Gautier	str	w2, [x1, #GPIO_AFRL_OFFSET]
14087a940e0SYann Gautier#endif
14187a940e0SYann Gautier	/* Clear UART clock flexgen divisors, keep enable bit */
14287a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_PREDIV_CFGR)
14387a940e0SYann Gautier	mov	x2, #0
14487a940e0SYann Gautier	str	w2, [x1]
14587a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_FINDIV_CFGR)
14687a940e0SYann Gautier	mov	x2, #0x40
14787a940e0SYann Gautier	str	w2, [x1]
14887a940e0SYann Gautier	/* Enable UART clock, with its source */
14987a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_TX_CLKSRC_REG)
15087a940e0SYann Gautier	mov_imm	w2, (DEBUG_UART_TX_CLKSRC | RCC_XBARxCFGR_XBARxEN)
15187a940e0SYann Gautier	str	w2, [x1]
15287a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_TX_EN_REG)
15387a940e0SYann Gautier	ldr	w2, [x1]
15487a940e0SYann Gautier	orr	w2, w2, #DEBUG_UART_TX_EN
15587a940e0SYann Gautier	str	w2, [x1]
15687a940e0SYann Gautier
15787a940e0SYann Gautier	mov_imm	x0, STM32MP_DEBUG_USART_BASE
15887a940e0SYann Gautier	mov_imm	x1, STM32MP_DEBUG_USART_CLK_FRQ
15987a940e0SYann Gautier	mov_imm	x2, STM32MP_UART_BAUDRATE
16087a940e0SYann Gautier	b	console_stm32_core_init
16135527fb4SYann Gautierendfunc plat_crash_console_init
16235527fb4SYann Gautier
16335527fb4SYann Gautierfunc plat_crash_console_flush
16487a940e0SYann Gautier	mov_imm	x0, STM32MP_DEBUG_USART_BASE
16587a940e0SYann Gautier	b	console_stm32_core_flush
16635527fb4SYann Gautierendfunc plat_crash_console_flush
16735527fb4SYann Gautier
16835527fb4SYann Gautierfunc plat_crash_console_putc
16987a940e0SYann Gautier	mov_imm	x1, STM32MP_DEBUG_USART_BASE
17087a940e0SYann Gautier	cmp	x0, #'\n'
17187a940e0SYann Gautier	b.ne	1f
17287a940e0SYann Gautier	mov	x15, x30
17387a940e0SYann Gautier	mov	x0, #'\r'
17487a940e0SYann Gautier	bl	console_stm32_core_putc
17587a940e0SYann Gautier	mov	x30, x15
17687a940e0SYann Gautier	mov	x0, #'\n'
17787a940e0SYann Gautier1:
17887a940e0SYann Gautier	b	console_stm32_core_putc
17935527fb4SYann Gautierendfunc plat_crash_console_putc
18035527fb4SYann Gautier
18187a940e0SYann Gautier#ifdef IMAGE_BL2
18287a940e0SYann Gautier	/* ---------------------------------------------
18387a940e0SYann Gautier	 * void plat_report_exception(unsigned int type)
18487a940e0SYann Gautier	 * Function to report an unhandled exception
18587a940e0SYann Gautier	 * with platform-specific means.
18687a940e0SYann Gautier	 * ---------------------------------------------
18787a940e0SYann Gautier	 */
18887a940e0SYann Gautierfunc plat_report_exception
18987a940e0SYann Gautier	mov	x8, x30
19087a940e0SYann Gautier
19187a940e0SYann Gautier	adr	x4, plat_err_str
19287a940e0SYann Gautier	bl	asm_print_str
19387a940e0SYann Gautier
19487a940e0SYann Gautier	adr	x4, esr_el3_str
19587a940e0SYann Gautier	bl	asm_print_str
19687a940e0SYann Gautier
19787a940e0SYann Gautier	mrs	x4, esr_el3
19887a940e0SYann Gautier	bl	asm_print_hex
19987a940e0SYann Gautier
20087a940e0SYann Gautier	adr	x4, elr_el3_str
20187a940e0SYann Gautier	bl	asm_print_str
20287a940e0SYann Gautier
20387a940e0SYann Gautier	mrs	x4, elr_el3
20487a940e0SYann Gautier	bl	asm_print_hex
20587a940e0SYann Gautier
20687a940e0SYann Gautier	adr	x4, far_el3_str
20787a940e0SYann Gautier	bl	asm_print_str
20887a940e0SYann Gautier
20987a940e0SYann Gautier	mrs	x4, far_el3
21087a940e0SYann Gautier	bl	asm_print_hex
21187a940e0SYann Gautier
21287a940e0SYann Gautier	mov	x30, x8
21387a940e0SYann Gautier	ret
21487a940e0SYann Gautierendfunc plat_report_exception
21587a940e0SYann Gautier
21687a940e0SYann Gautier.section .rodata.rev_err_str, "aS"
21787a940e0SYann Gautierplat_err_str:
21887a940e0SYann Gautier	.asciz "\nPlatform exception reporting:"
21987a940e0SYann Gautieresr_el3_str:
22087a940e0SYann Gautier	.asciz "\nESR_EL3: "
22187a940e0SYann Gautierelr_el3_str:
22287a940e0SYann Gautier	.asciz "\nELR_EL3: "
22387a940e0SYann Gautierfar_el3_str:
22487a940e0SYann Gautier	.asciz "\nFAR_EL3: "
22587a940e0SYann Gautier#endif /* IMAGE_BL2 */
226