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