sched/doc: Update documentation for base_slice_ns and CONFIG_HZ relation
[sfrench/cifs-2.6.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/device.h>
8 #include <linux/slab.h>
9
10 #include <dt-bindings/memory/tegra124-mc.h>
11
12 #include "mc.h"
13
14 static const struct tegra_mc_client tegra124_mc_clients[] = {
15         {
16                 .id = 0x00,
17                 .name = "ptcr",
18                 .swgroup = TEGRA_SWGROUP_PTC,
19                 .regs = {
20                         .la = {
21                                 .reg = 0x34c,
22                                 .shift = 0,
23                                 .mask = 0xff,
24                                 .def = 0x0,
25                         },
26                 },
27         }, {
28                 .id = 0x01,
29                 .name = "display0a",
30                 .swgroup = TEGRA_SWGROUP_DC,
31                 .regs = {
32                         .smmu = {
33                                 .reg = 0x228,
34                                 .bit = 1,
35                         },
36                         .la = {
37                                 .reg = 0x2e8,
38                                 .shift = 0,
39                                 .mask = 0xff,
40                                 .def = 0xc2,
41                         },
42                 },
43         }, {
44                 .id = 0x02,
45                 .name = "display0ab",
46                 .swgroup = TEGRA_SWGROUP_DCB,
47                 .regs = {
48                         .smmu = {
49                                 .reg = 0x228,
50                                 .bit = 2,
51                         },
52                         .la = {
53                                 .reg = 0x2f4,
54                                 .shift = 0,
55                                 .mask = 0xff,
56                                 .def = 0xc6,
57                         },
58                 },
59         }, {
60                 .id = 0x03,
61                 .name = "display0b",
62                 .swgroup = TEGRA_SWGROUP_DC,
63                 .regs = {
64                         .smmu = {
65                                 .reg = 0x228,
66                                 .bit = 3,
67                         },
68                         .la = {
69                                 .reg = 0x2e8,
70                                 .shift = 16,
71                                 .mask = 0xff,
72                                 .def = 0x50,
73                         },
74                 },
75         }, {
76                 .id = 0x04,
77                 .name = "display0bb",
78                 .swgroup = TEGRA_SWGROUP_DCB,
79                 .regs = {
80                         .smmu = {
81                                 .reg = 0x228,
82                                 .bit = 4,
83                         },
84                         .la = {
85                                 .reg = 0x2f4,
86                                 .shift = 16,
87                                 .mask = 0xff,
88                                 .def = 0x50,
89                         },
90                 },
91         }, {
92                 .id = 0x05,
93                 .name = "display0c",
94                 .swgroup = TEGRA_SWGROUP_DC,
95                 .regs = {
96                         .smmu = {
97                                 .reg = 0x228,
98                                 .bit = 5,
99                         },
100                         .la = {
101                                 .reg = 0x2ec,
102                                 .shift = 0,
103                                 .mask = 0xff,
104                                 .def = 0x50,
105                         },
106                 },
107         }, {
108                 .id = 0x06,
109                 .name = "display0cb",
110                 .swgroup = TEGRA_SWGROUP_DCB,
111                 .regs = {
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         }, {
124                 .id = 0x0e,
125                 .name = "afir",
126                 .swgroup = TEGRA_SWGROUP_AFI,
127                 .regs = {
128                         .smmu = {
129                                 .reg = 0x228,
130                                 .bit = 14,
131                         },
132                         .la = {
133                                 .reg = 0x2e0,
134                                 .shift = 0,
135                                 .mask = 0xff,
136                                 .def = 0x13,
137                         },
138                 },
139         }, {
140                 .id = 0x0f,
141                 .name = "avpcarm7r",
142                 .swgroup = TEGRA_SWGROUP_AVPC,
143                 .regs = {
144                         .smmu = {
145                                 .reg = 0x228,
146                                 .bit = 15,
147                         },
148                         .la = {
149                                 .reg = 0x2e4,
150                                 .shift = 0,
151                                 .mask = 0xff,
152                                 .def = 0x04,
153                         },
154                 },
155         }, {
156                 .id = 0x10,
157                 .name = "displayhc",
158                 .swgroup = TEGRA_SWGROUP_DC,
159                 .regs = {
160                         .smmu = {
161                                 .reg = 0x228,
162                                 .bit = 16,
163                         },
164                         .la = {
165                                 .reg = 0x2f0,
166                                 .shift = 0,
167                                 .mask = 0xff,
168                                 .def = 0x50,
169                         },
170                 },
171         }, {
172                 .id = 0x11,
173                 .name = "displayhcb",
174                 .swgroup = TEGRA_SWGROUP_DCB,
175                 .regs = {
176                         .smmu = {
177                                 .reg = 0x228,
178                                 .bit = 17,
179                         },
180                         .la = {
181                                 .reg = 0x2fc,
182                                 .shift = 0,
183                                 .mask = 0xff,
184                                 .def = 0x50,
185                         },
186                 },
187         }, {
188                 .id = 0x15,
189                 .name = "hdar",
190                 .swgroup = TEGRA_SWGROUP_HDA,
191                 .regs = {
192                         .smmu = {
193                                 .reg = 0x228,
194                                 .bit = 21,
195                         },
196                         .la = {
197                                 .reg = 0x318,
198                                 .shift = 0,
199                                 .mask = 0xff,
200                                 .def = 0x24,
201                         },
202                 },
203         }, {
204                 .id = 0x16,
205                 .name = "host1xdmar",
206                 .swgroup = TEGRA_SWGROUP_HC,
207                 .regs = {
208                         .smmu = {
209                                 .reg = 0x228,
210                                 .bit = 22,
211                         },
212                         .la = {
213                                 .reg = 0x310,
214                                 .shift = 0,
215                                 .mask = 0xff,
216                                 .def = 0x1e,
217                         },
218                 },
219         }, {
220                 .id = 0x17,
221                 .name = "host1xr",
222                 .swgroup = TEGRA_SWGROUP_HC,
223                 .regs = {
224                         .smmu = {
225                                 .reg = 0x228,
226                                 .bit = 23,
227                         },
228                         .la = {
229                                 .reg = 0x310,
230                                 .shift = 16,
231                                 .mask = 0xff,
232                                 .def = 0x50,
233                         },
234                 },
235         }, {
236                 .id = 0x1c,
237                 .name = "msencsrd",
238                 .swgroup = TEGRA_SWGROUP_MSENC,
239                 .regs = {
240                         .smmu = {
241                                 .reg = 0x228,
242                                 .bit = 28,
243                         },
244                         .la = {
245                                 .reg = 0x328,
246                                 .shift = 0,
247                                 .mask = 0xff,
248                                 .def = 0x23,
249                         },
250                 },
251         }, {
252                 .id = 0x1d,
253                 .name = "ppcsahbdmar",
254                 .swgroup = TEGRA_SWGROUP_PPCS,
255                 .regs = {
256                         .smmu = {
257                                 .reg = 0x228,
258                                 .bit = 29,
259                         },
260                         .la = {
261                                 .reg = 0x344,
262                                 .shift = 0,
263                                 .mask = 0xff,
264                                 .def = 0x49,
265                         },
266                 },
267         }, {
268                 .id = 0x1e,
269                 .name = "ppcsahbslvr",
270                 .swgroup = TEGRA_SWGROUP_PPCS,
271                 .regs = {
272                         .smmu = {
273                                 .reg = 0x228,
274                                 .bit = 30,
275                         },
276                         .la = {
277                                 .reg = 0x344,
278                                 .shift = 16,
279                                 .mask = 0xff,
280                                 .def = 0x1a,
281                         },
282                 },
283         }, {
284                 .id = 0x1f,
285                 .name = "satar",
286                 .swgroup = TEGRA_SWGROUP_SATA,
287                 .regs = {
288                         .smmu = {
289                                 .reg = 0x228,
290                                 .bit = 31,
291                         },
292                         .la = {
293                                 .reg = 0x350,
294                                 .shift = 0,
295                                 .mask = 0xff,
296                                 .def = 0x65,
297                         },
298                 },
299         }, {
300                 .id = 0x22,
301                 .name = "vdebsevr",
302                 .swgroup = TEGRA_SWGROUP_VDE,
303                 .regs = {
304                         .smmu = {
305                                 .reg = 0x22c,
306                                 .bit = 2,
307                         },
308                         .la = {
309                                 .reg = 0x354,
310                                 .shift = 0,
311                                 .mask = 0xff,
312                                 .def = 0x4f,
313                         },
314                 },
315         }, {
316                 .id = 0x23,
317                 .name = "vdember",
318                 .swgroup = TEGRA_SWGROUP_VDE,
319                 .regs = {
320                         .smmu = {
321                                 .reg = 0x22c,
322                                 .bit = 3,
323                         },
324                         .la = {
325                                 .reg = 0x354,
326                                 .shift = 16,
327                                 .mask = 0xff,
328                                 .def = 0x3d,
329                         },
330                 },
331         }, {
332                 .id = 0x24,
333                 .name = "vdemcer",
334                 .swgroup = TEGRA_SWGROUP_VDE,
335                 .regs = {
336                         .smmu = {
337                                 .reg = 0x22c,
338                                 .bit = 4,
339                         },
340                         .la = {
341                                 .reg = 0x358,
342                                 .shift = 0,
343                                 .mask = 0xff,
344                                 .def = 0x66,
345                         },
346                 },
347         }, {
348                 .id = 0x25,
349                 .name = "vdetper",
350                 .swgroup = TEGRA_SWGROUP_VDE,
351                 .regs = {
352                         .smmu = {
353                                 .reg = 0x22c,
354                                 .bit = 5,
355                         },
356                         .la = {
357                                 .reg = 0x358,
358                                 .shift = 16,
359                                 .mask = 0xff,
360                                 .def = 0xa5,
361                         },
362                 },
363         }, {
364                 .id = 0x26,
365                 .name = "mpcorelpr",
366                 .swgroup = TEGRA_SWGROUP_MPCORELP,
367                 .regs = {
368                         .la = {
369                                 .reg = 0x324,
370                                 .shift = 0,
371                                 .mask = 0xff,
372                                 .def = 0x04,
373                         },
374                 },
375         }, {
376                 .id = 0x27,
377                 .name = "mpcorer",
378                 .swgroup = TEGRA_SWGROUP_MPCORE,
379                 .regs = {
380                         .la = {
381                                 .reg = 0x320,
382                                 .shift = 0,
383                                 .mask = 0xff,
384                                 .def = 0x04,
385                         },
386                 },
387         }, {
388                 .id = 0x2b,
389                 .name = "msencswr",
390                 .swgroup = TEGRA_SWGROUP_MSENC,
391                 .regs = {
392                         .smmu = {
393                                 .reg = 0x22c,
394                                 .bit = 11,
395                         },
396                         .la = {
397                                 .reg = 0x328,
398                                 .shift = 16,
399                                 .mask = 0xff,
400                                 .def = 0x80,
401                         },
402                 },
403         }, {
404                 .id = 0x31,
405                 .name = "afiw",
406                 .swgroup = TEGRA_SWGROUP_AFI,
407                 .regs = {
408                         .smmu = {
409                                 .reg = 0x22c,
410                                 .bit = 17,
411                         },
412                         .la = {
413                                 .reg = 0x2e0,
414                                 .shift = 16,
415                                 .mask = 0xff,
416                                 .def = 0x80,
417                         },
418                 },
419         }, {
420                 .id = 0x32,
421                 .name = "avpcarm7w",
422                 .swgroup = TEGRA_SWGROUP_AVPC,
423                 .regs = {
424                         .smmu = {
425                                 .reg = 0x22c,
426                                 .bit = 18,
427                         },
428                         .la = {
429                                 .reg = 0x2e4,
430                                 .shift = 16,
431                                 .mask = 0xff,
432                                 .def = 0x80,
433                         },
434                 },
435         }, {
436                 .id = 0x35,
437                 .name = "hdaw",
438                 .swgroup = TEGRA_SWGROUP_HDA,
439                 .regs = {
440                         .smmu = {
441                                 .reg = 0x22c,
442                                 .bit = 21,
443                         },
444                         .la = {
445                                 .reg = 0x318,
446                                 .shift = 16,
447                                 .mask = 0xff,
448                                 .def = 0x80,
449                         },
450                 },
451         }, {
452                 .id = 0x36,
453                 .name = "host1xw",
454                 .swgroup = TEGRA_SWGROUP_HC,
455                 .regs = {
456                         .smmu = {
457                                 .reg = 0x22c,
458                                 .bit = 22,
459                         },
460                         .la = {
461                                 .reg = 0x314,
462                                 .shift = 0,
463                                 .mask = 0xff,
464                                 .def = 0x80,
465                         },
466                 },
467         }, {
468                 .id = 0x38,
469                 .name = "mpcorelpw",
470                 .swgroup = TEGRA_SWGROUP_MPCORELP,
471                 .regs = {
472                         .la = {
473                                 .reg = 0x324,
474                                 .shift = 16,
475                                 .mask = 0xff,
476                                 .def = 0x80,
477                         },
478                 },
479         }, {
480                 .id = 0x39,
481                 .name = "mpcorew",
482                 .swgroup = TEGRA_SWGROUP_MPCORE,
483                 .regs = {
484                         .la = {
485                                 .reg = 0x320,
486                                 .shift = 16,
487                                 .mask = 0xff,
488                                 .def = 0x80,
489                         },
490                 },
491         }, {
492                 .id = 0x3b,
493                 .name = "ppcsahbdmaw",
494                 .swgroup = TEGRA_SWGROUP_PPCS,
495                 .regs = {
496                         .smmu = {
497                                 .reg = 0x22c,
498                                 .bit = 27,
499                         },
500                         .la = {
501                                 .reg = 0x348,
502                                 .shift = 0,
503                                 .mask = 0xff,
504                                 .def = 0x80,
505                         },
506                 },
507         }, {
508                 .id = 0x3c,
509                 .name = "ppcsahbslvw",
510                 .swgroup = TEGRA_SWGROUP_PPCS,
511                 .regs = {
512                         .smmu = {
513                                 .reg = 0x22c,
514                                 .bit = 28,
515                         },
516                         .la = {
517                                 .reg = 0x348,
518                                 .shift = 16,
519                                 .mask = 0xff,
520                                 .def = 0x80,
521                         },
522                 },
523         }, {
524                 .id = 0x3d,
525                 .name = "sataw",
526                 .swgroup = TEGRA_SWGROUP_SATA,
527                 .regs = {
528                         .smmu = {
529                                 .reg = 0x22c,
530                                 .bit = 29,
531                         },
532                         .la = {
533                                 .reg = 0x350,
534                                 .shift = 16,
535                                 .mask = 0xff,
536                                 .def = 0x65,
537                         },
538                 },
539         }, {
540                 .id = 0x3e,
541                 .name = "vdebsevw",
542                 .swgroup = TEGRA_SWGROUP_VDE,
543                 .regs = {
544                         .smmu = {
545                                 .reg = 0x22c,
546                                 .bit = 30,
547                         },
548                         .la = {
549                                 .reg = 0x35c,
550                                 .shift = 0,
551                                 .mask = 0xff,
552                                 .def = 0x80,
553                         },
554                 },
555         }, {
556                 .id = 0x3f,
557                 .name = "vdedbgw",
558                 .swgroup = TEGRA_SWGROUP_VDE,
559                 .regs = {
560                         .smmu = {
561                                 .reg = 0x22c,
562                                 .bit = 31,
563                         },
564                         .la = {
565                                 .reg = 0x35c,
566                                 .shift = 16,
567                                 .mask = 0xff,
568                                 .def = 0x80,
569                         },
570                 },
571         }, {
572                 .id = 0x40,
573                 .name = "vdembew",
574                 .swgroup = TEGRA_SWGROUP_VDE,
575                 .regs = {
576                         .smmu = {
577                                 .reg = 0x230,
578                                 .bit = 0,
579                         },
580                         .la = {
581                                 .reg = 0x360,
582                                 .shift = 0,
583                                 .mask = 0xff,
584                                 .def = 0x80,
585                         },
586                 },
587         }, {
588                 .id = 0x41,
589                 .name = "vdetpmw",
590                 .swgroup = TEGRA_SWGROUP_VDE,
591                 .regs = {
592                         .smmu = {
593                                 .reg = 0x230,
594                                 .bit = 1,
595                         },
596                         .la = {
597                                 .reg = 0x360,
598                                 .shift = 16,
599                                 .mask = 0xff,
600                                 .def = 0x80,
601                         },
602                 },
603         }, {
604                 .id = 0x44,
605                 .name = "ispra",
606                 .swgroup = TEGRA_SWGROUP_ISP2,
607                 .regs = {
608                         .smmu = {
609                                 .reg = 0x230,
610                                 .bit = 4,
611                         },
612                         .la = {
613                                 .reg = 0x370,
614                                 .shift = 0,
615                                 .mask = 0xff,
616                                 .def = 0x18,
617                         },
618                 },
619         }, {
620                 .id = 0x46,
621                 .name = "ispwa",
622                 .swgroup = TEGRA_SWGROUP_ISP2,
623                 .regs = {
624                         .smmu = {
625                                 .reg = 0x230,
626                                 .bit = 6,
627                         },
628                         .la = {
629                                 .reg = 0x374,
630                                 .shift = 0,
631                                 .mask = 0xff,
632                                 .def = 0x80,
633                         },
634                 },
635         }, {
636                 .id = 0x47,
637                 .name = "ispwb",
638                 .swgroup = TEGRA_SWGROUP_ISP2,
639                 .regs = {
640                         .smmu = {
641                                 .reg = 0x230,
642                                 .bit = 7,
643                         },
644                         .la = {
645                                 .reg = 0x374,
646                                 .shift = 16,
647                                 .mask = 0xff,
648                                 .def = 0x80,
649                         },
650                 },
651         }, {
652                 .id = 0x4a,
653                 .name = "xusb_hostr",
654                 .swgroup = TEGRA_SWGROUP_XUSB_HOST,
655                 .regs = {
656                         .smmu = {
657                                 .reg = 0x230,
658                                 .bit = 10,
659                         },
660                         .la = {
661                                 .reg = 0x37c,
662                                 .shift = 0,
663                                 .mask = 0xff,
664                                 .def = 0x39,
665                         },
666                 },
667         }, {
668                 .id = 0x4b,
669                 .name = "xusb_hostw",
670                 .swgroup = TEGRA_SWGROUP_XUSB_HOST,
671                 .regs = {
672                         .smmu = {
673                                 .reg = 0x230,
674                                 .bit = 11,
675                         },
676                         .la = {
677                                 .reg = 0x37c,
678                                 .shift = 16,
679                                 .mask = 0xff,
680                                 .def = 0x80,
681                         },
682                 },
683         }, {
684                 .id = 0x4c,
685                 .name = "xusb_devr",
686                 .swgroup = TEGRA_SWGROUP_XUSB_DEV,
687                 .regs = {
688                         .smmu = {
689                                 .reg = 0x230,
690                                 .bit = 12,
691                         },
692                         .la = {
693                                 .reg = 0x380,
694                                 .shift = 0,
695                                 .mask = 0xff,
696                                 .def = 0x39,
697                         },
698                 },
699         }, {
700                 .id = 0x4d,
701                 .name = "xusb_devw",
702                 .swgroup = TEGRA_SWGROUP_XUSB_DEV,
703                 .regs = {
704                         .smmu = {
705                                 .reg = 0x230,
706                                 .bit = 13,
707                         },
708                         .la = {
709                                 .reg = 0x380,
710                                 .shift = 16,
711                                 .mask = 0xff,
712                                 .def = 0x80,
713                         },
714                 },
715         }, {
716                 .id = 0x4e,
717                 .name = "isprab",
718                 .swgroup = TEGRA_SWGROUP_ISP2B,
719                 .regs = {
720                         .smmu = {
721                                 .reg = 0x230,
722                                 .bit = 14,
723                         },
724                         .la = {
725                                 .reg = 0x384,
726                                 .shift = 0,
727                                 .mask = 0xff,
728                                 .def = 0x18,
729                         },
730                 },
731         }, {
732                 .id = 0x50,
733                 .name = "ispwab",
734                 .swgroup = TEGRA_SWGROUP_ISP2B,
735                 .regs = {
736                         .smmu = {
737                                 .reg = 0x230,
738                                 .bit = 16,
739                         },
740                         .la = {
741                                 .reg = 0x388,
742                                 .shift = 0,
743                                 .mask = 0xff,
744                                 .def = 0x80,
745                         },
746                 },
747         }, {
748                 .id = 0x51,
749                 .name = "ispwbb",
750                 .swgroup = TEGRA_SWGROUP_ISP2B,
751                 .regs = {
752                         .smmu = {
753                                 .reg = 0x230,
754                                 .bit = 17,
755                         },
756                         .la = {
757                                 .reg = 0x388,
758                                 .shift = 16,
759                                 .mask = 0xff,
760                                 .def = 0x80,
761                         },
762                 },
763         }, {
764                 .id = 0x54,
765                 .name = "tsecsrd",
766                 .swgroup = TEGRA_SWGROUP_TSEC,
767                 .regs = {
768                         .smmu = {
769                                 .reg = 0x230,
770                                 .bit = 20,
771                         },
772                         .la = {
773                                 .reg = 0x390,
774                                 .shift = 0,
775                                 .mask = 0xff,
776                                 .def = 0x9b,
777                         },
778                 },
779         }, {
780                 .id = 0x55,
781                 .name = "tsecswr",
782                 .swgroup = TEGRA_SWGROUP_TSEC,
783                 .regs = {
784                         .smmu = {
785                                 .reg = 0x230,
786                                 .bit = 21,
787                         },
788                         .la = {
789                                 .reg = 0x390,
790                                 .shift = 16,
791                                 .mask = 0xff,
792                                 .def = 0x80,
793                         },
794                 },
795         }, {
796                 .id = 0x56,
797                 .name = "a9avpscr",
798                 .swgroup = TEGRA_SWGROUP_A9AVP,
799                 .regs = {
800                         .smmu = {
801                                 .reg = 0x230,
802                                 .bit = 22,
803                         },
804                         .la = {
805                                 .reg = 0x3a4,
806                                 .shift = 0,
807                                 .mask = 0xff,
808                                 .def = 0x04,
809                         },
810                 },
811         }, {
812                 .id = 0x57,
813                 .name = "a9avpscw",
814                 .swgroup = TEGRA_SWGROUP_A9AVP,
815                 .regs = {
816                         .smmu = {
817                                 .reg = 0x230,
818                                 .bit = 23,
819                         },
820                         .la = {
821                                 .reg = 0x3a4,
822                                 .shift = 16,
823                                 .mask = 0xff,
824                                 .def = 0x80,
825                         },
826                 },
827         }, {
828                 .id = 0x58,
829                 .name = "gpusrd",
830                 .swgroup = TEGRA_SWGROUP_GPU,
831                 .regs = {
832                         .smmu = {
833                                 /* read-only */
834                                 .reg = 0x230,
835                                 .bit = 24,
836                         },
837                         .la = {
838                                 .reg = 0x3c8,
839                                 .shift = 0,
840                                 .mask = 0xff,
841                                 .def = 0x1a,
842                         },
843                 },
844         }, {
845                 .id = 0x59,
846                 .name = "gpuswr",
847                 .swgroup = TEGRA_SWGROUP_GPU,
848                 .regs = {
849                         .smmu = {
850                                 /* read-only */
851                                 .reg = 0x230,
852                                 .bit = 25,
853                         },
854                         .la = {
855                                 .reg = 0x3c8,
856                                 .shift = 16,
857                                 .mask = 0xff,
858                                 .def = 0x80,
859                         },
860                 },
861         }, {
862                 .id = 0x5a,
863                 .name = "displayt",
864                 .swgroup = TEGRA_SWGROUP_DC,
865                 .regs = {
866                         .smmu = {
867                                 .reg = 0x230,
868                                 .bit = 26,
869                         },
870                         .la = {
871                                 .reg = 0x2f0,
872                                 .shift = 16,
873                                 .mask = 0xff,
874                                 .def = 0x50,
875                         },
876                 },
877         }, {
878                 .id = 0x60,
879                 .name = "sdmmcra",
880                 .swgroup = TEGRA_SWGROUP_SDMMC1A,
881                 .regs = {
882                         .smmu = {
883                                 .reg = 0x234,
884                                 .bit = 0,
885                         },
886                         .la = {
887                                 .reg = 0x3b8,
888                                 .shift = 0,
889                                 .mask = 0xff,
890                                 .def = 0x49,
891                         },
892                 },
893         }, {
894                 .id = 0x61,
895                 .name = "sdmmcraa",
896                 .swgroup = TEGRA_SWGROUP_SDMMC2A,
897                 .regs = {
898                         .smmu = {
899                                 .reg = 0x234,
900                                 .bit = 1,
901                         },
902                         .la = {
903                                 .reg = 0x3bc,
904                                 .shift = 0,
905                                 .mask = 0xff,
906                                 .def = 0x49,
907                         },
908                 },
909         }, {
910                 .id = 0x62,
911                 .name = "sdmmcr",
912                 .swgroup = TEGRA_SWGROUP_SDMMC3A,
913                 .regs = {
914                         .smmu = {
915                                 .reg = 0x234,
916                                 .bit = 2,
917                         },
918                         .la = {
919                                 .reg = 0x3c0,
920                                 .shift = 0,
921                                 .mask = 0xff,
922                                 .def = 0x49,
923                         },
924                 },
925         }, {
926                 .id = 0x63,
927                 .swgroup = TEGRA_SWGROUP_SDMMC4A,
928                 .name = "sdmmcrab",
929                 .regs = {
930                         .smmu = {
931                                 .reg = 0x234,
932                                 .bit = 3,
933                         },
934                         .la = {
935                                 .reg = 0x3c4,
936                                 .shift = 0,
937                                 .mask = 0xff,
938                                 .def = 0x49,
939                         },
940                 },
941         }, {
942                 .id = 0x64,
943                 .name = "sdmmcwa",
944                 .swgroup = TEGRA_SWGROUP_SDMMC1A,
945                 .regs = {
946                         .smmu = {
947                                 .reg = 0x234,
948                                 .bit = 4,
949                         },
950                         .la = {
951                                 .reg = 0x3b8,
952                                 .shift = 16,
953                                 .mask = 0xff,
954                                 .def = 0x80,
955                         },
956                 },
957         }, {
958                 .id = 0x65,
959                 .name = "sdmmcwaa",
960                 .swgroup = TEGRA_SWGROUP_SDMMC2A,
961                 .regs = {
962                         .smmu = {
963                                 .reg = 0x234,
964                                 .bit = 5,
965                         },
966                         .la = {
967                                 .reg = 0x3bc,
968                                 .shift = 16,
969                                 .mask = 0xff,
970                                 .def = 0x80,
971                         },
972                 },
973         }, {
974                 .id = 0x66,
975                 .name = "sdmmcw",
976                 .swgroup = TEGRA_SWGROUP_SDMMC3A,
977                 .regs = {
978                         .smmu = {
979                                 .reg = 0x234,
980                                 .bit = 6,
981                         },
982                         .la = {
983                                 .reg = 0x3c0,
984                                 .shift = 16,
985                                 .mask = 0xff,
986                                 .def = 0x80,
987                         },
988                 },
989         }, {
990                 .id = 0x67,
991                 .name = "sdmmcwab",
992                 .swgroup = TEGRA_SWGROUP_SDMMC4A,
993                 .regs = {
994                         .smmu = {
995                                 .reg = 0x234,
996                                 .bit = 7,
997                         },
998                         .la = {
999                                 .reg = 0x3c4,
1000                                 .shift = 16,
1001                                 .mask = 0xff,
1002                                 .def = 0x80,
1003                         },
1004                 },
1005         }, {
1006                 .id = 0x6c,
1007                 .name = "vicsrd",
1008                 .swgroup = TEGRA_SWGROUP_VIC,
1009                 .regs = {
1010                         .smmu = {
1011                                 .reg = 0x234,
1012                                 .bit = 12,
1013                         },
1014                         .la = {
1015                                 .reg = 0x394,
1016                                 .shift = 0,
1017                                 .mask = 0xff,
1018                                 .def = 0x1a,
1019                         },
1020                 },
1021         }, {
1022                 .id = 0x6d,
1023                 .name = "vicswr",
1024                 .swgroup = TEGRA_SWGROUP_VIC,
1025                 .regs = {
1026                         .smmu = {
1027                                 .reg = 0x234,
1028                                 .bit = 13,
1029                         },
1030                         .la = {
1031                                 .reg = 0x394,
1032                                 .shift = 16,
1033                                 .mask = 0xff,
1034                                 .def = 0x80,
1035                         },
1036                 },
1037         }, {
1038                 .id = 0x72,
1039                 .name = "viw",
1040                 .swgroup = TEGRA_SWGROUP_VI,
1041                 .regs = {
1042                         .smmu = {
1043                                 .reg = 0x234,
1044                                 .bit = 18,
1045                         },
1046                         .la = {
1047                                 .reg = 0x398,
1048                                 .shift = 0,
1049                                 .mask = 0xff,
1050                                 .def = 0x80,
1051                         },
1052                 },
1053         }, {
1054                 .id = 0x73,
1055                 .name = "displayd",
1056                 .swgroup = TEGRA_SWGROUP_DC,
1057                 .regs = {
1058                         .smmu = {
1059                                 .reg = 0x234,
1060                                 .bit = 19,
1061                         },
1062                         .la = {
1063                                 .reg = 0x3c8,
1064                                 .shift = 0,
1065                                 .mask = 0xff,
1066                                 .def = 0x50,
1067                         },
1068                 },
1069         },
1070 };
1071
1072 static const struct tegra_smmu_swgroup tegra124_swgroups[] = {
1073         { .name = "dc",        .swgroup = TEGRA_SWGROUP_DC,        .reg = 0x240 },
1074         { .name = "dcb",       .swgroup = TEGRA_SWGROUP_DCB,       .reg = 0x244 },
1075         { .name = "afi",       .swgroup = TEGRA_SWGROUP_AFI,       .reg = 0x238 },
1076         { .name = "avpc",      .swgroup = TEGRA_SWGROUP_AVPC,      .reg = 0x23c },
1077         { .name = "hda",       .swgroup = TEGRA_SWGROUP_HDA,       .reg = 0x254 },
1078         { .name = "hc",        .swgroup = TEGRA_SWGROUP_HC,        .reg = 0x250 },
1079         { .name = "msenc",     .swgroup = TEGRA_SWGROUP_MSENC,     .reg = 0x264 },
1080         { .name = "ppcs",      .swgroup = TEGRA_SWGROUP_PPCS,      .reg = 0x270 },
1081         { .name = "sata",      .swgroup = TEGRA_SWGROUP_SATA,      .reg = 0x274 },
1082         { .name = "vde",       .swgroup = TEGRA_SWGROUP_VDE,       .reg = 0x27c },
1083         { .name = "isp2",      .swgroup = TEGRA_SWGROUP_ISP2,      .reg = 0x258 },
1084         { .name = "xusb_host", .swgroup = TEGRA_SWGROUP_XUSB_HOST, .reg = 0x288 },
1085         { .name = "xusb_dev",  .swgroup = TEGRA_SWGROUP_XUSB_DEV,  .reg = 0x28c },
1086         { .name = "isp2b",     .swgroup = TEGRA_SWGROUP_ISP2B,     .reg = 0xaa4 },
1087         { .name = "tsec",      .swgroup = TEGRA_SWGROUP_TSEC,      .reg = 0x294 },
1088         { .name = "a9avp",     .swgroup = TEGRA_SWGROUP_A9AVP,     .reg = 0x290 },
1089         { .name = "gpu",       .swgroup = TEGRA_SWGROUP_GPU,       .reg = 0xaac },
1090         { .name = "sdmmc1a",   .swgroup = TEGRA_SWGROUP_SDMMC1A,   .reg = 0xa94 },
1091         { .name = "sdmmc2a",   .swgroup = TEGRA_SWGROUP_SDMMC2A,   .reg = 0xa98 },
1092         { .name = "sdmmc3a",   .swgroup = TEGRA_SWGROUP_SDMMC3A,   .reg = 0xa9c },
1093         { .name = "sdmmc4a",   .swgroup = TEGRA_SWGROUP_SDMMC4A,   .reg = 0xaa0 },
1094         { .name = "vic",       .swgroup = TEGRA_SWGROUP_VIC,       .reg = 0x284 },
1095         { .name = "vi",        .swgroup = TEGRA_SWGROUP_VI,        .reg = 0x280 },
1096 };
1097
1098 static const unsigned int tegra124_group_drm[] = {
1099         TEGRA_SWGROUP_DC,
1100         TEGRA_SWGROUP_DCB,
1101         TEGRA_SWGROUP_VIC,
1102 };
1103
1104 static const struct tegra_smmu_group_soc tegra124_groups[] = {
1105         {
1106                 .name = "drm",
1107                 .swgroups = tegra124_group_drm,
1108                 .num_swgroups = ARRAY_SIZE(tegra124_group_drm),
1109         },
1110 };
1111
1112 #define TEGRA124_MC_RESET(_name, _control, _status, _bit)       \
1113         {                                                       \
1114                 .name = #_name,                                 \
1115                 .id = TEGRA124_MC_RESET_##_name,                \
1116                 .control = _control,                            \
1117                 .status = _status,                              \
1118                 .bit = _bit,                                    \
1119         }
1120
1121 static const struct tegra_mc_reset tegra124_mc_resets[] = {
1122         TEGRA124_MC_RESET(AFI,       0x200, 0x204,  0),
1123         TEGRA124_MC_RESET(AVPC,      0x200, 0x204,  1),
1124         TEGRA124_MC_RESET(DC,        0x200, 0x204,  2),
1125         TEGRA124_MC_RESET(DCB,       0x200, 0x204,  3),
1126         TEGRA124_MC_RESET(HC,        0x200, 0x204,  6),
1127         TEGRA124_MC_RESET(HDA,       0x200, 0x204,  7),
1128         TEGRA124_MC_RESET(ISP2,      0x200, 0x204,  8),
1129         TEGRA124_MC_RESET(MPCORE,    0x200, 0x204,  9),
1130         TEGRA124_MC_RESET(MPCORELP,  0x200, 0x204, 10),
1131         TEGRA124_MC_RESET(MSENC,     0x200, 0x204, 11),
1132         TEGRA124_MC_RESET(PPCS,      0x200, 0x204, 14),
1133         TEGRA124_MC_RESET(SATA,      0x200, 0x204, 15),
1134         TEGRA124_MC_RESET(VDE,       0x200, 0x204, 16),
1135         TEGRA124_MC_RESET(VI,        0x200, 0x204, 17),
1136         TEGRA124_MC_RESET(VIC,       0x200, 0x204, 18),
1137         TEGRA124_MC_RESET(XUSB_HOST, 0x200, 0x204, 19),
1138         TEGRA124_MC_RESET(XUSB_DEV,  0x200, 0x204, 20),
1139         TEGRA124_MC_RESET(TSEC,      0x200, 0x204, 21),
1140         TEGRA124_MC_RESET(SDMMC1,    0x200, 0x204, 22),
1141         TEGRA124_MC_RESET(SDMMC2,    0x200, 0x204, 23),
1142         TEGRA124_MC_RESET(SDMMC3,    0x200, 0x204, 25),
1143         TEGRA124_MC_RESET(SDMMC4,    0x970, 0x974,  0),
1144         TEGRA124_MC_RESET(ISP2B,     0x970, 0x974,  1),
1145         TEGRA124_MC_RESET(GPU,       0x970, 0x974,  2),
1146 };
1147
1148 static int tegra124_mc_icc_set(struct icc_node *src, struct icc_node *dst)
1149 {
1150         /* TODO: program PTSA */
1151         return 0;
1152 }
1153
1154 static int tegra124_mc_icc_aggreate(struct icc_node *node, u32 tag, u32 avg_bw,
1155                                     u32 peak_bw, u32 *agg_avg, u32 *agg_peak)
1156 {
1157         /*
1158          * ISO clients need to reserve extra bandwidth up-front because
1159          * there could be high bandwidth pressure during initial filling
1160          * of the client's FIFO buffers.  Secondly, we need to take into
1161          * account impurities of the memory subsystem.
1162          */
1163         if (tag & TEGRA_MC_ICC_TAG_ISO)
1164                 peak_bw = tegra_mc_scale_percents(peak_bw, 400);
1165
1166         *agg_avg += avg_bw;
1167         *agg_peak = max(*agg_peak, peak_bw);
1168
1169         return 0;
1170 }
1171
1172 static struct icc_node_data *
1173 tegra124_mc_of_icc_xlate_extended(struct of_phandle_args *spec, void *data)
1174 {
1175         struct tegra_mc *mc = icc_provider_to_tegra_mc(data);
1176         const struct tegra_mc_client *client;
1177         unsigned int i, idx = spec->args[0];
1178         struct icc_node_data *ndata;
1179         struct icc_node *node;
1180
1181         list_for_each_entry(node, &mc->provider.nodes, node_list) {
1182                 if (node->id != idx)
1183                         continue;
1184
1185                 ndata = kzalloc(sizeof(*ndata), GFP_KERNEL);
1186                 if (!ndata)
1187                         return ERR_PTR(-ENOMEM);
1188
1189                 client = &mc->soc->clients[idx];
1190                 ndata->node = node;
1191
1192                 switch (client->swgroup) {
1193                 case TEGRA_SWGROUP_DC:
1194                 case TEGRA_SWGROUP_DCB:
1195                 case TEGRA_SWGROUP_PTC:
1196                 case TEGRA_SWGROUP_VI:
1197                         /* these clients are isochronous by default */
1198                         ndata->tag = TEGRA_MC_ICC_TAG_ISO;
1199                         break;
1200
1201                 default:
1202                         ndata->tag = TEGRA_MC_ICC_TAG_DEFAULT;
1203                         break;
1204                 }
1205
1206                 return ndata;
1207         }
1208
1209         for (i = 0; i < mc->soc->num_clients; i++) {
1210                 if (mc->soc->clients[i].id == idx)
1211                         return ERR_PTR(-EPROBE_DEFER);
1212         }
1213
1214         dev_err(mc->dev, "invalid ICC client ID %u\n", idx);
1215
1216         return ERR_PTR(-EINVAL);
1217 }
1218
1219 static const struct tegra_mc_icc_ops tegra124_mc_icc_ops = {
1220         .xlate_extended = tegra124_mc_of_icc_xlate_extended,
1221         .aggregate = tegra124_mc_icc_aggreate,
1222         .set = tegra124_mc_icc_set,
1223 };
1224
1225 #ifdef CONFIG_ARCH_TEGRA_124_SOC
1226 static const unsigned long tegra124_mc_emem_regs[] = {
1227         MC_EMEM_ARB_CFG,
1228         MC_EMEM_ARB_OUTSTANDING_REQ,
1229         MC_EMEM_ARB_TIMING_RCD,
1230         MC_EMEM_ARB_TIMING_RP,
1231         MC_EMEM_ARB_TIMING_RC,
1232         MC_EMEM_ARB_TIMING_RAS,
1233         MC_EMEM_ARB_TIMING_FAW,
1234         MC_EMEM_ARB_TIMING_RRD,
1235         MC_EMEM_ARB_TIMING_RAP2PRE,
1236         MC_EMEM_ARB_TIMING_WAP2PRE,
1237         MC_EMEM_ARB_TIMING_R2R,
1238         MC_EMEM_ARB_TIMING_W2W,
1239         MC_EMEM_ARB_TIMING_R2W,
1240         MC_EMEM_ARB_TIMING_W2R,
1241         MC_EMEM_ARB_DA_TURNS,
1242         MC_EMEM_ARB_DA_COVERS,
1243         MC_EMEM_ARB_MISC0,
1244         MC_EMEM_ARB_MISC1,
1245         MC_EMEM_ARB_RING1_THROTTLE
1246 };
1247
1248 static const struct tegra_smmu_soc tegra124_smmu_soc = {
1249         .clients = tegra124_mc_clients,
1250         .num_clients = ARRAY_SIZE(tegra124_mc_clients),
1251         .swgroups = tegra124_swgroups,
1252         .num_swgroups = ARRAY_SIZE(tegra124_swgroups),
1253         .groups = tegra124_groups,
1254         .num_groups = ARRAY_SIZE(tegra124_groups),
1255         .supports_round_robin_arbitration = true,
1256         .supports_request_limit = true,
1257         .num_tlb_lines = 32,
1258         .num_asids = 128,
1259 };
1260
1261 const struct tegra_mc_soc tegra124_mc_soc = {
1262         .clients = tegra124_mc_clients,
1263         .num_clients = ARRAY_SIZE(tegra124_mc_clients),
1264         .num_address_bits = 34,
1265         .atom_size = 32,
1266         .client_id_mask = 0x7f,
1267         .smmu = &tegra124_smmu_soc,
1268         .emem_regs = tegra124_mc_emem_regs,
1269         .num_emem_regs = ARRAY_SIZE(tegra124_mc_emem_regs),
1270         .intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
1271                    MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
1272                    MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
1273         .reset_ops = &tegra_mc_reset_ops_common,
1274         .resets = tegra124_mc_resets,
1275         .num_resets = ARRAY_SIZE(tegra124_mc_resets),
1276         .icc_ops = &tegra124_mc_icc_ops,
1277         .ops = &tegra30_mc_ops,
1278 };
1279 #endif /* CONFIG_ARCH_TEGRA_124_SOC */
1280
1281 #ifdef CONFIG_ARCH_TEGRA_132_SOC
1282 static const struct tegra_smmu_soc tegra132_smmu_soc = {
1283         .clients = tegra124_mc_clients,
1284         .num_clients = ARRAY_SIZE(tegra124_mc_clients),
1285         .swgroups = tegra124_swgroups,
1286         .num_swgroups = ARRAY_SIZE(tegra124_swgroups),
1287         .groups = tegra124_groups,
1288         .num_groups = ARRAY_SIZE(tegra124_groups),
1289         .supports_round_robin_arbitration = true,
1290         .supports_request_limit = true,
1291         .num_tlb_lines = 32,
1292         .num_asids = 128,
1293 };
1294
1295 const struct tegra_mc_soc tegra132_mc_soc = {
1296         .clients = tegra124_mc_clients,
1297         .num_clients = ARRAY_SIZE(tegra124_mc_clients),
1298         .num_address_bits = 34,
1299         .atom_size = 32,
1300         .client_id_mask = 0x7f,
1301         .smmu = &tegra132_smmu_soc,
1302         .intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
1303                    MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
1304                    MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
1305         .reset_ops = &tegra_mc_reset_ops_common,
1306         .resets = tegra124_mc_resets,
1307         .num_resets = ARRAY_SIZE(tegra124_mc_resets),
1308         .icc_ops = &tegra124_mc_icc_ops,
1309         .ops = &tegra30_mc_ops,
1310 };
1311 #endif /* CONFIG_ARCH_TEGRA_132_SOC */