1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2014-2023, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu #include <assert.h> 7*91f16700Schasinglulu 8*91f16700Schasinglulu #include <common/debug.h> 9*91f16700Schasinglulu #include <drivers/arm/nic_400.h> 10*91f16700Schasinglulu #include <lib/mmio.h> 11*91f16700Schasinglulu #include <platform_def.h> 12*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h> 13*91f16700Schasinglulu #include <plat/arm/soc/common/soc_css.h> 14*91f16700Schasinglulu #include <plat/common/platform.h> 15*91f16700Schasinglulu 16*91f16700Schasinglulu #include "juno_ethosn_tzmp1_def.h" 17*91f16700Schasinglulu #include "juno_tzmp1_def.h" 18*91f16700Schasinglulu 19*91f16700Schasinglulu #ifdef JUNO_TZMP1 20*91f16700Schasinglulu /* 21*91f16700Schasinglulu * Protect buffer for VPU/GPU/DPU memory usage with hardware protection 22*91f16700Schasinglulu * enabled. Propose 224MB video output, 96 MB video input and 32MB video 23*91f16700Schasinglulu * private. 24*91f16700Schasinglulu * 25*91f16700Schasinglulu * Ind Memory Range Caption S_ATTR NS_ATTR 26*91f16700Schasinglulu * 1 0x080000000 - 0x0E7FFFFFF ARM_NS_DRAM1 NONE RDWR | MEDIA_RW 27*91f16700Schasinglulu * 2 0x0E8000000 - 0x0F5FFFFFF JUNO_MEDIA_TZC_PROT_DRAM1 NONE MEDIA_RW | AP_WR 28*91f16700Schasinglulu * 3 0x0F6000000 - 0x0FBFFFFFF JUNO_VPU_TZC_PROT_DRAM1 RDWR VPU_PROT_RW 29*91f16700Schasinglulu * 4 0x0FC000000 - 0x0FDFFFFFF JUNO_VPU_TZC_PRIV_DRAM1 RDWR VPU_PRIV_RW 30*91f16700Schasinglulu * 5 0x0FE000000 - 0x0FEFFFFFF JUNO_AP_TZC_SHARE_DRAM1 NONE RDWR | MEDIA_RW 31*91f16700Schasinglulu * 6 0x0FF000000 - 0x0FFFFFFFF ARM_AP_TZC_DRAM1 RDWR NONE 32*91f16700Schasinglulu * 7 0x880000000 - 0x9FFFFFFFF ARM_DRAM2 NONE RDWR | MEDIA_RW 33*91f16700Schasinglulu * 34*91f16700Schasinglulu * Memory regions are neighbored to save limited TZC regions. Calculation 35*91f16700Schasinglulu * started from ARM_TZC_SHARE_DRAM1 since it is known and fixed for both 36*91f16700Schasinglulu * protected-enabled and protected-disabled settings. 37*91f16700Schasinglulu * 38*91f16700Schasinglulu * Video private buffer aheads of ARM_TZC_SHARE_DRAM1 39*91f16700Schasinglulu */ 40*91f16700Schasinglulu 41*91f16700Schasinglulu static const arm_tzc_regions_info_t juno_tzmp1_tzc_regions[] = { 42*91f16700Schasinglulu {ARM_AP_TZC_DRAM1_BASE, ARM_AP_TZC_DRAM1_END, TZC_REGION_S_RDWR, 0}, 43*91f16700Schasinglulu {JUNO_NS_DRAM1_PT1_BASE, JUNO_NS_DRAM1_PT1_END, 44*91f16700Schasinglulu TZC_REGION_S_NONE, JUNO_MEDIA_TZC_NS_DEV_ACCESS}, 45*91f16700Schasinglulu {JUNO_MEDIA_TZC_PROT_DRAM1_BASE, JUNO_MEDIA_TZC_PROT_DRAM1_END, 46*91f16700Schasinglulu TZC_REGION_S_NONE, JUNO_MEDIA_TZC_PROT_ACCESS}, 47*91f16700Schasinglulu {JUNO_VPU_TZC_PROT_DRAM1_BASE, JUNO_VPU_TZC_PROT_DRAM1_END, 48*91f16700Schasinglulu TZC_REGION_S_RDWR, JUNO_VPU_TZC_PROT_ACCESS}, 49*91f16700Schasinglulu {JUNO_VPU_TZC_PRIV_DRAM1_BASE, JUNO_VPU_TZC_PRIV_DRAM1_END, 50*91f16700Schasinglulu TZC_REGION_S_RDWR, JUNO_VPU_TZC_PRIV_ACCESS}, 51*91f16700Schasinglulu {JUNO_AP_TZC_SHARE_DRAM1_BASE, JUNO_AP_TZC_SHARE_DRAM1_END, 52*91f16700Schasinglulu TZC_REGION_S_NONE, JUNO_MEDIA_TZC_NS_DEV_ACCESS}, 53*91f16700Schasinglulu {ARM_DRAM2_BASE, ARM_DRAM2_END, 54*91f16700Schasinglulu TZC_REGION_S_NONE, JUNO_MEDIA_TZC_NS_DEV_ACCESS}, 55*91f16700Schasinglulu {}, 56*91f16700Schasinglulu }; 57*91f16700Schasinglulu 58*91f16700Schasinglulu /******************************************************************************* 59*91f16700Schasinglulu * Program dp650 to configure NSAID value for protected mode. 60*91f16700Schasinglulu ******************************************************************************/ 61*91f16700Schasinglulu static void init_dp650(void) 62*91f16700Schasinglulu { 63*91f16700Schasinglulu mmio_write_32(DP650_BASE + DP650_PROT_NSAID_OFFSET, 64*91f16700Schasinglulu DP650_PROT_NSAID_CONFIG); 65*91f16700Schasinglulu } 66*91f16700Schasinglulu 67*91f16700Schasinglulu /******************************************************************************* 68*91f16700Schasinglulu * Program v550 to configure NSAID value for protected mode. 69*91f16700Schasinglulu ******************************************************************************/ 70*91f16700Schasinglulu static void init_v550(void) 71*91f16700Schasinglulu { 72*91f16700Schasinglulu /* 73*91f16700Schasinglulu * bits[31:28] is for PRIVATE, 74*91f16700Schasinglulu * bits[27:24] is for OUTBUF, 75*91f16700Schasinglulu * bits[23:20] is for PROTECTED. 76*91f16700Schasinglulu */ 77*91f16700Schasinglulu mmio_write_32(V550_BASE + V550_PROTCTRL_OFFSET, V550_PROTCTRL_CONFIG); 78*91f16700Schasinglulu } 79*91f16700Schasinglulu 80*91f16700Schasinglulu #endif /* JUNO_TZMP1 */ 81*91f16700Schasinglulu 82*91f16700Schasinglulu #ifdef JUNO_ETHOSN_TZMP1 83*91f16700Schasinglulu 84*91f16700Schasinglulu static const arm_tzc_regions_info_t juno_ethosn_tzmp1_tzc_regions[] = { 85*91f16700Schasinglulu JUNO_ETHOSN_TZMP_REGIONS_DEF, 86*91f16700Schasinglulu {}, 87*91f16700Schasinglulu }; 88*91f16700Schasinglulu 89*91f16700Schasinglulu #endif /* JUNO_ETHOSN_TZMP1 */ 90*91f16700Schasinglulu 91*91f16700Schasinglulu /******************************************************************************* 92*91f16700Schasinglulu * Set up the MMU-401 SSD tables. The power-on configuration has all stream IDs 93*91f16700Schasinglulu * assigned to Non-Secure except some for the DMA-330. Assign those back to the 94*91f16700Schasinglulu * Non-Secure world as well, otherwise EL1 may end up erroneously generating 95*91f16700Schasinglulu * (untranslated) Secure transactions if it turns the SMMU on. 96*91f16700Schasinglulu ******************************************************************************/ 97*91f16700Schasinglulu static void init_mmu401(void) 98*91f16700Schasinglulu { 99*91f16700Schasinglulu uint32_t reg = mmio_read_32(MMU401_DMA330_BASE + MMU401_SSD_OFFSET); 100*91f16700Schasinglulu reg |= 0x1FF; 101*91f16700Schasinglulu mmio_write_32(MMU401_DMA330_BASE + MMU401_SSD_OFFSET, reg); 102*91f16700Schasinglulu } 103*91f16700Schasinglulu 104*91f16700Schasinglulu /******************************************************************************* 105*91f16700Schasinglulu * Program CSS-NIC400 to allow non-secure access to some CSS regions. 106*91f16700Schasinglulu ******************************************************************************/ 107*91f16700Schasinglulu static void css_init_nic400(void) 108*91f16700Schasinglulu { 109*91f16700Schasinglulu /* Note: This is the NIC-400 device on the CSS */ 110*91f16700Schasinglulu mmio_write_32(PLAT_SOC_CSS_NIC400_BASE + 111*91f16700Schasinglulu NIC400_ADDR_CTRL_SECURITY_REG(CSS_NIC400_SLAVE_BOOTSECURE), 112*91f16700Schasinglulu ~0); 113*91f16700Schasinglulu } 114*91f16700Schasinglulu 115*91f16700Schasinglulu /******************************************************************************* 116*91f16700Schasinglulu * Initialize debug configuration. 117*91f16700Schasinglulu ******************************************************************************/ 118*91f16700Schasinglulu static void init_debug_cfg(void) 119*91f16700Schasinglulu { 120*91f16700Schasinglulu #if !DEBUG 121*91f16700Schasinglulu /* Set internal drive selection for SPIDEN. */ 122*91f16700Schasinglulu mmio_write_32(SSC_REG_BASE + SSC_DBGCFG_SET, 123*91f16700Schasinglulu 1U << SPIDEN_SEL_SET_SHIFT); 124*91f16700Schasinglulu 125*91f16700Schasinglulu /* Drive SPIDEN LOW to disable invasive debug of secure state. */ 126*91f16700Schasinglulu mmio_write_32(SSC_REG_BASE + SSC_DBGCFG_CLR, 127*91f16700Schasinglulu 1U << SPIDEN_INT_CLR_SHIFT); 128*91f16700Schasinglulu 129*91f16700Schasinglulu /* Set internal drive selection for SPNIDEN. */ 130*91f16700Schasinglulu mmio_write_32(SSC_REG_BASE + SSC_DBGCFG_SET, 131*91f16700Schasinglulu 1U << SPNIDEN_SEL_SET_SHIFT); 132*91f16700Schasinglulu 133*91f16700Schasinglulu /* Drive SPNIDEN LOW to disable non-invasive debug of secure state. */ 134*91f16700Schasinglulu mmio_write_32(SSC_REG_BASE + SSC_DBGCFG_CLR, 135*91f16700Schasinglulu 1U << SPNIDEN_INT_CLR_SHIFT); 136*91f16700Schasinglulu #endif 137*91f16700Schasinglulu } 138*91f16700Schasinglulu 139*91f16700Schasinglulu /******************************************************************************* 140*91f16700Schasinglulu * Initialize the secure environment. 141*91f16700Schasinglulu ******************************************************************************/ 142*91f16700Schasinglulu void plat_arm_security_setup(void) 143*91f16700Schasinglulu { 144*91f16700Schasinglulu /* Initialize debug configuration */ 145*91f16700Schasinglulu init_debug_cfg(); 146*91f16700Schasinglulu /* Initialize the TrustZone Controller */ 147*91f16700Schasinglulu #ifdef JUNO_TZMP1 148*91f16700Schasinglulu arm_tzc400_setup(PLAT_ARM_TZC_BASE, juno_tzmp1_tzc_regions); 149*91f16700Schasinglulu INFO("TZC protected shared memory base address for TZMP usecase: %p\n", 150*91f16700Schasinglulu (void *)JUNO_AP_TZC_SHARE_DRAM1_BASE); 151*91f16700Schasinglulu INFO("TZC protected shared memory end address for TZMP usecase: %p\n", 152*91f16700Schasinglulu (void *)JUNO_AP_TZC_SHARE_DRAM1_END); 153*91f16700Schasinglulu #elif defined(JUNO_ETHOSN_TZMP1) 154*91f16700Schasinglulu arm_tzc400_setup(PLAT_ARM_TZC_BASE, juno_ethosn_tzmp1_tzc_regions); 155*91f16700Schasinglulu INFO("TZC protected shared memory range for NPU TZMP usecase: %p - %p\n", 156*91f16700Schasinglulu (void *)JUNO_ETHOSN_NS_DRAM2_BASE, 157*91f16700Schasinglulu (void *)JUNO_ETHOSN_NS_DRAM2_END); 158*91f16700Schasinglulu INFO("TZC protected Data memory range for NPU TZMP usecase: %p - %p\n", 159*91f16700Schasinglulu (void *)JUNO_ETHOSN_DATA_TZC_PROT_DRAM2_BASE, 160*91f16700Schasinglulu (void *)JUNO_ETHOSN_DATA_TZC_PROT_DRAM2_END); 161*91f16700Schasinglulu INFO("TZC protected FW memory range for NPU TZMP usecase: %p - %p\n", 162*91f16700Schasinglulu (void *)JUNO_ETHOSN_FW_TZC_PROT_DRAM2_BASE, 163*91f16700Schasinglulu (void *)JUNO_ETHOSN_FW_TZC_PROT_DRAM2_END); 164*91f16700Schasinglulu #else 165*91f16700Schasinglulu arm_tzc400_setup(PLAT_ARM_TZC_BASE, NULL); 166*91f16700Schasinglulu #endif 167*91f16700Schasinglulu /* Do ARM CSS internal NIC setup */ 168*91f16700Schasinglulu css_init_nic400(); 169*91f16700Schasinglulu /* Do ARM CSS SoC security setup */ 170*91f16700Schasinglulu soc_css_security_setup(); 171*91f16700Schasinglulu /* Initialize the SMMU SSD tables */ 172*91f16700Schasinglulu init_mmu401(); 173*91f16700Schasinglulu #ifdef JUNO_TZMP1 174*91f16700Schasinglulu init_dp650(); 175*91f16700Schasinglulu init_v550(); 176*91f16700Schasinglulu #endif 177*91f16700Schasinglulu } 178*91f16700Schasinglulu 179*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT 180*91f16700Schasinglulu int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 181*91f16700Schasinglulu { 182*91f16700Schasinglulu assert(heap_addr != NULL); 183*91f16700Schasinglulu assert(heap_size != NULL); 184*91f16700Schasinglulu 185*91f16700Schasinglulu return arm_get_mbedtls_heap(heap_addr, heap_size); 186*91f16700Schasinglulu } 187*91f16700Schasinglulu #endif 188