1717448d6SSheetal Tigadoli/* 2717448d6SSheetal Tigadoli * Copyright (c) 2015-2020, Broadcom 3717448d6SSheetal Tigadoli * 4717448d6SSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause 5717448d6SSheetal Tigadoli */ 6717448d6SSheetal Tigadoli 7717448d6SSheetal Tigadoli#include <arch.h> 8717448d6SSheetal Tigadoli#include <asm_macros.S> 9717448d6SSheetal Tigadoli#include <assert_macros.S> 10717448d6SSheetal Tigadoli#include <cpu_macros.S> 11717448d6SSheetal Tigadoli#include <cortex_a72.h> 12717448d6SSheetal Tigadoli#include <drivers/ti/uart/uart_16550.h> 13717448d6SSheetal Tigadoli 14717448d6SSheetal Tigadoli#include <platform_def.h> 15717448d6SSheetal Tigadoli 16717448d6SSheetal Tigadoli .globl plat_reset_handler 17717448d6SSheetal Tigadoli .globl platform_get_entrypoint 18717448d6SSheetal Tigadoli .globl plat_secondary_cold_boot_setup 19717448d6SSheetal Tigadoli .globl platform_mem_init 20717448d6SSheetal Tigadoli .globl platform_check_mpidr 21717448d6SSheetal Tigadoli .globl plat_crash_console_init 22717448d6SSheetal Tigadoli .globl plat_crash_console_putc 23717448d6SSheetal Tigadoli .globl plat_crash_console_flush 24717448d6SSheetal Tigadoli .globl plat_disable_acp 25717448d6SSheetal Tigadoli .globl plat_is_my_cpu_primary 26717448d6SSheetal Tigadoli .globl plat_my_core_pos 27717448d6SSheetal Tigadoli .globl platform_is_primary_cpu 28717448d6SSheetal Tigadoli .globl plat_brcm_calc_core_pos 29717448d6SSheetal Tigadoli .globl plat_get_my_entrypoint 30717448d6SSheetal Tigadoli 31717448d6SSheetal Tigadoli 32717448d6SSheetal Tigadoli /* ------------------------------------------------------------ 33717448d6SSheetal Tigadoli * void plat_l2_init(void); 34717448d6SSheetal Tigadoli * 35717448d6SSheetal Tigadoli * BL1 and BL2 run with one core, one cluster 36717448d6SSheetal Tigadoli * This is safe to disable cluster coherency 37717448d6SSheetal Tigadoli * to make use of the data cache MMU WB attribute 38717448d6SSheetal Tigadoli * for the SRAM. 39717448d6SSheetal Tigadoli * 40717448d6SSheetal Tigadoli * Set L2 Auxiliary Control Register 41717448d6SSheetal Tigadoli * -------------------------------------------------------------------- 42717448d6SSheetal Tigadoli */ 43717448d6SSheetal Tigadolifunc plat_l2_init 44717448d6SSheetal Tigadoli mrs x0, CORTEX_A72_L2ACTLR_EL1 45717448d6SSheetal Tigadoli#if (IMAGE_BL1 || IMAGE_BL2) || defined(USE_SINGLE_CLUSTER) 46717448d6SSheetal Tigadoli orr x0, x0, #CORTEX_A72_L2ACTLR_DISABLE_ACE_SH_OR_CHI 47717448d6SSheetal Tigadoli#else 48717448d6SSheetal Tigadoli bic x0, x0, #CORTEX_A72_L2ACTLR_DISABLE_ACE_SH_OR_CHI 49717448d6SSheetal Tigadoli#endif 50717448d6SSheetal Tigadoli msr CORTEX_A72_L2ACTLR_EL1, x0 51717448d6SSheetal Tigadoli 52717448d6SSheetal Tigadoli /* Set L2 Control Register */ 53717448d6SSheetal Tigadoli mrs x0, CORTEX_A72_L2CTLR_EL1 54717448d6SSheetal Tigadoli mov x1, #((CORTEX_A72_L2_DATA_RAM_LATENCY_MASK << \ 55717448d6SSheetal Tigadoli CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \ 56717448d6SSheetal Tigadoli (CORTEX_A72_L2_TAG_RAM_LATENCY_MASK << \ 57717448d6SSheetal Tigadoli CORTEX_A72_L2CTLR_TAG_RAM_LATENCY_SHIFT) | \ 58717448d6SSheetal Tigadoli (U(0x1) << CORTEX_A72_L2CTLR_TAG_RAM_SETUP_SHIFT) | \ 59717448d6SSheetal Tigadoli (U(0x1) << CORTEX_A72_L2CTLR_DATA_RAM_SETUP_SHIFT)) 60717448d6SSheetal Tigadoli bic x0, x0, x1 61717448d6SSheetal Tigadoli mov x1, #((CORTEX_A72_L2_DATA_RAM_LATENCY_3_CYCLES << \ 62717448d6SSheetal Tigadoli CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \ 63717448d6SSheetal Tigadoli (U(0x1) << CORTEX_A72_L2CTLR_TAG_RAM_SETUP_SHIFT) | \ 64717448d6SSheetal Tigadoli (U(0x1) << CORTEX_A72_L2CTLR_DATA_RAM_SETUP_SHIFT)) 65717448d6SSheetal Tigadoli orr x0, x0, x1 66717448d6SSheetal Tigadoli msr CORTEX_A72_L2CTLR_EL1, x0 67717448d6SSheetal Tigadoli 68717448d6SSheetal Tigadoli isb 69717448d6SSheetal Tigadoli ret 70717448d6SSheetal Tigadoliendfunc plat_l2_init 71717448d6SSheetal Tigadoli 72717448d6SSheetal Tigadoli /* -------------------------------------------------------------------- 73717448d6SSheetal Tigadoli * void plat_reset_handler(void); 74717448d6SSheetal Tigadoli * 75717448d6SSheetal Tigadoli * Before adding code in this function, refer to the guidelines in 76717448d6SSheetal Tigadoli * docs/firmware-design.md. 77717448d6SSheetal Tigadoli * 78717448d6SSheetal Tigadoli * -------------------------------------------------------------------- 79717448d6SSheetal Tigadoli */ 80717448d6SSheetal Tigadolifunc plat_reset_handler 81717448d6SSheetal Tigadoli mov x9, x30 82717448d6SSheetal Tigadoli bl plat_l2_init 83717448d6SSheetal Tigadoli mov x30, x9 84717448d6SSheetal Tigadoli ret 85717448d6SSheetal Tigadoliendfunc plat_reset_handler 86717448d6SSheetal Tigadoli 87717448d6SSheetal Tigadoli /* ----------------------------------------------------- 88717448d6SSheetal Tigadoli * void platform_get_entrypoint (unsigned int mpid); 89717448d6SSheetal Tigadoli * 90717448d6SSheetal Tigadoli * Main job of this routine is to distinguish between 91717448d6SSheetal Tigadoli * a cold and warm boot. 92717448d6SSheetal Tigadoli * On a cold boot the secondaries first wait for the 93717448d6SSheetal Tigadoli * platform to be initialized after which they are 94717448d6SSheetal Tigadoli * hotplugged in. The primary proceeds to perform the 95717448d6SSheetal Tigadoli * platform initialization. 96717448d6SSheetal Tigadoli * ----------------------------------------------------- 97717448d6SSheetal Tigadoli */ 98717448d6SSheetal Tigadolifunc platform_get_entrypoint 99717448d6SSheetal Tigadoli /*TBD-STINGRAY*/ 100717448d6SSheetal Tigadoli mov x0, #0 101717448d6SSheetal Tigadoli ret 102717448d6SSheetal Tigadoliendfunc platform_get_entrypoint 103717448d6SSheetal Tigadoli 104717448d6SSheetal Tigadoli /* ----------------------------------------------------- 105717448d6SSheetal Tigadoli * void plat_secondary_cold_boot_setup (void); 106717448d6SSheetal Tigadoli * 107717448d6SSheetal Tigadoli * This function performs any platform specific actions 108717448d6SSheetal Tigadoli * needed for a secondary cpu after a cold reset e.g 109717448d6SSheetal Tigadoli * mark the cpu's presence, mechanism to place it in a 110717448d6SSheetal Tigadoli * holding pen etc. 111717448d6SSheetal Tigadoli * ----------------------------------------------------- 112717448d6SSheetal Tigadoli */ 113717448d6SSheetal Tigadolifunc plat_secondary_cold_boot_setup 114717448d6SSheetal Tigadoli bl plat_my_core_pos 115717448d6SSheetal Tigadoli mov_imm x1, SECONDARY_CPU_SPIN_BASE_ADDR 116717448d6SSheetal Tigadoli add x0, x1, x0, LSL #3 117717448d6SSheetal Tigadoli mov x1, #0 118717448d6SSheetal Tigadoli str x1, [x0] 119717448d6SSheetal Tigadoli 120717448d6SSheetal Tigadoli /* Wait until the entrypoint gets populated */ 121717448d6SSheetal Tigadolipoll_mailbox: 122717448d6SSheetal Tigadoli ldr x1, [x0] 123717448d6SSheetal Tigadoli cbz x1, 1f 124717448d6SSheetal Tigadoli br x1 125717448d6SSheetal Tigadoli1: 126717448d6SSheetal Tigadoli wfe 127717448d6SSheetal Tigadoli b poll_mailbox 128717448d6SSheetal Tigadoliendfunc plat_secondary_cold_boot_setup 129717448d6SSheetal Tigadoli 130717448d6SSheetal Tigadoli 131717448d6SSheetal Tigadoli /* ----------------------------------------------------- 132717448d6SSheetal Tigadoli * void platform_mem_init(void); 133717448d6SSheetal Tigadoli * 134717448d6SSheetal Tigadoli * We don't need to carry out any memory initialization 135717448d6SSheetal Tigadoli * on CSS platforms. The Secure RAM is accessible straight away. 136717448d6SSheetal Tigadoli * ----------------------------------------------------- 137717448d6SSheetal Tigadoli */ 138717448d6SSheetal Tigadolifunc platform_mem_init 139717448d6SSheetal Tigadoli /*TBD-STINGRAY*/ 140717448d6SSheetal Tigadoli ret 141717448d6SSheetal Tigadoliendfunc platform_mem_init 142717448d6SSheetal Tigadoli 143717448d6SSheetal Tigadoli /* ----------------------------------------------------- 144717448d6SSheetal Tigadoli * Placeholder function which should be redefined by 145717448d6SSheetal Tigadoli * each platform. 146717448d6SSheetal Tigadoli * ----------------------------------------------------- 147717448d6SSheetal Tigadoli */ 148717448d6SSheetal Tigadolifunc platform_check_mpidr 149717448d6SSheetal Tigadoli /*TBD-STINGRAY*/ 150717448d6SSheetal Tigadoli mov x0, xzr 151717448d6SSheetal Tigadoli ret 152717448d6SSheetal Tigadoliendfunc platform_check_mpidr 153717448d6SSheetal Tigadoli 154717448d6SSheetal Tigadoli /* --------------------------------------------- 155717448d6SSheetal Tigadoli * int plat_crash_console_init(void) 156717448d6SSheetal Tigadoli * Function to initialize the crash console 157717448d6SSheetal Tigadoli * without a C Runtime to print crash report. 158717448d6SSheetal Tigadoli * Clobber list : x0, x1, x2 159717448d6SSheetal Tigadoli * --------------------------------------------- 160717448d6SSheetal Tigadoli */ 161717448d6SSheetal Tigadoli 162717448d6SSheetal Tigadolifunc plat_crash_console_init 163717448d6SSheetal Tigadoli mov_imm x0, BRCM_CRASH_CONSOLE_BASE 164717448d6SSheetal Tigadoli mov_imm x1, BRCM_CRASH_CONSOLE_REFCLK 165717448d6SSheetal Tigadoli mov_imm x2, BRCM_CRASH_CONSOLE_BAUDRATE 166717448d6SSheetal Tigadoli b console_16550_core_init 167717448d6SSheetal Tigadoli ret 168717448d6SSheetal Tigadoliendfunc plat_crash_console_init 169717448d6SSheetal Tigadoli 170717448d6SSheetal Tigadoli /* --------------------------------------------- 171717448d6SSheetal Tigadoli * int plat_crash_console_putc(void) 172717448d6SSheetal Tigadoli * Function to print a character on the crash 173717448d6SSheetal Tigadoli * console without a C Runtime. 174717448d6SSheetal Tigadoli * Clobber list : x1, x2, x3 175717448d6SSheetal Tigadoli * --------------------------------------------- 176717448d6SSheetal Tigadoli */ 177717448d6SSheetal Tigadoli 178717448d6SSheetal Tigadolifunc plat_crash_console_putc 179717448d6SSheetal Tigadoli mov_imm x1, BRCM_CRASH_CONSOLE_BASE 180717448d6SSheetal Tigadoli b console_16550_core_putc 181717448d6SSheetal Tigadoli ret 182717448d6SSheetal Tigadoliendfunc plat_crash_console_putc 183717448d6SSheetal Tigadoli 184717448d6SSheetal Tigadoli /* --------------------------------------------- 185*831b0e98SJimmy Brisson * void plat_crash_console_flush(void) 186717448d6SSheetal Tigadoli * Function to flush crash console 187717448d6SSheetal Tigadoli * Clobber list : x0, x1 188717448d6SSheetal Tigadoli * --------------------------------------------- 189717448d6SSheetal Tigadoli */ 190717448d6SSheetal Tigadolifunc plat_crash_console_flush 191717448d6SSheetal Tigadoli mov_imm x0, BRCM_CRASH_CONSOLE_BASE 192717448d6SSheetal Tigadoli b console_16550_core_flush 193717448d6SSheetal Tigadoli ret 194717448d6SSheetal Tigadoliendfunc plat_crash_console_flush 195717448d6SSheetal Tigadoli 196717448d6SSheetal Tigadoli /* ----------------------------------------------------- 197717448d6SSheetal Tigadoli * Placeholder function which should be redefined by 198717448d6SSheetal Tigadoli * each platform. This function is allowed to use 199717448d6SSheetal Tigadoli * registers x0 - x17. 200717448d6SSheetal Tigadoli * ----------------------------------------------------- 201717448d6SSheetal Tigadoli */ 202717448d6SSheetal Tigadoli 203717448d6SSheetal Tigadolifunc plat_disable_acp 204717448d6SSheetal Tigadoli /*TBD-STINGRAY*/ 205717448d6SSheetal Tigadoli ret 206717448d6SSheetal Tigadoliendfunc plat_disable_acp 207717448d6SSheetal Tigadoli 208717448d6SSheetal Tigadoli /* ----------------------------------------------------- 209717448d6SSheetal Tigadoli * unsigned int plat_is_my_cpu_primary (void); 210717448d6SSheetal Tigadoli * 211717448d6SSheetal Tigadoli * Find out whether the current cpu is the primary 212717448d6SSheetal Tigadoli * cpu (applicable only after a cold boot) 213717448d6SSheetal Tigadoli * ----------------------------------------------------- 214717448d6SSheetal Tigadoli */ 215717448d6SSheetal Tigadolifunc plat_is_my_cpu_primary 216717448d6SSheetal Tigadoli mrs x0, mpidr_el1 217717448d6SSheetal Tigadoli b platform_is_primary_cpu 218717448d6SSheetal Tigadoliendfunc plat_is_my_cpu_primary 219717448d6SSheetal Tigadoli 220717448d6SSheetal Tigadoli /* ----------------------------------------------------- 221717448d6SSheetal Tigadoli * unsigned int plat_my_core_pos(void) 222717448d6SSheetal Tigadoli * This function uses the plat_brcm_calc_core_pos() 223717448d6SSheetal Tigadoli * definition to get the index of the calling CPU. 224717448d6SSheetal Tigadoli * ----------------------------------------------------- 225717448d6SSheetal Tigadoli */ 226717448d6SSheetal Tigadolifunc plat_my_core_pos 227717448d6SSheetal Tigadoli mrs x0, mpidr_el1 228717448d6SSheetal Tigadoli b plat_brcm_calc_core_pos 229717448d6SSheetal Tigadoliendfunc plat_my_core_pos 230717448d6SSheetal Tigadoli 231717448d6SSheetal Tigadoli /* ----------------------------------------------------- 232717448d6SSheetal Tigadoli * unsigned int platform_is_primary_cpu (void); 233717448d6SSheetal Tigadoli * 234717448d6SSheetal Tigadoli * Find out whether the current cpu is the primary 235717448d6SSheetal Tigadoli * cpu (applicable only after a cold boot) 236717448d6SSheetal Tigadoli * ----------------------------------------------------- 237717448d6SSheetal Tigadoli */ 238717448d6SSheetal Tigadolifunc platform_is_primary_cpu 239717448d6SSheetal Tigadoli mov x9, x30 240717448d6SSheetal Tigadoli bl plat_my_core_pos 241717448d6SSheetal Tigadoli cmp x0, #PRIMARY_CPU 242717448d6SSheetal Tigadoli cset x0, eq 243717448d6SSheetal Tigadoli ret x9 244717448d6SSheetal Tigadoliendfunc platform_is_primary_cpu 245717448d6SSheetal Tigadoli 246717448d6SSheetal Tigadoli /* ----------------------------------------------------- 247717448d6SSheetal Tigadoli * unsigned int plat_brcm_calc_core_pos(uint64_t mpidr) 248717448d6SSheetal Tigadoli * Helper function to calculate the core position. 249717448d6SSheetal Tigadoli * With this function: CorePos = (ClusterId * 4) + 250717448d6SSheetal Tigadoli * CoreId 251717448d6SSheetal Tigadoli * ----------------------------------------------------- 252717448d6SSheetal Tigadoli */ 253717448d6SSheetal Tigadolifunc plat_brcm_calc_core_pos 254717448d6SSheetal Tigadoli and x1, x0, #MPIDR_CPU_MASK 255717448d6SSheetal Tigadoli and x0, x0, #MPIDR_CLUSTER_MASK 256717448d6SSheetal Tigadoli add x0, x1, x0, LSR #7 257717448d6SSheetal Tigadoli ret 258717448d6SSheetal Tigadoliendfunc plat_brcm_calc_core_pos 259717448d6SSheetal Tigadoli 260717448d6SSheetal Tigadolifunc plat_get_my_entrypoint 261717448d6SSheetal Tigadoli mrs x0, mpidr_el1 262717448d6SSheetal Tigadoli b platform_get_entrypoint 263717448d6SSheetal Tigadoliendfunc plat_get_my_entrypoint 264