xref: /rk3399_ARM-atf/plat/st/stm32mp1/stm32mp1_helper.S (revision 278c34df06e6175c2bd7f520241ff62eecaf1f9b)
14353bb20SYann Gautier/*
24353bb20SYann Gautier * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
34353bb20SYann Gautier *
44353bb20SYann Gautier * SPDX-License-Identifier: BSD-3-Clause
54353bb20SYann Gautier */
64353bb20SYann Gautier
74353bb20SYann Gautier#include <arch.h>
84353bb20SYann Gautier#include <asm_macros.S>
94353bb20SYann Gautier#include <bl_common.h>
104353bb20SYann Gautier#include <platform_def.h>
11*278c34dfSYann Gautier#include <stm32_gpio.h>
12*278c34dfSYann Gautier#include <stm32mp1_rcc.h>
13*278c34dfSYann Gautier
14*278c34dfSYann Gautier#define GPIO_BANK_G_ADDRESS	0x50008000
15*278c34dfSYann Gautier#define GPIO_TX_PORT		11
16*278c34dfSYann Gautier#define GPIO_TX_SHIFT		(GPIO_TX_PORT << 1)
17*278c34dfSYann Gautier#define GPIO_TX_ALT_SHIFT	((GPIO_TX_PORT - GPIO_ALT_LOWER_LIMIT) << 2)
18*278c34dfSYann Gautier#define STM32MP1_HSI_CLK	64000000
194353bb20SYann Gautier
204353bb20SYann Gautier	.globl	platform_mem_init
214353bb20SYann Gautier	.globl	plat_report_exception
224353bb20SYann Gautier	.globl	plat_get_my_entrypoint
234353bb20SYann Gautier	.globl	plat_secondary_cold_boot_setup
244353bb20SYann Gautier	.globl	plat_reset_handler
254353bb20SYann Gautier	.globl	plat_is_my_cpu_primary
264353bb20SYann Gautier	.globl	plat_my_core_pos
27*278c34dfSYann Gautier	.globl	plat_crash_console_init
28*278c34dfSYann Gautier	.globl	plat_crash_console_flush
29*278c34dfSYann Gautier	.globl	plat_crash_console_putc
304353bb20SYann Gautier	.globl	plat_panic_handler
314353bb20SYann Gautier
324353bb20SYann Gautierfunc platform_mem_init
334353bb20SYann Gautier	/* Nothing to do, don't need to init SYSRAM */
344353bb20SYann Gautier	bx	lr
354353bb20SYann Gautierendfunc platform_mem_init
364353bb20SYann Gautier
374353bb20SYann Gautierfunc plat_report_exception
384353bb20SYann Gautier	bx	lr
394353bb20SYann Gautierendfunc plat_report_exception
404353bb20SYann Gautier
414353bb20SYann Gautierfunc plat_reset_handler
424353bb20SYann Gautier	bx	lr
434353bb20SYann Gautierendfunc plat_reset_handler
444353bb20SYann Gautier
454353bb20SYann Gautier	/* ------------------------------------------------------------------
464353bb20SYann Gautier	 * unsigned long plat_get_my_entrypoint (void);
474353bb20SYann Gautier	 *
484353bb20SYann Gautier	 * Main job of this routine is to distinguish between a cold and warm
494353bb20SYann Gautier	 * boot.
504353bb20SYann Gautier	 *
514353bb20SYann Gautier	 * Currently supports only cold boot
524353bb20SYann Gautier	 * ------------------------------------------------------------------
534353bb20SYann Gautier	 */
544353bb20SYann Gautierfunc plat_get_my_entrypoint
554353bb20SYann Gautier	mov	r0, #0
564353bb20SYann Gautier	bx	lr
574353bb20SYann Gautierendfunc plat_get_my_entrypoint
584353bb20SYann Gautier
594353bb20SYann Gautier	/* ---------------------------------------------
604353bb20SYann Gautier	 * void plat_secondary_cold_boot_setup (void);
614353bb20SYann Gautier	 *
624353bb20SYann Gautier	 * Cold-booting secondary CPUs is not supported.
634353bb20SYann Gautier	 * ---------------------------------------------
644353bb20SYann Gautier	 */
654353bb20SYann Gautierfunc plat_secondary_cold_boot_setup
664353bb20SYann Gautier	b	.
674353bb20SYann Gautierendfunc plat_secondary_cold_boot_setup
684353bb20SYann Gautier
694353bb20SYann Gautier	/* -----------------------------------------------------
704353bb20SYann Gautier	 * unsigned int plat_is_my_cpu_primary (void);
714353bb20SYann Gautier	 *
724353bb20SYann Gautier	 * Find out whether the current cpu is the primary cpu.
734353bb20SYann Gautier	 * -----------------------------------------------------
744353bb20SYann Gautier	 */
754353bb20SYann Gautierfunc plat_is_my_cpu_primary
764353bb20SYann Gautier	ldcopr	r0, MPIDR
774353bb20SYann Gautier	ldr	r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
784353bb20SYann Gautier	and	r0, r1
794353bb20SYann Gautier	cmp	r0, #STM32MP1_PRIMARY_CPU
804353bb20SYann Gautier	moveq	r0, #1
814353bb20SYann Gautier	movne	r0, #0
824353bb20SYann Gautier	bx	lr
834353bb20SYann Gautierendfunc plat_is_my_cpu_primary
844353bb20SYann Gautier
854353bb20SYann Gautier	/* -------------------------------------------
864353bb20SYann Gautier	 *  int plat_stm32mp1_get_core_pos(int mpidr);
874353bb20SYann Gautier	 *
884353bb20SYann Gautier	 *  Return CorePos = (ClusterId * 4) + CoreId
894353bb20SYann Gautier	 * -------------------------------------------
904353bb20SYann Gautier	 */
914353bb20SYann Gautierfunc plat_stm32mp1_get_core_pos
924353bb20SYann Gautier	and	r1, r0, #MPIDR_CPU_MASK
934353bb20SYann Gautier	and	r0, r0, #MPIDR_CLUSTER_MASK
944353bb20SYann Gautier	add	r0, r1, r0, LSR #6
954353bb20SYann Gautier	bx	lr
964353bb20SYann Gautierendfunc plat_stm32mp1_get_core_pos
974353bb20SYann Gautier
984353bb20SYann Gautier	/* ------------------------------------
994353bb20SYann Gautier	 *  unsigned int plat_my_core_pos(void)
1004353bb20SYann Gautier	 * ------------------------------------
1014353bb20SYann Gautier	 */
1024353bb20SYann Gautierfunc plat_my_core_pos
1034353bb20SYann Gautier	ldcopr	r0, MPIDR
1044353bb20SYann Gautier	b	plat_stm32mp1_get_core_pos
1054353bb20SYann Gautierendfunc plat_my_core_pos
106*278c34dfSYann Gautier
107*278c34dfSYann Gautier	/* ---------------------------------------------
108*278c34dfSYann Gautier	 * int plat_crash_console_init(void)
109*278c34dfSYann Gautier	 *
110*278c34dfSYann Gautier	 * Initialize the crash console without a C Runtime stack.
111*278c34dfSYann Gautier	 * ---------------------------------------------
112*278c34dfSYann Gautier	 */
113*278c34dfSYann Gautierfunc plat_crash_console_init
114*278c34dfSYann Gautier	/* Enable GPIOs for UART4 TX */
115*278c34dfSYann Gautier	ldr	r1, =(RCC_BASE + RCC_MP_AHB4ENSETR)
116*278c34dfSYann Gautier	ldr	r2, [r1]
117*278c34dfSYann Gautier	/* Configure GPIO G11 */
118*278c34dfSYann Gautier	orr	r2, r2, #RCC_MP_AHB4ENSETR_GPIOGEN
119*278c34dfSYann Gautier	str	r2, [r1]
120*278c34dfSYann Gautier	ldr	r1, =GPIO_BANK_G_ADDRESS
121*278c34dfSYann Gautier	/* Set GPIO mode alternate */
122*278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_MODE_OFFSET]
123*278c34dfSYann Gautier	bic	r2, r2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT)
124*278c34dfSYann Gautier	orr	r2, r2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT)
125*278c34dfSYann Gautier	str	r2, [r1, #GPIO_MODE_OFFSET]
126*278c34dfSYann Gautier	/* Set GPIO speed low */
127*278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_SPEED_OFFSET]
128*278c34dfSYann Gautier	bic	r2, r2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT)
129*278c34dfSYann Gautier	str	r2, [r1, #GPIO_SPEED_OFFSET]
130*278c34dfSYann Gautier	/* Set no-pull */
131*278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_PUPD_OFFSET]
132*278c34dfSYann Gautier	bic	r2, r2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT)
133*278c34dfSYann Gautier	str	r2, [r1, #GPIO_PUPD_OFFSET]
134*278c34dfSYann Gautier	/* Set alternate AF6 */
135*278c34dfSYann Gautier	ldr	r2, [r1, #GPIO_AFRH_OFFSET]
136*278c34dfSYann Gautier	bic	r2, r2, #(GPIO_ALTERNATE_MASK << GPIO_TX_ALT_SHIFT)
137*278c34dfSYann Gautier	orr	r2, r2, #(GPIO_ALTERNATE_6 << GPIO_TX_ALT_SHIFT)
138*278c34dfSYann Gautier	str	r2, [r1, #GPIO_AFRH_OFFSET]
139*278c34dfSYann Gautier
140*278c34dfSYann Gautier	/* Enable UART clock, with HSI source */
141*278c34dfSYann Gautier	ldr	r1, =(RCC_BASE + RCC_UART24CKSELR)
142*278c34dfSYann Gautier	mov	r2, #RCC_UART24CKSELR_HSI
143*278c34dfSYann Gautier	str	r2, [r1]
144*278c34dfSYann Gautier	ldr	r1, =(RCC_BASE + RCC_MP_APB1ENSETR)
145*278c34dfSYann Gautier	ldr	r2, [r1]
146*278c34dfSYann Gautier	orr	r2, r2, #RCC_MP_APB1ENSETR_UART4EN
147*278c34dfSYann Gautier	str	r2, [r1]
148*278c34dfSYann Gautier
149*278c34dfSYann Gautier	ldr	r0, =STM32MP1_DEBUG_USART_BASE
150*278c34dfSYann Gautier	ldr	r1, =STM32MP1_HSI_CLK
151*278c34dfSYann Gautier	ldr	r2, =STM32MP1_UART_BAUDRATE
152*278c34dfSYann Gautier	b	console_core_init
153*278c34dfSYann Gautierendfunc plat_crash_console_init
154*278c34dfSYann Gautier
155*278c34dfSYann Gautier	/* ---------------------------------------------
156*278c34dfSYann Gautier	 * int plat_crash_console_flush(void)
157*278c34dfSYann Gautier	 *
158*278c34dfSYann Gautier	 * Flush the crash console without a C Runtime stack.
159*278c34dfSYann Gautier	 * ---------------------------------------------
160*278c34dfSYann Gautier	 */
161*278c34dfSYann Gautierfunc plat_crash_console_flush
162*278c34dfSYann Gautier	ldr	r1, =STM32MP1_DEBUG_USART_BASE
163*278c34dfSYann Gautier	b	console_core_flush
164*278c34dfSYann Gautierendfunc plat_crash_console_flush
165*278c34dfSYann Gautier
166*278c34dfSYann Gautier	/* ---------------------------------------------
167*278c34dfSYann Gautier	 * int plat_crash_console_putc(int c)
168*278c34dfSYann Gautier	 *
169*278c34dfSYann Gautier	 * Print a character on the crash console without a C Runtime stack.
170*278c34dfSYann Gautier	 * Clobber list : r1 - r3
171*278c34dfSYann Gautier	 *
172*278c34dfSYann Gautier	 * In case of bootloading through uart, we keep console crash as this.
173*278c34dfSYann Gautier	 * Characters could be sent to the programmer, but will be ignored.
174*278c34dfSYann Gautier	 * No specific code in that case.
175*278c34dfSYann Gautier	 * ---------------------------------------------
176*278c34dfSYann Gautier	 */
177*278c34dfSYann Gautierfunc plat_crash_console_putc
178*278c34dfSYann Gautier	ldr	r1, =STM32MP1_DEBUG_USART_BASE
179*278c34dfSYann Gautier	b	console_core_putc
180*278c34dfSYann Gautierendfunc plat_crash_console_putc
181