1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2016-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 <assert.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <arch_helpers.h> 10*91f16700Schasinglulu #include <common/debug.h> 11*91f16700Schasinglulu #include <drivers/delay_timer.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <plat_private.h> 14*91f16700Schasinglulu #include <secure.h> 15*91f16700Schasinglulu #include <soc.h> 16*91f16700Schasinglulu 17*91f16700Schasinglulu static void sgrf_ddr_rgn_global_bypass(uint32_t bypass) 18*91f16700Schasinglulu { 19*91f16700Schasinglulu if (bypass) 20*91f16700Schasinglulu /* set bypass (non-secure regions) for whole ddr regions */ 21*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(21), 22*91f16700Schasinglulu SGRF_DDR_RGN_BYPS); 23*91f16700Schasinglulu else 24*91f16700Schasinglulu /* cancel bypass for whole ddr regions */ 25*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(21), 26*91f16700Schasinglulu SGRF_DDR_RGN_NO_BYPS); 27*91f16700Schasinglulu } 28*91f16700Schasinglulu 29*91f16700Schasinglulu /** 30*91f16700Schasinglulu * There are 8 + 1 regions for DDR secure control: 31*91f16700Schasinglulu * DDR_RGN_0 ~ DDR_RGN_7: Per DDR_RGNs grain size is 1MB 32*91f16700Schasinglulu * DDR_RGN_X - the memories of exclude DDR_RGN_0 ~ DDR_RGN_7 33*91f16700Schasinglulu * 34*91f16700Schasinglulu * SGRF_SOC_CON6 - start address of RGN_0 + control 35*91f16700Schasinglulu * SGRF_SOC_CON7 - end address of RGN_0 36*91f16700Schasinglulu * ... 37*91f16700Schasinglulu * SGRF_SOC_CON20 - start address of the RGN_7 + control 38*91f16700Schasinglulu * SGRF_SOC_CON21 - end address of the RGN_7 + RGN_X control 39*91f16700Schasinglulu * 40*91f16700Schasinglulu * @rgn - the DDR regions 0 ~ 7 which are can be configured. 41*91f16700Schasinglulu * @st - start address to set as secure 42*91f16700Schasinglulu * @sz - length of area to set as secure 43*91f16700Schasinglulu * The @st_mb and @ed_mb indicate the start and end addresses for which to set 44*91f16700Schasinglulu * the security, and the unit is megabyte. When the st_mb == 0, ed_mb == 0, the 45*91f16700Schasinglulu * address range 0x0 ~ 0xfffff is secure. 46*91f16700Schasinglulu * 47*91f16700Schasinglulu * For example, if we would like to set the range [0, 32MB) is security via 48*91f16700Schasinglulu * DDR_RGN0, then rgn == 0, st_mb == 0, ed_mb == 31. 49*91f16700Schasinglulu */ 50*91f16700Schasinglulu static void sgrf_ddr_rgn_config(uint32_t rgn, uintptr_t st, size_t sz) 51*91f16700Schasinglulu { 52*91f16700Schasinglulu uintptr_t ed = st + sz; 53*91f16700Schasinglulu uintptr_t st_mb, ed_mb; 54*91f16700Schasinglulu 55*91f16700Schasinglulu assert(rgn <= 7); 56*91f16700Schasinglulu assert(st < ed); 57*91f16700Schasinglulu 58*91f16700Schasinglulu /* check aligned 1MB */ 59*91f16700Schasinglulu assert(st % SIZE_M(1) == 0); 60*91f16700Schasinglulu assert(ed % SIZE_M(1) == 0); 61*91f16700Schasinglulu 62*91f16700Schasinglulu st_mb = st / SIZE_M(1); 63*91f16700Schasinglulu ed_mb = ed / SIZE_M(1); 64*91f16700Schasinglulu 65*91f16700Schasinglulu /* set ddr region addr start */ 66*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6 + (rgn * 2)), 67*91f16700Schasinglulu BITS_WITH_WMASK(st_mb, SGRF_DDR_RGN_ADDR_WMSK, 0)); 68*91f16700Schasinglulu 69*91f16700Schasinglulu /* set ddr region addr end */ 70*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6 + (rgn * 2) + 1), 71*91f16700Schasinglulu BITS_WITH_WMASK((ed_mb - 1), SGRF_DDR_RGN_ADDR_WMSK, 0)); 72*91f16700Schasinglulu 73*91f16700Schasinglulu /* select region security */ 74*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6 + (rgn * 2)), 75*91f16700Schasinglulu SGRF_DDR_RGN_SECURE_SEL); 76*91f16700Schasinglulu 77*91f16700Schasinglulu /* enable region security */ 78*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6 + (rgn * 2)), 79*91f16700Schasinglulu SGRF_DDR_RGN_SECURE_EN); 80*91f16700Schasinglulu } 81*91f16700Schasinglulu 82*91f16700Schasinglulu void secure_watchdog_gate(void) 83*91f16700Schasinglulu { 84*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(0), SGRF_PCLK_WDT_GATE); 85*91f16700Schasinglulu } 86*91f16700Schasinglulu 87*91f16700Schasinglulu void secure_watchdog_ungate(void) 88*91f16700Schasinglulu { 89*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(0), SGRF_PCLK_WDT_UNGATE); 90*91f16700Schasinglulu } 91*91f16700Schasinglulu 92*91f16700Schasinglulu __pmusramfunc void sram_secure_timer_init(void) 93*91f16700Schasinglulu { 94*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_CONTROL_REG, 0); 95*91f16700Schasinglulu 96*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_LOAD_COUNT0, 0xffffffff); 97*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_LOAD_COUNT1, 0xffffffff); 98*91f16700Schasinglulu 99*91f16700Schasinglulu /* auto reload & enable the timer */ 100*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_CONTROL_REG, TIMER_EN); 101*91f16700Schasinglulu } 102*91f16700Schasinglulu 103*91f16700Schasinglulu void secure_gic_init(void) 104*91f16700Schasinglulu { 105*91f16700Schasinglulu /* (re-)enable non-secure access to the gic*/ 106*91f16700Schasinglulu mmio_write_32(CORE_AXI_BUS_BASE + CORE_AXI_SECURITY0, 107*91f16700Schasinglulu AXI_SECURITY0_GIC); 108*91f16700Schasinglulu } 109*91f16700Schasinglulu 110*91f16700Schasinglulu void secure_timer_init(void) 111*91f16700Schasinglulu { 112*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_CONTROL_REG, 0); 113*91f16700Schasinglulu 114*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_LOAD_COUNT0, 0xffffffff); 115*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_LOAD_COUNT1, 0xffffffff); 116*91f16700Schasinglulu 117*91f16700Schasinglulu /* auto reload & enable the timer */ 118*91f16700Schasinglulu mmio_write_32(STIMER1_BASE + TIMER_CONTROL_REG, TIMER_EN); 119*91f16700Schasinglulu } 120*91f16700Schasinglulu 121*91f16700Schasinglulu void secure_sgrf_init(void) 122*91f16700Schasinglulu { 123*91f16700Schasinglulu /* 124*91f16700Schasinglulu * We use the first sram part to talk to the bootrom, 125*91f16700Schasinglulu * so make it secure. 126*91f16700Schasinglulu */ 127*91f16700Schasinglulu mmio_write_32(TZPC_BASE + TZPC_R0SIZE, TZPC_SRAM_SECURE_4K(1)); 128*91f16700Schasinglulu 129*91f16700Schasinglulu secure_gic_init(); 130*91f16700Schasinglulu 131*91f16700Schasinglulu /* set all master ip to non-secure */ 132*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(2), SGRF_SOC_CON2_MST_NS); 133*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(3), SGRF_SOC_CON3_MST_NS); 134*91f16700Schasinglulu 135*91f16700Schasinglulu /* setting all configurable ip into non-secure */ 136*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(4), 137*91f16700Schasinglulu SGRF_SOC_CON4_SECURE_WMSK /*TODO:|SGRF_STIMER_SECURE*/); 138*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_SOC_CON(5), SGRF_SOC_CON5_SECURE_WMSK); 139*91f16700Schasinglulu 140*91f16700Schasinglulu /* secure dma to non-secure */ 141*91f16700Schasinglulu mmio_write_32(TZPC_BASE + TZPC_DECPROT1SET, 0xff); 142*91f16700Schasinglulu mmio_write_32(TZPC_BASE + TZPC_DECPROT2SET, 0xff); 143*91f16700Schasinglulu mmio_write_32(SGRF_BASE + SGRF_BUSDMAC_CON(1), 0x3800); 144*91f16700Schasinglulu dsb(); 145*91f16700Schasinglulu 146*91f16700Schasinglulu /* rst dma1 */ 147*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(1), 148*91f16700Schasinglulu RST_DMA1_MSK | (RST_DMA1_MSK << 16)); 149*91f16700Schasinglulu /* rst dma2 */ 150*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(4), 151*91f16700Schasinglulu RST_DMA2_MSK | (RST_DMA2_MSK << 16)); 152*91f16700Schasinglulu 153*91f16700Schasinglulu dsb(); 154*91f16700Schasinglulu 155*91f16700Schasinglulu /* release dma1 rst*/ 156*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(1), (RST_DMA1_MSK << 16)); 157*91f16700Schasinglulu /* release dma2 rst*/ 158*91f16700Schasinglulu mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(4), (RST_DMA2_MSK << 16)); 159*91f16700Schasinglulu } 160*91f16700Schasinglulu 161*91f16700Schasinglulu void secure_sgrf_ddr_rgn_init(void) 162*91f16700Schasinglulu { 163*91f16700Schasinglulu sgrf_ddr_rgn_config(0, TZRAM_BASE, TZRAM_SIZE); 164*91f16700Schasinglulu sgrf_ddr_rgn_global_bypass(0); 165*91f16700Schasinglulu } 166