1*083cfadbSKun Lu /*
2*083cfadbSKun Lu * Copyright (c) 2025, Mediatek Inc. All rights reserved.
3*083cfadbSKun Lu *
4*083cfadbSKun Lu * SPDX-License-Identifier: BSD-3-Clause
5*083cfadbSKun Lu */
6*083cfadbSKun Lu
7*083cfadbSKun Lu #include <stddef.h>
8*083cfadbSKun Lu #include <stdio.h>
9*083cfadbSKun Lu #include <string.h>
10*083cfadbSKun Lu
11*083cfadbSKun Lu #include <common/debug.h>
12*083cfadbSKun Lu #include <lib/mmio.h>
13*083cfadbSKun Lu
14*083cfadbSKun Lu #include <drivers/spm/mt_spm_resource_req.h>
15*083cfadbSKun Lu #include <lib/pm/mtk_pm.h>
16*083cfadbSKun Lu #include <lpm_v2/mt_lp_api.h>
17*083cfadbSKun Lu #include <mt_spm.h>
18*083cfadbSKun Lu #include <mt_spm_conservation.h>
19*083cfadbSKun Lu #include <mt_spm_idle.h>
20*083cfadbSKun Lu #include <mt_spm_internal.h>
21*083cfadbSKun Lu #include <mt_spm_reg.h>
22*083cfadbSKun Lu #include <mt_spm_stats.h>
23*083cfadbSKun Lu
24*083cfadbSKun Lu #define SPM_BYPASS_SYSPWREQ_GENERIC 1
25*083cfadbSKun Lu
26*083cfadbSKun Lu /* Default will be the bus26m or deeper spm's low power mode*/
27*083cfadbSKun Lu #define __WAKE_SRC_FOR_IDLE_COMMON__ \
28*083cfadbSKun Lu ((R12_PCM_TIMER_B) | (R12_KP_IRQ_B) | (R12_CONN2AP_WAKEUP_B) | \
29*083cfadbSKun Lu (R12_EINT_EVENT_B) | (R12_CONN_WDT_IRQ_B) | (R12_SSPM2SPM_WAKEUP_B) | \
30*083cfadbSKun Lu (R12_SCP2SPM_WAKEUP_B) | (R12_VADSP2SPM_WAKEUP_B) | \
31*083cfadbSKun Lu (R12_USB0_CDSC_B) | (R12_USB0_POWERDWN_B) | (R12_SBD_INTR_B) | \
32*083cfadbSKun Lu (R12_UART2SPM_IRQ_B) | (R12_SYS_TIMER_EVENT_B) | \
33*083cfadbSKun Lu (R12_EINT_EVENT_SECURE_B) | (R12_AFE_IRQ_MCU_B) | \
34*083cfadbSKun Lu (R12_SYS_CIRQ_IRQ_B) | (R12_AP2AP_PEER_WAKEUP_B) | (R12_CPU_WAKEUP) | \
35*083cfadbSKun Lu (R12_APUSYS_WAKE_HOST_B) | (R12_PCIE_MAC_IRQ_WAKE_B) | \
36*083cfadbSKun Lu (R12_MSDC_WAKEUP_EVENT_B))
37*083cfadbSKun Lu
38*083cfadbSKun Lu #if defined(CFG_MICROTRUST_TEE_SUPPORT)
39*083cfadbSKun Lu #define WAKE_SRC_FOR_IDLE (__WAKE_SRC_FOR_IDLE_COMMON__)
40*083cfadbSKun Lu #else
41*083cfadbSKun Lu #define WAKE_SRC_FOR_IDLE (__WAKE_SRC_FOR_IDLE_COMMON__ | R12_SEJ_B)
42*083cfadbSKun Lu #endif
43*083cfadbSKun Lu
44*083cfadbSKun Lu static struct pwr_ctrl idle_spm_pwr = {
45*083cfadbSKun Lu .wake_src = WAKE_SRC_FOR_IDLE,
46*083cfadbSKun Lu
47*083cfadbSKun Lu /* Auto-gen Start */
48*083cfadbSKun Lu
49*083cfadbSKun Lu /* SPM_SRC_REQ */
50*083cfadbSKun Lu .reg_spm_adsp_mailbox_req = 0,
51*083cfadbSKun Lu .reg_spm_apsrc_req = 0,
52*083cfadbSKun Lu .reg_spm_ddren_req = 0,
53*083cfadbSKun Lu .reg_spm_dvfs_req = 0,
54*083cfadbSKun Lu .reg_spm_emi_req = 0,
55*083cfadbSKun Lu .reg_spm_f26m_req = 0,
56*083cfadbSKun Lu .reg_spm_infra_req = 0,
57*083cfadbSKun Lu .reg_spm_pmic_req = 0,
58*083cfadbSKun Lu .reg_spm_scp_mailbox_req = 0,
59*083cfadbSKun Lu .reg_spm_sspm_mailbox_req = 0,
60*083cfadbSKun Lu .reg_spm_sw_mailbox_req = 0,
61*083cfadbSKun Lu .reg_spm_vcore_req = 0,
62*083cfadbSKun Lu .reg_spm_vrf18_req = 0,
63*083cfadbSKun Lu .adsp_mailbox_state = 0,
64*083cfadbSKun Lu .apsrc_state = 0,
65*083cfadbSKun Lu .ddren_state = 0,
66*083cfadbSKun Lu .dvfs_state = 0,
67*083cfadbSKun Lu .emi_state = 0,
68*083cfadbSKun Lu .f26m_state = 0,
69*083cfadbSKun Lu .infra_state = 0,
70*083cfadbSKun Lu .pmic_state = 0,
71*083cfadbSKun Lu .scp_mailbox_state = 0,
72*083cfadbSKun Lu .sspm_mailbox_state = 0,
73*083cfadbSKun Lu .sw_mailbox_state = 0,
74*083cfadbSKun Lu .vcore_state = 0,
75*083cfadbSKun Lu .vrf18_state = 0,
76*083cfadbSKun Lu
77*083cfadbSKun Lu /* SPM_SRC_MASK_0 */
78*083cfadbSKun Lu .reg_apu_apsrc_req_mask_b = 0x1,
79*083cfadbSKun Lu .reg_apu_ddren_req_mask_b = 0x1,
80*083cfadbSKun Lu .reg_apu_emi_req_mask_b = 0x1,
81*083cfadbSKun Lu .reg_apu_infra_req_mask_b = 0x1,
82*083cfadbSKun Lu .reg_apu_pmic_req_mask_b = 0x1,
83*083cfadbSKun Lu .reg_apu_srcclkena_mask_b = 0x1,
84*083cfadbSKun Lu .reg_apu_vrf18_req_mask_b = 0x1,
85*083cfadbSKun Lu .reg_audio_dsp_apsrc_req_mask_b = 0x0,
86*083cfadbSKun Lu .reg_audio_dsp_ddren_req_mask_b = 0x0,
87*083cfadbSKun Lu .reg_audio_dsp_emi_req_mask_b = 0x0,
88*083cfadbSKun Lu .reg_audio_dsp_infra_req_mask_b = 0x0,
89*083cfadbSKun Lu .reg_audio_dsp_pmic_req_mask_b = 0x0,
90*083cfadbSKun Lu .reg_audio_dsp_srcclkena_mask_b = 0x0,
91*083cfadbSKun Lu .reg_audio_dsp_vcore_req_mask_b = 0x0,
92*083cfadbSKun Lu .reg_audio_dsp_vrf18_req_mask_b = 0x0,
93*083cfadbSKun Lu .reg_cam_apsrc_req_mask_b = 0x1,
94*083cfadbSKun Lu .reg_cam_ddren_req_mask_b = 0x1,
95*083cfadbSKun Lu .reg_cam_emi_req_mask_b = 0x1,
96*083cfadbSKun Lu .reg_cam_infra_req_mask_b = 0x0,
97*083cfadbSKun Lu .reg_cam_pmic_req_mask_b = 0x0,
98*083cfadbSKun Lu .reg_cam_srcclkena_mask_b = 0x0,
99*083cfadbSKun Lu .reg_cam_vrf18_req_mask_b = 0x0,
100*083cfadbSKun Lu .reg_mdp_emi_req_mask_b = 0x1,
101*083cfadbSKun Lu
102*083cfadbSKun Lu /* SPM_SRC_MASK_1 */
103*083cfadbSKun Lu .reg_ccif_apsrc_req_mask_b = 0x0,
104*083cfadbSKun Lu .reg_ccif_emi_req_mask_b = 0xfff,
105*083cfadbSKun Lu
106*083cfadbSKun Lu /* SPM_SRC_MASK_2 */
107*083cfadbSKun Lu .reg_ccif_infra_req_mask_b = 0x0,
108*083cfadbSKun Lu .reg_ccif_pmic_req_mask_b = 0xfff,
109*083cfadbSKun Lu
110*083cfadbSKun Lu /* SPM_SRC_MASK_3 */
111*083cfadbSKun Lu .reg_ccif_srcclkena_mask_b = 0x0,
112*083cfadbSKun Lu .reg_ccif_vrf18_req_mask_b = 0xfff,
113*083cfadbSKun Lu .reg_ccu_apsrc_req_mask_b = 0x0,
114*083cfadbSKun Lu .reg_ccu_ddren_req_mask_b = 0x0,
115*083cfadbSKun Lu .reg_ccu_emi_req_mask_b = 0x0,
116*083cfadbSKun Lu .reg_ccu_infra_req_mask_b = 0x0,
117*083cfadbSKun Lu .reg_ccu_pmic_req_mask_b = 0x0,
118*083cfadbSKun Lu .reg_ccu_srcclkena_mask_b = 0x0,
119*083cfadbSKun Lu .reg_ccu_vrf18_req_mask_b = 0x0,
120*083cfadbSKun Lu .reg_cg_check_apsrc_req_mask_b = 0x1,
121*083cfadbSKun Lu
122*083cfadbSKun Lu /* SPM_SRC_MASK_4 */
123*083cfadbSKun Lu .reg_cg_check_ddren_req_mask_b = 0x1,
124*083cfadbSKun Lu .reg_cg_check_emi_req_mask_b = 0x1,
125*083cfadbSKun Lu .reg_cg_check_infra_req_mask_b = 0x1,
126*083cfadbSKun Lu .reg_cg_check_pmic_req_mask_b = 0x1,
127*083cfadbSKun Lu .reg_cg_check_srcclkena_mask_b = 0x1,
128*083cfadbSKun Lu .reg_cg_check_vcore_req_mask_b = 0x1,
129*083cfadbSKun Lu .reg_cg_check_vrf18_req_mask_b = 0x1,
130*083cfadbSKun Lu .reg_conn_apsrc_req_mask_b = 0x1,
131*083cfadbSKun Lu .reg_conn_ddren_req_mask_b = 0x1,
132*083cfadbSKun Lu .reg_conn_emi_req_mask_b = 0x1,
133*083cfadbSKun Lu .reg_conn_infra_req_mask_b = 0x1,
134*083cfadbSKun Lu .reg_conn_pmic_req_mask_b = 0x1,
135*083cfadbSKun Lu .reg_conn_srcclkena_mask_b = 0x1,
136*083cfadbSKun Lu .reg_conn_srcclkenb_mask_b = 0x1,
137*083cfadbSKun Lu .reg_conn_vcore_req_mask_b = 0x1,
138*083cfadbSKun Lu .reg_conn_vrf18_req_mask_b = 0x1,
139*083cfadbSKun Lu .reg_cpueb_apsrc_req_mask_b = 0x1,
140*083cfadbSKun Lu .reg_cpueb_ddren_req_mask_b = 0x1,
141*083cfadbSKun Lu .reg_cpueb_emi_req_mask_b = 0x1,
142*083cfadbSKun Lu .reg_cpueb_infra_req_mask_b = 0x1,
143*083cfadbSKun Lu .reg_cpueb_pmic_req_mask_b = 0x1,
144*083cfadbSKun Lu .reg_cpueb_srcclkena_mask_b = 0x1,
145*083cfadbSKun Lu .reg_cpueb_vrf18_req_mask_b = 0x1,
146*083cfadbSKun Lu .reg_disp0_apsrc_req_mask_b = 0x1,
147*083cfadbSKun Lu .reg_disp0_ddren_req_mask_b = 0x1,
148*083cfadbSKun Lu .reg_disp0_emi_req_mask_b = 0x1,
149*083cfadbSKun Lu .reg_disp0_infra_req_mask_b = 0x1,
150*083cfadbSKun Lu .reg_disp0_pmic_req_mask_b = 0x0,
151*083cfadbSKun Lu .reg_disp0_srcclkena_mask_b = 0x0,
152*083cfadbSKun Lu .reg_disp0_vrf18_req_mask_b = 0x1,
153*083cfadbSKun Lu .reg_disp1_apsrc_req_mask_b = 0x0,
154*083cfadbSKun Lu .reg_disp1_ddren_req_mask_b = 0x0,
155*083cfadbSKun Lu
156*083cfadbSKun Lu /* SPM_SRC_MASK_5 */
157*083cfadbSKun Lu .reg_disp1_emi_req_mask_b = 0x0,
158*083cfadbSKun Lu .reg_disp1_infra_req_mask_b = 0x0,
159*083cfadbSKun Lu .reg_disp1_pmic_req_mask_b = 0x0,
160*083cfadbSKun Lu .reg_disp1_srcclkena_mask_b = 0x0,
161*083cfadbSKun Lu .reg_disp1_vrf18_req_mask_b = 0x0,
162*083cfadbSKun Lu .reg_dpm_apsrc_req_mask_b = 0xf,
163*083cfadbSKun Lu .reg_dpm_ddren_req_mask_b = 0xf,
164*083cfadbSKun Lu .reg_dpm_emi_req_mask_b = 0xf,
165*083cfadbSKun Lu .reg_dpm_infra_req_mask_b = 0xf,
166*083cfadbSKun Lu .reg_dpm_pmic_req_mask_b = 0xf,
167*083cfadbSKun Lu .reg_dpm_srcclkena_mask_b = 0xf,
168*083cfadbSKun Lu
169*083cfadbSKun Lu /* SPM_SRC_MASK_6 */
170*083cfadbSKun Lu .reg_dpm_vcore_req_mask_b = 0xf,
171*083cfadbSKun Lu .reg_dpm_vrf18_req_mask_b = 0xf,
172*083cfadbSKun Lu .reg_dpmaif_apsrc_req_mask_b = 0x1,
173*083cfadbSKun Lu .reg_dpmaif_ddren_req_mask_b = 0x1,
174*083cfadbSKun Lu .reg_dpmaif_emi_req_mask_b = 0x1,
175*083cfadbSKun Lu .reg_dpmaif_infra_req_mask_b = 0x1,
176*083cfadbSKun Lu .reg_dpmaif_pmic_req_mask_b = 0x1,
177*083cfadbSKun Lu .reg_dpmaif_srcclkena_mask_b = 0x1,
178*083cfadbSKun Lu .reg_dpmaif_vrf18_req_mask_b = 0x1,
179*083cfadbSKun Lu .reg_dvfsrc_level_req_mask_b = 0x1,
180*083cfadbSKun Lu .reg_emisys_apsrc_req_mask_b = 0x0,
181*083cfadbSKun Lu .reg_emisys_ddren_req_mask_b = 0x1,
182*083cfadbSKun Lu .reg_emisys_emi_req_mask_b = 0x0,
183*083cfadbSKun Lu .reg_gce_d_apsrc_req_mask_b = 0x1,
184*083cfadbSKun Lu .reg_gce_d_ddren_req_mask_b = 0x1,
185*083cfadbSKun Lu .reg_gce_d_emi_req_mask_b = 0x1,
186*083cfadbSKun Lu .reg_gce_d_infra_req_mask_b = 0x0,
187*083cfadbSKun Lu .reg_gce_d_pmic_req_mask_b = 0x0,
188*083cfadbSKun Lu .reg_gce_d_srcclkena_mask_b = 0x0,
189*083cfadbSKun Lu .reg_gce_d_vrf18_req_mask_b = 0x0,
190*083cfadbSKun Lu .reg_gce_m_apsrc_req_mask_b = 0x1,
191*083cfadbSKun Lu .reg_gce_m_ddren_req_mask_b = 0x1,
192*083cfadbSKun Lu .reg_gce_m_emi_req_mask_b = 0x1,
193*083cfadbSKun Lu .reg_gce_m_infra_req_mask_b = 0x0,
194*083cfadbSKun Lu .reg_gce_m_pmic_req_mask_b = 0x0,
195*083cfadbSKun Lu .reg_gce_m_srcclkena_mask_b = 0x0,
196*083cfadbSKun Lu
197*083cfadbSKun Lu /* SPM_SRC_MASK_7 */
198*083cfadbSKun Lu .reg_gce_m_vrf18_req_mask_b = 0x0,
199*083cfadbSKun Lu .reg_gpueb_apsrc_req_mask_b = 0x0,
200*083cfadbSKun Lu .reg_gpueb_ddren_req_mask_b = 0x0,
201*083cfadbSKun Lu .reg_gpueb_emi_req_mask_b = 0x0,
202*083cfadbSKun Lu .reg_gpueb_infra_req_mask_b = 0x0,
203*083cfadbSKun Lu .reg_gpueb_pmic_req_mask_b = 0x0,
204*083cfadbSKun Lu .reg_gpueb_srcclkena_mask_b = 0x0,
205*083cfadbSKun Lu .reg_gpueb_vrf18_req_mask_b = 0x0,
206*083cfadbSKun Lu .reg_hwccf_apsrc_req_mask_b = 0x1,
207*083cfadbSKun Lu .reg_hwccf_ddren_req_mask_b = 0x1,
208*083cfadbSKun Lu .reg_hwccf_emi_req_mask_b = 0x1,
209*083cfadbSKun Lu .reg_hwccf_infra_req_mask_b = 0x1,
210*083cfadbSKun Lu .reg_hwccf_pmic_req_mask_b = 0x1,
211*083cfadbSKun Lu .reg_hwccf_srcclkena_mask_b = 0x1,
212*083cfadbSKun Lu .reg_hwccf_vcore_req_mask_b = 0x1,
213*083cfadbSKun Lu .reg_hwccf_vrf18_req_mask_b = 0x1,
214*083cfadbSKun Lu .reg_img_apsrc_req_mask_b = 0x1,
215*083cfadbSKun Lu .reg_img_ddren_req_mask_b = 0x1,
216*083cfadbSKun Lu .reg_img_emi_req_mask_b = 0x1,
217*083cfadbSKun Lu .reg_img_infra_req_mask_b = 0x0,
218*083cfadbSKun Lu .reg_img_pmic_req_mask_b = 0x0,
219*083cfadbSKun Lu .reg_img_srcclkena_mask_b = 0x0,
220*083cfadbSKun Lu .reg_img_vrf18_req_mask_b = 0x0,
221*083cfadbSKun Lu .reg_infrasys_apsrc_req_mask_b = 0x1,
222*083cfadbSKun Lu .reg_infrasys_ddren_req_mask_b = 0x1,
223*083cfadbSKun Lu .reg_infrasys_emi_req_mask_b = 0x1,
224*083cfadbSKun Lu .reg_ipic_infra_req_mask_b = 0x1,
225*083cfadbSKun Lu .reg_ipic_vrf18_req_mask_b = 0x1,
226*083cfadbSKun Lu .reg_mcu_apsrc_req_mask_b = 0x0,
227*083cfadbSKun Lu .reg_mcu_ddren_req_mask_b = 0x0,
228*083cfadbSKun Lu .reg_mcu_emi_req_mask_b = 0x0,
229*083cfadbSKun Lu
230*083cfadbSKun Lu /* SPM_SRC_MASK_8 */
231*083cfadbSKun Lu .reg_mcusys_apsrc_req_mask_b = 0x7,
232*083cfadbSKun Lu .reg_mcusys_ddren_req_mask_b = 0x7,
233*083cfadbSKun Lu .reg_mcusys_emi_req_mask_b = 0x7,
234*083cfadbSKun Lu .reg_mcusys_infra_req_mask_b = 0x0,
235*083cfadbSKun Lu
236*083cfadbSKun Lu /* SPM_SRC_MASK_9 */
237*083cfadbSKun Lu .reg_mcusys_pmic_req_mask_b = 0x0,
238*083cfadbSKun Lu .reg_mcusys_srcclkena_mask_b = 0x0,
239*083cfadbSKun Lu .reg_mcusys_vrf18_req_mask_b = 0x0,
240*083cfadbSKun Lu .reg_md_apsrc_req_mask_b = 0x0,
241*083cfadbSKun Lu .reg_md_ddren_req_mask_b = 0x0,
242*083cfadbSKun Lu .reg_md_emi_req_mask_b = 0x0,
243*083cfadbSKun Lu .reg_md_infra_req_mask_b = 0x0,
244*083cfadbSKun Lu .reg_md_pmic_req_mask_b = 0x0,
245*083cfadbSKun Lu .reg_md_srcclkena_mask_b = 0x0,
246*083cfadbSKun Lu .reg_md_srcclkena1_mask_b = 0x0,
247*083cfadbSKun Lu .reg_md_vcore_req_mask_b = 0x0,
248*083cfadbSKun Lu
249*083cfadbSKun Lu /* SPM_SRC_MASK_10 */
250*083cfadbSKun Lu .reg_md_vrf18_req_mask_b = 0x0,
251*083cfadbSKun Lu .reg_mdp_apsrc_req_mask_b = 0x0,
252*083cfadbSKun Lu .reg_mdp_ddren_req_mask_b = 0x0,
253*083cfadbSKun Lu .reg_mm_proc_apsrc_req_mask_b = 0x0,
254*083cfadbSKun Lu .reg_mm_proc_ddren_req_mask_b = 0x0,
255*083cfadbSKun Lu .reg_mm_proc_emi_req_mask_b = 0x0,
256*083cfadbSKun Lu .reg_mm_proc_infra_req_mask_b = 0x0,
257*083cfadbSKun Lu .reg_mm_proc_pmic_req_mask_b = 0x0,
258*083cfadbSKun Lu .reg_mm_proc_srcclkena_mask_b = 0x0,
259*083cfadbSKun Lu .reg_mm_proc_vrf18_req_mask_b = 0x0,
260*083cfadbSKun Lu .reg_mmsys_apsrc_req_mask_b = 0x0,
261*083cfadbSKun Lu .reg_mmsys_ddren_req_mask_b = 0x0,
262*083cfadbSKun Lu .reg_mmsys_vrf18_req_mask_b = 0x0,
263*083cfadbSKun Lu .reg_pcie0_apsrc_req_mask_b = 0x0,
264*083cfadbSKun Lu .reg_pcie0_ddren_req_mask_b = 0x0,
265*083cfadbSKun Lu .reg_pcie0_infra_req_mask_b = 0x0,
266*083cfadbSKun Lu .reg_pcie0_srcclkena_mask_b = 0x0,
267*083cfadbSKun Lu .reg_pcie0_vrf18_req_mask_b = 0x0,
268*083cfadbSKun Lu .reg_pcie1_apsrc_req_mask_b = 0x0,
269*083cfadbSKun Lu .reg_pcie1_ddren_req_mask_b = 0x0,
270*083cfadbSKun Lu .reg_pcie1_infra_req_mask_b = 0x0,
271*083cfadbSKun Lu .reg_pcie1_srcclkena_mask_b = 0x0,
272*083cfadbSKun Lu .reg_pcie1_vrf18_req_mask_b = 0x0,
273*083cfadbSKun Lu .reg_perisys_apsrc_req_mask_b = 0x1,
274*083cfadbSKun Lu .reg_perisys_ddren_req_mask_b = 0x1,
275*083cfadbSKun Lu .reg_perisys_emi_req_mask_b = 0x1,
276*083cfadbSKun Lu .reg_perisys_infra_req_mask_b = 0x1,
277*083cfadbSKun Lu .reg_perisys_pmic_req_mask_b = 0x1,
278*083cfadbSKun Lu .reg_perisys_srcclkena_mask_b = 0x1,
279*083cfadbSKun Lu .reg_perisys_vcore_req_mask_b = 0x1,
280*083cfadbSKun Lu .reg_perisys_vrf18_req_mask_b = 0x1,
281*083cfadbSKun Lu .reg_scp_apsrc_req_mask_b = 0x1,
282*083cfadbSKun Lu
283*083cfadbSKun Lu /* SPM_SRC_MASK_11 */
284*083cfadbSKun Lu .reg_scp_ddren_req_mask_b = 0x1,
285*083cfadbSKun Lu .reg_scp_emi_req_mask_b = 0x1,
286*083cfadbSKun Lu .reg_scp_infra_req_mask_b = 0x1,
287*083cfadbSKun Lu .reg_scp_pmic_req_mask_b = 0x1,
288*083cfadbSKun Lu .reg_scp_srcclkena_mask_b = 0x1,
289*083cfadbSKun Lu .reg_scp_vcore_req_mask_b = 0x1,
290*083cfadbSKun Lu .reg_scp_vrf18_req_mask_b = 0x1,
291*083cfadbSKun Lu .reg_srcclkeni_infra_req_mask_b = 0x1,
292*083cfadbSKun Lu .reg_srcclkeni_pmic_req_mask_b = 0x1,
293*083cfadbSKun Lu .reg_srcclkeni_srcclkena_mask_b = 0x1,
294*083cfadbSKun Lu .reg_sspm_apsrc_req_mask_b = 0x1,
295*083cfadbSKun Lu .reg_sspm_ddren_req_mask_b = 0x1,
296*083cfadbSKun Lu .reg_sspm_emi_req_mask_b = 0x1,
297*083cfadbSKun Lu .reg_sspm_infra_req_mask_b = 0x1,
298*083cfadbSKun Lu .reg_sspm_pmic_req_mask_b = 0x1,
299*083cfadbSKun Lu .reg_sspm_srcclkena_mask_b = 0x1,
300*083cfadbSKun Lu .reg_sspm_vrf18_req_mask_b = 0x1,
301*083cfadbSKun Lu .reg_ssr_apsrc_req_mask_b = 0x0,
302*083cfadbSKun Lu .reg_ssr_ddren_req_mask_b = 0x0,
303*083cfadbSKun Lu .reg_ssr_emi_req_mask_b = 0x0,
304*083cfadbSKun Lu .reg_ssr_infra_req_mask_b = 0x0,
305*083cfadbSKun Lu .reg_ssr_pmic_req_mask_b = 0x0,
306*083cfadbSKun Lu .reg_ssr_srcclkena_mask_b = 0x0,
307*083cfadbSKun Lu .reg_ssr_vrf18_req_mask_b = 0x0,
308*083cfadbSKun Lu .reg_ufs_apsrc_req_mask_b = 0x1,
309*083cfadbSKun Lu .reg_ufs_ddren_req_mask_b = 0x1,
310*083cfadbSKun Lu .reg_ufs_emi_req_mask_b = 0x1,
311*083cfadbSKun Lu .reg_ufs_infra_req_mask_b = 0x1,
312*083cfadbSKun Lu .reg_ufs_pmic_req_mask_b = 0x1,
313*083cfadbSKun Lu
314*083cfadbSKun Lu /* SPM_SRC_MASK_12 */
315*083cfadbSKun Lu .reg_ufs_srcclkena_mask_b = 0x1,
316*083cfadbSKun Lu .reg_ufs_vrf18_req_mask_b = 0x1,
317*083cfadbSKun Lu .reg_vdec_apsrc_req_mask_b = 0x1,
318*083cfadbSKun Lu .reg_vdec_ddren_req_mask_b = 0x1,
319*083cfadbSKun Lu .reg_vdec_emi_req_mask_b = 0x1,
320*083cfadbSKun Lu .reg_vdec_infra_req_mask_b = 0x0,
321*083cfadbSKun Lu .reg_vdec_pmic_req_mask_b = 0x0,
322*083cfadbSKun Lu .reg_vdec_srcclkena_mask_b = 0x0,
323*083cfadbSKun Lu .reg_vdec_vrf18_req_mask_b = 0x0,
324*083cfadbSKun Lu .reg_venc_apsrc_req_mask_b = 0x1,
325*083cfadbSKun Lu .reg_venc_ddren_req_mask_b = 0x1,
326*083cfadbSKun Lu .reg_venc_emi_req_mask_b = 0x1,
327*083cfadbSKun Lu .reg_venc_infra_req_mask_b = 0x0,
328*083cfadbSKun Lu .reg_venc_pmic_req_mask_b = 0x0,
329*083cfadbSKun Lu .reg_venc_srcclkena_mask_b = 0x0,
330*083cfadbSKun Lu .reg_venc_vrf18_req_mask_b = 0x0,
331*083cfadbSKun Lu .reg_ipe_apsrc_req_mask_b = 0x1,
332*083cfadbSKun Lu .reg_ipe_ddren_req_mask_b = 0x1,
333*083cfadbSKun Lu .reg_ipe_emi_req_mask_b = 0x1,
334*083cfadbSKun Lu .reg_ipe_infra_req_mask_b = 0x1,
335*083cfadbSKun Lu .reg_ipe_pmic_req_mask_b = 0x1,
336*083cfadbSKun Lu .reg_ipe_srcclkena_mask_b = 0x1,
337*083cfadbSKun Lu .reg_ipe_vrf18_req_mask_b = 0x1,
338*083cfadbSKun Lu .reg_ufs_vcore_req_mask_b = 0x1,
339*083cfadbSKun Lu
340*083cfadbSKun Lu /* SPM_EVENT_CON_MISC */
341*083cfadbSKun Lu .reg_srcclken_fast_resp = 0,
342*083cfadbSKun Lu .reg_csyspwrup_ack_mask = 1,
343*083cfadbSKun Lu
344*083cfadbSKun Lu /* Auto-gen End */
345*083cfadbSKun Lu
346*083cfadbSKun Lu /* SPM_WAKEUP_EVENT_MASK */
347*083cfadbSKun Lu .reg_wakeup_event_mask = 0xC1B33012,
348*083cfadbSKun Lu
349*083cfadbSKun Lu /* SPM_WAKEUP_EVENT_EXT_MASK */
350*083cfadbSKun Lu .reg_ext_wakeup_event_mask = 0xFFFFFFFF,
351*083cfadbSKun Lu };
352*083cfadbSKun Lu
353*083cfadbSKun Lu static struct dbg_ctrl idle_spm_dbg = {
354*083cfadbSKun Lu .count = 0,
355*083cfadbSKun Lu .duration = 0,
356*083cfadbSKun Lu .ext = NULL,
357*083cfadbSKun Lu };
358*083cfadbSKun Lu
359*083cfadbSKun Lu static struct spm_lp_stat idle_lp_stat;
360*083cfadbSKun Lu
361*083cfadbSKun Lu static struct spm_lp_scen idle_spm_lp = {
362*083cfadbSKun Lu .pwrctrl = &idle_spm_pwr,
363*083cfadbSKun Lu .dbgctrl = &idle_spm_dbg,
364*083cfadbSKun Lu .lpstat = &idle_lp_stat,
365*083cfadbSKun Lu };
366*083cfadbSKun Lu
mt_spm_idle_generic_enter(int state_id,uint32_t ext_opand,spm_idle_conduct fn)367*083cfadbSKun Lu int mt_spm_idle_generic_enter(int state_id, uint32_t ext_opand,
368*083cfadbSKun Lu spm_idle_conduct fn)
369*083cfadbSKun Lu {
370*083cfadbSKun Lu int ret = 0;
371*083cfadbSKun Lu uint32_t src_req = 0;
372*083cfadbSKun Lu struct mt_lp_publish_event event = {
373*083cfadbSKun Lu .id = MT_LPM_PUBEVENTS_SYS_POWER_OFF,
374*083cfadbSKun Lu .val.u32 = 0,
375*083cfadbSKun Lu .level = 0,
376*083cfadbSKun Lu };
377*083cfadbSKun Lu
378*083cfadbSKun Lu if (fn)
379*083cfadbSKun Lu fn(state_id, &idle_spm_lp, &src_req);
380*083cfadbSKun Lu
381*083cfadbSKun Lu ret = spm_conservation(state_id, ext_opand, &idle_spm_lp, src_req);
382*083cfadbSKun Lu
383*083cfadbSKun Lu if (ret) {
384*083cfadbSKun Lu NOTICE("[%s:%d] - unknown issue !!\n", __func__, __LINE__);
385*083cfadbSKun Lu panic();
386*083cfadbSKun Lu }
387*083cfadbSKun Lu
388*083cfadbSKun Lu if (ext_opand & MT_SPM_EX_OP_DEVICES_SAVE) {
389*083cfadbSKun Lu mmio_write_32(SPM2SW_MAILBOX_0, 0x1);
390*083cfadbSKun Lu MT_LP_SUSPEND_PUBLISH_EVENT(&event);
391*083cfadbSKun Lu } else
392*083cfadbSKun Lu MT_LP_PUBLISH_EVENT(&event);
393*083cfadbSKun Lu return ret;
394*083cfadbSKun Lu }
395*083cfadbSKun Lu
mt_spm_idle_generic_resume(int state_id,uint32_t ext_opand,struct wake_status ** status,spm_idle_conduct_restore fn)396*083cfadbSKun Lu void mt_spm_idle_generic_resume(int state_id, uint32_t ext_opand,
397*083cfadbSKun Lu struct wake_status **status,
398*083cfadbSKun Lu spm_idle_conduct_restore fn)
399*083cfadbSKun Lu {
400*083cfadbSKun Lu struct mt_lp_publish_event event = {
401*083cfadbSKun Lu .id = MT_LPM_PUBEVENTS_SYS_POWER_ON,
402*083cfadbSKun Lu .val.u32 = 0,
403*083cfadbSKun Lu };
404*083cfadbSKun Lu
405*083cfadbSKun Lu ext_opand |= (MT_SPM_EX_OP_TIME_CHECK | MT_SPM_EX_OP_TIME_OBS);
406*083cfadbSKun Lu spm_conservation_finish(state_id, ext_opand, &idle_spm_lp, status);
407*083cfadbSKun Lu
408*083cfadbSKun Lu mt_spm_update_lp_stat(&idle_lp_stat);
409*083cfadbSKun Lu
410*083cfadbSKun Lu if (spm_unlikely(fn))
411*083cfadbSKun Lu fn(state_id, &idle_spm_lp, *status);
412*083cfadbSKun Lu
413*083cfadbSKun Lu if (ext_opand & MT_SPM_EX_OP_DEVICES_SAVE) {
414*083cfadbSKun Lu mmio_write_32(SPM2SW_MAILBOX_0, 0x0);
415*083cfadbSKun Lu MT_LP_SUSPEND_PUBLISH_EVENT(&event);
416*083cfadbSKun Lu } else
417*083cfadbSKun Lu MT_LP_PUBLISH_EVENT(&event);
418*083cfadbSKun Lu }
419*083cfadbSKun Lu
mt_spm_idle_generic_get_spm_lp(struct spm_lp_scen ** lp)420*083cfadbSKun Lu int mt_spm_idle_generic_get_spm_lp(struct spm_lp_scen **lp)
421*083cfadbSKun Lu {
422*083cfadbSKun Lu if (!lp)
423*083cfadbSKun Lu return -1;
424*083cfadbSKun Lu
425*083cfadbSKun Lu *lp = &idle_spm_lp;
426*083cfadbSKun Lu return 0;
427*083cfadbSKun Lu }
428