blob: 373f2fc89385c194a4705d7dbca88c6c6c678657 [file] [log] [blame]
Sandrine Bailleux798140d2014-07-17 16:06:39 +01001/*
Dimitris Papastamosaa11c392017-06-19 14:15:31 +01002 * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
Sandrine Bailleux798140d2014-07-17 16:06:39 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Sandrine Bailleux798140d2014-07-17 16:06:39 +01005 */
6
7#include <arch.h>
8#include <asm_macros.S>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00009#include <common/bl_common.h>
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000010#include <cortex_a53.h>
Sandrine Bailleux798140d2014-07-17 16:06:39 +010011#include <cortex_a57.h>
Sandrine Bailleux29a7a032015-11-18 11:59:35 +000012#include <cortex_a72.h>
Yatharth Kocharede39cb2016-11-14 12:01:04 +000013#include <cpu_macros.S>
14#include <css_def.h>
Dan Handley7bef8002015-03-19 19:22:44 +000015#include <v2m_def.h>
Sandrine Bailleux798140d2014-07-17 16:06:39 +010016#include "../juno_def.h"
17
Sandrine Bailleux798140d2014-07-17 16:06:39 +010018
Dan Handley7bef8002015-03-19 19:22:44 +000019 .globl plat_reset_handler
David Wang323ebe82015-10-22 13:30:50 +080020 .globl plat_arm_calc_core_pos
Yatharth Kocharede39cb2016-11-14 12:01:04 +000021#if JUNO_AARCH32_EL3_RUNTIME
22 .globl plat_get_my_entrypoint
23 .globl juno_reset_to_aarch32_state
24#endif
Sandrine Bailleux798140d2014-07-17 16:06:39 +010025
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000026#define JUNO_REVISION(rev) REV_JUNO_R##rev
27#define JUNO_HANDLER(rev) plat_reset_handler_juno_r##rev
28#define JUMP_TO_HANDLER_IF_JUNO_R(revision) \
29 jump_to_handler JUNO_REVISION(revision), JUNO_HANDLER(revision)
30
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +000031 /* --------------------------------------------------------------------
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000032 * Helper macro to jump to the given handler if the board revision
33 * matches.
34 * Expects the Juno board revision in x0.
35 * --------------------------------------------------------------------
36 */
37 .macro jump_to_handler _revision, _handler
38 cmp x0, #\_revision
39 b.eq \_handler
40 .endm
41
42 /* --------------------------------------------------------------------
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000043 * Platform reset handler for Juno R0.
Sandrine Bailleux798140d2014-07-17 16:06:39 +010044 *
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000045 * Juno R0 has the following topology:
46 * - Quad core Cortex-A53 processor cluster;
47 * - Dual core Cortex-A57 processor cluster.
48 *
49 * This handler does the following:
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +000050 * - Implement workaround for defect id 831273 by enabling an event
51 * stream every 65536 cycles.
52 * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
53 * - Set the L2 Tag RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +000054 * --------------------------------------------------------------------
Sandrine Bailleux798140d2014-07-17 16:06:39 +010055 */
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000056func JUNO_HANDLER(0)
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +000057 /* --------------------------------------------------------------------
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000058 * Enable the event stream every 65536 cycles
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +000059 * --------------------------------------------------------------------
60 */
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000061 mov x0, #(0xf << EVNTI_SHIFT)
62 orr x0, x0, #EVNTEN_BIT
63 msr CNTKCTL_EL1, x0
64
65 /* --------------------------------------------------------------------
66 * Nothing else to do on Cortex-A53.
67 * --------------------------------------------------------------------
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +000068 */
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000069 jump_if_cpu_midr CORTEX_A53_MIDR, 1f
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +000070
71 /* --------------------------------------------------------------------
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000072 * Cortex-A57 specific settings
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +000073 * --------------------------------------------------------------------
74 */
Varun Wadekar1384a162017-06-05 14:54:46 -070075 mov x0, #((CORTEX_A57_L2_DATA_RAM_LATENCY_3_CYCLES << CORTEX_A57_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
76 (CORTEX_A57_L2_TAG_RAM_LATENCY_3_CYCLES << CORTEX_A57_L2CTLR_TAG_RAM_LATENCY_SHIFT))
77 msr CORTEX_A57_L2CTLR_EL1, x0
Sandrine Bailleux9d548a22015-11-18 11:10:30 +0000781:
79 isb
80 ret
81endfunc JUNO_HANDLER(0)
Sandrine Bailleux798140d2014-07-17 16:06:39 +010082
Sandrine Bailleux9d548a22015-11-18 11:10:30 +000083 /* --------------------------------------------------------------------
84 * Platform reset handler for Juno R1.
85 *
86 * Juno R1 has the following topology:
87 * - Quad core Cortex-A53 processor cluster;
88 * - Dual core Cortex-A57 processor cluster.
89 *
90 * This handler does the following:
91 * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
92 *
93 * Note that:
94 * - The default value for the L2 Tag RAM latency for Cortex-A57 is
95 * suitable.
96 * - Defect #831273 doesn't affect Juno R1.
97 * --------------------------------------------------------------------
98 */
99func JUNO_HANDLER(1)
100 /* --------------------------------------------------------------------
101 * Nothing to do on Cortex-A53.
102 * --------------------------------------------------------------------
103 */
104 jump_if_cpu_midr CORTEX_A57_MIDR, A57
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +0000105 ret
106
107A57:
108 /* --------------------------------------------------------------------
109 * Cortex-A57 specific settings
110 * --------------------------------------------------------------------
111 */
Varun Wadekar1384a162017-06-05 14:54:46 -0700112 mov x0, #(CORTEX_A57_L2_DATA_RAM_LATENCY_3_CYCLES << CORTEX_A57_L2CTLR_DATA_RAM_LATENCY_SHIFT)
113 msr CORTEX_A57_L2CTLR_EL1, x0
Sandrine Bailleux9d548a22015-11-18 11:10:30 +0000114 isb
115 ret
116endfunc JUNO_HANDLER(1)
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +0000117
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +0000118 /* --------------------------------------------------------------------
Sandrine Bailleux9d548a22015-11-18 11:10:30 +0000119 * Platform reset handler for Juno R2.
120 *
121 * Juno R2 has the following topology:
122 * - Quad core Cortex-A53 processor cluster;
123 * - Dual core Cortex-A72 processor cluster.
124 *
Sandrine Bailleux29a7a032015-11-18 11:59:35 +0000125 * This handler does the following:
126 * - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A72
127 * - Set the L2 Tag RAM latency to 1 (i.e. 2 cycles) for Cortex-A72
128 *
129 * Note that:
130 * - Defect #831273 doesn't affect Juno R2.
Sandrine Bailleuxfd8f8982015-02-04 14:06:10 +0000131 * --------------------------------------------------------------------
Yatharth Kochar36433d12014-11-20 18:09:41 +0000132 */
Sandrine Bailleux9d548a22015-11-18 11:10:30 +0000133func JUNO_HANDLER(2)
Sandrine Bailleux29a7a032015-11-18 11:59:35 +0000134 /* --------------------------------------------------------------------
135 * Nothing to do on Cortex-A53.
136 * --------------------------------------------------------------------
137 */
138 jump_if_cpu_midr CORTEX_A72_MIDR, A72
139 ret
140
141A72:
142 /* --------------------------------------------------------------------
143 * Cortex-A72 specific settings
144 * --------------------------------------------------------------------
145 */
Varun Wadekar1384a162017-06-05 14:54:46 -0700146 mov x0, #((CORTEX_A72_L2_DATA_RAM_LATENCY_3_CYCLES << CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
147 (CORTEX_A72_L2_TAG_RAM_LATENCY_2_CYCLES << CORTEX_A72_L2CTLR_TAG_RAM_LATENCY_SHIFT))
148 msr CORTEX_A57_L2CTLR_EL1, x0
Sandrine Bailleux29a7a032015-11-18 11:59:35 +0000149 isb
Sandrine Bailleux798140d2014-07-17 16:06:39 +0100150 ret
Sandrine Bailleux9d548a22015-11-18 11:10:30 +0000151endfunc JUNO_HANDLER(2)
152
153 /* --------------------------------------------------------------------
154 * void plat_reset_handler(void);
155 *
156 * Determine the Juno board revision and call the appropriate reset
157 * handler.
158 * --------------------------------------------------------------------
159 */
160func plat_reset_handler
161 /* Read the V2M SYS_ID register */
162 mov_imm x0, (V2M_SYSREGS_BASE + V2M_SYS_ID)
163 ldr w1, [x0]
164 /* Extract board revision from the SYS_ID */
165 ubfx x0, x1, #V2M_SYS_ID_REV_SHIFT, #4
166
167 JUMP_TO_HANDLER_IF_JUNO_R(0)
168 JUMP_TO_HANDLER_IF_JUNO_R(1)
169 JUMP_TO_HANDLER_IF_JUNO_R(2)
170
171 /* Board revision is not supported */
Jeenu Viswambharan68aef102016-11-30 15:21:11 +0000172 no_ret plat_panic_handler
Sandrine Bailleux9d548a22015-11-18 11:10:30 +0000173
Kévin Petita877c252015-03-24 14:03:57 +0000174endfunc plat_reset_handler
David Wang323ebe82015-10-22 13:30:50 +0800175
176 /* -----------------------------------------------------
Yatharth Kocharede39cb2016-11-14 12:01:04 +0000177 * void juno_do_reset_to_aarch32_state(void);
178 *
179 * Request warm reset to AArch32 mode.
180 * -----------------------------------------------------
181 */
182func juno_do_reset_to_aarch32_state
183 mov x0, #RMR_EL3_RR_BIT
184 dsb sy
185 msr rmr_el3, x0
186 isb
187 wfi
Roberto Vargas9c685a82017-09-01 15:08:47 +0100188 b plat_panic_handler
Yatharth Kocharede39cb2016-11-14 12:01:04 +0000189endfunc juno_do_reset_to_aarch32_state
190
191 /* -----------------------------------------------------
Soby Mathewa0fedc42016-06-16 14:52:04 +0100192 * unsigned int plat_arm_calc_core_pos(u_register_t mpidr)
David Wang323ebe82015-10-22 13:30:50 +0800193 * Helper function to calculate the core position.
194 * -----------------------------------------------------
195 */
196func plat_arm_calc_core_pos
197 b css_calc_core_pos_swap_cluster
198endfunc plat_arm_calc_core_pos
Yatharth Kocharede39cb2016-11-14 12:01:04 +0000199
200#if JUNO_AARCH32_EL3_RUNTIME
201 /* ---------------------------------------------------------------------
202 * uintptr_t plat_get_my_entrypoint (void);
203 *
204 * Main job of this routine is to distinguish between a cold and a warm
205 * boot. On JUNO platform, this distinction is based on the contents of
206 * the Trusted Mailbox. It is initialised to zero by the SCP before the
207 * AP cores are released from reset. Therefore, a zero mailbox means
208 * it's a cold reset. If it is a warm boot then a request to reset to
209 * AArch32 state is issued. This is the only way to reset to AArch32
210 * in EL3 on Juno. A trampoline located at the high vector address
211 * has already been prepared by BL1.
212 *
213 * This functions returns the contents of the mailbox, i.e.:
214 * - 0 for a cold boot;
215 * - request warm reset in AArch32 state for warm boot case;
216 * ---------------------------------------------------------------------
217 */
218func plat_get_my_entrypoint
219 mov_imm x0, PLAT_ARM_TRUSTED_MAILBOX_BASE
220 ldr x0, [x0]
221 cbz x0, return
222 b juno_do_reset_to_aarch32_state
Yatharth Kocharede39cb2016-11-14 12:01:04 +0000223return:
224 ret
225endfunc plat_get_my_entrypoint
226
227/*
228 * Emit a "movw r0, #imm16" which moves the lower
229 * 16 bits of `_val` into r0.
230 */
231.macro emit_movw _reg_d, _val
232 mov_imm \_reg_d, (0xe3000000 | \
233 ((\_val & 0xfff) | \
234 ((\_val & 0xf000) << 4)))
235.endm
236
237/*
238 * Emit a "movt r0, #imm16" which moves the upper
239 * 16 bits of `_val` into r0.
240 */
241.macro emit_movt _reg_d, _val
242 mov_imm \_reg_d, (0xe3400000 | \
243 (((\_val & 0x0fff0000) >> 16) | \
244 ((\_val & 0xf0000000) >> 12)))
245.endm
246
247/*
248 * This function writes the trampoline code at HI-VEC (0xFFFF0000)
249 * address which loads r0 with the entrypoint address for
250 * BL32 (a.k.a SP_MIN) when EL3 is in AArch32 mode. A warm reset
251 * to AArch32 mode is then requested by writing into RMR_EL3.
252 */
253func juno_reset_to_aarch32_state
Dimitris Papastamosaa11c392017-06-19 14:15:31 +0100254 /*
255 * Invalidate all caches before the warm reset to AArch32 state.
256 * This is required on the Juno AArch32 boot flow because the L2
257 * unified cache may contain code and data from when the processor
258 * was still executing in AArch64 state. This code only runs on
259 * the primary core, all other cores are powered down.
260 */
261 mov x0, #DCISW
262 bl dcsw_op_all
263
Yatharth Kocharede39cb2016-11-14 12:01:04 +0000264 emit_movw w0, BL32_BASE
265 emit_movt w1, BL32_BASE
266 /* opcode "bx r0" to branch using r0 in AArch32 mode */
267 mov_imm w2, 0xe12fff10
268
269 /* Write the above opcodes at HI-VECTOR location */
270 mov_imm x3, HI_VECTOR_BASE
271 str w0, [x3], #4
272 str w1, [x3], #4
273 str w2, [x3]
274
Roberto Vargas9c685a82017-09-01 15:08:47 +0100275 b juno_do_reset_to_aarch32_state
Yatharth Kocharede39cb2016-11-14 12:01:04 +0000276endfunc juno_reset_to_aarch32_state
277
278#endif /* JUNO_AARCH32_EL3_RUNTIME */