xref: /rk3399_ARM-atf/plat/st/stm32mp2/aarch64/stm32mp2_helper.S (revision 87a940e027dd11d0ec03ec605f205374b18361ba)
135527fb4SYann Gautier/*
235527fb4SYann Gautier * Copyright (c) 2023, STMicroelectronics - All Rights Reserved
335527fb4SYann Gautier *
435527fb4SYann Gautier * SPDX-License-Identifier: BSD-3-Clause
535527fb4SYann Gautier */
635527fb4SYann Gautier
735527fb4SYann Gautier#include <asm_macros.S>
8*87a940e0SYann Gautier#include <drivers/st/stm32_gpio.h>
935527fb4SYann Gautier
1035527fb4SYann Gautier#include <platform_def.h>
1135527fb4SYann Gautier
12*87a940e0SYann Gautier#define GPIO_TX_SHIFT		(DEBUG_UART_TX_GPIO_PORT << 1)
13*87a940e0SYann 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
20*87a940e0SYann 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
60*87a940e0SYann Gautier	/* Reset UART peripheral */
61*87a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_RST_REG)
62*87a940e0SYann Gautier	ldr	x2, =DEBUG_UART_RST_BIT
63*87a940e0SYann Gautier	ldr	x0, [x1]
64*87a940e0SYann Gautier	orr	x0, x0, x2
65*87a940e0SYann Gautier	str	x0, [x1]
66*87a940e0SYann Gautier1:
67*87a940e0SYann Gautier	ldr	x0, [x1]
68*87a940e0SYann Gautier	ands	x2, x0, x2
69*87a940e0SYann Gautier	beq	1b
70*87a940e0SYann Gautier	bic	x2, x2, #DEBUG_UART_RST_BIT
71*87a940e0SYann Gautier	str	x2, [x1]
72*87a940e0SYann Gautier2:
73*87a940e0SYann Gautier	ldr	x0, [x1]
74*87a940e0SYann Gautier	ands	x2, x0, x2
75*87a940e0SYann Gautier	bne	2b
76*87a940e0SYann Gautier	/* Enable GPIOs for UART TX */
77*87a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG)
78*87a940e0SYann Gautier	ldr	w2, [x1]
79*87a940e0SYann Gautier	/* Configure GPIO */
80*87a940e0SYann Gautier	orr	w2, w2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN
81*87a940e0SYann Gautier	str	w2, [x1]
82*87a940e0SYann Gautier	mov_imm	x1, DEBUG_UART_TX_GPIO_BANK_ADDRESS
83*87a940e0SYann Gautier	/* Set GPIO mode alternate */
84*87a940e0SYann Gautier	ldr	w2, [x1, #GPIO_MODE_OFFSET]
85*87a940e0SYann Gautier	bic	w2, w2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT)
86*87a940e0SYann Gautier	orr	w2, w2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT)
87*87a940e0SYann Gautier	str	w2, [x1, #GPIO_MODE_OFFSET]
88*87a940e0SYann Gautier	/* Set GPIO speed low */
89*87a940e0SYann Gautier	ldr	w2, [x1, #GPIO_SPEED_OFFSET]
90*87a940e0SYann Gautier	bic	w2, w2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT)
91*87a940e0SYann Gautier	str	w2, [x1, #GPIO_SPEED_OFFSET]
92*87a940e0SYann Gautier	/* Set no-pull */
93*87a940e0SYann Gautier	ldr	w2, [x1, #GPIO_PUPD_OFFSET]
94*87a940e0SYann Gautier	bic	w2, w2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT)
95*87a940e0SYann Gautier	str	w2, [x1, #GPIO_PUPD_OFFSET]
96*87a940e0SYann Gautier	/* Set alternate */
97*87a940e0SYann Gautier#if DEBUG_UART_TX_GPIO_PORT >= GPIO_ALT_LOWER_LIMIT
98*87a940e0SYann Gautier	ldr	w2, [x1, #GPIO_AFRH_OFFSET]
99*87a940e0SYann Gautier	bic	w2, w2, #(GPIO_ALTERNATE_MASK << \
100*87a940e0SYann Gautier				((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2))
101*87a940e0SYann Gautier	orr	w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << \
102*87a940e0SYann Gautier				((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2))
103*87a940e0SYann Gautier	str	w2, [x1, #GPIO_AFRH_OFFSET]
104*87a940e0SYann Gautier#else
105*87a940e0SYann Gautier	ldr	w2, [x1, #GPIO_AFRL_OFFSET]
106*87a940e0SYann Gautier	bic	w2, w2, #(GPIO_ALTERNATE_MASK << (DEBUG_UART_TX_GPIO_PORT << 2))
107*87a940e0SYann Gautier	orr	w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << (DEBUG_UART_TX_GPIO_PORT << 2))
108*87a940e0SYann Gautier	str	w2, [x1, #GPIO_AFRL_OFFSET]
109*87a940e0SYann Gautier#endif
110*87a940e0SYann Gautier	/* Clear UART clock flexgen divisors, keep enable bit */
111*87a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_PREDIV_CFGR)
112*87a940e0SYann Gautier	mov	x2, #0
113*87a940e0SYann Gautier	str	w2, [x1]
114*87a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_FINDIV_CFGR)
115*87a940e0SYann Gautier	mov	x2, #0x40
116*87a940e0SYann Gautier	str	w2, [x1]
117*87a940e0SYann Gautier	/* Enable UART clock, with its source */
118*87a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_TX_CLKSRC_REG)
119*87a940e0SYann Gautier	mov_imm	w2, (DEBUG_UART_TX_CLKSRC | RCC_XBARxCFGR_XBARxEN)
120*87a940e0SYann Gautier	str	w2, [x1]
121*87a940e0SYann Gautier	mov_imm	x1, (RCC_BASE + DEBUG_UART_TX_EN_REG)
122*87a940e0SYann Gautier	ldr	w2, [x1]
123*87a940e0SYann Gautier	orr	w2, w2, #DEBUG_UART_TX_EN
124*87a940e0SYann Gautier	str	w2, [x1]
125*87a940e0SYann Gautier
126*87a940e0SYann Gautier	mov_imm	x0, STM32MP_DEBUG_USART_BASE
127*87a940e0SYann Gautier	mov_imm	x1, STM32MP_DEBUG_USART_CLK_FRQ
128*87a940e0SYann Gautier	mov_imm	x2, STM32MP_UART_BAUDRATE
129*87a940e0SYann Gautier	b	console_stm32_core_init
13035527fb4SYann Gautierendfunc plat_crash_console_init
13135527fb4SYann Gautier
13235527fb4SYann Gautierfunc plat_crash_console_flush
133*87a940e0SYann Gautier	mov_imm	x0, STM32MP_DEBUG_USART_BASE
134*87a940e0SYann Gautier	b	console_stm32_core_flush
13535527fb4SYann Gautierendfunc plat_crash_console_flush
13635527fb4SYann Gautier
13735527fb4SYann Gautierfunc plat_crash_console_putc
138*87a940e0SYann Gautier	mov_imm	x1, STM32MP_DEBUG_USART_BASE
139*87a940e0SYann Gautier	cmp	x0, #'\n'
140*87a940e0SYann Gautier	b.ne	1f
141*87a940e0SYann Gautier	mov	x15, x30
142*87a940e0SYann Gautier	mov	x0, #'\r'
143*87a940e0SYann Gautier	bl	console_stm32_core_putc
144*87a940e0SYann Gautier	mov	x30, x15
145*87a940e0SYann Gautier	mov	x0, #'\n'
146*87a940e0SYann Gautier1:
147*87a940e0SYann Gautier	b	console_stm32_core_putc
14835527fb4SYann Gautierendfunc plat_crash_console_putc
14935527fb4SYann Gautier
150*87a940e0SYann Gautier#ifdef IMAGE_BL2
151*87a940e0SYann Gautier	/* ---------------------------------------------
152*87a940e0SYann Gautier	 * void plat_report_exception(unsigned int type)
153*87a940e0SYann Gautier	 * Function to report an unhandled exception
154*87a940e0SYann Gautier	 * with platform-specific means.
155*87a940e0SYann Gautier	 * ---------------------------------------------
156*87a940e0SYann Gautier	 */
157*87a940e0SYann Gautierfunc plat_report_exception
158*87a940e0SYann Gautier	mov	x8, x30
159*87a940e0SYann Gautier
160*87a940e0SYann Gautier	adr	x4, plat_err_str
161*87a940e0SYann Gautier	bl	asm_print_str
162*87a940e0SYann Gautier
163*87a940e0SYann Gautier	adr	x4, esr_el3_str
164*87a940e0SYann Gautier	bl	asm_print_str
165*87a940e0SYann Gautier
166*87a940e0SYann Gautier	mrs	x4, esr_el3
167*87a940e0SYann Gautier	bl	asm_print_hex
168*87a940e0SYann Gautier
169*87a940e0SYann Gautier	adr	x4, elr_el3_str
170*87a940e0SYann Gautier	bl	asm_print_str
171*87a940e0SYann Gautier
172*87a940e0SYann Gautier	mrs	x4, elr_el3
173*87a940e0SYann Gautier	bl	asm_print_hex
174*87a940e0SYann Gautier
175*87a940e0SYann Gautier	adr	x4, far_el3_str
176*87a940e0SYann Gautier	bl	asm_print_str
177*87a940e0SYann Gautier
178*87a940e0SYann Gautier	mrs	x4, far_el3
179*87a940e0SYann Gautier	bl	asm_print_hex
180*87a940e0SYann Gautier
181*87a940e0SYann Gautier	mov	x30, x8
182*87a940e0SYann Gautier	ret
183*87a940e0SYann Gautierendfunc plat_report_exception
184*87a940e0SYann Gautier
185*87a940e0SYann Gautier.section .rodata.rev_err_str, "aS"
186*87a940e0SYann Gautierplat_err_str:
187*87a940e0SYann Gautier	.asciz "\nPlatform exception reporting:"
188*87a940e0SYann Gautieresr_el3_str:
189*87a940e0SYann Gautier	.asciz "\nESR_EL3: "
190*87a940e0SYann Gautierelr_el3_str:
191*87a940e0SYann Gautier	.asciz "\nELR_EL3: "
192*87a940e0SYann Gautierfar_el3_str:
193*87a940e0SYann Gautier	.asciz "\nFAR_EL3: "
194*87a940e0SYann Gautier#endif /* IMAGE_BL2 */
195