xref: /rk3399_ARM-atf/plat/st/stm32mp1/stm32mp1_helper.S (revision 1fc2130c5b8aad9abf54d71ce0124b19f44c69ce)
14353bb20SYann Gautier/*
2*1fc2130cSYann Gautier * Copyright (c) 2015-2019, 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>
1309d40e0eSAntonio Nino Diaz#include <drivers/st/stm32mp1_rcc.h>
14278c34dfSYann Gautier
15*1fc2130cSYann Gautier#define GPIO_TX_SHIFT		(DEBUG_UART_TX_GPIO_PORT << 1)
16*1fc2130cSYann Gautier#define GPIO_TX_ALT_SHIFT	((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2)
174353bb20SYann Gautier
184353bb20SYann Gautier	.globl	platform_mem_init
194353bb20SYann Gautier	.globl	plat_report_exception
204353bb20SYann Gautier	.globl	plat_get_my_entrypoint
214353bb20SYann Gautier	.globl	plat_secondary_cold_boot_setup
224353bb20SYann Gautier	.globl	plat_reset_handler
234353bb20SYann Gautier	.globl	plat_is_my_cpu_primary
244353bb20SYann Gautier	.globl	plat_my_core_pos
25278c34dfSYann Gautier	.globl	plat_crash_console_init
26278c34dfSYann Gautier	.globl	plat_crash_console_flush
27278c34dfSYann Gautier	.globl	plat_crash_console_putc
284353bb20SYann Gautier	.globl	plat_panic_handler
294353bb20SYann Gautier
304353bb20SYann Gautierfunc platform_mem_init
314353bb20SYann Gautier	/* Nothing to do, don't need to init SYSRAM */
324353bb20SYann Gautier	bx	lr
334353bb20SYann Gautierendfunc platform_mem_init
344353bb20SYann Gautier
354353bb20SYann Gautierfunc plat_report_exception
364353bb20SYann Gautier	bx	lr
374353bb20SYann Gautierendfunc plat_report_exception
384353bb20SYann Gautier
394353bb20SYann Gautierfunc plat_reset_handler
404353bb20SYann Gautier	bx	lr
414353bb20SYann Gautierendfunc plat_reset_handler
424353bb20SYann Gautier
434353bb20SYann Gautier	/* ------------------------------------------------------------------
444353bb20SYann Gautier	 * unsigned long plat_get_my_entrypoint (void);
454353bb20SYann Gautier	 *
464353bb20SYann Gautier	 * Main job of this routine is to distinguish between a cold and warm
474353bb20SYann Gautier	 * boot.
484353bb20SYann Gautier	 *
494353bb20SYann Gautier	 * Currently supports only cold boot
504353bb20SYann Gautier	 * ------------------------------------------------------------------
514353bb20SYann Gautier	 */
524353bb20SYann Gautierfunc plat_get_my_entrypoint
534353bb20SYann Gautier	mov	r0, #0
544353bb20SYann Gautier	bx	lr
554353bb20SYann Gautierendfunc plat_get_my_entrypoint
564353bb20SYann Gautier
574353bb20SYann Gautier	/* ---------------------------------------------
584353bb20SYann Gautier	 * void plat_secondary_cold_boot_setup (void);
594353bb20SYann Gautier	 *
604353bb20SYann Gautier	 * Cold-booting secondary CPUs is not supported.
614353bb20SYann Gautier	 * ---------------------------------------------
624353bb20SYann Gautier	 */
634353bb20SYann Gautierfunc plat_secondary_cold_boot_setup
644353bb20SYann Gautier	b	.
654353bb20SYann Gautierendfunc plat_secondary_cold_boot_setup
664353bb20SYann Gautier
674353bb20SYann Gautier	/* -----------------------------------------------------
684353bb20SYann Gautier	 * unsigned int plat_is_my_cpu_primary (void);
694353bb20SYann Gautier	 *
704353bb20SYann Gautier	 * Find out whether the current cpu is the primary cpu.
714353bb20SYann Gautier	 * -----------------------------------------------------
724353bb20SYann Gautier	 */
734353bb20SYann Gautierfunc plat_is_my_cpu_primary
744353bb20SYann Gautier	ldcopr	r0, MPIDR
754353bb20SYann Gautier	ldr	r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
764353bb20SYann Gautier	and	r0, r1
774353bb20SYann Gautier	cmp	r0, #STM32MP1_PRIMARY_CPU
784353bb20SYann Gautier	moveq	r0, #1
794353bb20SYann Gautier	movne	r0, #0
804353bb20SYann Gautier	bx	lr
814353bb20SYann Gautierendfunc plat_is_my_cpu_primary
824353bb20SYann Gautier
834353bb20SYann Gautier	/* -------------------------------------------
844353bb20SYann Gautier	 *  int plat_stm32mp1_get_core_pos(int mpidr);
854353bb20SYann Gautier	 *
864353bb20SYann Gautier	 *  Return CorePos = (ClusterId * 4) + CoreId
874353bb20SYann Gautier	 * -------------------------------------------
884353bb20SYann Gautier	 */
894353bb20SYann Gautierfunc plat_stm32mp1_get_core_pos
904353bb20SYann Gautier	and	r1, r0, #MPIDR_CPU_MASK
914353bb20SYann Gautier	and	r0, r0, #MPIDR_CLUSTER_MASK
924353bb20SYann Gautier	add	r0, r1, r0, LSR #6
934353bb20SYann Gautier	bx	lr
944353bb20SYann Gautierendfunc plat_stm32mp1_get_core_pos
954353bb20SYann Gautier
964353bb20SYann Gautier	/* ------------------------------------
974353bb20SYann Gautier	 *  unsigned int plat_my_core_pos(void)
984353bb20SYann Gautier	 * ------------------------------------
994353bb20SYann Gautier	 */
1004353bb20SYann Gautierfunc plat_my_core_pos
1014353bb20SYann Gautier	ldcopr	r0, MPIDR
1024353bb20SYann Gautier	b	plat_stm32mp1_get_core_pos
1034353bb20SYann Gautierendfunc plat_my_core_pos
104278c34dfSYann Gautier
105278c34dfSYann Gautier	/* ---------------------------------------------
106278c34dfSYann Gautier	 * int plat_crash_console_init(void)
107278c34dfSYann Gautier	 *
108278c34dfSYann Gautier	 * Initialize the crash console without a C Runtime stack.
109278c34dfSYann Gautier	 * ---------------------------------------------
110278c34dfSYann Gautier	 */
111278c34dfSYann Gautierfunc plat_crash_console_init
112*1fc2130cSYann Gautier	/* Enable GPIOs for UART TX */
113*1fc2130cSYann Gautier	ldr	r1, =(RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG)
114278c34dfSYann Gautier	ldr	r2, [r1]
115*1fc2130cSYann Gautier	/* Configure GPIO */
116*1fc2130cSYann Gautier	orr	r2, r2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN
117278c34dfSYann Gautier	str	r2, [r1]
118*1fc2130cSYann Gautier	ldr	r1, =DEBUG_UART_TX_GPIO_BANK_ADDRESS
119278c34dfSYann Gautier	/* Set GPIO mode alternate */
120278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_MODE_OFFSET]
121278c34dfSYann Gautier	bic	r2, r2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT)
122278c34dfSYann Gautier	orr	r2, r2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT)
123278c34dfSYann Gautier	str	r2, [r1, #GPIO_MODE_OFFSET]
124278c34dfSYann Gautier	/* Set GPIO speed low */
125278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_SPEED_OFFSET]
126278c34dfSYann Gautier	bic	r2, r2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT)
127278c34dfSYann Gautier	str	r2, [r1, #GPIO_SPEED_OFFSET]
128278c34dfSYann Gautier	/* Set no-pull */
129278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_PUPD_OFFSET]
130278c34dfSYann Gautier	bic	r2, r2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT)
131278c34dfSYann Gautier	str	r2, [r1, #GPIO_PUPD_OFFSET]
132*1fc2130cSYann Gautier	/* Set alternate */
133278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_AFRH_OFFSET]
134278c34dfSYann Gautier	bic	r2, r2, #(GPIO_ALTERNATE_MASK << GPIO_TX_ALT_SHIFT)
135*1fc2130cSYann Gautier	orr	r2, r2, #(DEBUG_UART_TX_GPIO_ALTERNATE << GPIO_TX_ALT_SHIFT)
136278c34dfSYann Gautier	str	r2, [r1, #GPIO_AFRH_OFFSET]
137*1fc2130cSYann Gautier	/* Enable UART clock, with its source */
138*1fc2130cSYann Gautier	ldr	r1, =(RCC_BASE + DEBUG_UART_TX_CLKSRC_REG)
139*1fc2130cSYann Gautier	mov	r2, #DEBUG_UART_TX_CLKSRC
140278c34dfSYann Gautier	str	r2, [r1]
141*1fc2130cSYann Gautier	ldr	r1, =(RCC_BASE + DEBUG_UART_TX_EN_REG)
142278c34dfSYann Gautier	ldr	r2, [r1]
143*1fc2130cSYann Gautier	orr	r2, r2, #DEBUG_UART_TX_EN
144278c34dfSYann Gautier	str	r2, [r1]
145278c34dfSYann Gautier
146278c34dfSYann Gautier	ldr	r0, =STM32MP1_DEBUG_USART_BASE
147*1fc2130cSYann Gautier	ldr	r1, =STM32MP1_DEBUG_USART_CLK_FRQ
148278c34dfSYann Gautier	ldr	r2, =STM32MP1_UART_BAUDRATE
149cce37d44SYann Gautier	b	console_stm32_core_init
150278c34dfSYann Gautierendfunc plat_crash_console_init
151278c34dfSYann Gautier
152278c34dfSYann Gautier	/* ---------------------------------------------
153278c34dfSYann Gautier	 * int plat_crash_console_flush(void)
154278c34dfSYann Gautier	 *
155278c34dfSYann Gautier	 * Flush the crash console without a C Runtime stack.
156278c34dfSYann Gautier	 * ---------------------------------------------
157278c34dfSYann Gautier	 */
158278c34dfSYann Gautierfunc plat_crash_console_flush
159278c34dfSYann Gautier	ldr	r1, =STM32MP1_DEBUG_USART_BASE
160cce37d44SYann Gautier	b	console_stm32_core_flush
161278c34dfSYann Gautierendfunc plat_crash_console_flush
162278c34dfSYann Gautier
163278c34dfSYann Gautier	/* ---------------------------------------------
164278c34dfSYann Gautier	 * int plat_crash_console_putc(int c)
165278c34dfSYann Gautier	 *
166278c34dfSYann Gautier	 * Print a character on the crash console without a C Runtime stack.
167278c34dfSYann Gautier	 * Clobber list : r1 - r3
168278c34dfSYann Gautier	 *
169278c34dfSYann Gautier	 * In case of bootloading through uart, we keep console crash as this.
170278c34dfSYann Gautier	 * Characters could be sent to the programmer, but will be ignored.
171278c34dfSYann Gautier	 * No specific code in that case.
172278c34dfSYann Gautier	 * ---------------------------------------------
173278c34dfSYann Gautier	 */
174278c34dfSYann Gautierfunc plat_crash_console_putc
175278c34dfSYann Gautier	ldr	r1, =STM32MP1_DEBUG_USART_BASE
176cce37d44SYann Gautier	b	console_stm32_core_putc
177278c34dfSYann Gautierendfunc plat_crash_console_putc
178