xref: /rk3399_ARM-atf/plat/intel/soc/common/aarch64/plat_helpers.S (revision 7931d3322dc137447981d261e900f5a62d2181ee)
13f7b1490SHadi Asyrafi/*
26197dc98SJit Loon Lim * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved.
33f7b1490SHadi Asyrafi *
43f7b1490SHadi Asyrafi * SPDX-License-Identifier: BSD-3-Clause
53f7b1490SHadi Asyrafi */
63f7b1490SHadi Asyrafi
73f7b1490SHadi Asyrafi#include <arch.h>
83f7b1490SHadi Asyrafi#include <asm_macros.S>
93f7b1490SHadi Asyrafi#include <cpu_macros.S>
103f7b1490SHadi Asyrafi#include <platform_def.h>
112db1e766SHadi Asyrafi#include <el3_common_macros.S>
123f7b1490SHadi Asyrafi
133f7b1490SHadi Asyrafi	.globl	plat_secondary_cold_boot_setup
143f7b1490SHadi Asyrafi	.globl	platform_is_primary_cpu
153f7b1490SHadi Asyrafi	.globl	plat_is_my_cpu_primary
163f7b1490SHadi Asyrafi	.globl	plat_my_core_pos
173f7b1490SHadi Asyrafi	.globl	plat_crash_console_init
183f7b1490SHadi Asyrafi	.globl	plat_crash_console_putc
193f7b1490SHadi Asyrafi	.globl  plat_crash_console_flush
203f7b1490SHadi Asyrafi	.globl	platform_mem_init
212db1e766SHadi Asyrafi	.globl	plat_secondary_cpus_bl31_entry
223f7b1490SHadi Asyrafi
233f7b1490SHadi Asyrafi	.globl plat_get_my_entrypoint
243f7b1490SHadi Asyrafi
253f7b1490SHadi Asyrafi	/* -----------------------------------------------------
263f7b1490SHadi Asyrafi	 * void plat_secondary_cold_boot_setup (void);
273f7b1490SHadi Asyrafi	 *
283f7b1490SHadi Asyrafi	 * This function performs any platform specific actions
293f7b1490SHadi Asyrafi	 * needed for a secondary cpu after a cold reset e.g
303f7b1490SHadi Asyrafi	 * mark the cpu's presence, mechanism to place it in a
313f7b1490SHadi Asyrafi	 * holding pen etc.
323f7b1490SHadi Asyrafi	 * -----------------------------------------------------
333f7b1490SHadi Asyrafi	 */
343f7b1490SHadi Asyrafifunc plat_secondary_cold_boot_setup
353f7b1490SHadi Asyrafi	/* Wait until the it gets reset signal from rstmgr gets populated */
363f7b1490SHadi Asyrafipoll_mailbox:
37*7931d332SJit Loon Lim#if	PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
38*7931d332SJit Loon Lim	mov_imm x0, PLAT_SEC_ENTRY
39*7931d332SJit Loon Lim	cbz	x0, poll_mailbox
40*7931d332SJit Loon Lim	br      x0
41*7931d332SJit Loon Lim#else
423f7b1490SHadi Asyrafi	wfi
433f7b1490SHadi Asyrafi	mov_imm	x0, PLAT_SEC_ENTRY
443f7b1490SHadi Asyrafi	ldr	x1, [x0]
453f7b1490SHadi Asyrafi	mov_imm	x2, PLAT_CPUID_RELEASE
463f7b1490SHadi Asyrafi	ldr	x3, [x2]
473f7b1490SHadi Asyrafi	mrs	x4, mpidr_el1
483f7b1490SHadi Asyrafi	and	x4, x4, #0xff
493f7b1490SHadi Asyrafi	cmp	x3, x4
503f7b1490SHadi Asyrafi	b.ne	poll_mailbox
513f7b1490SHadi Asyrafi	br	x1
52*7931d332SJit Loon Lim#endif
533f7b1490SHadi Asyrafiendfunc plat_secondary_cold_boot_setup
543f7b1490SHadi Asyrafi
55*7931d332SJit Loon Lim#if	((PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10) || \
56*7931d332SJit Loon Lim	(PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX) || \
57*7931d332SJit Loon Lim	(PLATFORM_MODEL == PLAT_SOCFPGA_N5X))
58*7931d332SJit Loon Lim
593f7b1490SHadi Asyrafifunc platform_is_primary_cpu
603f7b1490SHadi Asyrafi	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
613f7b1490SHadi Asyrafi	cmp	x0, #PLAT_PRIMARY_CPU
623f7b1490SHadi Asyrafi	cset	x0, eq
633f7b1490SHadi Asyrafi	ret
643f7b1490SHadi Asyrafiendfunc platform_is_primary_cpu
653f7b1490SHadi Asyrafi
66*7931d332SJit Loon Lim#else
67*7931d332SJit Loon Lim
68*7931d332SJit Loon Limfunc platform_is_primary_cpu
69*7931d332SJit Loon Lim	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
70*7931d332SJit Loon Lim	cmp x0, #(PLAT_PRIMARY_CPU_A76)
71*7931d332SJit Loon Lim	b.eq primary_cpu
72*7931d332SJit Loon Lim	cmp x0, #(PLAT_PRIMARY_CPU_A55)
73*7931d332SJit Loon Lim	b.eq primary_cpu
74*7931d332SJit Loon Limprimary_cpu:
75*7931d332SJit Loon Lim	cset	x0, eq
76*7931d332SJit Loon Lim	ret
77*7931d332SJit Loon Limendfunc platform_is_primary_cpu
78*7931d332SJit Loon Lim
79*7931d332SJit Loon Lim#endif
80*7931d332SJit Loon Lim
813f7b1490SHadi Asyrafifunc plat_is_my_cpu_primary
823f7b1490SHadi Asyrafi	mrs	x0, mpidr_el1
833f7b1490SHadi Asyrafi	b   platform_is_primary_cpu
843f7b1490SHadi Asyrafiendfunc plat_is_my_cpu_primary
853f7b1490SHadi Asyrafi
863f7b1490SHadi Asyrafifunc plat_my_core_pos
873f7b1490SHadi Asyrafi	mrs	x0, mpidr_el1
883f7b1490SHadi Asyrafi	and	x1, x0, #MPIDR_CPU_MASK
893f7b1490SHadi Asyrafi	and	x0, x0, #MPIDR_CLUSTER_MASK
90*7931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
91*7931d332SJit Loon Lim	add	x0, x1, x0, LSR #8
92*7931d332SJit Loon Lim#else
933f7b1490SHadi Asyrafi	add	x0, x1, x0, LSR #6
94*7931d332SJit Loon Lim#endif
953f7b1490SHadi Asyrafi	ret
963f7b1490SHadi Asyrafiendfunc plat_my_core_pos
973f7b1490SHadi Asyrafi
9832cf34acSHadi Asyrafifunc warm_reset_req
99*7931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
100*7931d332SJit Loon Lim	bl	plat_is_my_cpu_primary
101*7931d332SJit Loon Lim	cbnz	x0, warm_reset
102*7931d332SJit Loon Limwarm_reset:
103*7931d332SJit Loon Lim	mov_imm x1, PLAT_SEC_ENTRY
104*7931d332SJit Loon Lim	str	xzr, [x1]
105*7931d332SJit Loon Lim	mrs	x1, rmr_el3
106*7931d332SJit Loon Lim	orr	x1, x1, #0x02
107*7931d332SJit Loon Lim	msr	rmr_el3, x1
108*7931d332SJit Loon Lim	isb
109*7931d332SJit Loon Lim	dsb	sy
110*7931d332SJit Loon Lim#else
11132cf34acSHadi Asyrafi	str	xzr, [x4]
11232cf34acSHadi Asyrafi	bl	plat_is_my_cpu_primary
11332cf34acSHadi Asyrafi	cbz	x0, cpu_in_wfi
11432cf34acSHadi Asyrafi	mov_imm x1, PLAT_SEC_ENTRY
11532cf34acSHadi Asyrafi	str	xzr, [x1]
11632cf34acSHadi Asyrafi	mrs	x1, rmr_el3
11732cf34acSHadi Asyrafi	orr	x1, x1, #0x02
11832cf34acSHadi Asyrafi	msr	rmr_el3, x1
11932cf34acSHadi Asyrafi	isb
12032cf34acSHadi Asyrafi	dsb	sy
12132cf34acSHadi Asyraficpu_in_wfi:
12232cf34acSHadi Asyrafi	wfi
12332cf34acSHadi Asyrafi	b	cpu_in_wfi
124*7931d332SJit Loon Lim#endif
12532cf34acSHadi Asyrafiendfunc warm_reset_req
12632cf34acSHadi Asyrafi
127*7931d332SJit Loon Lim/* TODO: Zephyr warm reset test */
128*7931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
129*7931d332SJit Loon Limfunc plat_get_my_entrypoint
130*7931d332SJit Loon Lim	ldr	x4, =L2_RESET_DONE_REG
131*7931d332SJit Loon Lim	ldr	x5, [x4]
132*7931d332SJit Loon Lim	ldr	x1, =PLAT_L2_RESET_REQ
133*7931d332SJit Loon Lim	cmp	x1, x5
134*7931d332SJit Loon Lim	b.eq	zephyr_reset_req
135*7931d332SJit Loon Lim	mov_imm	x1, PLAT_SEC_ENTRY
136*7931d332SJit Loon Lim	ldr	x0, [x1]
137*7931d332SJit Loon Lim	ret
138*7931d332SJit Loon Limzephyr_reset_req:
139*7931d332SJit Loon Lim	ldr	x0, =0x00
140*7931d332SJit Loon Lim	ret
141*7931d332SJit Loon Limendfunc plat_get_my_entrypoint
142*7931d332SJit Loon Lim#else
1433f7b1490SHadi Asyrafifunc plat_get_my_entrypoint
14432cf34acSHadi Asyrafi	ldr	x4, =L2_RESET_DONE_REG
14532cf34acSHadi Asyrafi	ldr	x5, [x4]
14632cf34acSHadi Asyrafi	ldr	x1, =L2_RESET_DONE_STATUS
14732cf34acSHadi Asyrafi	cmp	x1, x5
14832cf34acSHadi Asyrafi	b.eq	warm_reset_req
1493f7b1490SHadi Asyrafi	mov_imm	x1, PLAT_SEC_ENTRY
1503f7b1490SHadi Asyrafi	ldr	x0, [x1]
1513f7b1490SHadi Asyrafi	ret
1523f7b1490SHadi Asyrafiendfunc plat_get_my_entrypoint
153*7931d332SJit Loon Lim#endif
15432cf34acSHadi Asyrafi
1553f7b1490SHadi Asyrafi	/* ---------------------------------------------
1563f7b1490SHadi Asyrafi	 * int plat_crash_console_init(void)
1573f7b1490SHadi Asyrafi	 * Function to initialize the crash console
1583f7b1490SHadi Asyrafi	 * without a C Runtime to print crash report.
1593f7b1490SHadi Asyrafi	 * Clobber list : x0, x1, x2
1603f7b1490SHadi Asyrafi	 * ---------------------------------------------
1613f7b1490SHadi Asyrafi	 */
1623f7b1490SHadi Asyrafifunc plat_crash_console_init
163447e699fSBoon Khai Ng	mov_imm	x0, CRASH_CONSOLE_BASE
1643f7b1490SHadi Asyrafi	mov_imm	x1, PLAT_UART_CLOCK
1653f7b1490SHadi Asyrafi	mov_imm	x2, PLAT_BAUDRATE
1663f7b1490SHadi Asyrafi	b	console_16550_core_init
1673f7b1490SHadi Asyrafiendfunc plat_crash_console_init
1683f7b1490SHadi Asyrafi
1693f7b1490SHadi Asyrafi	/* ---------------------------------------------
1703f7b1490SHadi Asyrafi	 * int plat_crash_console_putc(void)
1713f7b1490SHadi Asyrafi	 * Function to print a character on the crash
1723f7b1490SHadi Asyrafi	 * console without a C Runtime.
1733f7b1490SHadi Asyrafi	 * Clobber list : x1, x2
1743f7b1490SHadi Asyrafi	 * ---------------------------------------------
1753f7b1490SHadi Asyrafi	 */
1763f7b1490SHadi Asyrafifunc plat_crash_console_putc
177447e699fSBoon Khai Ng	mov_imm x1, CRASH_CONSOLE_BASE
1783f7b1490SHadi Asyrafi	b	console_16550_core_putc
1793f7b1490SHadi Asyrafiendfunc plat_crash_console_putc
1803f7b1490SHadi Asyrafi
1813f7b1490SHadi Asyrafifunc plat_crash_console_flush
1823f7b1490SHadi Asyrafi	mov_imm x0, CRASH_CONSOLE_BASE
1833f7b1490SHadi Asyrafi	b	console_16550_core_flush
1843f7b1490SHadi Asyrafiendfunc plat_crash_console_flush
1853f7b1490SHadi Asyrafi
1863f7b1490SHadi Asyrafi
1873f7b1490SHadi Asyrafi	/* --------------------------------------------------------
1883f7b1490SHadi Asyrafi	 * void platform_mem_init (void);
1893f7b1490SHadi Asyrafi	 *
1903f7b1490SHadi Asyrafi	 * Any memory init, relocation to be done before the
1913f7b1490SHadi Asyrafi	 * platform boots. Called very early in the boot process.
1923f7b1490SHadi Asyrafi	 * --------------------------------------------------------
1933f7b1490SHadi Asyrafi	 */
1943f7b1490SHadi Asyrafifunc platform_mem_init
1953f7b1490SHadi Asyrafi	mov	x0, #0
1963f7b1490SHadi Asyrafi	ret
1973f7b1490SHadi Asyrafiendfunc platform_mem_init
1982db1e766SHadi Asyrafi
199*7931d332SJit Loon Lim	/* --------------------------------------------------------
200*7931d332SJit Loon Lim	 * macro plat_secondary_cpus_bl31_entry;
201*7931d332SJit Loon Lim	 *
202*7931d332SJit Loon Lim	 * el3_entrypoint_common init param configuration.
203*7931d332SJit Loon Lim	 * Called very early in the secondary cores boot process.
204*7931d332SJit Loon Lim	 * --------------------------------------------------------
205*7931d332SJit Loon Lim	 */
2062db1e766SHadi Asyrafifunc plat_secondary_cpus_bl31_entry
2072db1e766SHadi Asyrafi	el3_entrypoint_common                                   \
2082db1e766SHadi Asyrafi		_init_sctlr=0                                   \
2092db1e766SHadi Asyrafi		_warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS  \
2102db1e766SHadi Asyrafi		_secondary_cold_boot=!COLD_BOOT_SINGLE_CPU      \
2112db1e766SHadi Asyrafi		_init_memory=1                                  \
2122db1e766SHadi Asyrafi		_init_c_runtime=1                               \
2132db1e766SHadi Asyrafi		_exception_vectors=runtime_exceptions		\
2142db1e766SHadi Asyrafi		_pie_fixup_size=BL31_LIMIT - BL31_BASE
2152db1e766SHadi Asyrafiendfunc plat_secondary_cpus_bl31_entry
216