xref: /rk3399_ARM-atf/plat/mediatek/mt8173/plat_topology.c (revision 82cb2c1ad9897473743f08437d0a3995bed561b9)
17d116dccSCC Ma /*
27d116dccSCC Ma  * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
37d116dccSCC Ma  *
4*82cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
57d116dccSCC Ma  */
67d116dccSCC Ma #include <arch.h>
7c4a99e89SJimmy Huang #include <platform_def.h>
87d116dccSCC Ma #include <psci.h>
97d116dccSCC Ma 
103fc26aa0SKoan-Sin Tan #if ENABLE_PLAT_COMPAT
117d116dccSCC Ma unsigned int plat_get_aff_count(unsigned int aff_lvl, unsigned long mpidr)
127d116dccSCC Ma {
137d116dccSCC Ma 	/* Report 1 (absent) instance at levels higher that the cluster level */
147d116dccSCC Ma 	if (aff_lvl > MPIDR_AFFLVL1)
15c4a99e89SJimmy Huang 		return PLATFORM_SYSTEM_COUNT;
167d116dccSCC Ma 
177d116dccSCC Ma 	if (aff_lvl == MPIDR_AFFLVL1)
18c4a99e89SJimmy Huang 		return PLATFORM_CLUSTER_COUNT;
197d116dccSCC Ma 
20c4a99e89SJimmy Huang 	return mpidr & 0x100 ? PLATFORM_CLUSTER1_CORE_COUNT :
21c4a99e89SJimmy Huang 			       PLATFORM_CLUSTER0_CORE_COUNT;
227d116dccSCC Ma }
237d116dccSCC Ma 
247d116dccSCC Ma unsigned int plat_get_aff_state(unsigned int aff_lvl, unsigned long mpidr)
257d116dccSCC Ma {
267d116dccSCC Ma 	return aff_lvl <= MPIDR_AFFLVL2 ? PSCI_AFF_PRESENT : PSCI_AFF_ABSENT;
277d116dccSCC Ma }
287d116dccSCC Ma 
297d116dccSCC Ma int mt_setup_topology(void)
307d116dccSCC Ma {
317d116dccSCC Ma 	/* [TODO] Make topology configurable via SCC */
327d116dccSCC Ma 	return 0;
337d116dccSCC Ma }
343fc26aa0SKoan-Sin Tan #else
353fc26aa0SKoan-Sin Tan 
363fc26aa0SKoan-Sin Tan const unsigned char mtk_power_domain_tree_desc[] = {
373fc26aa0SKoan-Sin Tan 	/* No of root nodes */
383fc26aa0SKoan-Sin Tan 	PLATFORM_SYSTEM_COUNT,
393fc26aa0SKoan-Sin Tan 	/* No of children for the root node */
403fc26aa0SKoan-Sin Tan 	PLATFORM_CLUSTER_COUNT,
413fc26aa0SKoan-Sin Tan 	/* No of children for the first cluster node */
423fc26aa0SKoan-Sin Tan 	PLATFORM_CLUSTER0_CORE_COUNT,
433fc26aa0SKoan-Sin Tan 	/* No of children for the second cluster node */
443fc26aa0SKoan-Sin Tan 	PLATFORM_CLUSTER1_CORE_COUNT
453fc26aa0SKoan-Sin Tan };
463fc26aa0SKoan-Sin Tan 
473fc26aa0SKoan-Sin Tan /*******************************************************************************
483fc26aa0SKoan-Sin Tan  * This function returns the MT8173 default topology tree information.
493fc26aa0SKoan-Sin Tan  ******************************************************************************/
503fc26aa0SKoan-Sin Tan const unsigned char *plat_get_power_domain_tree_desc(void)
513fc26aa0SKoan-Sin Tan {
523fc26aa0SKoan-Sin Tan 	return mtk_power_domain_tree_desc;
533fc26aa0SKoan-Sin Tan }
543fc26aa0SKoan-Sin Tan 
553fc26aa0SKoan-Sin Tan /*******************************************************************************
563fc26aa0SKoan-Sin Tan  * This function implements a part of the critical interface between the psci
573fc26aa0SKoan-Sin Tan  * generic layer and the platform that allows the former to query the platform
583fc26aa0SKoan-Sin Tan  * to convert an MPIDR to a unique linear index. An error code (-1) is returned
593fc26aa0SKoan-Sin Tan  * in case the MPIDR is invalid.
603fc26aa0SKoan-Sin Tan  ******************************************************************************/
613fc26aa0SKoan-Sin Tan int plat_core_pos_by_mpidr(u_register_t mpidr)
623fc26aa0SKoan-Sin Tan {
633fc26aa0SKoan-Sin Tan 	unsigned int cluster_id, cpu_id;
643fc26aa0SKoan-Sin Tan 
653fc26aa0SKoan-Sin Tan 	mpidr &= MPIDR_AFFINITY_MASK;
663fc26aa0SKoan-Sin Tan 
673fc26aa0SKoan-Sin Tan 	if (mpidr & ~(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK))
683fc26aa0SKoan-Sin Tan 		return -1;
693fc26aa0SKoan-Sin Tan 
703fc26aa0SKoan-Sin Tan 	cluster_id = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
713fc26aa0SKoan-Sin Tan 	cpu_id = (mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK;
723fc26aa0SKoan-Sin Tan 
733fc26aa0SKoan-Sin Tan 	if (cluster_id >= PLATFORM_CLUSTER_COUNT)
743fc26aa0SKoan-Sin Tan 		return -1;
753fc26aa0SKoan-Sin Tan 
763fc26aa0SKoan-Sin Tan 	/*
773fc26aa0SKoan-Sin Tan 	 * Validate cpu_id by checking whether it represents a CPU in
783fc26aa0SKoan-Sin Tan 	 * one of the two clusters present on the platform.
793fc26aa0SKoan-Sin Tan 	 */
803fc26aa0SKoan-Sin Tan 	if (cpu_id >= PLATFORM_MAX_CPUS_PER_CLUSTER)
813fc26aa0SKoan-Sin Tan 		return -1;
823fc26aa0SKoan-Sin Tan 
833fc26aa0SKoan-Sin Tan 	return (cpu_id + (cluster_id * 4));
843fc26aa0SKoan-Sin Tan }
853fc26aa0SKoan-Sin Tan #endif
86