1*6fba6e04STony Xie/* 2*6fba6e04STony Xie * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved. 3*6fba6e04STony Xie * 4*6fba6e04STony Xie * Redistribution and use in source and binary forms, with or without 5*6fba6e04STony Xie * modification, are permitted provided that the following conditions are met: 6*6fba6e04STony Xie * 7*6fba6e04STony Xie * Redistributions of source code must retain the above copyright notice, this 8*6fba6e04STony Xie * list of conditions and the following disclaimer. 9*6fba6e04STony Xie * 10*6fba6e04STony Xie * Redistributions in binary form must reproduce the above copyright notice, 11*6fba6e04STony Xie * this list of conditions and the following disclaimer in the documentation 12*6fba6e04STony Xie * and/or other materials provided with the distribution. 13*6fba6e04STony Xie * 14*6fba6e04STony Xie * Neither the name of ARM nor the names of its contributors may be used 15*6fba6e04STony Xie * to endorse or promote products derived from this software without specific 16*6fba6e04STony Xie * prior written permission. 17*6fba6e04STony Xie * 18*6fba6e04STony Xie * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*6fba6e04STony Xie * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*6fba6e04STony Xie * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*6fba6e04STony Xie * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*6fba6e04STony Xie * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*6fba6e04STony Xie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*6fba6e04STony Xie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*6fba6e04STony Xie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*6fba6e04STony Xie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*6fba6e04STony Xie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*6fba6e04STony Xie * POSSIBILITY OF SUCH DAMAGE. 29*6fba6e04STony Xie */ 30*6fba6e04STony Xie 31*6fba6e04STony Xie#include <arch.h> 32*6fba6e04STony Xie#include <asm_macros.S> 33*6fba6e04STony Xie#include <bl_common.h> 34*6fba6e04STony Xie#include <cortex_a53.h> 35*6fba6e04STony Xie#include <cortex_a72.h> 36*6fba6e04STony Xie#include <plat_private.h> 37*6fba6e04STony Xie#include <platform_def.h> 38*6fba6e04STony Xie 39*6fba6e04STony Xie .globl cpuson_entry_point 40*6fba6e04STony Xie .globl cpuson_flags 41*6fba6e04STony Xie .globl platform_cpu_warmboot 42*6fba6e04STony Xie .globl plat_secondary_cold_boot_setup 43*6fba6e04STony Xie .globl plat_report_exception 44*6fba6e04STony Xie .globl platform_is_primary_cpu 45*6fba6e04STony Xie .globl plat_crash_console_init 46*6fba6e04STony Xie .globl plat_crash_console_putc 47*6fba6e04STony Xie .globl plat_my_core_pos 48*6fba6e04STony Xie .globl plat_reset_handler 49*6fba6e04STony Xie 50*6fba6e04STony Xie 51*6fba6e04STony Xie#define RK_REVISION(rev) RK_PLAT_CFG##rev 52*6fba6e04STony Xie#define RK_HANDLER(rev) plat_reset_handler_juno_r##rev 53*6fba6e04STony Xie#define JUMP_TO_HANDLER_IF_RK_R(revision) \ 54*6fba6e04STony Xie jump_to_handler RK_REVISION(revision), RK_HANDLER(revision) 55*6fba6e04STony Xie 56*6fba6e04STony Xie /* 57*6fba6e04STony Xie * Helper macro to jump to the given handler if the board revision 58*6fba6e04STony Xie * matches. 59*6fba6e04STony Xie * Expects the Juno board revision in x0. 60*6fba6e04STony Xie * 61*6fba6e04STony Xie */ 62*6fba6e04STony Xie .macro jump_to_handler _revision, _handler 63*6fba6e04STony Xie cmp x0, #\_revision 64*6fba6e04STony Xie b.eq \_handler 65*6fba6e04STony Xie .endm 66*6fba6e04STony Xie 67*6fba6e04STony Xie /* 68*6fba6e04STony Xie * Helper macro that reads the part number of the current CPU and jumps 69*6fba6e04STony Xie * to the given label if it matches the CPU MIDR provided. 70*6fba6e04STony Xie */ 71*6fba6e04STony Xie .macro jump_if_cpu_midr _cpu_midr, _label 72*6fba6e04STony Xie mrs x0, midr_el1 73*6fba6e04STony Xie ubfx x0, x0, MIDR_PN_SHIFT, #12 74*6fba6e04STony Xie cmp w0, #((\_cpu_midr >> MIDR_PN_SHIFT) & MIDR_PN_MASK) 75*6fba6e04STony Xie b.eq \_label 76*6fba6e04STony Xie .endm 77*6fba6e04STony Xie 78*6fba6e04STony Xie /* 79*6fba6e04STony Xie * Platform reset handler for rockchip. 80*6fba6e04STony Xie * only A53 cores 81*6fba6e04STony Xie */ 82*6fba6e04STony Xiefunc RK_HANDLER(0) 83*6fba6e04STony Xie ret 84*6fba6e04STony Xieendfunc RK_HANDLER(0) 85*6fba6e04STony Xie 86*6fba6e04STony Xie /* 87*6fba6e04STony Xie * Platform reset handler for rockchip. 88*6fba6e04STony Xie * - Cortex-A53 processor cluster; 89*6fba6e04STony Xie * - Cortex-A72 processor cluster. 90*6fba6e04STony Xie * 91*6fba6e04STony Xie * This handler does the following: 92*6fba6e04STony Xie * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A72 93*6fba6e04STony Xie * - Set the L2 Tag RAM latency to 1 (i.e. 2 cycles) for Cortex-A72 94*6fba6e04STony Xie */ 95*6fba6e04STony Xiefunc RK_HANDLER(1) 96*6fba6e04STony Xie /* 97*6fba6e04STony Xie * Nothing to do on Cortex-A53. 98*6fba6e04STony Xie * 99*6fba6e04STony Xie */ 100*6fba6e04STony Xie jump_if_cpu_midr CORTEX_A72_MIDR, A72 101*6fba6e04STony Xie ret 102*6fba6e04STony Xie 103*6fba6e04STony XieA72: 104*6fba6e04STony Xie /* Cortex-A72 specific settings */ 105*6fba6e04STony Xie mov x0, #((2 << L2CTLR_DATA_RAM_LATENCY_SHIFT) | \ 106*6fba6e04STony Xie (0x1 << 5)) 107*6fba6e04STony Xie msr L2CTLR_EL1, x0 108*6fba6e04STony Xie isb 109*6fba6e04STony Xie ret 110*6fba6e04STony Xieendfunc RK_HANDLER(1) 111*6fba6e04STony Xie 112*6fba6e04STony Xie /* 113*6fba6e04STony Xie * void plat_reset_handler(void); 114*6fba6e04STony Xie * 115*6fba6e04STony Xie * Determine the SOC type and call the appropriate reset 116*6fba6e04STony Xie * handler. 117*6fba6e04STony Xie * 118*6fba6e04STony Xie */ 119*6fba6e04STony Xiefunc plat_reset_handler 120*6fba6e04STony Xie 121*6fba6e04STony Xie mov x0, RK_PLAT_AARCH_CFG 122*6fba6e04STony Xie 123*6fba6e04STony Xie JUMP_TO_HANDLER_IF_RK_R(0) 124*6fba6e04STony Xie JUMP_TO_HANDLER_IF_RK_R(1) 125*6fba6e04STony Xie 126*6fba6e04STony Xie /* SOC type is not supported */ 127*6fba6e04STony Xienot_supported: 128*6fba6e04STony Xie b not_supported 129*6fba6e04STony Xieendfunc plat_reset_handler 130*6fba6e04STony Xie 131*6fba6e04STony Xiefunc plat_my_core_pos 132*6fba6e04STony Xie mrs x0, mpidr_el1 133*6fba6e04STony Xie and x1, x0, #MPIDR_CPU_MASK 134*6fba6e04STony Xie and x0, x0, #MPIDR_CLUSTER_MASK 135*6fba6e04STony Xie add x0, x1, x0, LSR #6 136*6fba6e04STony Xie ret 137*6fba6e04STony Xieendfunc plat_my_core_pos 138*6fba6e04STony Xie 139*6fba6e04STony Xie /* -------------------------------------------------------------------- 140*6fba6e04STony Xie * void plat_secondary_cold_boot_setup (void); 141*6fba6e04STony Xie * 142*6fba6e04STony Xie * This function performs any platform specific actions 143*6fba6e04STony Xie * needed for a secondary cpu after a cold reset e.g 144*6fba6e04STony Xie * mark the cpu's presence, mechanism to place it in a 145*6fba6e04STony Xie * holding pen etc. 146*6fba6e04STony Xie * -------------------------------------------------------------------- 147*6fba6e04STony Xie */ 148*6fba6e04STony Xiefunc plat_secondary_cold_boot_setup 149*6fba6e04STony Xie /* rk3368 does not do cold boot for secondary CPU */ 150*6fba6e04STony Xiecb_panic: 151*6fba6e04STony Xie b cb_panic 152*6fba6e04STony Xieendfunc plat_secondary_cold_boot_setup 153*6fba6e04STony Xie 154*6fba6e04STony Xiefunc platform_is_primary_cpu 155*6fba6e04STony Xie and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 156*6fba6e04STony Xie cmp x0, #PLAT_RK_PRIMARY_CPU 157*6fba6e04STony Xie cset x0, eq 158*6fba6e04STony Xie ret 159*6fba6e04STony Xieendfunc platform_is_primary_cpu 160*6fba6e04STony Xie 161*6fba6e04STony Xie /* -------------------------------------------------------------------- 162*6fba6e04STony Xie * int plat_crash_console_init(void) 163*6fba6e04STony Xie * Function to initialize the crash console 164*6fba6e04STony Xie * without a C Runtime to print crash report. 165*6fba6e04STony Xie * Clobber list : x0, x1, x2 166*6fba6e04STony Xie * -------------------------------------------------------------------- 167*6fba6e04STony Xie */ 168*6fba6e04STony Xiefunc plat_crash_console_init 169*6fba6e04STony Xie mov_imm x0, PLAT_RK_UART_BASE 170*6fba6e04STony Xie mov_imm x1, PLAT_RK_UART_CLOCK 171*6fba6e04STony Xie mov_imm x2, PLAT_RK_UART_BAUDRATE 172*6fba6e04STony Xie b console_core_init 173*6fba6e04STony Xieendfunc plat_crash_console_init 174*6fba6e04STony Xie 175*6fba6e04STony Xie /* -------------------------------------------------------------------- 176*6fba6e04STony Xie * int plat_crash_console_putc(void) 177*6fba6e04STony Xie * Function to print a character on the crash 178*6fba6e04STony Xie * console without a C Runtime. 179*6fba6e04STony Xie * Clobber list : x1, x2 180*6fba6e04STony Xie * -------------------------------------------------------------------- 181*6fba6e04STony Xie */ 182*6fba6e04STony Xiefunc plat_crash_console_putc 183*6fba6e04STony Xie mov_imm x1, PLAT_RK_UART_BASE 184*6fba6e04STony Xie b console_core_putc 185*6fba6e04STony Xieendfunc plat_crash_console_putc 186*6fba6e04STony Xie 187*6fba6e04STony Xie /* -------------------------------------------------------------------- 188*6fba6e04STony Xie * void platform_cpu_warmboot (void); 189*6fba6e04STony Xie * cpus online or resume enterpoint 190*6fba6e04STony Xie * -------------------------------------------------------------------- 191*6fba6e04STony Xie */ 192*6fba6e04STony Xiefunc platform_cpu_warmboot 193*6fba6e04STony Xie mrs x0, MPIDR_EL1 194*6fba6e04STony Xie and x1, x0, #MPIDR_CPU_MASK 195*6fba6e04STony Xie and x0, x0, #MPIDR_CLUSTER_MASK 196*6fba6e04STony Xie /* -------------------------------------------------------------------- 197*6fba6e04STony Xie * big cluster id is 1 198*6fba6e04STony Xie * big cores id is from 0-3, little cores id 4-7 199*6fba6e04STony Xie * -------------------------------------------------------------------- 200*6fba6e04STony Xie */ 201*6fba6e04STony Xie add x0, x1, x0, lsr #6 202*6fba6e04STony Xie /* -------------------------------------------------------------------- 203*6fba6e04STony Xie * get per cpuup flag 204*6fba6e04STony Xie * -------------------------------------------------------------------- 205*6fba6e04STony Xie */ 206*6fba6e04STony Xie adr x4, cpuson_flags 207*6fba6e04STony Xie add x4, x4, x0, lsl #2 208*6fba6e04STony Xie ldr w1, [x4] 209*6fba6e04STony Xie /* -------------------------------------------------------------------- 210*6fba6e04STony Xie * get per cpuup boot addr 211*6fba6e04STony Xie * -------------------------------------------------------------------- 212*6fba6e04STony Xie */ 213*6fba6e04STony Xie adr x5, cpuson_entry_point 214*6fba6e04STony Xie ldr x2, [x5, x0, lsl #3] 215*6fba6e04STony Xie /* -------------------------------------------------------------------- 216*6fba6e04STony Xie * check cpuon reason 217*6fba6e04STony Xie * -------------------------------------------------------------------- 218*6fba6e04STony Xie */ 219*6fba6e04STony Xie ldr w3, =PMU_CPU_AUTO_PWRDN 220*6fba6e04STony Xie cmp w1, w3 221*6fba6e04STony Xie b.eq boot_entry 222*6fba6e04STony Xie ldr w3, =PMU_CPU_HOTPLUG 223*6fba6e04STony Xie cmp w1, w3 224*6fba6e04STony Xie b.eq boot_entry 225*6fba6e04STony Xie /* -------------------------------------------------------------------- 226*6fba6e04STony Xie * If the boot core cpuson_flags or cpuson_entry_point is not 227*6fba6e04STony Xie * expection. force the core into wfe. 228*6fba6e04STony Xie * -------------------------------------------------------------------- 229*6fba6e04STony Xie */ 230*6fba6e04STony Xiewfe_loop: 231*6fba6e04STony Xie wfe 232*6fba6e04STony Xie b wfe_loop 233*6fba6e04STony Xieboot_entry: 234*6fba6e04STony Xie mov w0, #0 235*6fba6e04STony Xie str w0, [x4] 236*6fba6e04STony Xie br x2 237*6fba6e04STony Xieendfunc platform_cpu_warmboot 238*6fba6e04STony Xie 239*6fba6e04STony Xie /* -------------------------------------------------------------------- 240*6fba6e04STony Xie * Per-CPU Secure entry point - resume or power up 241*6fba6e04STony Xie * -------------------------------------------------------------------- 242*6fba6e04STony Xie */ 243*6fba6e04STony Xie .section tzfw_coherent_mem, "a" 244*6fba6e04STony Xie .align 3 245*6fba6e04STony Xiecpuson_entry_point: 246*6fba6e04STony Xie .rept PLATFORM_CORE_COUNT 247*6fba6e04STony Xie .quad 0 248*6fba6e04STony Xie .endr 249*6fba6e04STony Xiecpuson_flags: 250*6fba6e04STony Xie .rept PLATFORM_CORE_COUNT 251*6fba6e04STony Xie .quad 0 252*6fba6e04STony Xie .endr 253