16fba6e04STony Xie/* 26fba6e04STony Xie * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved. 36fba6e04STony Xie * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 56fba6e04STony Xie */ 66fba6e04STony Xie 76fba6e04STony Xie#include <arch.h> 86fba6e04STony Xie#include <asm_macros.S> 96fba6e04STony Xie#include <bl_common.h> 106fba6e04STony Xie#include <cortex_a53.h> 116fba6e04STony Xie#include <cortex_a72.h> 126fba6e04STony Xie#include <plat_private.h> 136fba6e04STony Xie#include <platform_def.h> 149ec78bdfSTony Xie#include <plat_pmu_macros.S> 156fba6e04STony Xie 166fba6e04STony Xie .globl cpuson_entry_point 176fba6e04STony Xie .globl cpuson_flags 186fba6e04STony Xie .globl platform_cpu_warmboot 196fba6e04STony Xie .globl plat_secondary_cold_boot_setup 206fba6e04STony Xie .globl plat_report_exception 216fba6e04STony Xie .globl platform_is_primary_cpu 226fba6e04STony Xie .globl plat_crash_console_init 236fba6e04STony Xie .globl plat_crash_console_putc 246fba6e04STony Xie .globl plat_my_core_pos 256fba6e04STony Xie .globl plat_reset_handler 26*a33e763cSJulius Werner .globl plat_panic_handler 276fba6e04STony Xie 286fba6e04STony Xie /* 296fba6e04STony Xie * void plat_reset_handler(void); 306fba6e04STony Xie * 316fba6e04STony Xie * Determine the SOC type and call the appropriate reset 326fba6e04STony Xie * handler. 336fba6e04STony Xie * 346fba6e04STony Xie */ 356fba6e04STony Xiefunc plat_reset_handler 369ec78bdfSTony Xie mrs x0, midr_el1 379ec78bdfSTony Xie ubfx x0, x0, MIDR_PN_SHIFT, #12 389ec78bdfSTony Xie cmp w0, #((CORTEX_A72_MIDR >> MIDR_PN_SHIFT) & MIDR_PN_MASK) 399ec78bdfSTony Xie b.eq handler_a72 409ec78bdfSTony Xie b handler_end 419ec78bdfSTony Xiehandler_a72: 429ec78bdfSTony Xie /* 439ec78bdfSTony Xie * This handler does the following: 449ec78bdfSTony Xie * Set the L2 Data RAM latency for Cortex-A72. 459ec78bdfSTony Xie * Set the L2 Tag RAM latency to for Cortex-A72. 469ec78bdfSTony Xie */ 47fb7d32e5SVarun Wadekar mov x0, #((5 << CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \ 489ec78bdfSTony Xie (0x1 << 5)) 49fb7d32e5SVarun Wadekar msr CORTEX_A72_L2CTLR_EL1, x0 509ec78bdfSTony Xie isb 519ec78bdfSTony Xiehandler_end: 529ec78bdfSTony Xie ret 536fba6e04STony Xieendfunc plat_reset_handler 546fba6e04STony Xie 556fba6e04STony Xiefunc plat_my_core_pos 566fba6e04STony Xie mrs x0, mpidr_el1 576fba6e04STony Xie and x1, x0, #MPIDR_CPU_MASK 586fba6e04STony Xie and x0, x0, #MPIDR_CLUSTER_MASK 599ec78bdfSTony Xie add x0, x1, x0, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT 606fba6e04STony Xie ret 616fba6e04STony Xieendfunc plat_my_core_pos 626fba6e04STony Xie 636fba6e04STony Xie /* -------------------------------------------------------------------- 646fba6e04STony Xie * void plat_secondary_cold_boot_setup (void); 656fba6e04STony Xie * 666fba6e04STony Xie * This function performs any platform specific actions 676fba6e04STony Xie * needed for a secondary cpu after a cold reset e.g 686fba6e04STony Xie * mark the cpu's presence, mechanism to place it in a 696fba6e04STony Xie * holding pen etc. 706fba6e04STony Xie * -------------------------------------------------------------------- 716fba6e04STony Xie */ 726fba6e04STony Xiefunc plat_secondary_cold_boot_setup 736fba6e04STony Xie /* rk3368 does not do cold boot for secondary CPU */ 746fba6e04STony Xiecb_panic: 756fba6e04STony Xie b cb_panic 766fba6e04STony Xieendfunc plat_secondary_cold_boot_setup 776fba6e04STony Xie 786fba6e04STony Xiefunc platform_is_primary_cpu 796fba6e04STony Xie and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 806fba6e04STony Xie cmp x0, #PLAT_RK_PRIMARY_CPU 816fba6e04STony Xie cset x0, eq 826fba6e04STony Xie ret 836fba6e04STony Xieendfunc platform_is_primary_cpu 846fba6e04STony Xie 856fba6e04STony Xie /* -------------------------------------------------------------------- 866fba6e04STony Xie * int plat_crash_console_init(void) 876fba6e04STony Xie * Function to initialize the crash console 886fba6e04STony Xie * without a C Runtime to print crash report. 896fba6e04STony Xie * Clobber list : x0, x1, x2 906fba6e04STony Xie * -------------------------------------------------------------------- 916fba6e04STony Xie */ 926fba6e04STony Xiefunc plat_crash_console_init 936fba6e04STony Xie mov_imm x0, PLAT_RK_UART_BASE 946fba6e04STony Xie mov_imm x1, PLAT_RK_UART_CLOCK 956fba6e04STony Xie mov_imm x2, PLAT_RK_UART_BAUDRATE 966fba6e04STony Xie b console_core_init 976fba6e04STony Xieendfunc plat_crash_console_init 986fba6e04STony Xie 996fba6e04STony Xie /* -------------------------------------------------------------------- 1006fba6e04STony Xie * int plat_crash_console_putc(void) 1016fba6e04STony Xie * Function to print a character on the crash 1026fba6e04STony Xie * console without a C Runtime. 1036fba6e04STony Xie * Clobber list : x1, x2 1046fba6e04STony Xie * -------------------------------------------------------------------- 1056fba6e04STony Xie */ 1066fba6e04STony Xiefunc plat_crash_console_putc 1076fba6e04STony Xie mov_imm x1, PLAT_RK_UART_BASE 1086fba6e04STony Xie b console_core_putc 1096fba6e04STony Xieendfunc plat_crash_console_putc 1106fba6e04STony Xie 1116fba6e04STony Xie /* -------------------------------------------------------------------- 112*a33e763cSJulius Werner * void plat_panic_handler(void) 113*a33e763cSJulius Werner * Call system reset function on panic. Set up an emergency stack so we 114*a33e763cSJulius Werner * can run C functions (it only needs to last for a few calls until we 115*a33e763cSJulius Werner * reboot anyway). 116*a33e763cSJulius Werner * -------------------------------------------------------------------- 117*a33e763cSJulius Werner */ 118*a33e763cSJulius Wernerfunc plat_panic_handler 119*a33e763cSJulius Werner msr spsel, #0 120*a33e763cSJulius Werner bl plat_set_my_stack 121*a33e763cSJulius Werner b rockchip_soc_soft_reset 122*a33e763cSJulius Wernerendfunc plat_panic_handler 123*a33e763cSJulius Werner 124*a33e763cSJulius Werner /* -------------------------------------------------------------------- 1256fba6e04STony Xie * void platform_cpu_warmboot (void); 1266fba6e04STony Xie * cpus online or resume enterpoint 1276fba6e04STony Xie * -------------------------------------------------------------------- 1286fba6e04STony Xie */ 12964726e6dSJulius Wernerfunc platform_cpu_warmboot _align=16 1306fba6e04STony Xie mrs x0, MPIDR_EL1 1319ec78bdfSTony Xie and x19, x0, #MPIDR_CPU_MASK 1329ec78bdfSTony Xie and x20, x0, #MPIDR_CLUSTER_MASK 1339ec78bdfSTony Xie mov x0, x20 1349ec78bdfSTony Xie func_rockchip_clst_warmboot 1356fba6e04STony Xie /* -------------------------------------------------------------------- 1366fba6e04STony Xie * big cluster id is 1 1376fba6e04STony Xie * big cores id is from 0-3, little cores id 4-7 1386fba6e04STony Xie * -------------------------------------------------------------------- 1396fba6e04STony Xie */ 1409ec78bdfSTony Xie add x21, x19, x20, lsr #PLAT_RK_CLST_TO_CPUID_SHIFT 1416fba6e04STony Xie /* -------------------------------------------------------------------- 1426fba6e04STony Xie * get per cpuup flag 1436fba6e04STony Xie * -------------------------------------------------------------------- 1446fba6e04STony Xie */ 1456fba6e04STony Xie adr x4, cpuson_flags 1469ec78bdfSTony Xie add x4, x4, x21, lsl #2 1476fba6e04STony Xie ldr w1, [x4] 1486fba6e04STony Xie /* -------------------------------------------------------------------- 1496fba6e04STony Xie * check cpuon reason 1506fba6e04STony Xie * -------------------------------------------------------------------- 1516fba6e04STony Xie */ 1529ec78bdfSTony Xie cmp w1, PMU_CPU_AUTO_PWRDN 1536fba6e04STony Xie b.eq boot_entry 1549ec78bdfSTony Xie cmp w1, PMU_CPU_HOTPLUG 1556fba6e04STony Xie b.eq boot_entry 1566fba6e04STony Xie /* -------------------------------------------------------------------- 1576fba6e04STony Xie * If the boot core cpuson_flags or cpuson_entry_point is not 1586fba6e04STony Xie * expection. force the core into wfe. 1596fba6e04STony Xie * -------------------------------------------------------------------- 1606fba6e04STony Xie */ 1616fba6e04STony Xiewfe_loop: 1626fba6e04STony Xie wfe 1636fba6e04STony Xie b wfe_loop 1646fba6e04STony Xieboot_entry: 1659ec78bdfSTony Xie str wzr, [x4] 166f47a25ddSCaesar Wang /* -------------------------------------------------------------------- 167f47a25ddSCaesar Wang * get per cpuup boot addr 168f47a25ddSCaesar Wang * -------------------------------------------------------------------- 169f47a25ddSCaesar Wang */ 170f47a25ddSCaesar Wang adr x5, cpuson_entry_point 1719ec78bdfSTony Xie ldr x2, [x5, x21, lsl #3] 1726fba6e04STony Xie br x2 1736fba6e04STony Xieendfunc platform_cpu_warmboot 1746fba6e04STony Xie 1756fba6e04STony Xie /* -------------------------------------------------------------------- 1766fba6e04STony Xie * Per-CPU Secure entry point - resume or power up 1776fba6e04STony Xie * -------------------------------------------------------------------- 1786fba6e04STony Xie */ 1796fba6e04STony Xie .section tzfw_coherent_mem, "a" 1806fba6e04STony Xie .align 3 1816fba6e04STony Xiecpuson_entry_point: 1826fba6e04STony Xie .rept PLATFORM_CORE_COUNT 1836fba6e04STony Xie .quad 0 1846fba6e04STony Xie .endr 1856fba6e04STony Xiecpuson_flags: 1866fba6e04STony Xie .rept PLATFORM_CORE_COUNT 187f47a25ddSCaesar Wang .word 0 1886fba6e04STony Xie .endr 1899ec78bdfSTony Xierockchip_clst_warmboot_data 190