linux/drivers/memory/tegra/tegra186.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) 2017 NVIDIA CORPORATION.  All rights reserved.
   4 */
   5
   6#include <linux/io.h>
   7#include <linux/module.h>
   8#include <linux/mod_devicetable.h>
   9#include <linux/platform_device.h>
  10
  11#include <dt-bindings/memory/tegra186-mc.h>
  12
  13struct tegra_mc {
  14        struct device *dev;
  15        void __iomem *regs;
  16};
  17
  18struct tegra_mc_client {
  19        const char *name;
  20        unsigned int sid;
  21        struct {
  22                unsigned int override;
  23                unsigned int security;
  24        } regs;
  25};
  26
  27static const struct tegra_mc_client tegra186_mc_clients[] = {
  28        {
  29                .name = "ptcr",
  30                .sid = TEGRA186_SID_PASSTHROUGH,
  31                .regs = {
  32                        .override = 0x000,
  33                        .security = 0x004,
  34                },
  35        }, {
  36                .name = "afir",
  37                .sid = TEGRA186_SID_AFI,
  38                .regs = {
  39                        .override = 0x070,
  40                        .security = 0x074,
  41                },
  42        }, {
  43                .name = "hdar",
  44                .sid = TEGRA186_SID_HDA,
  45                .regs = {
  46                        .override = 0x0a8,
  47                        .security = 0x0ac,
  48                },
  49        }, {
  50                .name = "host1xdmar",
  51                .sid = TEGRA186_SID_HOST1X,
  52                .regs = {
  53                        .override = 0x0b0,
  54                        .security = 0x0b4,
  55                },
  56        }, {
  57                .name = "nvencsrd",
  58                .sid = TEGRA186_SID_NVENC,
  59                .regs = {
  60                        .override = 0x0e0,
  61                        .security = 0x0e4,
  62                },
  63        }, {
  64                .name = "satar",
  65                .sid = TEGRA186_SID_SATA,
  66                .regs = {
  67                        .override = 0x0f8,
  68                        .security = 0x0fc,
  69                },
  70        }, {
  71                .name = "mpcorer",
  72                .sid = TEGRA186_SID_PASSTHROUGH,
  73                .regs = {
  74                        .override = 0x138,
  75                        .security = 0x13c,
  76                },
  77        }, {
  78                .name = "nvencswr",
  79                .sid = TEGRA186_SID_NVENC,
  80                .regs = {
  81                        .override = 0x158,
  82                        .security = 0x15c,
  83                },
  84        }, {
  85                .name = "afiw",
  86                .sid = TEGRA186_SID_AFI,
  87                .regs = {
  88                        .override = 0x188,
  89                        .security = 0x18c,
  90                },
  91        }, {
  92                .name = "hdaw",
  93                .sid = TEGRA186_SID_HDA,
  94                .regs = {
  95                        .override = 0x1a8,
  96                        .security = 0x1ac,
  97                },
  98        }, {
  99                .name = "mpcorew",
 100                .sid = TEGRA186_SID_PASSTHROUGH,
 101                .regs = {
 102                        .override = 0x1c8,
 103                        .security = 0x1cc,
 104                },
 105        }, {
 106                .name = "sataw",
 107                .sid = TEGRA186_SID_SATA,
 108                .regs = {
 109                        .override = 0x1e8,
 110                        .security = 0x1ec,
 111                },
 112        }, {
 113                .name = "ispra",
 114                .sid = TEGRA186_SID_ISP,
 115                .regs = {
 116                        .override = 0x220,
 117                        .security = 0x224,
 118                },
 119        }, {
 120                .name = "ispwa",
 121                .sid = TEGRA186_SID_ISP,
 122                .regs = {
 123                        .override = 0x230,
 124                        .security = 0x234,
 125                },
 126        }, {
 127                .name = "ispwb",
 128                .sid = TEGRA186_SID_ISP,
 129                .regs = {
 130                        .override = 0x238,
 131                        .security = 0x23c,
 132                },
 133        }, {
 134                .name = "xusb_hostr",
 135                .sid = TEGRA186_SID_XUSB_HOST,
 136                .regs = {
 137                        .override = 0x250,
 138                        .security = 0x254,
 139                },
 140        }, {
 141                .name = "xusb_hostw",
 142                .sid = TEGRA186_SID_XUSB_HOST,
 143                .regs = {
 144                        .override = 0x258,
 145                        .security = 0x25c,
 146                },
 147        }, {
 148                .name = "xusb_devr",
 149                .sid = TEGRA186_SID_XUSB_DEV,
 150                .regs = {
 151                        .override = 0x260,
 152                        .security = 0x264,
 153                },
 154        }, {
 155                .name = "xusb_devw",
 156                .sid = TEGRA186_SID_XUSB_DEV,
 157                .regs = {
 158                        .override = 0x268,
 159                        .security = 0x26c,
 160                },
 161        }, {
 162                .name = "tsecsrd",
 163                .sid = TEGRA186_SID_TSEC,
 164                .regs = {
 165                        .override = 0x2a0,
 166                        .security = 0x2a4,
 167                },
 168        }, {
 169                .name = "tsecswr",
 170                .sid = TEGRA186_SID_TSEC,
 171                .regs = {
 172                        .override = 0x2a8,
 173                        .security = 0x2ac,
 174                },
 175        }, {
 176                .name = "gpusrd",
 177                .sid = TEGRA186_SID_GPU,
 178                .regs = {
 179                        .override = 0x2c0,
 180                        .security = 0x2c4,
 181                },
 182        }, {
 183                .name = "gpuswr",
 184                .sid = TEGRA186_SID_GPU,
 185                .regs = {
 186                        .override = 0x2c8,
 187                        .security = 0x2cc,
 188                },
 189        }, {
 190                .name = "sdmmcra",
 191                .sid = TEGRA186_SID_SDMMC1,
 192                .regs = {
 193                        .override = 0x300,
 194                        .security = 0x304,
 195                },
 196        }, {
 197                .name = "sdmmcraa",
 198                .sid = TEGRA186_SID_SDMMC2,
 199                .regs = {
 200                        .override = 0x308,
 201                        .security = 0x30c,
 202                },
 203        }, {
 204                .name = "sdmmcr",
 205                .sid = TEGRA186_SID_SDMMC3,
 206                .regs = {
 207                        .override = 0x310,
 208                        .security = 0x314,
 209                },
 210        }, {
 211                .name = "sdmmcrab",
 212                .sid = TEGRA186_SID_SDMMC4,
 213                .regs = {
 214                        .override = 0x318,
 215                        .security = 0x31c,
 216                },
 217        }, {
 218                .name = "sdmmcwa",
 219                .sid = TEGRA186_SID_SDMMC1,
 220                .regs = {
 221                        .override = 0x320,
 222                        .security = 0x324,
 223                },
 224        }, {
 225                .name = "sdmmcwaa",
 226                .sid = TEGRA186_SID_SDMMC2,
 227                .regs = {
 228                        .override = 0x328,
 229                        .security = 0x32c,
 230                },
 231        }, {
 232                .name = "sdmmcw",
 233                .sid = TEGRA186_SID_SDMMC3,
 234                .regs = {
 235                        .override = 0x330,
 236                        .security = 0x334,
 237                },
 238        }, {
 239                .name = "sdmmcwab",
 240                .sid = TEGRA186_SID_SDMMC4,
 241                .regs = {
 242                        .override = 0x338,
 243                        .security = 0x33c,
 244                },
 245        }, {
 246                .name = "vicsrd",
 247                .sid = TEGRA186_SID_VIC,
 248                .regs = {
 249                        .override = 0x360,
 250                        .security = 0x364,
 251                },
 252        }, {
 253                .name = "vicswr",
 254                .sid = TEGRA186_SID_VIC,
 255                .regs = {
 256                        .override = 0x368,
 257                        .security = 0x36c,
 258                },
 259        }, {
 260                .name = "viw",
 261                .sid = TEGRA186_SID_VI,
 262                .regs = {
 263                        .override = 0x390,
 264                        .security = 0x394,
 265                },
 266        }, {
 267                .name = "nvdecsrd",
 268                .sid = TEGRA186_SID_NVDEC,
 269                .regs = {
 270                        .override = 0x3c0,
 271                        .security = 0x3c4,
 272                },
 273        }, {
 274                .name = "nvdecswr",
 275                .sid = TEGRA186_SID_NVDEC,
 276                .regs = {
 277                        .override = 0x3c8,
 278                        .security = 0x3cc,
 279                },
 280        }, {
 281                .name = "aper",
 282                .sid = TEGRA186_SID_APE,
 283                .regs = {
 284                        .override = 0x3d0,
 285                        .security = 0x3d4,
 286                },
 287        }, {
 288                .name = "apew",
 289                .sid = TEGRA186_SID_APE,
 290                .regs = {
 291                        .override = 0x3d8,
 292                        .security = 0x3dc,
 293                },
 294        }, {
 295                .name = "nvjpgsrd",
 296                .sid = TEGRA186_SID_NVJPG,
 297                .regs = {
 298                        .override = 0x3f0,
 299                        .security = 0x3f4,
 300                },
 301        }, {
 302                .name = "nvjpgswr",
 303                .sid = TEGRA186_SID_NVJPG,
 304                .regs = {
 305                        .override = 0x3f8,
 306                        .security = 0x3fc,
 307                },
 308        }, {
 309                .name = "sesrd",
 310                .sid = TEGRA186_SID_SE,
 311                .regs = {
 312                        .override = 0x400,
 313                        .security = 0x404,
 314                },
 315        }, {
 316                .name = "seswr",
 317                .sid = TEGRA186_SID_SE,
 318                .regs = {
 319                        .override = 0x408,
 320                        .security = 0x40c,
 321                },
 322        }, {
 323                .name = "etrr",
 324                .sid = TEGRA186_SID_ETR,
 325                .regs = {
 326                        .override = 0x420,
 327                        .security = 0x424,
 328                },
 329        }, {
 330                .name = "etrw",
 331                .sid = TEGRA186_SID_ETR,
 332                .regs = {
 333                        .override = 0x428,
 334                        .security = 0x42c,
 335                },
 336        }, {
 337                .name = "tsecsrdb",
 338                .sid = TEGRA186_SID_TSECB,
 339                .regs = {
 340                        .override = 0x430,
 341                        .security = 0x434,
 342                },
 343        }, {
 344                .name = "tsecswrb",
 345                .sid = TEGRA186_SID_TSECB,
 346                .regs = {
 347                        .override = 0x438,
 348                        .security = 0x43c,
 349                },
 350        }, {
 351                .name = "gpusrd2",
 352                .sid = TEGRA186_SID_GPU,
 353                .regs = {
 354                        .override = 0x440,
 355                        .security = 0x444,
 356                },
 357        }, {
 358                .name = "gpuswr2",
 359                .sid = TEGRA186_SID_GPU,
 360                .regs = {
 361                        .override = 0x448,
 362                        .security = 0x44c,
 363                },
 364        }, {
 365                .name = "axisr",
 366                .sid = TEGRA186_SID_GPCDMA_0,
 367                .regs = {
 368                        .override = 0x460,
 369                        .security = 0x464,
 370                },
 371        }, {
 372                .name = "axisw",
 373                .sid = TEGRA186_SID_GPCDMA_0,
 374                .regs = {
 375                        .override = 0x468,
 376                        .security = 0x46c,
 377                },
 378        }, {
 379                .name = "eqosr",
 380                .sid = TEGRA186_SID_EQOS,
 381                .regs = {
 382                        .override = 0x470,
 383                        .security = 0x474,
 384                },
 385        }, {
 386                .name = "eqosw",
 387                .sid = TEGRA186_SID_EQOS,
 388                .regs = {
 389                        .override = 0x478,
 390                        .security = 0x47c,
 391                },
 392        }, {
 393                .name = "ufshcr",
 394                .sid = TEGRA186_SID_UFSHC,
 395                .regs = {
 396                        .override = 0x480,
 397                        .security = 0x484,
 398                },
 399        }, {
 400                .name = "ufshcw",
 401                .sid = TEGRA186_SID_UFSHC,
 402                .regs = {
 403                        .override = 0x488,
 404                        .security = 0x48c,
 405                },
 406        }, {
 407                .name = "nvdisplayr",
 408                .sid = TEGRA186_SID_NVDISPLAY,
 409                .regs = {
 410                        .override = 0x490,
 411                        .security = 0x494,
 412                },
 413        }, {
 414                .name = "bpmpr",
 415                .sid = TEGRA186_SID_BPMP,
 416                .regs = {
 417                        .override = 0x498,
 418                        .security = 0x49c,
 419                },
 420        }, {
 421                .name = "bpmpw",
 422                .sid = TEGRA186_SID_BPMP,
 423                .regs = {
 424                        .override = 0x4a0,
 425                        .security = 0x4a4,
 426                },
 427        }, {
 428                .name = "bpmpdmar",
 429                .sid = TEGRA186_SID_BPMP,
 430                .regs = {
 431                        .override = 0x4a8,
 432                        .security = 0x4ac,
 433                },
 434        }, {
 435                .name = "bpmpdmaw",
 436                .sid = TEGRA186_SID_BPMP,
 437                .regs = {
 438                        .override = 0x4b0,
 439                        .security = 0x4b4,
 440                },
 441        }, {
 442                .name = "aonr",
 443                .sid = TEGRA186_SID_AON,
 444                .regs = {
 445                        .override = 0x4b8,
 446                        .security = 0x4bc,
 447                },
 448        }, {
 449                .name = "aonw",
 450                .sid = TEGRA186_SID_AON,
 451                .regs = {
 452                        .override = 0x4c0,
 453                        .security = 0x4c4,
 454                },
 455        }, {
 456                .name = "aondmar",
 457                .sid = TEGRA186_SID_AON,
 458                .regs = {
 459                        .override = 0x4c8,
 460                        .security = 0x4cc,
 461                },
 462        }, {
 463                .name = "aondmaw",
 464                .sid = TEGRA186_SID_AON,
 465                .regs = {
 466                        .override = 0x4d0,
 467                        .security = 0x4d4,
 468                },
 469        }, {
 470                .name = "scer",
 471                .sid = TEGRA186_SID_SCE,
 472                .regs = {
 473                        .override = 0x4d8,
 474                        .security = 0x4dc,
 475                },
 476        }, {
 477                .name = "scew",
 478                .sid = TEGRA186_SID_SCE,
 479                .regs = {
 480                        .override = 0x4e0,
 481                        .security = 0x4e4,
 482                },
 483        }, {
 484                .name = "scedmar",
 485                .sid = TEGRA186_SID_SCE,
 486                .regs = {
 487                        .override = 0x4e8,
 488                        .security = 0x4ec,
 489                },
 490        }, {
 491                .name = "scedmaw",
 492                .sid = TEGRA186_SID_SCE,
 493                .regs = {
 494                        .override = 0x4f0,
 495                        .security = 0x4f4,
 496                },
 497        }, {
 498                .name = "apedmar",
 499                .sid = TEGRA186_SID_APE,
 500                .regs = {
 501                        .override = 0x4f8,
 502                        .security = 0x4fc,
 503                },
 504        }, {
 505                .name = "apedmaw",
 506                .sid = TEGRA186_SID_APE,
 507                .regs = {
 508                        .override = 0x500,
 509                        .security = 0x504,
 510                },
 511        }, {
 512                .name = "nvdisplayr1",
 513                .sid = TEGRA186_SID_NVDISPLAY,
 514                .regs = {
 515                        .override = 0x508,
 516                        .security = 0x50c,
 517                },
 518        }, {
 519                .name = "vicsrd1",
 520                .sid = TEGRA186_SID_VIC,
 521                .regs = {
 522                        .override = 0x510,
 523                        .security = 0x514,
 524                },
 525        }, {
 526                .name = "nvdecsrd1",
 527                .sid = TEGRA186_SID_NVDEC,
 528                .regs = {
 529                        .override = 0x518,
 530                        .security = 0x51c,
 531                },
 532        },
 533};
 534
 535static int tegra186_mc_probe(struct platform_device *pdev)
 536{
 537        struct resource *res;
 538        struct tegra_mc *mc;
 539        unsigned int i;
 540        int err = 0;
 541
 542        mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL);
 543        if (!mc)
 544                return -ENOMEM;
 545
 546        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 547        mc->regs = devm_ioremap_resource(&pdev->dev, res);
 548        if (IS_ERR(mc->regs))
 549                return PTR_ERR(mc->regs);
 550
 551        mc->dev = &pdev->dev;
 552
 553        for (i = 0; i < ARRAY_SIZE(tegra186_mc_clients); i++) {
 554                const struct tegra_mc_client *client = &tegra186_mc_clients[i];
 555                u32 override, security;
 556
 557                override = readl(mc->regs + client->regs.override);
 558                security = readl(mc->regs + client->regs.security);
 559
 560                dev_dbg(&pdev->dev, "client %s: override: %x security: %x\n",
 561                        client->name, override, security);
 562
 563                dev_dbg(&pdev->dev, "setting SID %u for %s\n", client->sid,
 564                        client->name);
 565                writel(client->sid, mc->regs + client->regs.override);
 566
 567                override = readl(mc->regs + client->regs.override);
 568                security = readl(mc->regs + client->regs.security);
 569
 570                dev_dbg(&pdev->dev, "client %s: override: %x security: %x\n",
 571                        client->name, override, security);
 572        }
 573
 574        platform_set_drvdata(pdev, mc);
 575
 576        return err;
 577}
 578
 579static const struct of_device_id tegra186_mc_of_match[] = {
 580        { .compatible = "nvidia,tegra186-mc", },
 581        { /* sentinel */ }
 582};
 583MODULE_DEVICE_TABLE(of, tegra186_mc_of_match);
 584
 585static struct platform_driver tegra186_mc_driver = {
 586        .driver = {
 587                .name = "tegra186-mc",
 588                .of_match_table = tegra186_mc_of_match,
 589                .suppress_bind_attrs = true,
 590        },
 591        .prevent_deferred_probe = true,
 592        .probe = tegra186_mc_probe,
 593};
 594module_platform_driver(tegra186_mc_driver);
 595
 596MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
 597MODULE_DESCRIPTION("NVIDIA Tegra186 Memory Controller driver");
 598MODULE_LICENSE("GPL v2");
 599