135527fb4SYann Gautier/* 24da462dcSYann Gautier * Copyright (c) 2023-2024, STMicroelectronics - All Rights Reserved 335527fb4SYann Gautier * 435527fb4SYann Gautier * SPDX-License-Identifier: BSD-3-Clause 535527fb4SYann Gautier */ 635527fb4SYann Gautier 735527fb4SYann Gautier#include <asm_macros.S> 887a940e0SYann Gautier#include <drivers/st/stm32_gpio.h> 935527fb4SYann Gautier 1035527fb4SYann Gautier#include <platform_def.h> 1135527fb4SYann Gautier 1287a940e0SYann Gautier#define GPIO_TX_SHIFT (DEBUG_UART_TX_GPIO_PORT << 1) 1387a940e0SYann Gautier 1435527fb4SYann Gautier .globl platform_mem_init 1535527fb4SYann Gautier .globl plat_secondary_cold_boot_setup 1635527fb4SYann Gautier .globl plat_is_my_cpu_primary 17d1c85da8SYann Gautier .globl plat_my_core_pos 1835527fb4SYann Gautier .globl plat_crash_console_init 1935527fb4SYann Gautier .globl plat_crash_console_flush 2035527fb4SYann Gautier .globl plat_crash_console_putc 2187a940e0SYann Gautier .globl plat_report_exception 2235527fb4SYann Gautier 2335527fb4SYann Gautierfunc platform_mem_init 2435527fb4SYann Gautier /* Nothing to do, don't need to init SYSRAM */ 2535527fb4SYann Gautier ret 2635527fb4SYann Gautierendfunc platform_mem_init 2735527fb4SYann Gautier 2835527fb4SYann Gautier /* --------------------------------------------- 2935527fb4SYann Gautier * void plat_secondary_cold_boot_setup (void); 3035527fb4SYann Gautier * 3135527fb4SYann Gautier * Set secondary core in WFI waiting for core reset. 3235527fb4SYann Gautier * --------------------------------------------- 3335527fb4SYann Gautier */ 3435527fb4SYann Gautierfunc plat_secondary_cold_boot_setup 3535527fb4SYann Gautier dsb sy 362331a34fSAntonio Borneo1: 3735527fb4SYann Gautier wfi 382331a34fSAntonio Borneo /* 392331a34fSAntonio Borneo * This shouldn't be reached, but when a debugger halts the 402331a34fSAntonio Borneo * secondary core it causes exit from wfi. 412331a34fSAntonio Borneo * Put back the core in wfi. 422331a34fSAntonio Borneo */ 432331a34fSAntonio Borneo b 1b 4435527fb4SYann Gautierendfunc plat_secondary_cold_boot_setup 4535527fb4SYann Gautier 4635527fb4SYann Gautier /* ---------------------------------------------- 4735527fb4SYann Gautier * unsigned int plat_is_my_cpu_primary(void); 4835527fb4SYann Gautier * This function checks if this is the primary CPU 4935527fb4SYann Gautier * ---------------------------------------------- 5035527fb4SYann Gautier */ 5135527fb4SYann Gautierfunc plat_is_my_cpu_primary 5235527fb4SYann Gautier mrs x0, mpidr_el1 5335527fb4SYann Gautier and x0, x0, #(MPIDR_CPU_MASK) 5435527fb4SYann Gautier cmp x0, #STM32MP_PRIMARY_CPU 5535527fb4SYann Gautier cset x0, eq 5635527fb4SYann Gautier ret 5735527fb4SYann Gautierendfunc plat_is_my_cpu_primary 5835527fb4SYann Gautier 59d1c85da8SYann Gautier /* ----------------------------------------------------------- 60d1c85da8SYann Gautier * unsigned int plat_stm32mp_get_core_pos(u_register_t mpidr) 61d1c85da8SYann Gautier * Helper function to calculate the core position. 62d1c85da8SYann Gautier * With this function: CorePos = (ClusterId * 4) + 63d1c85da8SYann Gautier * CoreId 64d1c85da8SYann Gautier * ----------------------------------------------------------- 65d1c85da8SYann Gautier */ 66d1c85da8SYann Gautierfunc plat_stm32mp_get_core_pos 67d1c85da8SYann Gautier and x1, x0, #MPIDR_CPU_MASK 68d1c85da8SYann Gautier and x0, x0, #MPIDR_CLUSTER_MASK 69d1c85da8SYann Gautier add x0, x1, x0, LSR #6 70d1c85da8SYann Gautier ret 71d1c85da8SYann Gautierendfunc plat_stm32mp_get_core_pos 72d1c85da8SYann Gautier 73d1c85da8SYann Gautier /* ----------------------------------------------------- 74d1c85da8SYann Gautier * unsigned int plat_my_core_pos(void) 75d1c85da8SYann Gautier * This function uses the plat_stm32mp_get_core_pos() 76d1c85da8SYann Gautier * definition to get the index of the calling CPU. 77d1c85da8SYann Gautier * ----------------------------------------------------- 78d1c85da8SYann Gautier */ 79d1c85da8SYann Gautierfunc plat_my_core_pos 80d1c85da8SYann Gautier mrs x0, mpidr_el1 81d1c85da8SYann Gautier b plat_stm32mp_get_core_pos 82d1c85da8SYann Gautierendfunc plat_my_core_pos 83d1c85da8SYann Gautier 8435527fb4SYann Gautier /* --------------------------------------------- 8535527fb4SYann Gautier * int plat_crash_console_init(void) 8635527fb4SYann Gautier * 8735527fb4SYann Gautier * Initialize the crash console without a C Runtime stack. 8835527fb4SYann Gautier * --------------------------------------------- 8935527fb4SYann Gautier */ 9035527fb4SYann Gautierfunc plat_crash_console_init 9187a940e0SYann Gautier /* Reset UART peripheral */ 9287a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_RST_REG) 93*23647bd5SBoerge Struempfel ldr w2, =DEBUG_UART_RST_BIT 94*23647bd5SBoerge Struempfel ldr w0, [x1] 95*23647bd5SBoerge Struempfel orr w0, w0, w2 96*23647bd5SBoerge Struempfel str w0, [x1] 9787a940e0SYann Gautier1: 98*23647bd5SBoerge Struempfel ldr w0, [x1] 99*23647bd5SBoerge Struempfel tst w0, #DEBUG_UART_RST_BIT 10087a940e0SYann Gautier beq 1b 101*23647bd5SBoerge Struempfel bic w0, w0, #DEBUG_UART_RST_BIT 102*23647bd5SBoerge Struempfel str w0, [x1] 10387a940e0SYann Gautier2: 104*23647bd5SBoerge Struempfel ldr w0, [x1] 105*23647bd5SBoerge Struempfel tst w0, #DEBUG_UART_RST_BIT 10687a940e0SYann Gautier bne 2b 10787a940e0SYann Gautier /* Enable GPIOs for UART TX */ 10887a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG) 10987a940e0SYann Gautier ldr w2, [x1] 11087a940e0SYann Gautier /* Configure GPIO */ 11187a940e0SYann Gautier orr w2, w2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN 11287a940e0SYann Gautier str w2, [x1] 11387a940e0SYann Gautier mov_imm x1, DEBUG_UART_TX_GPIO_BANK_ADDRESS 11487a940e0SYann Gautier /* Set GPIO mode alternate */ 11587a940e0SYann Gautier ldr w2, [x1, #GPIO_MODE_OFFSET] 11687a940e0SYann Gautier bic w2, w2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT) 11787a940e0SYann Gautier orr w2, w2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT) 11887a940e0SYann Gautier str w2, [x1, #GPIO_MODE_OFFSET] 11987a940e0SYann Gautier /* Set GPIO speed low */ 12087a940e0SYann Gautier ldr w2, [x1, #GPIO_SPEED_OFFSET] 12187a940e0SYann Gautier bic w2, w2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT) 12287a940e0SYann Gautier str w2, [x1, #GPIO_SPEED_OFFSET] 12387a940e0SYann Gautier /* Set no-pull */ 12487a940e0SYann Gautier ldr w2, [x1, #GPIO_PUPD_OFFSET] 12587a940e0SYann Gautier bic w2, w2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT) 12687a940e0SYann Gautier str w2, [x1, #GPIO_PUPD_OFFSET] 12787a940e0SYann Gautier /* Set alternate */ 12887a940e0SYann Gautier#if DEBUG_UART_TX_GPIO_PORT >= GPIO_ALT_LOWER_LIMIT 12987a940e0SYann Gautier ldr w2, [x1, #GPIO_AFRH_OFFSET] 13087a940e0SYann Gautier bic w2, w2, #(GPIO_ALTERNATE_MASK << \ 13187a940e0SYann Gautier ((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2)) 13287a940e0SYann Gautier orr w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << \ 13387a940e0SYann Gautier ((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2)) 13487a940e0SYann Gautier str w2, [x1, #GPIO_AFRH_OFFSET] 13587a940e0SYann Gautier#else 13687a940e0SYann Gautier ldr w2, [x1, #GPIO_AFRL_OFFSET] 13787a940e0SYann Gautier bic w2, w2, #(GPIO_ALTERNATE_MASK << (DEBUG_UART_TX_GPIO_PORT << 2)) 13887a940e0SYann Gautier orr w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << (DEBUG_UART_TX_GPIO_PORT << 2)) 13987a940e0SYann Gautier str w2, [x1, #GPIO_AFRL_OFFSET] 14087a940e0SYann Gautier#endif 14187a940e0SYann Gautier /* Clear UART clock flexgen divisors, keep enable bit */ 14287a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_PREDIV_CFGR) 14387a940e0SYann Gautier mov x2, #0 14487a940e0SYann Gautier str w2, [x1] 14587a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_FINDIV_CFGR) 14687a940e0SYann Gautier mov x2, #0x40 14787a940e0SYann Gautier str w2, [x1] 14887a940e0SYann Gautier /* Enable UART clock, with its source */ 14987a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_TX_CLKSRC_REG) 15087a940e0SYann Gautier mov_imm w2, (DEBUG_UART_TX_CLKSRC | RCC_XBARxCFGR_XBARxEN) 15187a940e0SYann Gautier str w2, [x1] 15287a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_TX_EN_REG) 15387a940e0SYann Gautier ldr w2, [x1] 15487a940e0SYann Gautier orr w2, w2, #DEBUG_UART_TX_EN 15587a940e0SYann Gautier str w2, [x1] 15687a940e0SYann Gautier 15787a940e0SYann Gautier mov_imm x0, STM32MP_DEBUG_USART_BASE 15887a940e0SYann Gautier mov_imm x1, STM32MP_DEBUG_USART_CLK_FRQ 15987a940e0SYann Gautier mov_imm x2, STM32MP_UART_BAUDRATE 16087a940e0SYann Gautier b console_stm32_core_init 16135527fb4SYann Gautierendfunc plat_crash_console_init 16235527fb4SYann Gautier 16335527fb4SYann Gautierfunc plat_crash_console_flush 16487a940e0SYann Gautier mov_imm x0, STM32MP_DEBUG_USART_BASE 16587a940e0SYann Gautier b console_stm32_core_flush 16635527fb4SYann Gautierendfunc plat_crash_console_flush 16735527fb4SYann Gautier 16835527fb4SYann Gautierfunc plat_crash_console_putc 16987a940e0SYann Gautier mov_imm x1, STM32MP_DEBUG_USART_BASE 17087a940e0SYann Gautier cmp x0, #'\n' 17187a940e0SYann Gautier b.ne 1f 17287a940e0SYann Gautier mov x15, x30 17387a940e0SYann Gautier mov x0, #'\r' 17487a940e0SYann Gautier bl console_stm32_core_putc 17587a940e0SYann Gautier mov x30, x15 17687a940e0SYann Gautier mov x0, #'\n' 17787a940e0SYann Gautier1: 17887a940e0SYann Gautier b console_stm32_core_putc 17935527fb4SYann Gautierendfunc plat_crash_console_putc 18035527fb4SYann Gautier 18187a940e0SYann Gautier#ifdef IMAGE_BL2 18287a940e0SYann Gautier /* --------------------------------------------- 18387a940e0SYann Gautier * void plat_report_exception(unsigned int type) 18487a940e0SYann Gautier * Function to report an unhandled exception 18587a940e0SYann Gautier * with platform-specific means. 18687a940e0SYann Gautier * --------------------------------------------- 18787a940e0SYann Gautier */ 18887a940e0SYann Gautierfunc plat_report_exception 18987a940e0SYann Gautier mov x8, x30 19087a940e0SYann Gautier 19187a940e0SYann Gautier adr x4, plat_err_str 19287a940e0SYann Gautier bl asm_print_str 19387a940e0SYann Gautier 19487a940e0SYann Gautier adr x4, esr_el3_str 19587a940e0SYann Gautier bl asm_print_str 19687a940e0SYann Gautier 19787a940e0SYann Gautier mrs x4, esr_el3 19887a940e0SYann Gautier bl asm_print_hex 19987a940e0SYann Gautier 20087a940e0SYann Gautier adr x4, elr_el3_str 20187a940e0SYann Gautier bl asm_print_str 20287a940e0SYann Gautier 20387a940e0SYann Gautier mrs x4, elr_el3 20487a940e0SYann Gautier bl asm_print_hex 20587a940e0SYann Gautier 20687a940e0SYann Gautier adr x4, far_el3_str 20787a940e0SYann Gautier bl asm_print_str 20887a940e0SYann Gautier 20987a940e0SYann Gautier mrs x4, far_el3 21087a940e0SYann Gautier bl asm_print_hex 21187a940e0SYann Gautier 21287a940e0SYann Gautier mov x30, x8 21387a940e0SYann Gautier ret 21487a940e0SYann Gautierendfunc plat_report_exception 21587a940e0SYann Gautier 21687a940e0SYann Gautier.section .rodata.rev_err_str, "aS" 21787a940e0SYann Gautierplat_err_str: 21887a940e0SYann Gautier .asciz "\nPlatform exception reporting:" 21987a940e0SYann Gautieresr_el3_str: 22087a940e0SYann Gautier .asciz "\nESR_EL3: " 22187a940e0SYann Gautierelr_el3_str: 22287a940e0SYann Gautier .asciz "\nELR_EL3: " 22387a940e0SYann Gautierfar_el3_str: 22487a940e0SYann Gautier .asciz "\nFAR_EL3: " 22587a940e0SYann Gautier#endif /* IMAGE_BL2 */ 226