1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright 2018-2021 NXP 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <common/debug.h> 8*91f16700Schasinglulu #include <plat_tzc380.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #pragma weak populate_tzc380_reg_list 11*91f16700Schasinglulu 12*91f16700Schasinglulu #ifdef DEFAULT_TZASC_CONFIG 13*91f16700Schasinglulu /* 14*91f16700Schasinglulu * Typical Memory map of DRAM0 15*91f16700Schasinglulu * |-----------NXP_NS_DRAM_ADDR ( = NXP_DRAM0_ADDR)----------| 16*91f16700Schasinglulu * | | 17*91f16700Schasinglulu * | | 18*91f16700Schasinglulu * | Non-SECURE REGION | 19*91f16700Schasinglulu * | | 20*91f16700Schasinglulu * | | 21*91f16700Schasinglulu * | | 22*91f16700Schasinglulu * |------- (NXP_NS_DRAM_ADDR + NXP_NS_DRAM_SIZE - 1) -------| 23*91f16700Schasinglulu * |-----------------NXP_SECURE_DRAM_ADDR--------------------| 24*91f16700Schasinglulu * | | 25*91f16700Schasinglulu * | | 26*91f16700Schasinglulu * | | 27*91f16700Schasinglulu * | SECURE REGION (= 64MB) | 28*91f16700Schasinglulu * | | 29*91f16700Schasinglulu * | | 30*91f16700Schasinglulu * | | 31*91f16700Schasinglulu * |--- (NXP_SECURE_DRAM_ADDR + NXP_SECURE_DRAM_SIZE - 1)----| 32*91f16700Schasinglulu * |-----------------NXP_SP_SHRD_DRAM_ADDR-------------------| 33*91f16700Schasinglulu * | | 34*91f16700Schasinglulu * | Secure EL1 Payload SHARED REGION (= 2MB) | 35*91f16700Schasinglulu * | | 36*91f16700Schasinglulu * |-----------(NXP_DRAM0_ADDR + NXP_DRAM0_SIZE - 1)---------| 37*91f16700Schasinglulu * 38*91f16700Schasinglulu * 39*91f16700Schasinglulu * 40*91f16700Schasinglulu * Typical Memory map of DRAM1 41*91f16700Schasinglulu * |---------------------NXP_DRAM1_ADDR----------------------| 42*91f16700Schasinglulu * | | 43*91f16700Schasinglulu * | | 44*91f16700Schasinglulu * | Non-SECURE REGION | 45*91f16700Schasinglulu * | | 46*91f16700Schasinglulu * | | 47*91f16700Schasinglulu * |---(NXP_DRAM1_ADDR + Dynamically calculated Size - 1) ---| 48*91f16700Schasinglulu * 49*91f16700Schasinglulu * 50*91f16700Schasinglulu * Typical Memory map of DRAM2 51*91f16700Schasinglulu * |---------------------NXP_DRAM2_ADDR----------------------| 52*91f16700Schasinglulu * | | 53*91f16700Schasinglulu * | | 54*91f16700Schasinglulu * | Non-SECURE REGION | 55*91f16700Schasinglulu * | | 56*91f16700Schasinglulu * | | 57*91f16700Schasinglulu * |---(NXP_DRAM2_ADDR + Dynamically calculated Size - 1) ---| 58*91f16700Schasinglulu */ 59*91f16700Schasinglulu 60*91f16700Schasinglulu /***************************************************************************** 61*91f16700Schasinglulu * This function sets up access permissions on memory regions 62*91f16700Schasinglulu * 63*91f16700Schasinglulu * Input: 64*91f16700Schasinglulu * tzc380_reg_list : TZC380 Region List 65*91f16700Schasinglulu * dram_idx : DRAM index 66*91f16700Schasinglulu * list_idx : TZC380 Region List Index 67*91f16700Schasinglulu * dram_start_addr : Start address of DRAM at dram_idx. 68*91f16700Schasinglulu * dram_size : Size of DRAM at dram_idx. 69*91f16700Schasinglulu * secure_dram_sz : Secure DRAM Size 70*91f16700Schasinglulu * shrd_dram_sz : Shared DRAM Size 71*91f16700Schasinglulu * 72*91f16700Schasinglulu * Out: 73*91f16700Schasinglulu * list_idx : last populated index + 1 74*91f16700Schasinglulu * 75*91f16700Schasinglulu ****************************************************************************/ 76*91f16700Schasinglulu int populate_tzc380_reg_list(struct tzc380_reg *tzc380_reg_list, 77*91f16700Schasinglulu int dram_idx, int list_idx, 78*91f16700Schasinglulu uint64_t dram_start_addr, 79*91f16700Schasinglulu uint64_t dram_size, 80*91f16700Schasinglulu uint32_t secure_dram_sz, 81*91f16700Schasinglulu uint32_t shrd_dram_sz) 82*91f16700Schasinglulu { 83*91f16700Schasinglulu /* Region 0: Default region marked as Non-Secure */ 84*91f16700Schasinglulu if (list_idx == 0) { 85*91f16700Schasinglulu tzc380_reg_list[list_idx].secure = TZC_ATTR_SP_NS_RW; 86*91f16700Schasinglulu tzc380_reg_list[list_idx].enabled = TZC_ATTR_REGION_DISABLE; 87*91f16700Schasinglulu tzc380_reg_list[list_idx].addr = UL(0x0); 88*91f16700Schasinglulu tzc380_reg_list[list_idx].size = 0x0; 89*91f16700Schasinglulu tzc380_reg_list[list_idx].sub_mask = 0x0; /* all enabled */ 90*91f16700Schasinglulu list_idx++; 91*91f16700Schasinglulu } 92*91f16700Schasinglulu /* Continue with list entries for index > 0 */ 93*91f16700Schasinglulu if (dram_idx == 0) { 94*91f16700Schasinglulu /* 95*91f16700Schasinglulu * Region 1: Secure Region on DRAM 1 for 2MB out of 2MB, 96*91f16700Schasinglulu * excluding 0 sub-region(=256KB). 97*91f16700Schasinglulu */ 98*91f16700Schasinglulu tzc380_reg_list[list_idx].secure = TZC_ATTR_SP_S_RW; 99*91f16700Schasinglulu tzc380_reg_list[list_idx].enabled = TZC_ATTR_REGION_ENABLE; 100*91f16700Schasinglulu tzc380_reg_list[list_idx].addr = dram_start_addr + dram_size; 101*91f16700Schasinglulu tzc380_reg_list[list_idx].size = TZC_REGION_SIZE_2M; 102*91f16700Schasinglulu tzc380_reg_list[list_idx].sub_mask = 0x0; /* all enabled */ 103*91f16700Schasinglulu list_idx++; 104*91f16700Schasinglulu 105*91f16700Schasinglulu /* 106*91f16700Schasinglulu * Region 2: Secure Region on DRAM 1 for 54MB out of 64MB, 107*91f16700Schasinglulu * excluding 1 sub-rgion(=8MB) of 8MB. 108*91f16700Schasinglulu */ 109*91f16700Schasinglulu tzc380_reg_list[list_idx].secure = TZC_ATTR_SP_S_RW; 110*91f16700Schasinglulu tzc380_reg_list[list_idx].enabled = TZC_ATTR_REGION_ENABLE; 111*91f16700Schasinglulu tzc380_reg_list[list_idx].addr = dram_start_addr + dram_size + shrd_dram_sz; 112*91f16700Schasinglulu tzc380_reg_list[list_idx].size = TZC_REGION_SIZE_64M; 113*91f16700Schasinglulu tzc380_reg_list[list_idx].sub_mask = 0x80; /* Disable sub-region 7 */ 114*91f16700Schasinglulu list_idx++; 115*91f16700Schasinglulu 116*91f16700Schasinglulu /* 117*91f16700Schasinglulu * Region 3: Secure Region on DRAM 1 for 6MB out of 8MB, 118*91f16700Schasinglulu * excluding 2 sub-rgion(=1MB) of 2MB. 119*91f16700Schasinglulu */ 120*91f16700Schasinglulu tzc380_reg_list[list_idx].secure = TZC_ATTR_SP_S_RW; 121*91f16700Schasinglulu tzc380_reg_list[list_idx].enabled = TZC_ATTR_REGION_ENABLE; 122*91f16700Schasinglulu tzc380_reg_list[list_idx].addr = dram_start_addr + dram_size + secure_dram_sz; 123*91f16700Schasinglulu tzc380_reg_list[list_idx].size = TZC_REGION_SIZE_8M; 124*91f16700Schasinglulu tzc380_reg_list[list_idx].sub_mask = 0xC0; /* Disable sub-region 6 & 7 */ 125*91f16700Schasinglulu list_idx++; 126*91f16700Schasinglulu 127*91f16700Schasinglulu } 128*91f16700Schasinglulu 129*91f16700Schasinglulu return list_idx; 130*91f16700Schasinglulu } 131*91f16700Schasinglulu #else 132*91f16700Schasinglulu int populate_tzc380_reg_list(struct tzc380_reg *tzc380_reg_list, 133*91f16700Schasinglulu int dram_idx, int list_idx, 134*91f16700Schasinglulu uint64_t dram_start_addr, 135*91f16700Schasinglulu uint64_t dram_size, 136*91f16700Schasinglulu uint32_t secure_dram_sz, 137*91f16700Schasinglulu uint32_t shrd_dram_sz) 138*91f16700Schasinglulu { 139*91f16700Schasinglulu ERROR("tzc380_reg_list used is not a default list\n"); 140*91f16700Schasinglulu ERROR("%s needs to be over-written.\n", __func__); 141*91f16700Schasinglulu return 0; 142*91f16700Schasinglulu } 143*91f16700Schasinglulu #endif /* DEFAULT_TZASC_CONFIG */ 144*91f16700Schasinglulu 145*91f16700Schasinglulu 146*91f16700Schasinglulu void mem_access_setup(uintptr_t base, uint32_t total_regions, 147*91f16700Schasinglulu struct tzc380_reg *tzc380_reg_list) 148*91f16700Schasinglulu { 149*91f16700Schasinglulu uint32_t indx = 0; 150*91f16700Schasinglulu unsigned int attr_value; 151*91f16700Schasinglulu 152*91f16700Schasinglulu VERBOSE("Configuring TrustZone Controller tzc380\n"); 153*91f16700Schasinglulu 154*91f16700Schasinglulu tzc380_init(base); 155*91f16700Schasinglulu 156*91f16700Schasinglulu tzc380_set_action(TZC_ACTION_NONE); 157*91f16700Schasinglulu 158*91f16700Schasinglulu for (indx = 0; indx < total_regions; indx++) { 159*91f16700Schasinglulu attr_value = tzc380_reg_list[indx].secure | 160*91f16700Schasinglulu TZC_ATTR_SUBREG_DIS(tzc380_reg_list[indx].sub_mask) | 161*91f16700Schasinglulu TZC_ATTR_REGION_SIZE(tzc380_reg_list[indx].size) | 162*91f16700Schasinglulu tzc380_reg_list[indx].enabled; 163*91f16700Schasinglulu 164*91f16700Schasinglulu tzc380_configure_region(indx, tzc380_reg_list[indx].addr, 165*91f16700Schasinglulu attr_value); 166*91f16700Schasinglulu } 167*91f16700Schasinglulu 168*91f16700Schasinglulu tzc380_set_action(TZC_ACTION_ERR); 169*91f16700Schasinglulu } 170