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 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 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 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 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 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 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 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 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