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_COMMON_V1_H
8*532ac057SKun Lu #define MT_SPM_COMMON_V1_H
9*532ac057SKun Lu
10*532ac057SKun Lu #include <common/debug.h>
11*532ac057SKun Lu
12*532ac057SKun Lu struct spm_hwcg_info {
13*532ac057SKun Lu uint32_t pwr;
14*532ac057SKun Lu uint32_t pwr_msb;
15*532ac057SKun Lu uint32_t module_busy;
16*532ac057SKun Lu };
17*532ac057SKun Lu
18*532ac057SKun Lu #define HWCG_INFO_INIT(_info) \
19*532ac057SKun Lu ({ _info.pwr = _info.pwr_msb = _info.module_busy = 0; })
20*532ac057SKun Lu
21*532ac057SKun Lu #define DECLARE_HWCG_REG(_name_, _info) ({ \
22*532ac057SKun Lu _info.pwr = REG_PWR_STATUS_##_name_##_REQ_MASK; \
23*532ac057SKun Lu _info.pwr_msb = REG_PWR_STATUS_MSB_##_name_##_REQ_MASK; \
24*532ac057SKun Lu _info.module_busy = REG_MODULE_BUSY_##_name_##_REQ_MASK; })
25*532ac057SKun Lu
26*532ac057SKun Lu #define DECLARE_HWCG_DEFAULT(_name_, _info) ({ \
27*532ac057SKun Lu _info.pwr = SPM_HWCG_##_name_##_PWR_MB; \
28*532ac057SKun Lu _info.pwr_msb = SPM_HWCG_##_name_##_PWR_MSB_MB; \
29*532ac057SKun Lu _info.module_busy = SPM_HWCG_##_name_##_MODULE_BUSY_MB; })
30*532ac057SKun Lu
31*532ac057SKun Lu #define PERI_REQ_EN_INFO_INIT(_info) ({ _info.req_en = 0; })
32*532ac057SKun Lu
33*532ac057SKun Lu #define PERI_REQ_STA_INFO_INIT(_info) ({ _info.req_sta = 0; })
34*532ac057SKun Lu
35*532ac057SKun Lu #define DECLARE_PERI_REQ_EN_REG(_offset, _info) \
36*532ac057SKun Lu ({ _info.req_en = REG_PERI_REQ_EN(_offset); })
37*532ac057SKun Lu
38*532ac057SKun Lu #define DECLARE_PERI_REQ_STA_REG(_offset, _info) \
39*532ac057SKun Lu ({ _info.req_sta = REG_PERI_REQ_STA(_offset); })
40*532ac057SKun Lu
41*532ac057SKun Lu #define DECLARE_PERI_REQ_DEFAULT(_name_, _info) \
42*532ac057SKun Lu ({ _info.req_en = PERI_REQ_##_name_##_MB; })
43*532ac057SKun Lu
44*532ac057SKun Lu #define CTRL0_SC_26M_CK_OFF BIT(0)
45*532ac057SKun Lu #define CTRL0_SC_VLP_BUS_CK_OFF BIT(1)
46*532ac057SKun Lu #define CTRL0_SC_PMIF_CK_OFF BIT(2)
47*532ac057SKun Lu #define CTRL0_SC_AXI_CK_OFF BIT(3)
48*532ac057SKun Lu #define CTRL0_SC_AXI_MEM_CK_OFF BIT(4)
49*532ac057SKun Lu #define CTRL0_SC_MD26M_CK_OFF BIT(5)
50*532ac057SKun Lu #define CTRL0_SC_MD32K_CK_OFF BIT(6)
51*532ac057SKun Lu #define CTRL0_SC_VLP_26M_CLK_SEL BIT(7)
52*532ac057SKun Lu #define CTRL0_SC_26M_CK_SEL BIT(8)
53*532ac057SKun Lu #define CTRL0_SC_TOP_26M_CLK_SEL BIT(9)
54*532ac057SKun Lu #define CTRL0_SC_SYS_TIMER_CLK_32K_SEL BIT(10)
55*532ac057SKun Lu #define CTRL0_SC_CIRQ_CLK_32K_SEL BIT(11)
56*532ac057SKun Lu #define CTRL0_SC_AXI_DCM_DIS BIT(12)
57*532ac057SKun Lu #define CTRL0_SC_CKSQ0_OFF BIT(13)
58*532ac057SKun Lu #define CTRL0_SC_CKSQ1_OFF BIT(14)
59*532ac057SKun Lu #define CTRL0_VCORE_PWR_ISO BIT(15)
60*532ac057SKun Lu #define CTRL0_VCORE_PWR_ISO_PRE BIT(16)
61*532ac057SKun Lu #define CTRL0_VCORE_PWR_RST_B BIT(17)
62*532ac057SKun Lu #define CTRL0_VCORE_RESTORE_ENABLE BIT(18)
63*532ac057SKun Lu #define CTRL0_SC_TOP_RESTORE_26M_CLK_SEL BIT(19)
64*532ac057SKun Lu #define CTRL0_AOC_VCORE_SRAM_ISO_DIN BIT(20)
65*532ac057SKun Lu #define CTRL0_AOC_VCORE_SRAM_LATCH_ENB BIT(21)
66*532ac057SKun Lu #define CTRL0_AOC_VCORE_ANA_ISO BIT(22)
67*532ac057SKun Lu #define CTRL0_AOC_VCORE_ANA_ISO_PRE BIT(23)
68*532ac057SKun Lu #define CTRL0_AOC_VLPTOP_SRAM_ISO_DIN BIT(24)
69*532ac057SKun Lu #define CTRL0_AOC_VLPTOP_SRAM_LATCH_ENB BIT(25)
70*532ac057SKun Lu #define CTRL0_AOC_VCORE_IO_ISO BIT(26)
71*532ac057SKun Lu #define CTRL0_AOC_VCORE_IO_LATCH_ENB BIT(27)
72*532ac057SKun Lu #define CTRL0_RTFF_VCORE_SAVE BIT(28)
73*532ac057SKun Lu #define CTRL0_RTFF_VCORE_NRESTORE BIT(29)
74*532ac057SKun Lu #define CTRL0_RTFF_VCORE_CLK_DIS BIT(30)
75*532ac057SKun Lu
76*532ac057SKun Lu /* MD32PCM_CTRL1 define */
77*532ac057SKun Lu #define CTRL1_PWRAP_SLEEP_REQ BIT(0)
78*532ac057SKun Lu #define CTRL1_IM_SLP_EN BIT(1)
79*532ac057SKun Lu #define CTRL1_SPM_LEAVE_VCORE_OFF_REQ BIT(2)
80*532ac057SKun Lu #define CTRL1_SPM_CK_SEL0 BIT(4)
81*532ac057SKun Lu #define CTRL1_SPM_CK_SEL1 BIT(5)
82*532ac057SKun Lu #define CTRL1_TIMER_SET BIT(6)
83*532ac057SKun Lu #define CTRL1_TIMER_CLR BIT(7)
84*532ac057SKun Lu #define CTRL1_SPM_LEAVE_DEEPIDLE_REQ BIT(8)
85*532ac057SKun Lu #define CTRL1_SPM_LEAVE_SUSPEND_REQ BIT(9)
86*532ac057SKun Lu #define CTRL1_CSYSPWRUPACK BIT(10)
87*532ac057SKun Lu #define CTRL1_SRCCLKENO0 BIT(11)
88*532ac057SKun Lu #define CTRL1_SRCCLKENO1 BIT(12)
89*532ac057SKun Lu #define CTRL1_SRCCLKENO2 BIT(13)
90*532ac057SKun Lu #define CTRL1_SPM_APSRC_INTERNAL_ACK BIT(14)
91*532ac057SKun Lu #define CTRL1_SPM_EMI_INTERNAL_ACK BIT(15)
92*532ac057SKun Lu #define CTRL1_SPM_DDREN_INTERNAL_ACK BIT(16)
93*532ac057SKun Lu #define CTRL1_SPM_INFRA_INTERNAL_ACK BIT(17)
94*532ac057SKun Lu #define CTRL1_SPM_VRF18_INTERNAL_ACK BIT(18)
95*532ac057SKun Lu #define CTRL1_SPM_VCORE_INTERNAL_ACK BIT(19)
96*532ac057SKun Lu #define CTRL1_SPM_VCORE_RESTORE_ACK BIT(20)
97*532ac057SKun Lu #define CTRL1_SPM_PMIC_INTERNAL_ACK BIT(21)
98*532ac057SKun Lu #define CTRL1_PMIC_IRQ_REQ_EN BIT(22)
99*532ac057SKun Lu #define CTRL1_WDT_KICK_P BIT(23)
100*532ac057SKun Lu #define CTRL1_FORCE_DDREN_WAKE BIT(24)
101*532ac057SKun Lu #define CTRL1_FORCE_F26M_WAKE BIT(25)
102*532ac057SKun Lu #define CTRL1_FORCE_APSRC_WAKE BIT(26)
103*532ac057SKun Lu #define CTRL1_FORCE_INFRA_WAKE BIT(27)
104*532ac057SKun Lu #define CTRL1_FORCE_VRF18_WAKE BIT(28)
105*532ac057SKun Lu #define CTRL1_FORCE_VCORE_WAKE BIT(29)
106*532ac057SKun Lu #define CTRL1_FORCE_EMI_WAKE BIT(30)
107*532ac057SKun Lu #define CTRL1_FORCE_PMIC_WAKE BIT(31)
108*532ac057SKun Lu
109*532ac057SKun Lu /* MD32PCM_CTRL2 define (PCM_REG2_DATA) */
110*532ac057SKun Lu #define CTRL2_MD32PCM_IRQ_TRIG_BIT BIT(31)
111*532ac057SKun Lu
112*532ac057SKun Lu /* MD32PCM_STA0 define */
113*532ac057SKun Lu #define STA0_SRCCLKENI0 BIT(0)
114*532ac057SKun Lu #define STA0_SRCCLKENI1 BIT(1)
115*532ac057SKun Lu #define STA0_MD_SRCCLKENA BIT(2)
116*532ac057SKun Lu #define STA0_MD_SRCCLKENA1 BIT(3)
117*532ac057SKun Lu #define STA0_MD_DDREN_REQ BIT(4)
118*532ac057SKun Lu #define STA0_CONN_DDREN_REQ BIT(5)
119*532ac057SKun Lu #define STA0_SSPM_SRCCLKENA BIT(6)
120*532ac057SKun Lu #define STA0_SSPM_APSRC_REQ BIT(7)
121*532ac057SKun Lu #define STA0_MD_STATE BIT(8)
122*532ac057SKun Lu #define STA0_RC2SPM_SRCCLKENO_0_ACK BIT(9)
123*532ac057SKun Lu #define STA0_MM_STATE BIT(10)
124*532ac057SKun Lu #define STA0_SSPM_STATE BIT(11)
125*532ac057SKun Lu #define STA0_CPUEB_STATE BIT(12)
126*532ac057SKun Lu #define STA0_CONN_STATE BIT(13)
127*532ac057SKun Lu #define STA0_CONN_VCORE_REQ BIT(14)
128*532ac057SKun Lu #define STA0_CONN_SRCCLKENA BIT(15)
129*532ac057SKun Lu #define STA0_CONN_SRCCLKENB BIT(16)
130*532ac057SKun Lu #define STA0_CONN_APSRC_REQ BIT(17)
131*532ac057SKun Lu #define STA0_SCP_STATE BIT(18)
132*532ac057SKun Lu #define STA0_CSYSPWRUPREQ BIT(19)
133*532ac057SKun Lu #define STA0_PWRAP_SLEEP_ACK BIT(20)
134*532ac057SKun Lu #define STA0_DPM_STATE BIT(21)
135*532ac057SKun Lu #define STA0_AUDIO_DSP_STATE BIT(22)
136*532ac057SKun Lu #define STA0_PMIC_IRQ_ACK BIT(23)
137*532ac057SKun Lu #define STA0_RESERVED_BIT_24 BIT(24)
138*532ac057SKun Lu #define STA0_RESERVED_BIT_25 BIT(25)
139*532ac057SKun Lu #define STA0_RESERVED_BIT_26 BIT(26)
140*532ac057SKun Lu #define STA0_DVFS_STATE BIT(27)
141*532ac057SKun Lu #define STA0_RESERVED_BIT_28 BIT(28)
142*532ac057SKun Lu #define STA0_RESERVED_BIT_29 BIT(29)
143*532ac057SKun Lu #define STA0_SC_HW_S1_ACK_ALL BIT(30)
144*532ac057SKun Lu #define STA0_DDREN_STATE BIT(31)
145*532ac057SKun Lu
146*532ac057SKun Lu #define R12_PCM_TIMER_B BIT(0)
147*532ac057SKun Lu #define R12_TWAM_PMSR_DVFSRC_ALCO BIT(1)
148*532ac057SKun Lu #define R12_KP_IRQ_B BIT(2)
149*532ac057SKun Lu #define R12_APWDT_EVENT_B BIT(3)
150*532ac057SKun Lu #define R12_APXGPT_EVENT_B BIT(4)
151*532ac057SKun Lu #define R12_CONN2AP_WAKEUP_B BIT(5)
152*532ac057SKun Lu #define R12_EINT_EVENT_B BIT(6)
153*532ac057SKun Lu #define R12_CONN_WDT_IRQ_B BIT(7)
154*532ac057SKun Lu #define R12_CCIF0_EVENT_B BIT(8)
155*532ac057SKun Lu #define R12_CCIF1_EVENT_B BIT(9)
156*532ac057SKun Lu #define R12_SSPM2SPM_WAKEUP_B BIT(10)
157*532ac057SKun Lu #define R12_SCP2SPM_WAKEUP_B BIT(11)
158*532ac057SKun Lu #define R12_ADSP2SPM_WAKEUP_B BIT(12)
159*532ac057SKun Lu #define R12_PCM_WDT_WAKEUP_B BIT(13)
160*532ac057SKun Lu #define R12_USB0_CDSC_B BIT(14)
161*532ac057SKun Lu #define R12_USB0_POWERDWN_B BIT(15)
162*532ac057SKun Lu #define R12_UART_EVENT_B BIT(16)
163*532ac057SKun Lu #define R12_DEBUGTOP_FLAG_IRQ_B BIT(17)
164*532ac057SKun Lu #define R12_SYS_TIMER_EVENT_B BIT(18)
165*532ac057SKun Lu #define R12_EINT_EVENT_SECURE_B BIT(19)
166*532ac057SKun Lu #define R12_AFE_IRQ_MCU_B BIT(20)
167*532ac057SKun Lu #define R12_THERM_CTRL_EVENT_B BIT(21)
168*532ac057SKun Lu #define R12_SYS_CIRQ_IRQ_B BIT(22)
169*532ac057SKun Lu #define R12_PBUS_EVENT_B BIT(23)
170*532ac057SKun Lu #define R12_CSYSPWREQ_B BIT(24)
171*532ac057SKun Lu #define R12_MD_WDT_B BIT(25)
172*532ac057SKun Lu #define R12_AP2AP_PEER_WAKEUP_B BIT(26)
173*532ac057SKun Lu #define R12_SEJ_B BIT(27)
174*532ac057SKun Lu #define R12_CPU_WAKEUP BIT(28)
175*532ac057SKun Lu #define R12_APUSYS_WAKE_HOST_B BIT(29)
176*532ac057SKun Lu #define R12_PCIE_WAKE_B BIT(30)
177*532ac057SKun Lu #define R12_MSDC_WAKE_B BIT(31)
178*532ac057SKun Lu
179*532ac057SKun Lu /* PCM_PWR_IO_EN */
180*532ac057SKun Lu #define PCM_PWRIO_EN_R0 BIT(0)
181*532ac057SKun Lu #define PCM_PWRIO_EN_R7 BIT(7)
182*532ac057SKun Lu #define PCM_RF_SYNC_R0 BIT(16)
183*532ac057SKun Lu #define PCM_RF_SYNC_R6 BIT(22)
184*532ac057SKun Lu #define PCM_RF_SYNC_R7 BIT(23)
185*532ac057SKun Lu
186*532ac057SKun Lu /* SPM_SWINT */
187*532ac057SKun Lu #define PCM_SW_INT0 BIT(0)
188*532ac057SKun Lu #define PCM_SW_INT1 BIT(1)
189*532ac057SKun Lu #define PCM_SW_INT2 BIT(2)
190*532ac057SKun Lu #define PCM_SW_INT3 BIT(3)
191*532ac057SKun Lu #define PCM_SW_INT4 BIT(4)
192*532ac057SKun Lu #define PCM_SW_INT5 BIT(5)
193*532ac057SKun Lu #define PCM_SW_INT6 BIT(6)
194*532ac057SKun Lu #define PCM_SW_INT7 BIT(7)
195*532ac057SKun Lu #define PCM_SW_INT8 BIT(8)
196*532ac057SKun Lu #define PCM_SW_INT9 BIT(9)
197*532ac057SKun Lu
198*532ac057SKun Lu #define PCM_SW_INT_ALL (PCM_SW_INT9 | PCM_SW_INT8 | PCM_SW_INT7 | \
199*532ac057SKun Lu PCM_SW_INT6 | PCM_SW_INT5 | PCM_SW_INT4 | \
200*532ac057SKun Lu PCM_SW_INT3 | PCM_SW_INT2 | PCM_SW_INT1 | \
201*532ac057SKun Lu PCM_SW_INT0)
202*532ac057SKun Lu
203*532ac057SKun Lu /* SPM_AP_STANDBY_CON */
204*532ac057SKun Lu #define WFI_OP_AND 1
205*532ac057SKun Lu #define WFI_OP_OR 0
206*532ac057SKun Lu
207*532ac057SKun Lu /* SPM_IRQ_MASK */
208*532ac057SKun Lu #define ISRM_TWAM BIT(2)
209*532ac057SKun Lu #define ISRM_PCM_RETURN BIT(3)
210*532ac057SKun Lu #define ISRM_RET_IRQ0 BIT(8)
211*532ac057SKun Lu #define ISRM_RET_IRQ1 BIT(9)
212*532ac057SKun Lu #define ISRM_RET_IRQ2 BIT(10)
213*532ac057SKun Lu #define ISRM_RET_IRQ3 BIT(11)
214*532ac057SKun Lu #define ISRM_RET_IRQ4 BIT(12)
215*532ac057SKun Lu #define ISRM_RET_IRQ5 BIT(13)
216*532ac057SKun Lu #define ISRM_RET_IRQ6 BIT(14)
217*532ac057SKun Lu #define ISRM_RET_IRQ7 BIT(15)
218*532ac057SKun Lu #define ISRM_RET_IRQ8 BIT(16)
219*532ac057SKun Lu #define ISRM_RET_IRQ9 BIT(17)
220*532ac057SKun Lu #define ISRM_RET_IRQ_AUX ((ISRM_RET_IRQ9) | (ISRM_RET_IRQ8) | \
221*532ac057SKun Lu (ISRM_RET_IRQ7) | (ISRM_RET_IRQ6) | \
222*532ac057SKun Lu (ISRM_RET_IRQ5) | (ISRM_RET_IRQ4) | \
223*532ac057SKun Lu (ISRM_RET_IRQ3) | (ISRM_RET_IRQ2) | \
224*532ac057SKun Lu (ISRM_RET_IRQ1))
225*532ac057SKun Lu #define ISRM_ALL_EXC_TWAM (ISRM_RET_IRQ_AUX)
226*532ac057SKun Lu #define ISRM_ALL (ISRM_ALL_EXC_TWAM | ISRM_TWAM)
227*532ac057SKun Lu
228*532ac057SKun Lu /* SPM_IRQ_STA */
229*532ac057SKun Lu #define ISRS_TWAM BIT(2)
230*532ac057SKun Lu #define ISRS_PCM_RETURN BIT(3)
231*532ac057SKun Lu #define ISRC_TWAM ISRS_TWAM
232*532ac057SKun Lu #define ISRC_ALL_EXC_TWAM ISRS_PCM_RETURN
233*532ac057SKun Lu #define ISRC_ALL (ISRC_ALL_EXC_TWAM | ISRC_TWAM)
234*532ac057SKun Lu
235*532ac057SKun Lu /* SPM_WAKEUP_MISC */
236*532ac057SKun Lu #define WAKE_MISC_GIC_WAKEUP 0x3FF /* bit0 ~ bit9 */
237*532ac057SKun Lu #define WAKE_MISC_DVFSRC_IRQ DVFSRC_IRQ_LSB
238*532ac057SKun Lu #define WAKE_MISC_REG_CPU_WAKEUP SPM_WAKEUP_MISC_REG_CPU_WAKEUP_LSB
239*532ac057SKun Lu #define WAKE_MISC_PCM_TIMER_EVENT PCM_TIMER_EVENT_LSB
240*532ac057SKun Lu #define WAKE_MISC_PMIC_OUT_B (BIT(19) | BIT(20))
241*532ac057SKun Lu #define WAKE_MISC_TWAM_IRQ_B TWAM_IRQ_B_LSB
242*532ac057SKun Lu #define WAKE_MISC_SPM_ACK_CHK_WAKEUP_0 SPM_ACK_CHK_WAKEUP_0_LSB
243*532ac057SKun Lu #define WAKE_MISC_SPM_ACK_CHK_WAKEUP_1 SPM_ACK_CHK_WAKEUP_1_LSB
244*532ac057SKun Lu #define WAKE_MISC_SPM_ACK_CHK_WAKEUP_2 SPM_ACK_CHK_WAKEUP_2_LSB
245*532ac057SKun Lu #define WAKE_MISC_SPM_ACK_CHK_WAKEUP_3 SPM_ACK_CHK_WAKEUP_3_LSB
246*532ac057SKun Lu #define WAKE_MISC_SPM_ACK_CHK_WAKEUP_ALL SPM_ACK_CHK_WAKEUP_ALL_LSB
247*532ac057SKun Lu #define WAKE_MISC_PMIC_IRQ_ACK PMIC_IRQ_ACK_LSB
248*532ac057SKun Lu #define WAKE_MISC_PMIC_SCP_IRQ PMIC_SCP_IRQ_LSB
249*532ac057SKun Lu
250*532ac057SKun Lu #define SPM_INTERNAL_STATUS_HW_S1 BIT(0)
251*532ac057SKun Lu
252*532ac057SKun Lu /* Signal that monitor by HW CG */
253*532ac057SKun Lu enum spm_hwcg_setting {
254*532ac057SKun Lu HWCG_PWR,
255*532ac057SKun Lu HWCG_PWR_MSB,
256*532ac057SKun Lu HWCG_MODULE_BUSY,
257*532ac057SKun Lu HWCG_SETTING_MAX
258*532ac057SKun Lu };
259*532ac057SKun Lu
260*532ac057SKun Lu enum spm_hwcg_sta_type {
261*532ac057SKun Lu HWCG_STA_DEFAULT_MASK,
262*532ac057SKun Lu HWCG_STA_MASK
263*532ac057SKun Lu };
264*532ac057SKun Lu
265*532ac057SKun Lu enum spm_peri_req_setting {
266*532ac057SKun Lu PERI_REQ_EN = 0,
267*532ac057SKun Lu PERI_REQ_SETTING_MAX
268*532ac057SKun Lu };
269*532ac057SKun Lu
270*532ac057SKun Lu enum spm_peri_req_sta_type {
271*532ac057SKun Lu PERI_REQ_STA_DEFAULT_MASK,
272*532ac057SKun Lu PERI_REQ_STA_MASK,
273*532ac057SKun Lu PERI_REQ_STA_MAX
274*532ac057SKun Lu };
275*532ac057SKun Lu
276*532ac057SKun Lu enum spm_peri_req_status {
277*532ac057SKun Lu PERI_RES_REQ_EN,
278*532ac057SKun Lu PERI_REQ_STATUS_MAX
279*532ac057SKun Lu };
280*532ac057SKun Lu
281*532ac057SKun Lu enum spm_peri_req_status_raw {
282*532ac057SKun Lu PERI_REQ_STATUS_RAW_NUM,
283*532ac057SKun Lu PERI_REQ_STATUS_RAW_NAME,
284*532ac057SKun Lu PERI_REQ_STATUS_RAW_STA,
285*532ac057SKun Lu PERI_REQ_STATUS_RAW_MAX
286*532ac057SKun Lu };
287*532ac057SKun Lu
288*532ac057SKun Lu #define MT_SPM_HW_CG_STA_INIT(_x) ({ if (_x) _x->sta = 0; })
289*532ac057SKun Lu
290*532ac057SKun Lu struct spm_peri_req_sta {
291*532ac057SKun Lu uint32_t sta;
292*532ac057SKun Lu };
293*532ac057SKun Lu
294*532ac057SKun Lu struct spm_peri_req_info {
295*532ac057SKun Lu uint32_t req_en;
296*532ac057SKun Lu uint32_t req_sta;
297*532ac057SKun Lu };
298*532ac057SKun Lu
299*532ac057SKun Lu struct spm_hwcg_sta {
300*532ac057SKun Lu uint32_t sta;
301*532ac057SKun Lu };
302*532ac057SKun Lu
303*532ac057SKun Lu void spm_hwreq_init(void);
304*532ac057SKun Lu
305*532ac057SKun Lu /* Res:
306*532ac057SKun Lu * Please refer the mt_spm_resource_req.h.
307*532ac057SKun Lu * Section of SPM resource request internal bit_mask.
308*532ac057SKun Lu */
309*532ac057SKun Lu void spm_hwcg_ctrl(uint32_t res, enum spm_hwcg_setting type,
310*532ac057SKun Lu uint32_t is_set, uint32_t val);
311*532ac057SKun Lu
312*532ac057SKun Lu /* Idx:
313*532ac057SKun Lu * index of HWCG setting.
314*532ac057SKun Lu */
315*532ac057SKun Lu void spm_hwcg_ctrl_by_index(uint32_t idx, enum spm_hwcg_setting type,
316*532ac057SKun Lu uint32_t is_set, uint32_t val);
317*532ac057SKun Lu
318*532ac057SKun Lu /* Res:
319*532ac057SKun Lu * Please refer the mt_spm_resource_req.h.
320*532ac057SKun Lu * Section of SPM resource request internal bit_mask.
321*532ac057SKun Lu */
322*532ac057SKun Lu int spm_hwcg_get_setting(uint32_t res, enum spm_hwcg_sta_type sta_type,
323*532ac057SKun Lu enum spm_hwcg_setting type,
324*532ac057SKun Lu struct spm_hwcg_sta *sta);
325*532ac057SKun Lu
326*532ac057SKun Lu /* Idx:
327*532ac057SKun Lu * index of HWCG setting.
328*532ac057SKun Lu */
329*532ac057SKun Lu int spm_hwcg_get_setting_by_index(uint32_t idx,
330*532ac057SKun Lu enum spm_hwcg_sta_type sta_type,
331*532ac057SKun Lu enum spm_hwcg_setting type,
332*532ac057SKun Lu struct spm_hwcg_sta *sta);
333*532ac057SKun Lu
334*532ac057SKun Lu uint32_t spm_hwcg_get_status(uint32_t idx, enum spm_hwcg_setting type);
335*532ac057SKun Lu
spm_hwcg_setting_num(void)336*532ac057SKun Lu static inline uint32_t spm_hwcg_setting_num(void)
337*532ac057SKun Lu {
338*532ac057SKun Lu return HWCG_SETTING_MAX;
339*532ac057SKun Lu }
340*532ac057SKun Lu
341*532ac057SKun Lu uint32_t spm_peri_req_get_status(uint32_t idx, enum spm_peri_req_status type);
342*532ac057SKun Lu uint32_t spm_peri_req_get_status_raw(enum spm_peri_req_status_raw type,
343*532ac057SKun Lu uint32_t idx,
344*532ac057SKun Lu char *name, size_t sz);
345*532ac057SKun Lu
spm_peri_req_setting_num(void)346*532ac057SKun Lu static inline uint32_t spm_peri_req_setting_num(void)
347*532ac057SKun Lu {
348*532ac057SKun Lu return PERI_REQ_SETTING_MAX;
349*532ac057SKun Lu }
350*532ac057SKun Lu
351*532ac057SKun Lu int spm_peri_req_get_setting_by_index(uint32_t idx,
352*532ac057SKun Lu enum spm_peri_req_sta_type sta_type,
353*532ac057SKun Lu struct spm_peri_req_sta *sta);
354*532ac057SKun Lu
355*532ac057SKun Lu void spm_peri_req_ctrl_by_index(uint32_t idx,
356*532ac057SKun Lu uint32_t is_set, uint32_t val);
357*532ac057SKun Lu
358*532ac057SKun Lu int spm_peri_req_name(uint32_t idex, char *name, size_t sz);
359*532ac057SKun Lu
360*532ac057SKun Lu #ifdef __GNUC__
361*532ac057SKun Lu #define spm_likely(x) __builtin_expect(!!(x), 1)
362*532ac057SKun Lu #define spm_unlikely(x) __builtin_expect(!!(x), 0)
363*532ac057SKun Lu #else
364*532ac057SKun Lu #define spm_likely(x) (x)
365*532ac057SKun Lu #define spm_unlikely(x) (x)
366*532ac057SKun Lu #endif
367*532ac057SKun Lu
368*532ac057SKun Lu /* AP_MDSRC_REQ MD 26M ON settle time (3ms) */
369*532ac057SKun Lu #define AP_MDSRC_REQ_MD_26M_SETTLE 3
370*532ac057SKun Lu
371*532ac057SKun Lu /* Setting the SPM settle time*/
372*532ac057SKun Lu #define SPM_SYSCLK_SETTLE 0x60FE /* 1685us */
373*532ac057SKun Lu
374*532ac057SKun Lu /* Setting the SPM req/ack time*/
375*532ac057SKun Lu #define SPM_ACK_TIMEOUT_US 1000
376*532ac057SKun Lu
377*532ac057SKun Lu /* Settine the firmware status check for SPM PC */
378*532ac057SKun Lu #define SPM_PC_CHECKABLE
379*532ac057SKun Lu
380*532ac057SKun Lu enum {
381*532ac057SKun Lu SPM_ARGS_SPMFW_IDX_KICK = 0,
382*532ac057SKun Lu SPM_ARGS_SPMFW_INIT,
383*532ac057SKun Lu SPM_ARGS_SUSPEND,
384*532ac057SKun Lu SPM_ARGS_SUSPEND_FINISH,
385*532ac057SKun Lu SPM_ARGS_SODI,
386*532ac057SKun Lu SPM_ARGS_SODI_FINISH,
387*532ac057SKun Lu SPM_ARGS_DPIDLE,
388*532ac057SKun Lu SPM_ARGS_DPIDLE_FINISH,
389*532ac057SKun Lu SPM_ARGS_PCM_WDT,
390*532ac057SKun Lu SPM_ARGS_SUSPEND_CALLBACK,
391*532ac057SKun Lu SPM_ARGS_HARDWARE_CG_CHECK,
392*532ac057SKun Lu SPM_ARGS_NUM,
393*532ac057SKun Lu };
394*532ac057SKun Lu
395*532ac057SKun Lu typedef enum {
396*532ac057SKun Lu WR_NONE = 0,
397*532ac057SKun Lu WR_UART_BUSY,
398*532ac057SKun Lu WR_ABORT,
399*532ac057SKun Lu WR_PCM_TIMER,
400*532ac057SKun Lu WR_WAKE_SRC,
401*532ac057SKun Lu WR_DVFSRC,
402*532ac057SKun Lu WR_TWAM,
403*532ac057SKun Lu WR_PMSR,
404*532ac057SKun Lu WR_SPM_ACK_CHK,
405*532ac057SKun Lu WR_UNKNOWN,
406*532ac057SKun Lu } wake_reason_t;
407*532ac057SKun Lu
408*532ac057SKun Lu struct pwr_ctrl;
409*532ac057SKun Lu
410*532ac057SKun Lu void spm_set_irq_num(uint32_t num);
411*532ac057SKun Lu struct mt_lp_resource_user *get_spm_res_user(void);
412*532ac057SKun Lu int spm_boot_init(void);
413*532ac057SKun Lu void spm_dvfsfw_init(uint64_t boot_up_opp, uint64_t dram_issue);
414*532ac057SKun Lu /* Support by bl31_plat_setup.c */
415*532ac057SKun Lu uint32_t is_abnormal_boot(void);
416*532ac057SKun Lu
417*532ac057SKun Lu #endif
418