Home | History | Annotate | Download | only in common
      1 /*
      2  * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
      3  *
      4  * SPDX-License-Identifier: BSD-3-Clause
      5  */
      6 
      7 #include <arch.h>
      8 #include <platform_def.h>
      9 #include <psci.h>
     10 
     11 extern const unsigned char tegra_power_domain_tree_desc[];
     12 #pragma weak plat_core_pos_by_mpidr
     13 
     14 /*******************************************************************************
     15  * This function returns the Tegra default topology tree information.
     16  ******************************************************************************/
     17 const unsigned char *plat_get_power_domain_tree_desc(void)
     18 {
     19 	return tegra_power_domain_tree_desc;
     20 }
     21 
     22 /*******************************************************************************
     23  * This function implements a part of the critical interface between the psci
     24  * generic layer and the platform that allows the former to query the platform
     25  * to convert an MPIDR to a unique linear index. An error code (-1) is returned
     26  * in case the MPIDR is invalid.
     27  ******************************************************************************/
     28 int plat_core_pos_by_mpidr(u_register_t mpidr)
     29 {
     30 	unsigned int cluster_id, cpu_id;
     31 
     32 	cluster_id = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
     33 	cpu_id = (mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK;
     34 
     35 	if (cluster_id >= PLATFORM_CLUSTER_COUNT)
     36 		return PSCI_E_NOT_PRESENT;
     37 
     38 	/*
     39 	 * Validate cpu_id by checking whether it represents a CPU in
     40 	 * one of the two clusters present on the platform.
     41 	 */
     42 	if (cpu_id >= PLATFORM_MAX_CPUS_PER_CLUSTER)
     43 		return PSCI_E_NOT_PRESENT;
     44 
     45 	return (cpu_id + (cluster_id * 4));
     46 }
     47