aboutsummaryrefslogtreecommitdiff
path: root/plat/nvidia/tegra/include/drivers/smmu.h
blob: 9582a67ed376c799723e08797c245357d85406ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
/*
 * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef SMMU_H
#define SMMU_H

#include <lib/mmio.h>

#include <memctrl_v2.h>
#include <tegra_def.h>

/*******************************************************************************
 * SMMU Register constants
 ******************************************************************************/
#define SMMU_CBn_SCTLR				(0x0U)
#define SMMU_CBn_SCTLR_STAGE2			(0x0U)
#define SMMU_CBn_ACTLR				(0x4U)
#define SMMU_CBn_RESUME				(0x8U)
#define SMMU_CBn_TCR2				(0x10U)
#define SMMU_CBn_TTBR0_LO			(0x20U)
#define SMMU_CBn_TTBR0_HI			(0x24U)
#define SMMU_CBn_TTBR1_LO			(0x28U)
#define SMMU_CBn_TTBR1_HI			(0x2cU)
#define SMMU_CBn_TCR_LPAE			(0x30U)
#define SMMU_CBn_TCR				(0x30U)
#define SMMU_CBn_TCR_EAE_1			(0x30U)
#define SMMU_CBn_TCR				(0x30U)
#define SMMU_CBn_CONTEXTIDR			(0x34U)
#define SMMU_CBn_CONTEXTIDR_EAE_1		(0x34U)
#define SMMU_CBn_PRRR_MAIR0			(0x38U)
#define SMMU_CBn_NMRR_MAIR1			(0x3cU)
#define SMMU_CBn_SMMU_CBn_PAR			(0x50U)
#define SMMU_CBn_SMMU_CBn_PAR0			(0x50U)
#define SMMU_CBn_SMMU_CBn_PAR1			(0x54U)
/*      SMMU_CBn_SMMU_CBn_PAR0_Fault		(0x50U) */
/*      SMMU_CBn_SMMU_CBn_PAR0_Fault		(0x54U) */
#define SMMU_CBn_FSR				(0x58U)
#define SMMU_CBn_FSRRESTORE			(0x5cU)
#define SMMU_CBn_FAR_LO				(0x60U)
#define SMMU_CBn_FAR_HI				(0x64U)
#define SMMU_CBn_FSYNR0				(0x68U)
#define SMMU_CBn_IPAFAR_LO			(0x70U)
#define SMMU_CBn_IPAFAR_HI			(0x74U)
#define SMMU_CBn_TLBIVA_LO			(0x600U)
#define SMMU_CBn_TLBIVA_HI			(0x604U)
#define SMMU_CBn_TLBIVA_AARCH_32		(0x600U)
#define SMMU_CBn_TLBIVAA_LO			(0x608U)
#define SMMU_CBn_TLBIVAA_HI			(0x60cU)
#define SMMU_CBn_TLBIVAA_AARCH_32		(0x608U)
#define SMMU_CBn_TLBIASID			(0x610U)
#define SMMU_CBn_TLBIALL			(0x618U)
#define SMMU_CBn_TLBIVAL_LO			(0x620U)
#define SMMU_CBn_TLBIVAL_HI			(0x624U)
#define SMMU_CBn_TLBIVAL_AARCH_32		(0x618U)
#define SMMU_CBn_TLBIVAAL_LO			(0x628U)
#define SMMU_CBn_TLBIVAAL_HI			(0x62cU)
#define SMMU_CBn_TLBIVAAL_AARCH_32		(0x628U)
#define SMMU_CBn_TLBIIPAS2_LO			(0x630U)
#define SMMU_CBn_TLBIIPAS2_HI			(0x634U)
#define SMMU_CBn_TLBIIPAS2L_LO			(0x638U)
#define SMMU_CBn_TLBIIPAS2L_HI			(0x63cU)
#define SMMU_CBn_TLBSYNC			(0x7f0U)
#define SMMU_CBn_TLBSTATUS			(0x7f4U)
#define SMMU_CBn_ATSR				(0x800U)
#define SMMU_CBn_PMEVCNTR0			(0xe00U)
#define SMMU_CBn_PMEVCNTR1			(0xe04U)
#define SMMU_CBn_PMEVCNTR2			(0xe08U)
#define SMMU_CBn_PMEVCNTR3			(0xe0cU)
#define SMMU_CBn_PMEVTYPER0			(0xe80U)
#define SMMU_CBn_PMEVTYPER1			(0xe84U)
#define SMMU_CBn_PMEVTYPER2			(0xe88U)
#define SMMU_CBn_PMEVTYPER3			(0xe8cU)
#define SMMU_CBn_PMCFGR				(0xf00U)
#define SMMU_CBn_PMCR				(0xf04U)
#define SMMU_CBn_PMCEID				(0xf20U)
#define SMMU_CBn_PMCNTENSE			(0xf40U)
#define SMMU_CBn_PMCNTENCLR			(0xf44U)
#define SMMU_CBn_PMCNTENSET			(0xf48U)
#define SMMU_CBn_PMINTENCLR			(0xf4cU)
#define SMMU_CBn_PMOVSCLR			(0xf50U)
#define SMMU_CBn_PMOVSSET			(0xf58U)
#define SMMU_CBn_PMAUTHSTATUS			(0xfb8U)
#define SMMU_GNSR0_CR0				(0x0U)
#define SMMU_GNSR0_CR2				(0x8U)
#define SMMU_GNSR0_ACR				(0x10U)
#define SMMU_GNSR0_IDR0				(0x20U)
#define SMMU_GNSR0_IDR1				(0x24U)
#define SMMU_GNSR0_IDR2				(0x28U)
#define SMMU_GNSR0_IDR7				(0x3cU)
#define SMMU_GNSR0_GFAR_LO			(0x40U)
#define SMMU_GNSR0_GFAR_HI			(0x44U)
#define SMMU_GNSR0_GFSR				(0x48U)
#define SMMU_GNSR0_GFSRRESTORE			(0x4cU)
#define SMMU_GNSR0_GFSYNR0			(0x50U)
#define SMMU_GNSR0_GFSYNR1			(0x54U)
#define SMMU_GNSR0_GFSYNR1_v2			(0x54U)
#define SMMU_GNSR0_TLBIVMID			(0x64U)
#define SMMU_GNSR0_TLBIALLNSNH			(0x68U)
#define SMMU_GNSR0_TLBIALLH			(0x6cU)
#define SMMU_GNSR0_TLBGSYNC			(0x70U)
#define SMMU_GNSR0_TLBGSTATUS			(0x74U)
#define SMMU_GNSR0_TLBIVAH_LO			(0x78U)
#define SMMU_GNSR0_TLBIVALH64_LO		(0xb0U)
#define SMMU_GNSR0_TLBIVALH64_HI		(0xb4U)
#define SMMU_GNSR0_TLBIVMIDS1			(0xb8U)
#define SMMU_GNSR0_TLBIVAH64_LO			(0xc0U)
#define SMMU_GNSR0_TLBIVAH64_HI			(0xc4U)
#define SMMU_GNSR0_SMR0				(0x800U)
#define SMMU_GNSR0_SMRn				(0x800U)
#define SMMU_GNSR0_SMR1				(0x804U)
#define SMMU_GNSR0_SMR2				(0x808U)
#define SMMU_GNSR0_SMR3				(0x80cU)
#define SMMU_GNSR0_SMR4				(0x810U)
#define SMMU_GNSR0_SMR5				(0x814U)
#define SMMU_GNSR0_SMR6				(0x818U)
#define SMMU_GNSR0_SMR7				(0x81cU)
#define SMMU_GNSR0_SMR8				(0x820U)
#define SMMU_GNSR0_SMR9				(0x824U)
#define SMMU_GNSR0_SMR10			(0x828U)
#define SMMU_GNSR0_SMR11			(0x82cU)
#define SMMU_GNSR0_SMR12			(0x830U)
#define SMMU_GNSR0_SMR13			(0x834U)
#define SMMU_GNSR0_SMR14			(0x838U)
#define SMMU_GNSR0_SMR15			(0x83cU)
#define SMMU_GNSR0_SMR16			(0x840U)
#define SMMU_GNSR0_SMR17			(0x844U)
#define SMMU_GNSR0_SMR18			(0x848U)
#define SMMU_GNSR0_SMR19			(0x84cU)
#define SMMU_GNSR0_SMR20			(0x850U)
#define SMMU_GNSR0_SMR21			(0x854U)
#define SMMU_GNSR0_SMR22			(0x858U)
#define SMMU_GNSR0_SMR23			(0x85cU)
#define SMMU_GNSR0_SMR24			(0x860U)
#define SMMU_GNSR0_SMR25			(0x864U)
#define SMMU_GNSR0_SMR26			(0x868U)
#define SMMU_GNSR0_SMR27			(0x86cU)
#define SMMU_GNSR0_SMR28			(0x870U)
#define SMMU_GNSR0_SMR29			(0x874U)
#define SMMU_GNSR0_SMR30			(0x878U)
#define SMMU_GNSR0_SMR31			(0x87cU)
#define SMMU_GNSR0_SMR32			(0x880U)
#define SMMU_GNSR0_SMR33			(0x884U)
#define SMMU_GNSR0_SMR34			(0x888U)
#define SMMU_GNSR0_SMR35			(0x88cU)
#define SMMU_GNSR0_SMR36			(0x890U)
#define SMMU_GNSR0_SMR37			(0x894U)
#define SMMU_GNSR0_SMR38			(0x898U)
#define SMMU_GNSR0_SMR39			(0x89cU)
#define SMMU_GNSR0_SMR40			(0x8a0U)
#define SMMU_GNSR0_SMR41			(0x8a4U)
#define SMMU_GNSR0_SMR42			(0x8a8U)
#define SMMU_GNSR0_SMR43			(0x8acU)
#define SMMU_GNSR0_SMR44			(0x8b0U)
#define SMMU_GNSR0_SMR45			(0x8b4U)
#define SMMU_GNSR0_SMR46			(0x8b8U)
#define SMMU_GNSR0_SMR47			(0x8bcU)
#define SMMU_GNSR0_SMR48			(0x8c0U)
#define SMMU_GNSR0_SMR49			(0x8c4U)
#define SMMU_GNSR0_SMR50			(0x8c8U)
#define SMMU_GNSR0_SMR51			(0x8ccU)
#define SMMU_GNSR0_SMR52			(0x8d0U)
#define SMMU_GNSR0_SMR53			(0x8d4U)
#define SMMU_GNSR0_SMR54			(0x8d8U)
#define SMMU_GNSR0_SMR55			(0x8dcU)
#define SMMU_GNSR0_SMR56			(0x8e0U)
#define SMMU_GNSR0_SMR57			(0x8e4U)
#define SMMU_GNSR0_SMR58			(0x8e8U)
#define SMMU_GNSR0_SMR59			(0x8ecU)
#define SMMU_GNSR0_SMR60			(0x8f0U)
#define SMMU_GNSR0_SMR61			(0x8f4U)
#define SMMU_GNSR0_SMR62			(0x8f8U)
#define SMMU_GNSR0_SMR63			(0x8fcU)
#define SMMU_GNSR0_SMR64			(0x900U)
#define SMMU_GNSR0_SMR65			(0x904U)
#define SMMU_GNSR0_SMR66			(0x908U)
#define SMMU_GNSR0_SMR67			(0x90cU)
#define SMMU_GNSR0_SMR68			(0x910U)
#define SMMU_GNSR0_SMR69			(0x914U)
#define SMMU_GNSR0_SMR70			(0x918U)
#define SMMU_GNSR0_SMR71			(0x91cU)
#define SMMU_GNSR0_SMR72			(0x920U)
#define SMMU_GNSR0_SMR73			(0x924U)
#define SMMU_GNSR0_SMR74			(0x928U)
#define SMMU_GNSR0_SMR75			(0x92cU)
#define SMMU_GNSR0_SMR76			(0x930U)
#define SMMU_GNSR0_SMR77			(0x934U)
#define SMMU_GNSR0_SMR78			(0x938U)
#define SMMU_GNSR0_SMR79			(0x93cU)
#define SMMU_GNSR0_SMR80			(0x940U)
#define SMMU_GNSR0_SMR81			(0x944U)
#define SMMU_GNSR0_SMR82			(0x948U)
#define SMMU_GNSR0_SMR83			(0x94cU)
#define SMMU_GNSR0_SMR84			(0x950U)
#define SMMU_GNSR0_SMR85			(0x954U)
#define SMMU_GNSR0_SMR86			(0x958U)
#define SMMU_GNSR0_SMR87			(0x95cU)
#define SMMU_GNSR0_SMR88			(0x960U)
#define SMMU_GNSR0_SMR89			(0x964U)
#define SMMU_GNSR0_SMR90			(0x968U)
#define SMMU_GNSR0_SMR91			(0x96cU)
#define SMMU_GNSR0_SMR92			(0x970U)
#define SMMU_GNSR0_SMR93			(0x974U)
#define SMMU_GNSR0_SMR94			(0x978U)
#define SMMU_GNSR0_SMR95			(0x97cU)
#define SMMU_GNSR0_SMR96			(0x980U)
#define SMMU_GNSR0_SMR97			(0x984U)
#define SMMU_GNSR0_SMR98			(0x988U)
#define SMMU_GNSR0_SMR99			(0x98cU)
#define SMMU_GNSR0_SMR100			(0x990U)
#define SMMU_GNSR0_SMR101			(0x994U)
#define SMMU_GNSR0_SMR102			(0x998U)
#define SMMU_GNSR0_SMR103			(0x99cU)
#define SMMU_GNSR0_SMR104			(0x9a0U)
#define SMMU_GNSR0_SMR105			(0x9a4U)
#define SMMU_GNSR0_SMR106			(0x9a8U)
#define SMMU_GNSR0_SMR107			(0x9acU)
#define SMMU_GNSR0_SMR108			(0x9b0U)
#define SMMU_GNSR0_SMR109			(0x9b4U)
#define SMMU_GNSR0_SMR110			(0x9b8U)
#define SMMU_GNSR0_SMR111			(0x9bcU)
#define SMMU_GNSR0_SMR112			(0x9c0U)
#define SMMU_GNSR0_SMR113			(0x9c4U)
#define SMMU_GNSR0_SMR114			(0x9c8U)
#define SMMU_GNSR0_SMR115			(0x9ccU)
#define SMMU_GNSR0_SMR116			(0x9d0U)
#define SMMU_GNSR0_SMR117			(0x9d4U)
#define SMMU_GNSR0_SMR118			(0x9d8U)
#define SMMU_GNSR0_SMR119			(0x9dcU)
#define SMMU_GNSR0_SMR120			(0x9e0U)
#define SMMU_GNSR0_SMR121			(0x9e4U)
#define SMMU_GNSR0_SMR122			(0x9e8U)
#define SMMU_GNSR0_SMR123			(0x9ecU)
#define SMMU_GNSR0_SMR124			(0x9f0U)
#define SMMU_GNSR0_SMR125			(0x9f4U)
#define SMMU_GNSR0_SMR126			(0x9f8U)
#define SMMU_GNSR0_SMR127			(0x9fcU)
#define SMMU_GNSR0_S2CR0			(0xc00U)
#define SMMU_GNSR0_S2CRn			(0xc00U)
#define SMMU_GNSR0_S2CRn			(0xc00U)
#define SMMU_GNSR0_S2CR1			(0xc04U)
#define SMMU_GNSR0_S2CR2			(0xc08U)
#define SMMU_GNSR0_S2CR3			(0xc0cU)
#define SMMU_GNSR0_S2CR4			(0xc10U)
#define SMMU_GNSR0_S2CR5			(0xc14U)
#define SMMU_GNSR0_S2CR6			(0xc18U)
#define SMMU_GNSR0_S2CR7			(0xc1cU)
#define SMMU_GNSR0_S2CR8			(0xc20U)
#define SMMU_GNSR0_S2CR9			(0xc24U)
#define SMMU_GNSR0_S2CR10			(0xc28U)
#define SMMU_GNSR0_S2CR11			(0xc2cU)
#define SMMU_GNSR0_S2CR12			(0xc30U)
#define SMMU_GNSR0_S2CR13			(0xc34U)
#define SMMU_GNSR0_S2CR14			(0xc38U)
#define SMMU_GNSR0_S2CR15			(0xc3cU)
#define SMMU_GNSR0_S2CR16			(0xc40U)
#define SMMU_GNSR0_S2CR17			(0xc44U)
#define SMMU_GNSR0_S2CR18			(0xc48U)
#define SMMU_GNSR0_S2CR19			(0xc4cU)
#define SMMU_GNSR0_S2CR20			(0xc50U)
#define SMMU_GNSR0_S2CR21			(0xc54U)
#define SMMU_GNSR0_S2CR22			(0xc58U)
#define SMMU_GNSR0_S2CR23			(0xc5cU)
#define SMMU_GNSR0_S2CR24			(0xc60U)
#define SMMU_GNSR0_S2CR25			(0xc64U)
#define SMMU_GNSR0_S2CR26			(0xc68U)
#define SMMU_GNSR0_S2CR27			(0xc6cU)
#define SMMU_GNSR0_S2CR28			(0xc70U)
#define SMMU_GNSR0_S2CR29			(0xc74U)
#define SMMU_GNSR0_S2CR30			(0xc78U)
#define SMMU_GNSR0_S2CR31			(0xc7cU)
#define SMMU_GNSR0_S2CR32			(0xc80U)
#define SMMU_GNSR0_S2CR33			(0xc84U)
#define SMMU_GNSR0_S2CR34			(0xc88U)
#define SMMU_GNSR0_S2CR35			(0xc8cU)
#define SMMU_GNSR0_S2CR36			(0xc90U)
#define SMMU_GNSR0_S2CR37			(0xc94U)
#define SMMU_GNSR0_S2CR38			(0xc98U)
#define SMMU_GNSR0_S2CR39			(0xc9cU)
#define SMMU_GNSR0_S2CR40			(0xca0U)
#define SMMU_GNSR0_S2CR41			(0xca4U)
#define SMMU_GNSR0_S2CR42			(0xca8U)
#define SMMU_GNSR0_S2CR43			(0xcacU)
#define SMMU_GNSR0_S2CR44			(0xcb0U)
#define SMMU_GNSR0_S2CR45			(0xcb4U)
#define SMMU_GNSR0_S2CR46			(0xcb8U)
#define SMMU_GNSR0_S2CR47			(0xcbcU)
#define SMMU_GNSR0_S2CR48			(0xcc0U)
#define SMMU_GNSR0_S2CR49			(0xcc4U)
#define SMMU_GNSR0_S2CR50			(0xcc8U)
#define SMMU_GNSR0_S2CR51			(0xcccU)
#define SMMU_GNSR0_S2CR52			(0xcd0U)
#define SMMU_GNSR0_S2CR53			(0xcd4U)
#define SMMU_GNSR0_S2CR54			(0xcd8U)
#define SMMU_GNSR0_S2CR55			(0xcdcU)
#define SMMU_GNSR0_S2CR56			(0xce0U)
#define SMMU_GNSR0_S2CR57			(0xce4U)
#define SMMU_GNSR0_S2CR58			(0xce8U)
#define SMMU_GNSR0_S2CR59			(0xcecU)
#define SMMU_GNSR0_S2CR60			(0xcf0U)
#define SMMU_GNSR0_S2CR61			(0xcf4U)
#define SMMU_GNSR0_S2CR62			(0xcf8U)
#define SMMU_GNSR0_S2CR63			(0xcfcU)
#define SMMU_GNSR0_S2CR64			(0xd00U)
#define SMMU_GNSR0_S2CR65			(0xd04U)
#define SMMU_GNSR0_S2CR66			(0xd08U)
#define SMMU_GNSR0_S2CR67			(0xd0cU)
#define SMMU_GNSR0_S2CR68			(0xd10U)
#define SMMU_GNSR0_S2CR69			(0xd14U)
#define SMMU_GNSR0_S2CR70			(0xd18U)
#define SMMU_GNSR0_S2CR71			(0xd1cU)
#define SMMU_GNSR0_S2CR72			(0xd20U)
#define SMMU_GNSR0_S2CR73			(0xd24U)
#define SMMU_GNSR0_S2CR74			(0xd28U)
#define SMMU_GNSR0_S2CR75			(0xd2cU)
#define SMMU_GNSR0_S2CR76			(0xd30U)
#define SMMU_GNSR0_S2CR77			(0xd34U)
#define SMMU_GNSR0_S2CR78			(0xd38U)
#define SMMU_GNSR0_S2CR79			(0xd3cU)
#define SMMU_GNSR0_S2CR80			(0xd40U)
#define SMMU_GNSR0_S2CR81			(0xd44U)
#define SMMU_GNSR0_S2CR82			(0xd48U)
#define SMMU_GNSR0_S2CR83			(0xd4cU)
#define SMMU_GNSR0_S2CR84			(0xd50U)
#define SMMU_GNSR0_S2CR85			(0xd54U)
#define SMMU_GNSR0_S2CR86			(0xd58U)
#define SMMU_GNSR0_S2CR87			(0xd5cU)
#define SMMU_GNSR0_S2CR88			(0xd60U)
#define SMMU_GNSR0_S2CR89			(0xd64U)
#define SMMU_GNSR0_S2CR90			(0xd68U)
#define SMMU_GNSR0_S2CR91			(0xd6cU)
#define SMMU_GNSR0_S2CR92			(0xd70U)
#define SMMU_GNSR0_S2CR93			(0xd74U)
#define SMMU_GNSR0_S2CR94			(0xd78U)
#define SMMU_GNSR0_S2CR95			(0xd7cU)
#define SMMU_GNSR0_S2CR96			(0xd80U)
#define SMMU_GNSR0_S2CR97			(0xd84U)
#define SMMU_GNSR0_S2CR98			(0xd88U)
#define SMMU_GNSR0_S2CR99			(0xd8cU)
#define SMMU_GNSR0_S2CR100			(0xd90U)
#define SMMU_GNSR0_S2CR101			(0xd94U)
#define SMMU_GNSR0_S2CR102			(0xd98U)
#define SMMU_GNSR0_S2CR103			(0xd9cU)
#define SMMU_GNSR0_S2CR104			(0xda0U)
#define SMMU_GNSR0_S2CR105			(0xda4U)
#define SMMU_GNSR0_S2CR106			(0xda8U)
#define SMMU_GNSR0_S2CR107			(0xdacU)
#define SMMU_GNSR0_S2CR108			(0xdb0U)
#define SMMU_GNSR0_S2CR109			(0xdb4U)
#define SMMU_GNSR0_S2CR110			(0xdb8U)
#define SMMU_GNSR0_S2CR111			(0xdbcU)
#define SMMU_GNSR0_S2CR112			(0xdc0U)
#define SMMU_GNSR0_S2CR113			(0xdc4U)
#define SMMU_GNSR0_S2CR114			(0xdc8U)
#define SMMU_GNSR0_S2CR115			(0xdccU)
#define SMMU_GNSR0_S2CR116			(0xdd0U)
#define SMMU_GNSR0_S2CR117			(0xdd4U)
#define SMMU_GNSR0_S2CR118			(0xdd8U)
#define SMMU_GNSR0_S2CR119			(0xddcU)
#define SMMU_GNSR0_S2CR120			(0xde0U)
#define SMMU_GNSR0_S2CR121			(0xde4U)
#define SMMU_GNSR0_S2CR122			(0xde8U)
#define SMMU_GNSR0_S2CR123			(0xdecU)
#define SMMU_GNSR0_S2CR124			(0xdf0U)
#define SMMU_GNSR0_S2CR125			(0xdf4U)
#define SMMU_GNSR0_S2CR126			(0xdf8U)
#define SMMU_GNSR0_S2CR127			(0xdfcU)
#define SMMU_GNSR0_PIDR0			(0xfe0U)
#define SMMU_GNSR0_PIDR1			(0xfe4U)
#define SMMU_GNSR0_PIDR2			(0xfe8U)
#define SMMU_GNSR0_PIDR3			(0xfecU)
#define SMMU_GNSR0_PIDR4			(0xfd0U)
#define SMMU_GNSR0_PIDR5			(0xfd4U)
#define SMMU_GNSR0_PIDR6			(0xfd8U)
#define SMMU_GNSR0_PIDR7			(0xfdcU)
#define SMMU_GNSR0_CIDR0			(0xff0U)
#define SMMU_GNSR0_CIDR1			(0xff4U)
#define SMMU_GNSR0_CIDR2			(0xff8U)
#define SMMU_GNSR0_CIDR3			(0xffcU)
#define SMMU_GNSR1_CBAR0			(0x0U)
#define SMMU_GNSR1_CBARn			(0x0U)
#define SMMU_GNSR1_CBFRSYNRA0			(0x400U)
#define SMMU_GNSR1_CBA2R0			(0x800U)
#define SMMU_GNSR1_CBAR1			(0x4U)
#define SMMU_GNSR1_CBFRSYNRA1			(0x404U)
#define SMMU_GNSR1_CBA2R1			(0x804U)
#define SMMU_GNSR1_CBAR2			(0x8U)
#define SMMU_GNSR1_CBFRSYNRA2			(0x408U)
#define SMMU_GNSR1_CBA2R2			(0x808U)
#define SMMU_GNSR1_CBAR3			(0xcU)
#define SMMU_GNSR1_CBFRSYNRA3			(0x40cU)
#define SMMU_GNSR1_CBA2R3			(0x80cU)
#define SMMU_GNSR1_CBAR4			(0x10U)
#define SMMU_GNSR1_CBFRSYNRA4			(0x410U)
#define SMMU_GNSR1_CBA2R4			(0x810U)
#define SMMU_GNSR1_CBAR5			(0x14U)
#define SMMU_GNSR1_CBFRSYNRA5			(0x414U)
#define SMMU_GNSR1_CBA2R5			(0x814U)
#define SMMU_GNSR1_CBAR6			(0x18U)
#define SMMU_GNSR1_CBFRSYNRA6			(0x418U)
#define SMMU_GNSR1_CBA2R6			(0x818U)
#define SMMU_GNSR1_CBAR7			(0x1cU)
#define SMMU_GNSR1_CBFRSYNRA7			(0x41cU)
#define SMMU_GNSR1_CBA2R7			(0x81cU)
#define SMMU_GNSR1_CBAR8			(0x20U)
#define SMMU_GNSR1_CBFRSYNRA8			(0x420U)
#define SMMU_GNSR1_CBA2R8			(0x820U)
#define SMMU_GNSR1_CBAR9			(0x24U)
#define SMMU_GNSR1_CBFRSYNRA9			(0x424U)
#define SMMU_GNSR1_CBA2R9			(0x824U)
#define SMMU_GNSR1_CBAR10			(0x28U)
#define SMMU_GNSR1_CBFRSYNRA10			(0x428U)
#define SMMU_GNSR1_CBA2R10			(0x828U)
#define SMMU_GNSR1_CBAR11			(0x2cU)
#define SMMU_GNSR1_CBFRSYNRA11			(0x42cU)
#define SMMU_GNSR1_CBA2R11			(0x82cU)
#define SMMU_GNSR1_CBAR12			(0x30U)
#define SMMU_GNSR1_CBFRSYNRA12			(0x430U)
#define SMMU_GNSR1_CBA2R12			(0x830U)
#define SMMU_GNSR1_CBAR13			(0x34U)
#define SMMU_GNSR1_CBFRSYNRA13			(0x434U)
#define SMMU_GNSR1_CBA2R13			(0x834U)
#define SMMU_GNSR1_CBAR14			(0x38U)
#define SMMU_GNSR1_CBFRSYNRA14			(0x438U)
#define SMMU_GNSR1_CBA2R14			(0x838U)
#define SMMU_GNSR1_CBAR15			(0x3cU)
#define SMMU_GNSR1_CBFRSYNRA15			(0x43cU)
#define SMMU_GNSR1_CBA2R15			(0x83cU)
#define SMMU_GNSR1_CBAR16			(0x40U)
#define SMMU_GNSR1_CBFRSYNRA16			(0x440U)
#define SMMU_GNSR1_CBA2R16			(0x840U)
#define SMMU_GNSR1_CBAR17			(0x44U)
#define SMMU_GNSR1_CBFRSYNRA17			(0x444U)
#define SMMU_GNSR1_CBA2R17			(0x844U)
#define SMMU_GNSR1_CBAR18			(0x48U)
#define SMMU_GNSR1_CBFRSYNRA18			(0x448U)
#define SMMU_GNSR1_CBA2R18			(0x848U)
#define SMMU_GNSR1_CBAR19			(0x4cU)
#define SMMU_GNSR1_CBFRSYNRA19			(0x44cU)
#define SMMU_GNSR1_CBA2R19			(0x84cU)
#define SMMU_GNSR1_CBAR20			(0x50U)
#define SMMU_GNSR1_CBFRSYNRA20			(0x450U)
#define SMMU_GNSR1_CBA2R20			(0x850U)
#define SMMU_GNSR1_CBAR21			(0x54U)
#define SMMU_GNSR1_CBFRSYNRA21			(0x454U)
#define SMMU_GNSR1_CBA2R21			(0x854U)
#define SMMU_GNSR1_CBAR22			(0x58U)
#define SMMU_GNSR1_CBFRSYNRA22			(0x458U)
#define SMMU_GNSR1_CBA2R22			(0x858U)
#define SMMU_GNSR1_CBAR23			(0x5cU)
#define SMMU_GNSR1_CBFRSYNRA23			(0x45cU)
#define SMMU_GNSR1_CBA2R23			(0x85cU)
#define SMMU_GNSR1_CBAR24			(0x60U)
#define SMMU_GNSR1_CBFRSYNRA24			(0x460U)
#define SMMU_GNSR1_CBA2R24			(0x860U)
#define SMMU_GNSR1_CBAR25			(0x64U)
#define SMMU_GNSR1_CBFRSYNRA25			(0x464U)
#define SMMU_GNSR1_CBA2R25			(0x864U)
#define SMMU_GNSR1_CBAR26			(0x68U)
#define SMMU_GNSR1_CBFRSYNRA26			(0x468U)
#define SMMU_GNSR1_CBA2R26			(0x868U)
#define SMMU_GNSR1_CBAR27			(0x6cU)
#define SMMU_GNSR1_CBFRSYNRA27			(0x46cU)
#define SMMU_GNSR1_CBA2R27			(0x86cU)
#define SMMU_GNSR1_CBAR28			(0x70U)
#define SMMU_GNSR1_CBFRSYNRA28			(0x470U)
#define SMMU_GNSR1_CBA2R28			(0x870U)
#define SMMU_GNSR1_CBAR29			(0x74U)
#define SMMU_GNSR1_CBFRSYNRA29			(0x474U)
#define SMMU_GNSR1_CBA2R29			(0x874U)
#define SMMU_GNSR1_CBAR30			(0x78U)
#define SMMU_GNSR1_CBFRSYNRA30			(0x478U)
#define SMMU_GNSR1_CBA2R30			(0x878U)
#define SMMU_GNSR1_CBAR31			(0x7cU)
#define SMMU_GNSR1_CBFRSYNRA31			(0x47cU)
#define SMMU_GNSR1_CBA2R31			(0x87cU)
#define SMMU_GNSR1_CBAR32			(0x80U)
#define SMMU_GNSR1_CBFRSYNRA32			(0x480U)
#define SMMU_GNSR1_CBA2R32			(0x880U)
#define SMMU_GNSR1_CBAR33			(0x84U)
#define SMMU_GNSR1_CBFRSYNRA33			(0x484U)
#define SMMU_GNSR1_CBA2R33			(0x884U)
#define SMMU_GNSR1_CBAR34			(0x88U)
#define SMMU_GNSR1_CBFRSYNRA34			(0x488U)
#define SMMU_GNSR1_CBA2R34			(0x888U)
#define SMMU_GNSR1_CBAR35			(0x8cU)
#define SMMU_GNSR1_CBFRSYNRA35			(0x48cU)
#define SMMU_GNSR1_CBA2R35			(0x88cU)
#define SMMU_GNSR1_CBAR36			(0x90U)
#define SMMU_GNSR1_CBFRSYNRA36			(0x490U)
#define SMMU_GNSR1_CBA2R36			(0x890U)
#define SMMU_GNSR1_CBAR37			(0x94U)
#define SMMU_GNSR1_CBFRSYNRA37			(0x494U)
#define SMMU_GNSR1_CBA2R37			(0x894U)
#define SMMU_GNSR1_CBAR38			(0x98U)
#define SMMU_GNSR1_CBFRSYNRA38			(0x498U)
#define SMMU_GNSR1_CBA2R38			(0x898U)
#define SMMU_GNSR1_CBAR39			(0x9cU)
#define SMMU_GNSR1_CBFRSYNRA39			(0x49cU)
#define SMMU_GNSR1_CBA2R39			(0x89cU)
#define SMMU_GNSR1_CBAR40			(0xa0U)
#define SMMU_GNSR1_CBFRSYNRA40			(0x4a0U)
#define SMMU_GNSR1_CBA2R40			(0x8a0U)
#define SMMU_GNSR1_CBAR41			(0xa4U)
#define SMMU_GNSR1_CBFRSYNRA41			(0x4a4U)
#define SMMU_GNSR1_CBA2R41			(0x8a4U)
#define SMMU_GNSR1_CBAR42			(0xa8U)
#define SMMU_GNSR1_CBFRSYNRA42			(0x4a8U)
#define SMMU_GNSR1_CBA2R42			(0x8a8U)
#define SMMU_GNSR1_CBAR43			(0xacU)
#define SMMU_GNSR1_CBFRSYNRA43			(0x4acU)
#define SMMU_GNSR1_CBA2R43			(0x8acU)
#define SMMU_GNSR1_CBAR44			(0xb0U)
#define SMMU_GNSR1_CBFRSYNRA44			(0x4b0U)
#define SMMU_GNSR1_CBA2R44			(0x8b0U)
#define SMMU_GNSR1_CBAR45			(0xb4U)
#define SMMU_GNSR1_CBFRSYNRA45			(0x4b4U)
#define SMMU_GNSR1_CBA2R45			(0x8b4U)
#define SMMU_GNSR1_CBAR46			(0xb8U)
#define SMMU_GNSR1_CBFRSYNRA46			(0x4b8U)
#define SMMU_GNSR1_CBA2R46			(0x8b8U)
#define SMMU_GNSR1_CBAR47			(0xbcU)
#define SMMU_GNSR1_CBFRSYNRA47			(0x4bcU)
#define SMMU_GNSR1_CBA2R47			(0x8bcU)
#define SMMU_GNSR1_CBAR48			(0xc0U)
#define SMMU_GNSR1_CBFRSYNRA48			(0x4c0U)
#define SMMU_GNSR1_CBA2R48			(0x8c0U)
#define SMMU_GNSR1_CBAR49			(0xc4U)
#define SMMU_GNSR1_CBFRSYNRA49			(0x4c4U)
#define SMMU_GNSR1_CBA2R49			(0x8c4U)
#define SMMU_GNSR1_CBAR50			(0xc8U)
#define SMMU_GNSR1_CBFRSYNRA50			(0x4c8U)
#define SMMU_GNSR1_CBA2R50			(0x8c8U)
#define SMMU_GNSR1_CBAR51			(0xccU)
#define SMMU_GNSR1_CBFRSYNRA51			(0x4ccU)
#define SMMU_GNSR1_CBA2R51			(0x8ccU)
#define SMMU_GNSR1_CBAR52			(0xd0U)
#define SMMU_GNSR1_CBFRSYNRA52			(0x4d0U)
#define SMMU_GNSR1_CBA2R52			(0x8d0U)
#define SMMU_GNSR1_CBAR53			(0xd4U)
#define SMMU_GNSR1_CBFRSYNRA53			(0x4d4U)
#define SMMU_GNSR1_CBA2R53			(0x8d4U)
#define SMMU_GNSR1_CBAR54			(0xd8U)
#define SMMU_GNSR1_CBFRSYNRA54			(0x4d8U)
#define SMMU_GNSR1_CBA2R54			(0x8d8U)
#define SMMU_GNSR1_CBAR55			(0xdcU)
#define SMMU_GNSR1_CBFRSYNRA55			(0x4dcU)
#define SMMU_GNSR1_CBA2R55			(0x8dcU)
#define SMMU_GNSR1_CBAR56			(0xe0U)
#define SMMU_GNSR1_CBFRSYNRA56			(0x4e0U)
#define SMMU_GNSR1_CBA2R56			(0x8e0U)
#define SMMU_GNSR1_CBAR57			(0xe4U)
#define SMMU_GNSR1_CBFRSYNRA57			(0x4e4U)
#define SMMU_GNSR1_CBA2R57			(0x8e4U)
#define SMMU_GNSR1_CBAR58			(0xe8U)
#define SMMU_GNSR1_CBFRSYNRA58			(0x4e8U)
#define SMMU_GNSR1_CBA2R58			(0x8e8U)
#define SMMU_GNSR1_CBAR59			(0xecU)
#define SMMU_GNSR1_CBFRSYNRA59			(0x4ecU)
#define SMMU_GNSR1_CBA2R59			(0x8ecU)
#define SMMU_GNSR1_CBAR60			(0xf0U)
#define SMMU_GNSR1_CBFRSYNRA60			(0x4f0U)
#define SMMU_GNSR1_CBA2R60			(0x8f0U)
#define SMMU_GNSR1_CBAR61			(0xf4U)
#define SMMU_GNSR1_CBFRSYNRA61			(0x4f4U)
#define SMMU_GNSR1_CBA2R61			(0x8f4U)
#define SMMU_GNSR1_CBAR62			(0xf8U)
#define SMMU_GNSR1_CBFRSYNRA62			(0x4f8U)
#define SMMU_GNSR1_CBA2R62			(0x8f8U)
#define SMMU_GNSR1_CBAR63			(0xfcU)
#define SMMU_GNSR1_CBFRSYNRA63			(0x4fcU)
#define SMMU_GNSR1_CBA2R63			(0x8fcU)

/*******************************************************************************
 * SMMU Global Secure Aux. Configuration Register
 ******************************************************************************/
#define SMMU_GSR0_SECURE_ACR			0x10U
#define SMMU_GNSR_ACR				(SMMU_GSR0_SECURE_ACR + 0x400U)
#define SMMU_GSR0_PGSIZE_SHIFT			16U
#define SMMU_GSR0_PGSIZE_4K			(0U << SMMU_GSR0_PGSIZE_SHIFT)
#define SMMU_GSR0_PGSIZE_64K			(1U << SMMU_GSR0_PGSIZE_SHIFT)
#define SMMU_ACR_CACHE_LOCK_ENABLE_BIT		(1U << 26)

/*******************************************************************************
 * SMMU Global Aux. Control Register
 ******************************************************************************/
#define SMMU_CBn_ACTLR_CPRE_BIT			(1U << 1)

/*******************************************************************************
 * SMMU configuration constants
 ******************************************************************************/
#define ID1_PAGESIZE				(1U << 31)
#define ID1_NUMPAGENDXB_SHIFT			28U
#define ID1_NUMPAGENDXB_MASK			7U
#define ID1_NUMS2CB_SHIFT			16U
#define ID1_NUMS2CB_MASK			0xffU
#define ID1_NUMCB_SHIFT				0U
#define ID1_NUMCB_MASK				0xffU
#define PGSHIFT					16U
#define CB_SIZE					0x800000U

typedef struct smmu_regs {
	uint32_t reg;
	uint32_t val;
} smmu_regs_t;

#define mc_make_sid_override_cfg(name) \
	{ \
		.reg = TEGRA_MC_STREAMID_BASE + MC_STREAMID_OVERRIDE_CFG_ ## name, \
		.val = 0x00000000U, \
	}

#define mc_make_sid_security_cfg(name) \
	{ \
		.reg = TEGRA_MC_STREAMID_BASE + MC_STREAMID_OVERRIDE_TO_SECURITY_CFG(MC_STREAMID_OVERRIDE_CFG_ ## name), \
		.val = 0x00000000U, \
	}

#define smmu_make_gnsr0_sec_cfg(name) \
	{ \
		.reg = TEGRA_SMMU0_BASE + SMMU_GNSR0_ ## name, \
		.val = 0x00000000U, \
	}

/*
 * On ARM-SMMU, conditional offset to access secure aliases of non-secure registers
 * is 0x400. So, add it to register address
 */
#define smmu_make_gnsr0_nsec_cfg(name) \
	{ \
		.reg = TEGRA_SMMU0_BASE + 0x400U + SMMU_GNSR0_ ## name, \
		.val = 0x00000000U, \
	}

#define smmu_make_gnsr0_smr_cfg(n) \
	{ \
		.reg = TEGRA_SMMU0_BASE + SMMU_GNSR0_SMR ## n, \
		.val = 0x00000000U, \
	}

#define smmu_make_gnsr0_s2cr_cfg(n) \
	{ \
		.reg = TEGRA_SMMU0_BASE + SMMU_GNSR0_S2CR ## n, \
		.val = 0x00000000U, \
	}

#define smmu_make_gnsr1_cbar_cfg(n) \
	{ \
		.reg = TEGRA_SMMU0_BASE + (1U << PGSHIFT) + SMMU_GNSR1_CBAR ## n, \
		.val = 0x00000000U, \
	}

#define smmu_make_gnsr1_cba2r_cfg(n) \
	{ \
		.reg = TEGRA_SMMU0_BASE + (1U << PGSHIFT) + SMMU_GNSR1_CBA2R ## n, \
		.val = 0x00000000U, \
	}

#define make_smmu_cb_cfg(name, n) \
	{ \
		.reg = TEGRA_SMMU0_BASE + (CB_SIZE >> 1) + (n * (1 << PGSHIFT)) \
			+ SMMU_CBn_ ## name, \
		.val = 0x00000000U, \
	}

#define smmu_make_smrg_group(n)	\
	smmu_make_gnsr0_smr_cfg(n),	\
	smmu_make_gnsr0_s2cr_cfg(n),	\
	smmu_make_gnsr1_cbar_cfg(n),	\
	smmu_make_gnsr1_cba2r_cfg(n)	/* don't put "," here. */

#define smmu_make_cb_group(n)		\
	make_smmu_cb_cfg(SCTLR, n),	\
	make_smmu_cb_cfg(TCR2, n),	\
	make_smmu_cb_cfg(TTBR0_LO, n),	\
	make_smmu_cb_cfg(TTBR0_HI, n),	\
	make_smmu_cb_cfg(TCR, n),	\
	make_smmu_cb_cfg(PRRR_MAIR0, n),\
	make_smmu_cb_cfg(FSR, n),	\
	make_smmu_cb_cfg(FAR_LO, n),	\
	make_smmu_cb_cfg(FAR_HI, n),	\
	make_smmu_cb_cfg(FSYNR0, n)	/* don't put "," here. */

#define smmu_bypass_cfg \
	{ \
		.reg = TEGRA_MC_BASE + MC_SMMU_BYPASS_CONFIG, \
		.val = 0x00000000U, \
	}

#define _START_OF_TABLE_ \
	{ \
		.reg = 0xCAFE05C7U, \
		.val = 0x00000000U, \
	}

#define _END_OF_TABLE_ \
	{ \
		.reg = 0xFFFFFFFFU, \
		.val = 0xFFFFFFFFU, \
	}


void tegra_smmu_init(void);
void tegra_smmu_save_context(uint64_t smmu_ctx_addr);
smmu_regs_t *plat_get_smmu_ctx(void);

#endif /* SMMU_H */