xref: /rk3399_ARM-atf/plat/xilinx/versal_net/aarch64/versal_net_helpers.S (revision 996a8468050b9b4b187f865c53eefe1e02bd427a)
11d333e69SMichal Simek/*
2619bc13eSMichal Simek * Copyright (c) 2018-2021, Arm Limited and Contributors. All rights reserved.
31d333e69SMichal Simek * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved.
4*9127041aSPrasad Kummari * Copyright (c) 2022-2025, Advanced Micro Devices, Inc. All rights reserved.
51d333e69SMichal Simek *
61d333e69SMichal Simek * SPDX-License-Identifier: BSD-3-Clause
71d333e69SMichal Simek */
81d333e69SMichal Simek
901a326abSPrasad Kummari#include <arch.h>
106304759aSPrasad Kummari#include <asm_macros.S>
111d333e69SMichal Simek#include <drivers/arm/gicv3.h>
1201a326abSPrasad Kummari
131d333e69SMichal Simek#include <platform_def.h>
141d333e69SMichal Simek
15b2259261SJay Buddhabhatti	.globl	plat_arm_calc_core_pos
161d333e69SMichal Simek	.globl	plat_secondary_cold_boot_setup
171d333e69SMichal Simek	.globl	plat_is_my_cpu_primary
181d333e69SMichal Simek	.globl	platform_mem_init
191d333e69SMichal Simek	.globl	plat_my_core_pos
20*9127041aSPrasad Kummari	.globl	plat_core_pos_by_mpidr
211d333e69SMichal Simek
221d333e69SMichal Simek	/* -----------------------------------------------------
231d333e69SMichal Simek	 * void plat_secondary_cold_boot_setup (void);
241d333e69SMichal Simek	 *
251d333e69SMichal Simek	 * This function performs any platform specific actions
261d333e69SMichal Simek	 * needed for a secondary cpu after a cold reset e.g
271d333e69SMichal Simek	 * mark the cpu's presence, mechanism to place it in a
281d333e69SMichal Simek	 * holding pen etc.
291d333e69SMichal Simek	 * TODO: Should we read the PSYS register to make sure
301d333e69SMichal Simek	 * that the request has gone through.
311d333e69SMichal Simek	 * -----------------------------------------------------
321d333e69SMichal Simek	 */
331d333e69SMichal Simekfunc plat_secondary_cold_boot_setup
341d333e69SMichal Simek	mrs	x0, mpidr_el1
351d333e69SMichal Simek
361d333e69SMichal Simek	/*
371d333e69SMichal Simek	 * There is no sane reason to come out of this wfi. This
381d333e69SMichal Simek	 * cpu will be powered on and reset by the cpu_on pm api
391d333e69SMichal Simek	 */
401d333e69SMichal Simek	dsb	sy
411d333e69SMichal Simek	bl	plat_panic_handler
421d333e69SMichal Simekendfunc plat_secondary_cold_boot_setup
431d333e69SMichal Simek
441d333e69SMichal Simekfunc plat_is_my_cpu_primary
451d333e69SMichal Simek	mov	x9, x30
461d333e69SMichal Simek	bl	plat_my_core_pos
471d333e69SMichal Simek	cmp	x0, #VERSAL_NET_PRIMARY_CPU
481d333e69SMichal Simek	cset	x0, eq
491d333e69SMichal Simek	ret	x9
501d333e69SMichal Simekendfunc plat_is_my_cpu_primary
511d333e69SMichal Simek
521d333e69SMichal Simek	/* -----------------------------------------------------
531d333e69SMichal Simek	 *  unsigned int plat_my_core_pos(void)
541d333e69SMichal Simek	 *  This function uses the plat_core_pos_by_mpidr()
551d333e69SMichal Simek	 *  definition to get the index of the calling CPU.
561d333e69SMichal Simek	 * -----------------------------------------------------
571d333e69SMichal Simek	 */
581d333e69SMichal Simekfunc plat_my_core_pos
591d333e69SMichal Simek	mrs	x0, mpidr_el1
601d333e69SMichal Simek	b	plat_core_pos_by_mpidr
611d333e69SMichal Simekendfunc plat_my_core_pos
621d333e69SMichal Simek
63*9127041aSPrasad Kummari/*----------------------------------------------------------------------
64*9127041aSPrasad Kummari * unsigned int platform_core_pos_by_mpidr(u_register_t mpid)
65*9127041aSPrasad Kummari *
66*9127041aSPrasad Kummari * Function to calculate the core position.
67*9127041aSPrasad Kummari *
68*9127041aSPrasad Kummari * clobbers: x0 - x3
69*9127041aSPrasad Kummari * ---------------------------------------------------------------------
70*9127041aSPrasad Kummari */
71*9127041aSPrasad Kummarifunc plat_core_pos_by_mpidr
72*9127041aSPrasad Kummari
73*9127041aSPrasad Kummari	/* Extract individual affinity fields from MPIDR */
74*9127041aSPrasad Kummari	ubfx	x1, x0, #MPIDR_AFF2_SHIFT, #MPIDR_AFFINITY_BITS
75*9127041aSPrasad Kummari	ubfx	x2, x0, #MPIDR_AFF1_SHIFT, #MPIDR_AFFINITY_BITS
76*9127041aSPrasad Kummari
77*9127041aSPrasad Kummari	/* check if cpu_id valid */
78*9127041aSPrasad Kummari	cmp x2, #PLATFORM_CORE_COUNT_PER_CLUSTER
79*9127041aSPrasad Kummari	b.hi    error_invalid_core
80*9127041aSPrasad Kummari
81*9127041aSPrasad Kummari	/* check if cluster valid */
82*9127041aSPrasad Kummari	cmp x1, #PLATFORM_CLUSTER_COUNT
83*9127041aSPrasad Kummari	b.hi    error_invalid_cluster
84*9127041aSPrasad Kummari
85*9127041aSPrasad Kummari	/* core-position = cluster-id * cores per cluster + core-id */
86*9127041aSPrasad Kummari	mov     x3, #PLATFORM_CORE_COUNT_PER_CLUSTER
87*9127041aSPrasad Kummari	madd	x0, x1, x3, x2
88*9127041aSPrasad Kummari	ret
89*9127041aSPrasad Kummarierror_invalid_cluster:
90*9127041aSPrasad Kummari        mov     x0, #E_INVALID_CLUSTER_COUNT
91*9127041aSPrasad Kummari        ret
92*9127041aSPrasad Kummarierror_invalid_core:
93*9127041aSPrasad Kummari        mov     x0, #E_INVALID_CORE_COUNT
94*9127041aSPrasad Kummari        ret
95*9127041aSPrasad Kummariendfunc plat_core_pos_by_mpidr
96*9127041aSPrasad Kummari
97b2259261SJay Buddhabhatti	 /* -----------------------------------------------------
98b2259261SJay Buddhabhatti	  * unsigned int plat_arm_calc_core_pos(u_register_t mpidr)
99b2259261SJay Buddhabhatti	  * This function uses the plat_core_pos_by_mpidr()
100b2259261SJay Buddhabhatti	  * definition to get the index of the calling CPU.
101b2259261SJay Buddhabhatti	  * -----------------------------------------------------
102b2259261SJay Buddhabhatti	  */
103b2259261SJay Buddhabhattifunc plat_arm_calc_core_pos
104b2259261SJay Buddhabhatti	b	plat_core_pos_by_mpidr
105b2259261SJay Buddhabhattiendfunc plat_arm_calc_core_pos
106b2259261SJay Buddhabhatti
1071d333e69SMichal Simek	/* ---------------------------------------------------------------------
1081d333e69SMichal Simek	 * We don't need to carry out any memory initialization on Versal NET
1091d333e69SMichal Simek	 * platform. The Secure RAM is accessible straight away.
1101d333e69SMichal Simek	 * ---------------------------------------------------------------------
1111d333e69SMichal Simek	 */
1121d333e69SMichal Simekfunc platform_mem_init
1131d333e69SMichal Simek	ret
1141d333e69SMichal Simekendfunc platform_mem_init
115