xref: /rk3399_ARM-atf/plat/rockchip/rk3568/drivers/soc/soc.c (revision 9fd9f1d024872b440e3906eded28037330b6f422)
1*9fd9f1d0Sshengfei Xu /*
2*9fd9f1d0Sshengfei Xu  * Copyright (c) 2023, ARM Limited and Contributors. All rights reserved.
3*9fd9f1d0Sshengfei Xu  *
4*9fd9f1d0Sshengfei Xu  * SPDX-License-Identifier: BSD-3-Clause
5*9fd9f1d0Sshengfei Xu  */
6*9fd9f1d0Sshengfei Xu 
7*9fd9f1d0Sshengfei Xu #include <common/debug.h>
8*9fd9f1d0Sshengfei Xu #include <lib/xlat_tables/xlat_tables_v2.h>
9*9fd9f1d0Sshengfei Xu #include <mmio.h>
10*9fd9f1d0Sshengfei Xu #include <platform_def.h>
11*9fd9f1d0Sshengfei Xu 
12*9fd9f1d0Sshengfei Xu #include <soc.h>
13*9fd9f1d0Sshengfei Xu 
14*9fd9f1d0Sshengfei Xu const mmap_region_t plat_rk_mmap[] = {
15*9fd9f1d0Sshengfei Xu 	MAP_REGION_FLAT(RKFPGA_DEV_RNG0_BASE, RKFPGA_DEV_RNG0_SIZE,
16*9fd9f1d0Sshengfei Xu 			MT_DEVICE | MT_RW | MT_SECURE),
17*9fd9f1d0Sshengfei Xu 	MAP_REGION_FLAT(PMUSRAM_BASE, PMUSRAM_SIZE,
18*9fd9f1d0Sshengfei Xu 			MT_MEMORY | MT_RW | MT_SECURE),
19*9fd9f1d0Sshengfei Xu 
20*9fd9f1d0Sshengfei Xu 	{ 0 }
21*9fd9f1d0Sshengfei Xu };
22*9fd9f1d0Sshengfei Xu 
23*9fd9f1d0Sshengfei Xu /* The RockChip power domain tree descriptor */
24*9fd9f1d0Sshengfei Xu const unsigned char rockchip_power_domain_tree_desc[] = {
25*9fd9f1d0Sshengfei Xu 	/* No of root nodes */
26*9fd9f1d0Sshengfei Xu 	PLATFORM_SYSTEM_COUNT,
27*9fd9f1d0Sshengfei Xu 	/* No of children for the root node */
28*9fd9f1d0Sshengfei Xu 	PLATFORM_CLUSTER_COUNT,
29*9fd9f1d0Sshengfei Xu 	/* No of children for the first cluster node */
30*9fd9f1d0Sshengfei Xu 	PLATFORM_CLUSTER0_CORE_COUNT,
31*9fd9f1d0Sshengfei Xu };
32*9fd9f1d0Sshengfei Xu 
33*9fd9f1d0Sshengfei Xu static void secure_timer_init(void)
34*9fd9f1d0Sshengfei Xu {
35*9fd9f1d0Sshengfei Xu 	mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_CONTROL_REG, TIMER_DIS);
36*9fd9f1d0Sshengfei Xu 	mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_LOAD_COUNT0, 0xffffffff);
37*9fd9f1d0Sshengfei Xu 	mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_LOAD_COUNT1, 0xffffffff);
38*9fd9f1d0Sshengfei Xu 
39*9fd9f1d0Sshengfei Xu 	/* auto reload & enable the timer */
40*9fd9f1d0Sshengfei Xu 	mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_CONTROL_REG, TIMER_EN);
41*9fd9f1d0Sshengfei Xu }
42*9fd9f1d0Sshengfei Xu 
43*9fd9f1d0Sshengfei Xu static void sgrf_init(void)
44*9fd9f1d0Sshengfei Xu {
45*9fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(0), 0xffff0000);
46*9fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(1), 0xffff0000);
47*9fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(2), 0xffff0000);
48*9fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(3), 0xffff0000);
49*9fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(4), 0xffff0000);
50*9fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(5), 0xffff0000);
51*9fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(6), 0xffff0000);
52*9fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(7), 0xffff0000);
53*9fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(8), 0xffff0000);
54*9fd9f1d0Sshengfei Xu 
55*9fd9f1d0Sshengfei Xu 	mmio_write_32(DDRSGRF_BASE + FIREWALL_DDR_FW_DDR_CON_REG, 0xffff0000);
56*9fd9f1d0Sshengfei Xu }
57*9fd9f1d0Sshengfei Xu 
58*9fd9f1d0Sshengfei Xu static void set_pll_slow_mode(uint32_t clk_pll)
59*9fd9f1d0Sshengfei Xu {
60*9fd9f1d0Sshengfei Xu 	mmio_write_32(CRU_BASE + CRU_MODE_CON00, 0x03 << (16 + clk_pll * 2));
61*9fd9f1d0Sshengfei Xu }
62*9fd9f1d0Sshengfei Xu 
63*9fd9f1d0Sshengfei Xu static void __dead2 soc_global_soft_reset(void)
64*9fd9f1d0Sshengfei Xu {
65*9fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_CPLL);
66*9fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_GPLL);
67*9fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_NPLL);
68*9fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_VPLL);
69*9fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_USBPLL);
70*9fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_APLL);
71*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUCRU_BASE + PMUCRU_MODE_CON00, 0x000f0000);
72*9fd9f1d0Sshengfei Xu 
73*9fd9f1d0Sshengfei Xu 	dsb();
74*9fd9f1d0Sshengfei Xu 	mmio_write_32(CRU_BASE + CRU_GLB_SRST_FST, GLB_SRST_FST_CFG_VAL);
75*9fd9f1d0Sshengfei Xu 	/*
76*9fd9f1d0Sshengfei Xu 	 * Maybe the HW needs some times to reset the system,
77*9fd9f1d0Sshengfei Xu 	 * so we do not hope the core to excute valid codes.
78*9fd9f1d0Sshengfei Xu 	 */
79*9fd9f1d0Sshengfei Xu 	while (1) {
80*9fd9f1d0Sshengfei Xu 		;
81*9fd9f1d0Sshengfei Xu 	}
82*9fd9f1d0Sshengfei Xu }
83*9fd9f1d0Sshengfei Xu 
84*9fd9f1d0Sshengfei Xu static void rockchip_system_reset_init(void)
85*9fd9f1d0Sshengfei Xu {
86*9fd9f1d0Sshengfei Xu 	mmio_write_32(GRF_BASE + 0x0508, 0x00100010);
87*9fd9f1d0Sshengfei Xu 	mmio_write_32(CRU_BASE + 0x00dc, 0x01030103);
88*9fd9f1d0Sshengfei Xu }
89*9fd9f1d0Sshengfei Xu 
90*9fd9f1d0Sshengfei Xu void __dead2 rockchip_soc_soft_reset(void)
91*9fd9f1d0Sshengfei Xu {
92*9fd9f1d0Sshengfei Xu 	soc_global_soft_reset();
93*9fd9f1d0Sshengfei Xu }
94*9fd9f1d0Sshengfei Xu 
95*9fd9f1d0Sshengfei Xu void plat_rockchip_soc_init(void)
96*9fd9f1d0Sshengfei Xu {
97*9fd9f1d0Sshengfei Xu 	secure_timer_init();
98*9fd9f1d0Sshengfei Xu 	sgrf_init();
99*9fd9f1d0Sshengfei Xu 	rockchip_system_reset_init();
100*9fd9f1d0Sshengfei Xu 	NOTICE("BL31: Rockchip release version: v%d.%d\n",
101*9fd9f1d0Sshengfei Xu 		MAJOR_VERSION, MINOR_VERSION);
102*9fd9f1d0Sshengfei Xu }
103*9fd9f1d0Sshengfei Xu 
104