xref: /rk3399_ARM-atf/plat/mediatek/include/lib/pm/mtk_pm.h (revision 4ba679da8b90ee15dd1234bc773854debb9b2466)
1*4ba679daSKai Liang /*
2*4ba679daSKai Liang  * Copyright (c) 2025, Mediatek Inc. All rights reserved.
3*4ba679daSKai Liang  *
4*4ba679daSKai Liang  * SPDX-License-Identifier: BSD-3-Clause
5*4ba679daSKai Liang  */
6*4ba679daSKai Liang 
7*4ba679daSKai Liang #ifndef MTK_PM_H
8*4ba679daSKai Liang #define MTK_PM_H
9*4ba679daSKai Liang #include <lib/psci/psci.h>
10*4ba679daSKai Liang 
11*4ba679daSKai Liang #if MTK_PUBEVENT_ENABLE
12*4ba679daSKai Liang #include <vendor_pubsub_events.h>
13*4ba679daSKai Liang #endif
14*4ba679daSKai Liang 
15*4ba679daSKai Liang #define MTK_CPUPM_E_OK				0
16*4ba679daSKai Liang #define MTK_CPUPM_E_UNKNOWN			-1
17*4ba679daSKai Liang #define MTK_CPUPM_E_ERR				-2
18*4ba679daSKai Liang #define MTK_CPUPM_E_FAIL			-3
19*4ba679daSKai Liang #define MTK_CPUPM_E_NOT_SUPPORT			-4
20*4ba679daSKai Liang 
21*4ba679daSKai Liang #define MTK_CPUPM_FN_PWR_LOCK_AQUIRE		BIT(0)
22*4ba679daSKai Liang #define MTK_CPUPM_FN_INIT			BIT(1)
23*4ba679daSKai Liang #define MTK_CPUPM_FN_PWR_STATE_VALID		BIT(2)
24*4ba679daSKai Liang #define MTK_CPUPM_FN_PWR_ON_CORE_PREPARE	BIT(3)
25*4ba679daSKai Liang #define MTK_CPUPM_FN_SUSPEND_CORE		BIT(4)
26*4ba679daSKai Liang #define MTK_CPUPM_FN_RESUME_CORE		BIT(5)
27*4ba679daSKai Liang #define MTK_CPUPM_FN_SUSPEND_CLUSTER		BIT(6)
28*4ba679daSKai Liang #define MTK_CPUPM_FN_RESUME_CLUSTER		BIT(7)
29*4ba679daSKai Liang #define MTK_CPUPM_FN_SUSPEND_MCUSYS		BIT(8)
30*4ba679daSKai Liang #define MTK_CPUPM_FN_RESUME_MCUSYS		BIT(9)
31*4ba679daSKai Liang #define MTK_CPUPM_FN_CPUPM_GET_PWR_STATE	BIT(10)
32*4ba679daSKai Liang #define MTK_CPUPM_FN_SMP_INIT			BIT(11)
33*4ba679daSKai Liang #define MTK_CPUPM_FN_SMP_CORE_ON		BIT(12)
34*4ba679daSKai Liang #define MTK_CPUPM_FN_SMP_CORE_OFF		BIT(13)
35*4ba679daSKai Liang #define MTK_CPUPM_FN_PWR_DOMAIN_POWER_DOWN_WFI	BIT(14)
36*4ba679daSKai Liang 
37*4ba679daSKai Liang enum mtk_cpupm_pstate {
38*4ba679daSKai Liang 	MTK_CPUPM_CORE_ON,
39*4ba679daSKai Liang 	MTK_CPUPM_CORE_OFF,
40*4ba679daSKai Liang 	MTK_CPUPM_CORE_SUSPEND,
41*4ba679daSKai Liang 	MTK_CPUPM_CORE_RESUME,
42*4ba679daSKai Liang 	MTK_CPUPM_CLUSTER_SUSPEND,
43*4ba679daSKai Liang 	MTK_CPUPM_CLUSTER_RESUME,
44*4ba679daSKai Liang 	MTK_CPUPM_MCUSYS_SUSPEND,
45*4ba679daSKai Liang 	MTK_CPUPM_MCUSYS_RESUME,
46*4ba679daSKai Liang };
47*4ba679daSKai Liang 
48*4ba679daSKai Liang enum mtk_cpu_pm_mode {
49*4ba679daSKai Liang 	MTK_CPU_PM_CPUIDLE,
50*4ba679daSKai Liang 	MTK_CPU_PM_SMP,
51*4ba679daSKai Liang };
52*4ba679daSKai Liang 
53*4ba679daSKai Liang #define MT_IRQ_REMAIN_MAX       32
54*4ba679daSKai Liang #define MT_IRQ_REMAIN_CAT_LOG   BIT(31)
55*4ba679daSKai Liang 
56*4ba679daSKai Liang struct mt_irqremain {
57*4ba679daSKai Liang 	unsigned int count;
58*4ba679daSKai Liang 	unsigned int irqs[MT_IRQ_REMAIN_MAX];
59*4ba679daSKai Liang 	unsigned int wakeupsrc_cat[MT_IRQ_REMAIN_MAX];
60*4ba679daSKai Liang 	unsigned int wakeupsrc[MT_IRQ_REMAIN_MAX];
61*4ba679daSKai Liang };
62*4ba679daSKai Liang 
63*4ba679daSKai Liang typedef void (*plat_init_func)(unsigned int, uintptr_t);
64*4ba679daSKai Liang struct plat_pm_smp_ctrl {
65*4ba679daSKai Liang 	plat_init_func init;
66*4ba679daSKai Liang 	int (*pwr_domain_on)(u_register_t mpidr);
67*4ba679daSKai Liang 	void (*pwr_domain_off)(const psci_power_state_t *target_state);
68*4ba679daSKai Liang 	void (*pwr_domain_on_finish)(const psci_power_state_t *target_state);
69*4ba679daSKai Liang };
70*4ba679daSKai Liang 
71*4ba679daSKai Liang struct plat_pm_pwr_ctrl {
72*4ba679daSKai Liang 	void (*pwr_domain_suspend)(const psci_power_state_t *target_state);
73*4ba679daSKai Liang 	void (*pwr_domain_on_finish_late)(
74*4ba679daSKai Liang 				const psci_power_state_t *target_state);
75*4ba679daSKai Liang 	void (*pwr_domain_suspend_finish)(
76*4ba679daSKai Liang 				const psci_power_state_t *target_state);
77*4ba679daSKai Liang 	int (*validate_power_state)(unsigned int power_state,
78*4ba679daSKai Liang 				    psci_power_state_t *req_state);
79*4ba679daSKai Liang 	void (*get_sys_suspend_power_state)(
80*4ba679daSKai Liang 				    psci_power_state_t *req_state);
81*4ba679daSKai Liang 	__dead2 void (*pwr_domain_pwr_down_wfi)(
82*4ba679daSKai Liang 				const psci_power_state_t *req_state);
83*4ba679daSKai Liang };
84*4ba679daSKai Liang 
85*4ba679daSKai Liang struct plat_pm_reset_ctrl {
86*4ba679daSKai Liang 	__dead2 void (*system_off)();
87*4ba679daSKai Liang 	__dead2 void (*system_reset)();
88*4ba679daSKai Liang 	int (*system_reset2)(int is_vendor,
89*4ba679daSKai Liang 			     int reset_type,
90*4ba679daSKai Liang 			     u_register_t cookie);
91*4ba679daSKai Liang };
92*4ba679daSKai Liang 
93*4ba679daSKai Liang struct mtk_cpu_pm_info {
94*4ba679daSKai Liang 	unsigned int cpuid;
95*4ba679daSKai Liang 	unsigned int mode;
96*4ba679daSKai Liang };
97*4ba679daSKai Liang 
98*4ba679daSKai Liang struct mtk_cpu_pm_state {
99*4ba679daSKai Liang 	unsigned int afflv;
100*4ba679daSKai Liang 	unsigned int state_id;
101*4ba679daSKai Liang 	const psci_power_state_t *raw;
102*4ba679daSKai Liang };
103*4ba679daSKai Liang 
104*4ba679daSKai Liang struct mtk_cpupm_pwrstate {
105*4ba679daSKai Liang 	struct mtk_cpu_pm_info info;
106*4ba679daSKai Liang 	struct mtk_cpu_pm_state pwr;
107*4ba679daSKai Liang };
108*4ba679daSKai Liang 
109*4ba679daSKai Liang struct mtk_cpu_smp_ops {
110*4ba679daSKai Liang 	void (*init)(unsigned int cpu, uintptr_t sec_entrypoint);
111*4ba679daSKai Liang 	int (*cpu_pwr_on_prepare)(unsigned int cpu, uintptr_t entry);
112*4ba679daSKai Liang 	void (*cpu_on)(const struct mtk_cpupm_pwrstate *state);
113*4ba679daSKai Liang 	void (*cpu_off)(const struct mtk_cpupm_pwrstate *state);
114*4ba679daSKai Liang 	int (*invoke)(unsigned int funcID, void *priv);
115*4ba679daSKai Liang };
116*4ba679daSKai Liang 
117*4ba679daSKai Liang #define CPUPM_PWR_REQ_UID_MAGIC		0x1103BAAD
118*4ba679daSKai Liang 
119*4ba679daSKai Liang #ifdef CPU_PM_PWR_REQ_DEBUG
120*4ba679daSKai Liang #define DECLARE_CPUPM_PWR_REQ(var_name)\
121*4ba679daSKai Liang 	static struct cpupm_pwr_req var_name = {\
122*4ba679daSKai Liang 		.stat.name = #var_name,\
123*4ba679daSKai Liang 		.stat.uid = CPUPM_PWR_REQ_UID_MAGIC,\
124*4ba679daSKai Liang 		.stat.sta_req = 0,\
125*4ba679daSKai Liang 	}
126*4ba679daSKai Liang #else
127*4ba679daSKai Liang #define DECLARE_CPUPM_PWR_REQ(name)\
128*4ba679daSKai Liang 	static struct cpupm_pwr_req name = {\
129*4ba679daSKai Liang 		.stat.uid = CPUPM_PWR_REQ_UID_MAGIC,\
130*4ba679daSKai Liang 		.stat.sta_req = 0,\
131*4ba679daSKai Liang 	}
132*4ba679daSKai Liang #endif
133*4ba679daSKai Liang 
134*4ba679daSKai Liang #define CPUPM_PWR_REQ_ACTIVE(_cpupm_req) ({\
135*4ba679daSKai Liang 	int in_ret;\
136*4ba679daSKai Liang 	in_ret = plat_pm_invoke_func(MTK_CPU_PM_CPUIDLE,\
137*4ba679daSKai Liang 			    CPUPM_INVOKE_PWR_REQ_ACTIVE,\
138*4ba679daSKai Liang 			    &_cpupm_req);\
139*4ba679daSKai Liang 	in_ret; })
140*4ba679daSKai Liang 
141*4ba679daSKai Liang #define CPUPM_PWR_REQ_ACQUIRE(_cpupm_req, _pm_req) ({\
142*4ba679daSKai Liang 	int in_ret;\
143*4ba679daSKai Liang 	_cpupm_req.req = _pm_req;\
144*4ba679daSKai Liang 	in_ret = plat_pm_invoke_func(MTK_CPU_PM_CPUIDLE,\
145*4ba679daSKai Liang 			    CPUPM_INVOKE_PWR_REQ_ACQUIRE,\
146*4ba679daSKai Liang 			    &_cpupm_req);\
147*4ba679daSKai Liang 	in_ret; })
148*4ba679daSKai Liang 
149*4ba679daSKai Liang #define CPUPM_PWR_REQ_RELEASE(_cpupm_req, _pm_req) ({\
150*4ba679daSKai Liang 	int in_ret;\
151*4ba679daSKai Liang 	_cpupm_req.req = _pm_req;\
152*4ba679daSKai Liang 	in_ret = plat_pm_invoke_func(MTK_CPU_PM_CPUIDLE,\
153*4ba679daSKai Liang 			    CPUPM_INVOKE_PWR_REQ_RELASE,\
154*4ba679daSKai Liang 			    &_cpupm_req);\
155*4ba679daSKai Liang 	in_ret; })
156*4ba679daSKai Liang 
157*4ba679daSKai Liang struct cpupm_pwr_stat_req {
158*4ba679daSKai Liang 	unsigned int sta_req;
159*4ba679daSKai Liang 	unsigned int uid;
160*4ba679daSKai Liang #ifdef CPU_PM_PWR_REQ_DEBUG
161*4ba679daSKai Liang 	const char *name;
162*4ba679daSKai Liang #endif
163*4ba679daSKai Liang };
164*4ba679daSKai Liang 
165*4ba679daSKai Liang struct cpupm_pwr_req {
166*4ba679daSKai Liang 	unsigned int req;
167*4ba679daSKai Liang 	struct cpupm_pwr_stat_req stat;
168*4ba679daSKai Liang };
169*4ba679daSKai Liang 
170*4ba679daSKai Liang struct cpupm_invoke_data {
171*4ba679daSKai Liang 	union {
172*4ba679daSKai Liang 		unsigned int v_u32;
173*4ba679daSKai Liang 		struct cpupm_pwr_req *req;
174*4ba679daSKai Liang 	} val;
175*4ba679daSKai Liang };
176*4ba679daSKai Liang 
177*4ba679daSKai Liang enum cpupm_invoke_func_id {
178*4ba679daSKai Liang 	/* Get regular active cpumask */
179*4ba679daSKai Liang 	CPUPM_INVOKE_WAKED_CPU = 0,
180*4ba679daSKai Liang 	CPUPM_INVOKE_PWR_REQ_ACTIVE,
181*4ba679daSKai Liang 	CPUPM_INVOKE_PWR_REQ_ACQUIRE,
182*4ba679daSKai Liang 	CPUPM_INVOKE_PWR_REQ_RELASE,
183*4ba679daSKai Liang };
184*4ba679daSKai Liang 
185*4ba679daSKai Liang #define MT_CPUPM_MCUSYS_REQ	(MT_CPUPM_PWR_DOMAIN_MCUSYS | \
186*4ba679daSKai Liang 				 MT_CPUPM_PWR_DOMAIN_MCUSYS_BY_CLUSTER)
187*4ba679daSKai Liang #define MT_CPUPM_PWR_DOMAIN_CORE		BIT(0)
188*4ba679daSKai Liang #define MT_CPUPM_PWR_DOMAIN_PERCORE_DSU		BIT(1)
189*4ba679daSKai Liang #define MT_CPUPM_PWR_DOMAIN_PERCORE_DSU_MEM	BIT(2)
190*4ba679daSKai Liang #define MT_CPUPM_PWR_DOMAIN_CLUSTER		BIT(3)
191*4ba679daSKai Liang #define MT_CPUPM_PWR_DOMAIN_MCUSYS		BIT(4)
192*4ba679daSKai Liang #define MT_CPUPM_PWR_DOMAIN_SUSPEND		BIT(5)
193*4ba679daSKai Liang #define MT_CPUPM_PWR_DOMAIN_MCUSYS_BY_CLUSTER	BIT(6)
194*4ba679daSKai Liang 
195*4ba679daSKai Liang enum mt_cpupm_pwr_domain {
196*4ba679daSKai Liang 	CPUPM_PWR_ON,
197*4ba679daSKai Liang 	CPUPM_PWR_OFF,
198*4ba679daSKai Liang };
199*4ba679daSKai Liang 
200*4ba679daSKai Liang #define mtk_pstate_type	unsigned int
201*4ba679daSKai Liang 
202*4ba679daSKai Liang struct mtk_cpu_pm_ops {
203*4ba679daSKai Liang 	void (*init)(unsigned int cpu, uintptr_t sec_entrypoint);
204*4ba679daSKai Liang 
205*4ba679daSKai Liang 	unsigned int (*get_pstate)(enum mt_cpupm_pwr_domain domain,
206*4ba679daSKai Liang 				   const mtk_pstate_type psci_state,
207*4ba679daSKai Liang 				   const struct mtk_cpupm_pwrstate *state);
208*4ba679daSKai Liang 
209*4ba679daSKai Liang 	int (*pwr_state_valid)(unsigned int afflv, unsigned int state);
210*4ba679daSKai Liang 
211*4ba679daSKai Liang 	void (*cpu_suspend)(const struct mtk_cpupm_pwrstate *state);
212*4ba679daSKai Liang 	void (*cpu_resume)(const struct mtk_cpupm_pwrstate *state);
213*4ba679daSKai Liang 
214*4ba679daSKai Liang 	void (*cluster_suspend)(const struct mtk_cpupm_pwrstate *state);
215*4ba679daSKai Liang 	void (*cluster_resume)(const struct mtk_cpupm_pwrstate *state);
216*4ba679daSKai Liang 
217*4ba679daSKai Liang 	void (*mcusys_suspend)(const struct mtk_cpupm_pwrstate *state);
218*4ba679daSKai Liang 	void (*mcusys_resume)(const struct mtk_cpupm_pwrstate *state);
219*4ba679daSKai Liang 	int (*pwr_domain_pwr_down_wfi)(unsigned int cpu);
220*4ba679daSKai Liang 
221*4ba679daSKai Liang 	int (*invoke)(unsigned int funcID, void *priv);
222*4ba679daSKai Liang };
223*4ba679daSKai Liang 
224*4ba679daSKai Liang int register_cpu_pm_ops(unsigned int fn_flags, struct mtk_cpu_pm_ops *ops);
225*4ba679daSKai Liang int register_cpu_smp_ops(unsigned int fn_flags, struct mtk_cpu_smp_ops *ops);
226*4ba679daSKai Liang 
227*4ba679daSKai Liang struct mt_cpupm_event_data {
228*4ba679daSKai Liang 	unsigned int cpuid;
229*4ba679daSKai Liang 	unsigned int pwr_domain;
230*4ba679daSKai Liang };
231*4ba679daSKai Liang 
232*4ba679daSKai Liang /* Extension event for platform driver */
233*4ba679daSKai Liang #if MTK_PUBEVENT_ENABLE
234*4ba679daSKai Liang /* [PUB_EVENT] Core power on */
235*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_EVENT_PWR_ON(_fn) \
236*4ba679daSKai Liang 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_pwr_on, _fn)
237*4ba679daSKai Liang 
238*4ba679daSKai Liang /* [PUB_EVENT] Core power off */
239*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_EVENT_PWR_OFF(_fn) \
240*4ba679daSKai Liang 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_pwr_off, _fn)
241*4ba679daSKai Liang 
242*4ba679daSKai Liang /* [PUB_EVENT] Cluster power on */
243*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_CLUSTER_PWR_ON(_fn) \
244*4ba679daSKai Liang 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_afflv_pwr_on, _fn)
245*4ba679daSKai Liang 
246*4ba679daSKai Liang /* [PUB_EVENT] Cluster power off */
247*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_CLUSTER_PWR_OFF(_fn) \
248*4ba679daSKai Liang 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_afflv_pwr_off, _fn)
249*4ba679daSKai Liang 
250*4ba679daSKai Liang /* [PUB_EVENT] Mcusys power on */
251*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_MCUSYS_PWR_ON(_fn) \
252*4ba679daSKai Liang 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_afflv_pwr_on, _fn)
253*4ba679daSKai Liang 
254*4ba679daSKai Liang /* [PUB_EVENT] Mcusys power off */
255*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_MCUSYS_PWR_OFF(_fn) \
256*4ba679daSKai Liang 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_afflv_pwr_off, _fn)
257*4ba679daSKai Liang 
258*4ba679daSKai Liang /* [PUB_EVENT] el3 time sync */
259*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_EL3_UPTIME_SYNC_WITH_KERNEL(_fn) \
260*4ba679daSKai Liang 	SUBSCRIBE_TO_EVENT(el3_uptime_sync_with_kernel, _fn)
261*4ba679daSKai Liang #else
262*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_EVENT_PWR_ON(_fn)
263*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_EVENT_PWR_OFF(_fn)
264*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_CLUSTER_PWR_ON(_fn)
265*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_CLUSTER_PWR_OFF(_fn)
266*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_MCUSYS_PWR_ON(_fn)
267*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_MCUSYS_PWR_OFF(_fn)
268*4ba679daSKai Liang #define MT_CPUPM_SUBCRIBE_EL3_UPTIME_SYNC_WITH_KERNEL(_fn)
269*4ba679daSKai Liang #endif
270*4ba679daSKai Liang 
271*4ba679daSKai Liang /*
272*4ba679daSKai Liang  * Definition c-state power domain.
273*4ba679daSKai Liang  * bit 0:	Cluster
274*4ba679daSKai Liang  * bit 1:	CPU buck
275*4ba679daSKai Liang  * bit 2:	Mcusys
276*4ba679daSKai Liang  * bit 3:	Memory
277*4ba679daSKai Liang  * bit 4:	System pll
278*4ba679daSKai Liang  * bit 5:	System bus
279*4ba679daSKai Liang  * bit 6:	SoC 26m/DCXO
280*4ba679daSKai Liang  * bit 7:	Vcore buck
281*4ba679daSKai Liang  * bit 8~14:	Reserved
282*4ba679daSKai Liang  * bit 15:	Suspend
283*4ba679daSKai Liang  */
284*4ba679daSKai Liang #define MT_PLAT_PWR_STATE_CLUSTER			0x0001
285*4ba679daSKai Liang #define MT_PLAT_PWR_STATE_MCUSYS			0x0005
286*4ba679daSKai Liang #define MT_PLAT_PWR_STATE_MCUSYS_BUCK			0x0007
287*4ba679daSKai Liang #define MT_PLAT_PWR_STATE_SYSTEM_MEM			0x000F
288*4ba679daSKai Liang #define MT_PLAT_PWR_STATE_SYSTEM_PLL			0x001F
289*4ba679daSKai Liang #define MT_PLAT_PWR_STATE_SYSTEM_BUS			0x007F
290*4ba679daSKai Liang #define MT_PLAT_PWR_STATE_SYSTEM_VCORE			0x00FF
291*4ba679daSKai Liang #define MT_PLAT_PWR_STATE_SUSPEND			0x80FF
292*4ba679daSKai Liang 
293*4ba679daSKai Liang #define IS_MT_PLAT_PWR_STATE(_state, _tar)		\
294*4ba679daSKai Liang 	(((_state) & _tar) == _tar)
295*4ba679daSKai Liang #define IS_MT_PLAT_PWR_STATE_MCUSYS(state)		\
296*4ba679daSKai Liang 	IS_MT_PLAT_PWR_STATE(state, MT_PLAT_PWR_STATE_MCUSYS)
297*4ba679daSKai Liang #define IS_MT_PLAT_PWR_STATE_SYSTEM(state)		((state) & 0x7ff8)
298*4ba679daSKai Liang 
299*4ba679daSKai Liang #ifdef PLAT_AFFLV_SYSTEM
300*4ba679daSKai Liang #define PLAT_MT_SYSTEM_SUSPEND		PLAT_AFFLV_SYSTEM
301*4ba679daSKai Liang #else
302*4ba679daSKai Liang #define PLAT_MT_SYSTEM_SUSPEND		PLAT_MAX_OFF_STATE
303*4ba679daSKai Liang #endif
304*4ba679daSKai Liang 
305*4ba679daSKai Liang #ifdef PLAT_AFFLV_CLUSTER
306*4ba679daSKai Liang #define PLAT_MT_CPU_SUSPEND_CLUSTER	PLAT_AFFLV_CLUSTER
307*4ba679daSKai Liang #else
308*4ba679daSKai Liang #define PLAT_MT_CPU_SUSPEND_CLUSTER	PLAT_MAX_RET_STATE
309*4ba679daSKai Liang #endif
310*4ba679daSKai Liang 
311*4ba679daSKai Liang #ifdef PLAT_AFFLV_MCUSYS
312*4ba679daSKai Liang #define PLAT_MT_CPU_SUSPEND_MCUSYS	PLAT_AFFLV_MCUSYS
313*4ba679daSKai Liang #else
314*4ba679daSKai Liang #define PLAT_MT_CPU_SUSPEND_MCUSYS	PLAT_MAX_RET_STATE
315*4ba679daSKai Liang #endif
316*4ba679daSKai Liang 
317*4ba679daSKai Liang #define IS_PLAT_SYSTEM_SUSPEND(aff)	((aff) == PLAT_MT_SYSTEM_SUSPEND)
318*4ba679daSKai Liang #define IS_PLAT_SYSTEM_RETENTION(aff)	((aff) >= PLAT_MAX_RET_STATE)
319*4ba679daSKai Liang 
320*4ba679daSKai Liang #define IS_PLAT_SUSPEND_ID(stateid) \
321*4ba679daSKai Liang 	((stateid) == MT_PLAT_PWR_STATE_SUSPEND)
322*4ba679daSKai Liang 
323*4ba679daSKai Liang #define IS_PLAT_MCUSYSOFF_AFFLV(_afflv) \
324*4ba679daSKai Liang 	((_afflv) >= PLAT_MT_CPU_SUSPEND_MCUSYS)
325*4ba679daSKai Liang 
326*4ba679daSKai Liang int plat_pm_ops_setup_pwr(struct plat_pm_pwr_ctrl *ops);
327*4ba679daSKai Liang 
328*4ba679daSKai Liang int plat_pm_ops_setup_reset(struct plat_pm_reset_ctrl *ops);
329*4ba679daSKai Liang 
330*4ba679daSKai Liang int plat_pm_ops_setup_smp(struct plat_pm_smp_ctrl *ops);
331*4ba679daSKai Liang 
332*4ba679daSKai Liang uintptr_t plat_pm_get_warm_entry(void);
333*4ba679daSKai Liang 
334*4ba679daSKai Liang int plat_pm_invoke_func(enum mtk_cpu_pm_mode mode, unsigned int id, void *priv);
335*4ba679daSKai Liang 
336*4ba679daSKai Liang #endif
337