idxd.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /* SPDX-License-Identifier: LGPL-2.1 WITH Linux-syscall-note */
  2. /* Copyright(c) 2019 Intel Corporation. All rights rsvd. */
  3. #ifndef _USR_IDXD_H_
  4. #define _USR_IDXD_H_
  5. #ifdef __KERNEL__
  6. #include <linux/types.h>
  7. #else
  8. #include <stdint.h>
  9. #endif
  10. /* Driver command error status */
  11. enum idxd_scmd_stat {
  12. IDXD_SCMD_DEV_ENABLED = 0x80000010,
  13. IDXD_SCMD_DEV_NOT_ENABLED = 0x80000020,
  14. IDXD_SCMD_WQ_ENABLED = 0x80000021,
  15. IDXD_SCMD_DEV_DMA_ERR = 0x80020000,
  16. IDXD_SCMD_WQ_NO_GRP = 0x80030000,
  17. IDXD_SCMD_WQ_NO_NAME = 0x80040000,
  18. IDXD_SCMD_WQ_NO_SVM = 0x80050000,
  19. IDXD_SCMD_WQ_NO_THRESH = 0x80060000,
  20. IDXD_SCMD_WQ_PORTAL_ERR = 0x80070000,
  21. IDXD_SCMD_WQ_RES_ALLOC_ERR = 0x80080000,
  22. IDXD_SCMD_PERCPU_ERR = 0x80090000,
  23. IDXD_SCMD_DMA_CHAN_ERR = 0x800a0000,
  24. IDXD_SCMD_CDEV_ERR = 0x800b0000,
  25. IDXD_SCMD_WQ_NO_SWQ_SUPPORT = 0x800c0000,
  26. IDXD_SCMD_WQ_NONE_CONFIGURED = 0x800d0000,
  27. IDXD_SCMD_WQ_NO_SIZE = 0x800e0000,
  28. IDXD_SCMD_WQ_NO_PRIV = 0x800f0000,
  29. IDXD_SCMD_WQ_IRQ_ERR = 0x80100000,
  30. IDXD_SCMD_WQ_USER_NO_IOMMU = 0x80110000,
  31. };
  32. #define IDXD_SCMD_SOFTERR_MASK 0x80000000
  33. #define IDXD_SCMD_SOFTERR_SHIFT 16
  34. /* Descriptor flags */
  35. #define IDXD_OP_FLAG_FENCE 0x0001
  36. #define IDXD_OP_FLAG_BOF 0x0002
  37. #define IDXD_OP_FLAG_CRAV 0x0004
  38. #define IDXD_OP_FLAG_RCR 0x0008
  39. #define IDXD_OP_FLAG_RCI 0x0010
  40. #define IDXD_OP_FLAG_CRSTS 0x0020
  41. #define IDXD_OP_FLAG_CR 0x0080
  42. #define IDXD_OP_FLAG_CC 0x0100
  43. #define IDXD_OP_FLAG_ADDR1_TCS 0x0200
  44. #define IDXD_OP_FLAG_ADDR2_TCS 0x0400
  45. #define IDXD_OP_FLAG_ADDR3_TCS 0x0800
  46. #define IDXD_OP_FLAG_CR_TCS 0x1000
  47. #define IDXD_OP_FLAG_STORD 0x2000
  48. #define IDXD_OP_FLAG_DRDBK 0x4000
  49. #define IDXD_OP_FLAG_DSTS 0x8000
  50. /* IAX */
  51. #define IDXD_OP_FLAG_RD_SRC2_AECS 0x010000
  52. #define IDXD_OP_FLAG_RD_SRC2_2ND 0x020000
  53. #define IDXD_OP_FLAG_WR_SRC2_AECS_COMP 0x040000
  54. #define IDXD_OP_FLAG_WR_SRC2_AECS_OVFL 0x080000
  55. #define IDXD_OP_FLAG_SRC2_STS 0x100000
  56. #define IDXD_OP_FLAG_CRC_RFC3720 0x200000
  57. /* Opcode */
  58. enum dsa_opcode {
  59. DSA_OPCODE_NOOP = 0,
  60. DSA_OPCODE_BATCH,
  61. DSA_OPCODE_DRAIN,
  62. DSA_OPCODE_MEMMOVE,
  63. DSA_OPCODE_MEMFILL,
  64. DSA_OPCODE_COMPARE,
  65. DSA_OPCODE_COMPVAL,
  66. DSA_OPCODE_CR_DELTA,
  67. DSA_OPCODE_AP_DELTA,
  68. DSA_OPCODE_DUALCAST,
  69. DSA_OPCODE_CRCGEN = 0x10,
  70. DSA_OPCODE_COPY_CRC,
  71. DSA_OPCODE_DIF_CHECK,
  72. DSA_OPCODE_DIF_INS,
  73. DSA_OPCODE_DIF_STRP,
  74. DSA_OPCODE_DIF_UPDT,
  75. DSA_OPCODE_CFLUSH = 0x20,
  76. };
  77. enum iax_opcode {
  78. IAX_OPCODE_NOOP = 0,
  79. IAX_OPCODE_DRAIN = 2,
  80. IAX_OPCODE_MEMMOVE,
  81. IAX_OPCODE_DECOMPRESS = 0x42,
  82. IAX_OPCODE_COMPRESS,
  83. IAX_OPCODE_CRC64,
  84. IAX_OPCODE_ZERO_DECOMP_32 = 0x48,
  85. IAX_OPCODE_ZERO_DECOMP_16,
  86. IAX_OPCODE_ZERO_COMP_32 = 0x4c,
  87. IAX_OPCODE_ZERO_COMP_16,
  88. IAX_OPCODE_SCAN = 0x50,
  89. IAX_OPCODE_SET_MEMBER,
  90. IAX_OPCODE_EXTRACT,
  91. IAX_OPCODE_SELECT,
  92. IAX_OPCODE_RLE_BURST,
  93. IAX_OPCODE_FIND_UNIQUE,
  94. IAX_OPCODE_EXPAND,
  95. };
  96. /* Completion record status */
  97. enum dsa_completion_status {
  98. DSA_COMP_NONE = 0,
  99. DSA_COMP_SUCCESS,
  100. DSA_COMP_SUCCESS_PRED,
  101. DSA_COMP_PAGE_FAULT_NOBOF,
  102. DSA_COMP_PAGE_FAULT_IR,
  103. DSA_COMP_BATCH_FAIL,
  104. DSA_COMP_BATCH_PAGE_FAULT,
  105. DSA_COMP_DR_OFFSET_NOINC,
  106. DSA_COMP_DR_OFFSET_ERANGE,
  107. DSA_COMP_DIF_ERR,
  108. DSA_COMP_BAD_OPCODE = 0x10,
  109. DSA_COMP_INVALID_FLAGS,
  110. DSA_COMP_NOZERO_RESERVE,
  111. DSA_COMP_XFER_ERANGE,
  112. DSA_COMP_DESC_CNT_ERANGE,
  113. DSA_COMP_DR_ERANGE,
  114. DSA_COMP_OVERLAP_BUFFERS,
  115. DSA_COMP_DCAST_ERR,
  116. DSA_COMP_DESCLIST_ALIGN,
  117. DSA_COMP_INT_HANDLE_INVAL,
  118. DSA_COMP_CRA_XLAT,
  119. DSA_COMP_CRA_ALIGN,
  120. DSA_COMP_ADDR_ALIGN,
  121. DSA_COMP_PRIV_BAD,
  122. DSA_COMP_TRAFFIC_CLASS_CONF,
  123. DSA_COMP_PFAULT_RDBA,
  124. DSA_COMP_HW_ERR1,
  125. DSA_COMP_HW_ERR_DRB,
  126. DSA_COMP_TRANSLATION_FAIL,
  127. };
  128. enum iax_completion_status {
  129. IAX_COMP_NONE = 0,
  130. IAX_COMP_SUCCESS,
  131. IAX_COMP_PAGE_FAULT_IR = 0x04,
  132. IAX_COMP_ANALYTICS_ERROR = 0x0a,
  133. IAX_COMP_OUTBUF_OVERFLOW,
  134. IAX_COMP_BAD_OPCODE = 0x10,
  135. IAX_COMP_INVALID_FLAGS,
  136. IAX_COMP_NOZERO_RESERVE,
  137. IAX_COMP_INVALID_SIZE,
  138. IAX_COMP_OVERLAP_BUFFERS = 0x16,
  139. IAX_COMP_INT_HANDLE_INVAL = 0x19,
  140. IAX_COMP_CRA_XLAT,
  141. IAX_COMP_CRA_ALIGN,
  142. IAX_COMP_ADDR_ALIGN,
  143. IAX_COMP_PRIV_BAD,
  144. IAX_COMP_TRAFFIC_CLASS_CONF,
  145. IAX_COMP_PFAULT_RDBA,
  146. IAX_COMP_HW_ERR1,
  147. IAX_COMP_HW_ERR_DRB,
  148. IAX_COMP_TRANSLATION_FAIL,
  149. IAX_COMP_PRS_TIMEOUT,
  150. IAX_COMP_WATCHDOG,
  151. IAX_COMP_INVALID_COMP_FLAG = 0x30,
  152. IAX_COMP_INVALID_FILTER_FLAG,
  153. IAX_COMP_INVALID_INPUT_SIZE,
  154. IAX_COMP_INVALID_NUM_ELEMS,
  155. IAX_COMP_INVALID_SRC1_WIDTH,
  156. IAX_COMP_INVALID_INVERT_OUT,
  157. };
  158. #define DSA_COMP_STATUS_MASK 0x7f
  159. #define DSA_COMP_STATUS_WRITE 0x80
  160. struct dsa_hw_desc {
  161. uint32_t pasid:20;
  162. uint32_t rsvd:11;
  163. uint32_t priv:1;
  164. uint32_t flags:24;
  165. uint32_t opcode:8;
  166. uint64_t completion_addr;
  167. union {
  168. uint64_t src_addr;
  169. uint64_t rdback_addr;
  170. uint64_t pattern;
  171. uint64_t desc_list_addr;
  172. };
  173. union {
  174. uint64_t dst_addr;
  175. uint64_t rdback_addr2;
  176. uint64_t src2_addr;
  177. uint64_t comp_pattern;
  178. };
  179. union {
  180. uint32_t xfer_size;
  181. uint32_t desc_count;
  182. };
  183. uint16_t int_handle;
  184. uint16_t rsvd1;
  185. union {
  186. uint8_t expected_res;
  187. /* create delta record */
  188. struct {
  189. uint64_t delta_addr;
  190. uint32_t max_delta_size;
  191. uint32_t delt_rsvd;
  192. uint8_t expected_res_mask;
  193. };
  194. uint32_t delta_rec_size;
  195. uint64_t dest2;
  196. /* CRC */
  197. struct {
  198. uint32_t crc_seed;
  199. uint32_t crc_rsvd;
  200. uint64_t seed_addr;
  201. };
  202. /* DIF check or strip */
  203. struct {
  204. uint8_t src_dif_flags;
  205. uint8_t dif_chk_res;
  206. uint8_t dif_chk_flags;
  207. uint8_t dif_chk_res2[5];
  208. uint32_t chk_ref_tag_seed;
  209. uint16_t chk_app_tag_mask;
  210. uint16_t chk_app_tag_seed;
  211. };
  212. /* DIF insert */
  213. struct {
  214. uint8_t dif_ins_res;
  215. uint8_t dest_dif_flag;
  216. uint8_t dif_ins_flags;
  217. uint8_t dif_ins_res2[13];
  218. uint32_t ins_ref_tag_seed;
  219. uint16_t ins_app_tag_mask;
  220. uint16_t ins_app_tag_seed;
  221. };
  222. /* DIF update */
  223. struct {
  224. uint8_t src_upd_flags;
  225. uint8_t upd_dest_flags;
  226. uint8_t dif_upd_flags;
  227. uint8_t dif_upd_res[5];
  228. uint32_t src_ref_tag_seed;
  229. uint16_t src_app_tag_mask;
  230. uint16_t src_app_tag_seed;
  231. uint32_t dest_ref_tag_seed;
  232. uint16_t dest_app_tag_mask;
  233. uint16_t dest_app_tag_seed;
  234. };
  235. uint8_t op_specific[24];
  236. };
  237. } __attribute__((packed));
  238. struct iax_hw_desc {
  239. uint32_t pasid:20;
  240. uint32_t rsvd:11;
  241. uint32_t priv:1;
  242. uint32_t flags:24;
  243. uint32_t opcode:8;
  244. uint64_t completion_addr;
  245. uint64_t src1_addr;
  246. uint64_t dst_addr;
  247. uint32_t src1_size;
  248. uint16_t int_handle;
  249. union {
  250. uint16_t compr_flags;
  251. uint16_t decompr_flags;
  252. };
  253. uint64_t src2_addr;
  254. uint32_t max_dst_size;
  255. uint32_t src2_size;
  256. uint32_t filter_flags;
  257. uint32_t num_inputs;
  258. } __attribute__((packed));
  259. struct dsa_raw_desc {
  260. uint64_t field[8];
  261. } __attribute__((packed));
  262. /*
  263. * The status field will be modified by hardware, therefore it should be
  264. * volatile and prevent the compiler from optimize the read.
  265. */
  266. struct dsa_completion_record {
  267. volatile uint8_t status;
  268. union {
  269. uint8_t result;
  270. uint8_t dif_status;
  271. };
  272. uint16_t rsvd;
  273. uint32_t bytes_completed;
  274. uint64_t fault_addr;
  275. union {
  276. /* common record */
  277. struct {
  278. uint32_t invalid_flags:24;
  279. uint32_t rsvd2:8;
  280. };
  281. uint32_t delta_rec_size;
  282. uint64_t crc_val;
  283. /* DIF check & strip */
  284. struct {
  285. uint32_t dif_chk_ref_tag;
  286. uint16_t dif_chk_app_tag_mask;
  287. uint16_t dif_chk_app_tag;
  288. };
  289. /* DIF insert */
  290. struct {
  291. uint64_t dif_ins_res;
  292. uint32_t dif_ins_ref_tag;
  293. uint16_t dif_ins_app_tag_mask;
  294. uint16_t dif_ins_app_tag;
  295. };
  296. /* DIF update */
  297. struct {
  298. uint32_t dif_upd_src_ref_tag;
  299. uint16_t dif_upd_src_app_tag_mask;
  300. uint16_t dif_upd_src_app_tag;
  301. uint32_t dif_upd_dest_ref_tag;
  302. uint16_t dif_upd_dest_app_tag_mask;
  303. uint16_t dif_upd_dest_app_tag;
  304. };
  305. uint8_t op_specific[16];
  306. };
  307. } __attribute__((packed));
  308. struct dsa_raw_completion_record {
  309. uint64_t field[4];
  310. } __attribute__((packed));
  311. struct iax_completion_record {
  312. volatile uint8_t status;
  313. uint8_t error_code;
  314. uint16_t rsvd;
  315. uint32_t bytes_completed;
  316. uint64_t fault_addr;
  317. uint32_t invalid_flags;
  318. uint32_t rsvd2;
  319. uint32_t output_size;
  320. uint8_t output_bits;
  321. uint8_t rsvd3;
  322. uint16_t xor_csum;
  323. uint32_t crc;
  324. uint32_t min;
  325. uint32_t max;
  326. uint32_t sum;
  327. uint64_t rsvd4[2];
  328. } __attribute__((packed));
  329. struct iax_raw_completion_record {
  330. uint64_t field[8];
  331. } __attribute__((packed));
  332. #endif