blob: 245d5126ba449b1cfb173e957e1c1f62ea9c33cf [file] [log] [blame]
developer282d3df2021-04-20 18:08:35 +08001/*
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
13static const struct APC_DOM_16 APUSYS_NOC_DAPC_AO[] = {
14/* 0~3 */
15APUSYS_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),
20APUSYS_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),
25APUSYS_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),
30APUSYS_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 */
37APUSYS_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),
42APUSYS_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),
47APUSYS_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 */
54APUSYS_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),
59APUSYS_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),
64APUSYS_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 */
71APUSYS_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),
76APUSYS_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),
81APUSYS_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),
86APUSYS_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),
91APUSYS_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
98static 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
136exit:
137 return ret;
138}
139
140static 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
158static const struct APC_DOM_16 APUSYS_AO_Devices[] = {
159
160/* 0 */
161APUSYS_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),
166APUSYS_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),
171APUSYS_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),
176APUSYS_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),
181APUSYS_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),
186APUSYS_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),
191APUSYS_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),
196APUSYS_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),
201APUSYS_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),
206APUSYS_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 */
213APUSYS_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),
218APUSYS_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),
223APUSYS_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),
228APUSYS_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),
233APUSYS_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),
238APUSYS_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),
243APUSYS_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),
248APUSYS_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),
253APUSYS_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),
258APUSYS_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 */
265APUSYS_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),
270APUSYS_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),
275APUSYS_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),
280APUSYS_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),
285APUSYS_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),
290APUSYS_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),
295APUSYS_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),
300APUSYS_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),
305APUSYS_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),
310APUSYS_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 */
317APUSYS_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),
322APUSYS_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),
327APUSYS_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),
332APUSYS_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),
337APUSYS_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),
342APUSYS_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),
347APUSYS_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),
352APUSYS_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),
357APUSYS_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),
362APUSYS_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 */
369APUSYS_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),
374APUSYS_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),
379APUSYS_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
386static 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
424exit:
425 return ret;
426}
427
428static 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
445static 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
494static 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
537static 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
546void 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}