xref: /rk3399_ARM-atf/plat/renesas/rcar_gen5/aarch64/plat_helpers.S (revision 7cab2c233b38cf2a63d37d31da73f1d82f5efc3c)
1*f180a3b7SHieu Nguyen/*
2*f180a3b7SHieu Nguyen * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved.
3*f180a3b7SHieu Nguyen * Copyright (c) 2025, Renesas Electronics Corporation. All rights reserved.
4*f180a3b7SHieu Nguyen *
5*f180a3b7SHieu Nguyen * SPDX-License-Identifier: BSD-3-Clause
6*f180a3b7SHieu Nguyen */
7*f180a3b7SHieu Nguyen
8*f180a3b7SHieu Nguyen#include <arch.h>
9*f180a3b7SHieu Nguyen#include <asm_macros.S>
10*f180a3b7SHieu Nguyen#include <common/bl_common.h>
11*f180a3b7SHieu Nguyen#include <common/runtime_svc.h>
12*f180a3b7SHieu Nguyen#include <cortex_a720_ae.h>
13*f180a3b7SHieu Nguyen#include <platform_def.h>
14*f180a3b7SHieu Nguyen
15*f180a3b7SHieu Nguyen#include "rcar_def.h"
16*f180a3b7SHieu Nguyen
17*f180a3b7SHieu Nguyen	.globl	plat_get_my_entrypoint
18*f180a3b7SHieu Nguyen	.extern	plat_set_my_stack
19*f180a3b7SHieu Nguyen	.globl	platform_mem_init
20*f180a3b7SHieu Nguyen
21*f180a3b7SHieu Nguyen	.globl	plat_crash_console_init
22*f180a3b7SHieu Nguyen	.globl	plat_crash_console_putc
23*f180a3b7SHieu Nguyen	.globl	plat_crash_console_flush
24*f180a3b7SHieu Nguyen	.globl	plat_invalidate_icache
25*f180a3b7SHieu Nguyen	.globl	plat_secondary_reset
26*f180a3b7SHieu Nguyen	.globl	plat_my_core_pos
27*f180a3b7SHieu Nguyen	.globl	plat_renesas_calc_core_pos
28*f180a3b7SHieu Nguyen	.globl	bl31_plat_enable_mmu
29*f180a3b7SHieu Nguyen
30*f180a3b7SHieu Nguyen	.extern console_rcar_init
31*f180a3b7SHieu Nguyen	.extern console_rcar_putc
32*f180a3b7SHieu Nguyen	.extern console_rcar_flush
33*f180a3b7SHieu Nguyen	.extern rcar_pwrc_code_copy_to_system_ram
34*f180a3b7SHieu Nguyen
35*f180a3b7SHieu Nguyen	/* -----------------------------------------------------
36*f180a3b7SHieu Nguyen	 * void platform_get_core_pos (mpidr)
37*f180a3b7SHieu Nguyen	 * -----------------------------------------------------
38*f180a3b7SHieu Nguyen	 */
39*f180a3b7SHieu Nguyenfunc plat_renesas_calc_core_pos
40*f180a3b7SHieu Nguyen	lsr	x0, x0, #8
41*f180a3b7SHieu Nguyen	and	x1, x0, #MPIDR_CPU_MASK
42*f180a3b7SHieu Nguyen	and	x0, x0, #MPIDR_CLUSTER_MASK
43*f180a3b7SHieu Nguyen	add	x0, x1, x0, LSR #6
44*f180a3b7SHieu Nguyen	ret
45*f180a3b7SHieu Nguyenendfunc plat_renesas_calc_core_pos
46*f180a3b7SHieu Nguyen
47*f180a3b7SHieu Nguyen	/* -----------------------------------------------------
48*f180a3b7SHieu Nguyen	 * void platform_my_core_pos
49*f180a3b7SHieu Nguyen	 * -----------------------------------------------------
50*f180a3b7SHieu Nguyen	 */
51*f180a3b7SHieu Nguyenfunc plat_my_core_pos
52*f180a3b7SHieu Nguyen	mrs	x0, mpidr_el1
53*f180a3b7SHieu Nguyen	b	plat_renesas_calc_core_pos
54*f180a3b7SHieu Nguyenendfunc plat_my_core_pos
55*f180a3b7SHieu Nguyen
56*f180a3b7SHieu Nguyen	/* -----------------------------------------------------
57*f180a3b7SHieu Nguyen	 * void platform_get_my_entrypoint (unsigned int mpid);
58*f180a3b7SHieu Nguyen	 *
59*f180a3b7SHieu Nguyen	 * Main job of this routine is to distinguish between
60*f180a3b7SHieu Nguyen	 * a cold and warm boot.
61*f180a3b7SHieu Nguyen	 * On a cold boot the secondaries first wait for the
62*f180a3b7SHieu Nguyen	 * platform to be initialized after which they are
63*f180a3b7SHieu Nguyen	 * hotplugged in. The primary proceeds to perform the
64*f180a3b7SHieu Nguyen	 * platform initialization.
65*f180a3b7SHieu Nguyen	 * On a warm boot, each cpu jumps to the address in its
66*f180a3b7SHieu Nguyen	 * mailbox.
67*f180a3b7SHieu Nguyen	 *
68*f180a3b7SHieu Nguyen	 * TODO: Not a good idea to save lr in a temp reg
69*f180a3b7SHieu Nguyen	 * -----------------------------------------------------
70*f180a3b7SHieu Nguyen	 */
71*f180a3b7SHieu Nguyenfunc plat_get_my_entrypoint
72*f180a3b7SHieu Nguyen	mrs	x0, mpidr_el1
73*f180a3b7SHieu Nguyen	mov	x9, x30 /* lr */
74*f180a3b7SHieu Nguyen
75*f180a3b7SHieu Nguyen	ldr	x1, =BOOT_KIND_BASE
76*f180a3b7SHieu Nguyen	ldr	x21, [x1]
77*f180a3b7SHieu Nguyen
78*f180a3b7SHieu Nguyen	/* Check the reset info */
79*f180a3b7SHieu Nguyen	and	x1, x21, #0x000c
80*f180a3b7SHieu Nguyen	cmp	x1, #0x0008
81*f180a3b7SHieu Nguyen	beq	el3_panic
82*f180a3b7SHieu Nguyen	cmp	x1, #0x000c
83*f180a3b7SHieu Nguyen	beq	el3_panic
84*f180a3b7SHieu Nguyen
85*f180a3b7SHieu Nguyen	/* Check the boot kind */
86*f180a3b7SHieu Nguyen	and	x1, x21, #0x0003
87*f180a3b7SHieu Nguyen	cmp	x1, #0x0002
88*f180a3b7SHieu Nguyen	beq	el3_panic
89*f180a3b7SHieu Nguyen	cmp	x1, #0x0003
90*f180a3b7SHieu Nguyen	beq	el3_panic
91*f180a3b7SHieu Nguyen
92*f180a3b7SHieu Nguyen	/* warm boot or cold boot */
93*f180a3b7SHieu Nguyen	and	x1, x21, #1
94*f180a3b7SHieu Nguyen	cmp	x1, #0
95*f180a3b7SHieu Nguyen	bne	warm_reset
96*f180a3b7SHieu Nguyen
97*f180a3b7SHieu Nguyen	/* Cold boot */
98*f180a3b7SHieu Nguyen	mov	x0, #0
99*f180a3b7SHieu Nguyen	b	exit
100*f180a3b7SHieu Nguyen
101*f180a3b7SHieu Nguyenwarm_reset:
102*f180a3b7SHieu Nguyen	/* --------------------------------------------------------------------
103*f180a3b7SHieu Nguyen	 * A per-cpu mailbox is maintained in the trusted SDRAM. Its flushed out
104*f180a3b7SHieu Nguyen	 * of the caches after every update using normal memory so its safe to
105*f180a3b7SHieu Nguyen	 * read it here with SO attributes
106*f180a3b7SHieu Nguyen	 * ---------------------------------------------------------------------
107*f180a3b7SHieu Nguyen	 */
108*f180a3b7SHieu Nguyen	ldr	x10, =MBOX_BASE
109*f180a3b7SHieu Nguyen	bl	plat_renesas_calc_core_pos
110*f180a3b7SHieu Nguyen	lsl	x0, x0, #CACHE_WRITEBACK_SHIFT
111*f180a3b7SHieu Nguyen	ldr	x0, [x10, x0]
112*f180a3b7SHieu Nguyen	cbz	x0, _panic
113*f180a3b7SHieu Nguyenexit:
114*f180a3b7SHieu Nguyen	ret	x9
115*f180a3b7SHieu Nguyen_panic:
116*f180a3b7SHieu Nguyen	b	el3_panic
117*f180a3b7SHieu Nguyen
118*f180a3b7SHieu Nguyenendfunc plat_get_my_entrypoint
119*f180a3b7SHieu Nguyen
120*f180a3b7SHieu Nguyen	/* ---------------------------------------------
121*f180a3b7SHieu Nguyen	 * plat_secondary_reset
122*f180a3b7SHieu Nguyen	 *
123*f180a3b7SHieu Nguyen	 * ---------------------------------------------
124*f180a3b7SHieu Nguyen	 */
125*f180a3b7SHieu Nguyenfunc plat_secondary_reset
126*f180a3b7SHieu Nguyen	mrs	x0, sctlr_el3
127*f180a3b7SHieu Nguyen	bic	x0, x0, #SCTLR_EE_BIT
128*f180a3b7SHieu Nguyen	msr	sctlr_el3, x0
129*f180a3b7SHieu Nguyen	isb
130*f180a3b7SHieu Nguyen
131*f180a3b7SHieu Nguyen	mrs	x0, cptr_el3
132*f180a3b7SHieu Nguyen	bic	w0, w0, #TCPAC_BIT
133*f180a3b7SHieu Nguyen	bic	w0, w0, #TTA_BIT
134*f180a3b7SHieu Nguyen	bic	w0, w0, #TFP_BIT
135*f180a3b7SHieu Nguyen	msr	cptr_el3, x0
136*f180a3b7SHieu Nguyen
137*f180a3b7SHieu Nguyen	mov_imm	x0, PARAMS_BASE
138*f180a3b7SHieu Nguyen	mov_imm	x2, BL31_BASE
139*f180a3b7SHieu Nguyen	ldr x3, =BOOT_KIND_BASE
140*f180a3b7SHieu Nguyen	mov x1, #0x1
141*f180a3b7SHieu Nguyen	str x1, [x3]
142*f180a3b7SHieu Nguyen	br	x2	/* jump to BL31 */
143*f180a3b7SHieu Nguyen	nop
144*f180a3b7SHieu Nguyen	nop
145*f180a3b7SHieu Nguyen	nop
146*f180a3b7SHieu Nguyenendfunc plat_secondary_reset
147*f180a3b7SHieu Nguyen
148*f180a3b7SHieu Nguyen	/* -----------------------------------------------------
149*f180a3b7SHieu Nguyen	 * void platform_mem_init (void);
150*f180a3b7SHieu Nguyen	 *
151*f180a3b7SHieu Nguyen	 * Zero out the mailbox registers in the shared memory
152*f180a3b7SHieu Nguyen	 * and set the rcar_boot_kind_flag.
153*f180a3b7SHieu Nguyen	 * The mmu is turned off right now and only the primary can
154*f180a3b7SHieu Nguyen	 * ever execute this code. Secondaries will read the
155*f180a3b7SHieu Nguyen	 * mailboxes using SO accesses.
156*f180a3b7SHieu Nguyen	 * -----------------------------------------------------
157*f180a3b7SHieu Nguyen	 */
158*f180a3b7SHieu Nguyenfunc platform_mem_init
159*f180a3b7SHieu Nguyen	ldr	x0, =MBOX_BASE
160*f180a3b7SHieu Nguyen	mov	w1, #PLATFORM_CORE_COUNT
161*f180a3b7SHieu Nguyenloop:
162*f180a3b7SHieu Nguyen	str	xzr, [x0], #CACHE_WRITEBACK_GRANULE
163*f180a3b7SHieu Nguyen	subs	w1, w1, #1
164*f180a3b7SHieu Nguyen	b.gt	loop
165*f180a3b7SHieu Nguyen	ret
166*f180a3b7SHieu Nguyenendfunc platform_mem_init
167*f180a3b7SHieu Nguyen
168*f180a3b7SHieu Nguyen	/* ---------------------------------------------
169*f180a3b7SHieu Nguyen	 * int plat_crash_console_init(void)
170*f180a3b7SHieu Nguyen	 * Function to initialize log area
171*f180a3b7SHieu Nguyen	 * ---------------------------------------------
172*f180a3b7SHieu Nguyen	 */
173*f180a3b7SHieu Nguyenfunc plat_crash_console_init
174*f180a3b7SHieu Nguyen	mov	x1, sp
175*f180a3b7SHieu Nguyen	mov_imm	x2, RCAR_CRASH_STACK
176*f180a3b7SHieu Nguyen	mov	sp, x2
177*f180a3b7SHieu Nguyen	str	x1, [sp, #-16]!
178*f180a3b7SHieu Nguyen	str	x30, [sp, #-16]!
179*f180a3b7SHieu Nguyen	bl	console_rcar_init
180*f180a3b7SHieu Nguyen	ldr	x30, [sp], #16
181*f180a3b7SHieu Nguyen	ldr	x1, [sp], #16
182*f180a3b7SHieu Nguyen	mov	sp, x1
183*f180a3b7SHieu Nguyen	ret
184*f180a3b7SHieu Nguyenendfunc plat_crash_console_init
185*f180a3b7SHieu Nguyen
186*f180a3b7SHieu Nguyen	/* ---------------------------------------------
187*f180a3b7SHieu Nguyen	 * int plat_crash_console_putc(int c)
188*f180a3b7SHieu Nguyen	 * Function to store a character to log area
189*f180a3b7SHieu Nguyen	 * ---------------------------------------------
190*f180a3b7SHieu Nguyen	 */
191*f180a3b7SHieu Nguyenfunc plat_crash_console_putc
192*f180a3b7SHieu Nguyen	mov	x1, sp
193*f180a3b7SHieu Nguyen	mov_imm	x2, RCAR_CRASH_STACK
194*f180a3b7SHieu Nguyen	mov	sp, x2
195*f180a3b7SHieu Nguyen	str	x1, [sp, #-16]!
196*f180a3b7SHieu Nguyen	str	x30, [sp, #-16]!
197*f180a3b7SHieu Nguyen	str	x3, [sp, #-16]!
198*f180a3b7SHieu Nguyen	str	x4, [sp, #-16]!
199*f180a3b7SHieu Nguyen	str	x5, [sp, #-16]!
200*f180a3b7SHieu Nguyen	str	x6, [sp, #-16]!
201*f180a3b7SHieu Nguyen	str	x7, [sp, #-16]!
202*f180a3b7SHieu Nguyen	bl	console_rcar_putc
203*f180a3b7SHieu Nguyen	ldr	x7, [sp], #16
204*f180a3b7SHieu Nguyen	ldr	x6, [sp], #16
205*f180a3b7SHieu Nguyen	ldr	x5, [sp], #16
206*f180a3b7SHieu Nguyen	ldr	x4, [sp], #16
207*f180a3b7SHieu Nguyen	ldr	x3, [sp], #16
208*f180a3b7SHieu Nguyen	ldr	x30, [sp], #16
209*f180a3b7SHieu Nguyen	ldr	x1, [sp], #16
210*f180a3b7SHieu Nguyen	mov	sp, x1
211*f180a3b7SHieu Nguyen	ret
212*f180a3b7SHieu Nguyenendfunc plat_crash_console_putc
213*f180a3b7SHieu Nguyen
214*f180a3b7SHieu Nguyen	/* ---------------------------------------------
215*f180a3b7SHieu Nguyen	 * void plat_crash_console_flush()
216*f180a3b7SHieu Nguyen	 * ---------------------------------------------
217*f180a3b7SHieu Nguyen	 */
218*f180a3b7SHieu Nguyenfunc plat_crash_console_flush
219*f180a3b7SHieu Nguyen	b	console_rcar_flush
220*f180a3b7SHieu Nguyenendfunc plat_crash_console_flush
221*f180a3b7SHieu Nguyen
222*f180a3b7SHieu Nguyen	/* ---------------------------------------------
223*f180a3b7SHieu Nguyen	 * void plat_invalidate_icache(void)
224*f180a3b7SHieu Nguyen	 * Instruction Cache Invalidate All to PoU
225*f180a3b7SHieu Nguyen	 * ---------------------------------------------
226*f180a3b7SHieu Nguyen	 */
227*f180a3b7SHieu Nguyenfunc plat_invalidate_icache
228*f180a3b7SHieu Nguyen	ic	iallu
229*f180a3b7SHieu Nguyen	ret
230*f180a3b7SHieu Nguyenendfunc plat_invalidate_icache
231*f180a3b7SHieu Nguyen
232*f180a3b7SHieu Nguyen	/* -----------------------------------------------------
233*f180a3b7SHieu Nguyen	 * void bl31_plat_enable_mmu(uint32_t flags);
234*f180a3b7SHieu Nguyen	 *
235*f180a3b7SHieu Nguyen	 * Enable MMU in BL31.
236*f180a3b7SHieu Nguyen	 * And copy the code to run on System RAM.
237*f180a3b7SHieu Nguyen	 * Note: This function call will only be done from Warm boot.
238*f180a3b7SHieu Nguyen	 * -----------------------------------------------------
239*f180a3b7SHieu Nguyen	 */
240*f180a3b7SHieu Nguyenfunc bl31_plat_enable_mmu
241*f180a3b7SHieu Nguyen	mov	x28, x30
242*f180a3b7SHieu Nguyen	bl	enable_mmu_direct_el3
243*f180a3b7SHieu Nguyen	mov	x30, x28
244*f180a3b7SHieu Nguyen	ret
245*f180a3b7SHieu Nguyenendfunc bl31_plat_enable_mmu
246