xref: /rk3399_ARM-atf/plat/mediatek/mt8173/plat_topology.c (revision 3fc26aa0938a838686644c146ee84c562d963c34)
17d116dccSCC Ma /*
27d116dccSCC Ma  * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
37d116dccSCC Ma  *
47d116dccSCC Ma  * Redistribution and use in source and binary forms, with or without
57d116dccSCC Ma  * modification, are permitted provided that the following conditions are met:
67d116dccSCC Ma  *
77d116dccSCC Ma  * Redistributions of source code must retain the above copyright notice, this
87d116dccSCC Ma  * list of conditions and the following disclaimer.
97d116dccSCC Ma  *
107d116dccSCC Ma  * Redistributions in binary form must reproduce the above copyright notice,
117d116dccSCC Ma  * this list of conditions and the following disclaimer in the documentation
127d116dccSCC Ma  * and/or other materials provided with the distribution.
137d116dccSCC Ma  *
147d116dccSCC Ma  * Neither the name of ARM nor the names of its contributors may be used
157d116dccSCC Ma  * to endorse or promote products derived from this software without specific
167d116dccSCC Ma  * prior written permission.
177d116dccSCC Ma  *
187d116dccSCC Ma  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
197d116dccSCC Ma  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
207d116dccSCC Ma  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
217d116dccSCC Ma  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
227d116dccSCC Ma  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
237d116dccSCC Ma  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
247d116dccSCC Ma  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
257d116dccSCC Ma  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
267d116dccSCC Ma  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
277d116dccSCC Ma  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
287d116dccSCC Ma  * POSSIBILITY OF SUCH DAMAGE.
297d116dccSCC Ma  */
307d116dccSCC Ma #include <arch.h>
31c4a99e89SJimmy Huang #include <platform_def.h>
327d116dccSCC Ma #include <psci.h>
337d116dccSCC Ma 
34*3fc26aa0SKoan-Sin Tan #if ENABLE_PLAT_COMPAT
357d116dccSCC Ma unsigned int plat_get_aff_count(unsigned int aff_lvl, unsigned long mpidr)
367d116dccSCC Ma {
377d116dccSCC Ma 	/* Report 1 (absent) instance at levels higher that the cluster level */
387d116dccSCC Ma 	if (aff_lvl > MPIDR_AFFLVL1)
39c4a99e89SJimmy Huang 		return PLATFORM_SYSTEM_COUNT;
407d116dccSCC Ma 
417d116dccSCC Ma 	if (aff_lvl == MPIDR_AFFLVL1)
42c4a99e89SJimmy Huang 		return PLATFORM_CLUSTER_COUNT;
437d116dccSCC Ma 
44c4a99e89SJimmy Huang 	return mpidr & 0x100 ? PLATFORM_CLUSTER1_CORE_COUNT :
45c4a99e89SJimmy Huang 			       PLATFORM_CLUSTER0_CORE_COUNT;
467d116dccSCC Ma }
477d116dccSCC Ma 
487d116dccSCC Ma unsigned int plat_get_aff_state(unsigned int aff_lvl, unsigned long mpidr)
497d116dccSCC Ma {
507d116dccSCC Ma 	return aff_lvl <= MPIDR_AFFLVL2 ? PSCI_AFF_PRESENT : PSCI_AFF_ABSENT;
517d116dccSCC Ma }
527d116dccSCC Ma 
537d116dccSCC Ma int mt_setup_topology(void)
547d116dccSCC Ma {
557d116dccSCC Ma 	/* [TODO] Make topology configurable via SCC */
567d116dccSCC Ma 	return 0;
577d116dccSCC Ma }
58*3fc26aa0SKoan-Sin Tan #else
59*3fc26aa0SKoan-Sin Tan 
60*3fc26aa0SKoan-Sin Tan const unsigned char mtk_power_domain_tree_desc[] = {
61*3fc26aa0SKoan-Sin Tan 	/* No of root nodes */
62*3fc26aa0SKoan-Sin Tan 	PLATFORM_SYSTEM_COUNT,
63*3fc26aa0SKoan-Sin Tan 	/* No of children for the root node */
64*3fc26aa0SKoan-Sin Tan 	PLATFORM_CLUSTER_COUNT,
65*3fc26aa0SKoan-Sin Tan 	/* No of children for the first cluster node */
66*3fc26aa0SKoan-Sin Tan 	PLATFORM_CLUSTER0_CORE_COUNT,
67*3fc26aa0SKoan-Sin Tan 	/* No of children for the second cluster node */
68*3fc26aa0SKoan-Sin Tan 	PLATFORM_CLUSTER1_CORE_COUNT
69*3fc26aa0SKoan-Sin Tan };
70*3fc26aa0SKoan-Sin Tan 
71*3fc26aa0SKoan-Sin Tan /*******************************************************************************
72*3fc26aa0SKoan-Sin Tan  * This function returns the MT8173 default topology tree information.
73*3fc26aa0SKoan-Sin Tan  ******************************************************************************/
74*3fc26aa0SKoan-Sin Tan const unsigned char *plat_get_power_domain_tree_desc(void)
75*3fc26aa0SKoan-Sin Tan {
76*3fc26aa0SKoan-Sin Tan 	return mtk_power_domain_tree_desc;
77*3fc26aa0SKoan-Sin Tan }
78*3fc26aa0SKoan-Sin Tan 
79*3fc26aa0SKoan-Sin Tan /*******************************************************************************
80*3fc26aa0SKoan-Sin Tan  * This function implements a part of the critical interface between the psci
81*3fc26aa0SKoan-Sin Tan  * generic layer and the platform that allows the former to query the platform
82*3fc26aa0SKoan-Sin Tan  * to convert an MPIDR to a unique linear index. An error code (-1) is returned
83*3fc26aa0SKoan-Sin Tan  * in case the MPIDR is invalid.
84*3fc26aa0SKoan-Sin Tan  ******************************************************************************/
85*3fc26aa0SKoan-Sin Tan int plat_core_pos_by_mpidr(u_register_t mpidr)
86*3fc26aa0SKoan-Sin Tan {
87*3fc26aa0SKoan-Sin Tan 	unsigned int cluster_id, cpu_id;
88*3fc26aa0SKoan-Sin Tan 
89*3fc26aa0SKoan-Sin Tan 	mpidr &= MPIDR_AFFINITY_MASK;
90*3fc26aa0SKoan-Sin Tan 
91*3fc26aa0SKoan-Sin Tan 	if (mpidr & ~(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK))
92*3fc26aa0SKoan-Sin Tan 		return -1;
93*3fc26aa0SKoan-Sin Tan 
94*3fc26aa0SKoan-Sin Tan 	cluster_id = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
95*3fc26aa0SKoan-Sin Tan 	cpu_id = (mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK;
96*3fc26aa0SKoan-Sin Tan 
97*3fc26aa0SKoan-Sin Tan 	if (cluster_id >= PLATFORM_CLUSTER_COUNT)
98*3fc26aa0SKoan-Sin Tan 		return -1;
99*3fc26aa0SKoan-Sin Tan 
100*3fc26aa0SKoan-Sin Tan 	/*
101*3fc26aa0SKoan-Sin Tan 	 * Validate cpu_id by checking whether it represents a CPU in
102*3fc26aa0SKoan-Sin Tan 	 * one of the two clusters present on the platform.
103*3fc26aa0SKoan-Sin Tan 	 */
104*3fc26aa0SKoan-Sin Tan 	if (cpu_id >= PLATFORM_MAX_CPUS_PER_CLUSTER)
105*3fc26aa0SKoan-Sin Tan 		return -1;
106*3fc26aa0SKoan-Sin Tan 
107*3fc26aa0SKoan-Sin Tan 	return (cpu_id + (cluster_id * 4));
108*3fc26aa0SKoan-Sin Tan }
109*3fc26aa0SKoan-Sin Tan #endif
110