xref: /rk3399_ARM-atf/plat/qemu/common/topology.c (revision 301d27d998892c054dec925264f81b11dcd64822)
1*301d27d9SRadoslaw Biernacki /*
2*301d27d9SRadoslaw Biernacki  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
3*301d27d9SRadoslaw Biernacki  *
4*301d27d9SRadoslaw Biernacki  * SPDX-License-Identifier: BSD-3-Clause
5*301d27d9SRadoslaw Biernacki  */
6*301d27d9SRadoslaw Biernacki 
7*301d27d9SRadoslaw Biernacki #include <stdint.h>
8*301d27d9SRadoslaw Biernacki 
9*301d27d9SRadoslaw Biernacki #include <platform_def.h>
10*301d27d9SRadoslaw Biernacki 
11*301d27d9SRadoslaw Biernacki #include <arch.h>
12*301d27d9SRadoslaw Biernacki 
13*301d27d9SRadoslaw Biernacki #include "qemu_private.h"
14*301d27d9SRadoslaw Biernacki 
15*301d27d9SRadoslaw Biernacki /* The power domain tree descriptor */
16*301d27d9SRadoslaw Biernacki static unsigned char power_domain_tree_desc[] = {
17*301d27d9SRadoslaw Biernacki 	/* Number of root nodes */
18*301d27d9SRadoslaw Biernacki 	PLATFORM_CLUSTER_COUNT,
19*301d27d9SRadoslaw Biernacki 	/* Number of children for the first node */
20*301d27d9SRadoslaw Biernacki 	PLATFORM_CLUSTER0_CORE_COUNT,
21*301d27d9SRadoslaw Biernacki 	/* Number of children for the second node */
22*301d27d9SRadoslaw Biernacki 	PLATFORM_CLUSTER1_CORE_COUNT,
23*301d27d9SRadoslaw Biernacki };
24*301d27d9SRadoslaw Biernacki 
25*301d27d9SRadoslaw Biernacki /*******************************************************************************
26*301d27d9SRadoslaw Biernacki  * This function returns the ARM default topology tree information.
27*301d27d9SRadoslaw Biernacki  ******************************************************************************/
28*301d27d9SRadoslaw Biernacki const unsigned char *plat_get_power_domain_tree_desc(void)
29*301d27d9SRadoslaw Biernacki {
30*301d27d9SRadoslaw Biernacki 	return power_domain_tree_desc;
31*301d27d9SRadoslaw Biernacki }
32*301d27d9SRadoslaw Biernacki 
33*301d27d9SRadoslaw Biernacki /*******************************************************************************
34*301d27d9SRadoslaw Biernacki  * This function implements a part of the critical interface between the psci
35*301d27d9SRadoslaw Biernacki  * generic layer and the platform that allows the former to query the platform
36*301d27d9SRadoslaw Biernacki  * to convert an MPIDR to a unique linear index. An error code (-1) is returned
37*301d27d9SRadoslaw Biernacki  * in case the MPIDR is invalid.
38*301d27d9SRadoslaw Biernacki  ******************************************************************************/
39*301d27d9SRadoslaw Biernacki int plat_core_pos_by_mpidr(u_register_t mpidr)
40*301d27d9SRadoslaw Biernacki {
41*301d27d9SRadoslaw Biernacki 	unsigned int cluster_id, cpu_id;
42*301d27d9SRadoslaw Biernacki 
43*301d27d9SRadoslaw Biernacki 	mpidr &= MPIDR_AFFINITY_MASK;
44*301d27d9SRadoslaw Biernacki 	if (mpidr & ~(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK))
45*301d27d9SRadoslaw Biernacki 		return -1;
46*301d27d9SRadoslaw Biernacki 
47*301d27d9SRadoslaw Biernacki 	cluster_id = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
48*301d27d9SRadoslaw Biernacki 	cpu_id = (mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK;
49*301d27d9SRadoslaw Biernacki 
50*301d27d9SRadoslaw Biernacki 	if (cluster_id >= PLATFORM_CLUSTER_COUNT)
51*301d27d9SRadoslaw Biernacki 		return -1;
52*301d27d9SRadoslaw Biernacki 
53*301d27d9SRadoslaw Biernacki 	if (cpu_id >= PLATFORM_MAX_CPUS_PER_CLUSTER)
54*301d27d9SRadoslaw Biernacki 		return -1;
55*301d27d9SRadoslaw Biernacki 
56*301d27d9SRadoslaw Biernacki 	return plat_qemu_calc_core_pos(mpidr);
57*301d27d9SRadoslaw Biernacki }
58