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