14353bb20SYann Gautier/* 2*b38e2ed2SYann Gautier * Copyright (c) 2015-2021, 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> 13278c34dfSYann Gautier 141fc2130cSYann Gautier#define GPIO_TX_SHIFT (DEBUG_UART_TX_GPIO_PORT << 1) 154353bb20SYann Gautier 164353bb20SYann Gautier .globl platform_mem_init 174353bb20SYann Gautier .globl plat_report_exception 184353bb20SYann Gautier .globl plat_get_my_entrypoint 194353bb20SYann Gautier .globl plat_secondary_cold_boot_setup 204353bb20SYann Gautier .globl plat_reset_handler 214353bb20SYann Gautier .globl plat_is_my_cpu_primary 224353bb20SYann Gautier .globl plat_my_core_pos 23278c34dfSYann Gautier .globl plat_crash_console_init 24278c34dfSYann Gautier .globl plat_crash_console_flush 25278c34dfSYann Gautier .globl plat_crash_console_putc 264353bb20SYann Gautier .globl plat_panic_handler 274353bb20SYann Gautier 284353bb20SYann Gautierfunc platform_mem_init 294353bb20SYann Gautier /* Nothing to do, don't need to init SYSRAM */ 304353bb20SYann Gautier bx lr 314353bb20SYann Gautierendfunc platform_mem_init 324353bb20SYann Gautier 334353bb20SYann Gautierfunc plat_report_exception 34a9eda77cSYann Gautier#if DEBUG 35a9eda77cSYann Gautier mov r8, lr 36a9eda77cSYann Gautier 37a9eda77cSYann Gautier /* Test if an abort occurred */ 38a9eda77cSYann Gautier cmp r0, #MODE32_abt 39a9eda77cSYann Gautier bne undef_inst_lbl 40a9eda77cSYann Gautier ldr r4, =abort_str 41a9eda77cSYann Gautier bl asm_print_str 42a9eda77cSYann Gautier mrs r4, lr_abt 43a9eda77cSYann Gautier sub r4, r4, #4 44a9eda77cSYann Gautier b print_exception_info 45a9eda77cSYann Gautier 46a9eda77cSYann Gautierundef_inst_lbl: 47a9eda77cSYann Gautier /* Test for an undefined instruction */ 48a9eda77cSYann Gautier cmp r0, #MODE32_und 49a9eda77cSYann Gautier bne other_exception_lbl 50a9eda77cSYann Gautier ldr r4, =undefined_str 51a9eda77cSYann Gautier bl asm_print_str 52a9eda77cSYann Gautier mrs r4, lr_und 53a9eda77cSYann Gautier b print_exception_info 54a9eda77cSYann Gautier 55a9eda77cSYann Gautierother_exception_lbl: 56a9eda77cSYann Gautier /* Other exceptions */ 57a9eda77cSYann Gautier mov r9, r0 58a9eda77cSYann Gautier ldr r4, =exception_start_str 59a9eda77cSYann Gautier bl asm_print_str 60a9eda77cSYann Gautier mov r4, r9 61a9eda77cSYann Gautier bl asm_print_hex 62a9eda77cSYann Gautier ldr r4, =exception_end_str 63a9eda77cSYann Gautier bl asm_print_str 64a9eda77cSYann Gautier mov r4, r6 65a9eda77cSYann Gautier 66a9eda77cSYann Gautierprint_exception_info: 67a9eda77cSYann Gautier bl asm_print_hex 68a9eda77cSYann Gautier 69a9eda77cSYann Gautier ldr r4, =end_error_str 70a9eda77cSYann Gautier bl asm_print_str 71a9eda77cSYann Gautier 72a9eda77cSYann Gautier bx r8 73a9eda77cSYann Gautier#else 744353bb20SYann Gautier bx lr 75a9eda77cSYann Gautier#endif 764353bb20SYann Gautierendfunc plat_report_exception 774353bb20SYann Gautier 784353bb20SYann Gautierfunc plat_reset_handler 794353bb20SYann Gautier bx lr 804353bb20SYann Gautierendfunc plat_reset_handler 814353bb20SYann Gautier 824353bb20SYann Gautier /* ------------------------------------------------------------------ 834353bb20SYann Gautier * unsigned long plat_get_my_entrypoint (void); 844353bb20SYann Gautier * 854353bb20SYann Gautier * Main job of this routine is to distinguish between a cold and warm 864353bb20SYann Gautier * boot. 874353bb20SYann Gautier * 884353bb20SYann Gautier * Currently supports only cold boot 894353bb20SYann Gautier * ------------------------------------------------------------------ 904353bb20SYann Gautier */ 914353bb20SYann Gautierfunc plat_get_my_entrypoint 924353bb20SYann Gautier mov r0, #0 934353bb20SYann Gautier bx lr 944353bb20SYann Gautierendfunc plat_get_my_entrypoint 954353bb20SYann Gautier 964353bb20SYann Gautier /* --------------------------------------------- 974353bb20SYann Gautier * void plat_secondary_cold_boot_setup (void); 984353bb20SYann Gautier * 994353bb20SYann Gautier * Cold-booting secondary CPUs is not supported. 1004353bb20SYann Gautier * --------------------------------------------- 1014353bb20SYann Gautier */ 1024353bb20SYann Gautierfunc plat_secondary_cold_boot_setup 1034353bb20SYann Gautier b . 1044353bb20SYann Gautierendfunc plat_secondary_cold_boot_setup 1054353bb20SYann Gautier 1064353bb20SYann Gautier /* ----------------------------------------------------- 1074353bb20SYann Gautier * unsigned int plat_is_my_cpu_primary (void); 1084353bb20SYann Gautier * 1094353bb20SYann Gautier * Find out whether the current cpu is the primary cpu. 1104353bb20SYann Gautier * ----------------------------------------------------- 1114353bb20SYann Gautier */ 1124353bb20SYann Gautierfunc plat_is_my_cpu_primary 1134353bb20SYann Gautier ldcopr r0, MPIDR 1144353bb20SYann Gautier ldr r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 1154353bb20SYann Gautier and r0, r1 1163f9c9784SYann Gautier cmp r0, #STM32MP_PRIMARY_CPU 1174353bb20SYann Gautier moveq r0, #1 1184353bb20SYann Gautier movne r0, #0 1194353bb20SYann Gautier bx lr 1204353bb20SYann Gautierendfunc plat_is_my_cpu_primary 1214353bb20SYann Gautier 1224353bb20SYann Gautier /* ------------------------------------------- 1234353bb20SYann Gautier * int plat_stm32mp1_get_core_pos(int mpidr); 1244353bb20SYann Gautier * 1254353bb20SYann Gautier * Return CorePos = (ClusterId * 4) + CoreId 1264353bb20SYann Gautier * ------------------------------------------- 1274353bb20SYann Gautier */ 1284353bb20SYann Gautierfunc plat_stm32mp1_get_core_pos 1294353bb20SYann Gautier and r1, r0, #MPIDR_CPU_MASK 1304353bb20SYann Gautier and r0, r0, #MPIDR_CLUSTER_MASK 1314353bb20SYann Gautier add r0, r1, r0, LSR #6 1324353bb20SYann Gautier bx lr 1334353bb20SYann Gautierendfunc plat_stm32mp1_get_core_pos 1344353bb20SYann Gautier 1354353bb20SYann Gautier /* ------------------------------------ 1364353bb20SYann Gautier * unsigned int plat_my_core_pos(void) 1374353bb20SYann Gautier * ------------------------------------ 1384353bb20SYann Gautier */ 1394353bb20SYann Gautierfunc plat_my_core_pos 1404353bb20SYann Gautier ldcopr r0, MPIDR 1414353bb20SYann Gautier b plat_stm32mp1_get_core_pos 1424353bb20SYann Gautierendfunc plat_my_core_pos 143278c34dfSYann Gautier 144278c34dfSYann Gautier /* --------------------------------------------- 145278c34dfSYann Gautier * int plat_crash_console_init(void) 146278c34dfSYann Gautier * 147278c34dfSYann Gautier * Initialize the crash console without a C Runtime stack. 148278c34dfSYann Gautier * --------------------------------------------- 149278c34dfSYann Gautier */ 150278c34dfSYann Gautierfunc plat_crash_console_init 151*b38e2ed2SYann Gautier /* Reset UART peripheral */ 152*b38e2ed2SYann Gautier ldr r1, =(RCC_BASE + DEBUG_UART_RST_REG) 153*b38e2ed2SYann Gautier ldr r2, =DEBUG_UART_RST_BIT 154*b38e2ed2SYann Gautier str r2, [r1] 155*b38e2ed2SYann Gautier1: 156*b38e2ed2SYann Gautier ldr r0, [r1] 157*b38e2ed2SYann Gautier ands r2, r0, r2 158*b38e2ed2SYann Gautier beq 1b 159*b38e2ed2SYann Gautier str r2, [r1, #4] /* RSTCLR register */ 160*b38e2ed2SYann Gautier2: 161*b38e2ed2SYann Gautier ldr r0, [r1] 162*b38e2ed2SYann Gautier ands r2, r0, r2 163*b38e2ed2SYann Gautier bne 2b 1641fc2130cSYann Gautier /* Enable GPIOs for UART TX */ 1651fc2130cSYann Gautier ldr r1, =(RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG) 166278c34dfSYann Gautier ldr r2, [r1] 1671fc2130cSYann Gautier /* Configure GPIO */ 1681fc2130cSYann Gautier orr r2, r2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN 169278c34dfSYann Gautier str r2, [r1] 1701fc2130cSYann Gautier ldr r1, =DEBUG_UART_TX_GPIO_BANK_ADDRESS 171278c34dfSYann Gautier /* Set GPIO mode alternate */ 172278c34dfSYann Gautier ldr r2, [r1, #GPIO_MODE_OFFSET] 173278c34dfSYann Gautier bic r2, r2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT) 174278c34dfSYann Gautier orr r2, r2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT) 175278c34dfSYann Gautier str r2, [r1, #GPIO_MODE_OFFSET] 176278c34dfSYann Gautier /* Set GPIO speed low */ 177278c34dfSYann Gautier ldr r2, [r1, #GPIO_SPEED_OFFSET] 178278c34dfSYann Gautier bic r2, r2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT) 179278c34dfSYann Gautier str r2, [r1, #GPIO_SPEED_OFFSET] 180278c34dfSYann Gautier /* Set no-pull */ 181278c34dfSYann Gautier ldr r2, [r1, #GPIO_PUPD_OFFSET] 182278c34dfSYann Gautier bic r2, r2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT) 183278c34dfSYann Gautier str r2, [r1, #GPIO_PUPD_OFFSET] 1841fc2130cSYann Gautier /* Set alternate */ 1854170079aSYann Gautier#if DEBUG_UART_TX_GPIO_PORT >= GPIO_ALT_LOWER_LIMIT 186278c34dfSYann Gautier ldr r2, [r1, #GPIO_AFRH_OFFSET] 1874170079aSYann Gautier bic r2, r2, #(GPIO_ALTERNATE_MASK << \ 1884170079aSYann Gautier ((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2)) 1894170079aSYann Gautier orr r2, r2, #(DEBUG_UART_TX_GPIO_ALTERNATE << \ 1904170079aSYann Gautier ((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2)) 191278c34dfSYann Gautier str r2, [r1, #GPIO_AFRH_OFFSET] 1924170079aSYann Gautier#else 1934170079aSYann Gautier ldr r2, [r1, #GPIO_AFRL_OFFSET] 1944170079aSYann Gautier bic r2, r2, #(GPIO_ALTERNATE_MASK << (DEBUG_UART_TX_GPIO_PORT << 2)) 1954170079aSYann Gautier orr r2, r2, #(DEBUG_UART_TX_GPIO_ALTERNATE << (DEBUG_UART_TX_GPIO_PORT << 2)) 1964170079aSYann Gautier str r2, [r1, #GPIO_AFRL_OFFSET] 1974170079aSYann Gautier#endif 1981fc2130cSYann Gautier /* Enable UART clock, with its source */ 1991fc2130cSYann Gautier ldr r1, =(RCC_BASE + DEBUG_UART_TX_CLKSRC_REG) 2001fc2130cSYann Gautier mov r2, #DEBUG_UART_TX_CLKSRC 201278c34dfSYann Gautier str r2, [r1] 2021fc2130cSYann Gautier ldr r1, =(RCC_BASE + DEBUG_UART_TX_EN_REG) 203278c34dfSYann Gautier ldr r2, [r1] 2041fc2130cSYann Gautier orr r2, r2, #DEBUG_UART_TX_EN 205278c34dfSYann Gautier str r2, [r1] 206278c34dfSYann Gautier 2073f9c9784SYann Gautier ldr r0, =STM32MP_DEBUG_USART_BASE 2083f9c9784SYann Gautier ldr r1, =STM32MP_DEBUG_USART_CLK_FRQ 2093f9c9784SYann Gautier ldr r2, =STM32MP_UART_BAUDRATE 210cce37d44SYann Gautier b console_stm32_core_init 211278c34dfSYann Gautierendfunc plat_crash_console_init 212278c34dfSYann Gautier 213278c34dfSYann Gautier /* --------------------------------------------- 214831b0e98SJimmy Brisson * void plat_crash_console_flush(void) 215278c34dfSYann Gautier * 216278c34dfSYann Gautier * Flush the crash console without a C Runtime stack. 217278c34dfSYann Gautier * --------------------------------------------- 218278c34dfSYann Gautier */ 219278c34dfSYann Gautierfunc plat_crash_console_flush 220aeb727f3SYann Gautier ldr r0, =STM32MP_DEBUG_USART_BASE 221cce37d44SYann Gautier b console_stm32_core_flush 222278c34dfSYann Gautierendfunc plat_crash_console_flush 223278c34dfSYann Gautier 224278c34dfSYann Gautier /* --------------------------------------------- 225278c34dfSYann Gautier * int plat_crash_console_putc(int c) 226278c34dfSYann Gautier * 227278c34dfSYann Gautier * Print a character on the crash console without a C Runtime stack. 228278c34dfSYann Gautier * Clobber list : r1 - r3 229278c34dfSYann Gautier * 230278c34dfSYann Gautier * In case of bootloading through uart, we keep console crash as this. 231278c34dfSYann Gautier * Characters could be sent to the programmer, but will be ignored. 232278c34dfSYann Gautier * No specific code in that case. 233278c34dfSYann Gautier * --------------------------------------------- 234278c34dfSYann Gautier */ 235278c34dfSYann Gautierfunc plat_crash_console_putc 2363f9c9784SYann Gautier ldr r1, =STM32MP_DEBUG_USART_BASE 237cce37d44SYann Gautier b console_stm32_core_putc 238278c34dfSYann Gautierendfunc plat_crash_console_putc 239a9eda77cSYann Gautier 2406397423eSYann Gautier /* ---------------------------------------------------------- 2416397423eSYann Gautier * void plat_panic_handler(void) __dead2; 2426397423eSYann Gautier * Report exception + endless loop. 2436397423eSYann Gautier * 2446397423eSYann Gautier * r6 holds the address where the fault occurred. 2456397423eSYann Gautier * Filling lr with this value allows debuggers to reconstruct 2466397423eSYann Gautier * the backtrace. 2476397423eSYann Gautier * ---------------------------------------------------------- 2486397423eSYann Gautier */ 2496397423eSYann Gautierfunc plat_panic_handler 2506397423eSYann Gautier mrs r0, cpsr 2516397423eSYann Gautier and r0, #MODE32_MASK 2526397423eSYann Gautier bl plat_report_exception 2536397423eSYann Gautier mov lr, r6 2546397423eSYann Gautier b . 2556397423eSYann Gautierendfunc plat_panic_handler 2566397423eSYann Gautier 257a9eda77cSYann Gautier#if DEBUG 258a9eda77cSYann Gautier.section .rodata.rev_err_str, "aS" 259a9eda77cSYann Gautierabort_str: 260a9eda77cSYann Gautier .asciz "\nAbort at: 0x" 261a9eda77cSYann Gautierundefined_str: 262a9eda77cSYann Gautier .asciz "\nUndefined instruction at: 0x" 263a9eda77cSYann Gautierexception_start_str: 264a9eda77cSYann Gautier .asciz "\nException mode=0x" 265a9eda77cSYann Gautierexception_end_str: 266a9eda77cSYann Gautier .asciz " at: 0x" 267a9eda77cSYann Gautierend_error_str: 268a9eda77cSYann Gautier .asciz "\n\r" 269a9eda77cSYann Gautier#endif 270