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 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 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 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 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 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 949fd9f1d0Sshengfei Xu void __dead2 rockchip_soc_soft_reset(void) 959fd9f1d0Sshengfei Xu { 969fd9f1d0Sshengfei Xu soc_global_soft_reset(); 979fd9f1d0Sshengfei Xu } 989fd9f1d0Sshengfei Xu 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