1*91f16700Schasinglulu/* 2*91f16700Schasinglulu * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu#include <platform_def.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu#include <arch.h> 10*91f16700Schasinglulu#include <asm_macros.S> 11*91f16700Schasinglulu#include <common/bl_common.h> 12*91f16700Schasinglulu#include <cortex_a12.h> 13*91f16700Schasinglulu#include <plat_private.h> 14*91f16700Schasinglulu#include <plat_pmu_macros.S> 15*91f16700Schasinglulu 16*91f16700Schasinglulu .globl cpuson_entry_point 17*91f16700Schasinglulu .globl cpuson_flags 18*91f16700Schasinglulu .globl platform_cpu_warmboot 19*91f16700Schasinglulu .globl plat_secondary_cold_boot_setup 20*91f16700Schasinglulu .globl plat_report_exception 21*91f16700Schasinglulu .globl plat_is_my_cpu_primary 22*91f16700Schasinglulu .globl plat_my_core_pos 23*91f16700Schasinglulu .globl plat_reset_handler 24*91f16700Schasinglulu .globl plat_panic_handler 25*91f16700Schasinglulu 26*91f16700Schasinglulu /* 27*91f16700Schasinglulu * void plat_reset_handler(void); 28*91f16700Schasinglulu * 29*91f16700Schasinglulu * Determine the SOC type and call the appropriate reset 30*91f16700Schasinglulu * handler. 31*91f16700Schasinglulu * 32*91f16700Schasinglulu */ 33*91f16700Schasinglulufunc plat_reset_handler 34*91f16700Schasinglulu bx lr 35*91f16700Schasingluluendfunc plat_reset_handler 36*91f16700Schasinglulu 37*91f16700Schasinglulufunc plat_my_core_pos 38*91f16700Schasinglulu ldcopr r0, MPIDR 39*91f16700Schasinglulu and r1, r0, #MPIDR_CPU_MASK 40*91f16700Schasinglulu#ifdef PLAT_RK_MPIDR_CLUSTER_MASK 41*91f16700Schasinglulu and r0, r0, #PLAT_RK_MPIDR_CLUSTER_MASK 42*91f16700Schasinglulu#else 43*91f16700Schasinglulu and r0, r0, #MPIDR_CLUSTER_MASK 44*91f16700Schasinglulu#endif 45*91f16700Schasinglulu add r0, r1, r0, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT 46*91f16700Schasinglulu bx lr 47*91f16700Schasingluluendfunc plat_my_core_pos 48*91f16700Schasinglulu 49*91f16700Schasinglulu /* -------------------------------------------------------------------- 50*91f16700Schasinglulu * void plat_secondary_cold_boot_setup (void); 51*91f16700Schasinglulu * 52*91f16700Schasinglulu * This function performs any platform specific actions 53*91f16700Schasinglulu * needed for a secondary cpu after a cold reset e.g 54*91f16700Schasinglulu * mark the cpu's presence, mechanism to place it in a 55*91f16700Schasinglulu * holding pen etc. 56*91f16700Schasinglulu * -------------------------------------------------------------------- 57*91f16700Schasinglulu */ 58*91f16700Schasinglulufunc plat_secondary_cold_boot_setup 59*91f16700Schasinglulu /* rk3288 does not do cold boot for secondary CPU */ 60*91f16700Schasinglulucb_panic: 61*91f16700Schasinglulu b cb_panic 62*91f16700Schasingluluendfunc plat_secondary_cold_boot_setup 63*91f16700Schasinglulu 64*91f16700Schasinglulufunc plat_is_my_cpu_primary 65*91f16700Schasinglulu ldcopr r0, MPIDR 66*91f16700Schasinglulu#ifdef PLAT_RK_MPIDR_CLUSTER_MASK 67*91f16700Schasinglulu ldr r1, =(PLAT_RK_MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 68*91f16700Schasinglulu#else 69*91f16700Schasinglulu ldr r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 70*91f16700Schasinglulu#endif 71*91f16700Schasinglulu and r0, r1 72*91f16700Schasinglulu cmp r0, #PLAT_RK_PRIMARY_CPU 73*91f16700Schasinglulu moveq r0, #1 74*91f16700Schasinglulu movne r0, #0 75*91f16700Schasinglulu bx lr 76*91f16700Schasingluluendfunc plat_is_my_cpu_primary 77*91f16700Schasinglulu 78*91f16700Schasinglulu /* -------------------------------------------------------------------- 79*91f16700Schasinglulu * void plat_panic_handler(void) 80*91f16700Schasinglulu * Call system reset function on panic. Set up an emergency stack so we 81*91f16700Schasinglulu * can run C functions (it only needs to last for a few calls until we 82*91f16700Schasinglulu * reboot anyway). 83*91f16700Schasinglulu * -------------------------------------------------------------------- 84*91f16700Schasinglulu */ 85*91f16700Schasinglulufunc plat_panic_handler 86*91f16700Schasinglulu bl plat_set_my_stack 87*91f16700Schasinglulu b rockchip_soc_soft_reset 88*91f16700Schasingluluendfunc plat_panic_handler 89*91f16700Schasinglulu 90*91f16700Schasinglulu /* -------------------------------------------------------------------- 91*91f16700Schasinglulu * void platform_cpu_warmboot (void); 92*91f16700Schasinglulu * cpus online or resume entrypoint 93*91f16700Schasinglulu * -------------------------------------------------------------------- 94*91f16700Schasinglulu */ 95*91f16700Schasinglulufunc platform_cpu_warmboot _align=16 96*91f16700Schasinglulu push { r4 - r7, lr } 97*91f16700Schasinglulu ldcopr r0, MPIDR 98*91f16700Schasinglulu and r5, r0, #MPIDR_CPU_MASK 99*91f16700Schasinglulu#ifdef PLAT_RK_MPIDR_CLUSTER_MASK 100*91f16700Schasinglulu and r6, r0, #PLAT_RK_MPIDR_CLUSTER_MASK 101*91f16700Schasinglulu#else 102*91f16700Schasinglulu and r6, r0, #MPIDR_CLUSTER_MASK 103*91f16700Schasinglulu#endif 104*91f16700Schasinglulu mov r0, r6 105*91f16700Schasinglulu 106*91f16700Schasinglulu func_rockchip_clst_warmboot 107*91f16700Schasinglulu /* -------------------------------------------------------------------- 108*91f16700Schasinglulu * big cluster id is 1 109*91f16700Schasinglulu * big cores id is from 0-3, little cores id 4-7 110*91f16700Schasinglulu * -------------------------------------------------------------------- 111*91f16700Schasinglulu */ 112*91f16700Schasinglulu add r7, r5, r6, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT 113*91f16700Schasinglulu /* -------------------------------------------------------------------- 114*91f16700Schasinglulu * get per cpuup flag 115*91f16700Schasinglulu * -------------------------------------------------------------------- 116*91f16700Schasinglulu */ 117*91f16700Schasinglulu ldr r4, =cpuson_flags 118*91f16700Schasinglulu add r4, r4, r7, lsl #2 119*91f16700Schasinglulu ldr r1, [r4] 120*91f16700Schasinglulu /* -------------------------------------------------------------------- 121*91f16700Schasinglulu * check cpuon reason 122*91f16700Schasinglulu * -------------------------------------------------------------------- 123*91f16700Schasinglulu */ 124*91f16700Schasinglulu cmp r1, #PMU_CPU_AUTO_PWRDN 125*91f16700Schasinglulu beq boot_entry 126*91f16700Schasinglulu cmp r1, #PMU_CPU_HOTPLUG 127*91f16700Schasinglulu beq boot_entry 128*91f16700Schasinglulu /* -------------------------------------------------------------------- 129*91f16700Schasinglulu * If the boot core cpuson_flags or cpuson_entry_point is not 130*91f16700Schasinglulu * expection. force the core into wfe. 131*91f16700Schasinglulu * -------------------------------------------------------------------- 132*91f16700Schasinglulu */ 133*91f16700Schasingluluwfe_loop: 134*91f16700Schasinglulu wfe 135*91f16700Schasinglulu b wfe_loop 136*91f16700Schasingluluboot_entry: 137*91f16700Schasinglulu mov r1, #0 138*91f16700Schasinglulu str r1, [r4] 139*91f16700Schasinglulu /* -------------------------------------------------------------------- 140*91f16700Schasinglulu * get per cpuup boot addr 141*91f16700Schasinglulu * -------------------------------------------------------------------- 142*91f16700Schasinglulu */ 143*91f16700Schasinglulu ldr r5, =cpuson_entry_point 144*91f16700Schasinglulu ldr r2, [r5, r7, lsl #2] /* ehem. #3 */ 145*91f16700Schasinglulu pop { r4 - r7, lr } 146*91f16700Schasinglulu 147*91f16700Schasinglulu bx r2 148*91f16700Schasingluluendfunc platform_cpu_warmboot 149*91f16700Schasinglulu 150*91f16700Schasinglulu /* -------------------------------------------------------------------- 151*91f16700Schasinglulu * Per-CPU Secure entry point - resume or power up 152*91f16700Schasinglulu * -------------------------------------------------------------------- 153*91f16700Schasinglulu */ 154*91f16700Schasinglulu .section .tzfw_coherent_mem, "a" 155*91f16700Schasinglulu .align 3 156*91f16700Schasinglulucpuson_entry_point: 157*91f16700Schasinglulu .rept PLATFORM_CORE_COUNT 158*91f16700Schasinglulu .quad 0 159*91f16700Schasinglulu .endr 160*91f16700Schasinglulucpuson_flags: 161*91f16700Schasinglulu .rept PLATFORM_CORE_COUNT 162*91f16700Schasinglulu .word 0 163*91f16700Schasinglulu .endr 164*91f16700Schasinglulurockchip_clst_warmboot_data 165