14353bb20SYann Gautier/* 21fc2130cSYann Gautier * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. 34353bb20SYann Gautier * 44353bb20SYann Gautier * SPDX-License-Identifier: BSD-3-Clause 54353bb20SYann Gautier */ 64353bb20SYann Gautier 709d40e0eSAntonio Nino Diaz#include <platform_def.h> 809d40e0eSAntonio Nino Diaz 94353bb20SYann Gautier#include <arch.h> 104353bb20SYann Gautier#include <asm_macros.S> 1109d40e0eSAntonio Nino Diaz#include <common/bl_common.h> 1209d40e0eSAntonio Nino Diaz#include <drivers/st/stm32_gpio.h> 1309d40e0eSAntonio Nino Diaz#include <drivers/st/stm32mp1_rcc.h> 14278c34dfSYann Gautier 151fc2130cSYann Gautier#define GPIO_TX_SHIFT (DEBUG_UART_TX_GPIO_PORT << 1) 161fc2130cSYann Gautier#define GPIO_TX_ALT_SHIFT ((DEBUG_UART_TX_GPIO_PORT - GPIO_ALT_LOWER_LIMIT) << 2) 174353bb20SYann Gautier 184353bb20SYann Gautier .globl platform_mem_init 194353bb20SYann Gautier .globl plat_report_exception 204353bb20SYann Gautier .globl plat_get_my_entrypoint 214353bb20SYann Gautier .globl plat_secondary_cold_boot_setup 224353bb20SYann Gautier .globl plat_reset_handler 234353bb20SYann Gautier .globl plat_is_my_cpu_primary 244353bb20SYann Gautier .globl plat_my_core_pos 25278c34dfSYann Gautier .globl plat_crash_console_init 26278c34dfSYann Gautier .globl plat_crash_console_flush 27278c34dfSYann Gautier .globl plat_crash_console_putc 284353bb20SYann Gautier .globl plat_panic_handler 294353bb20SYann Gautier 304353bb20SYann Gautierfunc platform_mem_init 314353bb20SYann Gautier /* Nothing to do, don't need to init SYSRAM */ 324353bb20SYann Gautier bx lr 334353bb20SYann Gautierendfunc platform_mem_init 344353bb20SYann Gautier 354353bb20SYann Gautierfunc plat_report_exception 364353bb20SYann Gautier bx lr 374353bb20SYann Gautierendfunc plat_report_exception 384353bb20SYann Gautier 394353bb20SYann Gautierfunc plat_reset_handler 404353bb20SYann Gautier bx lr 414353bb20SYann Gautierendfunc plat_reset_handler 424353bb20SYann Gautier 434353bb20SYann Gautier /* ------------------------------------------------------------------ 444353bb20SYann Gautier * unsigned long plat_get_my_entrypoint (void); 454353bb20SYann Gautier * 464353bb20SYann Gautier * Main job of this routine is to distinguish between a cold and warm 474353bb20SYann Gautier * boot. 484353bb20SYann Gautier * 494353bb20SYann Gautier * Currently supports only cold boot 504353bb20SYann Gautier * ------------------------------------------------------------------ 514353bb20SYann Gautier */ 524353bb20SYann Gautierfunc plat_get_my_entrypoint 534353bb20SYann Gautier mov r0, #0 544353bb20SYann Gautier bx lr 554353bb20SYann Gautierendfunc plat_get_my_entrypoint 564353bb20SYann Gautier 574353bb20SYann Gautier /* --------------------------------------------- 584353bb20SYann Gautier * void plat_secondary_cold_boot_setup (void); 594353bb20SYann Gautier * 604353bb20SYann Gautier * Cold-booting secondary CPUs is not supported. 614353bb20SYann Gautier * --------------------------------------------- 624353bb20SYann Gautier */ 634353bb20SYann Gautierfunc plat_secondary_cold_boot_setup 644353bb20SYann Gautier b . 654353bb20SYann Gautierendfunc plat_secondary_cold_boot_setup 664353bb20SYann Gautier 674353bb20SYann Gautier /* ----------------------------------------------------- 684353bb20SYann Gautier * unsigned int plat_is_my_cpu_primary (void); 694353bb20SYann Gautier * 704353bb20SYann Gautier * Find out whether the current cpu is the primary cpu. 714353bb20SYann Gautier * ----------------------------------------------------- 724353bb20SYann Gautier */ 734353bb20SYann Gautierfunc plat_is_my_cpu_primary 744353bb20SYann Gautier ldcopr r0, MPIDR 754353bb20SYann Gautier ldr r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 764353bb20SYann Gautier and r0, r1 77*3f9c9784SYann Gautier cmp r0, #STM32MP_PRIMARY_CPU 784353bb20SYann Gautier moveq r0, #1 794353bb20SYann Gautier movne r0, #0 804353bb20SYann Gautier bx lr 814353bb20SYann Gautierendfunc plat_is_my_cpu_primary 824353bb20SYann Gautier 834353bb20SYann Gautier /* ------------------------------------------- 844353bb20SYann Gautier * int plat_stm32mp1_get_core_pos(int mpidr); 854353bb20SYann Gautier * 864353bb20SYann Gautier * Return CorePos = (ClusterId * 4) + CoreId 874353bb20SYann Gautier * ------------------------------------------- 884353bb20SYann Gautier */ 894353bb20SYann Gautierfunc plat_stm32mp1_get_core_pos 904353bb20SYann Gautier and r1, r0, #MPIDR_CPU_MASK 914353bb20SYann Gautier and r0, r0, #MPIDR_CLUSTER_MASK 924353bb20SYann Gautier add r0, r1, r0, LSR #6 934353bb20SYann Gautier bx lr 944353bb20SYann Gautierendfunc plat_stm32mp1_get_core_pos 954353bb20SYann Gautier 964353bb20SYann Gautier /* ------------------------------------ 974353bb20SYann Gautier * unsigned int plat_my_core_pos(void) 984353bb20SYann Gautier * ------------------------------------ 994353bb20SYann Gautier */ 1004353bb20SYann Gautierfunc plat_my_core_pos 1014353bb20SYann Gautier ldcopr r0, MPIDR 1024353bb20SYann Gautier b plat_stm32mp1_get_core_pos 1034353bb20SYann Gautierendfunc plat_my_core_pos 104278c34dfSYann Gautier 105278c34dfSYann Gautier /* --------------------------------------------- 106278c34dfSYann Gautier * int plat_crash_console_init(void) 107278c34dfSYann Gautier * 108278c34dfSYann Gautier * Initialize the crash console without a C Runtime stack. 109278c34dfSYann Gautier * --------------------------------------------- 110278c34dfSYann Gautier */ 111278c34dfSYann Gautierfunc plat_crash_console_init 1121fc2130cSYann Gautier /* Enable GPIOs for UART TX */ 1131fc2130cSYann Gautier ldr r1, =(RCC_BASE + DEBUG_UART_TX_GPIO_BANK_CLK_REG) 114278c34dfSYann Gautier ldr r2, [r1] 1151fc2130cSYann Gautier /* Configure GPIO */ 1161fc2130cSYann Gautier orr r2, r2, #DEBUG_UART_TX_GPIO_BANK_CLK_EN 117278c34dfSYann Gautier str r2, [r1] 1181fc2130cSYann Gautier ldr r1, =DEBUG_UART_TX_GPIO_BANK_ADDRESS 119278c34dfSYann Gautier /* Set GPIO mode alternate */ 120278c34dfSYann Gautier ldr r2, [r1, #GPIO_MODE_OFFSET] 121278c34dfSYann Gautier bic r2, r2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT) 122278c34dfSYann Gautier orr r2, r2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT) 123278c34dfSYann Gautier str r2, [r1, #GPIO_MODE_OFFSET] 124278c34dfSYann Gautier /* Set GPIO speed low */ 125278c34dfSYann Gautier ldr r2, [r1, #GPIO_SPEED_OFFSET] 126278c34dfSYann Gautier bic r2, r2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT) 127278c34dfSYann Gautier str r2, [r1, #GPIO_SPEED_OFFSET] 128278c34dfSYann Gautier /* Set no-pull */ 129278c34dfSYann Gautier ldr r2, [r1, #GPIO_PUPD_OFFSET] 130278c34dfSYann Gautier bic r2, r2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT) 131278c34dfSYann Gautier str r2, [r1, #GPIO_PUPD_OFFSET] 1321fc2130cSYann Gautier /* Set alternate */ 133278c34dfSYann Gautier ldr r2, [r1, #GPIO_AFRH_OFFSET] 134278c34dfSYann Gautier bic r2, r2, #(GPIO_ALTERNATE_MASK << GPIO_TX_ALT_SHIFT) 1351fc2130cSYann Gautier orr r2, r2, #(DEBUG_UART_TX_GPIO_ALTERNATE << GPIO_TX_ALT_SHIFT) 136278c34dfSYann Gautier str r2, [r1, #GPIO_AFRH_OFFSET] 1371fc2130cSYann Gautier /* Enable UART clock, with its source */ 1381fc2130cSYann Gautier ldr r1, =(RCC_BASE + DEBUG_UART_TX_CLKSRC_REG) 1391fc2130cSYann Gautier mov r2, #DEBUG_UART_TX_CLKSRC 140278c34dfSYann Gautier str r2, [r1] 1411fc2130cSYann Gautier ldr r1, =(RCC_BASE + DEBUG_UART_TX_EN_REG) 142278c34dfSYann Gautier ldr r2, [r1] 1431fc2130cSYann Gautier orr r2, r2, #DEBUG_UART_TX_EN 144278c34dfSYann Gautier str r2, [r1] 145278c34dfSYann Gautier 146*3f9c9784SYann Gautier ldr r0, =STM32MP_DEBUG_USART_BASE 147*3f9c9784SYann Gautier ldr r1, =STM32MP_DEBUG_USART_CLK_FRQ 148*3f9c9784SYann Gautier ldr r2, =STM32MP_UART_BAUDRATE 149cce37d44SYann Gautier b console_stm32_core_init 150278c34dfSYann Gautierendfunc plat_crash_console_init 151278c34dfSYann Gautier 152278c34dfSYann Gautier /* --------------------------------------------- 153278c34dfSYann Gautier * int plat_crash_console_flush(void) 154278c34dfSYann Gautier * 155278c34dfSYann Gautier * Flush the crash console without a C Runtime stack. 156278c34dfSYann Gautier * --------------------------------------------- 157278c34dfSYann Gautier */ 158278c34dfSYann Gautierfunc plat_crash_console_flush 159*3f9c9784SYann Gautier ldr r1, =STM32MP_DEBUG_USART_BASE 160cce37d44SYann Gautier b console_stm32_core_flush 161278c34dfSYann Gautierendfunc plat_crash_console_flush 162278c34dfSYann Gautier 163278c34dfSYann Gautier /* --------------------------------------------- 164278c34dfSYann Gautier * int plat_crash_console_putc(int c) 165278c34dfSYann Gautier * 166278c34dfSYann Gautier * Print a character on the crash console without a C Runtime stack. 167278c34dfSYann Gautier * Clobber list : r1 - r3 168278c34dfSYann Gautier * 169278c34dfSYann Gautier * In case of bootloading through uart, we keep console crash as this. 170278c34dfSYann Gautier * Characters could be sent to the programmer, but will be ignored. 171278c34dfSYann Gautier * No specific code in that case. 172278c34dfSYann Gautier * --------------------------------------------- 173278c34dfSYann Gautier */ 174278c34dfSYann Gautierfunc plat_crash_console_putc 175*3f9c9784SYann Gautier ldr r1, =STM32MP_DEBUG_USART_BASE 176cce37d44SYann Gautier b console_stm32_core_putc 177278c34dfSYann Gautierendfunc plat_crash_console_putc 178