xref: /rk3399_ARM-atf/drivers/nxp/tzc/plat_tzc400.c (revision 9719e19a977df3e8bf7567b3c0e1d6b2ebc5b46f)
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