Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / memory / tegra / tegra124.c
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 */