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
|
/* SPDX-License-Identifier: LGPL-2.1 WITH Linux-syscall-note */
/* Copyright(c) 2019 Intel Corporation. All rights rsvd. */
#ifndef _USR_IDXD_H_
#define _USR_IDXD_H_
#include <linux/types.h>
/* Driver command error status */
enum idxd_scmd_stat {
IDXD_SCMD_DEV_ENABLED = 0x80000010,
IDXD_SCMD_DEV_NOT_ENABLED = 0x80000020,
IDXD_SCMD_WQ_ENABLED = 0x80000021,
IDXD_SCMD_DEV_DMA_ERR = 0x80020000,
IDXD_SCMD_WQ_NO_GRP = 0x80030000,
IDXD_SCMD_WQ_NO_NAME = 0x80040000,
IDXD_SCMD_WQ_NO_SVM = 0x80050000,
IDXD_SCMD_WQ_NO_THRESH = 0x80060000,
IDXD_SCMD_WQ_PORTAL_ERR = 0x80070000,
IDXD_SCMD_WQ_RES_ALLOC_ERR = 0x80080000,
IDXD_SCMD_PERCPU_ERR = 0x80090000,
IDXD_SCMD_DMA_CHAN_ERR = 0x800a0000,
IDXD_SCMD_CDEV_ERR = 0x800b0000,
IDXD_SCMD_WQ_NO_SWQ_SUPPORT = 0x800c0000,
IDXD_SCMD_WQ_NONE_CONFIGURED = 0x800d0000,
IDXD_SCMD_WQ_NO_SIZE = 0x800e0000,
IDXD_SCMD_WQ_NO_PRIV = 0x800f0000,
IDXD_SCMD_WQ_IRQ_ERR = 0x80100000,
IDXD_SCMD_WQ_USER_NO_IOMMU = 0x80110000,
IDXD_SCMD_DEV_EVL_ERR = 0x80120000,
IDXD_SCMD_WQ_NO_DRV_NAME = 0x80200000,
};
#define IDXD_SCMD_SOFTERR_MASK 0x80000000
#define IDXD_SCMD_SOFTERR_SHIFT 16
/* Descriptor flags */
#define IDXD_OP_FLAG_FENCE 0x0001
#define IDXD_OP_FLAG_BOF 0x0002
#define IDXD_OP_FLAG_CRAV 0x0004
#define IDXD_OP_FLAG_RCR 0x0008
#define IDXD_OP_FLAG_RCI 0x0010
#define IDXD_OP_FLAG_CRSTS 0x0020
#define IDXD_OP_FLAG_CR 0x0080
#define IDXD_OP_FLAG_CC 0x0100
#define IDXD_OP_FLAG_ADDR1_TCS 0x0200
#define IDXD_OP_FLAG_ADDR2_TCS 0x0400
#define IDXD_OP_FLAG_ADDR3_TCS 0x0800
#define IDXD_OP_FLAG_CR_TCS 0x1000
#define IDXD_OP_FLAG_STORD 0x2000
#define IDXD_OP_FLAG_DRDBK 0x4000
#define IDXD_OP_FLAG_DSTS 0x8000
/* IAX */
#define IDXD_OP_FLAG_RD_SRC2_AECS 0x010000
#define IDXD_OP_FLAG_RD_SRC2_2ND 0x020000
#define IDXD_OP_FLAG_WR_SRC2_AECS_COMP 0x040000
#define IDXD_OP_FLAG_WR_SRC2_AECS_OVFL 0x080000
#define IDXD_OP_FLAG_SRC2_STS 0x100000
#define IDXD_OP_FLAG_CRC_RFC3720 0x200000
/* Opcode */
enum dsa_opcode {
DSA_OPCODE_NOOP = 0,
DSA_OPCODE_BATCH,
DSA_OPCODE_DRAIN,
DSA_OPCODE_MEMMOVE,
DSA_OPCODE_MEMFILL,
DSA_OPCODE_COMPARE,
DSA_OPCODE_COMPVAL,
DSA_OPCODE_CR_DELTA,
DSA_OPCODE_AP_DELTA,
DSA_OPCODE_DUALCAST,
DSA_OPCODE_TRANSL_FETCH,
DSA_OPCODE_CRCGEN = 0x10,
DSA_OPCODE_COPY_CRC,
DSA_OPCODE_DIF_CHECK,
DSA_OPCODE_DIF_INS,
DSA_OPCODE_DIF_STRP,
DSA_OPCODE_DIF_UPDT,
DSA_OPCODE_DIX_GEN = 0x17,
DSA_OPCODE_CFLUSH = 0x20,
};
enum iax_opcode {
IAX_OPCODE_NOOP = 0,
IAX_OPCODE_DRAIN = 2,
IAX_OPCODE_MEMMOVE,
IAX_OPCODE_DECOMPRESS = 0x42,
IAX_OPCODE_COMPRESS,
IAX_OPCODE_CRC64,
IAX_OPCODE_ZERO_DECOMP_32 = 0x48,
IAX_OPCODE_ZERO_DECOMP_16,
IAX_OPCODE_ZERO_COMP_32 = 0x4c,
IAX_OPCODE_ZERO_COMP_16,
IAX_OPCODE_SCAN = 0x50,
IAX_OPCODE_SET_MEMBER,
IAX_OPCODE_EXTRACT,
IAX_OPCODE_SELECT,
IAX_OPCODE_RLE_BURST,
IAX_OPCODE_FIND_UNIQUE,
IAX_OPCODE_EXPAND,
};
/* Completion record status */
enum dsa_completion_status {
DSA_COMP_NONE = 0,
DSA_COMP_SUCCESS,
DSA_COMP_SUCCESS_PRED,
DSA_COMP_PAGE_FAULT_NOBOF,
DSA_COMP_PAGE_FAULT_IR,
DSA_COMP_BATCH_FAIL,
DSA_COMP_BATCH_PAGE_FAULT,
DSA_COMP_DR_OFFSET_NOINC,
DSA_COMP_DR_OFFSET_ERANGE,
DSA_COMP_DIF_ERR,
DSA_COMP_BAD_OPCODE = 0x10,
DSA_COMP_INVALID_FLAGS,
DSA_COMP_NOZERO_RESERVE,
DSA_COMP_XFER_ERANGE,
DSA_COMP_DESC_CNT_ERANGE,
DSA_COMP_DR_ERANGE,
DSA_COMP_OVERLAP_BUFFERS,
DSA_COMP_DCAST_ERR,
DSA_COMP_DESCLIST_ALIGN,
DSA_COMP_INT_HANDLE_INVAL,
DSA_COMP_CRA_XLAT,
DSA_COMP_CRA_ALIGN,
DSA_COMP_ADDR_ALIGN,
DSA_COMP_PRIV_BAD,
DSA_COMP_TRAFFIC_CLASS_CONF,
DSA_COMP_PFAULT_RDBA,
DSA_COMP_HW_ERR1,
DSA_COMP_HW_ERR_DRB,
DSA_COMP_TRANSLATION_FAIL,
DSA_COMP_DRAIN_EVL = 0x26,
DSA_COMP_BATCH_EVL_ERR,
};
enum iax_completion_status {
IAX_COMP_NONE = 0,
IAX_COMP_SUCCESS,
IAX_COMP_PAGE_FAULT_IR = 0x04,
IAX_COMP_ANALYTICS_ERROR = 0x0a,
IAX_COMP_OUTBUF_OVERFLOW,
IAX_COMP_BAD_OPCODE = 0x10,
IAX_COMP_INVALID_FLAGS,
IAX_COMP_NOZERO_RESERVE,
IAX_COMP_INVALID_SIZE,
IAX_COMP_OVERLAP_BUFFERS = 0x16,
IAX_COMP_INT_HANDLE_INVAL = 0x19,
IAX_COMP_CRA_XLAT,
IAX_COMP_CRA_ALIGN,
IAX_COMP_ADDR_ALIGN,
IAX_COMP_PRIV_BAD,
IAX_COMP_TRAFFIC_CLASS_CONF,
IAX_COMP_PFAULT_RDBA,
IAX_COMP_HW_ERR1,
IAX_COMP_HW_ERR_DRB,
IAX_COMP_TRANSLATION_FAIL,
IAX_COMP_PRS_TIMEOUT,
IAX_COMP_WATCHDOG,
IAX_COMP_INVALID_COMP_FLAG = 0x30,
IAX_COMP_INVALID_FILTER_FLAG,
IAX_COMP_INVALID_INPUT_SIZE,
IAX_COMP_INVALID_NUM_ELEMS,
IAX_COMP_INVALID_SRC1_WIDTH,
IAX_COMP_INVALID_INVERT_OUT,
};
#define DSA_COMP_STATUS_MASK 0x7f
#define DSA_COMP_STATUS_WRITE 0x80
#define DSA_COMP_STATUS(status) ((status) & DSA_COMP_STATUS_MASK)
struct dsa_hw_desc {
__u32 pasid:20;
__u32 rsvd:11;
__u32 priv:1;
__u32 flags:24;
__u32 opcode:8;
__u64 completion_addr;
union {
__u64 src_addr;
__u64 rdback_addr;
__u64 pattern;
__u64 desc_list_addr;
__u64 pattern_lower;
__u64 transl_fetch_addr;
};
union {
__u64 dst_addr;
__u64 rdback_addr2;
__u64 src2_addr;
__u64 comp_pattern;
};
union {
__u32 xfer_size;
__u32 desc_count;
__u32 region_size;
};
__u16 int_handle;
__u16 rsvd1;
union {
__u8 expected_res;
/* create delta record */
struct {
__u64 delta_addr;
__u32 max_delta_size;
__u32 delt_rsvd;
__u8 expected_res_mask;
};
__u32 delta_rec_size;
__u64 dest2;
/* CRC */
struct {
__u32 crc_seed;
__u32 crc_rsvd;
__u64 seed_addr;
};
/* DIF check or strip */
struct {
__u8 src_dif_flags;
__u8 dif_chk_res;
__u8 dif_chk_flags;
__u8 dif_chk_res2[5];
__u32 chk_ref_tag_seed;
__u16 chk_app_tag_mask;
__u16 chk_app_tag_seed;
};
/* DIF insert */
struct {
__u8 dif_ins_res;
__u8 dest_dif_flag;
__u8 dif_ins_flags;
__u8 dif_ins_res2[13];
__u32 ins_ref_tag_seed;
__u16 ins_app_tag_mask;
__u16 ins_app_tag_seed;
};
/* DIF update */
struct {
__u8 src_upd_flags;
__u8 upd_dest_flags;
__u8 dif_upd_flags;
__u8 dif_upd_res[5];
__u32 src_ref_tag_seed;
__u16 src_app_tag_mask;
__u16 src_app_tag_seed;
__u32 dest_ref_tag_seed;
__u16 dest_app_tag_mask;
__u16 dest_app_tag_seed;
};
/* Fill */
__u64 pattern_upper;
/* Translation fetch */
struct {
__u64 transl_fetch_res;
__u32 region_stride;
};
/* DIX generate */
struct {
__u8 dix_gen_res;
__u8 dest_dif_flags;
__u8 dif_flags;
__u8 dix_gen_res2[13];
__u32 ref_tag_seed;
__u16 app_tag_mask;
__u16 app_tag_seed;
};
__u8 op_specific[24];
};
} __attribute__((packed));
struct iax_hw_desc {
__u32 pasid:20;
__u32 rsvd:11;
__u32 priv:1;
__u32 flags:24;
__u32 opcode:8;
__u64 completion_addr;
__u64 src1_addr;
__u64 dst_addr;
__u32 src1_size;
__u16 int_handle;
union {
__u16 compr_flags;
__u16 decompr_flags;
};
__u64 src2_addr;
__u32 max_dst_size;
__u32 src2_size;
__u32 filter_flags;
__u32 num_inputs;
} __attribute__((packed));
struct dsa_raw_desc {
__u64 field[8];
} __attribute__((packed));
/*
* The status field will be modified by hardware, therefore it should be
* volatile and prevent the compiler from optimize the read.
*/
struct dsa_completion_record {
volatile __u8 status;
union {
__u8 result;
__u8 dif_status;
};
__u8 fault_info;
__u8 rsvd;
union {
__u32 bytes_completed;
__u32 descs_completed;
};
__u64 fault_addr;
union {
/* common record */
struct {
__u32 invalid_flags:24;
__u32 rsvd2:8;
};
__u32 delta_rec_size;
__u64 crc_val;
/* DIF check & strip */
struct {
__u32 dif_chk_ref_tag;
__u16 dif_chk_app_tag_mask;
__u16 dif_chk_app_tag;
};
/* DIF insert */
struct {
__u64 dif_ins_res;
__u32 dif_ins_ref_tag;
__u16 dif_ins_app_tag_mask;
__u16 dif_ins_app_tag;
};
/* DIF update */
struct {
__u32 dif_upd_src_ref_tag;
__u16 dif_upd_src_app_tag_mask;
__u16 dif_upd_src_app_tag;
__u32 dif_upd_dest_ref_tag;
__u16 dif_upd_dest_app_tag_mask;
__u16 dif_upd_dest_app_tag;
};
/* DIX generate */
struct {
__u64 dix_gen_res;
__u32 dix_ref_tag;
__u16 dix_app_tag_mask;
__u16 dix_app_tag;
};
__u8 op_specific[16];
};
} __attribute__((packed));
struct dsa_raw_completion_record {
__u64 field[4];
} __attribute__((packed));
struct iax_completion_record {
volatile __u8 status;
__u8 error_code;
__u8 fault_info;
__u8 rsvd;
__u32 bytes_completed;
__u64 fault_addr;
__u32 invalid_flags;
__u32 rsvd2;
__u32 output_size;
__u8 output_bits;
__u8 rsvd3;
__u16 xor_csum;
__u32 crc;
__u32 min;
__u32 max;
__u32 sum;
__u64 rsvd4[2];
} __attribute__((packed));
struct iax_raw_completion_record {
__u64 field[8];
} __attribute__((packed));
#endif
|