xref: /dpdk/app/test/test_compressdev.c (revision d83fb967212efa19d272e7fa65d17c9ad94b17c1)
1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
29df7ffd1STomasz Jozwiak  * Copyright(c) 2018 - 2019 Intel Corporation
3a9de470cSBruce Richardson  */
4a9de470cSBruce Richardson #include <string.h>
5a9de470cSBruce Richardson #include <zlib.h>
6a9de470cSBruce Richardson #include <math.h>
79df7ffd1STomasz Jozwiak #include <stdlib.h>
8890028e2SBruce Richardson #include <unistd.h>
9db06104cSAdam Dybkowski #include <stdio.h>
10a9de470cSBruce Richardson 
11a9de470cSBruce Richardson #include <rte_cycles.h>
12a9de470cSBruce Richardson #include <rte_malloc.h>
13a9de470cSBruce Richardson #include <rte_mempool.h>
14a9de470cSBruce Richardson #include <rte_mbuf.h>
15a9de470cSBruce Richardson #include <rte_compressdev.h>
16a9de470cSBruce Richardson #include <rte_string_fns.h>
17a9de470cSBruce Richardson 
18a9de470cSBruce Richardson #include "test_compressdev_test_buffer.h"
19a9de470cSBruce Richardson #include "test.h"
20a9de470cSBruce Richardson 
21a9de470cSBruce Richardson #define DIV_CEIL(a, b)  ((a) / (b) + ((a) % (b) != 0))
22a9de470cSBruce Richardson 
23a9de470cSBruce Richardson #define DEFAULT_WINDOW_SIZE 15
24a9de470cSBruce Richardson #define DEFAULT_MEM_LEVEL 8
25a9de470cSBruce Richardson #define MAX_DEQD_RETRIES 10
26a9de470cSBruce Richardson #define DEQUEUE_WAIT_TIME 10000
27a9de470cSBruce Richardson 
28a9de470cSBruce Richardson /*
29a9de470cSBruce Richardson  * 30% extra size for compressed data compared to original data,
30a9de470cSBruce Richardson  * in case data size cannot be reduced and it is actually bigger
31a9de470cSBruce Richardson  * due to the compress block headers
32a9de470cSBruce Richardson  */
33a9de470cSBruce Richardson #define COMPRESS_BUF_SIZE_RATIO 1.3
34db06104cSAdam Dybkowski #define COMPRESS_BUF_SIZE_RATIO_DISABLED 1.0
352437fbbcSArtur Trybula #define COMPRESS_BUF_SIZE_RATIO_OVERFLOW 0.2
36a9de470cSBruce Richardson #define NUM_LARGE_MBUFS 16
37a9de470cSBruce Richardson #define SMALL_SEG_SIZE 256
38a9de470cSBruce Richardson #define MAX_SEGS 16
39a9de470cSBruce Richardson #define NUM_OPS 16
40a9de470cSBruce Richardson #define NUM_MAX_XFORMS 16
41a9de470cSBruce Richardson #define NUM_MAX_INFLIGHT_OPS 128
42a9de470cSBruce Richardson #define CACHE_SIZE 0
43a9de470cSBruce Richardson 
44a9de470cSBruce Richardson #define ZLIB_CRC_CHECKSUM_WINDOW_BITS 31
45a9de470cSBruce Richardson #define ZLIB_HEADER_SIZE 2
46a9de470cSBruce Richardson #define ZLIB_TRAILER_SIZE 4
47a9de470cSBruce Richardson #define GZIP_HEADER_SIZE 10
48a9de470cSBruce Richardson #define GZIP_TRAILER_SIZE 8
49a9de470cSBruce Richardson 
50a9de470cSBruce Richardson #define OUT_OF_SPACE_BUF 1
51a9de470cSBruce Richardson 
529df7ffd1STomasz Jozwiak #define MAX_MBUF_SEGMENT_SIZE 65535
539df7ffd1STomasz Jozwiak #define MAX_DATA_MBUF_SIZE (MAX_MBUF_SEGMENT_SIZE - RTE_PKTMBUF_HEADROOM)
54db06104cSAdam Dybkowski #define NUM_BIG_MBUFS (512 + 1)
55db06104cSAdam Dybkowski #define BIG_DATA_TEST_SIZE (MAX_DATA_MBUF_SIZE * 2)
56db06104cSAdam Dybkowski 
57db06104cSAdam Dybkowski /* constants for "im buffer" tests start here */
58db06104cSAdam Dybkowski 
59db06104cSAdam Dybkowski /* number of mbufs lower than number of inflight ops */
60db06104cSAdam Dybkowski #define IM_BUF_NUM_MBUFS 3
61db06104cSAdam Dybkowski /* above threshold (QAT_FALLBACK_THLD) and below max mbuf size */
62db06104cSAdam Dybkowski #define IM_BUF_DATA_TEST_SIZE_LB 59600
63db06104cSAdam Dybkowski /* data size smaller than the queue capacity */
64db06104cSAdam Dybkowski #define IM_BUF_DATA_TEST_SIZE_SGL (MAX_DATA_MBUF_SIZE * IM_BUF_NUM_MBUFS)
65db06104cSAdam Dybkowski /* number of mbufs bigger than number of inflight ops */
66db06104cSAdam Dybkowski #define IM_BUF_NUM_MBUFS_OVER (NUM_MAX_INFLIGHT_OPS + 1)
67db06104cSAdam Dybkowski /* data size bigger than the queue capacity */
68db06104cSAdam Dybkowski #define IM_BUF_DATA_TEST_SIZE_OVER (MAX_DATA_MBUF_SIZE * IM_BUF_NUM_MBUFS_OVER)
69db06104cSAdam Dybkowski /* number of mid-size mbufs */
70db06104cSAdam Dybkowski #define IM_BUF_NUM_MBUFS_MID ((NUM_MAX_INFLIGHT_OPS / 3) + 1)
71db06104cSAdam Dybkowski /* capacity of mid-size mbufs */
72db06104cSAdam Dybkowski #define IM_BUF_DATA_TEST_SIZE_MID (MAX_DATA_MBUF_SIZE * IM_BUF_NUM_MBUFS_MID)
73db06104cSAdam Dybkowski 
749df7ffd1STomasz Jozwiak 
75a9de470cSBruce Richardson const char *
76a9de470cSBruce Richardson huffman_type_strings[] = {
77a9de470cSBruce Richardson 	[RTE_COMP_HUFFMAN_DEFAULT]	= "PMD default",
78a9de470cSBruce Richardson 	[RTE_COMP_HUFFMAN_FIXED]	= "Fixed",
79a9de470cSBruce Richardson 	[RTE_COMP_HUFFMAN_DYNAMIC]	= "Dynamic"
80a9de470cSBruce Richardson };
81a9de470cSBruce Richardson 
82a9de470cSBruce Richardson enum zlib_direction {
83a9de470cSBruce Richardson 	ZLIB_NONE,
84a9de470cSBruce Richardson 	ZLIB_COMPRESS,
85a9de470cSBruce Richardson 	ZLIB_DECOMPRESS,
86a9de470cSBruce Richardson 	ZLIB_ALL
87a9de470cSBruce Richardson };
88a9de470cSBruce Richardson 
89a9de470cSBruce Richardson enum varied_buff {
90a9de470cSBruce Richardson 	LB_BOTH = 0,	/* both input and output are linear*/
91a9de470cSBruce Richardson 	SGL_BOTH,	/* both input and output are chained */
92a9de470cSBruce Richardson 	SGL_TO_LB,	/* input buffer is chained */
93a9de470cSBruce Richardson 	LB_TO_SGL	/* output buffer is chained */
94a9de470cSBruce Richardson };
95a9de470cSBruce Richardson 
962437fbbcSArtur Trybula enum overflow_test {
972437fbbcSArtur Trybula 	OVERFLOW_DISABLED,
982437fbbcSArtur Trybula 	OVERFLOW_ENABLED
992437fbbcSArtur Trybula };
1002437fbbcSArtur Trybula 
101db06104cSAdam Dybkowski enum ratio_switch {
102db06104cSAdam Dybkowski 	RATIO_DISABLED,
103db06104cSAdam Dybkowski 	RATIO_ENABLED
104db06104cSAdam Dybkowski };
105db06104cSAdam Dybkowski 
1066bbc5a92SArtur Trybula enum operation_type {
1076bbc5a92SArtur Trybula 	OPERATION_COMPRESSION,
1086bbc5a92SArtur Trybula 	OPERATION_DECOMPRESSION
1096bbc5a92SArtur Trybula };
1106bbc5a92SArtur Trybula 
111a9de470cSBruce Richardson struct priv_op_data {
112a9de470cSBruce Richardson 	uint16_t orig_idx;
113a9de470cSBruce Richardson };
114a9de470cSBruce Richardson 
115a9de470cSBruce Richardson struct comp_testsuite_params {
116a9de470cSBruce Richardson 	struct rte_mempool *large_mbuf_pool;
117a9de470cSBruce Richardson 	struct rte_mempool *small_mbuf_pool;
1189df7ffd1STomasz Jozwiak 	struct rte_mempool *big_mbuf_pool;
119a9de470cSBruce Richardson 	struct rte_mempool *op_pool;
120a9de470cSBruce Richardson 	struct rte_comp_xform *def_comp_xform;
121a9de470cSBruce Richardson 	struct rte_comp_xform *def_decomp_xform;
122a9de470cSBruce Richardson };
123a9de470cSBruce Richardson 
124a9de470cSBruce Richardson struct interim_data_params {
125a9de470cSBruce Richardson 	const char * const *test_bufs;
126a9de470cSBruce Richardson 	unsigned int num_bufs;
127a9de470cSBruce Richardson 	uint16_t *buf_idx;
128a9de470cSBruce Richardson 	struct rte_comp_xform **compress_xforms;
129a9de470cSBruce Richardson 	struct rte_comp_xform **decompress_xforms;
130a9de470cSBruce Richardson 	unsigned int num_xforms;
131a9de470cSBruce Richardson };
132a9de470cSBruce Richardson 
133a9de470cSBruce Richardson struct test_data_params {
13407b810c5SAdam Dybkowski 	enum rte_comp_op_type compress_state;
13507b810c5SAdam Dybkowski 	enum rte_comp_op_type decompress_state;
136a9de470cSBruce Richardson 	enum varied_buff buff_type;
137a9de470cSBruce Richardson 	enum zlib_direction zlib_dir;
138a9de470cSBruce Richardson 	unsigned int out_of_space;
1399df7ffd1STomasz Jozwiak 	unsigned int big_data;
14007b810c5SAdam Dybkowski 	/* stateful decompression specific parameters */
14107b810c5SAdam Dybkowski 	unsigned int decompress_output_block_size;
14207b810c5SAdam Dybkowski 	unsigned int decompress_steps_max;
1433fc3996fSAdam Dybkowski 	/* external mbufs specific parameters */
1443fc3996fSAdam Dybkowski 	unsigned int use_external_mbufs;
1453fc3996fSAdam Dybkowski 	unsigned int inbuf_data_size;
1463fc3996fSAdam Dybkowski 	const struct rte_memzone *inbuf_memzone;
1473fc3996fSAdam Dybkowski 	const struct rte_memzone *compbuf_memzone;
1483fc3996fSAdam Dybkowski 	const struct rte_memzone *uncompbuf_memzone;
1492437fbbcSArtur Trybula 	/* overflow test activation */
1502437fbbcSArtur Trybula 	enum overflow_test overflow;
151db06104cSAdam Dybkowski 	enum ratio_switch ratio;
152a9de470cSBruce Richardson };
153a9de470cSBruce Richardson 
1546bbc5a92SArtur Trybula struct test_private_arrays {
1556bbc5a92SArtur Trybula 	struct rte_mbuf **uncomp_bufs;
1566bbc5a92SArtur Trybula 	struct rte_mbuf **comp_bufs;
1576bbc5a92SArtur Trybula 	struct rte_comp_op **ops;
1586bbc5a92SArtur Trybula 	struct rte_comp_op **ops_processed;
1596bbc5a92SArtur Trybula 	void **priv_xforms;
1606bbc5a92SArtur Trybula 	uint64_t *compress_checksum;
1616bbc5a92SArtur Trybula 	uint32_t *compressed_data_size;
1626bbc5a92SArtur Trybula 	void **stream;
1636bbc5a92SArtur Trybula 	char **all_decomp_data;
1646bbc5a92SArtur Trybula 	unsigned int *decomp_produced_data_size;
1656bbc5a92SArtur Trybula 	uint16_t num_priv_xforms;
1666bbc5a92SArtur Trybula };
1676bbc5a92SArtur Trybula 
168a9de470cSBruce Richardson static struct comp_testsuite_params testsuite_params = { 0 };
169a9de470cSBruce Richardson 
170db06104cSAdam Dybkowski 
171a9de470cSBruce Richardson static void
testsuite_teardown(void)172a9de470cSBruce Richardson testsuite_teardown(void)
173a9de470cSBruce Richardson {
174a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
175a9de470cSBruce Richardson 
176a9de470cSBruce Richardson 	if (rte_mempool_in_use_count(ts_params->large_mbuf_pool))
177a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Large mbuf pool still has unfreed bufs\n");
178a9de470cSBruce Richardson 	if (rte_mempool_in_use_count(ts_params->small_mbuf_pool))
179a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Small mbuf pool still has unfreed bufs\n");
1809df7ffd1STomasz Jozwiak 	if (rte_mempool_in_use_count(ts_params->big_mbuf_pool))
1819df7ffd1STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Big mbuf pool still has unfreed bufs\n");
182a9de470cSBruce Richardson 	if (rte_mempool_in_use_count(ts_params->op_pool))
183a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "op pool still has unfreed ops\n");
184a9de470cSBruce Richardson 
185a9de470cSBruce Richardson 	rte_mempool_free(ts_params->large_mbuf_pool);
186a9de470cSBruce Richardson 	rte_mempool_free(ts_params->small_mbuf_pool);
1879df7ffd1STomasz Jozwiak 	rte_mempool_free(ts_params->big_mbuf_pool);
188a9de470cSBruce Richardson 	rte_mempool_free(ts_params->op_pool);
189a9de470cSBruce Richardson 	rte_free(ts_params->def_comp_xform);
190a9de470cSBruce Richardson 	rte_free(ts_params->def_decomp_xform);
191a9de470cSBruce Richardson }
192a9de470cSBruce Richardson 
193a9de470cSBruce Richardson static int
testsuite_setup(void)194a9de470cSBruce Richardson testsuite_setup(void)
195a9de470cSBruce Richardson {
196a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
197a9de470cSBruce Richardson 	uint32_t max_buf_size = 0;
198a9de470cSBruce Richardson 	unsigned int i;
199a9de470cSBruce Richardson 
200a9de470cSBruce Richardson 	if (rte_compressdev_count() == 0) {
201e0f4a0edSDavid Marchand 		RTE_LOG(WARNING, USER1, "Need at least one compress device\n");
202e0f4a0edSDavid Marchand 		return TEST_SKIPPED;
203a9de470cSBruce Richardson 	}
204a9de470cSBruce Richardson 
205a9de470cSBruce Richardson 	RTE_LOG(NOTICE, USER1, "Running tests on device %s\n",
206a9de470cSBruce Richardson 				rte_compressdev_name_get(0));
207a9de470cSBruce Richardson 
208a9de470cSBruce Richardson 	for (i = 0; i < RTE_DIM(compress_test_bufs); i++)
209a9de470cSBruce Richardson 		max_buf_size = RTE_MAX(max_buf_size,
210a9de470cSBruce Richardson 				strlen(compress_test_bufs[i]) + 1);
211a9de470cSBruce Richardson 
212a9de470cSBruce Richardson 	/*
213a9de470cSBruce Richardson 	 * Buffers to be used in compression and decompression.
214a9de470cSBruce Richardson 	 * Since decompressed data might be larger than
215a9de470cSBruce Richardson 	 * compressed data (due to block header),
216a9de470cSBruce Richardson 	 * buffers should be big enough for both cases.
217a9de470cSBruce Richardson 	 */
218a9de470cSBruce Richardson 	max_buf_size *= COMPRESS_BUF_SIZE_RATIO;
219a9de470cSBruce Richardson 	ts_params->large_mbuf_pool = rte_pktmbuf_pool_create("large_mbuf_pool",
220a9de470cSBruce Richardson 			NUM_LARGE_MBUFS,
221a9de470cSBruce Richardson 			CACHE_SIZE, 0,
222a9de470cSBruce Richardson 			max_buf_size + RTE_PKTMBUF_HEADROOM,
223a9de470cSBruce Richardson 			rte_socket_id());
224a9de470cSBruce Richardson 	if (ts_params->large_mbuf_pool == NULL) {
225a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Large mbuf pool could not be created\n");
226a9de470cSBruce Richardson 		return TEST_FAILED;
227a9de470cSBruce Richardson 	}
228a9de470cSBruce Richardson 
229a9de470cSBruce Richardson 	/* Create mempool with smaller buffers for SGL testing */
230a9de470cSBruce Richardson 	ts_params->small_mbuf_pool = rte_pktmbuf_pool_create("small_mbuf_pool",
231a9de470cSBruce Richardson 			NUM_LARGE_MBUFS * MAX_SEGS,
232a9de470cSBruce Richardson 			CACHE_SIZE, 0,
233a9de470cSBruce Richardson 			SMALL_SEG_SIZE + RTE_PKTMBUF_HEADROOM,
234a9de470cSBruce Richardson 			rte_socket_id());
235a9de470cSBruce Richardson 	if (ts_params->small_mbuf_pool == NULL) {
236a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Small mbuf pool could not be created\n");
237a9de470cSBruce Richardson 		goto exit;
238a9de470cSBruce Richardson 	}
239a9de470cSBruce Richardson 
2409df7ffd1STomasz Jozwiak 	/* Create mempool with big buffers for SGL testing */
2419df7ffd1STomasz Jozwiak 	ts_params->big_mbuf_pool = rte_pktmbuf_pool_create("big_mbuf_pool",
2429df7ffd1STomasz Jozwiak 			NUM_BIG_MBUFS + 1,
2439df7ffd1STomasz Jozwiak 			CACHE_SIZE, 0,
2449df7ffd1STomasz Jozwiak 			MAX_MBUF_SEGMENT_SIZE,
2459df7ffd1STomasz Jozwiak 			rte_socket_id());
2469df7ffd1STomasz Jozwiak 	if (ts_params->big_mbuf_pool == NULL) {
2479df7ffd1STomasz Jozwiak 		RTE_LOG(ERR, USER1, "Big mbuf pool could not be created\n");
2489df7ffd1STomasz Jozwiak 		goto exit;
2499df7ffd1STomasz Jozwiak 	}
2509df7ffd1STomasz Jozwiak 
251a9de470cSBruce Richardson 	ts_params->op_pool = rte_comp_op_pool_create("op_pool", NUM_OPS,
252a9de470cSBruce Richardson 				0, sizeof(struct priv_op_data),
253a9de470cSBruce Richardson 				rte_socket_id());
254a9de470cSBruce Richardson 	if (ts_params->op_pool == NULL) {
255a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Operation pool could not be created\n");
256a9de470cSBruce Richardson 		goto exit;
257a9de470cSBruce Richardson 	}
258a9de470cSBruce Richardson 
259a9de470cSBruce Richardson 	ts_params->def_comp_xform =
260a9de470cSBruce Richardson 			rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
261a9de470cSBruce Richardson 	if (ts_params->def_comp_xform == NULL) {
262a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1,
263a9de470cSBruce Richardson 			"Default compress xform could not be created\n");
264a9de470cSBruce Richardson 		goto exit;
265a9de470cSBruce Richardson 	}
266a9de470cSBruce Richardson 	ts_params->def_decomp_xform =
267a9de470cSBruce Richardson 			rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
268a9de470cSBruce Richardson 	if (ts_params->def_decomp_xform == NULL) {
269a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1,
270a9de470cSBruce Richardson 			"Default decompress xform could not be created\n");
271a9de470cSBruce Richardson 		goto exit;
272a9de470cSBruce Richardson 	}
273a9de470cSBruce Richardson 
274a9de470cSBruce Richardson 	/* Initializes default values for compress/decompress xforms */
275a9de470cSBruce Richardson 	ts_params->def_comp_xform->type = RTE_COMP_COMPRESS;
276a9de470cSBruce Richardson 	ts_params->def_comp_xform->compress.algo = RTE_COMP_ALGO_DEFLATE,
277a9de470cSBruce Richardson 	ts_params->def_comp_xform->compress.deflate.huffman =
278a9de470cSBruce Richardson 						RTE_COMP_HUFFMAN_DEFAULT;
279a9de470cSBruce Richardson 	ts_params->def_comp_xform->compress.level = RTE_COMP_LEVEL_PMD_DEFAULT;
280a9de470cSBruce Richardson 	ts_params->def_comp_xform->compress.chksum = RTE_COMP_CHECKSUM_NONE;
281a9de470cSBruce Richardson 	ts_params->def_comp_xform->compress.window_size = DEFAULT_WINDOW_SIZE;
282a9de470cSBruce Richardson 
283a9de470cSBruce Richardson 	ts_params->def_decomp_xform->type = RTE_COMP_DECOMPRESS;
284a9de470cSBruce Richardson 	ts_params->def_decomp_xform->decompress.algo = RTE_COMP_ALGO_DEFLATE,
285a9de470cSBruce Richardson 	ts_params->def_decomp_xform->decompress.chksum = RTE_COMP_CHECKSUM_NONE;
286a9de470cSBruce Richardson 	ts_params->def_decomp_xform->decompress.window_size = DEFAULT_WINDOW_SIZE;
287a9de470cSBruce Richardson 
288a9de470cSBruce Richardson 	return TEST_SUCCESS;
289a9de470cSBruce Richardson 
290a9de470cSBruce Richardson exit:
291a9de470cSBruce Richardson 	testsuite_teardown();
292a9de470cSBruce Richardson 
293a9de470cSBruce Richardson 	return TEST_FAILED;
294a9de470cSBruce Richardson }
295a9de470cSBruce Richardson 
296a9de470cSBruce Richardson static int
generic_ut_setup(void)297a9de470cSBruce Richardson generic_ut_setup(void)
298a9de470cSBruce Richardson {
299a9de470cSBruce Richardson 	/* Configure compressdev (one device, one queue pair) */
300a9de470cSBruce Richardson 	struct rte_compressdev_config config = {
301a9de470cSBruce Richardson 		.socket_id = rte_socket_id(),
302a9de470cSBruce Richardson 		.nb_queue_pairs = 1,
303a9de470cSBruce Richardson 		.max_nb_priv_xforms = NUM_MAX_XFORMS,
30407b810c5SAdam Dybkowski 		.max_nb_streams = 1
305a9de470cSBruce Richardson 	};
306a9de470cSBruce Richardson 
307a9de470cSBruce Richardson 	if (rte_compressdev_configure(0, &config) < 0) {
308a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Device configuration failed\n");
309a9de470cSBruce Richardson 		return -1;
310a9de470cSBruce Richardson 	}
311a9de470cSBruce Richardson 
312a9de470cSBruce Richardson 	if (rte_compressdev_queue_pair_setup(0, 0, NUM_MAX_INFLIGHT_OPS,
313a9de470cSBruce Richardson 			rte_socket_id()) < 0) {
314a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Queue pair setup failed\n");
315a9de470cSBruce Richardson 		return -1;
316a9de470cSBruce Richardson 	}
317a9de470cSBruce Richardson 
318a9de470cSBruce Richardson 	if (rte_compressdev_start(0) < 0) {
319a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Device could not be started\n");
320a9de470cSBruce Richardson 		return -1;
321a9de470cSBruce Richardson 	}
322a9de470cSBruce Richardson 
323a9de470cSBruce Richardson 	return 0;
324a9de470cSBruce Richardson }
325a9de470cSBruce Richardson 
326a9de470cSBruce Richardson static void
generic_ut_teardown(void)327a9de470cSBruce Richardson generic_ut_teardown(void)
328a9de470cSBruce Richardson {
329a9de470cSBruce Richardson 	rte_compressdev_stop(0);
330a9de470cSBruce Richardson 	if (rte_compressdev_close(0) < 0)
331a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Device could not be closed\n");
332a9de470cSBruce Richardson }
333a9de470cSBruce Richardson 
334a9de470cSBruce Richardson static int
test_compressdev_invalid_configuration(void)335a9de470cSBruce Richardson test_compressdev_invalid_configuration(void)
336a9de470cSBruce Richardson {
337a9de470cSBruce Richardson 	struct rte_compressdev_config invalid_config;
338a9de470cSBruce Richardson 	struct rte_compressdev_config valid_config = {
339a9de470cSBruce Richardson 		.socket_id = rte_socket_id(),
340a9de470cSBruce Richardson 		.nb_queue_pairs = 1,
341a9de470cSBruce Richardson 		.max_nb_priv_xforms = NUM_MAX_XFORMS,
34207b810c5SAdam Dybkowski 		.max_nb_streams = 1
343a9de470cSBruce Richardson 	};
344a9de470cSBruce Richardson 	struct rte_compressdev_info dev_info;
345a9de470cSBruce Richardson 
346db06104cSAdam Dybkowski 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
347db06104cSAdam Dybkowski 
348a9de470cSBruce Richardson 	/* Invalid configuration with 0 queue pairs */
349a9de470cSBruce Richardson 	memcpy(&invalid_config, &valid_config,
350a9de470cSBruce Richardson 			sizeof(struct rte_compressdev_config));
351a9de470cSBruce Richardson 	invalid_config.nb_queue_pairs = 0;
352a9de470cSBruce Richardson 
353a9de470cSBruce Richardson 	TEST_ASSERT_FAIL(rte_compressdev_configure(0, &invalid_config),
354a9de470cSBruce Richardson 			"Device configuration was successful "
355a9de470cSBruce Richardson 			"with no queue pairs (invalid)\n");
356a9de470cSBruce Richardson 
357a9de470cSBruce Richardson 	/*
358a9de470cSBruce Richardson 	 * Invalid configuration with too many queue pairs
359a9de470cSBruce Richardson 	 * (if there is an actual maximum number of queue pairs)
360a9de470cSBruce Richardson 	 */
361a9de470cSBruce Richardson 	rte_compressdev_info_get(0, &dev_info);
362a9de470cSBruce Richardson 	if (dev_info.max_nb_queue_pairs != 0) {
363a9de470cSBruce Richardson 		memcpy(&invalid_config, &valid_config,
364a9de470cSBruce Richardson 			sizeof(struct rte_compressdev_config));
365a9de470cSBruce Richardson 		invalid_config.nb_queue_pairs = dev_info.max_nb_queue_pairs + 1;
366a9de470cSBruce Richardson 
367a9de470cSBruce Richardson 		TEST_ASSERT_FAIL(rte_compressdev_configure(0, &invalid_config),
368a9de470cSBruce Richardson 				"Device configuration was successful "
369a9de470cSBruce Richardson 				"with too many queue pairs (invalid)\n");
370a9de470cSBruce Richardson 	}
371a9de470cSBruce Richardson 
372a9de470cSBruce Richardson 	/* Invalid queue pair setup, with no number of queue pairs set */
373a9de470cSBruce Richardson 	TEST_ASSERT_FAIL(rte_compressdev_queue_pair_setup(0, 0,
374a9de470cSBruce Richardson 				NUM_MAX_INFLIGHT_OPS, rte_socket_id()),
375a9de470cSBruce Richardson 			"Queue pair setup was successful "
376a9de470cSBruce Richardson 			"with no queue pairs set (invalid)\n");
377a9de470cSBruce Richardson 
378a9de470cSBruce Richardson 	return TEST_SUCCESS;
379a9de470cSBruce Richardson }
380a9de470cSBruce Richardson 
381a9de470cSBruce Richardson static int
compare_buffers(const char * buffer1,uint32_t buffer1_len,const char * buffer2,uint32_t buffer2_len)382a9de470cSBruce Richardson compare_buffers(const char *buffer1, uint32_t buffer1_len,
383a9de470cSBruce Richardson 		const char *buffer2, uint32_t buffer2_len)
384a9de470cSBruce Richardson {
385a9de470cSBruce Richardson 	if (buffer1_len != buffer2_len) {
386a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Buffer lengths are different\n");
387a9de470cSBruce Richardson 		return -1;
388a9de470cSBruce Richardson 	}
389a9de470cSBruce Richardson 
390a9de470cSBruce Richardson 	if (memcmp(buffer1, buffer2, buffer1_len) != 0) {
391a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Buffers are different\n");
392a9de470cSBruce Richardson 		return -1;
393a9de470cSBruce Richardson 	}
394a9de470cSBruce Richardson 
395a9de470cSBruce Richardson 	return 0;
396a9de470cSBruce Richardson }
397a9de470cSBruce Richardson 
398a9de470cSBruce Richardson /*
399a9de470cSBruce Richardson  * Maps compressdev and Zlib flush flags
400a9de470cSBruce Richardson  */
401a9de470cSBruce Richardson static int
map_zlib_flush_flag(enum rte_comp_flush_flag flag)402a9de470cSBruce Richardson map_zlib_flush_flag(enum rte_comp_flush_flag flag)
403a9de470cSBruce Richardson {
404a9de470cSBruce Richardson 	switch (flag) {
405a9de470cSBruce Richardson 	case RTE_COMP_FLUSH_NONE:
406a9de470cSBruce Richardson 		return Z_NO_FLUSH;
407a9de470cSBruce Richardson 	case RTE_COMP_FLUSH_SYNC:
408a9de470cSBruce Richardson 		return Z_SYNC_FLUSH;
409a9de470cSBruce Richardson 	case RTE_COMP_FLUSH_FULL:
410a9de470cSBruce Richardson 		return Z_FULL_FLUSH;
411a9de470cSBruce Richardson 	case RTE_COMP_FLUSH_FINAL:
412a9de470cSBruce Richardson 		return Z_FINISH;
413a9de470cSBruce Richardson 	/*
414a9de470cSBruce Richardson 	 * There should be only the values above,
415a9de470cSBruce Richardson 	 * so this should never happen
416a9de470cSBruce Richardson 	 */
417a9de470cSBruce Richardson 	default:
418a9de470cSBruce Richardson 		return -1;
419a9de470cSBruce Richardson 	}
420a9de470cSBruce Richardson }
421a9de470cSBruce Richardson 
422a9de470cSBruce Richardson static int
compress_zlib(struct rte_comp_op * op,const struct rte_comp_xform * xform,int mem_level)423a9de470cSBruce Richardson compress_zlib(struct rte_comp_op *op,
424a9de470cSBruce Richardson 		const struct rte_comp_xform *xform, int mem_level)
425a9de470cSBruce Richardson {
426a9de470cSBruce Richardson 	z_stream stream;
427a9de470cSBruce Richardson 	int zlib_flush;
428a9de470cSBruce Richardson 	int strategy, window_bits, comp_level;
429a9de470cSBruce Richardson 	int ret = TEST_FAILED;
430a9de470cSBruce Richardson 	uint8_t *single_src_buf = NULL;
431a9de470cSBruce Richardson 	uint8_t *single_dst_buf = NULL;
432a9de470cSBruce Richardson 
433a9de470cSBruce Richardson 	/* initialize zlib stream */
434a9de470cSBruce Richardson 	stream.zalloc = Z_NULL;
435a9de470cSBruce Richardson 	stream.zfree = Z_NULL;
436a9de470cSBruce Richardson 	stream.opaque = Z_NULL;
437a9de470cSBruce Richardson 
438a9de470cSBruce Richardson 	if (xform->compress.deflate.huffman == RTE_COMP_HUFFMAN_FIXED)
439a9de470cSBruce Richardson 		strategy = Z_FIXED;
440a9de470cSBruce Richardson 	else
441a9de470cSBruce Richardson 		strategy = Z_DEFAULT_STRATEGY;
442a9de470cSBruce Richardson 
443a9de470cSBruce Richardson 	/*
444a9de470cSBruce Richardson 	 * Window bits is the base two logarithm of the window size (in bytes).
445a9de470cSBruce Richardson 	 * When doing raw DEFLATE, this number will be negative.
446a9de470cSBruce Richardson 	 */
447a9de470cSBruce Richardson 	window_bits = -(xform->compress.window_size);
448a9de470cSBruce Richardson 	if (xform->compress.chksum == RTE_COMP_CHECKSUM_ADLER32)
449a9de470cSBruce Richardson 		window_bits *= -1;
450a9de470cSBruce Richardson 	else if (xform->compress.chksum == RTE_COMP_CHECKSUM_CRC32)
451a9de470cSBruce Richardson 		window_bits = ZLIB_CRC_CHECKSUM_WINDOW_BITS;
452a9de470cSBruce Richardson 
453a9de470cSBruce Richardson 	comp_level = xform->compress.level;
454a9de470cSBruce Richardson 
455a9de470cSBruce Richardson 	if (comp_level != RTE_COMP_LEVEL_NONE)
456a9de470cSBruce Richardson 		ret = deflateInit2(&stream, comp_level, Z_DEFLATED,
457a9de470cSBruce Richardson 			window_bits, mem_level, strategy);
458a9de470cSBruce Richardson 	else
459a9de470cSBruce Richardson 		ret = deflateInit(&stream, Z_NO_COMPRESSION);
460a9de470cSBruce Richardson 
461a9de470cSBruce Richardson 	if (ret != Z_OK) {
462a9de470cSBruce Richardson 		printf("Zlib deflate could not be initialized\n");
463a9de470cSBruce Richardson 		goto exit;
464a9de470cSBruce Richardson 	}
465a9de470cSBruce Richardson 
466a9de470cSBruce Richardson 	/* Assuming stateless operation */
467a9de470cSBruce Richardson 	/* SGL Input */
468a9de470cSBruce Richardson 	if (op->m_src->nb_segs > 1) {
469a9de470cSBruce Richardson 		single_src_buf = rte_malloc(NULL,
470a9de470cSBruce Richardson 				rte_pktmbuf_pkt_len(op->m_src), 0);
471a9de470cSBruce Richardson 		if (single_src_buf == NULL) {
472a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "Buffer could not be allocated\n");
473a9de470cSBruce Richardson 			goto exit;
474a9de470cSBruce Richardson 		}
475a9de470cSBruce Richardson 
476a9de470cSBruce Richardson 		if (rte_pktmbuf_read(op->m_src, op->src.offset,
477a9de470cSBruce Richardson 					rte_pktmbuf_pkt_len(op->m_src) -
478a9de470cSBruce Richardson 					op->src.offset,
479a9de470cSBruce Richardson 					single_src_buf) == NULL) {
480a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
481a9de470cSBruce Richardson 				"Buffer could not be read entirely\n");
482a9de470cSBruce Richardson 			goto exit;
483a9de470cSBruce Richardson 		}
484a9de470cSBruce Richardson 
485a9de470cSBruce Richardson 		stream.avail_in = op->src.length;
486a9de470cSBruce Richardson 		stream.next_in = single_src_buf;
487a9de470cSBruce Richardson 
488a9de470cSBruce Richardson 	} else {
489a9de470cSBruce Richardson 		stream.avail_in = op->src.length;
490a9de470cSBruce Richardson 		stream.next_in = rte_pktmbuf_mtod_offset(op->m_src, uint8_t *,
491a9de470cSBruce Richardson 				op->src.offset);
492a9de470cSBruce Richardson 	}
493a9de470cSBruce Richardson 	/* SGL output */
494a9de470cSBruce Richardson 	if (op->m_dst->nb_segs > 1) {
495a9de470cSBruce Richardson 
496a9de470cSBruce Richardson 		single_dst_buf = rte_malloc(NULL,
497a9de470cSBruce Richardson 				rte_pktmbuf_pkt_len(op->m_dst), 0);
498a9de470cSBruce Richardson 			if (single_dst_buf == NULL) {
499a9de470cSBruce Richardson 				RTE_LOG(ERR, USER1,
500a9de470cSBruce Richardson 					"Buffer could not be allocated\n");
501a9de470cSBruce Richardson 			goto exit;
502a9de470cSBruce Richardson 		}
503a9de470cSBruce Richardson 
504a9de470cSBruce Richardson 		stream.avail_out = op->m_dst->pkt_len;
505a9de470cSBruce Richardson 		stream.next_out = single_dst_buf;
506a9de470cSBruce Richardson 
507a9de470cSBruce Richardson 	} else {/* linear output */
508a9de470cSBruce Richardson 		stream.avail_out = op->m_dst->data_len;
509a9de470cSBruce Richardson 		stream.next_out = rte_pktmbuf_mtod_offset(op->m_dst, uint8_t *,
510a9de470cSBruce Richardson 				op->dst.offset);
511a9de470cSBruce Richardson 	}
512a9de470cSBruce Richardson 
513a9de470cSBruce Richardson 	/* Stateless operation, all buffer will be compressed in one go */
514a9de470cSBruce Richardson 	zlib_flush = map_zlib_flush_flag(op->flush_flag);
515a9de470cSBruce Richardson 	ret = deflate(&stream, zlib_flush);
516a9de470cSBruce Richardson 
517a9de470cSBruce Richardson 	if (stream.avail_in != 0) {
518a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Buffer could not be read entirely\n");
519a9de470cSBruce Richardson 		goto exit;
520a9de470cSBruce Richardson 	}
521a9de470cSBruce Richardson 
522a9de470cSBruce Richardson 	if (ret != Z_STREAM_END)
523a9de470cSBruce Richardson 		goto exit;
524a9de470cSBruce Richardson 
525a9de470cSBruce Richardson 	/* Copy data to destination SGL */
526a9de470cSBruce Richardson 	if (op->m_dst->nb_segs > 1) {
527a9de470cSBruce Richardson 		uint32_t remaining_data = stream.total_out;
528a9de470cSBruce Richardson 		uint8_t *src_data = single_dst_buf;
529a9de470cSBruce Richardson 		struct rte_mbuf *dst_buf = op->m_dst;
530a9de470cSBruce Richardson 
531a9de470cSBruce Richardson 		while (remaining_data > 0) {
532a9de470cSBruce Richardson 			uint8_t *dst_data = rte_pktmbuf_mtod_offset(dst_buf,
533a9de470cSBruce Richardson 						uint8_t *, op->dst.offset);
534a9de470cSBruce Richardson 			/* Last segment */
535a9de470cSBruce Richardson 			if (remaining_data < dst_buf->data_len) {
536a9de470cSBruce Richardson 				memcpy(dst_data, src_data, remaining_data);
537a9de470cSBruce Richardson 				remaining_data = 0;
538a9de470cSBruce Richardson 			} else {
539a9de470cSBruce Richardson 				memcpy(dst_data, src_data, dst_buf->data_len);
540a9de470cSBruce Richardson 				remaining_data -= dst_buf->data_len;
541a9de470cSBruce Richardson 				src_data += dst_buf->data_len;
542a9de470cSBruce Richardson 				dst_buf = dst_buf->next;
543a9de470cSBruce Richardson 			}
544a9de470cSBruce Richardson 		}
545a9de470cSBruce Richardson 	}
546a9de470cSBruce Richardson 
547a9de470cSBruce Richardson 	op->consumed = stream.total_in;
548a9de470cSBruce Richardson 	if (xform->compress.chksum == RTE_COMP_CHECKSUM_ADLER32) {
549a9de470cSBruce Richardson 		rte_pktmbuf_adj(op->m_dst, ZLIB_HEADER_SIZE);
550a9de470cSBruce Richardson 		rte_pktmbuf_trim(op->m_dst, ZLIB_TRAILER_SIZE);
551a9de470cSBruce Richardson 		op->produced = stream.total_out - (ZLIB_HEADER_SIZE +
552a9de470cSBruce Richardson 				ZLIB_TRAILER_SIZE);
553a9de470cSBruce Richardson 	} else if (xform->compress.chksum == RTE_COMP_CHECKSUM_CRC32) {
554a9de470cSBruce Richardson 		rte_pktmbuf_adj(op->m_dst, GZIP_HEADER_SIZE);
555a9de470cSBruce Richardson 		rte_pktmbuf_trim(op->m_dst, GZIP_TRAILER_SIZE);
556a9de470cSBruce Richardson 		op->produced = stream.total_out - (GZIP_HEADER_SIZE +
557a9de470cSBruce Richardson 				GZIP_TRAILER_SIZE);
558a9de470cSBruce Richardson 	} else
559a9de470cSBruce Richardson 		op->produced = stream.total_out;
560a9de470cSBruce Richardson 
561a9de470cSBruce Richardson 	op->status = RTE_COMP_OP_STATUS_SUCCESS;
562a9de470cSBruce Richardson 	op->output_chksum = stream.adler;
563a9de470cSBruce Richardson 
564a9de470cSBruce Richardson 	deflateReset(&stream);
565a9de470cSBruce Richardson 
566a9de470cSBruce Richardson 	ret = 0;
567a9de470cSBruce Richardson exit:
568a9de470cSBruce Richardson 	deflateEnd(&stream);
569a9de470cSBruce Richardson 	rte_free(single_src_buf);
570a9de470cSBruce Richardson 	rte_free(single_dst_buf);
571a9de470cSBruce Richardson 
572a9de470cSBruce Richardson 	return ret;
573a9de470cSBruce Richardson }
574a9de470cSBruce Richardson 
575a9de470cSBruce Richardson static int
decompress_zlib(struct rte_comp_op * op,const struct rte_comp_xform * xform)576a9de470cSBruce Richardson decompress_zlib(struct rte_comp_op *op,
577a9de470cSBruce Richardson 		const struct rte_comp_xform *xform)
578a9de470cSBruce Richardson {
579a9de470cSBruce Richardson 	z_stream stream;
580a9de470cSBruce Richardson 	int window_bits;
581a9de470cSBruce Richardson 	int zlib_flush;
582a9de470cSBruce Richardson 	int ret = TEST_FAILED;
583a9de470cSBruce Richardson 	uint8_t *single_src_buf = NULL;
584a9de470cSBruce Richardson 	uint8_t *single_dst_buf = NULL;
585a9de470cSBruce Richardson 
586a9de470cSBruce Richardson 	/* initialize zlib stream */
587a9de470cSBruce Richardson 	stream.zalloc = Z_NULL;
588a9de470cSBruce Richardson 	stream.zfree = Z_NULL;
589a9de470cSBruce Richardson 	stream.opaque = Z_NULL;
590a9de470cSBruce Richardson 
591a9de470cSBruce Richardson 	/*
592a9de470cSBruce Richardson 	 * Window bits is the base two logarithm of the window size (in bytes).
593a9de470cSBruce Richardson 	 * When doing raw DEFLATE, this number will be negative.
594a9de470cSBruce Richardson 	 */
595a9de470cSBruce Richardson 	window_bits = -(xform->decompress.window_size);
596a9de470cSBruce Richardson 	ret = inflateInit2(&stream, window_bits);
597a9de470cSBruce Richardson 
598a9de470cSBruce Richardson 	if (ret != Z_OK) {
599a9de470cSBruce Richardson 		printf("Zlib deflate could not be initialized\n");
600a9de470cSBruce Richardson 		goto exit;
601a9de470cSBruce Richardson 	}
602a9de470cSBruce Richardson 
603a9de470cSBruce Richardson 	/* Assuming stateless operation */
604a9de470cSBruce Richardson 	/* SGL */
605a9de470cSBruce Richardson 	if (op->m_src->nb_segs > 1) {
606a9de470cSBruce Richardson 		single_src_buf = rte_malloc(NULL,
607a9de470cSBruce Richardson 				rte_pktmbuf_pkt_len(op->m_src), 0);
608a9de470cSBruce Richardson 		if (single_src_buf == NULL) {
609a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "Buffer could not be allocated\n");
610a9de470cSBruce Richardson 			goto exit;
611a9de470cSBruce Richardson 		}
612a9de470cSBruce Richardson 		single_dst_buf = rte_malloc(NULL,
613a9de470cSBruce Richardson 				rte_pktmbuf_pkt_len(op->m_dst), 0);
614a9de470cSBruce Richardson 		if (single_dst_buf == NULL) {
615a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "Buffer could not be allocated\n");
616a9de470cSBruce Richardson 			goto exit;
617a9de470cSBruce Richardson 		}
618a9de470cSBruce Richardson 		if (rte_pktmbuf_read(op->m_src, 0,
619a9de470cSBruce Richardson 					rte_pktmbuf_pkt_len(op->m_src),
620a9de470cSBruce Richardson 					single_src_buf) == NULL) {
621a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
622a9de470cSBruce Richardson 				"Buffer could not be read entirely\n");
623a9de470cSBruce Richardson 			goto exit;
624a9de470cSBruce Richardson 		}
625a9de470cSBruce Richardson 
626a9de470cSBruce Richardson 		stream.avail_in = op->src.length;
627a9de470cSBruce Richardson 		stream.next_in = single_src_buf;
628a9de470cSBruce Richardson 		stream.avail_out = rte_pktmbuf_pkt_len(op->m_dst);
629a9de470cSBruce Richardson 		stream.next_out = single_dst_buf;
630a9de470cSBruce Richardson 
631a9de470cSBruce Richardson 	} else {
632a9de470cSBruce Richardson 		stream.avail_in = op->src.length;
633a9de470cSBruce Richardson 		stream.next_in = rte_pktmbuf_mtod(op->m_src, uint8_t *);
634a9de470cSBruce Richardson 		stream.avail_out = op->m_dst->data_len;
635a9de470cSBruce Richardson 		stream.next_out = rte_pktmbuf_mtod(op->m_dst, uint8_t *);
636a9de470cSBruce Richardson 	}
637a9de470cSBruce Richardson 
638a9de470cSBruce Richardson 	/* Stateless operation, all buffer will be compressed in one go */
639a9de470cSBruce Richardson 	zlib_flush = map_zlib_flush_flag(op->flush_flag);
640a9de470cSBruce Richardson 	ret = inflate(&stream, zlib_flush);
641a9de470cSBruce Richardson 
642a9de470cSBruce Richardson 	if (stream.avail_in != 0) {
643a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Buffer could not be read entirely\n");
644a9de470cSBruce Richardson 		goto exit;
645a9de470cSBruce Richardson 	}
646a9de470cSBruce Richardson 
647a9de470cSBruce Richardson 	if (ret != Z_STREAM_END)
648a9de470cSBruce Richardson 		goto exit;
649a9de470cSBruce Richardson 
650a9de470cSBruce Richardson 	if (op->m_src->nb_segs > 1) {
651a9de470cSBruce Richardson 		uint32_t remaining_data = stream.total_out;
652a9de470cSBruce Richardson 		uint8_t *src_data = single_dst_buf;
653a9de470cSBruce Richardson 		struct rte_mbuf *dst_buf = op->m_dst;
654a9de470cSBruce Richardson 
655a9de470cSBruce Richardson 		while (remaining_data > 0) {
656a9de470cSBruce Richardson 			uint8_t *dst_data = rte_pktmbuf_mtod(dst_buf,
657a9de470cSBruce Richardson 					uint8_t *);
658a9de470cSBruce Richardson 			/* Last segment */
659a9de470cSBruce Richardson 			if (remaining_data < dst_buf->data_len) {
660a9de470cSBruce Richardson 				memcpy(dst_data, src_data, remaining_data);
661a9de470cSBruce Richardson 				remaining_data = 0;
662a9de470cSBruce Richardson 			} else {
663a9de470cSBruce Richardson 				memcpy(dst_data, src_data, dst_buf->data_len);
664a9de470cSBruce Richardson 				remaining_data -= dst_buf->data_len;
665a9de470cSBruce Richardson 				src_data += dst_buf->data_len;
666a9de470cSBruce Richardson 				dst_buf = dst_buf->next;
667a9de470cSBruce Richardson 			}
668a9de470cSBruce Richardson 		}
669a9de470cSBruce Richardson 	}
670a9de470cSBruce Richardson 
671a9de470cSBruce Richardson 	op->consumed = stream.total_in;
672a9de470cSBruce Richardson 	op->produced = stream.total_out;
673a9de470cSBruce Richardson 	op->status = RTE_COMP_OP_STATUS_SUCCESS;
674a9de470cSBruce Richardson 
675a9de470cSBruce Richardson 	inflateReset(&stream);
676a9de470cSBruce Richardson 
677a9de470cSBruce Richardson 	ret = 0;
678a9de470cSBruce Richardson exit:
679a9de470cSBruce Richardson 	inflateEnd(&stream);
680a9de470cSBruce Richardson 
681a9de470cSBruce Richardson 	return ret;
682a9de470cSBruce Richardson }
683a9de470cSBruce Richardson 
684a9de470cSBruce Richardson static int
prepare_sgl_bufs(const char * test_buf,struct rte_mbuf * head_buf,uint32_t total_data_size,struct rte_mempool * small_mbuf_pool,struct rte_mempool * large_mbuf_pool,uint8_t limit_segs_in_sgl,uint16_t seg_size)685a9de470cSBruce Richardson prepare_sgl_bufs(const char *test_buf, struct rte_mbuf *head_buf,
686a9de470cSBruce Richardson 		uint32_t total_data_size,
687a9de470cSBruce Richardson 		struct rte_mempool *small_mbuf_pool,
688a9de470cSBruce Richardson 		struct rte_mempool *large_mbuf_pool,
6899df7ffd1STomasz Jozwiak 		uint8_t limit_segs_in_sgl,
6909df7ffd1STomasz Jozwiak 		uint16_t seg_size)
691a9de470cSBruce Richardson {
692a9de470cSBruce Richardson 	uint32_t remaining_data = total_data_size;
6939df7ffd1STomasz Jozwiak 	uint16_t num_remaining_segs = DIV_CEIL(remaining_data, seg_size);
694a9de470cSBruce Richardson 	struct rte_mempool *pool;
695a9de470cSBruce Richardson 	struct rte_mbuf *next_seg;
696a9de470cSBruce Richardson 	uint32_t data_size;
697a9de470cSBruce Richardson 	char *buf_ptr;
698a9de470cSBruce Richardson 	const char *data_ptr = test_buf;
699a9de470cSBruce Richardson 	uint16_t i;
700a9de470cSBruce Richardson 	int ret;
701a9de470cSBruce Richardson 
702a9de470cSBruce Richardson 	if (limit_segs_in_sgl != 0 && num_remaining_segs > limit_segs_in_sgl)
703a9de470cSBruce Richardson 		num_remaining_segs = limit_segs_in_sgl - 1;
704a9de470cSBruce Richardson 
705a9de470cSBruce Richardson 	/*
706a9de470cSBruce Richardson 	 * Allocate data in the first segment (header) and
707a9de470cSBruce Richardson 	 * copy data if test buffer is provided
708a9de470cSBruce Richardson 	 */
7099df7ffd1STomasz Jozwiak 	if (remaining_data < seg_size)
710a9de470cSBruce Richardson 		data_size = remaining_data;
711a9de470cSBruce Richardson 	else
7129df7ffd1STomasz Jozwiak 		data_size = seg_size;
7136bbc5a92SArtur Trybula 
714a9de470cSBruce Richardson 	buf_ptr = rte_pktmbuf_append(head_buf, data_size);
715a9de470cSBruce Richardson 	if (buf_ptr == NULL) {
716a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1,
717a9de470cSBruce Richardson 			"Not enough space in the 1st buffer\n");
718a9de470cSBruce Richardson 		return -1;
719a9de470cSBruce Richardson 	}
720a9de470cSBruce Richardson 
721a9de470cSBruce Richardson 	if (data_ptr != NULL) {
722a9de470cSBruce Richardson 		/* Copy characters without NULL terminator */
723db06104cSAdam Dybkowski 		memcpy(buf_ptr, data_ptr, data_size);
724a9de470cSBruce Richardson 		data_ptr += data_size;
725a9de470cSBruce Richardson 	}
726a9de470cSBruce Richardson 	remaining_data -= data_size;
727a9de470cSBruce Richardson 	num_remaining_segs--;
728a9de470cSBruce Richardson 
729a9de470cSBruce Richardson 	/*
730a9de470cSBruce Richardson 	 * Allocate the rest of the segments,
731a9de470cSBruce Richardson 	 * copy the rest of the data and chain the segments.
732a9de470cSBruce Richardson 	 */
733a9de470cSBruce Richardson 	for (i = 0; i < num_remaining_segs; i++) {
734a9de470cSBruce Richardson 
735a9de470cSBruce Richardson 		if (i == (num_remaining_segs - 1)) {
736a9de470cSBruce Richardson 			/* last segment */
7379df7ffd1STomasz Jozwiak 			if (remaining_data > seg_size)
738a9de470cSBruce Richardson 				pool = large_mbuf_pool;
739a9de470cSBruce Richardson 			else
740a9de470cSBruce Richardson 				pool = small_mbuf_pool;
741a9de470cSBruce Richardson 			data_size = remaining_data;
742a9de470cSBruce Richardson 		} else {
7439df7ffd1STomasz Jozwiak 			data_size = seg_size;
744a9de470cSBruce Richardson 			pool = small_mbuf_pool;
745a9de470cSBruce Richardson 		}
746a9de470cSBruce Richardson 
747a9de470cSBruce Richardson 		next_seg = rte_pktmbuf_alloc(pool);
748a9de470cSBruce Richardson 		if (next_seg == NULL) {
749a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
750a9de470cSBruce Richardson 				"New segment could not be allocated "
751a9de470cSBruce Richardson 				"from the mempool\n");
752a9de470cSBruce Richardson 			return -1;
753a9de470cSBruce Richardson 		}
754a9de470cSBruce Richardson 		buf_ptr = rte_pktmbuf_append(next_seg, data_size);
755a9de470cSBruce Richardson 		if (buf_ptr == NULL) {
756a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
757a9de470cSBruce Richardson 				"Not enough space in the buffer\n");
758a9de470cSBruce Richardson 			rte_pktmbuf_free(next_seg);
759a9de470cSBruce Richardson 			return -1;
760a9de470cSBruce Richardson 		}
761a9de470cSBruce Richardson 		if (data_ptr != NULL) {
762a9de470cSBruce Richardson 			/* Copy characters without NULL terminator */
763db06104cSAdam Dybkowski 			memcpy(buf_ptr, data_ptr, data_size);
764a9de470cSBruce Richardson 			data_ptr += data_size;
765a9de470cSBruce Richardson 		}
766a9de470cSBruce Richardson 		remaining_data -= data_size;
767a9de470cSBruce Richardson 
768a9de470cSBruce Richardson 		ret = rte_pktmbuf_chain(head_buf, next_seg);
769a9de470cSBruce Richardson 		if (ret != 0) {
770a9de470cSBruce Richardson 			rte_pktmbuf_free(next_seg);
771a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
772a9de470cSBruce Richardson 				"Segment could not chained\n");
773a9de470cSBruce Richardson 			return -1;
774a9de470cSBruce Richardson 		}
775a9de470cSBruce Richardson 	}
776a9de470cSBruce Richardson 
777a9de470cSBruce Richardson 	return 0;
778a9de470cSBruce Richardson }
779a9de470cSBruce Richardson 
7803fc3996fSAdam Dybkowski static void
extbuf_free_callback(void * addr __rte_unused,void * opaque __rte_unused)7813fc3996fSAdam Dybkowski extbuf_free_callback(void *addr __rte_unused, void *opaque __rte_unused)
7823fc3996fSAdam Dybkowski {
7833fc3996fSAdam Dybkowski }
7843fc3996fSAdam Dybkowski 
7852437fbbcSArtur Trybula static int
test_run_enqueue_dequeue(struct rte_comp_op ** ops,struct rte_comp_op ** ops_processed,unsigned int num_bufs)7866bbc5a92SArtur Trybula test_run_enqueue_dequeue(struct rte_comp_op **ops,
7876bbc5a92SArtur Trybula 			 struct rte_comp_op **ops_processed,
7886bbc5a92SArtur Trybula 			 unsigned int num_bufs)
7892437fbbcSArtur Trybula {
7902437fbbcSArtur Trybula 	uint16_t num_enqd, num_deqd, num_total_deqd;
7912437fbbcSArtur Trybula 	unsigned int deqd_retries = 0;
792db06104cSAdam Dybkowski 	int res = 0;
7932437fbbcSArtur Trybula 
7942437fbbcSArtur Trybula 	/* Enqueue and dequeue all operations */
7952437fbbcSArtur Trybula 	num_enqd = rte_compressdev_enqueue_burst(0, 0, ops, num_bufs);
7962437fbbcSArtur Trybula 	if (num_enqd < num_bufs) {
7972437fbbcSArtur Trybula 		RTE_LOG(ERR, USER1,
7982437fbbcSArtur Trybula 			"Some operations could not be enqueued\n");
799db06104cSAdam Dybkowski 		res = -1;
8002437fbbcSArtur Trybula 	}
8012437fbbcSArtur Trybula 
802db06104cSAdam Dybkowski 	/* dequeue ops even on error (same number of ops as was enqueued) */
803db06104cSAdam Dybkowski 
8042437fbbcSArtur Trybula 	num_total_deqd = 0;
805db06104cSAdam Dybkowski 	while (num_total_deqd < num_enqd) {
8062437fbbcSArtur Trybula 		/*
8072437fbbcSArtur Trybula 		 * If retrying a dequeue call, wait for 10 ms to allow
8082437fbbcSArtur Trybula 		 * enough time to the driver to process the operations
8092437fbbcSArtur Trybula 		 */
8102437fbbcSArtur Trybula 		if (deqd_retries != 0) {
8112437fbbcSArtur Trybula 			/*
8122437fbbcSArtur Trybula 			 * Avoid infinite loop if not all the
8132437fbbcSArtur Trybula 			 * operations get out of the device
8142437fbbcSArtur Trybula 			 */
8152437fbbcSArtur Trybula 			if (deqd_retries == MAX_DEQD_RETRIES) {
8162437fbbcSArtur Trybula 				RTE_LOG(ERR, USER1,
8172437fbbcSArtur Trybula 					"Not all operations could be dequeued\n");
818db06104cSAdam Dybkowski 				res = -1;
819db06104cSAdam Dybkowski 				break;
8202437fbbcSArtur Trybula 			}
8212437fbbcSArtur Trybula 			usleep(DEQUEUE_WAIT_TIME);
8222437fbbcSArtur Trybula 		}
8232437fbbcSArtur Trybula 		num_deqd = rte_compressdev_dequeue_burst(0, 0,
8242437fbbcSArtur Trybula 				&ops_processed[num_total_deqd], num_bufs);
8252437fbbcSArtur Trybula 		num_total_deqd += num_deqd;
8262437fbbcSArtur Trybula 		deqd_retries++;
8272437fbbcSArtur Trybula 
828db06104cSAdam Dybkowski 	}
8292437fbbcSArtur Trybula 
830db06104cSAdam Dybkowski 	return res;
8312437fbbcSArtur Trybula }
8322437fbbcSArtur Trybula 
8336bbc5a92SArtur Trybula /**
8346bbc5a92SArtur Trybula  * Arrays initialization. Input buffers preparation for compression.
8356bbc5a92SArtur Trybula  *
8366bbc5a92SArtur Trybula  * API that initializes all the private arrays to NULL
8376bbc5a92SArtur Trybula  * and allocates input buffers to perform compression operations.
8386bbc5a92SArtur Trybula  *
8396bbc5a92SArtur Trybula  * @param int_data
8406bbc5a92SArtur Trybula  *   Interim data containing session/transformation objects.
8416bbc5a92SArtur Trybula  * @param test_data
8426bbc5a92SArtur Trybula  *   The test parameters set by users (command line parameters).
8436bbc5a92SArtur Trybula  * @param test_priv_data
8446bbc5a92SArtur Trybula  *   A container used for aggregation all the private test arrays.
8456bbc5a92SArtur Trybula  * @return
8466bbc5a92SArtur Trybula  *   - 0: On success.
8476bbc5a92SArtur Trybula  *   - -1: On error.
848a9de470cSBruce Richardson  */
849a9de470cSBruce Richardson static int
test_setup_com_bufs(const struct interim_data_params * int_data,const struct test_data_params * test_data,const struct test_private_arrays * test_priv_data)8506bbc5a92SArtur Trybula test_setup_com_bufs(const struct interim_data_params *int_data,
8516bbc5a92SArtur Trybula 		const struct test_data_params *test_data,
8526bbc5a92SArtur Trybula 		const struct test_private_arrays *test_priv_data)
853a9de470cSBruce Richardson {
8546bbc5a92SArtur Trybula 	/* local variables: */
8556bbc5a92SArtur Trybula 	unsigned int i;
8566bbc5a92SArtur Trybula 	uint32_t data_size;
8576bbc5a92SArtur Trybula 	char *buf_ptr;
8586bbc5a92SArtur Trybula 	int ret;
8596bbc5a92SArtur Trybula 	char **all_decomp_data = test_priv_data->all_decomp_data;
8606bbc5a92SArtur Trybula 
861a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
8626bbc5a92SArtur Trybula 
8636bbc5a92SArtur Trybula 	/* from int_data: */
864a9de470cSBruce Richardson 	const char * const *test_bufs = int_data->test_bufs;
865a9de470cSBruce Richardson 	unsigned int num_bufs = int_data->num_bufs;
8666bbc5a92SArtur Trybula 
8676bbc5a92SArtur Trybula 	/* from test_data: */
868a9de470cSBruce Richardson 	unsigned int buff_type = test_data->buff_type;
8699df7ffd1STomasz Jozwiak 	unsigned int big_data = test_data->big_data;
8706bbc5a92SArtur Trybula 
8716bbc5a92SArtur Trybula 	/* from test_priv_data: */
8726bbc5a92SArtur Trybula 	struct rte_mbuf **uncomp_bufs = test_priv_data->uncomp_bufs;
873a9de470cSBruce Richardson 	struct rte_mempool *buf_pool;
87407b810c5SAdam Dybkowski 
8756bbc5a92SArtur Trybula 	static struct rte_mbuf_ext_shared_info inbuf_info;
876a9de470cSBruce Richardson 
8776bbc5a92SArtur Trybula 	size_t array_size = sizeof(void *) * num_bufs;
87898af2ecaSAdam Dybkowski 
879a9de470cSBruce Richardson 	/* Initialize all arrays to NULL */
8806bbc5a92SArtur Trybula 	memset(test_priv_data->uncomp_bufs, 0, array_size);
8816bbc5a92SArtur Trybula 	memset(test_priv_data->comp_bufs, 0, array_size);
8826bbc5a92SArtur Trybula 	memset(test_priv_data->ops, 0, array_size);
8836bbc5a92SArtur Trybula 	memset(test_priv_data->ops_processed, 0, array_size);
8846bbc5a92SArtur Trybula 	memset(test_priv_data->priv_xforms, 0, array_size);
8856bbc5a92SArtur Trybula 	memset(test_priv_data->compressed_data_size,
8866bbc5a92SArtur Trybula 	       0, sizeof(uint32_t) * num_bufs);
887a9de470cSBruce Richardson 
8886bbc5a92SArtur Trybula 	if (test_data->decompress_state == RTE_COMP_OP_STATEFUL) {
88907b810c5SAdam Dybkowski 		data_size = strlen(test_bufs[0]) + 1;
8906bbc5a92SArtur Trybula 		*all_decomp_data = rte_malloc(NULL, data_size,
89107b810c5SAdam Dybkowski 					     RTE_CACHE_LINE_SIZE);
89207b810c5SAdam Dybkowski 	}
89307b810c5SAdam Dybkowski 
8949df7ffd1STomasz Jozwiak 	if (big_data)
8959df7ffd1STomasz Jozwiak 		buf_pool = ts_params->big_mbuf_pool;
8969df7ffd1STomasz Jozwiak 	else if (buff_type == SGL_BOTH)
897a9de470cSBruce Richardson 		buf_pool = ts_params->small_mbuf_pool;
898a9de470cSBruce Richardson 	else
899a9de470cSBruce Richardson 		buf_pool = ts_params->large_mbuf_pool;
900a9de470cSBruce Richardson 
9016bbc5a92SArtur Trybula 	/* for compression uncomp_bufs is used as a source buffer */
9026bbc5a92SArtur Trybula 	/* allocation from buf_pool (mempool type) */
903a9de470cSBruce Richardson 	ret = rte_pktmbuf_alloc_bulk(buf_pool,
904a9de470cSBruce Richardson 				uncomp_bufs, num_bufs);
905a9de470cSBruce Richardson 	if (ret < 0) {
906a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1,
907a9de470cSBruce Richardson 			"Source mbufs could not be allocated "
908a9de470cSBruce Richardson 			"from the mempool\n");
9096bbc5a92SArtur Trybula 		return -1;
910a9de470cSBruce Richardson 	}
911a9de470cSBruce Richardson 
9123fc3996fSAdam Dybkowski 	if (test_data->use_external_mbufs) {
9133fc3996fSAdam Dybkowski 		inbuf_info.free_cb = extbuf_free_callback;
9143fc3996fSAdam Dybkowski 		inbuf_info.fcb_opaque = NULL;
9153fc3996fSAdam Dybkowski 		rte_mbuf_ext_refcnt_set(&inbuf_info, 1);
9163fc3996fSAdam Dybkowski 		for (i = 0; i < num_bufs; i++) {
9173fc3996fSAdam Dybkowski 			rte_pktmbuf_attach_extbuf(uncomp_bufs[i],
9183fc3996fSAdam Dybkowski 					test_data->inbuf_memzone->addr,
9193fc3996fSAdam Dybkowski 					test_data->inbuf_memzone->iova,
9203fc3996fSAdam Dybkowski 					test_data->inbuf_data_size,
9213fc3996fSAdam Dybkowski 					&inbuf_info);
9226bbc5a92SArtur Trybula 			buf_ptr = rte_pktmbuf_append(uncomp_bufs[i],
9233fc3996fSAdam Dybkowski 					test_data->inbuf_data_size);
9246bbc5a92SArtur Trybula 			if (buf_ptr == NULL) {
9256bbc5a92SArtur Trybula 				RTE_LOG(ERR, USER1,
9266bbc5a92SArtur Trybula 					"Append extra bytes to the source mbuf failed\n");
9276bbc5a92SArtur Trybula 				return -1;
9286bbc5a92SArtur Trybula 			}
9293fc3996fSAdam Dybkowski 		}
9303fc3996fSAdam Dybkowski 	} else if (buff_type == SGL_BOTH || buff_type == SGL_TO_LB) {
931a9de470cSBruce Richardson 		for (i = 0; i < num_bufs; i++) {
932a9de470cSBruce Richardson 			data_size = strlen(test_bufs[i]) + 1;
933a9de470cSBruce Richardson 			if (prepare_sgl_bufs(test_bufs[i], uncomp_bufs[i],
934a9de470cSBruce Richardson 			    data_size,
9359df7ffd1STomasz Jozwiak 			    big_data ? buf_pool : ts_params->small_mbuf_pool,
9369df7ffd1STomasz Jozwiak 			    big_data ? buf_pool : ts_params->large_mbuf_pool,
9379df7ffd1STomasz Jozwiak 			    big_data ? 0 : MAX_SEGS,
9389df7ffd1STomasz Jozwiak 			    big_data ? MAX_DATA_MBUF_SIZE : SMALL_SEG_SIZE) < 0)
9396bbc5a92SArtur Trybula 				return -1;
940a9de470cSBruce Richardson 		}
941a9de470cSBruce Richardson 	} else {
942a9de470cSBruce Richardson 		for (i = 0; i < num_bufs; i++) {
943a9de470cSBruce Richardson 			data_size = strlen(test_bufs[i]) + 1;
9446bbc5a92SArtur Trybula 
945a9de470cSBruce Richardson 			buf_ptr = rte_pktmbuf_append(uncomp_bufs[i], data_size);
9462437fbbcSArtur Trybula 			if (buf_ptr == NULL) {
9472437fbbcSArtur Trybula 				RTE_LOG(ERR, USER1,
9482437fbbcSArtur Trybula 					"Append extra bytes to the source mbuf failed\n");
9496bbc5a92SArtur Trybula 				return -1;
9502437fbbcSArtur Trybula 			}
951f9acaf84SBruce Richardson 			strlcpy(buf_ptr, test_bufs[i], data_size);
952a9de470cSBruce Richardson 		}
953a9de470cSBruce Richardson 	}
954a9de470cSBruce Richardson 
9556bbc5a92SArtur Trybula 	return 0;
956a9de470cSBruce Richardson }
957a9de470cSBruce Richardson 
9586bbc5a92SArtur Trybula /**
9596bbc5a92SArtur Trybula  * Data size calculation (for both compression and decompression).
9606bbc5a92SArtur Trybula  *
9616bbc5a92SArtur Trybula  * Calculate size of anticipated output buffer required for both
9626bbc5a92SArtur Trybula  * compression and decompression operations based on input int_data.
9636bbc5a92SArtur Trybula  *
9646bbc5a92SArtur Trybula  * @param op_type
9656bbc5a92SArtur Trybula  *   Operation type: compress or decompress
9666bbc5a92SArtur Trybula  * @param out_of_space_and_zlib
9676bbc5a92SArtur Trybula  *   Boolean value to switch into "out of space" buffer if set.
9686bbc5a92SArtur Trybula  *   To test "out-of-space" data size, zlib_decompress must be set as well.
9696bbc5a92SArtur Trybula  * @param test_priv_data
9706bbc5a92SArtur Trybula  *   A container used for aggregation all the private test arrays.
9716bbc5a92SArtur Trybula  * @param int_data
9726bbc5a92SArtur Trybula  *   Interim data containing session/transformation objects.
9736bbc5a92SArtur Trybula  * @param test_data
9746bbc5a92SArtur Trybula  *   The test parameters set by users (command line parameters).
9756bbc5a92SArtur Trybula  * @param i
9766bbc5a92SArtur Trybula  *   current buffer index
9776bbc5a92SArtur Trybula  * @return
9786bbc5a92SArtur Trybula  *   data size
9796bbc5a92SArtur Trybula  */
9806bbc5a92SArtur Trybula static inline uint32_t
test_mbufs_calculate_data_size(enum operation_type op_type,unsigned int out_of_space_and_zlib,const struct test_private_arrays * test_priv_data,const struct interim_data_params * int_data,const struct test_data_params * test_data,unsigned int i)9816bbc5a92SArtur Trybula test_mbufs_calculate_data_size(
9826bbc5a92SArtur Trybula 		enum operation_type op_type,
9836bbc5a92SArtur Trybula 		unsigned int out_of_space_and_zlib,
9846bbc5a92SArtur Trybula 		const struct test_private_arrays *test_priv_data,
9856bbc5a92SArtur Trybula 		const struct interim_data_params *int_data,
9866bbc5a92SArtur Trybula 		const struct test_data_params *test_data,
9876bbc5a92SArtur Trybula 		unsigned int i)
9886bbc5a92SArtur Trybula {
9896bbc5a92SArtur Trybula 	/* local variables: */
9906bbc5a92SArtur Trybula 	uint32_t data_size;
9916bbc5a92SArtur Trybula 	struct priv_op_data *priv_data;
992db06104cSAdam Dybkowski 	float ratio_val;
993db06104cSAdam Dybkowski 	enum ratio_switch ratio = test_data->ratio;
994db06104cSAdam Dybkowski 
9956bbc5a92SArtur Trybula 	uint8_t not_zlib_compr; /* true if zlib isn't current compression dev */
9966bbc5a92SArtur Trybula 	enum overflow_test overflow = test_data->overflow;
997a9de470cSBruce Richardson 
9986bbc5a92SArtur Trybula 	/* from test_priv_data: */
9996bbc5a92SArtur Trybula 	struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
1000a9de470cSBruce Richardson 
10016bbc5a92SArtur Trybula 	/* from int_data: */
10026bbc5a92SArtur Trybula 	const char * const *test_bufs = int_data->test_bufs;
10036bbc5a92SArtur Trybula 
10046bbc5a92SArtur Trybula 	if (out_of_space_and_zlib)
1005a9de470cSBruce Richardson 		data_size = OUT_OF_SPACE_BUF;
10062437fbbcSArtur Trybula 	else {
10076bbc5a92SArtur Trybula 		if (op_type == OPERATION_COMPRESSION) {
10086bbc5a92SArtur Trybula 			not_zlib_compr = (test_data->zlib_dir == ZLIB_DECOMPRESS
10096bbc5a92SArtur Trybula 				|| test_data->zlib_dir == ZLIB_NONE);
10106bbc5a92SArtur Trybula 
1011db06104cSAdam Dybkowski 			ratio_val = (ratio == RATIO_ENABLED) ?
1012db06104cSAdam Dybkowski 					COMPRESS_BUF_SIZE_RATIO :
1013db06104cSAdam Dybkowski 					COMPRESS_BUF_SIZE_RATIO_DISABLED;
1014db06104cSAdam Dybkowski 
1015db06104cSAdam Dybkowski 			ratio_val = (not_zlib_compr &&
10166bbc5a92SArtur Trybula 				(overflow == OVERFLOW_ENABLED)) ?
10172437fbbcSArtur Trybula 				COMPRESS_BUF_SIZE_RATIO_OVERFLOW :
1018db06104cSAdam Dybkowski 				ratio_val;
1019a9de470cSBruce Richardson 
1020db06104cSAdam Dybkowski 			data_size = strlen(test_bufs[i]) * ratio_val;
10216bbc5a92SArtur Trybula 		} else {
10226bbc5a92SArtur Trybula 			priv_data = (struct priv_op_data *)
10236bbc5a92SArtur Trybula 					(ops_processed[i] + 1);
10246bbc5a92SArtur Trybula 			data_size = strlen(test_bufs[priv_data->orig_idx]) + 1;
10252437fbbcSArtur Trybula 		}
10266bbc5a92SArtur Trybula 	}
10276bbc5a92SArtur Trybula 
10286bbc5a92SArtur Trybula 	return data_size;
10296bbc5a92SArtur Trybula }
10306bbc5a92SArtur Trybula 
10316bbc5a92SArtur Trybula 
10326bbc5a92SArtur Trybula /**
10336bbc5a92SArtur Trybula  * Memory buffers preparation (for both compression and decompression).
10346bbc5a92SArtur Trybula  *
10356bbc5a92SArtur Trybula  * Function allocates output buffers to perform compression
10366bbc5a92SArtur Trybula  * or decompression operations depending on value of op_type.
10376bbc5a92SArtur Trybula  *
10386bbc5a92SArtur Trybula  * @param op_type
10396bbc5a92SArtur Trybula  *   Operation type: compress or decompress
10406bbc5a92SArtur Trybula  * @param out_of_space_and_zlib
10416bbc5a92SArtur Trybula  *   Boolean value to switch into "out of space" buffer if set.
10426bbc5a92SArtur Trybula  *   To test "out-of-space" data size, zlib_decompress must be set as well.
10436bbc5a92SArtur Trybula  * @param test_priv_data
10446bbc5a92SArtur Trybula  *   A container used for aggregation all the private test arrays.
10456bbc5a92SArtur Trybula  * @param int_data
10466bbc5a92SArtur Trybula  *   Interim data containing session/transformation objects.
10476bbc5a92SArtur Trybula  * @param test_data
10486bbc5a92SArtur Trybula  *   The test parameters set by users (command line parameters).
10496bbc5a92SArtur Trybula  * @param current_extbuf_info,
10506bbc5a92SArtur Trybula  *   The structure containing all the information related to external mbufs
10516bbc5a92SArtur Trybula  * @return
10526bbc5a92SArtur Trybula  *   - 0: On success.
10536bbc5a92SArtur Trybula  *   - -1: On error.
10546bbc5a92SArtur Trybula  */
10556bbc5a92SArtur Trybula static int
test_setup_output_bufs(enum operation_type op_type,unsigned int out_of_space_and_zlib,const struct test_private_arrays * test_priv_data,const struct interim_data_params * int_data,const struct test_data_params * test_data,struct rte_mbuf_ext_shared_info * current_extbuf_info)10566bbc5a92SArtur Trybula test_setup_output_bufs(
10576bbc5a92SArtur Trybula 		enum operation_type op_type,
10586bbc5a92SArtur Trybula 		unsigned int out_of_space_and_zlib,
10596bbc5a92SArtur Trybula 		const struct test_private_arrays *test_priv_data,
10606bbc5a92SArtur Trybula 		const struct interim_data_params *int_data,
10616bbc5a92SArtur Trybula 		const struct test_data_params *test_data,
10626bbc5a92SArtur Trybula 		struct rte_mbuf_ext_shared_info *current_extbuf_info)
10636bbc5a92SArtur Trybula {
10646bbc5a92SArtur Trybula 	/* local variables: */
10656bbc5a92SArtur Trybula 	unsigned int i;
10666bbc5a92SArtur Trybula 	uint32_t data_size;
10676bbc5a92SArtur Trybula 	int ret;
10686bbc5a92SArtur Trybula 	char *buf_ptr;
10696bbc5a92SArtur Trybula 
10706bbc5a92SArtur Trybula 	/* from test_priv_data: */
10716bbc5a92SArtur Trybula 	struct rte_mbuf **current_bufs;
10726bbc5a92SArtur Trybula 
10736bbc5a92SArtur Trybula 	/* from int_data: */
10746bbc5a92SArtur Trybula 	unsigned int num_bufs = int_data->num_bufs;
10756bbc5a92SArtur Trybula 
10766bbc5a92SArtur Trybula 	/* from test_data: */
10776bbc5a92SArtur Trybula 	unsigned int buff_type = test_data->buff_type;
10786bbc5a92SArtur Trybula 	unsigned int big_data = test_data->big_data;
10796bbc5a92SArtur Trybula 	const struct rte_memzone *current_memzone;
10806bbc5a92SArtur Trybula 
10816bbc5a92SArtur Trybula 	struct comp_testsuite_params *ts_params = &testsuite_params;
10826bbc5a92SArtur Trybula 	struct rte_mempool *buf_pool;
10836bbc5a92SArtur Trybula 
10846bbc5a92SArtur Trybula 	if (big_data)
10856bbc5a92SArtur Trybula 		buf_pool = ts_params->big_mbuf_pool;
10866bbc5a92SArtur Trybula 	else if (buff_type == SGL_BOTH)
10876bbc5a92SArtur Trybula 		buf_pool = ts_params->small_mbuf_pool;
10886bbc5a92SArtur Trybula 	else
10896bbc5a92SArtur Trybula 		buf_pool = ts_params->large_mbuf_pool;
10906bbc5a92SArtur Trybula 
10916bbc5a92SArtur Trybula 	if (op_type == OPERATION_COMPRESSION)
10926bbc5a92SArtur Trybula 		current_bufs = test_priv_data->comp_bufs;
10936bbc5a92SArtur Trybula 	else
10946bbc5a92SArtur Trybula 		current_bufs = test_priv_data->uncomp_bufs;
10956bbc5a92SArtur Trybula 
10966bbc5a92SArtur Trybula 	/* the mbufs allocation*/
10976bbc5a92SArtur Trybula 	ret = rte_pktmbuf_alloc_bulk(buf_pool, current_bufs, num_bufs);
10986bbc5a92SArtur Trybula 	if (ret < 0) {
10996bbc5a92SArtur Trybula 		RTE_LOG(ERR, USER1,
11006bbc5a92SArtur Trybula 			"Destination mbufs could not be allocated "
11016bbc5a92SArtur Trybula 			"from the mempool\n");
11026bbc5a92SArtur Trybula 		return -1;
11036bbc5a92SArtur Trybula 	}
11046bbc5a92SArtur Trybula 
11056bbc5a92SArtur Trybula 	if (test_data->use_external_mbufs) {
11066bbc5a92SArtur Trybula 		current_extbuf_info->free_cb = extbuf_free_callback;
11076bbc5a92SArtur Trybula 		current_extbuf_info->fcb_opaque = NULL;
11086bbc5a92SArtur Trybula 		rte_mbuf_ext_refcnt_set(current_extbuf_info, 1);
11096bbc5a92SArtur Trybula 		if (op_type == OPERATION_COMPRESSION)
11106bbc5a92SArtur Trybula 			current_memzone = test_data->compbuf_memzone;
11116bbc5a92SArtur Trybula 		else
11126bbc5a92SArtur Trybula 			current_memzone = test_data->uncompbuf_memzone;
11136bbc5a92SArtur Trybula 
11146bbc5a92SArtur Trybula 		for (i = 0; i < num_bufs; i++) {
11156bbc5a92SArtur Trybula 			rte_pktmbuf_attach_extbuf(current_bufs[i],
11166bbc5a92SArtur Trybula 					current_memzone->addr,
11176bbc5a92SArtur Trybula 					current_memzone->iova,
11186bbc5a92SArtur Trybula 					current_memzone->len,
11196bbc5a92SArtur Trybula 					current_extbuf_info);
11206bbc5a92SArtur Trybula 			rte_pktmbuf_append(current_bufs[i],
11216bbc5a92SArtur Trybula 					current_memzone->len);
11226bbc5a92SArtur Trybula 		}
11236bbc5a92SArtur Trybula 	} else {
11246bbc5a92SArtur Trybula 		for (i = 0; i < num_bufs; i++) {
11256bbc5a92SArtur Trybula 
1126db06104cSAdam Dybkowski 			enum rte_comp_huffman comp_huffman =
1127db06104cSAdam Dybkowski 			ts_params->def_comp_xform->compress.deflate.huffman;
1128db06104cSAdam Dybkowski 
11296bbc5a92SArtur Trybula 			/* data size calculation */
11306bbc5a92SArtur Trybula 			data_size = test_mbufs_calculate_data_size(
11316bbc5a92SArtur Trybula 					op_type,
11326bbc5a92SArtur Trybula 					out_of_space_and_zlib,
11336bbc5a92SArtur Trybula 					test_priv_data,
11346bbc5a92SArtur Trybula 					int_data,
11356bbc5a92SArtur Trybula 					test_data,
11366bbc5a92SArtur Trybula 					i);
11376bbc5a92SArtur Trybula 
1138db06104cSAdam Dybkowski 			if (comp_huffman != RTE_COMP_HUFFMAN_DYNAMIC) {
1139db06104cSAdam Dybkowski 				if (op_type == OPERATION_DECOMPRESSION)
1140db06104cSAdam Dybkowski 					data_size *= COMPRESS_BUF_SIZE_RATIO;
1141db06104cSAdam Dybkowski 			}
1142db06104cSAdam Dybkowski 
11436bbc5a92SArtur Trybula 			/* data allocation */
11446bbc5a92SArtur Trybula 			if (buff_type == SGL_BOTH || buff_type == LB_TO_SGL) {
11456bbc5a92SArtur Trybula 				ret = prepare_sgl_bufs(NULL, current_bufs[i],
11466bbc5a92SArtur Trybula 				      data_size,
11476bbc5a92SArtur Trybula 				      big_data ? buf_pool :
11486bbc5a92SArtur Trybula 						ts_params->small_mbuf_pool,
11496bbc5a92SArtur Trybula 				      big_data ? buf_pool :
11506bbc5a92SArtur Trybula 						ts_params->large_mbuf_pool,
11516bbc5a92SArtur Trybula 				      big_data ? 0 : MAX_SEGS,
11526bbc5a92SArtur Trybula 				      big_data ? MAX_DATA_MBUF_SIZE :
11536bbc5a92SArtur Trybula 						 SMALL_SEG_SIZE);
11546bbc5a92SArtur Trybula 				if (ret < 0)
11556bbc5a92SArtur Trybula 					return -1;
11566bbc5a92SArtur Trybula 			} else {
11576bbc5a92SArtur Trybula 				buf_ptr = rte_pktmbuf_append(current_bufs[i],
11586bbc5a92SArtur Trybula 						data_size);
11592437fbbcSArtur Trybula 				if (buf_ptr == NULL) {
11602437fbbcSArtur Trybula 					RTE_LOG(ERR, USER1,
11612437fbbcSArtur Trybula 						"Append extra bytes to the destination mbuf failed\n");
11626bbc5a92SArtur Trybula 					return -1;
11632437fbbcSArtur Trybula 				}
1164a9de470cSBruce Richardson 			}
1165a9de470cSBruce Richardson 		}
11666bbc5a92SArtur Trybula 	}
11676bbc5a92SArtur Trybula 
11686bbc5a92SArtur Trybula 	return 0;
11696bbc5a92SArtur Trybula }
11706bbc5a92SArtur Trybula 
11716bbc5a92SArtur Trybula /**
11726bbc5a92SArtur Trybula  * The main compression function.
11736bbc5a92SArtur Trybula  *
11746bbc5a92SArtur Trybula  * Function performs compression operation.
11756bbc5a92SArtur Trybula  * Operation(s) configuration, depending on CLI parameters.
11766bbc5a92SArtur Trybula  * Operation(s) processing.
11776bbc5a92SArtur Trybula  *
11786bbc5a92SArtur Trybula  * @param int_data
11796bbc5a92SArtur Trybula  *   Interim data containing session/transformation objects.
11806bbc5a92SArtur Trybula  * @param test_data
11816bbc5a92SArtur Trybula  *   The test parameters set by users (command line parameters).
11826bbc5a92SArtur Trybula  * @param test_priv_data
11836bbc5a92SArtur Trybula  *   A container used for aggregation all the private test arrays.
11846bbc5a92SArtur Trybula  * @return
11856bbc5a92SArtur Trybula  *   - 0: On success.
11866bbc5a92SArtur Trybula  *   - -1: On error.
11876bbc5a92SArtur Trybula  */
11886bbc5a92SArtur Trybula static int
test_deflate_comp_run(const struct interim_data_params * int_data,const struct test_data_params * test_data,const struct test_private_arrays * test_priv_data)11896bbc5a92SArtur Trybula test_deflate_comp_run(const struct interim_data_params *int_data,
11906bbc5a92SArtur Trybula 		const struct test_data_params *test_data,
11916bbc5a92SArtur Trybula 		const struct test_private_arrays *test_priv_data)
11926bbc5a92SArtur Trybula {
11936bbc5a92SArtur Trybula 	/* local variables: */
11946bbc5a92SArtur Trybula 	struct priv_op_data *priv_data;
11956bbc5a92SArtur Trybula 	unsigned int i;
11966bbc5a92SArtur Trybula 	uint16_t num_priv_xforms = 0;
11976bbc5a92SArtur Trybula 	int ret;
11986bbc5a92SArtur Trybula 	int ret_status = 0;
11996bbc5a92SArtur Trybula 	char *buf_ptr;
12006bbc5a92SArtur Trybula 
12016bbc5a92SArtur Trybula 	struct comp_testsuite_params *ts_params = &testsuite_params;
12026bbc5a92SArtur Trybula 
12036bbc5a92SArtur Trybula 	/* from test_data: */
12046bbc5a92SArtur Trybula 	enum rte_comp_op_type operation_type = test_data->compress_state;
12056bbc5a92SArtur Trybula 	unsigned int zlib_compress =
12066bbc5a92SArtur Trybula 			(test_data->zlib_dir == ZLIB_ALL ||
12076bbc5a92SArtur Trybula 			test_data->zlib_dir == ZLIB_COMPRESS);
12086bbc5a92SArtur Trybula 
12096bbc5a92SArtur Trybula 	/* from int_data: */
12106bbc5a92SArtur Trybula 	struct rte_comp_xform **compress_xforms = int_data->compress_xforms;
12116bbc5a92SArtur Trybula 	unsigned int num_xforms = int_data->num_xforms;
12126bbc5a92SArtur Trybula 	unsigned int num_bufs = int_data->num_bufs;
12136bbc5a92SArtur Trybula 
12146bbc5a92SArtur Trybula 	/* from test_priv_data: */
12156bbc5a92SArtur Trybula 	struct rte_mbuf **comp_bufs = test_priv_data->comp_bufs;
12166bbc5a92SArtur Trybula 	struct rte_mbuf **uncomp_bufs = test_priv_data->uncomp_bufs;
12176bbc5a92SArtur Trybula 	struct rte_comp_op **ops = test_priv_data->ops;
12186bbc5a92SArtur Trybula 	struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
12196bbc5a92SArtur Trybula 	void **priv_xforms = test_priv_data->priv_xforms;
12206bbc5a92SArtur Trybula 
12216bbc5a92SArtur Trybula 	const struct rte_compressdev_capabilities *capa =
12226bbc5a92SArtur Trybula 		rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
1223a9de470cSBruce Richardson 
1224a9de470cSBruce Richardson 	/* Build the compression operations */
1225a9de470cSBruce Richardson 	ret = rte_comp_op_bulk_alloc(ts_params->op_pool, ops, num_bufs);
1226a9de470cSBruce Richardson 	if (ret < 0) {
1227a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1,
1228a9de470cSBruce Richardson 			"Compress operations could not be allocated "
1229a9de470cSBruce Richardson 			"from the mempool\n");
12306bbc5a92SArtur Trybula 		ret_status = -1;
1231a9de470cSBruce Richardson 		goto exit;
1232a9de470cSBruce Richardson 	}
1233a9de470cSBruce Richardson 
1234a9de470cSBruce Richardson 	for (i = 0; i < num_bufs; i++) {
1235a9de470cSBruce Richardson 		ops[i]->m_src = uncomp_bufs[i];
1236a9de470cSBruce Richardson 		ops[i]->m_dst = comp_bufs[i];
1237a9de470cSBruce Richardson 		ops[i]->src.offset = 0;
1238a9de470cSBruce Richardson 		ops[i]->src.length = rte_pktmbuf_pkt_len(uncomp_bufs[i]);
1239a9de470cSBruce Richardson 		ops[i]->dst.offset = 0;
12406bbc5a92SArtur Trybula 
1241db06104cSAdam Dybkowski 		RTE_LOG(DEBUG, USER1,
1242db06104cSAdam Dybkowski 				"Uncompressed buffer length = %u compressed buffer length = %u",
1243db06104cSAdam Dybkowski 				rte_pktmbuf_pkt_len(uncomp_bufs[i]),
1244db06104cSAdam Dybkowski 				rte_pktmbuf_pkt_len(comp_bufs[i]));
1245db06104cSAdam Dybkowski 
12466bbc5a92SArtur Trybula 		if (operation_type == RTE_COMP_OP_STATELESS) {
1247a9de470cSBruce Richardson 			ops[i]->flush_flag = RTE_COMP_FLUSH_FINAL;
12486bbc5a92SArtur Trybula 		} else {
1249a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
12506bbc5a92SArtur Trybula 				"Compression: stateful operations are not "
12516bbc5a92SArtur Trybula 				"supported in these tests yet\n");
12526bbc5a92SArtur Trybula 			ret_status = -1;
1253a9de470cSBruce Richardson 			goto exit;
1254a9de470cSBruce Richardson 		}
1255a9de470cSBruce Richardson 		ops[i]->input_chksum = 0;
1256a9de470cSBruce Richardson 		/*
1257a9de470cSBruce Richardson 		 * Store original operation index in private data,
1258a9de470cSBruce Richardson 		 * since ordering does not have to be maintained,
12597be78d02SJosh Soref 		 * when dequeuing from compressdev, so a comparison
1260a9de470cSBruce Richardson 		 * at the end of the test can be done.
1261a9de470cSBruce Richardson 		 */
1262a9de470cSBruce Richardson 		priv_data = (struct priv_op_data *) (ops[i] + 1);
1263a9de470cSBruce Richardson 		priv_data->orig_idx = i;
1264a9de470cSBruce Richardson 	}
1265a9de470cSBruce Richardson 
1266a9de470cSBruce Richardson 	/* Compress data (either with Zlib API or compressdev API */
12676bbc5a92SArtur Trybula 	if (zlib_compress) {
1268a9de470cSBruce Richardson 		for (i = 0; i < num_bufs; i++) {
1269a9de470cSBruce Richardson 			const struct rte_comp_xform *compress_xform =
1270a9de470cSBruce Richardson 				compress_xforms[i % num_xforms];
1271a9de470cSBruce Richardson 			ret = compress_zlib(ops[i], compress_xform,
1272a9de470cSBruce Richardson 					DEFAULT_MEM_LEVEL);
12736bbc5a92SArtur Trybula 			if (ret < 0) {
12746bbc5a92SArtur Trybula 				ret_status = -1;
1275a9de470cSBruce Richardson 				goto exit;
12766bbc5a92SArtur Trybula 			}
1277a9de470cSBruce Richardson 
1278a9de470cSBruce Richardson 			ops_processed[i] = ops[i];
1279a9de470cSBruce Richardson 		}
1280a9de470cSBruce Richardson 	} else {
1281a9de470cSBruce Richardson 		/* Create compress private xform data */
1282a9de470cSBruce Richardson 		for (i = 0; i < num_xforms; i++) {
1283a9de470cSBruce Richardson 			ret = rte_compressdev_private_xform_create(0,
12846bbc5a92SArtur Trybula 				(const struct rte_comp_xform *)
12856bbc5a92SArtur Trybula 					compress_xforms[i],
1286a9de470cSBruce Richardson 				&priv_xforms[i]);
1287a9de470cSBruce Richardson 			if (ret < 0) {
1288a9de470cSBruce Richardson 				RTE_LOG(ERR, USER1,
1289a9de470cSBruce Richardson 					"Compression private xform "
1290a9de470cSBruce Richardson 					"could not be created\n");
12916bbc5a92SArtur Trybula 				ret_status = -1;
1292a9de470cSBruce Richardson 				goto exit;
1293a9de470cSBruce Richardson 			}
1294a9de470cSBruce Richardson 			num_priv_xforms++;
1295a9de470cSBruce Richardson 		}
12962437fbbcSArtur Trybula 		if (capa->comp_feature_flags &
12972437fbbcSArtur Trybula 				RTE_COMP_FF_SHAREABLE_PRIV_XFORM) {
1298a9de470cSBruce Richardson 			/* Attach shareable private xform data to ops */
1299a9de470cSBruce Richardson 			for (i = 0; i < num_bufs; i++)
13006bbc5a92SArtur Trybula 				ops[i]->private_xform =
13016bbc5a92SArtur Trybula 						priv_xforms[i % num_xforms];
1302a9de470cSBruce Richardson 		} else {
1303a9de470cSBruce Richardson 		/* Create rest of the private xforms for the other ops */
1304a9de470cSBruce Richardson 			for (i = num_xforms; i < num_bufs; i++) {
1305a9de470cSBruce Richardson 				ret = rte_compressdev_private_xform_create(0,
1306a9de470cSBruce Richardson 					compress_xforms[i % num_xforms],
1307a9de470cSBruce Richardson 					&priv_xforms[i]);
1308a9de470cSBruce Richardson 				if (ret < 0) {
1309a9de470cSBruce Richardson 					RTE_LOG(ERR, USER1,
1310a9de470cSBruce Richardson 						"Compression private xform "
1311a9de470cSBruce Richardson 						"could not be created\n");
13126bbc5a92SArtur Trybula 					ret_status = -1;
1313a9de470cSBruce Richardson 					goto exit;
1314a9de470cSBruce Richardson 				}
1315a9de470cSBruce Richardson 				num_priv_xforms++;
1316a9de470cSBruce Richardson 			}
1317a9de470cSBruce Richardson 			/* Attach non shareable private xform data to ops */
1318a9de470cSBruce Richardson 			for (i = 0; i < num_bufs; i++)
1319a9de470cSBruce Richardson 				ops[i]->private_xform = priv_xforms[i];
1320a9de470cSBruce Richardson 		}
1321a9de470cSBruce Richardson 
13222437fbbcSArtur Trybula recovery_lb:
13236bbc5a92SArtur Trybula 		ret = test_run_enqueue_dequeue(ops, ops_processed, num_bufs);
13242437fbbcSArtur Trybula 		if (ret < 0) {
1325a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
13266bbc5a92SArtur Trybula 				"Compression: enqueue/dequeue operation failed\n");
13276bbc5a92SArtur Trybula 			ret_status = -1;
1328a9de470cSBruce Richardson 			goto exit;
1329a9de470cSBruce Richardson 		}
1330a9de470cSBruce Richardson 
13312437fbbcSArtur Trybula 		for (i = 0; i < num_bufs; i++) {
13326bbc5a92SArtur Trybula 			test_priv_data->compressed_data_size[i] +=
13336bbc5a92SArtur Trybula 					ops_processed[i]->produced;
13342437fbbcSArtur Trybula 
13352437fbbcSArtur Trybula 			if (ops_processed[i]->status ==
13362437fbbcSArtur Trybula 				RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) {
13372437fbbcSArtur Trybula 
13382437fbbcSArtur Trybula 				ops[i]->status =
13392437fbbcSArtur Trybula 					RTE_COMP_OP_STATUS_NOT_PROCESSED;
13402437fbbcSArtur Trybula 				ops[i]->src.offset +=
13412437fbbcSArtur Trybula 					ops_processed[i]->consumed;
13422437fbbcSArtur Trybula 				ops[i]->src.length -=
13432437fbbcSArtur Trybula 					ops_processed[i]->consumed;
13442437fbbcSArtur Trybula 				ops[i]->dst.offset +=
13452437fbbcSArtur Trybula 					ops_processed[i]->produced;
13462437fbbcSArtur Trybula 
13472437fbbcSArtur Trybula 				buf_ptr = rte_pktmbuf_append(
13482437fbbcSArtur Trybula 					ops[i]->m_dst,
13492437fbbcSArtur Trybula 					ops_processed[i]->produced);
13502437fbbcSArtur Trybula 
13512437fbbcSArtur Trybula 				if (buf_ptr == NULL) {
1352a9de470cSBruce Richardson 					RTE_LOG(ERR, USER1,
13532437fbbcSArtur Trybula 						"Data recovery: append extra bytes to the current mbuf failed\n");
13546bbc5a92SArtur Trybula 					ret_status = -1;
1355a9de470cSBruce Richardson 					goto exit;
1356a9de470cSBruce Richardson 				}
13572437fbbcSArtur Trybula 				goto recovery_lb;
1358a9de470cSBruce Richardson 			}
13592437fbbcSArtur Trybula 		}
13606bbc5a92SArtur Trybula 	}
13616bbc5a92SArtur Trybula 
13626bbc5a92SArtur Trybula exit:
13636bbc5a92SArtur Trybula 	/* Free resources */
13646bbc5a92SArtur Trybula 	if (ret_status < 0)
13656bbc5a92SArtur Trybula 		for (i = 0; i < num_bufs; i++) {
13666bbc5a92SArtur Trybula 			rte_comp_op_free(ops[i]);
1367db06104cSAdam Dybkowski 			ops[i] = NULL;
13686bbc5a92SArtur Trybula 			ops_processed[i] = NULL;
13696bbc5a92SArtur Trybula 		}
1370a9de470cSBruce Richardson 
1371a9de470cSBruce Richardson 	/* Free compress private xforms */
1372a9de470cSBruce Richardson 	for (i = 0; i < num_priv_xforms; i++) {
13736bbc5a92SArtur Trybula 		if (priv_xforms[i] != NULL) {
1374a9de470cSBruce Richardson 			rte_compressdev_private_xform_free(0, priv_xforms[i]);
1375a9de470cSBruce Richardson 			priv_xforms[i] = NULL;
1376a9de470cSBruce Richardson 		}
1377a9de470cSBruce Richardson 	}
1378a9de470cSBruce Richardson 
13796bbc5a92SArtur Trybula 	return ret_status;
13806bbc5a92SArtur Trybula }
13816bbc5a92SArtur Trybula 
13826bbc5a92SArtur Trybula /**
13836bbc5a92SArtur Trybula  * Prints out the test report. Memory freeing.
13846bbc5a92SArtur Trybula  *
13856bbc5a92SArtur Trybula  * Called after successful compression.
13866bbc5a92SArtur Trybula  * Operation(s) status validation and decompression buffers freeing.
13876bbc5a92SArtur Trybula 
13886bbc5a92SArtur Trybula  * -1 returned if function fail.
13896bbc5a92SArtur Trybula  *
13906bbc5a92SArtur Trybula  * @param int_data
13916bbc5a92SArtur Trybula  *   Interim data containing session/transformation objects.
13926bbc5a92SArtur Trybula  * @param test_data
13936bbc5a92SArtur Trybula  *   The test parameters set by users (command line parameters).
13946bbc5a92SArtur Trybula  * @param test_priv_data
13956bbc5a92SArtur Trybula  *   A container used for aggregation all the private test arrays.
13966bbc5a92SArtur Trybula  * @return
13976bbc5a92SArtur Trybula  *   - 2: Some operation is not supported
13986bbc5a92SArtur Trybula  *   - 1: Decompression should be skipped
13996bbc5a92SArtur Trybula  *   - 0: On success.
14006bbc5a92SArtur Trybula  *   - -1: On error.
14016bbc5a92SArtur Trybula  */
14026bbc5a92SArtur Trybula static int
test_deflate_comp_finalize(const struct interim_data_params * int_data,const struct test_data_params * test_data,const struct test_private_arrays * test_priv_data)14036bbc5a92SArtur Trybula test_deflate_comp_finalize(const struct interim_data_params *int_data,
14046bbc5a92SArtur Trybula 		const struct test_data_params *test_data,
14056bbc5a92SArtur Trybula 		const struct test_private_arrays *test_priv_data)
14066bbc5a92SArtur Trybula {
14076bbc5a92SArtur Trybula 	/* local variables: */
14086bbc5a92SArtur Trybula 	unsigned int i;
14096bbc5a92SArtur Trybula 	struct priv_op_data *priv_data;
14106bbc5a92SArtur Trybula 
14116bbc5a92SArtur Trybula 	/* from int_data: */
14126bbc5a92SArtur Trybula 	unsigned int num_xforms = int_data->num_xforms;
14136bbc5a92SArtur Trybula 	struct rte_comp_xform **compress_xforms = int_data->compress_xforms;
14146bbc5a92SArtur Trybula 	unsigned int num_bufs = int_data->num_bufs;
14156bbc5a92SArtur Trybula 
14166bbc5a92SArtur Trybula 	/* from test_priv_data: */
14176bbc5a92SArtur Trybula 	struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
14186bbc5a92SArtur Trybula 	uint64_t *compress_checksum = test_priv_data->compress_checksum;
14196bbc5a92SArtur Trybula 	struct rte_mbuf **uncomp_bufs = test_priv_data->uncomp_bufs;
14206bbc5a92SArtur Trybula 	struct rte_comp_op **ops = test_priv_data->ops;
14216bbc5a92SArtur Trybula 
14226bbc5a92SArtur Trybula 	/* from test_data: */
14236bbc5a92SArtur Trybula 	unsigned int out_of_space = test_data->out_of_space;
14246bbc5a92SArtur Trybula 	unsigned int zlib_compress =
14256bbc5a92SArtur Trybula 			(test_data->zlib_dir == ZLIB_ALL ||
14266bbc5a92SArtur Trybula 			test_data->zlib_dir == ZLIB_COMPRESS);
14276bbc5a92SArtur Trybula 	unsigned int zlib_decompress =
14286bbc5a92SArtur Trybula 			(test_data->zlib_dir == ZLIB_ALL ||
14296bbc5a92SArtur Trybula 			test_data->zlib_dir == ZLIB_DECOMPRESS);
14306bbc5a92SArtur Trybula 
1431a9de470cSBruce Richardson 	for (i = 0; i < num_bufs; i++) {
1432a9de470cSBruce Richardson 		priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
1433a9de470cSBruce Richardson 		uint16_t xform_idx = priv_data->orig_idx % num_xforms;
1434a9de470cSBruce Richardson 		const struct rte_comp_compress_xform *compress_xform =
1435a9de470cSBruce Richardson 				&compress_xforms[xform_idx]->compress;
1436a9de470cSBruce Richardson 		enum rte_comp_huffman huffman_type =
1437a9de470cSBruce Richardson 			compress_xform->deflate.huffman;
1438a9de470cSBruce Richardson 		char engine[] = "zlib (directly, not PMD)";
14396bbc5a92SArtur Trybula 		if (zlib_decompress)
1440a9de470cSBruce Richardson 			strlcpy(engine, "PMD", sizeof(engine));
1441a9de470cSBruce Richardson 
1442a9de470cSBruce Richardson 		RTE_LOG(DEBUG, USER1, "Buffer %u compressed by %s from %u to"
1443a9de470cSBruce Richardson 			" %u bytes (level = %d, huffman = %s)\n",
144496fe84f4SRebecca Troy 			i, engine,
1445a9de470cSBruce Richardson 			ops_processed[i]->consumed, ops_processed[i]->produced,
1446a9de470cSBruce Richardson 			compress_xform->level,
1447a9de470cSBruce Richardson 			huffman_type_strings[huffman_type]);
1448a9de470cSBruce Richardson 		RTE_LOG(DEBUG, USER1, "Compression ratio = %.2f\n",
1449a9de470cSBruce Richardson 			ops_processed[i]->consumed == 0 ? 0 :
1450a9de470cSBruce Richardson 			(float)ops_processed[i]->produced /
1451a9de470cSBruce Richardson 			ops_processed[i]->consumed * 100);
1452a9de470cSBruce Richardson 		if (compress_xform->chksum != RTE_COMP_CHECKSUM_NONE)
1453a9de470cSBruce Richardson 			compress_checksum[i] = ops_processed[i]->output_chksum;
1454a9de470cSBruce Richardson 		ops[i] = NULL;
1455a9de470cSBruce Richardson 	}
1456a9de470cSBruce Richardson 
1457a9de470cSBruce Richardson 	/*
1458a9de470cSBruce Richardson 	 * Check operation status and free source mbufs (destination mbuf and
1459a9de470cSBruce Richardson 	 * compress operation information is needed for the decompression stage)
1460a9de470cSBruce Richardson 	 */
1461a9de470cSBruce Richardson 	for (i = 0; i < num_bufs; i++) {
14626bbc5a92SArtur Trybula 		if (out_of_space && !zlib_compress) {
1463a9de470cSBruce Richardson 			if (ops_processed[i]->status !=
1464a9de470cSBruce Richardson 				RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) {
1465a9de470cSBruce Richardson 				RTE_LOG(ERR, USER1,
1466a9de470cSBruce Richardson 					"Operation without expected out of "
1467a9de470cSBruce Richardson 					"space status error\n");
14686bbc5a92SArtur Trybula 				return -1;
1469a9de470cSBruce Richardson 			} else
1470a9de470cSBruce Richardson 				continue;
1471a9de470cSBruce Richardson 		}
1472a9de470cSBruce Richardson 
1473a9de470cSBruce Richardson 		if (ops_processed[i]->status != RTE_COMP_OP_STATUS_SUCCESS) {
14746bbc5a92SArtur Trybula 			if (test_data->overflow == OVERFLOW_ENABLED) {
14752437fbbcSArtur Trybula 				if (ops_processed[i]->status ==
14762437fbbcSArtur Trybula 				RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) {
14772437fbbcSArtur Trybula 					RTE_LOG(INFO, USER1,
14782437fbbcSArtur Trybula 					"Out-of-space-recoverable functionality"
14792437fbbcSArtur Trybula 					" is not supported on this device\n");
14806bbc5a92SArtur Trybula 					return 2;
14812437fbbcSArtur Trybula 				}
14822437fbbcSArtur Trybula 			}
14836bbc5a92SArtur Trybula 
1484a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1485db06104cSAdam Dybkowski 				"Comp: Some operations were not successful\n");
14866bbc5a92SArtur Trybula 			return -1;
1487a9de470cSBruce Richardson 		}
1488a9de470cSBruce Richardson 		priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
1489a9de470cSBruce Richardson 		rte_pktmbuf_free(uncomp_bufs[priv_data->orig_idx]);
1490a9de470cSBruce Richardson 		uncomp_bufs[priv_data->orig_idx] = NULL;
1491a9de470cSBruce Richardson 	}
1492a9de470cSBruce Richardson 
14936bbc5a92SArtur Trybula 	if (out_of_space && !zlib_compress)
14946bbc5a92SArtur Trybula 		return 1;
14956bbc5a92SArtur Trybula 
14966bbc5a92SArtur Trybula 	return 0;
1497a9de470cSBruce Richardson }
1498a9de470cSBruce Richardson 
14996bbc5a92SArtur Trybula /**
15006bbc5a92SArtur Trybula  * The main decompression function.
15016bbc5a92SArtur Trybula  *
15026bbc5a92SArtur Trybula  * Function performs decompression operation.
15036bbc5a92SArtur Trybula  * Operation(s) configuration, depending on CLI parameters.
15046bbc5a92SArtur Trybula  * Operation(s) processing.
15056bbc5a92SArtur Trybula  *
15066bbc5a92SArtur Trybula  * @param int_data
15076bbc5a92SArtur Trybula  *   Interim data containing session/transformation objects.
15086bbc5a92SArtur Trybula  * @param test_data
15096bbc5a92SArtur Trybula  *   The test parameters set by users (command line parameters).
15106bbc5a92SArtur Trybula  * @param test_priv_data
15116bbc5a92SArtur Trybula  *   A container used for aggregation all the private test arrays.
15126bbc5a92SArtur Trybula  * @return
15136bbc5a92SArtur Trybula  *   - 0: On success.
15146bbc5a92SArtur Trybula  *   - -1: On error.
15156bbc5a92SArtur Trybula  */
15166bbc5a92SArtur Trybula static int
test_deflate_decomp_run(const struct interim_data_params * int_data,const struct test_data_params * test_data,struct test_private_arrays * test_priv_data)15176bbc5a92SArtur Trybula test_deflate_decomp_run(const struct interim_data_params *int_data,
15186bbc5a92SArtur Trybula 		const struct test_data_params *test_data,
15196bbc5a92SArtur Trybula 		struct test_private_arrays *test_priv_data)
15206bbc5a92SArtur Trybula {
1521a9de470cSBruce Richardson 
15226bbc5a92SArtur Trybula 	/* local variables: */
15236bbc5a92SArtur Trybula 	struct priv_op_data *priv_data;
15246bbc5a92SArtur Trybula 	unsigned int i;
15256bbc5a92SArtur Trybula 	uint16_t num_priv_xforms = 0;
15266bbc5a92SArtur Trybula 	int ret;
15276bbc5a92SArtur Trybula 	int ret_status = 0;
1528a9de470cSBruce Richardson 
15296bbc5a92SArtur Trybula 	struct comp_testsuite_params *ts_params = &testsuite_params;
1530a9de470cSBruce Richardson 
15316bbc5a92SArtur Trybula 	/* from test_data: */
15326bbc5a92SArtur Trybula 	enum rte_comp_op_type operation_type = test_data->decompress_state;
15336bbc5a92SArtur Trybula 	unsigned int zlib_decompress =
15346bbc5a92SArtur Trybula 			(test_data->zlib_dir == ZLIB_ALL ||
15356bbc5a92SArtur Trybula 			test_data->zlib_dir == ZLIB_DECOMPRESS);
1536a9de470cSBruce Richardson 
15376bbc5a92SArtur Trybula 	/* from int_data: */
15386bbc5a92SArtur Trybula 	struct rte_comp_xform **decompress_xforms = int_data->decompress_xforms;
15396bbc5a92SArtur Trybula 	unsigned int num_xforms = int_data->num_xforms;
15406bbc5a92SArtur Trybula 	unsigned int num_bufs = int_data->num_bufs;
1541a9de470cSBruce Richardson 
15426bbc5a92SArtur Trybula 	/* from test_priv_data: */
15436bbc5a92SArtur Trybula 	struct rte_mbuf **uncomp_bufs = test_priv_data->uncomp_bufs;
1544db06104cSAdam Dybkowski 	struct rte_mbuf **comp_bufs = test_priv_data->comp_bufs;
15456bbc5a92SArtur Trybula 	struct rte_comp_op **ops = test_priv_data->ops;
15466bbc5a92SArtur Trybula 	struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
15476bbc5a92SArtur Trybula 	void **priv_xforms = test_priv_data->priv_xforms;
15486bbc5a92SArtur Trybula 	uint32_t *compressed_data_size = test_priv_data->compressed_data_size;
15496bbc5a92SArtur Trybula 	void **stream = test_priv_data->stream;
15506bbc5a92SArtur Trybula 
15516bbc5a92SArtur Trybula 	const struct rte_compressdev_capabilities *capa =
15526bbc5a92SArtur Trybula 		rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
15536bbc5a92SArtur Trybula 
1554a9de470cSBruce Richardson 	ret = rte_comp_op_bulk_alloc(ts_params->op_pool, ops, num_bufs);
1555a9de470cSBruce Richardson 	if (ret < 0) {
1556a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1,
1557a9de470cSBruce Richardson 			"Decompress operations could not be allocated "
1558a9de470cSBruce Richardson 			"from the mempool\n");
15596bbc5a92SArtur Trybula 		ret_status = -1;
1560a9de470cSBruce Richardson 		goto exit;
1561a9de470cSBruce Richardson 	}
1562a9de470cSBruce Richardson 
1563a9de470cSBruce Richardson 	/* Source buffer is the compressed data from the previous operations */
1564a9de470cSBruce Richardson 	for (i = 0; i < num_bufs; i++) {
1565db06104cSAdam Dybkowski 		ops[i]->m_src = comp_bufs[i];
1566a9de470cSBruce Richardson 		ops[i]->m_dst = uncomp_bufs[i];
1567a9de470cSBruce Richardson 		ops[i]->src.offset = 0;
1568a9de470cSBruce Richardson 		/*
1569a9de470cSBruce Richardson 		 * Set the length of the compressed data to the
1570a9de470cSBruce Richardson 		 * number of bytes that were produced in the previous stage
1571a9de470cSBruce Richardson 		 */
15726bbc5a92SArtur Trybula 
15732437fbbcSArtur Trybula 		if (compressed_data_size[i])
15742437fbbcSArtur Trybula 			ops[i]->src.length = compressed_data_size[i];
15752437fbbcSArtur Trybula 		else
1576a9de470cSBruce Richardson 			ops[i]->src.length = ops_processed[i]->produced;
157707b810c5SAdam Dybkowski 
1578a9de470cSBruce Richardson 		ops[i]->dst.offset = 0;
15796bbc5a92SArtur Trybula 
15806bbc5a92SArtur Trybula 		if (operation_type == RTE_COMP_OP_STATELESS) {
1581a9de470cSBruce Richardson 			ops[i]->flush_flag = RTE_COMP_FLUSH_FINAL;
158207b810c5SAdam Dybkowski 			ops[i]->op_type = RTE_COMP_OP_STATELESS;
15836bbc5a92SArtur Trybula 		} else if (!zlib_decompress) {
158407b810c5SAdam Dybkowski 			ops[i]->flush_flag = RTE_COMP_FLUSH_SYNC;
158507b810c5SAdam Dybkowski 			ops[i]->op_type = RTE_COMP_OP_STATEFUL;
1586a9de470cSBruce Richardson 		} else {
1587a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
15886bbc5a92SArtur Trybula 				"Decompression: stateful operations are"
15896bbc5a92SArtur Trybula 				" not supported in these tests yet\n");
15906bbc5a92SArtur Trybula 			ret_status = -1;
1591a9de470cSBruce Richardson 			goto exit;
1592a9de470cSBruce Richardson 		}
1593a9de470cSBruce Richardson 		ops[i]->input_chksum = 0;
1594a9de470cSBruce Richardson 		/*
1595a9de470cSBruce Richardson 		 * Copy private data from previous operations,
1596a9de470cSBruce Richardson 		 * to keep the pointer to the original buffer
1597a9de470cSBruce Richardson 		 */
1598a9de470cSBruce Richardson 		memcpy(ops[i] + 1, ops_processed[i] + 1,
1599a9de470cSBruce Richardson 				sizeof(struct priv_op_data));
1600a9de470cSBruce Richardson 	}
1601a9de470cSBruce Richardson 
1602a9de470cSBruce Richardson 	/*
1603a9de470cSBruce Richardson 	 * Free the previous compress operations,
1604a9de470cSBruce Richardson 	 * as they are not needed anymore
1605a9de470cSBruce Richardson 	 */
1606a9de470cSBruce Richardson 	rte_comp_op_bulk_free(ops_processed, num_bufs);
1607a9de470cSBruce Richardson 
1608a9de470cSBruce Richardson 	/* Decompress data (either with Zlib API or compressdev API */
16096bbc5a92SArtur Trybula 	if (zlib_decompress) {
1610a9de470cSBruce Richardson 		for (i = 0; i < num_bufs; i++) {
1611a9de470cSBruce Richardson 			priv_data = (struct priv_op_data *)(ops[i] + 1);
1612a9de470cSBruce Richardson 			uint16_t xform_idx = priv_data->orig_idx % num_xforms;
1613a9de470cSBruce Richardson 			const struct rte_comp_xform *decompress_xform =
1614a9de470cSBruce Richardson 				decompress_xforms[xform_idx];
1615a9de470cSBruce Richardson 
1616a9de470cSBruce Richardson 			ret = decompress_zlib(ops[i], decompress_xform);
16176bbc5a92SArtur Trybula 			if (ret < 0) {
16186bbc5a92SArtur Trybula 				ret_status = -1;
1619a9de470cSBruce Richardson 				goto exit;
16206bbc5a92SArtur Trybula 			}
1621a9de470cSBruce Richardson 
1622a9de470cSBruce Richardson 			ops_processed[i] = ops[i];
1623a9de470cSBruce Richardson 		}
1624a9de470cSBruce Richardson 	} else {
16256bbc5a92SArtur Trybula 		if (operation_type == RTE_COMP_OP_STATELESS) {
1626a9de470cSBruce Richardson 			/* Create decompress private xform data */
1627a9de470cSBruce Richardson 			for (i = 0; i < num_xforms; i++) {
1628a9de470cSBruce Richardson 				ret = rte_compressdev_private_xform_create(0,
162907b810c5SAdam Dybkowski 					(const struct rte_comp_xform *)
163007b810c5SAdam Dybkowski 					decompress_xforms[i],
1631a9de470cSBruce Richardson 					&priv_xforms[i]);
1632a9de470cSBruce Richardson 				if (ret < 0) {
1633a9de470cSBruce Richardson 					RTE_LOG(ERR, USER1,
1634a9de470cSBruce Richardson 						"Decompression private xform "
1635a9de470cSBruce Richardson 						"could not be created\n");
16366bbc5a92SArtur Trybula 					ret_status = -1;
1637a9de470cSBruce Richardson 					goto exit;
1638a9de470cSBruce Richardson 				}
1639a9de470cSBruce Richardson 				num_priv_xforms++;
1640a9de470cSBruce Richardson 			}
1641a9de470cSBruce Richardson 
164207b810c5SAdam Dybkowski 			if (capa->comp_feature_flags &
164307b810c5SAdam Dybkowski 					RTE_COMP_FF_SHAREABLE_PRIV_XFORM) {
1644a9de470cSBruce Richardson 				/* Attach shareable private xform data to ops */
1645a9de470cSBruce Richardson 				for (i = 0; i < num_bufs; i++) {
164607b810c5SAdam Dybkowski 					priv_data = (struct priv_op_data *)
164707b810c5SAdam Dybkowski 							(ops[i] + 1);
164807b810c5SAdam Dybkowski 					uint16_t xform_idx =
164907b810c5SAdam Dybkowski 					       priv_data->orig_idx % num_xforms;
165007b810c5SAdam Dybkowski 					ops[i]->private_xform =
165107b810c5SAdam Dybkowski 							priv_xforms[xform_idx];
1652a9de470cSBruce Richardson 				}
1653a9de470cSBruce Richardson 			} else {
165407b810c5SAdam Dybkowski 				/* Create rest of the private xforms */
165507b810c5SAdam Dybkowski 				/* for the other ops */
1656a9de470cSBruce Richardson 				for (i = num_xforms; i < num_bufs; i++) {
165707b810c5SAdam Dybkowski 					ret =
165807b810c5SAdam Dybkowski 					 rte_compressdev_private_xform_create(0,
1659a9de470cSBruce Richardson 					      decompress_xforms[i % num_xforms],
1660a9de470cSBruce Richardson 					      &priv_xforms[i]);
1661a9de470cSBruce Richardson 					if (ret < 0) {
1662a9de470cSBruce Richardson 						RTE_LOG(ERR, USER1,
16636bbc5a92SArtur Trybula 							"Decompression private xform"
16646bbc5a92SArtur Trybula 							" could not be created\n");
16656bbc5a92SArtur Trybula 						ret_status = -1;
1666a9de470cSBruce Richardson 						goto exit;
1667a9de470cSBruce Richardson 					}
1668a9de470cSBruce Richardson 					num_priv_xforms++;
1669a9de470cSBruce Richardson 				}
1670a9de470cSBruce Richardson 
167107b810c5SAdam Dybkowski 				/* Attach non shareable private xform data */
167207b810c5SAdam Dybkowski 				/* to ops */
1673a9de470cSBruce Richardson 				for (i = 0; i < num_bufs; i++) {
167407b810c5SAdam Dybkowski 					priv_data = (struct priv_op_data *)
167507b810c5SAdam Dybkowski 							(ops[i] + 1);
167607b810c5SAdam Dybkowski 					uint16_t xform_idx =
167707b810c5SAdam Dybkowski 							priv_data->orig_idx;
167807b810c5SAdam Dybkowski 					ops[i]->private_xform =
167907b810c5SAdam Dybkowski 							priv_xforms[xform_idx];
1680a9de470cSBruce Richardson 				}
1681a9de470cSBruce Richardson 			}
168207b810c5SAdam Dybkowski 		} else {
168307b810c5SAdam Dybkowski 			/* Create a stream object for stateful decompression */
168407b810c5SAdam Dybkowski 			ret = rte_compressdev_stream_create(0,
16856bbc5a92SArtur Trybula 					decompress_xforms[0], stream);
168607b810c5SAdam Dybkowski 			if (ret < 0) {
168707b810c5SAdam Dybkowski 				RTE_LOG(ERR, USER1,
168807b810c5SAdam Dybkowski 					"Decompression stream could not be created, error %d\n",
168907b810c5SAdam Dybkowski 					ret);
16906bbc5a92SArtur Trybula 				ret_status = -1;
169107b810c5SAdam Dybkowski 				goto exit;
169207b810c5SAdam Dybkowski 			}
169307b810c5SAdam Dybkowski 			/* Attach stream to ops */
169407b810c5SAdam Dybkowski 			for (i = 0; i < num_bufs; i++)
16956bbc5a92SArtur Trybula 				ops[i]->stream = *stream;
169607b810c5SAdam Dybkowski 		}
1697a9de470cSBruce Richardson 
16986bbc5a92SArtur Trybula 		test_priv_data->num_priv_xforms = num_priv_xforms;
1699a9de470cSBruce Richardson 	}
1700a9de470cSBruce Richardson 
17016bbc5a92SArtur Trybula exit:
17026bbc5a92SArtur Trybula 	return ret_status;
17036bbc5a92SArtur Trybula }
17046bbc5a92SArtur Trybula 
17056bbc5a92SArtur Trybula /**
17066bbc5a92SArtur Trybula  * Prints out the test report. Memory freeing.
17076bbc5a92SArtur Trybula  *
17086bbc5a92SArtur Trybula  * Called after successful decompression.
17096bbc5a92SArtur Trybula  * Operation(s) status validation and compression buffers freeing.
17106bbc5a92SArtur Trybula 
17116bbc5a92SArtur Trybula  * -1 returned if function fail.
17126bbc5a92SArtur Trybula  *
17136bbc5a92SArtur Trybula  * @param int_data
17146bbc5a92SArtur Trybula  *   Interim data containing session/transformation objects.
17156bbc5a92SArtur Trybula  * @param test_data
17166bbc5a92SArtur Trybula  *   The test parameters set by users (command line parameters).
17176bbc5a92SArtur Trybula  * @param test_priv_data
17186bbc5a92SArtur Trybula  *   A container used for aggregation all the private test arrays.
17196bbc5a92SArtur Trybula  * @return
17206bbc5a92SArtur Trybula  *   - 2: Next step must be executed by the caller (stateful decompression only)
17216bbc5a92SArtur Trybula  *   - 1: On success (caller should stop and exit)
17226bbc5a92SArtur Trybula  *   - 0: On success.
17236bbc5a92SArtur Trybula  *   - -1: On error.
1724a9de470cSBruce Richardson  */
17256bbc5a92SArtur Trybula static int
test_deflate_decomp_finalize(const struct interim_data_params * int_data,const struct test_data_params * test_data,const struct test_private_arrays * test_priv_data)17266bbc5a92SArtur Trybula test_deflate_decomp_finalize(const struct interim_data_params *int_data,
17276bbc5a92SArtur Trybula 		const struct test_data_params *test_data,
17286bbc5a92SArtur Trybula 		const struct test_private_arrays *test_priv_data)
17296bbc5a92SArtur Trybula {
17306bbc5a92SArtur Trybula 	/* local variables: */
17316bbc5a92SArtur Trybula 	unsigned int i;
17326bbc5a92SArtur Trybula 	struct priv_op_data *priv_data;
17336bbc5a92SArtur Trybula 	static unsigned int step;
1734a9de470cSBruce Richardson 
17356bbc5a92SArtur Trybula 	/* from int_data: */
17366bbc5a92SArtur Trybula 	unsigned int num_bufs = int_data->num_bufs;
17376bbc5a92SArtur Trybula 	const char * const *test_bufs = int_data->test_bufs;
17386bbc5a92SArtur Trybula 	struct rte_comp_xform **compress_xforms = int_data->compress_xforms;
17396bbc5a92SArtur Trybula 
17406bbc5a92SArtur Trybula 	/* from test_priv_data: */
17416bbc5a92SArtur Trybula 	struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
17426bbc5a92SArtur Trybula 	struct rte_mbuf **comp_bufs = test_priv_data->comp_bufs;
17436bbc5a92SArtur Trybula 	struct rte_comp_op **ops = test_priv_data->ops;
17446bbc5a92SArtur Trybula 	uint64_t *compress_checksum = test_priv_data->compress_checksum;
17456bbc5a92SArtur Trybula 	unsigned int *decomp_produced_data_size =
17466bbc5a92SArtur Trybula 			test_priv_data->decomp_produced_data_size;
17476bbc5a92SArtur Trybula 	char **all_decomp_data = test_priv_data->all_decomp_data;
17486bbc5a92SArtur Trybula 
17496bbc5a92SArtur Trybula 	/* from test_data: */
17506bbc5a92SArtur Trybula 	unsigned int out_of_space = test_data->out_of_space;
17516bbc5a92SArtur Trybula 	enum rte_comp_op_type operation_type = test_data->decompress_state;
17526bbc5a92SArtur Trybula 
17536bbc5a92SArtur Trybula 	unsigned int zlib_compress =
17546bbc5a92SArtur Trybula 			(test_data->zlib_dir == ZLIB_ALL ||
17556bbc5a92SArtur Trybula 			test_data->zlib_dir == ZLIB_COMPRESS);
17566bbc5a92SArtur Trybula 	unsigned int zlib_decompress =
17576bbc5a92SArtur Trybula 			(test_data->zlib_dir == ZLIB_ALL ||
17586bbc5a92SArtur Trybula 			test_data->zlib_dir == ZLIB_DECOMPRESS);
1759a9de470cSBruce Richardson 
1760a9de470cSBruce Richardson 	for (i = 0; i < num_bufs; i++) {
1761a9de470cSBruce Richardson 		priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
1762a9de470cSBruce Richardson 		char engine[] = "zlib, (directly, no PMD)";
17636bbc5a92SArtur Trybula 		if (zlib_compress)
1764a9de470cSBruce Richardson 			strlcpy(engine, "pmd", sizeof(engine));
1765a9de470cSBruce Richardson 		RTE_LOG(DEBUG, USER1,
1766a9de470cSBruce Richardson 			"Buffer %u decompressed by %s from %u to %u bytes\n",
176796fe84f4SRebecca Troy 			i, engine,
1768a9de470cSBruce Richardson 			ops_processed[i]->consumed, ops_processed[i]->produced);
1769a9de470cSBruce Richardson 		ops[i] = NULL;
1770a9de470cSBruce Richardson 	}
1771a9de470cSBruce Richardson 
1772a9de470cSBruce Richardson 	/*
1773a9de470cSBruce Richardson 	 * Check operation status and free source mbuf (destination mbuf and
1774a9de470cSBruce Richardson 	 * compress operation information is still needed)
1775a9de470cSBruce Richardson 	 */
1776a9de470cSBruce Richardson 	for (i = 0; i < num_bufs; i++) {
17776bbc5a92SArtur Trybula 		if (out_of_space && !zlib_decompress) {
1778a9de470cSBruce Richardson 			if (ops_processed[i]->status !=
1779a9de470cSBruce Richardson 				RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED) {
17806bbc5a92SArtur Trybula 
1781a9de470cSBruce Richardson 				RTE_LOG(ERR, USER1,
1782a9de470cSBruce Richardson 					"Operation without expected out of "
1783a9de470cSBruce Richardson 					"space status error\n");
17846bbc5a92SArtur Trybula 				return -1;
1785a9de470cSBruce Richardson 			} else
1786a9de470cSBruce Richardson 				continue;
1787a9de470cSBruce Richardson 		}
1788a9de470cSBruce Richardson 
17896bbc5a92SArtur Trybula 		if (operation_type == RTE_COMP_OP_STATEFUL
179007b810c5SAdam Dybkowski 			&& (ops_processed[i]->status ==
179107b810c5SAdam Dybkowski 				RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE
179207b810c5SAdam Dybkowski 			    || ops_processed[i]->status ==
179307b810c5SAdam Dybkowski 				RTE_COMP_OP_STATUS_SUCCESS)) {
1794db06104cSAdam Dybkowski 
1795db06104cSAdam Dybkowski 			RTE_LOG(DEBUG, USER1,
1796db06104cSAdam Dybkowski 					".............RECOVERABLE\n");
1797db06104cSAdam Dybkowski 
179807b810c5SAdam Dybkowski 			/* collect the output into all_decomp_data */
179907b810c5SAdam Dybkowski 			const void *ptr = rte_pktmbuf_read(
180007b810c5SAdam Dybkowski 					ops_processed[i]->m_dst,
180107b810c5SAdam Dybkowski 					ops_processed[i]->dst.offset,
180207b810c5SAdam Dybkowski 					ops_processed[i]->produced,
18036bbc5a92SArtur Trybula 					*all_decomp_data +
18046bbc5a92SArtur Trybula 						*decomp_produced_data_size);
18056bbc5a92SArtur Trybula 			if (ptr != *all_decomp_data +
18066bbc5a92SArtur Trybula 					*decomp_produced_data_size)
18076bbc5a92SArtur Trybula 				rte_memcpy(*all_decomp_data +
18086bbc5a92SArtur Trybula 					   *decomp_produced_data_size,
180907b810c5SAdam Dybkowski 					   ptr, ops_processed[i]->produced);
18106bbc5a92SArtur Trybula 
18116bbc5a92SArtur Trybula 			*decomp_produced_data_size +=
18126bbc5a92SArtur Trybula 					ops_processed[i]->produced;
181307b810c5SAdam Dybkowski 			if (ops_processed[i]->src.length >
181407b810c5SAdam Dybkowski 					ops_processed[i]->consumed) {
181507b810c5SAdam Dybkowski 				if (ops_processed[i]->status ==
181607b810c5SAdam Dybkowski 						RTE_COMP_OP_STATUS_SUCCESS) {
181707b810c5SAdam Dybkowski 					RTE_LOG(ERR, USER1,
181807b810c5SAdam Dybkowski 					      "Operation finished too early\n");
18196bbc5a92SArtur Trybula 					return -1;
182007b810c5SAdam Dybkowski 				}
182107b810c5SAdam Dybkowski 				step++;
182207b810c5SAdam Dybkowski 				if (step >= test_data->decompress_steps_max) {
182307b810c5SAdam Dybkowski 					RTE_LOG(ERR, USER1,
182407b810c5SAdam Dybkowski 					  "Operation exceeded maximum steps\n");
18256bbc5a92SArtur Trybula 					return -1;
182607b810c5SAdam Dybkowski 				}
182707b810c5SAdam Dybkowski 				ops[i] = ops_processed[i];
182807b810c5SAdam Dybkowski 				ops[i]->status =
182907b810c5SAdam Dybkowski 					       RTE_COMP_OP_STATUS_NOT_PROCESSED;
183007b810c5SAdam Dybkowski 				ops[i]->src.offset +=
183107b810c5SAdam Dybkowski 						ops_processed[i]->consumed;
183207b810c5SAdam Dybkowski 				ops[i]->src.length -=
183307b810c5SAdam Dybkowski 						ops_processed[i]->consumed;
18346bbc5a92SArtur Trybula 				/* repeat the operation */
18356bbc5a92SArtur Trybula 				return 2;
183607b810c5SAdam Dybkowski 			} else {
183707b810c5SAdam Dybkowski 				/* Compare the original stream with the */
183807b810c5SAdam Dybkowski 				/* decompressed stream (in size and the data) */
183907b810c5SAdam Dybkowski 				priv_data = (struct priv_op_data *)
184007b810c5SAdam Dybkowski 						(ops_processed[i] + 1);
184107b810c5SAdam Dybkowski 				const char *buf1 =
184207b810c5SAdam Dybkowski 						test_bufs[priv_data->orig_idx];
18436bbc5a92SArtur Trybula 				const char *buf2 = *all_decomp_data;
184407b810c5SAdam Dybkowski 
184507b810c5SAdam Dybkowski 				if (compare_buffers(buf1, strlen(buf1) + 1,
18466bbc5a92SArtur Trybula 					  buf2, *decomp_produced_data_size) < 0)
18476bbc5a92SArtur Trybula 					return -1;
184807b810c5SAdam Dybkowski 				/* Test checksums */
184907b810c5SAdam Dybkowski 				if (compress_xforms[0]->compress.chksum
185007b810c5SAdam Dybkowski 						!= RTE_COMP_CHECKSUM_NONE) {
185107b810c5SAdam Dybkowski 					if (ops_processed[i]->output_chksum
185207b810c5SAdam Dybkowski 						      != compress_checksum[i]) {
185307b810c5SAdam Dybkowski 						RTE_LOG(ERR, USER1,
185407b810c5SAdam Dybkowski 			"The checksums differ\n"
185507b810c5SAdam Dybkowski 			"Compression Checksum: %" PRIu64 "\tDecompression "
185607b810c5SAdam Dybkowski 			"Checksum: %" PRIu64 "\n", compress_checksum[i],
185707b810c5SAdam Dybkowski 					       ops_processed[i]->output_chksum);
18586bbc5a92SArtur Trybula 						return -1;
185907b810c5SAdam Dybkowski 					}
186007b810c5SAdam Dybkowski 				}
186107b810c5SAdam Dybkowski 			}
186207b810c5SAdam Dybkowski 		} else if (ops_processed[i]->status !=
186307b810c5SAdam Dybkowski 			   RTE_COMP_OP_STATUS_SUCCESS) {
1864a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
1865db06104cSAdam Dybkowski 					"Decomp: Some operations were not successful, status = %u\n",
1866db06104cSAdam Dybkowski 					ops_processed[i]->status);
18676bbc5a92SArtur Trybula 			return -1;
1868a9de470cSBruce Richardson 		}
1869a9de470cSBruce Richardson 		priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
1870a9de470cSBruce Richardson 		rte_pktmbuf_free(comp_bufs[priv_data->orig_idx]);
1871a9de470cSBruce Richardson 		comp_bufs[priv_data->orig_idx] = NULL;
1872a9de470cSBruce Richardson 	}
1873a9de470cSBruce Richardson 
18746bbc5a92SArtur Trybula 	if (out_of_space && !zlib_decompress)
18756bbc5a92SArtur Trybula 		return 1;
18766bbc5a92SArtur Trybula 
18776bbc5a92SArtur Trybula 	return 0;
1878a9de470cSBruce Richardson }
1879a9de470cSBruce Richardson 
18806bbc5a92SArtur Trybula /**
18816bbc5a92SArtur Trybula  * Validation of the output (compression/decompression) data.
18826bbc5a92SArtur Trybula  *
18836bbc5a92SArtur Trybula  * The function compares the source stream with the output stream,
18846bbc5a92SArtur Trybula  * after decompression, to check if compression/decompression
18856bbc5a92SArtur Trybula  * was correct.
18866bbc5a92SArtur Trybula  * -1 returned if function fail.
18876bbc5a92SArtur Trybula  *
18886bbc5a92SArtur Trybula  * @param int_data
18896bbc5a92SArtur Trybula  *   Interim data containing session/transformation objects.
18906bbc5a92SArtur Trybula  * @param test_data
18916bbc5a92SArtur Trybula  *   The test parameters set by users (command line parameters).
18926bbc5a92SArtur Trybula  * @param test_priv_data
18936bbc5a92SArtur Trybula  *   A container used for aggregation all the private test arrays.
18946bbc5a92SArtur Trybula  * @return
18956bbc5a92SArtur Trybula  *   - 0: On success.
18966bbc5a92SArtur Trybula  *   - -1: On error.
18976bbc5a92SArtur Trybula  */
18986bbc5a92SArtur Trybula static int
test_results_validation(const struct interim_data_params * int_data,const struct test_data_params * test_data,const struct test_private_arrays * test_priv_data)18996bbc5a92SArtur Trybula test_results_validation(const struct interim_data_params *int_data,
19006bbc5a92SArtur Trybula 		const struct test_data_params *test_data,
19016bbc5a92SArtur Trybula 		const struct test_private_arrays *test_priv_data)
19026bbc5a92SArtur Trybula {
19036bbc5a92SArtur Trybula 	/* local variables: */
19046bbc5a92SArtur Trybula 	unsigned int i;
19056bbc5a92SArtur Trybula 	struct priv_op_data *priv_data;
19066bbc5a92SArtur Trybula 	const char *buf1;
19076bbc5a92SArtur Trybula 	const char *buf2;
19086bbc5a92SArtur Trybula 	char *contig_buf = NULL;
19096bbc5a92SArtur Trybula 	uint32_t data_size;
19106bbc5a92SArtur Trybula 
19116bbc5a92SArtur Trybula 	/* from int_data: */
19126bbc5a92SArtur Trybula 	struct rte_comp_xform **compress_xforms = int_data->compress_xforms;
19136bbc5a92SArtur Trybula 	unsigned int num_bufs = int_data->num_bufs;
19146bbc5a92SArtur Trybula 	const char * const *test_bufs = int_data->test_bufs;
19156bbc5a92SArtur Trybula 
19166bbc5a92SArtur Trybula 	/* from test_priv_data: */
19176bbc5a92SArtur Trybula 	uint64_t *compress_checksum = test_priv_data->compress_checksum;
19186bbc5a92SArtur Trybula 	struct rte_comp_op **ops_processed = test_priv_data->ops_processed;
19196bbc5a92SArtur Trybula 
1920a9de470cSBruce Richardson 	/*
1921a9de470cSBruce Richardson 	 * Compare the original stream with the decompressed stream
1922a9de470cSBruce Richardson 	 * (in size and the data)
1923a9de470cSBruce Richardson 	 */
1924a9de470cSBruce Richardson 	for (i = 0; i < num_bufs; i++) {
1925a9de470cSBruce Richardson 		priv_data = (struct priv_op_data *)(ops_processed[i] + 1);
19266bbc5a92SArtur Trybula 		buf1 = test_data->use_external_mbufs ?
19273fc3996fSAdam Dybkowski 				test_data->inbuf_memzone->addr :
19283fc3996fSAdam Dybkowski 				test_bufs[priv_data->orig_idx];
19293fc3996fSAdam Dybkowski 		data_size = test_data->use_external_mbufs ?
19303fc3996fSAdam Dybkowski 				test_data->inbuf_data_size :
19313fc3996fSAdam Dybkowski 				strlen(buf1) + 1;
19326bbc5a92SArtur Trybula 
1933a9de470cSBruce Richardson 		contig_buf = rte_malloc(NULL, ops_processed[i]->produced, 0);
1934a9de470cSBruce Richardson 		if (contig_buf == NULL) {
1935a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1, "Contiguous buffer could not "
1936a9de470cSBruce Richardson 					"be allocated\n");
1937a9de470cSBruce Richardson 			goto exit;
1938a9de470cSBruce Richardson 		}
1939a9de470cSBruce Richardson 
1940a9de470cSBruce Richardson 		buf2 = rte_pktmbuf_read(ops_processed[i]->m_dst, 0,
1941a9de470cSBruce Richardson 				ops_processed[i]->produced, contig_buf);
19423fc3996fSAdam Dybkowski 		if (compare_buffers(buf1, data_size,
1943a9de470cSBruce Richardson 				buf2, ops_processed[i]->produced) < 0)
1944a9de470cSBruce Richardson 			goto exit;
1945a9de470cSBruce Richardson 
1946a9de470cSBruce Richardson 		/* Test checksums */
1947a9de470cSBruce Richardson 		if (compress_xforms[0]->compress.chksum !=
1948a9de470cSBruce Richardson 				RTE_COMP_CHECKSUM_NONE) {
1949a9de470cSBruce Richardson 			if (ops_processed[i]->output_chksum !=
1950a9de470cSBruce Richardson 					compress_checksum[i]) {
1951a9de470cSBruce Richardson 				RTE_LOG(ERR, USER1, "The checksums differ\n"
1952a9de470cSBruce Richardson 			"Compression Checksum: %" PRIu64 "\tDecompression "
1953a9de470cSBruce Richardson 			"Checksum: %" PRIu64 "\n", compress_checksum[i],
1954a9de470cSBruce Richardson 			ops_processed[i]->output_chksum);
1955a9de470cSBruce Richardson 				goto exit;
1956a9de470cSBruce Richardson 			}
1957a9de470cSBruce Richardson 		}
1958a9de470cSBruce Richardson 
1959a9de470cSBruce Richardson 		rte_free(contig_buf);
1960a9de470cSBruce Richardson 		contig_buf = NULL;
1961a9de470cSBruce Richardson 	}
19626bbc5a92SArtur Trybula 	return 0;
1963a9de470cSBruce Richardson 
19646bbc5a92SArtur Trybula exit:
19656bbc5a92SArtur Trybula 	rte_free(contig_buf);
19666bbc5a92SArtur Trybula 	return -1;
19676bbc5a92SArtur Trybula }
19686bbc5a92SArtur Trybula 
19696bbc5a92SArtur Trybula /**
19706bbc5a92SArtur Trybula  * Compresses and decompresses input stream with compressdev API and Zlib API
19716bbc5a92SArtur Trybula  *
19726bbc5a92SArtur Trybula  * Basic test function. Common for all the functional tests.
19736bbc5a92SArtur Trybula  * -1 returned if function fail.
19746bbc5a92SArtur Trybula  *
19756bbc5a92SArtur Trybula  * @param int_data
19766bbc5a92SArtur Trybula  *   Interim data containing session/transformation objects.
19776bbc5a92SArtur Trybula  * @param test_data
19786bbc5a92SArtur Trybula  *   The test parameters set by users (command line parameters).
19796bbc5a92SArtur Trybula  * @return
19806bbc5a92SArtur Trybula  *   - 1: Some operation not supported
19816bbc5a92SArtur Trybula  *   - 0: On success.
19826bbc5a92SArtur Trybula  *   - -1: On error.
19836bbc5a92SArtur Trybula  */
19846bbc5a92SArtur Trybula 
19856bbc5a92SArtur Trybula static int
test_deflate_comp_decomp(const struct interim_data_params * int_data,const struct test_data_params * test_data)19866bbc5a92SArtur Trybula test_deflate_comp_decomp(const struct interim_data_params *int_data,
19876bbc5a92SArtur Trybula 		const struct test_data_params *test_data)
19886bbc5a92SArtur Trybula {
19896bbc5a92SArtur Trybula 	unsigned int num_bufs = int_data->num_bufs;
19906bbc5a92SArtur Trybula 	unsigned int out_of_space = test_data->out_of_space;
19916bbc5a92SArtur Trybula 
19926bbc5a92SArtur Trybula 	void *stream = NULL;
19936bbc5a92SArtur Trybula 	char *all_decomp_data = NULL;
19946bbc5a92SArtur Trybula 	unsigned int decomp_produced_data_size = 0;
19956bbc5a92SArtur Trybula 
19966bbc5a92SArtur Trybula 	int ret_status = -1;
19976bbc5a92SArtur Trybula 	int ret;
19986bbc5a92SArtur Trybula 	struct rte_mbuf *uncomp_bufs[num_bufs];
19996bbc5a92SArtur Trybula 	struct rte_mbuf *comp_bufs[num_bufs];
20006bbc5a92SArtur Trybula 	struct rte_comp_op *ops[num_bufs];
20016bbc5a92SArtur Trybula 	struct rte_comp_op *ops_processed[num_bufs];
20026bbc5a92SArtur Trybula 	void *priv_xforms[num_bufs];
20036bbc5a92SArtur Trybula 	unsigned int i;
20046bbc5a92SArtur Trybula 
20056bbc5a92SArtur Trybula 	uint64_t compress_checksum[num_bufs];
20066bbc5a92SArtur Trybula 	uint32_t compressed_data_size[num_bufs];
20076bbc5a92SArtur Trybula 	char *contig_buf = NULL;
20086bbc5a92SArtur Trybula 
20096bbc5a92SArtur Trybula 	struct rte_mbuf_ext_shared_info compbuf_info;
20106bbc5a92SArtur Trybula 	struct rte_mbuf_ext_shared_info decompbuf_info;
20116bbc5a92SArtur Trybula 
20126bbc5a92SArtur Trybula 	const struct rte_compressdev_capabilities *capa;
20136bbc5a92SArtur Trybula 
20146bbc5a92SArtur Trybula 	/* Compressing with CompressDev */
20156bbc5a92SArtur Trybula 	unsigned int zlib_compress =
20166bbc5a92SArtur Trybula 			(test_data->zlib_dir == ZLIB_ALL ||
20176bbc5a92SArtur Trybula 			test_data->zlib_dir == ZLIB_COMPRESS);
20186bbc5a92SArtur Trybula 	unsigned int zlib_decompress =
20196bbc5a92SArtur Trybula 			(test_data->zlib_dir == ZLIB_ALL ||
20206bbc5a92SArtur Trybula 			test_data->zlib_dir == ZLIB_DECOMPRESS);
20216bbc5a92SArtur Trybula 
20226bbc5a92SArtur Trybula 	struct test_private_arrays test_priv_data;
20236bbc5a92SArtur Trybula 
20246bbc5a92SArtur Trybula 	test_priv_data.uncomp_bufs = uncomp_bufs;
20256bbc5a92SArtur Trybula 	test_priv_data.comp_bufs = comp_bufs;
20266bbc5a92SArtur Trybula 	test_priv_data.ops = ops;
20276bbc5a92SArtur Trybula 	test_priv_data.ops_processed = ops_processed;
20286bbc5a92SArtur Trybula 	test_priv_data.priv_xforms = priv_xforms;
20296bbc5a92SArtur Trybula 	test_priv_data.compress_checksum = compress_checksum;
20306bbc5a92SArtur Trybula 	test_priv_data.compressed_data_size = compressed_data_size;
20316bbc5a92SArtur Trybula 
20326bbc5a92SArtur Trybula 	test_priv_data.stream = &stream;
20336bbc5a92SArtur Trybula 	test_priv_data.all_decomp_data = &all_decomp_data;
20346bbc5a92SArtur Trybula 	test_priv_data.decomp_produced_data_size = &decomp_produced_data_size;
20356bbc5a92SArtur Trybula 
20364a6672c2SStephen Hemminger 	test_priv_data.num_priv_xforms = 0; /* it's used for decompression only */
20376bbc5a92SArtur Trybula 
20386bbc5a92SArtur Trybula 	capa = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
20396bbc5a92SArtur Trybula 	if (capa == NULL) {
20406bbc5a92SArtur Trybula 		RTE_LOG(ERR, USER1,
20416bbc5a92SArtur Trybula 			"Compress device does not support DEFLATE\n");
20426bbc5a92SArtur Trybula 		return -1;
20436bbc5a92SArtur Trybula 	}
20446bbc5a92SArtur Trybula 
20456bbc5a92SArtur Trybula 	/* Prepare the source mbufs with the data */
20466bbc5a92SArtur Trybula 	ret = test_setup_com_bufs(int_data, test_data, &test_priv_data);
20476bbc5a92SArtur Trybula 	if (ret < 0) {
20486bbc5a92SArtur Trybula 		ret_status = -1;
20496bbc5a92SArtur Trybula 		goto exit;
20506bbc5a92SArtur Trybula 	}
20516bbc5a92SArtur Trybula 
2052db06104cSAdam Dybkowski 	RTE_LOG(DEBUG, USER1, "<<< COMPRESSION >>>\n");
2053db06104cSAdam Dybkowski 
20546bbc5a92SArtur Trybula /* COMPRESSION  */
20556bbc5a92SArtur Trybula 
20566bbc5a92SArtur Trybula 	/* Prepare output (destination) mbufs for compressed data */
20576bbc5a92SArtur Trybula 	ret = test_setup_output_bufs(
20586bbc5a92SArtur Trybula 			OPERATION_COMPRESSION,
20596bbc5a92SArtur Trybula 			out_of_space == 1 && !zlib_compress,
20606bbc5a92SArtur Trybula 			&test_priv_data,
20616bbc5a92SArtur Trybula 			int_data,
20626bbc5a92SArtur Trybula 			test_data,
20636bbc5a92SArtur Trybula 			&compbuf_info);
20646bbc5a92SArtur Trybula 	if (ret < 0) {
20656bbc5a92SArtur Trybula 		ret_status = -1;
20666bbc5a92SArtur Trybula 		goto exit;
20676bbc5a92SArtur Trybula 	}
20686bbc5a92SArtur Trybula 
20696bbc5a92SArtur Trybula 	/* Run compression */
20706bbc5a92SArtur Trybula 	ret = test_deflate_comp_run(int_data, test_data, &test_priv_data);
20716bbc5a92SArtur Trybula 	if (ret < 0) {
20726bbc5a92SArtur Trybula 		ret_status = -1;
20736bbc5a92SArtur Trybula 		goto exit;
20746bbc5a92SArtur Trybula 	}
20756bbc5a92SArtur Trybula 
20766bbc5a92SArtur Trybula 	ret = test_deflate_comp_finalize(int_data, test_data, &test_priv_data);
20776bbc5a92SArtur Trybula 	if (ret < 0) {
20786bbc5a92SArtur Trybula 		ret_status = -1;
20796bbc5a92SArtur Trybula 		goto exit;
20806bbc5a92SArtur Trybula 	} else if (ret == 1) {
20816bbc5a92SArtur Trybula 		ret_status = 0;
20826bbc5a92SArtur Trybula 		goto exit;
20836bbc5a92SArtur Trybula 	} else if (ret == 2) {
20846bbc5a92SArtur Trybula 		ret_status = 1;	 /* some operation not supported */
20856bbc5a92SArtur Trybula 		goto exit;
20866bbc5a92SArtur Trybula 	}
20876bbc5a92SArtur Trybula 
20886bbc5a92SArtur Trybula /* DECOMPRESSION  */
20896bbc5a92SArtur Trybula 
2090db06104cSAdam Dybkowski 	RTE_LOG(DEBUG, USER1, "<<< DECOMPRESSION >>>\n");
2091db06104cSAdam Dybkowski 
20926bbc5a92SArtur Trybula 	/* Prepare output (destination) mbufs for decompressed data */
20936bbc5a92SArtur Trybula 	ret = test_setup_output_bufs(
20946bbc5a92SArtur Trybula 			OPERATION_DECOMPRESSION,
20956bbc5a92SArtur Trybula 			out_of_space == 1 && !zlib_decompress,
20966bbc5a92SArtur Trybula 			&test_priv_data,
20976bbc5a92SArtur Trybula 			int_data,
20986bbc5a92SArtur Trybula 			test_data,
20996bbc5a92SArtur Trybula 			&decompbuf_info);
21006bbc5a92SArtur Trybula 	if (ret < 0) {
21016bbc5a92SArtur Trybula 		ret_status = -1;
21026bbc5a92SArtur Trybula 		goto exit;
21036bbc5a92SArtur Trybula 	}
21046bbc5a92SArtur Trybula 
21056bbc5a92SArtur Trybula 	/* Run decompression */
21066bbc5a92SArtur Trybula 	ret = test_deflate_decomp_run(int_data, test_data, &test_priv_data);
21076bbc5a92SArtur Trybula 	if (ret < 0) {
21086bbc5a92SArtur Trybula 		ret_status = -1;
21096bbc5a92SArtur Trybula 		goto exit;
21106bbc5a92SArtur Trybula 	}
21116bbc5a92SArtur Trybula 
21126bbc5a92SArtur Trybula 	if (!zlib_decompress) {
21136bbc5a92SArtur Trybula next_step:	/* next step for stateful decompression only */
21146bbc5a92SArtur Trybula 		ret = test_run_enqueue_dequeue(ops, ops_processed, num_bufs);
21156bbc5a92SArtur Trybula 		if (ret < 0) {
21166bbc5a92SArtur Trybula 			ret_status = -1;
21176bbc5a92SArtur Trybula 			RTE_LOG(ERR, USER1,
21186bbc5a92SArtur Trybula 				"Decompression: enqueue/dequeue operation failed\n");
21196bbc5a92SArtur Trybula 		}
21206bbc5a92SArtur Trybula 	}
21216bbc5a92SArtur Trybula 
21226bbc5a92SArtur Trybula 	ret = test_deflate_decomp_finalize(int_data, test_data, &test_priv_data);
21236bbc5a92SArtur Trybula 	if (ret < 0) {
21246bbc5a92SArtur Trybula 		ret_status = -1;
21256bbc5a92SArtur Trybula 		goto exit;
21266bbc5a92SArtur Trybula 	} else if (ret == 1) {
21276bbc5a92SArtur Trybula 		ret_status = 0;
21286bbc5a92SArtur Trybula 		goto exit;
21296bbc5a92SArtur Trybula 	} else if (ret == 2) {
21306bbc5a92SArtur Trybula 		goto next_step;
21316bbc5a92SArtur Trybula 	}
21326bbc5a92SArtur Trybula 
21336bbc5a92SArtur Trybula /* FINAL PROCESSING  */
21346bbc5a92SArtur Trybula 
21356bbc5a92SArtur Trybula 	ret = test_results_validation(int_data, test_data, &test_priv_data);
21366bbc5a92SArtur Trybula 	if (ret < 0) {
21376bbc5a92SArtur Trybula 		ret_status = -1;
21386bbc5a92SArtur Trybula 		goto exit;
21396bbc5a92SArtur Trybula 	}
21406bbc5a92SArtur Trybula 	ret_status = 0;
2141a9de470cSBruce Richardson 
2142a9de470cSBruce Richardson exit:
2143a9de470cSBruce Richardson 	/* Free resources */
21446bbc5a92SArtur Trybula 
21456bbc5a92SArtur Trybula 	if (stream != NULL)
21466bbc5a92SArtur Trybula 		rte_compressdev_stream_free(0, stream);
21476bbc5a92SArtur Trybula 	rte_free(all_decomp_data);
21486bbc5a92SArtur Trybula 
21496bbc5a92SArtur Trybula 	/* Free compress private xforms */
21506bbc5a92SArtur Trybula 	for (i = 0; i < test_priv_data.num_priv_xforms; i++) {
21516bbc5a92SArtur Trybula 		if (priv_xforms[i] != NULL) {
21526bbc5a92SArtur Trybula 			rte_compressdev_private_xform_free(0, priv_xforms[i]);
21536bbc5a92SArtur Trybula 			priv_xforms[i] = NULL;
21546bbc5a92SArtur Trybula 		}
21556bbc5a92SArtur Trybula 	}
2156a9de470cSBruce Richardson 	for (i = 0; i < num_bufs; i++) {
2157a9de470cSBruce Richardson 		rte_pktmbuf_free(uncomp_bufs[i]);
2158a9de470cSBruce Richardson 		rte_pktmbuf_free(comp_bufs[i]);
2159a9de470cSBruce Richardson 		rte_comp_op_free(ops[i]);
2160a9de470cSBruce Richardson 		rte_comp_op_free(ops_processed[i]);
2161a9de470cSBruce Richardson 	}
2162a9de470cSBruce Richardson 	rte_free(contig_buf);
2163a9de470cSBruce Richardson 
2164a9de470cSBruce Richardson 	return ret_status;
2165a9de470cSBruce Richardson }
2166a9de470cSBruce Richardson 
2167a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_fixed(void)2168a9de470cSBruce Richardson test_compressdev_deflate_stateless_fixed(void)
2169a9de470cSBruce Richardson {
2170a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
2171a9de470cSBruce Richardson 	uint16_t i;
2172a9de470cSBruce Richardson 	int ret;
2173a9de470cSBruce Richardson 	const struct rte_compressdev_capabilities *capab;
2174a9de470cSBruce Richardson 
2175a9de470cSBruce Richardson 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
2176a9de470cSBruce Richardson 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
2177a9de470cSBruce Richardson 
2178a9de470cSBruce Richardson 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0)
2179a9de470cSBruce Richardson 		return -ENOTSUP;
2180a9de470cSBruce Richardson 
2181a9de470cSBruce Richardson 	struct rte_comp_xform *compress_xform =
2182a9de470cSBruce Richardson 			rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
2183a9de470cSBruce Richardson 
2184a9de470cSBruce Richardson 	if (compress_xform == NULL) {
2185a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1,
2186a9de470cSBruce Richardson 			"Compress xform could not be created\n");
2187a9de470cSBruce Richardson 		ret = TEST_FAILED;
2188a9de470cSBruce Richardson 		goto exit;
2189a9de470cSBruce Richardson 	}
2190a9de470cSBruce Richardson 
2191a9de470cSBruce Richardson 	memcpy(compress_xform, ts_params->def_comp_xform,
2192a9de470cSBruce Richardson 			sizeof(struct rte_comp_xform));
2193a9de470cSBruce Richardson 	compress_xform->compress.deflate.huffman = RTE_COMP_HUFFMAN_FIXED;
2194a9de470cSBruce Richardson 
2195a9de470cSBruce Richardson 	struct interim_data_params int_data = {
2196a9de470cSBruce Richardson 		NULL,
2197a9de470cSBruce Richardson 		1,
2198a9de470cSBruce Richardson 		NULL,
2199a9de470cSBruce Richardson 		&compress_xform,
2200a9de470cSBruce Richardson 		&ts_params->def_decomp_xform,
2201a9de470cSBruce Richardson 		1
2202a9de470cSBruce Richardson 	};
2203a9de470cSBruce Richardson 
2204a9de470cSBruce Richardson 	struct test_data_params test_data = {
22053fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
22063fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
22073fc3996fSAdam Dybkowski 		.buff_type = LB_BOTH,
22083fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_DECOMPRESS,
22093fc3996fSAdam Dybkowski 		.out_of_space = 0,
22102437fbbcSArtur Trybula 		.big_data = 0,
2211db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2212db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
2213a9de470cSBruce Richardson 	};
2214a9de470cSBruce Richardson 
2215a9de470cSBruce Richardson 	for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2216a9de470cSBruce Richardson 		int_data.test_bufs = &compress_test_bufs[i];
2217a9de470cSBruce Richardson 		int_data.buf_idx = &i;
2218a9de470cSBruce Richardson 
2219a9de470cSBruce Richardson 		/* Compress with compressdev, decompress with Zlib */
2220a9de470cSBruce Richardson 		test_data.zlib_dir = ZLIB_DECOMPRESS;
222152d719d8SAdam Dybkowski 		ret = test_deflate_comp_decomp(&int_data, &test_data);
222252d719d8SAdam Dybkowski 		if (ret < 0)
2223a9de470cSBruce Richardson 			goto exit;
2224a9de470cSBruce Richardson 
2225a9de470cSBruce Richardson 		/* Compress with Zlib, decompress with compressdev */
2226a9de470cSBruce Richardson 		test_data.zlib_dir = ZLIB_COMPRESS;
222752d719d8SAdam Dybkowski 		ret = test_deflate_comp_decomp(&int_data, &test_data);
222852d719d8SAdam Dybkowski 		if (ret < 0)
2229a9de470cSBruce Richardson 			goto exit;
2230a9de470cSBruce Richardson 	}
2231a9de470cSBruce Richardson 
2232a9de470cSBruce Richardson 	ret = TEST_SUCCESS;
2233a9de470cSBruce Richardson 
2234a9de470cSBruce Richardson exit:
2235a9de470cSBruce Richardson 	rte_free(compress_xform);
2236a9de470cSBruce Richardson 	return ret;
2237a9de470cSBruce Richardson }
2238a9de470cSBruce Richardson 
2239a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_dynamic(void)2240a9de470cSBruce Richardson test_compressdev_deflate_stateless_dynamic(void)
2241a9de470cSBruce Richardson {
2242a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
2243a9de470cSBruce Richardson 	uint16_t i;
2244a9de470cSBruce Richardson 	int ret;
2245a9de470cSBruce Richardson 	struct rte_comp_xform *compress_xform =
2246a9de470cSBruce Richardson 			rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
2247a9de470cSBruce Richardson 
2248a9de470cSBruce Richardson 	const struct rte_compressdev_capabilities *capab;
2249a9de470cSBruce Richardson 
2250a9de470cSBruce Richardson 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
2251a9de470cSBruce Richardson 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
2252a9de470cSBruce Richardson 
2253a9de470cSBruce Richardson 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
2254a9de470cSBruce Richardson 		return -ENOTSUP;
2255a9de470cSBruce Richardson 
2256a9de470cSBruce Richardson 	if (compress_xform == NULL) {
2257a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1,
2258a9de470cSBruce Richardson 			"Compress xform could not be created\n");
2259a9de470cSBruce Richardson 		ret = TEST_FAILED;
2260a9de470cSBruce Richardson 		goto exit;
2261a9de470cSBruce Richardson 	}
2262a9de470cSBruce Richardson 
2263a9de470cSBruce Richardson 	memcpy(compress_xform, ts_params->def_comp_xform,
2264a9de470cSBruce Richardson 			sizeof(struct rte_comp_xform));
2265a9de470cSBruce Richardson 	compress_xform->compress.deflate.huffman = RTE_COMP_HUFFMAN_DYNAMIC;
2266a9de470cSBruce Richardson 
2267a9de470cSBruce Richardson 	struct interim_data_params int_data = {
2268a9de470cSBruce Richardson 		NULL,
2269a9de470cSBruce Richardson 		1,
2270a9de470cSBruce Richardson 		NULL,
2271a9de470cSBruce Richardson 		&compress_xform,
2272a9de470cSBruce Richardson 		&ts_params->def_decomp_xform,
2273a9de470cSBruce Richardson 		1
2274a9de470cSBruce Richardson 	};
2275a9de470cSBruce Richardson 
2276a9de470cSBruce Richardson 	struct test_data_params test_data = {
22773fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
22783fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
22793fc3996fSAdam Dybkowski 		.buff_type = LB_BOTH,
22803fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_DECOMPRESS,
22813fc3996fSAdam Dybkowski 		.out_of_space = 0,
22822437fbbcSArtur Trybula 		.big_data = 0,
2283db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2284db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
2285a9de470cSBruce Richardson 	};
2286a9de470cSBruce Richardson 
2287a9de470cSBruce Richardson 	for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2288a9de470cSBruce Richardson 		int_data.test_bufs = &compress_test_bufs[i];
2289a9de470cSBruce Richardson 		int_data.buf_idx = &i;
2290a9de470cSBruce Richardson 
2291a9de470cSBruce Richardson 		/* Compress with compressdev, decompress with Zlib */
2292a9de470cSBruce Richardson 		test_data.zlib_dir = ZLIB_DECOMPRESS;
229352d719d8SAdam Dybkowski 		ret = test_deflate_comp_decomp(&int_data, &test_data);
229452d719d8SAdam Dybkowski 		if (ret < 0)
2295a9de470cSBruce Richardson 			goto exit;
2296a9de470cSBruce Richardson 
2297a9de470cSBruce Richardson 		/* Compress with Zlib, decompress with compressdev */
2298a9de470cSBruce Richardson 		test_data.zlib_dir = ZLIB_COMPRESS;
229952d719d8SAdam Dybkowski 		ret = test_deflate_comp_decomp(&int_data, &test_data);
230052d719d8SAdam Dybkowski 		if (ret < 0)
2301a9de470cSBruce Richardson 			goto exit;
2302a9de470cSBruce Richardson 	}
2303a9de470cSBruce Richardson 
2304a9de470cSBruce Richardson 	ret = TEST_SUCCESS;
2305a9de470cSBruce Richardson 
2306a9de470cSBruce Richardson exit:
2307a9de470cSBruce Richardson 	rte_free(compress_xform);
2308a9de470cSBruce Richardson 	return ret;
2309a9de470cSBruce Richardson }
2310a9de470cSBruce Richardson 
2311a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_multi_op(void)2312a9de470cSBruce Richardson test_compressdev_deflate_stateless_multi_op(void)
2313a9de470cSBruce Richardson {
2314a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
2315a9de470cSBruce Richardson 	uint16_t num_bufs = RTE_DIM(compress_test_bufs);
2316a9de470cSBruce Richardson 	uint16_t buf_idx[num_bufs];
2317a9de470cSBruce Richardson 	uint16_t i;
231852d719d8SAdam Dybkowski 	int ret;
2319a9de470cSBruce Richardson 
2320a9de470cSBruce Richardson 	for (i = 0; i < num_bufs; i++)
2321a9de470cSBruce Richardson 		buf_idx[i] = i;
2322a9de470cSBruce Richardson 
2323a9de470cSBruce Richardson 	struct interim_data_params int_data = {
2324a9de470cSBruce Richardson 		compress_test_bufs,
2325a9de470cSBruce Richardson 		num_bufs,
2326a9de470cSBruce Richardson 		buf_idx,
2327a9de470cSBruce Richardson 		&ts_params->def_comp_xform,
2328a9de470cSBruce Richardson 		&ts_params->def_decomp_xform,
2329a9de470cSBruce Richardson 		1
2330a9de470cSBruce Richardson 	};
2331a9de470cSBruce Richardson 
2332a9de470cSBruce Richardson 	struct test_data_params test_data = {
23333fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
23343fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
23353fc3996fSAdam Dybkowski 		.buff_type = LB_BOTH,
23363fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_DECOMPRESS,
23373fc3996fSAdam Dybkowski 		.out_of_space = 0,
23382437fbbcSArtur Trybula 		.big_data = 0,
2339db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2340db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
2341a9de470cSBruce Richardson 	};
2342a9de470cSBruce Richardson 
2343a9de470cSBruce Richardson 	/* Compress with compressdev, decompress with Zlib */
2344a9de470cSBruce Richardson 	test_data.zlib_dir = ZLIB_DECOMPRESS;
234552d719d8SAdam Dybkowski 	ret = test_deflate_comp_decomp(&int_data, &test_data);
234652d719d8SAdam Dybkowski 	if (ret < 0)
234752d719d8SAdam Dybkowski 		return ret;
2348a9de470cSBruce Richardson 
2349a9de470cSBruce Richardson 	/* Compress with Zlib, decompress with compressdev */
2350a9de470cSBruce Richardson 	test_data.zlib_dir = ZLIB_COMPRESS;
235152d719d8SAdam Dybkowski 	ret = test_deflate_comp_decomp(&int_data, &test_data);
235252d719d8SAdam Dybkowski 	if (ret < 0)
235352d719d8SAdam Dybkowski 		return ret;
2354a9de470cSBruce Richardson 
2355a9de470cSBruce Richardson 	return TEST_SUCCESS;
2356a9de470cSBruce Richardson }
2357a9de470cSBruce Richardson 
2358a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_multi_level(void)2359a9de470cSBruce Richardson test_compressdev_deflate_stateless_multi_level(void)
2360a9de470cSBruce Richardson {
2361a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
2362a9de470cSBruce Richardson 	unsigned int level;
2363a9de470cSBruce Richardson 	uint16_t i;
2364a9de470cSBruce Richardson 	int ret;
2365a9de470cSBruce Richardson 	struct rte_comp_xform *compress_xform =
2366a9de470cSBruce Richardson 			rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
2367a9de470cSBruce Richardson 
2368a9de470cSBruce Richardson 	if (compress_xform == NULL) {
2369a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1,
2370a9de470cSBruce Richardson 			"Compress xform could not be created\n");
2371a9de470cSBruce Richardson 		ret = TEST_FAILED;
2372a9de470cSBruce Richardson 		goto exit;
2373a9de470cSBruce Richardson 	}
2374a9de470cSBruce Richardson 
2375a9de470cSBruce Richardson 	memcpy(compress_xform, ts_params->def_comp_xform,
2376a9de470cSBruce Richardson 			sizeof(struct rte_comp_xform));
2377a9de470cSBruce Richardson 
2378a9de470cSBruce Richardson 	struct interim_data_params int_data = {
2379a9de470cSBruce Richardson 		NULL,
2380a9de470cSBruce Richardson 		1,
2381a9de470cSBruce Richardson 		NULL,
2382a9de470cSBruce Richardson 		&compress_xform,
2383a9de470cSBruce Richardson 		&ts_params->def_decomp_xform,
2384a9de470cSBruce Richardson 		1
2385a9de470cSBruce Richardson 	};
2386a9de470cSBruce Richardson 
2387a9de470cSBruce Richardson 	struct test_data_params test_data = {
23883fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
23893fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
23903fc3996fSAdam Dybkowski 		.buff_type = LB_BOTH,
23913fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_DECOMPRESS,
23923fc3996fSAdam Dybkowski 		.out_of_space = 0,
23932437fbbcSArtur Trybula 		.big_data = 0,
2394db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2395db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
2396a9de470cSBruce Richardson 	};
2397a9de470cSBruce Richardson 
2398a9de470cSBruce Richardson 	for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2399a9de470cSBruce Richardson 		int_data.test_bufs = &compress_test_bufs[i];
2400a9de470cSBruce Richardson 		int_data.buf_idx = &i;
2401a9de470cSBruce Richardson 
2402a9de470cSBruce Richardson 		for (level = RTE_COMP_LEVEL_MIN; level <= RTE_COMP_LEVEL_MAX;
2403a9de470cSBruce Richardson 				level++) {
2404a9de470cSBruce Richardson 			compress_xform->compress.level = level;
2405a9de470cSBruce Richardson 			/* Compress with compressdev, decompress with Zlib */
2406a9de470cSBruce Richardson 			test_data.zlib_dir = ZLIB_DECOMPRESS;
240752d719d8SAdam Dybkowski 			ret = test_deflate_comp_decomp(&int_data, &test_data);
240852d719d8SAdam Dybkowski 			if (ret < 0)
2409a9de470cSBruce Richardson 				goto exit;
2410a9de470cSBruce Richardson 		}
2411a9de470cSBruce Richardson 	}
2412a9de470cSBruce Richardson 
2413a9de470cSBruce Richardson 	ret = TEST_SUCCESS;
2414a9de470cSBruce Richardson 
2415a9de470cSBruce Richardson exit:
2416a9de470cSBruce Richardson 	rte_free(compress_xform);
2417a9de470cSBruce Richardson 	return ret;
2418a9de470cSBruce Richardson }
2419a9de470cSBruce Richardson 
2420a9de470cSBruce Richardson #define NUM_XFORMS 3
2421a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_multi_xform(void)2422a9de470cSBruce Richardson test_compressdev_deflate_stateless_multi_xform(void)
2423a9de470cSBruce Richardson {
2424a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
2425a9de470cSBruce Richardson 	uint16_t num_bufs = NUM_XFORMS;
2426a9de470cSBruce Richardson 	struct rte_comp_xform *compress_xforms[NUM_XFORMS] = {NULL};
2427a9de470cSBruce Richardson 	struct rte_comp_xform *decompress_xforms[NUM_XFORMS] = {NULL};
2428a9de470cSBruce Richardson 	const char *test_buffers[NUM_XFORMS];
2429a9de470cSBruce Richardson 	uint16_t i;
2430a9de470cSBruce Richardson 	unsigned int level = RTE_COMP_LEVEL_MIN;
2431a9de470cSBruce Richardson 	uint16_t buf_idx[num_bufs];
2432a9de470cSBruce Richardson 	int ret;
2433a9de470cSBruce Richardson 
2434a9de470cSBruce Richardson 	/* Create multiple xforms with various levels */
2435a9de470cSBruce Richardson 	for (i = 0; i < NUM_XFORMS; i++) {
2436a9de470cSBruce Richardson 		compress_xforms[i] = rte_malloc(NULL,
2437a9de470cSBruce Richardson 				sizeof(struct rte_comp_xform), 0);
2438a9de470cSBruce Richardson 		if (compress_xforms[i] == NULL) {
2439a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
2440a9de470cSBruce Richardson 				"Compress xform could not be created\n");
2441a9de470cSBruce Richardson 			ret = TEST_FAILED;
2442a9de470cSBruce Richardson 			goto exit;
2443a9de470cSBruce Richardson 		}
2444a9de470cSBruce Richardson 
2445a9de470cSBruce Richardson 		memcpy(compress_xforms[i], ts_params->def_comp_xform,
2446a9de470cSBruce Richardson 				sizeof(struct rte_comp_xform));
2447a9de470cSBruce Richardson 		compress_xforms[i]->compress.level = level;
2448a9de470cSBruce Richardson 		level++;
2449a9de470cSBruce Richardson 
2450a9de470cSBruce Richardson 		decompress_xforms[i] = rte_malloc(NULL,
2451a9de470cSBruce Richardson 				sizeof(struct rte_comp_xform), 0);
2452a9de470cSBruce Richardson 		if (decompress_xforms[i] == NULL) {
2453a9de470cSBruce Richardson 			RTE_LOG(ERR, USER1,
2454a9de470cSBruce Richardson 				"Decompress xform could not be created\n");
2455a9de470cSBruce Richardson 			ret = TEST_FAILED;
2456a9de470cSBruce Richardson 			goto exit;
2457a9de470cSBruce Richardson 		}
2458a9de470cSBruce Richardson 
2459a9de470cSBruce Richardson 		memcpy(decompress_xforms[i], ts_params->def_decomp_xform,
2460a9de470cSBruce Richardson 				sizeof(struct rte_comp_xform));
2461a9de470cSBruce Richardson 	}
2462a9de470cSBruce Richardson 
2463a9de470cSBruce Richardson 	for (i = 0; i < NUM_XFORMS; i++) {
2464a9de470cSBruce Richardson 		buf_idx[i] = 0;
2465a9de470cSBruce Richardson 		/* Use the same buffer in all sessions */
2466a9de470cSBruce Richardson 		test_buffers[i] = compress_test_bufs[0];
2467a9de470cSBruce Richardson 	}
2468a9de470cSBruce Richardson 
2469a9de470cSBruce Richardson 	struct interim_data_params int_data = {
2470a9de470cSBruce Richardson 		test_buffers,
2471a9de470cSBruce Richardson 		num_bufs,
2472a9de470cSBruce Richardson 		buf_idx,
2473a9de470cSBruce Richardson 		compress_xforms,
2474a9de470cSBruce Richardson 		decompress_xforms,
2475a9de470cSBruce Richardson 		NUM_XFORMS
2476a9de470cSBruce Richardson 	};
2477a9de470cSBruce Richardson 
2478a9de470cSBruce Richardson 	struct test_data_params test_data = {
24793fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
24803fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
24813fc3996fSAdam Dybkowski 		.buff_type = LB_BOTH,
24823fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_DECOMPRESS,
24833fc3996fSAdam Dybkowski 		.out_of_space = 0,
24842437fbbcSArtur Trybula 		.big_data = 0,
2485db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2486db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
2487a9de470cSBruce Richardson 	};
2488a9de470cSBruce Richardson 
2489a9de470cSBruce Richardson 	/* Compress with compressdev, decompress with Zlib */
249052d719d8SAdam Dybkowski 	ret = test_deflate_comp_decomp(&int_data, &test_data);
249152d719d8SAdam Dybkowski 	if (ret < 0)
2492a9de470cSBruce Richardson 		goto exit;
2493a9de470cSBruce Richardson 
2494a9de470cSBruce Richardson 	ret = TEST_SUCCESS;
249552d719d8SAdam Dybkowski 
2496a9de470cSBruce Richardson exit:
2497a9de470cSBruce Richardson 	for (i = 0; i < NUM_XFORMS; i++) {
2498a9de470cSBruce Richardson 		rte_free(compress_xforms[i]);
2499a9de470cSBruce Richardson 		rte_free(decompress_xforms[i]);
2500a9de470cSBruce Richardson 	}
2501a9de470cSBruce Richardson 
2502a9de470cSBruce Richardson 	return ret;
2503a9de470cSBruce Richardson }
2504a9de470cSBruce Richardson 
2505a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_sgl(void)2506a9de470cSBruce Richardson test_compressdev_deflate_stateless_sgl(void)
2507a9de470cSBruce Richardson {
2508a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
2509a9de470cSBruce Richardson 	uint16_t i;
251052d719d8SAdam Dybkowski 	int ret;
2511a9de470cSBruce Richardson 	const struct rte_compressdev_capabilities *capab;
2512a9de470cSBruce Richardson 
2513a9de470cSBruce Richardson 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
2514a9de470cSBruce Richardson 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
2515a9de470cSBruce Richardson 
2516a9de470cSBruce Richardson 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
2517a9de470cSBruce Richardson 		return -ENOTSUP;
2518a9de470cSBruce Richardson 
2519a9de470cSBruce Richardson 	struct interim_data_params int_data = {
2520a9de470cSBruce Richardson 		NULL,
2521a9de470cSBruce Richardson 		1,
2522a9de470cSBruce Richardson 		NULL,
2523a9de470cSBruce Richardson 		&ts_params->def_comp_xform,
2524a9de470cSBruce Richardson 		&ts_params->def_decomp_xform,
2525a9de470cSBruce Richardson 		1
2526a9de470cSBruce Richardson 	};
2527a9de470cSBruce Richardson 
2528a9de470cSBruce Richardson 	struct test_data_params test_data = {
25293fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
25303fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
25313fc3996fSAdam Dybkowski 		.buff_type = SGL_BOTH,
25323fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_DECOMPRESS,
25333fc3996fSAdam Dybkowski 		.out_of_space = 0,
25342437fbbcSArtur Trybula 		.big_data = 0,
2535db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2536db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
2537a9de470cSBruce Richardson 	};
2538a9de470cSBruce Richardson 
2539a9de470cSBruce Richardson 	for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2540a9de470cSBruce Richardson 		int_data.test_bufs = &compress_test_bufs[i];
2541a9de470cSBruce Richardson 		int_data.buf_idx = &i;
2542a9de470cSBruce Richardson 
2543a9de470cSBruce Richardson 		/* Compress with compressdev, decompress with Zlib */
2544a9de470cSBruce Richardson 		test_data.zlib_dir = ZLIB_DECOMPRESS;
254552d719d8SAdam Dybkowski 		ret = test_deflate_comp_decomp(&int_data, &test_data);
254652d719d8SAdam Dybkowski 		if (ret < 0)
254752d719d8SAdam Dybkowski 			return ret;
2548a9de470cSBruce Richardson 
2549a9de470cSBruce Richardson 		/* Compress with Zlib, decompress with compressdev */
2550a9de470cSBruce Richardson 		test_data.zlib_dir = ZLIB_COMPRESS;
255152d719d8SAdam Dybkowski 		ret = test_deflate_comp_decomp(&int_data, &test_data);
255252d719d8SAdam Dybkowski 		if (ret < 0)
255352d719d8SAdam Dybkowski 			return ret;
2554a9de470cSBruce Richardson 
2555a9de470cSBruce Richardson 		if (capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_LB_OUT) {
2556a9de470cSBruce Richardson 			/* Compress with compressdev, decompress with Zlib */
2557a9de470cSBruce Richardson 			test_data.zlib_dir = ZLIB_DECOMPRESS;
2558a9de470cSBruce Richardson 			test_data.buff_type = SGL_TO_LB;
255952d719d8SAdam Dybkowski 			ret = test_deflate_comp_decomp(&int_data, &test_data);
256052d719d8SAdam Dybkowski 			if (ret < 0)
256152d719d8SAdam Dybkowski 				return ret;
2562a9de470cSBruce Richardson 
2563a9de470cSBruce Richardson 			/* Compress with Zlib, decompress with compressdev */
2564a9de470cSBruce Richardson 			test_data.zlib_dir = ZLIB_COMPRESS;
2565a9de470cSBruce Richardson 			test_data.buff_type = SGL_TO_LB;
256652d719d8SAdam Dybkowski 			ret = test_deflate_comp_decomp(&int_data, &test_data);
256752d719d8SAdam Dybkowski 			if (ret < 0)
256852d719d8SAdam Dybkowski 				return ret;
2569a9de470cSBruce Richardson 		}
2570a9de470cSBruce Richardson 
2571a9de470cSBruce Richardson 		if (capab->comp_feature_flags & RTE_COMP_FF_OOP_LB_IN_SGL_OUT) {
2572a9de470cSBruce Richardson 			/* Compress with compressdev, decompress with Zlib */
2573a9de470cSBruce Richardson 			test_data.zlib_dir = ZLIB_DECOMPRESS;
2574a9de470cSBruce Richardson 			test_data.buff_type = LB_TO_SGL;
257552d719d8SAdam Dybkowski 			ret = test_deflate_comp_decomp(&int_data, &test_data);
257652d719d8SAdam Dybkowski 			if (ret < 0)
257752d719d8SAdam Dybkowski 				return ret;
2578a9de470cSBruce Richardson 
2579a9de470cSBruce Richardson 			/* Compress with Zlib, decompress with compressdev */
2580a9de470cSBruce Richardson 			test_data.zlib_dir = ZLIB_COMPRESS;
2581a9de470cSBruce Richardson 			test_data.buff_type = LB_TO_SGL;
258252d719d8SAdam Dybkowski 			ret = test_deflate_comp_decomp(&int_data, &test_data);
258352d719d8SAdam Dybkowski 			if (ret < 0)
258452d719d8SAdam Dybkowski 				return ret;
2585a9de470cSBruce Richardson 		}
2586a9de470cSBruce Richardson 	}
2587a9de470cSBruce Richardson 
2588a9de470cSBruce Richardson 	return TEST_SUCCESS;
2589a9de470cSBruce Richardson }
2590a9de470cSBruce Richardson 
2591a9de470cSBruce Richardson static int
test_compressdev_deflate_stateless_checksum(void)2592a9de470cSBruce Richardson test_compressdev_deflate_stateless_checksum(void)
2593a9de470cSBruce Richardson {
2594a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
2595a9de470cSBruce Richardson 	uint16_t i;
2596a9de470cSBruce Richardson 	int ret;
2597a9de470cSBruce Richardson 	const struct rte_compressdev_capabilities *capab;
2598a9de470cSBruce Richardson 
2599a9de470cSBruce Richardson 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
2600a9de470cSBruce Richardson 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
2601a9de470cSBruce Richardson 
2602a9de470cSBruce Richardson 	/* Check if driver supports any checksum */
2603a9de470cSBruce Richardson 	if ((capab->comp_feature_flags & RTE_COMP_FF_CRC32_CHECKSUM) == 0 &&
2604a9de470cSBruce Richardson 			(capab->comp_feature_flags &
2605a9de470cSBruce Richardson 			RTE_COMP_FF_ADLER32_CHECKSUM) == 0 &&
2606a9de470cSBruce Richardson 			(capab->comp_feature_flags &
2607a9de470cSBruce Richardson 			RTE_COMP_FF_CRC32_ADLER32_CHECKSUM) == 0)
2608a9de470cSBruce Richardson 		return -ENOTSUP;
2609a9de470cSBruce Richardson 
2610a9de470cSBruce Richardson 	struct rte_comp_xform *compress_xform =
2611a9de470cSBruce Richardson 			rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
2612a9de470cSBruce Richardson 	if (compress_xform == NULL) {
2613a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Compress xform could not be created\n");
261452d719d8SAdam Dybkowski 		return TEST_FAILED;
2615a9de470cSBruce Richardson 	}
2616a9de470cSBruce Richardson 
2617a9de470cSBruce Richardson 	memcpy(compress_xform, ts_params->def_comp_xform,
2618a9de470cSBruce Richardson 			sizeof(struct rte_comp_xform));
2619a9de470cSBruce Richardson 
2620a9de470cSBruce Richardson 	struct rte_comp_xform *decompress_xform =
2621a9de470cSBruce Richardson 			rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
2622a9de470cSBruce Richardson 	if (decompress_xform == NULL) {
2623a9de470cSBruce Richardson 		RTE_LOG(ERR, USER1, "Decompress xform could not be created\n");
2624a9de470cSBruce Richardson 		rte_free(compress_xform);
262552d719d8SAdam Dybkowski 		return TEST_FAILED;
2626a9de470cSBruce Richardson 	}
2627a9de470cSBruce Richardson 
2628a9de470cSBruce Richardson 	memcpy(decompress_xform, ts_params->def_decomp_xform,
2629a9de470cSBruce Richardson 			sizeof(struct rte_comp_xform));
2630a9de470cSBruce Richardson 
2631a9de470cSBruce Richardson 	struct interim_data_params int_data = {
2632a9de470cSBruce Richardson 		NULL,
2633a9de470cSBruce Richardson 		1,
2634a9de470cSBruce Richardson 		NULL,
2635a9de470cSBruce Richardson 		&compress_xform,
2636a9de470cSBruce Richardson 		&decompress_xform,
2637a9de470cSBruce Richardson 		1
2638a9de470cSBruce Richardson 	};
2639a9de470cSBruce Richardson 
2640a9de470cSBruce Richardson 	struct test_data_params test_data = {
26413fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
26423fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
26433fc3996fSAdam Dybkowski 		.buff_type = LB_BOTH,
26443fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_DECOMPRESS,
26453fc3996fSAdam Dybkowski 		.out_of_space = 0,
26462437fbbcSArtur Trybula 		.big_data = 0,
2647db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2648db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
2649a9de470cSBruce Richardson 	};
2650a9de470cSBruce Richardson 
2651a9de470cSBruce Richardson 	/* Check if driver supports crc32 checksum and test */
2652a9de470cSBruce Richardson 	if ((capab->comp_feature_flags & RTE_COMP_FF_CRC32_CHECKSUM)) {
2653a9de470cSBruce Richardson 		compress_xform->compress.chksum = RTE_COMP_CHECKSUM_CRC32;
2654a9de470cSBruce Richardson 		decompress_xform->decompress.chksum = RTE_COMP_CHECKSUM_CRC32;
2655a9de470cSBruce Richardson 
2656a9de470cSBruce Richardson 		for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2657a9de470cSBruce Richardson 			/* Compress with compressdev, decompress with Zlib */
2658a9de470cSBruce Richardson 			int_data.test_bufs = &compress_test_bufs[i];
2659a9de470cSBruce Richardson 			int_data.buf_idx = &i;
2660a9de470cSBruce Richardson 
2661a9de470cSBruce Richardson 			/* Generate zlib checksum and test against selected
2662a9de470cSBruce Richardson 			 * drivers decompression checksum
2663a9de470cSBruce Richardson 			 */
2664a9de470cSBruce Richardson 			test_data.zlib_dir = ZLIB_COMPRESS;
266552d719d8SAdam Dybkowski 			ret = test_deflate_comp_decomp(&int_data, &test_data);
266652d719d8SAdam Dybkowski 			if (ret < 0)
2667a9de470cSBruce Richardson 				goto exit;
2668a9de470cSBruce Richardson 
2669a9de470cSBruce Richardson 			/* Generate compression and decompression
2670a9de470cSBruce Richardson 			 * checksum of selected driver
2671a9de470cSBruce Richardson 			 */
2672a9de470cSBruce Richardson 			test_data.zlib_dir = ZLIB_NONE;
267352d719d8SAdam Dybkowski 			ret = test_deflate_comp_decomp(&int_data, &test_data);
267452d719d8SAdam Dybkowski 			if (ret < 0)
2675a9de470cSBruce Richardson 				goto exit;
2676a9de470cSBruce Richardson 		}
2677a9de470cSBruce Richardson 	}
2678a9de470cSBruce Richardson 
2679a9de470cSBruce Richardson 	/* Check if driver supports adler32 checksum and test */
2680a9de470cSBruce Richardson 	if ((capab->comp_feature_flags & RTE_COMP_FF_ADLER32_CHECKSUM)) {
2681a9de470cSBruce Richardson 		compress_xform->compress.chksum = RTE_COMP_CHECKSUM_ADLER32;
2682a9de470cSBruce Richardson 		decompress_xform->decompress.chksum = RTE_COMP_CHECKSUM_ADLER32;
2683a9de470cSBruce Richardson 
2684a9de470cSBruce Richardson 		for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2685a9de470cSBruce Richardson 			int_data.test_bufs = &compress_test_bufs[i];
2686a9de470cSBruce Richardson 			int_data.buf_idx = &i;
2687a9de470cSBruce Richardson 
2688a9de470cSBruce Richardson 			/* Generate zlib checksum and test against selected
2689a9de470cSBruce Richardson 			 * drivers decompression checksum
2690a9de470cSBruce Richardson 			 */
2691a9de470cSBruce Richardson 			test_data.zlib_dir = ZLIB_COMPRESS;
269252d719d8SAdam Dybkowski 			ret = test_deflate_comp_decomp(&int_data, &test_data);
269352d719d8SAdam Dybkowski 			if (ret < 0)
2694a9de470cSBruce Richardson 				goto exit;
2695a9de470cSBruce Richardson 			/* Generate compression and decompression
2696a9de470cSBruce Richardson 			 * checksum of selected driver
2697a9de470cSBruce Richardson 			 */
2698a9de470cSBruce Richardson 			test_data.zlib_dir = ZLIB_NONE;
269952d719d8SAdam Dybkowski 			ret = test_deflate_comp_decomp(&int_data, &test_data);
270052d719d8SAdam Dybkowski 			if (ret < 0)
2701a9de470cSBruce Richardson 				goto exit;
2702a9de470cSBruce Richardson 		}
2703a9de470cSBruce Richardson 	}
2704a9de470cSBruce Richardson 
2705a9de470cSBruce Richardson 	/* Check if driver supports combined crc and adler checksum and test */
2706a9de470cSBruce Richardson 	if ((capab->comp_feature_flags & RTE_COMP_FF_CRC32_ADLER32_CHECKSUM)) {
2707a9de470cSBruce Richardson 		compress_xform->compress.chksum =
2708a9de470cSBruce Richardson 				RTE_COMP_CHECKSUM_CRC32_ADLER32;
2709a9de470cSBruce Richardson 		decompress_xform->decompress.chksum =
2710a9de470cSBruce Richardson 				RTE_COMP_CHECKSUM_CRC32_ADLER32;
2711a9de470cSBruce Richardson 
2712a9de470cSBruce Richardson 		for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
2713a9de470cSBruce Richardson 			int_data.test_bufs = &compress_test_bufs[i];
2714a9de470cSBruce Richardson 			int_data.buf_idx = &i;
2715a9de470cSBruce Richardson 
2716a9de470cSBruce Richardson 			/* Generate compression and decompression
2717a9de470cSBruce Richardson 			 * checksum of selected driver
2718a9de470cSBruce Richardson 			 */
2719a9de470cSBruce Richardson 			test_data.zlib_dir = ZLIB_NONE;
272052d719d8SAdam Dybkowski 			ret = test_deflate_comp_decomp(&int_data, &test_data);
272152d719d8SAdam Dybkowski 			if (ret < 0)
2722a9de470cSBruce Richardson 				goto exit;
2723a9de470cSBruce Richardson 		}
2724a9de470cSBruce Richardson 	}
2725a9de470cSBruce Richardson 
2726a9de470cSBruce Richardson 	ret = TEST_SUCCESS;
2727a9de470cSBruce Richardson 
2728a9de470cSBruce Richardson exit:
2729a9de470cSBruce Richardson 	rte_free(compress_xform);
2730a9de470cSBruce Richardson 	rte_free(decompress_xform);
2731a9de470cSBruce Richardson 	return ret;
2732a9de470cSBruce Richardson }
2733a9de470cSBruce Richardson 
2734a9de470cSBruce Richardson static int
test_compressdev_out_of_space_buffer(void)2735a9de470cSBruce Richardson test_compressdev_out_of_space_buffer(void)
2736a9de470cSBruce Richardson {
2737a9de470cSBruce Richardson 	struct comp_testsuite_params *ts_params = &testsuite_params;
2738a9de470cSBruce Richardson 	int ret;
2739a9de470cSBruce Richardson 	uint16_t i;
2740a9de470cSBruce Richardson 	const struct rte_compressdev_capabilities *capab;
2741a9de470cSBruce Richardson 
274207b810c5SAdam Dybkowski 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
2743a9de470cSBruce Richardson 
2744a9de470cSBruce Richardson 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
2745a9de470cSBruce Richardson 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
2746a9de470cSBruce Richardson 
2747a9de470cSBruce Richardson 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0)
2748a9de470cSBruce Richardson 		return -ENOTSUP;
2749a9de470cSBruce Richardson 
2750a9de470cSBruce Richardson 	struct interim_data_params int_data = {
2751a9de470cSBruce Richardson 		&compress_test_bufs[0],
2752a9de470cSBruce Richardson 		1,
2753a9de470cSBruce Richardson 		&i,
2754a9de470cSBruce Richardson 		&ts_params->def_comp_xform,
2755a9de470cSBruce Richardson 		&ts_params->def_decomp_xform,
2756a9de470cSBruce Richardson 		1
2757a9de470cSBruce Richardson 	};
2758a9de470cSBruce Richardson 
2759a9de470cSBruce Richardson 	struct test_data_params test_data = {
27603fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
27613fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
27623fc3996fSAdam Dybkowski 		.buff_type = LB_BOTH,
27633fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_DECOMPRESS,
27643fc3996fSAdam Dybkowski 		.out_of_space = 1,  /* run out-of-space test */
27652437fbbcSArtur Trybula 		.big_data = 0,
2766db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2767db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
2768a9de470cSBruce Richardson 	};
2769a9de470cSBruce Richardson 	/* Compress with compressdev, decompress with Zlib */
2770a9de470cSBruce Richardson 	test_data.zlib_dir = ZLIB_DECOMPRESS;
277152d719d8SAdam Dybkowski 	ret = test_deflate_comp_decomp(&int_data, &test_data);
277252d719d8SAdam Dybkowski 	if (ret < 0)
2773a9de470cSBruce Richardson 		goto exit;
2774a9de470cSBruce Richardson 
2775a9de470cSBruce Richardson 	/* Compress with Zlib, decompress with compressdev */
2776a9de470cSBruce Richardson 	test_data.zlib_dir = ZLIB_COMPRESS;
277752d719d8SAdam Dybkowski 	ret = test_deflate_comp_decomp(&int_data, &test_data);
277852d719d8SAdam Dybkowski 	if (ret < 0)
2779a9de470cSBruce Richardson 		goto exit;
2780a9de470cSBruce Richardson 
2781a9de470cSBruce Richardson 	if (capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) {
2782a9de470cSBruce Richardson 		/* Compress with compressdev, decompress with Zlib */
2783a9de470cSBruce Richardson 		test_data.zlib_dir = ZLIB_DECOMPRESS;
2784a9de470cSBruce Richardson 		test_data.buff_type = SGL_BOTH;
278552d719d8SAdam Dybkowski 		ret = test_deflate_comp_decomp(&int_data, &test_data);
278652d719d8SAdam Dybkowski 		if (ret < 0)
2787a9de470cSBruce Richardson 			goto exit;
2788a9de470cSBruce Richardson 
2789a9de470cSBruce Richardson 		/* Compress with Zlib, decompress with compressdev */
2790a9de470cSBruce Richardson 		test_data.zlib_dir = ZLIB_COMPRESS;
2791a9de470cSBruce Richardson 		test_data.buff_type = SGL_BOTH;
279252d719d8SAdam Dybkowski 		ret = test_deflate_comp_decomp(&int_data, &test_data);
279352d719d8SAdam Dybkowski 		if (ret < 0)
2794a9de470cSBruce Richardson 			goto exit;
2795a9de470cSBruce Richardson 	}
2796a9de470cSBruce Richardson 
2797a9de470cSBruce Richardson 	ret  = TEST_SUCCESS;
2798a9de470cSBruce Richardson 
2799a9de470cSBruce Richardson exit:
2800a9de470cSBruce Richardson 	return ret;
2801a9de470cSBruce Richardson }
2802a9de470cSBruce Richardson 
28039df7ffd1STomasz Jozwiak static int
test_compressdev_deflate_stateless_dynamic_big(void)28049df7ffd1STomasz Jozwiak test_compressdev_deflate_stateless_dynamic_big(void)
28059df7ffd1STomasz Jozwiak {
28069df7ffd1STomasz Jozwiak 	struct comp_testsuite_params *ts_params = &testsuite_params;
28079df7ffd1STomasz Jozwiak 	uint16_t i = 0;
280852d719d8SAdam Dybkowski 	int ret;
2809db06104cSAdam Dybkowski 	unsigned int j;
28109df7ffd1STomasz Jozwiak 	const struct rte_compressdev_capabilities *capab;
28119df7ffd1STomasz Jozwiak 	char *test_buffer = NULL;
28129df7ffd1STomasz Jozwiak 
28139df7ffd1STomasz Jozwiak 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
28149df7ffd1STomasz Jozwiak 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
28159df7ffd1STomasz Jozwiak 
28169df7ffd1STomasz Jozwiak 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
28179df7ffd1STomasz Jozwiak 		return -ENOTSUP;
28189df7ffd1STomasz Jozwiak 
28199df7ffd1STomasz Jozwiak 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
28209df7ffd1STomasz Jozwiak 		return -ENOTSUP;
28219df7ffd1STomasz Jozwiak 
28229df7ffd1STomasz Jozwiak 	test_buffer = rte_malloc(NULL, BIG_DATA_TEST_SIZE, 0);
28239df7ffd1STomasz Jozwiak 	if (test_buffer == NULL) {
28249df7ffd1STomasz Jozwiak 		RTE_LOG(ERR, USER1,
28259df7ffd1STomasz Jozwiak 			"Can't allocate buffer for big-data\n");
28269df7ffd1STomasz Jozwiak 		return TEST_FAILED;
28279df7ffd1STomasz Jozwiak 	}
28289df7ffd1STomasz Jozwiak 
28299df7ffd1STomasz Jozwiak 	struct interim_data_params int_data = {
28309df7ffd1STomasz Jozwiak 		(const char * const *)&test_buffer,
28319df7ffd1STomasz Jozwiak 		1,
28320e7d6518SFiona Trahe 		&i,
28339df7ffd1STomasz Jozwiak 		&ts_params->def_comp_xform,
28349df7ffd1STomasz Jozwiak 		&ts_params->def_decomp_xform,
28359df7ffd1STomasz Jozwiak 		1
28369df7ffd1STomasz Jozwiak 	};
28379df7ffd1STomasz Jozwiak 
28389df7ffd1STomasz Jozwiak 	struct test_data_params test_data = {
28393fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
28403fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
28413fc3996fSAdam Dybkowski 		.buff_type = SGL_BOTH,
28423fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_DECOMPRESS,
28433fc3996fSAdam Dybkowski 		.out_of_space = 0,
28442437fbbcSArtur Trybula 		.big_data = 1,
2845db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2846db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
28479df7ffd1STomasz Jozwiak 	};
28489df7ffd1STomasz Jozwiak 
28499df7ffd1STomasz Jozwiak 	ts_params->def_comp_xform->compress.deflate.huffman =
28509df7ffd1STomasz Jozwiak 						RTE_COMP_HUFFMAN_DYNAMIC;
28519df7ffd1STomasz Jozwiak 
28529df7ffd1STomasz Jozwiak 	/* fill the buffer with data based on rand. data */
28539df7ffd1STomasz Jozwiak 	srand(BIG_DATA_TEST_SIZE);
28540e7d6518SFiona Trahe 	for (j = 0; j < BIG_DATA_TEST_SIZE - 1; ++j)
28550e7d6518SFiona Trahe 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
28569df7ffd1STomasz Jozwiak 	test_buffer[BIG_DATA_TEST_SIZE - 1] = 0;
28579df7ffd1STomasz Jozwiak 
28589df7ffd1STomasz Jozwiak 	/* Compress with compressdev, decompress with Zlib */
28599df7ffd1STomasz Jozwiak 	test_data.zlib_dir = ZLIB_DECOMPRESS;
286052d719d8SAdam Dybkowski 	ret = test_deflate_comp_decomp(&int_data, &test_data);
286152d719d8SAdam Dybkowski 	if (ret < 0)
286252d719d8SAdam Dybkowski 		goto exit;
28639df7ffd1STomasz Jozwiak 
28649df7ffd1STomasz Jozwiak 	/* Compress with Zlib, decompress with compressdev */
28659df7ffd1STomasz Jozwiak 	test_data.zlib_dir = ZLIB_COMPRESS;
286652d719d8SAdam Dybkowski 	ret = test_deflate_comp_decomp(&int_data, &test_data);
286752d719d8SAdam Dybkowski 	if (ret < 0)
286852d719d8SAdam Dybkowski 		goto exit;
28699df7ffd1STomasz Jozwiak 
287052d719d8SAdam Dybkowski 	ret = TEST_SUCCESS;
287152d719d8SAdam Dybkowski 
287252d719d8SAdam Dybkowski exit:
28739df7ffd1STomasz Jozwiak 	ts_params->def_comp_xform->compress.deflate.huffman =
28749df7ffd1STomasz Jozwiak 						RTE_COMP_HUFFMAN_DEFAULT;
28759df7ffd1STomasz Jozwiak 	rte_free(test_buffer);
28769df7ffd1STomasz Jozwiak 	return ret;
28779df7ffd1STomasz Jozwiak }
28789df7ffd1STomasz Jozwiak 
287907b810c5SAdam Dybkowski static int
test_compressdev_deflate_stateful_decomp(void)288007b810c5SAdam Dybkowski test_compressdev_deflate_stateful_decomp(void)
288107b810c5SAdam Dybkowski {
288207b810c5SAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
288307b810c5SAdam Dybkowski 	int ret;
288407b810c5SAdam Dybkowski 	uint16_t i;
288507b810c5SAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
288607b810c5SAdam Dybkowski 
288707b810c5SAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
288807b810c5SAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
288907b810c5SAdam Dybkowski 
289007b810c5SAdam Dybkowski 	if (!(capab->comp_feature_flags & RTE_COMP_FF_STATEFUL_DECOMPRESSION))
289107b810c5SAdam Dybkowski 		return -ENOTSUP;
289207b810c5SAdam Dybkowski 
289307b810c5SAdam Dybkowski 	struct interim_data_params int_data = {
289407b810c5SAdam Dybkowski 		&compress_test_bufs[0],
289507b810c5SAdam Dybkowski 		1,
289607b810c5SAdam Dybkowski 		&i,
289707b810c5SAdam Dybkowski 		&ts_params->def_comp_xform,
289807b810c5SAdam Dybkowski 		&ts_params->def_decomp_xform,
289907b810c5SAdam Dybkowski 		1
290007b810c5SAdam Dybkowski 	};
290107b810c5SAdam Dybkowski 
290207b810c5SAdam Dybkowski 	struct test_data_params test_data = {
29033fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
29043fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATEFUL,
29053fc3996fSAdam Dybkowski 		.buff_type = LB_BOTH,
29063fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_COMPRESS,
29073fc3996fSAdam Dybkowski 		.out_of_space = 0,
29083fc3996fSAdam Dybkowski 		.big_data = 0,
29093fc3996fSAdam Dybkowski 		.decompress_output_block_size = 2000,
29102437fbbcSArtur Trybula 		.decompress_steps_max = 4,
2911db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2912db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
291307b810c5SAdam Dybkowski 	};
291407b810c5SAdam Dybkowski 
291507b810c5SAdam Dybkowski 	/* Compress with Zlib, decompress with compressdev */
291607b810c5SAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
291707b810c5SAdam Dybkowski 		ret = TEST_FAILED;
291807b810c5SAdam Dybkowski 		goto exit;
291907b810c5SAdam Dybkowski 	}
292007b810c5SAdam Dybkowski 
292107b810c5SAdam Dybkowski 	if (capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) {
292207b810c5SAdam Dybkowski 		/* Now test with SGL buffers */
292307b810c5SAdam Dybkowski 		test_data.buff_type = SGL_BOTH;
292407b810c5SAdam Dybkowski 		if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
292507b810c5SAdam Dybkowski 			ret = TEST_FAILED;
292607b810c5SAdam Dybkowski 			goto exit;
292707b810c5SAdam Dybkowski 		}
292807b810c5SAdam Dybkowski 	}
292907b810c5SAdam Dybkowski 
293007b810c5SAdam Dybkowski 	ret  = TEST_SUCCESS;
293107b810c5SAdam Dybkowski 
293207b810c5SAdam Dybkowski exit:
293307b810c5SAdam Dybkowski 	return ret;
293407b810c5SAdam Dybkowski }
293507b810c5SAdam Dybkowski 
293607b810c5SAdam Dybkowski static int
test_compressdev_deflate_stateful_decomp_checksum(void)293707b810c5SAdam Dybkowski test_compressdev_deflate_stateful_decomp_checksum(void)
293807b810c5SAdam Dybkowski {
293907b810c5SAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
294007b810c5SAdam Dybkowski 	int ret;
294107b810c5SAdam Dybkowski 	uint16_t i;
294207b810c5SAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
294307b810c5SAdam Dybkowski 
294407b810c5SAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
294507b810c5SAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
294607b810c5SAdam Dybkowski 
294707b810c5SAdam Dybkowski 	if (!(capab->comp_feature_flags & RTE_COMP_FF_STATEFUL_DECOMPRESSION))
294807b810c5SAdam Dybkowski 		return -ENOTSUP;
294907b810c5SAdam Dybkowski 
295007b810c5SAdam Dybkowski 	/* Check if driver supports any checksum */
295107b810c5SAdam Dybkowski 	if (!(capab->comp_feature_flags &
295207b810c5SAdam Dybkowski 	     (RTE_COMP_FF_CRC32_CHECKSUM | RTE_COMP_FF_ADLER32_CHECKSUM |
295307b810c5SAdam Dybkowski 	      RTE_COMP_FF_CRC32_ADLER32_CHECKSUM)))
295407b810c5SAdam Dybkowski 		return -ENOTSUP;
295507b810c5SAdam Dybkowski 
295607b810c5SAdam Dybkowski 	struct rte_comp_xform *compress_xform =
295707b810c5SAdam Dybkowski 			rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
295807b810c5SAdam Dybkowski 	if (compress_xform == NULL) {
295907b810c5SAdam Dybkowski 		RTE_LOG(ERR, USER1, "Compress xform could not be created\n");
296007b810c5SAdam Dybkowski 		return TEST_FAILED;
296107b810c5SAdam Dybkowski 	}
296207b810c5SAdam Dybkowski 
296307b810c5SAdam Dybkowski 	memcpy(compress_xform, ts_params->def_comp_xform,
296407b810c5SAdam Dybkowski 	       sizeof(struct rte_comp_xform));
296507b810c5SAdam Dybkowski 
296607b810c5SAdam Dybkowski 	struct rte_comp_xform *decompress_xform =
296707b810c5SAdam Dybkowski 			rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
296807b810c5SAdam Dybkowski 	if (decompress_xform == NULL) {
296907b810c5SAdam Dybkowski 		RTE_LOG(ERR, USER1, "Decompress xform could not be created\n");
297007b810c5SAdam Dybkowski 		rte_free(compress_xform);
297107b810c5SAdam Dybkowski 		return TEST_FAILED;
297207b810c5SAdam Dybkowski 	}
297307b810c5SAdam Dybkowski 
297407b810c5SAdam Dybkowski 	memcpy(decompress_xform, ts_params->def_decomp_xform,
297507b810c5SAdam Dybkowski 	       sizeof(struct rte_comp_xform));
297607b810c5SAdam Dybkowski 
297707b810c5SAdam Dybkowski 	struct interim_data_params int_data = {
297807b810c5SAdam Dybkowski 		&compress_test_bufs[0],
297907b810c5SAdam Dybkowski 		1,
298007b810c5SAdam Dybkowski 		&i,
298107b810c5SAdam Dybkowski 		&compress_xform,
298207b810c5SAdam Dybkowski 		&decompress_xform,
298307b810c5SAdam Dybkowski 		1
298407b810c5SAdam Dybkowski 	};
298507b810c5SAdam Dybkowski 
298607b810c5SAdam Dybkowski 	struct test_data_params test_data = {
29873fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
29883fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATEFUL,
29893fc3996fSAdam Dybkowski 		.buff_type = LB_BOTH,
29903fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_COMPRESS,
29913fc3996fSAdam Dybkowski 		.out_of_space = 0,
29923fc3996fSAdam Dybkowski 		.big_data = 0,
29933fc3996fSAdam Dybkowski 		.decompress_output_block_size = 2000,
29942437fbbcSArtur Trybula 		.decompress_steps_max = 4,
2995db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
2996db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
299707b810c5SAdam Dybkowski 	};
299807b810c5SAdam Dybkowski 
299907b810c5SAdam Dybkowski 	/* Check if driver supports crc32 checksum and test */
300007b810c5SAdam Dybkowski 	if (capab->comp_feature_flags & RTE_COMP_FF_CRC32_CHECKSUM) {
300107b810c5SAdam Dybkowski 		compress_xform->compress.chksum = RTE_COMP_CHECKSUM_CRC32;
300207b810c5SAdam Dybkowski 		decompress_xform->decompress.chksum = RTE_COMP_CHECKSUM_CRC32;
300307b810c5SAdam Dybkowski 		/* Compress with Zlib, decompress with compressdev */
300407b810c5SAdam Dybkowski 		test_data.buff_type = LB_BOTH;
300507b810c5SAdam Dybkowski 		if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
300607b810c5SAdam Dybkowski 			ret = TEST_FAILED;
300707b810c5SAdam Dybkowski 			goto exit;
300807b810c5SAdam Dybkowski 		}
300907b810c5SAdam Dybkowski 		if (capab->comp_feature_flags &
301007b810c5SAdam Dybkowski 				RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) {
301107b810c5SAdam Dybkowski 			/* Now test with SGL buffers */
301207b810c5SAdam Dybkowski 			test_data.buff_type = SGL_BOTH;
301307b810c5SAdam Dybkowski 			if (test_deflate_comp_decomp(&int_data,
301407b810c5SAdam Dybkowski 						     &test_data) < 0) {
301507b810c5SAdam Dybkowski 				ret = TEST_FAILED;
301607b810c5SAdam Dybkowski 				goto exit;
301707b810c5SAdam Dybkowski 			}
301807b810c5SAdam Dybkowski 		}
301907b810c5SAdam Dybkowski 	}
302007b810c5SAdam Dybkowski 
302107b810c5SAdam Dybkowski 	/* Check if driver supports adler32 checksum and test */
302207b810c5SAdam Dybkowski 	if (capab->comp_feature_flags & RTE_COMP_FF_ADLER32_CHECKSUM) {
302307b810c5SAdam Dybkowski 		compress_xform->compress.chksum = RTE_COMP_CHECKSUM_ADLER32;
302407b810c5SAdam Dybkowski 		decompress_xform->decompress.chksum = RTE_COMP_CHECKSUM_ADLER32;
302507b810c5SAdam Dybkowski 		/* Compress with Zlib, decompress with compressdev */
302607b810c5SAdam Dybkowski 		test_data.buff_type = LB_BOTH;
302707b810c5SAdam Dybkowski 		if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
302807b810c5SAdam Dybkowski 			ret = TEST_FAILED;
302907b810c5SAdam Dybkowski 			goto exit;
303007b810c5SAdam Dybkowski 		}
303107b810c5SAdam Dybkowski 		if (capab->comp_feature_flags &
303207b810c5SAdam Dybkowski 				RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) {
303307b810c5SAdam Dybkowski 			/* Now test with SGL buffers */
303407b810c5SAdam Dybkowski 			test_data.buff_type = SGL_BOTH;
303507b810c5SAdam Dybkowski 			if (test_deflate_comp_decomp(&int_data,
303607b810c5SAdam Dybkowski 						     &test_data) < 0) {
303707b810c5SAdam Dybkowski 				ret = TEST_FAILED;
303807b810c5SAdam Dybkowski 				goto exit;
303907b810c5SAdam Dybkowski 			}
304007b810c5SAdam Dybkowski 		}
304107b810c5SAdam Dybkowski 	}
304207b810c5SAdam Dybkowski 
304307b810c5SAdam Dybkowski 	/* Check if driver supports combined crc and adler checksum and test */
304407b810c5SAdam Dybkowski 	if (capab->comp_feature_flags & RTE_COMP_FF_CRC32_ADLER32_CHECKSUM) {
304507b810c5SAdam Dybkowski 		compress_xform->compress.chksum =
304607b810c5SAdam Dybkowski 				RTE_COMP_CHECKSUM_CRC32_ADLER32;
304707b810c5SAdam Dybkowski 		decompress_xform->decompress.chksum =
304807b810c5SAdam Dybkowski 				RTE_COMP_CHECKSUM_CRC32_ADLER32;
304907b810c5SAdam Dybkowski 		/* Zlib doesn't support combined checksum */
305007b810c5SAdam Dybkowski 		test_data.zlib_dir = ZLIB_NONE;
305107b810c5SAdam Dybkowski 		/* Compress stateless, decompress stateful with compressdev */
305207b810c5SAdam Dybkowski 		test_data.buff_type = LB_BOTH;
305307b810c5SAdam Dybkowski 		if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
305407b810c5SAdam Dybkowski 			ret = TEST_FAILED;
305507b810c5SAdam Dybkowski 			goto exit;
305607b810c5SAdam Dybkowski 		}
305707b810c5SAdam Dybkowski 		if (capab->comp_feature_flags &
305807b810c5SAdam Dybkowski 				RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) {
305907b810c5SAdam Dybkowski 			/* Now test with SGL buffers */
306007b810c5SAdam Dybkowski 			test_data.buff_type = SGL_BOTH;
306107b810c5SAdam Dybkowski 			if (test_deflate_comp_decomp(&int_data,
306207b810c5SAdam Dybkowski 						     &test_data) < 0) {
306307b810c5SAdam Dybkowski 				ret = TEST_FAILED;
306407b810c5SAdam Dybkowski 				goto exit;
306507b810c5SAdam Dybkowski 			}
306607b810c5SAdam Dybkowski 		}
306707b810c5SAdam Dybkowski 	}
306807b810c5SAdam Dybkowski 
306907b810c5SAdam Dybkowski 	ret  = TEST_SUCCESS;
307007b810c5SAdam Dybkowski 
307107b810c5SAdam Dybkowski exit:
307207b810c5SAdam Dybkowski 	rte_free(compress_xform);
307307b810c5SAdam Dybkowski 	rte_free(decompress_xform);
307407b810c5SAdam Dybkowski 	return ret;
307507b810c5SAdam Dybkowski }
3076a9de470cSBruce Richardson 
30773fc3996fSAdam Dybkowski static const struct rte_memzone *
make_memzone(const char * name,size_t size)30783fc3996fSAdam Dybkowski make_memzone(const char *name, size_t size)
30793fc3996fSAdam Dybkowski {
30803fc3996fSAdam Dybkowski 	unsigned int socket_id = rte_socket_id();
30813fc3996fSAdam Dybkowski 	char mz_name[RTE_MEMZONE_NAMESIZE];
30823fc3996fSAdam Dybkowski 	const struct rte_memzone *memzone;
30833fc3996fSAdam Dybkowski 
30843fc3996fSAdam Dybkowski 	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, "%s_%u", name, socket_id);
30853fc3996fSAdam Dybkowski 	memzone = rte_memzone_lookup(mz_name);
30863fc3996fSAdam Dybkowski 	if (memzone != NULL && memzone->len != size) {
30873fc3996fSAdam Dybkowski 		rte_memzone_free(memzone);
30883fc3996fSAdam Dybkowski 		memzone = NULL;
30893fc3996fSAdam Dybkowski 	}
30903fc3996fSAdam Dybkowski 	if (memzone == NULL) {
30913fc3996fSAdam Dybkowski 		memzone = rte_memzone_reserve_aligned(mz_name, size, socket_id,
30923fc3996fSAdam Dybkowski 				RTE_MEMZONE_IOVA_CONTIG, RTE_CACHE_LINE_SIZE);
30933fc3996fSAdam Dybkowski 		if (memzone == NULL)
30943fc3996fSAdam Dybkowski 			RTE_LOG(ERR, USER1, "Can't allocate memory zone %s",
30953fc3996fSAdam Dybkowski 				mz_name);
30963fc3996fSAdam Dybkowski 	}
30973fc3996fSAdam Dybkowski 	return memzone;
30983fc3996fSAdam Dybkowski }
30993fc3996fSAdam Dybkowski 
31003fc3996fSAdam Dybkowski static int
test_compressdev_external_mbufs(void)31013fc3996fSAdam Dybkowski test_compressdev_external_mbufs(void)
31023fc3996fSAdam Dybkowski {
31033fc3996fSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
31043fc3996fSAdam Dybkowski 	size_t data_len = 0;
31053fc3996fSAdam Dybkowski 	uint16_t i;
31063fc3996fSAdam Dybkowski 	int ret = TEST_FAILED;
31073fc3996fSAdam Dybkowski 
31083fc3996fSAdam Dybkowski 	for (i = 0; i < RTE_DIM(compress_test_bufs); i++)
31093fc3996fSAdam Dybkowski 		data_len = RTE_MAX(data_len, strlen(compress_test_bufs[i]) + 1);
31103fc3996fSAdam Dybkowski 
31113fc3996fSAdam Dybkowski 	struct interim_data_params int_data = {
31123fc3996fSAdam Dybkowski 		NULL,
31133fc3996fSAdam Dybkowski 		1,
31143fc3996fSAdam Dybkowski 		NULL,
31153fc3996fSAdam Dybkowski 		&ts_params->def_comp_xform,
31163fc3996fSAdam Dybkowski 		&ts_params->def_decomp_xform,
31173fc3996fSAdam Dybkowski 		1
31183fc3996fSAdam Dybkowski 	};
31193fc3996fSAdam Dybkowski 
31203fc3996fSAdam Dybkowski 	struct test_data_params test_data = {
31213fc3996fSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
31223fc3996fSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
31233fc3996fSAdam Dybkowski 		.buff_type = LB_BOTH,
31243fc3996fSAdam Dybkowski 		.zlib_dir = ZLIB_DECOMPRESS,
31253fc3996fSAdam Dybkowski 		.out_of_space = 0,
31263fc3996fSAdam Dybkowski 		.big_data = 0,
31273fc3996fSAdam Dybkowski 		.use_external_mbufs = 1,
31283fc3996fSAdam Dybkowski 		.inbuf_data_size = data_len,
31293fc3996fSAdam Dybkowski 		.inbuf_memzone = make_memzone("inbuf", data_len),
31303fc3996fSAdam Dybkowski 		.compbuf_memzone = make_memzone("compbuf", data_len *
31313fc3996fSAdam Dybkowski 						COMPRESS_BUF_SIZE_RATIO),
31322437fbbcSArtur Trybula 		.uncompbuf_memzone = make_memzone("decompbuf", data_len),
31332437fbbcSArtur Trybula 		.overflow = OVERFLOW_DISABLED
31343fc3996fSAdam Dybkowski 	};
31353fc3996fSAdam Dybkowski 
31363fc3996fSAdam Dybkowski 	for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
31373fc3996fSAdam Dybkowski 		/* prepare input data */
31383fc3996fSAdam Dybkowski 		data_len = strlen(compress_test_bufs[i]) + 1;
31393fc3996fSAdam Dybkowski 		rte_memcpy(test_data.inbuf_memzone->addr, compress_test_bufs[i],
31403fc3996fSAdam Dybkowski 			   data_len);
31413fc3996fSAdam Dybkowski 		test_data.inbuf_data_size = data_len;
31423fc3996fSAdam Dybkowski 		int_data.buf_idx = &i;
31433fc3996fSAdam Dybkowski 
31443fc3996fSAdam Dybkowski 		/* Compress with compressdev, decompress with Zlib */
31453fc3996fSAdam Dybkowski 		test_data.zlib_dir = ZLIB_DECOMPRESS;
31463fc3996fSAdam Dybkowski 		if (test_deflate_comp_decomp(&int_data, &test_data) < 0)
31473fc3996fSAdam Dybkowski 			goto exit;
31483fc3996fSAdam Dybkowski 
31493fc3996fSAdam Dybkowski 		/* Compress with Zlib, decompress with compressdev */
31503fc3996fSAdam Dybkowski 		test_data.zlib_dir = ZLIB_COMPRESS;
31513fc3996fSAdam Dybkowski 		if (test_deflate_comp_decomp(&int_data, &test_data) < 0)
31523fc3996fSAdam Dybkowski 			goto exit;
31533fc3996fSAdam Dybkowski 	}
31543fc3996fSAdam Dybkowski 
31553fc3996fSAdam Dybkowski 	ret = TEST_SUCCESS;
31563fc3996fSAdam Dybkowski 
31573fc3996fSAdam Dybkowski exit:
31583fc3996fSAdam Dybkowski 	rte_memzone_free(test_data.inbuf_memzone);
31593fc3996fSAdam Dybkowski 	rte_memzone_free(test_data.compbuf_memzone);
31603fc3996fSAdam Dybkowski 	rte_memzone_free(test_data.uncompbuf_memzone);
31613fc3996fSAdam Dybkowski 	return ret;
31623fc3996fSAdam Dybkowski }
31633fc3996fSAdam Dybkowski 
31642437fbbcSArtur Trybula static int
test_compressdev_deflate_stateless_fixed_oos_recoverable(void)31652437fbbcSArtur Trybula test_compressdev_deflate_stateless_fixed_oos_recoverable(void)
31662437fbbcSArtur Trybula {
31672437fbbcSArtur Trybula 	struct comp_testsuite_params *ts_params = &testsuite_params;
31682437fbbcSArtur Trybula 	uint16_t i;
31692437fbbcSArtur Trybula 	int ret;
31702437fbbcSArtur Trybula 	int comp_result;
31712437fbbcSArtur Trybula 	const struct rte_compressdev_capabilities *capab;
31722437fbbcSArtur Trybula 
31732437fbbcSArtur Trybula 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
31742437fbbcSArtur Trybula 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
31752437fbbcSArtur Trybula 
31762437fbbcSArtur Trybula 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0)
31772437fbbcSArtur Trybula 		return -ENOTSUP;
31782437fbbcSArtur Trybula 
31792437fbbcSArtur Trybula 	struct rte_comp_xform *compress_xform =
31802437fbbcSArtur Trybula 			rte_malloc(NULL, sizeof(struct rte_comp_xform), 0);
31812437fbbcSArtur Trybula 
31822437fbbcSArtur Trybula 	if (compress_xform == NULL) {
31832437fbbcSArtur Trybula 		RTE_LOG(ERR, USER1,
31842437fbbcSArtur Trybula 			"Compress xform could not be created\n");
31852437fbbcSArtur Trybula 		ret = TEST_FAILED;
31862437fbbcSArtur Trybula 		goto exit;
31872437fbbcSArtur Trybula 	}
31882437fbbcSArtur Trybula 
31892437fbbcSArtur Trybula 	memcpy(compress_xform, ts_params->def_comp_xform,
31902437fbbcSArtur Trybula 			sizeof(struct rte_comp_xform));
31912437fbbcSArtur Trybula 	compress_xform->compress.deflate.huffman = RTE_COMP_HUFFMAN_FIXED;
31922437fbbcSArtur Trybula 
31932437fbbcSArtur Trybula 	struct interim_data_params int_data = {
31942437fbbcSArtur Trybula 		NULL,
31952437fbbcSArtur Trybula 		1,
31962437fbbcSArtur Trybula 		NULL,
31972437fbbcSArtur Trybula 		&compress_xform,
31982437fbbcSArtur Trybula 		&ts_params->def_decomp_xform,
31992437fbbcSArtur Trybula 		1
32002437fbbcSArtur Trybula 	};
32012437fbbcSArtur Trybula 
32022437fbbcSArtur Trybula 	struct test_data_params test_data = {
32032437fbbcSArtur Trybula 		.compress_state = RTE_COMP_OP_STATELESS,
32042437fbbcSArtur Trybula 		.decompress_state = RTE_COMP_OP_STATELESS,
32052437fbbcSArtur Trybula 		.buff_type = LB_BOTH,
32062437fbbcSArtur Trybula 		.zlib_dir = ZLIB_DECOMPRESS,
32072437fbbcSArtur Trybula 		.out_of_space = 0,
32082437fbbcSArtur Trybula 		.big_data = 0,
3209db06104cSAdam Dybkowski 		.overflow = OVERFLOW_ENABLED,
3210db06104cSAdam Dybkowski 		.ratio = RATIO_ENABLED
32112437fbbcSArtur Trybula 	};
32122437fbbcSArtur Trybula 
32132437fbbcSArtur Trybula 	for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
32142437fbbcSArtur Trybula 		int_data.test_bufs = &compress_test_bufs[i];
32152437fbbcSArtur Trybula 		int_data.buf_idx = &i;
32162437fbbcSArtur Trybula 
32172437fbbcSArtur Trybula 		/* Compress with compressdev, decompress with Zlib */
32182437fbbcSArtur Trybula 		test_data.zlib_dir = ZLIB_DECOMPRESS;
32192437fbbcSArtur Trybula 		comp_result = test_deflate_comp_decomp(&int_data, &test_data);
32202437fbbcSArtur Trybula 		if (comp_result < 0) {
32212437fbbcSArtur Trybula 			ret = TEST_FAILED;
32222437fbbcSArtur Trybula 			goto exit;
32232437fbbcSArtur Trybula 		} else if (comp_result > 0) {
32242437fbbcSArtur Trybula 			ret = -ENOTSUP;
32252437fbbcSArtur Trybula 			goto exit;
32262437fbbcSArtur Trybula 		}
32272437fbbcSArtur Trybula 
32282437fbbcSArtur Trybula 		/* Compress with Zlib, decompress with compressdev */
32292437fbbcSArtur Trybula 		test_data.zlib_dir = ZLIB_COMPRESS;
32302437fbbcSArtur Trybula 		comp_result = test_deflate_comp_decomp(&int_data, &test_data);
32312437fbbcSArtur Trybula 		if (comp_result < 0) {
32322437fbbcSArtur Trybula 			ret = TEST_FAILED;
32332437fbbcSArtur Trybula 			goto exit;
32342437fbbcSArtur Trybula 		} else if (comp_result > 0) {
32352437fbbcSArtur Trybula 			ret = -ENOTSUP;
32362437fbbcSArtur Trybula 			goto exit;
32372437fbbcSArtur Trybula 		}
32382437fbbcSArtur Trybula 	}
32392437fbbcSArtur Trybula 
32402437fbbcSArtur Trybula 	ret = TEST_SUCCESS;
32412437fbbcSArtur Trybula 
32422437fbbcSArtur Trybula exit:
32432437fbbcSArtur Trybula 	rte_free(compress_xform);
32442437fbbcSArtur Trybula 	return ret;
32452437fbbcSArtur Trybula }
32462437fbbcSArtur Trybula 
3247db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_LB_1op(void)3248db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_1op(void)
3249db06104cSAdam Dybkowski {
3250db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3251db06104cSAdam Dybkowski 	uint16_t i = 0;
3252db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3253db06104cSAdam Dybkowski 	int j;
3254db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3255db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3256db06104cSAdam Dybkowski 
3257db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3258db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3259db06104cSAdam Dybkowski 
3260db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3261db06104cSAdam Dybkowski 		return -ENOTSUP;
3262db06104cSAdam Dybkowski 
3263db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3264db06104cSAdam Dybkowski 		return -ENOTSUP;
3265db06104cSAdam Dybkowski 
3266db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_LB, 0);
3267db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3268db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3269db06104cSAdam Dybkowski 			"Can't allocate buffer for 'im buffer' test\n");
3270db06104cSAdam Dybkowski 		return TEST_FAILED;
3271db06104cSAdam Dybkowski 	}
3272db06104cSAdam Dybkowski 
3273db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3274db06104cSAdam Dybkowski 		(const char * const *)&test_buffer,
3275db06104cSAdam Dybkowski 		1,
3276db06104cSAdam Dybkowski 		&i,
3277db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3278db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3279db06104cSAdam Dybkowski 		1
3280db06104cSAdam Dybkowski 	};
3281db06104cSAdam Dybkowski 
3282db06104cSAdam Dybkowski 	struct test_data_params test_data = {
3283db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
3284db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
3285db06104cSAdam Dybkowski 				/* must be LB to SGL,
3286db06104cSAdam Dybkowski 				 * input LB buffer reaches its maximum,
3287db06104cSAdam Dybkowski 				 * if ratio 1.3 than another mbuf must be
3288db06104cSAdam Dybkowski 				 * created and attached
3289db06104cSAdam Dybkowski 				 */
3290db06104cSAdam Dybkowski 		.buff_type = LB_BOTH,
3291db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
3292db06104cSAdam Dybkowski 		.out_of_space = 0,
3293db06104cSAdam Dybkowski 		.big_data = 1,
3294db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
3295db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
3296db06104cSAdam Dybkowski 	};
3297db06104cSAdam Dybkowski 
3298db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3299db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
3300db06104cSAdam Dybkowski 
3301db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
3302db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_LB);
3303db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_LB - 1; ++j)
3304db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3305db06104cSAdam Dybkowski 
3306db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
3307db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3308db06104cSAdam Dybkowski 		ret = TEST_FAILED;
3309db06104cSAdam Dybkowski 		goto end;
3310db06104cSAdam Dybkowski 	}
3311db06104cSAdam Dybkowski 
3312db06104cSAdam Dybkowski end:
3313db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3314db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
3315db06104cSAdam Dybkowski 	rte_free(test_buffer);
3316db06104cSAdam Dybkowski 	return ret;
3317db06104cSAdam Dybkowski }
3318db06104cSAdam Dybkowski 
3319db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_LB_2ops_first(void)3320db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_2ops_first(void)
3321db06104cSAdam Dybkowski {
3322db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3323db06104cSAdam Dybkowski 	uint16_t i = 0;
3324db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3325db06104cSAdam Dybkowski 	int j;
3326db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3327db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3328db06104cSAdam Dybkowski 	const char *test_buffers[2];
3329db06104cSAdam Dybkowski 
3330db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3331db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3332db06104cSAdam Dybkowski 
3333db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3334db06104cSAdam Dybkowski 		return -ENOTSUP;
3335db06104cSAdam Dybkowski 
3336db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3337db06104cSAdam Dybkowski 		return -ENOTSUP;
3338db06104cSAdam Dybkowski 
3339db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_LB, 0);
3340db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3341db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3342db06104cSAdam Dybkowski 			"Can't allocate buffer for 'im buffer' test\n");
3343db06104cSAdam Dybkowski 		return TEST_FAILED;
3344db06104cSAdam Dybkowski 	}
3345db06104cSAdam Dybkowski 
3346db06104cSAdam Dybkowski 	test_buffers[0] = test_buffer;
3347db06104cSAdam Dybkowski 	test_buffers[1] = compress_test_bufs[0];
3348db06104cSAdam Dybkowski 
3349db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3350db06104cSAdam Dybkowski 		(const char * const *)test_buffers,
3351db06104cSAdam Dybkowski 		2,
3352db06104cSAdam Dybkowski 		&i,
3353db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3354db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3355db06104cSAdam Dybkowski 		1
3356db06104cSAdam Dybkowski 	};
3357db06104cSAdam Dybkowski 
3358db06104cSAdam Dybkowski 	struct test_data_params test_data = {
3359db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
3360db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
3361db06104cSAdam Dybkowski 		.buff_type = LB_BOTH,
3362db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
3363db06104cSAdam Dybkowski 		.out_of_space = 0,
3364db06104cSAdam Dybkowski 		.big_data = 1,
3365db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
3366db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
3367db06104cSAdam Dybkowski 	};
3368db06104cSAdam Dybkowski 
3369db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3370db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
3371db06104cSAdam Dybkowski 
3372db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
3373db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_LB);
3374db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_LB - 1; ++j)
3375db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3376db06104cSAdam Dybkowski 
3377db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
3378db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3379db06104cSAdam Dybkowski 		ret = TEST_FAILED;
3380db06104cSAdam Dybkowski 		goto end;
3381db06104cSAdam Dybkowski 	}
3382db06104cSAdam Dybkowski 
3383db06104cSAdam Dybkowski end:
3384db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3385db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
3386db06104cSAdam Dybkowski 	rte_free(test_buffer);
3387db06104cSAdam Dybkowski 	return ret;
3388db06104cSAdam Dybkowski }
3389db06104cSAdam Dybkowski 
3390db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_LB_2ops_second(void)3391db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_2ops_second(void)
3392db06104cSAdam Dybkowski {
3393db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3394db06104cSAdam Dybkowski 	uint16_t i = 0;
3395db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3396db06104cSAdam Dybkowski 	int j;
3397db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3398db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3399db06104cSAdam Dybkowski 	const char *test_buffers[2];
3400db06104cSAdam Dybkowski 
3401db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3402db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3403db06104cSAdam Dybkowski 
3404db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3405db06104cSAdam Dybkowski 		return -ENOTSUP;
3406db06104cSAdam Dybkowski 
3407db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3408db06104cSAdam Dybkowski 		return -ENOTSUP;
3409db06104cSAdam Dybkowski 
3410db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_LB, 0);
3411db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3412db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3413db06104cSAdam Dybkowski 			"Can't allocate buffer for 'im buffer' test\n");
3414db06104cSAdam Dybkowski 		return TEST_FAILED;
3415db06104cSAdam Dybkowski 	}
3416db06104cSAdam Dybkowski 
3417db06104cSAdam Dybkowski 	test_buffers[0] = compress_test_bufs[0];
3418db06104cSAdam Dybkowski 	test_buffers[1] = test_buffer;
3419db06104cSAdam Dybkowski 
3420db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3421db06104cSAdam Dybkowski 		(const char * const *)test_buffers,
3422db06104cSAdam Dybkowski 		2,
3423db06104cSAdam Dybkowski 		&i,
3424db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3425db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3426db06104cSAdam Dybkowski 		1
3427db06104cSAdam Dybkowski 	};
3428db06104cSAdam Dybkowski 
3429db06104cSAdam Dybkowski 	struct test_data_params test_data = {
3430db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
3431db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
3432db06104cSAdam Dybkowski 		.buff_type = LB_BOTH,
3433db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
3434db06104cSAdam Dybkowski 		.out_of_space = 0,
3435db06104cSAdam Dybkowski 		.big_data = 1,
3436db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
3437db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
3438db06104cSAdam Dybkowski 	};
3439db06104cSAdam Dybkowski 
3440db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3441db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
3442db06104cSAdam Dybkowski 
3443db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
3444db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_LB);
3445db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_LB - 1; ++j)
3446db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3447db06104cSAdam Dybkowski 
3448db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
3449db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3450db06104cSAdam Dybkowski 		ret = TEST_FAILED;
3451db06104cSAdam Dybkowski 		goto end;
3452db06104cSAdam Dybkowski 	}
3453db06104cSAdam Dybkowski 
3454db06104cSAdam Dybkowski end:
3455db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3456db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
3457db06104cSAdam Dybkowski 	rte_free(test_buffer);
3458db06104cSAdam Dybkowski 	return ret;
3459db06104cSAdam Dybkowski }
3460db06104cSAdam Dybkowski 
3461db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_LB_3ops(void)3462db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_3ops(void)
3463db06104cSAdam Dybkowski {
3464db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3465db06104cSAdam Dybkowski 	uint16_t i = 0;
3466db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3467db06104cSAdam Dybkowski 	int j;
3468db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3469db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3470db06104cSAdam Dybkowski 	const char *test_buffers[3];
3471db06104cSAdam Dybkowski 
3472db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3473db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3474db06104cSAdam Dybkowski 
3475db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3476db06104cSAdam Dybkowski 		return -ENOTSUP;
3477db06104cSAdam Dybkowski 
3478db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3479db06104cSAdam Dybkowski 		return -ENOTSUP;
3480db06104cSAdam Dybkowski 
3481db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_LB, 0);
3482db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3483db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3484db06104cSAdam Dybkowski 			"Can't allocate buffer for 'im buffer' test\n");
3485db06104cSAdam Dybkowski 		return TEST_FAILED;
3486db06104cSAdam Dybkowski 	}
3487db06104cSAdam Dybkowski 
3488db06104cSAdam Dybkowski 	test_buffers[0] = compress_test_bufs[0];
3489db06104cSAdam Dybkowski 	test_buffers[1] = test_buffer;
3490db06104cSAdam Dybkowski 	test_buffers[2] = compress_test_bufs[1];
3491db06104cSAdam Dybkowski 
3492db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3493db06104cSAdam Dybkowski 		(const char * const *)test_buffers,
3494db06104cSAdam Dybkowski 		3,
3495db06104cSAdam Dybkowski 		&i,
3496db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3497db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3498db06104cSAdam Dybkowski 		1
3499db06104cSAdam Dybkowski 	};
3500db06104cSAdam Dybkowski 
3501db06104cSAdam Dybkowski 	struct test_data_params test_data = {
3502db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
3503db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
3504db06104cSAdam Dybkowski 		.buff_type = LB_BOTH,
3505db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
3506db06104cSAdam Dybkowski 		.out_of_space = 0,
3507db06104cSAdam Dybkowski 		.big_data = 1,
3508db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
3509db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
3510db06104cSAdam Dybkowski 	};
3511db06104cSAdam Dybkowski 
3512db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3513db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
3514db06104cSAdam Dybkowski 
3515db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
3516db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_LB);
3517db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_LB - 1; ++j)
3518db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3519db06104cSAdam Dybkowski 
3520db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
3521db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3522db06104cSAdam Dybkowski 		ret = TEST_FAILED;
3523db06104cSAdam Dybkowski 		goto end;
3524db06104cSAdam Dybkowski 	}
3525db06104cSAdam Dybkowski 
3526db06104cSAdam Dybkowski end:
3527db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3528db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
3529db06104cSAdam Dybkowski 	rte_free(test_buffer);
3530db06104cSAdam Dybkowski 	return ret;
3531db06104cSAdam Dybkowski }
3532db06104cSAdam Dybkowski 
3533db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_LB_4ops(void)3534db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_LB_4ops(void)
3535db06104cSAdam Dybkowski {
3536db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3537db06104cSAdam Dybkowski 	uint16_t i = 0;
3538db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3539db06104cSAdam Dybkowski 	int j;
3540db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3541db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3542db06104cSAdam Dybkowski 	const char *test_buffers[4];
3543db06104cSAdam Dybkowski 
3544db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3545db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3546db06104cSAdam Dybkowski 
3547db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3548db06104cSAdam Dybkowski 		return -ENOTSUP;
3549db06104cSAdam Dybkowski 
3550db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3551db06104cSAdam Dybkowski 		return -ENOTSUP;
3552db06104cSAdam Dybkowski 
3553db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_LB, 0);
3554db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3555db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3556db06104cSAdam Dybkowski 			"Can't allocate buffer for 'im buffer' test\n");
3557db06104cSAdam Dybkowski 		return TEST_FAILED;
3558db06104cSAdam Dybkowski 	}
3559db06104cSAdam Dybkowski 
3560db06104cSAdam Dybkowski 	test_buffers[0] = compress_test_bufs[0];
3561db06104cSAdam Dybkowski 	test_buffers[1] = test_buffer;
3562db06104cSAdam Dybkowski 	test_buffers[2] = compress_test_bufs[1];
3563db06104cSAdam Dybkowski 	test_buffers[3] = test_buffer;
3564db06104cSAdam Dybkowski 
3565db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3566db06104cSAdam Dybkowski 		(const char * const *)test_buffers,
3567db06104cSAdam Dybkowski 		4,
3568db06104cSAdam Dybkowski 		&i,
3569db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3570db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3571db06104cSAdam Dybkowski 		1
3572db06104cSAdam Dybkowski 	};
3573db06104cSAdam Dybkowski 
3574db06104cSAdam Dybkowski 	struct test_data_params test_data = {
3575db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
3576db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
3577db06104cSAdam Dybkowski 		.buff_type = LB_BOTH,
3578db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
3579db06104cSAdam Dybkowski 		.out_of_space = 0,
3580db06104cSAdam Dybkowski 		.big_data = 1,
3581db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
3582db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
3583db06104cSAdam Dybkowski 	};
3584db06104cSAdam Dybkowski 
3585db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3586db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
3587db06104cSAdam Dybkowski 
3588db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
3589db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_LB);
3590db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_LB - 1; ++j)
3591db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3592db06104cSAdam Dybkowski 
3593db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
3594db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3595db06104cSAdam Dybkowski 		ret = TEST_FAILED;
3596db06104cSAdam Dybkowski 		goto end;
3597db06104cSAdam Dybkowski 	}
3598db06104cSAdam Dybkowski 
3599db06104cSAdam Dybkowski end:
3600db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3601db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
3602db06104cSAdam Dybkowski 	rte_free(test_buffer);
3603db06104cSAdam Dybkowski 	return ret;
3604db06104cSAdam Dybkowski }
3605db06104cSAdam Dybkowski 
3606db06104cSAdam Dybkowski 
3607db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_1op(void)3608db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_1op(void)
3609db06104cSAdam Dybkowski {
3610db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3611db06104cSAdam Dybkowski 	uint16_t i = 0;
3612db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3613db06104cSAdam Dybkowski 	int j;
3614db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3615db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3616db06104cSAdam Dybkowski 
3617db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3618db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3619db06104cSAdam Dybkowski 
3620db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3621db06104cSAdam Dybkowski 		return -ENOTSUP;
3622db06104cSAdam Dybkowski 
3623db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3624db06104cSAdam Dybkowski 		return -ENOTSUP;
3625db06104cSAdam Dybkowski 
3626db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_SGL, 0);
3627db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3628db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3629db06104cSAdam Dybkowski 			"Can't allocate buffer for big-data\n");
3630db06104cSAdam Dybkowski 		return TEST_FAILED;
3631db06104cSAdam Dybkowski 	}
3632db06104cSAdam Dybkowski 
3633db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3634db06104cSAdam Dybkowski 		(const char * const *)&test_buffer,
3635db06104cSAdam Dybkowski 		1,
3636db06104cSAdam Dybkowski 		&i,
3637db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3638db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3639db06104cSAdam Dybkowski 		1
3640db06104cSAdam Dybkowski 	};
3641db06104cSAdam Dybkowski 
3642db06104cSAdam Dybkowski 	struct test_data_params test_data = {
3643db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
3644db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
3645db06104cSAdam Dybkowski 		.buff_type = SGL_BOTH,
3646db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
3647db06104cSAdam Dybkowski 		.out_of_space = 0,
3648db06104cSAdam Dybkowski 		.big_data = 1,
3649db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
3650db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
3651db06104cSAdam Dybkowski 	};
3652db06104cSAdam Dybkowski 
3653db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3654db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
3655db06104cSAdam Dybkowski 
3656db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
3657db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_SGL);
3658db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_SGL - 1; ++j)
3659db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3660db06104cSAdam Dybkowski 
3661db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
3662db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3663db06104cSAdam Dybkowski 		ret = TEST_FAILED;
3664db06104cSAdam Dybkowski 		goto end;
3665db06104cSAdam Dybkowski 	}
3666db06104cSAdam Dybkowski 
3667db06104cSAdam Dybkowski end:
3668db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3669db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
3670db06104cSAdam Dybkowski 	rte_free(test_buffer);
3671db06104cSAdam Dybkowski 	return ret;
3672db06104cSAdam Dybkowski }
3673db06104cSAdam Dybkowski 
3674db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_2ops_first(void)3675db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_2ops_first(void)
3676db06104cSAdam Dybkowski {
3677db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3678db06104cSAdam Dybkowski 	uint16_t i = 0;
3679db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3680db06104cSAdam Dybkowski 	int j;
3681db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3682db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3683db06104cSAdam Dybkowski 	const char *test_buffers[2];
3684db06104cSAdam Dybkowski 
3685db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3686db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3687db06104cSAdam Dybkowski 
3688db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3689db06104cSAdam Dybkowski 		return -ENOTSUP;
3690db06104cSAdam Dybkowski 
3691db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3692db06104cSAdam Dybkowski 		return -ENOTSUP;
3693db06104cSAdam Dybkowski 
3694db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_SGL, 0);
3695db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3696db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3697db06104cSAdam Dybkowski 			"Can't allocate buffer for big-data\n");
3698db06104cSAdam Dybkowski 		return TEST_FAILED;
3699db06104cSAdam Dybkowski 	}
3700db06104cSAdam Dybkowski 
3701db06104cSAdam Dybkowski 	test_buffers[0] = test_buffer;
3702db06104cSAdam Dybkowski 	test_buffers[1] = compress_test_bufs[0];
3703db06104cSAdam Dybkowski 
3704db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3705db06104cSAdam Dybkowski 		(const char * const *)test_buffers,
3706db06104cSAdam Dybkowski 		2,
3707db06104cSAdam Dybkowski 		&i,
3708db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3709db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3710db06104cSAdam Dybkowski 		1
3711db06104cSAdam Dybkowski 	};
3712db06104cSAdam Dybkowski 
3713db06104cSAdam Dybkowski 	struct test_data_params test_data = {
3714db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
3715db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
3716db06104cSAdam Dybkowski 		.buff_type = SGL_BOTH,
3717db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
3718db06104cSAdam Dybkowski 		.out_of_space = 0,
3719db06104cSAdam Dybkowski 		.big_data = 1,
3720db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
3721db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
3722db06104cSAdam Dybkowski 	};
3723db06104cSAdam Dybkowski 
3724db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3725db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
3726db06104cSAdam Dybkowski 
3727db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
3728db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_SGL);
3729db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_SGL - 1; ++j)
3730db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3731db06104cSAdam Dybkowski 
3732db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
3733db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3734db06104cSAdam Dybkowski 		ret = TEST_FAILED;
3735db06104cSAdam Dybkowski 		goto end;
3736db06104cSAdam Dybkowski 	}
3737db06104cSAdam Dybkowski 
3738db06104cSAdam Dybkowski end:
3739db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3740db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
3741db06104cSAdam Dybkowski 	rte_free(test_buffer);
3742db06104cSAdam Dybkowski 	return ret;
3743db06104cSAdam Dybkowski }
3744db06104cSAdam Dybkowski 
3745db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_2ops_second(void)3746db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_2ops_second(void)
3747db06104cSAdam Dybkowski {
3748db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3749db06104cSAdam Dybkowski 	uint16_t i = 0;
3750db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3751db06104cSAdam Dybkowski 	int j;
3752db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3753db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3754db06104cSAdam Dybkowski 	const char *test_buffers[2];
3755db06104cSAdam Dybkowski 
3756db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3757db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3758db06104cSAdam Dybkowski 
3759db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3760db06104cSAdam Dybkowski 		return -ENOTSUP;
3761db06104cSAdam Dybkowski 
3762db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3763db06104cSAdam Dybkowski 		return -ENOTSUP;
3764db06104cSAdam Dybkowski 
3765db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_SGL, 0);
3766db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3767db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3768db06104cSAdam Dybkowski 			"Can't allocate buffer for big-data\n");
3769db06104cSAdam Dybkowski 		return TEST_FAILED;
3770db06104cSAdam Dybkowski 	}
3771db06104cSAdam Dybkowski 
3772db06104cSAdam Dybkowski 	test_buffers[0] = compress_test_bufs[0];
3773db06104cSAdam Dybkowski 	test_buffers[1] = test_buffer;
3774db06104cSAdam Dybkowski 
3775db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3776db06104cSAdam Dybkowski 		(const char * const *)test_buffers,
3777db06104cSAdam Dybkowski 		2,
3778db06104cSAdam Dybkowski 		&i,
3779db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3780db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3781db06104cSAdam Dybkowski 		1
3782db06104cSAdam Dybkowski 	};
3783db06104cSAdam Dybkowski 
3784db06104cSAdam Dybkowski 	struct test_data_params test_data = {
3785db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
3786db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
3787db06104cSAdam Dybkowski 		.buff_type = SGL_BOTH,
3788db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
3789db06104cSAdam Dybkowski 		.out_of_space = 0,
3790db06104cSAdam Dybkowski 		.big_data = 1,
3791db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
3792db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
3793db06104cSAdam Dybkowski 	};
3794db06104cSAdam Dybkowski 
3795db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3796db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
3797db06104cSAdam Dybkowski 
3798db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
3799db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_SGL);
3800db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_SGL - 1; ++j)
3801db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3802db06104cSAdam Dybkowski 
3803db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
3804db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3805db06104cSAdam Dybkowski 		ret = TEST_FAILED;
3806db06104cSAdam Dybkowski 		goto end;
3807db06104cSAdam Dybkowski 	}
3808db06104cSAdam Dybkowski 
3809db06104cSAdam Dybkowski end:
3810db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3811db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
3812db06104cSAdam Dybkowski 	rte_free(test_buffer);
3813db06104cSAdam Dybkowski 	return ret;
3814db06104cSAdam Dybkowski }
3815db06104cSAdam Dybkowski 
3816db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_3ops(void)3817db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_3ops(void)
3818db06104cSAdam Dybkowski {
3819db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3820db06104cSAdam Dybkowski 	uint16_t i = 0;
3821db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3822db06104cSAdam Dybkowski 	int j;
3823db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3824db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3825db06104cSAdam Dybkowski 	const char *test_buffers[3];
3826db06104cSAdam Dybkowski 
3827db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3828db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3829db06104cSAdam Dybkowski 
3830db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3831db06104cSAdam Dybkowski 		return -ENOTSUP;
3832db06104cSAdam Dybkowski 
3833db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3834db06104cSAdam Dybkowski 		return -ENOTSUP;
3835db06104cSAdam Dybkowski 
3836db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_SGL, 0);
3837db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3838db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3839db06104cSAdam Dybkowski 			"Can't allocate buffer for big-data\n");
3840db06104cSAdam Dybkowski 		return TEST_FAILED;
3841db06104cSAdam Dybkowski 	}
3842db06104cSAdam Dybkowski 
3843db06104cSAdam Dybkowski 	test_buffers[0] = compress_test_bufs[0];
3844db06104cSAdam Dybkowski 	test_buffers[1] = test_buffer;
3845db06104cSAdam Dybkowski 	test_buffers[2] = compress_test_bufs[1];
3846db06104cSAdam Dybkowski 
3847db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3848db06104cSAdam Dybkowski 		(const char * const *)test_buffers,
3849db06104cSAdam Dybkowski 		3,
3850db06104cSAdam Dybkowski 		&i,
3851db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3852db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3853db06104cSAdam Dybkowski 		1
3854db06104cSAdam Dybkowski 	};
3855db06104cSAdam Dybkowski 
3856db06104cSAdam Dybkowski 	struct test_data_params test_data = {
3857db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
3858db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
3859db06104cSAdam Dybkowski 		.buff_type = SGL_BOTH,
3860db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
3861db06104cSAdam Dybkowski 		.out_of_space = 0,
3862db06104cSAdam Dybkowski 		.big_data = 1,
3863db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
3864db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
3865db06104cSAdam Dybkowski 	};
3866db06104cSAdam Dybkowski 
3867db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3868db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
3869db06104cSAdam Dybkowski 
3870db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
3871db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_SGL);
3872db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_SGL - 1; ++j)
3873db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3874db06104cSAdam Dybkowski 
3875db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
3876db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3877db06104cSAdam Dybkowski 		ret = TEST_FAILED;
3878db06104cSAdam Dybkowski 		goto end;
3879db06104cSAdam Dybkowski 	}
3880db06104cSAdam Dybkowski 
3881db06104cSAdam Dybkowski end:
3882db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3883db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
3884db06104cSAdam Dybkowski 	rte_free(test_buffer);
3885db06104cSAdam Dybkowski 	return ret;
3886db06104cSAdam Dybkowski }
3887db06104cSAdam Dybkowski 
3888db06104cSAdam Dybkowski 
3889db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_4ops(void)3890db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_4ops(void)
3891db06104cSAdam Dybkowski {
3892db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3893db06104cSAdam Dybkowski 	uint16_t i = 0;
3894db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3895db06104cSAdam Dybkowski 	int j;
3896db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3897db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3898db06104cSAdam Dybkowski 	const char *test_buffers[4];
3899db06104cSAdam Dybkowski 
3900db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3901db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3902db06104cSAdam Dybkowski 
3903db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3904db06104cSAdam Dybkowski 		return -ENOTSUP;
3905db06104cSAdam Dybkowski 
3906db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3907db06104cSAdam Dybkowski 		return -ENOTSUP;
3908db06104cSAdam Dybkowski 
3909db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_SGL, 0);
3910db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3911db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3912db06104cSAdam Dybkowski 			"Can't allocate buffer for big-data\n");
3913db06104cSAdam Dybkowski 		return TEST_FAILED;
3914db06104cSAdam Dybkowski 	}
3915db06104cSAdam Dybkowski 
3916db06104cSAdam Dybkowski 	test_buffers[0] = compress_test_bufs[0];
3917db06104cSAdam Dybkowski 	test_buffers[1] = test_buffer;
3918db06104cSAdam Dybkowski 	test_buffers[2] = compress_test_bufs[1];
3919db06104cSAdam Dybkowski 	test_buffers[3] = test_buffer;
3920db06104cSAdam Dybkowski 
3921db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3922db06104cSAdam Dybkowski 		(const char * const *)test_buffers,
3923db06104cSAdam Dybkowski 		4,
3924db06104cSAdam Dybkowski 		&i,
3925db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3926db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3927db06104cSAdam Dybkowski 		1
3928db06104cSAdam Dybkowski 	};
3929db06104cSAdam Dybkowski 
3930db06104cSAdam Dybkowski 	struct test_data_params test_data = {
3931db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
3932db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
3933db06104cSAdam Dybkowski 		.buff_type = SGL_BOTH,
3934db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
3935db06104cSAdam Dybkowski 		.out_of_space = 0,
3936db06104cSAdam Dybkowski 		.big_data = 1,
3937db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
3938db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
3939db06104cSAdam Dybkowski 	};
3940db06104cSAdam Dybkowski 
3941db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3942db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
3943db06104cSAdam Dybkowski 
3944db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
3945db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_SGL);
3946db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_SGL - 1; ++j)
3947db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
3948db06104cSAdam Dybkowski 
3949db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
3950db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
3951db06104cSAdam Dybkowski 		ret = TEST_FAILED;
3952db06104cSAdam Dybkowski 		goto end;
3953db06104cSAdam Dybkowski 	}
3954db06104cSAdam Dybkowski 
3955db06104cSAdam Dybkowski end:
3956db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
3957db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
3958db06104cSAdam Dybkowski 	rte_free(test_buffer);
3959db06104cSAdam Dybkowski 	return ret;
3960db06104cSAdam Dybkowski }
3961db06104cSAdam Dybkowski 
3962db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_over_1op(void)3963db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_over_1op(void)
3964db06104cSAdam Dybkowski {
3965db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
3966db06104cSAdam Dybkowski 	uint16_t i = 0;
3967db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
3968db06104cSAdam Dybkowski 	int j;
3969db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
3970db06104cSAdam Dybkowski 	char *test_buffer = NULL;
3971db06104cSAdam Dybkowski 
3972db06104cSAdam Dybkowski 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
3973db06104cSAdam Dybkowski 
3974db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
3975db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
3976db06104cSAdam Dybkowski 
3977db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
3978db06104cSAdam Dybkowski 		return -ENOTSUP;
3979db06104cSAdam Dybkowski 
3980db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
3981db06104cSAdam Dybkowski 		return -ENOTSUP;
3982db06104cSAdam Dybkowski 
3983db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_OVER, 0);
3984db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
3985db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
3986db06104cSAdam Dybkowski 			"Can't allocate buffer for big-data\n");
3987db06104cSAdam Dybkowski 		return TEST_FAILED;
3988db06104cSAdam Dybkowski 	}
3989db06104cSAdam Dybkowski 
3990db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
3991db06104cSAdam Dybkowski 		(const char * const *)&test_buffer,
3992db06104cSAdam Dybkowski 		1,
3993db06104cSAdam Dybkowski 		&i,
3994db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
3995db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
3996db06104cSAdam Dybkowski 		1
3997db06104cSAdam Dybkowski 	};
3998db06104cSAdam Dybkowski 
3999db06104cSAdam Dybkowski 	struct test_data_params test_data = {
4000db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
4001db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
4002db06104cSAdam Dybkowski 		.buff_type = SGL_BOTH,
4003db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
4004db06104cSAdam Dybkowski 		.out_of_space = 0,
4005db06104cSAdam Dybkowski 		.big_data = 1,
4006db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
4007db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
4008db06104cSAdam Dybkowski 	};
4009db06104cSAdam Dybkowski 
4010db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
4011db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
4012db06104cSAdam Dybkowski 
4013db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
4014db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_OVER);
4015db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_OVER - 1; ++j)
4016db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
4017db06104cSAdam Dybkowski 
4018db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
4019db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
4020db06104cSAdam Dybkowski 		ret = TEST_SUCCESS;
4021db06104cSAdam Dybkowski 		goto end;
4022db06104cSAdam Dybkowski 	}
4023db06104cSAdam Dybkowski 
4024db06104cSAdam Dybkowski end:
4025db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
4026db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
4027db06104cSAdam Dybkowski 	rte_free(test_buffer);
4028db06104cSAdam Dybkowski 
4029db06104cSAdam Dybkowski 	return ret;
4030db06104cSAdam Dybkowski }
4031db06104cSAdam Dybkowski 
4032db06104cSAdam Dybkowski 
4033db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_over_2ops_first(void)4034db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_over_2ops_first(void)
4035db06104cSAdam Dybkowski {
4036db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
4037db06104cSAdam Dybkowski 	uint16_t i = 0;
4038db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
4039db06104cSAdam Dybkowski 	int j;
4040db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
4041db06104cSAdam Dybkowski 	char *test_buffer = NULL;
4042db06104cSAdam Dybkowski 	const char *test_buffers[2];
4043db06104cSAdam Dybkowski 
4044db06104cSAdam Dybkowski 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
4045db06104cSAdam Dybkowski 
4046db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
4047db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
4048db06104cSAdam Dybkowski 
4049db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
4050db06104cSAdam Dybkowski 		return -ENOTSUP;
4051db06104cSAdam Dybkowski 
4052db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
4053db06104cSAdam Dybkowski 		return -ENOTSUP;
4054db06104cSAdam Dybkowski 
4055db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_OVER, 0);
4056db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
4057db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
4058db06104cSAdam Dybkowski 			"Can't allocate buffer for big-data\n");
4059db06104cSAdam Dybkowski 		return TEST_FAILED;
4060db06104cSAdam Dybkowski 	}
4061db06104cSAdam Dybkowski 
4062db06104cSAdam Dybkowski 	test_buffers[0] = test_buffer;
4063db06104cSAdam Dybkowski 	test_buffers[1] = compress_test_bufs[0];
4064db06104cSAdam Dybkowski 
4065db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
4066db06104cSAdam Dybkowski 		(const char * const *)test_buffers,
4067db06104cSAdam Dybkowski 		2,
4068db06104cSAdam Dybkowski 		&i,
4069db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
4070db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
4071db06104cSAdam Dybkowski 		1
4072db06104cSAdam Dybkowski 	};
4073db06104cSAdam Dybkowski 
4074db06104cSAdam Dybkowski 	struct test_data_params test_data = {
4075db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
4076db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
4077db06104cSAdam Dybkowski 		.buff_type = SGL_BOTH,
4078db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
4079db06104cSAdam Dybkowski 		.out_of_space = 0,
4080db06104cSAdam Dybkowski 		.big_data = 1,
4081db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
4082db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
4083db06104cSAdam Dybkowski 	};
4084db06104cSAdam Dybkowski 
4085db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
4086db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
4087db06104cSAdam Dybkowski 
4088db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
4089db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_OVER);
4090db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_OVER - 1; ++j)
4091db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
4092db06104cSAdam Dybkowski 
4093db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
4094db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
4095db06104cSAdam Dybkowski 		ret = TEST_SUCCESS;
4096db06104cSAdam Dybkowski 		goto end;
4097db06104cSAdam Dybkowski 	}
4098db06104cSAdam Dybkowski 
4099db06104cSAdam Dybkowski end:
4100db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
4101db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
4102db06104cSAdam Dybkowski 	rte_free(test_buffer);
4103db06104cSAdam Dybkowski 	return ret;
4104db06104cSAdam Dybkowski }
4105db06104cSAdam Dybkowski 
4106db06104cSAdam Dybkowski static int
test_compressdev_deflate_im_buffers_SGL_over_2ops_second(void)4107db06104cSAdam Dybkowski test_compressdev_deflate_im_buffers_SGL_over_2ops_second(void)
4108db06104cSAdam Dybkowski {
4109db06104cSAdam Dybkowski 	struct comp_testsuite_params *ts_params = &testsuite_params;
4110db06104cSAdam Dybkowski 	uint16_t i = 0;
4111db06104cSAdam Dybkowski 	int ret = TEST_SUCCESS;
4112db06104cSAdam Dybkowski 	int j;
4113db06104cSAdam Dybkowski 	const struct rte_compressdev_capabilities *capab;
4114db06104cSAdam Dybkowski 	char *test_buffer = NULL;
4115db06104cSAdam Dybkowski 	const char *test_buffers[2];
4116db06104cSAdam Dybkowski 
4117db06104cSAdam Dybkowski 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
4118db06104cSAdam Dybkowski 
4119db06104cSAdam Dybkowski 	capab = rte_compressdev_capability_get(0, RTE_COMP_ALGO_DEFLATE);
4120db06104cSAdam Dybkowski 	TEST_ASSERT(capab != NULL, "Failed to retrieve device capabilities");
4121db06104cSAdam Dybkowski 
4122db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_HUFFMAN_DYNAMIC) == 0)
4123db06104cSAdam Dybkowski 		return -ENOTSUP;
4124db06104cSAdam Dybkowski 
4125db06104cSAdam Dybkowski 	if ((capab->comp_feature_flags & RTE_COMP_FF_OOP_SGL_IN_SGL_OUT) == 0)
4126db06104cSAdam Dybkowski 		return -ENOTSUP;
4127db06104cSAdam Dybkowski 
4128db06104cSAdam Dybkowski 	test_buffer = rte_malloc(NULL, IM_BUF_DATA_TEST_SIZE_OVER, 0);
4129db06104cSAdam Dybkowski 	if (test_buffer == NULL) {
4130db06104cSAdam Dybkowski 		RTE_LOG(ERR, USER1,
4131db06104cSAdam Dybkowski 			"Can't allocate buffer for big-data\n");
4132db06104cSAdam Dybkowski 		return TEST_FAILED;
4133db06104cSAdam Dybkowski 	}
4134db06104cSAdam Dybkowski 
4135db06104cSAdam Dybkowski 	test_buffers[0] = compress_test_bufs[0];
4136db06104cSAdam Dybkowski 	test_buffers[1] = test_buffer;
4137db06104cSAdam Dybkowski 
4138db06104cSAdam Dybkowski 	struct interim_data_params int_data = {
4139db06104cSAdam Dybkowski 		(const char * const *)test_buffers,
4140db06104cSAdam Dybkowski 		2,
4141db06104cSAdam Dybkowski 		&i,
4142db06104cSAdam Dybkowski 		&ts_params->def_comp_xform,
4143db06104cSAdam Dybkowski 		&ts_params->def_decomp_xform,
4144db06104cSAdam Dybkowski 		1
4145db06104cSAdam Dybkowski 	};
4146db06104cSAdam Dybkowski 
4147db06104cSAdam Dybkowski 	struct test_data_params test_data = {
4148db06104cSAdam Dybkowski 		.compress_state = RTE_COMP_OP_STATELESS,
4149db06104cSAdam Dybkowski 		.decompress_state = RTE_COMP_OP_STATELESS,
4150db06104cSAdam Dybkowski 		.buff_type = SGL_BOTH,
4151db06104cSAdam Dybkowski 		.zlib_dir = ZLIB_NONE,
4152db06104cSAdam Dybkowski 		.out_of_space = 0,
4153db06104cSAdam Dybkowski 		.big_data = 1,
4154db06104cSAdam Dybkowski 		.overflow = OVERFLOW_DISABLED,
4155db06104cSAdam Dybkowski 		.ratio = RATIO_DISABLED
4156db06104cSAdam Dybkowski 	};
4157db06104cSAdam Dybkowski 
4158db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
4159db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DYNAMIC;
4160db06104cSAdam Dybkowski 
4161db06104cSAdam Dybkowski 	/* fill the buffer with data based on rand. data */
4162db06104cSAdam Dybkowski 	srand(IM_BUF_DATA_TEST_SIZE_OVER);
4163db06104cSAdam Dybkowski 	for (j = 0; j < IM_BUF_DATA_TEST_SIZE_OVER - 1; ++j)
4164db06104cSAdam Dybkowski 		test_buffer[j] = (uint8_t)(rand() % ((uint8_t)-1)) | 1;
4165db06104cSAdam Dybkowski 
4166db06104cSAdam Dybkowski 	/* Compress with compressdev, decompress with compressdev */
4167db06104cSAdam Dybkowski 	if (test_deflate_comp_decomp(&int_data, &test_data) < 0) {
4168db06104cSAdam Dybkowski 		ret = TEST_SUCCESS;
4169db06104cSAdam Dybkowski 		goto end;
4170db06104cSAdam Dybkowski 	}
4171db06104cSAdam Dybkowski 
4172db06104cSAdam Dybkowski end:
4173db06104cSAdam Dybkowski 	ts_params->def_comp_xform->compress.deflate.huffman =
4174db06104cSAdam Dybkowski 			RTE_COMP_HUFFMAN_DEFAULT;
4175db06104cSAdam Dybkowski 	rte_free(test_buffer);
4176db06104cSAdam Dybkowski 	return ret;
4177db06104cSAdam Dybkowski }
4178db06104cSAdam Dybkowski 
4179a9de470cSBruce Richardson static struct unit_test_suite compressdev_testsuite  = {
4180a9de470cSBruce Richardson 	.suite_name = "compressdev unit test suite",
4181a9de470cSBruce Richardson 	.setup = testsuite_setup,
4182a9de470cSBruce Richardson 	.teardown = testsuite_teardown,
4183a9de470cSBruce Richardson 	.unit_test_cases = {
4184a9de470cSBruce Richardson 		TEST_CASE_ST(NULL, NULL,
4185a9de470cSBruce Richardson 			test_compressdev_invalid_configuration),
4186a9de470cSBruce Richardson 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4187a9de470cSBruce Richardson 			test_compressdev_deflate_stateless_fixed),
4188a9de470cSBruce Richardson 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4189a9de470cSBruce Richardson 			test_compressdev_deflate_stateless_dynamic),
4190a9de470cSBruce Richardson 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
41919df7ffd1STomasz Jozwiak 			test_compressdev_deflate_stateless_dynamic_big),
41929df7ffd1STomasz Jozwiak 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4193a9de470cSBruce Richardson 			test_compressdev_deflate_stateless_multi_op),
4194a9de470cSBruce Richardson 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4195a9de470cSBruce Richardson 			test_compressdev_deflate_stateless_multi_level),
4196a9de470cSBruce Richardson 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4197a9de470cSBruce Richardson 			test_compressdev_deflate_stateless_multi_xform),
4198a9de470cSBruce Richardson 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4199a9de470cSBruce Richardson 			test_compressdev_deflate_stateless_sgl),
4200a9de470cSBruce Richardson 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4201a9de470cSBruce Richardson 			test_compressdev_deflate_stateless_checksum),
4202a9de470cSBruce Richardson 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4203a9de470cSBruce Richardson 			test_compressdev_out_of_space_buffer),
420407b810c5SAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
420507b810c5SAdam Dybkowski 			test_compressdev_deflate_stateful_decomp),
420607b810c5SAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
420707b810c5SAdam Dybkowski 			test_compressdev_deflate_stateful_decomp_checksum),
42083fc3996fSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
42093fc3996fSAdam Dybkowski 			test_compressdev_external_mbufs),
42102437fbbcSArtur Trybula 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
42112437fbbcSArtur Trybula 		      test_compressdev_deflate_stateless_fixed_oos_recoverable),
4212db06104cSAdam Dybkowski 
4213db06104cSAdam Dybkowski 		/* Positive test cases for IM buffer handling verification */
4214db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4215db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_LB_1op),
4216db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4217db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_LB_2ops_first),
4218db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4219db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_LB_2ops_second),
4220db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4221db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_LB_3ops),
4222db06104cSAdam Dybkowski 
4223db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4224db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_LB_4ops),
4225db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4226db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_SGL_1op),
4227db06104cSAdam Dybkowski 
4228db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4229db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_SGL_2ops_first),
4230db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4231db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_SGL_2ops_second),
4232db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4233db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_SGL_3ops),
4234db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4235db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_SGL_4ops),
4236db06104cSAdam Dybkowski 
4237db06104cSAdam Dybkowski 		/* Negative test cases for IM buffer handling verification */
4238db06104cSAdam Dybkowski 
4239db06104cSAdam Dybkowski 		/* For this test huge mempool is necessary.
4240db06104cSAdam Dybkowski 		 * It tests one case:
4241db06104cSAdam Dybkowski 		 * only one op containing big amount of data, so that
4242db06104cSAdam Dybkowski 		 * number of requested descriptors higher than number
4243db06104cSAdam Dybkowski 		 * of available descriptors (128)
4244db06104cSAdam Dybkowski 		 */
4245db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4246db06104cSAdam Dybkowski 			test_compressdev_deflate_im_buffers_SGL_over_1op),
4247db06104cSAdam Dybkowski 
4248db06104cSAdam Dybkowski 		/* For this test huge mempool is necessary.
4249db06104cSAdam Dybkowski 		 * 2 ops. First op contains big amount of data:
4250db06104cSAdam Dybkowski 		 * number of requested descriptors higher than number
4251db06104cSAdam Dybkowski 		 * of available descriptors (128), the second op is
4252db06104cSAdam Dybkowski 		 * relatively small. In this case both ops are rejected
4253db06104cSAdam Dybkowski 		 */
4254db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4255db06104cSAdam Dybkowski 		       test_compressdev_deflate_im_buffers_SGL_over_2ops_first),
4256db06104cSAdam Dybkowski 
4257db06104cSAdam Dybkowski 		TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
4258db06104cSAdam Dybkowski 		      test_compressdev_deflate_im_buffers_SGL_over_2ops_second),
4259db06104cSAdam Dybkowski 
4260a9de470cSBruce Richardson 		TEST_CASES_END() /**< NULL terminate unit test array */
4261a9de470cSBruce Richardson 	}
4262a9de470cSBruce Richardson };
4263a9de470cSBruce Richardson 
4264a9de470cSBruce Richardson static int
test_compressdev(void)4265a9de470cSBruce Richardson test_compressdev(void)
4266a9de470cSBruce Richardson {
4267a9de470cSBruce Richardson 	return unit_test_suite_runner(&compressdev_testsuite);
4268a9de470cSBruce Richardson }
4269a9de470cSBruce Richardson 
4270*d83fb967SDavid Marchand REGISTER_FAST_TEST(compressdev_autotest, false, true, test_compressdev);
4271