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