1 /*
2  * Copyright (c) 2021, MediaTek Inc. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <common/debug.h>
8 #include <mtk_apusys_apc.h>
9 #include <mtk_apusys_apc_def.h>
10 #include <mtk_plat_common.h>
11 #include <platform_def.h>
12 
13 static const struct APC_DOM_16 APUSYS_NOC_DAPC_AO[] = {
14 /* 0~3 */
15 APUSYS_APC_AO_ATTR("slv07-0",
16 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
17 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
18 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
19 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION),
20 APUSYS_APC_AO_ATTR("slv07-1",
21 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
22 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
23 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
24 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION),
25 APUSYS_APC_AO_ATTR("slv07-2",
26 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
27 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
28 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
29 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION),
30 APUSYS_APC_AO_ATTR("slv07-3",
31 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
32 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
33 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
34 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION),
35 
36 /* 16~18 */
37 APUSYS_APC_AO_ATTR("slv01-0",
38 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
39 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
40 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
41 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
42 APUSYS_APC_AO_ATTR("slv01-1",
43 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
44 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
45 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
46 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
47 APUSYS_APC_AO_ATTR("slv01-2",
48 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
49 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
50 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
51 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
52 
53 /* 19~21 */
54 APUSYS_APC_AO_ATTR("slv00-0",
55 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
56 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
57 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
58 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
59 APUSYS_APC_AO_ATTR("slv00-1",
60 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
61 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
62 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
63 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
64 APUSYS_APC_AO_ATTR("slv00-2",
65 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
66 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
67 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
68 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
69 
70 /* 22~26 */
71 APUSYS_APC_AO_ATTR("slv02-0",
72 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
73 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
74 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
75 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION),
76 APUSYS_APC_AO_ATTR("slv02-1",
77 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
78 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
79 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
80 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION),
81 APUSYS_APC_AO_ATTR("slv02-2",
82 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
83 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
84 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
85 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION),
86 APUSYS_APC_AO_ATTR("slv02-3",
87 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
88 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
89 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
90 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION),
91 APUSYS_APC_AO_ATTR("slv02-4",
92 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
93 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
94 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION,
95 		NO_PROTECTION, NO_PROTECTION, NO_PROTECTION, NO_PROTECTION),
96 };
97 
set_slave_noc_dapc(uint32_t slave,enum APUSYS_APC_DOMAIN_ID domain_id,enum APUSYS_APC_PERM_TYPE perm)98 static int32_t set_slave_noc_dapc(uint32_t slave,
99 				  enum APUSYS_APC_DOMAIN_ID domain_id,
100 				  enum APUSYS_APC_PERM_TYPE perm)
101 {
102 	uint32_t apc_register_index;
103 	uint32_t apc_set_index;
104 	uintptr_t base;
105 	uint32_t clr_bit;
106 	uint32_t set_bit;
107 	int32_t ret;
108 
109 	if (perm >= PERM_NUM) {
110 		ERROR("[NOC_DAPC] perm type:0x%x is not supported!\n", perm);
111 		ret = APUSYS_APC_ERR_PERMISSION_NOT_SUPPORTED;
112 		goto exit;
113 	}
114 
115 	apc_register_index = slave / APUSYS_NOC_DAPC_AO_SLAVE_NUM_IN_1_DOM;
116 	apc_set_index = slave % APUSYS_NOC_DAPC_AO_SLAVE_NUM_IN_1_DOM;
117 
118 	clr_bit = 0xFFFFFFFF ^ (0x3U << (apc_set_index * 2));
119 	set_bit = perm << (apc_set_index * 2);
120 
121 	if ((slave < APUSYS_NOC_DAPC_AO_SLAVE_NUM) &&
122 	    (domain_id < APUSYS_NOC_DAPC_AO_DOM_NUM)) {
123 		base = APUSYS_NOC_DAPC_AO_BASE +
124 		       (domain_id * 0x40) + (apc_register_index * 4);
125 		apuapc_writel(apuapc_readl(base) & clr_bit, base);
126 		apuapc_writel(apuapc_readl(base) | set_bit, base);
127 		ret = APUSYS_APC_OK;
128 	} else {
129 		ERROR("[NOC_DAPC] %s: %s, %s:0x%x, %s:0x%x\n",
130 		      __func__, "out of boundary",
131 		      "slave", slave,
132 		      "domain_id", domain_id);
133 		ret = APUSYS_APC_ERR_OUT_OF_BOUNDARY;
134 	}
135 
136 exit:
137 	return ret;
138 }
139 
dump_apusys_noc_dapc(void)140 static void dump_apusys_noc_dapc(void)
141 {
142 	uint32_t reg_num;
143 	uint32_t d, i;
144 
145 	reg_num = APUSYS_NOC_DAPC_AO_SLAVE_NUM /
146 		  APUSYS_NOC_DAPC_AO_SLAVE_NUM_IN_1_DOM;
147 	for (d = 0U; d < APUSYS_NOC_DAPC_AO_DOM_NUM; d++) {
148 		for (i = 0U; i <= reg_num; i++) {
149 			INFO("[NOCDAPC] D%d_APC_%d: 0x%x\n", d, i,
150 			     apuapc_readl(APUSYS_NOC_DAPC_AO_BASE +
151 			     (d * 0x40) + (i * 4)));
152 		}
153 	}
154 
155 	INFO("[NOCDAPC] APC_CON: 0x%x\n", apuapc_readl(APUSYS_NOC_DAPC_CON));
156 }
157 
158 static const struct APC_DOM_16 APUSYS_AO_Devices[] = {
159 
160 /* 0 */
161 APUSYS_APC_AO_ATTR("apusys_ao-0",
162 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
163 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
164 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
165 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
166 APUSYS_APC_AO_ATTR("apusys_ao-1",
167 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
168 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
169 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
170 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
171 APUSYS_APC_AO_ATTR("apusys_ao-2",
172 		SEC_RW_ONLY,   FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
173 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
174 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
175 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
176 APUSYS_APC_AO_ATTR("apusys_ao-3",
177 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
178 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
179 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
180 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
181 APUSYS_APC_AO_ATTR("apusys_ao-4",
182 		SEC_RW_ONLY,   FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
183 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
184 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
185 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
186 APUSYS_APC_AO_ATTR("apusys_ao-5",
187 		SEC_RW_ONLY,   FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
188 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
189 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
190 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
191 APUSYS_APC_AO_ATTR("md32_apb_s-0",
192 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
193 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
194 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
195 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
196 APUSYS_APC_AO_ATTR("md32_apb_s-1",
197 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
198 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
199 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
200 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
201 APUSYS_APC_AO_ATTR("md32_apb_s-2",
202 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
203 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
204 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
205 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
206 APUSYS_APC_AO_ATTR("md32_debug_apb",
207 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
208 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
209 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
210 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
211 
212 /* 10 */
213 APUSYS_APC_AO_ATTR("apu_conn_config",
214 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
215 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
216 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
217 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
218 APUSYS_APC_AO_ATTR("apu_sctrl_reviser",
219 		SEC_RW_ONLY,   FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
220 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
221 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
222 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
223 APUSYS_APC_AO_ATTR("apu_sema_stimer",
224 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
225 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
226 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
227 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
228 APUSYS_APC_AO_ATTR("apu_emi_config",
229 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
230 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
231 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
232 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
233 APUSYS_APC_AO_ATTR("apu_adl",
234 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
235 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
236 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
237 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
238 APUSYS_APC_AO_ATTR("apu_edma_lite0",
239 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
240 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
241 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
242 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
243 APUSYS_APC_AO_ATTR("apu_edma_lite1",
244 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
245 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
246 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
247 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
248 APUSYS_APC_AO_ATTR("apu_edma0",
249 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
250 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
251 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
252 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
253 APUSYS_APC_AO_ATTR("apu_edma0",
254 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
255 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
256 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
257 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
258 APUSYS_APC_AO_ATTR("apu_dapc_ao",
259 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
260 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
261 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
262 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
263 
264 /* 20 */
265 APUSYS_APC_AO_ATTR("apu_dapc",
266 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
267 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
268 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
269 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
270 APUSYS_APC_AO_ATTR("infra_bcrm",
271 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
272 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
273 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
274 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
275 APUSYS_APC_AO_ATTR("apb_dbg_ctl",
276 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
277 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
278 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
279 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
280 APUSYS_APC_AO_ATTR("noc_dapc",
281 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
282 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
283 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
284 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
285 APUSYS_APC_AO_ATTR("apu_noc_bcrm",
286 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
287 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
288 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
289 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
290 APUSYS_APC_AO_ATTR("apu_noc_config",
291 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
292 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
293 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
294 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
295 APUSYS_APC_AO_ATTR("vpu_core0_config-0",
296 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
297 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
298 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
299 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
300 APUSYS_APC_AO_ATTR("vpu_core0_config-1",
301 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
302 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
303 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
304 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
305 APUSYS_APC_AO_ATTR("vpu_core1_config-0",
306 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
307 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
308 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
309 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
310 APUSYS_APC_AO_ATTR("vpu_core1_config-1",
311 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
312 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
313 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
314 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
315 
316 /* 30 */
317 APUSYS_APC_AO_ATTR("mdla0_apb-0",
318 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
319 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
320 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
321 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
322 APUSYS_APC_AO_ATTR("mdla0_apb-1",
323 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
324 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
325 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
326 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
327 APUSYS_APC_AO_ATTR("mdla0_apb-2",
328 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
329 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
330 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
331 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
332 APUSYS_APC_AO_ATTR("mdla0_apb-3",
333 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
334 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
335 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
336 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
337 APUSYS_APC_AO_ATTR("apu_iommu0_r0",
338 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
339 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
340 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
341 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
342 APUSYS_APC_AO_ATTR("apu_iommu0_r1",
343 		SEC_RW_ONLY,   FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
344 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
345 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
346 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
347 APUSYS_APC_AO_ATTR("apu_iommu0_r2",
348 		SEC_RW_ONLY,   FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
349 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
350 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
351 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
352 APUSYS_APC_AO_ATTR("apu_iommu0_r3",
353 		SEC_RW_ONLY,   FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
354 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
355 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
356 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
357 APUSYS_APC_AO_ATTR("apu_iommu0_r4",
358 		SEC_RW_ONLY,   FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
359 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
360 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
361 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
362 APUSYS_APC_AO_ATTR("apu_rsi2_config",
363 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
364 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
365 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
366 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
367 
368 /* 40 */
369 APUSYS_APC_AO_ATTR("apu_ssc2_config",
370 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
371 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
372 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
373 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
374 APUSYS_APC_AO_ATTR("vp6_core0_debug_apb",
375 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
376 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
377 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
378 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
379 APUSYS_APC_AO_ATTR("vp6_core1_debug_apb",
380 		NO_PROTECTION, FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
381 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
382 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN,
383 		FORBIDDEN,     FORBIDDEN,     FORBIDDEN,     FORBIDDEN),
384 };
385 
set_slave_apc(uint32_t slave,enum APUSYS_APC_DOMAIN_ID domain_id,enum APUSYS_APC_PERM_TYPE perm)386 static int32_t set_slave_apc(uint32_t slave,
387 			     enum APUSYS_APC_DOMAIN_ID domain_id,
388 			     enum APUSYS_APC_PERM_TYPE perm)
389 {
390 	uint32_t apc_register_index;
391 	uint32_t apc_set_index;
392 	uintptr_t base;
393 	uint32_t clr_bit;
394 	uint32_t set_bit;
395 	int32_t ret;
396 
397 	if (perm >= PERM_NUM) {
398 		ERROR("[APUAPC] perm type:0x%x is not supported!\n", perm);
399 		ret = APUSYS_APC_ERR_PERMISSION_NOT_SUPPORTED;
400 		goto exit;
401 	}
402 
403 	apc_register_index = slave / APUSYS_APC_SYS0_AO_SLAVE_NUM_IN_1_DOM;
404 	apc_set_index = slave % APUSYS_APC_SYS0_AO_SLAVE_NUM_IN_1_DOM;
405 
406 	clr_bit = 0xFFFFFFFF ^ (0x3U << (apc_set_index * 2));
407 	set_bit = perm << (apc_set_index * 2);
408 
409 	if ((slave < APUSYS_APC_SYS0_AO_SLAVE_NUM) &&
410 	    (domain_id < APUSYS_APC_SYS0_AO_DOM_NUM)) {
411 		base = APUSYS_APC_AO_BASE +
412 		       (domain_id * 0x40) + (apc_register_index * 4);
413 		apuapc_writel(apuapc_readl(base) & clr_bit, base);
414 		apuapc_writel(apuapc_readl(base) | set_bit, base);
415 		ret = APUSYS_APC_OK;
416 	} else {
417 		ERROR("[APUAPC] %s: %s, %s:0x%x, %s:0x%x\n",
418 		      __func__, "out of boundary",
419 		      "slave", slave,
420 		      "domain_id", domain_id);
421 		ret = APUSYS_APC_ERR_OUT_OF_BOUNDARY;
422 	}
423 
424 exit:
425 	return ret;
426 }
427 
dump_apusys_ao_apc(void)428 static void dump_apusys_ao_apc(void)
429 {
430 	uint32_t reg_num;
431 	uint32_t d, i;
432 
433 	reg_num = APUSYS_APC_SYS0_AO_SLAVE_NUM /
434 		  APUSYS_APC_SYS0_AO_SLAVE_NUM_IN_1_DOM;
435 	for (d = 0U; d < APUSYS_APC_SYS0_AO_DOM_NUM; d++) {
436 		for (i = 0U; i <= reg_num; i++) {
437 			INFO("[APUAPC] D%d_APC_%d: 0x%x\n", d, i,
438 			     apuapc_readl(APUSYS_APC_AO_BASE +
439 			     (d * 0x40) + (i * 4)));
440 		}
441 	}
442 	INFO("[APUAPC] APC_CON: 0x%x\n", apuapc_readl(APUSYS_APC_CON));
443 }
444 
set_apusys_noc_dapc(void)445 static int32_t set_apusys_noc_dapc(void)
446 {
447 	int32_t ret = 0;
448 	uint32_t i;
449 	uint32_t index;
450 
451 	for (i = 0U; i < ARRAY_SIZE(APUSYS_NOC_DAPC_AO); i++) {
452 		if (i < APUSYS_NOC_DAPC_GAP_BOUNDARY) {
453 			index = i;
454 		} else {
455 			index = i + APUSYS_NOC_DAPC_JUMP_GAP;
456 		}
457 		ret += set_slave_noc_dapc(index, DOMAIN_0,
458 				APUSYS_NOC_DAPC_AO[i].d0_permission);
459 		ret += set_slave_noc_dapc(index, DOMAIN_1,
460 				APUSYS_NOC_DAPC_AO[i].d1_permission);
461 		ret += set_slave_noc_dapc(index, DOMAIN_2,
462 				APUSYS_NOC_DAPC_AO[i].d2_permission);
463 		ret += set_slave_noc_dapc(index, DOMAIN_3,
464 				APUSYS_NOC_DAPC_AO[i].d3_permission);
465 		ret += set_slave_noc_dapc(index, DOMAIN_4,
466 				APUSYS_NOC_DAPC_AO[i].d4_permission);
467 		ret += set_slave_noc_dapc(index, DOMAIN_5,
468 				APUSYS_NOC_DAPC_AO[i].d5_permission);
469 		ret += set_slave_noc_dapc(index, DOMAIN_6,
470 				APUSYS_NOC_DAPC_AO[i].d6_permission);
471 		ret += set_slave_noc_dapc(index, DOMAIN_7,
472 				APUSYS_NOC_DAPC_AO[i].d7_permission);
473 		ret += set_slave_noc_dapc(index, DOMAIN_8,
474 				APUSYS_NOC_DAPC_AO[i].d8_permission);
475 		ret += set_slave_noc_dapc(index, DOMAIN_9,
476 				APUSYS_NOC_DAPC_AO[i].d9_permission);
477 		ret += set_slave_noc_dapc(index, DOMAIN_10,
478 				APUSYS_NOC_DAPC_AO[i].d10_permission);
479 		ret += set_slave_noc_dapc(index, DOMAIN_11,
480 				APUSYS_NOC_DAPC_AO[i].d11_permission);
481 		ret += set_slave_noc_dapc(index, DOMAIN_12,
482 				APUSYS_NOC_DAPC_AO[i].d12_permission);
483 		ret += set_slave_noc_dapc(index, DOMAIN_13,
484 				APUSYS_NOC_DAPC_AO[i].d13_permission);
485 		ret += set_slave_noc_dapc(index, DOMAIN_14,
486 				APUSYS_NOC_DAPC_AO[i].d14_permission);
487 		ret += set_slave_noc_dapc(index, DOMAIN_15,
488 				APUSYS_NOC_DAPC_AO[i].d15_permission);
489 	}
490 
491 	return ret;
492 }
493 
set_apusys_ao_apc(void)494 static int32_t set_apusys_ao_apc(void)
495 {
496 	int32_t ret = 0;
497 	uint32_t i;
498 
499 	for (i = 0U; i < ARRAY_SIZE(APUSYS_AO_Devices); i++) {
500 		ret += set_slave_apc(i, DOMAIN_0,
501 				APUSYS_AO_Devices[i].d0_permission);
502 		ret += set_slave_apc(i, DOMAIN_1,
503 				APUSYS_AO_Devices[i].d1_permission);
504 		ret += set_slave_apc(i, DOMAIN_2,
505 				APUSYS_AO_Devices[i].d2_permission);
506 		ret += set_slave_apc(i, DOMAIN_3,
507 				APUSYS_AO_Devices[i].d3_permission);
508 		ret += set_slave_apc(i, DOMAIN_4,
509 				APUSYS_AO_Devices[i].d4_permission);
510 		ret += set_slave_apc(i, DOMAIN_5,
511 				APUSYS_AO_Devices[i].d5_permission);
512 		ret += set_slave_apc(i, DOMAIN_6,
513 				APUSYS_AO_Devices[i].d6_permission);
514 		ret += set_slave_apc(i, DOMAIN_7,
515 				APUSYS_AO_Devices[i].d7_permission);
516 		ret += set_slave_apc(i, DOMAIN_8,
517 				APUSYS_AO_Devices[i].d8_permission);
518 		ret += set_slave_apc(i, DOMAIN_9,
519 				APUSYS_AO_Devices[i].d9_permission);
520 		ret += set_slave_apc(i, DOMAIN_10,
521 				APUSYS_AO_Devices[i].d10_permission);
522 		ret += set_slave_apc(i, DOMAIN_11,
523 				APUSYS_AO_Devices[i].d11_permission);
524 		ret += set_slave_apc(i, DOMAIN_12,
525 				APUSYS_AO_Devices[i].d12_permission);
526 		ret += set_slave_apc(i, DOMAIN_13,
527 				APUSYS_AO_Devices[i].d13_permission);
528 		ret += set_slave_apc(i, DOMAIN_14,
529 				APUSYS_AO_Devices[i].d14_permission);
530 		ret += set_slave_apc(i, DOMAIN_15,
531 				APUSYS_AO_Devices[i].d15_permission);
532 	}
533 
534 	return ret;
535 }
536 
set_apusys_apc_lock(void)537 static void set_apusys_apc_lock(void)
538 {
539 	uint32_t set_bit = 1U << APUSYS_APC_SYS0_LOCK_BIT_APU_SCTRL_REVISER;
540 
541 	/* Lock apu_sctrl_reviser */
542 	set_bit = set_bit | (1U << APUSYS_APC_SYS0_LOCK_BIT_APUSYS_AO_5);
543 	apuapc_writel(set_bit, APUSYS_SYS0_APC_LOCK_0);
544 }
545 
set_apusys_apc(void)546 void set_apusys_apc(void)
547 {
548 	int32_t ret = 0;
549 
550 	/* Check violation status */
551 	INFO("[APUAPC] vio %d\n", apuapc_readl(APUSYS_APC_CON) & 0x80000000);
552 
553 	/* Initial Permission */
554 	ret = set_apusys_ao_apc();
555 	INFO("[APUAPC] %s - %s!\n", "set_apusys_ao_apc",
556 	     ret ? "FAILED" : "SUCCESS");
557 
558 	/* Lock */
559 	set_apusys_apc_lock();
560 
561 	/* Initial NoC Permission */
562 	ret = set_apusys_noc_dapc();
563 	INFO("[APUAPC] %s - %s!\n", "set_apusys_noc_dapc",
564 	     ret ? "FAILED" : "SUCCESS");
565 
566 	/* Dump Permission */
567 	dump_apusys_ao_apc();
568 	dump_apusys_noc_dapc();
569 
570 	INFO("[APUAPC] %s done\n", __func__);
571 }
572