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