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