xref: /rk3399_ARM-atf/plat/intel/soc/common/aarch64/plat_helpers.S (revision 6197dc98feba98c3e123256424d2d33d5de997b8)
13f7b1490SHadi Asyrafi/*
2*6197dc98SJit 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:
373f7b1490SHadi Asyrafi	wfi
383f7b1490SHadi Asyrafi	mov_imm	x0, PLAT_SEC_ENTRY
393f7b1490SHadi Asyrafi	ldr	x1, [x0]
403f7b1490SHadi Asyrafi	mov_imm	x2, PLAT_CPUID_RELEASE
413f7b1490SHadi Asyrafi	ldr	x3, [x2]
423f7b1490SHadi Asyrafi	mrs	x4, mpidr_el1
433f7b1490SHadi Asyrafi	and	x4, x4, #0xff
443f7b1490SHadi Asyrafi	cmp	x3, x4
453f7b1490SHadi Asyrafi	b.ne	poll_mailbox
463f7b1490SHadi Asyrafi	br	x1
473f7b1490SHadi Asyrafiendfunc plat_secondary_cold_boot_setup
483f7b1490SHadi Asyrafi
493f7b1490SHadi Asyrafifunc platform_is_primary_cpu
503f7b1490SHadi Asyrafi	and	x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
513f7b1490SHadi Asyrafi	cmp	x0, #PLAT_PRIMARY_CPU
523f7b1490SHadi Asyrafi	cset	x0, eq
533f7b1490SHadi Asyrafi	ret
543f7b1490SHadi Asyrafiendfunc platform_is_primary_cpu
553f7b1490SHadi Asyrafi
563f7b1490SHadi Asyrafifunc plat_is_my_cpu_primary
573f7b1490SHadi Asyrafi	mrs	x0, mpidr_el1
583f7b1490SHadi Asyrafi	b   platform_is_primary_cpu
593f7b1490SHadi Asyrafiendfunc plat_is_my_cpu_primary
603f7b1490SHadi Asyrafi
613f7b1490SHadi Asyrafifunc plat_my_core_pos
623f7b1490SHadi Asyrafi	mrs	x0, mpidr_el1
633f7b1490SHadi Asyrafi	and	x1, x0, #MPIDR_CPU_MASK
643f7b1490SHadi Asyrafi	and	x0, x0, #MPIDR_CLUSTER_MASK
653f7b1490SHadi Asyrafi	add	x0, x1, x0, LSR #6
663f7b1490SHadi Asyrafi	ret
673f7b1490SHadi Asyrafiendfunc plat_my_core_pos
683f7b1490SHadi Asyrafi
6932cf34acSHadi Asyrafifunc warm_reset_req
7032cf34acSHadi Asyrafi	str	xzr, [x4]
7132cf34acSHadi Asyrafi	bl	plat_is_my_cpu_primary
7232cf34acSHadi Asyrafi	cbz	x0, cpu_in_wfi
7332cf34acSHadi Asyrafi	mov_imm x1, PLAT_SEC_ENTRY
7432cf34acSHadi Asyrafi	str	xzr, [x1]
7532cf34acSHadi Asyrafi	mrs	x1, rmr_el3
7632cf34acSHadi Asyrafi	orr	x1, x1, #0x02
7732cf34acSHadi Asyrafi	msr	rmr_el3, x1
7832cf34acSHadi Asyrafi	isb
7932cf34acSHadi Asyrafi	dsb	sy
8032cf34acSHadi Asyraficpu_in_wfi:
8132cf34acSHadi Asyrafi	wfi
8232cf34acSHadi Asyrafi	b	cpu_in_wfi
8332cf34acSHadi Asyrafiendfunc warm_reset_req
8432cf34acSHadi Asyrafi
853f7b1490SHadi Asyrafifunc plat_get_my_entrypoint
8632cf34acSHadi Asyrafi	ldr	x4, =L2_RESET_DONE_REG
8732cf34acSHadi Asyrafi	ldr	x5, [x4]
8832cf34acSHadi Asyrafi	ldr	x1, =L2_RESET_DONE_STATUS
8932cf34acSHadi Asyrafi	cmp	x1, x5
9032cf34acSHadi Asyrafi	b.eq	warm_reset_req
913f7b1490SHadi Asyrafi	mov_imm	x1, PLAT_SEC_ENTRY
923f7b1490SHadi Asyrafi	ldr	x0, [x1]
933f7b1490SHadi Asyrafi	ret
943f7b1490SHadi Asyrafiendfunc plat_get_my_entrypoint
953f7b1490SHadi Asyrafi
9632cf34acSHadi Asyrafi
973f7b1490SHadi Asyrafi	/* ---------------------------------------------
983f7b1490SHadi Asyrafi	 * int plat_crash_console_init(void)
993f7b1490SHadi Asyrafi	 * Function to initialize the crash console
1003f7b1490SHadi Asyrafi	 * without a C Runtime to print crash report.
1013f7b1490SHadi Asyrafi	 * Clobber list : x0, x1, x2
1023f7b1490SHadi Asyrafi	 * ---------------------------------------------
1033f7b1490SHadi Asyrafi	 */
1043f7b1490SHadi Asyrafifunc plat_crash_console_init
105447e699fSBoon Khai Ng	mov_imm	x0, CRASH_CONSOLE_BASE
1063f7b1490SHadi Asyrafi	mov_imm	x1, PLAT_UART_CLOCK
1073f7b1490SHadi Asyrafi	mov_imm	x2, PLAT_BAUDRATE
1083f7b1490SHadi Asyrafi	b	console_16550_core_init
1093f7b1490SHadi Asyrafiendfunc plat_crash_console_init
1103f7b1490SHadi Asyrafi
1113f7b1490SHadi Asyrafi	/* ---------------------------------------------
1123f7b1490SHadi Asyrafi	 * int plat_crash_console_putc(void)
1133f7b1490SHadi Asyrafi	 * Function to print a character on the crash
1143f7b1490SHadi Asyrafi	 * console without a C Runtime.
1153f7b1490SHadi Asyrafi	 * Clobber list : x1, x2
1163f7b1490SHadi Asyrafi	 * ---------------------------------------------
1173f7b1490SHadi Asyrafi	 */
1183f7b1490SHadi Asyrafifunc plat_crash_console_putc
119447e699fSBoon Khai Ng	mov_imm x1, CRASH_CONSOLE_BASE
1203f7b1490SHadi Asyrafi	b	console_16550_core_putc
1213f7b1490SHadi Asyrafiendfunc plat_crash_console_putc
1223f7b1490SHadi Asyrafi
1233f7b1490SHadi Asyrafifunc plat_crash_console_flush
1243f7b1490SHadi Asyrafi	mov_imm x0, CRASH_CONSOLE_BASE
1253f7b1490SHadi Asyrafi	b	console_16550_core_flush
1263f7b1490SHadi Asyrafiendfunc plat_crash_console_flush
1273f7b1490SHadi Asyrafi
1283f7b1490SHadi Asyrafi
1293f7b1490SHadi Asyrafi	/* --------------------------------------------------------
1303f7b1490SHadi Asyrafi	 * void platform_mem_init (void);
1313f7b1490SHadi Asyrafi	 *
1323f7b1490SHadi Asyrafi	 * Any memory init, relocation to be done before the
1333f7b1490SHadi Asyrafi	 * platform boots. Called very early in the boot process.
1343f7b1490SHadi Asyrafi	 * --------------------------------------------------------
1353f7b1490SHadi Asyrafi	 */
1363f7b1490SHadi Asyrafifunc platform_mem_init
1373f7b1490SHadi Asyrafi	mov	x0, #0
1383f7b1490SHadi Asyrafi	ret
1393f7b1490SHadi Asyrafiendfunc platform_mem_init
1402db1e766SHadi Asyrafi
1412db1e766SHadi Asyrafifunc plat_secondary_cpus_bl31_entry
1422db1e766SHadi Asyrafi	el3_entrypoint_common                                   \
1432db1e766SHadi Asyrafi		_init_sctlr=0                                   \
1442db1e766SHadi Asyrafi		_warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS  \
1452db1e766SHadi Asyrafi		_secondary_cold_boot=!COLD_BOOT_SINGLE_CPU      \
1462db1e766SHadi Asyrafi		_init_memory=1                                  \
1472db1e766SHadi Asyrafi		_init_c_runtime=1                               \
1482db1e766SHadi Asyrafi		_exception_vectors=runtime_exceptions		\
1492db1e766SHadi Asyrafi		_pie_fixup_size=BL31_LIMIT - BL31_BASE
1502db1e766SHadi Asyrafiendfunc plat_secondary_cpus_bl31_entry
151