1010d6ae3SXiaoDong Huang /*
2010d6ae3SXiaoDong Huang * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
3010d6ae3SXiaoDong Huang *
4010d6ae3SXiaoDong Huang * SPDX-License-Identifier: BSD-3-Clause
5010d6ae3SXiaoDong Huang */
6010d6ae3SXiaoDong Huang
7010d6ae3SXiaoDong Huang #include <platform_def.h>
8010d6ae3SXiaoDong Huang
9010d6ae3SXiaoDong Huang #include <arch_helpers.h>
10010d6ae3SXiaoDong Huang #include <common/debug.h>
11010d6ae3SXiaoDong Huang #include <drivers/console.h>
12010d6ae3SXiaoDong Huang #include <drivers/delay_timer.h>
13010d6ae3SXiaoDong Huang #include <lib/mmio.h>
14010d6ae3SXiaoDong Huang
15010d6ae3SXiaoDong Huang #include <platform_def.h>
16010d6ae3SXiaoDong Huang #include <pmu.h>
17010d6ae3SXiaoDong Huang #include <px30_def.h>
18*d2483afaSHeiko Stuebner #include <secure.h>
19010d6ae3SXiaoDong Huang #include <soc.h>
20010d6ae3SXiaoDong Huang #include <rockchip_sip_svc.h>
21010d6ae3SXiaoDong Huang
22010d6ae3SXiaoDong Huang /* Aggregate of all devices in the first GB */
23010d6ae3SXiaoDong Huang #define PX30_DEV_RNG0_BASE 0xff000000
24010d6ae3SXiaoDong Huang #define PX30_DEV_RNG0_SIZE 0x00ff0000
25010d6ae3SXiaoDong Huang
26010d6ae3SXiaoDong Huang const mmap_region_t plat_rk_mmap[] = {
27010d6ae3SXiaoDong Huang MAP_REGION_FLAT(PX30_DEV_RNG0_BASE, PX30_DEV_RNG0_SIZE,
28010d6ae3SXiaoDong Huang MT_DEVICE | MT_RW | MT_SECURE),
29010d6ae3SXiaoDong Huang MAP_REGION_FLAT(SHARE_MEM_BASE, SHARE_MEM_SIZE,
30010d6ae3SXiaoDong Huang MT_DEVICE | MT_RW | MT_SECURE),
31010d6ae3SXiaoDong Huang MAP_REGION_FLAT(DDR_PARAM_BASE, DDR_PARAM_SIZE,
32010d6ae3SXiaoDong Huang MT_DEVICE | MT_RW | MT_SECURE),
33010d6ae3SXiaoDong Huang { 0 }
34010d6ae3SXiaoDong Huang };
35010d6ae3SXiaoDong Huang
36010d6ae3SXiaoDong Huang /* The RockChip power domain tree descriptor */
37010d6ae3SXiaoDong Huang const unsigned char rockchip_power_domain_tree_desc[] = {
38010d6ae3SXiaoDong Huang /* No of root nodes */
39010d6ae3SXiaoDong Huang PLATFORM_SYSTEM_COUNT,
40010d6ae3SXiaoDong Huang /* No of children for the root node */
41010d6ae3SXiaoDong Huang PLATFORM_CLUSTER_COUNT,
42010d6ae3SXiaoDong Huang /* No of children for the first cluster node */
43010d6ae3SXiaoDong Huang PLATFORM_CLUSTER0_CORE_COUNT,
44010d6ae3SXiaoDong Huang };
45010d6ae3SXiaoDong Huang
clk_gate_con_save(uint32_t * clkgt_save)46010d6ae3SXiaoDong Huang void clk_gate_con_save(uint32_t *clkgt_save)
47010d6ae3SXiaoDong Huang {
48010d6ae3SXiaoDong Huang uint32_t i, j;
49010d6ae3SXiaoDong Huang
50010d6ae3SXiaoDong Huang for (i = 0; i < CRU_CLKGATES_CON_CNT; i++)
51010d6ae3SXiaoDong Huang clkgt_save[i] =
52010d6ae3SXiaoDong Huang mmio_read_32(CRU_BASE + CRU_CLKGATES_CON(i));
53010d6ae3SXiaoDong Huang j = i;
54010d6ae3SXiaoDong Huang for (i = 0; i < CRU_PMU_CLKGATE_CON_CNT; i++, j++)
55010d6ae3SXiaoDong Huang clkgt_save[j] =
56010d6ae3SXiaoDong Huang mmio_read_32(PMUCRU_BASE + CRU_PMU_CLKGATES_CON(i));
57010d6ae3SXiaoDong Huang }
58010d6ae3SXiaoDong Huang
clk_gate_con_restore(uint32_t * clkgt_save)59010d6ae3SXiaoDong Huang void clk_gate_con_restore(uint32_t *clkgt_save)
60010d6ae3SXiaoDong Huang {
61010d6ae3SXiaoDong Huang uint32_t i, j;
62010d6ae3SXiaoDong Huang
63010d6ae3SXiaoDong Huang for (i = 0; i < CRU_CLKGATES_CON_CNT; i++)
64010d6ae3SXiaoDong Huang mmio_write_32(CRU_BASE + CRU_CLKGATES_CON(i),
65010d6ae3SXiaoDong Huang WITH_16BITS_WMSK(clkgt_save[i]));
66010d6ae3SXiaoDong Huang
67010d6ae3SXiaoDong Huang j = i;
68010d6ae3SXiaoDong Huang for (i = 0; i < CRU_PMU_CLKGATE_CON_CNT; i++, j++)
69010d6ae3SXiaoDong Huang mmio_write_32(PMUCRU_BASE + CRU_PMU_CLKGATES_CON(i),
70010d6ae3SXiaoDong Huang WITH_16BITS_WMSK(clkgt_save[j]));
71010d6ae3SXiaoDong Huang }
72010d6ae3SXiaoDong Huang
clk_gate_con_disable(void)73010d6ae3SXiaoDong Huang void clk_gate_con_disable(void)
74010d6ae3SXiaoDong Huang {
75010d6ae3SXiaoDong Huang uint32_t i;
76010d6ae3SXiaoDong Huang
77010d6ae3SXiaoDong Huang for (i = 0; i < CRU_CLKGATES_CON_CNT; i++)
78010d6ae3SXiaoDong Huang mmio_write_32(CRU_BASE + CRU_CLKGATES_CON(i),
79010d6ae3SXiaoDong Huang 0xffff0000);
80010d6ae3SXiaoDong Huang
81010d6ae3SXiaoDong Huang for (i = 0; i < CRU_PMU_CLKGATE_CON_CNT; i++)
82010d6ae3SXiaoDong Huang mmio_write_32(PMUCRU_BASE + CRU_PMU_CLKGATES_CON(i),
83010d6ae3SXiaoDong Huang 0xffff0000);
84010d6ae3SXiaoDong Huang }
85010d6ae3SXiaoDong Huang
soc_reset_config_all(void)86010d6ae3SXiaoDong Huang static void soc_reset_config_all(void)
87010d6ae3SXiaoDong Huang {
88010d6ae3SXiaoDong Huang uint32_t tmp;
89010d6ae3SXiaoDong Huang
90010d6ae3SXiaoDong Huang /* tsadc and wdt can trigger a first rst */
91010d6ae3SXiaoDong Huang tmp = mmio_read_32(CRU_BASE + CRU_GLB_RST_CON);
92010d6ae3SXiaoDong Huang tmp |= CRU_GLB_RST_TSADC_FST | CRU_GLB_RST_WDT_FST;
93010d6ae3SXiaoDong Huang mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, tmp);
94010d6ae3SXiaoDong Huang return;
95010d6ae3SXiaoDong Huang tmp = mmio_read_32(PMUGRF_BASE + PMUGRF_SOC_CON(3));
96010d6ae3SXiaoDong Huang tmp &= ~(PMUGRF_FAILSAFE_SHTDN_TSADC | PMUGRF_FAILSAFE_SHTDN_WDT);
97010d6ae3SXiaoDong Huang mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(3), tmp);
98010d6ae3SXiaoDong Huang
99010d6ae3SXiaoDong Huang /* wdt pin rst eable */
100010d6ae3SXiaoDong Huang mmio_write_32(GRF_BASE + GRF_SOC_CON(2),
101010d6ae3SXiaoDong Huang BIT_WITH_WMSK(GRF_SOC_CON2_NSWDT_RST_EN));
102010d6ae3SXiaoDong Huang }
103010d6ae3SXiaoDong Huang
px30_soc_reset_config(void)104010d6ae3SXiaoDong Huang void px30_soc_reset_config(void)
105010d6ae3SXiaoDong Huang {
106010d6ae3SXiaoDong Huang uint32_t tmp;
107010d6ae3SXiaoDong Huang
108010d6ae3SXiaoDong Huang /* enable soc ip rst hold time cfg */
109010d6ae3SXiaoDong Huang tmp = mmio_read_32(CRU_BASE + CRU_GLB_RST_CON);
110010d6ae3SXiaoDong Huang tmp |= BIT(CRU_GLB_RST_TSADC_EXT) | BIT(CRU_GLB_RST_WDT_EXT);
111010d6ae3SXiaoDong Huang mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, tmp);
112010d6ae3SXiaoDong Huang /* soc ip rst hold time, 24m */
113010d6ae3SXiaoDong Huang tmp = mmio_read_32(CRU_BASE + CRU_GLB_CNT_TH);
114010d6ae3SXiaoDong Huang tmp &= ~CRU_GLB_CNT_RST_MSK;
115010d6ae3SXiaoDong Huang tmp |= (CRU_GLB_CNT_RST_1MS / 2);
116010d6ae3SXiaoDong Huang mmio_write_32(CRU_BASE + CRU_GLB_CNT_TH, tmp);
117010d6ae3SXiaoDong Huang
118010d6ae3SXiaoDong Huang mmio_write_32(PMUSGRF_BASE + PMUSGRF_SOC_CON(0),
119010d6ae3SXiaoDong Huang BIT_WITH_WMSK(PMUSGRF_RSTOUT_FST) |
120010d6ae3SXiaoDong Huang BIT_WITH_WMSK(PMUSGRF_RSTOUT_TSADC) |
121010d6ae3SXiaoDong Huang BIT_WITH_WMSK(PMUSGRF_RSTOUT_WDT));
122010d6ae3SXiaoDong Huang
123010d6ae3SXiaoDong Huang /* rst_out pulse time */
124010d6ae3SXiaoDong Huang mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(2),
125010d6ae3SXiaoDong Huang PMUGRF_SOC_CON2_MAX_341US | PMUGRF_SOC_CON2_US_WMSK);
126010d6ae3SXiaoDong Huang
127010d6ae3SXiaoDong Huang soc_reset_config_all();
128010d6ae3SXiaoDong Huang }
129010d6ae3SXiaoDong Huang
plat_rockchip_soc_init(void)130010d6ae3SXiaoDong Huang void plat_rockchip_soc_init(void)
131010d6ae3SXiaoDong Huang {
132010d6ae3SXiaoDong Huang secure_timer_init();
133010d6ae3SXiaoDong Huang sgrf_init();
134010d6ae3SXiaoDong Huang }
135