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