1780e3f24SHeiko Stuebner /* 2*7f0b2e78SHeiko Stuebner * Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved. 3780e3f24SHeiko Stuebner * 4780e3f24SHeiko Stuebner * SPDX-License-Identifier: BSD-3-Clause 5780e3f24SHeiko Stuebner */ 6780e3f24SHeiko Stuebner 7780e3f24SHeiko Stuebner #include <assert.h> 8780e3f24SHeiko Stuebner 9780e3f24SHeiko Stuebner #include <arch_helpers.h> 10780e3f24SHeiko Stuebner #include <common/debug.h> 11780e3f24SHeiko Stuebner #include <drivers/delay_timer.h> 12780e3f24SHeiko Stuebner 13780e3f24SHeiko Stuebner #include <plat_private.h> 14780e3f24SHeiko Stuebner #include <secure.h> 15780e3f24SHeiko Stuebner #include <soc.h> 16780e3f24SHeiko Stuebner 17780e3f24SHeiko Stuebner static void sgrf_ddr_rgn_global_bypass(uint32_t bypass) 18780e3f24SHeiko Stuebner { 19780e3f24SHeiko Stuebner if (bypass) 20780e3f24SHeiko Stuebner /* set bypass (non-secure regions) for whole ddr regions */ 21780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(21), 22780e3f24SHeiko Stuebner SGRF_DDR_RGN_BYPS); 23780e3f24SHeiko Stuebner else 24780e3f24SHeiko Stuebner /* cancel bypass for whole ddr regions */ 25780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(21), 26780e3f24SHeiko Stuebner SGRF_DDR_RGN_NO_BYPS); 27780e3f24SHeiko Stuebner } 28780e3f24SHeiko Stuebner 29780e3f24SHeiko Stuebner /** 30780e3f24SHeiko Stuebner * There are 8 + 1 regions for DDR secure control: 31780e3f24SHeiko Stuebner * DDR_RGN_0 ~ DDR_RGN_7: Per DDR_RGNs grain size is 1MB 32780e3f24SHeiko Stuebner * DDR_RGN_X - the memories of exclude DDR_RGN_0 ~ DDR_RGN_7 33780e3f24SHeiko Stuebner * 34780e3f24SHeiko Stuebner * SGRF_SOC_CON6 - start address of RGN_0 + control 35780e3f24SHeiko Stuebner * SGRF_SOC_CON7 - end address of RGN_0 36780e3f24SHeiko Stuebner * ... 37780e3f24SHeiko Stuebner * SGRF_SOC_CON20 - start address of the RGN_7 + control 38780e3f24SHeiko Stuebner * SGRF_SOC_CON21 - end address of the RGN_7 + RGN_X control 39780e3f24SHeiko Stuebner * 40780e3f24SHeiko Stuebner * @rgn - the DDR regions 0 ~ 7 which are can be configured. 41*7f0b2e78SHeiko Stuebner * @st - start address to set as secure 42*7f0b2e78SHeiko Stuebner * @sz - length of area to set as secure 43*7f0b2e78SHeiko Stuebner * The @st_mb and @ed_mb indicate the start and end addresses for which to set 44*7f0b2e78SHeiko Stuebner * the security, and the unit is megabyte. When the st_mb == 0, ed_mb == 0, the 45780e3f24SHeiko Stuebner * address range 0x0 ~ 0xfffff is secure. 46780e3f24SHeiko Stuebner * 47780e3f24SHeiko Stuebner * For example, if we would like to set the range [0, 32MB) is security via 48780e3f24SHeiko Stuebner * DDR_RGN0, then rgn == 0, st_mb == 0, ed_mb == 31. 49780e3f24SHeiko Stuebner */ 50*7f0b2e78SHeiko Stuebner static void sgrf_ddr_rgn_config(uint32_t rgn, uintptr_t st, size_t sz) 51780e3f24SHeiko Stuebner { 52*7f0b2e78SHeiko Stuebner uintptr_t ed = st + sz; 53780e3f24SHeiko Stuebner uintptr_t st_mb, ed_mb; 54780e3f24SHeiko Stuebner 55780e3f24SHeiko Stuebner assert(rgn <= 7); 56780e3f24SHeiko Stuebner assert(st < ed); 57780e3f24SHeiko Stuebner 58780e3f24SHeiko Stuebner /* check aligned 1MB */ 59780e3f24SHeiko Stuebner assert(st % SIZE_M(1) == 0); 60780e3f24SHeiko Stuebner assert(ed % SIZE_M(1) == 0); 61780e3f24SHeiko Stuebner 62780e3f24SHeiko Stuebner st_mb = st / SIZE_M(1); 63780e3f24SHeiko Stuebner ed_mb = ed / SIZE_M(1); 64780e3f24SHeiko Stuebner 65780e3f24SHeiko Stuebner /* set ddr region addr start */ 66780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6 + (rgn * 2)), 67780e3f24SHeiko Stuebner BITS_WITH_WMASK(st_mb, SGRF_DDR_RGN_ADDR_WMSK, 0)); 68780e3f24SHeiko Stuebner 69780e3f24SHeiko Stuebner /* set ddr region addr end */ 70780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6 + (rgn * 2) + 1), 71780e3f24SHeiko Stuebner BITS_WITH_WMASK((ed_mb - 1), SGRF_DDR_RGN_ADDR_WMSK, 0)); 72780e3f24SHeiko Stuebner 73780e3f24SHeiko Stuebner /* select region security */ 74780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6 + (rgn * 2)), 75780e3f24SHeiko Stuebner SGRF_DDR_RGN_SECURE_SEL); 76780e3f24SHeiko Stuebner 77780e3f24SHeiko Stuebner /* enable region security */ 78780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(6 + (rgn * 2)), 79780e3f24SHeiko Stuebner SGRF_DDR_RGN_SECURE_EN); 80780e3f24SHeiko Stuebner } 81780e3f24SHeiko Stuebner 82780e3f24SHeiko Stuebner void secure_watchdog_gate(void) 83780e3f24SHeiko Stuebner { 84780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(0), SGRF_PCLK_WDT_GATE); 85780e3f24SHeiko Stuebner } 86780e3f24SHeiko Stuebner 87780e3f24SHeiko Stuebner void secure_watchdog_ungate(void) 88780e3f24SHeiko Stuebner { 89780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(0), SGRF_PCLK_WDT_UNGATE); 90780e3f24SHeiko Stuebner } 91780e3f24SHeiko Stuebner 92780e3f24SHeiko Stuebner __pmusramfunc void sram_secure_timer_init(void) 93780e3f24SHeiko Stuebner { 94780e3f24SHeiko Stuebner mmio_write_32(STIMER1_BASE + TIMER_CONTROL_REG, 0); 95780e3f24SHeiko Stuebner 96780e3f24SHeiko Stuebner mmio_write_32(STIMER1_BASE + TIMER_LOAD_COUNT0, 0xffffffff); 97780e3f24SHeiko Stuebner mmio_write_32(STIMER1_BASE + TIMER_LOAD_COUNT1, 0xffffffff); 98780e3f24SHeiko Stuebner 99780e3f24SHeiko Stuebner /* auto reload & enable the timer */ 100780e3f24SHeiko Stuebner mmio_write_32(STIMER1_BASE + TIMER_CONTROL_REG, TIMER_EN); 101780e3f24SHeiko Stuebner } 102780e3f24SHeiko Stuebner 103780e3f24SHeiko Stuebner void secure_gic_init(void) 104780e3f24SHeiko Stuebner { 105780e3f24SHeiko Stuebner /* (re-)enable non-secure access to the gic*/ 106780e3f24SHeiko Stuebner mmio_write_32(CORE_AXI_BUS_BASE + CORE_AXI_SECURITY0, 107780e3f24SHeiko Stuebner AXI_SECURITY0_GIC); 108780e3f24SHeiko Stuebner } 109780e3f24SHeiko Stuebner 110780e3f24SHeiko Stuebner void secure_timer_init(void) 111780e3f24SHeiko Stuebner { 112780e3f24SHeiko Stuebner mmio_write_32(STIMER1_BASE + TIMER_CONTROL_REG, 0); 113780e3f24SHeiko Stuebner 114780e3f24SHeiko Stuebner mmio_write_32(STIMER1_BASE + TIMER_LOAD_COUNT0, 0xffffffff); 115780e3f24SHeiko Stuebner mmio_write_32(STIMER1_BASE + TIMER_LOAD_COUNT1, 0xffffffff); 116780e3f24SHeiko Stuebner 117780e3f24SHeiko Stuebner /* auto reload & enable the timer */ 118780e3f24SHeiko Stuebner mmio_write_32(STIMER1_BASE + TIMER_CONTROL_REG, TIMER_EN); 119780e3f24SHeiko Stuebner } 120780e3f24SHeiko Stuebner 121780e3f24SHeiko Stuebner void secure_sgrf_init(void) 122780e3f24SHeiko Stuebner { 123780e3f24SHeiko Stuebner /* 124780e3f24SHeiko Stuebner * We use the first sram part to talk to the bootrom, 125780e3f24SHeiko Stuebner * so make it secure. 126780e3f24SHeiko Stuebner */ 127780e3f24SHeiko Stuebner mmio_write_32(TZPC_BASE + TZPC_R0SIZE, TZPC_SRAM_SECURE_4K(1)); 128780e3f24SHeiko Stuebner 129780e3f24SHeiko Stuebner secure_gic_init(); 130780e3f24SHeiko Stuebner 131780e3f24SHeiko Stuebner /* set all master ip to non-secure */ 132780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(2), SGRF_SOC_CON2_MST_NS); 133780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(3), SGRF_SOC_CON3_MST_NS); 134780e3f24SHeiko Stuebner 135780e3f24SHeiko Stuebner /* setting all configurable ip into non-secure */ 136780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(4), 137780e3f24SHeiko Stuebner SGRF_SOC_CON4_SECURE_WMSK /*TODO:|SGRF_STIMER_SECURE*/); 138780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_SOC_CON(5), SGRF_SOC_CON5_SECURE_WMSK); 139780e3f24SHeiko Stuebner 140780e3f24SHeiko Stuebner /* secure dma to non-secure */ 141780e3f24SHeiko Stuebner mmio_write_32(TZPC_BASE + TZPC_DECPROT1SET, 0xff); 142780e3f24SHeiko Stuebner mmio_write_32(TZPC_BASE + TZPC_DECPROT2SET, 0xff); 143780e3f24SHeiko Stuebner mmio_write_32(SGRF_BASE + SGRF_BUSDMAC_CON(1), 0x3800); 144780e3f24SHeiko Stuebner dsb(); 145780e3f24SHeiko Stuebner 146780e3f24SHeiko Stuebner /* rst dma1 */ 147780e3f24SHeiko Stuebner mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(1), 148780e3f24SHeiko Stuebner RST_DMA1_MSK | (RST_DMA1_MSK << 16)); 149780e3f24SHeiko Stuebner /* rst dma2 */ 150780e3f24SHeiko Stuebner mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(4), 151780e3f24SHeiko Stuebner RST_DMA2_MSK | (RST_DMA2_MSK << 16)); 152780e3f24SHeiko Stuebner 153780e3f24SHeiko Stuebner dsb(); 154780e3f24SHeiko Stuebner 155780e3f24SHeiko Stuebner /* release dma1 rst*/ 156780e3f24SHeiko Stuebner mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(1), (RST_DMA1_MSK << 16)); 157780e3f24SHeiko Stuebner /* release dma2 rst*/ 158780e3f24SHeiko Stuebner mmio_write_32(CRU_BASE + CRU_SOFTRSTS_CON(4), (RST_DMA2_MSK << 16)); 159780e3f24SHeiko Stuebner } 160780e3f24SHeiko Stuebner 161780e3f24SHeiko Stuebner void secure_sgrf_ddr_rgn_init(void) 162780e3f24SHeiko Stuebner { 163780e3f24SHeiko Stuebner sgrf_ddr_rgn_config(0, TZRAM_BASE, TZRAM_SIZE); 164780e3f24SHeiko Stuebner sgrf_ddr_rgn_global_bypass(0); 165780e3f24SHeiko Stuebner } 166