1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2016, 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 <lib/mmio.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <plat_private.h> 14*91f16700Schasinglulu #include <rk3368_def.h> 15*91f16700Schasinglulu #include <soc.h> 16*91f16700Schasinglulu 17*91f16700Schasinglulu static uint32_t plls_con[END_PLL_ID][4]; 18*91f16700Schasinglulu 19*91f16700Schasinglulu /* Table of regions to map using the MMU. */ 20*91f16700Schasinglulu const mmap_region_t plat_rk_mmap[] = { 21*91f16700Schasinglulu MAP_REGION_FLAT(CCI400_BASE, CCI400_SIZE, 22*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 23*91f16700Schasinglulu MAP_REGION_FLAT(GIC400_BASE, GIC400_SIZE, 24*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 25*91f16700Schasinglulu MAP_REGION_FLAT(STIME_BASE, STIME_SIZE, 26*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 27*91f16700Schasinglulu MAP_REGION_FLAT(SGRF_BASE, SGRF_SIZE, 28*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 29*91f16700Schasinglulu MAP_REGION_FLAT(PMUSRAM_BASE, PMUSRAM_SIZE, 30*91f16700Schasinglulu MT_MEMORY | MT_RW | MT_SECURE), 31*91f16700Schasinglulu MAP_REGION_FLAT(PMU_BASE, PMU_SIZE, 32*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 33*91f16700Schasinglulu MAP_REGION_FLAT(UART0_BASE, UART0_SIZE, 34*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 35*91f16700Schasinglulu MAP_REGION_FLAT(UART1_BASE, UART1_SIZE, 36*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 37*91f16700Schasinglulu MAP_REGION_FLAT(UART2_BASE, UART2_SIZE, 38*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 39*91f16700Schasinglulu MAP_REGION_FLAT(UART3_BASE, UART3_SIZE, 40*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 41*91f16700Schasinglulu MAP_REGION_FLAT(UART4_BASE, UART4_SIZE, 42*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 43*91f16700Schasinglulu MAP_REGION_FLAT(CRU_BASE, CRU_SIZE, 44*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 45*91f16700Schasinglulu MAP_REGION_FLAT(DDR_PCTL_BASE, DDR_PCTL_SIZE, 46*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 47*91f16700Schasinglulu MAP_REGION_FLAT(DDR_PHY_BASE, DDR_PHY_SIZE, 48*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 49*91f16700Schasinglulu MAP_REGION_FLAT(GRF_BASE, GRF_SIZE, 50*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 51*91f16700Schasinglulu MAP_REGION_FLAT(SERVICE_BUS_BASE, SERVICE_BUS_SISE, 52*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE), 53*91f16700Schasinglulu { 0 } 54*91f16700Schasinglulu }; 55*91f16700Schasinglulu 56*91f16700Schasinglulu /* The RockChip power domain tree descriptor */ 57*91f16700Schasinglulu const unsigned char rockchip_power_domain_tree_desc[] = { 58*91f16700Schasinglulu /* No of root nodes */ 59*91f16700Schasinglulu PLATFORM_SYSTEM_COUNT, 60*91f16700Schasinglulu /* No of children for the root node */ 61*91f16700Schasinglulu PLATFORM_CLUSTER_COUNT, 62*91f16700Schasinglulu /* No of children for the first cluster node */ 63*91f16700Schasinglulu PLATFORM_CLUSTER0_CORE_COUNT, 64*91f16700Schasinglulu /* No of children for the second cluster node */ 65*91f16700Schasinglulu PLATFORM_CLUSTER1_CORE_COUNT 66*91f16700Schasinglulu }; 67*91f16700Schasinglulu 68*91f16700Schasinglulu void secure_timer_init(void) 69*91f16700Schasinglulu { 70*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_LOADE_COUNT0, 0xffffffff); 71*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_LOADE_COUNT1, 0xffffffff); 72*91f16700Schasinglulu 73*91f16700Schasinglulu /* auto reload & enable the timer */ 74*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_CONTROL_REG, TIMER_EN); 75*91f16700Schasinglulu } 76*91f16700Schasinglulu 77*91f16700Schasinglulu void sgrf_init(void) 78*91f16700Schasinglulu { 79*91f16700Schasinglulu /* setting all configurable ip into no-secure */ 80*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(5), SGRF_SOC_CON_NS); 81*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6), SGRF_SOC_CON7_BITS); 82*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(7), SGRF_SOC_CON_NS); 83*91f16700Schasinglulu 84*91f16700Schasinglulu /* secure dma to no sesure */ 85*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_BUSDMAC_CON(0), SGRF_BUSDMAC_CON0_NS); 86*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_BUSDMAC_CON(1), SGRF_BUSDMAC_CON1_NS); 87*91f16700Schasinglulu dsb(); 88*91f16700Schasinglulu 89*91f16700Schasinglulu /* rst dma1 */ 90*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(1), 91*91f16700Schasinglulu RST_DMA1_MSK | (RST_DMA1_MSK << 16)); 92*91f16700Schasinglulu /* rst dma2 */ 93*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(4), 94*91f16700Schasinglulu RST_DMA2_MSK | (RST_DMA2_MSK << 16)); 95*91f16700Schasinglulu 96*91f16700Schasinglulu dsb(); 97*91f16700Schasinglulu 98*91f16700Schasinglulu /* release dma1 rst*/ 99*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(1), (RST_DMA1_MSK << 16)); 100*91f16700Schasinglulu /* release dma2 rst*/ 101*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(4), (RST_DMA2_MSK << 16)); 102*91f16700Schasinglulu } 103*91f16700Schasinglulu 104*91f16700Schasinglulu void plat_rockchip_soc_init(void) 105*91f16700Schasinglulu { 106*91f16700Schasinglulu secure_timer_init(); 107*91f16700Schasinglulu sgrf_init(); 108*91f16700Schasinglulu } 109*91f16700Schasinglulu 110*91f16700Schasinglulu void regs_updata_bits(uintptr_t addr, uint32_t val, 111*91f16700Schasinglulu uint32_t mask, uint32_t shift) 112*91f16700Schasinglulu { 113*91f16700Schasinglulu uint32_t tmp, orig; 114*91f16700Schasinglulu 115*91f16700Schasinglulu orig = mmio_read_32(addr); 116*91f16700Schasinglulu 117*91f16700Schasinglulu tmp = orig & ~(mask << shift); 118*91f16700Schasinglulu tmp |= (val & mask) << shift; 119*91f16700Schasinglulu 120*91f16700Schasinglulu if (tmp != orig) 121*91f16700Schasinglulu mmio_write_32(addr, tmp); 122*91f16700Schasinglulu dsb(); 123*91f16700Schasinglulu } 124*91f16700Schasinglulu 125*91f16700Schasinglulu static void plls_suspend(uint32_t pll_id) 126*91f16700Schasinglulu { 127*91f16700Schasinglulu plls_con[pll_id][0] = mmio_read_32(CRU_BASE + PLL_CONS((pll_id), 0)); 128*91f16700Schasinglulu plls_con[pll_id][1] = mmio_read_32(CRU_BASE + PLL_CONS((pll_id), 1)); 129*91f16700Schasinglulu plls_con[pll_id][2] = mmio_read_32(CRU_BASE + PLL_CONS((pll_id), 2)); 130*91f16700Schasinglulu plls_con[pll_id][3] = mmio_read_32(CRU_BASE + PLL_CONS((pll_id), 3)); 131*91f16700Schasinglulu 132*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS((pll_id), 3), PLL_SLOW_BITS); 133*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS((pll_id), 3), PLL_BYPASS); 134*91f16700Schasinglulu } 135*91f16700Schasinglulu 136*91f16700Schasinglulu static void pm_plls_suspend(void) 137*91f16700Schasinglulu { 138*91f16700Schasinglulu plls_suspend(NPLL_ID); 139*91f16700Schasinglulu plls_suspend(CPLL_ID); 140*91f16700Schasinglulu plls_suspend(GPLL_ID); 141*91f16700Schasinglulu plls_suspend(ABPLL_ID); 142*91f16700Schasinglulu plls_suspend(ALPLL_ID); 143*91f16700Schasinglulu } 144*91f16700Schasinglulu 145*91f16700Schasinglulu static inline void plls_resume(void) 146*91f16700Schasinglulu { 147*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS(ABPLL_ID, 3), 148*91f16700Schasinglulu plls_con[ABPLL_ID][3] | PLL_BYPASS_W_MSK); 149*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS(ALPLL_ID, 3), 150*91f16700Schasinglulu plls_con[ALPLL_ID][3] | PLL_BYPASS_W_MSK); 151*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS(GPLL_ID, 3), 152*91f16700Schasinglulu plls_con[GPLL_ID][3] | PLL_BYPASS_W_MSK); 153*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS(CPLL_ID, 3), 154*91f16700Schasinglulu plls_con[CPLL_ID][3] | PLL_BYPASS_W_MSK); 155*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS(NPLL_ID, 3), 156*91f16700Schasinglulu plls_con[NPLL_ID][3] | PLL_BYPASS_W_MSK); 157*91f16700Schasinglulu } 158*91f16700Schasinglulu 159*91f16700Schasinglulu void soc_sleep_config(void) 160*91f16700Schasinglulu { 161*91f16700Schasinglulu int i = 0; 162*91f16700Schasinglulu 163*91f16700Schasinglulu for (i = 0; i < CRU_CLKGATES_CON_CNT; i++) 164*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_CLKGATES_CON(i), 0xffff0000); 165*91f16700Schasinglulu pm_plls_suspend(); 166*91f16700Schasinglulu 167*91f16700Schasinglulu for (i = 0; i < CRU_CLKGATES_CON_CNT; i++) 168*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_CLKGATES_CON(i), 0xffff0000); 169*91f16700Schasinglulu } 170*91f16700Schasinglulu 171*91f16700Schasinglulu void pm_plls_resume(void) 172*91f16700Schasinglulu { 173*91f16700Schasinglulu plls_resume(); 174*91f16700Schasinglulu 175*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS(ABPLL_ID, 3), 176*91f16700Schasinglulu plls_con[ABPLL_ID][3] | PLLS_MODE_WMASK); 177*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS(ALPLL_ID, 3), 178*91f16700Schasinglulu plls_con[ALPLL_ID][3] | PLLS_MODE_WMASK); 179*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS(GPLL_ID, 3), 180*91f16700Schasinglulu plls_con[GPLL_ID][3] | PLLS_MODE_WMASK); 181*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS(CPLL_ID, 3), 182*91f16700Schasinglulu plls_con[CPLL_ID][3] | PLLS_MODE_WMASK); 183*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS(NPLL_ID, 3), 184*91f16700Schasinglulu plls_con[NPLL_ID][3] | PLLS_MODE_WMASK); 185*91f16700Schasinglulu } 186*91f16700Schasinglulu 187*91f16700Schasinglulu void __dead2 rockchip_soc_soft_reset(void) 188*91f16700Schasinglulu { 189*91f16700Schasinglulu uint32_t temp_val; 190*91f16700Schasinglulu 191*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS((GPLL_ID), 3), PLL_SLOW_BITS); 192*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS((CPLL_ID), 3), PLL_SLOW_BITS); 193*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS((NPLL_ID), 3), PLL_SLOW_BITS); 194*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS((ABPLL_ID), 3), PLL_SLOW_BITS); 195*91f16700Schasinglulu mmio_write_32(CRU_BASE + PLL_CONS((ALPLL_ID), 3), PLL_SLOW_BITS); 196*91f16700Schasinglulu 197*91f16700Schasinglulu temp_val = mmio_read_32(CRU_BASE + CRU_GLB_RST_CON) | 198*91f16700Schasinglulu PMU_RST_BY_SECOND_SFT; 199*91f16700Schasinglulu 200*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, temp_val); 201*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_GLB_SRST_SND, 0xeca8); 202*91f16700Schasinglulu 203*91f16700Schasinglulu /* 204*91f16700Schasinglulu * Maybe the HW needs some times to reset the system, 205*91f16700Schasinglulu * so we do not hope the core to execute valid codes. 206*91f16700Schasinglulu */ 207*91f16700Schasinglulu while (1) 208*91f16700Schasinglulu ; 209*91f16700Schasinglulu } 210