1 /* 2 * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <arch.h> 8 #include <cassert.h> 9 #include <plat_arm.h> 10 #include <platform_def.h> 11 #include "drivers/pwrc/fvp_pwrc.h" 12 13 /* The FVP power domain tree descriptor */ 14 unsigned char fvp_power_domain_tree_desc[FVP_CLUSTER_COUNT + 1]; 15 16 17 CASSERT(FVP_CLUSTER_COUNT && FVP_CLUSTER_COUNT <= 256, assert_invalid_fvp_cluster_count); 18 19 /******************************************************************************* 20 * This function dynamically constructs the topology according to 21 * FVP_CLUSTER_COUNT and returns it. 22 ******************************************************************************/ 23 const unsigned char *plat_get_power_domain_tree_desc(void) 24 { 25 int i; 26 27 /* 28 * The FVP power domain tree does not have a single system level power domain 29 * i.e. a single root node. The first entry in the power domain descriptor 30 * specifies the number of power domains at the highest power level. For the FVP 31 * this is the number of cluster power domains. 32 */ 33 fvp_power_domain_tree_desc[0] = FVP_CLUSTER_COUNT; 34 35 for (i = 0; i < FVP_CLUSTER_COUNT; i++) 36 fvp_power_domain_tree_desc[i + 1] = FVP_MAX_CPUS_PER_CLUSTER; 37 38 return fvp_power_domain_tree_desc; 39 } 40 41 /******************************************************************************* 42 * This function returns the core count within the cluster corresponding to 43 * `mpidr`. 44 ******************************************************************************/ 45 unsigned int plat_arm_get_cluster_core_count(u_register_t mpidr) 46 { 47 return FVP_MAX_CPUS_PER_CLUSTER; 48 } 49 50 /******************************************************************************* 51 * This function implements a part of the critical interface between the psci 52 * generic layer and the platform that allows the former to query the platform 53 * to convert an MPIDR to a unique linear index. An error code (-1) is returned 54 * in case the MPIDR is invalid. 55 ******************************************************************************/ 56 int plat_core_pos_by_mpidr(u_register_t mpidr) 57 { 58 if (arm_check_mpidr(mpidr) == -1) 59 return -1; 60 61 if (fvp_pwrc_read_psysr(mpidr) == PSYSR_INVALID) 62 return -1; 63 64 return plat_arm_calc_core_pos(mpidr); 65 } 66