1*532ac057SKun Lu /* 2*532ac057SKun Lu * Copyright (c) 2025, Mediatek Inc. All rights reserved. 3*532ac057SKun Lu * 4*532ac057SKun Lu * SPDX-License-Identifier: BSD-3-Clause 5*532ac057SKun Lu */ 6*532ac057SKun Lu 7*532ac057SKun Lu #ifndef MT_SPM_RC_API_COMMON_H 8*532ac057SKun Lu #define MT_SPM_RC_API_COMMON_H 9*532ac057SKun Lu 10*532ac057SKun Lu #include <constraints/mt_spm_trace.h> 11*532ac057SKun Lu #include <mt_spm_constraint.h> 12*532ac057SKun Lu #include <mt_spm_internal.h> 13*532ac057SKun Lu 14*532ac057SKun Lu enum mt_spm_rm_rc_type { 15*532ac057SKun Lu MT_RM_CONSTRAINT_ID_VCORE, 16*532ac057SKun Lu MT_RM_CONSTRAINT_ID_BUS26, 17*532ac057SKun Lu MT_RM_CONSTRAINT_ID_SYSPL, 18*532ac057SKun Lu MT_RM_CONSTRAINT_ID_ALL = 0xff, 19*532ac057SKun Lu }; 20*532ac057SKun Lu 21*532ac057SKun Lu enum mt_spm_rc_fp_type { 22*532ac057SKun Lu MT_SPM_RC_FP_INIT = 0, 23*532ac057SKun Lu MT_SPM_RC_FP_ENTER_START, 24*532ac057SKun Lu MT_SPM_RC_FP_ENTER_NOTIFY, 25*532ac057SKun Lu MT_SPM_RC_FP_ENTER_WAKE_SPM_BEFORE, 26*532ac057SKun Lu MT_SPM_RC_FP_ENTER_WAKE_SPM_AFTER, 27*532ac057SKun Lu MT_SPM_RC_FP_RESUME_START, 28*532ac057SKun Lu MT_SPM_RC_FP_RESUME_NOTIFY, 29*532ac057SKun Lu MT_SPM_RC_FP_RESUME_RESET_SPM_BEFORE, 30*532ac057SKun Lu MT_SPM_RC_FP_RESUME_BACKUP_EDGE_INT, 31*532ac057SKun Lu }; 32*532ac057SKun Lu 33*532ac057SKun Lu #define CONSTRAINT_VCORE_ALLOW (MT_RM_CONSTRAINT_ALLOW_CPU_BUCK_OFF | \ 34*532ac057SKun Lu MT_RM_CONSTRAINT_ALLOW_DRAM_S0 | \ 35*532ac057SKun Lu MT_RM_CONSTRAINT_ALLOW_DRAM_S1 | \ 36*532ac057SKun Lu MT_RM_CONSTRAINT_ALLOW_VCORE_LP | \ 37*532ac057SKun Lu MT_RM_CONSTRAINT_ALLOW_LVTS_STATE | \ 38*532ac057SKun Lu MT_RM_CONSTRAINT_ALLOW_BUS26M_OFF | \ 39*532ac057SKun Lu MT_RM_CONSTRAINT_ALLOW_VCORE_OFF) 40*532ac057SKun Lu 41*532ac057SKun Lu #define MT_SPM_RC_INFO(_cpu, _stateid, _rc_id) \ 42*532ac057SKun Lu ({ \ 43*532ac057SKun Lu MT_SPM_TRACE_COMMON_U32_WR( \ 44*532ac057SKun Lu MT_SPM_TRACE_COMM_RC_INFO, \ 45*532ac057SKun Lu (_cpu << 28) | ((_stateid & 0xffff) << 12) | \ 46*532ac057SKun Lu (_rc_id & 0xfff)); \ 47*532ac057SKun Lu }) 48*532ac057SKun Lu 49*532ac057SKun Lu #define MT_SPM_RC_LAST_TIME(_time) \ 50*532ac057SKun Lu ({ \ 51*532ac057SKun Lu MT_SPM_TRACE_COMMON_U32_WR(MT_SPM_TRACE_COMM_RC_LAST_TIME_H, \ 52*532ac057SKun Lu (uint32_t)(_time >> 32)); \ 53*532ac057SKun Lu MT_SPM_TRACE_COMMON_U32_WR(MT_SPM_TRACE_COMM_RC_LAST_TIME_L, \ 54*532ac057SKun Lu (uint32_t)(_time & 0xffffffff)); \ 55*532ac057SKun Lu }) 56*532ac057SKun Lu 57*532ac057SKun Lu #ifdef MT_SPM_TIMESTAMP_SUPPORT 58*532ac057SKun Lu #define MT_SPM_RC_TAG(_cpu, _stateid, _rc_id) \ 59*532ac057SKun Lu ({ \ 60*532ac057SKun Lu uint64_t ktime = 0; \ 61*532ac057SKun Lu MT_SPM_TIME_GET(ktime); \ 62*532ac057SKun Lu MT_SPM_RC_INFO(_cpu, _stateid, _rc_id); \ 63*532ac057SKun Lu (void)ktime; \ 64*532ac057SKun Lu MT_SPM_RC_LAST_TIME(ktime); \ 65*532ac057SKun Lu }) 66*532ac057SKun Lu 67*532ac057SKun Lu #else 68*532ac057SKun Lu #define MT_SPM_RC_TAG(_cpu, _stateid, _rc_id) \ 69*532ac057SKun Lu MT_SPM_RC_INFO(_cpu, _stateid, _rc_id) 70*532ac057SKun Lu 71*532ac057SKun Lu #endif 72*532ac057SKun Lu 73*532ac057SKun Lu #define MT_SPM_RC_FP(fp) \ 74*532ac057SKun Lu ({ MT_SPM_TRACE_COMMON_U32_WR(MT_SPM_TRACE_COMM_RC_FP, fp); }) 75*532ac057SKun Lu 76*532ac057SKun Lu #define MT_SPM_RC_TAG_VALID(_valid) \ 77*532ac057SKun Lu ({ MT_SPM_TRACE_COMMON_U32_WR(MT_SPM_TRACE_COMM_RC_VALID, _valid); }) 78*532ac057SKun Lu 79*532ac057SKun Lu int spm_rc_constraint_status_get(uint32_t id, uint32_t type, uint32_t act, 80*532ac057SKun Lu enum mt_spm_rm_rc_type dest_rc_id, 81*532ac057SKun Lu struct constraint_status *const src, 82*532ac057SKun Lu struct constraint_status *const dest); 83*532ac057SKun Lu 84*532ac057SKun Lu int spm_rc_constraint_status_set(uint32_t id, uint32_t type, uint32_t act, 85*532ac057SKun Lu enum mt_spm_rm_rc_type dest_rc_id, 86*532ac057SKun Lu struct constraint_status *const src, 87*532ac057SKun Lu struct constraint_status *const dest); 88*532ac057SKun Lu 89*532ac057SKun Lu int spm_rc_constraint_valid_set(enum mt_spm_rm_rc_type id, 90*532ac057SKun Lu enum mt_spm_rm_rc_type dest_rc_id, 91*532ac057SKun Lu uint32_t valid, 92*532ac057SKun Lu struct constraint_status *const dest); 93*532ac057SKun Lu 94*532ac057SKun Lu int spm_rc_constraint_valid_clr(enum mt_spm_rm_rc_type id, 95*532ac057SKun Lu enum mt_spm_rm_rc_type dest_rc_id, 96*532ac057SKun Lu uint32_t valid, 97*532ac057SKun Lu struct constraint_status *const dest); 98*532ac057SKun Lu 99*532ac057SKun Lu void mt_spm_dump_pmic_warp_reg(void); 100*532ac057SKun Lu uint32_t spm_allow_rc_vcore(int state_id); 101*532ac057SKun Lu int spm_hwcg_name(uint32_t idex, char *name, size_t sz); 102*532ac057SKun Lu 103*532ac057SKun Lu #ifdef MTK_PLAT_CIRQ_UNSUPPORT 104*532ac057SKun Lu #define do_irqs_delivery(_x, _w) 105*532ac057SKun Lu #else 106*532ac057SKun Lu void do_irqs_delivery(struct mt_irqremain *irqs, struct wake_status *wakeup); 107*532ac057SKun Lu #endif 108*532ac057SKun Lu 109*532ac057SKun Lu #endif 110