xref: /arm-trusted-firmware/plat/rockchip/common/aarch32/plat_helpers.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu
7*91f16700Schasinglulu#include <platform_def.h>
8*91f16700Schasinglulu
9*91f16700Schasinglulu#include <arch.h>
10*91f16700Schasinglulu#include <asm_macros.S>
11*91f16700Schasinglulu#include <common/bl_common.h>
12*91f16700Schasinglulu#include <cortex_a12.h>
13*91f16700Schasinglulu#include <plat_private.h>
14*91f16700Schasinglulu#include <plat_pmu_macros.S>
15*91f16700Schasinglulu
16*91f16700Schasinglulu	.globl	cpuson_entry_point
17*91f16700Schasinglulu	.globl	cpuson_flags
18*91f16700Schasinglulu	.globl	platform_cpu_warmboot
19*91f16700Schasinglulu	.globl	plat_secondary_cold_boot_setup
20*91f16700Schasinglulu	.globl	plat_report_exception
21*91f16700Schasinglulu	.globl	plat_is_my_cpu_primary
22*91f16700Schasinglulu	.globl	plat_my_core_pos
23*91f16700Schasinglulu	.globl	plat_reset_handler
24*91f16700Schasinglulu	.globl	plat_panic_handler
25*91f16700Schasinglulu
26*91f16700Schasinglulu	/*
27*91f16700Schasinglulu	 * void plat_reset_handler(void);
28*91f16700Schasinglulu	 *
29*91f16700Schasinglulu	 * Determine the SOC type and call the appropriate reset
30*91f16700Schasinglulu	 * handler.
31*91f16700Schasinglulu	 *
32*91f16700Schasinglulu	 */
33*91f16700Schasinglulufunc plat_reset_handler
34*91f16700Schasinglulu	bx	lr
35*91f16700Schasingluluendfunc plat_reset_handler
36*91f16700Schasinglulu
37*91f16700Schasinglulufunc plat_my_core_pos
38*91f16700Schasinglulu	ldcopr	r0, MPIDR
39*91f16700Schasinglulu	and	r1, r0, #MPIDR_CPU_MASK
40*91f16700Schasinglulu#ifdef PLAT_RK_MPIDR_CLUSTER_MASK
41*91f16700Schasinglulu	and	r0, r0, #PLAT_RK_MPIDR_CLUSTER_MASK
42*91f16700Schasinglulu#else
43*91f16700Schasinglulu	and	r0, r0, #MPIDR_CLUSTER_MASK
44*91f16700Schasinglulu#endif
45*91f16700Schasinglulu	add	r0, r1, r0, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT
46*91f16700Schasinglulu	bx	lr
47*91f16700Schasingluluendfunc plat_my_core_pos
48*91f16700Schasinglulu
49*91f16700Schasinglulu	/* --------------------------------------------------------------------
50*91f16700Schasinglulu	 * void plat_secondary_cold_boot_setup (void);
51*91f16700Schasinglulu	 *
52*91f16700Schasinglulu	 * This function performs any platform specific actions
53*91f16700Schasinglulu	 * needed for a secondary cpu after a cold reset e.g
54*91f16700Schasinglulu	 * mark the cpu's presence, mechanism to place it in a
55*91f16700Schasinglulu	 * holding pen etc.
56*91f16700Schasinglulu	 * --------------------------------------------------------------------
57*91f16700Schasinglulu	 */
58*91f16700Schasinglulufunc plat_secondary_cold_boot_setup
59*91f16700Schasinglulu	/* rk3288 does not do cold boot for secondary CPU */
60*91f16700Schasinglulucb_panic:
61*91f16700Schasinglulu	b	cb_panic
62*91f16700Schasingluluendfunc plat_secondary_cold_boot_setup
63*91f16700Schasinglulu
64*91f16700Schasinglulufunc plat_is_my_cpu_primary
65*91f16700Schasinglulu	ldcopr	r0, MPIDR
66*91f16700Schasinglulu#ifdef PLAT_RK_MPIDR_CLUSTER_MASK
67*91f16700Schasinglulu	ldr	r1, =(PLAT_RK_MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
68*91f16700Schasinglulu#else
69*91f16700Schasinglulu	ldr	r1, =(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
70*91f16700Schasinglulu#endif
71*91f16700Schasinglulu	and	r0, r1
72*91f16700Schasinglulu	cmp	r0, #PLAT_RK_PRIMARY_CPU
73*91f16700Schasinglulu	moveq	r0, #1
74*91f16700Schasinglulu	movne	r0, #0
75*91f16700Schasinglulu	bx	lr
76*91f16700Schasingluluendfunc plat_is_my_cpu_primary
77*91f16700Schasinglulu
78*91f16700Schasinglulu	/* --------------------------------------------------------------------
79*91f16700Schasinglulu	 * void plat_panic_handler(void)
80*91f16700Schasinglulu	 * Call system reset function on panic. Set up an emergency stack so we
81*91f16700Schasinglulu	 * can run C functions (it only needs to last for a few calls until we
82*91f16700Schasinglulu	 * reboot anyway).
83*91f16700Schasinglulu	 * --------------------------------------------------------------------
84*91f16700Schasinglulu	 */
85*91f16700Schasinglulufunc plat_panic_handler
86*91f16700Schasinglulu	bl	plat_set_my_stack
87*91f16700Schasinglulu	b	rockchip_soc_soft_reset
88*91f16700Schasingluluendfunc plat_panic_handler
89*91f16700Schasinglulu
90*91f16700Schasinglulu	/* --------------------------------------------------------------------
91*91f16700Schasinglulu	 * void platform_cpu_warmboot (void);
92*91f16700Schasinglulu	 * cpus online or resume entrypoint
93*91f16700Schasinglulu	 * --------------------------------------------------------------------
94*91f16700Schasinglulu	 */
95*91f16700Schasinglulufunc platform_cpu_warmboot _align=16
96*91f16700Schasinglulu	push	{ r4 - r7, lr }
97*91f16700Schasinglulu	ldcopr	r0, MPIDR
98*91f16700Schasinglulu	and	r5, r0, #MPIDR_CPU_MASK
99*91f16700Schasinglulu#ifdef PLAT_RK_MPIDR_CLUSTER_MASK
100*91f16700Schasinglulu	and	r6, r0, #PLAT_RK_MPIDR_CLUSTER_MASK
101*91f16700Schasinglulu#else
102*91f16700Schasinglulu	and	r6, r0, #MPIDR_CLUSTER_MASK
103*91f16700Schasinglulu#endif
104*91f16700Schasinglulu	mov	r0, r6
105*91f16700Schasinglulu
106*91f16700Schasinglulu	func_rockchip_clst_warmboot
107*91f16700Schasinglulu	/* --------------------------------------------------------------------
108*91f16700Schasinglulu	 * big cluster id is 1
109*91f16700Schasinglulu	 * big cores id is from 0-3, little cores id 4-7
110*91f16700Schasinglulu	 * --------------------------------------------------------------------
111*91f16700Schasinglulu	 */
112*91f16700Schasinglulu	add	r7, r5, r6, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT
113*91f16700Schasinglulu	/* --------------------------------------------------------------------
114*91f16700Schasinglulu	 * get per cpuup flag
115*91f16700Schasinglulu         * --------------------------------------------------------------------
116*91f16700Schasinglulu	 */
117*91f16700Schasinglulu	ldr	r4, =cpuson_flags
118*91f16700Schasinglulu	add	r4, r4, r7, lsl #2
119*91f16700Schasinglulu	ldr	r1, [r4]
120*91f16700Schasinglulu	/* --------------------------------------------------------------------
121*91f16700Schasinglulu	 * check cpuon reason
122*91f16700Schasinglulu         * --------------------------------------------------------------------
123*91f16700Schasinglulu	 */
124*91f16700Schasinglulu	cmp	r1, #PMU_CPU_AUTO_PWRDN
125*91f16700Schasinglulu	beq	boot_entry
126*91f16700Schasinglulu	cmp	r1, #PMU_CPU_HOTPLUG
127*91f16700Schasinglulu	beq	boot_entry
128*91f16700Schasinglulu	/* --------------------------------------------------------------------
129*91f16700Schasinglulu	 * If the boot core cpuson_flags or cpuson_entry_point is not
130*91f16700Schasinglulu	 * expection. force the core into wfe.
131*91f16700Schasinglulu	 * --------------------------------------------------------------------
132*91f16700Schasinglulu	 */
133*91f16700Schasingluluwfe_loop:
134*91f16700Schasinglulu	wfe
135*91f16700Schasinglulu	b	wfe_loop
136*91f16700Schasingluluboot_entry:
137*91f16700Schasinglulu	mov	r1, #0
138*91f16700Schasinglulu	str	r1, [r4]
139*91f16700Schasinglulu	/* --------------------------------------------------------------------
140*91f16700Schasinglulu	 * get per cpuup boot addr
141*91f16700Schasinglulu	 * --------------------------------------------------------------------
142*91f16700Schasinglulu	 */
143*91f16700Schasinglulu	ldr	r5, =cpuson_entry_point
144*91f16700Schasinglulu	ldr	r2, [r5, r7, lsl #2] /* ehem. #3 */
145*91f16700Schasinglulu	pop	{ r4 - r7, lr }
146*91f16700Schasinglulu
147*91f16700Schasinglulu	bx	r2
148*91f16700Schasingluluendfunc platform_cpu_warmboot
149*91f16700Schasinglulu
150*91f16700Schasinglulu	/* --------------------------------------------------------------------
151*91f16700Schasinglulu	 * Per-CPU Secure entry point - resume or power up
152*91f16700Schasinglulu	 * --------------------------------------------------------------------
153*91f16700Schasinglulu	 */
154*91f16700Schasinglulu	.section .tzfw_coherent_mem, "a"
155*91f16700Schasinglulu	.align  3
156*91f16700Schasinglulucpuson_entry_point:
157*91f16700Schasinglulu	.rept	PLATFORM_CORE_COUNT
158*91f16700Schasinglulu	.quad	0
159*91f16700Schasinglulu	.endr
160*91f16700Schasinglulucpuson_flags:
161*91f16700Schasinglulu	.rept	PLATFORM_CORE_COUNT
162*91f16700Schasinglulu	.word	0
163*91f16700Schasinglulu	.endr
164*91f16700Schasinglulurockchip_clst_warmboot_data
165