xref: /rk3399_ARM-atf/plat/renesas/common/aarch64/plat_helpers.S (revision cab31629dd6988740d60048f9e854de825564f43)
1fd9b3c5aSBiju Das/*
2bd62ce98SGovindraj Raja * Copyright (c) 2013-2023, Arm Limited and Contributors. All rights reserved.
3*fe87637aSToshiyuki Ogasahara * Copyright (c) 2015-2025, Renesas Electronics Corporation. All rights reserved.
4fd9b3c5aSBiju Das *
5fd9b3c5aSBiju Das * SPDX-License-Identifier: BSD-3-Clause
6fd9b3c5aSBiju Das */
7fd9b3c5aSBiju Das
8fd9b3c5aSBiju Das#include <arch.h>
9fd9b3c5aSBiju Das#include <asm_macros.S>
10fd9b3c5aSBiju Das#include <common/bl_common.h>
11fd9b3c5aSBiju Das#include <common/runtime_svc.h>
12fd9b3c5aSBiju Das#include <cortex_a57.h>
13fd9b3c5aSBiju Das#include <platform_def.h>
14fd9b3c5aSBiju Das
15fd9b3c5aSBiju Das#include "rcar_def.h"
16fd9b3c5aSBiju Das
17fd9b3c5aSBiju Das	.globl	plat_get_my_entrypoint
18fd9b3c5aSBiju Das	.extern	plat_set_my_stack
19fd9b3c5aSBiju Das	.globl	platform_mem_init
20fd9b3c5aSBiju Das
21fd9b3c5aSBiju Das	.globl	plat_crash_console_init
22fd9b3c5aSBiju Das	.globl	plat_crash_console_putc
23fd9b3c5aSBiju Das	.globl	plat_crash_console_flush
24fd9b3c5aSBiju Das	.globl	plat_invalidate_icache
25fd9b3c5aSBiju Das	.globl	plat_report_exception
26fd9b3c5aSBiju Das	.globl	plat_secondary_reset
27fd9b3c5aSBiju Das	.globl	plat_reset_handler
28fd9b3c5aSBiju Das	.globl	plat_my_core_pos
29fd9b3c5aSBiju Das	.extern	rcar_log_init
30fd9b3c5aSBiju Das
31fd9b3c5aSBiju Das	.extern console_rcar_init
32fd9b3c5aSBiju Das	.extern console_rcar_putc
33fd9b3c5aSBiju Das	.extern console_rcar_flush
34fd9b3c5aSBiju Das
35fd9b3c5aSBiju Das#if IMAGE_BL2
36fd9b3c5aSBiju Das	#define	INT_ID_MASK	(0x3ff)
37fd9b3c5aSBiju Das	.extern bl2_interrupt_error_type
38fd9b3c5aSBiju Das	.extern bl2_interrupt_error_id
39fd9b3c5aSBiju Das	.globl  bl2_enter_bl31
40fd9b3c5aSBiju Das	.extern gicv2_acknowledge_interrupt
41fd9b3c5aSBiju Das	.extern rcar_swdt_exec
42fd9b3c5aSBiju Das#endif
43fd9b3c5aSBiju Das
44fd9b3c5aSBiju Das	/* -----------------------------------------------------
45fd9b3c5aSBiju Das	 * void platform_get_core_pos (mpidr)
46fd9b3c5aSBiju Das	 * -----------------------------------------------------
47fd9b3c5aSBiju Das	 */
48fd9b3c5aSBiju Dasfunc platform_get_core_pos
49fd9b3c5aSBiju Das	and     x1, x0, #MPIDR_CPU_MASK
50fd9b3c5aSBiju Das	and     x0, x0, #MPIDR_CLUSTER_MASK
51fd9b3c5aSBiju Das	add     x0, x1, x0, LSR #6
52fd9b3c5aSBiju Das	ret
53fd9b3c5aSBiju Dasendfunc platform_get_core_pos
54fd9b3c5aSBiju Das
55fd9b3c5aSBiju Das	/* -----------------------------------------------------
56fd9b3c5aSBiju Das	 * void platform_my_core_pos
57fd9b3c5aSBiju Das	 * -----------------------------------------------------
58fd9b3c5aSBiju Das	 */
59fd9b3c5aSBiju Dasfunc plat_my_core_pos
60fd9b3c5aSBiju Das	mrs     x0, mpidr_el1
61fd9b3c5aSBiju Das	b	platform_get_core_pos
62fd9b3c5aSBiju Dasendfunc plat_my_core_pos
63fd9b3c5aSBiju Das
64fd9b3c5aSBiju Das	/* -----------------------------------------------------
65fd9b3c5aSBiju Das	 * void platform_get_my_entrypoint (unsigned int mpid);
66fd9b3c5aSBiju Das	 *
67fd9b3c5aSBiju Das	 * Main job of this routine is to distinguish between
68fd9b3c5aSBiju Das	 * a cold and warm boot.
69fd9b3c5aSBiju Das	 * On a cold boot the secondaries first wait for the
70fd9b3c5aSBiju Das	 * platform to be initialized after which they are
71fd9b3c5aSBiju Das	 * hotplugged in. The primary proceeds to perform the
72fd9b3c5aSBiju Das	 * platform initialization.
73fd9b3c5aSBiju Das	 * On a warm boot, each cpu jumps to the address in its
74fd9b3c5aSBiju Das	 * mailbox.
75fd9b3c5aSBiju Das	 *
76fd9b3c5aSBiju Das	 * TODO: Not a good idea to save lr in a temp reg
77fd9b3c5aSBiju Das	 * -----------------------------------------------------
78fd9b3c5aSBiju Das	 */
79fd9b3c5aSBiju Dasfunc plat_get_my_entrypoint
80fd9b3c5aSBiju Das	mrs	x0, mpidr_el1
81fd9b3c5aSBiju Das	mov	x9, x30 /* lr */
82fd9b3c5aSBiju Das
83fd9b3c5aSBiju Das#if defined(IMAGE_BL2)
84fd9b3c5aSBiju Das	/* always cold boot on bl2 */
85fd9b3c5aSBiju Das	mov	x0, #0
86fd9b3c5aSBiju Das	ret	x9
87fd9b3c5aSBiju Das#else
88fd9b3c5aSBiju Das       ldr 	x1, =BOOT_KIND_BASE
89fd9b3c5aSBiju Das       ldr	x21, [x1]
90fd9b3c5aSBiju Das
91fd9b3c5aSBiju Das	/* Check the reset info */
92fd9b3c5aSBiju Das	and	x1, x21, #0x000c
93fd9b3c5aSBiju Das	cmp	x1, #0x0008
94fd9b3c5aSBiju Das	beq	el3_panic
95fd9b3c5aSBiju Das	cmp	x1, #0x000c
96fd9b3c5aSBiju Das	beq	el3_panic
97fd9b3c5aSBiju Das
98fd9b3c5aSBiju Das	/* Check the boot kind */
99fd9b3c5aSBiju Das	and	x1, x21, #0x0003
100fd9b3c5aSBiju Das	cmp	x1, #0x0002
101fd9b3c5aSBiju Das	beq	el3_panic
102fd9b3c5aSBiju Das	cmp	x1, #0x0003
103fd9b3c5aSBiju Das	beq	el3_panic
104fd9b3c5aSBiju Das
105fd9b3c5aSBiju Das	/* warm boot or cold boot */
106fd9b3c5aSBiju Das	and	x1, x21, #1
107fd9b3c5aSBiju Das	cmp	x1, #0
108fd9b3c5aSBiju Das	bne	warm_reset
109fd9b3c5aSBiju Das
110fd9b3c5aSBiju Das	/* Cold boot */
111fd9b3c5aSBiju Das	mov	x0, #0
112fd9b3c5aSBiju Das	b	exit
113fd9b3c5aSBiju Das
114fd9b3c5aSBiju Daswarm_reset:
115fd9b3c5aSBiju Das	/* --------------------------------------------------------------------
116fd9b3c5aSBiju Das	 * A per-cpu mailbox is maintained in the trusted SDRAM. Its flushed out
117fd9b3c5aSBiju Das	 * of the caches after every update using normal memory so its safe to
118fd9b3c5aSBiju Das	 * read it here with SO attributes
119fd9b3c5aSBiju Das	 * ---------------------------------------------------------------------
120fd9b3c5aSBiju Das	 */
121fd9b3c5aSBiju Das	ldr	x10, =MBOX_BASE
122fd9b3c5aSBiju Das	bl	platform_get_core_pos
123fd9b3c5aSBiju Das	lsl	x0, x0, #CACHE_WRITEBACK_SHIFT
124fd9b3c5aSBiju Das	ldr	x0, [x10, x0]
125fd9b3c5aSBiju Das	cbz	x0, _panic
126fd9b3c5aSBiju Dasexit:
127fd9b3c5aSBiju Das	ret	x9
128fd9b3c5aSBiju Das_panic:
129bd62ce98SGovindraj Raja	b	el3_panic
130fd9b3c5aSBiju Das#endif
131fd9b3c5aSBiju Das
132fd9b3c5aSBiju Dasendfunc plat_get_my_entrypoint
133fd9b3c5aSBiju Das
134fd9b3c5aSBiju Das	/* ---------------------------------------------
135fd9b3c5aSBiju Das	 * plat_secondary_reset
136fd9b3c5aSBiju Das	 *
137fd9b3c5aSBiju Das	 * ---------------------------------------------
138fd9b3c5aSBiju Das	 */
139fd9b3c5aSBiju Dasfunc plat_secondary_reset
140fd9b3c5aSBiju Das	mrs	x0, sctlr_el3
141fd9b3c5aSBiju Das	bic	x0, x0, #SCTLR_EE_BIT
142fd9b3c5aSBiju Das	msr	sctlr_el3, x0
143fd9b3c5aSBiju Das	isb
144fd9b3c5aSBiju Das
145fd9b3c5aSBiju Das	mrs	x0, cptr_el3
146fd9b3c5aSBiju Das	bic	w0, w0, #TCPAC_BIT
147fd9b3c5aSBiju Das	bic	w0, w0, #TTA_BIT
148fd9b3c5aSBiju Das	bic	w0, w0, #TFP_BIT
149fd9b3c5aSBiju Das	msr	cptr_el3, x0
150fd9b3c5aSBiju Das
151*fe87637aSToshiyuki Ogasahara	/* Clear TCR_EL1 on secondary cores */
152*fe87637aSToshiyuki Ogasahara	msr	tcr_el1, xzr
153*fe87637aSToshiyuki Ogasahara
154fd9b3c5aSBiju Das	mov_imm	x0, PARAMS_BASE
155fd9b3c5aSBiju Das	mov_imm	x2, BL31_BASE
156fd9b3c5aSBiju Das       ldr x3, =BOOT_KIND_BASE
157fd9b3c5aSBiju Das	mov x1, #0x1
158fd9b3c5aSBiju Das	str x1, [x3]
159fd9b3c5aSBiju Das	br	x2	/* jump to BL31 */
160fd9b3c5aSBiju Das	nop
161fd9b3c5aSBiju Das	nop
162fd9b3c5aSBiju Das	nop
163fd9b3c5aSBiju Dasendfunc plat_secondary_reset
164fd9b3c5aSBiju Das
165fd9b3c5aSBiju Das	/* ---------------------------------------------
166fd9b3c5aSBiju Das	 * plat_enter_bl31
167fd9b3c5aSBiju Das	 *
168fd9b3c5aSBiju Das	 * ---------------------------------------------
169fd9b3c5aSBiju Das	 */
170fd9b3c5aSBiju Dasfunc bl2_enter_bl31
171fd9b3c5aSBiju Das	mov	x20, x0
172fd9b3c5aSBiju Das        /*
173fd9b3c5aSBiju Das         * MMU needs to be disabled because both BL2 and BL31 execute
174fd9b3c5aSBiju Das         * in EL3, and therefore share the same address space.
175fd9b3c5aSBiju Das         * BL31 will initialize the address space according to its
176fd9b3c5aSBiju Das         * own requirement.
177fd9b3c5aSBiju Das         */
178fd9b3c5aSBiju Das	/* Disable mmu and data cache */
179fd9b3c5aSBiju Das	bl	disable_mmu_el3
1805e8c2d8eSToshiyuki Ogasahara#if RCAR_BL2_DCACHE == 1
181fd9b3c5aSBiju Das	/* Data cache clean and invalidate */
182fd9b3c5aSBiju Das	mov	x0, #DCCISW
183fd9b3c5aSBiju Das	bl	dcsw_op_all
1845e8c2d8eSToshiyuki Ogasahara#endif /* RCAR_BL2_DCACHE == 1 */
185fd9b3c5aSBiju Das	/* TLB invalidate all, EL3 */
186fd9b3c5aSBiju Das	tlbi	alle3
1875e8c2d8eSToshiyuki Ogasahara
188fd9b3c5aSBiju Das	bl	disable_mmu_icache_el3
189fd9b3c5aSBiju Das	/* Invalidate instruction cache */
190fd9b3c5aSBiju Das	ic	iallu
191fd9b3c5aSBiju Das	dsb	sy
192fd9b3c5aSBiju Das	isb
193*fe87637aSToshiyuki Ogasahara
194*fe87637aSToshiyuki Ogasahara	/* Clear TCR_EL1 on primary core */
195*fe87637aSToshiyuki Ogasahara	msr	tcr_el1, xzr
196*fe87637aSToshiyuki Ogasahara
197fd9b3c5aSBiju Das	ldp	x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET]
198fd9b3c5aSBiju Das	msr	elr_el3, x0
199fd9b3c5aSBiju Das	msr	spsr_el3, x1
200fd9b3c5aSBiju Das	exception_return
201fd9b3c5aSBiju Dasendfunc bl2_enter_bl31
202fd9b3c5aSBiju Das
203fd9b3c5aSBiju Das	/* -----------------------------------------------------
204fd9b3c5aSBiju Das	 * void platform_mem_init (void);
205fd9b3c5aSBiju Das	 *
206fd9b3c5aSBiju Das	 * Zero out the mailbox registers in the shared memory
207fd9b3c5aSBiju Das	 * and set the rcar_boot_kind_flag.
208fd9b3c5aSBiju Das	 * The mmu is turned off right now and only the primary can
209fd9b3c5aSBiju Das	 * ever execute this code. Secondaries will read the
210fd9b3c5aSBiju Das	 * mailboxes using SO accesses.
211fd9b3c5aSBiju Das	 * -----------------------------------------------------
212fd9b3c5aSBiju Das	 */
213fd9b3c5aSBiju Dasfunc platform_mem_init
214fd9b3c5aSBiju Das#if !IMAGE_BL2
215fd9b3c5aSBiju Das	ldr	x0, =MBOX_BASE
216fd9b3c5aSBiju Das	mov	w1, #PLATFORM_CORE_COUNT
217fd9b3c5aSBiju Dasloop:
218fd9b3c5aSBiju Das	str	xzr, [x0], #CACHE_WRITEBACK_GRANULE
219fd9b3c5aSBiju Das	subs	w1, w1, #1
220fd9b3c5aSBiju Das	b.gt	loop
221fd9b3c5aSBiju Das#endif
222fd9b3c5aSBiju Das	ret
223fd9b3c5aSBiju Dasendfunc platform_mem_init
224fd9b3c5aSBiju Das
225fd9b3c5aSBiju Das	/* ---------------------------------------------
226fd9b3c5aSBiju Das	 * void plat_report_exception(unsigned int type)
227fd9b3c5aSBiju Das	 * Function to report an unhandled exception
228fd9b3c5aSBiju Das	 * with platform-specific means.
229fd9b3c5aSBiju Das	 * ---------------------------------------------
230fd9b3c5aSBiju Das	 */
231fd9b3c5aSBiju Dasfunc plat_report_exception
232fd9b3c5aSBiju Das	/* Switch to SP_EL0 */
233fd9b3c5aSBiju Das	msr	spsel, #0
234fd9b3c5aSBiju Das#if IMAGE_BL2
235fd9b3c5aSBiju Das	mov	w1, #FIQ_SP_EL0
236fd9b3c5aSBiju Das	cmp	w0, w1
237fd9b3c5aSBiju Das	beq	rep_exec_fiq_elx
238fd9b3c5aSBiju Das	b	rep_exec_panic_type
239fd9b3c5aSBiju Dasrep_exec_fiq_elx:
240fd9b3c5aSBiju Das	bl	gicv2_acknowledge_interrupt
241fd9b3c5aSBiju Das	mov	x2, #INT_ID_MASK
242fd9b3c5aSBiju Das	and	x0, x0, x2
243fd9b3c5aSBiju Das	mov	x1, #ARM_IRQ_SEC_WDT
244fd9b3c5aSBiju Das	cmp	x0, x1
245fd9b3c5aSBiju Das	bne	rep_exec_panic_id
246fd9b3c5aSBiju Das	mrs	x0, ELR_EL3
247fd9b3c5aSBiju Das	b	rcar_swdt_exec
248fd9b3c5aSBiju Dasrep_exec_panic_type:
249fd9b3c5aSBiju Das	/* x0 is interrupt TYPE */
250fd9b3c5aSBiju Das	b	bl2_interrupt_error_type
251fd9b3c5aSBiju Dasrep_exec_panic_id:
252fd9b3c5aSBiju Das	/* x0 is interrupt ID */
253fd9b3c5aSBiju Das	b	bl2_interrupt_error_id
254fd9b3c5aSBiju Dasrep_exec_end:
255fd9b3c5aSBiju Das#endif
256fd9b3c5aSBiju Das	ret
257fd9b3c5aSBiju Dasendfunc plat_report_exception
258fd9b3c5aSBiju Das
259fd9b3c5aSBiju Das	/* ---------------------------------------------
260fd9b3c5aSBiju Das	 * int plat_crash_console_init(void)
261fd9b3c5aSBiju Das	 * Function to initialize log area
262fd9b3c5aSBiju Das	 * ---------------------------------------------
263fd9b3c5aSBiju Das	 */
264fd9b3c5aSBiju Dasfunc plat_crash_console_init
265fd9b3c5aSBiju Das#if IMAGE_BL2
266fd9b3c5aSBiju Das	mov	x0, #0
267fd9b3c5aSBiju Das#else
268fd9b3c5aSBiju Das	mov	x1, sp
269fd9b3c5aSBiju Das	mov_imm	x2, RCAR_CRASH_STACK
270fd9b3c5aSBiju Das	mov	sp, x2
271fd9b3c5aSBiju Das	str	x1, [sp, #-16]!
272fd9b3c5aSBiju Das	str	x30, [sp, #-16]!
273fd9b3c5aSBiju Das	bl	console_rcar_init
274fd9b3c5aSBiju Das	ldr	x30, [sp], #16
275fd9b3c5aSBiju Das	ldr	x1, [sp], #16
276fd9b3c5aSBiju Das	mov	sp, x1
277fd9b3c5aSBiju Das#endif
278fd9b3c5aSBiju Das	ret
279fd9b3c5aSBiju Dasendfunc plat_crash_console_init
280fd9b3c5aSBiju Das
281fd9b3c5aSBiju Das	/* ---------------------------------------------
282fd9b3c5aSBiju Das	 * int plat_crash_console_putc(int c)
283fd9b3c5aSBiju Das	 * Function to store a character to log area
284fd9b3c5aSBiju Das	 * ---------------------------------------------
285fd9b3c5aSBiju Das	 */
286fd9b3c5aSBiju Dasfunc plat_crash_console_putc
287fd9b3c5aSBiju Das	mov	x1, sp
288fd9b3c5aSBiju Das	mov_imm	x2, RCAR_CRASH_STACK
289fd9b3c5aSBiju Das	mov	sp, x2
290fd9b3c5aSBiju Das	str	x1, [sp, #-16]!
291fd9b3c5aSBiju Das	str	x30, [sp, #-16]!
292fd9b3c5aSBiju Das	str	x3, [sp, #-16]!
293fd9b3c5aSBiju Das	str	x4, [sp, #-16]!
294fd9b3c5aSBiju Das	str	x5, [sp, #-16]!
2957d58aed3SToshiyuki Ogasahara	str	x6, [sp, #-16]!
2967d58aed3SToshiyuki Ogasahara	str	x7, [sp, #-16]!
297fd9b3c5aSBiju Das	bl	console_rcar_putc
2987d58aed3SToshiyuki Ogasahara	ldr	x7, [sp], #16
2997d58aed3SToshiyuki Ogasahara	ldr	x6, [sp], #16
300fd9b3c5aSBiju Das	ldr	x5, [sp], #16
301fd9b3c5aSBiju Das	ldr	x4, [sp], #16
302fd9b3c5aSBiju Das	ldr	x3, [sp], #16
303fd9b3c5aSBiju Das	ldr	x30, [sp], #16
304fd9b3c5aSBiju Das	ldr	x1, [sp], #16
305fd9b3c5aSBiju Das	mov	sp, x1
306fd9b3c5aSBiju Das	ret
307fd9b3c5aSBiju Dasendfunc plat_crash_console_putc
308fd9b3c5aSBiju Das
309fd9b3c5aSBiju Das	/* ---------------------------------------------
310fd9b3c5aSBiju Das	 * void plat_crash_console_flush()
311fd9b3c5aSBiju Das	 * ---------------------------------------------
312fd9b3c5aSBiju Das	 */
313fd9b3c5aSBiju Dasfunc plat_crash_console_flush
314fd9b3c5aSBiju Das	b	console_rcar_flush
315fd9b3c5aSBiju Dasendfunc plat_crash_console_flush
316fd9b3c5aSBiju Das
317fd9b3c5aSBiju Das	/* --------------------------------------------------------------------
318fd9b3c5aSBiju Das	 * void plat_reset_handler(void);
319fd9b3c5aSBiju Das	 *
320fd9b3c5aSBiju Das	 * Before adding code in this function, refer to the guidelines in
321fd9b3c5aSBiju Das	 * docs/firmware-design.md to determine whether the code should reside
322fd9b3c5aSBiju Das	 * within the FIRST_RESET_HANDLER_CALL block or not.
323fd9b3c5aSBiju Das	 *
324fd9b3c5aSBiju Das	 * For R-Car H3:
325fd9b3c5aSBiju Das	 * - Set the L2 Tag RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
326fd9b3c5aSBiju Das	 * - Set the L2 Data setup latency to 1 (i.e. 1 cycles) for Cortex-A57
327fd9b3c5aSBiju Das	 * - Set the L2 Data RAM latency to 3 (i.e. 4 cycles) for Cortex-A57
328fd9b3c5aSBiju Das	 * For R-Car M3/M3N:
329fd9b3c5aSBiju Das	 * - Set the L2 Tag RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
330fd9b3c5aSBiju Das	 * - Set the L2 Data setup latency to 0 (i.e. 0 cycles) for Cortex-A57
331fd9b3c5aSBiju Das	 * - Set the L2 Data RAM latency to 3 (i.e. 4 cycles) for Cortex-A57
332fd9b3c5aSBiju Das	 *
333fd9b3c5aSBiju Das	 * --------------------------------------------------------------------
334fd9b3c5aSBiju Das	 */
335fd9b3c5aSBiju Dasfunc plat_reset_handler
336fd9b3c5aSBiju Das	/*
337fd9b3c5aSBiju Das	 * On R-Car H3    :  x2 := 0
338fd9b3c5aSBiju Das	 * On R-Car M3/M3N:  x2 := 1
339fd9b3c5aSBiju Das	 */
340fd9b3c5aSBiju Das	/* read PRR */
341fd9b3c5aSBiju Das	ldr	x0, =0xFFF00044
342fd9b3c5aSBiju Das	ldr	w0, [x0]
343fd9b3c5aSBiju Das	ubfx	w0, w0, 8, 8
344fd9b3c5aSBiju Das	/* H3? */
345fd9b3c5aSBiju Das	cmp	w0, #0x4F
346fd9b3c5aSBiju Das	b.eq	RCARH3
347fd9b3c5aSBiju Das	/* set R-Car M3/M3N */
348fd9b3c5aSBiju Das	mov	x2, #1
349fd9b3c5aSBiju Das	b	CHK_A5x
350fd9b3c5aSBiju DasRCARH3:
351fd9b3c5aSBiju Das	/* set R-Car H3 */
352fd9b3c5aSBiju Das	mov	x2, #0
353fd9b3c5aSBiju Das	/* --------------------------------------------------------------------
354fd9b3c5aSBiju Das	 * Determine whether this code is executed on a Cortex-A53 or on a
355fd9b3c5aSBiju Das	 * Cortex-A57 core.
356fd9b3c5aSBiju Das	 * --------------------------------------------------------------------
357fd9b3c5aSBiju Das	 */
358fd9b3c5aSBiju DasCHK_A5x:
359fd9b3c5aSBiju Das	mrs	x0, midr_el1
360fd9b3c5aSBiju Das	ubfx	x1, x0, MIDR_PN_SHIFT, #12
361fd9b3c5aSBiju Das	cmp     w1, #((CORTEX_A57_MIDR >> MIDR_PN_SHIFT) & MIDR_PN_MASK)
362fd9b3c5aSBiju Das	b.eq	A57
363fd9b3c5aSBiju Das	ret
364fd9b3c5aSBiju DasA57:
365fd9b3c5aSBiju Das	/* Get data from CORTEX_A57_L2CTLR_EL1	*/
366fd9b3c5aSBiju Das	mrs	x0, CORTEX_A57_L2CTLR_EL1
367fd9b3c5aSBiju Das	/*
368fd9b3c5aSBiju Das	 * On R-Car H3/M3/M3N
369fd9b3c5aSBiju Das	 *
370fd9b3c5aSBiju Das	 * L2 Tag RAM latency is bit8-6 of CORTEX_A57_L2CTLR_EL1
371fd9b3c5aSBiju Das	 * L2 Data RAM setup is bit5 of CORTEX_A57_L2CTLR_EL1
372fd9b3c5aSBiju Das	 * L2 Data RAM latency is bit2-0 of CORTEX_A57_L2CTLR_EL1
373fd9b3c5aSBiju Das	 */
374fd9b3c5aSBiju Das	/* clear bit of L2 RAM	*/
375fd9b3c5aSBiju Das	/* ~(0x1e7) -> x1	*/
376fd9b3c5aSBiju Das	mov	x1, #0x1e7
377fd9b3c5aSBiju Das	neg	x1, x1
378fd9b3c5aSBiju Das	/* clear bit of L2 RAM -> x0 */
379fd9b3c5aSBiju Das	and	x0, x0, x1
380fd9b3c5aSBiju Das	/* L2 Tag RAM latency (3 cycles) */
381fd9b3c5aSBiju Das	orr	x0, x0, #0x2 << 6
382fd9b3c5aSBiju Das	/* If M3/M3N then L2 RAM setup is 0 */
383fd9b3c5aSBiju Das	cbnz	x2, M3_L2
384fd9b3c5aSBiju Das	/* L2 Data RAM setup (1 cycle) */
385fd9b3c5aSBiju Das	orr	x0, x0, #0x1 << 5
386fd9b3c5aSBiju DasM3_L2:
387fd9b3c5aSBiju Das	/* L2 Data RAM latency (4 cycles) */
388fd9b3c5aSBiju Das	orr	x0, x0, #0x3
389fd9b3c5aSBiju Das	/* Store data to L2CTLR_EL1 */
390fd9b3c5aSBiju Das	msr	CORTEX_A57_L2CTLR_EL1, x0
391fd9b3c5aSBiju Dasapply_l2_ram_latencies:
392fd9b3c5aSBiju Das	ret
393fd9b3c5aSBiju Dasendfunc plat_reset_handler
394fd9b3c5aSBiju Das
395fd9b3c5aSBiju Das	/* ---------------------------------------------
396fd9b3c5aSBiju Das	 * void plat_invalidate_icache(void)
397fd9b3c5aSBiju Das	 * Instruction Cache Invalidate All to PoU
398fd9b3c5aSBiju Das	 * ---------------------------------------------
399fd9b3c5aSBiju Das	 */
400fd9b3c5aSBiju Dasfunc plat_invalidate_icache
401fd9b3c5aSBiju Das	ic	iallu
402fd9b3c5aSBiju Das
403fd9b3c5aSBiju Das	ret
404fd9b3c5aSBiju Dasendfunc plat_invalidate_icache
405