/* * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include #include #include #include .globl cpuson_entry_point .globl cpuson_flags .globl platform_cpu_warmboot .globl plat_secondary_cold_boot_setup .globl plat_report_exception .globl plat_is_my_cpu_primary .globl plat_my_core_pos .globl plat_reset_handler .globl plat_panic_handler /* * void plat_reset_handler(void); * * Determine the SOC type and call the appropriate reset * handler. * */ func plat_reset_handler bx lr endfunc plat_reset_handler func plat_my_core_pos ldcopr r0, MPIDR and r1, r0, #MPIDR_CPU_MASK #ifdef PLAT_RK_MPIDR_CLUSTER_MASK and r0, r0, #PLAT_RK_MPIDR_CLUSTER_MASK #else and r0, r0, #MPIDR_CLUSTER_MASK #endif add r0, r1, r0, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT bx lr endfunc plat_my_core_pos /* -------------------------------------------------------------------- * void plat_secondary_cold_boot_setup (void); * * This function performs any platform specific actions * needed for a secondary cpu after a cold reset e.g * mark the cpu's presence, mechanism to place it in a * holding pen etc. * -------------------------------------------------------------------- */ func plat_secondary_cold_boot_setup /* rk3288 does not do cold boot for secondary CPU */ cb_panic: b cb_panic endfunc plat_secondary_cold_boot_setup func plat_is_my_cpu_primary ldcopr r0, MPIDR #ifdef PLAT_RK_MPIDR_CLUSTER_MASK ldr r1, =(PLAT_RK_MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) #else ldr r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) #endif and r0, r1 cmp r0, #PLAT_RK_PRIMARY_CPU moveq r0, #1 movne r0, #0 bx lr endfunc plat_is_my_cpu_primary /* -------------------------------------------------------------------- * void plat_panic_handler(void) * Call system reset function on panic. Set up an emergency stack so we * can run C functions (it only needs to last for a few calls until we * reboot anyway). * -------------------------------------------------------------------- */ func plat_panic_handler bl plat_set_my_stack b rockchip_soc_soft_reset endfunc plat_panic_handler /* -------------------------------------------------------------------- * void platform_cpu_warmboot (void); * cpus online or resume entrypoint * -------------------------------------------------------------------- */ func platform_cpu_warmboot _align=16 push { r4 - r7, lr } ldcopr r0, MPIDR and r5, r0, #MPIDR_CPU_MASK #ifdef PLAT_RK_MPIDR_CLUSTER_MASK and r6, r0, #PLAT_RK_MPIDR_CLUSTER_MASK #else and r6, r0, #MPIDR_CLUSTER_MASK #endif mov r0, r6 func_rockchip_clst_warmboot /* -------------------------------------------------------------------- * big cluster id is 1 * big cores id is from 0-3, little cores id 4-7 * -------------------------------------------------------------------- */ add r7, r5, r6, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT /* -------------------------------------------------------------------- * get per cpuup flag * -------------------------------------------------------------------- */ ldr r4, =cpuson_flags add r4, r4, r7, lsl #2 ldr r1, [r4] /* -------------------------------------------------------------------- * check cpuon reason * -------------------------------------------------------------------- */ cmp r1, #PMU_CPU_AUTO_PWRDN beq boot_entry cmp r1, #PMU_CPU_HOTPLUG beq boot_entry /* -------------------------------------------------------------------- * If the boot core cpuson_flags or cpuson_entry_point is not * expection. force the core into wfe. * -------------------------------------------------------------------- */ wfe_loop: wfe b wfe_loop boot_entry: mov r1, #0 str r1, [r4] /* -------------------------------------------------------------------- * get per cpuup boot addr * -------------------------------------------------------------------- */ ldr r5, =cpuson_entry_point ldr r2, [r5, r7, lsl #2] /* ehem. #3 */ pop { r4 - r7, lr } bx r2 endfunc platform_cpu_warmboot /* -------------------------------------------------------------------- * Per-CPU Secure entry point - resume or power up * -------------------------------------------------------------------- */ .section tzfw_coherent_mem, "a" .align 3 cpuson_entry_point: .rept PLATFORM_CORE_COUNT .quad 0 .endr cpuson_flags: .rept PLATFORM_CORE_COUNT .word 0 .endr rockchip_clst_warmboot_data