135527fb4SYann Gautier/* 2*4da462dcSYann 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 1735527fb4SYann Gautier .globl plat_crash_console_init 1835527fb4SYann Gautier .globl plat_crash_console_flush 1935527fb4SYann Gautier .globl plat_crash_console_putc 2087a940e0SYann 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 6087a940e0SYann Gautier /* Reset UART peripheral */ 6187a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_RST_REG) 6287a940e0SYann Gautier ldr x2, =DEBUG_UART_RST_BIT 6387a940e0SYann Gautier ldr x0, [x1] 6487a940e0SYann Gautier orr x0, x0, x2 6587a940e0SYann Gautier str x0, [x1] 6687a940e0SYann Gautier1: 6787a940e0SYann Gautier ldr x0, [x1] 68*4da462dcSYann Gautier tst x0, #DEBUG_UART_RST_BIT 6987a940e0SYann Gautier beq 1b 70*4da462dcSYann Gautier bic x0, x0, #DEBUG_UART_RST_BIT 71*4da462dcSYann Gautier str x0, [x1] 7287a940e0SYann Gautier2: 7387a940e0SYann Gautier ldr x0, [x1] 74*4da462dcSYann Gautier tst x0, #DEBUG_UART_RST_BIT 7587a940e0SYann Gautier bne 2b 7687a940e0SYann Gautier /* Enable GPIOs for UART TX */ 7787a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG) 7887a940e0SYann Gautier ldr w2, [x1] 7987a940e0SYann Gautier /* Configure GPIO */ 8087a940e0SYann Gautier orr w2, w2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN 8187a940e0SYann Gautier str w2, [x1] 8287a940e0SYann Gautier mov_imm x1, DEBUG_UART_TX_GPIO_BANK_ADDRESS 8387a940e0SYann Gautier /* Set GPIO mode alternate */ 8487a940e0SYann Gautier ldr w2, [x1, #GPIO_MODE_OFFSET] 8587a940e0SYann Gautier bic w2, w2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT) 8687a940e0SYann Gautier orr w2, w2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT) 8787a940e0SYann Gautier str w2, [x1, #GPIO_MODE_OFFSET] 8887a940e0SYann Gautier /* Set GPIO speed low */ 8987a940e0SYann Gautier ldr w2, [x1, #GPIO_SPEED_OFFSET] 9087a940e0SYann Gautier bic w2, w2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT) 9187a940e0SYann Gautier str w2, [x1, #GPIO_SPEED_OFFSET] 9287a940e0SYann Gautier /* Set no-pull */ 9387a940e0SYann Gautier ldr w2, [x1, #GPIO_PUPD_OFFSET] 9487a940e0SYann Gautier bic w2, w2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT) 9587a940e0SYann Gautier str w2, [x1, #GPIO_PUPD_OFFSET] 9687a940e0SYann Gautier /* Set alternate */ 9787a940e0SYann Gautier#if DEBUG_UART_TX_GPIO_PORT >= GPIO_ALT_LOWER_LIMIT 9887a940e0SYann Gautier ldr w2, [x1, #GPIO_AFRH_OFFSET] 9987a940e0SYann Gautier bic w2, w2, #(GPIO_ALTERNATE_MASK << \ 10087a940e0SYann Gautier ((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2)) 10187a940e0SYann Gautier orr w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << \ 10287a940e0SYann Gautier ((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2)) 10387a940e0SYann Gautier str w2, [x1, #GPIO_AFRH_OFFSET] 10487a940e0SYann Gautier#else 10587a940e0SYann Gautier ldr w2, [x1, #GPIO_AFRL_OFFSET] 10687a940e0SYann Gautier bic w2, w2, #(GPIO_ALTERNATE_MASK << (DEBUG_UART_TX_GPIO_PORT << 2)) 10787a940e0SYann Gautier orr w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << (DEBUG_UART_TX_GPIO_PORT << 2)) 10887a940e0SYann Gautier str w2, [x1, #GPIO_AFRL_OFFSET] 10987a940e0SYann Gautier#endif 11087a940e0SYann Gautier /* Clear UART clock flexgen divisors, keep enable bit */ 11187a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_PREDIV_CFGR) 11287a940e0SYann Gautier mov x2, #0 11387a940e0SYann Gautier str w2, [x1] 11487a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_FINDIV_CFGR) 11587a940e0SYann Gautier mov x2, #0x40 11687a940e0SYann Gautier str w2, [x1] 11787a940e0SYann Gautier /* Enable UART clock, with its source */ 11887a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_TX_CLKSRC_REG) 11987a940e0SYann Gautier mov_imm w2, (DEBUG_UART_TX_CLKSRC | RCC_XBARxCFGR_XBARxEN) 12087a940e0SYann Gautier str w2, [x1] 12187a940e0SYann Gautier mov_imm x1, (RCC_BASE + DEBUG_UART_TX_EN_REG) 12287a940e0SYann Gautier ldr w2, [x1] 12387a940e0SYann Gautier orr w2, w2, #DEBUG_UART_TX_EN 12487a940e0SYann Gautier str w2, [x1] 12587a940e0SYann Gautier 12687a940e0SYann Gautier mov_imm x0, STM32MP_DEBUG_USART_BASE 12787a940e0SYann Gautier mov_imm x1, STM32MP_DEBUG_USART_CLK_FRQ 12887a940e0SYann Gautier mov_imm x2, STM32MP_UART_BAUDRATE 12987a940e0SYann Gautier b console_stm32_core_init 13035527fb4SYann Gautierendfunc plat_crash_console_init 13135527fb4SYann Gautier 13235527fb4SYann Gautierfunc plat_crash_console_flush 13387a940e0SYann Gautier mov_imm x0, STM32MP_DEBUG_USART_BASE 13487a940e0SYann Gautier b console_stm32_core_flush 13535527fb4SYann Gautierendfunc plat_crash_console_flush 13635527fb4SYann Gautier 13735527fb4SYann Gautierfunc plat_crash_console_putc 13887a940e0SYann Gautier mov_imm x1, STM32MP_DEBUG_USART_BASE 13987a940e0SYann Gautier cmp x0, #'\n' 14087a940e0SYann Gautier b.ne 1f 14187a940e0SYann Gautier mov x15, x30 14287a940e0SYann Gautier mov x0, #'\r' 14387a940e0SYann Gautier bl console_stm32_core_putc 14487a940e0SYann Gautier mov x30, x15 14587a940e0SYann Gautier mov x0, #'\n' 14687a940e0SYann Gautier1: 14787a940e0SYann Gautier b console_stm32_core_putc 14835527fb4SYann Gautierendfunc plat_crash_console_putc 14935527fb4SYann Gautier 15087a940e0SYann Gautier#ifdef IMAGE_BL2 15187a940e0SYann Gautier /* --------------------------------------------- 15287a940e0SYann Gautier * void plat_report_exception(unsigned int type) 15387a940e0SYann Gautier * Function to report an unhandled exception 15487a940e0SYann Gautier * with platform-specific means. 15587a940e0SYann Gautier * --------------------------------------------- 15687a940e0SYann Gautier */ 15787a940e0SYann Gautierfunc plat_report_exception 15887a940e0SYann Gautier mov x8, x30 15987a940e0SYann Gautier 16087a940e0SYann Gautier adr x4, plat_err_str 16187a940e0SYann Gautier bl asm_print_str 16287a940e0SYann Gautier 16387a940e0SYann Gautier adr x4, esr_el3_str 16487a940e0SYann Gautier bl asm_print_str 16587a940e0SYann Gautier 16687a940e0SYann Gautier mrs x4, esr_el3 16787a940e0SYann Gautier bl asm_print_hex 16887a940e0SYann Gautier 16987a940e0SYann Gautier adr x4, elr_el3_str 17087a940e0SYann Gautier bl asm_print_str 17187a940e0SYann Gautier 17287a940e0SYann Gautier mrs x4, elr_el3 17387a940e0SYann Gautier bl asm_print_hex 17487a940e0SYann Gautier 17587a940e0SYann Gautier adr x4, far_el3_str 17687a940e0SYann Gautier bl asm_print_str 17787a940e0SYann Gautier 17887a940e0SYann Gautier mrs x4, far_el3 17987a940e0SYann Gautier bl asm_print_hex 18087a940e0SYann Gautier 18187a940e0SYann Gautier mov x30, x8 18287a940e0SYann Gautier ret 18387a940e0SYann Gautierendfunc plat_report_exception 18487a940e0SYann Gautier 18587a940e0SYann Gautier.section .rodata.rev_err_str, "aS" 18687a940e0SYann Gautierplat_err_str: 18787a940e0SYann Gautier .asciz "\nPlatform exception reporting:" 18887a940e0SYann Gautieresr_el3_str: 18987a940e0SYann Gautier .asciz "\nESR_EL3: " 19087a940e0SYann Gautierelr_el3_str: 19187a940e0SYann Gautier .asciz "\nELR_EL3: " 19287a940e0SYann Gautierfar_el3_str: 19387a940e0SYann Gautier .asciz "\nFAR_EL3: " 19487a940e0SYann Gautier#endif /* IMAGE_BL2 */ 195