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