1*3fa9dec4Skenny liang /* 2*3fa9dec4Skenny liang * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved. 3*3fa9dec4Skenny liang * 4*3fa9dec4Skenny liang * SPDX-License-Identifier: BSD-3-Clause 5*3fa9dec4Skenny liang */ 6*3fa9dec4Skenny liang 7*3fa9dec4Skenny liang #include <arch.h> 8*3fa9dec4Skenny liang #include <platform_def.h> 9*3fa9dec4Skenny liang #include <lib/psci/psci.h> 10*3fa9dec4Skenny liang 11*3fa9dec4Skenny liang const unsigned char mtk_power_domain_tree_desc[] = { 12*3fa9dec4Skenny liang /* Number of root nodes */ 13*3fa9dec4Skenny liang PLATFORM_SYSTEM_COUNT, 14*3fa9dec4Skenny liang /* Number of children for the root node */ 15*3fa9dec4Skenny liang PLATFORM_CLUSTER_COUNT, 16*3fa9dec4Skenny liang /* Number of children for the first cluster node */ 17*3fa9dec4Skenny liang PLATFORM_CLUSTER0_CORE_COUNT, 18*3fa9dec4Skenny liang /* Number of children for the second cluster node */ 19*3fa9dec4Skenny liang PLATFORM_CLUSTER1_CORE_COUNT 20*3fa9dec4Skenny liang }; 21*3fa9dec4Skenny liang 22*3fa9dec4Skenny liang /******************************************************************************* 23*3fa9dec4Skenny liang * This function returns the MT8173 default topology tree information. 24*3fa9dec4Skenny liang ******************************************************************************/ plat_get_power_domain_tree_desc(void)25*3fa9dec4Skenny liangconst unsigned char *plat_get_power_domain_tree_desc(void) 26*3fa9dec4Skenny liang { 27*3fa9dec4Skenny liang return mtk_power_domain_tree_desc; 28*3fa9dec4Skenny liang } 29*3fa9dec4Skenny liang 30*3fa9dec4Skenny liang /******************************************************************************* 31*3fa9dec4Skenny liang * This function implements a part of the critical interface between the psci 32*3fa9dec4Skenny liang * generic layer and the platform that allows the former to query the platform 33*3fa9dec4Skenny liang * to convert an MPIDR to a unique linear index. An error code (-1) is returned 34*3fa9dec4Skenny liang * in case the MPIDR is invalid. 35*3fa9dec4Skenny liang ******************************************************************************/ plat_core_pos_by_mpidr(u_register_t mpidr)36*3fa9dec4Skenny liangint plat_core_pos_by_mpidr(u_register_t mpidr) 37*3fa9dec4Skenny liang { 38*3fa9dec4Skenny liang unsigned int cluster_id, cpu_id; 39*3fa9dec4Skenny liang 40*3fa9dec4Skenny liang mpidr &= MPIDR_AFFINITY_MASK; 41*3fa9dec4Skenny liang 42*3fa9dec4Skenny liang if (mpidr & ~(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)) 43*3fa9dec4Skenny liang return -1; 44*3fa9dec4Skenny liang 45*3fa9dec4Skenny liang cluster_id = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK; 46*3fa9dec4Skenny liang cpu_id = (mpidr >> MPIDR_AFF0_SHIFT) & MPIDR_AFFLVL_MASK; 47*3fa9dec4Skenny liang 48*3fa9dec4Skenny liang if (cluster_id >= PLATFORM_CLUSTER_COUNT) 49*3fa9dec4Skenny liang return -1; 50*3fa9dec4Skenny liang 51*3fa9dec4Skenny liang /* 52*3fa9dec4Skenny liang * Validate cpu_id by checking whether it represents a CPU in 53*3fa9dec4Skenny liang * one of the two clusters present on the platform. 54*3fa9dec4Skenny liang */ 55*3fa9dec4Skenny liang if (cpu_id >= PLATFORM_MAX_CPUS_PER_CLUSTER) 56*3fa9dec4Skenny liang return -1; 57*3fa9dec4Skenny liang 58*3fa9dec4Skenny liang return (cpu_id + (cluster_id * 4)); 59*3fa9dec4Skenny liang } 60