xref: /rk3399_ARM-atf/plat/rockchip/common/aarch64/plat_helpers.S (revision 6fba6e0490584036fe1210986d6db439b22cb03e)
1*6fba6e04STony Xie/*
2*6fba6e04STony Xie * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
3*6fba6e04STony Xie *
4*6fba6e04STony Xie * Redistribution and use in source and binary forms, with or without
5*6fba6e04STony Xie * modification, are permitted provided that the following conditions are met:
6*6fba6e04STony Xie *
7*6fba6e04STony Xie * Redistributions of source code must retain the above copyright notice, this
8*6fba6e04STony Xie * list of conditions and the following disclaimer.
9*6fba6e04STony Xie *
10*6fba6e04STony Xie * Redistributions in binary form must reproduce the above copyright notice,
11*6fba6e04STony Xie * this list of conditions and the following disclaimer in the documentation
12*6fba6e04STony Xie * and/or other materials provided with the distribution.
13*6fba6e04STony Xie *
14*6fba6e04STony Xie * Neither the name of ARM nor the names of its contributors may be used
15*6fba6e04STony Xie * to endorse or promote products derived from this software without specific
16*6fba6e04STony Xie * prior written permission.
17*6fba6e04STony Xie *
18*6fba6e04STony Xie * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19*6fba6e04STony Xie * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*6fba6e04STony Xie * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*6fba6e04STony Xie * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22*6fba6e04STony Xie * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*6fba6e04STony Xie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*6fba6e04STony Xie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*6fba6e04STony Xie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*6fba6e04STony Xie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*6fba6e04STony Xie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*6fba6e04STony Xie * POSSIBILITY OF SUCH DAMAGE.
29*6fba6e04STony Xie */
30*6fba6e04STony Xie
31*6fba6e04STony Xie#include <arch.h>
32*6fba6e04STony Xie#include <asm_macros.S>
33*6fba6e04STony Xie#include <bl_common.h>
34*6fba6e04STony Xie#include <cortex_a53.h>
35*6fba6e04STony Xie#include <cortex_a72.h>
36*6fba6e04STony Xie#include <plat_private.h>
37*6fba6e04STony Xie#include <platform_def.h>
38*6fba6e04STony Xie
39*6fba6e04STony Xie	.globl	cpuson_entry_point
40*6fba6e04STony Xie	.globl	cpuson_flags
41*6fba6e04STony Xie	.globl	platform_cpu_warmboot
42*6fba6e04STony Xie	.globl	plat_secondary_cold_boot_setup
43*6fba6e04STony Xie	.globl	plat_report_exception
44*6fba6e04STony Xie	.globl	platform_is_primary_cpu
45*6fba6e04STony Xie	.globl	plat_crash_console_init
46*6fba6e04STony Xie	.globl	plat_crash_console_putc
47*6fba6e04STony Xie	.globl	plat_my_core_pos
48*6fba6e04STony Xie	.globl	plat_reset_handler
49*6fba6e04STony Xie
50*6fba6e04STony Xie
51*6fba6e04STony Xie#define RK_REVISION(rev) RK_PLAT_CFG##rev
52*6fba6e04STony Xie#define RK_HANDLER(rev) plat_reset_handler_juno_r##rev
53*6fba6e04STony Xie#define JUMP_TO_HANDLER_IF_RK_R(revision)	\
54*6fba6e04STony Xie	jump_to_handler RK_REVISION(revision), RK_HANDLER(revision)
55*6fba6e04STony Xie
56*6fba6e04STony Xie	/*
57*6fba6e04STony Xie	 * Helper macro to jump to the given handler if the board revision
58*6fba6e04STony Xie	 * matches.
59*6fba6e04STony Xie	 * Expects the Juno board revision in x0.
60*6fba6e04STony Xie	 *
61*6fba6e04STony Xie	 */
62*6fba6e04STony Xie	.macro jump_to_handler _revision, _handler
63*6fba6e04STony Xie	cmp	x0, #\_revision
64*6fba6e04STony Xie	b.eq	\_handler
65*6fba6e04STony Xie	.endm
66*6fba6e04STony Xie
67*6fba6e04STony Xie	/*
68*6fba6e04STony Xie	 * Helper macro that reads the part number of the current CPU and jumps
69*6fba6e04STony Xie	 * to the given label if it matches the CPU MIDR provided.
70*6fba6e04STony Xie	 */
71*6fba6e04STony Xie	.macro  jump_if_cpu_midr _cpu_midr, _label
72*6fba6e04STony Xie	mrs	x0, midr_el1
73*6fba6e04STony Xie	ubfx	x0, x0, MIDR_PN_SHIFT, #12
74*6fba6e04STony Xie	cmp     w0, #((\_cpu_midr >> MIDR_PN_SHIFT) & MIDR_PN_MASK)
75*6fba6e04STony Xie	b.eq	\_label
76*6fba6e04STony Xie	.endm
77*6fba6e04STony Xie
78*6fba6e04STony Xie	/*
79*6fba6e04STony Xie	 * Platform reset handler for rockchip.
80*6fba6e04STony Xie	 * only A53 cores
81*6fba6e04STony Xie	 */
82*6fba6e04STony Xiefunc RK_HANDLER(0)
83*6fba6e04STony Xie	ret
84*6fba6e04STony Xieendfunc RK_HANDLER(0)
85*6fba6e04STony Xie
86*6fba6e04STony Xie	/*
87*6fba6e04STony Xie	 * Platform reset handler for rockchip.
88*6fba6e04STony Xie	 * - Cortex-A53 processor cluster;
89*6fba6e04STony Xie	 * - Cortex-A72 processor cluster.
90*6fba6e04STony Xie	 *
91*6fba6e04STony Xie	 * This handler does the following:
92*6fba6e04STony Xie	 * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A72
93*6fba6e04STony Xie	 * - Set the L2 Tag RAM latency to 1 (i.e. 2 cycles) for Cortex-A72
94*6fba6e04STony Xie	 */
95*6fba6e04STony Xiefunc RK_HANDLER(1)
96*6fba6e04STony Xie	/*
97*6fba6e04STony Xie	 * Nothing to do on Cortex-A53.
98*6fba6e04STony Xie	 *
99*6fba6e04STony Xie	 */
100*6fba6e04STony Xie	jump_if_cpu_midr CORTEX_A72_MIDR, A72
101*6fba6e04STony Xie	ret
102*6fba6e04STony Xie
103*6fba6e04STony XieA72:
104*6fba6e04STony Xie	/* Cortex-A72 specific settings */
105*6fba6e04STony Xie	mov	x0, #((2 << L2CTLR_DATA_RAM_LATENCY_SHIFT) |	\
106*6fba6e04STony Xie		     (0x1 << 5))
107*6fba6e04STony Xie	msr     L2CTLR_EL1, x0
108*6fba6e04STony Xie	isb
109*6fba6e04STony Xie	ret
110*6fba6e04STony Xieendfunc RK_HANDLER(1)
111*6fba6e04STony Xie
112*6fba6e04STony Xie	/*
113*6fba6e04STony Xie	 * void plat_reset_handler(void);
114*6fba6e04STony Xie	 *
115*6fba6e04STony Xie	 * Determine the SOC type and call the appropriate reset
116*6fba6e04STony Xie	 * handler.
117*6fba6e04STony Xie	 *
118*6fba6e04STony Xie	 */
119*6fba6e04STony Xiefunc plat_reset_handler
120*6fba6e04STony Xie
121*6fba6e04STony Xie	mov	x0, RK_PLAT_AARCH_CFG
122*6fba6e04STony Xie
123*6fba6e04STony Xie	JUMP_TO_HANDLER_IF_RK_R(0)
124*6fba6e04STony Xie	JUMP_TO_HANDLER_IF_RK_R(1)
125*6fba6e04STony Xie
126*6fba6e04STony Xie	/* SOC type is not supported */
127*6fba6e04STony Xienot_supported:
128*6fba6e04STony Xie	b	not_supported
129*6fba6e04STony Xieendfunc plat_reset_handler
130*6fba6e04STony Xie
131*6fba6e04STony Xiefunc plat_my_core_pos
132*6fba6e04STony Xie	mrs	x0, mpidr_el1
133*6fba6e04STony Xie	and	x1, x0, #MPIDR_CPU_MASK
134*6fba6e04STony Xie	and	x0, x0, #MPIDR_CLUSTER_MASK
135*6fba6e04STony Xie	add	x0, x1, x0, LSR #6
136*6fba6e04STony Xie	ret
137*6fba6e04STony Xieendfunc plat_my_core_pos
138*6fba6e04STony Xie
139*6fba6e04STony Xie	/* --------------------------------------------------------------------
140*6fba6e04STony Xie	 * void plat_secondary_cold_boot_setup (void);
141*6fba6e04STony Xie	 *
142*6fba6e04STony Xie	 * This function performs any platform specific actions
143*6fba6e04STony Xie	 * needed for a secondary cpu after a cold reset e.g
144*6fba6e04STony Xie	 * mark the cpu's presence, mechanism to place it in a
145*6fba6e04STony Xie	 * holding pen etc.
146*6fba6e04STony Xie	 * --------------------------------------------------------------------
147*6fba6e04STony Xie	 */
148*6fba6e04STony Xiefunc plat_secondary_cold_boot_setup
149*6fba6e04STony Xie	/* rk3368 does not do cold boot for secondary CPU */
150*6fba6e04STony Xiecb_panic:
151*6fba6e04STony Xie	b	cb_panic
152*6fba6e04STony Xieendfunc plat_secondary_cold_boot_setup
153*6fba6e04STony Xie
154*6fba6e04STony Xiefunc platform_is_primary_cpu
155*6fba6e04STony Xie	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
156*6fba6e04STony Xie	cmp	x0, #PLAT_RK_PRIMARY_CPU
157*6fba6e04STony Xie	cset	x0, eq
158*6fba6e04STony Xie	ret
159*6fba6e04STony Xieendfunc platform_is_primary_cpu
160*6fba6e04STony Xie
161*6fba6e04STony Xie	/* --------------------------------------------------------------------
162*6fba6e04STony Xie	 * int plat_crash_console_init(void)
163*6fba6e04STony Xie	 * Function to initialize the crash console
164*6fba6e04STony Xie	 * without a C Runtime to print crash report.
165*6fba6e04STony Xie	 * Clobber list : x0, x1, x2
166*6fba6e04STony Xie	 * --------------------------------------------------------------------
167*6fba6e04STony Xie	 */
168*6fba6e04STony Xiefunc plat_crash_console_init
169*6fba6e04STony Xie	mov_imm	x0, PLAT_RK_UART_BASE
170*6fba6e04STony Xie	mov_imm	x1, PLAT_RK_UART_CLOCK
171*6fba6e04STony Xie	mov_imm	x2, PLAT_RK_UART_BAUDRATE
172*6fba6e04STony Xie	b	console_core_init
173*6fba6e04STony Xieendfunc plat_crash_console_init
174*6fba6e04STony Xie
175*6fba6e04STony Xie	/* --------------------------------------------------------------------
176*6fba6e04STony Xie	 * int plat_crash_console_putc(void)
177*6fba6e04STony Xie	 * Function to print a character on the crash
178*6fba6e04STony Xie	 * console without a C Runtime.
179*6fba6e04STony Xie	 * Clobber list : x1, x2
180*6fba6e04STony Xie	 * --------------------------------------------------------------------
181*6fba6e04STony Xie	 */
182*6fba6e04STony Xiefunc plat_crash_console_putc
183*6fba6e04STony Xie	mov_imm x1, PLAT_RK_UART_BASE
184*6fba6e04STony Xie	b	console_core_putc
185*6fba6e04STony Xieendfunc plat_crash_console_putc
186*6fba6e04STony Xie
187*6fba6e04STony Xie	/* --------------------------------------------------------------------
188*6fba6e04STony Xie	 * void platform_cpu_warmboot (void);
189*6fba6e04STony Xie	 * cpus online or resume enterpoint
190*6fba6e04STony Xie	 * --------------------------------------------------------------------
191*6fba6e04STony Xie	 */
192*6fba6e04STony Xiefunc platform_cpu_warmboot
193*6fba6e04STony Xie	mrs	x0, MPIDR_EL1
194*6fba6e04STony Xie	and	x1, x0, #MPIDR_CPU_MASK
195*6fba6e04STony Xie	and	x0, x0, #MPIDR_CLUSTER_MASK
196*6fba6e04STony Xie	/* --------------------------------------------------------------------
197*6fba6e04STony Xie	 * big cluster id is 1
198*6fba6e04STony Xie	 * big cores id is from 0-3, little cores id 4-7
199*6fba6e04STony Xie	 * --------------------------------------------------------------------
200*6fba6e04STony Xie	 */
201*6fba6e04STony Xie	add	x0, x1, x0, lsr #6
202*6fba6e04STony Xie	/* --------------------------------------------------------------------
203*6fba6e04STony Xie	 * get per cpuup flag
204*6fba6e04STony Xie         * --------------------------------------------------------------------
205*6fba6e04STony Xie	 */
206*6fba6e04STony Xie	adr	x4, cpuson_flags
207*6fba6e04STony Xie	add	x4, x4, x0, lsl #2
208*6fba6e04STony Xie	ldr	w1, [x4]
209*6fba6e04STony Xie	/* --------------------------------------------------------------------
210*6fba6e04STony Xie	 * get per cpuup boot addr
211*6fba6e04STony Xie         * --------------------------------------------------------------------
212*6fba6e04STony Xie	 */
213*6fba6e04STony Xie	adr	x5, cpuson_entry_point
214*6fba6e04STony Xie	ldr	x2, [x5, x0, lsl #3]
215*6fba6e04STony Xie	/* --------------------------------------------------------------------
216*6fba6e04STony Xie	 * check cpuon reason
217*6fba6e04STony Xie         * --------------------------------------------------------------------
218*6fba6e04STony Xie	 */
219*6fba6e04STony Xie	ldr	w3, =PMU_CPU_AUTO_PWRDN
220*6fba6e04STony Xie	cmp	w1, w3
221*6fba6e04STony Xie	b.eq	boot_entry
222*6fba6e04STony Xie	ldr	w3, =PMU_CPU_HOTPLUG
223*6fba6e04STony Xie	cmp	w1, w3
224*6fba6e04STony Xie	b.eq	boot_entry
225*6fba6e04STony Xie	/* --------------------------------------------------------------------
226*6fba6e04STony Xie	 * If the boot core cpuson_flags or cpuson_entry_point is not
227*6fba6e04STony Xie	 * expection. force the core into wfe.
228*6fba6e04STony Xie         * --------------------------------------------------------------------
229*6fba6e04STony Xie	 */
230*6fba6e04STony Xiewfe_loop:
231*6fba6e04STony Xie	wfe
232*6fba6e04STony Xie	b	wfe_loop
233*6fba6e04STony Xieboot_entry:
234*6fba6e04STony Xie	mov	w0, #0
235*6fba6e04STony Xie	str	w0, [x4]
236*6fba6e04STony Xie	br	x2
237*6fba6e04STony Xieendfunc platform_cpu_warmboot
238*6fba6e04STony Xie
239*6fba6e04STony Xie	/* --------------------------------------------------------------------
240*6fba6e04STony Xie	 * Per-CPU Secure entry point - resume or power up
241*6fba6e04STony Xie	 * --------------------------------------------------------------------
242*6fba6e04STony Xie	 */
243*6fba6e04STony Xie	.section tzfw_coherent_mem, "a"
244*6fba6e04STony Xie	.align  3
245*6fba6e04STony Xiecpuson_entry_point:
246*6fba6e04STony Xie	.rept	PLATFORM_CORE_COUNT
247*6fba6e04STony Xie	.quad	0
248*6fba6e04STony Xie	.endr
249*6fba6e04STony Xiecpuson_flags:
250*6fba6e04STony Xie	.rept	PLATFORM_CORE_COUNT
251*6fba6e04STony Xie	.quad	0
252*6fba6e04STony Xie	.endr
253