1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <platform_def.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <arch_helpers.h> 10*91f16700Schasinglulu #include <common/debug.h> 11*91f16700Schasinglulu #include <drivers/console.h> 12*91f16700Schasinglulu #include <drivers/delay_timer.h> 13*91f16700Schasinglulu #include <lib/mmio.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #include <platform_def.h> 16*91f16700Schasinglulu #include <pmu.h> 17*91f16700Schasinglulu #include <px30_def.h> 18*91f16700Schasinglulu #include <secure.h> 19*91f16700Schasinglulu #include <soc.h> 20*91f16700Schasinglulu #include <rockchip_sip_svc.h> 21*91f16700Schasinglulu 22*91f16700Schasinglulu /* Aggregate of all devices in the first GB */ 23*91f16700Schasinglulu #define PX30_DEV_RNG0_BASE 0xff000000 24*91f16700Schasinglulu #define PX30_DEV_RNG0_SIZE 0x00ff0000 25*91f16700Schasinglulu 26*91f16700Schasinglulu const mmap_region_t plat_rk_mmap[] = { 27*91f16700Schasinglulu MAP_REGION_FLAT(PX30_DEV_RNG0_BASE, PX30_DEV_RNG0_SIZE, 28*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 29*91f16700Schasinglulu MAP_REGION_FLAT(SHARE_MEM_BASE, SHARE_MEM_SIZE, 30*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 31*91f16700Schasinglulu MAP_REGION_FLAT(DDR_PARAM_BASE, DDR_PARAM_SIZE, 32*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 33*91f16700Schasinglulu { 0 } 34*91f16700Schasinglulu }; 35*91f16700Schasinglulu 36*91f16700Schasinglulu /* The RockChip power domain tree descriptor */ 37*91f16700Schasinglulu const unsigned char rockchip_power_domain_tree_desc[] = { 38*91f16700Schasinglulu /* No of root nodes */ 39*91f16700Schasinglulu PLATFORM_SYSTEM_COUNT, 40*91f16700Schasinglulu /* No of children for the root node */ 41*91f16700Schasinglulu PLATFORM_CLUSTER_COUNT, 42*91f16700Schasinglulu /* No of children for the first cluster node */ 43*91f16700Schasinglulu PLATFORM_CLUSTER0_CORE_COUNT, 44*91f16700Schasinglulu }; 45*91f16700Schasinglulu 46*91f16700Schasinglulu void clk_gate_con_save(uint32_t *clkgt_save) 47*91f16700Schasinglulu { 48*91f16700Schasinglulu uint32_t i, j; 49*91f16700Schasinglulu 50*91f16700Schasinglulu for (i = 0; i < CRU_CLKGATES_CON_CNT; i++) 51*91f16700Schasinglulu clkgt_save[i] = 52*91f16700Schasinglulu mmio_read_32(CRU_BASE + CRU_CLKGATES_CON(i)); 53*91f16700Schasinglulu j = i; 54*91f16700Schasinglulu for (i = 0; i < CRU_PMU_CLKGATE_CON_CNT; i++, j++) 55*91f16700Schasinglulu clkgt_save[j] = 56*91f16700Schasinglulu mmio_read_32(PMUCRU_BASE + CRU_PMU_CLKGATES_CON(i)); 57*91f16700Schasinglulu } 58*91f16700Schasinglulu 59*91f16700Schasinglulu void clk_gate_con_restore(uint32_t *clkgt_save) 60*91f16700Schasinglulu { 61*91f16700Schasinglulu uint32_t i, j; 62*91f16700Schasinglulu 63*91f16700Schasinglulu for (i = 0; i < CRU_CLKGATES_CON_CNT; i++) 64*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_CLKGATES_CON(i), 65*91f16700Schasinglulu WITH_16BITS_WMSK(clkgt_save[i])); 66*91f16700Schasinglulu 67*91f16700Schasinglulu j = i; 68*91f16700Schasinglulu for (i = 0; i < CRU_PMU_CLKGATE_CON_CNT; i++, j++) 69*91f16700Schasinglulu mmio_write_32(PMUCRU_BASE + CRU_PMU_CLKGATES_CON(i), 70*91f16700Schasinglulu WITH_16BITS_WMSK(clkgt_save[j])); 71*91f16700Schasinglulu } 72*91f16700Schasinglulu 73*91f16700Schasinglulu void clk_gate_con_disable(void) 74*91f16700Schasinglulu { 75*91f16700Schasinglulu uint32_t i; 76*91f16700Schasinglulu 77*91f16700Schasinglulu for (i = 0; i < CRU_CLKGATES_CON_CNT; i++) 78*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_CLKGATES_CON(i), 79*91f16700Schasinglulu 0xffff0000); 80*91f16700Schasinglulu 81*91f16700Schasinglulu for (i = 0; i < CRU_PMU_CLKGATE_CON_CNT; i++) 82*91f16700Schasinglulu mmio_write_32(PMUCRU_BASE + CRU_PMU_CLKGATES_CON(i), 83*91f16700Schasinglulu 0xffff0000); 84*91f16700Schasinglulu } 85*91f16700Schasinglulu 86*91f16700Schasinglulu static void soc_reset_config_all(void) 87*91f16700Schasinglulu { 88*91f16700Schasinglulu uint32_t tmp; 89*91f16700Schasinglulu 90*91f16700Schasinglulu /* tsadc and wdt can trigger a first rst */ 91*91f16700Schasinglulu tmp = mmio_read_32(CRU_BASE + CRU_GLB_RST_CON); 92*91f16700Schasinglulu tmp |= CRU_GLB_RST_TSADC_FST | CRU_GLB_RST_WDT_FST; 93*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, tmp); 94*91f16700Schasinglulu return; 95*91f16700Schasinglulu tmp = mmio_read_32(PMUGRF_BASE + PMUGRF_SOC_CON(3)); 96*91f16700Schasinglulu tmp &= ~(PMUGRF_FAILSAFE_SHTDN_TSADC | PMUGRF_FAILSAFE_SHTDN_WDT); 97*91f16700Schasinglulu mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(3), tmp); 98*91f16700Schasinglulu 99*91f16700Schasinglulu /* wdt pin rst eable */ 100*91f16700Schasinglulu mmio_write_32(GRF_BASE + GRF_SOC_CON(2), 101*91f16700Schasinglulu BIT_WITH_WMSK(GRF_SOC_CON2_NSWDT_RST_EN)); 102*91f16700Schasinglulu } 103*91f16700Schasinglulu 104*91f16700Schasinglulu void px30_soc_reset_config(void) 105*91f16700Schasinglulu { 106*91f16700Schasinglulu uint32_t tmp; 107*91f16700Schasinglulu 108*91f16700Schasinglulu /* enable soc ip rst hold time cfg */ 109*91f16700Schasinglulu tmp = mmio_read_32(CRU_BASE + CRU_GLB_RST_CON); 110*91f16700Schasinglulu tmp |= BIT(CRU_GLB_RST_TSADC_EXT) | BIT(CRU_GLB_RST_WDT_EXT); 111*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, tmp); 112*91f16700Schasinglulu /* soc ip rst hold time, 24m */ 113*91f16700Schasinglulu tmp = mmio_read_32(CRU_BASE + CRU_GLB_CNT_TH); 114*91f16700Schasinglulu tmp &= ~CRU_GLB_CNT_RST_MSK; 115*91f16700Schasinglulu tmp |= (CRU_GLB_CNT_RST_1MS / 2); 116*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_GLB_CNT_TH, tmp); 117*91f16700Schasinglulu 118*91f16700Schasinglulu mmio_write_32(PMUSGRF_BASE + PMUSGRF_SOC_CON(0), 119*91f16700Schasinglulu BIT_WITH_WMSK(PMUSGRF_RSTOUT_FST) | 120*91f16700Schasinglulu BIT_WITH_WMSK(PMUSGRF_RSTOUT_TSADC) | 121*91f16700Schasinglulu BIT_WITH_WMSK(PMUSGRF_RSTOUT_WDT)); 122*91f16700Schasinglulu 123*91f16700Schasinglulu /* rst_out pulse time */ 124*91f16700Schasinglulu mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(2), 125*91f16700Schasinglulu PMUGRF_SOC_CON2_MAX_341US | PMUGRF_SOC_CON2_US_WMSK); 126*91f16700Schasinglulu 127*91f16700Schasinglulu soc_reset_config_all(); 128*91f16700Schasinglulu } 129*91f16700Schasinglulu 130*91f16700Schasinglulu void plat_rockchip_soc_init(void) 131*91f16700Schasinglulu { 132*91f16700Schasinglulu secure_timer_init(); 133*91f16700Schasinglulu sgrf_init(); 134*91f16700Schasinglulu } 135