xref: /arm-trusted-firmware/plat/intel/soc/common/aarch64/plat_helpers.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu
7*91f16700Schasinglulu#include <arch.h>
8*91f16700Schasinglulu#include <asm_macros.S>
9*91f16700Schasinglulu#include <cpu_macros.S>
10*91f16700Schasinglulu#include <platform_def.h>
11*91f16700Schasinglulu#include <el3_common_macros.S>
12*91f16700Schasinglulu
13*91f16700Schasinglulu	.globl	plat_secondary_cold_boot_setup
14*91f16700Schasinglulu	.globl	platform_is_primary_cpu
15*91f16700Schasinglulu	.globl	plat_is_my_cpu_primary
16*91f16700Schasinglulu	.globl	plat_my_core_pos
17*91f16700Schasinglulu	.globl	plat_crash_console_init
18*91f16700Schasinglulu	.globl	plat_crash_console_putc
19*91f16700Schasinglulu	.globl  plat_crash_console_flush
20*91f16700Schasinglulu	.globl	platform_mem_init
21*91f16700Schasinglulu	.globl	plat_secondary_cpus_bl31_entry
22*91f16700Schasinglulu
23*91f16700Schasinglulu	.globl plat_get_my_entrypoint
24*91f16700Schasinglulu
25*91f16700Schasinglulu	/* -----------------------------------------------------
26*91f16700Schasinglulu	 * void plat_secondary_cold_boot_setup (void);
27*91f16700Schasinglulu	 *
28*91f16700Schasinglulu	 * This function performs any platform specific actions
29*91f16700Schasinglulu	 * needed for a secondary cpu after a cold reset e.g
30*91f16700Schasinglulu	 * mark the cpu's presence, mechanism to place it in a
31*91f16700Schasinglulu	 * holding pen etc.
32*91f16700Schasinglulu	 * -----------------------------------------------------
33*91f16700Schasinglulu	 */
34*91f16700Schasinglulufunc plat_secondary_cold_boot_setup
35*91f16700Schasinglulu	/* Wait until the it gets reset signal from rstmgr gets populated */
36*91f16700Schasinglulupoll_mailbox:
37*91f16700Schasinglulu#if	PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
38*91f16700Schasinglulu	mov_imm x0, PLAT_SEC_ENTRY
39*91f16700Schasinglulu	cbz	x0, poll_mailbox
40*91f16700Schasinglulu	br      x0
41*91f16700Schasinglulu#else
42*91f16700Schasinglulu	wfi
43*91f16700Schasinglulu	mov_imm	x0, PLAT_SEC_ENTRY
44*91f16700Schasinglulu	ldr	x1, [x0]
45*91f16700Schasinglulu	mov_imm	x2, PLAT_CPUID_RELEASE
46*91f16700Schasinglulu	ldr	x3, [x2]
47*91f16700Schasinglulu	mrs	x4, mpidr_el1
48*91f16700Schasinglulu	and	x4, x4, #0xff
49*91f16700Schasinglulu	cmp	x3, x4
50*91f16700Schasinglulu	b.ne	poll_mailbox
51*91f16700Schasinglulu	br	x1
52*91f16700Schasinglulu#endif
53*91f16700Schasingluluendfunc plat_secondary_cold_boot_setup
54*91f16700Schasinglulu
55*91f16700Schasinglulu#if	((PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10) || \
56*91f16700Schasinglulu	(PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX) || \
57*91f16700Schasinglulu	(PLATFORM_MODEL == PLAT_SOCFPGA_N5X))
58*91f16700Schasinglulu
59*91f16700Schasinglulufunc platform_is_primary_cpu
60*91f16700Schasinglulu	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
61*91f16700Schasinglulu	cmp	x0, #PLAT_PRIMARY_CPU
62*91f16700Schasinglulu	cset	x0, eq
63*91f16700Schasinglulu	ret
64*91f16700Schasingluluendfunc platform_is_primary_cpu
65*91f16700Schasinglulu
66*91f16700Schasinglulu#else
67*91f16700Schasinglulu
68*91f16700Schasinglulufunc platform_is_primary_cpu
69*91f16700Schasinglulu	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
70*91f16700Schasinglulu	cmp x0, #(PLAT_PRIMARY_CPU_A76)
71*91f16700Schasinglulu	b.eq primary_cpu
72*91f16700Schasinglulu	cmp x0, #(PLAT_PRIMARY_CPU_A55)
73*91f16700Schasinglulu	b.eq primary_cpu
74*91f16700Schasingluluprimary_cpu:
75*91f16700Schasinglulu	cset	x0, eq
76*91f16700Schasinglulu	ret
77*91f16700Schasingluluendfunc platform_is_primary_cpu
78*91f16700Schasinglulu
79*91f16700Schasinglulu#endif
80*91f16700Schasinglulu
81*91f16700Schasinglulufunc plat_is_my_cpu_primary
82*91f16700Schasinglulu	mrs	x0, mpidr_el1
83*91f16700Schasinglulu	b   platform_is_primary_cpu
84*91f16700Schasingluluendfunc plat_is_my_cpu_primary
85*91f16700Schasinglulu
86*91f16700Schasinglulufunc plat_my_core_pos
87*91f16700Schasinglulu	mrs	x0, mpidr_el1
88*91f16700Schasinglulu	and	x1, x0, #MPIDR_CPU_MASK
89*91f16700Schasinglulu	and	x0, x0, #MPIDR_CLUSTER_MASK
90*91f16700Schasinglulu#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
91*91f16700Schasinglulu	add	x0, x1, x0, LSR #8
92*91f16700Schasinglulu#else
93*91f16700Schasinglulu	add	x0, x1, x0, LSR #6
94*91f16700Schasinglulu#endif
95*91f16700Schasinglulu	ret
96*91f16700Schasingluluendfunc plat_my_core_pos
97*91f16700Schasinglulu
98*91f16700Schasinglulufunc warm_reset_req
99*91f16700Schasinglulu#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
100*91f16700Schasinglulu	bl	plat_is_my_cpu_primary
101*91f16700Schasinglulu	cbnz	x0, warm_reset
102*91f16700Schasingluluwarm_reset:
103*91f16700Schasinglulu	mov_imm x1, PLAT_SEC_ENTRY
104*91f16700Schasinglulu	str	xzr, [x1]
105*91f16700Schasinglulu	mrs	x1, rmr_el3
106*91f16700Schasinglulu	orr	x1, x1, #0x02
107*91f16700Schasinglulu	msr	rmr_el3, x1
108*91f16700Schasinglulu	isb
109*91f16700Schasinglulu	dsb	sy
110*91f16700Schasinglulu#else
111*91f16700Schasinglulu	str	xzr, [x4]
112*91f16700Schasinglulu	bl	plat_is_my_cpu_primary
113*91f16700Schasinglulu	cbz	x0, cpu_in_wfi
114*91f16700Schasinglulu	mov_imm x1, PLAT_SEC_ENTRY
115*91f16700Schasinglulu	str	xzr, [x1]
116*91f16700Schasinglulu	mrs	x1, rmr_el3
117*91f16700Schasinglulu	orr	x1, x1, #0x02
118*91f16700Schasinglulu	msr	rmr_el3, x1
119*91f16700Schasinglulu	isb
120*91f16700Schasinglulu	dsb	sy
121*91f16700Schasinglulucpu_in_wfi:
122*91f16700Schasinglulu	wfi
123*91f16700Schasinglulu	b	cpu_in_wfi
124*91f16700Schasinglulu#endif
125*91f16700Schasingluluendfunc warm_reset_req
126*91f16700Schasinglulu
127*91f16700Schasinglulu/* TODO: Zephyr warm reset test */
128*91f16700Schasinglulu#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
129*91f16700Schasinglulufunc plat_get_my_entrypoint
130*91f16700Schasinglulu	ldr	x4, =L2_RESET_DONE_REG
131*91f16700Schasinglulu	ldr	x5, [x4]
132*91f16700Schasinglulu	ldr	x1, =PLAT_L2_RESET_REQ
133*91f16700Schasinglulu	cmp	x1, x5
134*91f16700Schasinglulu	b.eq	zephyr_reset_req
135*91f16700Schasinglulu	mov_imm	x1, PLAT_SEC_ENTRY
136*91f16700Schasinglulu	ldr	x0, [x1]
137*91f16700Schasinglulu	ret
138*91f16700Schasingluluzephyr_reset_req:
139*91f16700Schasinglulu	ldr	x0, =0x00
140*91f16700Schasinglulu	ret
141*91f16700Schasingluluendfunc plat_get_my_entrypoint
142*91f16700Schasinglulu#else
143*91f16700Schasinglulufunc plat_get_my_entrypoint
144*91f16700Schasinglulu	ldr	x4, =L2_RESET_DONE_REG
145*91f16700Schasinglulu	ldr	x5, [x4]
146*91f16700Schasinglulu	ldr	x1, =L2_RESET_DONE_STATUS
147*91f16700Schasinglulu	cmp	x1, x5
148*91f16700Schasinglulu	b.eq	warm_reset_req
149*91f16700Schasinglulu	mov_imm	x1, PLAT_SEC_ENTRY
150*91f16700Schasinglulu	ldr	x0, [x1]
151*91f16700Schasinglulu	ret
152*91f16700Schasingluluendfunc plat_get_my_entrypoint
153*91f16700Schasinglulu#endif
154*91f16700Schasinglulu
155*91f16700Schasinglulu	/* ---------------------------------------------
156*91f16700Schasinglulu	 * int plat_crash_console_init(void)
157*91f16700Schasinglulu	 * Function to initialize the crash console
158*91f16700Schasinglulu	 * without a C Runtime to print crash report.
159*91f16700Schasinglulu	 * Clobber list : x0, x1, x2
160*91f16700Schasinglulu	 * ---------------------------------------------
161*91f16700Schasinglulu	 */
162*91f16700Schasinglulufunc plat_crash_console_init
163*91f16700Schasinglulu	mov_imm	x0, CRASH_CONSOLE_BASE
164*91f16700Schasinglulu	mov_imm	x1, PLAT_UART_CLOCK
165*91f16700Schasinglulu	mov_imm	x2, PLAT_BAUDRATE
166*91f16700Schasinglulu	b	console_16550_core_init
167*91f16700Schasingluluendfunc plat_crash_console_init
168*91f16700Schasinglulu
169*91f16700Schasinglulu	/* ---------------------------------------------
170*91f16700Schasinglulu	 * int plat_crash_console_putc(void)
171*91f16700Schasinglulu	 * Function to print a character on the crash
172*91f16700Schasinglulu	 * console without a C Runtime.
173*91f16700Schasinglulu	 * Clobber list : x1, x2
174*91f16700Schasinglulu	 * ---------------------------------------------
175*91f16700Schasinglulu	 */
176*91f16700Schasinglulufunc plat_crash_console_putc
177*91f16700Schasinglulu	mov_imm x1, CRASH_CONSOLE_BASE
178*91f16700Schasinglulu	b	console_16550_core_putc
179*91f16700Schasingluluendfunc plat_crash_console_putc
180*91f16700Schasinglulu
181*91f16700Schasinglulufunc plat_crash_console_flush
182*91f16700Schasinglulu	mov_imm x0, CRASH_CONSOLE_BASE
183*91f16700Schasinglulu	b	console_16550_core_flush
184*91f16700Schasingluluendfunc plat_crash_console_flush
185*91f16700Schasinglulu
186*91f16700Schasinglulu
187*91f16700Schasinglulu	/* --------------------------------------------------------
188*91f16700Schasinglulu	 * void platform_mem_init (void);
189*91f16700Schasinglulu	 *
190*91f16700Schasinglulu	 * Any memory init, relocation to be done before the
191*91f16700Schasinglulu	 * platform boots. Called very early in the boot process.
192*91f16700Schasinglulu	 * --------------------------------------------------------
193*91f16700Schasinglulu	 */
194*91f16700Schasinglulufunc platform_mem_init
195*91f16700Schasinglulu	mov	x0, #0
196*91f16700Schasinglulu	ret
197*91f16700Schasingluluendfunc platform_mem_init
198*91f16700Schasinglulu
199*91f16700Schasinglulu	/* --------------------------------------------------------
200*91f16700Schasinglulu	 * macro plat_secondary_cpus_bl31_entry;
201*91f16700Schasinglulu	 *
202*91f16700Schasinglulu	 * el3_entrypoint_common init param configuration.
203*91f16700Schasinglulu	 * Called very early in the secondary cores boot process.
204*91f16700Schasinglulu	 * --------------------------------------------------------
205*91f16700Schasinglulu	 */
206*91f16700Schasinglulufunc plat_secondary_cpus_bl31_entry
207*91f16700Schasinglulu	el3_entrypoint_common                                   \
208*91f16700Schasinglulu		_init_sctlr=0                                   \
209*91f16700Schasinglulu		_warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS  \
210*91f16700Schasinglulu		_secondary_cold_boot=!COLD_BOOT_SINGLE_CPU      \
211*91f16700Schasinglulu		_init_memory=1                                  \
212*91f16700Schasinglulu		_init_c_runtime=1                               \
213*91f16700Schasinglulu		_exception_vectors=runtime_exceptions		\
214*91f16700Schasinglulu		_pie_fixup_size=BL31_LIMIT - BL31_BASE
215*91f16700Schasingluluendfunc plat_secondary_cpus_bl31_entry
216