13c32e89fSLee Daly /* SPDX-License-Identifier: BSD-3-Clause 23c32e89fSLee Daly * Copyright(c) 2018 Intel Corporation 33c32e89fSLee Daly */ 4c720cd2bSLee Daly #include <isa-l.h> 53c32e89fSLee Daly 63c32e89fSLee Daly #include <rte_bus_vdev.h> 7490e725bSLee Daly #include <rte_common.h> 8490e725bSLee Daly #include <rte_malloc.h> 9dc49e6aaSLee Daly #include <rte_mbuf.h> 103c32e89fSLee Daly #include <rte_compressdev_pmd.h> 113c32e89fSLee Daly 12490e725bSLee Daly #include "isal_compress_pmd_private.h" 13490e725bSLee Daly 14c720cd2bSLee Daly #define RTE_COMP_ISAL_WINDOW_SIZE 15 15c720cd2bSLee Daly #define RTE_COMP_ISAL_LEVEL_ZERO 0 /* ISA-L Level 0 used for fixed Huffman */ 16c720cd2bSLee Daly #define RTE_COMP_ISAL_LEVEL_ONE 1 17c720cd2bSLee Daly #define RTE_COMP_ISAL_LEVEL_TWO 2 18c720cd2bSLee Daly #define RTE_COMP_ISAL_LEVEL_THREE 3 /* Optimised for AVX512 & AVX2 only */ 19bd03d3f1SLee Daly #define CHKSUM_SZ_CRC 8 20bd03d3f1SLee Daly #define CHKSUM_SZ_ADLER 4 21c720cd2bSLee Daly 22fff7b0ddSTomasz Cel #define STRINGIFY(s) #s 23fff7b0ddSTomasz Cel #define ISAL_TOSTRING(maj, min, patch) \ 24fff7b0ddSTomasz Cel STRINGIFY(maj)"."STRINGIFY(min)"."STRINGIFY(patch) 25fff7b0ddSTomasz Cel #define ISAL_VERSION_STRING \ 26fff7b0ddSTomasz Cel ISAL_TOSTRING(ISAL_MAJOR_VERSION, ISAL_MINOR_VERSION, ISAL_PATCH_VERSION) 27fff7b0ddSTomasz Cel 28490e725bSLee Daly int isal_logtype_driver; 29490e725bSLee Daly 30c720cd2bSLee Daly /* Verify and set private xform parameters */ 31c720cd2bSLee Daly int 32c720cd2bSLee Daly isal_comp_set_priv_xform_parameters(struct isal_priv_xform *priv_xform, 33c720cd2bSLee Daly const struct rte_comp_xform *xform) 34c720cd2bSLee Daly { 35c720cd2bSLee Daly if (xform == NULL) 36c720cd2bSLee Daly return -EINVAL; 37c720cd2bSLee Daly 38c720cd2bSLee Daly /* Set compression private xform variables */ 39c720cd2bSLee Daly if (xform->type == RTE_COMP_COMPRESS) { 40c720cd2bSLee Daly /* Set private xform type - COMPRESS/DECOMPRESS */ 41c720cd2bSLee Daly priv_xform->type = RTE_COMP_COMPRESS; 42c720cd2bSLee Daly 43c720cd2bSLee Daly /* Set private xform algorithm */ 44c720cd2bSLee Daly if (xform->compress.algo != RTE_COMP_ALGO_DEFLATE) { 45c720cd2bSLee Daly if (xform->compress.algo == RTE_COMP_ALGO_NULL) { 46c720cd2bSLee Daly ISAL_PMD_LOG(ERR, "By-pass not supported\n"); 47c720cd2bSLee Daly return -ENOTSUP; 48c720cd2bSLee Daly } 49c720cd2bSLee Daly ISAL_PMD_LOG(ERR, "Algorithm not supported\n"); 50c720cd2bSLee Daly return -ENOTSUP; 51c720cd2bSLee Daly } 52c720cd2bSLee Daly priv_xform->compress.algo = RTE_COMP_ALGO_DEFLATE; 53c720cd2bSLee Daly 54c720cd2bSLee Daly /* Set private xform window size, 32K supported */ 55c720cd2bSLee Daly if (xform->compress.window_size == RTE_COMP_ISAL_WINDOW_SIZE) 56c720cd2bSLee Daly priv_xform->compress.window_size = 57c720cd2bSLee Daly RTE_COMP_ISAL_WINDOW_SIZE; 58c720cd2bSLee Daly else { 59c720cd2bSLee Daly ISAL_PMD_LOG(ERR, "Window size not supported\n"); 60c720cd2bSLee Daly return -ENOTSUP; 61c720cd2bSLee Daly } 62c720cd2bSLee Daly 63c720cd2bSLee Daly /* Set private xform huffman type */ 64c720cd2bSLee Daly switch (xform->compress.deflate.huffman) { 65c720cd2bSLee Daly case(RTE_COMP_HUFFMAN_DEFAULT): 66c720cd2bSLee Daly priv_xform->compress.deflate.huffman = 67c720cd2bSLee Daly RTE_COMP_HUFFMAN_DEFAULT; 68c720cd2bSLee Daly break; 69c720cd2bSLee Daly case(RTE_COMP_HUFFMAN_FIXED): 70c720cd2bSLee Daly priv_xform->compress.deflate.huffman = 71c720cd2bSLee Daly RTE_COMP_HUFFMAN_FIXED; 72c720cd2bSLee Daly break; 73c720cd2bSLee Daly case(RTE_COMP_HUFFMAN_DYNAMIC): 74c720cd2bSLee Daly priv_xform->compress.deflate.huffman = 75c720cd2bSLee Daly RTE_COMP_HUFFMAN_DYNAMIC; 76c720cd2bSLee Daly break; 77c720cd2bSLee Daly default: 78c720cd2bSLee Daly ISAL_PMD_LOG(ERR, "Huffman code not supported\n"); 79c720cd2bSLee Daly return -ENOTSUP; 80c720cd2bSLee Daly } 81c720cd2bSLee Daly 82bd03d3f1SLee Daly /* Set private xform checksum */ 83bd03d3f1SLee Daly switch (xform->compress.chksum) { 84bd03d3f1SLee Daly /* Raw deflate by default */ 85bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_NONE): 86bd03d3f1SLee Daly priv_xform->compress.chksum = IGZIP_DEFLATE; 87bd03d3f1SLee Daly break; 88bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_CRC32): 89bd03d3f1SLee Daly priv_xform->compress.chksum = IGZIP_GZIP_NO_HDR; 90bd03d3f1SLee Daly break; 91bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_ADLER32): 92bd03d3f1SLee Daly priv_xform->compress.chksum = IGZIP_ZLIB_NO_HDR; 93bd03d3f1SLee Daly break; 94bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_CRC32_ADLER32): 95bd03d3f1SLee Daly ISAL_PMD_LOG(ERR, "Combined CRC and ADLER checksum not" 96bd03d3f1SLee Daly " supported\n"); 97bd03d3f1SLee Daly return -ENOTSUP; 98bd03d3f1SLee Daly default: 99bd03d3f1SLee Daly ISAL_PMD_LOG(ERR, "Checksum type not supported\n"); 100bd03d3f1SLee Daly priv_xform->compress.chksum = IGZIP_DEFLATE; 101bd03d3f1SLee Daly break; 102bd03d3f1SLee Daly } 103bd03d3f1SLee Daly 104c720cd2bSLee Daly /* Set private xform level. 105c720cd2bSLee Daly * Checking compliance with compressdev API, -1 <= level => 9 106c720cd2bSLee Daly */ 107c720cd2bSLee Daly if (xform->compress.level < RTE_COMP_LEVEL_PMD_DEFAULT || 108c720cd2bSLee Daly xform->compress.level > RTE_COMP_LEVEL_MAX) { 109c720cd2bSLee Daly ISAL_PMD_LOG(ERR, "Compression level out of range\n"); 110c720cd2bSLee Daly return -EINVAL; 111c720cd2bSLee Daly } 112c720cd2bSLee Daly /* Check for Compressdev API level 0, No compression 113c720cd2bSLee Daly * not supported in ISA-L 114c720cd2bSLee Daly */ 115c720cd2bSLee Daly else if (xform->compress.level == RTE_COMP_LEVEL_NONE) { 116c720cd2bSLee Daly ISAL_PMD_LOG(ERR, "No Compression not supported\n"); 117c720cd2bSLee Daly return -ENOTSUP; 118c720cd2bSLee Daly } 119c720cd2bSLee Daly /* If using fixed huffman code, level must be 0 */ 120c720cd2bSLee Daly else if (priv_xform->compress.deflate.huffman == 121c720cd2bSLee Daly RTE_COMP_HUFFMAN_FIXED) { 122c720cd2bSLee Daly ISAL_PMD_LOG(DEBUG, "ISA-L level 0 used due to a" 123c720cd2bSLee Daly " fixed huffman code\n"); 124c720cd2bSLee Daly priv_xform->compress.level = RTE_COMP_ISAL_LEVEL_ZERO; 125c720cd2bSLee Daly priv_xform->level_buffer_size = 126c720cd2bSLee Daly ISAL_DEF_LVL0_DEFAULT; 127c720cd2bSLee Daly } else { 128c720cd2bSLee Daly /* Mapping API levels to ISA-L levels 1,2 & 3 */ 129c720cd2bSLee Daly switch (xform->compress.level) { 130c720cd2bSLee Daly case RTE_COMP_LEVEL_PMD_DEFAULT: 131c720cd2bSLee Daly /* Default is 1 if not using fixed huffman */ 132c720cd2bSLee Daly priv_xform->compress.level = 133c720cd2bSLee Daly RTE_COMP_ISAL_LEVEL_ONE; 134c720cd2bSLee Daly priv_xform->level_buffer_size = 135c720cd2bSLee Daly ISAL_DEF_LVL1_DEFAULT; 136c720cd2bSLee Daly break; 137c720cd2bSLee Daly case RTE_COMP_LEVEL_MIN: 138c720cd2bSLee Daly priv_xform->compress.level = 139c720cd2bSLee Daly RTE_COMP_ISAL_LEVEL_ONE; 140c720cd2bSLee Daly priv_xform->level_buffer_size = 141c720cd2bSLee Daly ISAL_DEF_LVL1_DEFAULT; 142c720cd2bSLee Daly break; 143c720cd2bSLee Daly case RTE_COMP_ISAL_LEVEL_TWO: 144c720cd2bSLee Daly priv_xform->compress.level = 145c720cd2bSLee Daly RTE_COMP_ISAL_LEVEL_TWO; 146c720cd2bSLee Daly priv_xform->level_buffer_size = 147c720cd2bSLee Daly ISAL_DEF_LVL2_DEFAULT; 148c720cd2bSLee Daly break; 149c720cd2bSLee Daly /* Level 3 or higher requested */ 150c720cd2bSLee Daly default: 151c720cd2bSLee Daly /* Check for AVX512, to use ISA-L level 3 */ 152c720cd2bSLee Daly if (rte_cpu_get_flag_enabled( 153c720cd2bSLee Daly RTE_CPUFLAG_AVX512F)) { 154c720cd2bSLee Daly priv_xform->compress.level = 155c720cd2bSLee Daly RTE_COMP_ISAL_LEVEL_THREE; 156c720cd2bSLee Daly priv_xform->level_buffer_size = 157c720cd2bSLee Daly ISAL_DEF_LVL3_DEFAULT; 158c720cd2bSLee Daly } 159c720cd2bSLee Daly /* Check for AVX2, to use ISA-L level 3 */ 160c720cd2bSLee Daly else if (rte_cpu_get_flag_enabled( 161c720cd2bSLee Daly RTE_CPUFLAG_AVX2)) { 162c720cd2bSLee Daly priv_xform->compress.level = 163c720cd2bSLee Daly RTE_COMP_ISAL_LEVEL_THREE; 164c720cd2bSLee Daly priv_xform->level_buffer_size = 165c720cd2bSLee Daly ISAL_DEF_LVL3_DEFAULT; 166c720cd2bSLee Daly } else { 167c720cd2bSLee Daly ISAL_PMD_LOG(DEBUG, "Requested ISA-L level" 168c720cd2bSLee Daly " 3 or above; Level 3 optimized" 169c720cd2bSLee Daly " for AVX512 & AVX2 only." 170c720cd2bSLee Daly " level changed to 2.\n"); 171c720cd2bSLee Daly priv_xform->compress.level = 172c720cd2bSLee Daly RTE_COMP_ISAL_LEVEL_TWO; 173c720cd2bSLee Daly priv_xform->level_buffer_size = 174c720cd2bSLee Daly ISAL_DEF_LVL2_DEFAULT; 175c720cd2bSLee Daly } 176c720cd2bSLee Daly } 177c720cd2bSLee Daly } 178c720cd2bSLee Daly } 179c720cd2bSLee Daly 180c720cd2bSLee Daly /* Set decompression private xform variables */ 181c720cd2bSLee Daly else if (xform->type == RTE_COMP_DECOMPRESS) { 182c720cd2bSLee Daly 183c720cd2bSLee Daly /* Set private xform type - COMPRESS/DECOMPRESS */ 184c720cd2bSLee Daly priv_xform->type = RTE_COMP_DECOMPRESS; 185c720cd2bSLee Daly 186c720cd2bSLee Daly /* Set private xform algorithm */ 187c720cd2bSLee Daly if (xform->decompress.algo != RTE_COMP_ALGO_DEFLATE) { 188c720cd2bSLee Daly if (xform->decompress.algo == RTE_COMP_ALGO_NULL) { 189c720cd2bSLee Daly ISAL_PMD_LOG(ERR, "By pass not supported\n"); 190c720cd2bSLee Daly return -ENOTSUP; 191c720cd2bSLee Daly } 192c720cd2bSLee Daly ISAL_PMD_LOG(ERR, "Algorithm not supported\n"); 193c720cd2bSLee Daly return -ENOTSUP; 194c720cd2bSLee Daly } 195c720cd2bSLee Daly priv_xform->decompress.algo = RTE_COMP_ALGO_DEFLATE; 196c720cd2bSLee Daly 197bd03d3f1SLee Daly /* Set private xform checksum */ 198bd03d3f1SLee Daly switch (xform->decompress.chksum) { 199bd03d3f1SLee Daly /* Raw deflate by default */ 200bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_NONE): 201bd03d3f1SLee Daly priv_xform->decompress.chksum = ISAL_DEFLATE; 202bd03d3f1SLee Daly break; 203bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_CRC32): 20459af922aSLee Daly priv_xform->decompress.chksum = ISAL_GZIP_NO_HDR; 205bd03d3f1SLee Daly break; 206bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_ADLER32): 20759af922aSLee Daly priv_xform->decompress.chksum = ISAL_ZLIB_NO_HDR; 208bd03d3f1SLee Daly break; 209bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_CRC32_ADLER32): 210bd03d3f1SLee Daly ISAL_PMD_LOG(ERR, "Combined CRC and ADLER checksum not" 211bd03d3f1SLee Daly " supported\n"); 212c720cd2bSLee Daly return -ENOTSUP; 213bd03d3f1SLee Daly default: 214bd03d3f1SLee Daly ISAL_PMD_LOG(ERR, "Checksum type not supported\n"); 215bd03d3f1SLee Daly priv_xform->decompress.chksum = ISAL_DEFLATE; 216bd03d3f1SLee Daly break; 217c720cd2bSLee Daly } 218c720cd2bSLee Daly 219c720cd2bSLee Daly /* Set private xform window size, 32K supported */ 220c720cd2bSLee Daly if (xform->decompress.window_size == RTE_COMP_ISAL_WINDOW_SIZE) 221c720cd2bSLee Daly priv_xform->decompress.window_size = 222c720cd2bSLee Daly RTE_COMP_ISAL_WINDOW_SIZE; 223c720cd2bSLee Daly else { 224c720cd2bSLee Daly ISAL_PMD_LOG(ERR, "Window size not supported\n"); 225c720cd2bSLee Daly return -ENOTSUP; 226c720cd2bSLee Daly } 227c720cd2bSLee Daly } 228c720cd2bSLee Daly return 0; 229c720cd2bSLee Daly } 230c720cd2bSLee Daly 231788e748dSLee Daly /* Compression using chained mbufs for input/output data */ 232788e748dSLee Daly static int 233788e748dSLee Daly chained_mbuf_compression(struct rte_comp_op *op, struct isal_comp_qp *qp) 234788e748dSLee Daly { 235788e748dSLee Daly int ret; 236788e748dSLee Daly uint32_t remaining_offset; 237788e748dSLee Daly uint32_t remaining_data = op->src.length; 238788e748dSLee Daly struct rte_mbuf *src = op->m_src; 239788e748dSLee Daly struct rte_mbuf *dst = op->m_dst; 240788e748dSLee Daly 241788e748dSLee Daly /* check for source/destination offset passing multiple segments 242788e748dSLee Daly * and point compression stream to input/output buffer. 243788e748dSLee Daly */ 244788e748dSLee Daly remaining_offset = op->src.offset; 245788e748dSLee Daly while (remaining_offset >= src->data_len) { 246788e748dSLee Daly remaining_offset -= src->data_len; 247788e748dSLee Daly src = src->next; 248788e748dSLee Daly } 249788e748dSLee Daly qp->stream->avail_in = RTE_MIN(src->data_len - remaining_offset, 250788e748dSLee Daly op->src.length); 251788e748dSLee Daly qp->stream->next_in = rte_pktmbuf_mtod_offset(src, uint8_t *, 252788e748dSLee Daly remaining_offset); 253788e748dSLee Daly 254788e748dSLee Daly remaining_offset = op->dst.offset; 255788e748dSLee Daly while (remaining_offset >= dst->data_len) { 256788e748dSLee Daly remaining_offset -= dst->data_len; 257788e748dSLee Daly dst = dst->next; 258788e748dSLee Daly } 259788e748dSLee Daly qp->stream->avail_out = dst->data_len - remaining_offset; 260788e748dSLee Daly qp->stream->next_out = rte_pktmbuf_mtod_offset(dst, uint8_t *, 261788e748dSLee Daly remaining_offset); 262788e748dSLee Daly 263788e748dSLee Daly if (unlikely(!qp->stream->next_in || !qp->stream->next_out)) { 264788e748dSLee Daly ISAL_PMD_LOG(ERR, "Invalid source or destination buffer\n"); 265788e748dSLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 266788e748dSLee Daly return -1; 267788e748dSLee Daly } 268788e748dSLee Daly 269788e748dSLee Daly while (qp->stream->internal_state.state != ZSTATE_END) { 270788e748dSLee Daly /* Last segment of data */ 271788e748dSLee Daly if (remaining_data <= src->data_len) 272788e748dSLee Daly qp->stream->end_of_stream = 1; 273788e748dSLee Daly 274788e748dSLee Daly /* Execute compression operation */ 275788e748dSLee Daly ret = isal_deflate(qp->stream); 276788e748dSLee Daly 277788e748dSLee Daly remaining_data = op->src.length - qp->stream->total_in; 278788e748dSLee Daly 279788e748dSLee Daly if (ret != COMP_OK) { 280788e748dSLee Daly ISAL_PMD_LOG(ERR, "Compression operation failed\n"); 281788e748dSLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 282788e748dSLee Daly return ret; 283788e748dSLee Daly } 284788e748dSLee Daly 285788e748dSLee Daly if (qp->stream->avail_in == 0 && 286788e748dSLee Daly qp->stream->total_in != op->src.length) { 287788e748dSLee Daly if (src->next != NULL) { 288788e748dSLee Daly src = src->next; 289788e748dSLee Daly qp->stream->next_in = 290788e748dSLee Daly rte_pktmbuf_mtod(src, uint8_t *); 291788e748dSLee Daly qp->stream->avail_in = 292788e748dSLee Daly RTE_MIN(remaining_data, src->data_len); 293788e748dSLee Daly } else { 294788e748dSLee Daly ISAL_PMD_LOG(ERR, 295788e748dSLee Daly "Not enough input buffer segments\n"); 296788e748dSLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 297788e748dSLee Daly return -1; 298788e748dSLee Daly } 299788e748dSLee Daly } 300788e748dSLee Daly 301788e748dSLee Daly if (qp->stream->avail_out == 0 && 302788e748dSLee Daly qp->stream->internal_state.state != ZSTATE_END) { 303788e748dSLee Daly if (dst->next != NULL) { 304788e748dSLee Daly dst = dst->next; 305788e748dSLee Daly qp->stream->next_out = 306788e748dSLee Daly rte_pktmbuf_mtod(dst, uint8_t *); 307788e748dSLee Daly qp->stream->avail_out = dst->data_len; 308788e748dSLee Daly } else { 309788e748dSLee Daly ISAL_PMD_LOG(ERR, 310788e748dSLee Daly "Not enough output buffer segments\n"); 311788e748dSLee Daly op->status = 312788e748dSLee Daly RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; 313788e748dSLee Daly return -1; 314788e748dSLee Daly } 315788e748dSLee Daly } 316788e748dSLee Daly } 317788e748dSLee Daly 318788e748dSLee Daly return 0; 319788e748dSLee Daly } 320788e748dSLee Daly 321788e748dSLee Daly /* Decompression using chained mbufs for input/output data */ 322788e748dSLee Daly static int 323788e748dSLee Daly chained_mbuf_decompression(struct rte_comp_op *op, struct isal_comp_qp *qp) 324788e748dSLee Daly { 325788e748dSLee Daly int ret; 326788e748dSLee Daly uint32_t consumed_data, src_remaining_offset, dst_remaining_offset; 327788e748dSLee Daly uint32_t remaining_data = op->src.length; 328788e748dSLee Daly struct rte_mbuf *src = op->m_src; 329788e748dSLee Daly struct rte_mbuf *dst = op->m_dst; 330788e748dSLee Daly 331788e748dSLee Daly /* check for offset passing multiple segments 332788e748dSLee Daly * and point decompression state to input/output buffer 333788e748dSLee Daly */ 334788e748dSLee Daly src_remaining_offset = op->src.offset; 335788e748dSLee Daly while (src_remaining_offset >= src->data_len) { 336788e748dSLee Daly src_remaining_offset -= src->data_len; 337788e748dSLee Daly src = src->next; 338788e748dSLee Daly } 339788e748dSLee Daly qp->state->avail_in = RTE_MIN(src->data_len - src_remaining_offset, 340788e748dSLee Daly op->src.length); 341788e748dSLee Daly qp->state->next_in = rte_pktmbuf_mtod_offset(src, uint8_t *, 342788e748dSLee Daly src_remaining_offset); 343788e748dSLee Daly 344788e748dSLee Daly dst_remaining_offset = op->dst.offset; 345788e748dSLee Daly while (dst_remaining_offset >= dst->data_len) { 346788e748dSLee Daly dst_remaining_offset -= dst->data_len; 347788e748dSLee Daly dst = dst->next; 348788e748dSLee Daly } 349788e748dSLee Daly qp->state->avail_out = dst->data_len - dst_remaining_offset; 350788e748dSLee Daly qp->state->next_out = rte_pktmbuf_mtod_offset(dst, uint8_t *, 351788e748dSLee Daly dst_remaining_offset); 352788e748dSLee Daly 353788e748dSLee Daly while (qp->state->block_state != ISAL_BLOCK_FINISH) { 354788e748dSLee Daly 355788e748dSLee Daly ret = isal_inflate(qp->state); 356788e748dSLee Daly 3571713ad8bSLee Daly /* Check for first segment, offset needs to be accounted for */ 3581713ad8bSLee Daly if (remaining_data == op->src.length) { 3591713ad8bSLee Daly consumed_data = src->data_len - src_remaining_offset; 3601713ad8bSLee Daly } else 3611713ad8bSLee Daly consumed_data = src->data_len; 3621713ad8bSLee Daly 363788e748dSLee Daly if (qp->state->avail_in == 0 364788e748dSLee Daly && op->consumed != op->src.length) { 3651713ad8bSLee Daly op->consumed += consumed_data; 3661713ad8bSLee Daly remaining_data -= consumed_data; 3671713ad8bSLee Daly 368788e748dSLee Daly if (src->next != NULL) { 369788e748dSLee Daly src = src->next; 370788e748dSLee Daly qp->state->next_in = 371788e748dSLee Daly rte_pktmbuf_mtod(src, uint8_t *); 372788e748dSLee Daly qp->state->avail_in = 373788e748dSLee Daly RTE_MIN(remaining_data, src->data_len); 374788e748dSLee Daly } 375788e748dSLee Daly } 376788e748dSLee Daly 377*1aeb9fdbSLee Daly if (ret == ISAL_OUT_OVERFLOW) { 378*1aeb9fdbSLee Daly ISAL_PMD_LOG(ERR, "Decompression operation ran " 379*1aeb9fdbSLee Daly "out of space, but can be recovered.\n%d bytes " 380*1aeb9fdbSLee Daly "consumed\t%d bytes produced\n", 381*1aeb9fdbSLee Daly consumed_data, qp->state->total_out); 382*1aeb9fdbSLee Daly op->status = 383*1aeb9fdbSLee Daly RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE; 384*1aeb9fdbSLee Daly return ret; 385*1aeb9fdbSLee Daly } else if (ret < 0) { 386*1aeb9fdbSLee Daly ISAL_PMD_LOG(ERR, "Decompression operation failed\n"); 387*1aeb9fdbSLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 388*1aeb9fdbSLee Daly return ret; 389*1aeb9fdbSLee Daly } 390*1aeb9fdbSLee Daly 391788e748dSLee Daly if (qp->state->avail_out == 0 && 392788e748dSLee Daly qp->state->block_state != ISAL_BLOCK_FINISH) { 393788e748dSLee Daly if (dst->next != NULL) { 394788e748dSLee Daly dst = dst->next; 395788e748dSLee Daly qp->state->next_out = 396788e748dSLee Daly rte_pktmbuf_mtod(dst, uint8_t *); 397788e748dSLee Daly qp->state->avail_out = dst->data_len; 398788e748dSLee Daly } else { 399788e748dSLee Daly ISAL_PMD_LOG(ERR, 400788e748dSLee Daly "Not enough output buffer segments\n"); 401788e748dSLee Daly op->status = 402788e748dSLee Daly RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; 403788e748dSLee Daly return -1; 404788e748dSLee Daly } 405788e748dSLee Daly } 406788e748dSLee Daly } 407788e748dSLee Daly 408788e748dSLee Daly return 0; 409788e748dSLee Daly } 410788e748dSLee Daly 411dc49e6aaSLee Daly /* Stateless Compression Function */ 412dc49e6aaSLee Daly static int 413dc49e6aaSLee Daly process_isal_deflate(struct rte_comp_op *op, struct isal_comp_qp *qp, 414dc49e6aaSLee Daly struct isal_priv_xform *priv_xform) 415dc49e6aaSLee Daly { 416dc49e6aaSLee Daly int ret = 0; 417dc49e6aaSLee Daly op->status = RTE_COMP_OP_STATUS_SUCCESS; 418dc49e6aaSLee Daly 419dc49e6aaSLee Daly /* Required due to init clearing level_buf */ 420dc49e6aaSLee Daly uint8_t *temp_level_buf = qp->stream->level_buf; 421dc49e6aaSLee Daly 422dc49e6aaSLee Daly /* Initialize compression stream */ 423ae1374e2STomasz Cel isal_deflate_init(qp->stream); 424dc49e6aaSLee Daly 425dc49e6aaSLee Daly qp->stream->level_buf = temp_level_buf; 426dc49e6aaSLee Daly 427bd03d3f1SLee Daly /* Set Checksum flag */ 428bd03d3f1SLee Daly qp->stream->gzip_flag = priv_xform->compress.chksum; 429bd03d3f1SLee Daly 430dc49e6aaSLee Daly /* Stateless operation, input will be consumed in one go */ 431dc49e6aaSLee Daly qp->stream->flush = NO_FLUSH; 432dc49e6aaSLee Daly 433788e748dSLee Daly /* set compression level & intermediate level buffer size */ 434dc49e6aaSLee Daly qp->stream->level = priv_xform->compress.level; 435dc49e6aaSLee Daly qp->stream->level_buf_size = priv_xform->level_buffer_size; 436dc49e6aaSLee Daly 437dc49e6aaSLee Daly /* Set op huffman code */ 438dc49e6aaSLee Daly if (priv_xform->compress.deflate.huffman == RTE_COMP_HUFFMAN_FIXED) 439dc49e6aaSLee Daly isal_deflate_set_hufftables(qp->stream, NULL, 440dc49e6aaSLee Daly IGZIP_HUFFTABLE_STATIC); 441dc49e6aaSLee Daly else if (priv_xform->compress.deflate.huffman == 442dc49e6aaSLee Daly RTE_COMP_HUFFMAN_DEFAULT) 443dc49e6aaSLee Daly isal_deflate_set_hufftables(qp->stream, NULL, 444dc49e6aaSLee Daly IGZIP_HUFFTABLE_DEFAULT); 445dc49e6aaSLee Daly /* Dynamically change the huffman code to suit the input data */ 446dc49e6aaSLee Daly else if (priv_xform->compress.deflate.huffman == 447dc49e6aaSLee Daly RTE_COMP_HUFFMAN_DYNAMIC) 448dc49e6aaSLee Daly isal_deflate_set_hufftables(qp->stream, NULL, 449dc49e6aaSLee Daly IGZIP_HUFFTABLE_DEFAULT); 450dc49e6aaSLee Daly 451788e748dSLee Daly if (op->m_src->pkt_len < (op->src.length + op->src.offset)) { 452788e748dSLee Daly ISAL_PMD_LOG(ERR, "Input mbuf(s) not big enough.\n"); 4536a000343SLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 4546a000343SLee Daly return -1; 4556a000343SLee Daly } 4566a000343SLee Daly 4577f474b43SLee Daly if (op->dst.offset >= op->m_dst->pkt_len) { 4587f474b43SLee Daly ISAL_PMD_LOG(ERR, "Output mbuf(s) not big enough" 4597f474b43SLee Daly " for offset provided.\n"); 4606a000343SLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 4616a000343SLee Daly return -1; 4626a000343SLee Daly } 463788e748dSLee Daly 464788e748dSLee Daly /* Chained mbufs */ 465788e748dSLee Daly if (op->m_src->nb_segs > 1 || op->m_dst->nb_segs > 1) { 466788e748dSLee Daly ret = chained_mbuf_compression(op, qp); 467788e748dSLee Daly if (ret < 0) 468788e748dSLee Daly return ret; 469788e748dSLee Daly } else { 470788e748dSLee Daly /* Linear buffer */ 471788e748dSLee Daly qp->stream->end_of_stream = 1; /* All input consumed in one */ 472788e748dSLee Daly /* Point compression stream to input buffer */ 473788e748dSLee Daly qp->stream->avail_in = op->src.length; 474788e748dSLee Daly qp->stream->next_in = rte_pktmbuf_mtod_offset(op->m_src, 475788e748dSLee Daly uint8_t *, op->src.offset); 476788e748dSLee Daly 4776a000343SLee Daly /* Point compression stream to output buffer */ 4786a000343SLee Daly qp->stream->avail_out = op->m_dst->data_len - op->dst.offset; 479788e748dSLee Daly qp->stream->next_out = rte_pktmbuf_mtod_offset(op->m_dst, 480788e748dSLee Daly uint8_t *, op->dst.offset); 4816a000343SLee Daly 4826a000343SLee Daly if (unlikely(!qp->stream->next_in || !qp->stream->next_out)) { 483788e748dSLee Daly ISAL_PMD_LOG(ERR, "Invalid source or destination" 484788e748dSLee Daly " buffers\n"); 4856a000343SLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 4866a000343SLee Daly return -1; 4876a000343SLee Daly } 4886a000343SLee Daly 489dc49e6aaSLee Daly /* Execute compression operation */ 490dc49e6aaSLee Daly ret = isal_deflate_stateless(qp->stream); 491dc49e6aaSLee Daly 492dc49e6aaSLee Daly /* Check that output buffer did not run out of space */ 493dc49e6aaSLee Daly if (ret == STATELESS_OVERFLOW) { 494dc49e6aaSLee Daly ISAL_PMD_LOG(ERR, "Output buffer not big enough\n"); 495dc49e6aaSLee Daly op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; 496dc49e6aaSLee Daly return ret; 497dc49e6aaSLee Daly } 498dc49e6aaSLee Daly 499dc49e6aaSLee Daly /* Check that input buffer has been fully consumed */ 500dc49e6aaSLee Daly if (qp->stream->avail_in != (uint32_t)0) { 501788e748dSLee Daly ISAL_PMD_LOG(ERR, "Input buffer could not be read" 502788e748dSLee Daly " entirely\n"); 503dc49e6aaSLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 504dc49e6aaSLee Daly return -1; 505dc49e6aaSLee Daly } 506dc49e6aaSLee Daly 507dc49e6aaSLee Daly if (ret != COMP_OK) { 508788e748dSLee Daly ISAL_PMD_LOG(ERR, "Compression operation failed\n"); 509dc49e6aaSLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 510dc49e6aaSLee Daly return ret; 511dc49e6aaSLee Daly } 512788e748dSLee Daly } 513bd03d3f1SLee Daly 514dc49e6aaSLee Daly op->consumed = qp->stream->total_in; 515bd03d3f1SLee Daly if (qp->stream->gzip_flag == IGZIP_DEFLATE) { 516dc49e6aaSLee Daly op->produced = qp->stream->total_out; 517bd03d3f1SLee Daly } else if (qp->stream->gzip_flag == IGZIP_ZLIB_NO_HDR) { 518bd03d3f1SLee Daly op->produced = qp->stream->total_out - CHKSUM_SZ_ADLER; 519bd03d3f1SLee Daly op->output_chksum = qp->stream->internal_state.crc + 1; 520bd03d3f1SLee Daly } else { 521bd03d3f1SLee Daly op->produced = qp->stream->total_out - CHKSUM_SZ_CRC; 522bd03d3f1SLee Daly op->output_chksum = qp->stream->internal_state.crc; 523bd03d3f1SLee Daly } 524bd03d3f1SLee Daly 525dc49e6aaSLee Daly return ret; 526dc49e6aaSLee Daly } 527dc49e6aaSLee Daly 5287bf4f063SLee Daly /* Stateless Decompression Function */ 5297bf4f063SLee Daly static int 530bd03d3f1SLee Daly process_isal_inflate(struct rte_comp_op *op, struct isal_comp_qp *qp, 531bd03d3f1SLee Daly struct isal_priv_xform *priv_xform) 5327bf4f063SLee Daly { 5337bf4f063SLee Daly int ret = 0; 5347bf4f063SLee Daly 5357bf4f063SLee Daly op->status = RTE_COMP_OP_STATUS_SUCCESS; 5367bf4f063SLee Daly 5377bf4f063SLee Daly /* Initialize decompression state */ 5387bf4f063SLee Daly isal_inflate_init(qp->state); 5397bf4f063SLee Daly 540bd03d3f1SLee Daly /* Set Checksum flag */ 541bd03d3f1SLee Daly qp->state->crc_flag = priv_xform->decompress.chksum; 542bd03d3f1SLee Daly 543788e748dSLee Daly if (op->m_src->pkt_len < (op->src.length + op->src.offset)) { 544788e748dSLee Daly ISAL_PMD_LOG(ERR, "Input mbuf(s) not big enough.\n"); 545788e748dSLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 546788e748dSLee Daly return -1; 547788e748dSLee Daly } 548788e748dSLee Daly 5497f474b43SLee Daly if (op->dst.offset >= op->m_dst->pkt_len) { 5507f474b43SLee Daly ISAL_PMD_LOG(ERR, "Output mbuf not big enough for " 5516a000343SLee Daly "offset provided.\n"); 5526a000343SLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 5536a000343SLee Daly return -1; 5546a000343SLee Daly } 555788e748dSLee Daly 556788e748dSLee Daly /* Chained mbufs */ 557788e748dSLee Daly if (op->m_src->nb_segs > 1 || op->m_dst->nb_segs > 1) { 558788e748dSLee Daly ret = chained_mbuf_decompression(op, qp); 559788e748dSLee Daly if (ret != 0) 560788e748dSLee Daly return ret; 561788e748dSLee Daly } else { 562788e748dSLee Daly /* Linear buffer */ 5636a000343SLee Daly /* Point decompression state to input buffer */ 5647bf4f063SLee Daly qp->state->avail_in = op->src.length; 565788e748dSLee Daly qp->state->next_in = rte_pktmbuf_mtod_offset(op->m_src, 566788e748dSLee Daly uint8_t *, op->src.offset); 5676a000343SLee Daly 5686a000343SLee Daly /* Point decompression state to output buffer */ 5696a000343SLee Daly qp->state->avail_out = op->m_dst->data_len - op->dst.offset; 570788e748dSLee Daly qp->state->next_out = rte_pktmbuf_mtod_offset(op->m_dst, 571788e748dSLee Daly uint8_t *, op->dst.offset); 5727bf4f063SLee Daly 5737bf4f063SLee Daly if (unlikely(!qp->state->next_in || !qp->state->next_out)) { 574788e748dSLee Daly ISAL_PMD_LOG(ERR, "Invalid source or destination" 575788e748dSLee Daly " buffers\n"); 5767bf4f063SLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 5777bf4f063SLee Daly return -1; 5787bf4f063SLee Daly } 5797bf4f063SLee Daly 5807bf4f063SLee Daly /* Execute decompression operation */ 5817bf4f063SLee Daly ret = isal_inflate_stateless(qp->state); 5827bf4f063SLee Daly 5837bf4f063SLee Daly if (ret == ISAL_OUT_OVERFLOW) { 5847bf4f063SLee Daly ISAL_PMD_LOG(ERR, "Output buffer not big enough\n"); 5857bf4f063SLee Daly op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; 5867bf4f063SLee Daly return ret; 5877bf4f063SLee Daly } 5887bf4f063SLee Daly 5897bf4f063SLee Daly /* Check that input buffer has been fully consumed */ 5907bf4f063SLee Daly if (qp->state->avail_in != (uint32_t)0) { 591788e748dSLee Daly ISAL_PMD_LOG(ERR, "Input buffer could not be read" 592788e748dSLee Daly " entirely\n"); 5937bf4f063SLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 5947bf4f063SLee Daly return -1; 5957bf4f063SLee Daly } 5967bf4f063SLee Daly 597bd03d3f1SLee Daly if (ret != ISAL_DECOMP_OK && ret != ISAL_END_INPUT) { 598bd03d3f1SLee Daly ISAL_PMD_LOG(ERR, "Decompression operation failed\n"); 5997bf4f063SLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 6007bf4f063SLee Daly return ret; 6017bf4f063SLee Daly } 6027bf4f063SLee Daly op->consumed = op->src.length - qp->state->avail_in; 603788e748dSLee Daly } 6047bf4f063SLee Daly op->produced = qp->state->total_out; 605bd03d3f1SLee Daly op->output_chksum = qp->state->crc; 606bd03d3f1SLee Daly 6077bf4f063SLee Daly return ret; 6087bf4f063SLee Daly } 6097bf4f063SLee Daly 61021fd1e59SLee Daly /* Process compression/decompression operation */ 61121fd1e59SLee Daly static int 612dc49e6aaSLee Daly process_op(struct isal_comp_qp *qp, struct rte_comp_op *op, 61321fd1e59SLee Daly struct isal_priv_xform *priv_xform) 61421fd1e59SLee Daly { 61521fd1e59SLee Daly switch (priv_xform->type) { 61621fd1e59SLee Daly case RTE_COMP_COMPRESS: 617dc49e6aaSLee Daly process_isal_deflate(op, qp, priv_xform); 61821fd1e59SLee Daly break; 61921fd1e59SLee Daly case RTE_COMP_DECOMPRESS: 620bd03d3f1SLee Daly process_isal_inflate(op, qp, priv_xform); 62121fd1e59SLee Daly break; 62221fd1e59SLee Daly default: 62321fd1e59SLee Daly ISAL_PMD_LOG(ERR, "Operation Not Supported\n"); 62421fd1e59SLee Daly return -ENOTSUP; 62521fd1e59SLee Daly } 62621fd1e59SLee Daly return 0; 62721fd1e59SLee Daly } 62821fd1e59SLee Daly 62921fd1e59SLee Daly /* Enqueue burst */ 63021fd1e59SLee Daly static uint16_t 63121fd1e59SLee Daly isal_comp_pmd_enqueue_burst(void *queue_pair, struct rte_comp_op **ops, 63221fd1e59SLee Daly uint16_t nb_ops) 63321fd1e59SLee Daly { 63421fd1e59SLee Daly struct isal_comp_qp *qp = queue_pair; 63521fd1e59SLee Daly uint16_t i; 63621fd1e59SLee Daly int retval; 63721fd1e59SLee Daly int16_t num_enq = RTE_MIN(qp->num_free_elements, nb_ops); 63821fd1e59SLee Daly 63921fd1e59SLee Daly for (i = 0; i < num_enq; i++) { 64021fd1e59SLee Daly if (unlikely(ops[i]->op_type != RTE_COMP_OP_STATELESS)) { 64121fd1e59SLee Daly ops[i]->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 64221fd1e59SLee Daly ISAL_PMD_LOG(ERR, "Stateful operation not Supported\n"); 64321fd1e59SLee Daly qp->qp_stats.enqueue_err_count++; 64421fd1e59SLee Daly continue; 64521fd1e59SLee Daly } 64621fd1e59SLee Daly retval = process_op(qp, ops[i], ops[i]->private_xform); 64721fd1e59SLee Daly if (unlikely(retval < 0) || 64821fd1e59SLee Daly ops[i]->status != RTE_COMP_OP_STATUS_SUCCESS) { 64921fd1e59SLee Daly qp->qp_stats.enqueue_err_count++; 65021fd1e59SLee Daly } 65121fd1e59SLee Daly } 65221fd1e59SLee Daly 65321fd1e59SLee Daly retval = rte_ring_enqueue_burst(qp->processed_pkts, (void *)ops, 65421fd1e59SLee Daly num_enq, NULL); 65521fd1e59SLee Daly qp->num_free_elements -= retval; 65621fd1e59SLee Daly qp->qp_stats.enqueued_count += retval; 65721fd1e59SLee Daly 65821fd1e59SLee Daly return retval; 65921fd1e59SLee Daly } 66021fd1e59SLee Daly 66121fd1e59SLee Daly /* Dequeue burst */ 66221fd1e59SLee Daly static uint16_t 66321fd1e59SLee Daly isal_comp_pmd_dequeue_burst(void *queue_pair, struct rte_comp_op **ops, 66421fd1e59SLee Daly uint16_t nb_ops) 66521fd1e59SLee Daly { 66621fd1e59SLee Daly struct isal_comp_qp *qp = queue_pair; 66721fd1e59SLee Daly uint16_t nb_dequeued; 66821fd1e59SLee Daly 66921fd1e59SLee Daly nb_dequeued = rte_ring_dequeue_burst(qp->processed_pkts, (void **)ops, 67021fd1e59SLee Daly nb_ops, NULL); 67121fd1e59SLee Daly qp->num_free_elements += nb_dequeued; 67221fd1e59SLee Daly qp->qp_stats.dequeued_count += nb_dequeued; 67321fd1e59SLee Daly 67421fd1e59SLee Daly return nb_dequeued; 67521fd1e59SLee Daly } 67621fd1e59SLee Daly 677490e725bSLee Daly /* Create ISA-L compression device */ 678490e725bSLee Daly static int 679490e725bSLee Daly compdev_isal_create(const char *name, struct rte_vdev_device *vdev, 680490e725bSLee Daly struct rte_compressdev_pmd_init_params *init_params) 681490e725bSLee Daly { 682490e725bSLee Daly struct rte_compressdev *dev; 683490e725bSLee Daly 684490e725bSLee Daly dev = rte_compressdev_pmd_create(name, &vdev->device, 685490e725bSLee Daly sizeof(struct isal_comp_private), init_params); 686490e725bSLee Daly if (dev == NULL) { 687490e725bSLee Daly ISAL_PMD_LOG(ERR, "failed to create compressdev vdev"); 688490e725bSLee Daly return -EFAULT; 689490e725bSLee Daly } 690490e725bSLee Daly 691490e725bSLee Daly dev->dev_ops = isal_compress_pmd_ops; 692490e725bSLee Daly 69321fd1e59SLee Daly /* register rx/tx burst functions for data path */ 69421fd1e59SLee Daly dev->dequeue_burst = isal_comp_pmd_dequeue_burst; 69521fd1e59SLee Daly dev->enqueue_burst = isal_comp_pmd_enqueue_burst; 69621fd1e59SLee Daly 697fff7b0ddSTomasz Cel ISAL_PMD_LOG(INFO, "\nISA-L library version used: "ISAL_VERSION_STRING); 698fff7b0ddSTomasz Cel 699490e725bSLee Daly return 0; 700490e725bSLee Daly } 701490e725bSLee Daly 7023c32e89fSLee Daly /** Remove compression device */ 7033c32e89fSLee Daly static int 704490e725bSLee Daly compdev_isal_remove_dev(struct rte_vdev_device *vdev) 7053c32e89fSLee Daly { 706490e725bSLee Daly struct rte_compressdev *compdev; 707490e725bSLee Daly const char *name; 708490e725bSLee Daly 709490e725bSLee Daly name = rte_vdev_device_name(vdev); 710490e725bSLee Daly if (name == NULL) 711490e725bSLee Daly return -EINVAL; 712490e725bSLee Daly 713490e725bSLee Daly compdev = rte_compressdev_pmd_get_named_dev(name); 714490e725bSLee Daly if (compdev == NULL) 715490e725bSLee Daly return -ENODEV; 716490e725bSLee Daly 717490e725bSLee Daly return rte_compressdev_pmd_destroy(compdev); 7183c32e89fSLee Daly } 7193c32e89fSLee Daly 7203c32e89fSLee Daly /** Initialise ISA-L compression device */ 7213c32e89fSLee Daly static int 722490e725bSLee Daly compdev_isal_probe(struct rte_vdev_device *dev) 7233c32e89fSLee Daly { 724490e725bSLee Daly struct rte_compressdev_pmd_init_params init_params = { 725490e725bSLee Daly "", 726490e725bSLee Daly rte_socket_id(), 727490e725bSLee Daly }; 728490e725bSLee Daly const char *name, *args; 729490e725bSLee Daly int retval; 730490e725bSLee Daly 731490e725bSLee Daly name = rte_vdev_device_name(dev); 732490e725bSLee Daly if (name == NULL) 733490e725bSLee Daly return -EINVAL; 734490e725bSLee Daly 735490e725bSLee Daly args = rte_vdev_device_args(dev); 736490e725bSLee Daly 737490e725bSLee Daly retval = rte_compressdev_pmd_parse_input_args(&init_params, args); 738490e725bSLee Daly if (retval) { 739490e725bSLee Daly ISAL_PMD_LOG(ERR, 740490e725bSLee Daly "Failed to parse initialisation arguments[%s]\n", args); 741490e725bSLee Daly return -EINVAL; 742490e725bSLee Daly } 743490e725bSLee Daly 744490e725bSLee Daly return compdev_isal_create(name, dev, &init_params); 7453c32e89fSLee Daly } 7463c32e89fSLee Daly 7473c32e89fSLee Daly static struct rte_vdev_driver compdev_isal_pmd_drv = { 7483c32e89fSLee Daly .probe = compdev_isal_probe, 7493c32e89fSLee Daly .remove = compdev_isal_remove_dev, 7503c32e89fSLee Daly }; 7513c32e89fSLee Daly 7523c32e89fSLee Daly RTE_PMD_REGISTER_VDEV(COMPDEV_NAME_ISAL_PMD, compdev_isal_pmd_drv); 7533c32e89fSLee Daly RTE_PMD_REGISTER_PARAM_STRING(COMPDEV_NAME_ISAL_PMD, 7543c32e89fSLee Daly "socket_id=<int>"); 755490e725bSLee Daly 756f8e99896SThomas Monjalon RTE_INIT(isal_init_log) 757490e725bSLee Daly { 75823edc362SPablo de Lara isal_logtype_driver = rte_log_register("pmd.compress.isal"); 759490e725bSLee Daly if (isal_logtype_driver >= 0) 760490e725bSLee Daly rte_log_set_level(isal_logtype_driver, RTE_LOG_INFO); 761490e725bSLee Daly } 762