xref: /linux/drivers/memory/tegra/tegra30.c (revision e6f2a617ac53bc0753b885ffb94379ff48b2e2df)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2014 NVIDIA CORPORATION.  All rights reserved.
4  */
5 
6 #include <linux/of.h>
7 #include <linux/mm.h>
8 
9 #include <dt-bindings/memory/tegra30-mc.h>
10 
11 #include "mc.h"
12 
13 static const unsigned long tegra30_mc_emem_regs[] = {
14 	MC_EMEM_ARB_CFG,
15 	MC_EMEM_ARB_OUTSTANDING_REQ,
16 	MC_EMEM_ARB_TIMING_RCD,
17 	MC_EMEM_ARB_TIMING_RP,
18 	MC_EMEM_ARB_TIMING_RC,
19 	MC_EMEM_ARB_TIMING_RAS,
20 	MC_EMEM_ARB_TIMING_FAW,
21 	MC_EMEM_ARB_TIMING_RRD,
22 	MC_EMEM_ARB_TIMING_RAP2PRE,
23 	MC_EMEM_ARB_TIMING_WAP2PRE,
24 	MC_EMEM_ARB_TIMING_R2R,
25 	MC_EMEM_ARB_TIMING_W2W,
26 	MC_EMEM_ARB_TIMING_R2W,
27 	MC_EMEM_ARB_TIMING_W2R,
28 	MC_EMEM_ARB_DA_TURNS,
29 	MC_EMEM_ARB_DA_COVERS,
30 	MC_EMEM_ARB_MISC0,
31 	MC_EMEM_ARB_RING1_THROTTLE,
32 };
33 
34 static const struct tegra_mc_client tegra30_mc_clients[] = {
35 	{
36 		.id = 0x00,
37 		.name = "ptcr",
38 		.swgroup = TEGRA_SWGROUP_PTC,
39 	}, {
40 		.id = 0x01,
41 		.name = "display0a",
42 		.swgroup = TEGRA_SWGROUP_DC,
43 		.smmu = {
44 			.reg = 0x228,
45 			.bit = 1,
46 		},
47 		.la = {
48 			.reg = 0x2e8,
49 			.shift = 0,
50 			.mask = 0xff,
51 			.def = 0x4e,
52 		},
53 	}, {
54 		.id = 0x02,
55 		.name = "display0ab",
56 		.swgroup = TEGRA_SWGROUP_DCB,
57 		.smmu = {
58 			.reg = 0x228,
59 			.bit = 2,
60 		},
61 		.la = {
62 			.reg = 0x2f4,
63 			.shift = 0,
64 			.mask = 0xff,
65 			.def = 0x4e,
66 		},
67 	}, {
68 		.id = 0x03,
69 		.name = "display0b",
70 		.swgroup = TEGRA_SWGROUP_DC,
71 		.smmu = {
72 			.reg = 0x228,
73 			.bit = 3,
74 		},
75 		.la = {
76 			.reg = 0x2e8,
77 			.shift = 16,
78 			.mask = 0xff,
79 			.def = 0x4e,
80 		},
81 	}, {
82 		.id = 0x04,
83 		.name = "display0bb",
84 		.swgroup = TEGRA_SWGROUP_DCB,
85 		.smmu = {
86 			.reg = 0x228,
87 			.bit = 4,
88 		},
89 		.la = {
90 			.reg = 0x2f4,
91 			.shift = 16,
92 			.mask = 0xff,
93 			.def = 0x4e,
94 		},
95 	}, {
96 		.id = 0x05,
97 		.name = "display0c",
98 		.swgroup = TEGRA_SWGROUP_DC,
99 		.smmu = {
100 			.reg = 0x228,
101 			.bit = 5,
102 		},
103 		.la = {
104 			.reg = 0x2ec,
105 			.shift = 0,
106 			.mask = 0xff,
107 			.def = 0x4e,
108 		},
109 	}, {
110 		.id = 0x06,
111 		.name = "display0cb",
112 		.swgroup = TEGRA_SWGROUP_DCB,
113 		.smmu = {
114 			.reg = 0x228,
115 			.bit = 6,
116 		},
117 		.la = {
118 			.reg = 0x2f8,
119 			.shift = 0,
120 			.mask = 0xff,
121 			.def = 0x4e,
122 		},
123 	}, {
124 		.id = 0x07,
125 		.name = "display1b",
126 		.swgroup = TEGRA_SWGROUP_DC,
127 		.smmu = {
128 			.reg = 0x228,
129 			.bit = 7,
130 		},
131 		.la = {
132 			.reg = 0x2ec,
133 			.shift = 16,
134 			.mask = 0xff,
135 			.def = 0x4e,
136 		},
137 	}, {
138 		.id = 0x08,
139 		.name = "display1bb",
140 		.swgroup = TEGRA_SWGROUP_DCB,
141 		.smmu = {
142 			.reg = 0x228,
143 			.bit = 8,
144 		},
145 		.la = {
146 			.reg = 0x2f8,
147 			.shift = 16,
148 			.mask = 0xff,
149 			.def = 0x4e,
150 		},
151 	}, {
152 		.id = 0x09,
153 		.name = "eppup",
154 		.swgroup = TEGRA_SWGROUP_EPP,
155 		.smmu = {
156 			.reg = 0x228,
157 			.bit = 9,
158 		},
159 		.la = {
160 			.reg = 0x300,
161 			.shift = 0,
162 			.mask = 0xff,
163 			.def = 0x17,
164 		},
165 	}, {
166 		.id = 0x0a,
167 		.name = "g2pr",
168 		.swgroup = TEGRA_SWGROUP_G2,
169 		.smmu = {
170 			.reg = 0x228,
171 			.bit = 10,
172 		},
173 		.la = {
174 			.reg = 0x308,
175 			.shift = 0,
176 			.mask = 0xff,
177 			.def = 0x09,
178 		},
179 	}, {
180 		.id = 0x0b,
181 		.name = "g2sr",
182 		.swgroup = TEGRA_SWGROUP_G2,
183 		.smmu = {
184 			.reg = 0x228,
185 			.bit = 11,
186 		},
187 		.la = {
188 			.reg = 0x308,
189 			.shift = 16,
190 			.mask = 0xff,
191 			.def = 0x09,
192 		},
193 	}, {
194 		.id = 0x0c,
195 		.name = "mpeunifbr",
196 		.swgroup = TEGRA_SWGROUP_MPE,
197 		.smmu = {
198 			.reg = 0x228,
199 			.bit = 12,
200 		},
201 		.la = {
202 			.reg = 0x328,
203 			.shift = 0,
204 			.mask = 0xff,
205 			.def = 0x50,
206 		},
207 	}, {
208 		.id = 0x0d,
209 		.name = "viruv",
210 		.swgroup = TEGRA_SWGROUP_VI,
211 		.smmu = {
212 			.reg = 0x228,
213 			.bit = 13,
214 		},
215 		.la = {
216 			.reg = 0x364,
217 			.shift = 0,
218 			.mask = 0xff,
219 			.def = 0x2c,
220 		},
221 	}, {
222 		.id = 0x0e,
223 		.name = "afir",
224 		.swgroup = TEGRA_SWGROUP_AFI,
225 		.smmu = {
226 			.reg = 0x228,
227 			.bit = 14,
228 		},
229 		.la = {
230 			.reg = 0x2e0,
231 			.shift = 0,
232 			.mask = 0xff,
233 			.def = 0x10,
234 		},
235 	}, {
236 		.id = 0x0f,
237 		.name = "avpcarm7r",
238 		.swgroup = TEGRA_SWGROUP_AVPC,
239 		.smmu = {
240 			.reg = 0x228,
241 			.bit = 15,
242 		},
243 		.la = {
244 			.reg = 0x2e4,
245 			.shift = 0,
246 			.mask = 0xff,
247 			.def = 0x04,
248 		},
249 	}, {
250 		.id = 0x10,
251 		.name = "displayhc",
252 		.swgroup = TEGRA_SWGROUP_DC,
253 		.smmu = {
254 			.reg = 0x228,
255 			.bit = 16,
256 		},
257 		.la = {
258 			.reg = 0x2f0,
259 			.shift = 0,
260 			.mask = 0xff,
261 			.def = 0xff,
262 		},
263 	}, {
264 		.id = 0x11,
265 		.name = "displayhcb",
266 		.swgroup = TEGRA_SWGROUP_DCB,
267 		.smmu = {
268 			.reg = 0x228,
269 			.bit = 17,
270 		},
271 		.la = {
272 			.reg = 0x2fc,
273 			.shift = 0,
274 			.mask = 0xff,
275 			.def = 0xff,
276 		},
277 	}, {
278 		.id = 0x12,
279 		.name = "fdcdrd",
280 		.swgroup = TEGRA_SWGROUP_NV,
281 		.smmu = {
282 			.reg = 0x228,
283 			.bit = 18,
284 		},
285 		.la = {
286 			.reg = 0x334,
287 			.shift = 0,
288 			.mask = 0xff,
289 			.def = 0x0a,
290 		},
291 	}, {
292 		.id = 0x13,
293 		.name = "fdcdrd2",
294 		.swgroup = TEGRA_SWGROUP_NV2,
295 		.smmu = {
296 			.reg = 0x228,
297 			.bit = 19,
298 		},
299 		.la = {
300 			.reg = 0x33c,
301 			.shift = 0,
302 			.mask = 0xff,
303 			.def = 0x0a,
304 		},
305 	}, {
306 		.id = 0x14,
307 		.name = "g2dr",
308 		.swgroup = TEGRA_SWGROUP_G2,
309 		.smmu = {
310 			.reg = 0x228,
311 			.bit = 20,
312 		},
313 		.la = {
314 			.reg = 0x30c,
315 			.shift = 0,
316 			.mask = 0xff,
317 			.def = 0x0a,
318 		},
319 	}, {
320 		.id = 0x15,
321 		.name = "hdar",
322 		.swgroup = TEGRA_SWGROUP_HDA,
323 		.smmu = {
324 			.reg = 0x228,
325 			.bit = 21,
326 		},
327 		.la = {
328 			.reg = 0x318,
329 			.shift = 0,
330 			.mask = 0xff,
331 			.def = 0xff,
332 		},
333 	}, {
334 		.id = 0x16,
335 		.name = "host1xdmar",
336 		.swgroup = TEGRA_SWGROUP_HC,
337 		.smmu = {
338 			.reg = 0x228,
339 			.bit = 22,
340 		},
341 		.la = {
342 			.reg = 0x310,
343 			.shift = 0,
344 			.mask = 0xff,
345 			.def = 0x05,
346 		},
347 	}, {
348 		.id = 0x17,
349 		.name = "host1xr",
350 		.swgroup = TEGRA_SWGROUP_HC,
351 		.smmu = {
352 			.reg = 0x228,
353 			.bit = 23,
354 		},
355 		.la = {
356 			.reg = 0x310,
357 			.shift = 16,
358 			.mask = 0xff,
359 			.def = 0x50,
360 		},
361 	}, {
362 		.id = 0x18,
363 		.name = "idxsrd",
364 		.swgroup = TEGRA_SWGROUP_NV,
365 		.smmu = {
366 			.reg = 0x228,
367 			.bit = 24,
368 		},
369 		.la = {
370 			.reg = 0x334,
371 			.shift = 16,
372 			.mask = 0xff,
373 			.def = 0x13,
374 		},
375 	}, {
376 		.id = 0x19,
377 		.name = "idxsrd2",
378 		.swgroup = TEGRA_SWGROUP_NV2,
379 		.smmu = {
380 			.reg = 0x228,
381 			.bit = 25,
382 		},
383 		.la = {
384 			.reg = 0x33c,
385 			.shift = 16,
386 			.mask = 0xff,
387 			.def = 0x13,
388 		},
389 	}, {
390 		.id = 0x1a,
391 		.name = "mpe_ipred",
392 		.swgroup = TEGRA_SWGROUP_MPE,
393 		.smmu = {
394 			.reg = 0x228,
395 			.bit = 26,
396 		},
397 		.la = {
398 			.reg = 0x328,
399 			.shift = 16,
400 			.mask = 0xff,
401 			.def = 0x80,
402 		},
403 	}, {
404 		.id = 0x1b,
405 		.name = "mpeamemrd",
406 		.swgroup = TEGRA_SWGROUP_MPE,
407 		.smmu = {
408 			.reg = 0x228,
409 			.bit = 27,
410 		},
411 		.la = {
412 			.reg = 0x32c,
413 			.shift = 0,
414 			.mask = 0xff,
415 			.def = 0x42,
416 		},
417 	}, {
418 		.id = 0x1c,
419 		.name = "mpecsrd",
420 		.swgroup = TEGRA_SWGROUP_MPE,
421 		.smmu = {
422 			.reg = 0x228,
423 			.bit = 28,
424 		},
425 		.la = {
426 			.reg = 0x32c,
427 			.shift = 16,
428 			.mask = 0xff,
429 			.def = 0xff,
430 		},
431 	}, {
432 		.id = 0x1d,
433 		.name = "ppcsahbdmar",
434 		.swgroup = TEGRA_SWGROUP_PPCS,
435 		.smmu = {
436 			.reg = 0x228,
437 			.bit = 29,
438 		},
439 		.la = {
440 			.reg = 0x344,
441 			.shift = 0,
442 			.mask = 0xff,
443 			.def = 0x10,
444 		},
445 	}, {
446 		.id = 0x1e,
447 		.name = "ppcsahbslvr",
448 		.swgroup = TEGRA_SWGROUP_PPCS,
449 		.smmu = {
450 			.reg = 0x228,
451 			.bit = 30,
452 		},
453 		.la = {
454 			.reg = 0x344,
455 			.shift = 16,
456 			.mask = 0xff,
457 			.def = 0x12,
458 		},
459 	}, {
460 		.id = 0x1f,
461 		.name = "satar",
462 		.swgroup = TEGRA_SWGROUP_SATA,
463 		.smmu = {
464 			.reg = 0x228,
465 			.bit = 31,
466 		},
467 		.la = {
468 			.reg = 0x350,
469 			.shift = 0,
470 			.mask = 0xff,
471 			.def = 0x33,
472 		},
473 	}, {
474 		.id = 0x20,
475 		.name = "texsrd",
476 		.swgroup = TEGRA_SWGROUP_NV,
477 		.smmu = {
478 			.reg = 0x22c,
479 			.bit = 0,
480 		},
481 		.la = {
482 			.reg = 0x338,
483 			.shift = 0,
484 			.mask = 0xff,
485 			.def = 0x13,
486 		},
487 	}, {
488 		.id = 0x21,
489 		.name = "texsrd2",
490 		.swgroup = TEGRA_SWGROUP_NV2,
491 		.smmu = {
492 			.reg = 0x22c,
493 			.bit = 1,
494 		},
495 		.la = {
496 			.reg = 0x340,
497 			.shift = 0,
498 			.mask = 0xff,
499 			.def = 0x13,
500 		},
501 	}, {
502 		.id = 0x22,
503 		.name = "vdebsevr",
504 		.swgroup = TEGRA_SWGROUP_VDE,
505 		.smmu = {
506 			.reg = 0x22c,
507 			.bit = 2,
508 		},
509 		.la = {
510 			.reg = 0x354,
511 			.shift = 0,
512 			.mask = 0xff,
513 			.def = 0xff,
514 		},
515 	}, {
516 		.id = 0x23,
517 		.name = "vdember",
518 		.swgroup = TEGRA_SWGROUP_VDE,
519 		.smmu = {
520 			.reg = 0x22c,
521 			.bit = 3,
522 		},
523 		.la = {
524 			.reg = 0x354,
525 			.shift = 16,
526 			.mask = 0xff,
527 			.def = 0xd0,
528 		},
529 	}, {
530 		.id = 0x24,
531 		.name = "vdemcer",
532 		.swgroup = TEGRA_SWGROUP_VDE,
533 		.smmu = {
534 			.reg = 0x22c,
535 			.bit = 4,
536 		},
537 		.la = {
538 			.reg = 0x358,
539 			.shift = 0,
540 			.mask = 0xff,
541 			.def = 0x2a,
542 		},
543 	}, {
544 		.id = 0x25,
545 		.name = "vdetper",
546 		.swgroup = TEGRA_SWGROUP_VDE,
547 		.smmu = {
548 			.reg = 0x22c,
549 			.bit = 5,
550 		},
551 		.la = {
552 			.reg = 0x358,
553 			.shift = 16,
554 			.mask = 0xff,
555 			.def = 0x74,
556 		},
557 	}, {
558 		.id = 0x26,
559 		.name = "mpcorelpr",
560 		.swgroup = TEGRA_SWGROUP_MPCORELP,
561 		.la = {
562 			.reg = 0x324,
563 			.shift = 0,
564 			.mask = 0xff,
565 			.def = 0x04,
566 		},
567 	}, {
568 		.id = 0x27,
569 		.name = "mpcorer",
570 		.swgroup = TEGRA_SWGROUP_MPCORE,
571 		.la = {
572 			.reg = 0x320,
573 			.shift = 0,
574 			.mask = 0xff,
575 			.def = 0x04,
576 		},
577 	}, {
578 		.id = 0x28,
579 		.name = "eppu",
580 		.swgroup = TEGRA_SWGROUP_EPP,
581 		.smmu = {
582 			.reg = 0x22c,
583 			.bit = 8,
584 		},
585 		.la = {
586 			.reg = 0x300,
587 			.shift = 16,
588 			.mask = 0xff,
589 			.def = 0x6c,
590 		},
591 	}, {
592 		.id = 0x29,
593 		.name = "eppv",
594 		.swgroup = TEGRA_SWGROUP_EPP,
595 		.smmu = {
596 			.reg = 0x22c,
597 			.bit = 9,
598 		},
599 		.la = {
600 			.reg = 0x304,
601 			.shift = 0,
602 			.mask = 0xff,
603 			.def = 0x6c,
604 		},
605 	}, {
606 		.id = 0x2a,
607 		.name = "eppy",
608 		.swgroup = TEGRA_SWGROUP_EPP,
609 		.smmu = {
610 			.reg = 0x22c,
611 			.bit = 10,
612 		},
613 		.la = {
614 			.reg = 0x304,
615 			.shift = 16,
616 			.mask = 0xff,
617 			.def = 0x6c,
618 		},
619 	}, {
620 		.id = 0x2b,
621 		.name = "mpeunifbw",
622 		.swgroup = TEGRA_SWGROUP_MPE,
623 		.smmu = {
624 			.reg = 0x22c,
625 			.bit = 11,
626 		},
627 		.la = {
628 			.reg = 0x330,
629 			.shift = 0,
630 			.mask = 0xff,
631 			.def = 0x13,
632 		},
633 	}, {
634 		.id = 0x2c,
635 		.name = "viwsb",
636 		.swgroup = TEGRA_SWGROUP_VI,
637 		.smmu = {
638 			.reg = 0x22c,
639 			.bit = 12,
640 		},
641 		.la = {
642 			.reg = 0x364,
643 			.shift = 16,
644 			.mask = 0xff,
645 			.def = 0x12,
646 		},
647 	}, {
648 		.id = 0x2d,
649 		.name = "viwu",
650 		.swgroup = TEGRA_SWGROUP_VI,
651 		.smmu = {
652 			.reg = 0x22c,
653 			.bit = 13,
654 		},
655 		.la = {
656 			.reg = 0x368,
657 			.shift = 0,
658 			.mask = 0xff,
659 			.def = 0xb2,
660 		},
661 	}, {
662 		.id = 0x2e,
663 		.name = "viwv",
664 		.swgroup = TEGRA_SWGROUP_VI,
665 		.smmu = {
666 			.reg = 0x22c,
667 			.bit = 14,
668 		},
669 		.la = {
670 			.reg = 0x368,
671 			.shift = 16,
672 			.mask = 0xff,
673 			.def = 0xb2,
674 		},
675 	}, {
676 		.id = 0x2f,
677 		.name = "viwy",
678 		.swgroup = TEGRA_SWGROUP_VI,
679 		.smmu = {
680 			.reg = 0x22c,
681 			.bit = 15,
682 		},
683 		.la = {
684 			.reg = 0x36c,
685 			.shift = 0,
686 			.mask = 0xff,
687 			.def = 0x12,
688 		},
689 	}, {
690 		.id = 0x30,
691 		.name = "g2dw",
692 		.swgroup = TEGRA_SWGROUP_G2,
693 		.smmu = {
694 			.reg = 0x22c,
695 			.bit = 16,
696 		},
697 		.la = {
698 			.reg = 0x30c,
699 			.shift = 16,
700 			.mask = 0xff,
701 			.def = 0x9,
702 		},
703 	}, {
704 		.id = 0x31,
705 		.name = "afiw",
706 		.swgroup = TEGRA_SWGROUP_AFI,
707 		.smmu = {
708 			.reg = 0x22c,
709 			.bit = 17,
710 		},
711 		.la = {
712 			.reg = 0x2e0,
713 			.shift = 16,
714 			.mask = 0xff,
715 			.def = 0x0c,
716 		},
717 	}, {
718 		.id = 0x32,
719 		.name = "avpcarm7w",
720 		.swgroup = TEGRA_SWGROUP_AVPC,
721 		.smmu = {
722 			.reg = 0x22c,
723 			.bit = 18,
724 		},
725 		.la = {
726 			.reg = 0x2e4,
727 			.shift = 16,
728 			.mask = 0xff,
729 			.def = 0x0e,
730 		},
731 	}, {
732 		.id = 0x33,
733 		.name = "fdcdwr",
734 		.swgroup = TEGRA_SWGROUP_NV,
735 		.smmu = {
736 			.reg = 0x22c,
737 			.bit = 19,
738 		},
739 		.la = {
740 			.reg = 0x338,
741 			.shift = 16,
742 			.mask = 0xff,
743 			.def = 0x0a,
744 		},
745 	}, {
746 		.id = 0x34,
747 		.name = "fdcdwr2",
748 		.swgroup = TEGRA_SWGROUP_NV2,
749 		.smmu = {
750 			.reg = 0x22c,
751 			.bit = 20,
752 		},
753 		.la = {
754 			.reg = 0x340,
755 			.shift = 16,
756 			.mask = 0xff,
757 			.def = 0x0a,
758 		},
759 	}, {
760 		.id = 0x35,
761 		.name = "hdaw",
762 		.swgroup = TEGRA_SWGROUP_HDA,
763 		.smmu = {
764 			.reg = 0x22c,
765 			.bit = 21,
766 		},
767 		.la = {
768 			.reg = 0x318,
769 			.shift = 16,
770 			.mask = 0xff,
771 			.def = 0xff,
772 		},
773 	}, {
774 		.id = 0x36,
775 		.name = "host1xw",
776 		.swgroup = TEGRA_SWGROUP_HC,
777 		.smmu = {
778 			.reg = 0x22c,
779 			.bit = 22,
780 		},
781 		.la = {
782 			.reg = 0x314,
783 			.shift = 0,
784 			.mask = 0xff,
785 			.def = 0x10,
786 		},
787 	}, {
788 		.id = 0x37,
789 		.name = "ispw",
790 		.swgroup = TEGRA_SWGROUP_ISP,
791 		.smmu = {
792 			.reg = 0x22c,
793 			.bit = 23,
794 		},
795 		.la = {
796 			.reg = 0x31c,
797 			.shift = 0,
798 			.mask = 0xff,
799 			.def = 0xff,
800 		},
801 	}, {
802 		.id = 0x38,
803 		.name = "mpcorelpw",
804 		.swgroup = TEGRA_SWGROUP_MPCORELP,
805 		.la = {
806 			.reg = 0x324,
807 			.shift = 16,
808 			.mask = 0xff,
809 			.def = 0x0e,
810 		},
811 	}, {
812 		.id = 0x39,
813 		.name = "mpcorew",
814 		.swgroup = TEGRA_SWGROUP_MPCORE,
815 		.la = {
816 			.reg = 0x320,
817 			.shift = 16,
818 			.mask = 0xff,
819 			.def = 0x0e,
820 		},
821 	}, {
822 		.id = 0x3a,
823 		.name = "mpecswr",
824 		.swgroup = TEGRA_SWGROUP_MPE,
825 		.smmu = {
826 			.reg = 0x22c,
827 			.bit = 26,
828 		},
829 		.la = {
830 			.reg = 0x330,
831 			.shift = 16,
832 			.mask = 0xff,
833 			.def = 0xff,
834 		},
835 	}, {
836 		.id = 0x3b,
837 		.name = "ppcsahbdmaw",
838 		.swgroup = TEGRA_SWGROUP_PPCS,
839 		.smmu = {
840 			.reg = 0x22c,
841 			.bit = 27,
842 		},
843 		.la = {
844 			.reg = 0x348,
845 			.shift = 0,
846 			.mask = 0xff,
847 			.def = 0x10,
848 		},
849 	}, {
850 		.id = 0x3c,
851 		.name = "ppcsahbslvw",
852 		.swgroup = TEGRA_SWGROUP_PPCS,
853 		.smmu = {
854 			.reg = 0x22c,
855 			.bit = 28,
856 		},
857 		.la = {
858 			.reg = 0x348,
859 			.shift = 16,
860 			.mask = 0xff,
861 			.def = 0x06,
862 		},
863 	}, {
864 		.id = 0x3d,
865 		.name = "sataw",
866 		.swgroup = TEGRA_SWGROUP_SATA,
867 		.smmu = {
868 			.reg = 0x22c,
869 			.bit = 29,
870 		},
871 		.la = {
872 			.reg = 0x350,
873 			.shift = 16,
874 			.mask = 0xff,
875 			.def = 0x33,
876 		},
877 	}, {
878 		.id = 0x3e,
879 		.name = "vdebsevw",
880 		.swgroup = TEGRA_SWGROUP_VDE,
881 		.smmu = {
882 			.reg = 0x22c,
883 			.bit = 30,
884 		},
885 		.la = {
886 			.reg = 0x35c,
887 			.shift = 0,
888 			.mask = 0xff,
889 			.def = 0xff,
890 		},
891 	}, {
892 		.id = 0x3f,
893 		.name = "vdedbgw",
894 		.swgroup = TEGRA_SWGROUP_VDE,
895 		.smmu = {
896 			.reg = 0x22c,
897 			.bit = 31,
898 		},
899 		.la = {
900 			.reg = 0x35c,
901 			.shift = 16,
902 			.mask = 0xff,
903 			.def = 0xff,
904 		},
905 	}, {
906 		.id = 0x40,
907 		.name = "vdembew",
908 		.swgroup = TEGRA_SWGROUP_VDE,
909 		.smmu = {
910 			.reg = 0x230,
911 			.bit = 0,
912 		},
913 		.la = {
914 			.reg = 0x360,
915 			.shift = 0,
916 			.mask = 0xff,
917 			.def = 0x42,
918 		},
919 	}, {
920 		.id = 0x41,
921 		.name = "vdetpmw",
922 		.swgroup = TEGRA_SWGROUP_VDE,
923 		.smmu = {
924 			.reg = 0x230,
925 			.bit = 1,
926 		},
927 		.la = {
928 			.reg = 0x360,
929 			.shift = 16,
930 			.mask = 0xff,
931 			.def = 0x2a,
932 		},
933 	},
934 };
935 
936 static const struct tegra_smmu_swgroup tegra30_swgroups[] = {
937 	{ .name = "dc",   .swgroup = TEGRA_SWGROUP_DC,   .reg = 0x240 },
938 	{ .name = "dcb",  .swgroup = TEGRA_SWGROUP_DCB,  .reg = 0x244 },
939 	{ .name = "epp",  .swgroup = TEGRA_SWGROUP_EPP,  .reg = 0x248 },
940 	{ .name = "g2",   .swgroup = TEGRA_SWGROUP_G2,   .reg = 0x24c },
941 	{ .name = "mpe",  .swgroup = TEGRA_SWGROUP_MPE,  .reg = 0x264 },
942 	{ .name = "vi",   .swgroup = TEGRA_SWGROUP_VI,   .reg = 0x280 },
943 	{ .name = "afi",  .swgroup = TEGRA_SWGROUP_AFI,  .reg = 0x238 },
944 	{ .name = "avpc", .swgroup = TEGRA_SWGROUP_AVPC, .reg = 0x23c },
945 	{ .name = "nv",   .swgroup = TEGRA_SWGROUP_NV,   .reg = 0x268 },
946 	{ .name = "nv2",  .swgroup = TEGRA_SWGROUP_NV2,  .reg = 0x26c },
947 	{ .name = "hda",  .swgroup = TEGRA_SWGROUP_HDA,  .reg = 0x254 },
948 	{ .name = "hc",   .swgroup = TEGRA_SWGROUP_HC,   .reg = 0x250 },
949 	{ .name = "ppcs", .swgroup = TEGRA_SWGROUP_PPCS, .reg = 0x270 },
950 	{ .name = "sata", .swgroup = TEGRA_SWGROUP_SATA, .reg = 0x278 },
951 	{ .name = "vde",  .swgroup = TEGRA_SWGROUP_VDE,  .reg = 0x27c },
952 	{ .name = "isp",  .swgroup = TEGRA_SWGROUP_ISP,  .reg = 0x258 },
953 };
954 
955 static const unsigned int tegra30_group_drm[] = {
956 	TEGRA_SWGROUP_DC,
957 	TEGRA_SWGROUP_DCB,
958 	TEGRA_SWGROUP_G2,
959 	TEGRA_SWGROUP_NV,
960 	TEGRA_SWGROUP_NV2,
961 };
962 
963 static const struct tegra_smmu_group_soc tegra30_groups[] = {
964 	{
965 		.name = "drm",
966 		.swgroups = tegra30_group_drm,
967 		.num_swgroups = ARRAY_SIZE(tegra30_group_drm),
968 	},
969 };
970 
971 static const struct tegra_smmu_soc tegra30_smmu_soc = {
972 	.clients = tegra30_mc_clients,
973 	.num_clients = ARRAY_SIZE(tegra30_mc_clients),
974 	.swgroups = tegra30_swgroups,
975 	.num_swgroups = ARRAY_SIZE(tegra30_swgroups),
976 	.groups = tegra30_groups,
977 	.num_groups = ARRAY_SIZE(tegra30_groups),
978 	.supports_round_robin_arbitration = false,
979 	.supports_request_limit = false,
980 	.num_tlb_lines = 16,
981 	.num_asids = 4,
982 };
983 
984 #define TEGRA30_MC_RESET(_name, _control, _status, _bit)	\
985 	{							\
986 		.name = #_name,					\
987 		.id = TEGRA30_MC_RESET_##_name,			\
988 		.control = _control,				\
989 		.status = _status,				\
990 		.bit = _bit,					\
991 	}
992 
993 static const struct tegra_mc_reset tegra30_mc_resets[] = {
994 	TEGRA30_MC_RESET(AFI,      0x200, 0x204,  0),
995 	TEGRA30_MC_RESET(AVPC,     0x200, 0x204,  1),
996 	TEGRA30_MC_RESET(DC,       0x200, 0x204,  2),
997 	TEGRA30_MC_RESET(DCB,      0x200, 0x204,  3),
998 	TEGRA30_MC_RESET(EPP,      0x200, 0x204,  4),
999 	TEGRA30_MC_RESET(2D,       0x200, 0x204,  5),
1000 	TEGRA30_MC_RESET(HC,       0x200, 0x204,  6),
1001 	TEGRA30_MC_RESET(HDA,      0x200, 0x204,  7),
1002 	TEGRA30_MC_RESET(ISP,      0x200, 0x204,  8),
1003 	TEGRA30_MC_RESET(MPCORE,   0x200, 0x204,  9),
1004 	TEGRA30_MC_RESET(MPCORELP, 0x200, 0x204, 10),
1005 	TEGRA30_MC_RESET(MPE,      0x200, 0x204, 11),
1006 	TEGRA30_MC_RESET(3D,       0x200, 0x204, 12),
1007 	TEGRA30_MC_RESET(3D2,      0x200, 0x204, 13),
1008 	TEGRA30_MC_RESET(PPCS,     0x200, 0x204, 14),
1009 	TEGRA30_MC_RESET(SATA,     0x200, 0x204, 15),
1010 	TEGRA30_MC_RESET(VDE,      0x200, 0x204, 16),
1011 	TEGRA30_MC_RESET(VI,       0x200, 0x204, 17),
1012 };
1013 
1014 const struct tegra_mc_soc tegra30_mc_soc = {
1015 	.clients = tegra30_mc_clients,
1016 	.num_clients = ARRAY_SIZE(tegra30_mc_clients),
1017 	.num_address_bits = 32,
1018 	.atom_size = 16,
1019 	.client_id_mask = 0x7f,
1020 	.smmu = &tegra30_smmu_soc,
1021 	.emem_regs = tegra30_mc_emem_regs,
1022 	.num_emem_regs = ARRAY_SIZE(tegra30_mc_emem_regs),
1023 	.intmask = MC_INT_INVALID_SMMU_PAGE | MC_INT_SECURITY_VIOLATION |
1024 		   MC_INT_DECERR_EMEM,
1025 	.reset_ops = &tegra_mc_reset_ops_common,
1026 	.resets = tegra30_mc_resets,
1027 	.num_resets = ARRAY_SIZE(tegra30_mc_resets),
1028 };
1029