1*9fd9f1d0Sshengfei Xu /* 2*9fd9f1d0Sshengfei Xu * Copyright (c) 2023, ARM Limited and Contributors. All rights reserved. 3*9fd9f1d0Sshengfei Xu * 4*9fd9f1d0Sshengfei Xu * SPDX-License-Identifier: BSD-3-Clause 5*9fd9f1d0Sshengfei Xu */ 6*9fd9f1d0Sshengfei Xu 7*9fd9f1d0Sshengfei Xu #include <common/debug.h> 8*9fd9f1d0Sshengfei Xu #include <lib/xlat_tables/xlat_tables_v2.h> 9*9fd9f1d0Sshengfei Xu #include <mmio.h> 10*9fd9f1d0Sshengfei Xu #include <platform_def.h> 11*9fd9f1d0Sshengfei Xu 12*9fd9f1d0Sshengfei Xu #include <soc.h> 13*9fd9f1d0Sshengfei Xu 14*9fd9f1d0Sshengfei Xu const mmap_region_t plat_rk_mmap[] = { 15*9fd9f1d0Sshengfei Xu MAP_REGION_FLAT(RKFPGA_DEV_RNG0_BASE, RKFPGA_DEV_RNG0_SIZE, 16*9fd9f1d0Sshengfei Xu MT_DEVICE | MT_RW | MT_SECURE), 17*9fd9f1d0Sshengfei Xu MAP_REGION_FLAT(PMUSRAM_BASE, PMUSRAM_SIZE, 18*9fd9f1d0Sshengfei Xu MT_MEMORY | MT_RW | MT_SECURE), 19*9fd9f1d0Sshengfei Xu 20*9fd9f1d0Sshengfei Xu { 0 } 21*9fd9f1d0Sshengfei Xu }; 22*9fd9f1d0Sshengfei Xu 23*9fd9f1d0Sshengfei Xu /* The RockChip power domain tree descriptor */ 24*9fd9f1d0Sshengfei Xu const unsigned char rockchip_power_domain_tree_desc[] = { 25*9fd9f1d0Sshengfei Xu /* No of root nodes */ 26*9fd9f1d0Sshengfei Xu PLATFORM_SYSTEM_COUNT, 27*9fd9f1d0Sshengfei Xu /* No of children for the root node */ 28*9fd9f1d0Sshengfei Xu PLATFORM_CLUSTER_COUNT, 29*9fd9f1d0Sshengfei Xu /* No of children for the first cluster node */ 30*9fd9f1d0Sshengfei Xu PLATFORM_CLUSTER0_CORE_COUNT, 31*9fd9f1d0Sshengfei Xu }; 32*9fd9f1d0Sshengfei Xu 33*9fd9f1d0Sshengfei Xu static void secure_timer_init(void) 34*9fd9f1d0Sshengfei Xu { 35*9fd9f1d0Sshengfei Xu mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_CONTROL_REG, TIMER_DIS); 36*9fd9f1d0Sshengfei Xu mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_LOAD_COUNT0, 0xffffffff); 37*9fd9f1d0Sshengfei Xu mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_LOAD_COUNT1, 0xffffffff); 38*9fd9f1d0Sshengfei Xu 39*9fd9f1d0Sshengfei Xu /* auto reload & enable the timer */ 40*9fd9f1d0Sshengfei Xu mmio_write_32(STIMER0_CHN_BASE(1) + TIMER_CONTROL_REG, TIMER_EN); 41*9fd9f1d0Sshengfei Xu } 42*9fd9f1d0Sshengfei Xu 43*9fd9f1d0Sshengfei Xu static void sgrf_init(void) 44*9fd9f1d0Sshengfei Xu { 45*9fd9f1d0Sshengfei Xu mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(0), 0xffff0000); 46*9fd9f1d0Sshengfei Xu mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(1), 0xffff0000); 47*9fd9f1d0Sshengfei Xu mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(2), 0xffff0000); 48*9fd9f1d0Sshengfei Xu mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(3), 0xffff0000); 49*9fd9f1d0Sshengfei Xu mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(4), 0xffff0000); 50*9fd9f1d0Sshengfei Xu mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(5), 0xffff0000); 51*9fd9f1d0Sshengfei Xu mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(6), 0xffff0000); 52*9fd9f1d0Sshengfei Xu mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(7), 0xffff0000); 53*9fd9f1d0Sshengfei Xu mmio_write_32(SGRF_BASE + SGRF_FIREWALL_SLV_CON(8), 0xffff0000); 54*9fd9f1d0Sshengfei Xu 55*9fd9f1d0Sshengfei Xu mmio_write_32(DDRSGRF_BASE + FIREWALL_DDR_FW_DDR_CON_REG, 0xffff0000); 56*9fd9f1d0Sshengfei Xu } 57*9fd9f1d0Sshengfei Xu 58*9fd9f1d0Sshengfei Xu static void set_pll_slow_mode(uint32_t clk_pll) 59*9fd9f1d0Sshengfei Xu { 60*9fd9f1d0Sshengfei Xu mmio_write_32(CRU_BASE + CRU_MODE_CON00, 0x03 << (16 + clk_pll * 2)); 61*9fd9f1d0Sshengfei Xu } 62*9fd9f1d0Sshengfei Xu 63*9fd9f1d0Sshengfei Xu static void __dead2 soc_global_soft_reset(void) 64*9fd9f1d0Sshengfei Xu { 65*9fd9f1d0Sshengfei Xu set_pll_slow_mode(CLK_CPLL); 66*9fd9f1d0Sshengfei Xu set_pll_slow_mode(CLK_GPLL); 67*9fd9f1d0Sshengfei Xu set_pll_slow_mode(CLK_NPLL); 68*9fd9f1d0Sshengfei Xu set_pll_slow_mode(CLK_VPLL); 69*9fd9f1d0Sshengfei Xu set_pll_slow_mode(CLK_USBPLL); 70*9fd9f1d0Sshengfei Xu set_pll_slow_mode(CLK_APLL); 71*9fd9f1d0Sshengfei Xu mmio_write_32(PMUCRU_BASE + PMUCRU_MODE_CON00, 0x000f0000); 72*9fd9f1d0Sshengfei Xu 73*9fd9f1d0Sshengfei Xu dsb(); 74*9fd9f1d0Sshengfei Xu mmio_write_32(CRU_BASE + CRU_GLB_SRST_FST, GLB_SRST_FST_CFG_VAL); 75*9fd9f1d0Sshengfei Xu /* 76*9fd9f1d0Sshengfei Xu * Maybe the HW needs some times to reset the system, 77*9fd9f1d0Sshengfei Xu * so we do not hope the core to excute valid codes. 78*9fd9f1d0Sshengfei Xu */ 79*9fd9f1d0Sshengfei Xu while (1) { 80*9fd9f1d0Sshengfei Xu ; 81*9fd9f1d0Sshengfei Xu } 82*9fd9f1d0Sshengfei Xu } 83*9fd9f1d0Sshengfei Xu 84*9fd9f1d0Sshengfei Xu static void rockchip_system_reset_init(void) 85*9fd9f1d0Sshengfei Xu { 86*9fd9f1d0Sshengfei Xu mmio_write_32(GRF_BASE + 0x0508, 0x00100010); 87*9fd9f1d0Sshengfei Xu mmio_write_32(CRU_BASE + 0x00dc, 0x01030103); 88*9fd9f1d0Sshengfei Xu } 89*9fd9f1d0Sshengfei Xu 90*9fd9f1d0Sshengfei Xu void __dead2 rockchip_soc_soft_reset(void) 91*9fd9f1d0Sshengfei Xu { 92*9fd9f1d0Sshengfei Xu soc_global_soft_reset(); 93*9fd9f1d0Sshengfei Xu } 94*9fd9f1d0Sshengfei Xu 95*9fd9f1d0Sshengfei Xu void plat_rockchip_soc_init(void) 96*9fd9f1d0Sshengfei Xu { 97*9fd9f1d0Sshengfei Xu secure_timer_init(); 98*9fd9f1d0Sshengfei Xu sgrf_init(); 99*9fd9f1d0Sshengfei Xu rockchip_system_reset_init(); 100*9fd9f1d0Sshengfei Xu NOTICE("BL31: Rockchip release version: v%d.%d\n", 101*9fd9f1d0Sshengfei Xu MAJOR_VERSION, MINOR_VERSION); 102*9fd9f1d0Sshengfei Xu } 103*9fd9f1d0Sshengfei Xu 104