mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-16 09:34:18 +00:00
feat(stm32mp2): add console configuration
Use UART driver and fill helpers for crash console. Add early console setup in bl2_el3_early_platform_setup(). Signed-off-by: Yann Gautier <yann.gautier@st.com> Change-Id: Ifb39554214dec05dafe4e306f8754e1454cdab61
This commit is contained in:
parent
4cfbb84aeb
commit
87a940e027
4 changed files with 188 additions and 1 deletions
|
@ -5,15 +5,19 @@
|
|||
*/
|
||||
|
||||
#include <asm_macros.S>
|
||||
#include <drivers/st/stm32_gpio.h>
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#define GPIO_TX_SHIFT (DEBUG_UART_TX_GPIO_PORT << 1)
|
||||
|
||||
.globl platform_mem_init
|
||||
.globl plat_secondary_cold_boot_setup
|
||||
.globl plat_is_my_cpu_primary
|
||||
.globl plat_crash_console_init
|
||||
.globl plat_crash_console_flush
|
||||
.globl plat_crash_console_putc
|
||||
.globl plat_report_exception
|
||||
|
||||
func platform_mem_init
|
||||
/* Nothing to do, don't need to init SYSRAM */
|
||||
|
@ -53,11 +57,138 @@ endfunc plat_is_my_cpu_primary
|
|||
* ---------------------------------------------
|
||||
*/
|
||||
func plat_crash_console_init
|
||||
/* Reset UART peripheral */
|
||||
mov_imm x1, (RCC_BASE + DEBUG_UART_RST_REG)
|
||||
ldr x2, =DEBUG_UART_RST_BIT
|
||||
ldr x0, [x1]
|
||||
orr x0, x0, x2
|
||||
str x0, [x1]
|
||||
1:
|
||||
ldr x0, [x1]
|
||||
ands x2, x0, x2
|
||||
beq 1b
|
||||
bic x2, x2, #DEBUG_UART_RST_BIT
|
||||
str x2, [x1]
|
||||
2:
|
||||
ldr x0, [x1]
|
||||
ands x2, x0, x2
|
||||
bne 2b
|
||||
/* Enable GPIOs for UART TX */
|
||||
mov_imm x1, (RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG)
|
||||
ldr w2, [x1]
|
||||
/* Configure GPIO */
|
||||
orr w2, w2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN
|
||||
str w2, [x1]
|
||||
mov_imm x1, DEBUG_UART_TX_GPIO_BANK_ADDRESS
|
||||
/* Set GPIO mode alternate */
|
||||
ldr w2, [x1, #GPIO_MODE_OFFSET]
|
||||
bic w2, w2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT)
|
||||
orr w2, w2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT)
|
||||
str w2, [x1, #GPIO_MODE_OFFSET]
|
||||
/* Set GPIO speed low */
|
||||
ldr w2, [x1, #GPIO_SPEED_OFFSET]
|
||||
bic w2, w2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT)
|
||||
str w2, [x1, #GPIO_SPEED_OFFSET]
|
||||
/* Set no-pull */
|
||||
ldr w2, [x1, #GPIO_PUPD_OFFSET]
|
||||
bic w2, w2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT)
|
||||
str w2, [x1, #GPIO_PUPD_OFFSET]
|
||||
/* Set alternate */
|
||||
#if DEBUG_UART_TX_GPIO_PORT >= GPIO_ALT_LOWER_LIMIT
|
||||
ldr w2, [x1, #GPIO_AFRH_OFFSET]
|
||||
bic w2, w2, #(GPIO_ALTERNATE_MASK << \
|
||||
((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2))
|
||||
orr w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << \
|
||||
((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2))
|
||||
str w2, [x1, #GPIO_AFRH_OFFSET]
|
||||
#else
|
||||
ldr w2, [x1, #GPIO_AFRL_OFFSET]
|
||||
bic w2, w2, #(GPIO_ALTERNATE_MASK << (DEBUG_UART_TX_GPIO_PORT << 2))
|
||||
orr w2, w2, #(DEBUG_UART_TX_GPIO_ALTERNATE << (DEBUG_UART_TX_GPIO_PORT << 2))
|
||||
str w2, [x1, #GPIO_AFRL_OFFSET]
|
||||
#endif
|
||||
/* Clear UART clock flexgen divisors, keep enable bit */
|
||||
mov_imm x1, (RCC_BASE + DEBUG_UART_PREDIV_CFGR)
|
||||
mov x2, #0
|
||||
str w2, [x1]
|
||||
mov_imm x1, (RCC_BASE + DEBUG_UART_FINDIV_CFGR)
|
||||
mov x2, #0x40
|
||||
str w2, [x1]
|
||||
/* Enable UART clock, with its source */
|
||||
mov_imm x1, (RCC_BASE + DEBUG_UART_TX_CLKSRC_REG)
|
||||
mov_imm w2, (DEBUG_UART_TX_CLKSRC | RCC_XBARxCFGR_XBARxEN)
|
||||
str w2, [x1]
|
||||
mov_imm x1, (RCC_BASE + DEBUG_UART_TX_EN_REG)
|
||||
ldr w2, [x1]
|
||||
orr w2, w2, #DEBUG_UART_TX_EN
|
||||
str w2, [x1]
|
||||
|
||||
mov_imm x0, STM32MP_DEBUG_USART_BASE
|
||||
mov_imm x1, STM32MP_DEBUG_USART_CLK_FRQ
|
||||
mov_imm x2, STM32MP_UART_BAUDRATE
|
||||
b console_stm32_core_init
|
||||
endfunc plat_crash_console_init
|
||||
|
||||
func plat_crash_console_flush
|
||||
mov_imm x0, STM32MP_DEBUG_USART_BASE
|
||||
b console_stm32_core_flush
|
||||
endfunc plat_crash_console_flush
|
||||
|
||||
func plat_crash_console_putc
|
||||
mov_imm x1, STM32MP_DEBUG_USART_BASE
|
||||
cmp x0, #'\n'
|
||||
b.ne 1f
|
||||
mov x15, x30
|
||||
mov x0, #'\r'
|
||||
bl console_stm32_core_putc
|
||||
mov x30, x15
|
||||
mov x0, #'\n'
|
||||
1:
|
||||
b console_stm32_core_putc
|
||||
endfunc plat_crash_console_putc
|
||||
|
||||
#ifdef IMAGE_BL2
|
||||
/* ---------------------------------------------
|
||||
* void plat_report_exception(unsigned int type)
|
||||
* Function to report an unhandled exception
|
||||
* with platform-specific means.
|
||||
* ---------------------------------------------
|
||||
*/
|
||||
func plat_report_exception
|
||||
mov x8, x30
|
||||
|
||||
adr x4, plat_err_str
|
||||
bl asm_print_str
|
||||
|
||||
adr x4, esr_el3_str
|
||||
bl asm_print_str
|
||||
|
||||
mrs x4, esr_el3
|
||||
bl asm_print_hex
|
||||
|
||||
adr x4, elr_el3_str
|
||||
bl asm_print_str
|
||||
|
||||
mrs x4, elr_el3
|
||||
bl asm_print_hex
|
||||
|
||||
adr x4, far_el3_str
|
||||
bl asm_print_str
|
||||
|
||||
mrs x4, far_el3
|
||||
bl asm_print_hex
|
||||
|
||||
mov x30, x8
|
||||
ret
|
||||
endfunc plat_report_exception
|
||||
|
||||
.section .rodata.rev_err_str, "aS"
|
||||
plat_err_str:
|
||||
.asciz "\nPlatform exception reporting:"
|
||||
esr_el3_str:
|
||||
.asciz "\nESR_EL3: "
|
||||
elr_el3_str:
|
||||
.asciz "\nELR_EL3: "
|
||||
far_el3_str:
|
||||
.asciz "\nFAR_EL3: "
|
||||
#endif /* IMAGE_BL2 */
|
||||
|
|
|
@ -7,11 +7,14 @@
|
|||
#include <cdefs.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <stm32mp_common.h>
|
||||
|
||||
void bl2_el3_early_platform_setup(u_register_t arg0 __unused,
|
||||
u_register_t arg1 __unused,
|
||||
u_register_t arg2 __unused,
|
||||
u_register_t arg3 __unused)
|
||||
{
|
||||
stm32mp_setup_early_console();
|
||||
}
|
||||
|
||||
void bl2_platform_setup(void)
|
||||
|
|
|
@ -34,7 +34,7 @@ TF_CFLAGS += -mbranch-protection=none
|
|||
PLAT_INCLUDES += -Iplat/st/stm32mp2/include/
|
||||
|
||||
PLAT_BL_COMMON_SOURCES += lib/cpus/${ARCH}/cortex_a35.S
|
||||
|
||||
PLAT_BL_COMMON_SOURCES += drivers/st/uart/${ARCH}/stm32_console.S
|
||||
PLAT_BL_COMMON_SOURCES += plat/st/stm32mp2/${ARCH}/stm32mp2_helper.S
|
||||
|
||||
BL2_SOURCES += plat/st/stm32mp2/plat_bl2_mem_params_desc.c
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#ifndef __ASSEMBLER__
|
||||
#include <drivers/st/bsec.h>
|
||||
#endif
|
||||
#include <drivers/st/stm32mp25_rcc.h>
|
||||
#include <dt-bindings/clock/stm32mp25-clks.h>
|
||||
#include <dt-bindings/clock/stm32mp25-clksrc.h>
|
||||
#include <dt-bindings/reset/stm32mp25-resets.h>
|
||||
|
@ -72,6 +73,58 @@ enum ddr_type {
|
|||
******************************************************************************/
|
||||
#define PWR_BASE U(0x44210000)
|
||||
|
||||
/*******************************************************************************
|
||||
* STM32MP2 GPIO
|
||||
******************************************************************************/
|
||||
#define GPIOA_BASE U(0x44240000)
|
||||
#define GPIOB_BASE U(0x44250000)
|
||||
#define GPIOC_BASE U(0x44260000)
|
||||
#define GPIOD_BASE U(0x44270000)
|
||||
#define GPIOE_BASE U(0x44280000)
|
||||
#define GPIOF_BASE U(0x44290000)
|
||||
#define GPIOG_BASE U(0x442A0000)
|
||||
#define GPIOH_BASE U(0x442B0000)
|
||||
#define GPIOI_BASE U(0x442C0000)
|
||||
#define GPIOJ_BASE U(0x442D0000)
|
||||
#define GPIOK_BASE U(0x442E0000)
|
||||
#define GPIOZ_BASE U(0x46200000)
|
||||
#define GPIO_BANK_OFFSET U(0x10000)
|
||||
|
||||
#define STM32MP_GPIOS_PIN_MAX_COUNT 16
|
||||
#define STM32MP_GPIOZ_PIN_MAX_COUNT 8
|
||||
|
||||
/*******************************************************************************
|
||||
* STM32MP2 UART
|
||||
******************************************************************************/
|
||||
#define USART1_BASE U(0x40330000)
|
||||
#define USART2_BASE U(0x400E0000)
|
||||
#define USART3_BASE U(0x400F0000)
|
||||
#define UART4_BASE U(0x40100000)
|
||||
#define UART5_BASE U(0x40110000)
|
||||
#define USART6_BASE U(0x40220000)
|
||||
#define UART7_BASE U(0x40370000)
|
||||
#define UART8_BASE U(0x40380000)
|
||||
#define UART9_BASE U(0x402C0000)
|
||||
#define STM32MP_NB_OF_UART U(9)
|
||||
|
||||
/* For UART crash console */
|
||||
#define STM32MP_DEBUG_USART_CLK_FRQ 64000000
|
||||
/* USART2 on HSI@64MHz, TX on GPIOA4 Alternate 6 */
|
||||
#define STM32MP_DEBUG_USART_BASE USART2_BASE
|
||||
#define DEBUG_UART_TX_GPIO_BANK_ADDRESS GPIOA_BASE
|
||||
#define DEBUG_UART_TX_GPIO_BANK_CLK_REG RCC_GPIOACFGR
|
||||
#define DEBUG_UART_TX_GPIO_BANK_CLK_EN RCC_GPIOxCFGR_GPIOxEN
|
||||
#define DEBUG_UART_TX_GPIO_PORT 4
|
||||
#define DEBUG_UART_TX_GPIO_ALTERNATE 6
|
||||
#define DEBUG_UART_TX_CLKSRC_REG RCC_XBAR8CFGR
|
||||
#define DEBUG_UART_TX_CLKSRC XBAR_SRC_HSI
|
||||
#define DEBUG_UART_TX_EN_REG RCC_USART2CFGR
|
||||
#define DEBUG_UART_TX_EN RCC_UARTxCFGR_UARTxEN
|
||||
#define DEBUG_UART_RST_REG RCC_USART2CFGR
|
||||
#define DEBUG_UART_RST_BIT RCC_UARTxCFGR_UARTxRST
|
||||
#define DEBUG_UART_PREDIV_CFGR RCC_PREDIV8CFGR
|
||||
#define DEBUG_UART_FINDIV_CFGR RCC_FINDIV8CFGR
|
||||
|
||||
/*******************************************************************************
|
||||
* STM32MP2 SDMMC
|
||||
******************************************************************************/
|
||||
|
|
Loading…
Add table
Reference in a new issue