1*717448d6SSheetal Tigadoli/* 2*717448d6SSheetal Tigadoli * Copyright (c) 2015-2020, Broadcom 3*717448d6SSheetal Tigadoli * 4*717448d6SSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause 5*717448d6SSheetal Tigadoli */ 6*717448d6SSheetal Tigadoli 7*717448d6SSheetal Tigadoli#include <arch.h> 8*717448d6SSheetal Tigadoli#include <asm_macros.S> 9*717448d6SSheetal Tigadoli#include <assert_macros.S> 10*717448d6SSheetal Tigadoli#include <cpu_macros.S> 11*717448d6SSheetal Tigadoli#include <cortex_a72.h> 12*717448d6SSheetal Tigadoli#include <drivers/ti/uart/uart_16550.h> 13*717448d6SSheetal Tigadoli 14*717448d6SSheetal Tigadoli#include <platform_def.h> 15*717448d6SSheetal Tigadoli 16*717448d6SSheetal Tigadoli .globl plat_reset_handler 17*717448d6SSheetal Tigadoli .globl platform_get_entrypoint 18*717448d6SSheetal Tigadoli .globl plat_secondary_cold_boot_setup 19*717448d6SSheetal Tigadoli .globl platform_mem_init 20*717448d6SSheetal Tigadoli .globl platform_check_mpidr 21*717448d6SSheetal Tigadoli .globl plat_crash_console_init 22*717448d6SSheetal Tigadoli .globl plat_crash_console_putc 23*717448d6SSheetal Tigadoli .globl plat_crash_console_flush 24*717448d6SSheetal Tigadoli .globl plat_disable_acp 25*717448d6SSheetal Tigadoli .globl plat_is_my_cpu_primary 26*717448d6SSheetal Tigadoli .globl plat_my_core_pos 27*717448d6SSheetal Tigadoli .globl platform_is_primary_cpu 28*717448d6SSheetal Tigadoli .globl plat_brcm_calc_core_pos 29*717448d6SSheetal Tigadoli .globl plat_get_my_entrypoint 30*717448d6SSheetal Tigadoli 31*717448d6SSheetal Tigadoli 32*717448d6SSheetal Tigadoli /* ------------------------------------------------------------ 33*717448d6SSheetal Tigadoli * void plat_l2_init(void); 34*717448d6SSheetal Tigadoli * 35*717448d6SSheetal Tigadoli * BL1 and BL2 run with one core, one cluster 36*717448d6SSheetal Tigadoli * This is safe to disable cluster coherency 37*717448d6SSheetal Tigadoli * to make use of the data cache MMU WB attribute 38*717448d6SSheetal Tigadoli * for the SRAM. 39*717448d6SSheetal Tigadoli * 40*717448d6SSheetal Tigadoli * Set L2 Auxiliary Control Register 41*717448d6SSheetal Tigadoli * -------------------------------------------------------------------- 42*717448d6SSheetal Tigadoli */ 43*717448d6SSheetal Tigadolifunc plat_l2_init 44*717448d6SSheetal Tigadoli mrs x0, CORTEX_A72_L2ACTLR_EL1 45*717448d6SSheetal Tigadoli#if (IMAGE_BL1 || IMAGE_BL2) || defined(USE_SINGLE_CLUSTER) 46*717448d6SSheetal Tigadoli orr x0, x0, #CORTEX_A72_L2ACTLR_DISABLE_ACE_SH_OR_CHI 47*717448d6SSheetal Tigadoli#else 48*717448d6SSheetal Tigadoli bic x0, x0, #CORTEX_A72_L2ACTLR_DISABLE_ACE_SH_OR_CHI 49*717448d6SSheetal Tigadoli#endif 50*717448d6SSheetal Tigadoli msr CORTEX_A72_L2ACTLR_EL1, x0 51*717448d6SSheetal Tigadoli 52*717448d6SSheetal Tigadoli /* Set L2 Control Register */ 53*717448d6SSheetal Tigadoli mrs x0, CORTEX_A72_L2CTLR_EL1 54*717448d6SSheetal Tigadoli mov x1, #((CORTEX_A72_L2_DATA_RAM_LATENCY_MASK << \ 55*717448d6SSheetal Tigadoli CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \ 56*717448d6SSheetal Tigadoli (CORTEX_A72_L2_TAG_RAM_LATENCY_MASK << \ 57*717448d6SSheetal Tigadoli CORTEX_A72_L2CTLR_TAG_RAM_LATENCY_SHIFT) | \ 58*717448d6SSheetal Tigadoli (U(0x1) << CORTEX_A72_L2CTLR_TAG_RAM_SETUP_SHIFT) | \ 59*717448d6SSheetal Tigadoli (U(0x1) << CORTEX_A72_L2CTLR_DATA_RAM_SETUP_SHIFT)) 60*717448d6SSheetal Tigadoli bic x0, x0, x1 61*717448d6SSheetal Tigadoli mov x1, #((CORTEX_A72_L2_DATA_RAM_LATENCY_3_CYCLES << \ 62*717448d6SSheetal Tigadoli CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \ 63*717448d6SSheetal Tigadoli (U(0x1) << CORTEX_A72_L2CTLR_TAG_RAM_SETUP_SHIFT) | \ 64*717448d6SSheetal Tigadoli (U(0x1) << CORTEX_A72_L2CTLR_DATA_RAM_SETUP_SHIFT)) 65*717448d6SSheetal Tigadoli orr x0, x0, x1 66*717448d6SSheetal Tigadoli msr CORTEX_A72_L2CTLR_EL1, x0 67*717448d6SSheetal Tigadoli 68*717448d6SSheetal Tigadoli isb 69*717448d6SSheetal Tigadoli ret 70*717448d6SSheetal Tigadoliendfunc plat_l2_init 71*717448d6SSheetal Tigadoli 72*717448d6SSheetal Tigadoli /* -------------------------------------------------------------------- 73*717448d6SSheetal Tigadoli * void plat_reset_handler(void); 74*717448d6SSheetal Tigadoli * 75*717448d6SSheetal Tigadoli * Before adding code in this function, refer to the guidelines in 76*717448d6SSheetal Tigadoli * docs/firmware-design.md. 77*717448d6SSheetal Tigadoli * 78*717448d6SSheetal Tigadoli * -------------------------------------------------------------------- 79*717448d6SSheetal Tigadoli */ 80*717448d6SSheetal Tigadolifunc plat_reset_handler 81*717448d6SSheetal Tigadoli mov x9, x30 82*717448d6SSheetal Tigadoli bl plat_l2_init 83*717448d6SSheetal Tigadoli mov x30, x9 84*717448d6SSheetal Tigadoli ret 85*717448d6SSheetal Tigadoliendfunc plat_reset_handler 86*717448d6SSheetal Tigadoli 87*717448d6SSheetal Tigadoli /* ----------------------------------------------------- 88*717448d6SSheetal Tigadoli * void platform_get_entrypoint (unsigned int mpid); 89*717448d6SSheetal Tigadoli * 90*717448d6SSheetal Tigadoli * Main job of this routine is to distinguish between 91*717448d6SSheetal Tigadoli * a cold and warm boot. 92*717448d6SSheetal Tigadoli * On a cold boot the secondaries first wait for the 93*717448d6SSheetal Tigadoli * platform to be initialized after which they are 94*717448d6SSheetal Tigadoli * hotplugged in. The primary proceeds to perform the 95*717448d6SSheetal Tigadoli * platform initialization. 96*717448d6SSheetal Tigadoli * ----------------------------------------------------- 97*717448d6SSheetal Tigadoli */ 98*717448d6SSheetal Tigadolifunc platform_get_entrypoint 99*717448d6SSheetal Tigadoli /*TBD-STINGRAY*/ 100*717448d6SSheetal Tigadoli mov x0, #0 101*717448d6SSheetal Tigadoli ret 102*717448d6SSheetal Tigadoliendfunc platform_get_entrypoint 103*717448d6SSheetal Tigadoli 104*717448d6SSheetal Tigadoli /* ----------------------------------------------------- 105*717448d6SSheetal Tigadoli * void plat_secondary_cold_boot_setup (void); 106*717448d6SSheetal Tigadoli * 107*717448d6SSheetal Tigadoli * This function performs any platform specific actions 108*717448d6SSheetal Tigadoli * needed for a secondary cpu after a cold reset e.g 109*717448d6SSheetal Tigadoli * mark the cpu's presence, mechanism to place it in a 110*717448d6SSheetal Tigadoli * holding pen etc. 111*717448d6SSheetal Tigadoli * ----------------------------------------------------- 112*717448d6SSheetal Tigadoli */ 113*717448d6SSheetal Tigadolifunc plat_secondary_cold_boot_setup 114*717448d6SSheetal Tigadoli bl plat_my_core_pos 115*717448d6SSheetal Tigadoli mov_imm x1, SECONDARY_CPU_SPIN_BASE_ADDR 116*717448d6SSheetal Tigadoli add x0, x1, x0, LSL #3 117*717448d6SSheetal Tigadoli mov x1, #0 118*717448d6SSheetal Tigadoli str x1, [x0] 119*717448d6SSheetal Tigadoli 120*717448d6SSheetal Tigadoli /* Wait until the entrypoint gets populated */ 121*717448d6SSheetal Tigadolipoll_mailbox: 122*717448d6SSheetal Tigadoli ldr x1, [x0] 123*717448d6SSheetal Tigadoli cbz x1, 1f 124*717448d6SSheetal Tigadoli br x1 125*717448d6SSheetal Tigadoli1: 126*717448d6SSheetal Tigadoli wfe 127*717448d6SSheetal Tigadoli b poll_mailbox 128*717448d6SSheetal Tigadoliendfunc plat_secondary_cold_boot_setup 129*717448d6SSheetal Tigadoli 130*717448d6SSheetal Tigadoli 131*717448d6SSheetal Tigadoli /* ----------------------------------------------------- 132*717448d6SSheetal Tigadoli * void platform_mem_init(void); 133*717448d6SSheetal Tigadoli * 134*717448d6SSheetal Tigadoli * We don't need to carry out any memory initialization 135*717448d6SSheetal Tigadoli * on CSS platforms. The Secure RAM is accessible straight away. 136*717448d6SSheetal Tigadoli * ----------------------------------------------------- 137*717448d6SSheetal Tigadoli */ 138*717448d6SSheetal Tigadolifunc platform_mem_init 139*717448d6SSheetal Tigadoli /*TBD-STINGRAY*/ 140*717448d6SSheetal Tigadoli ret 141*717448d6SSheetal Tigadoliendfunc platform_mem_init 142*717448d6SSheetal Tigadoli 143*717448d6SSheetal Tigadoli /* ----------------------------------------------------- 144*717448d6SSheetal Tigadoli * Placeholder function which should be redefined by 145*717448d6SSheetal Tigadoli * each platform. 146*717448d6SSheetal Tigadoli * ----------------------------------------------------- 147*717448d6SSheetal Tigadoli */ 148*717448d6SSheetal Tigadolifunc platform_check_mpidr 149*717448d6SSheetal Tigadoli /*TBD-STINGRAY*/ 150*717448d6SSheetal Tigadoli mov x0, xzr 151*717448d6SSheetal Tigadoli ret 152*717448d6SSheetal Tigadoliendfunc platform_check_mpidr 153*717448d6SSheetal Tigadoli 154*717448d6SSheetal Tigadoli /* --------------------------------------------- 155*717448d6SSheetal Tigadoli * int plat_crash_console_init(void) 156*717448d6SSheetal Tigadoli * Function to initialize the crash console 157*717448d6SSheetal Tigadoli * without a C Runtime to print crash report. 158*717448d6SSheetal Tigadoli * Clobber list : x0, x1, x2 159*717448d6SSheetal Tigadoli * --------------------------------------------- 160*717448d6SSheetal Tigadoli */ 161*717448d6SSheetal Tigadoli 162*717448d6SSheetal Tigadolifunc plat_crash_console_init 163*717448d6SSheetal Tigadoli mov_imm x0, BRCM_CRASH_CONSOLE_BASE 164*717448d6SSheetal Tigadoli mov_imm x1, BRCM_CRASH_CONSOLE_REFCLK 165*717448d6SSheetal Tigadoli mov_imm x2, BRCM_CRASH_CONSOLE_BAUDRATE 166*717448d6SSheetal Tigadoli b console_16550_core_init 167*717448d6SSheetal Tigadoli ret 168*717448d6SSheetal Tigadoliendfunc plat_crash_console_init 169*717448d6SSheetal Tigadoli 170*717448d6SSheetal Tigadoli /* --------------------------------------------- 171*717448d6SSheetal Tigadoli * int plat_crash_console_putc(void) 172*717448d6SSheetal Tigadoli * Function to print a character on the crash 173*717448d6SSheetal Tigadoli * console without a C Runtime. 174*717448d6SSheetal Tigadoli * Clobber list : x1, x2, x3 175*717448d6SSheetal Tigadoli * --------------------------------------------- 176*717448d6SSheetal Tigadoli */ 177*717448d6SSheetal Tigadoli 178*717448d6SSheetal Tigadolifunc plat_crash_console_putc 179*717448d6SSheetal Tigadoli mov_imm x1, BRCM_CRASH_CONSOLE_BASE 180*717448d6SSheetal Tigadoli b console_16550_core_putc 181*717448d6SSheetal Tigadoli ret 182*717448d6SSheetal Tigadoliendfunc plat_crash_console_putc 183*717448d6SSheetal Tigadoli 184*717448d6SSheetal Tigadoli /* --------------------------------------------- 185*717448d6SSheetal Tigadoli * int plat_crash_console_flush(void) 186*717448d6SSheetal Tigadoli * Function to flush crash console 187*717448d6SSheetal Tigadoli * Clobber list : x0, x1 188*717448d6SSheetal Tigadoli * --------------------------------------------- 189*717448d6SSheetal Tigadoli */ 190*717448d6SSheetal Tigadolifunc plat_crash_console_flush 191*717448d6SSheetal Tigadoli mov_imm x0, BRCM_CRASH_CONSOLE_BASE 192*717448d6SSheetal Tigadoli b console_16550_core_flush 193*717448d6SSheetal Tigadoli ret 194*717448d6SSheetal Tigadoliendfunc plat_crash_console_flush 195*717448d6SSheetal Tigadoli 196*717448d6SSheetal Tigadoli /* ----------------------------------------------------- 197*717448d6SSheetal Tigadoli * Placeholder function which should be redefined by 198*717448d6SSheetal Tigadoli * each platform. This function is allowed to use 199*717448d6SSheetal Tigadoli * registers x0 - x17. 200*717448d6SSheetal Tigadoli * ----------------------------------------------------- 201*717448d6SSheetal Tigadoli */ 202*717448d6SSheetal Tigadoli 203*717448d6SSheetal Tigadolifunc plat_disable_acp 204*717448d6SSheetal Tigadoli /*TBD-STINGRAY*/ 205*717448d6SSheetal Tigadoli ret 206*717448d6SSheetal Tigadoliendfunc plat_disable_acp 207*717448d6SSheetal Tigadoli 208*717448d6SSheetal Tigadoli /* ----------------------------------------------------- 209*717448d6SSheetal Tigadoli * unsigned int plat_is_my_cpu_primary (void); 210*717448d6SSheetal Tigadoli * 211*717448d6SSheetal Tigadoli * Find out whether the current cpu is the primary 212*717448d6SSheetal Tigadoli * cpu (applicable only after a cold boot) 213*717448d6SSheetal Tigadoli * ----------------------------------------------------- 214*717448d6SSheetal Tigadoli */ 215*717448d6SSheetal Tigadolifunc plat_is_my_cpu_primary 216*717448d6SSheetal Tigadoli mrs x0, mpidr_el1 217*717448d6SSheetal Tigadoli b platform_is_primary_cpu 218*717448d6SSheetal Tigadoliendfunc plat_is_my_cpu_primary 219*717448d6SSheetal Tigadoli 220*717448d6SSheetal Tigadoli /* ----------------------------------------------------- 221*717448d6SSheetal Tigadoli * unsigned int plat_my_core_pos(void) 222*717448d6SSheetal Tigadoli * This function uses the plat_brcm_calc_core_pos() 223*717448d6SSheetal Tigadoli * definition to get the index of the calling CPU. 224*717448d6SSheetal Tigadoli * ----------------------------------------------------- 225*717448d6SSheetal Tigadoli */ 226*717448d6SSheetal Tigadolifunc plat_my_core_pos 227*717448d6SSheetal Tigadoli mrs x0, mpidr_el1 228*717448d6SSheetal Tigadoli b plat_brcm_calc_core_pos 229*717448d6SSheetal Tigadoliendfunc plat_my_core_pos 230*717448d6SSheetal Tigadoli 231*717448d6SSheetal Tigadoli /* ----------------------------------------------------- 232*717448d6SSheetal Tigadoli * unsigned int platform_is_primary_cpu (void); 233*717448d6SSheetal Tigadoli * 234*717448d6SSheetal Tigadoli * Find out whether the current cpu is the primary 235*717448d6SSheetal Tigadoli * cpu (applicable only after a cold boot) 236*717448d6SSheetal Tigadoli * ----------------------------------------------------- 237*717448d6SSheetal Tigadoli */ 238*717448d6SSheetal Tigadolifunc platform_is_primary_cpu 239*717448d6SSheetal Tigadoli mov x9, x30 240*717448d6SSheetal Tigadoli bl plat_my_core_pos 241*717448d6SSheetal Tigadoli cmp x0, #PRIMARY_CPU 242*717448d6SSheetal Tigadoli cset x0, eq 243*717448d6SSheetal Tigadoli ret x9 244*717448d6SSheetal Tigadoliendfunc platform_is_primary_cpu 245*717448d6SSheetal Tigadoli 246*717448d6SSheetal Tigadoli /* ----------------------------------------------------- 247*717448d6SSheetal Tigadoli * unsigned int plat_brcm_calc_core_pos(uint64_t mpidr) 248*717448d6SSheetal Tigadoli * Helper function to calculate the core position. 249*717448d6SSheetal Tigadoli * With this function: CorePos = (ClusterId * 4) + 250*717448d6SSheetal Tigadoli * CoreId 251*717448d6SSheetal Tigadoli * ----------------------------------------------------- 252*717448d6SSheetal Tigadoli */ 253*717448d6SSheetal Tigadolifunc plat_brcm_calc_core_pos 254*717448d6SSheetal Tigadoli and x1, x0, #MPIDR_CPU_MASK 255*717448d6SSheetal Tigadoli and x0, x0, #MPIDR_CLUSTER_MASK 256*717448d6SSheetal Tigadoli add x0, x1, x0, LSR #7 257*717448d6SSheetal Tigadoli ret 258*717448d6SSheetal Tigadoliendfunc plat_brcm_calc_core_pos 259*717448d6SSheetal Tigadoli 260*717448d6SSheetal Tigadolifunc plat_get_my_entrypoint 261*717448d6SSheetal Tigadoli mrs x0, mpidr_el1 262*717448d6SSheetal Tigadoli b platform_get_entrypoint 263*717448d6SSheetal Tigadoliendfunc plat_get_my_entrypoint 264