xref: /arm-trusted-firmware/plat/rockchip/rk3368/drivers/pmu/pmu.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <assert.h>
8*91f16700Schasinglulu #include <errno.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <platform_def.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <arch_helpers.h>
13*91f16700Schasinglulu #include <common/debug.h>
14*91f16700Schasinglulu #include <drivers/delay_timer.h>
15*91f16700Schasinglulu #include <lib/mmio.h>
16*91f16700Schasinglulu #include <plat/common/platform.h>
17*91f16700Schasinglulu 
18*91f16700Schasinglulu #include <ddr_rk3368.h>
19*91f16700Schasinglulu #include <plat_private.h>
20*91f16700Schasinglulu #include <pmu.h>
21*91f16700Schasinglulu #include <pmu_com.h>
22*91f16700Schasinglulu #include <rk3368_def.h>
23*91f16700Schasinglulu #include <soc.h>
24*91f16700Schasinglulu 
25*91f16700Schasinglulu DEFINE_BAKERY_LOCK(rockchip_pd_lock);
26*91f16700Schasinglulu 
27*91f16700Schasinglulu static uint32_t cpu_warm_boot_addr;
28*91f16700Schasinglulu 
29*91f16700Schasinglulu void rk3368_flash_l2_b(void)
30*91f16700Schasinglulu {
31*91f16700Schasinglulu 	uint32_t wait_cnt = 0;
32*91f16700Schasinglulu 
33*91f16700Schasinglulu 	regs_updata_bit_set(PMU_BASE + PMU_SFT_CON, pmu_sft_l2flsh_clst_b);
34*91f16700Schasinglulu 	dsb();
35*91f16700Schasinglulu 
36*91f16700Schasinglulu 	while (!(mmio_read_32(PMU_BASE + PMU_CORE_PWR_ST)
37*91f16700Schasinglulu 		& BIT(clst_b_l2_flsh_done))) {
38*91f16700Schasinglulu 		wait_cnt++;
39*91f16700Schasinglulu 		if (!(wait_cnt % MAX_WAIT_CONUT))
40*91f16700Schasinglulu 			WARN("%s:reg %x,wait\n", __func__,
41*91f16700Schasinglulu 			     mmio_read_32(PMU_BASE + PMU_CORE_PWR_ST));
42*91f16700Schasinglulu 	}
43*91f16700Schasinglulu 
44*91f16700Schasinglulu 	regs_updata_bit_clr(PMU_BASE + PMU_SFT_CON, pmu_sft_l2flsh_clst_b);
45*91f16700Schasinglulu }
46*91f16700Schasinglulu 
47*91f16700Schasinglulu static inline int rk3368_pmu_bus_idle(uint32_t req, uint32_t idle)
48*91f16700Schasinglulu {
49*91f16700Schasinglulu 	uint32_t mask = BIT(req);
50*91f16700Schasinglulu 	uint32_t idle_mask = 0;
51*91f16700Schasinglulu 	uint32_t idle_target = 0;
52*91f16700Schasinglulu 	uint32_t val;
53*91f16700Schasinglulu 	uint32_t wait_cnt = 0;
54*91f16700Schasinglulu 
55*91f16700Schasinglulu 	switch (req) {
56*91f16700Schasinglulu 	case bus_ide_req_clst_l:
57*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_cluster_l);
58*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_cluster_l);
59*91f16700Schasinglulu 		break;
60*91f16700Schasinglulu 
61*91f16700Schasinglulu 	case bus_ide_req_clst_b:
62*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_cluster_b);
63*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_cluster_b);
64*91f16700Schasinglulu 		break;
65*91f16700Schasinglulu 
66*91f16700Schasinglulu 	case bus_ide_req_cxcs:
67*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_cxcs);
68*91f16700Schasinglulu 		idle_target = ((!idle) << pmu_idle_ack_cxcs);
69*91f16700Schasinglulu 		break;
70*91f16700Schasinglulu 
71*91f16700Schasinglulu 	case bus_ide_req_cci400:
72*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_cci400);
73*91f16700Schasinglulu 		idle_target = ((!idle) << pmu_idle_ack_cci400);
74*91f16700Schasinglulu 		break;
75*91f16700Schasinglulu 
76*91f16700Schasinglulu 	case bus_ide_req_gpu:
77*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_gpu) | BIT(pmu_idle_gpu);
78*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_gpu) |
79*91f16700Schasinglulu 			      (idle << pmu_idle_gpu);
80*91f16700Schasinglulu 		break;
81*91f16700Schasinglulu 
82*91f16700Schasinglulu 	case bus_ide_req_core:
83*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_core) | BIT(pmu_idle_core);
84*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_core) |
85*91f16700Schasinglulu 			      (idle << pmu_idle_core);
86*91f16700Schasinglulu 		break;
87*91f16700Schasinglulu 
88*91f16700Schasinglulu 	case bus_ide_req_bus:
89*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_bus) | BIT(pmu_idle_bus);
90*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_bus) |
91*91f16700Schasinglulu 			      (idle << pmu_idle_bus);
92*91f16700Schasinglulu 		break;
93*91f16700Schasinglulu 	case bus_ide_req_dma:
94*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_dma) | BIT(pmu_idle_dma);
95*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_dma) |
96*91f16700Schasinglulu 			      (idle << pmu_idle_dma);
97*91f16700Schasinglulu 		break;
98*91f16700Schasinglulu 
99*91f16700Schasinglulu 	case bus_ide_req_peri:
100*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_peri) | BIT(pmu_idle_peri);
101*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_peri) |
102*91f16700Schasinglulu 			      (idle << pmu_idle_peri);
103*91f16700Schasinglulu 		break;
104*91f16700Schasinglulu 
105*91f16700Schasinglulu 	case bus_ide_req_video:
106*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_video) | BIT(pmu_idle_video);
107*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_video) |
108*91f16700Schasinglulu 			      (idle << pmu_idle_video);
109*91f16700Schasinglulu 		break;
110*91f16700Schasinglulu 
111*91f16700Schasinglulu 	case bus_ide_req_vio:
112*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_vio) | BIT(pmu_idle_vio);
113*91f16700Schasinglulu 		idle_target = (pmu_idle_ack_vio) |
114*91f16700Schasinglulu 			      (idle << pmu_idle_vio);
115*91f16700Schasinglulu 		break;
116*91f16700Schasinglulu 
117*91f16700Schasinglulu 	case bus_ide_req_alive:
118*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_alive) | BIT(pmu_idle_alive);
119*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_alive) |
120*91f16700Schasinglulu 			      (idle << pmu_idle_alive);
121*91f16700Schasinglulu 		break;
122*91f16700Schasinglulu 
123*91f16700Schasinglulu 	case bus_ide_req_pmu:
124*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_pmu) | BIT(pmu_idle_pmu);
125*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_pmu) |
126*91f16700Schasinglulu 			      (idle << pmu_idle_pmu);
127*91f16700Schasinglulu 		break;
128*91f16700Schasinglulu 
129*91f16700Schasinglulu 	case bus_ide_req_msch:
130*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_msch) | BIT(pmu_idle_msch);
131*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_msch) |
132*91f16700Schasinglulu 			      (idle << pmu_idle_msch);
133*91f16700Schasinglulu 		break;
134*91f16700Schasinglulu 
135*91f16700Schasinglulu 	case bus_ide_req_cci:
136*91f16700Schasinglulu 		idle_mask = BIT(pmu_idle_ack_cci) | BIT(pmu_idle_cci);
137*91f16700Schasinglulu 		idle_target = (idle << pmu_idle_ack_cci) |
138*91f16700Schasinglulu 			      (idle << pmu_idle_cci);
139*91f16700Schasinglulu 		break;
140*91f16700Schasinglulu 
141*91f16700Schasinglulu 	default:
142*91f16700Schasinglulu 		ERROR("%s: Unsupported the idle request\n", __func__);
143*91f16700Schasinglulu 		break;
144*91f16700Schasinglulu 	}
145*91f16700Schasinglulu 
146*91f16700Schasinglulu 	val = mmio_read_32(PMU_BASE + PMU_BUS_IDE_REQ);
147*91f16700Schasinglulu 	if (idle)
148*91f16700Schasinglulu 		val |=	mask;
149*91f16700Schasinglulu 	else
150*91f16700Schasinglulu 		val &= ~mask;
151*91f16700Schasinglulu 
152*91f16700Schasinglulu 	mmio_write_32(PMU_BASE + PMU_BUS_IDE_REQ, val);
153*91f16700Schasinglulu 
154*91f16700Schasinglulu 	while ((mmio_read_32(PMU_BASE +
155*91f16700Schasinglulu 	       PMU_BUS_IDE_ST) & idle_mask) != idle_target) {
156*91f16700Schasinglulu 		wait_cnt++;
157*91f16700Schasinglulu 		if (!(wait_cnt % MAX_WAIT_CONUT))
158*91f16700Schasinglulu 			WARN("%s:st=%x(%x)\n", __func__,
159*91f16700Schasinglulu 			     mmio_read_32(PMU_BASE + PMU_BUS_IDE_ST),
160*91f16700Schasinglulu 			     idle_mask);
161*91f16700Schasinglulu 	}
162*91f16700Schasinglulu 
163*91f16700Schasinglulu 	return 0;
164*91f16700Schasinglulu }
165*91f16700Schasinglulu 
166*91f16700Schasinglulu void pmu_scu_b_pwrup(void)
167*91f16700Schasinglulu {
168*91f16700Schasinglulu 	regs_updata_bit_clr(PMU_BASE + PMU_SFT_CON, pmu_sft_acinactm_clst_b);
169*91f16700Schasinglulu 	rk3368_pmu_bus_idle(bus_ide_req_clst_b, 0);
170*91f16700Schasinglulu }
171*91f16700Schasinglulu 
172*91f16700Schasinglulu static void pmu_scu_b_pwrdn(void)
173*91f16700Schasinglulu {
174*91f16700Schasinglulu 	uint32_t wait_cnt = 0;
175*91f16700Schasinglulu 
176*91f16700Schasinglulu 	if ((mmio_read_32(PMU_BASE + PMU_PWRDN_ST) &
177*91f16700Schasinglulu 	     PM_PWRDM_CPUSB_MSK) != PM_PWRDM_CPUSB_MSK) {
178*91f16700Schasinglulu 		ERROR("%s: not all cpus is off\n", __func__);
179*91f16700Schasinglulu 		return;
180*91f16700Schasinglulu 	}
181*91f16700Schasinglulu 
182*91f16700Schasinglulu 	rk3368_flash_l2_b();
183*91f16700Schasinglulu 
184*91f16700Schasinglulu 	regs_updata_bit_set(PMU_BASE + PMU_SFT_CON, pmu_sft_acinactm_clst_b);
185*91f16700Schasinglulu 
186*91f16700Schasinglulu 	while (!(mmio_read_32(PMU_BASE +
187*91f16700Schasinglulu 	       PMU_CORE_PWR_ST) & BIT(clst_b_l2_wfi))) {
188*91f16700Schasinglulu 		wait_cnt++;
189*91f16700Schasinglulu 		if (!(wait_cnt % MAX_WAIT_CONUT))
190*91f16700Schasinglulu 			ERROR("%s:wait cluster-b l2(%x)\n", __func__,
191*91f16700Schasinglulu 			      mmio_read_32(PMU_BASE + PMU_CORE_PWR_ST));
192*91f16700Schasinglulu 	}
193*91f16700Schasinglulu 	rk3368_pmu_bus_idle(bus_ide_req_clst_b, 1);
194*91f16700Schasinglulu }
195*91f16700Schasinglulu 
196*91f16700Schasinglulu static void pmu_sleep_mode_config(void)
197*91f16700Schasinglulu {
198*91f16700Schasinglulu 	uint32_t pwrmd_core, pwrmd_com;
199*91f16700Schasinglulu 
200*91f16700Schasinglulu 	pwrmd_core = BIT(pmu_mdcr_cpu0_pd) |
201*91f16700Schasinglulu 		     BIT(pmu_mdcr_scu_l_pd) |
202*91f16700Schasinglulu 		     BIT(pmu_mdcr_l2_flush) |
203*91f16700Schasinglulu 		     BIT(pmu_mdcr_l2_idle) |
204*91f16700Schasinglulu 		     BIT(pmu_mdcr_clr_clst_l) |
205*91f16700Schasinglulu 		     BIT(pmu_mdcr_clr_core) |
206*91f16700Schasinglulu 		     BIT(pmu_mdcr_clr_cci) |
207*91f16700Schasinglulu 		     BIT(pmu_mdcr_core_pd);
208*91f16700Schasinglulu 
209*91f16700Schasinglulu 	pwrmd_com = BIT(pmu_mode_en) |
210*91f16700Schasinglulu 		    BIT(pmu_mode_sref_enter) |
211*91f16700Schasinglulu 		    BIT(pmu_mode_pwr_off);
212*91f16700Schasinglulu 
213*91f16700Schasinglulu 	regs_updata_bit_set(PMU_BASE + PMU_WKUP_CFG2, pmu_cluster_l_wkup_en);
214*91f16700Schasinglulu 	regs_updata_bit_set(PMU_BASE + PMU_WKUP_CFG2, pmu_cluster_b_wkup_en);
215*91f16700Schasinglulu 	regs_updata_bit_clr(PMU_BASE + PMU_WKUP_CFG2, pmu_gpio_wkup_en);
216*91f16700Schasinglulu 
217*91f16700Schasinglulu 	mmio_write_32(PMU_BASE + PMU_PLLLOCK_CNT, CYCL_24M_CNT_MS(2));
218*91f16700Schasinglulu 	mmio_write_32(PMU_BASE + PMU_PLLRST_CNT, CYCL_24M_CNT_US(100));
219*91f16700Schasinglulu 	mmio_write_32(PMU_BASE + PMU_STABLE_CNT, CYCL_24M_CNT_MS(2));
220*91f16700Schasinglulu 	mmio_write_32(PMU_BASE + PMU_PWRMD_CORE, pwrmd_core);
221*91f16700Schasinglulu 	mmio_write_32(PMU_BASE + PMU_PWRMD_COM, pwrmd_com);
222*91f16700Schasinglulu 	dsb();
223*91f16700Schasinglulu }
224*91f16700Schasinglulu 
225*91f16700Schasinglulu static void pmu_set_sleep_mode(void)
226*91f16700Schasinglulu {
227*91f16700Schasinglulu 	pmu_sleep_mode_config();
228*91f16700Schasinglulu 	soc_sleep_config();
229*91f16700Schasinglulu 	regs_updata_bit_set(PMU_BASE + PMU_PWRMD_CORE, pmu_mdcr_global_int_dis);
230*91f16700Schasinglulu 	regs_updata_bit_set(PMU_BASE + PMU_SFT_CON, pmu_sft_glbl_int_dis_b);
231*91f16700Schasinglulu 	pmu_scu_b_pwrdn();
232*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1),
233*91f16700Schasinglulu 		      ((uintptr_t)&pmu_cpuson_entrypoint >>
234*91f16700Schasinglulu 			CPU_BOOT_ADDR_ALIGN) | CPU_BOOT_ADDR_WMASK);
235*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_SOC_CON(2),
236*91f16700Schasinglulu 		      ((uintptr_t)&pmu_cpuson_entrypoint >>
237*91f16700Schasinglulu 			CPU_BOOT_ADDR_ALIGN) | CPU_BOOT_ADDR_WMASK);
238*91f16700Schasinglulu }
239*91f16700Schasinglulu 
240*91f16700Schasinglulu static int cpus_id_power_domain(uint32_t cluster,
241*91f16700Schasinglulu 				uint32_t cpu,
242*91f16700Schasinglulu 				uint32_t pd_state,
243*91f16700Schasinglulu 				uint32_t wfie_msk)
244*91f16700Schasinglulu {
245*91f16700Schasinglulu 	uint32_t pd;
246*91f16700Schasinglulu 	uint64_t mpidr;
247*91f16700Schasinglulu 
248*91f16700Schasinglulu 	if (cluster)
249*91f16700Schasinglulu 		pd = PD_CPUB0 + cpu;
250*91f16700Schasinglulu 	else
251*91f16700Schasinglulu 		pd = PD_CPUL0 + cpu;
252*91f16700Schasinglulu 
253*91f16700Schasinglulu 	if (pmu_power_domain_st(pd) == pd_state)
254*91f16700Schasinglulu 		return 0;
255*91f16700Schasinglulu 
256*91f16700Schasinglulu 	if (pd_state == pmu_pd_off) {
257*91f16700Schasinglulu 		mpidr = (cluster << MPIDR_AFF1_SHIFT) | cpu;
258*91f16700Schasinglulu 		if (check_cpu_wfie(mpidr, wfie_msk))
259*91f16700Schasinglulu 			return -EINVAL;
260*91f16700Schasinglulu 	}
261*91f16700Schasinglulu 
262*91f16700Schasinglulu 	return pmu_power_domain_ctr(pd, pd_state);
263*91f16700Schasinglulu }
264*91f16700Schasinglulu 
265*91f16700Schasinglulu static void nonboot_cpus_off(void)
266*91f16700Schasinglulu {
267*91f16700Schasinglulu 	uint32_t boot_cpu, boot_cluster, cpu;
268*91f16700Schasinglulu 
269*91f16700Schasinglulu 	boot_cpu = MPIDR_AFFLVL0_VAL(read_mpidr_el1());
270*91f16700Schasinglulu 	boot_cluster = MPIDR_AFFLVL1_VAL(read_mpidr_el1());
271*91f16700Schasinglulu 
272*91f16700Schasinglulu 	/* turn off noboot cpus */
273*91f16700Schasinglulu 	for (cpu = 0; cpu < PLATFORM_CLUSTER0_CORE_COUNT; cpu++) {
274*91f16700Schasinglulu 		if (!boot_cluster && (cpu == boot_cpu))
275*91f16700Schasinglulu 			continue;
276*91f16700Schasinglulu 		cpus_id_power_domain(0, cpu, pmu_pd_off, CKECK_WFEI_MSK);
277*91f16700Schasinglulu 	}
278*91f16700Schasinglulu 
279*91f16700Schasinglulu 	for (cpu = 0; cpu < PLATFORM_CLUSTER1_CORE_COUNT; cpu++) {
280*91f16700Schasinglulu 		if (boot_cluster && (cpu == boot_cpu))
281*91f16700Schasinglulu 			continue;
282*91f16700Schasinglulu 		cpus_id_power_domain(1, cpu, pmu_pd_off, CKECK_WFEI_MSK);
283*91f16700Schasinglulu 	}
284*91f16700Schasinglulu }
285*91f16700Schasinglulu 
286*91f16700Schasinglulu void sram_save(void)
287*91f16700Schasinglulu {
288*91f16700Schasinglulu 	/* TODO: support the sdram save for rk3368 SoCs*/
289*91f16700Schasinglulu }
290*91f16700Schasinglulu 
291*91f16700Schasinglulu void sram_restore(void)
292*91f16700Schasinglulu {
293*91f16700Schasinglulu 	/* TODO: support the sdram restore for rk3368 SoCs */
294*91f16700Schasinglulu }
295*91f16700Schasinglulu 
296*91f16700Schasinglulu int rockchip_soc_cores_pwr_dm_on(unsigned long mpidr, uint64_t entrypoint)
297*91f16700Schasinglulu {
298*91f16700Schasinglulu 	uint32_t cpu, cluster;
299*91f16700Schasinglulu 	uint32_t cpuon_id;
300*91f16700Schasinglulu 
301*91f16700Schasinglulu 	cpu = MPIDR_AFFLVL0_VAL(mpidr);
302*91f16700Schasinglulu 	cluster = MPIDR_AFFLVL1_VAL(mpidr);
303*91f16700Schasinglulu 
304*91f16700Schasinglulu 	/* Make sure the cpu is off,Before power up the cpu! */
305*91f16700Schasinglulu 	cpus_id_power_domain(cluster, cpu, pmu_pd_off, CKECK_WFEI_MSK);
306*91f16700Schasinglulu 
307*91f16700Schasinglulu 	cpuon_id = (cluster * PLATFORM_CLUSTER0_CORE_COUNT) + cpu;
308*91f16700Schasinglulu 	assert(cpuon_id < PLATFORM_CORE_COUNT);
309*91f16700Schasinglulu 	assert(cpuson_flags[cpuon_id] == 0);
310*91f16700Schasinglulu 	cpuson_flags[cpuon_id] = PMU_CPU_HOTPLUG;
311*91f16700Schasinglulu 	cpuson_entry_point[cpuon_id] = entrypoint;
312*91f16700Schasinglulu 
313*91f16700Schasinglulu 	/* Switch boot addr to pmusram */
314*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1 + cluster),
315*91f16700Schasinglulu 		      (cpu_warm_boot_addr >> CPU_BOOT_ADDR_ALIGN) |
316*91f16700Schasinglulu 		      CPU_BOOT_ADDR_WMASK);
317*91f16700Schasinglulu 	dsb();
318*91f16700Schasinglulu 
319*91f16700Schasinglulu 	cpus_id_power_domain(cluster, cpu, pmu_pd_on, CKECK_WFEI_MSK);
320*91f16700Schasinglulu 
321*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1 + cluster),
322*91f16700Schasinglulu 		      (COLD_BOOT_BASE >> CPU_BOOT_ADDR_ALIGN) |
323*91f16700Schasinglulu 		      CPU_BOOT_ADDR_WMASK);
324*91f16700Schasinglulu 
325*91f16700Schasinglulu 	return 0;
326*91f16700Schasinglulu }
327*91f16700Schasinglulu 
328*91f16700Schasinglulu int rockchip_soc_cores_pwr_dm_on_finish(void)
329*91f16700Schasinglulu {
330*91f16700Schasinglulu 	return 0;
331*91f16700Schasinglulu }
332*91f16700Schasinglulu 
333*91f16700Schasinglulu int rockchip_soc_sys_pwr_dm_resume(void)
334*91f16700Schasinglulu {
335*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1),
336*91f16700Schasinglulu 		      (COLD_BOOT_BASE >> CPU_BOOT_ADDR_ALIGN) |
337*91f16700Schasinglulu 		      CPU_BOOT_ADDR_WMASK);
338*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_SOC_CON(2),
339*91f16700Schasinglulu 		      (COLD_BOOT_BASE >> CPU_BOOT_ADDR_ALIGN) |
340*91f16700Schasinglulu 		      CPU_BOOT_ADDR_WMASK);
341*91f16700Schasinglulu 	pm_plls_resume();
342*91f16700Schasinglulu 	pmu_scu_b_pwrup();
343*91f16700Schasinglulu 
344*91f16700Schasinglulu 	return 0;
345*91f16700Schasinglulu }
346*91f16700Schasinglulu 
347*91f16700Schasinglulu int rockchip_soc_sys_pwr_dm_suspend(void)
348*91f16700Schasinglulu {
349*91f16700Schasinglulu 	nonboot_cpus_off();
350*91f16700Schasinglulu 	pmu_set_sleep_mode();
351*91f16700Schasinglulu 
352*91f16700Schasinglulu 	return 0;
353*91f16700Schasinglulu }
354*91f16700Schasinglulu 
355*91f16700Schasinglulu void rockchip_plat_mmu_el3(void)
356*91f16700Schasinglulu {
357*91f16700Schasinglulu 	/* TODO: support the el3 for rk3368 SoCs */
358*91f16700Schasinglulu }
359*91f16700Schasinglulu 
360*91f16700Schasinglulu void plat_rockchip_pmu_init(void)
361*91f16700Schasinglulu {
362*91f16700Schasinglulu 	uint32_t cpu;
363*91f16700Schasinglulu 
364*91f16700Schasinglulu 	/* register requires 32bits mode, switch it to 32 bits */
365*91f16700Schasinglulu 	cpu_warm_boot_addr = (uint64_t)platform_cpu_warmboot;
366*91f16700Schasinglulu 
367*91f16700Schasinglulu 	for (cpu = 0; cpu < PLATFORM_CORE_COUNT; cpu++)
368*91f16700Schasinglulu 		cpuson_flags[cpu] = 0;
369*91f16700Schasinglulu 
370*91f16700Schasinglulu 	nonboot_cpus_off();
371*91f16700Schasinglulu 	INFO("%s(%d): pd status %x\n", __func__, __LINE__,
372*91f16700Schasinglulu 	     mmio_read_32(PMU_BASE + PMU_PWRDN_ST));
373*91f16700Schasinglulu }
374