xref: /rk3399_ARM-atf/plat/st/stm32mp2/aarch64/stm32mp2_helper.S (revision 4da462dcdc2e435c8b732f3ceff4c94ca28b4c43)
135527fb4SYann Gautier/*
2*4da462dcSYann 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
1735527fb4SYann Gautier	.globl	plat_crash_console_init
1835527fb4SYann Gautier	.globl	plat_crash_console_flush
1935527fb4SYann Gautier	.globl	plat_crash_console_putc
2087a940e0SYann Gautier	.globl	plat_report_exception
2135527fb4SYann Gautier
2235527fb4SYann Gautierfunc platform_mem_init
2335527fb4SYann Gautier	/* Nothing to do, don't need to init SYSRAM */
2435527fb4SYann Gautier	ret
2535527fb4SYann Gautierendfunc platform_mem_init
2635527fb4SYann Gautier
2735527fb4SYann Gautier	/* ---------------------------------------------
2835527fb4SYann Gautier	 * void plat_secondary_cold_boot_setup (void);
2935527fb4SYann Gautier	 *
3035527fb4SYann Gautier	 * Set secondary core in WFI waiting for core reset.
3135527fb4SYann Gautier	 * ---------------------------------------------
3235527fb4SYann Gautier	 */
3335527fb4SYann Gautierfunc plat_secondary_cold_boot_setup
3435527fb4SYann Gautier	dsb	sy
3535527fb4SYann Gautier	wfi
3635527fb4SYann Gautier	/* This shouldn't be reached */
3735527fb4SYann Gautier	b	.
3835527fb4SYann Gautierendfunc plat_secondary_cold_boot_setup
3935527fb4SYann Gautier
4035527fb4SYann Gautier	/* ----------------------------------------------
4135527fb4SYann Gautier	 * unsigned int plat_is_my_cpu_primary(void);
4235527fb4SYann Gautier	 * This function checks if this is the primary CPU
4335527fb4SYann Gautier	 * ----------------------------------------------
4435527fb4SYann Gautier	 */
4535527fb4SYann Gautierfunc plat_is_my_cpu_primary
4635527fb4SYann Gautier	mrs	x0, mpidr_el1
4735527fb4SYann Gautier	and	x0, x0, #(MPIDR_CPU_MASK)
4835527fb4SYann Gautier	cmp	x0, #STM32MP_PRIMARY_CPU
4935527fb4SYann Gautier	cset	x0, eq
5035527fb4SYann Gautier	ret
5135527fb4SYann Gautierendfunc plat_is_my_cpu_primary
5235527fb4SYann Gautier
5335527fb4SYann Gautier	/* ---------------------------------------------
5435527fb4SYann Gautier	 * int plat_crash_console_init(void)
5535527fb4SYann Gautier	 *
5635527fb4SYann Gautier	 * Initialize the crash console without a C Runtime stack.
5735527fb4SYann Gautier	 * ---------------------------------------------
5835527fb4SYann Gautier	 */
5935527fb4SYann Gautierfunc plat_crash_console_init
6087a940e0SYann Gautier	/* Reset UART peripheral */
6187a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_RST_REG)
6287a940e0SYann Gautier	ldr	x2, =DEBUG_UART_RST_BIT
6387a940e0SYann Gautier	ldr	x0, [x1]
6487a940e0SYann Gautier	orr	x0, x0, x2
6587a940e0SYann Gautier	str	x0, [x1]
6687a940e0SYann Gautier1:
6787a940e0SYann Gautier	ldr	x0, [x1]
68*4da462dcSYann Gautier	tst	x0, #DEBUG_UART_RST_BIT
6987a940e0SYann Gautier	beq	1b
70*4da462dcSYann Gautier	bic	x0, x0, #DEBUG_UART_RST_BIT
71*4da462dcSYann Gautier	str	x0, [x1]
7287a940e0SYann Gautier2:
7387a940e0SYann Gautier	ldr	x0, [x1]
74*4da462dcSYann Gautier	tst	x0, #DEBUG_UART_RST_BIT
7587a940e0SYann Gautier	bne	2b
7687a940e0SYann Gautier	/* Enable GPIOs for UART TX */
7787a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG)
7887a940e0SYann Gautier	ldr	w2, [x1]
7987a940e0SYann Gautier	/* Configure GPIO */
8087a940e0SYann Gautier	orr	w2, w2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN
8187a940e0SYann Gautier	str	w2, [x1]
8287a940e0SYann Gautier	mov_imm	x1, DEBUG_UART_TX_GPIO_BANK_ADDRESS
8387a940e0SYann Gautier	/* Set GPIO mode alternate */
8487a940e0SYann Gautier	ldr	w2, [x1, #GPIO_MODE_OFFSET]
8587a940e0SYann Gautier	bic	w2, w2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT)
8687a940e0SYann Gautier	orr	w2, w2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT)
8787a940e0SYann Gautier	str	w2, [x1, #GPIO_MODE_OFFSET]
8887a940e0SYann Gautier	/* Set GPIO speed low */
8987a940e0SYann Gautier	ldr	w2, [x1, #GPIO_SPEED_OFFSET]
9087a940e0SYann Gautier	bic	w2, w2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT)
9187a940e0SYann Gautier	str	w2, [x1, #GPIO_SPEED_OFFSET]
9287a940e0SYann Gautier	/* Set no-pull */
9387a940e0SYann Gautier	ldr	w2, [x1, #GPIO_PUPD_OFFSET]
9487a940e0SYann Gautier	bic	w2, w2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT)
9587a940e0SYann Gautier	str	w2, [x1, #GPIO_PUPD_OFFSET]
9687a940e0SYann Gautier	/* Set alternate */
9787a940e0SYann Gautier#if DEBUG_UART_TX_GPIO_PORT >= GPIO_ALT_LOWER_LIMIT
9887a940e0SYann Gautier	ldr	w2, [x1, #GPIO_AFRH_OFFSET]
9987a940e0SYann Gautier	bic	w2, w2, #(GPIO_ALTERNATE_MASK << \
10087a940e0SYann Gautier				((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2))
10187a940e0SYann Gautier	orr	w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << \
10287a940e0SYann Gautier				((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2))
10387a940e0SYann Gautier	str	w2, [x1, #GPIO_AFRH_OFFSET]
10487a940e0SYann Gautier#else
10587a940e0SYann Gautier	ldr	w2, [x1, #GPIO_AFRL_OFFSET]
10687a940e0SYann Gautier	bic	w2, w2, #(GPIO_ALTERNATE_MASK << (DEBUG_UART_TX_GPIO_PORT << 2))
10787a940e0SYann Gautier	orr	w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << (DEBUG_UART_TX_GPIO_PORT << 2))
10887a940e0SYann Gautier	str	w2, [x1, #GPIO_AFRL_OFFSET]
10987a940e0SYann Gautier#endif
11087a940e0SYann Gautier	/* Clear UART clock flexgen divisors, keep enable bit */
11187a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_PREDIV_CFGR)
11287a940e0SYann Gautier	mov	x2, #0
11387a940e0SYann Gautier	str	w2, [x1]
11487a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_FINDIV_CFGR)
11587a940e0SYann Gautier	mov	x2, #0x40
11687a940e0SYann Gautier	str	w2, [x1]
11787a940e0SYann Gautier	/* Enable UART clock, with its source */
11887a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_TX_CLKSRC_REG)
11987a940e0SYann Gautier	mov_imm	w2, (DEBUG_UART_TX_CLKSRC | RCC_XBARxCFGR_XBARxEN)
12087a940e0SYann Gautier	str	w2, [x1]
12187a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_TX_EN_REG)
12287a940e0SYann Gautier	ldr	w2, [x1]
12387a940e0SYann Gautier	orr	w2, w2, #DEBUG_UART_TX_EN
12487a940e0SYann Gautier	str	w2, [x1]
12587a940e0SYann Gautier
12687a940e0SYann Gautier	mov_imm	x0, STM32MP_DEBUG_USART_BASE
12787a940e0SYann Gautier	mov_imm	x1, STM32MP_DEBUG_USART_CLK_FRQ
12887a940e0SYann Gautier	mov_imm	x2, STM32MP_UART_BAUDRATE
12987a940e0SYann Gautier	b	console_stm32_core_init
13035527fb4SYann Gautierendfunc plat_crash_console_init
13135527fb4SYann Gautier
13235527fb4SYann Gautierfunc plat_crash_console_flush
13387a940e0SYann Gautier	mov_imm	x0, STM32MP_DEBUG_USART_BASE
13487a940e0SYann Gautier	b	console_stm32_core_flush
13535527fb4SYann Gautierendfunc plat_crash_console_flush
13635527fb4SYann Gautier
13735527fb4SYann Gautierfunc plat_crash_console_putc
13887a940e0SYann Gautier	mov_imm	x1, STM32MP_DEBUG_USART_BASE
13987a940e0SYann Gautier	cmp	x0, #'\n'
14087a940e0SYann Gautier	b.ne	1f
14187a940e0SYann Gautier	mov	x15, x30
14287a940e0SYann Gautier	mov	x0, #'\r'
14387a940e0SYann Gautier	bl	console_stm32_core_putc
14487a940e0SYann Gautier	mov	x30, x15
14587a940e0SYann Gautier	mov	x0, #'\n'
14687a940e0SYann Gautier1:
14787a940e0SYann Gautier	b	console_stm32_core_putc
14835527fb4SYann Gautierendfunc plat_crash_console_putc
14935527fb4SYann Gautier
15087a940e0SYann Gautier#ifdef IMAGE_BL2
15187a940e0SYann Gautier	/* ---------------------------------------------
15287a940e0SYann Gautier	 * void plat_report_exception(unsigned int type)
15387a940e0SYann Gautier	 * Function to report an unhandled exception
15487a940e0SYann Gautier	 * with platform-specific means.
15587a940e0SYann Gautier	 * ---------------------------------------------
15687a940e0SYann Gautier	 */
15787a940e0SYann Gautierfunc plat_report_exception
15887a940e0SYann Gautier	mov	x8, x30
15987a940e0SYann Gautier
16087a940e0SYann Gautier	adr	x4, plat_err_str
16187a940e0SYann Gautier	bl	asm_print_str
16287a940e0SYann Gautier
16387a940e0SYann Gautier	adr	x4, esr_el3_str
16487a940e0SYann Gautier	bl	asm_print_str
16587a940e0SYann Gautier
16687a940e0SYann Gautier	mrs	x4, esr_el3
16787a940e0SYann Gautier	bl	asm_print_hex
16887a940e0SYann Gautier
16987a940e0SYann Gautier	adr	x4, elr_el3_str
17087a940e0SYann Gautier	bl	asm_print_str
17187a940e0SYann Gautier
17287a940e0SYann Gautier	mrs	x4, elr_el3
17387a940e0SYann Gautier	bl	asm_print_hex
17487a940e0SYann Gautier
17587a940e0SYann Gautier	adr	x4, far_el3_str
17687a940e0SYann Gautier	bl	asm_print_str
17787a940e0SYann Gautier
17887a940e0SYann Gautier	mrs	x4, far_el3
17987a940e0SYann Gautier	bl	asm_print_hex
18087a940e0SYann Gautier
18187a940e0SYann Gautier	mov	x30, x8
18287a940e0SYann Gautier	ret
18387a940e0SYann Gautierendfunc plat_report_exception
18487a940e0SYann Gautier
18587a940e0SYann Gautier.section .rodata.rev_err_str, "aS"
18687a940e0SYann Gautierplat_err_str:
18787a940e0SYann Gautier	.asciz "\nPlatform exception reporting:"
18887a940e0SYann Gautieresr_el3_str:
18987a940e0SYann Gautier	.asciz "\nESR_EL3: "
19087a940e0SYann Gautierelr_el3_str:
19187a940e0SYann Gautier	.asciz "\nELR_EL3: "
19287a940e0SYann Gautierfar_el3_str:
19387a940e0SYann Gautier	.asciz "\nFAR_EL3: "
19487a940e0SYann Gautier#endif /* IMAGE_BL2 */
195