xref: /rk3399_ARM-atf/plat/intel/soc/common/aarch64/plat_helpers.S (revision c1253b2445d6b57851118fb9cb4ee1eac9e122be)
13f7b1490SHadi Asyrafi/*
26197dc98SJit Loon Lim * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved.
37ac7dadbSSieu Mun Tang * Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
47ac7dadbSSieu 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
243f7b1490SHadi Asyrafi
253f7b1490SHadi Asyrafi	.globl plat_get_my_entrypoint
263f7b1490SHadi Asyrafi
273f7b1490SHadi Asyrafi	/* -----------------------------------------------------
283f7b1490SHadi Asyrafi	 * void plat_secondary_cold_boot_setup (void);
293f7b1490SHadi Asyrafi	 *
303f7b1490SHadi Asyrafi	 * This function performs any platform specific actions
313f7b1490SHadi Asyrafi	 * needed for a secondary cpu after a cold reset e.g
323f7b1490SHadi Asyrafi	 * mark the cpu's presence, mechanism to place it in a
333f7b1490SHadi Asyrafi	 * holding pen etc.
343f7b1490SHadi Asyrafi	 * -----------------------------------------------------
353f7b1490SHadi Asyrafi	 */
363f7b1490SHadi Asyrafifunc plat_secondary_cold_boot_setup
373f7b1490SHadi Asyrafi	/* Wait until the it gets reset signal from rstmgr gets populated */
383f7b1490SHadi Asyrafipoll_mailbox:
397931d332SJit Loon Lim#if	PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
407931d332SJit Loon Lim	mov_imm x0, PLAT_SEC_ENTRY
417931d332SJit Loon Lim	cbz	x0, poll_mailbox
427931d332SJit Loon Lim	br      x0
437931d332SJit Loon Lim#else
443f7b1490SHadi Asyrafi	wfi
453f7b1490SHadi Asyrafi	mov_imm	x0, PLAT_SEC_ENTRY
463f7b1490SHadi Asyrafi	ldr	x1, [x0]
473f7b1490SHadi Asyrafi	mov_imm	x2, PLAT_CPUID_RELEASE
483f7b1490SHadi Asyrafi	ldr	x3, [x2]
493f7b1490SHadi Asyrafi	mrs	x4, mpidr_el1
503f7b1490SHadi Asyrafi	and	x4, x4, #0xff
513f7b1490SHadi Asyrafi	cmp	x3, x4
523f7b1490SHadi Asyrafi	b.ne	poll_mailbox
533f7b1490SHadi Asyrafi	br	x1
547931d332SJit Loon Lim#endif
553f7b1490SHadi Asyrafiendfunc plat_secondary_cold_boot_setup
563f7b1490SHadi Asyrafi
577931d332SJit Loon Lim#if	((PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10) || \
587931d332SJit Loon Lim	(PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX) || \
597931d332SJit Loon Lim	(PLATFORM_MODEL == PLAT_SOCFPGA_N5X))
607931d332SJit Loon Lim
613f7b1490SHadi Asyrafifunc platform_is_primary_cpu
623f7b1490SHadi Asyrafi	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
633f7b1490SHadi Asyrafi	cmp	x0, #PLAT_PRIMARY_CPU
643f7b1490SHadi Asyrafi	cset	x0, eq
653f7b1490SHadi Asyrafi	ret
663f7b1490SHadi Asyrafiendfunc platform_is_primary_cpu
673f7b1490SHadi Asyrafi
687931d332SJit Loon Lim#else
697931d332SJit Loon Lim
707931d332SJit Loon Limfunc platform_is_primary_cpu
717931d332SJit Loon Lim	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
727931d332SJit Loon Lim	cmp x0, #(PLAT_PRIMARY_CPU_A76)
737931d332SJit Loon Lim	b.eq primary_cpu
747931d332SJit Loon Lim	cmp x0, #(PLAT_PRIMARY_CPU_A55)
757931d332SJit Loon Lim	b.eq primary_cpu
767931d332SJit Loon Limprimary_cpu:
777931d332SJit Loon Lim	cset	x0, eq
787931d332SJit Loon Lim	ret
797931d332SJit Loon Limendfunc platform_is_primary_cpu
807931d332SJit Loon Lim
817931d332SJit Loon Lim#endif
827931d332SJit Loon Lim
833f7b1490SHadi Asyrafifunc plat_is_my_cpu_primary
843f7b1490SHadi Asyrafi	mrs	x0, mpidr_el1
853f7b1490SHadi Asyrafi	b   platform_is_primary_cpu
863f7b1490SHadi Asyrafiendfunc plat_is_my_cpu_primary
873f7b1490SHadi Asyrafi
883f7b1490SHadi Asyrafifunc plat_my_core_pos
893f7b1490SHadi Asyrafi	mrs	x0, mpidr_el1
903f7b1490SHadi Asyrafi	and	x1, x0, #MPIDR_CPU_MASK
913f7b1490SHadi Asyrafi	and	x0, x0, #MPIDR_CLUSTER_MASK
927931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
937931d332SJit Loon Lim	add	x0, x1, x0, LSR #8
947931d332SJit Loon Lim#else
953f7b1490SHadi Asyrafi	add	x0, x1, x0, LSR #6
967931d332SJit Loon Lim#endif
973f7b1490SHadi Asyrafi	ret
983f7b1490SHadi Asyrafiendfunc plat_my_core_pos
993f7b1490SHadi Asyrafi
10032cf34acSHadi Asyrafifunc warm_reset_req
10132cf34acSHadi Asyrafi	str	xzr, [x4]
10232cf34acSHadi Asyrafi	bl	plat_is_my_cpu_primary
10332cf34acSHadi Asyrafi	cbz	x0, cpu_in_wfi
10432cf34acSHadi Asyrafi	mov_imm x1, PLAT_SEC_ENTRY
10532cf34acSHadi Asyrafi	str	xzr, [x1]
10632cf34acSHadi Asyrafi	mrs	x1, rmr_el3
10732cf34acSHadi Asyrafi	orr	x1, x1, #0x02
10832cf34acSHadi Asyrafi	msr	rmr_el3, x1
10932cf34acSHadi Asyrafi	isb
11032cf34acSHadi Asyrafi	dsb	sy
11132cf34acSHadi Asyraficpu_in_wfi:
11232cf34acSHadi Asyrafi	wfi
11332cf34acSHadi Asyrafi	b	cpu_in_wfi
11432cf34acSHadi Asyrafiendfunc warm_reset_req
11532cf34acSHadi Asyrafi
1167931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
1177931d332SJit Loon Limfunc plat_get_my_entrypoint
1187931d332SJit Loon Lim	ldr	x4, =L2_RESET_DONE_REG
1197931d332SJit Loon Lim	ldr	x5, [x4]
120*c1253b24SSieu Mun Tang
121*c1253b24SSieu Mun Tang	/* Check for warm reset request */
122*c1253b24SSieu Mun Tang	ldr	x1, =L2_RESET_DONE_STATUS
1237931d332SJit Loon Lim	cmp	x1, x5
124*c1253b24SSieu Mun Tang	b.eq	warm_reset_req
125*c1253b24SSieu Mun Tang
126*c1253b24SSieu Mun Tang	/* Check for SMP secondary cores boot request */
127*c1253b24SSieu Mun Tang	ldr	x1, =SMP_SEC_CORE_BOOT_REQ
128*c1253b24SSieu Mun Tang	cmp	x1, x5
129*c1253b24SSieu Mun Tang	b.eq	smp_request
130*c1253b24SSieu Mun Tang
131*c1253b24SSieu Mun Tang	/* Otherwise it is cold reset */
132*c1253b24SSieu Mun Tang	mov	x0, #0
133*c1253b24SSieu Mun Tang	ret
134*c1253b24SSieu Mun Tangsmp_request:
135*c1253b24SSieu Mun Tang	/*
136*c1253b24SSieu Mun Tang	 * Return the address 'bl31_warm_entrypoint', which is passed to
137*c1253b24SSieu Mun Tang	 * 'psci_setup' routine as part of BL31 initialization.
138*c1253b24SSieu Mun Tang	 */
1397931d332SJit Loon Lim	mov_imm	x1, PLAT_SEC_ENTRY
1407931d332SJit Loon Lim	ldr	x0, [x1]
141*c1253b24SSieu Mun Tang	/* Clear the mark up before return */
142*c1253b24SSieu Mun Tang	str	xzr, [x4]
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