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