xref: /dpdk/drivers/compress/nitrox/nitrox_comp_reqmgr.c (revision e99981af34632ecce3bac82d05db97b08308f9b5)
1f008628aSNagadheeraj Rottela /* SPDX-License-Identifier: BSD-3-Clause
2f008628aSNagadheeraj Rottela  * Copyright(C) 2024 Marvell.
3f008628aSNagadheeraj Rottela  */
4f008628aSNagadheeraj Rottela 
5f008628aSNagadheeraj Rottela #include <rte_compressdev_pmd.h>
6f008628aSNagadheeraj Rottela #include <rte_errno.h>
7f008628aSNagadheeraj Rottela #include <rte_malloc.h>
86ea6bcddSNagadheeraj Rottela #include <rte_hexdump.h>
9f008628aSNagadheeraj Rottela 
10f008628aSNagadheeraj Rottela #include "nitrox_comp_reqmgr.h"
11f008628aSNagadheeraj Rottela #include "nitrox_logs.h"
12f008628aSNagadheeraj Rottela #include "rte_comp.h"
13f008628aSNagadheeraj Rottela 
146ea6bcddSNagadheeraj Rottela #define NITROX_INSTR_BUFFER_DEBUG 0
15f008628aSNagadheeraj Rottela #define NITROX_ZIP_SGL_COUNT 16
16f008628aSNagadheeraj Rottela #define NITROX_ZIP_MAX_ZPTRS 2048
17f008628aSNagadheeraj Rottela #define NITROX_ZIP_MAX_DATASIZE ((1 << 24) - 1)
18f008628aSNagadheeraj Rottela #define NITROX_ZIP_MAX_ONFSIZE 1024
19f008628aSNagadheeraj Rottela #define CMD_TIMEOUT 2
20f008628aSNagadheeraj Rottela 
21f008628aSNagadheeraj Rottela union nitrox_zip_instr_word0 {
22f008628aSNagadheeraj Rottela 	uint64_t u64;
23f008628aSNagadheeraj Rottela 	struct {
24f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
25f008628aSNagadheeraj Rottela 		uint64_t raz0   :  8;
26f008628aSNagadheeraj Rottela 		uint64_t tol    : 24;
27f008628aSNagadheeraj Rottela 		uint64_t raz1   :  5;
28f008628aSNagadheeraj Rottela 		uint64_t exn    :  3;
29f008628aSNagadheeraj Rottela 		uint64_t raz2   :  1;
30f008628aSNagadheeraj Rottela 		uint64_t exbits :  7;
31f008628aSNagadheeraj Rottela 		uint64_t raz3   :  3;
32f008628aSNagadheeraj Rottela 		uint64_t ca     :  1;
33f008628aSNagadheeraj Rottela 		uint64_t sf     :  1;
34f008628aSNagadheeraj Rottela 		uint64_t ss     :  2;
35f008628aSNagadheeraj Rottela 		uint64_t cc     :  2;
36f008628aSNagadheeraj Rottela 		uint64_t ef     :  1;
37f008628aSNagadheeraj Rottela 		uint64_t bf     :  1;
38f008628aSNagadheeraj Rottela 		uint64_t co     :  1;
39f008628aSNagadheeraj Rottela 		uint64_t raz4   :  1;
40f008628aSNagadheeraj Rottela 		uint64_t ds     :  1;
41f008628aSNagadheeraj Rottela 		uint64_t dg     :  1;
42f008628aSNagadheeraj Rottela 		uint64_t hg     :  1;
43f008628aSNagadheeraj Rottela #else
44f008628aSNagadheeraj Rottela 		uint64_t hg     :  1;
45f008628aSNagadheeraj Rottela 		uint64_t dg     :  1;
46f008628aSNagadheeraj Rottela 		uint64_t ds     :  1;
47f008628aSNagadheeraj Rottela 		uint64_t raz4   :  1;
48f008628aSNagadheeraj Rottela 		uint64_t co     :  1;
49f008628aSNagadheeraj Rottela 		uint64_t bf     :  1;
50f008628aSNagadheeraj Rottela 		uint64_t ef     :  1;
51f008628aSNagadheeraj Rottela 		uint64_t cc     :  2;
52f008628aSNagadheeraj Rottela 		uint64_t ss     :  2;
53f008628aSNagadheeraj Rottela 		uint64_t sf     :  1;
54f008628aSNagadheeraj Rottela 		uint64_t ca     :  1;
55f008628aSNagadheeraj Rottela 		uint64_t raz3   :  3;
56f008628aSNagadheeraj Rottela 		uint64_t exbits :  7;
57f008628aSNagadheeraj Rottela 		uint64_t raz2   :  1;
58f008628aSNagadheeraj Rottela 		uint64_t exn    :  3;
59f008628aSNagadheeraj Rottela 		uint64_t raz1   :  5;
60f008628aSNagadheeraj Rottela 		uint64_t tol    : 24;
61f008628aSNagadheeraj Rottela 		uint64_t raz0   :  8;
62f008628aSNagadheeraj Rottela #endif
63f008628aSNagadheeraj Rottela 
64f008628aSNagadheeraj Rottela 	};
65f008628aSNagadheeraj Rottela };
66f008628aSNagadheeraj Rottela 
67f008628aSNagadheeraj Rottela union nitrox_zip_instr_word1 {
68f008628aSNagadheeraj Rottela 	uint64_t u64;
69f008628aSNagadheeraj Rottela 	struct {
70f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
71f008628aSNagadheeraj Rottela 		uint64_t hl             : 16;
72f008628aSNagadheeraj Rottela 		uint64_t raz0		: 16;
73f008628aSNagadheeraj Rottela 		uint64_t adlercrc32	: 32;
74f008628aSNagadheeraj Rottela #else
75f008628aSNagadheeraj Rottela 		uint64_t adlercrc32     : 32;
76f008628aSNagadheeraj Rottela 		uint64_t raz0           : 16;
77f008628aSNagadheeraj Rottela 		uint64_t hl             : 16;
78f008628aSNagadheeraj Rottela #endif
79f008628aSNagadheeraj Rottela 	};
80f008628aSNagadheeraj Rottela };
81f008628aSNagadheeraj Rottela 
82f008628aSNagadheeraj Rottela union nitrox_zip_instr_word2 {
83f008628aSNagadheeraj Rottela 	uint64_t u64;
84f008628aSNagadheeraj Rottela 	struct {
85f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
86f008628aSNagadheeraj Rottela 		uint64_t raz0   : 20;
87f008628aSNagadheeraj Rottela 		uint64_t cptr   : 44;
88f008628aSNagadheeraj Rottela #else
89f008628aSNagadheeraj Rottela 		uint64_t cptr   : 44;
90f008628aSNagadheeraj Rottela 		uint64_t raz0   : 20;
91f008628aSNagadheeraj Rottela #endif
92f008628aSNagadheeraj Rottela 	};
93f008628aSNagadheeraj Rottela };
94f008628aSNagadheeraj Rottela 
95f008628aSNagadheeraj Rottela union nitrox_zip_instr_word3 {
96f008628aSNagadheeraj Rottela 	uint64_t u64;
97f008628aSNagadheeraj Rottela 	struct {
98f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
99f008628aSNagadheeraj Rottela 		uint64_t raz0   :  4;
100f008628aSNagadheeraj Rottela 		uint64_t hlen   : 16;
101f008628aSNagadheeraj Rottela 		uint64_t hptr   : 44;
102f008628aSNagadheeraj Rottela #else
103f008628aSNagadheeraj Rottela 		uint64_t hptr   : 44;
104f008628aSNagadheeraj Rottela 		uint64_t hlen   : 16;
105f008628aSNagadheeraj Rottela 		uint64_t raz0   :  4;
106f008628aSNagadheeraj Rottela #endif
107f008628aSNagadheeraj Rottela 	};
108f008628aSNagadheeraj Rottela };
109f008628aSNagadheeraj Rottela 
110f008628aSNagadheeraj Rottela union nitrox_zip_instr_word4 {
111f008628aSNagadheeraj Rottela 	uint64_t u64;
112f008628aSNagadheeraj Rottela 	struct {
113f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
114f008628aSNagadheeraj Rottela 		uint64_t raz0   :  4;
115f008628aSNagadheeraj Rottela 		uint64_t ilen   : 16;
116f008628aSNagadheeraj Rottela 		uint64_t iptr   : 44;
117f008628aSNagadheeraj Rottela #else
118f008628aSNagadheeraj Rottela 		uint64_t iptr   : 44;
119f008628aSNagadheeraj Rottela 		uint64_t ilen   : 16;
120f008628aSNagadheeraj Rottela 		uint64_t raz0   :  4;
121f008628aSNagadheeraj Rottela #endif
122f008628aSNagadheeraj Rottela 	};
123f008628aSNagadheeraj Rottela };
124f008628aSNagadheeraj Rottela 
125f008628aSNagadheeraj Rottela union nitrox_zip_instr_word5 {
126f008628aSNagadheeraj Rottela 	uint64_t u64;
127f008628aSNagadheeraj Rottela 	struct {
128f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
129f008628aSNagadheeraj Rottela 		uint64_t raz0 :  4;
130f008628aSNagadheeraj Rottela 		uint64_t olen : 16;
131f008628aSNagadheeraj Rottela 		uint64_t optr : 44;
132f008628aSNagadheeraj Rottela #else
133f008628aSNagadheeraj Rottela 		uint64_t optr : 44;
134f008628aSNagadheeraj Rottela 		uint64_t olen : 16;
135f008628aSNagadheeraj Rottela 		uint64_t raz0 :  4;
136f008628aSNagadheeraj Rottela #endif
137f008628aSNagadheeraj Rottela 	};
138f008628aSNagadheeraj Rottela };
139f008628aSNagadheeraj Rottela 
140f008628aSNagadheeraj Rottela union nitrox_zip_instr_word6 {
141f008628aSNagadheeraj Rottela 	uint64_t u64;
142f008628aSNagadheeraj Rottela 	struct {
143f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
144f008628aSNagadheeraj Rottela 		uint64_t raz0   : 20;
145f008628aSNagadheeraj Rottela 		uint64_t rptr   : 44;
146f008628aSNagadheeraj Rottela #else
147f008628aSNagadheeraj Rottela 		uint64_t rptr   : 44;
148f008628aSNagadheeraj Rottela 		uint64_t raz0   : 20;
149f008628aSNagadheeraj Rottela #endif
150f008628aSNagadheeraj Rottela 	};
151f008628aSNagadheeraj Rottela };
152f008628aSNagadheeraj Rottela 
153f008628aSNagadheeraj Rottela union nitrox_zip_instr_word7 {
154f008628aSNagadheeraj Rottela 	uint64_t u64;
155f008628aSNagadheeraj Rottela 	struct {
156f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
157f008628aSNagadheeraj Rottela 		uint64_t grp    :  3;
158f008628aSNagadheeraj Rottela 		uint64_t raz0   : 41;
159f008628aSNagadheeraj Rottela 		uint64_t addr_msb: 20;
160f008628aSNagadheeraj Rottela #else
161f008628aSNagadheeraj Rottela 		uint64_t addr_msb: 20;
162f008628aSNagadheeraj Rottela 		uint64_t raz0   : 41;
163f008628aSNagadheeraj Rottela 		uint64_t grp    :  3;
164f008628aSNagadheeraj Rottela #endif
165f008628aSNagadheeraj Rottela 	};
166f008628aSNagadheeraj Rottela };
167f008628aSNagadheeraj Rottela 
168f008628aSNagadheeraj Rottela struct nitrox_zip_instr {
169f008628aSNagadheeraj Rottela 	union nitrox_zip_instr_word0 w0;
170f008628aSNagadheeraj Rottela 	union nitrox_zip_instr_word1 w1;
171f008628aSNagadheeraj Rottela 	union nitrox_zip_instr_word2 w2;
172f008628aSNagadheeraj Rottela 	union nitrox_zip_instr_word3 w3;
173f008628aSNagadheeraj Rottela 	union nitrox_zip_instr_word4 w4;
174f008628aSNagadheeraj Rottela 	union nitrox_zip_instr_word5 w5;
175f008628aSNagadheeraj Rottela 	union nitrox_zip_instr_word6 w6;
176f008628aSNagadheeraj Rottela 	union nitrox_zip_instr_word7 w7;
177f008628aSNagadheeraj Rottela };
178f008628aSNagadheeraj Rottela 
179f008628aSNagadheeraj Rottela union nitrox_zip_result_word0 {
180f008628aSNagadheeraj Rottela 	uint64_t u64;
181f008628aSNagadheeraj Rottela 	struct {
182f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
183f008628aSNagadheeraj Rottela 		uint64_t crc32  : 32;
184f008628aSNagadheeraj Rottela 		uint64_t adler32: 32;
185f008628aSNagadheeraj Rottela #else
186f008628aSNagadheeraj Rottela 		uint64_t adler32: 32;
187f008628aSNagadheeraj Rottela 		uint64_t crc32  : 32;
188f008628aSNagadheeraj Rottela #endif
189f008628aSNagadheeraj Rottela 	};
190f008628aSNagadheeraj Rottela };
191f008628aSNagadheeraj Rottela 
192f008628aSNagadheeraj Rottela union nitrox_zip_result_word1 {
193f008628aSNagadheeraj Rottela 	uint64_t u64;
194f008628aSNagadheeraj Rottela 	struct {
195f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
196f008628aSNagadheeraj Rottela 		uint64_t tbyteswritten  : 32;
197f008628aSNagadheeraj Rottela 		uint64_t tbytesread     : 32;
198f008628aSNagadheeraj Rottela #else
199f008628aSNagadheeraj Rottela 		uint64_t tbytesread     : 32;
200f008628aSNagadheeraj Rottela 		uint64_t tbyteswritten  : 32;
201f008628aSNagadheeraj Rottela #endif
202f008628aSNagadheeraj Rottela 	};
203f008628aSNagadheeraj Rottela };
204f008628aSNagadheeraj Rottela 
205f008628aSNagadheeraj Rottela union nitrox_zip_result_word2 {
206f008628aSNagadheeraj Rottela 	uint64_t u64;
207f008628aSNagadheeraj Rottela 	struct {
208f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
209f008628aSNagadheeraj Rottela 		uint64_t tbits  : 32;
210f008628aSNagadheeraj Rottela 		uint64_t raz0   :  5;
211f008628aSNagadheeraj Rottela 		uint64_t exn    :  3;
212f008628aSNagadheeraj Rottela 		uint64_t raz1   :  1;
213f008628aSNagadheeraj Rottela 		uint64_t exbits :  7;
214f008628aSNagadheeraj Rottela 		uint64_t raz2   :  7;
215f008628aSNagadheeraj Rottela 		uint64_t ef     :  1;
216f008628aSNagadheeraj Rottela 		uint64_t compcode:  8;
217f008628aSNagadheeraj Rottela #else
218f008628aSNagadheeraj Rottela 		uint64_t compcode:  8;
219f008628aSNagadheeraj Rottela 		uint64_t ef     :  1;
220f008628aSNagadheeraj Rottela 		uint64_t raz2   :  7;
221f008628aSNagadheeraj Rottela 		uint64_t exbits :  7;
222f008628aSNagadheeraj Rottela 		uint64_t raz1   :  1;
223f008628aSNagadheeraj Rottela 		uint64_t exn    :  3;
224f008628aSNagadheeraj Rottela 		uint64_t raz0   :  5;
225f008628aSNagadheeraj Rottela 		uint64_t tbits  : 32;
226f008628aSNagadheeraj Rottela #endif
227f008628aSNagadheeraj Rottela 	};
228f008628aSNagadheeraj Rottela };
229f008628aSNagadheeraj Rottela 
230f008628aSNagadheeraj Rottela struct nitrox_zip_result {
231f008628aSNagadheeraj Rottela 	union nitrox_zip_result_word0 w0;
232f008628aSNagadheeraj Rottela 	union nitrox_zip_result_word1 w1;
233f008628aSNagadheeraj Rottela 	union nitrox_zip_result_word2 w2;
234f008628aSNagadheeraj Rottela };
235f008628aSNagadheeraj Rottela 
236f008628aSNagadheeraj Rottela union nitrox_zip_zptr {
237f008628aSNagadheeraj Rottela 	uint64_t u64;
238f008628aSNagadheeraj Rottela 	struct {
239f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
240f008628aSNagadheeraj Rottela 		uint64_t raz0   :  3;
241f008628aSNagadheeraj Rottela 		uint64_t le     :  1;
242f008628aSNagadheeraj Rottela 		uint64_t length : 16;
243f008628aSNagadheeraj Rottela 		uint64_t addr   : 44;
244f008628aSNagadheeraj Rottela #else
245f008628aSNagadheeraj Rottela 		uint64_t addr   : 44;
246f008628aSNagadheeraj Rottela 		uint64_t length : 16;
247f008628aSNagadheeraj Rottela 		uint64_t le     :  1;
248f008628aSNagadheeraj Rottela 		uint64_t raz0   :  3;
249f008628aSNagadheeraj Rottela #endif
250f008628aSNagadheeraj Rottela 	} s;
251f008628aSNagadheeraj Rottela };
252f008628aSNagadheeraj Rottela 
253f008628aSNagadheeraj Rottela struct nitrox_zip_iova_addr {
254f008628aSNagadheeraj Rottela 	union {
255f008628aSNagadheeraj Rottela 		uint64_t u64;
256f008628aSNagadheeraj Rottela 		struct {
257f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
258f008628aSNagadheeraj Rottela 			uint64_t addr_msb: 20;
259f008628aSNagadheeraj Rottela 			uint64_t addr	: 44;
260f008628aSNagadheeraj Rottela #else
261f008628aSNagadheeraj Rottela 			uint64_t addr	: 44;
262f008628aSNagadheeraj Rottela 			uint64_t addr_msb: 20;
263f008628aSNagadheeraj Rottela #endif
264f008628aSNagadheeraj Rottela 		} zda;
265f008628aSNagadheeraj Rottela 
266f008628aSNagadheeraj Rottela 		struct {
267f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
268f008628aSNagadheeraj Rottela 			uint64_t addr_msb: 20;
269f008628aSNagadheeraj Rottela 			uint64_t addr	: 41;
270f008628aSNagadheeraj Rottela 			uint64_t align_8bytes: 3;
271f008628aSNagadheeraj Rottela #else
272f008628aSNagadheeraj Rottela 			uint64_t align_8bytes: 3;
273f008628aSNagadheeraj Rottela 			uint64_t addr	: 41;
274f008628aSNagadheeraj Rottela 			uint64_t addr_msb: 20;
275f008628aSNagadheeraj Rottela #endif
276f008628aSNagadheeraj Rottela 		} z8a;
277f008628aSNagadheeraj Rottela 	};
278f008628aSNagadheeraj Rottela };
279f008628aSNagadheeraj Rottela 
280f008628aSNagadheeraj Rottela enum nitrox_zip_comp_code {
281f008628aSNagadheeraj Rottela 	NITROX_CC_NOTDONE     = 0,
282f008628aSNagadheeraj Rottela 	NITROX_CC_SUCCESS     = 1,
283f008628aSNagadheeraj Rottela 	NITROX_CC_DTRUNC      = 2,
284f008628aSNagadheeraj Rottela 	NITROX_CC_STOP        = 3,
285f008628aSNagadheeraj Rottela 	NITROX_CC_ITRUNK      = 4,
286f008628aSNagadheeraj Rottela 	NITROX_CC_RBLOCK      = 5,
287f008628aSNagadheeraj Rottela 	NITROX_CC_NLEN        = 6,
288f008628aSNagadheeraj Rottela 	NITROX_CC_BADCODE     = 7,
289f008628aSNagadheeraj Rottela 	NITROX_CC_BADCODE2    = 8,
290f008628aSNagadheeraj Rottela 	NITROX_CC_ZERO_LEN    = 9,
291f008628aSNagadheeraj Rottela 	NITROX_CC_PARITY      = 10,
292f008628aSNagadheeraj Rottela 	NITROX_CC_FATAL       = 11,
293f008628aSNagadheeraj Rottela 	NITROX_CC_TIMEOUT     = 12,
294f008628aSNagadheeraj Rottela 	NITROX_CC_NPCI_ERR    = 13,
295f008628aSNagadheeraj Rottela };
296f008628aSNagadheeraj Rottela 
297f008628aSNagadheeraj Rottela struct nitrox_sgtable {
298f008628aSNagadheeraj Rottela 	union nitrox_zip_zptr *sgl;
299f008628aSNagadheeraj Rottela 	uint64_t addr_msb;
300f008628aSNagadheeraj Rottela 	uint32_t total_bytes;
301f008628aSNagadheeraj Rottela 	uint16_t nb_sgls;
302f008628aSNagadheeraj Rottela 	uint16_t filled_sgls;
303f008628aSNagadheeraj Rottela };
304f008628aSNagadheeraj Rottela 
305f008628aSNagadheeraj Rottela struct nitrox_softreq {
306f008628aSNagadheeraj Rottela 	struct nitrox_zip_instr instr;
30727595cd8STyler Retzlaff 	alignas(8) struct nitrox_zip_result zip_res;
308f008628aSNagadheeraj Rottela 	uint8_t decomp_threshold[NITROX_ZIP_MAX_ONFSIZE];
309f008628aSNagadheeraj Rottela 	struct rte_comp_op *op;
310f008628aSNagadheeraj Rottela 	struct nitrox_sgtable src;
311f008628aSNagadheeraj Rottela 	struct nitrox_sgtable dst;
312f008628aSNagadheeraj Rottela 	uint64_t timeout;
313f008628aSNagadheeraj Rottela };
314f008628aSNagadheeraj Rottela 
3156ea6bcddSNagadheeraj Rottela #if NITROX_INSTR_BUFFER_DEBUG
3166ea6bcddSNagadheeraj Rottela static void nitrox_dump_databuf(const char *name, struct rte_mbuf *m,
3176ea6bcddSNagadheeraj Rottela 				uint32_t off, uint32_t datalen)
3186ea6bcddSNagadheeraj Rottela {
3196ea6bcddSNagadheeraj Rottela 	uint32_t mlen;
3206ea6bcddSNagadheeraj Rottela 
3216ea6bcddSNagadheeraj Rottela 	if (!rte_log_can_log(nitrox_logtype, RTE_LOG_DEBUG))
3226ea6bcddSNagadheeraj Rottela 		return;
3236ea6bcddSNagadheeraj Rottela 
3246ea6bcddSNagadheeraj Rottela 	for (; m && off > rte_pktmbuf_data_len(m); m = m->next)
3256ea6bcddSNagadheeraj Rottela 		off -= rte_pktmbuf_data_len(m);
3266ea6bcddSNagadheeraj Rottela 
3276ea6bcddSNagadheeraj Rottela 	mlen = rte_pktmbuf_data_len(m) - off;
3286ea6bcddSNagadheeraj Rottela 	if (datalen <= mlen)
3296ea6bcddSNagadheeraj Rottela 		mlen = datalen;
3306ea6bcddSNagadheeraj Rottela 
3316ea6bcddSNagadheeraj Rottela 	rte_hexdump(rte_log_get_stream(), name,
3326ea6bcddSNagadheeraj Rottela 		    rte_pktmbuf_mtod_offset(m, char *, off), mlen);
3336ea6bcddSNagadheeraj Rottela 	for (m = m->next; m && datalen; m = m->next) {
3346ea6bcddSNagadheeraj Rottela 		mlen = rte_pktmbuf_data_len(m) < datalen ?
3356ea6bcddSNagadheeraj Rottela 			rte_pktmbuf_data_len(m) : datalen;
3366ea6bcddSNagadheeraj Rottela 		rte_hexdump(rte_log_get_stream(), name,
3376ea6bcddSNagadheeraj Rottela 			    rte_pktmbuf_mtod(m, char *), mlen);
3386ea6bcddSNagadheeraj Rottela 	}
3396ea6bcddSNagadheeraj Rottela 
340*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
3416ea6bcddSNagadheeraj Rottela }
3426ea6bcddSNagadheeraj Rottela 
3436ea6bcddSNagadheeraj Rottela static void nitrox_dump_zip_instr(struct nitrox_zip_instr *instr,
3446ea6bcddSNagadheeraj Rottela 				  union nitrox_zip_zptr *hptr_arr,
3456ea6bcddSNagadheeraj Rottela 				  union nitrox_zip_zptr *iptr_arr,
3466ea6bcddSNagadheeraj Rottela 				  union nitrox_zip_zptr *optr_arr)
3476ea6bcddSNagadheeraj Rottela {
3486ea6bcddSNagadheeraj Rottela 	uint64_t value;
3496ea6bcddSNagadheeraj Rottela 	int i = 0;
3506ea6bcddSNagadheeraj Rottela 
351*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\nZIP instruction..(%p)", instr);
352*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD0 = 0x%016"PRIx64, instr->w0.u64);
353*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tTOL        = %d", instr->w0.tol);
354*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tEXNUM      = %d", instr->w0.exn);
355*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tEXBITS     = %x", instr->w0.exbits);
356*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tCA         = %d", instr->w0.ca);
357*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tSF         = %d", instr->w0.sf);
358*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tSS         = %d", instr->w0.ss);
359*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tCC         = %d", instr->w0.cc);
360*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tEF         = %d", instr->w0.ef);
361*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tBF         = %d", instr->w0.bf);
362*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tCO         = %d", instr->w0.co);
363*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tDS         = %d", instr->w0.ds);
364*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tDG         = %d", instr->w0.dg);
365*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tHG         = %d", instr->w0.hg);
366*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
3676ea6bcddSNagadheeraj Rottela 
368*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD1 = 0x%016"PRIx64, instr->w1.u64);
369*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tHL         = %d", instr->w1.hl);
370*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tADLERCRC32 = 0x%08x", instr->w1.adlercrc32);
371*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
3726ea6bcddSNagadheeraj Rottela 
3736ea6bcddSNagadheeraj Rottela 	value = instr->w2.cptr;
374*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD2 = 0x%016"PRIx64, instr->w2.u64);
375*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tCPTR = 0x%11"PRIx64, value);
376*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
3776ea6bcddSNagadheeraj Rottela 
3786ea6bcddSNagadheeraj Rottela 	value = instr->w3.hptr;
379*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD3 = 0x%016"PRIx64, instr->w3.u64);
380*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tHLEN       = %d", instr->w3.hlen);
381*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tHPTR = 0x%11"PRIx64, value);
3826ea6bcddSNagadheeraj Rottela 
3836ea6bcddSNagadheeraj Rottela 	if (instr->w0.hg && hptr_arr) {
3846ea6bcddSNagadheeraj Rottela 		for (i = 0; i < instr->w3.hlen; i++) {
3856ea6bcddSNagadheeraj Rottela 			value = hptr_arr[i].s.addr;
386*e99981afSDavid Marchand 			NITROX_LOG_LINE(DEBUG, "\t\t\tZPTR[%d] : Length = %d Addr = 0x%11"PRIx64,
3876ea6bcddSNagadheeraj Rottela 				     i, hptr_arr[i].s.length, value);
3886ea6bcddSNagadheeraj Rottela 		}
3896ea6bcddSNagadheeraj Rottela 	}
3906ea6bcddSNagadheeraj Rottela 
391*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
3926ea6bcddSNagadheeraj Rottela 
3936ea6bcddSNagadheeraj Rottela 	value = instr->w4.iptr;
394*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD4 = 0x%016"PRIx64, instr->w4.u64);
395*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tILEN       = %d", instr->w4.ilen);
396*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tIPTR       = 0x%11"PRIx64, value);
3976ea6bcddSNagadheeraj Rottela 	if (instr->w0.dg && iptr_arr) {
3986ea6bcddSNagadheeraj Rottela 		for (i = 0; i < instr->w4.ilen; i++) {
3996ea6bcddSNagadheeraj Rottela 			value = iptr_arr[i].s.addr;
400*e99981afSDavid Marchand 			NITROX_LOG_LINE(DEBUG, "\t\t\tZPTR[%d] : Length = %d Addr = 0x%11"PRIx64,
4016ea6bcddSNagadheeraj Rottela 				     i, iptr_arr[i].s.length, value);
4026ea6bcddSNagadheeraj Rottela 		}
4036ea6bcddSNagadheeraj Rottela 	}
4046ea6bcddSNagadheeraj Rottela 
405*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
4066ea6bcddSNagadheeraj Rottela 
4076ea6bcddSNagadheeraj Rottela 	value = instr->w5.optr;
408*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD5 = 0x%016"PRIx64, instr->w5.u64);
409*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\t OLEN = %d", instr->w5.olen);
410*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\t OPTR = 0x%11"PRIx64, value);
4116ea6bcddSNagadheeraj Rottela 	if (instr->w0.ds && optr_arr) {
4126ea6bcddSNagadheeraj Rottela 		for (i = 0; i < instr->w5.olen; i++) {
4136ea6bcddSNagadheeraj Rottela 			value = optr_arr[i].s.addr;
414*e99981afSDavid Marchand 			NITROX_LOG_LINE(DEBUG, "\t\t\tZPTR[%d] : Length = %d Addr = 0x%11"PRIx64,
4156ea6bcddSNagadheeraj Rottela 				     i, optr_arr[i].s.length, value);
4166ea6bcddSNagadheeraj Rottela 		}
4176ea6bcddSNagadheeraj Rottela 	}
4186ea6bcddSNagadheeraj Rottela 
419*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
4206ea6bcddSNagadheeraj Rottela 
4216ea6bcddSNagadheeraj Rottela 	value = instr->w6.rptr;
422*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD6 = 0x%016"PRIx64, instr->w6.u64);
423*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tRPTR = 0x%11"PRIx64, value);
424*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
4256ea6bcddSNagadheeraj Rottela 
426*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD7 = 0x%016"PRIx64, instr->w7.u64);
427*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tGRP        = %x", instr->w7.grp);
428*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tADDR_MSB   = 0x%5x", instr->w7.addr_msb);
429*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
4306ea6bcddSNagadheeraj Rottela }
4316ea6bcddSNagadheeraj Rottela 
4326ea6bcddSNagadheeraj Rottela static void nitrox_dump_zip_result(struct nitrox_zip_instr *instr,
4336ea6bcddSNagadheeraj Rottela 				   struct nitrox_zip_result *result)
4346ea6bcddSNagadheeraj Rottela {
435*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "ZIP result..(instr %p)", instr);
436*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD0 = 0x%016"PRIx64, result->w0.u64);
437*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tCRC32          = 0x%8x", result->w0.crc32);
438*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tADLER32        = 0x%8x", result->w0.adler32);
439*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
4406ea6bcddSNagadheeraj Rottela 
441*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD1 = 0x%016"PRIx64, result->w1.u64);
442*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tTBYTESWRITTEN  = %u", result->w1.tbyteswritten);
443*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tTBYTESREAD     = %u", result->w1.tbytesread);
444*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
4456ea6bcddSNagadheeraj Rottela 
446*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\tWORD2 = 0x%016"PRIx64, result->w2.u64);
447*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tTBITS          = %u", result->w2.tbits);
448*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tEXN            = %d", result->w2.exn);
449*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tEBITS          = %x", result->w2.exbits);
450*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tEF             = %d", result->w2.ef);
451*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG, "\t\tCOMPCODE       = 0x%2x", result->w2.compcode);
452*e99981afSDavid Marchand 	NITROX_LOG_LINE(DEBUG,);
4536ea6bcddSNagadheeraj Rottela }
4546ea6bcddSNagadheeraj Rottela #else
4556ea6bcddSNagadheeraj Rottela #define nitrox_dump_databuf(name, m, off, datalen)
4566ea6bcddSNagadheeraj Rottela #define nitrox_dump_zip_instr(instr, hptr_arr, iptr_arr, optr_arr)
4576ea6bcddSNagadheeraj Rottela #define nitrox_dump_zip_result(instr, result)
4586ea6bcddSNagadheeraj Rottela #endif
4596ea6bcddSNagadheeraj Rottela 
4606ea6bcddSNagadheeraj Rottela static int handle_zero_length_compression(struct nitrox_softreq *sr,
4616ea6bcddSNagadheeraj Rottela 					  struct nitrox_comp_xform *xform)
4626ea6bcddSNagadheeraj Rottela {
4636ea6bcddSNagadheeraj Rottela 	union {
4646ea6bcddSNagadheeraj Rottela 		uint32_t num;
4656ea6bcddSNagadheeraj Rottela 		uint8_t bytes[4];
4666ea6bcddSNagadheeraj Rottela 	} fblk;
4676ea6bcddSNagadheeraj Rottela 	uint32_t dstlen, rlen;
4686ea6bcddSNagadheeraj Rottela 	struct rte_mbuf *m;
4696ea6bcddSNagadheeraj Rottela 	uint32_t off;
4706ea6bcddSNagadheeraj Rottela 	uint32_t mlen;
4716ea6bcddSNagadheeraj Rottela 	uint32_t i = 0;
4726ea6bcddSNagadheeraj Rottela 	uint8_t *ptr;
4736ea6bcddSNagadheeraj Rottela 
4746ea6bcddSNagadheeraj Rottela 	fblk.num = xform->exn ? (xform->exbits & 0x7F) : 0;
4756ea6bcddSNagadheeraj Rottela 	fblk.num |= (0x3 << xform->exn);
4766ea6bcddSNagadheeraj Rottela 	memset(&sr->zip_res, 0, sizeof(sr->zip_res));
4776ea6bcddSNagadheeraj Rottela 	sr->zip_res.w1.tbytesread = xform->hlen;
4786ea6bcddSNagadheeraj Rottela 	sr->zip_res.w1.tbyteswritten = 2;
4796ea6bcddSNagadheeraj Rottela 	sr->zip_res.w2.ef = 1;
4806ea6bcddSNagadheeraj Rottela 	if (xform->exn == 7)
4816ea6bcddSNagadheeraj Rottela 		sr->zip_res.w1.tbyteswritten++;
4826ea6bcddSNagadheeraj Rottela 
4836ea6bcddSNagadheeraj Rottela 	rlen = sr->zip_res.w1.tbyteswritten;
4846ea6bcddSNagadheeraj Rottela 	dstlen = rte_pktmbuf_pkt_len(sr->op->m_dst) - sr->op->dst.offset;
4856ea6bcddSNagadheeraj Rottela 	if (unlikely(dstlen < rlen))
4866ea6bcddSNagadheeraj Rottela 		return -EIO;
4876ea6bcddSNagadheeraj Rottela 
4886ea6bcddSNagadheeraj Rottela 	off = sr->op->dst.offset;
4896ea6bcddSNagadheeraj Rottela 	for (m = sr->op->m_dst; m && off > rte_pktmbuf_data_len(m); m = m->next)
4906ea6bcddSNagadheeraj Rottela 		off -= rte_pktmbuf_data_len(m);
4916ea6bcddSNagadheeraj Rottela 
4926ea6bcddSNagadheeraj Rottela 	if (unlikely(!m))
4936ea6bcddSNagadheeraj Rottela 		return -EIO;
4946ea6bcddSNagadheeraj Rottela 
4956ea6bcddSNagadheeraj Rottela 	mlen = rte_pktmbuf_data_len(m) - off;
4966ea6bcddSNagadheeraj Rottela 	if (rlen <= mlen)
4976ea6bcddSNagadheeraj Rottela 		mlen = rlen;
4986ea6bcddSNagadheeraj Rottela 
4996ea6bcddSNagadheeraj Rottela 	ptr = rte_pktmbuf_mtod_offset(m, uint8_t *, off);
5006ea6bcddSNagadheeraj Rottela 	memcpy(ptr, fblk.bytes, mlen);
5016ea6bcddSNagadheeraj Rottela 	i += mlen;
5026ea6bcddSNagadheeraj Rottela 	rlen -= mlen;
5036ea6bcddSNagadheeraj Rottela 	for (m = m->next; m && rlen; m = m->next) {
5046ea6bcddSNagadheeraj Rottela 		mlen = rte_pktmbuf_data_len(m) < rlen ?
5056ea6bcddSNagadheeraj Rottela 			rte_pktmbuf_data_len(m) : rlen;
5066ea6bcddSNagadheeraj Rottela 		ptr = rte_pktmbuf_mtod(m, uint8_t *);
5076ea6bcddSNagadheeraj Rottela 		memcpy(ptr, &fblk.bytes[i], mlen);
5086ea6bcddSNagadheeraj Rottela 		i += mlen;
5096ea6bcddSNagadheeraj Rottela 		rlen -= mlen;
5106ea6bcddSNagadheeraj Rottela 	}
5116ea6bcddSNagadheeraj Rottela 
5126ea6bcddSNagadheeraj Rottela 	if (unlikely(rlen != 0))
5136ea6bcddSNagadheeraj Rottela 		return -EIO;
5146ea6bcddSNagadheeraj Rottela 
5156ea6bcddSNagadheeraj Rottela 	sr->zip_res.w2.compcode = NITROX_CC_SUCCESS;
5166ea6bcddSNagadheeraj Rottela 	sr->op->status = RTE_COMP_OP_STATUS_SUCCESS;
5176ea6bcddSNagadheeraj Rottela 	sr->zip_res.w0.u64 = rte_cpu_to_be_64(sr->zip_res.w0.u64);
5186ea6bcddSNagadheeraj Rottela 	sr->zip_res.w1.u64 = rte_cpu_to_be_64(sr->zip_res.w1.u64);
5196ea6bcddSNagadheeraj Rottela 	sr->zip_res.w2.u64 = rte_cpu_to_be_64(sr->zip_res.w2.u64);
5206ea6bcddSNagadheeraj Rottela 	return 0;
5216ea6bcddSNagadheeraj Rottela }
5226ea6bcddSNagadheeraj Rottela 
523f008628aSNagadheeraj Rottela static int create_sglist_from_mbuf(struct nitrox_sgtable *sgtbl,
524f008628aSNagadheeraj Rottela 				   struct rte_mbuf *mbuf, uint32_t off,
525f008628aSNagadheeraj Rottela 				   uint32_t datalen, uint8_t extra_segs,
526f008628aSNagadheeraj Rottela 				   int socket_id)
527f008628aSNagadheeraj Rottela {
528f008628aSNagadheeraj Rottela 	struct rte_mbuf *m;
529f008628aSNagadheeraj Rottela 	union nitrox_zip_zptr *sgl;
530f008628aSNagadheeraj Rottela 	struct nitrox_zip_iova_addr zip_addr;
531f008628aSNagadheeraj Rottela 	uint16_t nb_segs;
532f008628aSNagadheeraj Rottela 	uint16_t i;
533f008628aSNagadheeraj Rottela 	uint32_t mlen;
534f008628aSNagadheeraj Rottela 
535f008628aSNagadheeraj Rottela 	if (unlikely(datalen > NITROX_ZIP_MAX_DATASIZE)) {
536*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Unsupported datalen %d, max supported %d",
537f008628aSNagadheeraj Rottela 			   datalen, NITROX_ZIP_MAX_DATASIZE);
538f008628aSNagadheeraj Rottela 		return -ENOTSUP;
539f008628aSNagadheeraj Rottela 	}
540f008628aSNagadheeraj Rottela 
541f008628aSNagadheeraj Rottela 	nb_segs = mbuf->nb_segs + extra_segs;
542f008628aSNagadheeraj Rottela 	for (m = mbuf; m && off > rte_pktmbuf_data_len(m); m = m->next) {
543f008628aSNagadheeraj Rottela 		off -= rte_pktmbuf_data_len(m);
544f008628aSNagadheeraj Rottela 		nb_segs--;
545f008628aSNagadheeraj Rottela 	}
546f008628aSNagadheeraj Rottela 
547f008628aSNagadheeraj Rottela 	if (unlikely(nb_segs > NITROX_ZIP_MAX_ZPTRS)) {
548*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Mbuf has more segments %d than supported",
549f008628aSNagadheeraj Rottela 			   nb_segs);
550f008628aSNagadheeraj Rottela 		return -ENOTSUP;
551f008628aSNagadheeraj Rottela 	}
552f008628aSNagadheeraj Rottela 
553f008628aSNagadheeraj Rottela 	if (unlikely(nb_segs > sgtbl->nb_sgls)) {
554f008628aSNagadheeraj Rottela 		union nitrox_zip_zptr *sgl;
555f008628aSNagadheeraj Rottela 
556*e99981afSDavid Marchand 		NITROX_LOG_LINE(INFO, "Mbuf has more segs %d than allocated %d",
557f008628aSNagadheeraj Rottela 			   nb_segs, sgtbl->nb_sgls);
558f008628aSNagadheeraj Rottela 		sgl = rte_realloc_socket(sgtbl->sgl,
559f008628aSNagadheeraj Rottela 					 sizeof(*sgtbl->sgl) * nb_segs,
560f008628aSNagadheeraj Rottela 					 8, socket_id);
561f008628aSNagadheeraj Rottela 		if (unlikely(!sgl)) {
562*e99981afSDavid Marchand 			NITROX_LOG_LINE(ERR, "Failed to expand sglist memory");
563f008628aSNagadheeraj Rottela 			return -ENOMEM;
564f008628aSNagadheeraj Rottela 		}
565f008628aSNagadheeraj Rottela 
566f008628aSNagadheeraj Rottela 		sgtbl->sgl = sgl;
567f008628aSNagadheeraj Rottela 		sgtbl->nb_sgls = nb_segs;
568f008628aSNagadheeraj Rottela 	}
569f008628aSNagadheeraj Rottela 
570f008628aSNagadheeraj Rottela 	sgtbl->filled_sgls = 0;
571f008628aSNagadheeraj Rottela 	sgtbl->total_bytes = 0;
572f008628aSNagadheeraj Rottela 	sgl = sgtbl->sgl;
573f008628aSNagadheeraj Rottela 	if (!m)
574f008628aSNagadheeraj Rottela 		return 0;
575f008628aSNagadheeraj Rottela 
576f008628aSNagadheeraj Rottela 	mlen = rte_pktmbuf_data_len(m) - off;
577f008628aSNagadheeraj Rottela 	if (datalen <= mlen)
578f008628aSNagadheeraj Rottela 		mlen = datalen;
579f008628aSNagadheeraj Rottela 
580f008628aSNagadheeraj Rottela 	i = 0;
581f008628aSNagadheeraj Rottela 	zip_addr.u64 = rte_pktmbuf_iova_offset(m, off);
582f008628aSNagadheeraj Rottela 	sgl[i].s.addr = zip_addr.zda.addr;
583f008628aSNagadheeraj Rottela 	sgl[i].s.length = mlen;
584f008628aSNagadheeraj Rottela 	sgl[i].s.le = 0;
585f008628aSNagadheeraj Rottela 	sgtbl->total_bytes += mlen;
586f008628aSNagadheeraj Rottela 	sgtbl->addr_msb = zip_addr.zda.addr_msb;
587f008628aSNagadheeraj Rottela 	datalen -= mlen;
588f008628aSNagadheeraj Rottela 	i++;
589f008628aSNagadheeraj Rottela 	for (m = m->next; m && datalen; m = m->next) {
590f008628aSNagadheeraj Rottela 		mlen = rte_pktmbuf_data_len(m) < datalen ?
591f008628aSNagadheeraj Rottela 			rte_pktmbuf_data_len(m) : datalen;
592f008628aSNagadheeraj Rottela 		zip_addr.u64 = rte_pktmbuf_iova(m);
593f008628aSNagadheeraj Rottela 		if (unlikely(zip_addr.zda.addr_msb != sgtbl->addr_msb)) {
594*e99981afSDavid Marchand 			NITROX_LOG_LINE(ERR, "zip_ptrs have different msb addr");
595f008628aSNagadheeraj Rottela 			return -ENOTSUP;
596f008628aSNagadheeraj Rottela 		}
597f008628aSNagadheeraj Rottela 
598f008628aSNagadheeraj Rottela 		sgl[i].s.addr = zip_addr.zda.addr;
599f008628aSNagadheeraj Rottela 		sgl[i].s.length = mlen;
600f008628aSNagadheeraj Rottela 		sgl[i].s.le = 0;
601f008628aSNagadheeraj Rottela 		sgtbl->total_bytes += mlen;
602f008628aSNagadheeraj Rottela 		datalen -= mlen;
603f008628aSNagadheeraj Rottela 		i++;
604f008628aSNagadheeraj Rottela 	}
605f008628aSNagadheeraj Rottela 
606f008628aSNagadheeraj Rottela 	sgtbl->filled_sgls = i;
607f008628aSNagadheeraj Rottela 	return 0;
608f008628aSNagadheeraj Rottela }
609f008628aSNagadheeraj Rottela 
6106ea6bcddSNagadheeraj Rottela static int softreq_init(struct nitrox_softreq *sr,
6116ea6bcddSNagadheeraj Rottela 			struct nitrox_comp_xform *xform)
612f008628aSNagadheeraj Rottela {
613f008628aSNagadheeraj Rottela 	struct rte_mempool *mp;
614f008628aSNagadheeraj Rottela 	int err;
6156ea6bcddSNagadheeraj Rottela 	bool need_decomp_threshold;
616f008628aSNagadheeraj Rottela 
617f008628aSNagadheeraj Rottela 	mp = rte_mempool_from_obj(sr);
618f008628aSNagadheeraj Rottela 	if (unlikely(mp == NULL))
619f008628aSNagadheeraj Rottela 		return -EINVAL;
620f008628aSNagadheeraj Rottela 
621f008628aSNagadheeraj Rottela 	err = create_sglist_from_mbuf(&sr->src, sr->op->m_src,
622f008628aSNagadheeraj Rottela 				      sr->op->src.offset,
623f008628aSNagadheeraj Rottela 				      sr->op->src.length, 0, mp->socket_id);
624f008628aSNagadheeraj Rottela 	if (unlikely(err))
625f008628aSNagadheeraj Rottela 		return err;
626f008628aSNagadheeraj Rottela 
6276ea6bcddSNagadheeraj Rottela 	need_decomp_threshold = (sr->op->op_type == RTE_COMP_OP_STATELESS &&
6286ea6bcddSNagadheeraj Rottela 				 xform->op == NITROX_COMP_OP_DECOMPRESS);
629f008628aSNagadheeraj Rottela 	err = create_sglist_from_mbuf(&sr->dst, sr->op->m_dst,
630f008628aSNagadheeraj Rottela 			sr->op->dst.offset,
631f008628aSNagadheeraj Rottela 			rte_pktmbuf_pkt_len(sr->op->m_dst) - sr->op->dst.offset,
6326ea6bcddSNagadheeraj Rottela 			need_decomp_threshold ? 1 : 0,
633f008628aSNagadheeraj Rottela 			mp->socket_id);
634f008628aSNagadheeraj Rottela 	if (unlikely(err))
635f008628aSNagadheeraj Rottela 		return err;
636f008628aSNagadheeraj Rottela 
6376ea6bcddSNagadheeraj Rottela 	if (need_decomp_threshold) {
638f008628aSNagadheeraj Rottela 		struct nitrox_zip_iova_addr zip_addr;
639f008628aSNagadheeraj Rottela 		int i;
640f008628aSNagadheeraj Rottela 
641f008628aSNagadheeraj Rottela 		zip_addr.u64 = rte_mempool_virt2iova(sr) +
642f008628aSNagadheeraj Rottela 			offsetof(struct nitrox_softreq, decomp_threshold);
643f008628aSNagadheeraj Rottela 		i = sr->dst.filled_sgls;
644f008628aSNagadheeraj Rottela 		sr->dst.sgl[i].s.addr = zip_addr.zda.addr;
645f008628aSNagadheeraj Rottela 		sr->dst.sgl[i].s.length = NITROX_ZIP_MAX_ONFSIZE;
646f008628aSNagadheeraj Rottela 		sr->dst.sgl[i].s.le = 0;
647f008628aSNagadheeraj Rottela 		sr->dst.total_bytes += NITROX_ZIP_MAX_ONFSIZE;
648f008628aSNagadheeraj Rottela 		sr->dst.filled_sgls++;
649f008628aSNagadheeraj Rottela 	}
650f008628aSNagadheeraj Rottela 
651f008628aSNagadheeraj Rottela 	return 0;
652f008628aSNagadheeraj Rottela }
653f008628aSNagadheeraj Rottela 
654f008628aSNagadheeraj Rottela static void nitrox_zip_instr_to_b64(struct nitrox_softreq *sr)
655f008628aSNagadheeraj Rottela {
656f008628aSNagadheeraj Rottela 	struct nitrox_zip_instr *instr = &sr->instr;
657f008628aSNagadheeraj Rottela 	int i;
658f008628aSNagadheeraj Rottela 
659f008628aSNagadheeraj Rottela 	for (i = 0; instr->w0.dg && (i < instr->w4.ilen); i++)
660f008628aSNagadheeraj Rottela 		sr->src.sgl[i].u64 = rte_cpu_to_be_64(sr->src.sgl[i].u64);
661f008628aSNagadheeraj Rottela 
662f008628aSNagadheeraj Rottela 	for (i = 0; instr->w0.ds && (i < instr->w5.olen); i++)
663f008628aSNagadheeraj Rottela 		sr->dst.sgl[i].u64 = rte_cpu_to_be_64(sr->dst.sgl[i].u64);
664f008628aSNagadheeraj Rottela 
665f008628aSNagadheeraj Rottela 	instr->w0.u64 = rte_cpu_to_be_64(instr->w0.u64);
666f008628aSNagadheeraj Rottela 	instr->w1.u64 = rte_cpu_to_be_64(instr->w1.u64);
667f008628aSNagadheeraj Rottela 	instr->w2.u64 = rte_cpu_to_be_64(instr->w2.u64);
668f008628aSNagadheeraj Rottela 	instr->w3.u64 = rte_cpu_to_be_64(instr->w3.u64);
669f008628aSNagadheeraj Rottela 	instr->w4.u64 = rte_cpu_to_be_64(instr->w4.u64);
670f008628aSNagadheeraj Rottela 	instr->w5.u64 = rte_cpu_to_be_64(instr->w5.u64);
671f008628aSNagadheeraj Rottela 	instr->w6.u64 = rte_cpu_to_be_64(instr->w6.u64);
672f008628aSNagadheeraj Rottela 	instr->w7.u64 = rte_cpu_to_be_64(instr->w7.u64);
673f008628aSNagadheeraj Rottela }
674f008628aSNagadheeraj Rottela 
6756ea6bcddSNagadheeraj Rottela static int process_zip_request(struct nitrox_softreq *sr)
676f008628aSNagadheeraj Rottela {
677f008628aSNagadheeraj Rottela 	struct nitrox_zip_instr *instr;
678f008628aSNagadheeraj Rottela 	struct nitrox_comp_xform *xform;
679f008628aSNagadheeraj Rottela 	struct nitrox_zip_iova_addr zip_addr;
6806ea6bcddSNagadheeraj Rottela 	uint64_t iptr_msb, optr_msb, rptr_msb, cptr_msb, hptr_msb;
681f008628aSNagadheeraj Rottela 	int err;
682f008628aSNagadheeraj Rottela 
683f008628aSNagadheeraj Rottela 	xform = sr->op->private_xform;
684f008628aSNagadheeraj Rottela 	if (unlikely(xform == NULL)) {
685*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Invalid stateless comp op");
686f008628aSNagadheeraj Rottela 		return -EINVAL;
687f008628aSNagadheeraj Rottela 	}
688f008628aSNagadheeraj Rottela 
6896ea6bcddSNagadheeraj Rottela 	if (unlikely(sr->op->op_type == RTE_COMP_OP_STATEFUL &&
6906ea6bcddSNagadheeraj Rottela 		     xform->op == NITROX_COMP_OP_COMPRESS &&
6916ea6bcddSNagadheeraj Rottela 		     sr->op->flush_flag == RTE_COMP_FLUSH_FINAL &&
6926ea6bcddSNagadheeraj Rottela 		     sr->op->src.length == 0))
6936ea6bcddSNagadheeraj Rottela 		return handle_zero_length_compression(sr, xform);
6946ea6bcddSNagadheeraj Rottela 
6956ea6bcddSNagadheeraj Rottela 	if (unlikely(sr->op->op_type == RTE_COMP_OP_STATELESS &&
6966ea6bcddSNagadheeraj Rottela 		     xform->op == NITROX_COMP_OP_COMPRESS &&
697f008628aSNagadheeraj Rottela 		     sr->op->flush_flag != RTE_COMP_FLUSH_FULL &&
698f008628aSNagadheeraj Rottela 		     sr->op->flush_flag != RTE_COMP_FLUSH_FINAL)) {
699*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Invalid flush flag %d in stateless op",
700f008628aSNagadheeraj Rottela 			   sr->op->flush_flag);
701f008628aSNagadheeraj Rottela 		return -EINVAL;
702f008628aSNagadheeraj Rottela 	}
703f008628aSNagadheeraj Rottela 
7046ea6bcddSNagadheeraj Rottela 	err = softreq_init(sr, xform);
705f008628aSNagadheeraj Rottela 	if (unlikely(err))
706f008628aSNagadheeraj Rottela 		return err;
707f008628aSNagadheeraj Rottela 
708f008628aSNagadheeraj Rottela 	instr = &sr->instr;
709f008628aSNagadheeraj Rottela 	memset(instr, 0, sizeof(*instr));
710f008628aSNagadheeraj Rottela 	/* word 0 */
711f008628aSNagadheeraj Rottela 	instr->w0.tol = sr->dst.total_bytes;
7126ea6bcddSNagadheeraj Rottela 	instr->w0.exn = xform->exn;
7136ea6bcddSNagadheeraj Rottela 	instr->w0.exbits = xform->exbits;
714f008628aSNagadheeraj Rottela 	instr->w0.ca = 0;
715f008628aSNagadheeraj Rottela 	if (xform->op == NITROX_COMP_OP_DECOMPRESS ||
7166ea6bcddSNagadheeraj Rottela 	    sr->op->flush_flag == RTE_COMP_FLUSH_SYNC ||
717f008628aSNagadheeraj Rottela 	    sr->op->flush_flag == RTE_COMP_FLUSH_FULL)
718f008628aSNagadheeraj Rottela 		instr->w0.sf = 1;
719f008628aSNagadheeraj Rottela 	else
720f008628aSNagadheeraj Rottela 		instr->w0.sf = 0;
721f008628aSNagadheeraj Rottela 
722f008628aSNagadheeraj Rottela 	instr->w0.ss = xform->level;
723f008628aSNagadheeraj Rottela 	instr->w0.cc = xform->algo;
7246ea6bcddSNagadheeraj Rottela 	if (sr->op->flush_flag == RTE_COMP_FLUSH_FINAL)
725f008628aSNagadheeraj Rottela 		instr->w0.ef = 1;
726f008628aSNagadheeraj Rottela 	else
727f008628aSNagadheeraj Rottela 		instr->w0.ef = 0;
728f008628aSNagadheeraj Rottela 
7296ea6bcddSNagadheeraj Rottela 	instr->w0.bf = xform->bf;
730f008628aSNagadheeraj Rottela 	instr->w0.co = xform->op;
731f008628aSNagadheeraj Rottela 	if (sr->dst.filled_sgls > 1)
732f008628aSNagadheeraj Rottela 		instr->w0.ds = 1;
733f008628aSNagadheeraj Rottela 	else
734f008628aSNagadheeraj Rottela 		instr->w0.ds = 0;
735f008628aSNagadheeraj Rottela 
736f008628aSNagadheeraj Rottela 	if (sr->src.filled_sgls > 1)
737f008628aSNagadheeraj Rottela 		instr->w0.dg = 1;
738f008628aSNagadheeraj Rottela 	else
739f008628aSNagadheeraj Rottela 		instr->w0.dg = 0;
740f008628aSNagadheeraj Rottela 
741f008628aSNagadheeraj Rottela 	instr->w0.hg = 0;
742f008628aSNagadheeraj Rottela 
743f008628aSNagadheeraj Rottela 	/* word 1 */
7446ea6bcddSNagadheeraj Rottela 	instr->w1.hl = xform->hlen;
7456ea6bcddSNagadheeraj Rottela 	if (sr->op->op_type == RTE_COMP_OP_STATEFUL && !xform->bf)
7466ea6bcddSNagadheeraj Rottela 		instr->w1.adlercrc32 = xform->chksum;
7476ea6bcddSNagadheeraj Rottela 	else if (sr->op->op_type == RTE_COMP_OP_STATELESS &&
7486ea6bcddSNagadheeraj Rottela 		 sr->op->input_chksum != 0)
749f008628aSNagadheeraj Rottela 		instr->w1.adlercrc32 = sr->op->input_chksum;
750f008628aSNagadheeraj Rottela 	else if (xform->chksum_type == NITROX_CHKSUM_TYPE_ADLER32)
751f008628aSNagadheeraj Rottela 		instr->w1.adlercrc32 = 1;
752f008628aSNagadheeraj Rottela 	else if (xform->chksum_type == NITROX_CHKSUM_TYPE_CRC32)
753f008628aSNagadheeraj Rottela 		instr->w1.adlercrc32 = 0;
754f008628aSNagadheeraj Rottela 
755f008628aSNagadheeraj Rottela 	/* word 2 */
7566ea6bcddSNagadheeraj Rottela 	if (xform->context)
7576ea6bcddSNagadheeraj Rottela 		zip_addr.u64 = rte_malloc_virt2iova(xform->context);
7586ea6bcddSNagadheeraj Rottela 	else
7596ea6bcddSNagadheeraj Rottela 		zip_addr.u64 = 0;
7606ea6bcddSNagadheeraj Rottela 
7616ea6bcddSNagadheeraj Rottela 	instr->w2.cptr = zip_addr.zda.addr;
7626ea6bcddSNagadheeraj Rottela 	cptr_msb = zip_addr.zda.addr_msb;
763f008628aSNagadheeraj Rottela 
764f008628aSNagadheeraj Rottela 	/* word 3 */
7656ea6bcddSNagadheeraj Rottela 	instr->w3.hlen = xform->hlen;
7666ea6bcddSNagadheeraj Rottela 	if (xform->history_window)
7676ea6bcddSNagadheeraj Rottela 		zip_addr.u64 = rte_malloc_virt2iova(xform->history_window);
7686ea6bcddSNagadheeraj Rottela 	else
7696ea6bcddSNagadheeraj Rottela 		zip_addr.u64 = 0;
7706ea6bcddSNagadheeraj Rottela 
7716ea6bcddSNagadheeraj Rottela 	instr->w3.hptr = zip_addr.zda.addr;
7726ea6bcddSNagadheeraj Rottela 	hptr_msb = zip_addr.zda.addr_msb;
773f008628aSNagadheeraj Rottela 
774f008628aSNagadheeraj Rottela 	/* word 4 */
775f008628aSNagadheeraj Rottela 	if (sr->src.filled_sgls == 1) {
776f008628aSNagadheeraj Rottela 		instr->w4.ilen = sr->src.sgl[0].s.length;
777f008628aSNagadheeraj Rottela 		instr->w4.iptr = sr->src.sgl[0].s.addr;
778f008628aSNagadheeraj Rottela 		iptr_msb = sr->src.addr_msb;
779f008628aSNagadheeraj Rottela 	} else {
780f008628aSNagadheeraj Rottela 		zip_addr.u64 = rte_malloc_virt2iova(sr->src.sgl);
781f008628aSNagadheeraj Rottela 		instr->w4.ilen = sr->src.filled_sgls;
782f008628aSNagadheeraj Rottela 		instr->w4.iptr = zip_addr.zda.addr;
783f008628aSNagadheeraj Rottela 		iptr_msb = zip_addr.zda.addr_msb;
784f008628aSNagadheeraj Rottela 	}
785f008628aSNagadheeraj Rottela 
786f008628aSNagadheeraj Rottela 	/* word 5 */
787f008628aSNagadheeraj Rottela 	if (sr->dst.filled_sgls == 1) {
788f008628aSNagadheeraj Rottela 		instr->w5.olen = sr->dst.sgl[0].s.length;
789f008628aSNagadheeraj Rottela 		instr->w5.optr = sr->dst.sgl[0].s.addr;
790f008628aSNagadheeraj Rottela 		optr_msb = sr->dst.addr_msb;
791f008628aSNagadheeraj Rottela 	} else {
792f008628aSNagadheeraj Rottela 		zip_addr.u64 = rte_malloc_virt2iova(sr->dst.sgl);
793f008628aSNagadheeraj Rottela 		instr->w5.olen = sr->dst.filled_sgls;
794f008628aSNagadheeraj Rottela 		instr->w5.optr = zip_addr.zda.addr;
795f008628aSNagadheeraj Rottela 		optr_msb = zip_addr.zda.addr_msb;
796f008628aSNagadheeraj Rottela 	}
797f008628aSNagadheeraj Rottela 
798f008628aSNagadheeraj Rottela 	/* word 6 */
799f008628aSNagadheeraj Rottela 	memset(&sr->zip_res, 0, sizeof(sr->zip_res));
800f008628aSNagadheeraj Rottela 	zip_addr.u64 = rte_mempool_virt2iova(sr) +
801f008628aSNagadheeraj Rottela 		offsetof(struct nitrox_softreq, zip_res);
802f008628aSNagadheeraj Rottela 	instr->w6.rptr = zip_addr.zda.addr;
803f008628aSNagadheeraj Rottela 	rptr_msb = zip_addr.zda.addr_msb;
804f008628aSNagadheeraj Rottela 
8056ea6bcddSNagadheeraj Rottela 	if (unlikely(iptr_msb != optr_msb || iptr_msb != rptr_msb ||
8066ea6bcddSNagadheeraj Rottela 	    (xform->history_window && (iptr_msb != hptr_msb)) ||
8076ea6bcddSNagadheeraj Rottela 	    (xform->context && (iptr_msb != cptr_msb)))) {
808*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "addr_msb is not same for all addresses");
809f008628aSNagadheeraj Rottela 		return -ENOTSUP;
810f008628aSNagadheeraj Rottela 	}
811f008628aSNagadheeraj Rottela 
812f008628aSNagadheeraj Rottela 	/* word 7 */
813f008628aSNagadheeraj Rottela 	instr->w7.addr_msb = iptr_msb;
814f008628aSNagadheeraj Rottela 	instr->w7.grp = 0;
815f008628aSNagadheeraj Rottela 
8166ea6bcddSNagadheeraj Rottela 	nitrox_dump_zip_instr(instr, NULL, sr->src.sgl, sr->dst.sgl);
8176ea6bcddSNagadheeraj Rottela 	nitrox_dump_databuf("IN", sr->op->m_src, sr->op->src.offset,
8186ea6bcddSNagadheeraj Rottela 			    sr->op->src.length);
819f008628aSNagadheeraj Rottela 	nitrox_zip_instr_to_b64(sr);
820f008628aSNagadheeraj Rottela 	return 0;
821f008628aSNagadheeraj Rottela }
822f008628aSNagadheeraj Rottela 
823f008628aSNagadheeraj Rottela int
824f008628aSNagadheeraj Rottela nitrox_process_comp_req(struct rte_comp_op *op, struct nitrox_softreq *sr)
825f008628aSNagadheeraj Rottela {
826f008628aSNagadheeraj Rottela 	int err;
827f008628aSNagadheeraj Rottela 
828f008628aSNagadheeraj Rottela 	sr->op = op;
8296ea6bcddSNagadheeraj Rottela 	sr->op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
830f008628aSNagadheeraj Rottela 	err = process_zip_request(sr);
831f008628aSNagadheeraj Rottela 	if (unlikely(err))
832f008628aSNagadheeraj Rottela 		goto err_exit;
833f008628aSNagadheeraj Rottela 
834f008628aSNagadheeraj Rottela 	sr->timeout = rte_get_timer_cycles() + CMD_TIMEOUT * rte_get_timer_hz();
835f008628aSNagadheeraj Rottela 	return 0;
836f008628aSNagadheeraj Rottela err_exit:
837f008628aSNagadheeraj Rottela 	if (err == -ENOMEM)
838f008628aSNagadheeraj Rottela 		sr->op->status = RTE_COMP_OP_STATUS_ERROR;
839f008628aSNagadheeraj Rottela 	else
840f008628aSNagadheeraj Rottela 		sr->op->status = RTE_COMP_OP_STATUS_INVALID_ARGS;
841f008628aSNagadheeraj Rottela 
842f008628aSNagadheeraj Rottela 	return err;
843f008628aSNagadheeraj Rottela }
844f008628aSNagadheeraj Rottela 
845f008628aSNagadheeraj Rottela static struct nitrox_zip_result zip_result_to_cpu64(struct nitrox_zip_result *r)
846f008628aSNagadheeraj Rottela {
847f008628aSNagadheeraj Rottela 	struct nitrox_zip_result out_res;
848f008628aSNagadheeraj Rottela 
849f008628aSNagadheeraj Rottela 	out_res.w2.u64 = rte_be_to_cpu_64(r->w2.u64);
850f008628aSNagadheeraj Rottela 	out_res.w1.u64 = rte_be_to_cpu_64(r->w1.u64);
851f008628aSNagadheeraj Rottela 	out_res.w0.u64 = rte_be_to_cpu_64(r->w0.u64);
852f008628aSNagadheeraj Rottela 	return out_res;
853f008628aSNagadheeraj Rottela }
854f008628aSNagadheeraj Rottela 
8556ea6bcddSNagadheeraj Rottela static int post_process_zip_stateless(struct nitrox_softreq *sr,
8566ea6bcddSNagadheeraj Rottela 				      struct nitrox_comp_xform *xform,
8576ea6bcddSNagadheeraj Rottela 				      struct nitrox_zip_result *zip_res)
8586ea6bcddSNagadheeraj Rottela {
8596ea6bcddSNagadheeraj Rottela 	int output_unused_bytes;
8606ea6bcddSNagadheeraj Rottela 
8616ea6bcddSNagadheeraj Rottela 	if (unlikely(zip_res->w2.compcode != NITROX_CC_SUCCESS)) {
8626ea6bcddSNagadheeraj Rottela 		struct rte_comp_op *op = sr->op;
8636ea6bcddSNagadheeraj Rottela 
864*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Dequeue error 0x%x",
8656ea6bcddSNagadheeraj Rottela 			   zip_res->w2.compcode);
8666ea6bcddSNagadheeraj Rottela 		if (zip_res->w2.compcode == NITROX_CC_STOP ||
8676ea6bcddSNagadheeraj Rottela 		    zip_res->w2.compcode == NITROX_CC_DTRUNC)
8686ea6bcddSNagadheeraj Rottela 			op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED;
8696ea6bcddSNagadheeraj Rottela 		else
8706ea6bcddSNagadheeraj Rottela 			op->status = RTE_COMP_OP_STATUS_ERROR;
8716ea6bcddSNagadheeraj Rottela 
8726ea6bcddSNagadheeraj Rottela 		op->consumed = 0;
8736ea6bcddSNagadheeraj Rottela 		op->produced = 0;
8746ea6bcddSNagadheeraj Rottela 		return -EFAULT;
8756ea6bcddSNagadheeraj Rottela 	}
8766ea6bcddSNagadheeraj Rottela 
8776ea6bcddSNagadheeraj Rottela 	output_unused_bytes = sr->dst.total_bytes - zip_res->w1.tbyteswritten;
8786ea6bcddSNagadheeraj Rottela 	if (unlikely(xform->op == NITROX_COMP_OP_DECOMPRESS &&
8796ea6bcddSNagadheeraj Rottela 		     output_unused_bytes < NITROX_ZIP_MAX_ONFSIZE)) {
880*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "TOL %d, Total bytes written %d",
8816ea6bcddSNagadheeraj Rottela 			   sr->dst.total_bytes, zip_res->w1.tbyteswritten);
8826ea6bcddSNagadheeraj Rottela 		sr->op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED;
8836ea6bcddSNagadheeraj Rottela 		sr->op->consumed = 0;
8846ea6bcddSNagadheeraj Rottela 		sr->op->produced = sr->dst.total_bytes - NITROX_ZIP_MAX_ONFSIZE;
8856ea6bcddSNagadheeraj Rottela 		return -EIO;
8866ea6bcddSNagadheeraj Rottela 	}
8876ea6bcddSNagadheeraj Rottela 
8886ea6bcddSNagadheeraj Rottela 	if (xform->chksum_type == NITROX_CHKSUM_TYPE_CRC32)
8896ea6bcddSNagadheeraj Rottela 		sr->op->output_chksum = zip_res->w0.crc32;
8906ea6bcddSNagadheeraj Rottela 	else if (xform->chksum_type == NITROX_CHKSUM_TYPE_ADLER32)
8916ea6bcddSNagadheeraj Rottela 		sr->op->output_chksum = zip_res->w0.adler32;
8926ea6bcddSNagadheeraj Rottela 
8936ea6bcddSNagadheeraj Rottela 	sr->op->consumed = RTE_MIN(sr->op->src.length,
8946ea6bcddSNagadheeraj Rottela 				   (uint32_t)zip_res->w1.tbytesread);
8956ea6bcddSNagadheeraj Rottela 	sr->op->produced = zip_res->w1.tbyteswritten;
8966ea6bcddSNagadheeraj Rottela 	sr->op->status = RTE_COMP_OP_STATUS_SUCCESS;
8976ea6bcddSNagadheeraj Rottela 	return 0;
8986ea6bcddSNagadheeraj Rottela }
8996ea6bcddSNagadheeraj Rottela 
9006ea6bcddSNagadheeraj Rottela static int update_history(struct rte_mbuf *mbuf, uint32_t off, uint16_t datalen,
9016ea6bcddSNagadheeraj Rottela 			   uint8_t *dst)
9026ea6bcddSNagadheeraj Rottela {
9036ea6bcddSNagadheeraj Rottela 	struct rte_mbuf *m;
9046ea6bcddSNagadheeraj Rottela 	uint32_t mlen;
9056ea6bcddSNagadheeraj Rottela 	uint16_t copied = 0;
9066ea6bcddSNagadheeraj Rottela 
9076ea6bcddSNagadheeraj Rottela 	for (m = mbuf; m && off > rte_pktmbuf_data_len(m); m = m->next)
9086ea6bcddSNagadheeraj Rottela 		off -= rte_pktmbuf_data_len(m);
9096ea6bcddSNagadheeraj Rottela 
9106ea6bcddSNagadheeraj Rottela 	if (unlikely(!m)) {
911*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Failed to update history. Invalid mbuf");
9126ea6bcddSNagadheeraj Rottela 		return -EINVAL;
9136ea6bcddSNagadheeraj Rottela 	}
9146ea6bcddSNagadheeraj Rottela 
9156ea6bcddSNagadheeraj Rottela 	mlen = rte_pktmbuf_data_len(m) - off;
9166ea6bcddSNagadheeraj Rottela 	if (datalen <= mlen)
9176ea6bcddSNagadheeraj Rottela 		mlen = datalen;
9186ea6bcddSNagadheeraj Rottela 
9196ea6bcddSNagadheeraj Rottela 	memcpy(&dst[copied], rte_pktmbuf_mtod_offset(m, char *, off), mlen);
9206ea6bcddSNagadheeraj Rottela 	copied += mlen;
9216ea6bcddSNagadheeraj Rottela 	datalen -= mlen;
9226ea6bcddSNagadheeraj Rottela 	for (m = m->next; m && datalen; m = m->next) {
9236ea6bcddSNagadheeraj Rottela 		mlen = rte_pktmbuf_data_len(m) < datalen ?
9246ea6bcddSNagadheeraj Rottela 			rte_pktmbuf_data_len(m) : datalen;
9256ea6bcddSNagadheeraj Rottela 		memcpy(&dst[copied], rte_pktmbuf_mtod(m, char *), mlen);
9266ea6bcddSNagadheeraj Rottela 		copied += mlen;
9276ea6bcddSNagadheeraj Rottela 		datalen -= mlen;
9286ea6bcddSNagadheeraj Rottela 	}
9296ea6bcddSNagadheeraj Rottela 
9306ea6bcddSNagadheeraj Rottela 	if (unlikely(datalen != 0)) {
931*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Failed to update history. Invalid datalen");
9326ea6bcddSNagadheeraj Rottela 		return -EINVAL;
9336ea6bcddSNagadheeraj Rottela 	}
9346ea6bcddSNagadheeraj Rottela 
9356ea6bcddSNagadheeraj Rottela 	return 0;
9366ea6bcddSNagadheeraj Rottela }
9376ea6bcddSNagadheeraj Rottela 
9386ea6bcddSNagadheeraj Rottela static void reset_nitrox_xform(struct nitrox_comp_xform *xform)
9396ea6bcddSNagadheeraj Rottela {
9406ea6bcddSNagadheeraj Rottela 	xform->hlen = 0;
9416ea6bcddSNagadheeraj Rottela 	xform->exn = 0;
9426ea6bcddSNagadheeraj Rottela 	xform->exbits = 0;
9436ea6bcddSNagadheeraj Rottela 	xform->bf = true;
9446ea6bcddSNagadheeraj Rottela }
9456ea6bcddSNagadheeraj Rottela 
9466ea6bcddSNagadheeraj Rottela static int post_process_zip_stateful(struct nitrox_softreq *sr,
9476ea6bcddSNagadheeraj Rottela 				     struct nitrox_comp_xform *xform,
9486ea6bcddSNagadheeraj Rottela 				     struct nitrox_zip_result *zip_res)
9496ea6bcddSNagadheeraj Rottela {
9506ea6bcddSNagadheeraj Rottela 	uint32_t bytesread = 0;
9516ea6bcddSNagadheeraj Rottela 	uint32_t chksum = 0;
9526ea6bcddSNagadheeraj Rottela 
9536ea6bcddSNagadheeraj Rottela 	if (unlikely(zip_res->w2.compcode == NITROX_CC_DTRUNC)) {
9546ea6bcddSNagadheeraj Rottela 		sr->op->consumed = 0;
9556ea6bcddSNagadheeraj Rottela 		sr->op->produced = 0;
9566ea6bcddSNagadheeraj Rottela 		xform->hlen = 0;
9576ea6bcddSNagadheeraj Rottela 		sr->op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE;
958*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Dequeue compress DTRUNC error");
9596ea6bcddSNagadheeraj Rottela 		return 0;
9606ea6bcddSNagadheeraj Rottela 	} else if (unlikely(zip_res->w2.compcode == NITROX_CC_STOP)) {
9616ea6bcddSNagadheeraj Rottela 		sr->op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE;
962*e99981afSDavid Marchand 		NITROX_LOG_LINE(NOTICE, "Dequeue decompress dynamic STOP");
9636ea6bcddSNagadheeraj Rottela 	} else if (zip_res->w2.compcode == NITROX_CC_SUCCESS) {
9646ea6bcddSNagadheeraj Rottela 		sr->op->status = RTE_COMP_OP_STATUS_SUCCESS;
9656ea6bcddSNagadheeraj Rottela 	} else {
9666ea6bcddSNagadheeraj Rottela 		xform->hlen = 0;
9676ea6bcddSNagadheeraj Rottela 		xform->exn = 0;
9686ea6bcddSNagadheeraj Rottela 		xform->exbits = 0;
9696ea6bcddSNagadheeraj Rottela 		xform->bf = true;
9706ea6bcddSNagadheeraj Rottela 		sr->op->status = RTE_COMP_OP_STATUS_ERROR;
971*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Dequeue error 0x%x",
9726ea6bcddSNagadheeraj Rottela 			   zip_res->w2.compcode);
9736ea6bcddSNagadheeraj Rottela 		return -EFAULT;
9746ea6bcddSNagadheeraj Rottela 	}
9756ea6bcddSNagadheeraj Rottela 
9766ea6bcddSNagadheeraj Rottela 	if (xform->op == NITROX_COMP_OP_COMPRESS) {
9776ea6bcddSNagadheeraj Rottela 		if (zip_res->w1.tbytesread < xform->hlen) {
978*e99981afSDavid Marchand 			NITROX_LOG_LINE(ERR, "Invalid bytesread");
9796ea6bcddSNagadheeraj Rottela 			reset_nitrox_xform(xform);
9806ea6bcddSNagadheeraj Rottela 			sr->op->status = RTE_COMP_OP_STATUS_ERROR;
9816ea6bcddSNagadheeraj Rottela 			return -EFAULT;
9826ea6bcddSNagadheeraj Rottela 		}
9836ea6bcddSNagadheeraj Rottela 
9846ea6bcddSNagadheeraj Rottela 		bytesread = zip_res->w1.tbytesread - xform->hlen;
9856ea6bcddSNagadheeraj Rottela 	} else {
9866ea6bcddSNagadheeraj Rottela 		bytesread = RTE_MIN(sr->op->src.length,
9876ea6bcddSNagadheeraj Rottela 				    (uint32_t)zip_res->w1.tbytesread);
9886ea6bcddSNagadheeraj Rottela 	}
9896ea6bcddSNagadheeraj Rottela 
9906ea6bcddSNagadheeraj Rottela 	if ((xform->op == NITROX_COMP_OP_COMPRESS &&
9916ea6bcddSNagadheeraj Rottela 	    (sr->op->flush_flag == RTE_COMP_FLUSH_NONE ||
9926ea6bcddSNagadheeraj Rottela 	    sr->op->flush_flag == RTE_COMP_FLUSH_SYNC)) ||
9936ea6bcddSNagadheeraj Rottela 	    (xform->op == NITROX_COMP_OP_DECOMPRESS && !zip_res->w2.ef)) {
9946ea6bcddSNagadheeraj Rottela 		struct rte_mbuf *mbuf;
9956ea6bcddSNagadheeraj Rottela 		uint32_t pktlen, m_off;
9966ea6bcddSNagadheeraj Rottela 		int err;
9976ea6bcddSNagadheeraj Rottela 
9986ea6bcddSNagadheeraj Rottela 		if (xform->op == NITROX_COMP_OP_COMPRESS) {
9996ea6bcddSNagadheeraj Rottela 			mbuf = sr->op->m_src;
10006ea6bcddSNagadheeraj Rottela 			pktlen = bytesread;
10016ea6bcddSNagadheeraj Rottela 			m_off = sr->op->src.offset;
10026ea6bcddSNagadheeraj Rottela 		} else {
10036ea6bcddSNagadheeraj Rottela 			mbuf = sr->op->m_dst;
10046ea6bcddSNagadheeraj Rottela 			pktlen = zip_res->w1.tbyteswritten;
10056ea6bcddSNagadheeraj Rottela 			m_off = sr->op->dst.offset;
10066ea6bcddSNagadheeraj Rottela 		}
10076ea6bcddSNagadheeraj Rottela 
10086ea6bcddSNagadheeraj Rottela 		if (pktlen >= xform->window_size) {
10096ea6bcddSNagadheeraj Rottela 			m_off += pktlen - xform->window_size;
10106ea6bcddSNagadheeraj Rottela 			err = update_history(mbuf, m_off, xform->window_size,
10116ea6bcddSNagadheeraj Rottela 				       xform->history_window);
10126ea6bcddSNagadheeraj Rottela 			xform->hlen = xform->window_size;
10136ea6bcddSNagadheeraj Rottela 		} else if ((xform->hlen + pktlen) <= xform->window_size) {
10146ea6bcddSNagadheeraj Rottela 			err = update_history(mbuf, m_off, pktlen,
10156ea6bcddSNagadheeraj Rottela 				       &xform->history_window[xform->hlen]);
10166ea6bcddSNagadheeraj Rottela 			xform->hlen += pktlen;
10176ea6bcddSNagadheeraj Rottela 		} else {
10186ea6bcddSNagadheeraj Rottela 			uint16_t shift_off, shift_len;
10196ea6bcddSNagadheeraj Rottela 
10206ea6bcddSNagadheeraj Rottela 			shift_off = pktlen + xform->hlen - xform->window_size;
10216ea6bcddSNagadheeraj Rottela 			shift_len = xform->hlen - shift_off;
10226ea6bcddSNagadheeraj Rottela 			memmove(xform->history_window,
10236ea6bcddSNagadheeraj Rottela 				&xform->history_window[shift_off],
10246ea6bcddSNagadheeraj Rottela 				shift_len);
10256ea6bcddSNagadheeraj Rottela 			err = update_history(mbuf, m_off, pktlen,
10266ea6bcddSNagadheeraj Rottela 				       &xform->history_window[shift_len]);
10276ea6bcddSNagadheeraj Rottela 			xform->hlen = xform->window_size;
10286ea6bcddSNagadheeraj Rottela 
10296ea6bcddSNagadheeraj Rottela 		}
10306ea6bcddSNagadheeraj Rottela 
10316ea6bcddSNagadheeraj Rottela 		if (unlikely(err)) {
10326ea6bcddSNagadheeraj Rottela 			sr->op->status = RTE_COMP_OP_STATUS_ERROR;
10336ea6bcddSNagadheeraj Rottela 			return err;
10346ea6bcddSNagadheeraj Rottela 		}
10356ea6bcddSNagadheeraj Rottela 
10366ea6bcddSNagadheeraj Rottela 		if (xform->op == NITROX_COMP_OP_COMPRESS) {
10376ea6bcddSNagadheeraj Rottela 			xform->exn = zip_res->w2.exn;
10386ea6bcddSNagadheeraj Rottela 			xform->exbits = zip_res->w2.exbits;
10396ea6bcddSNagadheeraj Rottela 		}
10406ea6bcddSNagadheeraj Rottela 
10416ea6bcddSNagadheeraj Rottela 		xform->bf = false;
10426ea6bcddSNagadheeraj Rottela 	} else {
10436ea6bcddSNagadheeraj Rottela 		reset_nitrox_xform(xform);
10446ea6bcddSNagadheeraj Rottela 	}
10456ea6bcddSNagadheeraj Rottela 
10466ea6bcddSNagadheeraj Rottela 	if (xform->chksum_type == NITROX_CHKSUM_TYPE_CRC32)
10476ea6bcddSNagadheeraj Rottela 		chksum = zip_res->w0.crc32;
10486ea6bcddSNagadheeraj Rottela 	else if (xform->chksum_type == NITROX_CHKSUM_TYPE_ADLER32)
10496ea6bcddSNagadheeraj Rottela 		chksum = zip_res->w0.adler32;
10506ea6bcddSNagadheeraj Rottela 
10516ea6bcddSNagadheeraj Rottela 	if (xform->bf)
10526ea6bcddSNagadheeraj Rottela 		sr->op->output_chksum = chksum;
10536ea6bcddSNagadheeraj Rottela 	else
10546ea6bcddSNagadheeraj Rottela 		xform->chksum = chksum;
10556ea6bcddSNagadheeraj Rottela 
10566ea6bcddSNagadheeraj Rottela 	sr->op->consumed = bytesread;
10576ea6bcddSNagadheeraj Rottela 	sr->op->produced = zip_res->w1.tbyteswritten;
10586ea6bcddSNagadheeraj Rottela 	return 0;
10596ea6bcddSNagadheeraj Rottela }
10606ea6bcddSNagadheeraj Rottela 
1061f008628aSNagadheeraj Rottela int
1062f008628aSNagadheeraj Rottela nitrox_check_comp_req(struct nitrox_softreq *sr, struct rte_comp_op **op)
1063f008628aSNagadheeraj Rottela {
1064f008628aSNagadheeraj Rottela 	struct nitrox_zip_result zip_res;
10656ea6bcddSNagadheeraj Rottela 	struct nitrox_comp_xform *xform;
1066f008628aSNagadheeraj Rottela 	int err = 0;
1067f008628aSNagadheeraj Rottela 
1068f008628aSNagadheeraj Rottela 	zip_res = zip_result_to_cpu64(&sr->zip_res);
1069f008628aSNagadheeraj Rottela 	if (zip_res.w2.compcode == NITROX_CC_NOTDONE) {
1070f008628aSNagadheeraj Rottela 		if (rte_get_timer_cycles() >= sr->timeout) {
1071*e99981afSDavid Marchand 			NITROX_LOG_LINE(ERR, "Op timedout");
1072f008628aSNagadheeraj Rottela 			sr->op->status = RTE_COMP_OP_STATUS_ERROR;
1073f008628aSNagadheeraj Rottela 			err = -ETIMEDOUT;
1074f008628aSNagadheeraj Rottela 			goto exit;
1075f008628aSNagadheeraj Rottela 		} else {
1076f008628aSNagadheeraj Rottela 			return -EAGAIN;
1077f008628aSNagadheeraj Rottela 		}
1078f008628aSNagadheeraj Rottela 	}
1079f008628aSNagadheeraj Rottela 
10806ea6bcddSNagadheeraj Rottela 	xform = sr->op->private_xform;
10816ea6bcddSNagadheeraj Rottela 	if (sr->op->op_type == RTE_COMP_OP_STATELESS)
10826ea6bcddSNagadheeraj Rottela 		err = post_process_zip_stateless(sr, xform, &zip_res);
1083f008628aSNagadheeraj Rottela 	else
10846ea6bcddSNagadheeraj Rottela 		err = post_process_zip_stateful(sr, xform, &zip_res);
1085f008628aSNagadheeraj Rottela 
10866ea6bcddSNagadheeraj Rottela 	if (sr->op->status == RTE_COMP_OP_STATUS_SUCCESS &&
10876ea6bcddSNagadheeraj Rottela 	    xform->op == NITROX_COMP_OP_COMPRESS &&
1088f008628aSNagadheeraj Rottela 	    sr->op->flush_flag == RTE_COMP_FLUSH_FINAL &&
1089f008628aSNagadheeraj Rottela 	    zip_res.w2.exn) {
1090f008628aSNagadheeraj Rottela 		uint32_t datalen = zip_res.w1.tbyteswritten;
1091f008628aSNagadheeraj Rottela 		uint32_t off = sr->op->dst.offset;
1092f008628aSNagadheeraj Rottela 		struct rte_mbuf *m = sr->op->m_dst;
1093f008628aSNagadheeraj Rottela 		uint32_t mlen;
1094f008628aSNagadheeraj Rottela 		uint8_t *last_byte;
1095f008628aSNagadheeraj Rottela 
1096f008628aSNagadheeraj Rottela 		for (; m && off > rte_pktmbuf_data_len(m); m = m->next)
1097f008628aSNagadheeraj Rottela 			off -= rte_pktmbuf_data_len(m);
1098f008628aSNagadheeraj Rottela 
10991b47e7a5SNagadheeraj Rottela 		if (unlikely(m == NULL)) {
11001b47e7a5SNagadheeraj Rottela 			err = -EINVAL;
11011b47e7a5SNagadheeraj Rottela 			goto exit;
11021b47e7a5SNagadheeraj Rottela 		}
11031b47e7a5SNagadheeraj Rottela 
1104f008628aSNagadheeraj Rottela 		mlen = rte_pktmbuf_data_len(m) - off;
1105f008628aSNagadheeraj Rottela 		for (; m && (datalen > mlen); m = m->next)
1106f008628aSNagadheeraj Rottela 			datalen -= mlen;
1107f008628aSNagadheeraj Rottela 
11081b47e7a5SNagadheeraj Rottela 		if (unlikely(m == NULL)) {
11091b47e7a5SNagadheeraj Rottela 			err = -EINVAL;
11101b47e7a5SNagadheeraj Rottela 			goto exit;
11111b47e7a5SNagadheeraj Rottela 		}
11121b47e7a5SNagadheeraj Rottela 
1113f008628aSNagadheeraj Rottela 		last_byte = rte_pktmbuf_mtod_offset(m, uint8_t *, datalen - 1);
1114f008628aSNagadheeraj Rottela 		*last_byte = zip_res.w2.exbits & 0xFF;
1115f008628aSNagadheeraj Rottela 	}
1116f008628aSNagadheeraj Rottela 
1117f008628aSNagadheeraj Rottela exit:
1118f008628aSNagadheeraj Rottela 	*op = sr->op;
11196ea6bcddSNagadheeraj Rottela 	nitrox_dump_zip_result(&sr->instr, &zip_res);
11206ea6bcddSNagadheeraj Rottela 	nitrox_dump_databuf("OUT after", sr->op->m_dst, sr->op->dst.offset,
11216ea6bcddSNagadheeraj Rottela 		sr->op->produced);
1122f008628aSNagadheeraj Rottela 	return err;
1123f008628aSNagadheeraj Rottela }
1124f008628aSNagadheeraj Rottela 
1125f008628aSNagadheeraj Rottela void *
1126f008628aSNagadheeraj Rottela nitrox_comp_instr_addr(struct nitrox_softreq *sr)
1127f008628aSNagadheeraj Rottela {
1128f008628aSNagadheeraj Rottela 	return &sr->instr;
1129f008628aSNagadheeraj Rottela }
1130f008628aSNagadheeraj Rottela 
1131f008628aSNagadheeraj Rottela static void req_pool_obj_free(struct rte_mempool *mp, void *opaque, void *obj,
1132f008628aSNagadheeraj Rottela 			      unsigned int obj_idx)
1133f008628aSNagadheeraj Rottela {
1134f008628aSNagadheeraj Rottela 	struct nitrox_softreq *sr;
1135f008628aSNagadheeraj Rottela 
1136f008628aSNagadheeraj Rottela 	RTE_SET_USED(mp);
1137f008628aSNagadheeraj Rottela 	RTE_SET_USED(opaque);
1138f008628aSNagadheeraj Rottela 	RTE_SET_USED(obj_idx);
1139f008628aSNagadheeraj Rottela 	sr = obj;
1140f008628aSNagadheeraj Rottela 	rte_free(sr->src.sgl);
1141f008628aSNagadheeraj Rottela 	sr->src.sgl = NULL;
1142f008628aSNagadheeraj Rottela 	rte_free(sr->dst.sgl);
1143f008628aSNagadheeraj Rottela 	sr->dst.sgl = NULL;
1144f008628aSNagadheeraj Rottela }
1145f008628aSNagadheeraj Rottela 
1146f008628aSNagadheeraj Rottela void
1147f008628aSNagadheeraj Rottela nitrox_comp_req_pool_free(struct rte_mempool *mp)
1148f008628aSNagadheeraj Rottela {
1149f008628aSNagadheeraj Rottela 	rte_mempool_obj_iter(mp, req_pool_obj_free, NULL);
1150f008628aSNagadheeraj Rottela 	rte_mempool_free(mp);
1151f008628aSNagadheeraj Rottela }
1152f008628aSNagadheeraj Rottela 
1153f008628aSNagadheeraj Rottela static void req_pool_obj_init(struct rte_mempool *mp, void *arg, void *obj,
1154f008628aSNagadheeraj Rottela 			      unsigned int obj_idx)
1155f008628aSNagadheeraj Rottela {
1156f008628aSNagadheeraj Rottela 	struct nitrox_softreq *sr;
1157f008628aSNagadheeraj Rottela 	int *err = arg;
1158f008628aSNagadheeraj Rottela 
1159f008628aSNagadheeraj Rottela 	RTE_SET_USED(mp);
1160f008628aSNagadheeraj Rottela 	RTE_SET_USED(obj_idx);
1161f008628aSNagadheeraj Rottela 	sr = obj;
1162f008628aSNagadheeraj Rottela 	sr->src.sgl = rte_zmalloc_socket(NULL,
1163f008628aSNagadheeraj Rottela 				sizeof(*sr->src.sgl) * NITROX_ZIP_SGL_COUNT,
1164f008628aSNagadheeraj Rottela 				8, mp->socket_id);
1165f008628aSNagadheeraj Rottela 	sr->dst.sgl = rte_zmalloc_socket(NULL,
1166f008628aSNagadheeraj Rottela 				sizeof(*sr->dst.sgl) * NITROX_ZIP_SGL_COUNT,
1167f008628aSNagadheeraj Rottela 				8, mp->socket_id);
1168f008628aSNagadheeraj Rottela 	if (sr->src.sgl == NULL || sr->dst.sgl == NULL) {
1169*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Failed to allocate zip_sgl memory");
1170f008628aSNagadheeraj Rottela 		*err = -ENOMEM;
1171f008628aSNagadheeraj Rottela 	}
1172f008628aSNagadheeraj Rottela 
1173f008628aSNagadheeraj Rottela 	sr->src.nb_sgls = NITROX_ZIP_SGL_COUNT;
1174f008628aSNagadheeraj Rottela 	sr->src.filled_sgls = 0;
1175f008628aSNagadheeraj Rottela 	sr->dst.nb_sgls = NITROX_ZIP_SGL_COUNT;
1176f008628aSNagadheeraj Rottela 	sr->dst.filled_sgls = 0;
1177f008628aSNagadheeraj Rottela }
1178f008628aSNagadheeraj Rottela 
1179f008628aSNagadheeraj Rottela struct rte_mempool *
1180f008628aSNagadheeraj Rottela nitrox_comp_req_pool_create(struct rte_compressdev *dev, uint32_t nobjs,
1181f008628aSNagadheeraj Rottela 			   uint16_t qp_id, int socket_id)
1182f008628aSNagadheeraj Rottela {
1183f008628aSNagadheeraj Rottela 	char softreq_pool_name[RTE_RING_NAMESIZE];
1184f008628aSNagadheeraj Rottela 	struct rte_mempool *mp;
1185f008628aSNagadheeraj Rottela 	int err = 0;
1186f008628aSNagadheeraj Rottela 
1187f008628aSNagadheeraj Rottela 	snprintf(softreq_pool_name, RTE_RING_NAMESIZE, "%s_sr_%d",
1188f008628aSNagadheeraj Rottela 		 dev->data->name, qp_id);
1189f008628aSNagadheeraj Rottela 	mp = rte_mempool_create(softreq_pool_name,
1190f008628aSNagadheeraj Rottela 				RTE_ALIGN_MUL_CEIL(nobjs, 64),
1191f008628aSNagadheeraj Rottela 				sizeof(struct nitrox_softreq),
1192f008628aSNagadheeraj Rottela 				64, 0, NULL, NULL, req_pool_obj_init, &err,
1193f008628aSNagadheeraj Rottela 				socket_id, 0);
1194f008628aSNagadheeraj Rottela 	if (unlikely(!mp))
1195*e99981afSDavid Marchand 		NITROX_LOG_LINE(ERR, "Failed to create req pool, qid %d, err %d",
1196f008628aSNagadheeraj Rottela 			   qp_id, rte_errno);
1197f008628aSNagadheeraj Rottela 
1198f008628aSNagadheeraj Rottela 	if (unlikely(err)) {
1199f008628aSNagadheeraj Rottela 		nitrox_comp_req_pool_free(mp);
1200f008628aSNagadheeraj Rottela 		return NULL;
1201f008628aSNagadheeraj Rottela 	}
1202f008628aSNagadheeraj Rottela 
1203f008628aSNagadheeraj Rottela 	return mp;
1204f008628aSNagadheeraj Rottela }
1205