hc
2023-08-21 fc437ccf3419c424092701f3d883215fa4552a8b
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
/*
 * IOMMU API for ARM architected SMMU implementations.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 * Copyright (C) 2013 ARM Limited
 *
 * Author: Will Deacon <will.deacon@arm.com>
 */
 
#ifndef _ARM_SMMU_REGS_H
#define _ARM_SMMU_REGS_H
 
/* Configuration registers */
#define ARM_SMMU_GR0_sCR0        0x0
#define sCR0_CLIENTPD            (1 << 0)
#define sCR0_GFRE            (1 << 1)
#define sCR0_GFIE            (1 << 2)
#define sCR0_EXIDENABLE            (1 << 3)
#define sCR0_GCFGFRE            (1 << 4)
#define sCR0_GCFGFIE            (1 << 5)
#define sCR0_USFCFG            (1 << 10)
#define sCR0_VMIDPNE            (1 << 11)
#define sCR0_PTM            (1 << 12)
#define sCR0_FB                (1 << 13)
#define sCR0_VMID16EN            (1 << 31)
#define sCR0_BSU_SHIFT            14
#define sCR0_BSU_MASK            0x3
#define sCR0_SHCFG_SHIFT        22
#define sCR0_SHCFG_MASK            0x3
#define sCR0_SHCFG_NSH            3
 
/* Auxiliary Configuration register */
#define ARM_SMMU_GR0_sACR        0x10
 
/* Identification registers */
#define ARM_SMMU_GR0_ID0        0x20
#define ARM_SMMU_GR0_ID1        0x24
#define ARM_SMMU_GR0_ID2        0x28
#define ARM_SMMU_GR0_ID3        0x2c
#define ARM_SMMU_GR0_ID4        0x30
#define ARM_SMMU_GR0_ID5        0x34
#define ARM_SMMU_GR0_ID6        0x38
#define ARM_SMMU_GR0_ID7        0x3c
#define ARM_SMMU_GR0_sGFSR        0x48
#define ARM_SMMU_GR0_sGFSYNR0        0x50
#define ARM_SMMU_GR0_sGFSYNR1        0x54
#define ARM_SMMU_GR0_sGFSYNR2        0x58
 
#define ID0_S1TS            (1 << 30)
#define ID0_S2TS            (1 << 29)
#define ID0_NTS                (1 << 28)
#define ID0_SMS                (1 << 27)
#define ID0_ATOSNS            (1 << 26)
#define ID0_PTFS_NO_AARCH32        (1 << 25)
#define ID0_PTFS_NO_AARCH32S        (1 << 24)
#define ID0_CTTW            (1 << 14)
#define ID0_NUMIRPT_SHIFT        16
#define ID0_NUMIRPT_MASK        0xff
#define ID0_NUMSIDB_SHIFT        9
#define ID0_NUMSIDB_MASK        0xf
#define ID0_EXIDS            (1 << 8)
#define ID0_NUMSMRG_SHIFT        0
#define ID0_NUMSMRG_MASK        0xff
 
#define ID1_PAGESIZE            (1 << 31)
#define ID1_NUMPAGENDXB_SHIFT        28
#define ID1_NUMPAGENDXB_MASK        7
#define ID1_NUMS2CB_SHIFT        16
#define ID1_NUMS2CB_MASK        0xff
#define ID1_NUMCB_SHIFT            0
#define ID1_NUMCB_MASK            0xff
 
#define ID2_OAS_SHIFT            4
#define ID2_OAS_MASK            0xf
#define ID2_IAS_SHIFT            0
#define ID2_IAS_MASK            0xf
#define ID2_UBS_SHIFT            8
#define ID2_UBS_MASK            0xf
#define ID2_PTFS_4K            (1 << 12)
#define ID2_PTFS_16K            (1 << 13)
#define ID2_PTFS_64K            (1 << 14)
#define ID2_VMID16            (1 << 15)
 
#define ID7_MAJOR_SHIFT            4
#define ID7_MAJOR_MASK            0xf
 
/* Global TLB invalidation */
#define ARM_SMMU_GR0_TLBIVMID        0x64
#define ARM_SMMU_GR0_TLBIALLNSNH    0x68
#define ARM_SMMU_GR0_TLBIALLH        0x6c
#define ARM_SMMU_GR0_sTLBGSYNC        0x70
#define ARM_SMMU_GR0_sTLBGSTATUS    0x74
#define sTLBGSTATUS_GSACTIVE        (1 << 0)
 
/* Stream mapping registers */
#define ARM_SMMU_GR0_SMR(n)        (0x800 + ((n) << 2))
#define SMR_VALID            (1 << 31)
#define SMR_MASK_SHIFT            16
#define SMR_MASK_MASK            0x7FFF
#define SID_MASK            0x7FFF
#define SMR_ID_SHIFT            0
 
#define ARM_SMMU_GR0_S2CR(n)        (0xc00 + ((n) << 2))
#define S2CR_CBNDX_SHIFT        0
#define S2CR_CBNDX_MASK            0xff
#define S2CR_EXIDVALID            (1 << 10)
#define S2CR_TYPE_SHIFT            16
#define S2CR_TYPE_MASK            0x3
#define S2CR_SHCFG_SHIFT        8
#define S2CR_SHCFG_MASK            0x3
#define S2CR_SHCFG_NSH            0x3
enum arm_smmu_s2cr_type {
   S2CR_TYPE_TRANS,
   S2CR_TYPE_BYPASS,
   S2CR_TYPE_FAULT,
};
 
#define S2CR_PRIVCFG_SHIFT        24
#define S2CR_PRIVCFG_MASK        0x3
enum arm_smmu_s2cr_privcfg {
   S2CR_PRIVCFG_DEFAULT,
   S2CR_PRIVCFG_DIPAN,
   S2CR_PRIVCFG_UNPRIV,
   S2CR_PRIVCFG_PRIV,
};
 
/* Context bank attribute registers */
#define ARM_SMMU_GR1_CBAR(n)        (0x0 + ((n) << 2))
#define CBAR_VMID_SHIFT            0
#define CBAR_VMID_MASK            0xff
#define CBAR_S1_BPSHCFG_SHIFT        8
#define CBAR_S1_BPSHCFG_MASK        3
#define CBAR_S1_BPSHCFG_NSH        3
#define CBAR_S1_MEMATTR_SHIFT        12
#define CBAR_S1_MEMATTR_MASK        0xf
#define CBAR_S1_MEMATTR_WB        0xf
#define CBAR_TYPE_SHIFT            16
#define CBAR_TYPE_MASK            0x3
#define CBAR_TYPE_S2_TRANS        (0 << CBAR_TYPE_SHIFT)
#define CBAR_TYPE_S1_TRANS_S2_BYPASS    (1 << CBAR_TYPE_SHIFT)
#define CBAR_TYPE_S1_TRANS_S2_FAULT    (2 << CBAR_TYPE_SHIFT)
#define CBAR_TYPE_S1_TRANS_S2_TRANS    (3 << CBAR_TYPE_SHIFT)
#define CBAR_IRPTNDX_SHIFT        24
#define CBAR_IRPTNDX_MASK        0xff
 
#define ARM_SMMU_GR1_CBFRSYNRA(n)    (0x400 + ((n) << 2))
#define CBFRSYNRA_SID_MASK        (0xffff)
 
#define ARM_SMMU_GR1_CBA2R(n)        (0x800 + ((n) << 2))
#define CBA2R_RW64_32BIT        (0 << 0)
#define CBA2R_RW64_64BIT        (1 << 0)
#define CBA2R_VMID_SHIFT        16
#define CBA2R_VMID_MASK            0xffff
 
#define ARM_SMMU_CB_SCTLR        0x0
#define ARM_SMMU_CB_ACTLR        0x4
#define ARM_SMMU_CB_RESUME        0x8
#define ARM_SMMU_CB_TTBCR2        0x10
#define ARM_SMMU_CB_TTBR0        0x20
#define ARM_SMMU_CB_TTBR1        0x28
#define ARM_SMMU_CB_TTBCR        0x30
#define ARM_SMMU_CB_CONTEXTIDR        0x34
#define ARM_SMMU_CB_S1_MAIR0        0x38
#define ARM_SMMU_CB_S1_MAIR1        0x3c
#define ARM_SMMU_CB_PAR            0x50
#define ARM_SMMU_CB_FSR            0x58
#define ARM_SMMU_CB_FSRRESTORE        0x5c
#define ARM_SMMU_CB_FAR            0x60
#define ARM_SMMU_CB_FSYNR0        0x68
#define ARM_SMMU_CB_FSYNR1        0x6c
#define ARM_SMMU_CB_S1_TLBIVA        0x600
#define ARM_SMMU_CB_S1_TLBIASID        0x610
#define ARM_SMMU_CB_S1_TLBIALL        0x618
#define ARM_SMMU_CB_S1_TLBIVAL        0x620
#define ARM_SMMU_CB_S2_TLBIIPAS2    0x630
#define ARM_SMMU_CB_S2_TLBIIPAS2L    0x638
#define ARM_SMMU_CB_TLBSYNC        0x7f0
#define ARM_SMMU_CB_TLBSTATUS        0x7f4
#define TLBSTATUS_SACTIVE        (1 << 0)
#define ARM_SMMU_CB_ATS1PR        0x800
#define ARM_SMMU_CB_ATSR        0x8f0
#define ARM_SMMU_STATS_SYNC_INV_TBU_ACK 0x25dc
#define TBU_SYNC_ACK_MASK        0x1ff
#define TBU_SYNC_ACK_SHIFT        17
#define TBU_SYNC_REQ_MASK        0x1
#define TBU_SYNC_REQ_SHIFT        16
#define TBU_INV_ACK_MASK        0x1ff
#define TBU_INV_ACK_SHIFT        1
#define TBU_INV_REQ_MASK        0x1
#define TBU_INV_REQ_SHIFT        0
#define ARM_SMMU_TBU_PWR_STATUS         0x2204
#define ARM_SMMU_MMU2QSS_AND_SAFE_WAIT_CNTR 0x2670
#define TCU_SYNC_IN_PRGSS_MASK        0x1
#define TCU_SYNC_IN_PRGSS_SHIFT        20
#define TCU_INV_IN_PRGSS_MASK        0x1
#define TCU_INV_IN_PRGSS_SHIFT        16
#define TBUID_SHIFT            10
 
#define SCTLR_MEM_ATTR_SHIFT        16
#define SCTLR_SHCFG_SHIFT        22
#define SCTLR_RACFG_SHIFT        24
#define SCTLR_WACFG_SHIFT        26
#define SCTLR_SHCFG_MASK        0x3
#define SCTLR_SHCFG_NSH            0x3
#define SCTLR_RACFG_RA            0x2
#define SCTLR_WACFG_WA            0x2
#define SCTLR_MEM_ATTR_OISH_WB_CACHE    0xf
#define SCTLR_MTCFG            (1 << 20)
#define SCTLR_S1_ASIDPNE        (1 << 12)
#define SCTLR_CFCFG            (1 << 7)
#define SCTLR_HUPCF            (1 << 8)
#define SCTLR_CFIE            (1 << 6)
#define SCTLR_CFRE            (1 << 5)
#define SCTLR_E                (1 << 4)
#define SCTLR_AFE            (1 << 2)
#define SCTLR_TRE            (1 << 1)
#define SCTLR_M                (1 << 0)
 
#define CB_PAR_F            (1 << 0)
 
#define ATSR_ACTIVE            (1 << 0)
 
#define RESUME_RETRY            (0 << 0)
#define RESUME_TERMINATE        (1 << 0)
 
#define TTBCR2_SEP_SHIFT        15
#define TTBCR2_SEP_UPSTREAM        (0x7 << TTBCR2_SEP_SHIFT)
#define TTBCR2_AS            (1 << 4)
 
#define TTBRn_ASID_SHIFT        48
 
#define FSR_MULTI            (1 << 31)
#define FSR_SS                (1 << 30)
#define FSR_UUT                (1 << 8)
#define FSR_ASF                (1 << 7)
#define FSR_TLBLKF            (1 << 6)
#define FSR_TLBMCF            (1 << 5)
#define FSR_EF                (1 << 4)
#define FSR_PF                (1 << 3)
#define FSR_AFF                (1 << 2)
#define FSR_TF                (1 << 1)
 
#define FSR_IGN                (FSR_AFF | FSR_ASF | \
                    FSR_TLBMCF | FSR_TLBLKF)
#define FSR_FAULT            (FSR_MULTI | FSR_SS | FSR_UUT | \
                    FSR_EF | FSR_PF | FSR_TF | FSR_IGN)
 
#define FSYNR0_WNR            (1 << 4)
 
#define IMPL_DEF1_MICRO_MMU_CTRL    0
#define MICRO_MMU_CTRL_LOCAL_HALT_REQ    (1 << 2)
#define MICRO_MMU_CTRL_IDLE        (1 << 3)
 
/* Definitions for implementation-defined registers */
#define ACTLR_QCOM_OSH_SHIFT        28
#define ACTLR_QCOM_OSH            1
 
#define ACTLR_QCOM_ISH_SHIFT        29
#define ACTLR_QCOM_ISH            1
 
#define ACTLR_QCOM_NSH_SHIFT        30
#define ACTLR_QCOM_NSH            1
 
#endif /* _ARM_SMMU_REGS_H */