coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
spm.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <assert.h>
4 #include <console/console.h>
5 #include <delay.h>
6 #include <device/mmio.h>
7 #include <soc/mcu_common.h>
8 #include <soc/spm.h>
9 #include <soc/spm_common.h>
10 #include <soc/symbols.h>
11 #include <timer.h>
12 
13 #define SPM_SYSTEM_BASE_OFFSET 0x40000000
14 
15 static const struct pwr_ctrl spm_init_ctrl = {
16  /* Auto-gen Start */
17 
20 
21  /* SPM_SRC6_MASK */
22  .reg_dpmaif_srcclkena_mask_b = 1,
23  .reg_dpmaif_infra_req_mask_b = 1,
24  .reg_dpmaif_apsrc_req_mask_b = 1,
25  .reg_dpmaif_vrf18_req_mask_b = 1,
26  .reg_dpmaif_ddr_en_mask_b = 1,
27 
28  /* SPM_SRC_REQ */
29  .reg_spm_ddr_en_req = 1,
30 
31  /* SPM_SRC_MASK */
32  .reg_md_srcclkena_0_mask_b = 1,
33  .reg_md_apsrc2infra_req_0_mask_b = 1,
34  .reg_md_apsrc_req_0_mask_b = 1,
35  .reg_md_vrf18_req_0_mask_b = 1,
36  .reg_md_ddr_en_0_mask_b = 1,
37  .reg_conn_srcclkena_mask_b = 1,
38  .reg_conn_infra_req_mask_b = 1,
39  .reg_conn_apsrc_req_mask_b = 1,
40  .reg_conn_vrf18_req_mask_b = 1,
41  .reg_conn_ddr_en_mask_b = 1,
42  .reg_srcclkeni0_srcclkena_mask_b = 1,
43  .reg_srcclkeni0_infra_req_mask_b = 1,
44  .reg_infrasys_ddr_en_mask_b = 1,
45  .reg_md32_srcclkena_mask_b = 1,
46  .reg_md32_infra_req_mask_b = 1,
47  .reg_md32_apsrc_req_mask_b = 1,
48  .reg_md32_vrf18_req_mask_b = 1,
49  .reg_md32_ddr_en_mask_b = 1,
50 
51  /* SPM_SRC2_MASK */
52  .reg_scp_srcclkena_mask_b = 1,
53  .reg_scp_infra_req_mask_b = 1,
54  .reg_scp_apsrc_req_mask_b = 1,
55  .reg_scp_vrf18_req_mask_b = 1,
56  .reg_scp_ddr_en_mask_b = 1,
57  .reg_audio_dsp_srcclkena_mask_b = 1,
58  .reg_audio_dsp_infra_req_mask_b = 1,
59  .reg_audio_dsp_apsrc_req_mask_b = 1,
60  .reg_audio_dsp_vrf18_req_mask_b = 1,
61  .reg_audio_dsp_ddr_en_mask_b = 1,
62  .reg_ufs_srcclkena_mask_b = 1,
63  .reg_ufs_infra_req_mask_b = 1,
64  .reg_ufs_apsrc_req_mask_b = 1,
65  .reg_ufs_vrf18_req_mask_b = 1,
66  .reg_ufs_ddr_en_mask_b = 1,
67  .reg_disp0_apsrc_req_mask_b = 1,
68  .reg_disp0_ddr_en_mask_b = 1,
69  .reg_disp1_apsrc_req_mask_b = 1,
70  .reg_disp1_ddr_en_mask_b = 1,
71  .reg_gce_infra_req_mask_b = 1,
72  .reg_gce_apsrc_req_mask_b = 1,
73  .reg_gce_vrf18_req_mask_b = 1,
74  .reg_gce_ddr_en_mask_b = 1,
75  .reg_apu_srcclkena_mask_b = 1,
76  .reg_apu_infra_req_mask_b = 1,
77  .reg_apu_apsrc_req_mask_b = 1,
78  .reg_apu_vrf18_req_mask_b = 1,
79  .reg_apu_ddr_en_mask_b = 1,
80 
81  /* SPM_SRC3_MASK */
82  .reg_dvfsrc_event_trigger_mask_b = 1,
83  .reg_csyspwrreq_mask = 1,
84  .reg_mcupm_srcclkena_mask_b = 1,
85  .reg_mcupm_infra_req_mask_b = 1,
86  .reg_mcupm_apsrc_req_mask_b = 1,
87  .reg_mcupm_vrf18_req_mask_b = 1,
88  .reg_mcupm_ddr_en_mask_b = 1,
89  .reg_msdc0_srcclkena_mask_b = 1,
90  .reg_msdc0_infra_req_mask_b = 1,
91  .reg_msdc0_apsrc_req_mask_b = 1,
92  .reg_msdc0_vrf18_req_mask_b = 1,
93  .reg_msdc0_ddr_en_mask_b = 1,
94  .reg_msdc1_srcclkena_mask_b = 1,
95  .reg_msdc1_infra_req_mask_b = 1,
96  .reg_msdc1_apsrc_req_mask_b = 1,
97  .reg_msdc1_vrf18_req_mask_b = 1,
98  .reg_msdc1_ddr_en_mask_b = 1,
99 
100  /* SPM_SRC4_MASK */
101  .ccif_event_mask_b = 0xFFF,
102  .reg_dramc0_md32_infra_req_mask_b = 1,
103  .reg_dramc1_md32_infra_req_mask_b = 1,
104  .reg_dramc0_md32_wakeup_mask = 1,
105  .reg_dramc1_md32_wakeup_mask = 1,
106 
107  /* SPM_SRC5_MASK */
108  .reg_mcusys_merge_apsrc_req_mask_b = 0x11,
109  .reg_mcusys_merge_ddr_en_mask_b = 0x11,
110  .reg_msdc2_srcclkena_mask_b = 1,
111  .reg_msdc2_infra_req_mask_b = 1,
112  .reg_msdc2_apsrc_req_mask_b = 1,
113  .reg_msdc2_vrf18_req_mask_b = 1,
114  .reg_msdc2_ddr_en_mask_b = 1,
115  .reg_pcie_srcclkena_mask_b = 1,
116  .reg_pcie_infra_req_mask_b = 1,
117  .reg_pcie_apsrc_req_mask_b = 1,
118  .reg_pcie_vrf18_req_mask_b = 1,
119  .reg_pcie_ddr_en_mask_b = 1,
120 
121  /* SPM_WAKEUP_EVENT_MASK */
122  .reg_wakeup_event_mask = 0xEFFFFFFF,
123 
124  /* SPM_WAKEUP_EVENT_EXT_MASK */
125  .reg_ext_wakeup_event_mask = 0xFFFFFFFF,
126 
127  /* Auto-gen End */
128 };
129 
130 static void spm_set_power_control(const struct pwr_ctrl *pwrctrl)
131 {
132  /* Auto-gen Start */
133 
134  /* SPM_AP_STANDBY_CON */
136  ((pwrctrl->reg_wfi_op & 0x1) << 0) |
137  ((pwrctrl->reg_wfi_type & 0x1) << 1) |
138  ((pwrctrl->reg_mp0_cputop_idle_mask & 0x1) << 2) |
139  ((pwrctrl->reg_mp1_cputop_idle_mask & 0x1) << 3) |
140  ((pwrctrl->reg_mcusys_idle_mask & 0x1) << 4) |
141  ((pwrctrl->reg_md_apsrc_1_sel & 0x1) << 25) |
142  ((pwrctrl->reg_md_apsrc_0_sel & 0x1) << 26) |
143  ((pwrctrl->reg_conn_apsrc_sel & 0x1) << 29));
144 
145  /* SPM_SRC6_MASK */
147  ((pwrctrl->reg_dpmaif_srcclkena_mask_b & 0x1) << 0) |
148  ((pwrctrl->reg_dpmaif_infra_req_mask_b & 0x1) << 1) |
149  ((pwrctrl->reg_dpmaif_apsrc_req_mask_b & 0x1) << 2) |
150  ((pwrctrl->reg_dpmaif_vrf18_req_mask_b & 0x1) << 3) |
151  ((pwrctrl->reg_dpmaif_ddr_en_mask_b & 0x1) << 4));
152 
153  /* SPM_SRC_REQ */
155  ((pwrctrl->reg_spm_apsrc_req & 0x1) << 0) |
156  ((pwrctrl->reg_spm_f26m_req & 0x1) << 1) |
157  ((pwrctrl->reg_spm_infra_req & 0x1) << 3) |
158  ((pwrctrl->reg_spm_vrf18_req & 0x1) << 4) |
159  ((pwrctrl->reg_spm_ddr_en_req & 0x1) << 7) |
160  ((pwrctrl->reg_spm_dvfs_req & 0x1) << 8) |
161  ((pwrctrl->reg_spm_sw_mailbox_req & 0x1) << 9) |
162  ((pwrctrl->reg_spm_sspm_mailbox_req & 0x1) << 10) |
163  ((pwrctrl->reg_spm_adsp_mailbox_req & 0x1) << 11) |
164  ((pwrctrl->reg_spm_scp_mailbox_req & 0x1) << 12));
165 
166  /* SPM_SRC_MASK */
168  ((pwrctrl->reg_md_srcclkena_0_mask_b & 0x1) << 0) |
169  ((pwrctrl->reg_md_srcclkena2infra_req_0_mask_b & 0x1) << 1) |
170  ((pwrctrl->reg_md_apsrc2infra_req_0_mask_b & 0x1) << 2) |
171  ((pwrctrl->reg_md_apsrc_req_0_mask_b & 0x1) << 3) |
172  ((pwrctrl->reg_md_vrf18_req_0_mask_b & 0x1) << 4) |
173  ((pwrctrl->reg_md_ddr_en_0_mask_b & 0x1) << 5) |
174  ((pwrctrl->reg_md_srcclkena_1_mask_b & 0x1) << 6) |
175  ((pwrctrl->reg_md_srcclkena2infra_req_1_mask_b & 0x1) << 7) |
176  ((pwrctrl->reg_md_apsrc2infra_req_1_mask_b & 0x1) << 8) |
177  ((pwrctrl->reg_md_apsrc_req_1_mask_b & 0x1) << 9) |
178  ((pwrctrl->reg_md_vrf18_req_1_mask_b & 0x1) << 10) |
179  ((pwrctrl->reg_md_ddr_en_1_mask_b & 0x1) << 11) |
180  ((pwrctrl->reg_conn_srcclkena_mask_b & 0x1) << 12) |
181  ((pwrctrl->reg_conn_srcclkenb_mask_b & 0x1) << 13) |
182  ((pwrctrl->reg_conn_infra_req_mask_b & 0x1) << 14) |
183  ((pwrctrl->reg_conn_apsrc_req_mask_b & 0x1) << 15) |
184  ((pwrctrl->reg_conn_vrf18_req_mask_b & 0x1) << 16) |
185  ((pwrctrl->reg_conn_ddr_en_mask_b & 0x1) << 17) |
186  ((pwrctrl->reg_conn_vfe28_mask_b & 0x1) << 18) |
187  ((pwrctrl->reg_srcclkeni0_srcclkena_mask_b & 0x1) << 19) |
188  ((pwrctrl->reg_srcclkeni0_infra_req_mask_b & 0x1) << 20) |
189  ((pwrctrl->reg_srcclkeni1_srcclkena_mask_b & 0x1) << 21) |
190  ((pwrctrl->reg_srcclkeni1_infra_req_mask_b & 0x1) << 22) |
191  ((pwrctrl->reg_srcclkeni2_srcclkena_mask_b & 0x1) << 23) |
192  ((pwrctrl->reg_srcclkeni2_infra_req_mask_b & 0x1) << 24) |
193  ((pwrctrl->reg_infrasys_apsrc_req_mask_b & 0x1) << 25) |
194  ((pwrctrl->reg_infrasys_ddr_en_mask_b & 0x1) << 26) |
195  ((pwrctrl->reg_md32_srcclkena_mask_b & 0x1) << 27) |
196  ((pwrctrl->reg_md32_infra_req_mask_b & 0x1) << 28) |
197  ((pwrctrl->reg_md32_apsrc_req_mask_b & 0x1) << 29) |
198  ((pwrctrl->reg_md32_vrf18_req_mask_b & 0x1) << 30) |
199  ((pwrctrl->reg_md32_ddr_en_mask_b & 0x1) << 31));
200 
201  /* SPM_SRC2_MASK */
203  ((pwrctrl->reg_scp_srcclkena_mask_b & 0x1) << 0) |
204  ((pwrctrl->reg_scp_infra_req_mask_b & 0x1) << 1) |
205  ((pwrctrl->reg_scp_apsrc_req_mask_b & 0x1) << 2) |
206  ((pwrctrl->reg_scp_vrf18_req_mask_b & 0x1) << 3) |
207  ((pwrctrl->reg_scp_ddr_en_mask_b & 0x1) << 4) |
208  ((pwrctrl->reg_audio_dsp_srcclkena_mask_b & 0x1) << 5) |
209  ((pwrctrl->reg_audio_dsp_infra_req_mask_b & 0x1) << 6) |
210  ((pwrctrl->reg_audio_dsp_apsrc_req_mask_b & 0x1) << 7) |
211  ((pwrctrl->reg_audio_dsp_vrf18_req_mask_b & 0x1) << 8) |
212  ((pwrctrl->reg_audio_dsp_ddr_en_mask_b & 0x1) << 9) |
213  ((pwrctrl->reg_ufs_srcclkena_mask_b & 0x1) << 10) |
214  ((pwrctrl->reg_ufs_infra_req_mask_b & 0x1) << 11) |
215  ((pwrctrl->reg_ufs_apsrc_req_mask_b & 0x1) << 12) |
216  ((pwrctrl->reg_ufs_vrf18_req_mask_b & 0x1) << 13) |
217  ((pwrctrl->reg_ufs_ddr_en_mask_b & 0x1) << 14) |
218  ((pwrctrl->reg_disp0_apsrc_req_mask_b & 0x1) << 15) |
219  ((pwrctrl->reg_disp0_ddr_en_mask_b & 0x1) << 16) |
220  ((pwrctrl->reg_disp1_apsrc_req_mask_b & 0x1) << 17) |
221  ((pwrctrl->reg_disp1_ddr_en_mask_b & 0x1) << 18) |
222  ((pwrctrl->reg_gce_infra_req_mask_b & 0x1) << 19) |
223  ((pwrctrl->reg_gce_apsrc_req_mask_b & 0x1) << 20) |
224  ((pwrctrl->reg_gce_vrf18_req_mask_b & 0x1) << 21) |
225  ((pwrctrl->reg_gce_ddr_en_mask_b & 0x1) << 22) |
226  ((pwrctrl->reg_apu_srcclkena_mask_b & 0x1) << 23) |
227  ((pwrctrl->reg_apu_infra_req_mask_b & 0x1) << 24) |
228  ((pwrctrl->reg_apu_apsrc_req_mask_b & 0x1) << 25) |
229  ((pwrctrl->reg_apu_vrf18_req_mask_b & 0x1) << 26) |
230  ((pwrctrl->reg_apu_ddr_en_mask_b & 0x1) << 27) |
231  ((pwrctrl->reg_cg_check_srcclkena_mask_b & 0x1) << 28) |
232  ((pwrctrl->reg_cg_check_apsrc_req_mask_b & 0x1) << 29) |
233  ((pwrctrl->reg_cg_check_vrf18_req_mask_b & 0x1) << 30) |
234  ((pwrctrl->reg_cg_check_ddr_en_mask_b & 0x1) << 31));
235 
236  /* SPM_SRC3_MASK */
238  ((pwrctrl->reg_dvfsrc_event_trigger_mask_b & 0x1) << 0) |
239  ((pwrctrl->reg_sw2spm_int0_mask_b & 0x1) << 1) |
240  ((pwrctrl->reg_sw2spm_int1_mask_b & 0x1) << 2) |
241  ((pwrctrl->reg_sw2spm_int2_mask_b & 0x1) << 3) |
242  ((pwrctrl->reg_sw2spm_int3_mask_b & 0x1) << 4) |
243  ((pwrctrl->reg_sc_adsp2spm_wakeup_mask_b & 0x1) << 5) |
244  ((pwrctrl->reg_sc_sspm2spm_wakeup_mask_b & 0xf) << 6) |
245  ((pwrctrl->reg_sc_scp2spm_wakeup_mask_b & 0x1) << 10) |
246  ((pwrctrl->reg_csyspwrreq_mask & 0x1) << 11) |
247  ((pwrctrl->reg_spm_srcclkena_reserved_mask_b & 0x1) << 12) |
248  ((pwrctrl->reg_spm_infra_req_reserved_mask_b & 0x1) << 13) |
249  ((pwrctrl->reg_spm_apsrc_req_reserved_mask_b & 0x1) << 14) |
250  ((pwrctrl->reg_spm_vrf18_req_reserved_mask_b & 0x1) << 15) |
251  ((pwrctrl->reg_spm_ddr_en_reserved_mask_b & 0x1) << 16) |
252  ((pwrctrl->reg_mcupm_srcclkena_mask_b & 0x1) << 17) |
253  ((pwrctrl->reg_mcupm_infra_req_mask_b & 0x1) << 18) |
254  ((pwrctrl->reg_mcupm_apsrc_req_mask_b & 0x1) << 19) |
255  ((pwrctrl->reg_mcupm_vrf18_req_mask_b & 0x1) << 20) |
256  ((pwrctrl->reg_mcupm_ddr_en_mask_b & 0x1) << 21) |
257  ((pwrctrl->reg_msdc0_srcclkena_mask_b & 0x1) << 22) |
258  ((pwrctrl->reg_msdc0_infra_req_mask_b & 0x1) << 23) |
259  ((pwrctrl->reg_msdc0_apsrc_req_mask_b & 0x1) << 24) |
260  ((pwrctrl->reg_msdc0_vrf18_req_mask_b & 0x1) << 25) |
261  ((pwrctrl->reg_msdc0_ddr_en_mask_b & 0x1) << 26) |
262  ((pwrctrl->reg_msdc1_srcclkena_mask_b & 0x1) << 27) |
263  ((pwrctrl->reg_msdc1_infra_req_mask_b & 0x1) << 28) |
264  ((pwrctrl->reg_msdc1_apsrc_req_mask_b & 0x1) << 29) |
265  ((pwrctrl->reg_msdc1_vrf18_req_mask_b & 0x1) << 30) |
266  ((pwrctrl->reg_msdc1_ddr_en_mask_b & 0x1) << 31));
267 
268  /* SPM_SRC4_MASK */
270  ((pwrctrl->ccif_event_mask_b & 0xffff) << 0) |
271  ((pwrctrl->reg_bak_psri_srcclkena_mask_b & 0x1) << 16) |
272  ((pwrctrl->reg_bak_psri_infra_req_mask_b & 0x1) << 17) |
273  ((pwrctrl->reg_bak_psri_apsrc_req_mask_b & 0x1) << 18) |
274  ((pwrctrl->reg_bak_psri_vrf18_req_mask_b & 0x1) << 19) |
275  ((pwrctrl->reg_bak_psri_ddr_en_mask_b & 0x1) << 20) |
276  ((pwrctrl->reg_dramc0_md32_infra_req_mask_b & 0x1) << 21) |
277  ((pwrctrl->reg_dramc0_md32_vrf18_req_mask_b & 0x1) << 22) |
278  ((pwrctrl->reg_dramc1_md32_infra_req_mask_b & 0x1) << 23) |
279  ((pwrctrl->reg_dramc1_md32_vrf18_req_mask_b & 0x1) << 24) |
280  ((pwrctrl->reg_conn_srcclkenb2pwrap_mask_b & 0x1) << 25) |
281  ((pwrctrl->reg_dramc0_md32_wakeup_mask & 0x1) << 26) |
282  ((pwrctrl->reg_dramc1_md32_wakeup_mask & 0x1) << 27));
283 
284  /* SPM_SRC5_MASK */
286  ((pwrctrl->reg_mcusys_merge_apsrc_req_mask_b & 0x1ff) << 0) |
287  ((pwrctrl->reg_mcusys_merge_ddr_en_mask_b & 0x1ff) << 9) |
288  ((pwrctrl->reg_msdc2_srcclkena_mask_b & 0x1) << 18) |
289  ((pwrctrl->reg_msdc2_infra_req_mask_b & 0x1) << 19) |
290  ((pwrctrl->reg_msdc2_apsrc_req_mask_b & 0x1) << 20) |
291  ((pwrctrl->reg_msdc2_vrf18_req_mask_b & 0x1) << 21) |
292  ((pwrctrl->reg_msdc2_ddr_en_mask_b & 0x1) << 22) |
293  ((pwrctrl->reg_pcie_srcclkena_mask_b & 0x1) << 23) |
294  ((pwrctrl->reg_pcie_infra_req_mask_b & 0x1) << 24) |
295  ((pwrctrl->reg_pcie_apsrc_req_mask_b & 0x1) << 25) |
296  ((pwrctrl->reg_pcie_vrf18_req_mask_b & 0x1) << 26) |
297  ((pwrctrl->reg_pcie_ddr_en_mask_b & 0x1) << 27));
298 
299  /* SPM_WAKEUP_EVENT_MASK */
301  ((pwrctrl->reg_wakeup_event_mask & 0xffffffff) << 0));
302 
303  /* SPM_WAKEUP_EVENT_EXT_MASK */
305  ((pwrctrl->reg_ext_wakeup_event_mask & 0xffffffff) << 0));
306 
307  /* Auto-gen End */
308 }
309 
310 static void spm_register_init(void)
311 {
312  /* Enable register control */
315 
316  /* Init power control register */
319 
320  /* Reset PCM */
328 
329  /* Initial SPM CLK control register */
331 
332  /* Clean wakeup event raw status */
334 
335  /* Clean ISR status */
339 
340  /* Init r7 with POWER_ON_VAL1 */
345 
346  /* DDR EN de-bounce length to 5us */
349 
350  /* Configure ARMPLL Control Mode for MCDI */
352 
353  /* Init for SPM Resource ACK */
358 
359  /* Init VCORE DVFS Status */
364 
367 
368  /* Apm hw s1 state monitor pause */
373 }
374 
375 static void spm_set_sysclk_settle(void)
376 {
378 }
379 
380 static void spm_code_swapping(void)
381 {
382  u32 mask;
383 
390 }
391 
392 static void spm_reset_and_init_pcm(void)
393 {
394  bool first_load_fw = true;
395 
396  /* Check the SPM FW is run or not */
399  first_load_fw = false;
400 
401  if (!first_load_fw) {
403  /* Backup PCM r0 -> SPM_POWER_ON_VAL0 before reset PCM */
406  }
407 
408  /* Disable r0 and r7 to control power */
410 
411  /* Disable pcm timer after leaving FW */
414 
415  /* Reset PCM */
419 
420  /* Init PCM_CON1 (disable PCM timer but keep PCM WDT setting) */
425 }
426 
427 static void spm_kick_im_to_fetch(const struct dyna_load_pcm *pcm)
428 {
429  uintptr_t ptr;
430  u32 dmem_words;
431  u32 pmem_words;
432  u32 total_words;
433  u32 pmem_start;
434  u32 dmem_start;
435 
436  ptr = (uintptr_t)pcm->buf + SPM_SYSTEM_BASE_OFFSET;
437  pmem_words = pcm->desc.pmem_words;
438  total_words = pcm->desc.total_words;
439  dmem_words = total_words - pmem_words;
440  pmem_start = pcm->desc.pmem_start;
441  dmem_start = pcm->desc.dmem_start;
442 
443  printk(BIOS_DEBUG, "%s: ptr = %#lx, pmem/dmem words = %#x/%#x\n",
444  __func__, (long)ptr, pmem_words, dmem_words);
445 
446  /* DMA needs 16-byte aligned source data. */
447  assert(ptr % 16 == 0);
448  /* Program/Data must also be 16-byte (4-word) aligned. */
449  assert(pmem_words % 4 == 0);
450  assert(dmem_words % 4 == 0);
451 
453  write32(&mtk_spm->md32pcm_dma0_dst, pmem_start);
454  write32(&mtk_spm->md32pcm_dma0_wppt, pmem_words);
455  write32(&mtk_spm->md32pcm_dma0_wpto, dmem_start);
456  write32(&mtk_spm->md32pcm_dma0_count, total_words);
459 
461 }
462 
463 static void spm_init_pcm_register(void)
464 {
465  /* Init r0 with POWER_ON_VAL0 */
470 
471  /* Init r7 with POWER_ON_VAL1 */
476 }
477 
478 static void spm_set_wakeup_event(const struct pwr_ctrl *pwrctrl)
479 {
480  u32 val, mask;
481 
482  /* Toggle event counter clear */
485 
486  /* Toggle for reset SYS TIMER start point */
488 
489  if (pwrctrl->timer_val_cust == 0)
490  val = pwrctrl->timer_val ? pwrctrl->timer_val : PCM_TIMER_MAX;
491  else
492  val = pwrctrl->timer_val_cust;
493 
495 
496  /* Disable pcm timer */
499 
500  /* Unmask AP wakeup source */
501  if (pwrctrl->wake_src_cust == 0)
502  mask = pwrctrl->wake_src;
503  else
504  mask = pwrctrl->wake_src_cust;
505 
506  if (pwrctrl->reg_csyspwrreq_mask)
508 
510 
511  /* Unmask SPM ISR (keep TWAM setting) */
513 
514  /* Toggle event counter clear */
517 
518  /* Toggle for reset SYS TIMER start point */
520 }
521 
522 static void spm_set_pcm_flags(const struct pwr_ctrl *pwrctrl)
523 {
524  u32 pcm_flags = pwrctrl->pcm_flags, pcm_flags1 = pwrctrl->pcm_flags1;
525 
526  /* Set PCM flags and data */
527  if (pwrctrl->pcm_flags_cust_clr != 0)
528  pcm_flags &= ~pwrctrl->pcm_flags_cust_clr;
529  if (pwrctrl->pcm_flags_cust_set != 0)
530  pcm_flags |= pwrctrl->pcm_flags_cust_set;
531  if (pwrctrl->pcm_flags1_cust_clr != 0)
532  pcm_flags1 &= ~pwrctrl->pcm_flags1_cust_clr;
533  if (pwrctrl->pcm_flags1_cust_set != 0)
534  pcm_flags1 |= pwrctrl->pcm_flags1_cust_set;
535 
540 }
541 
542 static void spm_kick_pcm_to_run(const struct pwr_ctrl *pwrctrl)
543 {
544  /* Waiting for loading SPMFW done*/
545  while (read32(&mtk_spm->md32pcm_dma0_rlct) != 0x0)
546  ;
547 
548  /* Init register to match PCM expectation */
553 
554  spm_set_pcm_flags(pwrctrl);
555 
556  /* Kick PCM to run (only toggle PCM_KICK) */
558 
559  /* Reset md32pcm */
562 
563  /* Waiting for SPM init done */
565 }
566 
567 static void reset_spm(struct mtk_mcu *mcu)
568 {
569  struct dyna_load_pcm *pcm = (struct dyna_load_pcm *)mcu->priv;
570 
571  spm_parse_firmware(mcu);
577 }
578 
579 static struct mtk_mcu spm = {
580  .firmware_name = CONFIG_SPM_FIRMWARE,
581  .reset = reset_spm,
582 };
583 
584 int spm_init(void)
585 {
586  struct dyna_load_pcm pcm;
587  struct stopwatch sw;
588 
589  stopwatch_init(&sw);
590 
594 
595  spm.load_buffer = _dram_dma;
596  spm.buffer_size = REGION_SIZE(dram_dma);
597  spm.priv = (void *)&pcm;
598 
599  if (mtk_init_mcu(&spm)) {
600  printk(BIOS_ERR, "SPM: %s: failed in mtk_init_mcu\n", __func__);
601  return -1;
602  }
603 
604  printk(BIOS_INFO, "SPM: %s done in %ld msecs, spm pc = %#x\n",
605  __func__, stopwatch_duration_msecs(&sw),
607 
608  return 0;
609 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define assert(statement)
Definition: assert.h:74
void spm_parse_firmware(struct mtk_mcu *mcu)
Definition: spm.c:12
#define printk(level,...)
Definition: stdlib.h:16
#define setbits32(addr, set)
Definition: mmio.h:21
#define clrsetbits32(addr, clear, set)
Definition: mmio.h:16
#define clrbits32(addr, clear)
Definition: mmio.h:26
#define REGION_SIZE(name)
Definition: symbols.h:10
static void stopwatch_init(struct stopwatch *sw)
Definition: timer.h:117
static long stopwatch_duration_msecs(struct stopwatch *sw)
Definition: timer.h:182
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
int mtk_init_mcu(struct mtk_mcu *mcu)
Definition: mcu.c:10
static struct mtk_spm_regs *const mtk_spm
Definition: spm.h:154
#define PCM_CK_EN_LSB
Definition: spm.h:32
#define ISRM_RET_IRQ_AUX
Definition: spm.h:98
#define SPM_WAKEUP_EVENT_MASK_DEF
Definition: spm.h:88
#define ISRM_ALL
Definition: spm.h:100
#define PCM_SW_RESET_LSB
Definition: spm.h:35
#define PCM_SW_INT_ALL
Definition: spm.h:118
#define BCLK_CG_EN_LSB
Definition: spm.h:15
#define SPM_REGWR_CFG_KEY
Definition: spm.h:12
#define PCM_RF_SYNC_R0
Definition: spm.h:113
#define PCM_RF_SYNC_R7
Definition: spm.h:115
#define POWER_ON_VAL1_DEF
Definition: spm.h:82
#define ISRC_ALL
Definition: spm.h:108
int spm_init(void)
Definition: spm.c:298
#define SPM_FLAG_DISABLE_VCORE_DVS
Definition: spm.h:92
#define REG_MD32_APB_INTERNAL_EN_LSB
Definition: spm.h:47
#define SPM_ACK_CHK_3_SEL_HW_S1
Definition: spm.h:80
#define ARMPLL_CLK_SEL_DEF
Definition: spm.h:69
#define RG_PCM_WDT_WAKE_LSB
Definition: spm.h:85
#define MD32PCM_DMA0_START_VAL
Definition: spm.h:40
#define SPM_RESOURCE_ACK_CON0_DEF
Definition: spm.h:70
#define SPM_INIT_DONE_US
Definition: spm.h:16
#define SPM_BUS_PROTECT2_MASK_B_DEF
Definition: spm.h:90
#define MD32PCM_DMA0_CON_VAL
Definition: spm.h:39
#define SPM_ACK_CHK_3_HW_S1_CNT
Definition: spm.h:81
#define SPM_FLAG_DISABLE_VCORE_DFS
Definition: spm.h:93
#define SPM_RESOURCE_ACK_CON2_DEF
Definition: spm.h:72
#define MD32PCM_CFGREG_SW_RSTN_RUN
Definition: spm.h:38
#define PCM_TIMER_MAX
Definition: spm.h:99
#define SPM_RESOURCE_ACK_CON1_DEF
Definition: spm.h:71
#define SPM_RESOURCE_ACK_CON3_DEF
Definition: spm.h:73
#define SPM_WAKEUP_EVENT_MASK_BIT0
Definition: spm.h:83
#define SPM_SYSCLK_SETTLE
Definition: spm.h:82
#define SPM_BUS_PROTECT_MASK_B_DEF
Definition: spm.h:89
#define RG_PCM_TIMER_EN_LSB
Definition: spm.h:84
#define RG_AHBMIF_APBEN_LSB
Definition: spm.h:46
#define SPM_DVS_DFS_LEVEL_DEF
Definition: spm.h:79
#define SPM_FLAG_RUN_COMMON_SCENARIO
Definition: spm.h:94
#define SPM_DVFS_LEVEL_DEF
Definition: spm.h:78
#define SYS_TIMER_START_EN_LSB
Definition: spm.h:51
#define REG_EVENT_LOCK_EN_LSB
Definition: spm.h:31
#define REG_SPM_SRAM_ISOINT_B_LSB
Definition: spm.h:30
#define SPM_EVENT_COUNTER_CLR_LSB
Definition: spm.h:28
#define SPM_WAKEUP_EVENT_MASK_CSYSPWREQ_B
Definition: spm.h:36
#define SPM_DVFSRC_ENABLE_LSB
Definition: spm.h:43
#define DDR_EN_DBC_CON0_DEF
Definition: spm.h:78
#define SPM_DVFS_FORCE_ENABLE_LSB
Definition: spm.h:42
#define MD32PCM_CFGREG_SW_RSTN_RESET
Definition: spm.h:54
#define SPM_ACK_CHK_3_CON_HW_MODE_TRIG
Definition: spm.h:63
#define REG_SYSCLK1_SRC_MD2_SRCCLKENA
Definition: spm.h:18
#define SPM_ACK_CHK_3_CON_CLR_ALL
Definition: spm.h:65
#define REG_ALL_DDR_EN_DBC_EN_LSB
Definition: spm.h:39
#define SPM_ACK_CHK_3_CON_EN
Definition: spm.h:64
static void spm_code_swapping(void)
Definition: spm.c:380
static void spm_set_wakeup_event(const struct pwr_ctrl *pwrctrl)
Definition: spm.c:478
static void reset_spm(struct mtk_mcu *mcu)
Definition: spm.c:567
static void spm_set_pcm_flags(const struct pwr_ctrl *pwrctrl)
Definition: spm.c:522
static void spm_kick_im_to_fetch(const struct dyna_load_pcm *pcm)
Definition: spm.c:427
static void spm_kick_pcm_to_run(const struct pwr_ctrl *pwrctrl)
Definition: spm.c:542
static void spm_init_pcm_register(void)
Definition: spm.c:463
static void spm_reset_and_init_pcm(void)
Definition: spm.c:392
static void spm_set_sysclk_settle(void)
Definition: spm.c:375
static void spm_register_init(void)
Definition: spm.c:310
static void spm_set_power_control(const struct pwr_ctrl *pwrctrl)
Definition: spm.c:130
static struct mtk_mcu spm
Definition: spm.c:579
#define SPM_SYSTEM_BASE_OFFSET
Definition: spm.c:13
static const struct pwr_ctrl spm_init_ctrl
Definition: spm.c:15
static const int mask[4]
Definition: gpio.c:308
uint32_t u32
Definition: stdint.h:51
unsigned long uintptr_t
Definition: stdint.h:21
u32 * buf
Definition: spm.h:578
struct pcm_desc desc
Definition: spm.h:579
size_t buffer_size
Definition: mcu_common.h:11
const char * firmware_name
Definition: mcu_common.h:7
void * priv
Definition: mcu_common.h:12
void * load_buffer
Definition: mcu_common.h:10
uint32_t armpll_clk_sel
Definition: spm.h:269
u32 spm_clk_settle
Definition: spm.h:136
u32 spm_cpu_wakeup_event
Definition: spm.h:161
u32 md32pcm_dma0_count
Definition: spm.h:621
u32 ddr_en_dbc_con0
Definition: spm.h:368
u32 pcm_con1
Definition: spm.h:71
uint32_t spm_bus_protect_mask_b
Definition: spm.h:361
u32 pcm_pwr_io_en
Definition: spm.h:82
uint32_t spm_resource_ack_con2
Definition: spm.h:193
uint32_t spm_resource_ack_con1
Definition: spm.h:192
uint32_t spm_src6_mask
Definition: spm.h:162
u32 md32pcm_cfgreg_sw_rstn
Definition: spm.h:615
u32 spm_power_on_val1
Definition: spm.h:134
uint32_t spm_bus_protect2_mask_b
Definition: spm.h:363
u32 md32pcm_dma0_wppt
Definition: spm.h:619
u32 spm_irq_mask
Definition: spm.h:162
u32 spm_swint_clr
Definition: spm.h:154
uint32_t spm_dvs_dfs_level
Definition: spm.h:422
u32 spm_src_req
Definition: spm.h:163
uint32_t spm_src4_mask
Definition: spm.h:181
u32 md32pcm_dma0_rlct
Definition: spm.h:625
u32 md32pcm_dma0_wpto
Definition: spm.h:620
u32 pcm_reg_data_ini
Definition: spm.h:74
u32 spm_wakeup_event_ext_mask
Definition: spm.h:167
u32 spm_src3_mask
Definition: spm.h:173
u32 spm_irq_sta
Definition: spm.h:199
u32 spm_sw_rsv_7
Definition: spm.h:428
uint32_t spm_src5_mask
Definition: spm.h:182
uint32_t sys_timer_con
Definition: spm.h:615
u32 spm_sw_rsv_8
Definition: spm.h:429
u32 spm_clk_con
Definition: spm.h:135
u32 spm_power_on_val0
Definition: spm.h:133
u32 md32pcm_dma0_dst
Definition: spm.h:618
uint32_t spm_ack_chk_timer_3
Definition: spm.h:609
u32 pcm_timer_val
Definition: spm.h:83
uint32_t spm_resource_ack_con0
Definition: spm.h:191
u32 md32pcm_dma0_con
Definition: spm.h:622
uint32_t spm_sw_flag_1
Definition: spm.h:427
uint32_t md32pcm_pc
Definition: spm.h:231
uint32_t spm_sw_flag_0
Definition: spm.h:425
u32 md32pcm_dma0_src
Definition: spm.h:617
u32 spm_src_mask
Definition: spm.h:164
u32 spm_wakeup_event_mask
Definition: spm.h:166
u32 poweron_config_set
Definition: spm.h:24
u32 spm_dvfs_misc
Definition: spm.h:446
u32 spm_dvfs_level
Definition: spm.h:441
uint32_t spm_ack_chk_sel_3
Definition: spm.h:608
uint32_t spm_resource_ack_con3
Definition: spm.h:194
u32 spm_src2_mask
Definition: spm.h:165
u32 spm_ap_standby_con
Definition: spm.h:137
uint32_t spm_ack_chk_con_3
Definition: spm.h:606
u32 md32pcm_dma0_start
Definition: spm.h:623
u32 pcm_con0
Definition: spm.h:70
u32 ddr_en_dbc_con1
Definition: spm.h:369
u32 pcm_reg0_data
Definition: spm.h:177
uint32_t dmem_start
Definition: spm.h:850
uint32_t total_words
Definition: spm.h:848
uint32_t pmem_words
Definition: spm.h:847
uint32_t pmem_start
Definition: spm.h:849
Definition: spm.h:654
uint8_t reg_dpmaif_srcclkena_mask_b
Definition: spm.h:828
uint8_t reg_conn_vfe28_mask_b
Definition: spm.h:717
u8 reg_infrasys_ddr_en_mask_b
Definition: spm.h:201
uint8_t reg_bak_psri_apsrc_req_mask_b
Definition: spm.h:794
u8 reg_sw2spm_int3_mask_b
Definition: spm.h:247
uint8_t reg_msdc1_infra_req_mask_b
Definition: spm.h:785
uint8_t reg_apu_vrf18_req_mask_b
Definition: spm.h:755
uint8_t reg_apu_infra_req_mask_b
Definition: spm.h:753
uint32_t wake_src
Definition: spm.h:668
uint8_t reg_ufs_infra_req_mask_b
Definition: spm.h:740
uint8_t reg_msdc0_vrf18_req_mask_b
Definition: spm.h:782
uint8_t reg_ufs_srcclkena_mask_b
Definition: spm.h:739
u8 reg_csyspwrreq_mask
Definition: spm.h:251
u8 reg_md_ddr_en_1_mask_b
Definition: spm.h:186
u32 ccif_event_mask_b
Definition: spm.h:274
uint32_t pcm_flags
Definition: spm.h:656
u8 reg_srcclkeni0_infra_req_mask_b
Definition: spm.h:195
u8 reg_md_srcclkena2infra_req_1_mask_b
Definition: spm.h:182
uint8_t reg_msdc2_srcclkena_mask_b
Definition: spm.h:810
uint8_t reg_gce_vrf18_req_mask_b
Definition: spm.h:750
uint8_t reg_disp0_apsrc_req_mask_b
Definition: spm.h:744
uint8_t reg_wfi_op
Definition: spm.h:675
u8 reg_srcclkeni2_srcclkena_mask_b
Definition: spm.h:198
uint8_t reg_cg_check_vrf18_req_mask_b
Definition: spm.h:759
uint8_t reg_disp1_apsrc_req_mask_b
Definition: spm.h:746
u8 reg_md_ddr_en_0_mask_b
Definition: spm.h:180
u8 reg_gce_ddr_en_mask_b
Definition: spm.h:231
uint8_t reg_ufs_apsrc_req_mask_b
Definition: spm.h:741
uint32_t wake_src_cust
Definition: spm.h:669
u8 reg_cg_check_ddr_en_mask_b
Definition: spm.h:240
u8 reg_md_srcclkena_1_mask_b
Definition: spm.h:181
uint8_t reg_scp_infra_req_mask_b
Definition: spm.h:730
uint8_t reg_msdc0_srcclkena_mask_b
Definition: spm.h:779
uint32_t pcm_flags_cust_set
Definition: spm.h:658
uint8_t reg_msdc2_apsrc_req_mask_b
Definition: spm.h:812
uint8_t reg_pcie_vrf18_req_mask_b
Definition: spm.h:826
u8 reg_dpmaif_ddr_en_mask_b
Definition: spm.h:160
uint8_t reg_audio_dsp_apsrc_req_mask_b
Definition: spm.h:736
u8 reg_dramc0_md32_wakeup_mask
Definition: spm.h:285
uint32_t pcm_flags1
Definition: spm.h:660
u8 reg_ufs_ddr_en_mask_b
Definition: spm.h:223
uint8_t reg_spm_vrf18_req
Definition: spm.h:692
u8 reg_apu_ddr_en_mask_b
Definition: spm.h:236
u8 reg_msdc2_ddr_en_mask_b
Definition: spm.h:295
uint8_t reg_msdc2_vrf18_req_mask_b
Definition: spm.h:813
u8 reg_md32_infra_req_mask_b
Definition: spm.h:203
uint8_t reg_gce_infra_req_mask_b
Definition: spm.h:748
uint8_t reg_msdc0_infra_req_mask_b
Definition: spm.h:780
u8 reg_mcupm_ddr_en_mask_b
Definition: spm.h:261
uint8_t reg_conn_srcclkenb_mask_b
Definition: spm.h:712
uint8_t reg_conn_srcclkenb2pwrap_mask_b
Definition: spm.h:799
u8 reg_srcclkeni0_srcclkena_mask_b
Definition: spm.h:194
u8 reg_disp0_ddr_en_mask_b
Definition: spm.h:225
uint32_t reg_wakeup_event_mask
Definition: spm.h:817
u8 reg_md32_srcclkena_mask_b
Definition: spm.h:202
uint8_t reg_dpmaif_apsrc_req_mask_b
Definition: spm.h:830
uint8_t reg_scp_vrf18_req_mask_b
Definition: spm.h:732
u8 reg_md32_apsrc_req_mask_b
Definition: spm.h:204
u8 reg_srcclkeni1_srcclkena_mask_b
Definition: spm.h:196
uint8_t reg_apu_srcclkena_mask_b
Definition: spm.h:752
u8 reg_spm_apsrc_req_reserved_mask_b
Definition: spm.h:254
uint8_t reg_md_apsrc_1_sel
Definition: spm.h:680
u8 reg_md_apsrc_req_0_mask_b
Definition: spm.h:178
uint8_t reg_msdc2_infra_req_mask_b
Definition: spm.h:811
u8 reg_pcie_ddr_en_mask_b
Definition: spm.h:300
uint8_t reg_mcupm_vrf18_req_mask_b
Definition: spm.h:777
u8 reg_sc_sspm2spm_wakeup_mask_b
Definition: spm.h:249
u8 reg_disp1_ddr_en_mask_b
Definition: spm.h:227
uint8_t reg_bak_psri_vrf18_req_mask_b
Definition: spm.h:795
uint8_t reg_apu_apsrc_req_mask_b
Definition: spm.h:754
u8 reg_dramc0_md32_vrf18_req_mask_b
Definition: spm.h:281
u8 reg_dramc1_md32_vrf18_req_mask_b
Definition: spm.h:283
u8 reg_scp_ddr_en_mask_b
Definition: spm.h:213
uint32_t pcm_flags_cust_clr
Definition: spm.h:659
uint8_t reg_spm_dvfs_req
Definition: spm.h:694
uint8_t reg_conn_apsrc_sel
Definition: spm.h:682
uint8_t reg_spm_adsp_mailbox_req
Definition: spm.h:697
uint8_t reg_mcupm_apsrc_req_mask_b
Definition: spm.h:776
uint8_t reg_audio_dsp_infra_req_mask_b
Definition: spm.h:735
uint8_t reg_dpmaif_infra_req_mask_b
Definition: spm.h:829
uint8_t reg_wfi_type
Definition: spm.h:676
u8 reg_sc_adsp2spm_wakeup_mask_b
Definition: spm.h:248
uint8_t reg_infrasys_apsrc_req_mask_b
Definition: spm.h:720
u8 reg_md_vrf18_req_1_mask_b
Definition: spm.h:185
u8 reg_md_vrf18_req_0_mask_b
Definition: spm.h:179
uint8_t reg_mp1_cputop_idle_mask
Definition: spm.h:678
uint8_t reg_conn_srcclkena_mask_b
Definition: spm.h:711
uint8_t reg_audio_dsp_vrf18_req_mask_b
Definition: spm.h:737
u8 reg_md_srcclkena2infra_req_0_mask_b
Definition: spm.h:176
u8 reg_msdc0_ddr_en_mask_b
Definition: spm.h:266
uint8_t reg_bak_psri_srcclkena_mask_b
Definition: spm.h:792
u8 reg_sw2spm_int2_mask_b
Definition: spm.h:246
u8 reg_bak_psri_ddr_en_mask_b
Definition: spm.h:279
uint8_t reg_msdc1_vrf18_req_mask_b
Definition: spm.h:787
u8 reg_spm_vrf18_req_reserved_mask_b
Definition: spm.h:255
u8 reg_dramc0_md32_infra_req_mask_b
Definition: spm.h:280
uint8_t reg_cg_check_srcclkena_mask_b
Definition: spm.h:757
uint8_t reg_msdc1_apsrc_req_mask_b
Definition: spm.h:786
uint8_t reg_md_apsrc_0_sel
Definition: spm.h:681
uint8_t reg_gce_apsrc_req_mask_b
Definition: spm.h:749
uint8_t reg_mcusys_idle_mask
Definition: spm.h:679
uint8_t reg_spm_sspm_mailbox_req
Definition: spm.h:696
uint8_t reg_mcupm_infra_req_mask_b
Definition: spm.h:775
uint8_t reg_dpmaif_vrf18_req_mask_b
Definition: spm.h:831
uint8_t reg_scp_apsrc_req_mask_b
Definition: spm.h:731
uint8_t reg_pcie_apsrc_req_mask_b
Definition: spm.h:825
uint8_t reg_conn_apsrc_req_mask_b
Definition: spm.h:714
u8 reg_md_srcclkena_0_mask_b
Definition: spm.h:175
uint8_t reg_cg_check_apsrc_req_mask_b
Definition: spm.h:758
uint8_t reg_mcupm_srcclkena_mask_b
Definition: spm.h:774
u8 reg_sw2spm_int0_mask_b
Definition: spm.h:244
u8 reg_sc_scp2spm_wakeup_mask_b
Definition: spm.h:250
u8 reg_dramc1_md32_infra_req_mask_b
Definition: spm.h:282
u8 reg_spm_ddr_en_reserved_mask_b
Definition: spm.h:256
u8 reg_spm_ddr_en_req
Definition: spm.h:167
uint8_t reg_ufs_vrf18_req_mask_b
Definition: spm.h:742
u8 reg_spm_srcclkena_reserved_mask_b
Definition: spm.h:252
uint8_t reg_conn_infra_req_mask_b
Definition: spm.h:713
u8 reg_spm_infra_req_reserved_mask_b
Definition: spm.h:253
uint32_t pcm_flags1_cust_set
Definition: spm.h:662
u8 reg_md32_vrf18_req_mask_b
Definition: spm.h:205
u8 reg_md_apsrc_req_1_mask_b
Definition: spm.h:184
uint32_t reg_mcusys_merge_apsrc_req_mask_b
Definition: spm.h:803
uint32_t timer_val
Definition: spm.h:664
uint32_t timer_val_cust
Definition: spm.h:665
uint32_t pcm_flags1_cust_clr
Definition: spm.h:663
uint8_t reg_pcie_srcclkena_mask_b
Definition: spm.h:823
uint8_t reg_msdc1_srcclkena_mask_b
Definition: spm.h:784
u8 reg_md_apsrc2infra_req_0_mask_b
Definition: spm.h:177
uint8_t reg_conn_vrf18_req_mask_b
Definition: spm.h:715
u8 reg_audio_dsp_ddr_en_mask_b
Definition: spm.h:218
u8 reg_dramc1_md32_wakeup_mask
Definition: spm.h:286
uint8_t reg_pcie_infra_req_mask_b
Definition: spm.h:824
uint32_t reg_ext_wakeup_event_mask
Definition: spm.h:820
uint8_t reg_msdc0_apsrc_req_mask_b
Definition: spm.h:781
uint8_t reg_spm_f26m_req
Definition: spm.h:690
uint8_t reg_scp_srcclkena_mask_b
Definition: spm.h:729
uint8_t reg_bak_psri_infra_req_mask_b
Definition: spm.h:793
uint8_t reg_spm_sw_mailbox_req
Definition: spm.h:695
uint8_t reg_spm_infra_req
Definition: spm.h:691
uint8_t reg_spm_apsrc_req
Definition: spm.h:689
u8 reg_srcclkeni2_infra_req_mask_b
Definition: spm.h:199
u8 reg_md32_ddr_en_mask_b
Definition: spm.h:206
u8 reg_srcclkeni1_infra_req_mask_b
Definition: spm.h:197
uint8_t reg_dvfsrc_event_trigger_mask_b
Definition: spm.h:763
u8 reg_msdc1_ddr_en_mask_b
Definition: spm.h:271
u8 reg_sw2spm_int1_mask_b
Definition: spm.h:245
u32 reg_mcusys_merge_ddr_en_mask_b
Definition: spm.h:290
uint8_t reg_audio_dsp_srcclkena_mask_b
Definition: spm.h:734
uint8_t reg_spm_scp_mailbox_req
Definition: spm.h:698
uint8_t reg_mp0_cputop_idle_mask
Definition: spm.h:677
u8 reg_md_apsrc2infra_req_1_mask_b
Definition: spm.h:183
u8 reg_conn_ddr_en_mask_b
Definition: spm.h:192
u8 val
Definition: sys.c:300
void udelay(uint32_t us)
Definition: udelay.c:15