xref: /dpdk/drivers/compress/zlib/zlib_pmd.c (revision 0cc20d33ac0606887a6dcc78c3687ce3a33e636c)
10c4e4c16SAshish Gupta /* SPDX-License-Identifier: BSD-3-Clause
20c4e4c16SAshish Gupta  * Copyright(c) 2018 Cavium Networks
30c4e4c16SAshish Gupta  */
40c4e4c16SAshish Gupta 
50c4e4c16SAshish Gupta #include <rte_bus_vdev.h>
60c4e4c16SAshish Gupta #include <rte_common.h>
70c4e4c16SAshish Gupta 
80c4e4c16SAshish Gupta #include "zlib_pmd_private.h"
90c4e4c16SAshish Gupta 
10*0cc20d33SSunila Sahu /** Parse comp xform and set private xform/stream parameters */
11*0cc20d33SSunila Sahu int
12*0cc20d33SSunila Sahu zlib_set_stream_parameters(const struct rte_comp_xform *xform,
13*0cc20d33SSunila Sahu 		struct zlib_stream *stream)
14*0cc20d33SSunila Sahu {
15*0cc20d33SSunila Sahu 	int strategy, level, wbits;
16*0cc20d33SSunila Sahu 	z_stream *strm = &stream->strm;
17*0cc20d33SSunila Sahu 
18*0cc20d33SSunila Sahu 	/* allocate deflate state */
19*0cc20d33SSunila Sahu 	strm->zalloc = Z_NULL;
20*0cc20d33SSunila Sahu 	strm->zfree = Z_NULL;
21*0cc20d33SSunila Sahu 	strm->opaque = Z_NULL;
22*0cc20d33SSunila Sahu 
23*0cc20d33SSunila Sahu 	switch (xform->type) {
24*0cc20d33SSunila Sahu 	case RTE_COMP_COMPRESS:
25*0cc20d33SSunila Sahu 		/** Compression window bits */
26*0cc20d33SSunila Sahu 		switch (xform->compress.algo) {
27*0cc20d33SSunila Sahu 		case RTE_COMP_ALGO_DEFLATE:
28*0cc20d33SSunila Sahu 			wbits = -(xform->compress.window_size);
29*0cc20d33SSunila Sahu 			break;
30*0cc20d33SSunila Sahu 		default:
31*0cc20d33SSunila Sahu 			ZLIB_PMD_ERR("Compression algorithm not supported\n");
32*0cc20d33SSunila Sahu 			return -1;
33*0cc20d33SSunila Sahu 		}
34*0cc20d33SSunila Sahu 		/** Compression Level */
35*0cc20d33SSunila Sahu 		switch (xform->compress.level) {
36*0cc20d33SSunila Sahu 		case RTE_COMP_LEVEL_PMD_DEFAULT:
37*0cc20d33SSunila Sahu 			level = Z_DEFAULT_COMPRESSION;
38*0cc20d33SSunila Sahu 			break;
39*0cc20d33SSunila Sahu 		case RTE_COMP_LEVEL_NONE:
40*0cc20d33SSunila Sahu 			level = Z_NO_COMPRESSION;
41*0cc20d33SSunila Sahu 			break;
42*0cc20d33SSunila Sahu 		case RTE_COMP_LEVEL_MIN:
43*0cc20d33SSunila Sahu 			level = Z_BEST_SPEED;
44*0cc20d33SSunila Sahu 			break;
45*0cc20d33SSunila Sahu 		case RTE_COMP_LEVEL_MAX:
46*0cc20d33SSunila Sahu 			level = Z_BEST_COMPRESSION;
47*0cc20d33SSunila Sahu 			break;
48*0cc20d33SSunila Sahu 		default:
49*0cc20d33SSunila Sahu 			level = xform->compress.level;
50*0cc20d33SSunila Sahu 			if (level < RTE_COMP_LEVEL_MIN ||
51*0cc20d33SSunila Sahu 					level > RTE_COMP_LEVEL_MAX) {
52*0cc20d33SSunila Sahu 				ZLIB_PMD_ERR("Compression level %d "
53*0cc20d33SSunila Sahu 						"not supported\n",
54*0cc20d33SSunila Sahu 						level);
55*0cc20d33SSunila Sahu 				return -1;
56*0cc20d33SSunila Sahu 			}
57*0cc20d33SSunila Sahu 			break;
58*0cc20d33SSunila Sahu 		}
59*0cc20d33SSunila Sahu 		/** Compression strategy */
60*0cc20d33SSunila Sahu 		switch (xform->compress.deflate.huffman) {
61*0cc20d33SSunila Sahu 		case RTE_COMP_HUFFMAN_DEFAULT:
62*0cc20d33SSunila Sahu 			strategy = Z_DEFAULT_STRATEGY;
63*0cc20d33SSunila Sahu 			break;
64*0cc20d33SSunila Sahu 		case RTE_COMP_HUFFMAN_FIXED:
65*0cc20d33SSunila Sahu 			strategy = Z_FIXED;
66*0cc20d33SSunila Sahu 			break;
67*0cc20d33SSunila Sahu 		case RTE_COMP_HUFFMAN_DYNAMIC:
68*0cc20d33SSunila Sahu 			strategy = Z_DEFAULT_STRATEGY;
69*0cc20d33SSunila Sahu 			break;
70*0cc20d33SSunila Sahu 		default:
71*0cc20d33SSunila Sahu 			ZLIB_PMD_ERR("Compression strategy not supported\n");
72*0cc20d33SSunila Sahu 			return -1;
73*0cc20d33SSunila Sahu 		}
74*0cc20d33SSunila Sahu 		if (deflateInit2(strm, level,
75*0cc20d33SSunila Sahu 					Z_DEFLATED, wbits,
76*0cc20d33SSunila Sahu 					DEF_MEM_LEVEL, strategy) != Z_OK) {
77*0cc20d33SSunila Sahu 			ZLIB_PMD_ERR("Deflate init failed\n");
78*0cc20d33SSunila Sahu 			return -1;
79*0cc20d33SSunila Sahu 		}
80*0cc20d33SSunila Sahu 		break;
81*0cc20d33SSunila Sahu 
82*0cc20d33SSunila Sahu 	case RTE_COMP_DECOMPRESS:
83*0cc20d33SSunila Sahu 		/** window bits */
84*0cc20d33SSunila Sahu 		switch (xform->decompress.algo) {
85*0cc20d33SSunila Sahu 		case RTE_COMP_ALGO_DEFLATE:
86*0cc20d33SSunila Sahu 			wbits = -(xform->decompress.window_size);
87*0cc20d33SSunila Sahu 			break;
88*0cc20d33SSunila Sahu 		default:
89*0cc20d33SSunila Sahu 			ZLIB_PMD_ERR("Compression algorithm not supported\n");
90*0cc20d33SSunila Sahu 			return -1;
91*0cc20d33SSunila Sahu 		}
92*0cc20d33SSunila Sahu 
93*0cc20d33SSunila Sahu 		if (inflateInit2(strm, wbits) != Z_OK) {
94*0cc20d33SSunila Sahu 			ZLIB_PMD_ERR("Inflate init failed\n");
95*0cc20d33SSunila Sahu 			return -1;
96*0cc20d33SSunila Sahu 		}
97*0cc20d33SSunila Sahu 		break;
98*0cc20d33SSunila Sahu 	default:
99*0cc20d33SSunila Sahu 		return -1;
100*0cc20d33SSunila Sahu 	}
101*0cc20d33SSunila Sahu 	return 0;
102*0cc20d33SSunila Sahu }
103*0cc20d33SSunila Sahu 
1040c4e4c16SAshish Gupta static int
1050c4e4c16SAshish Gupta zlib_create(const char *name,
1060c4e4c16SAshish Gupta 		struct rte_vdev_device *vdev,
1070c4e4c16SAshish Gupta 		struct rte_compressdev_pmd_init_params *init_params)
1080c4e4c16SAshish Gupta {
1090c4e4c16SAshish Gupta 	struct rte_compressdev *dev;
1100c4e4c16SAshish Gupta 
1110c4e4c16SAshish Gupta 	dev = rte_compressdev_pmd_create(name, &vdev->device,
1120c4e4c16SAshish Gupta 			sizeof(struct zlib_private), init_params);
1130c4e4c16SAshish Gupta 	if (dev == NULL) {
1140c4e4c16SAshish Gupta 		ZLIB_PMD_ERR("driver %s: create failed", init_params->name);
1150c4e4c16SAshish Gupta 		return -ENODEV;
1160c4e4c16SAshish Gupta 	}
1170c4e4c16SAshish Gupta 
11827422fc3SAshish Gupta 	dev->dev_ops = rte_zlib_pmd_ops;
11927422fc3SAshish Gupta 
1200c4e4c16SAshish Gupta 	return 0;
1210c4e4c16SAshish Gupta }
1220c4e4c16SAshish Gupta 
1230c4e4c16SAshish Gupta static int
1240c4e4c16SAshish Gupta zlib_probe(struct rte_vdev_device *vdev)
1250c4e4c16SAshish Gupta {
1260c4e4c16SAshish Gupta 	struct rte_compressdev_pmd_init_params init_params = {
1270c4e4c16SAshish Gupta 		"",
1280c4e4c16SAshish Gupta 		rte_socket_id()
1290c4e4c16SAshish Gupta 	};
1300c4e4c16SAshish Gupta 	const char *name;
1310c4e4c16SAshish Gupta 	const char *input_args;
1320c4e4c16SAshish Gupta 	int retval;
1330c4e4c16SAshish Gupta 
1340c4e4c16SAshish Gupta 	name = rte_vdev_device_name(vdev);
1350c4e4c16SAshish Gupta 
1360c4e4c16SAshish Gupta 	if (name == NULL)
1370c4e4c16SAshish Gupta 		return -EINVAL;
1380c4e4c16SAshish Gupta 
1390c4e4c16SAshish Gupta 	input_args = rte_vdev_device_args(vdev);
1400c4e4c16SAshish Gupta 
1410c4e4c16SAshish Gupta 	retval = rte_compressdev_pmd_parse_input_args(&init_params, input_args);
1420c4e4c16SAshish Gupta 	if (retval < 0) {
1430c4e4c16SAshish Gupta 		ZLIB_PMD_LOG(ERR,
1440c4e4c16SAshish Gupta 			"Failed to parse initialisation arguments[%s]\n",
1450c4e4c16SAshish Gupta 			input_args);
1460c4e4c16SAshish Gupta 		return -EINVAL;
1470c4e4c16SAshish Gupta 	}
1480c4e4c16SAshish Gupta 
1490c4e4c16SAshish Gupta 	return zlib_create(name, vdev, &init_params);
1500c4e4c16SAshish Gupta }
1510c4e4c16SAshish Gupta 
1520c4e4c16SAshish Gupta static int
1530c4e4c16SAshish Gupta zlib_remove(struct rte_vdev_device *vdev)
1540c4e4c16SAshish Gupta {
1550c4e4c16SAshish Gupta 	struct rte_compressdev *compressdev;
1560c4e4c16SAshish Gupta 	const char *name;
1570c4e4c16SAshish Gupta 
1580c4e4c16SAshish Gupta 	name = rte_vdev_device_name(vdev);
1590c4e4c16SAshish Gupta 	if (name == NULL)
1600c4e4c16SAshish Gupta 		return -EINVAL;
1610c4e4c16SAshish Gupta 
1620c4e4c16SAshish Gupta 	compressdev = rte_compressdev_pmd_get_named_dev(name);
1630c4e4c16SAshish Gupta 	if (compressdev == NULL)
1640c4e4c16SAshish Gupta 		return -ENODEV;
1650c4e4c16SAshish Gupta 
1660c4e4c16SAshish Gupta 	return rte_compressdev_pmd_destroy(compressdev);
1670c4e4c16SAshish Gupta }
1680c4e4c16SAshish Gupta 
1690c4e4c16SAshish Gupta static struct rte_vdev_driver zlib_pmd_drv = {
1700c4e4c16SAshish Gupta 	.probe = zlib_probe,
1710c4e4c16SAshish Gupta 	.remove = zlib_remove
1720c4e4c16SAshish Gupta };
1730c4e4c16SAshish Gupta 
1740c4e4c16SAshish Gupta RTE_PMD_REGISTER_VDEV(COMPRESSDEV_NAME_ZLIB_PMD, zlib_pmd_drv);
1750c4e4c16SAshish Gupta RTE_INIT(zlib_init_log);
1760c4e4c16SAshish Gupta 
1770c4e4c16SAshish Gupta static void
1780c4e4c16SAshish Gupta zlib_init_log(void)
1790c4e4c16SAshish Gupta {
1800c4e4c16SAshish Gupta 	zlib_logtype_driver = rte_log_register("pmd.compress.zlib");
1810c4e4c16SAshish Gupta 	if (zlib_logtype_driver >= 0)
1820c4e4c16SAshish Gupta 		rte_log_set_level(zlib_logtype_driver, RTE_LOG_INFO);
1830c4e4c16SAshish Gupta }
184