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