xref: /rk3399_ARM-atf/plat/rockchip/rk3568/drivers/soc/soc.c (revision 673c444372181a5ac23c14b9efd3003a37ce0193)
19fd9f1d0Sshengfei Xu /*
2*4e1ccc60SShengfei Xu  * Copyright (c) 2023-2025, ARM Limited and Contributors. All rights reserved.
39fd9f1d0Sshengfei Xu  *
49fd9f1d0Sshengfei Xu  * SPDX-License-Identifier: BSD-3-Clause
59fd9f1d0Sshengfei Xu  */
69fd9f1d0Sshengfei Xu 
79fd9f1d0Sshengfei Xu #include <common/debug.h>
89fd9f1d0Sshengfei Xu #include <lib/xlat_tables/xlat_tables_v2.h>
99fd9f1d0Sshengfei Xu #include <mmio.h>
109fd9f1d0Sshengfei Xu #include <platform_def.h>
119fd9f1d0Sshengfei Xu 
12*4e1ccc60SShengfei Xu #include <plat_private.h>
13*4e1ccc60SShengfei Xu #include <rk3568_clk.h>
149fd9f1d0Sshengfei Xu #include <soc.h>
159fd9f1d0Sshengfei Xu 
169fd9f1d0Sshengfei Xu const mmap_region_t plat_rk_mmap[] = {
179fd9f1d0Sshengfei Xu 	MAP_REGION_FLAT(RKFPGA_DEV_RNG0_BASE, RKFPGA_DEV_RNG0_SIZE,
189fd9f1d0Sshengfei Xu 			MT_DEVICE | MT_RW | MT_SECURE),
199fd9f1d0Sshengfei Xu 	MAP_REGION_FLAT(PMUSRAM_BASE, PMUSRAM_SIZE,
209fd9f1d0Sshengfei Xu 			MT_MEMORY | MT_RW | MT_SECURE),
21*4e1ccc60SShengfei Xu 	MAP_REGION_FLAT(DDR_SHARE_MEM, DDR_SHARE_SIZE,
22*4e1ccc60SShengfei Xu 			MT_DEVICE | MT_RW | MT_NS),
239fd9f1d0Sshengfei Xu 
249fd9f1d0Sshengfei Xu 	{ 0 }
259fd9f1d0Sshengfei Xu };
269fd9f1d0Sshengfei Xu 
279fd9f1d0Sshengfei Xu /* The RockChip power domain tree descriptor */
289fd9f1d0Sshengfei Xu const unsigned char rockchip_power_domain_tree_desc[] = {
299fd9f1d0Sshengfei Xu 	/* No of root nodes */
309fd9f1d0Sshengfei Xu 	PLATFORM_SYSTEM_COUNT,
319fd9f1d0Sshengfei Xu 	/* No of children for the root node */
329fd9f1d0Sshengfei Xu 	PLATFORM_CLUSTER_COUNT,
339fd9f1d0Sshengfei Xu 	/* No of children for the first cluster node */
349fd9f1d0Sshengfei Xu 	PLATFORM_CLUSTER0_CORE_COUNT,
359fd9f1d0Sshengfei Xu };
369fd9f1d0Sshengfei Xu 
secure_timer_init(void)379fd9f1d0Sshengfei Xu static void secure_timer_init(void)
389fd9f1d0Sshengfei Xu {
399fd9f1d0Sshengfei Xu 	mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_CONTROL_REG, TIMER_DIS);
409fd9f1d0Sshengfei Xu 	mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_LOAD_COUNT0, 0xffffffff);
419fd9f1d0Sshengfei Xu 	mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_LOAD_COUNT1, 0xffffffff);
429fd9f1d0Sshengfei Xu 
439fd9f1d0Sshengfei Xu 	/* auto reload & enable the timer */
449fd9f1d0Sshengfei Xu 	mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_CONTROL_REG, TIMER_EN);
459fd9f1d0Sshengfei Xu }
469fd9f1d0Sshengfei Xu 
sgrf_init(void)479fd9f1d0Sshengfei Xu static void sgrf_init(void)
489fd9f1d0Sshengfei Xu {
499fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(0), 0xffff0000);
509fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(1), 0xffff0000);
519fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(2), 0xffff0000);
529fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(3), 0xffff0000);
539fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(4), 0xffff0000);
549fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(5), 0xffff0000);
559fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(6), 0xffff0000);
569fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(7), 0xffff0000);
579fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(8), 0xffff0000);
589fd9f1d0Sshengfei Xu 
599fd9f1d0Sshengfei Xu 	mmio_write_32(DDRSGRF_BASE + FIREWALL_DDR_FW_DDR_CON_REG, 0xffff0000);
609fd9f1d0Sshengfei Xu }
619fd9f1d0Sshengfei Xu 
set_pll_slow_mode(uint32_t clk_pll)629fd9f1d0Sshengfei Xu static void set_pll_slow_mode(uint32_t clk_pll)
639fd9f1d0Sshengfei Xu {
649fd9f1d0Sshengfei Xu 	mmio_write_32(CRU_BASE + CRU_MODE_CON00, 0x03 << (16 + clk_pll * 2));
659fd9f1d0Sshengfei Xu }
669fd9f1d0Sshengfei Xu 
soc_global_soft_reset(void)679fd9f1d0Sshengfei Xu static void __dead2 soc_global_soft_reset(void)
689fd9f1d0Sshengfei Xu {
699fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_CPLL);
709fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_GPLL);
719fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_NPLL);
729fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_VPLL);
739fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_USBPLL);
749fd9f1d0Sshengfei Xu 	set_pll_slow_mode(CLK_APLL);
759fd9f1d0Sshengfei Xu 	mmio_write_32(PMUCRU_BASE + PMUCRU_MODE_CON00, 0x000f0000);
769fd9f1d0Sshengfei Xu 
779fd9f1d0Sshengfei Xu 	dsb();
789fd9f1d0Sshengfei Xu 	mmio_write_32(CRU_BASE + CRU_GLB_SRST_FST, GLB_SRST_FST_CFG_VAL);
799fd9f1d0Sshengfei Xu 	/*
809fd9f1d0Sshengfei Xu 	 * Maybe the HW needs some times to reset the system,
819fd9f1d0Sshengfei Xu 	 * so we do not hope the core to excute valid codes.
829fd9f1d0Sshengfei Xu 	 */
839fd9f1d0Sshengfei Xu 	while (1) {
849fd9f1d0Sshengfei Xu 		;
859fd9f1d0Sshengfei Xu 	}
869fd9f1d0Sshengfei Xu }
879fd9f1d0Sshengfei Xu 
rockchip_system_reset_init(void)889fd9f1d0Sshengfei Xu static void rockchip_system_reset_init(void)
899fd9f1d0Sshengfei Xu {
909fd9f1d0Sshengfei Xu 	mmio_write_32(GRF_BASE + 0x0508, 0x00100010);
919fd9f1d0Sshengfei Xu 	mmio_write_32(CRU_BASE + 0x00dc, 0x01030103);
929fd9f1d0Sshengfei Xu }
939fd9f1d0Sshengfei Xu 
rockchip_soc_soft_reset(void)949fd9f1d0Sshengfei Xu void __dead2 rockchip_soc_soft_reset(void)
959fd9f1d0Sshengfei Xu {
969fd9f1d0Sshengfei Xu 	soc_global_soft_reset();
979fd9f1d0Sshengfei Xu }
989fd9f1d0Sshengfei Xu 
plat_rockchip_soc_init(void)999fd9f1d0Sshengfei Xu void plat_rockchip_soc_init(void)
1009fd9f1d0Sshengfei Xu {
101*4e1ccc60SShengfei Xu 	rockchip_clock_init();
1029fd9f1d0Sshengfei Xu 	secure_timer_init();
1039fd9f1d0Sshengfei Xu 	sgrf_init();
1049fd9f1d0Sshengfei Xu 	rockchip_system_reset_init();
105*4e1ccc60SShengfei Xu 	rockchip_init_scmi_server();
1069fd9f1d0Sshengfei Xu 	NOTICE("BL31: Rockchip release version: v%d.%d\n",
1079fd9f1d0Sshengfei Xu 		MAJOR_VERSION, MINOR_VERSION);
1089fd9f1d0Sshengfei Xu }
1099fd9f1d0Sshengfei Xu 
110