logo

oasis-root

Compiled tree of Oasis Linux based on own branch at <https://hacktivis.me/git/oasis/> git clone https://anongit.hacktivis.me/git/oasis-root.git

idxd.h (9328B)


  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. #include <stdint.h>
  6. /* Driver command error status */
  7. enum idxd_scmd_stat {
  8. IDXD_SCMD_DEV_ENABLED = 0x80000010,
  9. IDXD_SCMD_DEV_NOT_ENABLED = 0x80000020,
  10. IDXD_SCMD_WQ_ENABLED = 0x80000021,
  11. IDXD_SCMD_DEV_DMA_ERR = 0x80020000,
  12. IDXD_SCMD_WQ_NO_GRP = 0x80030000,
  13. IDXD_SCMD_WQ_NO_NAME = 0x80040000,
  14. IDXD_SCMD_WQ_NO_SVM = 0x80050000,
  15. IDXD_SCMD_WQ_NO_THRESH = 0x80060000,
  16. IDXD_SCMD_WQ_PORTAL_ERR = 0x80070000,
  17. IDXD_SCMD_WQ_RES_ALLOC_ERR = 0x80080000,
  18. IDXD_SCMD_PERCPU_ERR = 0x80090000,
  19. IDXD_SCMD_DMA_CHAN_ERR = 0x800a0000,
  20. IDXD_SCMD_CDEV_ERR = 0x800b0000,
  21. IDXD_SCMD_WQ_NO_SWQ_SUPPORT = 0x800c0000,
  22. IDXD_SCMD_WQ_NONE_CONFIGURED = 0x800d0000,
  23. IDXD_SCMD_WQ_NO_SIZE = 0x800e0000,
  24. IDXD_SCMD_WQ_NO_PRIV = 0x800f0000,
  25. IDXD_SCMD_WQ_IRQ_ERR = 0x80100000,
  26. IDXD_SCMD_WQ_USER_NO_IOMMU = 0x80110000,
  27. IDXD_SCMD_DEV_EVL_ERR = 0x80120000,
  28. IDXD_SCMD_WQ_NO_DRV_NAME = 0x80200000,
  29. };
  30. #define IDXD_SCMD_SOFTERR_MASK 0x80000000
  31. #define IDXD_SCMD_SOFTERR_SHIFT 16
  32. /* Descriptor flags */
  33. #define IDXD_OP_FLAG_FENCE 0x0001
  34. #define IDXD_OP_FLAG_BOF 0x0002
  35. #define IDXD_OP_FLAG_CRAV 0x0004
  36. #define IDXD_OP_FLAG_RCR 0x0008
  37. #define IDXD_OP_FLAG_RCI 0x0010
  38. #define IDXD_OP_FLAG_CRSTS 0x0020
  39. #define IDXD_OP_FLAG_CR 0x0080
  40. #define IDXD_OP_FLAG_CC 0x0100
  41. #define IDXD_OP_FLAG_ADDR1_TCS 0x0200
  42. #define IDXD_OP_FLAG_ADDR2_TCS 0x0400
  43. #define IDXD_OP_FLAG_ADDR3_TCS 0x0800
  44. #define IDXD_OP_FLAG_CR_TCS 0x1000
  45. #define IDXD_OP_FLAG_STORD 0x2000
  46. #define IDXD_OP_FLAG_DRDBK 0x4000
  47. #define IDXD_OP_FLAG_DSTS 0x8000
  48. /* IAX */
  49. #define IDXD_OP_FLAG_RD_SRC2_AECS 0x010000
  50. #define IDXD_OP_FLAG_RD_SRC2_2ND 0x020000
  51. #define IDXD_OP_FLAG_WR_SRC2_AECS_COMP 0x040000
  52. #define IDXD_OP_FLAG_WR_SRC2_AECS_OVFL 0x080000
  53. #define IDXD_OP_FLAG_SRC2_STS 0x100000
  54. #define IDXD_OP_FLAG_CRC_RFC3720 0x200000
  55. /* Opcode */
  56. enum dsa_opcode {
  57. DSA_OPCODE_NOOP = 0,
  58. DSA_OPCODE_BATCH,
  59. DSA_OPCODE_DRAIN,
  60. DSA_OPCODE_MEMMOVE,
  61. DSA_OPCODE_MEMFILL,
  62. DSA_OPCODE_COMPARE,
  63. DSA_OPCODE_COMPVAL,
  64. DSA_OPCODE_CR_DELTA,
  65. DSA_OPCODE_AP_DELTA,
  66. DSA_OPCODE_DUALCAST,
  67. DSA_OPCODE_TRANSL_FETCH,
  68. DSA_OPCODE_CRCGEN = 0x10,
  69. DSA_OPCODE_COPY_CRC,
  70. DSA_OPCODE_DIF_CHECK,
  71. DSA_OPCODE_DIF_INS,
  72. DSA_OPCODE_DIF_STRP,
  73. DSA_OPCODE_DIF_UPDT,
  74. DSA_OPCODE_DIX_GEN = 0x17,
  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. DSA_COMP_DRAIN_EVL = 0x26,
  128. DSA_COMP_BATCH_EVL_ERR,
  129. };
  130. enum iax_completion_status {
  131. IAX_COMP_NONE = 0,
  132. IAX_COMP_SUCCESS,
  133. IAX_COMP_PAGE_FAULT_IR = 0x04,
  134. IAX_COMP_ANALYTICS_ERROR = 0x0a,
  135. IAX_COMP_OUTBUF_OVERFLOW,
  136. IAX_COMP_BAD_OPCODE = 0x10,
  137. IAX_COMP_INVALID_FLAGS,
  138. IAX_COMP_NOZERO_RESERVE,
  139. IAX_COMP_INVALID_SIZE,
  140. IAX_COMP_OVERLAP_BUFFERS = 0x16,
  141. IAX_COMP_INT_HANDLE_INVAL = 0x19,
  142. IAX_COMP_CRA_XLAT,
  143. IAX_COMP_CRA_ALIGN,
  144. IAX_COMP_ADDR_ALIGN,
  145. IAX_COMP_PRIV_BAD,
  146. IAX_COMP_TRAFFIC_CLASS_CONF,
  147. IAX_COMP_PFAULT_RDBA,
  148. IAX_COMP_HW_ERR1,
  149. IAX_COMP_HW_ERR_DRB,
  150. IAX_COMP_TRANSLATION_FAIL,
  151. IAX_COMP_PRS_TIMEOUT,
  152. IAX_COMP_WATCHDOG,
  153. IAX_COMP_INVALID_COMP_FLAG = 0x30,
  154. IAX_COMP_INVALID_FILTER_FLAG,
  155. IAX_COMP_INVALID_INPUT_SIZE,
  156. IAX_COMP_INVALID_NUM_ELEMS,
  157. IAX_COMP_INVALID_SRC1_WIDTH,
  158. IAX_COMP_INVALID_INVERT_OUT,
  159. };
  160. #define DSA_COMP_STATUS_MASK 0x7f
  161. #define DSA_COMP_STATUS_WRITE 0x80
  162. #define DSA_COMP_STATUS(status) ((status) & DSA_COMP_STATUS_MASK)
  163. struct dsa_hw_desc {
  164. uint32_t pasid:20;
  165. uint32_t rsvd:11;
  166. uint32_t priv:1;
  167. uint32_t flags:24;
  168. uint32_t opcode:8;
  169. uint64_t completion_addr;
  170. union {
  171. uint64_t src_addr;
  172. uint64_t rdback_addr;
  173. uint64_t pattern;
  174. uint64_t desc_list_addr;
  175. uint64_t pattern_lower;
  176. uint64_t transl_fetch_addr;
  177. };
  178. union {
  179. uint64_t dst_addr;
  180. uint64_t rdback_addr2;
  181. uint64_t src2_addr;
  182. uint64_t comp_pattern;
  183. };
  184. union {
  185. uint32_t xfer_size;
  186. uint32_t desc_count;
  187. uint32_t region_size;
  188. };
  189. uint16_t int_handle;
  190. uint16_t rsvd1;
  191. union {
  192. uint8_t expected_res;
  193. /* create delta record */
  194. struct {
  195. uint64_t delta_addr;
  196. uint32_t max_delta_size;
  197. uint32_t delt_rsvd;
  198. uint8_t expected_res_mask;
  199. };
  200. uint32_t delta_rec_size;
  201. uint64_t dest2;
  202. /* CRC */
  203. struct {
  204. uint32_t crc_seed;
  205. uint32_t crc_rsvd;
  206. uint64_t seed_addr;
  207. };
  208. /* DIF check or strip */
  209. struct {
  210. uint8_t src_dif_flags;
  211. uint8_t dif_chk_res;
  212. uint8_t dif_chk_flags;
  213. uint8_t dif_chk_res2[5];
  214. uint32_t chk_ref_tag_seed;
  215. uint16_t chk_app_tag_mask;
  216. uint16_t chk_app_tag_seed;
  217. };
  218. /* DIF insert */
  219. struct {
  220. uint8_t dif_ins_res;
  221. uint8_t dest_dif_flag;
  222. uint8_t dif_ins_flags;
  223. uint8_t dif_ins_res2[13];
  224. uint32_t ins_ref_tag_seed;
  225. uint16_t ins_app_tag_mask;
  226. uint16_t ins_app_tag_seed;
  227. };
  228. /* DIF update */
  229. struct {
  230. uint8_t src_upd_flags;
  231. uint8_t upd_dest_flags;
  232. uint8_t dif_upd_flags;
  233. uint8_t dif_upd_res[5];
  234. uint32_t src_ref_tag_seed;
  235. uint16_t src_app_tag_mask;
  236. uint16_t src_app_tag_seed;
  237. uint32_t dest_ref_tag_seed;
  238. uint16_t dest_app_tag_mask;
  239. uint16_t dest_app_tag_seed;
  240. };
  241. /* Fill */
  242. uint64_t pattern_upper;
  243. /* Translation fetch */
  244. struct {
  245. uint64_t transl_fetch_res;
  246. uint32_t region_stride;
  247. };
  248. /* DIX generate */
  249. struct {
  250. uint8_t dix_gen_res;
  251. uint8_t dest_dif_flags;
  252. uint8_t dif_flags;
  253. uint8_t dix_gen_res2[13];
  254. uint32_t ref_tag_seed;
  255. uint16_t app_tag_mask;
  256. uint16_t app_tag_seed;
  257. };
  258. uint8_t op_specific[24];
  259. };
  260. } __attribute__((packed));
  261. struct iax_hw_desc {
  262. uint32_t pasid:20;
  263. uint32_t rsvd:11;
  264. uint32_t priv:1;
  265. uint32_t flags:24;
  266. uint32_t opcode:8;
  267. uint64_t completion_addr;
  268. uint64_t src1_addr;
  269. uint64_t dst_addr;
  270. uint32_t src1_size;
  271. uint16_t int_handle;
  272. union {
  273. uint16_t compr_flags;
  274. uint16_t decompr_flags;
  275. };
  276. uint64_t src2_addr;
  277. uint32_t max_dst_size;
  278. uint32_t src2_size;
  279. uint32_t filter_flags;
  280. uint32_t num_inputs;
  281. } __attribute__((packed));
  282. struct dsa_raw_desc {
  283. uint64_t field[8];
  284. } __attribute__((packed));
  285. /*
  286. * The status field will be modified by hardware, therefore it should be
  287. * __volatile__ and prevent the compiler from optimize the read.
  288. */
  289. struct dsa_completion_record {
  290. __volatile__ uint8_t status;
  291. union {
  292. uint8_t result;
  293. uint8_t dif_status;
  294. };
  295. uint8_t fault_info;
  296. uint8_t rsvd;
  297. union {
  298. uint32_t bytes_completed;
  299. uint32_t descs_completed;
  300. };
  301. uint64_t fault_addr;
  302. union {
  303. /* common record */
  304. struct {
  305. uint32_t invalid_flags:24;
  306. uint32_t rsvd2:8;
  307. };
  308. uint32_t delta_rec_size;
  309. uint64_t crc_val;
  310. /* DIF check & strip */
  311. struct {
  312. uint32_t dif_chk_ref_tag;
  313. uint16_t dif_chk_app_tag_mask;
  314. uint16_t dif_chk_app_tag;
  315. };
  316. /* DIF insert */
  317. struct {
  318. uint64_t dif_ins_res;
  319. uint32_t dif_ins_ref_tag;
  320. uint16_t dif_ins_app_tag_mask;
  321. uint16_t dif_ins_app_tag;
  322. };
  323. /* DIF update */
  324. struct {
  325. uint32_t dif_upd_src_ref_tag;
  326. uint16_t dif_upd_src_app_tag_mask;
  327. uint16_t dif_upd_src_app_tag;
  328. uint32_t dif_upd_dest_ref_tag;
  329. uint16_t dif_upd_dest_app_tag_mask;
  330. uint16_t dif_upd_dest_app_tag;
  331. };
  332. /* DIX generate */
  333. struct {
  334. uint64_t dix_gen_res;
  335. uint32_t dix_ref_tag;
  336. uint16_t dix_app_tag_mask;
  337. uint16_t dix_app_tag;
  338. };
  339. uint8_t op_specific[16];
  340. };
  341. } __attribute__((packed));
  342. struct dsa_raw_completion_record {
  343. uint64_t field[4];
  344. } __attribute__((packed));
  345. struct iax_completion_record {
  346. __volatile__ uint8_t status;
  347. uint8_t error_code;
  348. uint8_t fault_info;
  349. uint8_t rsvd;
  350. uint32_t bytes_completed;
  351. uint64_t fault_addr;
  352. uint32_t invalid_flags;
  353. uint32_t rsvd2;
  354. uint32_t output_size;
  355. uint8_t output_bits;
  356. uint8_t rsvd3;
  357. uint16_t xor_csum;
  358. uint32_t crc;
  359. uint32_t min;
  360. uint32_t max;
  361. uint32_t sum;
  362. uint64_t rsvd4[2];
  363. } __attribute__((packed));
  364. struct iax_raw_completion_record {
  365. uint64_t field[8];
  366. } __attribute__((packed));
  367. #endif