1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2017-2021 NVIDIA CORPORATION. All rights reserved. 4 */ 5 6 #include <linux/io.h> 7 #include <linux/iommu.h> 8 #include <linux/module.h> 9 #include <linux/mod_devicetable.h> 10 #include <linux/of.h> 11 #include <linux/of_platform.h> 12 #include <linux/platform_device.h> 13 14 #include <soc/tegra/mc.h> 15 16 #if defined(CONFIG_ARCH_TEGRA_186_SOC) 17 #include <dt-bindings/memory/tegra186-mc.h> 18 #endif 19 20 #include "mc.h" 21 22 #define MC_SID_STREAMID_OVERRIDE_MASK GENMASK(7, 0) 23 #define MC_SID_STREAMID_SECURITY_WRITE_ACCESS_DISABLED BIT(16) 24 #define MC_SID_STREAMID_SECURITY_OVERRIDE BIT(8) 25 26 static int tegra186_mc_probe(struct tegra_mc *mc) 27 { 28 struct platform_device *pdev = to_platform_device(mc->dev); 29 unsigned int i; 30 char name[8]; 31 int err; 32 33 mc->bcast_ch_regs = devm_platform_ioremap_resource_byname(pdev, "broadcast"); 34 if (IS_ERR(mc->bcast_ch_regs)) { 35 if (PTR_ERR(mc->bcast_ch_regs) == -EINVAL) { 36 dev_warn(&pdev->dev, 37 "Broadcast channel is missing, please update your device-tree\n"); 38 mc->bcast_ch_regs = NULL; 39 goto populate; 40 } 41 42 return PTR_ERR(mc->bcast_ch_regs); 43 } 44 45 mc->ch_regs = devm_kcalloc(mc->dev, mc->soc->num_channels, sizeof(*mc->ch_regs), 46 GFP_KERNEL); 47 if (!mc->ch_regs) 48 return -ENOMEM; 49 50 for (i = 0; i < mc->soc->num_channels; i++) { 51 snprintf(name, sizeof(name), "ch%u", i); 52 53 mc->ch_regs[i] = devm_platform_ioremap_resource_byname(pdev, name); 54 if (IS_ERR(mc->ch_regs[i])) 55 return PTR_ERR(mc->ch_regs[i]); 56 } 57 58 populate: 59 err = of_platform_populate(mc->dev->of_node, NULL, NULL, mc->dev); 60 if (err < 0) 61 return err; 62 63 return 0; 64 } 65 66 static void tegra186_mc_remove(struct tegra_mc *mc) 67 { 68 of_platform_depopulate(mc->dev); 69 } 70 71 #if IS_ENABLED(CONFIG_IOMMU_API) 72 static void tegra186_mc_client_sid_override(struct tegra_mc *mc, 73 const struct tegra_mc_client *client, 74 unsigned int sid) 75 { 76 u32 value, old; 77 78 if (client->regs.sid.security == 0 && client->regs.sid.override == 0) 79 return; 80 81 value = readl(mc->regs + client->regs.sid.security); 82 if ((value & MC_SID_STREAMID_SECURITY_OVERRIDE) == 0) { 83 /* 84 * If the secure firmware has locked this down the override 85 * for this memory client, there's nothing we can do here. 86 */ 87 if (value & MC_SID_STREAMID_SECURITY_WRITE_ACCESS_DISABLED) 88 return; 89 90 /* 91 * Otherwise, try to set the override itself. Typically the 92 * secure firmware will never have set this configuration. 93 * Instead, it will either have disabled write access to 94 * this field, or it will already have set an explicit 95 * override itself. 96 */ 97 WARN_ON((value & MC_SID_STREAMID_SECURITY_OVERRIDE) == 0); 98 99 value |= MC_SID_STREAMID_SECURITY_OVERRIDE; 100 writel(value, mc->regs + client->regs.sid.security); 101 } 102 103 value = readl(mc->regs + client->regs.sid.override); 104 old = value & MC_SID_STREAMID_OVERRIDE_MASK; 105 106 if (old != sid) { 107 dev_dbg(mc->dev, "overriding SID %x for %s with %x\n", old, 108 client->name, sid); 109 writel(sid, mc->regs + client->regs.sid.override); 110 } 111 } 112 #endif 113 114 static int tegra186_mc_probe_device(struct tegra_mc *mc, struct device *dev) 115 { 116 #if IS_ENABLED(CONFIG_IOMMU_API) 117 struct of_phandle_args args; 118 unsigned int i, index = 0; 119 u32 sid; 120 121 if (!tegra_dev_iommu_get_stream_id(dev, &sid)) 122 return 0; 123 124 while (!of_parse_phandle_with_args(dev->of_node, "interconnects", "#interconnect-cells", 125 index, &args)) { 126 if (args.np == mc->dev->of_node && args.args_count != 0) { 127 for (i = 0; i < mc->soc->num_clients; i++) { 128 const struct tegra_mc_client *client = &mc->soc->clients[i]; 129 130 if (client->id == args.args[0]) 131 tegra186_mc_client_sid_override( 132 mc, client, 133 sid & MC_SID_STREAMID_OVERRIDE_MASK); 134 } 135 } 136 137 index++; 138 } 139 #endif 140 141 return 0; 142 } 143 144 static int tegra186_mc_resume(struct tegra_mc *mc) 145 { 146 #if IS_ENABLED(CONFIG_IOMMU_API) 147 unsigned int i; 148 149 for (i = 0; i < mc->soc->num_clients; i++) { 150 const struct tegra_mc_client *client = &mc->soc->clients[i]; 151 152 tegra186_mc_client_sid_override(mc, client, client->sid); 153 } 154 #endif 155 156 return 0; 157 } 158 159 const struct tegra_mc_ops tegra186_mc_ops = { 160 .probe = tegra186_mc_probe, 161 .remove = tegra186_mc_remove, 162 .resume = tegra186_mc_resume, 163 .probe_device = tegra186_mc_probe_device, 164 .handle_irq = tegra30_mc_handle_irq, 165 }; 166 167 #if defined(CONFIG_ARCH_TEGRA_186_SOC) 168 static const struct tegra_mc_client tegra186_mc_clients[] = { 169 { 170 .id = TEGRA186_MEMORY_CLIENT_PTCR, 171 .name = "ptcr", 172 .sid = TEGRA186_SID_PASSTHROUGH, 173 .regs = { 174 .sid = { 175 .override = 0x000, 176 .security = 0x004, 177 }, 178 }, 179 }, { 180 .id = TEGRA186_MEMORY_CLIENT_AFIR, 181 .name = "afir", 182 .sid = TEGRA186_SID_AFI, 183 .regs = { 184 .sid = { 185 .override = 0x070, 186 .security = 0x074, 187 }, 188 }, 189 }, { 190 .id = TEGRA186_MEMORY_CLIENT_HDAR, 191 .name = "hdar", 192 .sid = TEGRA186_SID_HDA, 193 .regs = { 194 .sid = { 195 .override = 0x0a8, 196 .security = 0x0ac, 197 }, 198 }, 199 }, { 200 .id = TEGRA186_MEMORY_CLIENT_HOST1XDMAR, 201 .name = "host1xdmar", 202 .sid = TEGRA186_SID_HOST1X, 203 .regs = { 204 .sid = { 205 .override = 0x0b0, 206 .security = 0x0b4, 207 }, 208 }, 209 }, { 210 .id = TEGRA186_MEMORY_CLIENT_NVENCSRD, 211 .name = "nvencsrd", 212 .sid = TEGRA186_SID_NVENC, 213 .regs = { 214 .sid = { 215 .override = 0x0e0, 216 .security = 0x0e4, 217 }, 218 }, 219 }, { 220 .id = TEGRA186_MEMORY_CLIENT_SATAR, 221 .name = "satar", 222 .sid = TEGRA186_SID_SATA, 223 .regs = { 224 .sid = { 225 .override = 0x0f8, 226 .security = 0x0fc, 227 }, 228 }, 229 }, { 230 .id = TEGRA186_MEMORY_CLIENT_MPCORER, 231 .name = "mpcorer", 232 .sid = TEGRA186_SID_PASSTHROUGH, 233 .regs = { 234 .sid = { 235 .override = 0x138, 236 .security = 0x13c, 237 }, 238 }, 239 }, { 240 .id = TEGRA186_MEMORY_CLIENT_NVENCSWR, 241 .name = "nvencswr", 242 .sid = TEGRA186_SID_NVENC, 243 .regs = { 244 .sid = { 245 .override = 0x158, 246 .security = 0x15c, 247 }, 248 }, 249 }, { 250 .id = TEGRA186_MEMORY_CLIENT_AFIW, 251 .name = "afiw", 252 .sid = TEGRA186_SID_AFI, 253 .regs = { 254 .sid = { 255 .override = 0x188, 256 .security = 0x18c, 257 }, 258 }, 259 }, { 260 .id = TEGRA186_MEMORY_CLIENT_HDAW, 261 .name = "hdaw", 262 .sid = TEGRA186_SID_HDA, 263 .regs = { 264 .sid = { 265 .override = 0x1a8, 266 .security = 0x1ac, 267 }, 268 }, 269 }, { 270 .id = TEGRA186_MEMORY_CLIENT_MPCOREW, 271 .name = "mpcorew", 272 .sid = TEGRA186_SID_PASSTHROUGH, 273 .regs = { 274 .sid = { 275 .override = 0x1c8, 276 .security = 0x1cc, 277 }, 278 }, 279 }, { 280 .id = TEGRA186_MEMORY_CLIENT_SATAW, 281 .name = "sataw", 282 .sid = TEGRA186_SID_SATA, 283 .regs = { 284 .sid = { 285 .override = 0x1e8, 286 .security = 0x1ec, 287 }, 288 }, 289 }, { 290 .id = TEGRA186_MEMORY_CLIENT_ISPRA, 291 .name = "ispra", 292 .sid = TEGRA186_SID_ISP, 293 .regs = { 294 .sid = { 295 .override = 0x220, 296 .security = 0x224, 297 }, 298 }, 299 }, { 300 .id = TEGRA186_MEMORY_CLIENT_ISPWA, 301 .name = "ispwa", 302 .sid = TEGRA186_SID_ISP, 303 .regs = { 304 .sid = { 305 .override = 0x230, 306 .security = 0x234, 307 }, 308 }, 309 }, { 310 .id = TEGRA186_MEMORY_CLIENT_ISPWB, 311 .name = "ispwb", 312 .sid = TEGRA186_SID_ISP, 313 .regs = { 314 .sid = { 315 .override = 0x238, 316 .security = 0x23c, 317 }, 318 }, 319 }, { 320 .id = TEGRA186_MEMORY_CLIENT_XUSB_HOSTR, 321 .name = "xusb_hostr", 322 .sid = TEGRA186_SID_XUSB_HOST, 323 .regs = { 324 .sid = { 325 .override = 0x250, 326 .security = 0x254, 327 }, 328 }, 329 }, { 330 .id = TEGRA186_MEMORY_CLIENT_XUSB_HOSTW, 331 .name = "xusb_hostw", 332 .sid = TEGRA186_SID_XUSB_HOST, 333 .regs = { 334 .sid = { 335 .override = 0x258, 336 .security = 0x25c, 337 }, 338 }, 339 }, { 340 .id = TEGRA186_MEMORY_CLIENT_XUSB_DEVR, 341 .name = "xusb_devr", 342 .sid = TEGRA186_SID_XUSB_DEV, 343 .regs = { 344 .sid = { 345 .override = 0x260, 346 .security = 0x264, 347 }, 348 }, 349 }, { 350 .id = TEGRA186_MEMORY_CLIENT_XUSB_DEVW, 351 .name = "xusb_devw", 352 .sid = TEGRA186_SID_XUSB_DEV, 353 .regs = { 354 .sid = { 355 .override = 0x268, 356 .security = 0x26c, 357 }, 358 }, 359 }, { 360 .id = TEGRA186_MEMORY_CLIENT_TSECSRD, 361 .name = "tsecsrd", 362 .sid = TEGRA186_SID_TSEC, 363 .regs = { 364 .sid = { 365 .override = 0x2a0, 366 .security = 0x2a4, 367 }, 368 }, 369 }, { 370 .id = TEGRA186_MEMORY_CLIENT_TSECSWR, 371 .name = "tsecswr", 372 .sid = TEGRA186_SID_TSEC, 373 .regs = { 374 .sid = { 375 .override = 0x2a8, 376 .security = 0x2ac, 377 }, 378 }, 379 }, { 380 .id = TEGRA186_MEMORY_CLIENT_GPUSRD, 381 .name = "gpusrd", 382 .sid = TEGRA186_SID_GPU, 383 .regs = { 384 .sid = { 385 .override = 0x2c0, 386 .security = 0x2c4, 387 }, 388 }, 389 }, { 390 .id = TEGRA186_MEMORY_CLIENT_GPUSWR, 391 .name = "gpuswr", 392 .sid = TEGRA186_SID_GPU, 393 .regs = { 394 .sid = { 395 .override = 0x2c8, 396 .security = 0x2cc, 397 }, 398 }, 399 }, { 400 .id = TEGRA186_MEMORY_CLIENT_SDMMCRA, 401 .name = "sdmmcra", 402 .sid = TEGRA186_SID_SDMMC1, 403 .regs = { 404 .sid = { 405 .override = 0x300, 406 .security = 0x304, 407 }, 408 }, 409 }, { 410 .id = TEGRA186_MEMORY_CLIENT_SDMMCRAA, 411 .name = "sdmmcraa", 412 .sid = TEGRA186_SID_SDMMC2, 413 .regs = { 414 .sid = { 415 .override = 0x308, 416 .security = 0x30c, 417 }, 418 }, 419 }, { 420 .id = TEGRA186_MEMORY_CLIENT_SDMMCR, 421 .name = "sdmmcr", 422 .sid = TEGRA186_SID_SDMMC3, 423 .regs = { 424 .sid = { 425 .override = 0x310, 426 .security = 0x314, 427 }, 428 }, 429 }, { 430 .id = TEGRA186_MEMORY_CLIENT_SDMMCRAB, 431 .name = "sdmmcrab", 432 .sid = TEGRA186_SID_SDMMC4, 433 .regs = { 434 .sid = { 435 .override = 0x318, 436 .security = 0x31c, 437 }, 438 }, 439 }, { 440 .id = TEGRA186_MEMORY_CLIENT_SDMMCWA, 441 .name = "sdmmcwa", 442 .sid = TEGRA186_SID_SDMMC1, 443 .regs = { 444 .sid = { 445 .override = 0x320, 446 .security = 0x324, 447 }, 448 }, 449 }, { 450 .id = TEGRA186_MEMORY_CLIENT_SDMMCWAA, 451 .name = "sdmmcwaa", 452 .sid = TEGRA186_SID_SDMMC2, 453 .regs = { 454 .sid = { 455 .override = 0x328, 456 .security = 0x32c, 457 }, 458 }, 459 }, { 460 .id = TEGRA186_MEMORY_CLIENT_SDMMCW, 461 .name = "sdmmcw", 462 .sid = TEGRA186_SID_SDMMC3, 463 .regs = { 464 .sid = { 465 .override = 0x330, 466 .security = 0x334, 467 }, 468 }, 469 }, { 470 .id = TEGRA186_MEMORY_CLIENT_SDMMCWAB, 471 .name = "sdmmcwab", 472 .sid = TEGRA186_SID_SDMMC4, 473 .regs = { 474 .sid = { 475 .override = 0x338, 476 .security = 0x33c, 477 }, 478 }, 479 }, { 480 .id = TEGRA186_MEMORY_CLIENT_VICSRD, 481 .name = "vicsrd", 482 .sid = TEGRA186_SID_VIC, 483 .regs = { 484 .sid = { 485 .override = 0x360, 486 .security = 0x364, 487 }, 488 }, 489 }, { 490 .id = TEGRA186_MEMORY_CLIENT_VICSWR, 491 .name = "vicswr", 492 .sid = TEGRA186_SID_VIC, 493 .regs = { 494 .sid = { 495 .override = 0x368, 496 .security = 0x36c, 497 }, 498 }, 499 }, { 500 .id = TEGRA186_MEMORY_CLIENT_VIW, 501 .name = "viw", 502 .sid = TEGRA186_SID_VI, 503 .regs = { 504 .sid = { 505 .override = 0x390, 506 .security = 0x394, 507 }, 508 }, 509 }, { 510 .id = TEGRA186_MEMORY_CLIENT_NVDECSRD, 511 .name = "nvdecsrd", 512 .sid = TEGRA186_SID_NVDEC, 513 .regs = { 514 .sid = { 515 .override = 0x3c0, 516 .security = 0x3c4, 517 }, 518 }, 519 }, { 520 .id = TEGRA186_MEMORY_CLIENT_NVDECSWR, 521 .name = "nvdecswr", 522 .sid = TEGRA186_SID_NVDEC, 523 .regs = { 524 .sid = { 525 .override = 0x3c8, 526 .security = 0x3cc, 527 }, 528 }, 529 }, { 530 .id = TEGRA186_MEMORY_CLIENT_APER, 531 .name = "aper", 532 .sid = TEGRA186_SID_APE, 533 .regs = { 534 .sid = { 535 .override = 0x3d0, 536 .security = 0x3d4, 537 }, 538 }, 539 }, { 540 .id = TEGRA186_MEMORY_CLIENT_APEW, 541 .name = "apew", 542 .sid = TEGRA186_SID_APE, 543 .regs = { 544 .sid = { 545 .override = 0x3d8, 546 .security = 0x3dc, 547 }, 548 }, 549 }, { 550 .id = TEGRA186_MEMORY_CLIENT_NVJPGSRD, 551 .name = "nvjpgsrd", 552 .sid = TEGRA186_SID_NVJPG, 553 .regs = { 554 .sid = { 555 .override = 0x3f0, 556 .security = 0x3f4, 557 }, 558 }, 559 }, { 560 .id = TEGRA186_MEMORY_CLIENT_NVJPGSWR, 561 .name = "nvjpgswr", 562 .sid = TEGRA186_SID_NVJPG, 563 .regs = { 564 .sid = { 565 .override = 0x3f8, 566 .security = 0x3fc, 567 }, 568 }, 569 }, { 570 .id = TEGRA186_MEMORY_CLIENT_SESRD, 571 .name = "sesrd", 572 .sid = TEGRA186_SID_SE, 573 .regs = { 574 .sid = { 575 .override = 0x400, 576 .security = 0x404, 577 }, 578 }, 579 }, { 580 .id = TEGRA186_MEMORY_CLIENT_SESWR, 581 .name = "seswr", 582 .sid = TEGRA186_SID_SE, 583 .regs = { 584 .sid = { 585 .override = 0x408, 586 .security = 0x40c, 587 }, 588 }, 589 }, { 590 .id = TEGRA186_MEMORY_CLIENT_ETRR, 591 .name = "etrr", 592 .sid = TEGRA186_SID_ETR, 593 .regs = { 594 .sid = { 595 .override = 0x420, 596 .security = 0x424, 597 }, 598 }, 599 }, { 600 .id = TEGRA186_MEMORY_CLIENT_ETRW, 601 .name = "etrw", 602 .sid = TEGRA186_SID_ETR, 603 .regs = { 604 .sid = { 605 .override = 0x428, 606 .security = 0x42c, 607 }, 608 }, 609 }, { 610 .id = TEGRA186_MEMORY_CLIENT_TSECSRDB, 611 .name = "tsecsrdb", 612 .sid = TEGRA186_SID_TSECB, 613 .regs = { 614 .sid = { 615 .override = 0x430, 616 .security = 0x434, 617 }, 618 }, 619 }, { 620 .id = TEGRA186_MEMORY_CLIENT_TSECSWRB, 621 .name = "tsecswrb", 622 .sid = TEGRA186_SID_TSECB, 623 .regs = { 624 .sid = { 625 .override = 0x438, 626 .security = 0x43c, 627 }, 628 }, 629 }, { 630 .id = TEGRA186_MEMORY_CLIENT_GPUSRD2, 631 .name = "gpusrd2", 632 .sid = TEGRA186_SID_GPU, 633 .regs = { 634 .sid = { 635 .override = 0x440, 636 .security = 0x444, 637 }, 638 }, 639 }, { 640 .id = TEGRA186_MEMORY_CLIENT_GPUSWR2, 641 .name = "gpuswr2", 642 .sid = TEGRA186_SID_GPU, 643 .regs = { 644 .sid = { 645 .override = 0x448, 646 .security = 0x44c, 647 }, 648 }, 649 }, { 650 .id = TEGRA186_MEMORY_CLIENT_AXISR, 651 .name = "axisr", 652 .sid = TEGRA186_SID_GPCDMA_0, 653 .regs = { 654 .sid = { 655 .override = 0x460, 656 .security = 0x464, 657 }, 658 }, 659 }, { 660 .id = TEGRA186_MEMORY_CLIENT_AXISW, 661 .name = "axisw", 662 .sid = TEGRA186_SID_GPCDMA_0, 663 .regs = { 664 .sid = { 665 .override = 0x468, 666 .security = 0x46c, 667 }, 668 }, 669 }, { 670 .id = TEGRA186_MEMORY_CLIENT_EQOSR, 671 .name = "eqosr", 672 .sid = TEGRA186_SID_EQOS, 673 .regs = { 674 .sid = { 675 .override = 0x470, 676 .security = 0x474, 677 }, 678 }, 679 }, { 680 .id = TEGRA186_MEMORY_CLIENT_EQOSW, 681 .name = "eqosw", 682 .sid = TEGRA186_SID_EQOS, 683 .regs = { 684 .sid = { 685 .override = 0x478, 686 .security = 0x47c, 687 }, 688 }, 689 }, { 690 .id = TEGRA186_MEMORY_CLIENT_UFSHCR, 691 .name = "ufshcr", 692 .sid = TEGRA186_SID_UFSHC, 693 .regs = { 694 .sid = { 695 .override = 0x480, 696 .security = 0x484, 697 }, 698 }, 699 }, { 700 .id = TEGRA186_MEMORY_CLIENT_UFSHCW, 701 .name = "ufshcw", 702 .sid = TEGRA186_SID_UFSHC, 703 .regs = { 704 .sid = { 705 .override = 0x488, 706 .security = 0x48c, 707 }, 708 }, 709 }, { 710 .id = TEGRA186_MEMORY_CLIENT_NVDISPLAYR, 711 .name = "nvdisplayr", 712 .sid = TEGRA186_SID_NVDISPLAY, 713 .regs = { 714 .sid = { 715 .override = 0x490, 716 .security = 0x494, 717 }, 718 }, 719 }, { 720 .id = TEGRA186_MEMORY_CLIENT_BPMPR, 721 .name = "bpmpr", 722 .sid = TEGRA186_SID_BPMP, 723 .regs = { 724 .sid = { 725 .override = 0x498, 726 .security = 0x49c, 727 }, 728 }, 729 }, { 730 .id = TEGRA186_MEMORY_CLIENT_BPMPW, 731 .name = "bpmpw", 732 .sid = TEGRA186_SID_BPMP, 733 .regs = { 734 .sid = { 735 .override = 0x4a0, 736 .security = 0x4a4, 737 }, 738 }, 739 }, { 740 .id = TEGRA186_MEMORY_CLIENT_BPMPDMAR, 741 .name = "bpmpdmar", 742 .sid = TEGRA186_SID_BPMP, 743 .regs = { 744 .sid = { 745 .override = 0x4a8, 746 .security = 0x4ac, 747 }, 748 }, 749 }, { 750 .id = TEGRA186_MEMORY_CLIENT_BPMPDMAW, 751 .name = "bpmpdmaw", 752 .sid = TEGRA186_SID_BPMP, 753 .regs = { 754 .sid = { 755 .override = 0x4b0, 756 .security = 0x4b4, 757 }, 758 }, 759 }, { 760 .id = TEGRA186_MEMORY_CLIENT_AONR, 761 .name = "aonr", 762 .sid = TEGRA186_SID_AON, 763 .regs = { 764 .sid = { 765 .override = 0x4b8, 766 .security = 0x4bc, 767 }, 768 }, 769 }, { 770 .id = TEGRA186_MEMORY_CLIENT_AONW, 771 .name = "aonw", 772 .sid = TEGRA186_SID_AON, 773 .regs = { 774 .sid = { 775 .override = 0x4c0, 776 .security = 0x4c4, 777 }, 778 }, 779 }, { 780 .id = TEGRA186_MEMORY_CLIENT_AONDMAR, 781 .name = "aondmar", 782 .sid = TEGRA186_SID_AON, 783 .regs = { 784 .sid = { 785 .override = 0x4c8, 786 .security = 0x4cc, 787 }, 788 }, 789 }, { 790 .id = TEGRA186_MEMORY_CLIENT_AONDMAW, 791 .name = "aondmaw", 792 .sid = TEGRA186_SID_AON, 793 .regs = { 794 .sid = { 795 .override = 0x4d0, 796 .security = 0x4d4, 797 }, 798 }, 799 }, { 800 .id = TEGRA186_MEMORY_CLIENT_SCER, 801 .name = "scer", 802 .sid = TEGRA186_SID_SCE, 803 .regs = { 804 .sid = { 805 .override = 0x4d8, 806 .security = 0x4dc, 807 }, 808 }, 809 }, { 810 .id = TEGRA186_MEMORY_CLIENT_SCEW, 811 .name = "scew", 812 .sid = TEGRA186_SID_SCE, 813 .regs = { 814 .sid = { 815 .override = 0x4e0, 816 .security = 0x4e4, 817 }, 818 }, 819 }, { 820 .id = TEGRA186_MEMORY_CLIENT_SCEDMAR, 821 .name = "scedmar", 822 .sid = TEGRA186_SID_SCE, 823 .regs = { 824 .sid = { 825 .override = 0x4e8, 826 .security = 0x4ec, 827 }, 828 }, 829 }, { 830 .id = TEGRA186_MEMORY_CLIENT_SCEDMAW, 831 .name = "scedmaw", 832 .sid = TEGRA186_SID_SCE, 833 .regs = { 834 .sid = { 835 .override = 0x4f0, 836 .security = 0x4f4, 837 }, 838 }, 839 }, { 840 .id = TEGRA186_MEMORY_CLIENT_APEDMAR, 841 .name = "apedmar", 842 .sid = TEGRA186_SID_APE, 843 .regs = { 844 .sid = { 845 .override = 0x4f8, 846 .security = 0x4fc, 847 }, 848 }, 849 }, { 850 .id = TEGRA186_MEMORY_CLIENT_APEDMAW, 851 .name = "apedmaw", 852 .sid = TEGRA186_SID_APE, 853 .regs = { 854 .sid = { 855 .override = 0x500, 856 .security = 0x504, 857 }, 858 }, 859 }, { 860 .id = TEGRA186_MEMORY_CLIENT_NVDISPLAYR1, 861 .name = "nvdisplayr1", 862 .sid = TEGRA186_SID_NVDISPLAY, 863 .regs = { 864 .sid = { 865 .override = 0x508, 866 .security = 0x50c, 867 }, 868 }, 869 }, { 870 .id = TEGRA186_MEMORY_CLIENT_VICSRD1, 871 .name = "vicsrd1", 872 .sid = TEGRA186_SID_VIC, 873 .regs = { 874 .sid = { 875 .override = 0x510, 876 .security = 0x514, 877 }, 878 }, 879 }, { 880 .id = TEGRA186_MEMORY_CLIENT_NVDECSRD1, 881 .name = "nvdecsrd1", 882 .sid = TEGRA186_SID_NVDEC, 883 .regs = { 884 .sid = { 885 .override = 0x518, 886 .security = 0x51c, 887 }, 888 }, 889 }, 890 }; 891 892 const struct tegra_mc_soc tegra186_mc_soc = { 893 .num_clients = ARRAY_SIZE(tegra186_mc_clients), 894 .clients = tegra186_mc_clients, 895 .num_address_bits = 40, 896 .num_channels = 4, 897 .client_id_mask = 0xff, 898 .intmask = MC_INT_DECERR_GENERALIZED_CARVEOUT | MC_INT_DECERR_MTS | 899 MC_INT_SECERR_SEC | MC_INT_DECERR_VPR | 900 MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM, 901 .ops = &tegra186_mc_ops, 902 .ch_intmask = 0x0000000f, 903 .global_intstatus_channel_shift = 0, 904 }; 905 #endif 906