root/drivers/memory/tegra/tegra124.c

/* [<][>][^][v][top][bottom][index][help] */
   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Copyright (C) 2014 NVIDIA CORPORATION.  All rights reserved.
   4  */
   5 
   6 #include <linux/of.h>
   7 #include <linux/mm.h>
   8 
   9 #include <dt-bindings/memory/tegra124-mc.h>
  10 
  11 #include "mc.h"
  12 
  13 #define MC_EMEM_ARB_CFG                         0x90
  14 #define MC_EMEM_ARB_OUTSTANDING_REQ             0x94
  15 #define MC_EMEM_ARB_TIMING_RCD                  0x98
  16 #define MC_EMEM_ARB_TIMING_RP                   0x9c
  17 #define MC_EMEM_ARB_TIMING_RC                   0xa0
  18 #define MC_EMEM_ARB_TIMING_RAS                  0xa4
  19 #define MC_EMEM_ARB_TIMING_FAW                  0xa8
  20 #define MC_EMEM_ARB_TIMING_RRD                  0xac
  21 #define MC_EMEM_ARB_TIMING_RAP2PRE              0xb0
  22 #define MC_EMEM_ARB_TIMING_WAP2PRE              0xb4
  23 #define MC_EMEM_ARB_TIMING_R2R                  0xb8
  24 #define MC_EMEM_ARB_TIMING_W2W                  0xbc
  25 #define MC_EMEM_ARB_TIMING_R2W                  0xc0
  26 #define MC_EMEM_ARB_TIMING_W2R                  0xc4
  27 #define MC_EMEM_ARB_DA_TURNS                    0xd0
  28 #define MC_EMEM_ARB_DA_COVERS                   0xd4
  29 #define MC_EMEM_ARB_MISC0                       0xd8
  30 #define MC_EMEM_ARB_MISC1                       0xdc
  31 #define MC_EMEM_ARB_RING1_THROTTLE              0xe0
  32 
  33 static const struct tegra_mc_client tegra124_mc_clients[] = {
  34         {
  35                 .id = 0x00,
  36                 .name = "ptcr",
  37                 .swgroup = TEGRA_SWGROUP_PTC,
  38         }, {
  39                 .id = 0x01,
  40                 .name = "display0a",
  41                 .swgroup = TEGRA_SWGROUP_DC,
  42                 .smmu = {
  43                         .reg = 0x228,
  44                         .bit = 1,
  45                 },
  46                 .la = {
  47                         .reg = 0x2e8,
  48                         .shift = 0,
  49                         .mask = 0xff,
  50                         .def = 0xc2,
  51                 },
  52         }, {
  53                 .id = 0x02,
  54                 .name = "display0ab",
  55                 .swgroup = TEGRA_SWGROUP_DCB,
  56                 .smmu = {
  57                         .reg = 0x228,
  58                         .bit = 2,
  59                 },
  60                 .la = {
  61                         .reg = 0x2f4,
  62                         .shift = 0,
  63                         .mask = 0xff,
  64                         .def = 0xc6,
  65                 },
  66         }, {
  67                 .id = 0x03,
  68                 .name = "display0b",
  69                 .swgroup = TEGRA_SWGROUP_DC,
  70                 .smmu = {
  71                         .reg = 0x228,
  72                         .bit = 3,
  73                 },
  74                 .la = {
  75                         .reg = 0x2e8,
  76                         .shift = 16,
  77                         .mask = 0xff,
  78                         .def = 0x50,
  79                 },
  80         }, {
  81                 .id = 0x04,
  82                 .name = "display0bb",
  83                 .swgroup = TEGRA_SWGROUP_DCB,
  84                 .smmu = {
  85                         .reg = 0x228,
  86                         .bit = 4,
  87                 },
  88                 .la = {
  89                         .reg = 0x2f4,
  90                         .shift = 16,
  91                         .mask = 0xff,
  92                         .def = 0x50,
  93                 },
  94         }, {
  95                 .id = 0x05,
  96                 .name = "display0c",
  97                 .swgroup = TEGRA_SWGROUP_DC,
  98                 .smmu = {
  99                         .reg = 0x228,
 100                         .bit = 5,
 101                 },
 102                 .la = {
 103                         .reg = 0x2ec,
 104                         .shift = 0,
 105                         .mask = 0xff,
 106                         .def = 0x50,
 107                 },
 108         }, {
 109                 .id = 0x06,
 110                 .name = "display0cb",
 111                 .swgroup = TEGRA_SWGROUP_DCB,
 112                 .smmu = {
 113                         .reg = 0x228,
 114                         .bit = 6,
 115                 },
 116                 .la = {
 117                         .reg = 0x2f8,
 118                         .shift = 0,
 119                         .mask = 0xff,
 120                         .def = 0x50,
 121                 },
 122         }, {
 123                 .id = 0x0e,
 124                 .name = "afir",
 125                 .swgroup = TEGRA_SWGROUP_AFI,
 126                 .smmu = {
 127                         .reg = 0x228,
 128                         .bit = 14,
 129                 },
 130                 .la = {
 131                         .reg = 0x2e0,
 132                         .shift = 0,
 133                         .mask = 0xff,
 134                         .def = 0x13,
 135                 },
 136         }, {
 137                 .id = 0x0f,
 138                 .name = "avpcarm7r",
 139                 .swgroup = TEGRA_SWGROUP_AVPC,
 140                 .smmu = {
 141                         .reg = 0x228,
 142                         .bit = 15,
 143                 },
 144                 .la = {
 145                         .reg = 0x2e4,
 146                         .shift = 0,
 147                         .mask = 0xff,
 148                         .def = 0x04,
 149                 },
 150         }, {
 151                 .id = 0x10,
 152                 .name = "displayhc",
 153                 .swgroup = TEGRA_SWGROUP_DC,
 154                 .smmu = {
 155                         .reg = 0x228,
 156                         .bit = 16,
 157                 },
 158                 .la = {
 159                         .reg = 0x2f0,
 160                         .shift = 0,
 161                         .mask = 0xff,
 162                         .def = 0x50,
 163                 },
 164         }, {
 165                 .id = 0x11,
 166                 .name = "displayhcb",
 167                 .swgroup = TEGRA_SWGROUP_DCB,
 168                 .smmu = {
 169                         .reg = 0x228,
 170                         .bit = 17,
 171                 },
 172                 .la = {
 173                         .reg = 0x2fc,
 174                         .shift = 0,
 175                         .mask = 0xff,
 176                         .def = 0x50,
 177                 },
 178         }, {
 179                 .id = 0x15,
 180                 .name = "hdar",
 181                 .swgroup = TEGRA_SWGROUP_HDA,
 182                 .smmu = {
 183                         .reg = 0x228,
 184                         .bit = 21,
 185                 },
 186                 .la = {
 187                         .reg = 0x318,
 188                         .shift = 0,
 189                         .mask = 0xff,
 190                         .def = 0x24,
 191                 },
 192         }, {
 193                 .id = 0x16,
 194                 .name = "host1xdmar",
 195                 .swgroup = TEGRA_SWGROUP_HC,
 196                 .smmu = {
 197                         .reg = 0x228,
 198                         .bit = 22,
 199                 },
 200                 .la = {
 201                         .reg = 0x310,
 202                         .shift = 0,
 203                         .mask = 0xff,
 204                         .def = 0x1e,
 205                 },
 206         }, {
 207                 .id = 0x17,
 208                 .name = "host1xr",
 209                 .swgroup = TEGRA_SWGROUP_HC,
 210                 .smmu = {
 211                         .reg = 0x228,
 212                         .bit = 23,
 213                 },
 214                 .la = {
 215                         .reg = 0x310,
 216                         .shift = 16,
 217                         .mask = 0xff,
 218                         .def = 0x50,
 219                 },
 220         }, {
 221                 .id = 0x1c,
 222                 .name = "msencsrd",
 223                 .swgroup = TEGRA_SWGROUP_MSENC,
 224                 .smmu = {
 225                         .reg = 0x228,
 226                         .bit = 28,
 227                 },
 228                 .la = {
 229                         .reg = 0x328,
 230                         .shift = 0,
 231                         .mask = 0xff,
 232                         .def = 0x23,
 233                 },
 234         }, {
 235                 .id = 0x1d,
 236                 .name = "ppcsahbdmar",
 237                 .swgroup = TEGRA_SWGROUP_PPCS,
 238                 .smmu = {
 239                         .reg = 0x228,
 240                         .bit = 29,
 241                 },
 242                 .la = {
 243                         .reg = 0x344,
 244                         .shift = 0,
 245                         .mask = 0xff,
 246                         .def = 0x49,
 247                 },
 248         }, {
 249                 .id = 0x1e,
 250                 .name = "ppcsahbslvr",
 251                 .swgroup = TEGRA_SWGROUP_PPCS,
 252                 .smmu = {
 253                         .reg = 0x228,
 254                         .bit = 30,
 255                 },
 256                 .la = {
 257                         .reg = 0x344,
 258                         .shift = 16,
 259                         .mask = 0xff,
 260                         .def = 0x1a,
 261                 },
 262         }, {
 263                 .id = 0x1f,
 264                 .name = "satar",
 265                 .swgroup = TEGRA_SWGROUP_SATA,
 266                 .smmu = {
 267                         .reg = 0x228,
 268                         .bit = 31,
 269                 },
 270                 .la = {
 271                         .reg = 0x350,
 272                         .shift = 0,
 273                         .mask = 0xff,
 274                         .def = 0x65,
 275                 },
 276         }, {
 277                 .id = 0x22,
 278                 .name = "vdebsevr",
 279                 .swgroup = TEGRA_SWGROUP_VDE,
 280                 .smmu = {
 281                         .reg = 0x22c,
 282                         .bit = 2,
 283                 },
 284                 .la = {
 285                         .reg = 0x354,
 286                         .shift = 0,
 287                         .mask = 0xff,
 288                         .def = 0x4f,
 289                 },
 290         }, {
 291                 .id = 0x23,
 292                 .name = "vdember",
 293                 .swgroup = TEGRA_SWGROUP_VDE,
 294                 .smmu = {
 295                         .reg = 0x22c,
 296                         .bit = 3,
 297                 },
 298                 .la = {
 299                         .reg = 0x354,
 300                         .shift = 16,
 301                         .mask = 0xff,
 302                         .def = 0x3d,
 303                 },
 304         }, {
 305                 .id = 0x24,
 306                 .name = "vdemcer",
 307                 .swgroup = TEGRA_SWGROUP_VDE,
 308                 .smmu = {
 309                         .reg = 0x22c,
 310                         .bit = 4,
 311                 },
 312                 .la = {
 313                         .reg = 0x358,
 314                         .shift = 0,
 315                         .mask = 0xff,
 316                         .def = 0x66,
 317                 },
 318         }, {
 319                 .id = 0x25,
 320                 .name = "vdetper",
 321                 .swgroup = TEGRA_SWGROUP_VDE,
 322                 .smmu = {
 323                         .reg = 0x22c,
 324                         .bit = 5,
 325                 },
 326                 .la = {
 327                         .reg = 0x358,
 328                         .shift = 16,
 329                         .mask = 0xff,
 330                         .def = 0xa5,
 331                 },
 332         }, {
 333                 .id = 0x26,
 334                 .name = "mpcorelpr",
 335                 .swgroup = TEGRA_SWGROUP_MPCORELP,
 336                 .la = {
 337                         .reg = 0x324,
 338                         .shift = 0,
 339                         .mask = 0xff,
 340                         .def = 0x04,
 341                 },
 342         }, {
 343                 .id = 0x27,
 344                 .name = "mpcorer",
 345                 .swgroup = TEGRA_SWGROUP_MPCORE,
 346                 .la = {
 347                         .reg = 0x320,
 348                         .shift = 0,
 349                         .mask = 0xff,
 350                         .def = 0x04,
 351                 },
 352         }, {
 353                 .id = 0x2b,
 354                 .name = "msencswr",
 355                 .swgroup = TEGRA_SWGROUP_MSENC,
 356                 .smmu = {
 357                         .reg = 0x22c,
 358                         .bit = 11,
 359                 },
 360                 .la = {
 361                         .reg = 0x328,
 362                         .shift = 16,
 363                         .mask = 0xff,
 364                         .def = 0x80,
 365                 },
 366         }, {
 367                 .id = 0x31,
 368                 .name = "afiw",
 369                 .swgroup = TEGRA_SWGROUP_AFI,
 370                 .smmu = {
 371                         .reg = 0x22c,
 372                         .bit = 17,
 373                 },
 374                 .la = {
 375                         .reg = 0x2e0,
 376                         .shift = 16,
 377                         .mask = 0xff,
 378                         .def = 0x80,
 379                 },
 380         }, {
 381                 .id = 0x32,
 382                 .name = "avpcarm7w",
 383                 .swgroup = TEGRA_SWGROUP_AVPC,
 384                 .smmu = {
 385                         .reg = 0x22c,
 386                         .bit = 18,
 387                 },
 388                 .la = {
 389                         .reg = 0x2e4,
 390                         .shift = 16,
 391                         .mask = 0xff,
 392                         .def = 0x80,
 393                 },
 394         }, {
 395                 .id = 0x35,
 396                 .name = "hdaw",
 397                 .swgroup = TEGRA_SWGROUP_HDA,
 398                 .smmu = {
 399                         .reg = 0x22c,
 400                         .bit = 21,
 401                 },
 402                 .la = {
 403                         .reg = 0x318,
 404                         .shift = 16,
 405                         .mask = 0xff,
 406                         .def = 0x80,
 407                 },
 408         }, {
 409                 .id = 0x36,
 410                 .name = "host1xw",
 411                 .swgroup = TEGRA_SWGROUP_HC,
 412                 .smmu = {
 413                         .reg = 0x22c,
 414                         .bit = 22,
 415                 },
 416                 .la = {
 417                         .reg = 0x314,
 418                         .shift = 0,
 419                         .mask = 0xff,
 420                         .def = 0x80,
 421                 },
 422         }, {
 423                 .id = 0x38,
 424                 .name = "mpcorelpw",
 425                 .swgroup = TEGRA_SWGROUP_MPCORELP,
 426                 .la = {
 427                         .reg = 0x324,
 428                         .shift = 16,
 429                         .mask = 0xff,
 430                         .def = 0x80,
 431                 },
 432         }, {
 433                 .id = 0x39,
 434                 .name = "mpcorew",
 435                 .swgroup = TEGRA_SWGROUP_MPCORE,
 436                 .la = {
 437                         .reg = 0x320,
 438                         .shift = 16,
 439                         .mask = 0xff,
 440                         .def = 0x80,
 441                 },
 442         }, {
 443                 .id = 0x3b,
 444                 .name = "ppcsahbdmaw",
 445                 .swgroup = TEGRA_SWGROUP_PPCS,
 446                 .smmu = {
 447                         .reg = 0x22c,
 448                         .bit = 27,
 449                 },
 450                 .la = {
 451                         .reg = 0x348,
 452                         .shift = 0,
 453                         .mask = 0xff,
 454                         .def = 0x80,
 455                 },
 456         }, {
 457                 .id = 0x3c,
 458                 .name = "ppcsahbslvw",
 459                 .swgroup = TEGRA_SWGROUP_PPCS,
 460                 .smmu = {
 461                         .reg = 0x22c,
 462                         .bit = 28,
 463                 },
 464                 .la = {
 465                         .reg = 0x348,
 466                         .shift = 16,
 467                         .mask = 0xff,
 468                         .def = 0x80,
 469                 },
 470         }, {
 471                 .id = 0x3d,
 472                 .name = "sataw",
 473                 .swgroup = TEGRA_SWGROUP_SATA,
 474                 .smmu = {
 475                         .reg = 0x22c,
 476                         .bit = 29,
 477                 },
 478                 .la = {
 479                         .reg = 0x350,
 480                         .shift = 16,
 481                         .mask = 0xff,
 482                         .def = 0x65,
 483                 },
 484         }, {
 485                 .id = 0x3e,
 486                 .name = "vdebsevw",
 487                 .swgroup = TEGRA_SWGROUP_VDE,
 488                 .smmu = {
 489                         .reg = 0x22c,
 490                         .bit = 30,
 491                 },
 492                 .la = {
 493                         .reg = 0x35c,
 494                         .shift = 0,
 495                         .mask = 0xff,
 496                         .def = 0x80,
 497                 },
 498         }, {
 499                 .id = 0x3f,
 500                 .name = "vdedbgw",
 501                 .swgroup = TEGRA_SWGROUP_VDE,
 502                 .smmu = {
 503                         .reg = 0x22c,
 504                         .bit = 31,
 505                 },
 506                 .la = {
 507                         .reg = 0x35c,
 508                         .shift = 16,
 509                         .mask = 0xff,
 510                         .def = 0x80,
 511                 },
 512         }, {
 513                 .id = 0x40,
 514                 .name = "vdembew",
 515                 .swgroup = TEGRA_SWGROUP_VDE,
 516                 .smmu = {
 517                         .reg = 0x230,
 518                         .bit = 0,
 519                 },
 520                 .la = {
 521                         .reg = 0x360,
 522                         .shift = 0,
 523                         .mask = 0xff,
 524                         .def = 0x80,
 525                 },
 526         }, {
 527                 .id = 0x41,
 528                 .name = "vdetpmw",
 529                 .swgroup = TEGRA_SWGROUP_VDE,
 530                 .smmu = {
 531                         .reg = 0x230,
 532                         .bit = 1,
 533                 },
 534                 .la = {
 535                         .reg = 0x360,
 536                         .shift = 16,
 537                         .mask = 0xff,
 538                         .def = 0x80,
 539                 },
 540         }, {
 541                 .id = 0x44,
 542                 .name = "ispra",
 543                 .swgroup = TEGRA_SWGROUP_ISP2,
 544                 .smmu = {
 545                         .reg = 0x230,
 546                         .bit = 4,
 547                 },
 548                 .la = {
 549                         .reg = 0x370,
 550                         .shift = 0,
 551                         .mask = 0xff,
 552                         .def = 0x18,
 553                 },
 554         }, {
 555                 .id = 0x46,
 556                 .name = "ispwa",
 557                 .swgroup = TEGRA_SWGROUP_ISP2,
 558                 .smmu = {
 559                         .reg = 0x230,
 560                         .bit = 6,
 561                 },
 562                 .la = {
 563                         .reg = 0x374,
 564                         .shift = 0,
 565                         .mask = 0xff,
 566                         .def = 0x80,
 567                 },
 568         }, {
 569                 .id = 0x47,
 570                 .name = "ispwb",
 571                 .swgroup = TEGRA_SWGROUP_ISP2,
 572                 .smmu = {
 573                         .reg = 0x230,
 574                         .bit = 7,
 575                 },
 576                 .la = {
 577                         .reg = 0x374,
 578                         .shift = 16,
 579                         .mask = 0xff,
 580                         .def = 0x80,
 581                 },
 582         }, {
 583                 .id = 0x4a,
 584                 .name = "xusb_hostr",
 585                 .swgroup = TEGRA_SWGROUP_XUSB_HOST,
 586                 .smmu = {
 587                         .reg = 0x230,
 588                         .bit = 10,
 589                 },
 590                 .la = {
 591                         .reg = 0x37c,
 592                         .shift = 0,
 593                         .mask = 0xff,
 594                         .def = 0x39,
 595                 },
 596         }, {
 597                 .id = 0x4b,
 598                 .name = "xusb_hostw",
 599                 .swgroup = TEGRA_SWGROUP_XUSB_HOST,
 600                 .smmu = {
 601                         .reg = 0x230,
 602                         .bit = 11,
 603                 },
 604                 .la = {
 605                         .reg = 0x37c,
 606                         .shift = 16,
 607                         .mask = 0xff,
 608                         .def = 0x80,
 609                 },
 610         }, {
 611                 .id = 0x4c,
 612                 .name = "xusb_devr",
 613                 .swgroup = TEGRA_SWGROUP_XUSB_DEV,
 614                 .smmu = {
 615                         .reg = 0x230,
 616                         .bit = 12,
 617                 },
 618                 .la = {
 619                         .reg = 0x380,
 620                         .shift = 0,
 621                         .mask = 0xff,
 622                         .def = 0x39,
 623                 },
 624         }, {
 625                 .id = 0x4d,
 626                 .name = "xusb_devw",
 627                 .swgroup = TEGRA_SWGROUP_XUSB_DEV,
 628                 .smmu = {
 629                         .reg = 0x230,
 630                         .bit = 13,
 631                 },
 632                 .la = {
 633                         .reg = 0x380,
 634                         .shift = 16,
 635                         .mask = 0xff,
 636                         .def = 0x80,
 637                 },
 638         }, {
 639                 .id = 0x4e,
 640                 .name = "isprab",
 641                 .swgroup = TEGRA_SWGROUP_ISP2B,
 642                 .smmu = {
 643                         .reg = 0x230,
 644                         .bit = 14,
 645                 },
 646                 .la = {
 647                         .reg = 0x384,
 648                         .shift = 0,
 649                         .mask = 0xff,
 650                         .def = 0x18,
 651                 },
 652         }, {
 653                 .id = 0x50,
 654                 .name = "ispwab",
 655                 .swgroup = TEGRA_SWGROUP_ISP2B,
 656                 .smmu = {
 657                         .reg = 0x230,
 658                         .bit = 16,
 659                 },
 660                 .la = {
 661                         .reg = 0x388,
 662                         .shift = 0,
 663                         .mask = 0xff,
 664                         .def = 0x80,
 665                 },
 666         }, {
 667                 .id = 0x51,
 668                 .name = "ispwbb",
 669                 .swgroup = TEGRA_SWGROUP_ISP2B,
 670                 .smmu = {
 671                         .reg = 0x230,
 672                         .bit = 17,
 673                 },
 674                 .la = {
 675                         .reg = 0x388,
 676                         .shift = 16,
 677                         .mask = 0xff,
 678                         .def = 0x80,
 679                 },
 680         }, {
 681                 .id = 0x54,
 682                 .name = "tsecsrd",
 683                 .swgroup = TEGRA_SWGROUP_TSEC,
 684                 .smmu = {
 685                         .reg = 0x230,
 686                         .bit = 20,
 687                 },
 688                 .la = {
 689                         .reg = 0x390,
 690                         .shift = 0,
 691                         .mask = 0xff,
 692                         .def = 0x9b,
 693                 },
 694         }, {
 695                 .id = 0x55,
 696                 .name = "tsecswr",
 697                 .swgroup = TEGRA_SWGROUP_TSEC,
 698                 .smmu = {
 699                         .reg = 0x230,
 700                         .bit = 21,
 701                 },
 702                 .la = {
 703                         .reg = 0x390,
 704                         .shift = 16,
 705                         .mask = 0xff,
 706                         .def = 0x80,
 707                 },
 708         }, {
 709                 .id = 0x56,
 710                 .name = "a9avpscr",
 711                 .swgroup = TEGRA_SWGROUP_A9AVP,
 712                 .smmu = {
 713                         .reg = 0x230,
 714                         .bit = 22,
 715                 },
 716                 .la = {
 717                         .reg = 0x3a4,
 718                         .shift = 0,
 719                         .mask = 0xff,
 720                         .def = 0x04,
 721                 },
 722         }, {
 723                 .id = 0x57,
 724                 .name = "a9avpscw",
 725                 .swgroup = TEGRA_SWGROUP_A9AVP,
 726                 .smmu = {
 727                         .reg = 0x230,
 728                         .bit = 23,
 729                 },
 730                 .la = {
 731                         .reg = 0x3a4,
 732                         .shift = 16,
 733                         .mask = 0xff,
 734                         .def = 0x80,
 735                 },
 736         }, {
 737                 .id = 0x58,
 738                 .name = "gpusrd",
 739                 .swgroup = TEGRA_SWGROUP_GPU,
 740                 .smmu = {
 741                         /* read-only */
 742                         .reg = 0x230,
 743                         .bit = 24,
 744                 },
 745                 .la = {
 746                         .reg = 0x3c8,
 747                         .shift = 0,
 748                         .mask = 0xff,
 749                         .def = 0x1a,
 750                 },
 751         }, {
 752                 .id = 0x59,
 753                 .name = "gpuswr",
 754                 .swgroup = TEGRA_SWGROUP_GPU,
 755                 .smmu = {
 756                         /* read-only */
 757                         .reg = 0x230,
 758                         .bit = 25,
 759                 },
 760                 .la = {
 761                         .reg = 0x3c8,
 762                         .shift = 16,
 763                         .mask = 0xff,
 764                         .def = 0x80,
 765                 },
 766         }, {
 767                 .id = 0x5a,
 768                 .name = "displayt",
 769                 .swgroup = TEGRA_SWGROUP_DC,
 770                 .smmu = {
 771                         .reg = 0x230,
 772                         .bit = 26,
 773                 },
 774                 .la = {
 775                         .reg = 0x2f0,
 776                         .shift = 16,
 777                         .mask = 0xff,
 778                         .def = 0x50,
 779                 },
 780         }, {
 781                 .id = 0x60,
 782                 .name = "sdmmcra",
 783                 .swgroup = TEGRA_SWGROUP_SDMMC1A,
 784                 .smmu = {
 785                         .reg = 0x234,
 786                         .bit = 0,
 787                 },
 788                 .la = {
 789                         .reg = 0x3b8,
 790                         .shift = 0,
 791                         .mask = 0xff,
 792                         .def = 0x49,
 793                 },
 794         }, {
 795                 .id = 0x61,
 796                 .name = "sdmmcraa",
 797                 .swgroup = TEGRA_SWGROUP_SDMMC2A,
 798                 .smmu = {
 799                         .reg = 0x234,
 800                         .bit = 1,
 801                 },
 802                 .la = {
 803                         .reg = 0x3bc,
 804                         .shift = 0,
 805                         .mask = 0xff,
 806                         .def = 0x49,
 807                 },
 808         }, {
 809                 .id = 0x62,
 810                 .name = "sdmmcr",
 811                 .swgroup = TEGRA_SWGROUP_SDMMC3A,
 812                 .smmu = {
 813                         .reg = 0x234,
 814                         .bit = 2,
 815                 },
 816                 .la = {
 817                         .reg = 0x3c0,
 818                         .shift = 0,
 819                         .mask = 0xff,
 820                         .def = 0x49,
 821                 },
 822         }, {
 823                 .id = 0x63,
 824                 .swgroup = TEGRA_SWGROUP_SDMMC4A,
 825                 .name = "sdmmcrab",
 826                 .smmu = {
 827                         .reg = 0x234,
 828                         .bit = 3,
 829                 },
 830                 .la = {
 831                         .reg = 0x3c4,
 832                         .shift = 0,
 833                         .mask = 0xff,
 834                         .def = 0x49,
 835                 },
 836         }, {
 837                 .id = 0x64,
 838                 .name = "sdmmcwa",
 839                 .swgroup = TEGRA_SWGROUP_SDMMC1A,
 840                 .smmu = {
 841                         .reg = 0x234,
 842                         .bit = 4,
 843                 },
 844                 .la = {
 845                         .reg = 0x3b8,
 846                         .shift = 16,
 847                         .mask = 0xff,
 848                         .def = 0x80,
 849                 },
 850         }, {
 851                 .id = 0x65,
 852                 .name = "sdmmcwaa",
 853                 .swgroup = TEGRA_SWGROUP_SDMMC2A,
 854                 .smmu = {
 855                         .reg = 0x234,
 856                         .bit = 5,
 857                 },
 858                 .la = {
 859                         .reg = 0x3bc,
 860                         .shift = 16,
 861                         .mask = 0xff,
 862                         .def = 0x80,
 863                 },
 864         }, {
 865                 .id = 0x66,
 866                 .name = "sdmmcw",
 867                 .swgroup = TEGRA_SWGROUP_SDMMC3A,
 868                 .smmu = {
 869                         .reg = 0x234,
 870                         .bit = 6,
 871                 },
 872                 .la = {
 873                         .reg = 0x3c0,
 874                         .shift = 16,
 875                         .mask = 0xff,
 876                         .def = 0x80,
 877                 },
 878         }, {
 879                 .id = 0x67,
 880                 .name = "sdmmcwab",
 881                 .swgroup = TEGRA_SWGROUP_SDMMC4A,
 882                 .smmu = {
 883                         .reg = 0x234,
 884                         .bit = 7,
 885                 },
 886                 .la = {
 887                         .reg = 0x3c4,
 888                         .shift = 16,
 889                         .mask = 0xff,
 890                         .def = 0x80,
 891                 },
 892         }, {
 893                 .id = 0x6c,
 894                 .name = "vicsrd",
 895                 .swgroup = TEGRA_SWGROUP_VIC,
 896                 .smmu = {
 897                         .reg = 0x234,
 898                         .bit = 12,
 899                 },
 900                 .la = {
 901                         .reg = 0x394,
 902                         .shift = 0,
 903                         .mask = 0xff,
 904                         .def = 0x1a,
 905                 },
 906         }, {
 907                 .id = 0x6d,
 908                 .name = "vicswr",
 909                 .swgroup = TEGRA_SWGROUP_VIC,
 910                 .smmu = {
 911                         .reg = 0x234,
 912                         .bit = 13,
 913                 },
 914                 .la = {
 915                         .reg = 0x394,
 916                         .shift = 16,
 917                         .mask = 0xff,
 918                         .def = 0x80,
 919                 },
 920         }, {
 921                 .id = 0x72,
 922                 .name = "viw",
 923                 .swgroup = TEGRA_SWGROUP_VI,
 924                 .smmu = {
 925                         .reg = 0x234,
 926                         .bit = 18,
 927                 },
 928                 .la = {
 929                         .reg = 0x398,
 930                         .shift = 0,
 931                         .mask = 0xff,
 932                         .def = 0x80,
 933                 },
 934         }, {
 935                 .id = 0x73,
 936                 .name = "displayd",
 937                 .swgroup = TEGRA_SWGROUP_DC,
 938                 .smmu = {
 939                         .reg = 0x234,
 940                         .bit = 19,
 941                 },
 942                 .la = {
 943                         .reg = 0x3c8,
 944                         .shift = 0,
 945                         .mask = 0xff,
 946                         .def = 0x50,
 947                 },
 948         },
 949 };
 950 
 951 static const struct tegra_smmu_swgroup tegra124_swgroups[] = {
 952         { .name = "dc",        .swgroup = TEGRA_SWGROUP_DC,        .reg = 0x240 },
 953         { .name = "dcb",       .swgroup = TEGRA_SWGROUP_DCB,       .reg = 0x244 },
 954         { .name = "afi",       .swgroup = TEGRA_SWGROUP_AFI,       .reg = 0x238 },
 955         { .name = "avpc",      .swgroup = TEGRA_SWGROUP_AVPC,      .reg = 0x23c },
 956         { .name = "hda",       .swgroup = TEGRA_SWGROUP_HDA,       .reg = 0x254 },
 957         { .name = "hc",        .swgroup = TEGRA_SWGROUP_HC,        .reg = 0x250 },
 958         { .name = "msenc",     .swgroup = TEGRA_SWGROUP_MSENC,     .reg = 0x264 },
 959         { .name = "ppcs",      .swgroup = TEGRA_SWGROUP_PPCS,      .reg = 0x270 },
 960         { .name = "sata",      .swgroup = TEGRA_SWGROUP_SATA,      .reg = 0x274 },
 961         { .name = "vde",       .swgroup = TEGRA_SWGROUP_VDE,       .reg = 0x27c },
 962         { .name = "isp2",      .swgroup = TEGRA_SWGROUP_ISP2,      .reg = 0x258 },
 963         { .name = "xusb_host", .swgroup = TEGRA_SWGROUP_XUSB_HOST, .reg = 0x288 },
 964         { .name = "xusb_dev",  .swgroup = TEGRA_SWGROUP_XUSB_DEV,  .reg = 0x28c },
 965         { .name = "isp2b",     .swgroup = TEGRA_SWGROUP_ISP2B,     .reg = 0xaa4 },
 966         { .name = "tsec",      .swgroup = TEGRA_SWGROUP_TSEC,      .reg = 0x294 },
 967         { .name = "a9avp",     .swgroup = TEGRA_SWGROUP_A9AVP,     .reg = 0x290 },
 968         { .name = "gpu",       .swgroup = TEGRA_SWGROUP_GPU,       .reg = 0xaac },
 969         { .name = "sdmmc1a",   .swgroup = TEGRA_SWGROUP_SDMMC1A,   .reg = 0xa94 },
 970         { .name = "sdmmc2a",   .swgroup = TEGRA_SWGROUP_SDMMC2A,   .reg = 0xa98 },
 971         { .name = "sdmmc3a",   .swgroup = TEGRA_SWGROUP_SDMMC3A,   .reg = 0xa9c },
 972         { .name = "sdmmc4a",   .swgroup = TEGRA_SWGROUP_SDMMC4A,   .reg = 0xaa0 },
 973         { .name = "vic",       .swgroup = TEGRA_SWGROUP_VIC,       .reg = 0x284 },
 974         { .name = "vi",        .swgroup = TEGRA_SWGROUP_VI,        .reg = 0x280 },
 975 };
 976 
 977 static const unsigned int tegra124_group_display[] = {
 978         TEGRA_SWGROUP_DC,
 979         TEGRA_SWGROUP_DCB,
 980 };
 981 
 982 static const struct tegra_smmu_group_soc tegra124_groups[] = {
 983         {
 984                 .name = "display",
 985                 .swgroups = tegra124_group_display,
 986                 .num_swgroups = ARRAY_SIZE(tegra124_group_display),
 987         },
 988 };
 989 
 990 #define TEGRA124_MC_RESET(_name, _control, _status, _bit)       \
 991         {                                                       \
 992                 .name = #_name,                                 \
 993                 .id = TEGRA124_MC_RESET_##_name,                \
 994                 .control = _control,                            \
 995                 .status = _status,                              \
 996                 .bit = _bit,                                    \
 997         }
 998 
 999 static const struct tegra_mc_reset tegra124_mc_resets[] = {
1000         TEGRA124_MC_RESET(AFI,       0x200, 0x204,  0),
1001         TEGRA124_MC_RESET(AVPC,      0x200, 0x204,  1),
1002         TEGRA124_MC_RESET(DC,        0x200, 0x204,  2),
1003         TEGRA124_MC_RESET(DCB,       0x200, 0x204,  3),
1004         TEGRA124_MC_RESET(HC,        0x200, 0x204,  6),
1005         TEGRA124_MC_RESET(HDA,       0x200, 0x204,  7),
1006         TEGRA124_MC_RESET(ISP2,      0x200, 0x204,  8),
1007         TEGRA124_MC_RESET(MPCORE,    0x200, 0x204,  9),
1008         TEGRA124_MC_RESET(MPCORELP,  0x200, 0x204, 10),
1009         TEGRA124_MC_RESET(MSENC,     0x200, 0x204, 11),
1010         TEGRA124_MC_RESET(PPCS,      0x200, 0x204, 14),
1011         TEGRA124_MC_RESET(SATA,      0x200, 0x204, 15),
1012         TEGRA124_MC_RESET(VDE,       0x200, 0x204, 16),
1013         TEGRA124_MC_RESET(VI,        0x200, 0x204, 17),
1014         TEGRA124_MC_RESET(VIC,       0x200, 0x204, 18),
1015         TEGRA124_MC_RESET(XUSB_HOST, 0x200, 0x204, 19),
1016         TEGRA124_MC_RESET(XUSB_DEV,  0x200, 0x204, 20),
1017         TEGRA124_MC_RESET(TSEC,      0x200, 0x204, 21),
1018         TEGRA124_MC_RESET(SDMMC1,    0x200, 0x204, 22),
1019         TEGRA124_MC_RESET(SDMMC2,    0x200, 0x204, 23),
1020         TEGRA124_MC_RESET(SDMMC3,    0x200, 0x204, 25),
1021         TEGRA124_MC_RESET(SDMMC4,    0x970, 0x974,  0),
1022         TEGRA124_MC_RESET(ISP2B,     0x970, 0x974,  1),
1023         TEGRA124_MC_RESET(GPU,       0x970, 0x974,  2),
1024 };
1025 
1026 #ifdef CONFIG_ARCH_TEGRA_124_SOC
1027 static const unsigned long tegra124_mc_emem_regs[] = {
1028         MC_EMEM_ARB_CFG,
1029         MC_EMEM_ARB_OUTSTANDING_REQ,
1030         MC_EMEM_ARB_TIMING_RCD,
1031         MC_EMEM_ARB_TIMING_RP,
1032         MC_EMEM_ARB_TIMING_RC,
1033         MC_EMEM_ARB_TIMING_RAS,
1034         MC_EMEM_ARB_TIMING_FAW,
1035         MC_EMEM_ARB_TIMING_RRD,
1036         MC_EMEM_ARB_TIMING_RAP2PRE,
1037         MC_EMEM_ARB_TIMING_WAP2PRE,
1038         MC_EMEM_ARB_TIMING_R2R,
1039         MC_EMEM_ARB_TIMING_W2W,
1040         MC_EMEM_ARB_TIMING_R2W,
1041         MC_EMEM_ARB_TIMING_W2R,
1042         MC_EMEM_ARB_DA_TURNS,
1043         MC_EMEM_ARB_DA_COVERS,
1044         MC_EMEM_ARB_MISC0,
1045         MC_EMEM_ARB_MISC1,
1046         MC_EMEM_ARB_RING1_THROTTLE
1047 };
1048 
1049 static const struct tegra_smmu_soc tegra124_smmu_soc = {
1050         .clients = tegra124_mc_clients,
1051         .num_clients = ARRAY_SIZE(tegra124_mc_clients),
1052         .swgroups = tegra124_swgroups,
1053         .num_swgroups = ARRAY_SIZE(tegra124_swgroups),
1054         .groups = tegra124_groups,
1055         .num_groups = ARRAY_SIZE(tegra124_groups),
1056         .supports_round_robin_arbitration = true,
1057         .supports_request_limit = true,
1058         .num_tlb_lines = 32,
1059         .num_asids = 128,
1060 };
1061 
1062 const struct tegra_mc_soc tegra124_mc_soc = {
1063         .clients = tegra124_mc_clients,
1064         .num_clients = ARRAY_SIZE(tegra124_mc_clients),
1065         .num_address_bits = 34,
1066         .atom_size = 32,
1067         .client_id_mask = 0x7f,
1068         .smmu = &tegra124_smmu_soc,
1069         .emem_regs = tegra124_mc_emem_regs,
1070         .num_emem_regs = ARRAY_SIZE(tegra124_mc_emem_regs),
1071         .intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
1072                    MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
1073                    MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
1074         .reset_ops = &tegra_mc_reset_ops_common,
1075         .resets = tegra124_mc_resets,
1076         .num_resets = ARRAY_SIZE(tegra124_mc_resets),
1077 };
1078 #endif /* CONFIG_ARCH_TEGRA_124_SOC */
1079 
1080 #ifdef CONFIG_ARCH_TEGRA_132_SOC
1081 static const struct tegra_smmu_soc tegra132_smmu_soc = {
1082         .clients = tegra124_mc_clients,
1083         .num_clients = ARRAY_SIZE(tegra124_mc_clients),
1084         .swgroups = tegra124_swgroups,
1085         .num_swgroups = ARRAY_SIZE(tegra124_swgroups),
1086         .groups = tegra124_groups,
1087         .num_groups = ARRAY_SIZE(tegra124_groups),
1088         .supports_round_robin_arbitration = true,
1089         .supports_request_limit = true,
1090         .num_tlb_lines = 32,
1091         .num_asids = 128,
1092 };
1093 
1094 const struct tegra_mc_soc tegra132_mc_soc = {
1095         .clients = tegra124_mc_clients,
1096         .num_clients = ARRAY_SIZE(tegra124_mc_clients),
1097         .num_address_bits = 34,
1098         .atom_size = 32,
1099         .client_id_mask = 0x7f,
1100         .smmu = &tegra132_smmu_soc,
1101         .intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
1102                    MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
1103                    MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
1104         .reset_ops = &tegra_mc_reset_ops_common,
1105         .resets = tegra124_mc_resets,
1106         .num_resets = ARRAY_SIZE(tegra124_mc_resets),
1107 };
1108 #endif /* CONFIG_ARCH_TEGRA_132_SOC */

/* [<][>][^][v][top][bottom][index][help] */