xref: /dpdk/drivers/compress/zlib/zlib_pmd.c (revision f665790a5dbad7b645ff46f31d65e977324e7bfc)
10c4e4c16SAshish Gupta /* SPDX-License-Identifier: BSD-3-Clause
20c4e4c16SAshish Gupta  * Copyright(c) 2018 Cavium Networks
30c4e4c16SAshish Gupta  */
40c4e4c16SAshish Gupta 
54851ef2bSDavid Marchand #include <bus_vdev_driver.h>
60c4e4c16SAshish Gupta #include <rte_common.h>
70c4e4c16SAshish Gupta 
80c4e4c16SAshish Gupta #include "zlib_pmd_private.h"
90c4e4c16SAshish Gupta 
10c7b436ecSSunila Sahu /** Compute next mbuf in the list, assign data buffer and length,
11c7b436ecSSunila Sahu  *  returns 0 if mbuf is NULL
12c7b436ecSSunila Sahu  */
13c7b436ecSSunila Sahu #define COMPUTE_BUF(mbuf, data, len)		\
14c7b436ecSSunila Sahu 		((mbuf = mbuf->next) ?		\
15c7b436ecSSunila Sahu 		(data = rte_pktmbuf_mtod(mbuf, uint8_t *)),	\
16c7b436ecSSunila Sahu 		(len = rte_pktmbuf_data_len(mbuf)) : 0)
17c7b436ecSSunila Sahu 
18c7b436ecSSunila Sahu static void
19c7b436ecSSunila Sahu process_zlib_deflate(struct rte_comp_op *op, z_stream *strm)
20c7b436ecSSunila Sahu {
21c7b436ecSSunila Sahu 	int ret, flush, fin_flush;
22c7b436ecSSunila Sahu 	struct rte_mbuf *mbuf_src = op->m_src;
23c7b436ecSSunila Sahu 	struct rte_mbuf *mbuf_dst = op->m_dst;
24c7b436ecSSunila Sahu 
25c7b436ecSSunila Sahu 	switch (op->flush_flag) {
26c7b436ecSSunila Sahu 	case RTE_COMP_FLUSH_FULL:
27c7b436ecSSunila Sahu 	case RTE_COMP_FLUSH_FINAL:
28c7b436ecSSunila Sahu 		fin_flush = Z_FINISH;
29c7b436ecSSunila Sahu 		break;
30c7b436ecSSunila Sahu 	default:
31c7b436ecSSunila Sahu 		op->status = RTE_COMP_OP_STATUS_INVALID_ARGS;
32*f665790aSDavid Marchand 		ZLIB_PMD_ERR("Invalid flush value");
33ff53baa9SAdam Dybkowski 		return;
34c7b436ecSSunila Sahu 	}
35c7b436ecSSunila Sahu 
36c7b436ecSSunila Sahu 	if (unlikely(!strm)) {
37c7b436ecSSunila Sahu 		op->status = RTE_COMP_OP_STATUS_INVALID_ARGS;
38*f665790aSDavid Marchand 		ZLIB_PMD_ERR("Invalid z_stream");
39c7b436ecSSunila Sahu 		return;
40c7b436ecSSunila Sahu 	}
41c7b436ecSSunila Sahu 	/* Update z_stream with the inputs provided by application */
42c7b436ecSSunila Sahu 	strm->next_in = rte_pktmbuf_mtod_offset(mbuf_src, uint8_t *,
43c7b436ecSSunila Sahu 			op->src.offset);
44c7b436ecSSunila Sahu 
45c7b436ecSSunila Sahu 	strm->avail_in = rte_pktmbuf_data_len(mbuf_src) - op->src.offset;
46c7b436ecSSunila Sahu 
47c7b436ecSSunila Sahu 	strm->next_out = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *,
48c7b436ecSSunila Sahu 			op->dst.offset);
49c7b436ecSSunila Sahu 
50c7b436ecSSunila Sahu 	strm->avail_out = rte_pktmbuf_data_len(mbuf_dst) - op->dst.offset;
51c7b436ecSSunila Sahu 
52c7b436ecSSunila Sahu 	/* Set flush value to NO_FLUSH unless it is last mbuf */
53c7b436ecSSunila Sahu 	flush = Z_NO_FLUSH;
54c7b436ecSSunila Sahu 	/* Initialize status to SUCCESS */
55c7b436ecSSunila Sahu 	op->status = RTE_COMP_OP_STATUS_SUCCESS;
56c7b436ecSSunila Sahu 
57c7b436ecSSunila Sahu 	do {
58c7b436ecSSunila Sahu 		/* Set flush value to Z_FINISH for last block */
59c7b436ecSSunila Sahu 		if ((op->src.length - strm->total_in) <= strm->avail_in) {
60c7b436ecSSunila Sahu 			strm->avail_in = (op->src.length - strm->total_in);
61c7b436ecSSunila Sahu 			flush = fin_flush;
62c7b436ecSSunila Sahu 		}
63c7b436ecSSunila Sahu 		do {
64c7b436ecSSunila Sahu 			ret = deflate(strm, flush);
65c7b436ecSSunila Sahu 			if (unlikely(ret == Z_STREAM_ERROR)) {
66c7b436ecSSunila Sahu 				/* error return, do not process further */
67c7b436ecSSunila Sahu 				op->status =  RTE_COMP_OP_STATUS_ERROR;
68c7b436ecSSunila Sahu 				goto def_end;
69c7b436ecSSunila Sahu 			}
70c7b436ecSSunila Sahu 			/* Break if Z_STREAM_END is encountered */
71c7b436ecSSunila Sahu 			if (ret == Z_STREAM_END)
72c7b436ecSSunila Sahu 				goto def_end;
73c7b436ecSSunila Sahu 
74c7b436ecSSunila Sahu 		/* Keep looping until input mbuf is consumed.
75c7b436ecSSunila Sahu 		 * Exit if destination mbuf gets exhausted.
76c7b436ecSSunila Sahu 		 */
77c7b436ecSSunila Sahu 		} while ((strm->avail_out == 0) &&
78c7b436ecSSunila Sahu 			COMPUTE_BUF(mbuf_dst, strm->next_out, strm->avail_out));
79c7b436ecSSunila Sahu 
80c7b436ecSSunila Sahu 		if (!strm->avail_out) {
81c7b436ecSSunila Sahu 			/* there is no space for compressed output */
82c7b436ecSSunila Sahu 			op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED;
83c7b436ecSSunila Sahu 			break;
84c7b436ecSSunila Sahu 		}
85c7b436ecSSunila Sahu 
86c7b436ecSSunila Sahu 	/* Update source buffer to next mbuf
87c7b436ecSSunila Sahu 	 * Exit if input buffers are fully consumed
88c7b436ecSSunila Sahu 	 */
89c7b436ecSSunila Sahu 	} while (COMPUTE_BUF(mbuf_src, strm->next_in, strm->avail_in));
90c7b436ecSSunila Sahu 
91c7b436ecSSunila Sahu def_end:
92c7b436ecSSunila Sahu 	/* Update op stats */
93c7b436ecSSunila Sahu 	switch (op->status) {
94c7b436ecSSunila Sahu 	case RTE_COMP_OP_STATUS_SUCCESS:
95c7b436ecSSunila Sahu 		op->consumed += strm->total_in;
96c7b436ecSSunila Sahu 	/* Fall-through */
97c7b436ecSSunila Sahu 	case RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED:
98c7b436ecSSunila Sahu 		op->produced += strm->total_out;
99c7b436ecSSunila Sahu 		break;
100c7b436ecSSunila Sahu 	default:
101*f665790aSDavid Marchand 		ZLIB_PMD_ERR("stats not updated for status:%d",
102c7b436ecSSunila Sahu 				op->status);
103c7b436ecSSunila Sahu 	}
104c7b436ecSSunila Sahu 
105c7b436ecSSunila Sahu 	deflateReset(strm);
106c7b436ecSSunila Sahu }
107c7b436ecSSunila Sahu 
108c7b436ecSSunila Sahu static void
109c7b436ecSSunila Sahu process_zlib_inflate(struct rte_comp_op *op, z_stream *strm)
110c7b436ecSSunila Sahu {
111c7b436ecSSunila Sahu 	int ret, flush;
112c7b436ecSSunila Sahu 	struct rte_mbuf *mbuf_src = op->m_src;
113c7b436ecSSunila Sahu 	struct rte_mbuf *mbuf_dst = op->m_dst;
114c7b436ecSSunila Sahu 
115c7b436ecSSunila Sahu 	if (unlikely(!strm)) {
116c7b436ecSSunila Sahu 		op->status = RTE_COMP_OP_STATUS_INVALID_ARGS;
117*f665790aSDavid Marchand 		ZLIB_PMD_ERR("Invalid z_stream");
118c7b436ecSSunila Sahu 		return;
119c7b436ecSSunila Sahu 	}
120c7b436ecSSunila Sahu 	strm->next_in = rte_pktmbuf_mtod_offset(mbuf_src, uint8_t *,
121c7b436ecSSunila Sahu 			op->src.offset);
122c7b436ecSSunila Sahu 
123c7b436ecSSunila Sahu 	strm->avail_in = rte_pktmbuf_data_len(mbuf_src) - op->src.offset;
124c7b436ecSSunila Sahu 
125c7b436ecSSunila Sahu 	strm->next_out = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *,
126c7b436ecSSunila Sahu 			op->dst.offset);
127c7b436ecSSunila Sahu 
128c7b436ecSSunila Sahu 	strm->avail_out = rte_pktmbuf_data_len(mbuf_dst) - op->dst.offset;
129c7b436ecSSunila Sahu 
130c7b436ecSSunila Sahu 	/** Ignoring flush value provided from application for decompression */
131c7b436ecSSunila Sahu 	flush = Z_NO_FLUSH;
132c7b436ecSSunila Sahu 	/* initialize status to SUCCESS */
133c7b436ecSSunila Sahu 	op->status = RTE_COMP_OP_STATUS_SUCCESS;
134c7b436ecSSunila Sahu 
135c7b436ecSSunila Sahu 	do {
136c7b436ecSSunila Sahu 		do {
137c7b436ecSSunila Sahu 			ret = inflate(strm, flush);
138c7b436ecSSunila Sahu 
139c7b436ecSSunila Sahu 			switch (ret) {
140c7b436ecSSunila Sahu 			/* Fall-through */
141c7b436ecSSunila Sahu 			case Z_NEED_DICT:
142c7b436ecSSunila Sahu 				ret = Z_DATA_ERROR;
143c7b436ecSSunila Sahu 			/* Fall-through */
144c7b436ecSSunila Sahu 			case Z_DATA_ERROR:
145c7b436ecSSunila Sahu 			/* Fall-through */
146c7b436ecSSunila Sahu 			case Z_MEM_ERROR:
147c7b436ecSSunila Sahu 			/* Fall-through */
148c7b436ecSSunila Sahu 			case Z_STREAM_ERROR:
149c7b436ecSSunila Sahu 				op->status = RTE_COMP_OP_STATUS_ERROR;
150c7b436ecSSunila Sahu 			/* Fall-through */
151c7b436ecSSunila Sahu 			case Z_STREAM_END:
152c7b436ecSSunila Sahu 				/* no further computation needed if
153c7b436ecSSunila Sahu 				 * Z_STREAM_END is encountered
154c7b436ecSSunila Sahu 				 */
155c7b436ecSSunila Sahu 				goto inf_end;
156c7b436ecSSunila Sahu 			default:
157c7b436ecSSunila Sahu 				/* success */
158c7b436ecSSunila Sahu 				break;
159c7b436ecSSunila Sahu 
160c7b436ecSSunila Sahu 			}
161c7b436ecSSunila Sahu 		/* Keep looping until input mbuf is consumed.
162c7b436ecSSunila Sahu 		 * Exit if destination mbuf gets exhausted.
163c7b436ecSSunila Sahu 		 */
164c7b436ecSSunila Sahu 		} while ((strm->avail_out == 0) &&
165c7b436ecSSunila Sahu 			COMPUTE_BUF(mbuf_dst, strm->next_out, strm->avail_out));
166c7b436ecSSunila Sahu 
167c7b436ecSSunila Sahu 		if (!strm->avail_out) {
168c7b436ecSSunila Sahu 			/* there is no more space for decompressed output */
169c7b436ecSSunila Sahu 			op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED;
170c7b436ecSSunila Sahu 			break;
171c7b436ecSSunila Sahu 		}
172c7b436ecSSunila Sahu 	/* Read next input buffer to be processed, exit if compressed
173c7b436ecSSunila Sahu 	 * blocks are fully read
174c7b436ecSSunila Sahu 	 */
175c7b436ecSSunila Sahu 	} while (COMPUTE_BUF(mbuf_src, strm->next_in, strm->avail_in));
176c7b436ecSSunila Sahu 
177c7b436ecSSunila Sahu inf_end:
178c7b436ecSSunila Sahu 	/* Update op stats */
179c7b436ecSSunila Sahu 	switch (op->status) {
180c7b436ecSSunila Sahu 	case RTE_COMP_OP_STATUS_SUCCESS:
181c7b436ecSSunila Sahu 		op->consumed += strm->total_in;
182c7b436ecSSunila Sahu 	/* Fall-through */
183c7b436ecSSunila Sahu 	case RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED:
184c7b436ecSSunila Sahu 		op->produced += strm->total_out;
185c7b436ecSSunila Sahu 		break;
186c7b436ecSSunila Sahu 	default:
187*f665790aSDavid Marchand 		ZLIB_PMD_ERR("stats not produced for status:%d",
188c7b436ecSSunila Sahu 				op->status);
189c7b436ecSSunila Sahu 	}
190c7b436ecSSunila Sahu 
191c7b436ecSSunila Sahu 	inflateReset(strm);
192c7b436ecSSunila Sahu }
193c7b436ecSSunila Sahu 
194c7b436ecSSunila Sahu /** Process comp operation for mbuf */
195c7b436ecSSunila Sahu static inline int
196c7b436ecSSunila Sahu process_zlib_op(struct zlib_qp *qp, struct rte_comp_op *op)
197c7b436ecSSunila Sahu {
198c7b436ecSSunila Sahu 	struct zlib_stream *stream;
199c7b436ecSSunila Sahu 	struct zlib_priv_xform *private_xform;
200c7b436ecSSunila Sahu 
201c7b436ecSSunila Sahu 	if ((op->op_type == RTE_COMP_OP_STATEFUL) ||
202c7b436ecSSunila Sahu 			(op->src.offset > rte_pktmbuf_data_len(op->m_src)) ||
203c7b436ecSSunila Sahu 			(op->dst.offset > rte_pktmbuf_data_len(op->m_dst))) {
204c7b436ecSSunila Sahu 		op->status = RTE_COMP_OP_STATUS_INVALID_ARGS;
205c7b436ecSSunila Sahu 		ZLIB_PMD_ERR("Invalid source or destination buffers or "
206*f665790aSDavid Marchand 			     "invalid Operation requested");
207c7b436ecSSunila Sahu 	} else {
208c7b436ecSSunila Sahu 		private_xform = (struct zlib_priv_xform *)op->private_xform;
209c7b436ecSSunila Sahu 		stream = &private_xform->stream;
210c7b436ecSSunila Sahu 		stream->comp(op, &stream->strm);
211c7b436ecSSunila Sahu 	}
212c7b436ecSSunila Sahu 	/* whatever is out of op, put it into completion queue with
213c7b436ecSSunila Sahu 	 * its status
214c7b436ecSSunila Sahu 	 */
215c7b436ecSSunila Sahu 	return rte_ring_enqueue(qp->processed_pkts, (void *)op);
216c7b436ecSSunila Sahu }
217c7b436ecSSunila Sahu 
218c7b436ecSSunila Sahu /** Parse comp xform and set private xform/Stream parameters */
2190cc20d33SSunila Sahu int
2200cc20d33SSunila Sahu zlib_set_stream_parameters(const struct rte_comp_xform *xform,
2210cc20d33SSunila Sahu 		struct zlib_stream *stream)
2220cc20d33SSunila Sahu {
2230cc20d33SSunila Sahu 	int strategy, level, wbits;
2240cc20d33SSunila Sahu 	z_stream *strm = &stream->strm;
2250cc20d33SSunila Sahu 
2260cc20d33SSunila Sahu 	/* allocate deflate state */
2270cc20d33SSunila Sahu 	strm->zalloc = Z_NULL;
2280cc20d33SSunila Sahu 	strm->zfree = Z_NULL;
2290cc20d33SSunila Sahu 	strm->opaque = Z_NULL;
2300cc20d33SSunila Sahu 
2310cc20d33SSunila Sahu 	switch (xform->type) {
2320cc20d33SSunila Sahu 	case RTE_COMP_COMPRESS:
233c7b436ecSSunila Sahu 		stream->comp = process_zlib_deflate;
234c7b436ecSSunila Sahu 		stream->free = deflateEnd;
2350cc20d33SSunila Sahu 		/** Compression window bits */
2360cc20d33SSunila Sahu 		switch (xform->compress.algo) {
2370cc20d33SSunila Sahu 		case RTE_COMP_ALGO_DEFLATE:
2380cc20d33SSunila Sahu 			wbits = -(xform->compress.window_size);
2390cc20d33SSunila Sahu 			break;
2400cc20d33SSunila Sahu 		default:
241*f665790aSDavid Marchand 			ZLIB_PMD_ERR("Compression algorithm not supported");
2420cc20d33SSunila Sahu 			return -1;
2430cc20d33SSunila Sahu 		}
2440cc20d33SSunila Sahu 		/** Compression Level */
2450cc20d33SSunila Sahu 		switch (xform->compress.level) {
2460cc20d33SSunila Sahu 		case RTE_COMP_LEVEL_PMD_DEFAULT:
2470cc20d33SSunila Sahu 			level = Z_DEFAULT_COMPRESSION;
2480cc20d33SSunila Sahu 			break;
2490cc20d33SSunila Sahu 		case RTE_COMP_LEVEL_NONE:
2500cc20d33SSunila Sahu 			level = Z_NO_COMPRESSION;
2510cc20d33SSunila Sahu 			break;
2520cc20d33SSunila Sahu 		case RTE_COMP_LEVEL_MIN:
2530cc20d33SSunila Sahu 			level = Z_BEST_SPEED;
2540cc20d33SSunila Sahu 			break;
2550cc20d33SSunila Sahu 		case RTE_COMP_LEVEL_MAX:
2560cc20d33SSunila Sahu 			level = Z_BEST_COMPRESSION;
2570cc20d33SSunila Sahu 			break;
2580cc20d33SSunila Sahu 		default:
2590cc20d33SSunila Sahu 			level = xform->compress.level;
2600cc20d33SSunila Sahu 			if (level < RTE_COMP_LEVEL_MIN ||
2610cc20d33SSunila Sahu 					level > RTE_COMP_LEVEL_MAX) {
2620cc20d33SSunila Sahu 				ZLIB_PMD_ERR("Compression level %d "
263*f665790aSDavid Marchand 						"not supported",
2640cc20d33SSunila Sahu 						level);
2650cc20d33SSunila Sahu 				return -1;
2660cc20d33SSunila Sahu 			}
2670cc20d33SSunila Sahu 			break;
2680cc20d33SSunila Sahu 		}
2690cc20d33SSunila Sahu 		/** Compression strategy */
2700cc20d33SSunila Sahu 		switch (xform->compress.deflate.huffman) {
2710cc20d33SSunila Sahu 		case RTE_COMP_HUFFMAN_DEFAULT:
2720cc20d33SSunila Sahu 			strategy = Z_DEFAULT_STRATEGY;
2730cc20d33SSunila Sahu 			break;
2740cc20d33SSunila Sahu 		case RTE_COMP_HUFFMAN_FIXED:
2750cc20d33SSunila Sahu 			strategy = Z_FIXED;
2760cc20d33SSunila Sahu 			break;
2770cc20d33SSunila Sahu 		case RTE_COMP_HUFFMAN_DYNAMIC:
2780cc20d33SSunila Sahu 			strategy = Z_DEFAULT_STRATEGY;
2790cc20d33SSunila Sahu 			break;
2800cc20d33SSunila Sahu 		default:
281*f665790aSDavid Marchand 			ZLIB_PMD_ERR("Compression strategy not supported");
2820cc20d33SSunila Sahu 			return -1;
2830cc20d33SSunila Sahu 		}
2840cc20d33SSunila Sahu 		if (deflateInit2(strm, level,
2850cc20d33SSunila Sahu 					Z_DEFLATED, wbits,
2860cc20d33SSunila Sahu 					DEF_MEM_LEVEL, strategy) != Z_OK) {
287*f665790aSDavid Marchand 			ZLIB_PMD_ERR("Deflate init failed");
2880cc20d33SSunila Sahu 			return -1;
2890cc20d33SSunila Sahu 		}
2900cc20d33SSunila Sahu 		break;
2910cc20d33SSunila Sahu 
2920cc20d33SSunila Sahu 	case RTE_COMP_DECOMPRESS:
293c7b436ecSSunila Sahu 		stream->comp = process_zlib_inflate;
294c7b436ecSSunila Sahu 		stream->free = inflateEnd;
2950cc20d33SSunila Sahu 		/** window bits */
2960cc20d33SSunila Sahu 		switch (xform->decompress.algo) {
2970cc20d33SSunila Sahu 		case RTE_COMP_ALGO_DEFLATE:
2980cc20d33SSunila Sahu 			wbits = -(xform->decompress.window_size);
2990cc20d33SSunila Sahu 			break;
3000cc20d33SSunila Sahu 		default:
301*f665790aSDavid Marchand 			ZLIB_PMD_ERR("Compression algorithm not supported");
3020cc20d33SSunila Sahu 			return -1;
3030cc20d33SSunila Sahu 		}
3040cc20d33SSunila Sahu 
3050cc20d33SSunila Sahu 		if (inflateInit2(strm, wbits) != Z_OK) {
306*f665790aSDavid Marchand 			ZLIB_PMD_ERR("Inflate init failed");
3070cc20d33SSunila Sahu 			return -1;
3080cc20d33SSunila Sahu 		}
3090cc20d33SSunila Sahu 		break;
3100cc20d33SSunila Sahu 	default:
3110cc20d33SSunila Sahu 		return -1;
3120cc20d33SSunila Sahu 	}
3130cc20d33SSunila Sahu 	return 0;
3140cc20d33SSunila Sahu }
3150cc20d33SSunila Sahu 
316c7b436ecSSunila Sahu static uint16_t
317c7b436ecSSunila Sahu zlib_pmd_enqueue_burst(void *queue_pair,
318c7b436ecSSunila Sahu 			struct rte_comp_op **ops, uint16_t nb_ops)
319c7b436ecSSunila Sahu {
320c7b436ecSSunila Sahu 	struct zlib_qp *qp = queue_pair;
321c7b436ecSSunila Sahu 	int ret;
322c7b436ecSSunila Sahu 	uint16_t i;
323c7b436ecSSunila Sahu 	uint16_t enqd = 0;
324c7b436ecSSunila Sahu 	for (i = 0; i < nb_ops; i++) {
325c7b436ecSSunila Sahu 		ret = process_zlib_op(qp, ops[i]);
326c7b436ecSSunila Sahu 		if (unlikely(ret < 0)) {
327c7b436ecSSunila Sahu 			/* increment count if failed to push to completion
328c7b436ecSSunila Sahu 			 * queue
329c7b436ecSSunila Sahu 			 */
330c7b436ecSSunila Sahu 			qp->qp_stats.enqueue_err_count++;
331c7b436ecSSunila Sahu 		} else {
332c7b436ecSSunila Sahu 			qp->qp_stats.enqueued_count++;
333c7b436ecSSunila Sahu 			enqd++;
334c7b436ecSSunila Sahu 		}
335c7b436ecSSunila Sahu 	}
336c7b436ecSSunila Sahu 	return enqd;
337c7b436ecSSunila Sahu }
338c7b436ecSSunila Sahu 
339c7b436ecSSunila Sahu static uint16_t
340c7b436ecSSunila Sahu zlib_pmd_dequeue_burst(void *queue_pair,
341c7b436ecSSunila Sahu 			struct rte_comp_op **ops, uint16_t nb_ops)
342c7b436ecSSunila Sahu {
343c7b436ecSSunila Sahu 	struct zlib_qp *qp = queue_pair;
344c7b436ecSSunila Sahu 
345c7b436ecSSunila Sahu 	unsigned int nb_dequeued = 0;
346c7b436ecSSunila Sahu 
347c7b436ecSSunila Sahu 	nb_dequeued = rte_ring_dequeue_burst(qp->processed_pkts,
348c7b436ecSSunila Sahu 			(void **)ops, nb_ops, NULL);
349c7b436ecSSunila Sahu 	qp->qp_stats.dequeued_count += nb_dequeued;
350c7b436ecSSunila Sahu 
351c7b436ecSSunila Sahu 	return nb_dequeued;
352c7b436ecSSunila Sahu }
353c7b436ecSSunila Sahu 
3540c4e4c16SAshish Gupta static int
3550c4e4c16SAshish Gupta zlib_create(const char *name,
3560c4e4c16SAshish Gupta 		struct rte_vdev_device *vdev,
3570c4e4c16SAshish Gupta 		struct rte_compressdev_pmd_init_params *init_params)
3580c4e4c16SAshish Gupta {
3590c4e4c16SAshish Gupta 	struct rte_compressdev *dev;
3600c4e4c16SAshish Gupta 
3610c4e4c16SAshish Gupta 	dev = rte_compressdev_pmd_create(name, &vdev->device,
3620c4e4c16SAshish Gupta 			sizeof(struct zlib_private), init_params);
3630c4e4c16SAshish Gupta 	if (dev == NULL) {
3640c4e4c16SAshish Gupta 		ZLIB_PMD_ERR("driver %s: create failed", init_params->name);
3650c4e4c16SAshish Gupta 		return -ENODEV;
3660c4e4c16SAshish Gupta 	}
3670c4e4c16SAshish Gupta 
36827422fc3SAshish Gupta 	dev->dev_ops = rte_zlib_pmd_ops;
36927422fc3SAshish Gupta 
370c7b436ecSSunila Sahu 	/* register rx/tx burst functions for data path */
371c7b436ecSSunila Sahu 	dev->dequeue_burst = zlib_pmd_dequeue_burst;
372c7b436ecSSunila Sahu 	dev->enqueue_burst = zlib_pmd_enqueue_burst;
373c7b436ecSSunila Sahu 
3740c4e4c16SAshish Gupta 	return 0;
3750c4e4c16SAshish Gupta }
3760c4e4c16SAshish Gupta 
3770c4e4c16SAshish Gupta static int
3780c4e4c16SAshish Gupta zlib_probe(struct rte_vdev_device *vdev)
3790c4e4c16SAshish Gupta {
3800c4e4c16SAshish Gupta 	struct rte_compressdev_pmd_init_params init_params = {
3810c4e4c16SAshish Gupta 		"",
3820c4e4c16SAshish Gupta 		rte_socket_id()
3830c4e4c16SAshish Gupta 	};
3840c4e4c16SAshish Gupta 	const char *name;
3850c4e4c16SAshish Gupta 	const char *input_args;
3860c4e4c16SAshish Gupta 	int retval;
3870c4e4c16SAshish Gupta 
3880c4e4c16SAshish Gupta 	name = rte_vdev_device_name(vdev);
3890c4e4c16SAshish Gupta 
3900c4e4c16SAshish Gupta 	if (name == NULL)
3910c4e4c16SAshish Gupta 		return -EINVAL;
3920c4e4c16SAshish Gupta 
3930c4e4c16SAshish Gupta 	input_args = rte_vdev_device_args(vdev);
3940c4e4c16SAshish Gupta 
3950c4e4c16SAshish Gupta 	retval = rte_compressdev_pmd_parse_input_args(&init_params, input_args);
3960c4e4c16SAshish Gupta 	if (retval < 0) {
3970c4e4c16SAshish Gupta 		ZLIB_PMD_LOG(ERR,
398*f665790aSDavid Marchand 			"Failed to parse initialisation arguments[%s]",
3990c4e4c16SAshish Gupta 			input_args);
4000c4e4c16SAshish Gupta 		return -EINVAL;
4010c4e4c16SAshish Gupta 	}
4020c4e4c16SAshish Gupta 
4030c4e4c16SAshish Gupta 	return zlib_create(name, vdev, &init_params);
4040c4e4c16SAshish Gupta }
4050c4e4c16SAshish Gupta 
4060c4e4c16SAshish Gupta static int
4070c4e4c16SAshish Gupta zlib_remove(struct rte_vdev_device *vdev)
4080c4e4c16SAshish Gupta {
4090c4e4c16SAshish Gupta 	struct rte_compressdev *compressdev;
4100c4e4c16SAshish Gupta 	const char *name;
4110c4e4c16SAshish Gupta 
4120c4e4c16SAshish Gupta 	name = rte_vdev_device_name(vdev);
4130c4e4c16SAshish Gupta 	if (name == NULL)
4140c4e4c16SAshish Gupta 		return -EINVAL;
4150c4e4c16SAshish Gupta 
4160c4e4c16SAshish Gupta 	compressdev = rte_compressdev_pmd_get_named_dev(name);
4170c4e4c16SAshish Gupta 	if (compressdev == NULL)
4180c4e4c16SAshish Gupta 		return -ENODEV;
4190c4e4c16SAshish Gupta 
4200c4e4c16SAshish Gupta 	return rte_compressdev_pmd_destroy(compressdev);
4210c4e4c16SAshish Gupta }
4220c4e4c16SAshish Gupta 
4230c4e4c16SAshish Gupta static struct rte_vdev_driver zlib_pmd_drv = {
4240c4e4c16SAshish Gupta 	.probe = zlib_probe,
4250c4e4c16SAshish Gupta 	.remove = zlib_remove
4260c4e4c16SAshish Gupta };
4270c4e4c16SAshish Gupta 
4280c4e4c16SAshish Gupta RTE_PMD_REGISTER_VDEV(COMPRESSDEV_NAME_ZLIB_PMD, zlib_pmd_drv);
429eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(zlib_logtype_driver, INFO);
430