1010d6ae3SXiaoDong Huang /* 2010d6ae3SXiaoDong Huang * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved. 3010d6ae3SXiaoDong Huang * 4010d6ae3SXiaoDong Huang * SPDX-License-Identifier: BSD-3-Clause 5010d6ae3SXiaoDong Huang */ 6010d6ae3SXiaoDong Huang 7010d6ae3SXiaoDong Huang #include <platform_def.h> 8010d6ae3SXiaoDong Huang 9010d6ae3SXiaoDong Huang #include <arch_helpers.h> 10010d6ae3SXiaoDong Huang #include <common/debug.h> 11010d6ae3SXiaoDong Huang #include <drivers/console.h> 12010d6ae3SXiaoDong Huang #include <drivers/delay_timer.h> 13010d6ae3SXiaoDong Huang #include <lib/mmio.h> 14010d6ae3SXiaoDong Huang 15010d6ae3SXiaoDong Huang #include <platform_def.h> 16010d6ae3SXiaoDong Huang #include <pmu.h> 17010d6ae3SXiaoDong Huang #include <px30_def.h> 18*d2483afaSHeiko Stuebner #include <secure.h> 19010d6ae3SXiaoDong Huang #include <soc.h> 20010d6ae3SXiaoDong Huang #include <rockchip_sip_svc.h> 21010d6ae3SXiaoDong Huang 22010d6ae3SXiaoDong Huang /* Aggregate of all devices in the first GB */ 23010d6ae3SXiaoDong Huang #define PX30_DEV_RNG0_BASE 0xff000000 24010d6ae3SXiaoDong Huang #define PX30_DEV_RNG0_SIZE 0x00ff0000 25010d6ae3SXiaoDong Huang 26010d6ae3SXiaoDong Huang const mmap_region_t plat_rk_mmap[] = { 27010d6ae3SXiaoDong Huang MAP_REGION_FLAT(PX30_DEV_RNG0_BASE, PX30_DEV_RNG0_SIZE, 28010d6ae3SXiaoDong Huang MT_DEVICE | MT_RW | MT_SECURE), 29010d6ae3SXiaoDong Huang MAP_REGION_FLAT(SHARE_MEM_BASE, SHARE_MEM_SIZE, 30010d6ae3SXiaoDong Huang MT_DEVICE | MT_RW | MT_SECURE), 31010d6ae3SXiaoDong Huang MAP_REGION_FLAT(DDR_PARAM_BASE, DDR_PARAM_SIZE, 32010d6ae3SXiaoDong Huang MT_DEVICE | MT_RW | MT_SECURE), 33010d6ae3SXiaoDong Huang { 0 } 34010d6ae3SXiaoDong Huang }; 35010d6ae3SXiaoDong Huang 36010d6ae3SXiaoDong Huang /* The RockChip power domain tree descriptor */ 37010d6ae3SXiaoDong Huang const unsigned char rockchip_power_domain_tree_desc[] = { 38010d6ae3SXiaoDong Huang /* No of root nodes */ 39010d6ae3SXiaoDong Huang PLATFORM_SYSTEM_COUNT, 40010d6ae3SXiaoDong Huang /* No of children for the root node */ 41010d6ae3SXiaoDong Huang PLATFORM_CLUSTER_COUNT, 42010d6ae3SXiaoDong Huang /* No of children for the first cluster node */ 43010d6ae3SXiaoDong Huang PLATFORM_CLUSTER0_CORE_COUNT, 44010d6ae3SXiaoDong Huang }; 45010d6ae3SXiaoDong Huang 46010d6ae3SXiaoDong Huang void clk_gate_con_save(uint32_t *clkgt_save) 47010d6ae3SXiaoDong Huang { 48010d6ae3SXiaoDong Huang uint32_t i, j; 49010d6ae3SXiaoDong Huang 50010d6ae3SXiaoDong Huang for (i = 0; i < CRU_CLKGATES_CON_CNT; i++) 51010d6ae3SXiaoDong Huang clkgt_save[i] = 52010d6ae3SXiaoDong Huang mmio_read_32(CRU_BASE + CRU_CLKGATES_CON(i)); 53010d6ae3SXiaoDong Huang j = i; 54010d6ae3SXiaoDong Huang for (i = 0; i < CRU_PMU_CLKGATE_CON_CNT; i++, j++) 55010d6ae3SXiaoDong Huang clkgt_save[j] = 56010d6ae3SXiaoDong Huang mmio_read_32(PMUCRU_BASE + CRU_PMU_CLKGATES_CON(i)); 57010d6ae3SXiaoDong Huang } 58010d6ae3SXiaoDong Huang 59010d6ae3SXiaoDong Huang void clk_gate_con_restore(uint32_t *clkgt_save) 60010d6ae3SXiaoDong Huang { 61010d6ae3SXiaoDong Huang uint32_t i, j; 62010d6ae3SXiaoDong Huang 63010d6ae3SXiaoDong Huang for (i = 0; i < CRU_CLKGATES_CON_CNT; i++) 64010d6ae3SXiaoDong Huang mmio_write_32(CRU_BASE + CRU_CLKGATES_CON(i), 65010d6ae3SXiaoDong Huang WITH_16BITS_WMSK(clkgt_save[i])); 66010d6ae3SXiaoDong Huang 67010d6ae3SXiaoDong Huang j = i; 68010d6ae3SXiaoDong Huang for (i = 0; i < CRU_PMU_CLKGATE_CON_CNT; i++, j++) 69010d6ae3SXiaoDong Huang mmio_write_32(PMUCRU_BASE + CRU_PMU_CLKGATES_CON(i), 70010d6ae3SXiaoDong Huang WITH_16BITS_WMSK(clkgt_save[j])); 71010d6ae3SXiaoDong Huang } 72010d6ae3SXiaoDong Huang 73010d6ae3SXiaoDong Huang void clk_gate_con_disable(void) 74010d6ae3SXiaoDong Huang { 75010d6ae3SXiaoDong Huang uint32_t i; 76010d6ae3SXiaoDong Huang 77010d6ae3SXiaoDong Huang for (i = 0; i < CRU_CLKGATES_CON_CNT; i++) 78010d6ae3SXiaoDong Huang mmio_write_32(CRU_BASE + CRU_CLKGATES_CON(i), 79010d6ae3SXiaoDong Huang 0xffff0000); 80010d6ae3SXiaoDong Huang 81010d6ae3SXiaoDong Huang for (i = 0; i < CRU_PMU_CLKGATE_CON_CNT; i++) 82010d6ae3SXiaoDong Huang mmio_write_32(PMUCRU_BASE + CRU_PMU_CLKGATES_CON(i), 83010d6ae3SXiaoDong Huang 0xffff0000); 84010d6ae3SXiaoDong Huang } 85010d6ae3SXiaoDong Huang 86010d6ae3SXiaoDong Huang static void soc_reset_config_all(void) 87010d6ae3SXiaoDong Huang { 88010d6ae3SXiaoDong Huang uint32_t tmp; 89010d6ae3SXiaoDong Huang 90010d6ae3SXiaoDong Huang /* tsadc and wdt can trigger a first rst */ 91010d6ae3SXiaoDong Huang tmp = mmio_read_32(CRU_BASE + CRU_GLB_RST_CON); 92010d6ae3SXiaoDong Huang tmp |= CRU_GLB_RST_TSADC_FST | CRU_GLB_RST_WDT_FST; 93010d6ae3SXiaoDong Huang mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, tmp); 94010d6ae3SXiaoDong Huang return; 95010d6ae3SXiaoDong Huang tmp = mmio_read_32(PMUGRF_BASE + PMUGRF_SOC_CON(3)); 96010d6ae3SXiaoDong Huang tmp &= ~(PMUGRF_FAILSAFE_SHTDN_TSADC | PMUGRF_FAILSAFE_SHTDN_WDT); 97010d6ae3SXiaoDong Huang mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(3), tmp); 98010d6ae3SXiaoDong Huang 99010d6ae3SXiaoDong Huang /* wdt pin rst eable */ 100010d6ae3SXiaoDong Huang mmio_write_32(GRF_BASE + GRF_SOC_CON(2), 101010d6ae3SXiaoDong Huang BIT_WITH_WMSK(GRF_SOC_CON2_NSWDT_RST_EN)); 102010d6ae3SXiaoDong Huang } 103010d6ae3SXiaoDong Huang 104010d6ae3SXiaoDong Huang void px30_soc_reset_config(void) 105010d6ae3SXiaoDong Huang { 106010d6ae3SXiaoDong Huang uint32_t tmp; 107010d6ae3SXiaoDong Huang 108010d6ae3SXiaoDong Huang /* enable soc ip rst hold time cfg */ 109010d6ae3SXiaoDong Huang tmp = mmio_read_32(CRU_BASE + CRU_GLB_RST_CON); 110010d6ae3SXiaoDong Huang tmp |= BIT(CRU_GLB_RST_TSADC_EXT) | BIT(CRU_GLB_RST_WDT_EXT); 111010d6ae3SXiaoDong Huang mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, tmp); 112010d6ae3SXiaoDong Huang /* soc ip rst hold time, 24m */ 113010d6ae3SXiaoDong Huang tmp = mmio_read_32(CRU_BASE + CRU_GLB_CNT_TH); 114010d6ae3SXiaoDong Huang tmp &= ~CRU_GLB_CNT_RST_MSK; 115010d6ae3SXiaoDong Huang tmp |= (CRU_GLB_CNT_RST_1MS / 2); 116010d6ae3SXiaoDong Huang mmio_write_32(CRU_BASE + CRU_GLB_CNT_TH, tmp); 117010d6ae3SXiaoDong Huang 118010d6ae3SXiaoDong Huang mmio_write_32(PMUSGRF_BASE + PMUSGRF_SOC_CON(0), 119010d6ae3SXiaoDong Huang BIT_WITH_WMSK(PMUSGRF_RSTOUT_FST) | 120010d6ae3SXiaoDong Huang BIT_WITH_WMSK(PMUSGRF_RSTOUT_TSADC) | 121010d6ae3SXiaoDong Huang BIT_WITH_WMSK(PMUSGRF_RSTOUT_WDT)); 122010d6ae3SXiaoDong Huang 123010d6ae3SXiaoDong Huang /* rst_out pulse time */ 124010d6ae3SXiaoDong Huang mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(2), 125010d6ae3SXiaoDong Huang PMUGRF_SOC_CON2_MAX_341US | PMUGRF_SOC_CON2_US_WMSK); 126010d6ae3SXiaoDong Huang 127010d6ae3SXiaoDong Huang soc_reset_config_all(); 128010d6ae3SXiaoDong Huang } 129010d6ae3SXiaoDong Huang 130010d6ae3SXiaoDong Huang void plat_rockchip_soc_init(void) 131010d6ae3SXiaoDong Huang { 132010d6ae3SXiaoDong Huang secure_timer_init(); 133010d6ae3SXiaoDong Huang sgrf_init(); 134010d6ae3SXiaoDong Huang } 135