30
*/
31
#define TEGRA241_CMDQV_IO_LEN 0x50000
32
33
+/* CMDQV MMIO aperture bases and VCMDQ stride */
34
+#define CMDQV_VCMDQ_PAGE0_BASE 0x10000 /* CMDQV_CMDQ_BASE */
35
+#define CMDQV_VCMDQ_PAGE1_BASE 0x20000
36
+#define CMDQV_VINTF_PAGE0_BASE 0x30000 /* CMDQV_VI_CMDQ_BASE */
37
+#define CMDQV_VINTF_PAGE1_BASE 0x40000
38
+#define CMDQV_VCMDQ_STRIDE 0x80
39
+
40
#define VINTF_PAGE_SIZE 0x10000
41
42
struct iommu_viommu_tegra241_cmdqv;
64
uint32_t vintf_sid_match[TEGRA241_CMDQV_MAX_NUM_SID];
65
uint32_t vintf_sid_replace[TEGRA241_CMDQV_MAX_NUM_SID];
66
uint32_t vintf_cmdq_err_map[4];
67
+ /*
68
+ * VCMDQ register cache. The direct (VCMDQ aperture) and logical
69
+ * (VINTF aperture) views are hardware aliases; both are served from
70
+ * this single cached copy.
71
+ */
72
+ uint32_t vcmdq_cons_indx[TEGRA241_CMDQV_MAX_CMDQ];
73
+ uint32_t vcmdq_prod_indx[TEGRA241_CMDQV_MAX_CMDQ];
74
+ uint32_t vcmdq_config[TEGRA241_CMDQV_MAX_CMDQ];
75
+ uint32_t vcmdq_status[TEGRA241_CMDQV_MAX_CMDQ];
76
+ uint32_t vcmdq_gerror[TEGRA241_CMDQV_MAX_CMDQ];
77
+ uint32_t vcmdq_gerrorn[TEGRA241_CMDQV_MAX_CMDQ];
78
+ uint64_t vcmdq_base[TEGRA241_CMDQV_MAX_CMDQ];
79
+ uint64_t vcmdq_cons_indx_base[TEGRA241_CMDQV_MAX_CMDQ];
80
} Tegra241CMDQV;
81
82
/* CMDQ-V Config page registers (offset 0x00000) */
168
FIELD(VINTF0_LVCMDQ_ERR_MAP_0, LVCMDQ_ERR_MAP, 0, 32)
169
#define A_VINTF0_LVCMDQ_ERR_MAP_3 (A_VINTF0_LVCMDQ_ERR_MAP_0 + 3 * 4)
170
171
+/*
172
+ * Direct VCMDQ aperture register windows.
173
+ *
174
+ * Page 0 @ CMDQV_VCMDQ_PAGE0_BASE: VCMDQ control and status registers.
175
+ * Page 1 @ CMDQV_VCMDQ_PAGE1_BASE: VCMDQ base and DRAM address registers.
176
+ *
177
+ * Each VCMDQ occupies a CMDQV_VCMDQ_STRIDE-byte slot within its page.
178
+ */
179
+
180
+/* --- Page 0 register macros --- */
181
+#define SMMU_CMDQV_VCMDQi_CONS_INDX_(i) \
182
+ REG32(VCMDQ##i##_CONS_INDX, \
183
+ CMDQV_VCMDQ_PAGE0_BASE + i * CMDQV_VCMDQ_STRIDE) \
184
+ FIELD(VCMDQ##i##_CONS_INDX, RD, 0, 20) \
185
+ FIELD(VCMDQ##i##_CONS_INDX, ERR, 24, 7)
186
+
187
+#define V_VCMDQ_CONS_INDX_ERR_CERROR_NONE 0
188
+#define V_VCMDQ_CONS_INDX_ERR_CERROR_ILL_OPCODE 1
189
+#define V_VCMDQ_CONS_INDX_ERR_CERROR_ABT 2
190
+#define V_VCMDQ_CONS_INDX_ERR_CERROR_ATC_INV_SYNC 3
191
+#define V_VCMDQ_CONS_INDX_ERR_CERROR_ILL_ACCESS 4
192
+
193
+#define SMMU_CMDQV_VCMDQi_PROD_INDX_(i) \
194
+ REG32(VCMDQ##i##_PROD_INDX, \
195
+ CMDQV_VCMDQ_PAGE0_BASE + 0x4 + i * CMDQV_VCMDQ_STRIDE) \
196
+ FIELD(VCMDQ##i##_PROD_INDX, WR, 0, 20)
197
+
198
+#define SMMU_CMDQV_VCMDQi_CONFIG_(i) \
199
+ REG32(VCMDQ##i##_CONFIG, \
200
+ CMDQV_VCMDQ_PAGE0_BASE + 0x8 + i * CMDQV_VCMDQ_STRIDE) \
201
+ FIELD(VCMDQ##i##_CONFIG, CMDQ_EN, 0, 1)
202
+
203
+#define SMMU_CMDQV_VCMDQi_STATUS_(i) \
204
+ REG32(VCMDQ##i##_STATUS, \
205
+ CMDQV_VCMDQ_PAGE0_BASE + 0xc + i * CMDQV_VCMDQ_STRIDE) \
206
+ FIELD(VCMDQ##i##_STATUS, CMDQ_EN_OK, 0, 1)
207
+
208
+#define SMMU_CMDQV_VCMDQi_GERROR_(i) \
209
+ REG32(VCMDQ##i##_GERROR, \
210
+ CMDQV_VCMDQ_PAGE0_BASE + 0x10 + i * CMDQV_VCMDQ_STRIDE) \
211
+ FIELD(VCMDQ##i##_GERROR, CMDQ_ERR, 0, 1) \
212
+ FIELD(VCMDQ##i##_GERROR, CONS_DRAM_WR_ABT_ERR, 1, 1) \
213
+ FIELD(VCMDQ##i##_GERROR, CMDQ_INIT_ERR, 2, 1)
214
+
215
+#define SMMU_CMDQV_VCMDQi_GERRORN_(i) \
216
+ REG32(VCMDQ##i##_GERRORN, \
217
+ CMDQV_VCMDQ_PAGE0_BASE + 0x14 + i * CMDQV_VCMDQ_STRIDE) \
218
+ FIELD(VCMDQ##i##_GERRORN, CMDQ_ERR, 0, 1) \
219
+ FIELD(VCMDQ##i##_GERRORN, CONS_DRAM_WR_ABT_ERR, 1, 1) \
220
+ FIELD(VCMDQ##i##_GERRORN, CMDQ_INIT_ERR, 2, 1)
221
+
222
+/* Page 0 layout: VCMDQ0 */
223
+SMMU_CMDQV_VCMDQi_CONS_INDX_(0)
224
+SMMU_CMDQV_VCMDQi_PROD_INDX_(0)
225
+SMMU_CMDQV_VCMDQi_CONFIG_(0)
226
+SMMU_CMDQV_VCMDQi_STATUS_(0)
227
+SMMU_CMDQV_VCMDQi_GERROR_(0)
228
+SMMU_CMDQV_VCMDQi_GERRORN_(0)
229
+
230
+/* Page 0 layout: VCMDQ1 */
231
+SMMU_CMDQV_VCMDQi_CONS_INDX_(1)
232
+SMMU_CMDQV_VCMDQi_PROD_INDX_(1)
233
+SMMU_CMDQV_VCMDQi_CONFIG_(1)
234
+SMMU_CMDQV_VCMDQi_STATUS_(1)
235
+SMMU_CMDQV_VCMDQi_GERROR_(1)
236
+SMMU_CMDQV_VCMDQi_GERRORN_(1)
237
+
238
+/* --- Page 1 register macros --- */
239
+#define SMMU_CMDQV_VCMDQi_BASE_L_(i) \
240
+ REG32(VCMDQ##i##_BASE_L, CMDQV_VCMDQ_PAGE1_BASE + i * CMDQV_VCMDQ_STRIDE) \
241
+ FIELD(VCMDQ##i##_BASE_L, LOG2SIZE, 0, 5) \
242
+ FIELD(VCMDQ##i##_BASE_L, ADDR, 5, 27)
243
+
244
+#define SMMU_CMDQV_VCMDQi_BASE_H_(i) \
245
+ REG32(VCMDQ##i##_BASE_H, \
246
+ CMDQV_VCMDQ_PAGE1_BASE + 0x4 + i * CMDQV_VCMDQ_STRIDE) \
247
+ FIELD(VCMDQ##i##_BASE_H, ADDR, 0, 16)
248
+
249
+#define SMMU_CMDQV_VCMDQi_CONS_INDX_BASE_DRAM_L_(i) \
250
+ REG32(VCMDQ##i##_CONS_INDX_BASE_DRAM_L, \
251
+ CMDQV_VCMDQ_PAGE1_BASE + 0x8 + i * CMDQV_VCMDQ_STRIDE) \
252
+ FIELD(VCMDQ##i##_CONS_INDX_BASE_DRAM_L, ADDR, 0, 32)
253
+
254
+#define SMMU_CMDQV_VCMDQi_CONS_INDX_BASE_DRAM_H_(i) \
255
+ REG32(VCMDQ##i##_CONS_INDX_BASE_DRAM_H, \
256
+ CMDQV_VCMDQ_PAGE1_BASE + 0xc + i * CMDQV_VCMDQ_STRIDE) \
257
+ FIELD(VCMDQ##i##_CONS_INDX_BASE_DRAM_H, ADDR, 0, 16)
258
+
259
+/* Page 1 layout: VCMDQ0 */
260
+SMMU_CMDQV_VCMDQi_BASE_L_(0)
261
+SMMU_CMDQV_VCMDQi_BASE_H_(0)
262
+SMMU_CMDQV_VCMDQi_CONS_INDX_BASE_DRAM_L_(0)
263
+SMMU_CMDQV_VCMDQi_CONS_INDX_BASE_DRAM_H_(0)
264
+
265
+/* Page 1 layout: VCMDQ1 */
266
+SMMU_CMDQV_VCMDQi_BASE_L_(1)
267
+SMMU_CMDQV_VCMDQi_BASE_H_(1)
268
+SMMU_CMDQV_VCMDQi_CONS_INDX_BASE_DRAM_L_(1)
269
+SMMU_CMDQV_VCMDQi_CONS_INDX_BASE_DRAM_H_(1)
270
+
271
+/*
272
+ * VINTF0 logical VCMDQ aperture register windows.
273
+ *
274
+ * Page 0 @ CMDQV_VINTF_PAGE0_BASE: VCMDQ control and status registers.
275
+ * Page 1 @ CMDQV_VINTF_PAGE1_BASE: VCMDQ base and DRAM address registers.
276
+ *
277
+ * VCMDQs mapped via VINTF are accessed through this aperture as
278
+ * hardware aliases of the direct VCMDQ aperture above.
279
+ */
280
+
281
+/* --- Page 0 register macros --- */
282
+#define SMMU_CMDQV_VI_VCMDQi_CONS_INDX_(i) \
283
+ REG32(VI_VCMDQ##i##_CONS_INDX, \
284
+ CMDQV_VINTF_PAGE0_BASE + i * CMDQV_VCMDQ_STRIDE) \
285
+ FIELD(VI_VCMDQ##i##_CONS_INDX, RD, 0, 20) \
286
+ FIELD(VI_VCMDQ##i##_CONS_INDX, ERR, 24, 7)
287
+
288
+#define SMMU_CMDQV_VI_VCMDQi_PROD_INDX_(i) \
289
+ REG32(VI_VCMDQ##i##_PROD_INDX, \
290
+ CMDQV_VINTF_PAGE0_BASE + 0x4 + i * CMDQV_VCMDQ_STRIDE) \
291
+ FIELD(VI_VCMDQ##i##_PROD_INDX, WR, 0, 20)
292
+
293
+#define SMMU_CMDQV_VI_VCMDQi_CONFIG_(i) \
294
+ REG32(VI_VCMDQ##i##_CONFIG, \
295
+ CMDQV_VINTF_PAGE0_BASE + 0x8 + i * CMDQV_VCMDQ_STRIDE) \
296
+ FIELD(VI_VCMDQ##i##_CONFIG, CMDQ_EN, 0, 1)
297
+
298
+#define SMMU_CMDQV_VI_VCMDQi_STATUS_(i) \
299
+ REG32(VI_VCMDQ##i##_STATUS, \
300
+ CMDQV_VINTF_PAGE0_BASE + 0xc + i * CMDQV_VCMDQ_STRIDE) \
301
+ FIELD(VI_VCMDQ##i##_STATUS, CMDQ_EN_OK, 0, 1)
302
+
303
+#define SMMU_CMDQV_VI_VCMDQi_GERROR_(i) \
304
+ REG32(VI_VCMDQ##i##_GERROR, \
305
+ CMDQV_VINTF_PAGE0_BASE + 0x10 + i * CMDQV_VCMDQ_STRIDE) \
306
+ FIELD(VI_VCMDQ##i##_GERROR, CMDQ_ERR, 0, 1) \
307
+ FIELD(VI_VCMDQ##i##_GERROR, CONS_DRAM_WR_ABT_ERR, 1, 1) \
308
+ FIELD(VI_VCMDQ##i##_GERROR, CMDQ_INIT_ERR, 2, 1)
309
+
310
+#define SMMU_CMDQV_VI_VCMDQi_GERRORN_(i) \
311
+ REG32(VI_VCMDQ##i##_GERRORN, \
312
+ CMDQV_VINTF_PAGE0_BASE + 0x14 + i * CMDQV_VCMDQ_STRIDE) \
313
+ FIELD(VI_VCMDQ##i##_GERRORN, CMDQ_ERR, 0, 1) \
314
+ FIELD(VI_VCMDQ##i##_GERRORN, CONS_DRAM_WR_ABT_ERR, 1, 1) \
315
+ FIELD(VI_VCMDQ##i##_GERRORN, CMDQ_INIT_ERR, 2, 1)
316
+
317
+/* Page 0 layout: VCMDQ0 */
318
+SMMU_CMDQV_VI_VCMDQi_CONS_INDX_(0)
319
+SMMU_CMDQV_VI_VCMDQi_PROD_INDX_(0)
320
+SMMU_CMDQV_VI_VCMDQi_CONFIG_(0)
321
+SMMU_CMDQV_VI_VCMDQi_STATUS_(0)
322
+SMMU_CMDQV_VI_VCMDQi_GERROR_(0)
323
+SMMU_CMDQV_VI_VCMDQi_GERRORN_(0)
324
+
325
+/* Page 0 layout: VCMDQ1 */
326
+SMMU_CMDQV_VI_VCMDQi_CONS_INDX_(1)
327
+SMMU_CMDQV_VI_VCMDQi_PROD_INDX_(1)
328
+SMMU_CMDQV_VI_VCMDQi_CONFIG_(1)
329
+SMMU_CMDQV_VI_VCMDQi_STATUS_(1)
330
+SMMU_CMDQV_VI_VCMDQi_GERROR_(1)
331
+SMMU_CMDQV_VI_VCMDQi_GERRORN_(1)
332
+
333
+/* --- Page 1 register macros --- */
334
+#define SMMU_CMDQV_VI_VCMDQi_BASE_L_(i) \
335
+ REG32(VI_VCMDQ##i##_BASE_L, \
336
+ CMDQV_VINTF_PAGE1_BASE + i * CMDQV_VCMDQ_STRIDE) \
337
+ FIELD(VI_VCMDQ##i##_BASE_L, LOG2SIZE, 0, 5) \
338
+ FIELD(VI_VCMDQ##i##_BASE_L, ADDR, 5, 27)
339
+
340
+#define SMMU_CMDQV_VI_VCMDQi_BASE_H_(i) \
341
+ REG32(VI_VCMDQ##i##_BASE_H, \
342
+ CMDQV_VINTF_PAGE1_BASE + 0x4 + i * CMDQV_VCMDQ_STRIDE) \
343
+ FIELD(VI_VCMDQ##i##_BASE_H, ADDR, 0, 16)
344
+
345
+#define SMMU_CMDQV_VI_VCMDQi_CONS_INDX_BASE_DRAM_L_(i) \
346
+ REG32(VI_VCMDQ##i##_CONS_INDX_BASE_DRAM_L, \
347
+ CMDQV_VINTF_PAGE1_BASE + 0x8 + i * CMDQV_VCMDQ_STRIDE) \
348
+ FIELD(VI_VCMDQ##i##_CONS_INDX_BASE_DRAM_L, ADDR, 0, 32)
349
+
350
+#define SMMU_CMDQV_VI_VCMDQi_CONS_INDX_BASE_DRAM_H_(i) \
351
+ REG32(VI_VCMDQ##i##_CONS_INDX_BASE_DRAM_H, \
352
+ CMDQV_VINTF_PAGE1_BASE + 0xc + i * CMDQV_VCMDQ_STRIDE) \
353
+ FIELD(VI_VCMDQ##i##_CONS_INDX_BASE_DRAM_H, ADDR, 0, 16)
354
+
355
+/* Page 1 layout: VCMDQ0 */
356
+SMMU_CMDQV_VI_VCMDQi_BASE_L_(0)
357
+SMMU_CMDQV_VI_VCMDQi_BASE_H_(0)
358
+SMMU_CMDQV_VI_VCMDQi_CONS_INDX_BASE_DRAM_L_(0)
359
+SMMU_CMDQV_VI_VCMDQi_CONS_INDX_BASE_DRAM_H_(0)
360
+
361
+/* Page 1 layout: VCMDQ1 */
362
+SMMU_CMDQV_VI_VCMDQi_BASE_L_(1)
363
+SMMU_CMDQV_VI_VCMDQi_BASE_H_(1)
364
+SMMU_CMDQV_VI_VCMDQi_CONS_INDX_BASE_DRAM_L_(1)
365
+SMMU_CMDQV_VI_VCMDQi_CONS_INDX_BASE_DRAM_H_(1)
366
+
367
const SMMUv3AccelCmdqvOps *tegra241_cmdqv_get_ops(void);
368
369
#endif /* HW_ARM_TEGRA241_CMDQV_H */