diff --git a/plat/st/common/include/stm32mp_common.h b/plat/st/common/include/stm32mp_common.h index a13e9e582..d8d1c13ba 100644 --- a/plat/st/common/include/stm32mp_common.h +++ b/plat/st/common/include/stm32mp_common.h @@ -62,6 +62,14 @@ uintptr_t get_uart_address(uint32_t instance_nb); /* Setup the UART console */ int stm32mp_uart_console_setup(void); +#if STM32MP_EARLY_CONSOLE +void stm32mp_setup_early_console(void); +#else +static inline void stm32mp_setup_early_console(void) +{ +} +#endif + /* * Platform util functions for the GPIO driver * @bank: Target GPIO bank ID as per DT bindings diff --git a/plat/st/common/stm32mp_common.c b/plat/st/common/stm32mp_common.c index 2297cd615..f99cad506 100644 --- a/plat/st/common/stm32mp_common.c +++ b/plat/st/common/stm32mp_common.c @@ -205,10 +205,27 @@ static void reset_uart(uint32_t reset) } #endif +static void set_console(uintptr_t base, uint32_t clk_rate) +{ + unsigned int console_flags; + + if (console_stm32_register(base, clk_rate, + STM32MP_UART_BAUDRATE, &console) == 0) { + panic(); + } + + console_flags = CONSOLE_FLAG_BOOT | CONSOLE_FLAG_CRASH | + CONSOLE_FLAG_TRANSLATE_CRLF; +#if !defined(IMAGE_BL2) && defined(DEBUG) + console_flags |= CONSOLE_FLAG_RUNTIME; +#endif + + console_set_scope(&console, console_flags); +} + int stm32mp_uart_console_setup(void) { struct dt_node_info dt_uart_info; - unsigned int console_flags; uint32_t clk_rate = 0U; int result; uint32_t boot_itf __unused; @@ -249,21 +266,19 @@ int stm32mp_uart_console_setup(void) clk_rate = clk_get_rate((unsigned long)dt_uart_info.clock); #endif - if (console_stm32_register(dt_uart_info.base, clk_rate, - STM32MP_UART_BAUDRATE, &console) == 0) { - panic(); - } - - console_flags = CONSOLE_FLAG_BOOT | CONSOLE_FLAG_CRASH | - CONSOLE_FLAG_TRANSLATE_CRLF; -#if !defined(IMAGE_BL2) && defined(DEBUG) - console_flags |= CONSOLE_FLAG_RUNTIME; -#endif - console_set_scope(&console, console_flags); + set_console(dt_uart_info.base, clk_rate); return 0; } +#if STM32MP_EARLY_CONSOLE +void stm32mp_setup_early_console(void) +{ + plat_crash_console_init(); + set_console(STM32MP_DEBUG_USART_BASE, STM32MP_DEBUG_USART_CLK_FRQ); +} +#endif /* STM32MP_EARLY_CONSOLE */ + /***************************************************************************** * plat_is_smccc_feature_available() - This function checks whether SMCCC * feature is availabile for platform. diff --git a/plat/st/stm32mp1/bl2_plat_setup.c b/plat/st/stm32mp1/bl2_plat_setup.c index 150436086..33ad56f63 100644 --- a/plat/st/stm32mp1/bl2_plat_setup.c +++ b/plat/st/stm32mp1/bl2_plat_setup.c @@ -139,6 +139,8 @@ void bl2_el3_early_platform_setup(u_register_t arg0, u_register_t arg2 __unused, u_register_t arg3 __unused) { + stm32mp_setup_early_console(); + stm32mp_save_boot_ctx_address(arg0); } diff --git a/plat/st/stm32mp1/platform.mk b/plat/st/stm32mp1/platform.mk index 65eaa744b..8d4320a50 100644 --- a/plat/st/stm32mp1/platform.mk +++ b/plat/st/stm32mp1/platform.mk @@ -9,6 +9,8 @@ ARM_WITH_NEON := yes BL2_AT_EL3 := 1 USE_COHERENT_MEM := 0 +STM32MP_EARLY_CONSOLE ?= 0 + # Allow TF-A to concatenate BL2 & BL32 binaries in a single file, # share DTB file between BL2 and BL32 # If it is set to 0, then FIP is used @@ -157,6 +159,7 @@ $(eval $(call assert_booleans,\ PLAT_XLAT_TABLES_DYNAMIC \ STM32MP_DDR_32BIT_INTERFACE \ STM32MP_DDR_DUAL_AXI_PORT \ + STM32MP_EARLY_CONSOLE \ STM32MP_EMMC \ STM32MP_EMMC_BOOT \ STM32MP_RAW_NAND \ @@ -183,6 +186,7 @@ $(eval $(call add_defines,\ STM32_TF_VERSION \ STM32MP_DDR_32BIT_INTERFACE \ STM32MP_DDR_DUAL_AXI_PORT \ + STM32MP_EARLY_CONSOLE \ STM32MP_EMMC \ STM32MP_EMMC_BOOT \ STM32MP_RAW_NAND \