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> 38*9ec78bdfSTony Xie#include <plat_pmu_macros.S> 396fba6e04STony Xie 406fba6e04STony Xie .globl cpuson_entry_point 416fba6e04STony Xie .globl cpuson_flags 426fba6e04STony Xie .globl platform_cpu_warmboot 436fba6e04STony Xie .globl plat_secondary_cold_boot_setup 446fba6e04STony Xie .globl plat_report_exception 456fba6e04STony Xie .globl platform_is_primary_cpu 466fba6e04STony Xie .globl plat_crash_console_init 476fba6e04STony Xie .globl plat_crash_console_putc 486fba6e04STony Xie .globl plat_my_core_pos 496fba6e04STony Xie .globl plat_reset_handler 506fba6e04STony Xie 516fba6e04STony Xie /* 526fba6e04STony Xie * void plat_reset_handler(void); 536fba6e04STony Xie * 546fba6e04STony Xie * Determine the SOC type and call the appropriate reset 556fba6e04STony Xie * handler. 566fba6e04STony Xie * 576fba6e04STony Xie */ 586fba6e04STony Xiefunc plat_reset_handler 59*9ec78bdfSTony Xie mrs x0, midr_el1 60*9ec78bdfSTony Xie ubfx x0, x0, MIDR_PN_SHIFT, #12 61*9ec78bdfSTony Xie cmp w0, #((CORTEX_A72_MIDR >> MIDR_PN_SHIFT) & MIDR_PN_MASK) 62*9ec78bdfSTony Xie b.eq handler_a72 63*9ec78bdfSTony Xie b handler_end 64*9ec78bdfSTony Xiehandler_a72: 65*9ec78bdfSTony Xie /* 66*9ec78bdfSTony Xie * This handler does the following: 67*9ec78bdfSTony Xie * Set the L2 Data RAM latency for Cortex-A72. 68*9ec78bdfSTony Xie * Set the L2 Tag RAM latency to for Cortex-A72. 69*9ec78bdfSTony Xie */ 70*9ec78bdfSTony Xie mov x0, #((2 << L2CTLR_DATA_RAM_LATENCY_SHIFT) | \ 71*9ec78bdfSTony Xie (0x1 << 5)) 72*9ec78bdfSTony Xie msr L2CTLR_EL1, x0 73*9ec78bdfSTony Xie isb 74*9ec78bdfSTony Xiehandler_end: 75*9ec78bdfSTony Xie ret 766fba6e04STony Xieendfunc plat_reset_handler 776fba6e04STony Xie 786fba6e04STony Xiefunc plat_my_core_pos 796fba6e04STony Xie mrs x0, mpidr_el1 806fba6e04STony Xie and x1, x0, #MPIDR_CPU_MASK 816fba6e04STony Xie and x0, x0, #MPIDR_CLUSTER_MASK 82*9ec78bdfSTony Xie add x0, x1, x0, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT 836fba6e04STony Xie ret 846fba6e04STony Xieendfunc plat_my_core_pos 856fba6e04STony Xie 866fba6e04STony Xie /* -------------------------------------------------------------------- 876fba6e04STony Xie * void plat_secondary_cold_boot_setup (void); 886fba6e04STony Xie * 896fba6e04STony Xie * This function performs any platform specific actions 906fba6e04STony Xie * needed for a secondary cpu after a cold reset e.g 916fba6e04STony Xie * mark the cpu's presence, mechanism to place it in a 926fba6e04STony Xie * holding pen etc. 936fba6e04STony Xie * -------------------------------------------------------------------- 946fba6e04STony Xie */ 956fba6e04STony Xiefunc plat_secondary_cold_boot_setup 966fba6e04STony Xie /* rk3368 does not do cold boot for secondary CPU */ 976fba6e04STony Xiecb_panic: 986fba6e04STony Xie b cb_panic 996fba6e04STony Xieendfunc plat_secondary_cold_boot_setup 1006fba6e04STony Xie 1016fba6e04STony Xiefunc platform_is_primary_cpu 1026fba6e04STony Xie and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 1036fba6e04STony Xie cmp x0, #PLAT_RK_PRIMARY_CPU 1046fba6e04STony Xie cset x0, eq 1056fba6e04STony Xie ret 1066fba6e04STony Xieendfunc platform_is_primary_cpu 1076fba6e04STony Xie 1086fba6e04STony Xie /* -------------------------------------------------------------------- 1096fba6e04STony Xie * int plat_crash_console_init(void) 1106fba6e04STony Xie * Function to initialize the crash console 1116fba6e04STony Xie * without a C Runtime to print crash report. 1126fba6e04STony Xie * Clobber list : x0, x1, x2 1136fba6e04STony Xie * -------------------------------------------------------------------- 1146fba6e04STony Xie */ 1156fba6e04STony Xiefunc plat_crash_console_init 1166fba6e04STony Xie mov_imm x0, PLAT_RK_UART_BASE 1176fba6e04STony Xie mov_imm x1, PLAT_RK_UART_CLOCK 1186fba6e04STony Xie mov_imm x2, PLAT_RK_UART_BAUDRATE 1196fba6e04STony Xie b console_core_init 1206fba6e04STony Xieendfunc plat_crash_console_init 1216fba6e04STony Xie 1226fba6e04STony Xie /* -------------------------------------------------------------------- 1236fba6e04STony Xie * int plat_crash_console_putc(void) 1246fba6e04STony Xie * Function to print a character on the crash 1256fba6e04STony Xie * console without a C Runtime. 1266fba6e04STony Xie * Clobber list : x1, x2 1276fba6e04STony Xie * -------------------------------------------------------------------- 1286fba6e04STony Xie */ 1296fba6e04STony Xiefunc plat_crash_console_putc 1306fba6e04STony Xie mov_imm x1, PLAT_RK_UART_BASE 1316fba6e04STony Xie b console_core_putc 1326fba6e04STony Xieendfunc plat_crash_console_putc 1336fba6e04STony Xie 1346fba6e04STony Xie /* -------------------------------------------------------------------- 1356fba6e04STony Xie * void platform_cpu_warmboot (void); 1366fba6e04STony Xie * cpus online or resume enterpoint 1376fba6e04STony Xie * -------------------------------------------------------------------- 1386fba6e04STony Xie */ 139f47a25ddSCaesar Wang .align 16 1406fba6e04STony Xiefunc platform_cpu_warmboot 1416fba6e04STony Xie mrs x0, MPIDR_EL1 142*9ec78bdfSTony Xie and x19, x0, #MPIDR_CPU_MASK 143*9ec78bdfSTony Xie and x20, x0, #MPIDR_CLUSTER_MASK 144*9ec78bdfSTony Xie mov x0, x20 145*9ec78bdfSTony Xie func_rockchip_clst_warmboot 1466fba6e04STony Xie /* -------------------------------------------------------------------- 1476fba6e04STony Xie * big cluster id is 1 1486fba6e04STony Xie * big cores id is from 0-3, little cores id 4-7 1496fba6e04STony Xie * -------------------------------------------------------------------- 1506fba6e04STony Xie */ 151*9ec78bdfSTony Xie add x21, x19, x20, lsr #PLAT_RK_CLST_TO_CPUID_SHIFT 1526fba6e04STony Xie /* -------------------------------------------------------------------- 1536fba6e04STony Xie * get per cpuup flag 1546fba6e04STony Xie * -------------------------------------------------------------------- 1556fba6e04STony Xie */ 1566fba6e04STony Xie adr x4, cpuson_flags 157*9ec78bdfSTony Xie add x4, x4, x21, lsl #2 1586fba6e04STony Xie ldr w1, [x4] 1596fba6e04STony Xie /* -------------------------------------------------------------------- 1606fba6e04STony Xie * check cpuon reason 1616fba6e04STony Xie * -------------------------------------------------------------------- 1626fba6e04STony Xie */ 163*9ec78bdfSTony Xie cmp w1, PMU_CPU_AUTO_PWRDN 1646fba6e04STony Xie b.eq boot_entry 165*9ec78bdfSTony Xie cmp w1, PMU_CPU_HOTPLUG 1666fba6e04STony Xie b.eq boot_entry 1676fba6e04STony Xie /* -------------------------------------------------------------------- 1686fba6e04STony Xie * If the boot core cpuson_flags or cpuson_entry_point is not 1696fba6e04STony Xie * expection. force the core into wfe. 1706fba6e04STony Xie * -------------------------------------------------------------------- 1716fba6e04STony Xie */ 1726fba6e04STony Xiewfe_loop: 1736fba6e04STony Xie wfe 1746fba6e04STony Xie b wfe_loop 1756fba6e04STony Xieboot_entry: 176*9ec78bdfSTony Xie str wzr, [x4] 177f47a25ddSCaesar Wang /* -------------------------------------------------------------------- 178f47a25ddSCaesar Wang * get per cpuup boot addr 179f47a25ddSCaesar Wang * -------------------------------------------------------------------- 180f47a25ddSCaesar Wang */ 181f47a25ddSCaesar Wang adr x5, cpuson_entry_point 182*9ec78bdfSTony Xie ldr x2, [x5, x21, lsl #3] 1836fba6e04STony Xie br x2 1846fba6e04STony Xieendfunc platform_cpu_warmboot 1856fba6e04STony Xie 1866fba6e04STony Xie /* -------------------------------------------------------------------- 1876fba6e04STony Xie * Per-CPU Secure entry point - resume or power up 1886fba6e04STony Xie * -------------------------------------------------------------------- 1896fba6e04STony Xie */ 1906fba6e04STony Xie .section tzfw_coherent_mem, "a" 1916fba6e04STony Xie .align 3 1926fba6e04STony Xiecpuson_entry_point: 1936fba6e04STony Xie .rept PLATFORM_CORE_COUNT 1946fba6e04STony Xie .quad 0 1956fba6e04STony Xie .endr 1966fba6e04STony Xiecpuson_flags: 1976fba6e04STony Xie .rept PLATFORM_CORE_COUNT 198f47a25ddSCaesar Wang .word 0 1996fba6e04STony Xie .endr 200*9ec78bdfSTony Xierockchip_clst_warmboot_data 201