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 ****************************************************************************/
populate_tzc400_reg_list(struct tzc400_reg * tzc400_reg_list,int dram_idx,int list_idx,uint64_t dram_start_addr,uint64_t dram_size,uint32_t secure_dram_sz,uint32_t shrd_dram_sz)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
populate_tzc400_reg_list(struct tzc400_reg * tzc400_reg_list,int dram_idx,int list_idx,uint64_t dram_start_addr,uint64_t dram_size,uint32_t secure_dram_sz,uint32_t shrd_dram_sz)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 ******************************************************************************/
mem_access_setup(uintptr_t base,uint32_t total_regions,struct tzc400_reg * tzc400_reg_list)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