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