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