xref: /rk3399_ARM-atf/plat/intel/soc/common/aarch64/plat_helpers.S (revision 7ac7dadb551ee602299aef91043dc4adbd234a3e)
13f7b1490SHadi Asyrafi/*
26197dc98SJit Loon Lim * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved.
3*7ac7dadbSSieu Mun Tang * Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
4*7ac7dadbSSieu Mun Tang * Copyright (c) 2024, Altera Corporation. All rights reserved.
53f7b1490SHadi Asyrafi *
63f7b1490SHadi Asyrafi * SPDX-License-Identifier: BSD-3-Clause
73f7b1490SHadi Asyrafi */
83f7b1490SHadi Asyrafi
93f7b1490SHadi Asyrafi#include <arch.h>
103f7b1490SHadi Asyrafi#include <asm_macros.S>
113f7b1490SHadi Asyrafi#include <cpu_macros.S>
123f7b1490SHadi Asyrafi#include <platform_def.h>
132db1e766SHadi Asyrafi#include <el3_common_macros.S>
143f7b1490SHadi Asyrafi
153f7b1490SHadi Asyrafi	.globl	plat_secondary_cold_boot_setup
163f7b1490SHadi Asyrafi	.globl	platform_is_primary_cpu
173f7b1490SHadi Asyrafi	.globl	plat_is_my_cpu_primary
183f7b1490SHadi Asyrafi	.globl	plat_my_core_pos
193f7b1490SHadi Asyrafi	.globl	plat_crash_console_init
203f7b1490SHadi Asyrafi	.globl	plat_crash_console_putc
213f7b1490SHadi Asyrafi	.globl  plat_crash_console_flush
223f7b1490SHadi Asyrafi	.globl	platform_mem_init
232db1e766SHadi Asyrafi	.globl	plat_secondary_cpus_bl31_entry
24*7ac7dadbSSieu Mun Tang	.globl	invalidate_cache_low_el
253f7b1490SHadi Asyrafi
263f7b1490SHadi Asyrafi	.globl plat_get_my_entrypoint
273f7b1490SHadi Asyrafi
283f7b1490SHadi Asyrafi	/* -----------------------------------------------------
293f7b1490SHadi Asyrafi	 * void plat_secondary_cold_boot_setup (void);
303f7b1490SHadi Asyrafi	 *
313f7b1490SHadi Asyrafi	 * This function performs any platform specific actions
323f7b1490SHadi Asyrafi	 * needed for a secondary cpu after a cold reset e.g
333f7b1490SHadi Asyrafi	 * mark the cpu's presence, mechanism to place it in a
343f7b1490SHadi Asyrafi	 * holding pen etc.
353f7b1490SHadi Asyrafi	 * -----------------------------------------------------
363f7b1490SHadi Asyrafi	 */
373f7b1490SHadi Asyrafifunc plat_secondary_cold_boot_setup
383f7b1490SHadi Asyrafi	/* Wait until the it gets reset signal from rstmgr gets populated */
393f7b1490SHadi Asyrafipoll_mailbox:
407931d332SJit Loon Lim#if	PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
417931d332SJit Loon Lim	mov_imm x0, PLAT_SEC_ENTRY
427931d332SJit Loon Lim	cbz	x0, poll_mailbox
437931d332SJit Loon Lim	br      x0
447931d332SJit Loon Lim#else
453f7b1490SHadi Asyrafi	wfi
463f7b1490SHadi Asyrafi	mov_imm	x0, PLAT_SEC_ENTRY
473f7b1490SHadi Asyrafi	ldr	x1, [x0]
483f7b1490SHadi Asyrafi	mov_imm	x2, PLAT_CPUID_RELEASE
493f7b1490SHadi Asyrafi	ldr	x3, [x2]
503f7b1490SHadi Asyrafi	mrs	x4, mpidr_el1
513f7b1490SHadi Asyrafi	and	x4, x4, #0xff
523f7b1490SHadi Asyrafi	cmp	x3, x4
533f7b1490SHadi Asyrafi	b.ne	poll_mailbox
543f7b1490SHadi Asyrafi	br	x1
557931d332SJit Loon Lim#endif
563f7b1490SHadi Asyrafiendfunc plat_secondary_cold_boot_setup
573f7b1490SHadi Asyrafi
587931d332SJit Loon Lim#if	((PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10) || \
597931d332SJit Loon Lim	(PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX) || \
607931d332SJit Loon Lim	(PLATFORM_MODEL == PLAT_SOCFPGA_N5X))
617931d332SJit Loon Lim
623f7b1490SHadi Asyrafifunc platform_is_primary_cpu
633f7b1490SHadi Asyrafi	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
643f7b1490SHadi Asyrafi	cmp	x0, #PLAT_PRIMARY_CPU
653f7b1490SHadi Asyrafi	cset	x0, eq
663f7b1490SHadi Asyrafi	ret
673f7b1490SHadi Asyrafiendfunc platform_is_primary_cpu
683f7b1490SHadi Asyrafi
697931d332SJit Loon Lim#else
707931d332SJit Loon Lim
717931d332SJit Loon Limfunc platform_is_primary_cpu
727931d332SJit Loon Lim	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
737931d332SJit Loon Lim	cmp x0, #(PLAT_PRIMARY_CPU_A76)
747931d332SJit Loon Lim	b.eq primary_cpu
757931d332SJit Loon Lim	cmp x0, #(PLAT_PRIMARY_CPU_A55)
767931d332SJit Loon Lim	b.eq primary_cpu
777931d332SJit Loon Limprimary_cpu:
787931d332SJit Loon Lim	cset	x0, eq
797931d332SJit Loon Lim	ret
807931d332SJit Loon Limendfunc platform_is_primary_cpu
817931d332SJit Loon Lim
827931d332SJit Loon Lim#endif
837931d332SJit Loon Lim
843f7b1490SHadi Asyrafifunc plat_is_my_cpu_primary
853f7b1490SHadi Asyrafi	mrs	x0, mpidr_el1
863f7b1490SHadi Asyrafi	b   platform_is_primary_cpu
873f7b1490SHadi Asyrafiendfunc plat_is_my_cpu_primary
883f7b1490SHadi Asyrafi
893f7b1490SHadi Asyrafifunc plat_my_core_pos
903f7b1490SHadi Asyrafi	mrs	x0, mpidr_el1
913f7b1490SHadi Asyrafi	and	x1, x0, #MPIDR_CPU_MASK
923f7b1490SHadi Asyrafi	and	x0, x0, #MPIDR_CLUSTER_MASK
937931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
947931d332SJit Loon Lim	add	x0, x1, x0, LSR #8
957931d332SJit Loon Lim#else
963f7b1490SHadi Asyrafi	add	x0, x1, x0, LSR #6
977931d332SJit Loon Lim#endif
983f7b1490SHadi Asyrafi	ret
993f7b1490SHadi Asyrafiendfunc plat_my_core_pos
1003f7b1490SHadi Asyrafi
10132cf34acSHadi Asyrafifunc warm_reset_req
1027931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
1037931d332SJit Loon Lim	bl	plat_is_my_cpu_primary
1047931d332SJit Loon Lim	cbnz	x0, warm_reset
1057931d332SJit Loon Limwarm_reset:
1067931d332SJit Loon Lim	mov_imm x1, PLAT_SEC_ENTRY
1077931d332SJit Loon Lim	str	xzr, [x1]
1087931d332SJit Loon Lim	mrs	x1, rmr_el3
1097931d332SJit Loon Lim	orr	x1, x1, #0x02
1107931d332SJit Loon Lim	msr	rmr_el3, x1
1117931d332SJit Loon Lim	isb
1127931d332SJit Loon Lim	dsb	sy
1137931d332SJit Loon Lim#else
11432cf34acSHadi Asyrafi	str	xzr, [x4]
11532cf34acSHadi Asyrafi	bl	plat_is_my_cpu_primary
11632cf34acSHadi Asyrafi	cbz	x0, cpu_in_wfi
11732cf34acSHadi Asyrafi	mov_imm x1, PLAT_SEC_ENTRY
11832cf34acSHadi Asyrafi	str	xzr, [x1]
11932cf34acSHadi Asyrafi	mrs	x1, rmr_el3
12032cf34acSHadi Asyrafi	orr	x1, x1, #0x02
12132cf34acSHadi Asyrafi	msr	rmr_el3, x1
12232cf34acSHadi Asyrafi	isb
12332cf34acSHadi Asyrafi	dsb	sy
12432cf34acSHadi Asyraficpu_in_wfi:
12532cf34acSHadi Asyrafi	wfi
12632cf34acSHadi Asyrafi	b	cpu_in_wfi
1277931d332SJit Loon Lim#endif
12832cf34acSHadi Asyrafiendfunc warm_reset_req
12932cf34acSHadi Asyrafi
1307931d332SJit Loon Lim/* TODO: Zephyr warm reset test */
1317931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
1327931d332SJit Loon Limfunc plat_get_my_entrypoint
1337931d332SJit Loon Lim	ldr	x4, =L2_RESET_DONE_REG
1347931d332SJit Loon Lim	ldr	x5, [x4]
1357931d332SJit Loon Lim	ldr	x1, =PLAT_L2_RESET_REQ
1367931d332SJit Loon Lim	cmp	x1, x5
1377931d332SJit Loon Lim	b.eq	zephyr_reset_req
1387931d332SJit Loon Lim	mov_imm	x1, PLAT_SEC_ENTRY
1397931d332SJit Loon Lim	ldr	x0, [x1]
1407931d332SJit Loon Lim	ret
1417931d332SJit Loon Limzephyr_reset_req:
1427931d332SJit Loon Lim	ldr	x0, =0x00
1437931d332SJit Loon Lim	ret
1447931d332SJit Loon Limendfunc plat_get_my_entrypoint
1457931d332SJit Loon Lim#else
1463f7b1490SHadi Asyrafifunc plat_get_my_entrypoint
14732cf34acSHadi Asyrafi	ldr	x4, =L2_RESET_DONE_REG
14832cf34acSHadi Asyrafi	ldr	x5, [x4]
14932cf34acSHadi Asyrafi	ldr	x1, =L2_RESET_DONE_STATUS
15032cf34acSHadi Asyrafi	cmp	x1, x5
15132cf34acSHadi Asyrafi	b.eq	warm_reset_req
1523f7b1490SHadi Asyrafi	mov_imm	x1, PLAT_SEC_ENTRY
1533f7b1490SHadi Asyrafi	ldr	x0, [x1]
1543f7b1490SHadi Asyrafi	ret
1553f7b1490SHadi Asyrafiendfunc plat_get_my_entrypoint
1567931d332SJit Loon Lim#endif
15732cf34acSHadi Asyrafi
1583f7b1490SHadi Asyrafi	/* ---------------------------------------------
1593f7b1490SHadi Asyrafi	 * int plat_crash_console_init(void)
1603f7b1490SHadi Asyrafi	 * Function to initialize the crash console
1613f7b1490SHadi Asyrafi	 * without a C Runtime to print crash report.
1623f7b1490SHadi Asyrafi	 * Clobber list : x0, x1, x2
1633f7b1490SHadi Asyrafi	 * ---------------------------------------------
1643f7b1490SHadi Asyrafi	 */
1653f7b1490SHadi Asyrafifunc plat_crash_console_init
166447e699fSBoon Khai Ng	mov_imm	x0, CRASH_CONSOLE_BASE
1673f7b1490SHadi Asyrafi	mov_imm	x1, PLAT_UART_CLOCK
1683f7b1490SHadi Asyrafi	mov_imm	x2, PLAT_BAUDRATE
1693f7b1490SHadi Asyrafi	b	console_16550_core_init
1703f7b1490SHadi Asyrafiendfunc plat_crash_console_init
1713f7b1490SHadi Asyrafi
1723f7b1490SHadi Asyrafi	/* ---------------------------------------------
1733f7b1490SHadi Asyrafi	 * int plat_crash_console_putc(void)
1743f7b1490SHadi Asyrafi	 * Function to print a character on the crash
1753f7b1490SHadi Asyrafi	 * console without a C Runtime.
1763f7b1490SHadi Asyrafi	 * Clobber list : x1, x2
1773f7b1490SHadi Asyrafi	 * ---------------------------------------------
1783f7b1490SHadi Asyrafi	 */
1793f7b1490SHadi Asyrafifunc plat_crash_console_putc
180447e699fSBoon Khai Ng	mov_imm x1, CRASH_CONSOLE_BASE
1813f7b1490SHadi Asyrafi	b	console_16550_core_putc
1823f7b1490SHadi Asyrafiendfunc plat_crash_console_putc
1833f7b1490SHadi Asyrafi
1843f7b1490SHadi Asyrafifunc plat_crash_console_flush
1853f7b1490SHadi Asyrafi	mov_imm x0, CRASH_CONSOLE_BASE
1863f7b1490SHadi Asyrafi	b	console_16550_core_flush
1873f7b1490SHadi Asyrafiendfunc plat_crash_console_flush
1883f7b1490SHadi Asyrafi
1893f7b1490SHadi Asyrafi
1903f7b1490SHadi Asyrafi	/* --------------------------------------------------------
1913f7b1490SHadi Asyrafi	 * void platform_mem_init (void);
1923f7b1490SHadi Asyrafi	 *
1933f7b1490SHadi Asyrafi	 * Any memory init, relocation to be done before the
1943f7b1490SHadi Asyrafi	 * platform boots. Called very early in the boot process.
1953f7b1490SHadi Asyrafi	 * --------------------------------------------------------
1963f7b1490SHadi Asyrafi	 */
1973f7b1490SHadi Asyrafifunc platform_mem_init
1983f7b1490SHadi Asyrafi	mov	x0, #0
1993f7b1490SHadi Asyrafi	ret
2003f7b1490SHadi Asyrafiendfunc platform_mem_init
2012db1e766SHadi Asyrafi
2027931d332SJit Loon Lim	/* --------------------------------------------------------
2037931d332SJit Loon Lim	 * macro plat_secondary_cpus_bl31_entry;
2047931d332SJit Loon Lim	 *
2057931d332SJit Loon Lim	 * el3_entrypoint_common init param configuration.
2067931d332SJit Loon Lim	 * Called very early in the secondary cores boot process.
2077931d332SJit Loon Lim	 * --------------------------------------------------------
2087931d332SJit Loon Lim	 */
2092db1e766SHadi Asyrafifunc plat_secondary_cpus_bl31_entry
2102db1e766SHadi Asyrafi	el3_entrypoint_common                                   \
2112db1e766SHadi Asyrafi		_init_sctlr=0                                   \
2122db1e766SHadi Asyrafi		_warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS  \
2132db1e766SHadi Asyrafi		_secondary_cold_boot=!COLD_BOOT_SINGLE_CPU      \
2142db1e766SHadi Asyrafi		_init_memory=1                                  \
2152db1e766SHadi Asyrafi		_init_c_runtime=1                               \
2162db1e766SHadi Asyrafi		_exception_vectors=runtime_exceptions		\
2172db1e766SHadi Asyrafi		_pie_fixup_size=BL31_LIMIT - BL31_BASE
2182db1e766SHadi Asyrafiendfunc plat_secondary_cpus_bl31_entry
219*7ac7dadbSSieu Mun Tang
220*7ac7dadbSSieu Mun Tang/* --------------------------------------------------------
221*7ac7dadbSSieu Mun Tang	 * Invalidate for NS EL2 and EL1
222*7ac7dadbSSieu Mun Tang	 * --------------------------------------------------------
223*7ac7dadbSSieu Mun Tang	 */
224*7ac7dadbSSieu Mun Tangfunc invalidate_cache_low_el
225*7ac7dadbSSieu Mun Tang	mrs	x0,SCR_EL3
226*7ac7dadbSSieu Mun Tang	orr	x1,x0,#SCR_NS_BIT
227*7ac7dadbSSieu Mun Tang	msr	SCR_EL3, x1
228*7ac7dadbSSieu Mun Tang	isb
229*7ac7dadbSSieu Mun Tang	tlbi	ALLE2
230*7ac7dadbSSieu Mun Tang	dsb	sy
231*7ac7dadbSSieu Mun Tang	tlbi	ALLE1
232*7ac7dadbSSieu Mun Tang	dsb	sy
233*7ac7dadbSSieu Mun Tangendfunc invalidate_cache_low_el
234