16fba6e04STony Xie/* 26fba6e04STony Xie * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved. 36fba6e04STony Xie * 46fba6e04STony Xie * Redistribution and use in source and binary forms, with or without 56fba6e04STony Xie * modification, are permitted provided that the following conditions are met: 66fba6e04STony Xie * 76fba6e04STony Xie * Redistributions of source code must retain the above copyright notice, this 86fba6e04STony Xie * list of conditions and the following disclaimer. 96fba6e04STony Xie * 106fba6e04STony Xie * Redistributions in binary form must reproduce the above copyright notice, 116fba6e04STony Xie * this list of conditions and the following disclaimer in the documentation 126fba6e04STony Xie * and/or other materials provided with the distribution. 136fba6e04STony Xie * 146fba6e04STony Xie * Neither the name of ARM nor the names of its contributors may be used 156fba6e04STony Xie * to endorse or promote products derived from this software without specific 166fba6e04STony Xie * prior written permission. 176fba6e04STony Xie * 186fba6e04STony Xie * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 196fba6e04STony Xie * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 206fba6e04STony Xie * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 216fba6e04STony Xie * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 226fba6e04STony Xie * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 236fba6e04STony Xie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 246fba6e04STony Xie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 256fba6e04STony Xie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 266fba6e04STony Xie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 276fba6e04STony Xie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 286fba6e04STony Xie * POSSIBILITY OF SUCH DAMAGE. 296fba6e04STony Xie */ 306fba6e04STony Xie 316fba6e04STony Xie#include <arch.h> 326fba6e04STony Xie#include <asm_macros.S> 336fba6e04STony Xie#include <bl_common.h> 346fba6e04STony Xie#include <cortex_a53.h> 356fba6e04STony Xie#include <cortex_a72.h> 366fba6e04STony Xie#include <plat_private.h> 376fba6e04STony Xie#include <platform_def.h> 386fba6e04STony Xie 396fba6e04STony Xie .globl cpuson_entry_point 406fba6e04STony Xie .globl cpuson_flags 416fba6e04STony Xie .globl platform_cpu_warmboot 426fba6e04STony Xie .globl plat_secondary_cold_boot_setup 436fba6e04STony Xie .globl plat_report_exception 446fba6e04STony Xie .globl platform_is_primary_cpu 456fba6e04STony Xie .globl plat_crash_console_init 466fba6e04STony Xie .globl plat_crash_console_putc 476fba6e04STony Xie .globl plat_my_core_pos 486fba6e04STony Xie .globl plat_reset_handler 496fba6e04STony Xie 506fba6e04STony Xie 516fba6e04STony Xie#define RK_REVISION(rev) RK_PLAT_CFG##rev 526fba6e04STony Xie#define RK_HANDLER(rev) plat_reset_handler_juno_r##rev 536fba6e04STony Xie#define JUMP_TO_HANDLER_IF_RK_R(revision) \ 546fba6e04STony Xie jump_to_handler RK_REVISION(revision), RK_HANDLER(revision) 556fba6e04STony Xie 566fba6e04STony Xie /* 576fba6e04STony Xie * Helper macro to jump to the given handler if the board revision 586fba6e04STony Xie * matches. 596fba6e04STony Xie * Expects the Juno board revision in x0. 606fba6e04STony Xie * 616fba6e04STony Xie */ 626fba6e04STony Xie .macro jump_to_handler _revision, _handler 636fba6e04STony Xie cmp x0, #\_revision 646fba6e04STony Xie b.eq \_handler 656fba6e04STony Xie .endm 666fba6e04STony Xie 676fba6e04STony Xie /* 686fba6e04STony Xie * Helper macro that reads the part number of the current CPU and jumps 696fba6e04STony Xie * to the given label if it matches the CPU MIDR provided. 706fba6e04STony Xie */ 716fba6e04STony Xie .macro jump_if_cpu_midr _cpu_midr, _label 726fba6e04STony Xie mrs x0, midr_el1 736fba6e04STony Xie ubfx x0, x0, MIDR_PN_SHIFT, #12 746fba6e04STony Xie cmp w0, #((\_cpu_midr >> MIDR_PN_SHIFT) & MIDR_PN_MASK) 756fba6e04STony Xie b.eq \_label 766fba6e04STony Xie .endm 776fba6e04STony Xie 786fba6e04STony Xie /* 796fba6e04STony Xie * Platform reset handler for rockchip. 806fba6e04STony Xie * only A53 cores 816fba6e04STony Xie */ 826fba6e04STony Xiefunc RK_HANDLER(0) 836fba6e04STony Xie ret 846fba6e04STony Xieendfunc RK_HANDLER(0) 856fba6e04STony Xie 866fba6e04STony Xie /* 876fba6e04STony Xie * Platform reset handler for rockchip. 886fba6e04STony Xie * - Cortex-A53 processor cluster; 896fba6e04STony Xie * - Cortex-A72 processor cluster. 906fba6e04STony Xie * 916fba6e04STony Xie * This handler does the following: 926fba6e04STony Xie * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A72 936fba6e04STony Xie * - Set the L2 Tag RAM latency to 1 (i.e. 2 cycles) for Cortex-A72 946fba6e04STony Xie */ 956fba6e04STony Xiefunc RK_HANDLER(1) 966fba6e04STony Xie /* 976fba6e04STony Xie * Nothing to do on Cortex-A53. 986fba6e04STony Xie * 996fba6e04STony Xie */ 1006fba6e04STony Xie jump_if_cpu_midr CORTEX_A72_MIDR, A72 1016fba6e04STony Xie ret 1026fba6e04STony Xie 1036fba6e04STony XieA72: 1046fba6e04STony Xie /* Cortex-A72 specific settings */ 1056fba6e04STony Xie mov x0, #((2 << L2CTLR_DATA_RAM_LATENCY_SHIFT) | \ 1066fba6e04STony Xie (0x1 << 5)) 1076fba6e04STony Xie msr L2CTLR_EL1, x0 1086fba6e04STony Xie isb 1096fba6e04STony Xie ret 1106fba6e04STony Xieendfunc RK_HANDLER(1) 1116fba6e04STony Xie 1126fba6e04STony Xie /* 1136fba6e04STony Xie * void plat_reset_handler(void); 1146fba6e04STony Xie * 1156fba6e04STony Xie * Determine the SOC type and call the appropriate reset 1166fba6e04STony Xie * handler. 1176fba6e04STony Xie * 1186fba6e04STony Xie */ 1196fba6e04STony Xiefunc plat_reset_handler 1206fba6e04STony Xie 1216fba6e04STony Xie mov x0, RK_PLAT_AARCH_CFG 1226fba6e04STony Xie 1236fba6e04STony Xie JUMP_TO_HANDLER_IF_RK_R(0) 1246fba6e04STony Xie JUMP_TO_HANDLER_IF_RK_R(1) 1256fba6e04STony Xie 1266fba6e04STony Xie /* SOC type is not supported */ 1276fba6e04STony Xienot_supported: 1286fba6e04STony Xie b not_supported 1296fba6e04STony Xieendfunc plat_reset_handler 1306fba6e04STony Xie 1316fba6e04STony Xiefunc plat_my_core_pos 1326fba6e04STony Xie mrs x0, mpidr_el1 1336fba6e04STony Xie and x1, x0, #MPIDR_CPU_MASK 1346fba6e04STony Xie and x0, x0, #MPIDR_CLUSTER_MASK 1356fba6e04STony Xie add x0, x1, x0, LSR #6 1366fba6e04STony Xie ret 1376fba6e04STony Xieendfunc plat_my_core_pos 1386fba6e04STony Xie 1396fba6e04STony Xie /* -------------------------------------------------------------------- 1406fba6e04STony Xie * void plat_secondary_cold_boot_setup (void); 1416fba6e04STony Xie * 1426fba6e04STony Xie * This function performs any platform specific actions 1436fba6e04STony Xie * needed for a secondary cpu after a cold reset e.g 1446fba6e04STony Xie * mark the cpu's presence, mechanism to place it in a 1456fba6e04STony Xie * holding pen etc. 1466fba6e04STony Xie * -------------------------------------------------------------------- 1476fba6e04STony Xie */ 1486fba6e04STony Xiefunc plat_secondary_cold_boot_setup 1496fba6e04STony Xie /* rk3368 does not do cold boot for secondary CPU */ 1506fba6e04STony Xiecb_panic: 1516fba6e04STony Xie b cb_panic 1526fba6e04STony Xieendfunc plat_secondary_cold_boot_setup 1536fba6e04STony Xie 1546fba6e04STony Xiefunc platform_is_primary_cpu 1556fba6e04STony Xie and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 1566fba6e04STony Xie cmp x0, #PLAT_RK_PRIMARY_CPU 1576fba6e04STony Xie cset x0, eq 1586fba6e04STony Xie ret 1596fba6e04STony Xieendfunc platform_is_primary_cpu 1606fba6e04STony Xie 1616fba6e04STony Xie /* -------------------------------------------------------------------- 1626fba6e04STony Xie * int plat_crash_console_init(void) 1636fba6e04STony Xie * Function to initialize the crash console 1646fba6e04STony Xie * without a C Runtime to print crash report. 1656fba6e04STony Xie * Clobber list : x0, x1, x2 1666fba6e04STony Xie * -------------------------------------------------------------------- 1676fba6e04STony Xie */ 1686fba6e04STony Xiefunc plat_crash_console_init 1696fba6e04STony Xie mov_imm x0, PLAT_RK_UART_BASE 1706fba6e04STony Xie mov_imm x1, PLAT_RK_UART_CLOCK 1716fba6e04STony Xie mov_imm x2, PLAT_RK_UART_BAUDRATE 1726fba6e04STony Xie b console_core_init 1736fba6e04STony Xieendfunc plat_crash_console_init 1746fba6e04STony Xie 1756fba6e04STony Xie /* -------------------------------------------------------------------- 1766fba6e04STony Xie * int plat_crash_console_putc(void) 1776fba6e04STony Xie * Function to print a character on the crash 1786fba6e04STony Xie * console without a C Runtime. 1796fba6e04STony Xie * Clobber list : x1, x2 1806fba6e04STony Xie * -------------------------------------------------------------------- 1816fba6e04STony Xie */ 1826fba6e04STony Xiefunc plat_crash_console_putc 1836fba6e04STony Xie mov_imm x1, PLAT_RK_UART_BASE 1846fba6e04STony Xie b console_core_putc 1856fba6e04STony Xieendfunc plat_crash_console_putc 1866fba6e04STony Xie 1876fba6e04STony Xie /* -------------------------------------------------------------------- 1886fba6e04STony Xie * void platform_cpu_warmboot (void); 1896fba6e04STony Xie * cpus online or resume enterpoint 1906fba6e04STony Xie * -------------------------------------------------------------------- 1916fba6e04STony Xie */ 192*f47a25ddSCaesar Wang .align 16 1936fba6e04STony Xiefunc platform_cpu_warmboot 1946fba6e04STony Xie mrs x0, MPIDR_EL1 1956fba6e04STony Xie and x1, x0, #MPIDR_CPU_MASK 1966fba6e04STony Xie and x0, x0, #MPIDR_CLUSTER_MASK 1976fba6e04STony Xie /* -------------------------------------------------------------------- 1986fba6e04STony Xie * big cluster id is 1 1996fba6e04STony Xie * big cores id is from 0-3, little cores id 4-7 2006fba6e04STony Xie * -------------------------------------------------------------------- 2016fba6e04STony Xie */ 2026fba6e04STony Xie add x0, x1, x0, lsr #6 2036fba6e04STony Xie /* -------------------------------------------------------------------- 2046fba6e04STony Xie * get per cpuup flag 2056fba6e04STony Xie * -------------------------------------------------------------------- 2066fba6e04STony Xie */ 2076fba6e04STony Xie adr x4, cpuson_flags 2086fba6e04STony Xie add x4, x4, x0, lsl #2 2096fba6e04STony Xie ldr w1, [x4] 2106fba6e04STony Xie /* -------------------------------------------------------------------- 2116fba6e04STony Xie * check cpuon reason 2126fba6e04STony Xie * -------------------------------------------------------------------- 2136fba6e04STony Xie */ 2146fba6e04STony Xie ldr w3, =PMU_CPU_AUTO_PWRDN 2156fba6e04STony Xie cmp w1, w3 2166fba6e04STony Xie b.eq boot_entry 2176fba6e04STony Xie ldr w3, =PMU_CPU_HOTPLUG 2186fba6e04STony Xie cmp w1, w3 2196fba6e04STony Xie b.eq boot_entry 2206fba6e04STony Xie /* -------------------------------------------------------------------- 2216fba6e04STony Xie * If the boot core cpuson_flags or cpuson_entry_point is not 2226fba6e04STony Xie * expection. force the core into wfe. 2236fba6e04STony Xie * -------------------------------------------------------------------- 2246fba6e04STony Xie */ 2256fba6e04STony Xiewfe_loop: 2266fba6e04STony Xie wfe 2276fba6e04STony Xie b wfe_loop 2286fba6e04STony Xieboot_entry: 229*f47a25ddSCaesar Wang mov w1, #0 230*f47a25ddSCaesar Wang str w1, [x4] 231*f47a25ddSCaesar Wang /* -------------------------------------------------------------------- 232*f47a25ddSCaesar Wang * get per cpuup boot addr 233*f47a25ddSCaesar Wang * -------------------------------------------------------------------- 234*f47a25ddSCaesar Wang */ 235*f47a25ddSCaesar Wang adr x5, cpuson_entry_point 236*f47a25ddSCaesar Wang ldr x2, [x5, x0, lsl #3] 237*f47a25ddSCaesar Wang 2386fba6e04STony Xie br x2 2396fba6e04STony Xieendfunc platform_cpu_warmboot 2406fba6e04STony Xie 2416fba6e04STony Xie /* -------------------------------------------------------------------- 2426fba6e04STony Xie * Per-CPU Secure entry point - resume or power up 2436fba6e04STony Xie * -------------------------------------------------------------------- 2446fba6e04STony Xie */ 2456fba6e04STony Xie .section tzfw_coherent_mem, "a" 2466fba6e04STony Xie .align 3 2476fba6e04STony Xiecpuson_entry_point: 2486fba6e04STony Xie .rept PLATFORM_CORE_COUNT 2496fba6e04STony Xie .quad 0 2506fba6e04STony Xie .endr 2516fba6e04STony Xiecpuson_flags: 2526fba6e04STony Xie .rept PLATFORM_CORE_COUNT 253*f47a25ddSCaesar Wang .word 0 2546fba6e04STony Xie .endr 255