xref: /rk3399_ARM-atf/plat/rockchip/common/aarch64/plat_helpers.S (revision f47a25ddd876738c7b078efc002a48c53e48d7c0)
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