1*de0b1012SPankaj Gupta /* 2*de0b1012SPankaj Gupta * Copyright 2021 NXP 3*de0b1012SPankaj Gupta * 4*de0b1012SPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause 5*de0b1012SPankaj Gupta * 6*de0b1012SPankaj Gupta */ 7*de0b1012SPankaj Gupta 8*de0b1012SPankaj Gupta #include <common/debug.h> 9*de0b1012SPankaj Gupta 10*de0b1012SPankaj Gupta #include <plat_tzc400.h> 11*de0b1012SPankaj Gupta 12*de0b1012SPankaj Gupta #pragma weak populate_tzc400_reg_list 13*de0b1012SPankaj Gupta 14*de0b1012SPankaj Gupta #ifdef DEFAULT_TZASC_CONFIG 15*de0b1012SPankaj Gupta /* 16*de0b1012SPankaj Gupta * Typical Memory map of DRAM0 17*de0b1012SPankaj Gupta * |-----------NXP_NS_DRAM_ADDR ( = NXP_DRAM0_ADDR)----------| 18*de0b1012SPankaj Gupta * | | 19*de0b1012SPankaj Gupta * | | 20*de0b1012SPankaj Gupta * | Non-SECURE REGION | 21*de0b1012SPankaj Gupta * | | 22*de0b1012SPankaj Gupta * | | 23*de0b1012SPankaj Gupta * | | 24*de0b1012SPankaj Gupta * |------- (NXP_NS_DRAM_ADDR + NXP_NS_DRAM_SIZE - 1) -------| 25*de0b1012SPankaj Gupta * |-----------------NXP_SECURE_DRAM_ADDR--------------------| 26*de0b1012SPankaj Gupta * | | 27*de0b1012SPankaj Gupta * | | 28*de0b1012SPankaj Gupta * | | 29*de0b1012SPankaj Gupta * | SECURE REGION (= 64MB) | 30*de0b1012SPankaj Gupta * | | 31*de0b1012SPankaj Gupta * | | 32*de0b1012SPankaj Gupta * | | 33*de0b1012SPankaj Gupta * |--- (NXP_SECURE_DRAM_ADDR + NXP_SECURE_DRAM_SIZE - 1)----| 34*de0b1012SPankaj Gupta * |-----------------NXP_SP_SHRD_DRAM_ADDR-------------------| 35*de0b1012SPankaj Gupta * | | 36*de0b1012SPankaj Gupta * | Secure EL1 Payload SHARED REGION (= 2MB) | 37*de0b1012SPankaj Gupta * | | 38*de0b1012SPankaj Gupta * |-----------(NXP_DRAM0_ADDR + NXP_DRAM0_SIZE - 1)---------| 39*de0b1012SPankaj Gupta * 40*de0b1012SPankaj Gupta * 41*de0b1012SPankaj Gupta * 42*de0b1012SPankaj Gupta * Typical Memory map of DRAM1 43*de0b1012SPankaj Gupta * |---------------------NXP_DRAM1_ADDR----------------------| 44*de0b1012SPankaj Gupta * | | 45*de0b1012SPankaj Gupta * | | 46*de0b1012SPankaj Gupta * | Non-SECURE REGION | 47*de0b1012SPankaj Gupta * | | 48*de0b1012SPankaj Gupta * | | 49*de0b1012SPankaj Gupta * |---(NXP_DRAM1_ADDR + Dynamically calculated Size - 1) ---| 50*de0b1012SPankaj Gupta * 51*de0b1012SPankaj Gupta * 52*de0b1012SPankaj Gupta * Typical Memory map of DRAM2 53*de0b1012SPankaj Gupta * |---------------------NXP_DRAM2_ADDR----------------------| 54*de0b1012SPankaj Gupta * | | 55*de0b1012SPankaj Gupta * | | 56*de0b1012SPankaj Gupta * | Non-SECURE REGION | 57*de0b1012SPankaj Gupta * | | 58*de0b1012SPankaj Gupta * | | 59*de0b1012SPankaj Gupta * |---(NXP_DRAM2_ADDR + Dynamically calculated Size - 1) ---| 60*de0b1012SPankaj Gupta */ 61*de0b1012SPankaj Gupta 62*de0b1012SPankaj Gupta /***************************************************************************** 63*de0b1012SPankaj Gupta * This function sets up access permissions on memory regions 64*de0b1012SPankaj Gupta * 65*de0b1012SPankaj Gupta * Input: 66*de0b1012SPankaj Gupta * tzc400_reg_list : TZC400 Region List 67*de0b1012SPankaj Gupta * dram_idx : DRAM index 68*de0b1012SPankaj Gupta * list_idx : TZC400 Region List Index 69*de0b1012SPankaj Gupta * dram_start_addr : Start address of DRAM at dram_idx. 70*de0b1012SPankaj Gupta * dram_size : Size of DRAM at dram_idx. 71*de0b1012SPankaj Gupta * secure_dram_sz : Secure DRAM Size 72*de0b1012SPankaj Gupta * shrd_dram_sz : Shared DRAM Size 73*de0b1012SPankaj Gupta * 74*de0b1012SPankaj Gupta * Out: 75*de0b1012SPankaj Gupta * list_idx : last populated index + 1 76*de0b1012SPankaj Gupta * 77*de0b1012SPankaj Gupta ****************************************************************************/ 78*de0b1012SPankaj Gupta int populate_tzc400_reg_list(struct tzc400_reg *tzc400_reg_list, 79*de0b1012SPankaj Gupta int dram_idx, int list_idx, 80*de0b1012SPankaj Gupta uint64_t dram_start_addr, 81*de0b1012SPankaj Gupta uint64_t dram_size, 82*de0b1012SPankaj Gupta uint32_t secure_dram_sz, 83*de0b1012SPankaj Gupta uint32_t shrd_dram_sz) 84*de0b1012SPankaj Gupta { 85*de0b1012SPankaj Gupta if (list_idx == 0) { 86*de0b1012SPankaj Gupta /* No need to configure TZC Region 0 in this list. 87*de0b1012SPankaj Gupta */ 88*de0b1012SPankaj Gupta list_idx++; 89*de0b1012SPankaj Gupta } 90*de0b1012SPankaj Gupta /* Continue with list entries for index > 0 */ 91*de0b1012SPankaj Gupta if (dram_idx == 0) { 92*de0b1012SPankaj Gupta /* TZC Region 1 on DRAM0 for Secure Memory*/ 93*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].reg_filter_en = 1; 94*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].start_addr = dram_start_addr + dram_size; 95*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].end_addr = dram_start_addr + dram_size 96*de0b1012SPankaj Gupta + secure_dram_sz - 1; 97*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].sec_attr = TZC_REGION_S_RDWR; 98*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].nsaid_permissions = TZC_REGION_NS_NONE; 99*de0b1012SPankaj Gupta list_idx++; 100*de0b1012SPankaj Gupta 101*de0b1012SPankaj Gupta /* TZC Region 2 on DRAM0 for Shared Memory*/ 102*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].reg_filter_en = 1; 103*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].start_addr = dram_start_addr + dram_size 104*de0b1012SPankaj Gupta + secure_dram_sz; 105*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].end_addr = dram_start_addr + dram_size 106*de0b1012SPankaj Gupta + secure_dram_sz 107*de0b1012SPankaj Gupta + shrd_dram_sz 108*de0b1012SPankaj Gupta - 1; 109*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].sec_attr = TZC_REGION_S_RDWR; 110*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].nsaid_permissions = TZC_NS_ACCESS_ID; 111*de0b1012SPankaj Gupta list_idx++; 112*de0b1012SPankaj Gupta 113*de0b1012SPankaj Gupta /* TZC Region 3 on DRAM0 for Non-Secure Memory*/ 114*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].reg_filter_en = 1; 115*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].start_addr = dram_start_addr; 116*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].end_addr = dram_start_addr + dram_size 117*de0b1012SPankaj Gupta - 1; 118*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].sec_attr = TZC_REGION_S_RDWR; 119*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].nsaid_permissions = TZC_NS_ACCESS_ID; 120*de0b1012SPankaj Gupta list_idx++; 121*de0b1012SPankaj Gupta } else { 122*de0b1012SPankaj Gupta /* TZC Region 3+i on DRAM(> 0) for Non-Secure Memory*/ 123*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].reg_filter_en = 1; 124*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].start_addr = dram_start_addr; 125*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].end_addr = dram_start_addr + dram_size 126*de0b1012SPankaj Gupta - 1; 127*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].sec_attr = TZC_REGION_S_RDWR; 128*de0b1012SPankaj Gupta tzc400_reg_list[list_idx].nsaid_permissions = TZC_NS_ACCESS_ID; 129*de0b1012SPankaj Gupta list_idx++; 130*de0b1012SPankaj Gupta } 131*de0b1012SPankaj Gupta 132*de0b1012SPankaj Gupta return list_idx; 133*de0b1012SPankaj Gupta } 134*de0b1012SPankaj Gupta #else 135*de0b1012SPankaj Gupta int populate_tzc400_reg_list(struct tzc400_reg *tzc400_reg_list, 136*de0b1012SPankaj Gupta int dram_idx, int list_idx, 137*de0b1012SPankaj Gupta uint64_t dram_start_addr, 138*de0b1012SPankaj Gupta uint64_t dram_size, 139*de0b1012SPankaj Gupta uint32_t secure_dram_sz, 140*de0b1012SPankaj Gupta uint32_t shrd_dram_sz) 141*de0b1012SPankaj Gupta { 142*de0b1012SPankaj Gupta ERROR("tzc400_reg_list used is not a default list\n"); 143*de0b1012SPankaj Gupta ERROR("%s needs to be over-written.\n", __func__); 144*de0b1012SPankaj Gupta return 0; 145*de0b1012SPankaj Gupta } 146*de0b1012SPankaj Gupta #endif /* DEFAULT_TZASC_CONFIG */ 147*de0b1012SPankaj Gupta 148*de0b1012SPankaj Gupta /******************************************************************************* 149*de0b1012SPankaj Gupta * Configure memory access permissions 150*de0b1012SPankaj Gupta * - Region 0 with no access; 151*de0b1012SPankaj Gupta * - Region 1 to 4 as per the tzc400_reg_list populated by 152*de0b1012SPankaj Gupta * function populate_tzc400_reg_list() with default for all the SoC. 153*de0b1012SPankaj Gupta ******************************************************************************/ 154*de0b1012SPankaj Gupta void mem_access_setup(uintptr_t base, uint32_t total_regions, 155*de0b1012SPankaj Gupta struct tzc400_reg *tzc400_reg_list) 156*de0b1012SPankaj Gupta { 157*de0b1012SPankaj Gupta uint32_t list_indx = 0U; 158*de0b1012SPankaj Gupta 159*de0b1012SPankaj Gupta INFO("Configuring TrustZone Controller\n"); 160*de0b1012SPankaj Gupta 161*de0b1012SPankaj Gupta tzc400_init(base); 162*de0b1012SPankaj Gupta 163*de0b1012SPankaj Gupta /* Disable filters. */ 164*de0b1012SPankaj Gupta tzc400_disable_filters(); 165*de0b1012SPankaj Gupta 166*de0b1012SPankaj Gupta /* Region 0 set to no access by default */ 167*de0b1012SPankaj Gupta tzc400_configure_region0(TZC_REGION_S_NONE, 0U); 168*de0b1012SPankaj Gupta 169*de0b1012SPankaj Gupta for (list_indx = 1U; list_indx < total_regions; list_indx++) { 170*de0b1012SPankaj Gupta tzc400_configure_region( 171*de0b1012SPankaj Gupta tzc400_reg_list[list_indx].reg_filter_en, 172*de0b1012SPankaj Gupta list_indx, 173*de0b1012SPankaj Gupta tzc400_reg_list[list_indx].start_addr, 174*de0b1012SPankaj Gupta tzc400_reg_list[list_indx].end_addr, 175*de0b1012SPankaj Gupta tzc400_reg_list[list_indx].sec_attr, 176*de0b1012SPankaj Gupta tzc400_reg_list[list_indx].nsaid_permissions); 177*de0b1012SPankaj Gupta } 178*de0b1012SPankaj Gupta 179*de0b1012SPankaj Gupta /* 180*de0b1012SPankaj Gupta * Raise an exception if a NS device tries to access secure memory 181*de0b1012SPankaj Gupta * TODO: Add interrupt handling support. 182*de0b1012SPankaj Gupta */ 183*de0b1012SPankaj Gupta tzc400_set_action(TZC_ACTION_ERR); 184*de0b1012SPankaj Gupta 185*de0b1012SPankaj Gupta /* Enable filters. */ 186*de0b1012SPankaj Gupta tzc400_enable_filters(); 187*de0b1012SPankaj Gupta } 188