182e18f89SHeiko Stuebner/* 282e18f89SHeiko Stuebner * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved. 382e18f89SHeiko Stuebner * 482e18f89SHeiko Stuebner * SPDX-License-Identifier: BSD-3-Clause 582e18f89SHeiko Stuebner */ 682e18f89SHeiko Stuebner 782e18f89SHeiko Stuebner#include <platform_def.h> 882e18f89SHeiko Stuebner 982e18f89SHeiko Stuebner#include <arch.h> 1082e18f89SHeiko Stuebner#include <asm_macros.S> 1182e18f89SHeiko Stuebner#include <common/bl_common.h> 1282e18f89SHeiko Stuebner#include <cortex_a12.h> 1382e18f89SHeiko Stuebner#include <plat_private.h> 1482e18f89SHeiko Stuebner#include <plat_pmu_macros.S> 1582e18f89SHeiko Stuebner 1682e18f89SHeiko Stuebner .globl cpuson_entry_point 1782e18f89SHeiko Stuebner .globl cpuson_flags 1882e18f89SHeiko Stuebner .globl platform_cpu_warmboot 1982e18f89SHeiko Stuebner .globl plat_secondary_cold_boot_setup 2082e18f89SHeiko Stuebner .globl plat_report_exception 2182e18f89SHeiko Stuebner .globl plat_is_my_cpu_primary 2282e18f89SHeiko Stuebner .globl plat_my_core_pos 2382e18f89SHeiko Stuebner .globl plat_reset_handler 2482e18f89SHeiko Stuebner .globl plat_panic_handler 2582e18f89SHeiko Stuebner 2682e18f89SHeiko Stuebner /* 2782e18f89SHeiko Stuebner * void plat_reset_handler(void); 2882e18f89SHeiko Stuebner * 2982e18f89SHeiko Stuebner * Determine the SOC type and call the appropriate reset 3082e18f89SHeiko Stuebner * handler. 3182e18f89SHeiko Stuebner * 3282e18f89SHeiko Stuebner */ 3382e18f89SHeiko Stuebnerfunc plat_reset_handler 3482e18f89SHeiko Stuebner bx lr 3582e18f89SHeiko Stuebnerendfunc plat_reset_handler 3682e18f89SHeiko Stuebner 3782e18f89SHeiko Stuebnerfunc plat_my_core_pos 3882e18f89SHeiko Stuebner ldcopr r0, MPIDR 3982e18f89SHeiko Stuebner and r1, r0, #MPIDR_CPU_MASK 4082e18f89SHeiko Stuebner#ifdef PLAT_RK_MPIDR_CLUSTER_MASK 4182e18f89SHeiko Stuebner and r0, r0, #PLAT_RK_MPIDR_CLUSTER_MASK 4282e18f89SHeiko Stuebner#else 4382e18f89SHeiko Stuebner and r0, r0, #MPIDR_CLUSTER_MASK 4482e18f89SHeiko Stuebner#endif 4582e18f89SHeiko Stuebner add r0, r1, r0, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT 4682e18f89SHeiko Stuebner bx lr 4782e18f89SHeiko Stuebnerendfunc plat_my_core_pos 4882e18f89SHeiko Stuebner 4982e18f89SHeiko Stuebner /* -------------------------------------------------------------------- 5082e18f89SHeiko Stuebner * void plat_secondary_cold_boot_setup (void); 5182e18f89SHeiko Stuebner * 5282e18f89SHeiko Stuebner * This function performs any platform specific actions 5382e18f89SHeiko Stuebner * needed for a secondary cpu after a cold reset e.g 5482e18f89SHeiko Stuebner * mark the cpu's presence, mechanism to place it in a 5582e18f89SHeiko Stuebner * holding pen etc. 5682e18f89SHeiko Stuebner * -------------------------------------------------------------------- 5782e18f89SHeiko Stuebner */ 5882e18f89SHeiko Stuebnerfunc plat_secondary_cold_boot_setup 5982e18f89SHeiko Stuebner /* rk3288 does not do cold boot for secondary CPU */ 6082e18f89SHeiko Stuebnercb_panic: 6182e18f89SHeiko Stuebner b cb_panic 6282e18f89SHeiko Stuebnerendfunc plat_secondary_cold_boot_setup 6382e18f89SHeiko Stuebner 6482e18f89SHeiko Stuebnerfunc plat_is_my_cpu_primary 6582e18f89SHeiko Stuebner ldcopr r0, MPIDR 6682e18f89SHeiko Stuebner#ifdef PLAT_RK_MPIDR_CLUSTER_MASK 6782e18f89SHeiko Stuebner ldr r1, =(PLAT_RK_MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 6882e18f89SHeiko Stuebner#else 6982e18f89SHeiko Stuebner ldr r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 7082e18f89SHeiko Stuebner#endif 7182e18f89SHeiko Stuebner and r0, r1 7282e18f89SHeiko Stuebner cmp r0, #PLAT_RK_PRIMARY_CPU 7382e18f89SHeiko Stuebner moveq r0, #1 7482e18f89SHeiko Stuebner movne r0, #0 7582e18f89SHeiko Stuebner bx lr 7682e18f89SHeiko Stuebnerendfunc plat_is_my_cpu_primary 7782e18f89SHeiko Stuebner 7882e18f89SHeiko Stuebner /* -------------------------------------------------------------------- 7982e18f89SHeiko Stuebner * void plat_panic_handler(void) 8082e18f89SHeiko Stuebner * Call system reset function on panic. Set up an emergency stack so we 8182e18f89SHeiko Stuebner * can run C functions (it only needs to last for a few calls until we 8282e18f89SHeiko Stuebner * reboot anyway). 8382e18f89SHeiko Stuebner * -------------------------------------------------------------------- 8482e18f89SHeiko Stuebner */ 8582e18f89SHeiko Stuebnerfunc plat_panic_handler 8682e18f89SHeiko Stuebner bl plat_set_my_stack 8782e18f89SHeiko Stuebner b rockchip_soc_soft_reset 8882e18f89SHeiko Stuebnerendfunc plat_panic_handler 8982e18f89SHeiko Stuebner 9082e18f89SHeiko Stuebner /* -------------------------------------------------------------------- 9182e18f89SHeiko Stuebner * void platform_cpu_warmboot (void); 9282e18f89SHeiko Stuebner * cpus online or resume entrypoint 9382e18f89SHeiko Stuebner * -------------------------------------------------------------------- 9482e18f89SHeiko Stuebner */ 9582e18f89SHeiko Stuebnerfunc platform_cpu_warmboot _align=16 9682e18f89SHeiko Stuebner push { r4 - r7, lr } 9782e18f89SHeiko Stuebner ldcopr r0, MPIDR 9882e18f89SHeiko Stuebner and r5, r0, #MPIDR_CPU_MASK 9982e18f89SHeiko Stuebner#ifdef PLAT_RK_MPIDR_CLUSTER_MASK 10082e18f89SHeiko Stuebner and r6, r0, #PLAT_RK_MPIDR_CLUSTER_MASK 10182e18f89SHeiko Stuebner#else 10282e18f89SHeiko Stuebner and r6, r0, #MPIDR_CLUSTER_MASK 10382e18f89SHeiko Stuebner#endif 10482e18f89SHeiko Stuebner mov r0, r6 10582e18f89SHeiko Stuebner 10682e18f89SHeiko Stuebner func_rockchip_clst_warmboot 10782e18f89SHeiko Stuebner /* -------------------------------------------------------------------- 10882e18f89SHeiko Stuebner * big cluster id is 1 10982e18f89SHeiko Stuebner * big cores id is from 0-3, little cores id 4-7 11082e18f89SHeiko Stuebner * -------------------------------------------------------------------- 11182e18f89SHeiko Stuebner */ 11282e18f89SHeiko Stuebner add r7, r5, r6, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT 11382e18f89SHeiko Stuebner /* -------------------------------------------------------------------- 11482e18f89SHeiko Stuebner * get per cpuup flag 11582e18f89SHeiko Stuebner * -------------------------------------------------------------------- 11682e18f89SHeiko Stuebner */ 11782e18f89SHeiko Stuebner ldr r4, =cpuson_flags 11882e18f89SHeiko Stuebner add r4, r4, r7, lsl #2 11982e18f89SHeiko Stuebner ldr r1, [r4] 12082e18f89SHeiko Stuebner /* -------------------------------------------------------------------- 12182e18f89SHeiko Stuebner * check cpuon reason 12282e18f89SHeiko Stuebner * -------------------------------------------------------------------- 12382e18f89SHeiko Stuebner */ 12482e18f89SHeiko Stuebner cmp r1, #PMU_CPU_AUTO_PWRDN 12582e18f89SHeiko Stuebner beq boot_entry 12682e18f89SHeiko Stuebner cmp r1, #PMU_CPU_HOTPLUG 12782e18f89SHeiko Stuebner beq boot_entry 12882e18f89SHeiko Stuebner /* -------------------------------------------------------------------- 12982e18f89SHeiko Stuebner * If the boot core cpuson_flags or cpuson_entry_point is not 13082e18f89SHeiko Stuebner * expection. force the core into wfe. 13182e18f89SHeiko Stuebner * -------------------------------------------------------------------- 13282e18f89SHeiko Stuebner */ 13382e18f89SHeiko Stuebnerwfe_loop: 13482e18f89SHeiko Stuebner wfe 13582e18f89SHeiko Stuebner b wfe_loop 13682e18f89SHeiko Stuebnerboot_entry: 13782e18f89SHeiko Stuebner mov r1, #0 13882e18f89SHeiko Stuebner str r1, [r4] 13982e18f89SHeiko Stuebner /* -------------------------------------------------------------------- 14082e18f89SHeiko Stuebner * get per cpuup boot addr 14182e18f89SHeiko Stuebner * -------------------------------------------------------------------- 14282e18f89SHeiko Stuebner */ 14382e18f89SHeiko Stuebner ldr r5, =cpuson_entry_point 14482e18f89SHeiko Stuebner ldr r2, [r5, r7, lsl #2] /* ehem. #3 */ 14582e18f89SHeiko Stuebner pop { r4 - r7, lr } 14682e18f89SHeiko Stuebner 14782e18f89SHeiko Stuebner bx r2 14882e18f89SHeiko Stuebnerendfunc platform_cpu_warmboot 14982e18f89SHeiko Stuebner 15082e18f89SHeiko Stuebner /* -------------------------------------------------------------------- 15182e18f89SHeiko Stuebner * Per-CPU Secure entry point - resume or power up 15282e18f89SHeiko Stuebner * -------------------------------------------------------------------- 15382e18f89SHeiko Stuebner */ 154*da04341eSChris Kay .section .tzfw_coherent_mem, "a" 15582e18f89SHeiko Stuebner .align 3 15682e18f89SHeiko Stuebnercpuson_entry_point: 15782e18f89SHeiko Stuebner .rept PLATFORM_CORE_COUNT 15882e18f89SHeiko Stuebner .quad 0 15982e18f89SHeiko Stuebner .endr 16082e18f89SHeiko Stuebnercpuson_flags: 16182e18f89SHeiko Stuebner .rept PLATFORM_CORE_COUNT 16282e18f89SHeiko Stuebner .word 0 16382e18f89SHeiko Stuebner .endr 16482e18f89SHeiko Stuebnerrockchip_clst_warmboot_data 165