xref: /rk3399_ARM-atf/plat/rockchip/common/aarch64/plat_helpers.S (revision 61f72a34250d063da67f4fc2b0eb8c3fda3376be)
1/*
2 * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
9#include <bl_common.h>
10#include <cortex_a53.h>
11#include <cortex_a72.h>
12#include <plat_private.h>
13#include <platform_def.h>
14#include <plat_pmu_macros.S>
15
16	.globl	cpuson_entry_point
17	.globl	cpuson_flags
18	.globl	platform_cpu_warmboot
19	.globl	plat_secondary_cold_boot_setup
20	.globl	plat_report_exception
21	.globl	platform_is_primary_cpu
22	.globl	plat_my_core_pos
23	.globl	plat_reset_handler
24	.globl	plat_panic_handler
25
26	/*
27	 * void plat_reset_handler(void);
28	 *
29	 * Determine the SOC type and call the appropriate reset
30	 * handler.
31	 *
32	 */
33func plat_reset_handler
34	mrs x0, midr_el1
35	ubfx x0, x0, MIDR_PN_SHIFT, #12
36	cmp w0, #((CORTEX_A72_MIDR >> MIDR_PN_SHIFT) & MIDR_PN_MASK)
37	b.eq	handler_a72
38	b	handler_end
39handler_a72:
40	/*
41	 * This handler does the following:
42	 * Set the L2 Data RAM latency for Cortex-A72.
43	 * Set the L2 Tag RAM latency to for Cortex-A72.
44	 */
45	mov x0, #((5 << CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) |	\
46			 (0x1 << 5))
47	msr	CORTEX_A72_L2CTLR_EL1, x0
48	isb
49handler_end:
50	ret
51endfunc plat_reset_handler
52
53func plat_my_core_pos
54	mrs	x0, mpidr_el1
55	and	x1, x0, #MPIDR_CPU_MASK
56	and	x0, x0, #MPIDR_CLUSTER_MASK
57	add	x0, x1, x0, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT
58	ret
59endfunc plat_my_core_pos
60
61	/* --------------------------------------------------------------------
62	 * void plat_secondary_cold_boot_setup (void);
63	 *
64	 * This function performs any platform specific actions
65	 * needed for a secondary cpu after a cold reset e.g
66	 * mark the cpu's presence, mechanism to place it in a
67	 * holding pen etc.
68	 * --------------------------------------------------------------------
69	 */
70func plat_secondary_cold_boot_setup
71	/* rk3368 does not do cold boot for secondary CPU */
72cb_panic:
73	b	cb_panic
74endfunc plat_secondary_cold_boot_setup
75
76func platform_is_primary_cpu
77	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
78	cmp	x0, #PLAT_RK_PRIMARY_CPU
79	cset	x0, eq
80	ret
81endfunc platform_is_primary_cpu
82
83	/* --------------------------------------------------------------------
84	 * void plat_panic_handler(void)
85	 * Call system reset function on panic. Set up an emergency stack so we
86	 * can run C functions (it only needs to last for a few calls until we
87	 * reboot anyway).
88	 * --------------------------------------------------------------------
89	 */
90func plat_panic_handler
91	msr	spsel, #0
92	bl	plat_set_my_stack
93	b	rockchip_soc_soft_reset
94endfunc plat_panic_handler
95
96	/* --------------------------------------------------------------------
97	 * void platform_cpu_warmboot (void);
98	 * cpus online or resume enterpoint
99	 * --------------------------------------------------------------------
100	 */
101func platform_cpu_warmboot _align=16
102	mrs	x0, MPIDR_EL1
103	and	x19, x0, #MPIDR_CPU_MASK
104	and	x20, x0, #MPIDR_CLUSTER_MASK
105	mov	x0, x20
106	func_rockchip_clst_warmboot
107	/* --------------------------------------------------------------------
108	 * big cluster id is 1
109	 * big cores id is from 0-3, little cores id 4-7
110	 * --------------------------------------------------------------------
111	 */
112	add	x21, x19, x20, lsr #PLAT_RK_CLST_TO_CPUID_SHIFT
113	/* --------------------------------------------------------------------
114	 * get per cpuup flag
115         * --------------------------------------------------------------------
116	 */
117	adr	x4, cpuson_flags
118	add	x4, x4, x21, lsl #2
119	ldr	w1, [x4]
120	/* --------------------------------------------------------------------
121	 * check cpuon reason
122         * --------------------------------------------------------------------
123	 */
124	cmp	w1, PMU_CPU_AUTO_PWRDN
125	b.eq	boot_entry
126	cmp	w1, PMU_CPU_HOTPLUG
127	b.eq	boot_entry
128	/* --------------------------------------------------------------------
129	 * If the boot core cpuson_flags or cpuson_entry_point is not
130	 * expection. force the core into wfe.
131         * --------------------------------------------------------------------
132	 */
133wfe_loop:
134	wfe
135	b	wfe_loop
136boot_entry:
137	str	wzr, [x4]
138	/* --------------------------------------------------------------------
139	 * get per cpuup boot addr
140	 * --------------------------------------------------------------------
141	 */
142	adr	x5, cpuson_entry_point
143	ldr	x2, [x5, x21, lsl #3]
144	br	x2
145endfunc platform_cpu_warmboot
146
147	/* --------------------------------------------------------------------
148	 * Per-CPU Secure entry point - resume or power up
149	 * --------------------------------------------------------------------
150	 */
151	.section tzfw_coherent_mem, "a"
152	.align  3
153cpuson_entry_point:
154	.rept	PLATFORM_CORE_COUNT
155	.quad	0
156	.endr
157cpuson_flags:
158	.rept	PLATFORM_CORE_COUNT
159	.word	0
160	.endr
161rockchip_clst_warmboot_data
162