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