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