14353bb20SYann Gautier/* 24353bb20SYann Gautier * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 34353bb20SYann Gautier * 44353bb20SYann Gautier * SPDX-License-Identifier: BSD-3-Clause 54353bb20SYann Gautier */ 64353bb20SYann Gautier 74353bb20SYann Gautier#include <arch.h> 84353bb20SYann Gautier#include <asm_macros.S> 94353bb20SYann Gautier#include <bl_common.h> 104353bb20SYann Gautier#include <platform_def.h> 11*278c34dfSYann Gautier#include <stm32_gpio.h> 12*278c34dfSYann Gautier#include <stm32mp1_rcc.h> 13*278c34dfSYann Gautier 14*278c34dfSYann Gautier#define GPIO_BANK_G_ADDRESS 0x50008000 15*278c34dfSYann Gautier#define GPIO_TX_PORT 11 16*278c34dfSYann Gautier#define GPIO_TX_SHIFT (GPIO_TX_PORT << 1) 17*278c34dfSYann Gautier#define GPIO_TX_ALT_SHIFT ((GPIO_TX_PORT - GPIO_ALT_LOWER_LIMIT) << 2) 18*278c34dfSYann Gautier#define STM32MP1_HSI_CLK 64000000 194353bb20SYann Gautier 204353bb20SYann Gautier .globl platform_mem_init 214353bb20SYann Gautier .globl plat_report_exception 224353bb20SYann Gautier .globl plat_get_my_entrypoint 234353bb20SYann Gautier .globl plat_secondary_cold_boot_setup 244353bb20SYann Gautier .globl plat_reset_handler 254353bb20SYann Gautier .globl plat_is_my_cpu_primary 264353bb20SYann Gautier .globl plat_my_core_pos 27*278c34dfSYann Gautier .globl plat_crash_console_init 28*278c34dfSYann Gautier .globl plat_crash_console_flush 29*278c34dfSYann Gautier .globl plat_crash_console_putc 304353bb20SYann Gautier .globl plat_panic_handler 314353bb20SYann Gautier 324353bb20SYann Gautierfunc platform_mem_init 334353bb20SYann Gautier /* Nothing to do, don't need to init SYSRAM */ 344353bb20SYann Gautier bx lr 354353bb20SYann Gautierendfunc platform_mem_init 364353bb20SYann Gautier 374353bb20SYann Gautierfunc plat_report_exception 384353bb20SYann Gautier bx lr 394353bb20SYann Gautierendfunc plat_report_exception 404353bb20SYann Gautier 414353bb20SYann Gautierfunc plat_reset_handler 424353bb20SYann Gautier bx lr 434353bb20SYann Gautierendfunc plat_reset_handler 444353bb20SYann Gautier 454353bb20SYann Gautier /* ------------------------------------------------------------------ 464353bb20SYann Gautier * unsigned long plat_get_my_entrypoint (void); 474353bb20SYann Gautier * 484353bb20SYann Gautier * Main job of this routine is to distinguish between a cold and warm 494353bb20SYann Gautier * boot. 504353bb20SYann Gautier * 514353bb20SYann Gautier * Currently supports only cold boot 524353bb20SYann Gautier * ------------------------------------------------------------------ 534353bb20SYann Gautier */ 544353bb20SYann Gautierfunc plat_get_my_entrypoint 554353bb20SYann Gautier mov r0, #0 564353bb20SYann Gautier bx lr 574353bb20SYann Gautierendfunc plat_get_my_entrypoint 584353bb20SYann Gautier 594353bb20SYann Gautier /* --------------------------------------------- 604353bb20SYann Gautier * void plat_secondary_cold_boot_setup (void); 614353bb20SYann Gautier * 624353bb20SYann Gautier * Cold-booting secondary CPUs is not supported. 634353bb20SYann Gautier * --------------------------------------------- 644353bb20SYann Gautier */ 654353bb20SYann Gautierfunc plat_secondary_cold_boot_setup 664353bb20SYann Gautier b . 674353bb20SYann Gautierendfunc plat_secondary_cold_boot_setup 684353bb20SYann Gautier 694353bb20SYann Gautier /* ----------------------------------------------------- 704353bb20SYann Gautier * unsigned int plat_is_my_cpu_primary (void); 714353bb20SYann Gautier * 724353bb20SYann Gautier * Find out whether the current cpu is the primary cpu. 734353bb20SYann Gautier * ----------------------------------------------------- 744353bb20SYann Gautier */ 754353bb20SYann Gautierfunc plat_is_my_cpu_primary 764353bb20SYann Gautier ldcopr r0, MPIDR 774353bb20SYann Gautier ldr r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 784353bb20SYann Gautier and r0, r1 794353bb20SYann Gautier cmp r0, #STM32MP1_PRIMARY_CPU 804353bb20SYann Gautier moveq r0, #1 814353bb20SYann Gautier movne r0, #0 824353bb20SYann Gautier bx lr 834353bb20SYann Gautierendfunc plat_is_my_cpu_primary 844353bb20SYann Gautier 854353bb20SYann Gautier /* ------------------------------------------- 864353bb20SYann Gautier * int plat_stm32mp1_get_core_pos(int mpidr); 874353bb20SYann Gautier * 884353bb20SYann Gautier * Return CorePos = (ClusterId * 4) + CoreId 894353bb20SYann Gautier * ------------------------------------------- 904353bb20SYann Gautier */ 914353bb20SYann Gautierfunc plat_stm32mp1_get_core_pos 924353bb20SYann Gautier and r1, r0, #MPIDR_CPU_MASK 934353bb20SYann Gautier and r0, r0, #MPIDR_CLUSTER_MASK 944353bb20SYann Gautier add r0, r1, r0, LSR #6 954353bb20SYann Gautier bx lr 964353bb20SYann Gautierendfunc plat_stm32mp1_get_core_pos 974353bb20SYann Gautier 984353bb20SYann Gautier /* ------------------------------------ 994353bb20SYann Gautier * unsigned int plat_my_core_pos(void) 1004353bb20SYann Gautier * ------------------------------------ 1014353bb20SYann Gautier */ 1024353bb20SYann Gautierfunc plat_my_core_pos 1034353bb20SYann Gautier ldcopr r0, MPIDR 1044353bb20SYann Gautier b plat_stm32mp1_get_core_pos 1054353bb20SYann Gautierendfunc plat_my_core_pos 106*278c34dfSYann Gautier 107*278c34dfSYann Gautier /* --------------------------------------------- 108*278c34dfSYann Gautier * int plat_crash_console_init(void) 109*278c34dfSYann Gautier * 110*278c34dfSYann Gautier * Initialize the crash console without a C Runtime stack. 111*278c34dfSYann Gautier * --------------------------------------------- 112*278c34dfSYann Gautier */ 113*278c34dfSYann Gautierfunc plat_crash_console_init 114*278c34dfSYann Gautier /* Enable GPIOs for UART4 TX */ 115*278c34dfSYann Gautier ldr r1, =(RCC_BASE + RCC_MP_AHB4ENSETR) 116*278c34dfSYann Gautier ldr r2, [r1] 117*278c34dfSYann Gautier /* Configure GPIO G11 */ 118*278c34dfSYann Gautier orr r2, r2, #RCC_MP_AHB4ENSETR_GPIOGEN 119*278c34dfSYann Gautier str r2, [r1] 120*278c34dfSYann Gautier ldr r1, =GPIO_BANK_G_ADDRESS 121*278c34dfSYann Gautier /* Set GPIO mode alternate */ 122*278c34dfSYann Gautier ldr r2, [r1, #GPIO_MODE_OFFSET] 123*278c34dfSYann Gautier bic r2, r2, #(GPIO_MODE_MASK << GPIO_TX_SHIFT) 124*278c34dfSYann Gautier orr r2, r2, #(GPIO_MODE_ALTERNATE << GPIO_TX_SHIFT) 125*278c34dfSYann Gautier str r2, [r1, #GPIO_MODE_OFFSET] 126*278c34dfSYann Gautier /* Set GPIO speed low */ 127*278c34dfSYann Gautier ldr r2, [r1, #GPIO_SPEED_OFFSET] 128*278c34dfSYann Gautier bic r2, r2, #(GPIO_SPEED_MASK << GPIO_TX_SHIFT) 129*278c34dfSYann Gautier str r2, [r1, #GPIO_SPEED_OFFSET] 130*278c34dfSYann Gautier /* Set no-pull */ 131*278c34dfSYann Gautier ldr r2, [r1, #GPIO_PUPD_OFFSET] 132*278c34dfSYann Gautier bic r2, r2, #(GPIO_PULL_MASK << GPIO_TX_SHIFT) 133*278c34dfSYann Gautier str r2, [r1, #GPIO_PUPD_OFFSET] 134*278c34dfSYann Gautier /* Set alternate AF6 */ 135*278c34dfSYann Gautier ldr r2, [r1, #GPIO_AFRH_OFFSET] 136*278c34dfSYann Gautier bic r2, r2, #(GPIO_ALTERNATE_MASK << GPIO_TX_ALT_SHIFT) 137*278c34dfSYann Gautier orr r2, r2, #(GPIO_ALTERNATE_6 << GPIO_TX_ALT_SHIFT) 138*278c34dfSYann Gautier str r2, [r1, #GPIO_AFRH_OFFSET] 139*278c34dfSYann Gautier 140*278c34dfSYann Gautier /* Enable UART clock, with HSI source */ 141*278c34dfSYann Gautier ldr r1, =(RCC_BASE + RCC_UART24CKSELR) 142*278c34dfSYann Gautier mov r2, #RCC_UART24CKSELR_HSI 143*278c34dfSYann Gautier str r2, [r1] 144*278c34dfSYann Gautier ldr r1, =(RCC_BASE + RCC_MP_APB1ENSETR) 145*278c34dfSYann Gautier ldr r2, [r1] 146*278c34dfSYann Gautier orr r2, r2, #RCC_MP_APB1ENSETR_UART4EN 147*278c34dfSYann Gautier str r2, [r1] 148*278c34dfSYann Gautier 149*278c34dfSYann Gautier ldr r0, =STM32MP1_DEBUG_USART_BASE 150*278c34dfSYann Gautier ldr r1, =STM32MP1_HSI_CLK 151*278c34dfSYann Gautier ldr r2, =STM32MP1_UART_BAUDRATE 152*278c34dfSYann Gautier b console_core_init 153*278c34dfSYann Gautierendfunc plat_crash_console_init 154*278c34dfSYann Gautier 155*278c34dfSYann Gautier /* --------------------------------------------- 156*278c34dfSYann Gautier * int plat_crash_console_flush(void) 157*278c34dfSYann Gautier * 158*278c34dfSYann Gautier * Flush the crash console without a C Runtime stack. 159*278c34dfSYann Gautier * --------------------------------------------- 160*278c34dfSYann Gautier */ 161*278c34dfSYann Gautierfunc plat_crash_console_flush 162*278c34dfSYann Gautier ldr r1, =STM32MP1_DEBUG_USART_BASE 163*278c34dfSYann Gautier b console_core_flush 164*278c34dfSYann Gautierendfunc plat_crash_console_flush 165*278c34dfSYann Gautier 166*278c34dfSYann Gautier /* --------------------------------------------- 167*278c34dfSYann Gautier * int plat_crash_console_putc(int c) 168*278c34dfSYann Gautier * 169*278c34dfSYann Gautier * Print a character on the crash console without a C Runtime stack. 170*278c34dfSYann Gautier * Clobber list : r1 - r3 171*278c34dfSYann Gautier * 172*278c34dfSYann Gautier * In case of bootloading through uart, we keep console crash as this. 173*278c34dfSYann Gautier * Characters could be sent to the programmer, but will be ignored. 174*278c34dfSYann Gautier * No specific code in that case. 175*278c34dfSYann Gautier * --------------------------------------------- 176*278c34dfSYann Gautier */ 177*278c34dfSYann Gautierfunc plat_crash_console_putc 178*278c34dfSYann Gautier ldr r1, =STM32MP1_DEBUG_USART_BASE 179*278c34dfSYann Gautier b console_core_putc 180*278c34dfSYann Gautierendfunc plat_crash_console_putc 181