xref: /rk3399_ARM-atf/plat/mediatek/drivers/apusys/devapc/apusys_dapc_v1.h (revision 06f3c7058c42a9f1a9f7df75ea2de71a000855e8)
1 /*
2  * Copyright (c) 2023-2024, MediaTek Inc. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef APUSYS_DAPC_V1_H
8 #define APUSYS_DAPC_V1_H
9 
10 #include <lib/mmio.h>
11 
12 /******************************************************************************
13  * STRUCTURE DEFINITION
14  ******************************************************************************/
15 enum apusys_apc_err_status {
16 	APUSYS_APC_OK				= 0x0,
17 	APUSYS_APC_ERR_GENERIC			= 0x1000,
18 	APUSYS_APC_ERR_INVALID_CMD		= 0x1001,
19 	APUSYS_APC_ERR_SLAVE_TYPE_NOT_SUPPORTED	= 0x1002,
20 	APUSYS_APC_ERR_SLAVE_IDX_NOT_SUPPORTED	= 0x1003,
21 	APUSYS_APC_ERR_DOMAIN_NOT_SUPPORTED	= 0x1004,
22 	APUSYS_APC_ERR_PERMISSION_NOT_SUPPORTED	= 0x1005,
23 	APUSYS_APC_ERR_OUT_OF_BOUNDARY		= 0x1006,
24 	APUSYS_APC_ERR_REQ_TYPE_NOT_SUPPORTED	= 0x1007,
25 };
26 
27 enum apusys_apc_perm_type {
28 	NO_PROTECTION	= 0,
29 	SEC_RW_ONLY	= 1,
30 	SEC_RW_NS_R	= 2,
31 	FORBIDDEN	= 3,
32 	PERM_NUM	= 4,
33 };
34 
35 enum apusys_apc_domain_id {
36 	DOMAIN_0	=  0,
37 	DOMAIN_1	=  1,
38 	DOMAIN_2	=  2,
39 	DOMAIN_3	=  3,
40 	DOMAIN_4	=  4,
41 	DOMAIN_5	=  5,
42 	DOMAIN_6	=  6,
43 	DOMAIN_7	=  7,
44 	DOMAIN_8	=  8,
45 	DOMAIN_9	=  9,
46 	DOMAIN_10	= 10,
47 	DOMAIN_11	= 11,
48 	DOMAIN_12	= 12,
49 	DOMAIN_13	= 13,
50 	DOMAIN_14	= 14,
51 	DOMAIN_15	= 15,
52 };
53 
54 struct apc_dom_16 {
55 	unsigned char d0_permission;
56 	unsigned char d1_permission;
57 	unsigned char d2_permission;
58 	unsigned char d3_permission;
59 	unsigned char d4_permission;
60 	unsigned char d5_permission;
61 	unsigned char d6_permission;
62 	unsigned char d7_permission;
63 	unsigned char d8_permission;
64 	unsigned char d9_permission;
65 	unsigned char d10_permission;
66 	unsigned char d11_permission;
67 	unsigned char d12_permission;
68 	unsigned char d13_permission;
69 	unsigned char d14_permission;
70 	unsigned char d15_permission;
71 };
72 
73 #define APUSYS_APC_AO_ATTR(DEV_NAME,					       \
74 			   PERM_ATTR0,  PERM_ATTR1,  PERM_ATTR2,  PERM_ATTR3,  \
75 			   PERM_ATTR4,  PERM_ATTR5,  PERM_ATTR6,  PERM_ATTR7,  \
76 			   PERM_ATTR8,  PERM_ATTR9,  PERM_ATTR10, PERM_ATTR11, \
77 			   PERM_ATTR12, PERM_ATTR13, PERM_ATTR14, PERM_ATTR15) \
78 	{(unsigned char)PERM_ATTR0,  (unsigned char)PERM_ATTR1,  \
79 	 (unsigned char)PERM_ATTR2,  (unsigned char)PERM_ATTR3,  \
80 	 (unsigned char)PERM_ATTR4,  (unsigned char)PERM_ATTR5,  \
81 	 (unsigned char)PERM_ATTR6,  (unsigned char)PERM_ATTR7,  \
82 	 (unsigned char)PERM_ATTR8,  (unsigned char)PERM_ATTR9,  \
83 	 (unsigned char)PERM_ATTR10, (unsigned char)PERM_ATTR11, \
84 	 (unsigned char)PERM_ATTR12, (unsigned char)PERM_ATTR13, \
85 	 (unsigned char)PERM_ATTR14, (unsigned char)PERM_ATTR15}
86 
87 typedef enum apusys_apc_err_status (*dapc_cfg_func)(uint32_t slave,
88 						    enum apusys_apc_domain_id domain_id,
89 						    enum apusys_apc_perm_type perm);
90 
91 /* Register */
92 #define DEVAPC_DOM_SIZE			(0x40)
93 #define DEVAPC_REG_SIZE			(4)
94 
95 /* APUSYS APC offsets */
96 #define APUSYS_DAPC_CON_VIO_MASK	(0x80000000)
97 #define APUSYS_DAPC_CON(base)		((base) + 0x00f00)
98 
99 /******************************************************************************
100  * DAPC Common Function
101  ******************************************************************************/
102 #define SET_APUSYS_DAPC_V1(dapc, cfg) \
103 	set_apusys_dapc_v1(dapc, ARRAY_SIZE(dapc), cfg)
104 
105 #define DUMP_APUSYS_DAPC_V1(apc) \
106 	dump_apusys_dapc_v1(#apc, apc##_BASE, \
107 			    (apc##_SLAVE_NUM / apc##_SLAVE_NUM_IN_1_DOM), apc##_DOM_NUM)
108 
109 enum apusys_apc_err_status set_apusys_dapc_v1(const struct apc_dom_16 *dapc,
110 					      uint32_t size, dapc_cfg_func cfg);
111 
112 void dump_apusys_dapc_v1(const char *name, uintptr_t base, uint32_t reg_num, uint32_t dom_num);
113 
114 /******************************************************************************
115  * DAPC Permission Policy
116  ******************************************************************************/
117 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW(domain)				 \
118 	APUSYS_APC_AO_ATTR(domain,					 \
119 			   SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
120 			   FORBIDDEN,   FORBIDDEN, FORBIDDEN, FORBIDDEN, \
121 			   FORBIDDEN,   FORBIDDEN, FORBIDDEN, FORBIDDEN, \
122 			   FORBIDDEN,   FORBIDDEN, FORBIDDEN, FORBIDDEN)
123 
124 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_D5_NO_PROTECT(domain)		     \
125 	APUSYS_APC_AO_ATTR(domain,					     \
126 			   SEC_RW_ONLY, FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
127 			   FORBIDDEN,   NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
128 			   FORBIDDEN,   FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
129 			   FORBIDDEN,   FORBIDDEN,     FORBIDDEN, FORBIDDEN)
130 
131 #define SLAVE_FORBID_EXCEPT_D5_NO_PROTECT(domain)			   \
132 	APUSYS_APC_AO_ATTR(domain,					   \
133 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
134 			   FORBIDDEN, NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
135 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
136 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN)
137 
138 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_NS_R_D5_NO_PROTECT(domain)	     \
139 	APUSYS_APC_AO_ATTR(domain,					     \
140 			   SEC_RW_NS_R, FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
141 			   FORBIDDEN,   NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
142 			   FORBIDDEN,   FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
143 			   FORBIDDEN,   FORBIDDEN,     FORBIDDEN, FORBIDDEN)
144 
145 #define SLAVE_FORBID_EXCEPT_D7_NO_PROTECT(domain)			   \
146 	APUSYS_APC_AO_ATTR(domain,					   \
147 			   FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN,     \
148 			   FORBIDDEN, FORBIDDEN, FORBIDDEN, NO_PROTECTION, \
149 			   FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN,     \
150 			   FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
151 
152 #define SLAVE_FORBID_EXCEPT_D5_D7_NO_PROTECT(domain)			       \
153 	APUSYS_APC_AO_ATTR(domain,					       \
154 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN,     \
155 			   FORBIDDEN, NO_PROTECTION, FORBIDDEN, NO_PROTECTION, \
156 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN,     \
157 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN)
158 
159 #define SLAVE_FORBID_EXCEPT_D0_D5_NO_PROTECT(domain)			       \
160 	APUSYS_APC_AO_ATTR(domain,					       \
161 			   NO_PROTECTION, FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
162 			   FORBIDDEN,     NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
163 			   FORBIDDEN,     FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
164 			   FORBIDDEN,     FORBIDDEN,     FORBIDDEN, FORBIDDEN)
165 
166 #define SLAVE_FORBID_EXCEPT_D0_D11_NO_PROTECT_D3_D5_D8_SEC_RW(domain) \
167 	APUSYS_APC_AO_ATTR(domain, \
168 			   NO_PROTECTION, FORBIDDEN,   FORBIDDEN, SEC_RW_ONLY, \
169 			   FORBIDDEN,     SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
170 			   SEC_RW_ONLY,   FORBIDDEN,   FORBIDDEN, NO_PROTECTION, \
171 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, FORBIDDEN)
172 
173 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_NS_R_D3_D5_SEC_RW(domain) \
174 	APUSYS_APC_AO_ATTR(domain, \
175 			   SEC_RW_NS_R, FORBIDDEN,   FORBIDDEN, SEC_RW_ONLY, \
176 			   FORBIDDEN,   SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
177 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
178 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN)
179 
180 #define SLAVE_FORBID_EXCEPT_D5_SEC_RW(domain) \
181 	APUSYS_APC_AO_ATTR(domain, \
182 			   FORBIDDEN, FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
183 			   FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
184 			   FORBIDDEN, FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
185 			   FORBIDDEN, FORBIDDEN,   FORBIDDEN, FORBIDDEN)
186 
187 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_NS_R_D5_SEC_RW(domain) \
188 	APUSYS_APC_AO_ATTR(domain, \
189 			   SEC_RW_NS_R, FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
190 			   FORBIDDEN,   SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
191 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
192 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN)
193 
194 #define SLAVE_FORBID_EXCEPT_D0_NO_PROTECT_D3_D5_SEC_RW(domain) \
195 	APUSYS_APC_AO_ATTR(domain, \
196 			   NO_PROTECTION, FORBIDDEN,   FORBIDDEN, SEC_RW_ONLY, \
197 			   FORBIDDEN,     SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
198 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
199 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, FORBIDDEN)
200 
201 #define SLAVE_FORBID_EXCEPT_D3_D5_SEC_RW_D0_D4_D11_NO_PROTECT(domain) \
202 	APUSYS_APC_AO_ATTR(domain, \
203 			   NO_PROTECTION, FORBIDDEN,   FORBIDDEN, SEC_RW_ONLY, \
204 			   NO_PROTECTION, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
205 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, NO_PROTECTION, \
206 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, FORBIDDEN)
207 
208 #define SLAVE_FORBID_EXCEPT_D5_SEC_RW_D0_NO_PROTECT(domain) \
209 	APUSYS_APC_AO_ATTR(domain, \
210 			   NO_PROTECTION, FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
211 			   FORBIDDEN,     SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
212 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
213 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, FORBIDDEN)
214 
215 #define SLAVE_FORBID_EXCEPT_D0_D5_SEC_RW(domain) \
216 	APUSYS_APC_AO_ATTR(domain, \
217 			   SEC_RW_ONLY, FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
218 			   FORBIDDEN,   SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
219 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
220 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN)
221 
222 #define SLAVE_FORBID_EXCEPT_D0_NO_PROTECT_D5_SEC_RW(domain) \
223 	APUSYS_APC_AO_ATTR(domain, \
224 			   NO_PROTECTION, FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
225 			   FORBIDDEN,     SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
226 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
227 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, FORBIDDEN)
228 
229 #define SLAVE_FORBID_EXCEPT_D3_D5_SEC_RW_D0_D11_NO_PROTECT(domain) \
230 	APUSYS_APC_AO_ATTR(domain, \
231 			   NO_PROTECTION, FORBIDDEN,   FORBIDDEN, SEC_RW_ONLY, \
232 			   FORBIDDEN,     SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
233 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, NO_PROTECTION, \
234 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, FORBIDDEN)
235 
236 #define SLAVE_FORBID_EXCEPT_D0_NO_PROTECT_D5_D8_SEC_RW(domain) \
237 	APUSYS_APC_AO_ATTR(domain, \
238 			   NO_PROTECTION, FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
239 			   FORBIDDEN,     SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
240 			   SEC_RW_ONLY,   FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
241 			   FORBIDDEN,     FORBIDDEN,   FORBIDDEN, FORBIDDEN)
242 
243 #define SLAVE_FORBID_EXCEPT_D0_D3_D5_SEC_RW(domain) \
244 	APUSYS_APC_AO_ATTR(domain, \
245 			   SEC_RW_ONLY, FORBIDDEN,   FORBIDDEN, SEC_RW_ONLY, \
246 			   FORBIDDEN,   SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
247 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
248 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN)
249 
250 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_NS_R_D5_D8_SEC_RW(domain) \
251 	APUSYS_APC_AO_ATTR(domain, \
252 			   SEC_RW_NS_R, FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
253 			   FORBIDDEN,   SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
254 			   SEC_RW_ONLY, FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
255 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN)
256 
257 #define SLAVE_FORBID_EXCEPT_D5_D8_SEC_RW(domain) \
258 	APUSYS_APC_AO_ATTR(domain, \
259 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
260 			   FORBIDDEN,   SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \
261 			   SEC_RW_ONLY, FORBIDDEN,   FORBIDDEN, FORBIDDEN, \
262 			   FORBIDDEN,   FORBIDDEN,   FORBIDDEN, FORBIDDEN)
263 
264 #define SLAVE_FORBID_EXCEPT_D0_D5_D7_D14_NO_PROTECT(domain) \
265 	APUSYS_APC_AO_ATTR(domain, \
266 			   NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN, \
267 			   FORBIDDEN,     NO_PROTECTION, FORBIDDEN,     NO_PROTECTION, \
268 			   FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN, \
269 			   FORBIDDEN,     FORBIDDEN,     NO_PROTECTION, FORBIDDEN)
270 
271 #endif /* APUSYS_DAPC_V1_H */
272