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