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