xref: /arm-trusted-firmware/plat/mediatek/lib/pm/mtk_pm.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2022, Mediatek Inc. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef MTK_PM_H
8*91f16700Schasinglulu #define MTK_PM_H
9*91f16700Schasinglulu #include <lib/psci/psci.h>
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #if MTK_PUBEVENT_ENABLE
12*91f16700Schasinglulu #include <vendor_pubsub_events.h>
13*91f16700Schasinglulu #endif
14*91f16700Schasinglulu 
15*91f16700Schasinglulu #define MTK_CPUPM_E_OK			(0)
16*91f16700Schasinglulu #define MTK_CPUPM_E_UNKNOWN		(-1)
17*91f16700Schasinglulu #define MTK_CPUPM_E_ERR			(-2)
18*91f16700Schasinglulu #define MTK_CPUPM_E_FAIL		(-3)
19*91f16700Schasinglulu #define MTK_CPUPM_E_NOT_SUPPORT		(-4)
20*91f16700Schasinglulu 
21*91f16700Schasinglulu 
22*91f16700Schasinglulu #define MTK_CPUPM_FN_PWR_LOCK_AQUIRE		BIT(0)
23*91f16700Schasinglulu #define MTK_CPUPM_FN_INIT			BIT(1)
24*91f16700Schasinglulu #define MTK_CPUPM_FN_PWR_STATE_VALID		BIT(2)
25*91f16700Schasinglulu #define MTK_CPUPM_FN_PWR_ON_CORE_PREPARE	BIT(3)
26*91f16700Schasinglulu #define MTK_CPUPM_FN_SUSPEND_CORE		BIT(4)
27*91f16700Schasinglulu #define MTK_CPUPM_FN_RESUME_CORE		BIT(5)
28*91f16700Schasinglulu #define MTK_CPUPM_FN_SUSPEND_CLUSTER		BIT(6)
29*91f16700Schasinglulu #define MTK_CPUPM_FN_RESUME_CLUSTER		BIT(7)
30*91f16700Schasinglulu #define MTK_CPUPM_FN_SUSPEND_MCUSYS		BIT(8)
31*91f16700Schasinglulu #define MTK_CPUPM_FN_RESUME_MCUSYS		BIT(9)
32*91f16700Schasinglulu #define MTK_CPUPM_FN_CPUPM_GET_PWR_STATE	BIT(10)
33*91f16700Schasinglulu #define MTK_CPUPM_FN_SMP_INIT			BIT(11)
34*91f16700Schasinglulu #define MTK_CPUPM_FN_SMP_CORE_ON		BIT(12)
35*91f16700Schasinglulu #define MTK_CPUPM_FN_SMP_CORE_OFF		BIT(13)
36*91f16700Schasinglulu 
37*91f16700Schasinglulu enum mtk_cpupm_pstate {
38*91f16700Schasinglulu 	MTK_CPUPM_CORE_ON,
39*91f16700Schasinglulu 	MTK_CPUPM_CORE_OFF,
40*91f16700Schasinglulu 	MTK_CPUPM_CORE_SUSPEND,
41*91f16700Schasinglulu 	MTK_CPUPM_CORE_RESUME,
42*91f16700Schasinglulu 	MTK_CPUPM_CLUSTER_SUSPEND,
43*91f16700Schasinglulu 	MTK_CPUPM_CLUSTER_RESUME,
44*91f16700Schasinglulu 	MTK_CPUPM_MCUSYS_SUSPEND,
45*91f16700Schasinglulu 	MTK_CPUPM_MCUSYS_RESUME,
46*91f16700Schasinglulu };
47*91f16700Schasinglulu 
48*91f16700Schasinglulu enum mtk_cpu_pm_mode {
49*91f16700Schasinglulu 	MTK_CPU_PM_CPUIDLE,
50*91f16700Schasinglulu 	MTK_CPU_PM_SMP,
51*91f16700Schasinglulu };
52*91f16700Schasinglulu 
53*91f16700Schasinglulu #define MT_IRQ_REMAIN_MAX	(32)
54*91f16700Schasinglulu #define MT_IRQ_REMAIN_CAT_LOG	BIT(31)
55*91f16700Schasinglulu 
56*91f16700Schasinglulu struct mt_irqremain {
57*91f16700Schasinglulu 	unsigned int count;
58*91f16700Schasinglulu 	unsigned int irqs[MT_IRQ_REMAIN_MAX];
59*91f16700Schasinglulu 	unsigned int wakeupsrc_cat[MT_IRQ_REMAIN_MAX];
60*91f16700Schasinglulu 	unsigned int wakeupsrc[MT_IRQ_REMAIN_MAX];
61*91f16700Schasinglulu };
62*91f16700Schasinglulu 
63*91f16700Schasinglulu typedef void (*plat_init_func)(unsigned int, uintptr_t);
64*91f16700Schasinglulu 
65*91f16700Schasinglulu struct plat_pm_smp_ctrl {
66*91f16700Schasinglulu 	plat_init_func init;
67*91f16700Schasinglulu 	int (*pwr_domain_on)(u_register_t mpidr);
68*91f16700Schasinglulu 	void (*pwr_domain_off)(const psci_power_state_t *target_state);
69*91f16700Schasinglulu 	void (*pwr_domain_on_finish)(const psci_power_state_t *target_state);
70*91f16700Schasinglulu };
71*91f16700Schasinglulu 
72*91f16700Schasinglulu struct plat_pm_pwr_ctrl {
73*91f16700Schasinglulu 	void (*pwr_domain_suspend)(const psci_power_state_t *target_state);
74*91f16700Schasinglulu 	void (*pwr_domain_on_finish_late)(const psci_power_state_t *target_state);
75*91f16700Schasinglulu 	void (*pwr_domain_suspend_finish)(const psci_power_state_t *target_state);
76*91f16700Schasinglulu 	int (*validate_power_state)(unsigned int power_state, psci_power_state_t *req_state);
77*91f16700Schasinglulu 	void (*get_sys_suspend_power_state)(psci_power_state_t *req_state);
78*91f16700Schasinglulu };
79*91f16700Schasinglulu 
80*91f16700Schasinglulu struct plat_pm_reset_ctrl {
81*91f16700Schasinglulu 	__dead2 void (*system_off)();
82*91f16700Schasinglulu 	__dead2 void (*system_reset)();
83*91f16700Schasinglulu 	int (*system_reset2)(int is_vendor, int reset_type, u_register_t cookie);
84*91f16700Schasinglulu };
85*91f16700Schasinglulu 
86*91f16700Schasinglulu struct mtk_cpu_pm_info {
87*91f16700Schasinglulu 	unsigned int cpuid;
88*91f16700Schasinglulu 	unsigned int mode;
89*91f16700Schasinglulu };
90*91f16700Schasinglulu 
91*91f16700Schasinglulu struct mtk_cpu_pm_state {
92*91f16700Schasinglulu 	unsigned int afflv;
93*91f16700Schasinglulu 	unsigned int state_id;
94*91f16700Schasinglulu 	const psci_power_state_t *raw;
95*91f16700Schasinglulu };
96*91f16700Schasinglulu 
97*91f16700Schasinglulu struct mtk_cpupm_pwrstate {
98*91f16700Schasinglulu 	struct mtk_cpu_pm_info info;
99*91f16700Schasinglulu 	struct mtk_cpu_pm_state pwr;
100*91f16700Schasinglulu };
101*91f16700Schasinglulu 
102*91f16700Schasinglulu struct mtk_cpu_smp_ops {
103*91f16700Schasinglulu 	void (*init)(unsigned int cpu, uintptr_t sec_entrypoint);
104*91f16700Schasinglulu 	int (*cpu_pwr_on_prepare)(unsigned int cpu, uintptr_t entry);
105*91f16700Schasinglulu 	void (*cpu_on)(const struct mtk_cpupm_pwrstate *state);
106*91f16700Schasinglulu 	void (*cpu_off)(const struct mtk_cpupm_pwrstate *state);
107*91f16700Schasinglulu 	int (*invoke)(unsigned int funcID, void *priv);
108*91f16700Schasinglulu };
109*91f16700Schasinglulu 
110*91f16700Schasinglulu #define MT_CPUPM_PWR_DOMAIN_CORE		BIT(0)
111*91f16700Schasinglulu #define MT_CPUPM_PWR_DOMAIN_PERCORE_DSU		BIT(1)
112*91f16700Schasinglulu #define MT_CPUPM_PWR_DOMAIN_PERCORE_DSU_MEM	BIT(2)
113*91f16700Schasinglulu #define MT_CPUPM_PWR_DOMAIN_CLUSTER		BIT(3)
114*91f16700Schasinglulu #define MT_CPUPM_PWR_DOMAIN_MCUSYS		BIT(4)
115*91f16700Schasinglulu #define MT_CPUPM_PWR_DOMAIN_SUSPEND		BIT(5)
116*91f16700Schasinglulu 
117*91f16700Schasinglulu enum mt_cpupm_pwr_domain {
118*91f16700Schasinglulu 	CPUPM_PWR_ON,
119*91f16700Schasinglulu 	CPUPM_PWR_OFF,
120*91f16700Schasinglulu };
121*91f16700Schasinglulu 
122*91f16700Schasinglulu typedef	unsigned int mtk_pstate_type;
123*91f16700Schasinglulu 
124*91f16700Schasinglulu struct mtk_cpu_pm_ops {
125*91f16700Schasinglulu 	void (*init)(unsigned int cpu, uintptr_t sec_entrypoint);
126*91f16700Schasinglulu 	unsigned int (*get_pstate)(enum mt_cpupm_pwr_domain domain,
127*91f16700Schasinglulu 				   const mtk_pstate_type psci_state,
128*91f16700Schasinglulu 				   const struct mtk_cpupm_pwrstate *state);
129*91f16700Schasinglulu 	int (*pwr_state_valid)(unsigned int afflv, unsigned int state);
130*91f16700Schasinglulu 	void (*cpu_suspend)(const struct mtk_cpupm_pwrstate *state);
131*91f16700Schasinglulu 	void (*cpu_resume)(const struct mtk_cpupm_pwrstate *state);
132*91f16700Schasinglulu 	void (*cluster_suspend)(const struct mtk_cpupm_pwrstate *state);
133*91f16700Schasinglulu 	void (*cluster_resume)(const struct mtk_cpupm_pwrstate *state);
134*91f16700Schasinglulu 	void (*mcusys_suspend)(const struct mtk_cpupm_pwrstate *state);
135*91f16700Schasinglulu 	void (*mcusys_resume)(const struct mtk_cpupm_pwrstate *state);
136*91f16700Schasinglulu 	int (*invoke)(unsigned int funcID, void *priv);
137*91f16700Schasinglulu };
138*91f16700Schasinglulu 
139*91f16700Schasinglulu int register_cpu_pm_ops(unsigned int fn_flags, struct mtk_cpu_pm_ops *ops);
140*91f16700Schasinglulu int register_cpu_smp_ops(unsigned int fn_flags, struct mtk_cpu_smp_ops *ops);
141*91f16700Schasinglulu 
142*91f16700Schasinglulu struct mt_cpupm_event_data {
143*91f16700Schasinglulu 	unsigned int cpuid;
144*91f16700Schasinglulu 	unsigned int pwr_domain;
145*91f16700Schasinglulu };
146*91f16700Schasinglulu 
147*91f16700Schasinglulu /* Extension event for platform driver */
148*91f16700Schasinglulu #if MTK_PUBEVENT_ENABLE
149*91f16700Schasinglulu /* [PUB_EVENT] Core power on */
150*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_EVENT_PWR_ON(_fn) \
151*91f16700Schasinglulu 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_pwr_on, _fn)
152*91f16700Schasinglulu 
153*91f16700Schasinglulu /* [PUB_EVENT] Core power off */
154*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_EVENT_PWR_OFF(_fn) \
155*91f16700Schasinglulu 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_pwr_off, _fn)
156*91f16700Schasinglulu 
157*91f16700Schasinglulu /* [PUB_EVENT] Cluster power on */
158*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_CLUSTER_PWR_ON(_fn) \
159*91f16700Schasinglulu 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_afflv_pwr_on, _fn)
160*91f16700Schasinglulu 
161*91f16700Schasinglulu /* [PUB_EVENT] Cluster power off */
162*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_CLUSTER_PWR_OFF(_fn) \
163*91f16700Schasinglulu 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_afflv_pwr_off, _fn)
164*91f16700Schasinglulu 
165*91f16700Schasinglulu /* [PUB_EVENT] Mcusys power on */
166*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_MCUSYS_PWR_ON(_fn) \
167*91f16700Schasinglulu 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_afflv_pwr_on, _fn)
168*91f16700Schasinglulu 
169*91f16700Schasinglulu /* [PUB_EVENT] Mcusys power off */
170*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_MCUSYS_PWR_OFF(_fn) \
171*91f16700Schasinglulu 	SUBSCRIBE_TO_EVENT(mt_cpupm_publish_afflv_pwr_off, _fn)
172*91f16700Schasinglulu 
173*91f16700Schasinglulu #else
174*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_EVENT_PWR_ON(_fn)
175*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_EVENT_PWR_OFF(_fn)
176*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_CLUSTER_PWR_ON(_fn)
177*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_CLUSTER_PWR_OFF(_fn)
178*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_MCUSYS_PWR_ON(_fn)
179*91f16700Schasinglulu #define MT_CPUPM_SUBCRIBE_MCUSYS_PWR_OFF(_fn)
180*91f16700Schasinglulu #endif
181*91f16700Schasinglulu 
182*91f16700Schasinglulu /*
183*91f16700Schasinglulu  * Definition c-state power domain.
184*91f16700Schasinglulu  * bit[7:4] (main state id):
185*91f16700Schasinglulu  *  - 1: Cluster.
186*91f16700Schasinglulu  *  - 2: Mcusys.
187*91f16700Schasinglulu  *  - 3: Memory.
188*91f16700Schasinglulu  *  - 4: System pll.
189*91f16700Schasinglulu  *  - 5: System bus.
190*91f16700Schasinglulu  *  - 6: SoC 26m/DCXO.
191*91f16700Schasinglulu  *  - 7: Vcore buck.
192*91f16700Schasinglulu  *  - 15: Suspend.
193*91f16700Schasinglulu  * bit[3:0] (reserved for state_id extension):
194*91f16700Schasinglulu  *  - 4: CPU buck.
195*91f16700Schasinglulu  */
196*91f16700Schasinglulu #define MT_PLAT_PWR_STATE_CLUSTER	(0x0010)
197*91f16700Schasinglulu #define MT_PLAT_PWR_STATE_MCUSYS	(0x0020)
198*91f16700Schasinglulu #define MT_PLAT_PWR_STATE_MCUSYS_BUCK	(0x0024)
199*91f16700Schasinglulu #define MT_PLAT_PWR_STATE_SYSTEM_MEM	(0x0030)
200*91f16700Schasinglulu #define MT_PLAT_PWR_STATE_SYSTEM_PLL	(0x0040)
201*91f16700Schasinglulu #define MT_PLAT_PWR_STATE_SYSTEM_BUS	(0x0050)
202*91f16700Schasinglulu #define MT_PLAT_PWR_STATE_SUSPEND	(0x00f0)
203*91f16700Schasinglulu 
204*91f16700Schasinglulu #define IS_MT_PLAT_PWR_STATE(state, target_state)	((state & target_state) == target_state)
205*91f16700Schasinglulu #define IS_MT_PLAT_PWR_STATE_MCUSYS(state)  IS_MT_PLAT_PWR_STATE(state, MT_PLAT_PWR_STATE_MCUSYS)
206*91f16700Schasinglulu 
207*91f16700Schasinglulu #define PLAT_MT_SYSTEM_SUSPEND		PLAT_MAX_OFF_STATE
208*91f16700Schasinglulu #define PLAT_MT_CPU_SUSPEND_CLUSTER	PLAT_MAX_RET_STATE
209*91f16700Schasinglulu #define PLAT_MT_CPU_SUSPEND_MCUSYS	PLAT_MAX_RET_STATE
210*91f16700Schasinglulu 
211*91f16700Schasinglulu #define IS_PLAT_SYSTEM_SUSPEND(aff)	(aff == PLAT_MT_SYSTEM_SUSPEND)
212*91f16700Schasinglulu #define IS_PLAT_SYSTEM_RETENTION(aff)	(aff >= PLAT_MAX_RET_STATE)
213*91f16700Schasinglulu 
214*91f16700Schasinglulu #define IS_PLAT_SUSPEND_ID(stateid)	(stateid == MT_PLAT_PWR_STATE_SUSPEND)
215*91f16700Schasinglulu 
216*91f16700Schasinglulu #define IS_PLAT_MCUSYSOFF_AFFLV(afflv)	(afflv >= PLAT_MT_CPU_SUSPEND_MCUSYS)
217*91f16700Schasinglulu 
218*91f16700Schasinglulu int plat_pm_ops_setup_pwr(struct plat_pm_pwr_ctrl *ops);
219*91f16700Schasinglulu int plat_pm_ops_setup_reset(struct plat_pm_reset_ctrl *ops);
220*91f16700Schasinglulu int plat_pm_ops_setup_smp(struct plat_pm_smp_ctrl *ops);
221*91f16700Schasinglulu uintptr_t plat_pm_get_warm_entry(void);
222*91f16700Schasinglulu 
223*91f16700Schasinglulu #endif
224