xref: /arm-trusted-firmware/plat/rockchip/rk3368/drivers/soc/soc.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 <platform_def.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <arch_helpers.h>
10*91f16700Schasinglulu #include <common/debug.h>
11*91f16700Schasinglulu #include <lib/mmio.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #include <plat_private.h>
14*91f16700Schasinglulu #include <rk3368_def.h>
15*91f16700Schasinglulu #include <soc.h>
16*91f16700Schasinglulu 
17*91f16700Schasinglulu static uint32_t plls_con[END_PLL_ID][4];
18*91f16700Schasinglulu 
19*91f16700Schasinglulu /* Table of regions to map using the MMU. */
20*91f16700Schasinglulu const mmap_region_t plat_rk_mmap[] = {
21*91f16700Schasinglulu 	MAP_REGION_FLAT(CCI400_BASE, CCI400_SIZE,
22*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
23*91f16700Schasinglulu 	MAP_REGION_FLAT(GIC400_BASE, GIC400_SIZE,
24*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
25*91f16700Schasinglulu 	MAP_REGION_FLAT(STIME_BASE, STIME_SIZE,
26*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
27*91f16700Schasinglulu 	MAP_REGION_FLAT(SGRF_BASE, SGRF_SIZE,
28*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
29*91f16700Schasinglulu 	MAP_REGION_FLAT(PMUSRAM_BASE, PMUSRAM_SIZE,
30*91f16700Schasinglulu 			MT_MEMORY | MT_RW | MT_SECURE),
31*91f16700Schasinglulu 	MAP_REGION_FLAT(PMU_BASE, PMU_SIZE,
32*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
33*91f16700Schasinglulu 	MAP_REGION_FLAT(UART0_BASE, UART0_SIZE,
34*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
35*91f16700Schasinglulu 	MAP_REGION_FLAT(UART1_BASE, UART1_SIZE,
36*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
37*91f16700Schasinglulu 	MAP_REGION_FLAT(UART2_BASE, UART2_SIZE,
38*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
39*91f16700Schasinglulu 	MAP_REGION_FLAT(UART3_BASE, UART3_SIZE,
40*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
41*91f16700Schasinglulu 	MAP_REGION_FLAT(UART4_BASE, UART4_SIZE,
42*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
43*91f16700Schasinglulu 	MAP_REGION_FLAT(CRU_BASE, CRU_SIZE,
44*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
45*91f16700Schasinglulu 	MAP_REGION_FLAT(DDR_PCTL_BASE, DDR_PCTL_SIZE,
46*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
47*91f16700Schasinglulu 	MAP_REGION_FLAT(DDR_PHY_BASE, DDR_PHY_SIZE,
48*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
49*91f16700Schasinglulu 	MAP_REGION_FLAT(GRF_BASE, GRF_SIZE,
50*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
51*91f16700Schasinglulu 	MAP_REGION_FLAT(SERVICE_BUS_BASE, SERVICE_BUS_SISE,
52*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
53*91f16700Schasinglulu 	{ 0 }
54*91f16700Schasinglulu };
55*91f16700Schasinglulu 
56*91f16700Schasinglulu /* The RockChip power domain tree descriptor */
57*91f16700Schasinglulu const unsigned char rockchip_power_domain_tree_desc[] = {
58*91f16700Schasinglulu 	/* No of root nodes */
59*91f16700Schasinglulu 	PLATFORM_SYSTEM_COUNT,
60*91f16700Schasinglulu 	/* No of children for the root node */
61*91f16700Schasinglulu 	PLATFORM_CLUSTER_COUNT,
62*91f16700Schasinglulu 	/* No of children for the first cluster node */
63*91f16700Schasinglulu 	PLATFORM_CLUSTER0_CORE_COUNT,
64*91f16700Schasinglulu 	/* No of children for the second cluster node */
65*91f16700Schasinglulu 	PLATFORM_CLUSTER1_CORE_COUNT
66*91f16700Schasinglulu };
67*91f16700Schasinglulu 
68*91f16700Schasinglulu void secure_timer_init(void)
69*91f16700Schasinglulu {
70*91f16700Schasinglulu 	mmio_write_32(STIMER1_BASE + TIMER_LOADE_COUNT0, 0xffffffff);
71*91f16700Schasinglulu 	mmio_write_32(STIMER1_BASE + TIMER_LOADE_COUNT1, 0xffffffff);
72*91f16700Schasinglulu 
73*91f16700Schasinglulu 	/* auto reload & enable the timer */
74*91f16700Schasinglulu 	mmio_write_32(STIMER1_BASE + TIMER_CONTROL_REG, TIMER_EN);
75*91f16700Schasinglulu }
76*91f16700Schasinglulu 
77*91f16700Schasinglulu void sgrf_init(void)
78*91f16700Schasinglulu {
79*91f16700Schasinglulu 	/* setting all configurable ip into no-secure */
80*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_SOC_CON(5), SGRF_SOC_CON_NS);
81*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6), SGRF_SOC_CON7_BITS);
82*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_SOC_CON(7), SGRF_SOC_CON_NS);
83*91f16700Schasinglulu 
84*91f16700Schasinglulu 	/* secure dma to no sesure */
85*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_BUSDMAC_CON(0), SGRF_BUSDMAC_CON0_NS);
86*91f16700Schasinglulu 	mmio_write_32(SGRF_BASE + SGRF_BUSDMAC_CON(1), SGRF_BUSDMAC_CON1_NS);
87*91f16700Schasinglulu 	dsb();
88*91f16700Schasinglulu 
89*91f16700Schasinglulu 	/* rst dma1 */
90*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(1),
91*91f16700Schasinglulu 		      RST_DMA1_MSK | (RST_DMA1_MSK << 16));
92*91f16700Schasinglulu 	/* rst dma2 */
93*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(4),
94*91f16700Schasinglulu 		      RST_DMA2_MSK | (RST_DMA2_MSK << 16));
95*91f16700Schasinglulu 
96*91f16700Schasinglulu 	dsb();
97*91f16700Schasinglulu 
98*91f16700Schasinglulu 	/* release dma1 rst*/
99*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(1), (RST_DMA1_MSK << 16));
100*91f16700Schasinglulu 	/* release dma2 rst*/
101*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(4), (RST_DMA2_MSK << 16));
102*91f16700Schasinglulu }
103*91f16700Schasinglulu 
104*91f16700Schasinglulu void plat_rockchip_soc_init(void)
105*91f16700Schasinglulu {
106*91f16700Schasinglulu 	secure_timer_init();
107*91f16700Schasinglulu 	sgrf_init();
108*91f16700Schasinglulu }
109*91f16700Schasinglulu 
110*91f16700Schasinglulu void regs_updata_bits(uintptr_t addr, uint32_t val,
111*91f16700Schasinglulu 		      uint32_t mask, uint32_t shift)
112*91f16700Schasinglulu {
113*91f16700Schasinglulu 	uint32_t tmp, orig;
114*91f16700Schasinglulu 
115*91f16700Schasinglulu 	orig = mmio_read_32(addr);
116*91f16700Schasinglulu 
117*91f16700Schasinglulu 	tmp = orig & ~(mask << shift);
118*91f16700Schasinglulu 	tmp |= (val & mask) << shift;
119*91f16700Schasinglulu 
120*91f16700Schasinglulu 	if (tmp != orig)
121*91f16700Schasinglulu 		mmio_write_32(addr, tmp);
122*91f16700Schasinglulu 	dsb();
123*91f16700Schasinglulu }
124*91f16700Schasinglulu 
125*91f16700Schasinglulu static void plls_suspend(uint32_t pll_id)
126*91f16700Schasinglulu {
127*91f16700Schasinglulu 	plls_con[pll_id][0] = mmio_read_32(CRU_BASE + PLL_CONS((pll_id), 0));
128*91f16700Schasinglulu 	plls_con[pll_id][1] = mmio_read_32(CRU_BASE + PLL_CONS((pll_id), 1));
129*91f16700Schasinglulu 	plls_con[pll_id][2] = mmio_read_32(CRU_BASE + PLL_CONS((pll_id), 2));
130*91f16700Schasinglulu 	plls_con[pll_id][3] = mmio_read_32(CRU_BASE + PLL_CONS((pll_id), 3));
131*91f16700Schasinglulu 
132*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS((pll_id), 3), PLL_SLOW_BITS);
133*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS((pll_id), 3), PLL_BYPASS);
134*91f16700Schasinglulu }
135*91f16700Schasinglulu 
136*91f16700Schasinglulu static void pm_plls_suspend(void)
137*91f16700Schasinglulu {
138*91f16700Schasinglulu 	plls_suspend(NPLL_ID);
139*91f16700Schasinglulu 	plls_suspend(CPLL_ID);
140*91f16700Schasinglulu 	plls_suspend(GPLL_ID);
141*91f16700Schasinglulu 	plls_suspend(ABPLL_ID);
142*91f16700Schasinglulu 	plls_suspend(ALPLL_ID);
143*91f16700Schasinglulu }
144*91f16700Schasinglulu 
145*91f16700Schasinglulu static inline void plls_resume(void)
146*91f16700Schasinglulu {
147*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS(ABPLL_ID, 3),
148*91f16700Schasinglulu 		      plls_con[ABPLL_ID][3] | PLL_BYPASS_W_MSK);
149*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS(ALPLL_ID, 3),
150*91f16700Schasinglulu 		      plls_con[ALPLL_ID][3] | PLL_BYPASS_W_MSK);
151*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS(GPLL_ID, 3),
152*91f16700Schasinglulu 		      plls_con[GPLL_ID][3] | PLL_BYPASS_W_MSK);
153*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS(CPLL_ID, 3),
154*91f16700Schasinglulu 		      plls_con[CPLL_ID][3] | PLL_BYPASS_W_MSK);
155*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS(NPLL_ID, 3),
156*91f16700Schasinglulu 		      plls_con[NPLL_ID][3] | PLL_BYPASS_W_MSK);
157*91f16700Schasinglulu }
158*91f16700Schasinglulu 
159*91f16700Schasinglulu void soc_sleep_config(void)
160*91f16700Schasinglulu {
161*91f16700Schasinglulu 	int i = 0;
162*91f16700Schasinglulu 
163*91f16700Schasinglulu 	for (i = 0; i < CRU_CLKGATES_CON_CNT; i++)
164*91f16700Schasinglulu 		mmio_write_32(CRU_BASE + CRU_CLKGATES_CON(i), 0xffff0000);
165*91f16700Schasinglulu 	pm_plls_suspend();
166*91f16700Schasinglulu 
167*91f16700Schasinglulu 	for (i = 0; i < CRU_CLKGATES_CON_CNT; i++)
168*91f16700Schasinglulu 		mmio_write_32(CRU_BASE + CRU_CLKGATES_CON(i), 0xffff0000);
169*91f16700Schasinglulu }
170*91f16700Schasinglulu 
171*91f16700Schasinglulu void pm_plls_resume(void)
172*91f16700Schasinglulu {
173*91f16700Schasinglulu 	plls_resume();
174*91f16700Schasinglulu 
175*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS(ABPLL_ID, 3),
176*91f16700Schasinglulu 		      plls_con[ABPLL_ID][3] | PLLS_MODE_WMASK);
177*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS(ALPLL_ID, 3),
178*91f16700Schasinglulu 		      plls_con[ALPLL_ID][3] | PLLS_MODE_WMASK);
179*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS(GPLL_ID, 3),
180*91f16700Schasinglulu 		      plls_con[GPLL_ID][3] | PLLS_MODE_WMASK);
181*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS(CPLL_ID, 3),
182*91f16700Schasinglulu 		      plls_con[CPLL_ID][3] | PLLS_MODE_WMASK);
183*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS(NPLL_ID, 3),
184*91f16700Schasinglulu 		      plls_con[NPLL_ID][3] | PLLS_MODE_WMASK);
185*91f16700Schasinglulu }
186*91f16700Schasinglulu 
187*91f16700Schasinglulu void __dead2 rockchip_soc_soft_reset(void)
188*91f16700Schasinglulu {
189*91f16700Schasinglulu 	uint32_t temp_val;
190*91f16700Schasinglulu 
191*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS((GPLL_ID), 3), PLL_SLOW_BITS);
192*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS((CPLL_ID), 3), PLL_SLOW_BITS);
193*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS((NPLL_ID), 3), PLL_SLOW_BITS);
194*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS((ABPLL_ID), 3), PLL_SLOW_BITS);
195*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + PLL_CONS((ALPLL_ID), 3), PLL_SLOW_BITS);
196*91f16700Schasinglulu 
197*91f16700Schasinglulu 	temp_val = mmio_read_32(CRU_BASE + CRU_GLB_RST_CON) |
198*91f16700Schasinglulu 		   PMU_RST_BY_SECOND_SFT;
199*91f16700Schasinglulu 
200*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, temp_val);
201*91f16700Schasinglulu 	mmio_write_32(CRU_BASE + CRU_GLB_SRST_SND, 0xeca8);
202*91f16700Schasinglulu 
203*91f16700Schasinglulu 	/*
204*91f16700Schasinglulu 	 * Maybe the HW needs some times to reset the system,
205*91f16700Schasinglulu 	 * so we do not hope the core to execute valid codes.
206*91f16700Schasinglulu 	 */
207*91f16700Schasinglulu 	while (1)
208*91f16700Schasinglulu 	;
209*91f16700Schasinglulu }
210