xref: /rk3399_ARM-atf/plat/rockchip/rk3588/drivers/soc/soc.c (revision e3ec6ff4b24c7daa4dfa82709c23a22829947160)
1*e3ec6ff4SXiaoDong Huang /*
2*e3ec6ff4SXiaoDong Huang  * Copyright (c) 2024, Rockchip, Inc. All rights reserved.
3*e3ec6ff4SXiaoDong Huang  *
4*e3ec6ff4SXiaoDong Huang  * SPDX-License-Identifier: BSD-3-Clause
5*e3ec6ff4SXiaoDong Huang  */
6*e3ec6ff4SXiaoDong Huang 
7*e3ec6ff4SXiaoDong Huang #include <assert.h>
8*e3ec6ff4SXiaoDong Huang #include <errno.h>
9*e3ec6ff4SXiaoDong Huang 
10*e3ec6ff4SXiaoDong Huang #include <arch_helpers.h>
11*e3ec6ff4SXiaoDong Huang #include <bl31/bl31.h>
12*e3ec6ff4SXiaoDong Huang #include <common/debug.h>
13*e3ec6ff4SXiaoDong Huang #include <drivers/console.h>
14*e3ec6ff4SXiaoDong Huang #include <drivers/delay_timer.h>
15*e3ec6ff4SXiaoDong Huang #include <lib/mmio.h>
16*e3ec6ff4SXiaoDong Huang #include <lib/xlat_tables/xlat_tables_compat.h>
17*e3ec6ff4SXiaoDong Huang #include <platform.h>
18*e3ec6ff4SXiaoDong Huang #include <platform_def.h>
19*e3ec6ff4SXiaoDong Huang #include <pmu.h>
20*e3ec6ff4SXiaoDong Huang 
21*e3ec6ff4SXiaoDong Huang #include <plat_private.h>
22*e3ec6ff4SXiaoDong Huang #include <secure.h>
23*e3ec6ff4SXiaoDong Huang #include <soc.h>
24*e3ec6ff4SXiaoDong Huang 
25*e3ec6ff4SXiaoDong Huang #define RK3588_DEV_RNG0_BASE	0xf0000000
26*e3ec6ff4SXiaoDong Huang #define RK3588_DEV_RNG0_SIZE	0x0ffff000
27*e3ec6ff4SXiaoDong Huang 
28*e3ec6ff4SXiaoDong Huang const mmap_region_t plat_rk_mmap[] = {
29*e3ec6ff4SXiaoDong Huang 	MAP_REGION_FLAT(RK3588_DEV_RNG0_BASE, RK3588_DEV_RNG0_SIZE,
30*e3ec6ff4SXiaoDong Huang 			MT_DEVICE | MT_RW | MT_SECURE),
31*e3ec6ff4SXiaoDong Huang 	MAP_REGION_FLAT(DDR_SHARE_MEM, DDR_SHARE_SIZE,
32*e3ec6ff4SXiaoDong Huang 			MT_DEVICE | MT_RW | MT_NS),
33*e3ec6ff4SXiaoDong Huang 	{ 0 }
34*e3ec6ff4SXiaoDong Huang };
35*e3ec6ff4SXiaoDong Huang 
36*e3ec6ff4SXiaoDong Huang /* The RockChip power domain tree descriptor */
37*e3ec6ff4SXiaoDong Huang const unsigned char rockchip_power_domain_tree_desc[] = {
38*e3ec6ff4SXiaoDong Huang 	/* No of root nodes */
39*e3ec6ff4SXiaoDong Huang 	PLATFORM_SYSTEM_COUNT,
40*e3ec6ff4SXiaoDong Huang 	/* No of children for the root node */
41*e3ec6ff4SXiaoDong Huang 	PLATFORM_CLUSTER_COUNT,
42*e3ec6ff4SXiaoDong Huang 	/* No of children for the first cluster node */
43*e3ec6ff4SXiaoDong Huang 	PLATFORM_CLUSTER0_CORE_COUNT,
44*e3ec6ff4SXiaoDong Huang 	/* No of children for the second cluster node */
45*e3ec6ff4SXiaoDong Huang 	PLATFORM_CLUSTER1_CORE_COUNT
46*e3ec6ff4SXiaoDong Huang };
47*e3ec6ff4SXiaoDong Huang 
48*e3ec6ff4SXiaoDong Huang void timer_hp_init(void)
49*e3ec6ff4SXiaoDong Huang {
50*e3ec6ff4SXiaoDong Huang 	if ((mmio_read_32(TIMER_HP_BASE + TIMER_HP_CTRL) & 0x1) != 0)
51*e3ec6ff4SXiaoDong Huang 		return;
52*e3ec6ff4SXiaoDong Huang 
53*e3ec6ff4SXiaoDong Huang 	mmio_write_32(TIMER_HP_BASE + TIMER_HP_CTRL, 0x0);
54*e3ec6ff4SXiaoDong Huang 	dsb();
55*e3ec6ff4SXiaoDong Huang 	mmio_write_32(TIMER_HP_BASE + TIMER_HP_LOAD_COUNT0, 0xffffffff);
56*e3ec6ff4SXiaoDong Huang 	mmio_write_32(TIMER_HP_BASE + TIMER_HP_LOAD_COUNT1, 0xffffffff);
57*e3ec6ff4SXiaoDong Huang 	mmio_write_32(TIMER_HP_BASE + TIMER_HP_INT_EN, 0);
58*e3ec6ff4SXiaoDong Huang 	dsb();
59*e3ec6ff4SXiaoDong Huang 	mmio_write_32(TIMER_HP_BASE + TIMER_HP_CTRL, 0x1);
60*e3ec6ff4SXiaoDong Huang }
61*e3ec6ff4SXiaoDong Huang 
62*e3ec6ff4SXiaoDong Huang static void system_reset_init(void)
63*e3ec6ff4SXiaoDong Huang {
64*e3ec6ff4SXiaoDong Huang 	/* enable wdt_ns0~4 trigger global reset and select first reset.
65*e3ec6ff4SXiaoDong Huang 	 * enable tsadc trigger global reset and select first reset.
66*e3ec6ff4SXiaoDong Huang 	 * enable global reset and wdt trigger pmu reset.
67*e3ec6ff4SXiaoDong Huang 	 * select first reset trigger pmu reset.s
68*e3ec6ff4SXiaoDong Huang 	 */
69*e3ec6ff4SXiaoDong Huang 	mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, 0xffdf);
70*e3ec6ff4SXiaoDong Huang 
71*e3ec6ff4SXiaoDong Huang 	/* enable wdt_s, wdt_ns reset */
72*e3ec6ff4SXiaoDong Huang 	mmio_write_32(BUSSGRF_BASE + SGRF_SOC_CON(2), 0x0c000c00);
73*e3ec6ff4SXiaoDong Huang 
74*e3ec6ff4SXiaoDong Huang 	/* reset width = 0xffff */
75*e3ec6ff4SXiaoDong Huang 	mmio_write_32(PMU1GRF_BASE + PMU1GRF_SOC_CON(1), 0xffffffff);
76*e3ec6ff4SXiaoDong Huang 
77*e3ec6ff4SXiaoDong Huang 	/* enable first/tsadc/wdt reset output */
78*e3ec6ff4SXiaoDong Huang 	mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(0), 0x00070007);
79*e3ec6ff4SXiaoDong Huang 
80*e3ec6ff4SXiaoDong Huang 	/* pmu1_grf pmu1_ioc hold */
81*e3ec6ff4SXiaoDong Huang 	mmio_write_32(PMU1GRF_BASE + PMU1GRF_SOC_CON(7), 0x30003000);
82*e3ec6ff4SXiaoDong Huang 
83*e3ec6ff4SXiaoDong Huang 	/* pmu1sgrf hold */
84*e3ec6ff4SXiaoDong Huang 	mmio_write_32(PMU1SGRF_BASE + PMU1SGRF_SOC_CON(14), 0x00200020);
85*e3ec6ff4SXiaoDong Huang 
86*e3ec6ff4SXiaoDong Huang 	/* select tsadc_shut_m0 ionmux*/
87*e3ec6ff4SXiaoDong Huang 	mmio_write_32(PMU0IOC_BASE + 0x0, 0x00f00020);
88*e3ec6ff4SXiaoDong Huang }
89*e3ec6ff4SXiaoDong Huang 
90*e3ec6ff4SXiaoDong Huang void plat_rockchip_soc_init(void)
91*e3ec6ff4SXiaoDong Huang {
92*e3ec6ff4SXiaoDong Huang 	secure_timer_init();
93*e3ec6ff4SXiaoDong Huang 	timer_hp_init();
94*e3ec6ff4SXiaoDong Huang 	system_reset_init();
95*e3ec6ff4SXiaoDong Huang 	sgrf_init();
96*e3ec6ff4SXiaoDong Huang }
97