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