xref: /rk3399_ARM-atf/plat/imx/imx9/common/aarch64/plat_helpers.S (revision 480e8dd9df291cc0e31695983fa6ff235e1671cd)
1*4ddfb6f1SJacky Bai/*
2*4ddfb6f1SJacky Bai * Copyright 2022-2025 NXP.
3*4ddfb6f1SJacky Bai *
4*4ddfb6f1SJacky Bai * SPDX-License-Identifier: BSD-3-Clause
5*4ddfb6f1SJacky Bai */
6*4ddfb6f1SJacky Bai
7*4ddfb6f1SJacky Bai#include <asm_macros.S>
8*4ddfb6f1SJacky Bai#include <cortex_a55.h>
9*4ddfb6f1SJacky Bai
10*4ddfb6f1SJacky Bai#include <platform_def.h>
11*4ddfb6f1SJacky Bai
12*4ddfb6f1SJacky Bai	.globl	plat_is_my_cpu_primary
13*4ddfb6f1SJacky Bai	.globl	plat_my_core_pos
14*4ddfb6f1SJacky Bai	.globl	plat_calc_core_pos
15*4ddfb6f1SJacky Bai	.globl	plat_arm_calc_core_pos
16*4ddfb6f1SJacky Bai	.globl	platform_mem_init
17*4ddfb6f1SJacky Bai
18*4ddfb6f1SJacky Bai	/* ----------------------------------------------
19*4ddfb6f1SJacky Bai	 * unsigned int plat_is_my_cpu_primary(void);
20*4ddfb6f1SJacky Bai	 * This function checks if this is the primary CPU
21*4ddfb6f1SJacky Bai	 * ----------------------------------------------
22*4ddfb6f1SJacky Bai	 */
23*4ddfb6f1SJacky Baifunc plat_is_my_cpu_primary
24*4ddfb6f1SJacky Bai	mrs	x0, mpidr_el1
25*4ddfb6f1SJacky Bai	mov_imm x1, MPIDR_AFFINITY_MASK
26*4ddfb6f1SJacky Bai	and	x0, x0, x1
27*4ddfb6f1SJacky Bai	cmp	x0, #PLAT_PRIMARY_CPU
28*4ddfb6f1SJacky Bai	cset	x0, eq
29*4ddfb6f1SJacky Bai	ret
30*4ddfb6f1SJacky Baiendfunc plat_is_my_cpu_primary
31*4ddfb6f1SJacky Bai
32*4ddfb6f1SJacky Bai	/* ----------------------------------------------
33*4ddfb6f1SJacky Bai	 * unsigned int plat_my_core_pos(void)
34*4ddfb6f1SJacky Bai	 * This Function uses the plat_calc_core_pos()
35*4ddfb6f1SJacky Bai	 * to get the index of the calling CPU.
36*4ddfb6f1SJacky Bai	 * ----------------------------------------------
37*4ddfb6f1SJacky Bai	 */
38*4ddfb6f1SJacky Baifunc plat_my_core_pos
39*4ddfb6f1SJacky Bai	mrs	x0, mpidr_el1
40*4ddfb6f1SJacky Bai	mov	x1, #MPIDR_AFFLVL_MASK
41*4ddfb6f1SJacky Bai	and	x0, x1, x0, lsr #MPIDR_AFF1_SHIFT
42*4ddfb6f1SJacky Bai	ret
43*4ddfb6f1SJacky Baiendfunc plat_my_core_pos
44*4ddfb6f1SJacky Bai
45*4ddfb6f1SJacky Bai	/*
46*4ddfb6f1SJacky Bai	 * unsigned int plat_calc_core_pos(uint64_t mpidr)
47*4ddfb6f1SJacky Bai	 * helper function to calculate the core position.
48*4ddfb6f1SJacky Bai	 * With this function.
49*4ddfb6f1SJacky Bai	 */
50*4ddfb6f1SJacky Baifunc plat_calc_core_pos
51*4ddfb6f1SJacky Bai	mov	x1, #MPIDR_AFFLVL_MASK
52*4ddfb6f1SJacky Bai	and	x0, x1, x0, lsr #MPIDR_AFF1_SHIFT
53*4ddfb6f1SJacky Bai	ret
54*4ddfb6f1SJacky Baiendfunc plat_calc_core_pos
55*4ddfb6f1SJacky Bai
56*4ddfb6f1SJacky Baifunc plat_arm_calc_core_pos
57*4ddfb6f1SJacky Bai	b	plat_core_pos_by_mpidr
58*4ddfb6f1SJacky Baiendfunc plat_arm_calc_core_pos
59*4ddfb6f1SJacky Bai
60*4ddfb6f1SJacky Baifunc platform_mem_init
61*4ddfb6f1SJacky Bai	ret
62*4ddfb6f1SJacky Baiendfunc platform_mem_init
63