xref: /rk3399_ARM-atf/plat/renesas/common/aarch64/plat_helpers.S (revision bd62ce98d2c9ef164456c6477b2e21172165dc11)
1fd9b3c5aSBiju Das/*
2*bd62ce98SGovindraj Raja * Copyright (c) 2013-2023, Arm Limited and Contributors. All rights reserved.
37d58aed3SToshiyuki Ogasahara * Copyright (c) 2015-2021, 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:
129*bd62ce98SGovindraj 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
151fd9b3c5aSBiju Das	mov_imm	x0, PARAMS_BASE
152fd9b3c5aSBiju Das	mov_imm	x2, BL31_BASE
153fd9b3c5aSBiju Das       ldr x3, =BOOT_KIND_BASE
154fd9b3c5aSBiju Das	mov x1, #0x1
155fd9b3c5aSBiju Das	str x1, [x3]
156fd9b3c5aSBiju Das	br	x2	/* jump to BL31 */
157fd9b3c5aSBiju Das	nop
158fd9b3c5aSBiju Das	nop
159fd9b3c5aSBiju Das	nop
160fd9b3c5aSBiju Dasendfunc plat_secondary_reset
161fd9b3c5aSBiju Das
162fd9b3c5aSBiju Das	/* ---------------------------------------------
163fd9b3c5aSBiju Das	 * plat_enter_bl31
164fd9b3c5aSBiju Das	 *
165fd9b3c5aSBiju Das	 * ---------------------------------------------
166fd9b3c5aSBiju Das	 */
167fd9b3c5aSBiju Dasfunc bl2_enter_bl31
168fd9b3c5aSBiju Das	mov	x20, x0
169fd9b3c5aSBiju Das        /*
170fd9b3c5aSBiju Das         * MMU needs to be disabled because both BL2 and BL31 execute
171fd9b3c5aSBiju Das         * in EL3, and therefore share the same address space.
172fd9b3c5aSBiju Das         * BL31 will initialize the address space according to its
173fd9b3c5aSBiju Das         * own requirement.
174fd9b3c5aSBiju Das         */
175fd9b3c5aSBiju Das#if RCAR_BL2_DCACHE == 1
176fd9b3c5aSBiju Das	/* Disable mmu and data cache */
177fd9b3c5aSBiju Das	bl	disable_mmu_el3
178fd9b3c5aSBiju Das	/* Data cache clean and invalidate */
179fd9b3c5aSBiju Das	mov	x0, #DCCISW
180fd9b3c5aSBiju Das	bl	dcsw_op_all
181fd9b3c5aSBiju Das	/* TLB invalidate all, EL3 */
182fd9b3c5aSBiju Das	tlbi	alle3
183fd9b3c5aSBiju Das#endif /* RCAR_BL2_DCACHE == 1 */
184fd9b3c5aSBiju Das	bl	disable_mmu_icache_el3
185fd9b3c5aSBiju Das	/* Invalidate instruction cache */
186fd9b3c5aSBiju Das	ic	iallu
187fd9b3c5aSBiju Das	dsb	sy
188fd9b3c5aSBiju Das	isb
189fd9b3c5aSBiju Das	ldp	x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET]
190fd9b3c5aSBiju Das	msr	elr_el3, x0
191fd9b3c5aSBiju Das	msr	spsr_el3, x1
192fd9b3c5aSBiju Das	exception_return
193fd9b3c5aSBiju Dasendfunc bl2_enter_bl31
194fd9b3c5aSBiju Das
195fd9b3c5aSBiju Das	/* -----------------------------------------------------
196fd9b3c5aSBiju Das	 * void platform_mem_init (void);
197fd9b3c5aSBiju Das	 *
198fd9b3c5aSBiju Das	 * Zero out the mailbox registers in the shared memory
199fd9b3c5aSBiju Das	 * and set the rcar_boot_kind_flag.
200fd9b3c5aSBiju Das	 * The mmu is turned off right now and only the primary can
201fd9b3c5aSBiju Das	 * ever execute this code. Secondaries will read the
202fd9b3c5aSBiju Das	 * mailboxes using SO accesses.
203fd9b3c5aSBiju Das	 * -----------------------------------------------------
204fd9b3c5aSBiju Das	 */
205fd9b3c5aSBiju Dasfunc platform_mem_init
206fd9b3c5aSBiju Das#if !IMAGE_BL2
207fd9b3c5aSBiju Das	ldr	x0, =MBOX_BASE
208fd9b3c5aSBiju Das	mov	w1, #PLATFORM_CORE_COUNT
209fd9b3c5aSBiju Dasloop:
210fd9b3c5aSBiju Das	str	xzr, [x0], #CACHE_WRITEBACK_GRANULE
211fd9b3c5aSBiju Das	subs	w1, w1, #1
212fd9b3c5aSBiju Das	b.gt	loop
213fd9b3c5aSBiju Das#endif
214fd9b3c5aSBiju Das	ret
215fd9b3c5aSBiju Dasendfunc platform_mem_init
216fd9b3c5aSBiju Das
217fd9b3c5aSBiju Das	/* ---------------------------------------------
218fd9b3c5aSBiju Das	 * void plat_report_exception(unsigned int type)
219fd9b3c5aSBiju Das	 * Function to report an unhandled exception
220fd9b3c5aSBiju Das	 * with platform-specific means.
221fd9b3c5aSBiju Das	 * ---------------------------------------------
222fd9b3c5aSBiju Das	 */
223fd9b3c5aSBiju Dasfunc plat_report_exception
224fd9b3c5aSBiju Das	/* Switch to SP_EL0 */
225fd9b3c5aSBiju Das	msr	spsel, #0
226fd9b3c5aSBiju Das#if IMAGE_BL2
227fd9b3c5aSBiju Das	mov	w1, #FIQ_SP_EL0
228fd9b3c5aSBiju Das	cmp	w0, w1
229fd9b3c5aSBiju Das	beq	rep_exec_fiq_elx
230fd9b3c5aSBiju Das	b	rep_exec_panic_type
231fd9b3c5aSBiju Dasrep_exec_fiq_elx:
232fd9b3c5aSBiju Das	bl	gicv2_acknowledge_interrupt
233fd9b3c5aSBiju Das	mov	x2, #INT_ID_MASK
234fd9b3c5aSBiju Das	and	x0, x0, x2
235fd9b3c5aSBiju Das	mov	x1, #ARM_IRQ_SEC_WDT
236fd9b3c5aSBiju Das	cmp	x0, x1
237fd9b3c5aSBiju Das	bne	rep_exec_panic_id
238fd9b3c5aSBiju Das	mrs	x0, ELR_EL3
239fd9b3c5aSBiju Das	b	rcar_swdt_exec
240fd9b3c5aSBiju Dasrep_exec_panic_type:
241fd9b3c5aSBiju Das	/* x0 is interrupt TYPE */
242fd9b3c5aSBiju Das	b	bl2_interrupt_error_type
243fd9b3c5aSBiju Dasrep_exec_panic_id:
244fd9b3c5aSBiju Das	/* x0 is interrupt ID */
245fd9b3c5aSBiju Das	b	bl2_interrupt_error_id
246fd9b3c5aSBiju Dasrep_exec_end:
247fd9b3c5aSBiju Das#endif
248fd9b3c5aSBiju Das	ret
249fd9b3c5aSBiju Dasendfunc plat_report_exception
250fd9b3c5aSBiju Das
251fd9b3c5aSBiju Das	/* ---------------------------------------------
252fd9b3c5aSBiju Das	 * int plat_crash_console_init(void)
253fd9b3c5aSBiju Das	 * Function to initialize log area
254fd9b3c5aSBiju Das	 * ---------------------------------------------
255fd9b3c5aSBiju Das	 */
256fd9b3c5aSBiju Dasfunc plat_crash_console_init
257fd9b3c5aSBiju Das#if IMAGE_BL2
258fd9b3c5aSBiju Das	mov	x0, #0
259fd9b3c5aSBiju Das#else
260fd9b3c5aSBiju Das	mov	x1, sp
261fd9b3c5aSBiju Das	mov_imm	x2, RCAR_CRASH_STACK
262fd9b3c5aSBiju Das	mov	sp, x2
263fd9b3c5aSBiju Das	str	x1, [sp, #-16]!
264fd9b3c5aSBiju Das	str	x30, [sp, #-16]!
265fd9b3c5aSBiju Das	bl	console_rcar_init
266fd9b3c5aSBiju Das	ldr	x30, [sp], #16
267fd9b3c5aSBiju Das	ldr	x1, [sp], #16
268fd9b3c5aSBiju Das	mov	sp, x1
269fd9b3c5aSBiju Das#endif
270fd9b3c5aSBiju Das	ret
271fd9b3c5aSBiju Dasendfunc plat_crash_console_init
272fd9b3c5aSBiju Das
273fd9b3c5aSBiju Das	/* ---------------------------------------------
274fd9b3c5aSBiju Das	 * int plat_crash_console_putc(int c)
275fd9b3c5aSBiju Das	 * Function to store a character to log area
276fd9b3c5aSBiju Das	 * ---------------------------------------------
277fd9b3c5aSBiju Das	 */
278fd9b3c5aSBiju Dasfunc plat_crash_console_putc
279fd9b3c5aSBiju Das	mov	x1, sp
280fd9b3c5aSBiju Das	mov_imm	x2, RCAR_CRASH_STACK
281fd9b3c5aSBiju Das	mov	sp, x2
282fd9b3c5aSBiju Das	str	x1, [sp, #-16]!
283fd9b3c5aSBiju Das	str	x30, [sp, #-16]!
284fd9b3c5aSBiju Das	str	x3, [sp, #-16]!
285fd9b3c5aSBiju Das	str	x4, [sp, #-16]!
286fd9b3c5aSBiju Das	str	x5, [sp, #-16]!
2877d58aed3SToshiyuki Ogasahara	str	x6, [sp, #-16]!
2887d58aed3SToshiyuki Ogasahara	str	x7, [sp, #-16]!
289fd9b3c5aSBiju Das	bl	console_rcar_putc
2907d58aed3SToshiyuki Ogasahara	ldr	x7, [sp], #16
2917d58aed3SToshiyuki Ogasahara	ldr	x6, [sp], #16
292fd9b3c5aSBiju Das	ldr	x5, [sp], #16
293fd9b3c5aSBiju Das	ldr	x4, [sp], #16
294fd9b3c5aSBiju Das	ldr	x3, [sp], #16
295fd9b3c5aSBiju Das	ldr	x30, [sp], #16
296fd9b3c5aSBiju Das	ldr	x1, [sp], #16
297fd9b3c5aSBiju Das	mov	sp, x1
298fd9b3c5aSBiju Das	ret
299fd9b3c5aSBiju Dasendfunc plat_crash_console_putc
300fd9b3c5aSBiju Das
301fd9b3c5aSBiju Das	/* ---------------------------------------------
302fd9b3c5aSBiju Das	 * void plat_crash_console_flush()
303fd9b3c5aSBiju Das	 * ---------------------------------------------
304fd9b3c5aSBiju Das	 */
305fd9b3c5aSBiju Dasfunc plat_crash_console_flush
306fd9b3c5aSBiju Das	b	console_rcar_flush
307fd9b3c5aSBiju Dasendfunc plat_crash_console_flush
308fd9b3c5aSBiju Das
309fd9b3c5aSBiju Das	/* --------------------------------------------------------------------
310fd9b3c5aSBiju Das	 * void plat_reset_handler(void);
311fd9b3c5aSBiju Das	 *
312fd9b3c5aSBiju Das	 * Before adding code in this function, refer to the guidelines in
313fd9b3c5aSBiju Das	 * docs/firmware-design.md to determine whether the code should reside
314fd9b3c5aSBiju Das	 * within the FIRST_RESET_HANDLER_CALL block or not.
315fd9b3c5aSBiju Das	 *
316fd9b3c5aSBiju Das	 * For R-Car H3:
317fd9b3c5aSBiju Das	 * - Set the L2 Tag RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
318fd9b3c5aSBiju Das	 * - Set the L2 Data setup latency to 1 (i.e. 1 cycles) for Cortex-A57
319fd9b3c5aSBiju Das	 * - Set the L2 Data RAM latency to 3 (i.e. 4 cycles) for Cortex-A57
320fd9b3c5aSBiju Das	 * For R-Car M3/M3N:
321fd9b3c5aSBiju Das	 * - Set the L2 Tag RAM latency to 2 (i.e. 3 cycles) for Cortex-A57
322fd9b3c5aSBiju Das	 * - Set the L2 Data setup latency to 0 (i.e. 0 cycles) for Cortex-A57
323fd9b3c5aSBiju Das	 * - Set the L2 Data RAM latency to 3 (i.e. 4 cycles) for Cortex-A57
324fd9b3c5aSBiju Das	 *
325fd9b3c5aSBiju Das	 * --------------------------------------------------------------------
326fd9b3c5aSBiju Das	 */
327fd9b3c5aSBiju Dasfunc plat_reset_handler
328fd9b3c5aSBiju Das	/*
329fd9b3c5aSBiju Das	 * On R-Car H3    :  x2 := 0
330fd9b3c5aSBiju Das	 * On R-Car M3/M3N:  x2 := 1
331fd9b3c5aSBiju Das	 */
332fd9b3c5aSBiju Das	/* read PRR */
333fd9b3c5aSBiju Das	ldr	x0, =0xFFF00044
334fd9b3c5aSBiju Das	ldr	w0, [x0]
335fd9b3c5aSBiju Das	ubfx	w0, w0, 8, 8
336fd9b3c5aSBiju Das	/* H3? */
337fd9b3c5aSBiju Das	cmp	w0, #0x4F
338fd9b3c5aSBiju Das	b.eq	RCARH3
339fd9b3c5aSBiju Das	/* set R-Car M3/M3N */
340fd9b3c5aSBiju Das	mov	x2, #1
341fd9b3c5aSBiju Das	b	CHK_A5x
342fd9b3c5aSBiju DasRCARH3:
343fd9b3c5aSBiju Das	/* set R-Car H3 */
344fd9b3c5aSBiju Das	mov	x2, #0
345fd9b3c5aSBiju Das	/* --------------------------------------------------------------------
346fd9b3c5aSBiju Das	 * Determine whether this code is executed on a Cortex-A53 or on a
347fd9b3c5aSBiju Das	 * Cortex-A57 core.
348fd9b3c5aSBiju Das	 * --------------------------------------------------------------------
349fd9b3c5aSBiju Das	 */
350fd9b3c5aSBiju DasCHK_A5x:
351fd9b3c5aSBiju Das	mrs	x0, midr_el1
352fd9b3c5aSBiju Das	ubfx	x1, x0, MIDR_PN_SHIFT, #12
353fd9b3c5aSBiju Das	cmp     w1, #((CORTEX_A57_MIDR >> MIDR_PN_SHIFT) & MIDR_PN_MASK)
354fd9b3c5aSBiju Das	b.eq	A57
355fd9b3c5aSBiju Das	ret
356fd9b3c5aSBiju DasA57:
357fd9b3c5aSBiju Das	/* Get data from CORTEX_A57_L2CTLR_EL1	*/
358fd9b3c5aSBiju Das	mrs	x0, CORTEX_A57_L2CTLR_EL1
359fd9b3c5aSBiju Das	/*
360fd9b3c5aSBiju Das	 * On R-Car H3/M3/M3N
361fd9b3c5aSBiju Das	 *
362fd9b3c5aSBiju Das	 * L2 Tag RAM latency is bit8-6 of CORTEX_A57_L2CTLR_EL1
363fd9b3c5aSBiju Das	 * L2 Data RAM setup is bit5 of CORTEX_A57_L2CTLR_EL1
364fd9b3c5aSBiju Das	 * L2 Data RAM latency is bit2-0 of CORTEX_A57_L2CTLR_EL1
365fd9b3c5aSBiju Das	 */
366fd9b3c5aSBiju Das	/* clear bit of L2 RAM	*/
367fd9b3c5aSBiju Das	/* ~(0x1e7) -> x1	*/
368fd9b3c5aSBiju Das	mov	x1, #0x1e7
369fd9b3c5aSBiju Das	neg	x1, x1
370fd9b3c5aSBiju Das	/* clear bit of L2 RAM -> x0 */
371fd9b3c5aSBiju Das	and	x0, x0, x1
372fd9b3c5aSBiju Das	/* L2 Tag RAM latency (3 cycles) */
373fd9b3c5aSBiju Das	orr	x0, x0, #0x2 << 6
374fd9b3c5aSBiju Das	/* If M3/M3N then L2 RAM setup is 0 */
375fd9b3c5aSBiju Das	cbnz	x2, M3_L2
376fd9b3c5aSBiju Das	/* L2 Data RAM setup (1 cycle) */
377fd9b3c5aSBiju Das	orr	x0, x0, #0x1 << 5
378fd9b3c5aSBiju DasM3_L2:
379fd9b3c5aSBiju Das	/* L2 Data RAM latency (4 cycles) */
380fd9b3c5aSBiju Das	orr	x0, x0, #0x3
381fd9b3c5aSBiju Das	/* Store data to L2CTLR_EL1 */
382fd9b3c5aSBiju Das	msr	CORTEX_A57_L2CTLR_EL1, x0
383fd9b3c5aSBiju Dasapply_l2_ram_latencies:
384fd9b3c5aSBiju Das	ret
385fd9b3c5aSBiju Dasendfunc plat_reset_handler
386fd9b3c5aSBiju Das
387fd9b3c5aSBiju Das	/* ---------------------------------------------
388fd9b3c5aSBiju Das	 * void plat_invalidate_icache(void)
389fd9b3c5aSBiju Das	 * Instruction Cache Invalidate All to PoU
390fd9b3c5aSBiju Das	 * ---------------------------------------------
391fd9b3c5aSBiju Das	 */
392fd9b3c5aSBiju Dasfunc plat_invalidate_icache
393fd9b3c5aSBiju Das	ic	iallu
394fd9b3c5aSBiju Das
395fd9b3c5aSBiju Das	ret
396fd9b3c5aSBiju Dasendfunc plat_invalidate_icache
397