1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Cavium Networks
5 #include <rte_bus_vdev.h>
6 #include <rte_common.h>
8 #include "zlib_pmd_private.h"
10 /** Parse comp xform and set private xform/stream parameters */
12 zlib_set_stream_parameters(const struct rte_comp_xform *xform,
13 struct zlib_stream *stream)
15 int strategy, level, wbits;
16 z_stream *strm = &stream->strm;
18 /* allocate deflate state */
19 strm->zalloc = Z_NULL;
21 strm->opaque = Z_NULL;
23 switch (xform->type) {
24 case RTE_COMP_COMPRESS:
25 /** Compression window bits */
26 switch (xform->compress.algo) {
27 case RTE_COMP_ALGO_DEFLATE:
28 wbits = -(xform->compress.window_size);
31 ZLIB_PMD_ERR("Compression algorithm not supported\n");
34 /** Compression Level */
35 switch (xform->compress.level) {
36 case RTE_COMP_LEVEL_PMD_DEFAULT:
37 level = Z_DEFAULT_COMPRESSION;
39 case RTE_COMP_LEVEL_NONE:
40 level = Z_NO_COMPRESSION;
42 case RTE_COMP_LEVEL_MIN:
45 case RTE_COMP_LEVEL_MAX:
46 level = Z_BEST_COMPRESSION;
49 level = xform->compress.level;
50 if (level < RTE_COMP_LEVEL_MIN ||
51 level > RTE_COMP_LEVEL_MAX) {
52 ZLIB_PMD_ERR("Compression level %d "
59 /** Compression strategy */
60 switch (xform->compress.deflate.huffman) {
61 case RTE_COMP_HUFFMAN_DEFAULT:
62 strategy = Z_DEFAULT_STRATEGY;
64 case RTE_COMP_HUFFMAN_FIXED:
67 case RTE_COMP_HUFFMAN_DYNAMIC:
68 strategy = Z_DEFAULT_STRATEGY;
71 ZLIB_PMD_ERR("Compression strategy not supported\n");
74 if (deflateInit2(strm, level,
76 DEF_MEM_LEVEL, strategy) != Z_OK) {
77 ZLIB_PMD_ERR("Deflate init failed\n");
82 case RTE_COMP_DECOMPRESS:
84 switch (xform->decompress.algo) {
85 case RTE_COMP_ALGO_DEFLATE:
86 wbits = -(xform->decompress.window_size);
89 ZLIB_PMD_ERR("Compression algorithm not supported\n");
93 if (inflateInit2(strm, wbits) != Z_OK) {
94 ZLIB_PMD_ERR("Inflate init failed\n");
105 zlib_create(const char *name,
106 struct rte_vdev_device *vdev,
107 struct rte_compressdev_pmd_init_params *init_params)
109 struct rte_compressdev *dev;
111 dev = rte_compressdev_pmd_create(name, &vdev->device,
112 sizeof(struct zlib_private), init_params);
114 ZLIB_PMD_ERR("driver %s: create failed", init_params->name);
118 dev->dev_ops = rte_zlib_pmd_ops;
124 zlib_probe(struct rte_vdev_device *vdev)
126 struct rte_compressdev_pmd_init_params init_params = {
131 const char *input_args;
134 name = rte_vdev_device_name(vdev);
139 input_args = rte_vdev_device_args(vdev);
141 retval = rte_compressdev_pmd_parse_input_args(&init_params, input_args);
144 "Failed to parse initialisation arguments[%s]\n",
149 return zlib_create(name, vdev, &init_params);
153 zlib_remove(struct rte_vdev_device *vdev)
155 struct rte_compressdev *compressdev;
158 name = rte_vdev_device_name(vdev);
162 compressdev = rte_compressdev_pmd_get_named_dev(name);
163 if (compressdev == NULL)
166 return rte_compressdev_pmd_destroy(compressdev);
169 static struct rte_vdev_driver zlib_pmd_drv = {
171 .remove = zlib_remove
174 RTE_PMD_REGISTER_VDEV(COMPRESSDEV_NAME_ZLIB_PMD, zlib_pmd_drv);
175 RTE_INIT(zlib_init_log);
180 zlib_logtype_driver = rte_log_register("pmd.compress.zlib");
181 if (zlib_logtype_driver >= 0)
182 rte_log_set_level(zlib_logtype_driver, RTE_LOG_INFO);