1*75530ee2SKai Liang /* 2*75530ee2SKai Liang * Copyright (c) 2025, MediaTek Inc. All rights reserved. 3*75530ee2SKai Liang * 4*75530ee2SKai Liang * SPDX-License-Identifier: BSD-3-Clause 5*75530ee2SKai Liang */ 6*75530ee2SKai Liang 7*75530ee2SKai Liang #ifndef MT_SMP_H 8*75530ee2SKai Liang #define MT_SMP_H 9*75530ee2SKai Liang 10*75530ee2SKai Liang #include <lib/mmio.h> 11*75530ee2SKai Liang #include <platform_def.h> 12*75530ee2SKai Liang 13*75530ee2SKai Liang #include "mt_cpu_pm.h" 14*75530ee2SKai Liang 15*75530ee2SKai Liang #define CPUSYS_PPU_CLK_EN_CTRL BIT(12) 16*75530ee2SKai Liang #define CPUSYS_PPU_ISO_CTRL BIT(13) 17*75530ee2SKai Liang #define AA64NAA32_FLAG_START_BIT 16 18*75530ee2SKai Liang 19*75530ee2SKai Liang #define SMP_CORE_TIMEOUT_MAX (50000) 20*75530ee2SKai Liang #define DO_SMP_CORE_ON_WAIT_TIMEOUT(cpu_id, k_cnt) ({ \ 21*75530ee2SKai Liang if (k_cnt >= SMP_CORE_TIMEOUT_MAX) { \ 22*75530ee2SKai Liang INFO("[%s:%d] - CORE%d ON WAIT TIMEOUT %u us (> %u)\n", \ 23*75530ee2SKai Liang __func__, __LINE__, cpu_id, k_cnt, SMP_CORE_TIMEOUT_MAX); \ 24*75530ee2SKai Liang panic(); \ 25*75530ee2SKai Liang } \ 26*75530ee2SKai Liang k_cnt++; udelay(1); }) 27*75530ee2SKai Liang 28*75530ee2SKai Liang #ifdef CPU_PM_CORE_ARCH64_ONLY 29*75530ee2SKai Liang #define mt_smp_core_init_arch(_a, _b, _c, _d) 30*75530ee2SKai Liang #else 31*75530ee2SKai Liang void mt_smp_core_init_arch(int cluster, int cpu, int arm64, 32*75530ee2SKai Liang struct cpu_pwr_ctrl *pwr_ctrl); 33*75530ee2SKai Liang #endif /* CPU_PM_CORE_ARCH64_ONLY */ 34*75530ee2SKai Liang 35*75530ee2SKai Liang void mt_smp_core_bootup_address_set(int cluster, 36*75530ee2SKai Liang int cpu, 37*75530ee2SKai Liang struct cpu_pwr_ctrl *pwr_ctrl, 38*75530ee2SKai Liang uintptr_t entry); 39*75530ee2SKai Liang 40*75530ee2SKai Liang int mt_smp_power_core_on(unsigned int cpu_id, struct cpu_pwr_ctrl *pwr_ctrl); 41*75530ee2SKai Liang int mt_smp_power_core_off(unsigned int cpu_id, struct cpu_pwr_ctrl *pwr_ctrl); 42*75530ee2SKai Liang 43*75530ee2SKai Liang void mt_smp_init(void); 44*75530ee2SKai Liang 45*75530ee2SKai Liang int mt_smp_cluster_pwpr_init(struct cluster_pwr_ctrl *pwr_ctrl); 46*75530ee2SKai Liang int mt_smp_cluster_pwpr_op_init(struct cluster_pwr_ctrl *pwr_ctrl); 47*75530ee2SKai Liang 48*75530ee2SKai Liang #endif /* MT_SMP_H */ 49