From d7176f0319cd399aae9a906e5d78e67b32e183f5 Mon Sep 17 00:00:00 2001 From: Yann Gautier Date: Fri, 4 Jun 2021 14:04:05 +0200 Subject: [PATCH] fix(stm32mp1): deconfigure UART RX pins Those pins are configured by ROM code, for serial boot use cases. Their configs are reset if the boot is done on UART, but not on USB. This should then be done in TF-A. This has to be done after clock init, and before console is configured. Signed-off-by: Yann Gautier Change-Id: I29a9694e25fcf1665360dd71f73937f769c43b52 --- plat/st/stm32mp1/bl2_plat_setup.c | 5 ++ plat/st/stm32mp1/include/stm32mp1_private.h | 2 + plat/st/stm32mp1/stm32mp1_private.c | 53 +++++++++++++++++++-- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/plat/st/stm32mp1/bl2_plat_setup.c b/plat/st/stm32mp1/bl2_plat_setup.c index 218f28d12..6c551669c 100644 --- a/plat/st/stm32mp1/bl2_plat_setup.c +++ b/plat/st/stm32mp1/bl2_plat_setup.c @@ -248,6 +248,11 @@ void bl2_el3_plat_arch_setup(void) stm32mp1_syscfg_init(); +#if STM32MP_USB_PROGRAMMER + /* Deconfigure all UART RX pins configured by ROM code */ + stm32mp1_deconfigure_uart_pins(); +#endif + result = dt_get_stdout_uart_info(&dt_uart_info); if ((result <= 0) || diff --git a/plat/st/stm32mp1/include/stm32mp1_private.h b/plat/st/stm32mp1/include/stm32mp1_private.h index 729d2336b..2eec16f57 100644 --- a/plat/st/stm32mp1/include/stm32mp1_private.h +++ b/plat/st/stm32mp1/include/stm32mp1_private.h @@ -21,6 +21,8 @@ void stm32mp1_syscfg_init(void); void stm32mp1_syscfg_enable_io_compensation(void); void stm32mp1_syscfg_disable_io_compensation(void); +void stm32mp1_deconfigure_uart_pins(void); + #if STM32MP_USE_STM32IMAGE uint32_t stm32mp_get_ddr_ns_size(void); #endif /* STM32MP_USE_STM32IMAGE */ diff --git a/plat/st/stm32mp1/stm32mp1_private.c b/plat/st/stm32mp1/stm32mp1_private.c index d7f3dd82f..61c40f124 100644 --- a/plat/st/stm32mp1/stm32mp1_private.c +++ b/plat/st/stm32mp1/stm32mp1_private.c @@ -6,13 +6,13 @@ #include +#include +#include #include +#include #include -#include -#include - /* Internal layout of the 32bit OTP word board_id */ #define BOARD_ID_BOARD_NB_MASK GENMASK(31, 16) #define BOARD_ID_BOARD_NB_SHIFT 16 @@ -188,6 +188,53 @@ uintptr_t get_uart_address(uint32_t instance_nb) } #endif +#if STM32MP_USB_PROGRAMMER +struct gpio_bank_pin_list { + uint32_t bank; + uint32_t pin; +}; + +static const struct gpio_bank_pin_list gpio_list[] = { + { /* USART2_RX: GPIOA3 */ + .bank = 0U, + .pin = 3U, + }, + { /* USART3_RX: GPIOB12 */ + .bank = 1U, + .pin = 12U, + }, + { /* UART4_RX: GPIOB2 */ + .bank = 1U, + .pin = 2U, + }, + { /* UART5_RX: GPIOB4 */ + .bank = 1U, + .pin = 5U, + }, + { /* USART6_RX: GPIOC7 */ + .bank = 2U, + .pin = 7U, + }, + { /* UART7_RX: GPIOF6 */ + .bank = 5U, + .pin = 6U, + }, + { /* UART8_RX: GPIOE0 */ + .bank = 4U, + .pin = 0U, + }, +}; + +void stm32mp1_deconfigure_uart_pins(void) +{ + size_t i; + + for (i = 0U; i < ARRAY_SIZE(gpio_list); i++) { + set_gpio_reset_cfg(gpio_list[i].bank, gpio_list[i].pin); + } +} +#endif + uint32_t stm32mp_get_chip_version(void) { uint32_t version = 0U;