1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2022-2023, NVIDIA CORPORATION. All rights reserved. 4 */ 5 6 #include <soc/tegra/mc.h> 7 8 #include <dt-bindings/memory/tegra234-mc.h> 9 #include <linux/interconnect.h> 10 #include <linux/tegra-icc.h> 11 12 #include <soc/tegra/bpmp.h> 13 #include "mc.h" 14 15 /* 16 * MC Client entries are sorted in the increasing order of the 17 * override and security register offsets. 18 */ 19 static const struct tegra_mc_client tegra234_mc_clients[] = { 20 { 21 .id = TEGRA234_MEMORY_CLIENT_HDAR, 22 .name = "hdar", 23 .bpmp_id = TEGRA_ICC_BPMP_HDA, 24 .type = TEGRA_ICC_ISO_AUDIO, 25 .sid = TEGRA234_SID_HDA, 26 .regs = { 27 .sid = { 28 .override = 0xa8, 29 .security = 0xac, 30 }, 31 }, 32 }, { 33 .id = TEGRA234_MEMORY_CLIENT_NVENCSRD, 34 .name = "nvencsrd", 35 .bpmp_id = TEGRA_ICC_BPMP_NVENC, 36 .type = TEGRA_ICC_NISO, 37 .sid = TEGRA234_SID_NVENC, 38 .regs = { 39 .sid = { 40 .override = 0xe0, 41 .security = 0xe4, 42 }, 43 }, 44 }, { 45 .id = TEGRA234_MEMORY_CLIENT_PCIE6AR, 46 .name = "pcie6ar", 47 .bpmp_id = TEGRA_ICC_BPMP_PCIE_6, 48 .type = TEGRA_ICC_NISO, 49 .sid = TEGRA234_SID_PCIE6, 50 .regs = { 51 .sid = { 52 .override = 0x140, 53 .security = 0x144, 54 }, 55 }, 56 }, { 57 .id = TEGRA234_MEMORY_CLIENT_PCIE6AW, 58 .name = "pcie6aw", 59 .bpmp_id = TEGRA_ICC_BPMP_PCIE_6, 60 .type = TEGRA_ICC_NISO, 61 .sid = TEGRA234_SID_PCIE6, 62 .regs = { 63 .sid = { 64 .override = 0x148, 65 .security = 0x14c, 66 }, 67 }, 68 }, { 69 .id = TEGRA234_MEMORY_CLIENT_PCIE7AR, 70 .name = "pcie7ar", 71 .bpmp_id = TEGRA_ICC_BPMP_PCIE_7, 72 .type = TEGRA_ICC_NISO, 73 .sid = TEGRA234_SID_PCIE7, 74 .regs = { 75 .sid = { 76 .override = 0x150, 77 .security = 0x154, 78 }, 79 }, 80 }, { 81 .id = TEGRA234_MEMORY_CLIENT_NVENCSWR, 82 .name = "nvencswr", 83 .bpmp_id = TEGRA_ICC_BPMP_NVENC, 84 .type = TEGRA_ICC_NISO, 85 .sid = TEGRA234_SID_NVENC, 86 .regs = { 87 .sid = { 88 .override = 0x158, 89 .security = 0x15c, 90 }, 91 }, 92 }, { 93 .id = TEGRA234_MEMORY_CLIENT_DLA0RDB, 94 .name = "dla0rdb", 95 .bpmp_id = TEGRA_ICC_BPMP_DLA_0, 96 .type = TEGRA_ICC_NISO, 97 .sid = TEGRA234_SID_NVDLA0, 98 .regs = { 99 .sid = { 100 .override = 0x160, 101 .security = 0x164, 102 }, 103 }, 104 }, { 105 .id = TEGRA234_MEMORY_CLIENT_DLA0RDB1, 106 .name = "dla0rdb1", 107 .bpmp_id = TEGRA_ICC_BPMP_DLA_0, 108 .type = TEGRA_ICC_NISO, 109 .sid = TEGRA234_SID_NVDLA0, 110 .regs = { 111 .sid = { 112 .override = 0x168, 113 .security = 0x16c, 114 }, 115 }, 116 }, { 117 .id = TEGRA234_MEMORY_CLIENT_DLA0WRB, 118 .name = "dla0wrb", 119 .bpmp_id = TEGRA_ICC_BPMP_DLA_0, 120 .type = TEGRA_ICC_NISO, 121 .sid = TEGRA234_SID_NVDLA0, 122 .regs = { 123 .sid = { 124 .override = 0x170, 125 .security = 0x174, 126 }, 127 }, 128 }, { 129 .id = TEGRA234_MEMORY_CLIENT_DLA1RDB, 130 .name = "dla1rdb", 131 .bpmp_id = TEGRA_ICC_BPMP_DLA_1, 132 .type = TEGRA_ICC_NISO, 133 .sid = TEGRA234_SID_NVDLA1, 134 .regs = { 135 .sid = { 136 .override = 0x178, 137 .security = 0x17c, 138 }, 139 }, 140 }, { 141 .id = TEGRA234_MEMORY_CLIENT_PCIE7AW, 142 .name = "pcie7aw", 143 .bpmp_id = TEGRA_ICC_BPMP_PCIE_7, 144 .type = TEGRA_ICC_NISO, 145 .sid = TEGRA234_SID_PCIE7, 146 .regs = { 147 .sid = { 148 .override = 0x180, 149 .security = 0x184, 150 }, 151 }, 152 }, { 153 .id = TEGRA234_MEMORY_CLIENT_PCIE8AR, 154 .name = "pcie8ar", 155 .bpmp_id = TEGRA_ICC_BPMP_PCIE_8, 156 .type = TEGRA_ICC_NISO, 157 .sid = TEGRA234_SID_PCIE8, 158 .regs = { 159 .sid = { 160 .override = 0x190, 161 .security = 0x194, 162 }, 163 }, 164 }, { 165 .id = TEGRA234_MEMORY_CLIENT_HDAW, 166 .name = "hdaw", 167 .bpmp_id = TEGRA_ICC_BPMP_HDA, 168 .type = TEGRA_ICC_ISO_AUDIO, 169 .sid = TEGRA234_SID_HDA, 170 .regs = { 171 .sid = { 172 .override = 0x1a8, 173 .security = 0x1ac, 174 }, 175 }, 176 }, { 177 .id = TEGRA234_MEMORY_CLIENT_PCIE8AW, 178 .name = "pcie8aw", 179 .bpmp_id = TEGRA_ICC_BPMP_PCIE_8, 180 .type = TEGRA_ICC_NISO, 181 .sid = TEGRA234_SID_PCIE8, 182 .regs = { 183 .sid = { 184 .override = 0x1d8, 185 .security = 0x1dc, 186 }, 187 }, 188 }, { 189 .id = TEGRA234_MEMORY_CLIENT_PCIE9AR, 190 .name = "pcie9ar", 191 .bpmp_id = TEGRA_ICC_BPMP_PCIE_9, 192 .type = TEGRA_ICC_NISO, 193 .sid = TEGRA234_SID_PCIE9, 194 .regs = { 195 .sid = { 196 .override = 0x1e0, 197 .security = 0x1e4, 198 }, 199 }, 200 }, { 201 .id = TEGRA234_MEMORY_CLIENT_PCIE6AR1, 202 .name = "pcie6ar1", 203 .bpmp_id = TEGRA_ICC_BPMP_PCIE_6, 204 .type = TEGRA_ICC_NISO, 205 .sid = TEGRA234_SID_PCIE6, 206 .regs = { 207 .sid = { 208 .override = 0x1e8, 209 .security = 0x1ec, 210 }, 211 }, 212 }, { 213 .id = TEGRA234_MEMORY_CLIENT_PCIE9AW, 214 .name = "pcie9aw", 215 .bpmp_id = TEGRA_ICC_BPMP_PCIE_9, 216 .type = TEGRA_ICC_NISO, 217 .sid = TEGRA234_SID_PCIE9, 218 .regs = { 219 .sid = { 220 .override = 0x1f0, 221 .security = 0x1f4, 222 }, 223 }, 224 }, { 225 .id = TEGRA234_MEMORY_CLIENT_PCIE10AR, 226 .name = "pcie10ar", 227 .bpmp_id = TEGRA_ICC_BPMP_PCIE_10, 228 .type = TEGRA_ICC_NISO, 229 .sid = TEGRA234_SID_PCIE10, 230 .regs = { 231 .sid = { 232 .override = 0x1f8, 233 .security = 0x1fc, 234 }, 235 }, 236 }, { 237 .id = TEGRA234_MEMORY_CLIENT_PCIE10AW, 238 .name = "pcie10aw", 239 .bpmp_id = TEGRA_ICC_BPMP_PCIE_10, 240 .type = TEGRA_ICC_NISO, 241 .sid = TEGRA234_SID_PCIE10, 242 .regs = { 243 .sid = { 244 .override = 0x200, 245 .security = 0x204, 246 }, 247 }, 248 }, { 249 .id = TEGRA234_MEMORY_CLIENT_PCIE10AR1, 250 .name = "pcie10ar1", 251 .bpmp_id = TEGRA_ICC_BPMP_PCIE_10, 252 .type = TEGRA_ICC_NISO, 253 .sid = TEGRA234_SID_PCIE10, 254 .regs = { 255 .sid = { 256 .override = 0x240, 257 .security = 0x244, 258 }, 259 }, 260 }, { 261 .id = TEGRA234_MEMORY_CLIENT_PCIE7AR1, 262 .name = "pcie7ar1", 263 .bpmp_id = TEGRA_ICC_BPMP_PCIE_7, 264 .type = TEGRA_ICC_NISO, 265 .sid = TEGRA234_SID_PCIE7, 266 .regs = { 267 .sid = { 268 .override = 0x248, 269 .security = 0x24c, 270 }, 271 }, 272 }, { 273 .id = TEGRA234_MEMORY_CLIENT_MGBEARD, 274 .name = "mgbeard", 275 .bpmp_id = TEGRA_ICC_BPMP_EQOS, 276 .type = TEGRA_ICC_NISO, 277 .sid = TEGRA234_SID_MGBE, 278 .regs = { 279 .sid = { 280 .override = 0x2c0, 281 .security = 0x2c4, 282 }, 283 }, 284 }, { 285 .id = TEGRA234_MEMORY_CLIENT_MGBEBRD, 286 .name = "mgbebrd", 287 .bpmp_id = TEGRA_ICC_BPMP_EQOS, 288 .type = TEGRA_ICC_NISO, 289 .sid = TEGRA234_SID_MGBE_VF1, 290 .regs = { 291 .sid = { 292 .override = 0x2c8, 293 .security = 0x2cc, 294 }, 295 }, 296 }, { 297 .id = TEGRA234_MEMORY_CLIENT_MGBECRD, 298 .name = "mgbecrd", 299 .bpmp_id = TEGRA_ICC_BPMP_EQOS, 300 .type = TEGRA_ICC_NISO, 301 .sid = TEGRA234_SID_MGBE_VF2, 302 .regs = { 303 .sid = { 304 .override = 0x2d0, 305 .security = 0x2d4, 306 }, 307 }, 308 }, { 309 .id = TEGRA234_MEMORY_CLIENT_MGBEDRD, 310 .name = "mgbedrd", 311 .bpmp_id = TEGRA_ICC_BPMP_EQOS, 312 .type = TEGRA_ICC_NISO, 313 .sid = TEGRA234_SID_MGBE_VF3, 314 .regs = { 315 .sid = { 316 .override = 0x2d8, 317 .security = 0x2dc, 318 }, 319 }, 320 }, { 321 .id = TEGRA234_MEMORY_CLIENT_MGBEAWR, 322 .bpmp_id = TEGRA_ICC_BPMP_EQOS, 323 .type = TEGRA_ICC_NISO, 324 .name = "mgbeawr", 325 .sid = TEGRA234_SID_MGBE, 326 .regs = { 327 .sid = { 328 .override = 0x2e0, 329 .security = 0x2e4, 330 }, 331 }, 332 }, { 333 .id = TEGRA234_MEMORY_CLIENT_MGBEBWR, 334 .name = "mgbebwr", 335 .bpmp_id = TEGRA_ICC_BPMP_EQOS, 336 .type = TEGRA_ICC_NISO, 337 .sid = TEGRA234_SID_MGBE_VF1, 338 .regs = { 339 .sid = { 340 .override = 0x2f8, 341 .security = 0x2fc, 342 }, 343 }, 344 }, { 345 .id = TEGRA234_MEMORY_CLIENT_MGBECWR, 346 .name = "mgbecwr", 347 .bpmp_id = TEGRA_ICC_BPMP_EQOS, 348 .type = TEGRA_ICC_NISO, 349 .sid = TEGRA234_SID_MGBE_VF2, 350 .regs = { 351 .sid = { 352 .override = 0x308, 353 .security = 0x30c, 354 }, 355 }, 356 }, { 357 .id = TEGRA234_MEMORY_CLIENT_SDMMCRAB, 358 .name = "sdmmcrab", 359 .bpmp_id = TEGRA_ICC_BPMP_SDMMC_4, 360 .type = TEGRA_ICC_NISO, 361 .sid = TEGRA234_SID_SDMMC4, 362 .regs = { 363 .sid = { 364 .override = 0x318, 365 .security = 0x31c, 366 }, 367 }, 368 }, { 369 .id = TEGRA234_MEMORY_CLIENT_MGBEDWR, 370 .name = "mgbedwr", 371 .bpmp_id = TEGRA_ICC_BPMP_EQOS, 372 .type = TEGRA_ICC_NISO, 373 .sid = TEGRA234_SID_MGBE_VF3, 374 .regs = { 375 .sid = { 376 .override = 0x328, 377 .security = 0x32c, 378 }, 379 }, 380 }, { 381 .id = TEGRA234_MEMORY_CLIENT_SDMMCWAB, 382 .name = "sdmmcwab", 383 .bpmp_id = TEGRA_ICC_BPMP_SDMMC_4, 384 .type = TEGRA_ICC_NISO, 385 .sid = TEGRA234_SID_SDMMC4, 386 .regs = { 387 .sid = { 388 .override = 0x338, 389 .security = 0x33c, 390 }, 391 }, 392 }, { 393 .id = TEGRA234_MEMORY_CLIENT_VICSRD, 394 .name = "vicsrd", 395 .bpmp_id = TEGRA_ICC_BPMP_VIC, 396 .type = TEGRA_ICC_NISO, 397 .sid = TEGRA234_SID_VIC, 398 .regs = { 399 .sid = { 400 .override = 0x360, 401 .security = 0x364, 402 }, 403 }, 404 }, { 405 .id = TEGRA234_MEMORY_CLIENT_VICSWR, 406 .name = "vicswr", 407 .bpmp_id = TEGRA_ICC_BPMP_VIC, 408 .type = TEGRA_ICC_NISO, 409 .sid = TEGRA234_SID_VIC, 410 .regs = { 411 .sid = { 412 .override = 0x368, 413 .security = 0x36c, 414 }, 415 }, 416 }, { 417 .id = TEGRA234_MEMORY_CLIENT_DLA1RDB1, 418 .name = "dla1rdb1", 419 .bpmp_id = TEGRA_ICC_BPMP_DLA_1, 420 .type = TEGRA_ICC_NISO, 421 .sid = TEGRA234_SID_NVDLA1, 422 .regs = { 423 .sid = { 424 .override = 0x370, 425 .security = 0x374, 426 }, 427 }, 428 }, { 429 .id = TEGRA234_MEMORY_CLIENT_DLA1WRB, 430 .name = "dla1wrb", 431 .bpmp_id = TEGRA_ICC_BPMP_DLA_1, 432 .type = TEGRA_ICC_NISO, 433 .sid = TEGRA234_SID_NVDLA1, 434 .regs = { 435 .sid = { 436 .override = 0x378, 437 .security = 0x37c, 438 }, 439 }, 440 }, { 441 .id = TEGRA234_MEMORY_CLIENT_VI2W, 442 .name = "vi2w", 443 .bpmp_id = TEGRA_ICC_BPMP_VI2, 444 .type = TEGRA_ICC_ISO_VI, 445 .sid = TEGRA234_SID_ISO_VI2, 446 .regs = { 447 .sid = { 448 .override = 0x380, 449 .security = 0x384, 450 }, 451 }, 452 }, { 453 .id = TEGRA234_MEMORY_CLIENT_VI2FALR, 454 .name = "vi2falr", 455 .bpmp_id = TEGRA_ICC_BPMP_VI2FAL, 456 .type = TEGRA_ICC_ISO_VIFAL, 457 .sid = TEGRA234_SID_ISO_VI2FALC, 458 .regs = { 459 .sid = { 460 .override = 0x388, 461 .security = 0x38c, 462 }, 463 }, 464 }, { 465 .id = TEGRA234_MEMORY_CLIENT_VIW, 466 .name = "viw", 467 .bpmp_id = TEGRA_ICC_BPMP_VI, 468 .type = TEGRA_ICC_ISO_VI, 469 .sid = TEGRA234_SID_ISO_VI, 470 .regs = { 471 .sid = { 472 .override = 0x390, 473 .security = 0x394, 474 }, 475 }, 476 }, { 477 .id = TEGRA234_MEMORY_CLIENT_NVDECSRD, 478 .name = "nvdecsrd", 479 .bpmp_id = TEGRA_ICC_BPMP_NVDEC, 480 .type = TEGRA_ICC_NISO, 481 .sid = TEGRA234_SID_NVDEC, 482 .regs = { 483 .sid = { 484 .override = 0x3c0, 485 .security = 0x3c4, 486 }, 487 }, 488 }, { 489 .id = TEGRA234_MEMORY_CLIENT_NVDECSWR, 490 .name = "nvdecswr", 491 .bpmp_id = TEGRA_ICC_BPMP_NVDEC, 492 .type = TEGRA_ICC_NISO, 493 .sid = TEGRA234_SID_NVDEC, 494 .regs = { 495 .sid = { 496 .override = 0x3c8, 497 .security = 0x3cc, 498 }, 499 }, 500 }, { 501 .id = TEGRA234_MEMORY_CLIENT_APER, 502 .name = "aper", 503 .bpmp_id = TEGRA_ICC_BPMP_APE, 504 .type = TEGRA_ICC_ISO_AUDIO, 505 .sid = TEGRA234_SID_APE, 506 .regs = { 507 .sid = { 508 .override = 0x3d0, 509 .security = 0x3d4, 510 }, 511 }, 512 }, { 513 .id = TEGRA234_MEMORY_CLIENT_APEW, 514 .name = "apew", 515 .bpmp_id = TEGRA_ICC_BPMP_APE, 516 .type = TEGRA_ICC_ISO_AUDIO, 517 .sid = TEGRA234_SID_APE, 518 .regs = { 519 .sid = { 520 .override = 0x3d8, 521 .security = 0x3dc, 522 }, 523 }, 524 }, { 525 .id = TEGRA234_MEMORY_CLIENT_VI2FALW, 526 .name = "vi2falw", 527 .bpmp_id = TEGRA_ICC_BPMP_VI2FAL, 528 .type = TEGRA_ICC_ISO_VIFAL, 529 .sid = TEGRA234_SID_ISO_VI2FALC, 530 .regs = { 531 .sid = { 532 .override = 0x3e0, 533 .security = 0x3e4, 534 }, 535 }, 536 }, { 537 .id = TEGRA234_MEMORY_CLIENT_NVJPGSRD, 538 .name = "nvjpgsrd", 539 .bpmp_id = TEGRA_ICC_BPMP_NVJPG_0, 540 .type = TEGRA_ICC_NISO, 541 .sid = TEGRA234_SID_NVJPG, 542 .regs = { 543 .sid = { 544 .override = 0x3f0, 545 .security = 0x3f4, 546 }, 547 }, 548 }, { 549 .id = TEGRA234_MEMORY_CLIENT_NVJPGSWR, 550 .name = "nvjpgswr", 551 .bpmp_id = TEGRA_ICC_BPMP_NVJPG_0, 552 .type = TEGRA_ICC_NISO, 553 .sid = TEGRA234_SID_NVJPG, 554 .regs = { 555 .sid = { 556 .override = 0x3f8, 557 .security = 0x3fc, 558 }, 559 }, 560 }, { 561 .id = TEGRA234_MEMORY_CLIENT_NVDISPLAYR, 562 .name = "nvdisplayr", 563 .bpmp_id = TEGRA_ICC_BPMP_DISPLAY, 564 .type = TEGRA_ICC_ISO_DISPLAY, 565 .sid = TEGRA234_SID_ISO_NVDISPLAY, 566 .regs = { 567 .sid = { 568 .override = 0x490, 569 .security = 0x494, 570 }, 571 }, 572 }, { 573 .id = TEGRA234_MEMORY_CLIENT_BPMPR, 574 .name = "bpmpr", 575 .sid = TEGRA234_SID_BPMP, 576 .regs = { 577 .sid = { 578 .override = 0x498, 579 .security = 0x49c, 580 }, 581 }, 582 }, { 583 .id = TEGRA234_MEMORY_CLIENT_BPMPW, 584 .name = "bpmpw", 585 .sid = TEGRA234_SID_BPMP, 586 .regs = { 587 .sid = { 588 .override = 0x4a0, 589 .security = 0x4a4, 590 }, 591 }, 592 }, { 593 .id = TEGRA234_MEMORY_CLIENT_BPMPDMAR, 594 .name = "bpmpdmar", 595 .sid = TEGRA234_SID_BPMP, 596 .regs = { 597 .sid = { 598 .override = 0x4a8, 599 .security = 0x4ac, 600 }, 601 }, 602 }, { 603 .id = TEGRA234_MEMORY_CLIENT_BPMPDMAW, 604 .name = "bpmpdmaw", 605 .sid = TEGRA234_SID_BPMP, 606 .regs = { 607 .sid = { 608 .override = 0x4b0, 609 .security = 0x4b4, 610 }, 611 }, 612 }, { 613 .id = TEGRA234_MEMORY_CLIENT_APEDMAR, 614 .name = "apedmar", 615 .bpmp_id = TEGRA_ICC_BPMP_APEDMA, 616 .type = TEGRA_ICC_ISO_AUDIO, 617 .sid = TEGRA234_SID_APE, 618 .regs = { 619 .sid = { 620 .override = 0x4f8, 621 .security = 0x4fc, 622 }, 623 }, 624 }, { 625 .id = TEGRA234_MEMORY_CLIENT_APEDMAW, 626 .name = "apedmaw", 627 .bpmp_id = TEGRA_ICC_BPMP_APEDMA, 628 .type = TEGRA_ICC_ISO_AUDIO, 629 .sid = TEGRA234_SID_APE, 630 .regs = { 631 .sid = { 632 .override = 0x500, 633 .security = 0x504, 634 }, 635 }, 636 }, { 637 .id = TEGRA234_MEMORY_CLIENT_NVDISPLAYR1, 638 .name = "nvdisplayr1", 639 .bpmp_id = TEGRA_ICC_BPMP_DISPLAY, 640 .type = TEGRA_ICC_ISO_DISPLAY, 641 .sid = TEGRA234_SID_ISO_NVDISPLAY, 642 .regs = { 643 .sid = { 644 .override = 0x508, 645 .security = 0x50c, 646 }, 647 }, 648 }, { 649 .id = TEGRA234_MEMORY_CLIENT_VIFALR, 650 .name = "vifalr", 651 .bpmp_id = TEGRA_ICC_BPMP_VIFAL, 652 .type = TEGRA_ICC_ISO_VIFAL, 653 .sid = TEGRA234_SID_ISO_VIFALC, 654 .regs = { 655 .sid = { 656 .override = 0x5e0, 657 .security = 0x5e4, 658 }, 659 }, 660 }, { 661 .id = TEGRA234_MEMORY_CLIENT_VIFALW, 662 .name = "vifalw", 663 .bpmp_id = TEGRA_ICC_BPMP_VIFAL, 664 .type = TEGRA_ICC_ISO_VIFAL, 665 .sid = TEGRA234_SID_ISO_VIFALC, 666 .regs = { 667 .sid = { 668 .override = 0x5e8, 669 .security = 0x5ec, 670 }, 671 }, 672 }, { 673 .id = TEGRA234_MEMORY_CLIENT_DLA0RDA, 674 .name = "dla0rda", 675 .bpmp_id = TEGRA_ICC_BPMP_DLA_0, 676 .type = TEGRA_ICC_NISO, 677 .sid = TEGRA234_SID_NVDLA0, 678 .regs = { 679 .sid = { 680 .override = 0x5f0, 681 .security = 0x5f4, 682 }, 683 }, 684 }, { 685 .id = TEGRA234_MEMORY_CLIENT_DLA0FALRDB, 686 .name = "dla0falrdb", 687 .bpmp_id = TEGRA_ICC_BPMP_DLA_0, 688 .type = TEGRA_ICC_NISO, 689 .sid = TEGRA234_SID_NVDLA0, 690 .regs = { 691 .sid = { 692 .override = 0x5f8, 693 .security = 0x5fc, 694 }, 695 }, 696 }, { 697 .id = TEGRA234_MEMORY_CLIENT_DLA0WRA, 698 .name = "dla0wra", 699 .bpmp_id = TEGRA_ICC_BPMP_DLA_0, 700 .type = TEGRA_ICC_NISO, 701 .sid = TEGRA234_SID_NVDLA0, 702 .regs = { 703 .sid = { 704 .override = 0x600, 705 .security = 0x604, 706 }, 707 }, 708 }, { 709 .id = TEGRA234_MEMORY_CLIENT_DLA0FALWRB, 710 .name = "dla0falwrb", 711 .bpmp_id = TEGRA_ICC_BPMP_DLA_0, 712 .type = TEGRA_ICC_NISO, 713 .sid = TEGRA234_SID_NVDLA0, 714 .regs = { 715 .sid = { 716 .override = 0x608, 717 .security = 0x60c, 718 }, 719 }, 720 }, { 721 .id = TEGRA234_MEMORY_CLIENT_DLA1RDA, 722 .name = "dla1rda", 723 .bpmp_id = TEGRA_ICC_BPMP_DLA_1, 724 .type = TEGRA_ICC_NISO, 725 .sid = TEGRA234_SID_NVDLA1, 726 .regs = { 727 .sid = { 728 .override = 0x610, 729 .security = 0x614, 730 }, 731 }, 732 }, { 733 .id = TEGRA234_MEMORY_CLIENT_DLA1FALRDB, 734 .name = "dla1falrdb", 735 .bpmp_id = TEGRA_ICC_BPMP_DLA_1, 736 .type = TEGRA_ICC_NISO, 737 .sid = TEGRA234_SID_NVDLA1, 738 .regs = { 739 .sid = { 740 .override = 0x618, 741 .security = 0x61c, 742 }, 743 }, 744 }, { 745 .id = TEGRA234_MEMORY_CLIENT_DLA1WRA, 746 .name = "dla1wra", 747 .bpmp_id = TEGRA_ICC_BPMP_DLA_1, 748 .type = TEGRA_ICC_NISO, 749 .sid = TEGRA234_SID_NVDLA1, 750 .regs = { 751 .sid = { 752 .override = 0x620, 753 .security = 0x624, 754 }, 755 }, 756 }, { 757 .id = TEGRA234_MEMORY_CLIENT_DLA1FALWRB, 758 .name = "dla1falwrb", 759 .bpmp_id = TEGRA_ICC_BPMP_DLA_1, 760 .type = TEGRA_ICC_NISO, 761 .sid = TEGRA234_SID_NVDLA1, 762 .regs = { 763 .sid = { 764 .override = 0x628, 765 .security = 0x62c, 766 }, 767 }, 768 }, { 769 .id = TEGRA234_MEMORY_CLIENT_RCER, 770 .name = "rcer", 771 .bpmp_id = TEGRA_ICC_BPMP_RCE, 772 .type = TEGRA_ICC_NISO, 773 .sid = TEGRA234_SID_RCE, 774 .regs = { 775 .sid = { 776 .override = 0x690, 777 .security = 0x694, 778 }, 779 }, 780 }, { 781 .id = TEGRA234_MEMORY_CLIENT_RCEW, 782 .name = "rcew", 783 .bpmp_id = TEGRA_ICC_BPMP_RCE, 784 .type = TEGRA_ICC_NISO, 785 .sid = TEGRA234_SID_RCE, 786 .regs = { 787 .sid = { 788 .override = 0x698, 789 .security = 0x69c, 790 }, 791 }, 792 }, { 793 .id = TEGRA234_MEMORY_CLIENT_PCIE0R, 794 .name = "pcie0r", 795 .bpmp_id = TEGRA_ICC_BPMP_PCIE_0, 796 .type = TEGRA_ICC_NISO, 797 .sid = TEGRA234_SID_PCIE0, 798 .regs = { 799 .sid = { 800 .override = 0x6c0, 801 .security = 0x6c4, 802 }, 803 }, 804 }, { 805 .id = TEGRA234_MEMORY_CLIENT_PCIE0W, 806 .name = "pcie0w", 807 .bpmp_id = TEGRA_ICC_BPMP_PCIE_0, 808 .type = TEGRA_ICC_NISO, 809 .sid = TEGRA234_SID_PCIE0, 810 .regs = { 811 .sid = { 812 .override = 0x6c8, 813 .security = 0x6cc, 814 }, 815 }, 816 }, { 817 .id = TEGRA234_MEMORY_CLIENT_PCIE1R, 818 .name = "pcie1r", 819 .bpmp_id = TEGRA_ICC_BPMP_PCIE_1, 820 .type = TEGRA_ICC_NISO, 821 .sid = TEGRA234_SID_PCIE1, 822 .regs = { 823 .sid = { 824 .override = 0x6d0, 825 .security = 0x6d4, 826 }, 827 }, 828 }, { 829 .id = TEGRA234_MEMORY_CLIENT_PCIE1W, 830 .name = "pcie1w", 831 .bpmp_id = TEGRA_ICC_BPMP_PCIE_1, 832 .type = TEGRA_ICC_NISO, 833 .sid = TEGRA234_SID_PCIE1, 834 .regs = { 835 .sid = { 836 .override = 0x6d8, 837 .security = 0x6dc, 838 }, 839 }, 840 }, { 841 .id = TEGRA234_MEMORY_CLIENT_PCIE2AR, 842 .name = "pcie2ar", 843 .bpmp_id = TEGRA_ICC_BPMP_PCIE_2, 844 .type = TEGRA_ICC_NISO, 845 .sid = TEGRA234_SID_PCIE2, 846 .regs = { 847 .sid = { 848 .override = 0x6e0, 849 .security = 0x6e4, 850 }, 851 }, 852 }, { 853 .id = TEGRA234_MEMORY_CLIENT_PCIE2AW, 854 .name = "pcie2aw", 855 .bpmp_id = TEGRA_ICC_BPMP_PCIE_2, 856 .type = TEGRA_ICC_NISO, 857 .sid = TEGRA234_SID_PCIE2, 858 .regs = { 859 .sid = { 860 .override = 0x6e8, 861 .security = 0x6ec, 862 }, 863 }, 864 }, { 865 .id = TEGRA234_MEMORY_CLIENT_PCIE3R, 866 .name = "pcie3r", 867 .bpmp_id = TEGRA_ICC_BPMP_PCIE_3, 868 .type = TEGRA_ICC_NISO, 869 .sid = TEGRA234_SID_PCIE3, 870 .regs = { 871 .sid = { 872 .override = 0x6f0, 873 .security = 0x6f4, 874 }, 875 }, 876 }, { 877 .id = TEGRA234_MEMORY_CLIENT_PCIE3W, 878 .name = "pcie3w", 879 .bpmp_id = TEGRA_ICC_BPMP_PCIE_3, 880 .type = TEGRA_ICC_NISO, 881 .sid = TEGRA234_SID_PCIE3, 882 .regs = { 883 .sid = { 884 .override = 0x6f8, 885 .security = 0x6fc, 886 }, 887 }, 888 }, { 889 .id = TEGRA234_MEMORY_CLIENT_PCIE4R, 890 .name = "pcie4r", 891 .bpmp_id = TEGRA_ICC_BPMP_PCIE_4, 892 .type = TEGRA_ICC_NISO, 893 .sid = TEGRA234_SID_PCIE4, 894 .regs = { 895 .sid = { 896 .override = 0x700, 897 .security = 0x704, 898 }, 899 }, 900 }, { 901 .id = TEGRA234_MEMORY_CLIENT_PCIE4W, 902 .name = "pcie4w", 903 .bpmp_id = TEGRA_ICC_BPMP_PCIE_4, 904 .type = TEGRA_ICC_NISO, 905 .sid = TEGRA234_SID_PCIE4, 906 .regs = { 907 .sid = { 908 .override = 0x708, 909 .security = 0x70c, 910 }, 911 }, 912 }, { 913 .id = TEGRA234_MEMORY_CLIENT_PCIE5R, 914 .name = "pcie5r", 915 .bpmp_id = TEGRA_ICC_BPMP_PCIE_5, 916 .type = TEGRA_ICC_NISO, 917 .sid = TEGRA234_SID_PCIE5, 918 .regs = { 919 .sid = { 920 .override = 0x710, 921 .security = 0x714, 922 }, 923 }, 924 }, { 925 .id = TEGRA234_MEMORY_CLIENT_PCIE5W, 926 .name = "pcie5w", 927 .bpmp_id = TEGRA_ICC_BPMP_PCIE_5, 928 .type = TEGRA_ICC_NISO, 929 .sid = TEGRA234_SID_PCIE5, 930 .regs = { 931 .sid = { 932 .override = 0x718, 933 .security = 0x71c, 934 }, 935 }, 936 }, { 937 .id = TEGRA234_MEMORY_CLIENT_DLA0RDA1, 938 .name = "dla0rda1", 939 .bpmp_id = TEGRA_ICC_BPMP_DLA_0, 940 .type = TEGRA_ICC_NISO, 941 .sid = TEGRA234_SID_NVDLA0, 942 .regs = { 943 .sid = { 944 .override = 0x748, 945 .security = 0x74c, 946 }, 947 }, 948 }, { 949 .id = TEGRA234_MEMORY_CLIENT_DLA1RDA1, 950 .name = "dla1rda1", 951 .sid = TEGRA234_SID_NVDLA1, 952 .regs = { 953 .sid = { 954 .override = 0x750, 955 .security = 0x754, 956 }, 957 }, 958 }, { 959 .id = TEGRA234_MEMORY_CLIENT_PCIE5R1, 960 .name = "pcie5r1", 961 .bpmp_id = TEGRA_ICC_BPMP_PCIE_5, 962 .type = TEGRA_ICC_NISO, 963 .sid = TEGRA234_SID_PCIE5, 964 .regs = { 965 .sid = { 966 .override = 0x778, 967 .security = 0x77c, 968 }, 969 }, 970 }, { 971 .id = TEGRA234_MEMORY_CLIENT_NVJPG1SRD, 972 .name = "nvjpg1srd", 973 .bpmp_id = TEGRA_ICC_BPMP_NVJPG_1, 974 .type = TEGRA_ICC_NISO, 975 .sid = TEGRA234_SID_NVJPG1, 976 .regs = { 977 .sid = { 978 .override = 0x918, 979 .security = 0x91c, 980 }, 981 }, 982 }, { 983 .id = TEGRA234_MEMORY_CLIENT_NVJPG1SWR, 984 .name = "nvjpg1swr", 985 .bpmp_id = TEGRA_ICC_BPMP_NVJPG_1, 986 .type = TEGRA_ICC_NISO, 987 .sid = TEGRA234_SID_NVJPG1, 988 .regs = { 989 .sid = { 990 .override = 0x920, 991 .security = 0x924, 992 }, 993 }, 994 }, { 995 .id = TEGRA_ICC_MC_CPU_CLUSTER0, 996 .name = "sw_cluster0", 997 .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER0, 998 .type = TEGRA_ICC_NISO, 999 }, { 1000 .id = TEGRA_ICC_MC_CPU_CLUSTER1, 1001 .name = "sw_cluster1", 1002 .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER1, 1003 .type = TEGRA_ICC_NISO, 1004 }, { 1005 .id = TEGRA_ICC_MC_CPU_CLUSTER2, 1006 .name = "sw_cluster2", 1007 .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER2, 1008 .type = TEGRA_ICC_NISO, 1009 }, { 1010 .id = TEGRA234_MEMORY_CLIENT_NVL1R, 1011 .name = "nvl1r", 1012 .bpmp_id = TEGRA_ICC_BPMP_GPU, 1013 .type = TEGRA_ICC_NISO, 1014 }, { 1015 .id = TEGRA234_MEMORY_CLIENT_NVL1W, 1016 .name = "nvl1w", 1017 .bpmp_id = TEGRA_ICC_BPMP_GPU, 1018 .type = TEGRA_ICC_NISO, 1019 }, 1020 }; 1021 1022 /* 1023 * tegra234_mc_icc_set() - Pass MC client info to the BPMP-FW 1024 * @src: ICC node for Memory Controller's (MC) Client 1025 * @dst: ICC node for Memory Controller (MC) 1026 * 1027 * Passing the current request info from the MC to the BPMP-FW where 1028 * LA and PTSA registers are accessed and the final EMC freq is set 1029 * based on client_id, type, latency and bandwidth. 1030 * icc_set_bw() makes set_bw calls for both MC and EMC providers in 1031 * sequence. Both the calls are protected by 'mutex_lock(&icc_lock)'. 1032 * So, the data passed won't be updated by concurrent set calls from 1033 * other clients. 1034 */ 1035 static int tegra234_mc_icc_set(struct icc_node *src, struct icc_node *dst) 1036 { 1037 struct tegra_mc *mc = icc_provider_to_tegra_mc(dst->provider); 1038 struct mrq_bwmgr_int_request bwmgr_req = { 0 }; 1039 struct mrq_bwmgr_int_response bwmgr_resp = { 0 }; 1040 const struct tegra_mc_client *pclient = src->data; 1041 struct tegra_bpmp_message msg; 1042 int ret; 1043 1044 /* 1045 * Same Src and Dst node will happen during boot from icc_node_add(). 1046 * This can be used to pre-initialize and set bandwidth for all clients 1047 * before their drivers are loaded. We are skipping this case as for us, 1048 * the pre-initialization already happened in Bootloader(MB2) and BPMP-FW. 1049 */ 1050 if (src->id == dst->id) 1051 return 0; 1052 1053 if (!mc->bwmgr_mrq_supported) 1054 return 0; 1055 1056 if (!mc->bpmp) { 1057 dev_err(mc->dev, "BPMP reference NULL\n"); 1058 return -ENOENT; 1059 } 1060 1061 if (pclient->type == TEGRA_ICC_NISO) 1062 bwmgr_req.bwmgr_calc_set_req.niso_bw = src->avg_bw; 1063 else 1064 bwmgr_req.bwmgr_calc_set_req.iso_bw = src->avg_bw; 1065 1066 bwmgr_req.bwmgr_calc_set_req.client_id = pclient->bpmp_id; 1067 1068 bwmgr_req.cmd = CMD_BWMGR_INT_CALC_AND_SET; 1069 bwmgr_req.bwmgr_calc_set_req.mc_floor = src->peak_bw; 1070 bwmgr_req.bwmgr_calc_set_req.floor_unit = BWMGR_INT_UNIT_KBPS; 1071 1072 memset(&msg, 0, sizeof(msg)); 1073 msg.mrq = MRQ_BWMGR_INT; 1074 msg.tx.data = &bwmgr_req; 1075 msg.tx.size = sizeof(bwmgr_req); 1076 msg.rx.data = &bwmgr_resp; 1077 msg.rx.size = sizeof(bwmgr_resp); 1078 1079 if (pclient->bpmp_id >= TEGRA_ICC_BPMP_CPU_CLUSTER0 && 1080 pclient->bpmp_id <= TEGRA_ICC_BPMP_CPU_CLUSTER2) 1081 msg.flags = TEGRA_BPMP_MESSAGE_RESET; 1082 1083 ret = tegra_bpmp_transfer(mc->bpmp, &msg); 1084 if (ret < 0) { 1085 dev_err(mc->dev, "BPMP transfer failed: %d\n", ret); 1086 goto error; 1087 } 1088 if (msg.rx.ret < 0) { 1089 pr_err("failed to set bandwidth for %u: %d\n", 1090 bwmgr_req.bwmgr_calc_set_req.client_id, msg.rx.ret); 1091 ret = -EINVAL; 1092 } 1093 1094 error: 1095 return ret; 1096 } 1097 1098 static int tegra234_mc_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, 1099 u32 peak_bw, u32 *agg_avg, u32 *agg_peak) 1100 { 1101 struct icc_provider *p = node->provider; 1102 struct tegra_mc *mc = icc_provider_to_tegra_mc(p); 1103 1104 if (!mc->bwmgr_mrq_supported) 1105 return 0; 1106 1107 if (node->id == TEGRA_ICC_MC_CPU_CLUSTER0 || 1108 node->id == TEGRA_ICC_MC_CPU_CLUSTER1 || 1109 node->id == TEGRA_ICC_MC_CPU_CLUSTER2) { 1110 if (mc) 1111 peak_bw = peak_bw * mc->num_channels; 1112 } 1113 1114 *agg_avg += avg_bw; 1115 *agg_peak = max(*agg_peak, peak_bw); 1116 1117 return 0; 1118 } 1119 1120 static int tegra234_mc_icc_get_init_bw(struct icc_node *node, u32 *avg, u32 *peak) 1121 { 1122 *avg = 0; 1123 *peak = 0; 1124 1125 return 0; 1126 } 1127 1128 static const struct tegra_mc_icc_ops tegra234_mc_icc_ops = { 1129 .xlate = tegra_mc_icc_xlate, 1130 .aggregate = tegra234_mc_icc_aggregate, 1131 .get_bw = tegra234_mc_icc_get_init_bw, 1132 .set = tegra234_mc_icc_set, 1133 }; 1134 1135 const struct tegra_mc_soc tegra234_mc_soc = { 1136 .num_clients = ARRAY_SIZE(tegra234_mc_clients), 1137 .clients = tegra234_mc_clients, 1138 .num_address_bits = 40, 1139 .num_channels = 16, 1140 .client_id_mask = 0x1ff, 1141 .intmask = MC_INT_DECERR_ROUTE_SANITY | 1142 MC_INT_DECERR_GENERALIZED_CARVEOUT | MC_INT_DECERR_MTS | 1143 MC_INT_SECERR_SEC | MC_INT_DECERR_VPR | 1144 MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM, 1145 .has_addr_hi_reg = true, 1146 .ops = &tegra186_mc_ops, 1147 .icc_ops = &tegra234_mc_icc_ops, 1148 .ch_intmask = 0x0000ff00, 1149 .global_intstatus_channel_shift = 8, 1150 /* 1151 * Additionally, there are lite carveouts but those are not currently 1152 * supported. 1153 */ 1154 .num_carveouts = 32, 1155 }; 1156