xref: /rk3399_ARM-atf/drivers/arm/tzc/tzc_common_private.h (revision d3f91e242ae858e459a3cda64cc0abbb69b59ce8)
1239b085cSAntonio Nino Diaz /*
2*ce7ef9d1SLionel Debieve  * Copyright (c) 2016-2021, ARM Limited and Contributors. All rights reserved.
3239b085cSAntonio Nino Diaz  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
5239b085cSAntonio Nino Diaz  */
6239b085cSAntonio Nino Diaz 
7af6491f8SAntonio Nino Diaz #ifndef TZC_COMMON_PRIVATE_H
8af6491f8SAntonio Nino Diaz #define TZC_COMMON_PRIVATE_H
9239b085cSAntonio Nino Diaz 
10239b085cSAntonio Nino Diaz #include <arch.h>
11239b085cSAntonio Nino Diaz #include <arch_helpers.h>
1209d40e0eSAntonio Nino Diaz #include <drivers/arm/tzc_common.h>
1309d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
14239b085cSAntonio Nino Diaz 
15239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_WRITE_ACTION(fn_name, macro_name)		\
16239b085cSAntonio Nino Diaz 	static inline void _tzc##fn_name##_write_action(		\
17239b085cSAntonio Nino Diaz 					uintptr_t base,			\
18af6491f8SAntonio Nino Diaz 					unsigned int action)		\
19239b085cSAntonio Nino Diaz 	{								\
20239b085cSAntonio Nino Diaz 		mmio_write_32(base + TZC_##macro_name##_ACTION_OFF,	\
21239b085cSAntonio Nino Diaz 			action);					\
22239b085cSAntonio Nino Diaz 	}
23239b085cSAntonio Nino Diaz 
24239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_WRITE_REGION_BASE(fn_name, macro_name)	\
25239b085cSAntonio Nino Diaz 	static inline void _tzc##fn_name##_write_region_base(		\
26239b085cSAntonio Nino Diaz 					uintptr_t base,			\
27af6491f8SAntonio Nino Diaz 					unsigned int region_no,		\
28239b085cSAntonio Nino Diaz 					unsigned long long region_base)	\
29239b085cSAntonio Nino Diaz 	{								\
30239b085cSAntonio Nino Diaz 		mmio_write_32(base +					\
31239b085cSAntonio Nino Diaz 			TZC_REGION_OFFSET(				\
32239b085cSAntonio Nino Diaz 				TZC_##macro_name##_REGION_SIZE,		\
33d7b5f408SJimmy Brisson 				(u_register_t)region_no) +		\
34239b085cSAntonio Nino Diaz 			TZC_##macro_name##_REGION_BASE_LOW_0_OFFSET,	\
35239b085cSAntonio Nino Diaz 			(uint32_t)region_base);				\
36239b085cSAntonio Nino Diaz 		mmio_write_32(base +					\
37239b085cSAntonio Nino Diaz 			TZC_REGION_OFFSET(				\
38239b085cSAntonio Nino Diaz 				TZC_##macro_name##_REGION_SIZE,		\
39d7b5f408SJimmy Brisson 				(u_register_t)region_no) +		\
40239b085cSAntonio Nino Diaz 			TZC_##macro_name##_REGION_BASE_HIGH_0_OFFSET,	\
41239b085cSAntonio Nino Diaz 			(uint32_t)(region_base >> 32));			\
42239b085cSAntonio Nino Diaz 	}
43239b085cSAntonio Nino Diaz 
44239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_WRITE_REGION_TOP(fn_name, macro_name)		\
45239b085cSAntonio Nino Diaz 	static inline void _tzc##fn_name##_write_region_top(		\
46239b085cSAntonio Nino Diaz 					uintptr_t base,			\
47af6491f8SAntonio Nino Diaz 					unsigned int region_no,		\
48239b085cSAntonio Nino Diaz 					unsigned long long region_top)	\
49239b085cSAntonio Nino Diaz 	{								\
50239b085cSAntonio Nino Diaz 		mmio_write_32(base +					\
51d7b5f408SJimmy Brisson 			TZC_REGION_OFFSET(				\
52d7b5f408SJimmy Brisson 				TZC_##macro_name##_REGION_SIZE,		\
53d7b5f408SJimmy Brisson 				(u_register_t)region_no) +		\
54239b085cSAntonio Nino Diaz 			TZC_##macro_name##_REGION_TOP_LOW_0_OFFSET,	\
55239b085cSAntonio Nino Diaz 			(uint32_t)region_top);				\
56239b085cSAntonio Nino Diaz 		mmio_write_32(base +					\
57239b085cSAntonio Nino Diaz 			TZC_REGION_OFFSET(				\
58239b085cSAntonio Nino Diaz 				TZC_##macro_name##_REGION_SIZE,		\
59d7b5f408SJimmy Brisson 				(u_register_t)region_no) +		\
60239b085cSAntonio Nino Diaz 			TZC_##macro_name##_REGION_TOP_HIGH_0_OFFSET,	\
61239b085cSAntonio Nino Diaz 			(uint32_t)(region_top >> 32));			\
62239b085cSAntonio Nino Diaz 	}
63239b085cSAntonio Nino Diaz 
64239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_WRITE_REGION_ATTRIBUTES(fn_name, macro_name)	\
65239b085cSAntonio Nino Diaz 	static inline void _tzc##fn_name##_write_region_attributes(	\
66239b085cSAntonio Nino Diaz 						uintptr_t base,		\
67af6491f8SAntonio Nino Diaz 						unsigned int region_no,	\
68239b085cSAntonio Nino Diaz 						unsigned int attr)	\
69239b085cSAntonio Nino Diaz 	{								\
70239b085cSAntonio Nino Diaz 		mmio_write_32(base +					\
71239b085cSAntonio Nino Diaz 			TZC_REGION_OFFSET(				\
72239b085cSAntonio Nino Diaz 				TZC_##macro_name##_REGION_SIZE,		\
73d7b5f408SJimmy Brisson 				(u_register_t)region_no) +		\
74239b085cSAntonio Nino Diaz 			TZC_##macro_name##_REGION_ATTR_0_OFFSET,	\
75239b085cSAntonio Nino Diaz 			attr);						\
76239b085cSAntonio Nino Diaz 	}
77239b085cSAntonio Nino Diaz 
78239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_WRITE_REGION_ID_ACCESS(fn_name, macro_name)	\
79239b085cSAntonio Nino Diaz 	static inline void _tzc##fn_name##_write_region_id_access(	\
80239b085cSAntonio Nino Diaz 						uintptr_t base,		\
81af6491f8SAntonio Nino Diaz 						unsigned int region_no,	\
82239b085cSAntonio Nino Diaz 						unsigned int val)	\
83239b085cSAntonio Nino Diaz 	{								\
84239b085cSAntonio Nino Diaz 		mmio_write_32(base +					\
85239b085cSAntonio Nino Diaz 			TZC_REGION_OFFSET(				\
86239b085cSAntonio Nino Diaz 				TZC_##macro_name##_REGION_SIZE,		\
87d7b5f408SJimmy Brisson 				(u_register_t)region_no) +		\
88239b085cSAntonio Nino Diaz 			TZC_##macro_name##_REGION_ID_ACCESS_0_OFFSET,	\
89239b085cSAntonio Nino Diaz 			val);						\
90239b085cSAntonio Nino Diaz 	}
91239b085cSAntonio Nino Diaz 
92239b085cSAntonio Nino Diaz /*
93*ce7ef9d1SLionel Debieve  * It is used to modify the filters status for a defined region.
94*ce7ef9d1SLionel Debieve  */
95*ce7ef9d1SLionel Debieve #define DEFINE_TZC_COMMON_UPDATE_FILTERS(fn_name, macro_name)		\
96*ce7ef9d1SLionel Debieve 	static inline void _tzc##fn_name##_update_filters(		\
97*ce7ef9d1SLionel Debieve 						uintptr_t base,		\
98*ce7ef9d1SLionel Debieve 						unsigned int region_no,	\
99*ce7ef9d1SLionel Debieve 						unsigned int nbfilters, \
100*ce7ef9d1SLionel Debieve 						unsigned int filters)	\
101*ce7ef9d1SLionel Debieve 	{								\
102*ce7ef9d1SLionel Debieve 		uint32_t filters_mask = GENMASK(nbfilters - 1U, 0);	\
103*ce7ef9d1SLionel Debieve 									\
104*ce7ef9d1SLionel Debieve 		mmio_clrsetbits_32(base +				\
105*ce7ef9d1SLionel Debieve 			TZC_REGION_OFFSET(				\
106*ce7ef9d1SLionel Debieve 				TZC_##macro_name##_REGION_SIZE,		\
107*ce7ef9d1SLionel Debieve 				region_no) +				\
108*ce7ef9d1SLionel Debieve 			TZC_##macro_name##_REGION_ATTR_0_OFFSET,	\
109*ce7ef9d1SLionel Debieve 			filters_mask << TZC_REGION_ATTR_F_EN_SHIFT,	\
110*ce7ef9d1SLionel Debieve 			filters << TZC_REGION_ATTR_F_EN_SHIFT);		\
111*ce7ef9d1SLionel Debieve 	}
112*ce7ef9d1SLionel Debieve 
113*ce7ef9d1SLionel Debieve /*
114239b085cSAntonio Nino Diaz  * It is used to program region 0 ATTRIBUTES and ACCESS register.
115239b085cSAntonio Nino Diaz  */
116239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_CONFIGURE_REGION0(fn_name)			\
1171af540efSRoberto Vargas 	static void _tzc##fn_name##_configure_region0(uintptr_t base,	\
118af6491f8SAntonio Nino Diaz 			   unsigned int sec_attr,			\
119239b085cSAntonio Nino Diaz 			   unsigned int ns_device_access)		\
120239b085cSAntonio Nino Diaz 	{								\
121af6491f8SAntonio Nino Diaz 		assert(base != 0U);					\
122239b085cSAntonio Nino Diaz 		VERBOSE("TrustZone : Configuring region 0 "		\
123af6491f8SAntonio Nino Diaz 			"(TZC Interface Base=0x%lx sec_attr=0x%x,"	\
124af6491f8SAntonio Nino Diaz 			" ns_devs=0x%x)\n", base,			\
125239b085cSAntonio Nino Diaz 			sec_attr, ns_device_access);			\
126239b085cSAntonio Nino Diaz 									\
127239b085cSAntonio Nino Diaz 		/* Set secure attributes on region 0 */			\
128239b085cSAntonio Nino Diaz 		_tzc##fn_name##_write_region_attributes(base, 0,	\
129239b085cSAntonio Nino Diaz 			sec_attr << TZC_REGION_ATTR_SEC_SHIFT);		\
130239b085cSAntonio Nino Diaz 									\
131239b085cSAntonio Nino Diaz 		/***************************************************/	\
132239b085cSAntonio Nino Diaz 		/* Specify which non-secure devices have permission*/	\
133239b085cSAntonio Nino Diaz 		/* to access region 0.				   */	\
134239b085cSAntonio Nino Diaz 		/***************************************************/	\
135239b085cSAntonio Nino Diaz 		_tzc##fn_name##_write_region_id_access(base,		\
136239b085cSAntonio Nino Diaz 						0,			\
137239b085cSAntonio Nino Diaz 						ns_device_access);	\
138239b085cSAntonio Nino Diaz 	}
139239b085cSAntonio Nino Diaz 
140239b085cSAntonio Nino Diaz /*
141239b085cSAntonio Nino Diaz  * It is used to program a region from 1 to 8 in the TrustZone controller.
142239b085cSAntonio Nino Diaz  * NOTE:
143239b085cSAntonio Nino Diaz  * Region 0 is special; it is preferable to use
144239b085cSAntonio Nino Diaz  * ##fn_name##_configure_region0 for this region (see comment for
145239b085cSAntonio Nino Diaz  * that function).
146239b085cSAntonio Nino Diaz  */
147239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_CONFIGURE_REGION(fn_name)			\
1481af540efSRoberto Vargas 	static void _tzc##fn_name##_configure_region(uintptr_t base,	\
149239b085cSAntonio Nino Diaz 				unsigned int filters,			\
150af6491f8SAntonio Nino Diaz 				unsigned int region_no,			\
151239b085cSAntonio Nino Diaz 				unsigned long long region_base,		\
152239b085cSAntonio Nino Diaz 				unsigned long long region_top,		\
153af6491f8SAntonio Nino Diaz 				unsigned int sec_attr,			\
154239b085cSAntonio Nino Diaz 				unsigned int nsaid_permissions)		\
155239b085cSAntonio Nino Diaz 	{								\
156af6491f8SAntonio Nino Diaz 		assert(base != 0U);					\
157239b085cSAntonio Nino Diaz 		VERBOSE("TrustZone : Configuring region "		\
158af6491f8SAntonio Nino Diaz 			"(TZC Interface Base: 0x%lx, region_no = %u)"	\
159af6491f8SAntonio Nino Diaz 			"...\n", base, region_no);			\
160239b085cSAntonio Nino Diaz 		VERBOSE("TrustZone : ... base = %llx, top = %llx,"	\
161239b085cSAntonio Nino Diaz 			"\n", region_base, region_top);			\
162239b085cSAntonio Nino Diaz 		VERBOSE("TrustZone : ... sec_attr = 0x%x,"		\
163239b085cSAntonio Nino Diaz 			" ns_devs = 0x%x)\n",				\
164239b085cSAntonio Nino Diaz 			sec_attr, nsaid_permissions);			\
165239b085cSAntonio Nino Diaz 									\
166239b085cSAntonio Nino Diaz 		/***************************************************/	\
167239b085cSAntonio Nino Diaz 		/* Inputs look ok, start programming registers.    */	\
168239b085cSAntonio Nino Diaz 		/* All the address registers are 32 bits wide and  */	\
169239b085cSAntonio Nino Diaz 		/* have a LOW and HIGH				   */	\
170239b085cSAntonio Nino Diaz 		/* component used to construct an address up to a  */	\
171239b085cSAntonio Nino Diaz 		/* 64bit.					   */	\
172239b085cSAntonio Nino Diaz 		/***************************************************/	\
173239b085cSAntonio Nino Diaz 		_tzc##fn_name##_write_region_base(base,			\
174239b085cSAntonio Nino Diaz 					region_no, region_base);	\
175239b085cSAntonio Nino Diaz 		_tzc##fn_name##_write_region_top(base,			\
176239b085cSAntonio Nino Diaz 					region_no, region_top);		\
177239b085cSAntonio Nino Diaz 									\
178239b085cSAntonio Nino Diaz 		/* Enable filter to the region and set secure attributes */\
179239b085cSAntonio Nino Diaz 		_tzc##fn_name##_write_region_attributes(base,		\
180239b085cSAntonio Nino Diaz 				region_no,				\
181239b085cSAntonio Nino Diaz 				(sec_attr << TZC_REGION_ATTR_SEC_SHIFT) |\
182239b085cSAntonio Nino Diaz 				(filters << TZC_REGION_ATTR_F_EN_SHIFT));\
183239b085cSAntonio Nino Diaz 									\
184239b085cSAntonio Nino Diaz 		/***************************************************/	\
185239b085cSAntonio Nino Diaz 		/* Specify which non-secure devices have permission*/	\
186239b085cSAntonio Nino Diaz 		/* to access this region.			   */	\
187239b085cSAntonio Nino Diaz 		/***************************************************/	\
188239b085cSAntonio Nino Diaz 		_tzc##fn_name##_write_region_id_access(base,		\
189239b085cSAntonio Nino Diaz 						region_no,		\
190239b085cSAntonio Nino Diaz 						nsaid_permissions);	\
191239b085cSAntonio Nino Diaz 	}
192239b085cSAntonio Nino Diaz 
_tzc_read_peripheral_id(uintptr_t base)193239b085cSAntonio Nino Diaz static inline unsigned int _tzc_read_peripheral_id(uintptr_t base)
194239b085cSAntonio Nino Diaz {
195239b085cSAntonio Nino Diaz 	unsigned int id;
196239b085cSAntonio Nino Diaz 
197239b085cSAntonio Nino Diaz 	id = mmio_read_32(base + PID0_OFF);
198239b085cSAntonio Nino Diaz 	/* Masks DESC part in PID1 */
199af6491f8SAntonio Nino Diaz 	id |= ((mmio_read_32(base + PID1_OFF) & 0xFU) << 8U);
200239b085cSAntonio Nino Diaz 
201239b085cSAntonio Nino Diaz 	return id;
202239b085cSAntonio Nino Diaz }
203239b085cSAntonio Nino Diaz 
204af6491f8SAntonio Nino Diaz #endif /* TZC_COMMON_PRIVATE_H */
205