1 /*
2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include <assert.h>
8 #include <errno.h>
9
10 #include <platform_def.h>
11
12 #include <arch_helpers.h>
13 #include <bl31/bl31.h>
14 #include <common/debug.h>
15 #include <drivers/console.h>
16 #include <drivers/delay_timer.h>
17 #include <lib/bakery_lock.h>
18 #include <lib/mmio.h>
19 #include <plat/common/platform.h>
20
21 #include <plat_private.h>
22 #include <pmu.h>
23 #include <pmu_com.h>
24 #include <rk3328_def.h>
25
26 DEFINE_BAKERY_LOCK(rockchip_pd_lock);
27
28 static struct rk3328_sleep_ddr_data ddr_data;
29 static __sramdata struct rk3328_sleep_sram_data sram_data;
30
31 static uint32_t cpu_warm_boot_addr;
32
33 #pragma weak rk3328_pmic_suspend
34 #pragma weak rk3328_pmic_resume
35
get_cpus_pwr_domain_cfg_info(uint32_t cpu_id)36 static inline uint32_t get_cpus_pwr_domain_cfg_info(uint32_t cpu_id)
37 {
38 uint32_t pd_reg, apm_reg;
39
40 pd_reg = mmio_read_32(PMU_BASE + PMU_PWRDN_CON) & BIT(cpu_id);
41 apm_reg = mmio_read_32(PMU_BASE + PMU_CPUAPM_CON(cpu_id)) &
42 BIT(core_pm_en);
43
44 if (pd_reg && !apm_reg)
45 return core_pwr_pd;
46 else if (!pd_reg && apm_reg)
47 return core_pwr_wfi;
48
49 ERROR("%s: 0x%x, 0x%x\n", __func__, pd_reg, apm_reg);
50 while (1)
51 ;
52 }
53
cpus_power_domain_on(uint32_t cpu_id)54 static int cpus_power_domain_on(uint32_t cpu_id)
55 {
56 uint32_t cpu_pd, cfg_info;
57
58 cpu_pd = PD_CPU0 + cpu_id;
59 cfg_info = get_cpus_pwr_domain_cfg_info(cpu_id);
60
61 if (cfg_info == core_pwr_pd) {
62 /* disable apm cfg */
63 mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(cpu_id),
64 CORES_PM_DISABLE);
65
66 /* if the cores have be on, power off it firstly */
67 if (pmu_power_domain_st(cpu_pd) == pmu_pd_on) {
68 mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(cpu_id),
69 CORES_PM_DISABLE);
70 pmu_power_domain_ctr(cpu_pd, pmu_pd_off);
71 }
72 pmu_power_domain_ctr(cpu_pd, pmu_pd_on);
73 } else {
74 if (pmu_power_domain_st(cpu_pd) == pmu_pd_on) {
75 WARN("%s: cpu%d is not in off,!\n", __func__, cpu_id);
76 return -EINVAL;
77 }
78
79 mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(cpu_id),
80 BIT(core_pm_sft_wakeup_en));
81 }
82
83 return 0;
84 }
85
cpus_power_domain_off(uint32_t cpu_id,uint32_t pd_cfg)86 static int cpus_power_domain_off(uint32_t cpu_id, uint32_t pd_cfg)
87 {
88 uint32_t cpu_pd, core_pm_value;
89
90 cpu_pd = PD_CPU0 + cpu_id;
91 if (pmu_power_domain_st(cpu_pd) == pmu_pd_off)
92 return 0;
93
94 if (pd_cfg == core_pwr_pd) {
95 if (check_cpu_wfie(cpu_id, CKECK_WFEI_MSK))
96 return -EINVAL;
97 /* disable apm cfg */
98 mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(cpu_id),
99 CORES_PM_DISABLE);
100 pmu_power_domain_ctr(cpu_pd, pmu_pd_off);
101 } else {
102 core_pm_value = BIT(core_pm_en) | BIT(core_pm_dis_int);
103 if (pd_cfg == core_pwr_wfi_int)
104 core_pm_value |= BIT(core_pm_int_wakeup_en);
105
106 mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(cpu_id),
107 core_pm_value);
108 }
109
110 return 0;
111 }
112
nonboot_cpus_off(void)113 static void nonboot_cpus_off(void)
114 {
115 uint32_t boot_cpu, cpu;
116
117 /* turn off noboot cpus */
118 boot_cpu = plat_my_core_pos();
119 for (cpu = 0; cpu < PLATFORM_CORE_COUNT; cpu++) {
120 if (cpu == boot_cpu)
121 continue;
122 cpus_power_domain_off(cpu, core_pwr_pd);
123 }
124 }
125
sram_save(void)126 void sram_save(void)
127 {
128 /* TODO: support the sdram save for rk3328 SoCs*/
129 }
130
sram_restore(void)131 void sram_restore(void)
132 {
133 /* TODO: support the sdram restore for rk3328 SoCs */
134 }
135
rockchip_soc_cores_pwr_dm_on(unsigned long mpidr,uint64_t entrypoint)136 int rockchip_soc_cores_pwr_dm_on(unsigned long mpidr, uint64_t entrypoint)
137 {
138 uint32_t cpu_id = plat_core_pos_by_mpidr(mpidr);
139
140 assert(cpu_id < PLATFORM_CORE_COUNT);
141 assert(cpuson_flags[cpu_id] == 0);
142 cpuson_flags[cpu_id] = PMU_CPU_HOTPLUG;
143 cpuson_entry_point[cpu_id] = entrypoint;
144 dsb();
145
146 cpus_power_domain_on(cpu_id);
147
148 return 0;
149 }
150
rockchip_soc_cores_pwr_dm_off(void)151 int rockchip_soc_cores_pwr_dm_off(void)
152 {
153 uint32_t cpu_id = plat_my_core_pos();
154
155 cpus_power_domain_off(cpu_id, core_pwr_wfi);
156
157 return 0;
158 }
159
rockchip_soc_cores_pwr_dm_suspend(void)160 int rockchip_soc_cores_pwr_dm_suspend(void)
161 {
162 uint32_t cpu_id = plat_my_core_pos();
163
164 assert(cpu_id < PLATFORM_CORE_COUNT);
165 assert(cpuson_flags[cpu_id] == 0);
166 cpuson_flags[cpu_id] = PMU_CPU_AUTO_PWRDN;
167 cpuson_entry_point[cpu_id] = (uintptr_t)plat_get_sec_entrypoint();
168 dsb();
169
170 cpus_power_domain_off(cpu_id, core_pwr_wfi_int);
171
172 return 0;
173 }
174
rockchip_soc_cores_pwr_dm_on_finish(void)175 int rockchip_soc_cores_pwr_dm_on_finish(void)
176 {
177 uint32_t cpu_id = plat_my_core_pos();
178
179 mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(cpu_id), CORES_PM_DISABLE);
180
181 return 0;
182 }
183
rockchip_soc_cores_pwr_dm_resume(void)184 int rockchip_soc_cores_pwr_dm_resume(void)
185 {
186 uint32_t cpu_id = plat_my_core_pos();
187
188 mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(cpu_id), CORES_PM_DISABLE);
189
190 return 0;
191 }
192
rockchip_soc_soft_reset(void)193 void __dead2 rockchip_soc_soft_reset(void)
194 {
195 mmio_write_32(CRU_BASE + CRU_CRU_MODE, PLL_SLOW_MODE(CPLL_ID));
196 mmio_write_32(CRU_BASE + CRU_CRU_MODE, PLL_SLOW_MODE(GPLL_ID));
197 mmio_write_32(CRU_BASE + CRU_CRU_MODE, PLL_SLOW_MODE(NPLL_ID));
198 mmio_write_32(CRU_BASE + CRU_CRU_MODE, PLL_SLOW_MODE(APLL_ID));
199 dsb();
200
201 mmio_write_32(CRU_BASE + CRU_GLB_SRST_FST, CRU_GLB_SRST_FST_VALUE);
202 dsb();
203 /*
204 * Maybe the HW needs some times to reset the system,
205 * so we do not hope the core to execute valid codes.
206 */
207 while (1)
208 ;
209 }
210
211 /*
212 * For PMIC RK805, its sleep pin is connect with gpio2_d2 from rk3328.
213 * If the PMIC is configured for responding the sleep pin to power off it,
214 * once the pin is output high, it will get the pmic power off.
215 */
rockchip_soc_system_off(void)216 void __dead2 rockchip_soc_system_off(void)
217 {
218 uint32_t val;
219
220 /* gpio config */
221 val = mmio_read_32(GRF_BASE + GRF_GPIO2D_IOMUX);
222 val &= ~GPIO2_D2_GPIO_MODE;
223 mmio_write_32(GRF_BASE + GRF_GPIO2D_IOMUX, val);
224
225 /* config output */
226 val = mmio_read_32(GPIO2_BASE + SWPORTA_DDR);
227 val |= GPIO2_D2;
228 mmio_write_32(GPIO2_BASE + SWPORTA_DDR, val);
229
230 /* config output high level */
231 val = mmio_read_32(GPIO2_BASE);
232 val |= GPIO2_D2;
233 mmio_write_32(GPIO2_BASE, val);
234 dsb();
235
236 while (1)
237 ;
238 }
239
240 static uint32_t clk_ungt_msk[CRU_CLKGATE_NUMS] = {
241 0x187f, 0x0000, 0x010c, 0x0000, 0x0200,
242 0x0010, 0x0000, 0x0017, 0x001f, 0x0000,
243 0x0000, 0x0000, 0x0000, 0x0003, 0x0000,
244 0xf001, 0x27c0, 0x04D9, 0x03ff, 0x0000,
245 0x0000, 0x0000, 0x0010, 0x0000, 0x0000,
246 0x0000, 0x0000, 0x0003, 0x0008
247 };
248
clks_gating_suspend(uint32_t * ungt_msk)249 static void clks_gating_suspend(uint32_t *ungt_msk)
250 {
251 int i;
252
253 for (i = 0; i < CRU_CLKGATE_NUMS; i++) {
254 ddr_data.clk_ungt_save[i] =
255 mmio_read_32(CRU_BASE + CRU_CLKGATE_CON(i));
256 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(i),
257 ((~ungt_msk[i]) << 16) | 0xffff);
258 }
259 }
260
clks_gating_resume(void)261 static void clks_gating_resume(void)
262 {
263 int i;
264
265 for (i = 0; i < CRU_CLKGATE_NUMS; i++)
266 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(i),
267 ddr_data.clk_ungt_save[i] | 0xffff0000);
268 }
269
pm_pll_wait_lock(uint32_t pll_id)270 static inline void pm_pll_wait_lock(uint32_t pll_id)
271 {
272 uint32_t delay = PLL_LOCKED_TIMEOUT;
273
274 while (delay > 0) {
275 if (mmio_read_32(CRU_BASE + PLL_CONS(pll_id, 1)) &
276 PLL_IS_LOCKED)
277 break;
278 delay--;
279 }
280 if (delay == 0)
281 ERROR("lock-pll: %d\n", pll_id);
282 }
283
pll_pwr_dwn(uint32_t pll_id,uint32_t pd)284 static inline void pll_pwr_dwn(uint32_t pll_id, uint32_t pd)
285 {
286 mmio_write_32(CRU_BASE + PLL_CONS(pll_id, 1),
287 BITS_WITH_WMASK(1U, 1U, 15));
288 if (pd)
289 mmio_write_32(CRU_BASE + PLL_CONS(pll_id, 1),
290 BITS_WITH_WMASK(1, 1, 14));
291 else
292 mmio_write_32(CRU_BASE + PLL_CONS(pll_id, 1),
293 BITS_WITH_WMASK(0, 1, 14));
294 }
295
dpll_suspend(void)296 static __sramfunc void dpll_suspend(void)
297 {
298 int i;
299
300 /* slow mode */
301 mmio_write_32(CRU_BASE + CRU_CRU_MODE, PLL_SLOW_MODE(DPLL_ID));
302
303 /* save pll con */
304 for (i = 0; i < CRU_PLL_CON_NUMS; i++)
305 sram_data.dpll_con_save[i] =
306 mmio_read_32(CRU_BASE + PLL_CONS(DPLL_ID, i));
307 mmio_write_32(CRU_BASE + PLL_CONS(DPLL_ID, 1),
308 BITS_WITH_WMASK(1U, 1U, 15));
309 mmio_write_32(CRU_BASE + PLL_CONS(DPLL_ID, 1),
310 BITS_WITH_WMASK(1, 1, 14));
311 }
312
dpll_resume(void)313 static __sramfunc void dpll_resume(void)
314 {
315 uint32_t delay = PLL_LOCKED_TIMEOUT;
316
317 mmio_write_32(CRU_BASE + PLL_CONS(DPLL_ID, 1),
318 BITS_WITH_WMASK(1U, 1U, 15));
319 mmio_write_32(CRU_BASE + PLL_CONS(DPLL_ID, 1),
320 BITS_WITH_WMASK(0, 1, 14));
321 mmio_write_32(CRU_BASE + PLL_CONS(DPLL_ID, 1),
322 sram_data.dpll_con_save[1] | 0xc0000000);
323
324 dsb();
325
326 while (delay > 0) {
327 if (mmio_read_32(CRU_BASE + PLL_CONS(DPLL_ID, 1)) &
328 PLL_IS_LOCKED)
329 break;
330 delay--;
331 }
332 if (delay == 0)
333 while (1)
334 ;
335
336 mmio_write_32(CRU_BASE + CRU_CRU_MODE,
337 PLL_NORM_MODE(DPLL_ID));
338 }
339
pll_suspend(uint32_t pll_id)340 static inline void pll_suspend(uint32_t pll_id)
341 {
342 int i;
343
344 /* slow mode */
345 mmio_write_32(CRU_BASE + CRU_CRU_MODE, PLL_SLOW_MODE(pll_id));
346
347 /* save pll con */
348 for (i = 0; i < CRU_PLL_CON_NUMS; i++)
349 ddr_data.cru_plls_con_save[pll_id][i] =
350 mmio_read_32(CRU_BASE + PLL_CONS(pll_id, i));
351
352 /* powerdown pll */
353 pll_pwr_dwn(pll_id, pmu_pd_off);
354 }
355
pll_resume(uint32_t pll_id)356 static inline void pll_resume(uint32_t pll_id)
357 {
358 mmio_write_32(CRU_BASE + PLL_CONS(pll_id, 1),
359 ddr_data.cru_plls_con_save[pll_id][1] | 0xc0000000);
360
361 pm_pll_wait_lock(pll_id);
362
363 if (PLL_IS_NORM_MODE(ddr_data.cru_mode_save, pll_id))
364 mmio_write_32(CRU_BASE + CRU_CRU_MODE,
365 PLL_NORM_MODE(pll_id));
366 }
367
pm_plls_suspend(void)368 static void pm_plls_suspend(void)
369 {
370 ddr_data.cru_mode_save = mmio_read_32(CRU_BASE + CRU_CRU_MODE);
371 ddr_data.clk_sel0 = mmio_read_32(CRU_BASE + CRU_CLKSEL_CON(0));
372 ddr_data.clk_sel1 = mmio_read_32(CRU_BASE + CRU_CLKSEL_CON(1));
373 ddr_data.clk_sel18 = mmio_read_32(CRU_BASE + CRU_CLKSEL_CON(18));
374 ddr_data.clk_sel20 = mmio_read_32(CRU_BASE + CRU_CLKSEL_CON(20));
375 ddr_data.clk_sel24 = mmio_read_32(CRU_BASE + CRU_CLKSEL_CON(24));
376 ddr_data.clk_sel38 = mmio_read_32(CRU_BASE + CRU_CLKSEL_CON(38));
377 pll_suspend(NPLL_ID);
378 pll_suspend(CPLL_ID);
379 pll_suspend(GPLL_ID);
380 pll_suspend(APLL_ID);
381
382 /* core */
383 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(0),
384 BITS_WITH_WMASK(0, 0x1f, 0));
385
386 /* pclk_dbg */
387 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(1),
388 BITS_WITH_WMASK(0, 0xf, 0));
389
390 /* crypto */
391 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(20),
392 BITS_WITH_WMASK(0, 0x1f, 0));
393
394 /* pwm0 */
395 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(24),
396 BITS_WITH_WMASK(0, 0x7f, 8));
397
398 /* uart2 from 24M */
399 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(18),
400 BITS_WITH_WMASK(2, 0x3, 8));
401
402 /* clk_rtc32k */
403 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(38),
404 BITS_WITH_WMASK(767, 0x3fff, 0) |
405 BITS_WITH_WMASK(2U, 0x3u, 14));
406 }
407
pm_plls_resume(void)408 static void pm_plls_resume(void)
409 {
410 /* clk_rtc32k */
411 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(38),
412 ddr_data.clk_sel38 |
413 BITS_WMSK(0x3fff, 0) |
414 BITS_WMSK(0x3u, 14));
415
416 /* uart2 */
417 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(18),
418 ddr_data.clk_sel18 | BITS_WMSK(0x3, 8));
419
420 /* pwm0 */
421 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(24),
422 ddr_data.clk_sel24 | BITS_WMSK(0x7f, 8));
423
424 /* crypto */
425 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(20),
426 ddr_data.clk_sel20 | BITS_WMSK(0x1f, 0));
427
428 /* pclk_dbg */
429 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(1),
430 ddr_data.clk_sel1 | BITS_WMSK(0xf, 0));
431
432 /* core */
433 mmio_write_32(CRU_BASE + CRU_CLKSEL_CON(0),
434 ddr_data.clk_sel0 | BITS_WMSK(0x1f, 0));
435
436 pll_pwr_dwn(APLL_ID, pmu_pd_on);
437 pll_pwr_dwn(GPLL_ID, pmu_pd_on);
438 pll_pwr_dwn(CPLL_ID, pmu_pd_on);
439 pll_pwr_dwn(NPLL_ID, pmu_pd_on);
440
441 pll_resume(APLL_ID);
442 pll_resume(GPLL_ID);
443 pll_resume(CPLL_ID);
444 pll_resume(NPLL_ID);
445 }
446
447 #define ARCH_TIMER_TICKS_PER_US (SYS_COUNTER_FREQ_IN_TICKS / 1000000)
448
sram_udelay(uint32_t us)449 static __sramfunc void sram_udelay(uint32_t us)
450 {
451 uint64_t pct_orig, pct_now;
452 uint64_t to_wait = ARCH_TIMER_TICKS_PER_US * us;
453
454 isb();
455 pct_orig = read_cntpct_el0();
456
457 do {
458 isb();
459 pct_now = read_cntpct_el0();
460 } while ((pct_now - pct_orig) <= to_wait);
461 }
462
463 /*
464 * For PMIC RK805, its sleep pin is connect with gpio2_d2 from rk3328.
465 * If the PMIC is configured for responding the sleep pin
466 * to get it into sleep mode,
467 * once the pin is output high, it will get the pmic into sleep mode.
468 */
rk3328_pmic_suspend(void)469 __sramfunc void rk3328_pmic_suspend(void)
470 {
471 sram_data.pmic_sleep_save = mmio_read_32(GRF_BASE + PMIC_SLEEP_REG);
472 sram_data.pmic_sleep_gpio_save[1] = mmio_read_32(GPIO2_BASE + 4);
473 sram_data.pmic_sleep_gpio_save[0] = mmio_read_32(GPIO2_BASE);
474 mmio_write_32(GRF_BASE + PMIC_SLEEP_REG, BITS_WITH_WMASK(0, 0x3, 4));
475 mmio_write_32(GPIO2_BASE + 4,
476 sram_data.pmic_sleep_gpio_save[1] | BIT(26));
477 mmio_write_32(GPIO2_BASE,
478 sram_data.pmic_sleep_gpio_save[0] | BIT(26));
479 }
480
rk3328_pmic_resume(void)481 __sramfunc void rk3328_pmic_resume(void)
482 {
483 mmio_write_32(GPIO2_BASE, sram_data.pmic_sleep_gpio_save[0]);
484 mmio_write_32(GPIO2_BASE + 4, sram_data.pmic_sleep_gpio_save[1]);
485 mmio_write_32(GRF_BASE + PMIC_SLEEP_REG,
486 sram_data.pmic_sleep_save | BITS_WMSK(0xffffu, 0));
487 /* Resuming volt need a lot of time */
488 sram_udelay(100);
489 }
490
ddr_suspend(void)491 static __sramfunc void ddr_suspend(void)
492 {
493 sram_data.pd_sr_idle_save = mmio_read_32(DDR_UPCTL_BASE +
494 DDR_PCTL2_PWRCTL);
495 sram_data.pd_sr_idle_save &= SELFREF_EN;
496
497 mmio_clrbits_32(DDR_UPCTL_BASE + DDR_PCTL2_PWRCTL, SELFREF_EN);
498 sram_data.ddr_grf_con0 = mmio_read_32(DDR_GRF_BASE +
499 DDRGRF_SOC_CON(0));
500 mmio_write_32(DDR_GRF_BASE, BIT_WITH_WMSK(14) | WMSK_BIT(15));
501
502 /*
503 * Override csysreq from ddrc and
504 * send valid csysreq signal to PMU,
505 * csysreq is controlled by ddrc only
506 */
507
508 /* in self-refresh */
509 mmio_setbits_32(PMU_BASE + PMU_SFT_CON, BIT(0));
510 while ((mmio_read_32(DDR_GRF_BASE + DDRGRF_SOC_STATUS(1)) &
511 (0x03 << 12)) != (0x02 << 12))
512 ;
513 /* ddr retention */
514 mmio_setbits_32(PMU_BASE + PMU_SFT_CON, BIT(2));
515
516 /* ddr gating */
517 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(0),
518 BITS_WITH_WMASK(0x7, 0x7, 4));
519 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(7),
520 BITS_WITH_WMASK(1, 1, 4));
521 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(18),
522 BITS_WITH_WMASK(0x1ff, 0x1ff, 1));
523 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(27),
524 BITS_WITH_WMASK(0x3, 0x3, 0));
525
526 dpll_suspend();
527 }
528
dmc_restore(void)529 __sramfunc void dmc_restore(void)
530 {
531 dpll_resume();
532
533 /* ddr gating */
534 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(0),
535 BITS_WITH_WMASK(0, 0x7, 4));
536 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(7),
537 BITS_WITH_WMASK(0, 1, 4));
538 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(18),
539 BITS_WITH_WMASK(0, 0x1ff, 1));
540 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(27),
541 BITS_WITH_WMASK(0, 0x3, 0));
542
543 /* ddr de_retention */
544 mmio_clrbits_32(PMU_BASE + PMU_SFT_CON, BIT(2));
545 /* exit self-refresh */
546 mmio_clrbits_32(PMU_BASE + PMU_SFT_CON, BIT(0));
547 while ((mmio_read_32(DDR_GRF_BASE + DDRGRF_SOC_STATUS(1)) &
548 (0x03 << 12)) != (0x00 << 12))
549 ;
550
551 mmio_write_32(DDR_GRF_BASE, sram_data.ddr_grf_con0 | 0xc0000000);
552 if (sram_data.pd_sr_idle_save)
553 mmio_setbits_32(DDR_UPCTL_BASE + DDR_PCTL2_PWRCTL,
554 SELFREF_EN);
555 }
556
sram_dbg_uart_suspend(void)557 static __sramfunc void sram_dbg_uart_suspend(void)
558 {
559 sram_data.uart2_ier = mmio_read_32(UART2_BASE + UART_IER);
560 mmio_write_32(UART2_BASE + UART_IER, UART_INT_DISABLE);
561 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(16), 0x20002000);
562 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(2), 0x00040004);
563 }
564
sram_dbg_uart_resume(void)565 __sramfunc void sram_dbg_uart_resume(void)
566 {
567 /* restore uart clk and reset fifo */
568 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(16), 0x20000000);
569 mmio_write_32(CRU_BASE + CRU_CLKGATE_CON(2), 0x00040000);
570 mmio_write_32(UART2_BASE + UART_FCR, UART_FIFO_RESET);
571 mmio_write_32(UART2_BASE + UART_IER, sram_data.uart2_ier);
572 }
573
sram_soc_enter_lp(void)574 static __sramfunc void sram_soc_enter_lp(void)
575 {
576 uint32_t apm_value;
577
578 apm_value = BIT(core_pm_en) |
579 BIT(core_pm_dis_int) |
580 BIT(core_pm_int_wakeup_en);
581 mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(PD_CPU0), apm_value);
582
583 dsb();
584 isb();
585 err_loop:
586 wfi();
587 /*
588 *Soc will enter low power mode and
589 *do not return to here.
590 */
591 goto err_loop;
592 }
593
sram_suspend(void)594 __sramfunc void sram_suspend(void)
595 {
596 /* disable mmu and icache */
597 disable_mmu_icache_el3();
598 tlbialle3();
599 dsbsy();
600 isb();
601
602 mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1),
603 ((uintptr_t)&pmu_cpuson_entrypoint >> CPU_BOOT_ADDR_ALIGN) |
604 CPU_BOOT_ADDR_WMASK);
605
606 /* ddr self-refresh and gating phy */
607 ddr_suspend();
608
609 rk3328_pmic_suspend();
610
611 sram_dbg_uart_suspend();
612
613 sram_soc_enter_lp();
614 }
615
rockchip_soc_sys_pd_pwr_dn_wfi(void)616 void __dead2 rockchip_soc_sys_pd_pwr_dn_wfi(void)
617 {
618 sram_suspend();
619
620 /* should never reach here */
621 psci_power_down_wfi();
622 }
623
rockchip_soc_sys_pwr_dm_suspend(void)624 int rockchip_soc_sys_pwr_dm_suspend(void)
625 {
626 clks_gating_suspend(clk_ungt_msk);
627
628 pm_plls_suspend();
629
630 return 0;
631 }
632
rockchip_soc_sys_pwr_dm_resume(void)633 int rockchip_soc_sys_pwr_dm_resume(void)
634 {
635 pm_plls_resume();
636
637 clks_gating_resume();
638
639 plat_rockchip_gic_cpuif_enable();
640
641 return 0;
642 }
643
rockchip_plat_mmu_el3(void)644 void rockchip_plat_mmu_el3(void)
645 {
646 /* TODO: support the el3 for rk3328 SoCs */
647 }
648
plat_rockchip_pmu_init(void)649 void plat_rockchip_pmu_init(void)
650 {
651 uint32_t cpu;
652
653 for (cpu = 0; cpu < PLATFORM_CORE_COUNT; cpu++)
654 cpuson_flags[cpu] = 0;
655
656 cpu_warm_boot_addr = (uint64_t)platform_cpu_warmboot;
657
658 /* the warm booting address of cpus */
659 mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1),
660 (cpu_warm_boot_addr >> CPU_BOOT_ADDR_ALIGN) |
661 CPU_BOOT_ADDR_WMASK);
662
663 nonboot_cpus_off();
664
665 INFO("%s: pd status 0x%x\n",
666 __func__, mmio_read_32(PMU_BASE + PMU_PWRDN_ST));
667 }
668