• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  ******************************************************************************/
plat_get_power_domain_tree_desc(void)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  ******************************************************************************/
plat_core_pos_by_mpidr(u_register_t mpidr)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