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 64851ef2bSDavid Marchand #include <bus_vdev_driver.h> 7490e725bSLee Daly #include <rte_common.h> 8ffb81dceSRuifeng Wang #include <rte_cpuflags.h> 9490e725bSLee Daly #include <rte_malloc.h> 10dc49e6aaSLee Daly #include <rte_mbuf.h> 113c32e89fSLee Daly #include <rte_compressdev_pmd.h> 123c32e89fSLee Daly 13490e725bSLee Daly #include "isal_compress_pmd_private.h" 14490e725bSLee Daly 15c720cd2bSLee Daly #define RTE_COMP_ISAL_WINDOW_SIZE 15 16c720cd2bSLee Daly #define RTE_COMP_ISAL_LEVEL_ZERO 0 /* ISA-L Level 0 used for fixed Huffman */ 17c720cd2bSLee Daly #define RTE_COMP_ISAL_LEVEL_ONE 1 18c720cd2bSLee Daly #define RTE_COMP_ISAL_LEVEL_TWO 2 19c720cd2bSLee Daly #define RTE_COMP_ISAL_LEVEL_THREE 3 /* Optimised for AVX512 & AVX2 only */ 20bd03d3f1SLee Daly #define CHKSUM_SZ_CRC 8 21bd03d3f1SLee Daly #define CHKSUM_SZ_ADLER 4 22c720cd2bSLee Daly 23fff7b0ddSTomasz Cel #define STRINGIFY(s) #s 24fff7b0ddSTomasz Cel #define ISAL_TOSTRING(maj, min, patch) \ 25fff7b0ddSTomasz Cel STRINGIFY(maj)"."STRINGIFY(min)"."STRINGIFY(patch) 26fff7b0ddSTomasz Cel #define ISAL_VERSION_STRING \ 27fff7b0ddSTomasz Cel ISAL_TOSTRING(ISAL_MAJOR_VERSION, ISAL_MINOR_VERSION, ISAL_PATCH_VERSION) 28fff7b0ddSTomasz Cel 29c720cd2bSLee Daly /* Verify and set private xform parameters */ 30c720cd2bSLee Daly int 31c720cd2bSLee Daly isal_comp_set_priv_xform_parameters(struct isal_priv_xform *priv_xform, 32c720cd2bSLee Daly const struct rte_comp_xform *xform) 33c720cd2bSLee Daly { 34c720cd2bSLee Daly if (xform == NULL) 35c720cd2bSLee Daly return -EINVAL; 36c720cd2bSLee Daly 37c720cd2bSLee Daly /* Set compression private xform variables */ 38c720cd2bSLee Daly if (xform->type == RTE_COMP_COMPRESS) { 39c720cd2bSLee Daly /* Set private xform type - COMPRESS/DECOMPRESS */ 40c720cd2bSLee Daly priv_xform->type = RTE_COMP_COMPRESS; 41c720cd2bSLee Daly 42c720cd2bSLee Daly /* Set private xform algorithm */ 43c720cd2bSLee Daly if (xform->compress.algo != RTE_COMP_ALGO_DEFLATE) { 44c720cd2bSLee Daly if (xform->compress.algo == RTE_COMP_ALGO_NULL) { 45*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "By-pass not supported"); 46c720cd2bSLee Daly return -ENOTSUP; 47c720cd2bSLee Daly } 48*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Algorithm not supported"); 49c720cd2bSLee Daly return -ENOTSUP; 50c720cd2bSLee Daly } 51c720cd2bSLee Daly priv_xform->compress.algo = RTE_COMP_ALGO_DEFLATE; 52c720cd2bSLee Daly 53c720cd2bSLee Daly /* Set private xform window size, 32K supported */ 54c720cd2bSLee Daly if (xform->compress.window_size == RTE_COMP_ISAL_WINDOW_SIZE) 55c720cd2bSLee Daly priv_xform->compress.window_size = 56c720cd2bSLee Daly RTE_COMP_ISAL_WINDOW_SIZE; 57c720cd2bSLee Daly else { 58*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Window size not supported"); 59c720cd2bSLee Daly return -ENOTSUP; 60c720cd2bSLee Daly } 61c720cd2bSLee Daly 62c720cd2bSLee Daly /* Set private xform huffman type */ 63c720cd2bSLee Daly switch (xform->compress.deflate.huffman) { 64c720cd2bSLee Daly case(RTE_COMP_HUFFMAN_DEFAULT): 65c720cd2bSLee Daly priv_xform->compress.deflate.huffman = 66c720cd2bSLee Daly RTE_COMP_HUFFMAN_DEFAULT; 67c720cd2bSLee Daly break; 68c720cd2bSLee Daly case(RTE_COMP_HUFFMAN_FIXED): 69c720cd2bSLee Daly priv_xform->compress.deflate.huffman = 70c720cd2bSLee Daly RTE_COMP_HUFFMAN_FIXED; 71c720cd2bSLee Daly break; 72c720cd2bSLee Daly case(RTE_COMP_HUFFMAN_DYNAMIC): 73c720cd2bSLee Daly priv_xform->compress.deflate.huffman = 74c720cd2bSLee Daly RTE_COMP_HUFFMAN_DYNAMIC; 75c720cd2bSLee Daly break; 76c720cd2bSLee Daly default: 77*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Huffman code not supported"); 78c720cd2bSLee Daly return -ENOTSUP; 79c720cd2bSLee Daly } 80c720cd2bSLee Daly 81bd03d3f1SLee Daly /* Set private xform checksum */ 82bd03d3f1SLee Daly switch (xform->compress.chksum) { 83bd03d3f1SLee Daly /* Raw deflate by default */ 84bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_NONE): 85bd03d3f1SLee Daly priv_xform->compress.chksum = IGZIP_DEFLATE; 86bd03d3f1SLee Daly break; 87bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_CRC32): 88bd03d3f1SLee Daly priv_xform->compress.chksum = IGZIP_GZIP_NO_HDR; 89bd03d3f1SLee Daly break; 90bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_ADLER32): 91bd03d3f1SLee Daly priv_xform->compress.chksum = IGZIP_ZLIB_NO_HDR; 92bd03d3f1SLee Daly break; 93bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_CRC32_ADLER32): 94bd03d3f1SLee Daly ISAL_PMD_LOG(ERR, "Combined CRC and ADLER checksum not" 95*f665790aSDavid Marchand " supported"); 96bd03d3f1SLee Daly return -ENOTSUP; 97bd03d3f1SLee Daly default: 98*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Checksum type not supported"); 99bd03d3f1SLee Daly priv_xform->compress.chksum = IGZIP_DEFLATE; 100bd03d3f1SLee Daly break; 101bd03d3f1SLee Daly } 102bd03d3f1SLee Daly 103c720cd2bSLee Daly /* Set private xform level. 104c720cd2bSLee Daly * Checking compliance with compressdev API, -1 <= level => 9 105c720cd2bSLee Daly */ 106c720cd2bSLee Daly if (xform->compress.level < RTE_COMP_LEVEL_PMD_DEFAULT || 107c720cd2bSLee Daly xform->compress.level > RTE_COMP_LEVEL_MAX) { 108*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Compression level out of range"); 109c720cd2bSLee Daly return -EINVAL; 110c720cd2bSLee Daly } 111c720cd2bSLee Daly /* Check for Compressdev API level 0, No compression 112c720cd2bSLee Daly * not supported in ISA-L 113c720cd2bSLee Daly */ 114c720cd2bSLee Daly else if (xform->compress.level == RTE_COMP_LEVEL_NONE) { 115*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "No Compression not supported"); 116c720cd2bSLee Daly return -ENOTSUP; 117c720cd2bSLee Daly } 118c720cd2bSLee Daly /* If using fixed huffman code, level must be 0 */ 119c720cd2bSLee Daly else if (priv_xform->compress.deflate.huffman == 120c720cd2bSLee Daly RTE_COMP_HUFFMAN_FIXED) { 121c720cd2bSLee Daly ISAL_PMD_LOG(DEBUG, "ISA-L level 0 used due to a" 122*f665790aSDavid Marchand " fixed huffman code"); 123c720cd2bSLee Daly priv_xform->compress.level = RTE_COMP_ISAL_LEVEL_ZERO; 124c720cd2bSLee Daly priv_xform->level_buffer_size = 125c720cd2bSLee Daly ISAL_DEF_LVL0_DEFAULT; 126c720cd2bSLee Daly } else { 127c720cd2bSLee Daly /* Mapping API levels to ISA-L levels 1,2 & 3 */ 128c720cd2bSLee Daly switch (xform->compress.level) { 129c720cd2bSLee Daly case RTE_COMP_LEVEL_PMD_DEFAULT: 130c720cd2bSLee Daly /* Default is 1 if not using fixed huffman */ 131c720cd2bSLee Daly priv_xform->compress.level = 132c720cd2bSLee Daly RTE_COMP_ISAL_LEVEL_ONE; 133c720cd2bSLee Daly priv_xform->level_buffer_size = 134c720cd2bSLee Daly ISAL_DEF_LVL1_DEFAULT; 135c720cd2bSLee Daly break; 136c720cd2bSLee Daly case RTE_COMP_LEVEL_MIN: 137c720cd2bSLee Daly priv_xform->compress.level = 138c720cd2bSLee Daly RTE_COMP_ISAL_LEVEL_ONE; 139c720cd2bSLee Daly priv_xform->level_buffer_size = 140c720cd2bSLee Daly ISAL_DEF_LVL1_DEFAULT; 141c720cd2bSLee Daly break; 142c720cd2bSLee Daly case RTE_COMP_ISAL_LEVEL_TWO: 143c720cd2bSLee Daly priv_xform->compress.level = 144c720cd2bSLee Daly RTE_COMP_ISAL_LEVEL_TWO; 145c720cd2bSLee Daly priv_xform->level_buffer_size = 146c720cd2bSLee Daly ISAL_DEF_LVL2_DEFAULT; 147c720cd2bSLee Daly break; 148c720cd2bSLee Daly /* Level 3 or higher requested */ 149c720cd2bSLee Daly default: 150ffb81dceSRuifeng Wang #ifdef RTE_ARCH_X86 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; 166ffb81dceSRuifeng Wang } else 167ffb81dceSRuifeng Wang #endif 168ffb81dceSRuifeng Wang { 169c720cd2bSLee Daly ISAL_PMD_LOG(DEBUG, "Requested ISA-L level" 170c720cd2bSLee Daly " 3 or above; Level 3 optimized" 171c720cd2bSLee Daly " for AVX512 & AVX2 only." 172*f665790aSDavid Marchand " level changed to 2."); 173c720cd2bSLee Daly priv_xform->compress.level = 174c720cd2bSLee Daly RTE_COMP_ISAL_LEVEL_TWO; 175c720cd2bSLee Daly priv_xform->level_buffer_size = 176c720cd2bSLee Daly ISAL_DEF_LVL2_DEFAULT; 177c720cd2bSLee Daly } 178c720cd2bSLee Daly } 179c720cd2bSLee Daly } 180c720cd2bSLee Daly } 181c720cd2bSLee Daly 182c720cd2bSLee Daly /* Set decompression private xform variables */ 183c720cd2bSLee Daly else if (xform->type == RTE_COMP_DECOMPRESS) { 184c720cd2bSLee Daly 185c720cd2bSLee Daly /* Set private xform type - COMPRESS/DECOMPRESS */ 186c720cd2bSLee Daly priv_xform->type = RTE_COMP_DECOMPRESS; 187c720cd2bSLee Daly 188c720cd2bSLee Daly /* Set private xform algorithm */ 189c720cd2bSLee Daly if (xform->decompress.algo != RTE_COMP_ALGO_DEFLATE) { 190c720cd2bSLee Daly if (xform->decompress.algo == RTE_COMP_ALGO_NULL) { 191*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "By pass not supported"); 192c720cd2bSLee Daly return -ENOTSUP; 193c720cd2bSLee Daly } 194*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Algorithm not supported"); 195c720cd2bSLee Daly return -ENOTSUP; 196c720cd2bSLee Daly } 197c720cd2bSLee Daly priv_xform->decompress.algo = RTE_COMP_ALGO_DEFLATE; 198c720cd2bSLee Daly 199bd03d3f1SLee Daly /* Set private xform checksum */ 200bd03d3f1SLee Daly switch (xform->decompress.chksum) { 201bd03d3f1SLee Daly /* Raw deflate by default */ 202bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_NONE): 203bd03d3f1SLee Daly priv_xform->decompress.chksum = ISAL_DEFLATE; 204bd03d3f1SLee Daly break; 205bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_CRC32): 20659af922aSLee Daly priv_xform->decompress.chksum = ISAL_GZIP_NO_HDR; 207bd03d3f1SLee Daly break; 208bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_ADLER32): 20959af922aSLee Daly priv_xform->decompress.chksum = ISAL_ZLIB_NO_HDR; 210bd03d3f1SLee Daly break; 211bd03d3f1SLee Daly case(RTE_COMP_CHECKSUM_CRC32_ADLER32): 212bd03d3f1SLee Daly ISAL_PMD_LOG(ERR, "Combined CRC and ADLER checksum not" 213*f665790aSDavid Marchand " supported"); 214c720cd2bSLee Daly return -ENOTSUP; 215bd03d3f1SLee Daly default: 216*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Checksum type not supported"); 217bd03d3f1SLee Daly priv_xform->decompress.chksum = ISAL_DEFLATE; 218bd03d3f1SLee Daly break; 219c720cd2bSLee Daly } 220c720cd2bSLee Daly 221c720cd2bSLee Daly /* Set private xform window size, 32K supported */ 222c720cd2bSLee Daly if (xform->decompress.window_size == RTE_COMP_ISAL_WINDOW_SIZE) 223c720cd2bSLee Daly priv_xform->decompress.window_size = 224c720cd2bSLee Daly RTE_COMP_ISAL_WINDOW_SIZE; 225c720cd2bSLee Daly else { 226*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Window size not supported"); 227c720cd2bSLee Daly return -ENOTSUP; 228c720cd2bSLee Daly } 229c720cd2bSLee Daly } 230c720cd2bSLee Daly return 0; 231c720cd2bSLee Daly } 232c720cd2bSLee Daly 233788e748dSLee Daly /* Compression using chained mbufs for input/output data */ 234788e748dSLee Daly static int 235788e748dSLee Daly chained_mbuf_compression(struct rte_comp_op *op, struct isal_comp_qp *qp) 236788e748dSLee Daly { 237788e748dSLee Daly int ret; 238788e748dSLee Daly uint32_t remaining_offset; 239788e748dSLee Daly uint32_t remaining_data = op->src.length; 240788e748dSLee Daly struct rte_mbuf *src = op->m_src; 241788e748dSLee Daly struct rte_mbuf *dst = op->m_dst; 242788e748dSLee Daly 243788e748dSLee Daly /* check for source/destination offset passing multiple segments 244788e748dSLee Daly * and point compression stream to input/output buffer. 245788e748dSLee Daly */ 246788e748dSLee Daly remaining_offset = op->src.offset; 247788e748dSLee Daly while (remaining_offset >= src->data_len) { 248788e748dSLee Daly remaining_offset -= src->data_len; 249788e748dSLee Daly src = src->next; 250788e748dSLee Daly } 251788e748dSLee Daly qp->stream->avail_in = RTE_MIN(src->data_len - remaining_offset, 252788e748dSLee Daly op->src.length); 253788e748dSLee Daly qp->stream->next_in = rte_pktmbuf_mtod_offset(src, uint8_t *, 254788e748dSLee Daly remaining_offset); 255788e748dSLee Daly 256788e748dSLee Daly remaining_offset = op->dst.offset; 257788e748dSLee Daly while (remaining_offset >= dst->data_len) { 258788e748dSLee Daly remaining_offset -= dst->data_len; 259788e748dSLee Daly dst = dst->next; 260788e748dSLee Daly } 261788e748dSLee Daly qp->stream->avail_out = dst->data_len - remaining_offset; 262788e748dSLee Daly qp->stream->next_out = rte_pktmbuf_mtod_offset(dst, uint8_t *, 263788e748dSLee Daly remaining_offset); 264788e748dSLee Daly 265788e748dSLee Daly if (unlikely(!qp->stream->next_in || !qp->stream->next_out)) { 266*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Invalid source or destination buffer"); 267788e748dSLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 268788e748dSLee Daly return -1; 269788e748dSLee Daly } 270788e748dSLee Daly 271788e748dSLee Daly while (qp->stream->internal_state.state != ZSTATE_END) { 272788e748dSLee Daly /* Last segment of data */ 273788e748dSLee Daly if (remaining_data <= src->data_len) 274788e748dSLee Daly qp->stream->end_of_stream = 1; 275788e748dSLee Daly 276788e748dSLee Daly /* Execute compression operation */ 277788e748dSLee Daly ret = isal_deflate(qp->stream); 278788e748dSLee Daly 279788e748dSLee Daly remaining_data = op->src.length - qp->stream->total_in; 280788e748dSLee Daly 281788e748dSLee Daly if (ret != COMP_OK) { 282*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Compression operation failed"); 283788e748dSLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 284788e748dSLee Daly return ret; 285788e748dSLee Daly } 286788e748dSLee Daly 287788e748dSLee Daly if (qp->stream->avail_in == 0 && 288788e748dSLee Daly qp->stream->total_in != op->src.length) { 289788e748dSLee Daly if (src->next != NULL) { 290788e748dSLee Daly src = src->next; 291788e748dSLee Daly qp->stream->next_in = 292788e748dSLee Daly rte_pktmbuf_mtod(src, uint8_t *); 293788e748dSLee Daly qp->stream->avail_in = 294788e748dSLee Daly RTE_MIN(remaining_data, src->data_len); 295788e748dSLee Daly } else { 296788e748dSLee Daly ISAL_PMD_LOG(ERR, 297*f665790aSDavid Marchand "Not enough input buffer segments"); 298788e748dSLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 299788e748dSLee Daly return -1; 300788e748dSLee Daly } 301788e748dSLee Daly } 302788e748dSLee Daly 303788e748dSLee Daly if (qp->stream->avail_out == 0 && 304788e748dSLee Daly qp->stream->internal_state.state != ZSTATE_END) { 305788e748dSLee Daly if (dst->next != NULL) { 306788e748dSLee Daly dst = dst->next; 307788e748dSLee Daly qp->stream->next_out = 308788e748dSLee Daly rte_pktmbuf_mtod(dst, uint8_t *); 309788e748dSLee Daly qp->stream->avail_out = dst->data_len; 310788e748dSLee Daly } else { 311788e748dSLee Daly ISAL_PMD_LOG(ERR, 312*f665790aSDavid Marchand "Not enough output buffer segments"); 313788e748dSLee Daly op->status = 314788e748dSLee Daly RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; 315788e748dSLee Daly return -1; 316788e748dSLee Daly } 317788e748dSLee Daly } 318788e748dSLee Daly } 319788e748dSLee Daly 320788e748dSLee Daly return 0; 321788e748dSLee Daly } 322788e748dSLee Daly 323788e748dSLee Daly /* Decompression using chained mbufs for input/output data */ 324788e748dSLee Daly static int 325788e748dSLee Daly chained_mbuf_decompression(struct rte_comp_op *op, struct isal_comp_qp *qp) 326788e748dSLee Daly { 327788e748dSLee Daly int ret; 328788e748dSLee Daly uint32_t consumed_data, src_remaining_offset, dst_remaining_offset; 329788e748dSLee Daly uint32_t remaining_data = op->src.length; 330788e748dSLee Daly struct rte_mbuf *src = op->m_src; 331788e748dSLee Daly struct rte_mbuf *dst = op->m_dst; 332788e748dSLee Daly 333788e748dSLee Daly /* check for offset passing multiple segments 334788e748dSLee Daly * and point decompression state to input/output buffer 335788e748dSLee Daly */ 336788e748dSLee Daly src_remaining_offset = op->src.offset; 337788e748dSLee Daly while (src_remaining_offset >= src->data_len) { 338788e748dSLee Daly src_remaining_offset -= src->data_len; 339788e748dSLee Daly src = src->next; 340788e748dSLee Daly } 341788e748dSLee Daly qp->state->avail_in = RTE_MIN(src->data_len - src_remaining_offset, 342788e748dSLee Daly op->src.length); 343788e748dSLee Daly qp->state->next_in = rte_pktmbuf_mtod_offset(src, uint8_t *, 344788e748dSLee Daly src_remaining_offset); 345788e748dSLee Daly 346788e748dSLee Daly dst_remaining_offset = op->dst.offset; 347788e748dSLee Daly while (dst_remaining_offset >= dst->data_len) { 348788e748dSLee Daly dst_remaining_offset -= dst->data_len; 349788e748dSLee Daly dst = dst->next; 350788e748dSLee Daly } 351788e748dSLee Daly qp->state->avail_out = dst->data_len - dst_remaining_offset; 352788e748dSLee Daly qp->state->next_out = rte_pktmbuf_mtod_offset(dst, uint8_t *, 353788e748dSLee Daly dst_remaining_offset); 354788e748dSLee Daly 355788e748dSLee Daly while (qp->state->block_state != ISAL_BLOCK_FINISH) { 356788e748dSLee Daly 357788e748dSLee Daly ret = isal_inflate(qp->state); 358788e748dSLee Daly 3591713ad8bSLee Daly /* Check for first segment, offset needs to be accounted for */ 3601713ad8bSLee Daly if (remaining_data == op->src.length) { 3611713ad8bSLee Daly consumed_data = src->data_len - src_remaining_offset; 3621713ad8bSLee Daly } else 3631713ad8bSLee Daly consumed_data = src->data_len; 3641713ad8bSLee Daly 365788e748dSLee Daly if (qp->state->avail_in == 0 366788e748dSLee Daly && op->consumed != op->src.length) { 3671713ad8bSLee Daly op->consumed += consumed_data; 3681713ad8bSLee Daly remaining_data -= consumed_data; 3691713ad8bSLee Daly 370788e748dSLee Daly if (src->next != NULL) { 371788e748dSLee Daly src = src->next; 372788e748dSLee Daly qp->state->next_in = 373788e748dSLee Daly rte_pktmbuf_mtod(src, uint8_t *); 374788e748dSLee Daly qp->state->avail_in = 375788e748dSLee Daly RTE_MIN(remaining_data, src->data_len); 376788e748dSLee Daly } 377788e748dSLee Daly } 378788e748dSLee Daly 3791aeb9fdbSLee Daly if (ret == ISAL_OUT_OVERFLOW) { 3801aeb9fdbSLee Daly ISAL_PMD_LOG(ERR, "Decompression operation ran " 381*f665790aSDavid Marchand "out of space, but can be recovered.%d bytes " 382*f665790aSDavid Marchand "consumed\t%d bytes produced", 3831aeb9fdbSLee Daly consumed_data, qp->state->total_out); 3841aeb9fdbSLee Daly op->status = 3851aeb9fdbSLee Daly RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE; 3861aeb9fdbSLee Daly return ret; 3871aeb9fdbSLee Daly } else if (ret < 0) { 388*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Decompression operation failed"); 3891aeb9fdbSLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 3901aeb9fdbSLee Daly return ret; 3911aeb9fdbSLee Daly } 3921aeb9fdbSLee Daly 393788e748dSLee Daly if (qp->state->avail_out == 0 && 394788e748dSLee Daly qp->state->block_state != ISAL_BLOCK_FINISH) { 395788e748dSLee Daly if (dst->next != NULL) { 396788e748dSLee Daly dst = dst->next; 397788e748dSLee Daly qp->state->next_out = 398788e748dSLee Daly rte_pktmbuf_mtod(dst, uint8_t *); 399788e748dSLee Daly qp->state->avail_out = dst->data_len; 400788e748dSLee Daly } else { 401788e748dSLee Daly ISAL_PMD_LOG(ERR, 402*f665790aSDavid Marchand "Not enough output buffer segments"); 403788e748dSLee Daly op->status = 404788e748dSLee Daly RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; 405788e748dSLee Daly return -1; 406788e748dSLee Daly } 407788e748dSLee Daly } 408788e748dSLee Daly } 409788e748dSLee Daly 410788e748dSLee Daly return 0; 411788e748dSLee Daly } 412788e748dSLee Daly 413dc49e6aaSLee Daly /* Stateless Compression Function */ 414dc49e6aaSLee Daly static int 415dc49e6aaSLee Daly process_isal_deflate(struct rte_comp_op *op, struct isal_comp_qp *qp, 416dc49e6aaSLee Daly struct isal_priv_xform *priv_xform) 417dc49e6aaSLee Daly { 418dc49e6aaSLee Daly int ret = 0; 419dc49e6aaSLee Daly op->status = RTE_COMP_OP_STATUS_SUCCESS; 420dc49e6aaSLee Daly 421dc49e6aaSLee Daly /* Required due to init clearing level_buf */ 422dc49e6aaSLee Daly uint8_t *temp_level_buf = qp->stream->level_buf; 423dc49e6aaSLee Daly 424dc49e6aaSLee Daly /* Initialize compression stream */ 425ae1374e2STomasz Cel isal_deflate_init(qp->stream); 426dc49e6aaSLee Daly 427dc49e6aaSLee Daly qp->stream->level_buf = temp_level_buf; 428dc49e6aaSLee Daly 429bd03d3f1SLee Daly /* Set Checksum flag */ 430bd03d3f1SLee Daly qp->stream->gzip_flag = priv_xform->compress.chksum; 431bd03d3f1SLee Daly 432dc49e6aaSLee Daly /* Stateless operation, input will be consumed in one go */ 433dc49e6aaSLee Daly qp->stream->flush = NO_FLUSH; 434dc49e6aaSLee Daly 435788e748dSLee Daly /* set compression level & intermediate level buffer size */ 436dc49e6aaSLee Daly qp->stream->level = priv_xform->compress.level; 437dc49e6aaSLee Daly qp->stream->level_buf_size = priv_xform->level_buffer_size; 438dc49e6aaSLee Daly 439dc49e6aaSLee Daly /* Set op huffman code */ 440dc49e6aaSLee Daly if (priv_xform->compress.deflate.huffman == RTE_COMP_HUFFMAN_FIXED) 441dc49e6aaSLee Daly isal_deflate_set_hufftables(qp->stream, NULL, 442dc49e6aaSLee Daly IGZIP_HUFFTABLE_STATIC); 443dc49e6aaSLee Daly else if (priv_xform->compress.deflate.huffman == 444dc49e6aaSLee Daly RTE_COMP_HUFFMAN_DEFAULT) 445dc49e6aaSLee Daly isal_deflate_set_hufftables(qp->stream, NULL, 446dc49e6aaSLee Daly IGZIP_HUFFTABLE_DEFAULT); 447dc49e6aaSLee Daly /* Dynamically change the huffman code to suit the input data */ 448dc49e6aaSLee Daly else if (priv_xform->compress.deflate.huffman == 449dc49e6aaSLee Daly RTE_COMP_HUFFMAN_DYNAMIC) 450dc49e6aaSLee Daly isal_deflate_set_hufftables(qp->stream, NULL, 451dc49e6aaSLee Daly IGZIP_HUFFTABLE_DEFAULT); 452dc49e6aaSLee Daly 453788e748dSLee Daly if (op->m_src->pkt_len < (op->src.length + op->src.offset)) { 454*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Input mbuf(s) not big enough."); 4556a000343SLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 4566a000343SLee Daly return -1; 4576a000343SLee Daly } 4586a000343SLee Daly 4597f474b43SLee Daly if (op->dst.offset >= op->m_dst->pkt_len) { 4607f474b43SLee Daly ISAL_PMD_LOG(ERR, "Output mbuf(s) not big enough" 461*f665790aSDavid Marchand " for offset provided."); 4626a000343SLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 4636a000343SLee Daly return -1; 4646a000343SLee Daly } 465788e748dSLee Daly 466788e748dSLee Daly /* Chained mbufs */ 467788e748dSLee Daly if (op->m_src->nb_segs > 1 || op->m_dst->nb_segs > 1) { 468788e748dSLee Daly ret = chained_mbuf_compression(op, qp); 469788e748dSLee Daly if (ret < 0) 470788e748dSLee Daly return ret; 471788e748dSLee Daly } else { 472788e748dSLee Daly /* Linear buffer */ 473788e748dSLee Daly qp->stream->end_of_stream = 1; /* All input consumed in one */ 474788e748dSLee Daly /* Point compression stream to input buffer */ 475788e748dSLee Daly qp->stream->avail_in = op->src.length; 476788e748dSLee Daly qp->stream->next_in = rte_pktmbuf_mtod_offset(op->m_src, 477788e748dSLee Daly uint8_t *, op->src.offset); 478788e748dSLee Daly 4796a000343SLee Daly /* Point compression stream to output buffer */ 4806a000343SLee Daly qp->stream->avail_out = op->m_dst->data_len - op->dst.offset; 481788e748dSLee Daly qp->stream->next_out = rte_pktmbuf_mtod_offset(op->m_dst, 482788e748dSLee Daly uint8_t *, op->dst.offset); 4836a000343SLee Daly 4846a000343SLee Daly if (unlikely(!qp->stream->next_in || !qp->stream->next_out)) { 485788e748dSLee Daly ISAL_PMD_LOG(ERR, "Invalid source or destination" 486*f665790aSDavid Marchand " buffers"); 4876a000343SLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 4886a000343SLee Daly return -1; 4896a000343SLee Daly } 4906a000343SLee Daly 491dc49e6aaSLee Daly /* Execute compression operation */ 492dc49e6aaSLee Daly ret = isal_deflate_stateless(qp->stream); 493dc49e6aaSLee Daly 494dc49e6aaSLee Daly /* Check that output buffer did not run out of space */ 495dc49e6aaSLee Daly if (ret == STATELESS_OVERFLOW) { 496*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Output buffer not big enough"); 497dc49e6aaSLee Daly op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; 498dc49e6aaSLee Daly return ret; 499dc49e6aaSLee Daly } 500dc49e6aaSLee Daly 501dc49e6aaSLee Daly /* Check that input buffer has been fully consumed */ 502dc49e6aaSLee Daly if (qp->stream->avail_in != (uint32_t)0) { 503788e748dSLee Daly ISAL_PMD_LOG(ERR, "Input buffer could not be read" 504*f665790aSDavid Marchand " entirely"); 505dc49e6aaSLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 506dc49e6aaSLee Daly return -1; 507dc49e6aaSLee Daly } 508dc49e6aaSLee Daly 509dc49e6aaSLee Daly if (ret != COMP_OK) { 510*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Compression operation failed"); 511dc49e6aaSLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 512dc49e6aaSLee Daly return ret; 513dc49e6aaSLee Daly } 514788e748dSLee Daly } 515bd03d3f1SLee Daly 516dc49e6aaSLee Daly op->consumed = qp->stream->total_in; 517bd03d3f1SLee Daly if (qp->stream->gzip_flag == IGZIP_DEFLATE) { 518dc49e6aaSLee Daly op->produced = qp->stream->total_out; 519bd03d3f1SLee Daly } else if (qp->stream->gzip_flag == IGZIP_ZLIB_NO_HDR) { 520bd03d3f1SLee Daly op->produced = qp->stream->total_out - CHKSUM_SZ_ADLER; 521bd03d3f1SLee Daly op->output_chksum = qp->stream->internal_state.crc + 1; 522bd03d3f1SLee Daly } else { 523bd03d3f1SLee Daly op->produced = qp->stream->total_out - CHKSUM_SZ_CRC; 524bd03d3f1SLee Daly op->output_chksum = qp->stream->internal_state.crc; 525bd03d3f1SLee Daly } 526bd03d3f1SLee Daly 527dc49e6aaSLee Daly return ret; 528dc49e6aaSLee Daly } 529dc49e6aaSLee Daly 5307bf4f063SLee Daly /* Stateless Decompression Function */ 5317bf4f063SLee Daly static int 532bd03d3f1SLee Daly process_isal_inflate(struct rte_comp_op *op, struct isal_comp_qp *qp, 533bd03d3f1SLee Daly struct isal_priv_xform *priv_xform) 5347bf4f063SLee Daly { 5357bf4f063SLee Daly int ret = 0; 5367bf4f063SLee Daly 5377bf4f063SLee Daly op->status = RTE_COMP_OP_STATUS_SUCCESS; 5387bf4f063SLee Daly 5397bf4f063SLee Daly /* Initialize decompression state */ 5407bf4f063SLee Daly isal_inflate_init(qp->state); 5417bf4f063SLee Daly 542bd03d3f1SLee Daly /* Set Checksum flag */ 543bd03d3f1SLee Daly qp->state->crc_flag = priv_xform->decompress.chksum; 544bd03d3f1SLee Daly 545788e748dSLee Daly if (op->m_src->pkt_len < (op->src.length + op->src.offset)) { 546*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Input mbuf(s) not big enough."); 547788e748dSLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 548788e748dSLee Daly return -1; 549788e748dSLee Daly } 550788e748dSLee Daly 5517f474b43SLee Daly if (op->dst.offset >= op->m_dst->pkt_len) { 5527f474b43SLee Daly ISAL_PMD_LOG(ERR, "Output mbuf not big enough for " 553*f665790aSDavid Marchand "offset provided."); 5546a000343SLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 5556a000343SLee Daly return -1; 5566a000343SLee Daly } 557788e748dSLee Daly 558788e748dSLee Daly /* Chained mbufs */ 559788e748dSLee Daly if (op->m_src->nb_segs > 1 || op->m_dst->nb_segs > 1) { 560788e748dSLee Daly ret = chained_mbuf_decompression(op, qp); 561788e748dSLee Daly if (ret != 0) 562788e748dSLee Daly return ret; 563788e748dSLee Daly } else { 564788e748dSLee Daly /* Linear buffer */ 5656a000343SLee Daly /* Point decompression state to input buffer */ 5667bf4f063SLee Daly qp->state->avail_in = op->src.length; 567788e748dSLee Daly qp->state->next_in = rte_pktmbuf_mtod_offset(op->m_src, 568788e748dSLee Daly uint8_t *, op->src.offset); 5696a000343SLee Daly 5706a000343SLee Daly /* Point decompression state to output buffer */ 5716a000343SLee Daly qp->state->avail_out = op->m_dst->data_len - op->dst.offset; 572788e748dSLee Daly qp->state->next_out = rte_pktmbuf_mtod_offset(op->m_dst, 573788e748dSLee Daly uint8_t *, op->dst.offset); 5747bf4f063SLee Daly 5757bf4f063SLee Daly if (unlikely(!qp->state->next_in || !qp->state->next_out)) { 576788e748dSLee Daly ISAL_PMD_LOG(ERR, "Invalid source or destination" 577*f665790aSDavid Marchand " buffers"); 5787bf4f063SLee Daly op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 5797bf4f063SLee Daly return -1; 5807bf4f063SLee Daly } 5817bf4f063SLee Daly 5827bf4f063SLee Daly /* Execute decompression operation */ 5837bf4f063SLee Daly ret = isal_inflate_stateless(qp->state); 5847bf4f063SLee Daly 5857bf4f063SLee Daly if (ret == ISAL_OUT_OVERFLOW) { 586*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Output buffer not big enough"); 5877bf4f063SLee Daly op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; 5887bf4f063SLee Daly return ret; 5897bf4f063SLee Daly } 5907bf4f063SLee Daly 5917bf4f063SLee Daly /* Check that input buffer has been fully consumed */ 5927bf4f063SLee Daly if (qp->state->avail_in != (uint32_t)0) { 593788e748dSLee Daly ISAL_PMD_LOG(ERR, "Input buffer could not be read" 594*f665790aSDavid Marchand " entirely"); 5957bf4f063SLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 5967bf4f063SLee Daly return -1; 5977bf4f063SLee Daly } 5987bf4f063SLee Daly 599bd03d3f1SLee Daly if (ret != ISAL_DECOMP_OK && ret != ISAL_END_INPUT) { 600*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Decompression operation failed"); 6017bf4f063SLee Daly op->status = RTE_COMP_OP_STATUS_ERROR; 6027bf4f063SLee Daly return ret; 6037bf4f063SLee Daly } 6047bf4f063SLee Daly op->consumed = op->src.length - qp->state->avail_in; 605788e748dSLee Daly } 6067bf4f063SLee Daly op->produced = qp->state->total_out; 607bd03d3f1SLee Daly op->output_chksum = qp->state->crc; 608bd03d3f1SLee Daly 6097bf4f063SLee Daly return ret; 6107bf4f063SLee Daly } 6117bf4f063SLee Daly 61221fd1e59SLee Daly /* Process compression/decompression operation */ 61321fd1e59SLee Daly static int 614dc49e6aaSLee Daly process_op(struct isal_comp_qp *qp, struct rte_comp_op *op, 61521fd1e59SLee Daly struct isal_priv_xform *priv_xform) 61621fd1e59SLee Daly { 61721fd1e59SLee Daly switch (priv_xform->type) { 61821fd1e59SLee Daly case RTE_COMP_COMPRESS: 619dc49e6aaSLee Daly process_isal_deflate(op, qp, priv_xform); 62021fd1e59SLee Daly break; 62121fd1e59SLee Daly case RTE_COMP_DECOMPRESS: 622bd03d3f1SLee Daly process_isal_inflate(op, qp, priv_xform); 62321fd1e59SLee Daly break; 62421fd1e59SLee Daly default: 625*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Operation Not Supported"); 62621fd1e59SLee Daly return -ENOTSUP; 62721fd1e59SLee Daly } 62821fd1e59SLee Daly return 0; 62921fd1e59SLee Daly } 63021fd1e59SLee Daly 63121fd1e59SLee Daly /* Enqueue burst */ 63221fd1e59SLee Daly static uint16_t 63321fd1e59SLee Daly isal_comp_pmd_enqueue_burst(void *queue_pair, struct rte_comp_op **ops, 63421fd1e59SLee Daly uint16_t nb_ops) 63521fd1e59SLee Daly { 63621fd1e59SLee Daly struct isal_comp_qp *qp = queue_pair; 63721fd1e59SLee Daly uint16_t i; 63821fd1e59SLee Daly int retval; 63921fd1e59SLee Daly int16_t num_enq = RTE_MIN(qp->num_free_elements, nb_ops); 64021fd1e59SLee Daly 64121fd1e59SLee Daly for (i = 0; i < num_enq; i++) { 64221fd1e59SLee Daly if (unlikely(ops[i]->op_type != RTE_COMP_OP_STATELESS)) { 64321fd1e59SLee Daly ops[i]->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 644*f665790aSDavid Marchand ISAL_PMD_LOG(ERR, "Stateful operation not Supported"); 64521fd1e59SLee Daly qp->qp_stats.enqueue_err_count++; 64621fd1e59SLee Daly continue; 64721fd1e59SLee Daly } 64821fd1e59SLee Daly retval = process_op(qp, ops[i], ops[i]->private_xform); 64921fd1e59SLee Daly if (unlikely(retval < 0) || 65021fd1e59SLee Daly ops[i]->status != RTE_COMP_OP_STATUS_SUCCESS) { 65121fd1e59SLee Daly qp->qp_stats.enqueue_err_count++; 65221fd1e59SLee Daly } 65321fd1e59SLee Daly } 65421fd1e59SLee Daly 65521fd1e59SLee Daly retval = rte_ring_enqueue_burst(qp->processed_pkts, (void *)ops, 65621fd1e59SLee Daly num_enq, NULL); 65721fd1e59SLee Daly qp->num_free_elements -= retval; 65821fd1e59SLee Daly qp->qp_stats.enqueued_count += retval; 65921fd1e59SLee Daly 66021fd1e59SLee Daly return retval; 66121fd1e59SLee Daly } 66221fd1e59SLee Daly 66321fd1e59SLee Daly /* Dequeue burst */ 66421fd1e59SLee Daly static uint16_t 66521fd1e59SLee Daly isal_comp_pmd_dequeue_burst(void *queue_pair, struct rte_comp_op **ops, 66621fd1e59SLee Daly uint16_t nb_ops) 66721fd1e59SLee Daly { 66821fd1e59SLee Daly struct isal_comp_qp *qp = queue_pair; 66921fd1e59SLee Daly uint16_t nb_dequeued; 67021fd1e59SLee Daly 67121fd1e59SLee Daly nb_dequeued = rte_ring_dequeue_burst(qp->processed_pkts, (void **)ops, 67221fd1e59SLee Daly nb_ops, NULL); 67321fd1e59SLee Daly qp->num_free_elements += nb_dequeued; 67421fd1e59SLee Daly qp->qp_stats.dequeued_count += nb_dequeued; 67521fd1e59SLee Daly 67621fd1e59SLee Daly return nb_dequeued; 67721fd1e59SLee Daly } 67821fd1e59SLee Daly 679490e725bSLee Daly /* Create ISA-L compression device */ 680490e725bSLee Daly static int 681490e725bSLee Daly compdev_isal_create(const char *name, struct rte_vdev_device *vdev, 682490e725bSLee Daly struct rte_compressdev_pmd_init_params *init_params) 683490e725bSLee Daly { 684490e725bSLee Daly struct rte_compressdev *dev; 685490e725bSLee Daly 686490e725bSLee Daly dev = rte_compressdev_pmd_create(name, &vdev->device, 687490e725bSLee Daly sizeof(struct isal_comp_private), init_params); 688490e725bSLee Daly if (dev == NULL) { 689490e725bSLee Daly ISAL_PMD_LOG(ERR, "failed to create compressdev vdev"); 690490e725bSLee Daly return -EFAULT; 691490e725bSLee Daly } 692490e725bSLee Daly 693490e725bSLee Daly dev->dev_ops = isal_compress_pmd_ops; 694490e725bSLee Daly 69521fd1e59SLee Daly /* register rx/tx burst functions for data path */ 69621fd1e59SLee Daly dev->dequeue_burst = isal_comp_pmd_dequeue_burst; 69721fd1e59SLee Daly dev->enqueue_burst = isal_comp_pmd_enqueue_burst; 69821fd1e59SLee Daly 699*f665790aSDavid Marchand ISAL_PMD_LOG(INFO, "ISA-L library version used: "ISAL_VERSION_STRING); 700fff7b0ddSTomasz Cel 701490e725bSLee Daly return 0; 702490e725bSLee Daly } 703490e725bSLee Daly 7043c32e89fSLee Daly /** Remove compression device */ 7053c32e89fSLee Daly static int 706490e725bSLee Daly compdev_isal_remove_dev(struct rte_vdev_device *vdev) 7073c32e89fSLee Daly { 708490e725bSLee Daly struct rte_compressdev *compdev; 709490e725bSLee Daly const char *name; 710490e725bSLee Daly 711490e725bSLee Daly name = rte_vdev_device_name(vdev); 712490e725bSLee Daly if (name == NULL) 713490e725bSLee Daly return -EINVAL; 714490e725bSLee Daly 715490e725bSLee Daly compdev = rte_compressdev_pmd_get_named_dev(name); 716490e725bSLee Daly if (compdev == NULL) 717490e725bSLee Daly return -ENODEV; 718490e725bSLee Daly 719490e725bSLee Daly return rte_compressdev_pmd_destroy(compdev); 7203c32e89fSLee Daly } 7213c32e89fSLee Daly 7223c32e89fSLee Daly /** Initialise ISA-L compression device */ 7233c32e89fSLee Daly static int 724490e725bSLee Daly compdev_isal_probe(struct rte_vdev_device *dev) 7253c32e89fSLee Daly { 726490e725bSLee Daly struct rte_compressdev_pmd_init_params init_params = { 727490e725bSLee Daly "", 728490e725bSLee Daly rte_socket_id(), 729490e725bSLee Daly }; 730490e725bSLee Daly const char *name, *args; 731490e725bSLee Daly int retval; 732490e725bSLee Daly 733490e725bSLee Daly name = rte_vdev_device_name(dev); 734490e725bSLee Daly if (name == NULL) 735490e725bSLee Daly return -EINVAL; 736490e725bSLee Daly 737490e725bSLee Daly args = rte_vdev_device_args(dev); 738490e725bSLee Daly 739490e725bSLee Daly retval = rte_compressdev_pmd_parse_input_args(&init_params, args); 740490e725bSLee Daly if (retval) { 741490e725bSLee Daly ISAL_PMD_LOG(ERR, 742*f665790aSDavid Marchand "Failed to parse initialisation arguments[%s]", args); 743490e725bSLee Daly return -EINVAL; 744490e725bSLee Daly } 745490e725bSLee Daly 746490e725bSLee Daly return compdev_isal_create(name, dev, &init_params); 7473c32e89fSLee Daly } 7483c32e89fSLee Daly 7493c32e89fSLee Daly static struct rte_vdev_driver compdev_isal_pmd_drv = { 7503c32e89fSLee Daly .probe = compdev_isal_probe, 7513c32e89fSLee Daly .remove = compdev_isal_remove_dev, 7523c32e89fSLee Daly }; 7533c32e89fSLee Daly 7543c32e89fSLee Daly RTE_PMD_REGISTER_VDEV(COMPDEV_NAME_ISAL_PMD, compdev_isal_pmd_drv); 7553c32e89fSLee Daly RTE_PMD_REGISTER_PARAM_STRING(COMPDEV_NAME_ISAL_PMD, 7563c32e89fSLee Daly "socket_id=<int>"); 757eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(isal_logtype_driver, INFO); 758