xref: /rk3399_ARM-atf/plat/mediatek/drivers/cpu_pm/cpcv5_4/mt_smp.h (revision cf2df874cd09305ac7282fadb0fef6be597dfffb)
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