1f008628aSNagadheeraj Rottela /* SPDX-License-Identifier: BSD-3-Clause 2f008628aSNagadheeraj Rottela * Copyright(C) 2024 Marvell. 3f008628aSNagadheeraj Rottela */ 4f008628aSNagadheeraj Rottela 5f008628aSNagadheeraj Rottela #include <rte_compressdev_pmd.h> 6f008628aSNagadheeraj Rottela #include <rte_errno.h> 7f008628aSNagadheeraj Rottela #include <rte_malloc.h> 86ea6bcddSNagadheeraj Rottela #include <rte_hexdump.h> 9f008628aSNagadheeraj Rottela 10f008628aSNagadheeraj Rottela #include "nitrox_comp_reqmgr.h" 11f008628aSNagadheeraj Rottela #include "nitrox_logs.h" 12f008628aSNagadheeraj Rottela #include "rte_comp.h" 13f008628aSNagadheeraj Rottela 146ea6bcddSNagadheeraj Rottela #define NITROX_INSTR_BUFFER_DEBUG 0 15f008628aSNagadheeraj Rottela #define NITROX_ZIP_SGL_COUNT 16 16f008628aSNagadheeraj Rottela #define NITROX_ZIP_MAX_ZPTRS 2048 17f008628aSNagadheeraj Rottela #define NITROX_ZIP_MAX_DATASIZE ((1 << 24) - 1) 18f008628aSNagadheeraj Rottela #define NITROX_ZIP_MAX_ONFSIZE 1024 19f008628aSNagadheeraj Rottela #define CMD_TIMEOUT 2 20f008628aSNagadheeraj Rottela 21f008628aSNagadheeraj Rottela union nitrox_zip_instr_word0 { 22f008628aSNagadheeraj Rottela uint64_t u64; 23f008628aSNagadheeraj Rottela struct { 24f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 25f008628aSNagadheeraj Rottela uint64_t raz0 : 8; 26f008628aSNagadheeraj Rottela uint64_t tol : 24; 27f008628aSNagadheeraj Rottela uint64_t raz1 : 5; 28f008628aSNagadheeraj Rottela uint64_t exn : 3; 29f008628aSNagadheeraj Rottela uint64_t raz2 : 1; 30f008628aSNagadheeraj Rottela uint64_t exbits : 7; 31f008628aSNagadheeraj Rottela uint64_t raz3 : 3; 32f008628aSNagadheeraj Rottela uint64_t ca : 1; 33f008628aSNagadheeraj Rottela uint64_t sf : 1; 34f008628aSNagadheeraj Rottela uint64_t ss : 2; 35f008628aSNagadheeraj Rottela uint64_t cc : 2; 36f008628aSNagadheeraj Rottela uint64_t ef : 1; 37f008628aSNagadheeraj Rottela uint64_t bf : 1; 38f008628aSNagadheeraj Rottela uint64_t co : 1; 39f008628aSNagadheeraj Rottela uint64_t raz4 : 1; 40f008628aSNagadheeraj Rottela uint64_t ds : 1; 41f008628aSNagadheeraj Rottela uint64_t dg : 1; 42f008628aSNagadheeraj Rottela uint64_t hg : 1; 43f008628aSNagadheeraj Rottela #else 44f008628aSNagadheeraj Rottela uint64_t hg : 1; 45f008628aSNagadheeraj Rottela uint64_t dg : 1; 46f008628aSNagadheeraj Rottela uint64_t ds : 1; 47f008628aSNagadheeraj Rottela uint64_t raz4 : 1; 48f008628aSNagadheeraj Rottela uint64_t co : 1; 49f008628aSNagadheeraj Rottela uint64_t bf : 1; 50f008628aSNagadheeraj Rottela uint64_t ef : 1; 51f008628aSNagadheeraj Rottela uint64_t cc : 2; 52f008628aSNagadheeraj Rottela uint64_t ss : 2; 53f008628aSNagadheeraj Rottela uint64_t sf : 1; 54f008628aSNagadheeraj Rottela uint64_t ca : 1; 55f008628aSNagadheeraj Rottela uint64_t raz3 : 3; 56f008628aSNagadheeraj Rottela uint64_t exbits : 7; 57f008628aSNagadheeraj Rottela uint64_t raz2 : 1; 58f008628aSNagadheeraj Rottela uint64_t exn : 3; 59f008628aSNagadheeraj Rottela uint64_t raz1 : 5; 60f008628aSNagadheeraj Rottela uint64_t tol : 24; 61f008628aSNagadheeraj Rottela uint64_t raz0 : 8; 62f008628aSNagadheeraj Rottela #endif 63f008628aSNagadheeraj Rottela 64f008628aSNagadheeraj Rottela }; 65f008628aSNagadheeraj Rottela }; 66f008628aSNagadheeraj Rottela 67f008628aSNagadheeraj Rottela union nitrox_zip_instr_word1 { 68f008628aSNagadheeraj Rottela uint64_t u64; 69f008628aSNagadheeraj Rottela struct { 70f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 71f008628aSNagadheeraj Rottela uint64_t hl : 16; 72f008628aSNagadheeraj Rottela uint64_t raz0 : 16; 73f008628aSNagadheeraj Rottela uint64_t adlercrc32 : 32; 74f008628aSNagadheeraj Rottela #else 75f008628aSNagadheeraj Rottela uint64_t adlercrc32 : 32; 76f008628aSNagadheeraj Rottela uint64_t raz0 : 16; 77f008628aSNagadheeraj Rottela uint64_t hl : 16; 78f008628aSNagadheeraj Rottela #endif 79f008628aSNagadheeraj Rottela }; 80f008628aSNagadheeraj Rottela }; 81f008628aSNagadheeraj Rottela 82f008628aSNagadheeraj Rottela union nitrox_zip_instr_word2 { 83f008628aSNagadheeraj Rottela uint64_t u64; 84f008628aSNagadheeraj Rottela struct { 85f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 86f008628aSNagadheeraj Rottela uint64_t raz0 : 20; 87f008628aSNagadheeraj Rottela uint64_t cptr : 44; 88f008628aSNagadheeraj Rottela #else 89f008628aSNagadheeraj Rottela uint64_t cptr : 44; 90f008628aSNagadheeraj Rottela uint64_t raz0 : 20; 91f008628aSNagadheeraj Rottela #endif 92f008628aSNagadheeraj Rottela }; 93f008628aSNagadheeraj Rottela }; 94f008628aSNagadheeraj Rottela 95f008628aSNagadheeraj Rottela union nitrox_zip_instr_word3 { 96f008628aSNagadheeraj Rottela uint64_t u64; 97f008628aSNagadheeraj Rottela struct { 98f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 99f008628aSNagadheeraj Rottela uint64_t raz0 : 4; 100f008628aSNagadheeraj Rottela uint64_t hlen : 16; 101f008628aSNagadheeraj Rottela uint64_t hptr : 44; 102f008628aSNagadheeraj Rottela #else 103f008628aSNagadheeraj Rottela uint64_t hptr : 44; 104f008628aSNagadheeraj Rottela uint64_t hlen : 16; 105f008628aSNagadheeraj Rottela uint64_t raz0 : 4; 106f008628aSNagadheeraj Rottela #endif 107f008628aSNagadheeraj Rottela }; 108f008628aSNagadheeraj Rottela }; 109f008628aSNagadheeraj Rottela 110f008628aSNagadheeraj Rottela union nitrox_zip_instr_word4 { 111f008628aSNagadheeraj Rottela uint64_t u64; 112f008628aSNagadheeraj Rottela struct { 113f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 114f008628aSNagadheeraj Rottela uint64_t raz0 : 4; 115f008628aSNagadheeraj Rottela uint64_t ilen : 16; 116f008628aSNagadheeraj Rottela uint64_t iptr : 44; 117f008628aSNagadheeraj Rottela #else 118f008628aSNagadheeraj Rottela uint64_t iptr : 44; 119f008628aSNagadheeraj Rottela uint64_t ilen : 16; 120f008628aSNagadheeraj Rottela uint64_t raz0 : 4; 121f008628aSNagadheeraj Rottela #endif 122f008628aSNagadheeraj Rottela }; 123f008628aSNagadheeraj Rottela }; 124f008628aSNagadheeraj Rottela 125f008628aSNagadheeraj Rottela union nitrox_zip_instr_word5 { 126f008628aSNagadheeraj Rottela uint64_t u64; 127f008628aSNagadheeraj Rottela struct { 128f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 129f008628aSNagadheeraj Rottela uint64_t raz0 : 4; 130f008628aSNagadheeraj Rottela uint64_t olen : 16; 131f008628aSNagadheeraj Rottela uint64_t optr : 44; 132f008628aSNagadheeraj Rottela #else 133f008628aSNagadheeraj Rottela uint64_t optr : 44; 134f008628aSNagadheeraj Rottela uint64_t olen : 16; 135f008628aSNagadheeraj Rottela uint64_t raz0 : 4; 136f008628aSNagadheeraj Rottela #endif 137f008628aSNagadheeraj Rottela }; 138f008628aSNagadheeraj Rottela }; 139f008628aSNagadheeraj Rottela 140f008628aSNagadheeraj Rottela union nitrox_zip_instr_word6 { 141f008628aSNagadheeraj Rottela uint64_t u64; 142f008628aSNagadheeraj Rottela struct { 143f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 144f008628aSNagadheeraj Rottela uint64_t raz0 : 20; 145f008628aSNagadheeraj Rottela uint64_t rptr : 44; 146f008628aSNagadheeraj Rottela #else 147f008628aSNagadheeraj Rottela uint64_t rptr : 44; 148f008628aSNagadheeraj Rottela uint64_t raz0 : 20; 149f008628aSNagadheeraj Rottela #endif 150f008628aSNagadheeraj Rottela }; 151f008628aSNagadheeraj Rottela }; 152f008628aSNagadheeraj Rottela 153f008628aSNagadheeraj Rottela union nitrox_zip_instr_word7 { 154f008628aSNagadheeraj Rottela uint64_t u64; 155f008628aSNagadheeraj Rottela struct { 156f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 157f008628aSNagadheeraj Rottela uint64_t grp : 3; 158f008628aSNagadheeraj Rottela uint64_t raz0 : 41; 159f008628aSNagadheeraj Rottela uint64_t addr_msb: 20; 160f008628aSNagadheeraj Rottela #else 161f008628aSNagadheeraj Rottela uint64_t addr_msb: 20; 162f008628aSNagadheeraj Rottela uint64_t raz0 : 41; 163f008628aSNagadheeraj Rottela uint64_t grp : 3; 164f008628aSNagadheeraj Rottela #endif 165f008628aSNagadheeraj Rottela }; 166f008628aSNagadheeraj Rottela }; 167f008628aSNagadheeraj Rottela 168f008628aSNagadheeraj Rottela struct nitrox_zip_instr { 169f008628aSNagadheeraj Rottela union nitrox_zip_instr_word0 w0; 170f008628aSNagadheeraj Rottela union nitrox_zip_instr_word1 w1; 171f008628aSNagadheeraj Rottela union nitrox_zip_instr_word2 w2; 172f008628aSNagadheeraj Rottela union nitrox_zip_instr_word3 w3; 173f008628aSNagadheeraj Rottela union nitrox_zip_instr_word4 w4; 174f008628aSNagadheeraj Rottela union nitrox_zip_instr_word5 w5; 175f008628aSNagadheeraj Rottela union nitrox_zip_instr_word6 w6; 176f008628aSNagadheeraj Rottela union nitrox_zip_instr_word7 w7; 177f008628aSNagadheeraj Rottela }; 178f008628aSNagadheeraj Rottela 179f008628aSNagadheeraj Rottela union nitrox_zip_result_word0 { 180f008628aSNagadheeraj Rottela uint64_t u64; 181f008628aSNagadheeraj Rottela struct { 182f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 183f008628aSNagadheeraj Rottela uint64_t crc32 : 32; 184f008628aSNagadheeraj Rottela uint64_t adler32: 32; 185f008628aSNagadheeraj Rottela #else 186f008628aSNagadheeraj Rottela uint64_t adler32: 32; 187f008628aSNagadheeraj Rottela uint64_t crc32 : 32; 188f008628aSNagadheeraj Rottela #endif 189f008628aSNagadheeraj Rottela }; 190f008628aSNagadheeraj Rottela }; 191f008628aSNagadheeraj Rottela 192f008628aSNagadheeraj Rottela union nitrox_zip_result_word1 { 193f008628aSNagadheeraj Rottela uint64_t u64; 194f008628aSNagadheeraj Rottela struct { 195f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 196f008628aSNagadheeraj Rottela uint64_t tbyteswritten : 32; 197f008628aSNagadheeraj Rottela uint64_t tbytesread : 32; 198f008628aSNagadheeraj Rottela #else 199f008628aSNagadheeraj Rottela uint64_t tbytesread : 32; 200f008628aSNagadheeraj Rottela uint64_t tbyteswritten : 32; 201f008628aSNagadheeraj Rottela #endif 202f008628aSNagadheeraj Rottela }; 203f008628aSNagadheeraj Rottela }; 204f008628aSNagadheeraj Rottela 205f008628aSNagadheeraj Rottela union nitrox_zip_result_word2 { 206f008628aSNagadheeraj Rottela uint64_t u64; 207f008628aSNagadheeraj Rottela struct { 208f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 209f008628aSNagadheeraj Rottela uint64_t tbits : 32; 210f008628aSNagadheeraj Rottela uint64_t raz0 : 5; 211f008628aSNagadheeraj Rottela uint64_t exn : 3; 212f008628aSNagadheeraj Rottela uint64_t raz1 : 1; 213f008628aSNagadheeraj Rottela uint64_t exbits : 7; 214f008628aSNagadheeraj Rottela uint64_t raz2 : 7; 215f008628aSNagadheeraj Rottela uint64_t ef : 1; 216f008628aSNagadheeraj Rottela uint64_t compcode: 8; 217f008628aSNagadheeraj Rottela #else 218f008628aSNagadheeraj Rottela uint64_t compcode: 8; 219f008628aSNagadheeraj Rottela uint64_t ef : 1; 220f008628aSNagadheeraj Rottela uint64_t raz2 : 7; 221f008628aSNagadheeraj Rottela uint64_t exbits : 7; 222f008628aSNagadheeraj Rottela uint64_t raz1 : 1; 223f008628aSNagadheeraj Rottela uint64_t exn : 3; 224f008628aSNagadheeraj Rottela uint64_t raz0 : 5; 225f008628aSNagadheeraj Rottela uint64_t tbits : 32; 226f008628aSNagadheeraj Rottela #endif 227f008628aSNagadheeraj Rottela }; 228f008628aSNagadheeraj Rottela }; 229f008628aSNagadheeraj Rottela 230f008628aSNagadheeraj Rottela struct nitrox_zip_result { 231f008628aSNagadheeraj Rottela union nitrox_zip_result_word0 w0; 232f008628aSNagadheeraj Rottela union nitrox_zip_result_word1 w1; 233f008628aSNagadheeraj Rottela union nitrox_zip_result_word2 w2; 234f008628aSNagadheeraj Rottela }; 235f008628aSNagadheeraj Rottela 236f008628aSNagadheeraj Rottela union nitrox_zip_zptr { 237f008628aSNagadheeraj Rottela uint64_t u64; 238f008628aSNagadheeraj Rottela struct { 239f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 240f008628aSNagadheeraj Rottela uint64_t raz0 : 3; 241f008628aSNagadheeraj Rottela uint64_t le : 1; 242f008628aSNagadheeraj Rottela uint64_t length : 16; 243f008628aSNagadheeraj Rottela uint64_t addr : 44; 244f008628aSNagadheeraj Rottela #else 245f008628aSNagadheeraj Rottela uint64_t addr : 44; 246f008628aSNagadheeraj Rottela uint64_t length : 16; 247f008628aSNagadheeraj Rottela uint64_t le : 1; 248f008628aSNagadheeraj Rottela uint64_t raz0 : 3; 249f008628aSNagadheeraj Rottela #endif 250f008628aSNagadheeraj Rottela } s; 251f008628aSNagadheeraj Rottela }; 252f008628aSNagadheeraj Rottela 253f008628aSNagadheeraj Rottela struct nitrox_zip_iova_addr { 254f008628aSNagadheeraj Rottela union { 255f008628aSNagadheeraj Rottela uint64_t u64; 256f008628aSNagadheeraj Rottela struct { 257f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 258f008628aSNagadheeraj Rottela uint64_t addr_msb: 20; 259f008628aSNagadheeraj Rottela uint64_t addr : 44; 260f008628aSNagadheeraj Rottela #else 261f008628aSNagadheeraj Rottela uint64_t addr : 44; 262f008628aSNagadheeraj Rottela uint64_t addr_msb: 20; 263f008628aSNagadheeraj Rottela #endif 264f008628aSNagadheeraj Rottela } zda; 265f008628aSNagadheeraj Rottela 266f008628aSNagadheeraj Rottela struct { 267f008628aSNagadheeraj Rottela #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 268f008628aSNagadheeraj Rottela uint64_t addr_msb: 20; 269f008628aSNagadheeraj Rottela uint64_t addr : 41; 270f008628aSNagadheeraj Rottela uint64_t align_8bytes: 3; 271f008628aSNagadheeraj Rottela #else 272f008628aSNagadheeraj Rottela uint64_t align_8bytes: 3; 273f008628aSNagadheeraj Rottela uint64_t addr : 41; 274f008628aSNagadheeraj Rottela uint64_t addr_msb: 20; 275f008628aSNagadheeraj Rottela #endif 276f008628aSNagadheeraj Rottela } z8a; 277f008628aSNagadheeraj Rottela }; 278f008628aSNagadheeraj Rottela }; 279f008628aSNagadheeraj Rottela 280f008628aSNagadheeraj Rottela enum nitrox_zip_comp_code { 281f008628aSNagadheeraj Rottela NITROX_CC_NOTDONE = 0, 282f008628aSNagadheeraj Rottela NITROX_CC_SUCCESS = 1, 283f008628aSNagadheeraj Rottela NITROX_CC_DTRUNC = 2, 284f008628aSNagadheeraj Rottela NITROX_CC_STOP = 3, 285f008628aSNagadheeraj Rottela NITROX_CC_ITRUNK = 4, 286f008628aSNagadheeraj Rottela NITROX_CC_RBLOCK = 5, 287f008628aSNagadheeraj Rottela NITROX_CC_NLEN = 6, 288f008628aSNagadheeraj Rottela NITROX_CC_BADCODE = 7, 289f008628aSNagadheeraj Rottela NITROX_CC_BADCODE2 = 8, 290f008628aSNagadheeraj Rottela NITROX_CC_ZERO_LEN = 9, 291f008628aSNagadheeraj Rottela NITROX_CC_PARITY = 10, 292f008628aSNagadheeraj Rottela NITROX_CC_FATAL = 11, 293f008628aSNagadheeraj Rottela NITROX_CC_TIMEOUT = 12, 294f008628aSNagadheeraj Rottela NITROX_CC_NPCI_ERR = 13, 295f008628aSNagadheeraj Rottela }; 296f008628aSNagadheeraj Rottela 297f008628aSNagadheeraj Rottela struct nitrox_sgtable { 298f008628aSNagadheeraj Rottela union nitrox_zip_zptr *sgl; 299f008628aSNagadheeraj Rottela uint64_t addr_msb; 300f008628aSNagadheeraj Rottela uint32_t total_bytes; 301f008628aSNagadheeraj Rottela uint16_t nb_sgls; 302f008628aSNagadheeraj Rottela uint16_t filled_sgls; 303f008628aSNagadheeraj Rottela }; 304f008628aSNagadheeraj Rottela 305f008628aSNagadheeraj Rottela struct nitrox_softreq { 306f008628aSNagadheeraj Rottela struct nitrox_zip_instr instr; 30727595cd8STyler Retzlaff alignas(8) struct nitrox_zip_result zip_res; 308f008628aSNagadheeraj Rottela uint8_t decomp_threshold[NITROX_ZIP_MAX_ONFSIZE]; 309f008628aSNagadheeraj Rottela struct rte_comp_op *op; 310f008628aSNagadheeraj Rottela struct nitrox_sgtable src; 311f008628aSNagadheeraj Rottela struct nitrox_sgtable dst; 312f008628aSNagadheeraj Rottela uint64_t timeout; 313f008628aSNagadheeraj Rottela }; 314f008628aSNagadheeraj Rottela 3156ea6bcddSNagadheeraj Rottela #if NITROX_INSTR_BUFFER_DEBUG 3166ea6bcddSNagadheeraj Rottela static void nitrox_dump_databuf(const char *name, struct rte_mbuf *m, 3176ea6bcddSNagadheeraj Rottela uint32_t off, uint32_t datalen) 3186ea6bcddSNagadheeraj Rottela { 3196ea6bcddSNagadheeraj Rottela uint32_t mlen; 3206ea6bcddSNagadheeraj Rottela 3216ea6bcddSNagadheeraj Rottela if (!rte_log_can_log(nitrox_logtype, RTE_LOG_DEBUG)) 3226ea6bcddSNagadheeraj Rottela return; 3236ea6bcddSNagadheeraj Rottela 3246ea6bcddSNagadheeraj Rottela for (; m && off > rte_pktmbuf_data_len(m); m = m->next) 3256ea6bcddSNagadheeraj Rottela off -= rte_pktmbuf_data_len(m); 3266ea6bcddSNagadheeraj Rottela 3276ea6bcddSNagadheeraj Rottela mlen = rte_pktmbuf_data_len(m) - off; 3286ea6bcddSNagadheeraj Rottela if (datalen <= mlen) 3296ea6bcddSNagadheeraj Rottela mlen = datalen; 3306ea6bcddSNagadheeraj Rottela 3316ea6bcddSNagadheeraj Rottela rte_hexdump(rte_log_get_stream(), name, 3326ea6bcddSNagadheeraj Rottela rte_pktmbuf_mtod_offset(m, char *, off), mlen); 3336ea6bcddSNagadheeraj Rottela for (m = m->next; m && datalen; m = m->next) { 3346ea6bcddSNagadheeraj Rottela mlen = rte_pktmbuf_data_len(m) < datalen ? 3356ea6bcddSNagadheeraj Rottela rte_pktmbuf_data_len(m) : datalen; 3366ea6bcddSNagadheeraj Rottela rte_hexdump(rte_log_get_stream(), name, 3376ea6bcddSNagadheeraj Rottela rte_pktmbuf_mtod(m, char *), mlen); 3386ea6bcddSNagadheeraj Rottela } 3396ea6bcddSNagadheeraj Rottela 340*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 3416ea6bcddSNagadheeraj Rottela } 3426ea6bcddSNagadheeraj Rottela 3436ea6bcddSNagadheeraj Rottela static void nitrox_dump_zip_instr(struct nitrox_zip_instr *instr, 3446ea6bcddSNagadheeraj Rottela union nitrox_zip_zptr *hptr_arr, 3456ea6bcddSNagadheeraj Rottela union nitrox_zip_zptr *iptr_arr, 3466ea6bcddSNagadheeraj Rottela union nitrox_zip_zptr *optr_arr) 3476ea6bcddSNagadheeraj Rottela { 3486ea6bcddSNagadheeraj Rottela uint64_t value; 3496ea6bcddSNagadheeraj Rottela int i = 0; 3506ea6bcddSNagadheeraj Rottela 351*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\nZIP instruction..(%p)", instr); 352*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD0 = 0x%016"PRIx64, instr->w0.u64); 353*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tTOL = %d", instr->w0.tol); 354*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tEXNUM = %d", instr->w0.exn); 355*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tEXBITS = %x", instr->w0.exbits); 356*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tCA = %d", instr->w0.ca); 357*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tSF = %d", instr->w0.sf); 358*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tSS = %d", instr->w0.ss); 359*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tCC = %d", instr->w0.cc); 360*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tEF = %d", instr->w0.ef); 361*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tBF = %d", instr->w0.bf); 362*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tCO = %d", instr->w0.co); 363*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tDS = %d", instr->w0.ds); 364*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tDG = %d", instr->w0.dg); 365*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tHG = %d", instr->w0.hg); 366*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 3676ea6bcddSNagadheeraj Rottela 368*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD1 = 0x%016"PRIx64, instr->w1.u64); 369*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tHL = %d", instr->w1.hl); 370*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tADLERCRC32 = 0x%08x", instr->w1.adlercrc32); 371*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 3726ea6bcddSNagadheeraj Rottela 3736ea6bcddSNagadheeraj Rottela value = instr->w2.cptr; 374*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD2 = 0x%016"PRIx64, instr->w2.u64); 375*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tCPTR = 0x%11"PRIx64, value); 376*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 3776ea6bcddSNagadheeraj Rottela 3786ea6bcddSNagadheeraj Rottela value = instr->w3.hptr; 379*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD3 = 0x%016"PRIx64, instr->w3.u64); 380*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tHLEN = %d", instr->w3.hlen); 381*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tHPTR = 0x%11"PRIx64, value); 3826ea6bcddSNagadheeraj Rottela 3836ea6bcddSNagadheeraj Rottela if (instr->w0.hg && hptr_arr) { 3846ea6bcddSNagadheeraj Rottela for (i = 0; i < instr->w3.hlen; i++) { 3856ea6bcddSNagadheeraj Rottela value = hptr_arr[i].s.addr; 386*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\t\tZPTR[%d] : Length = %d Addr = 0x%11"PRIx64, 3876ea6bcddSNagadheeraj Rottela i, hptr_arr[i].s.length, value); 3886ea6bcddSNagadheeraj Rottela } 3896ea6bcddSNagadheeraj Rottela } 3906ea6bcddSNagadheeraj Rottela 391*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 3926ea6bcddSNagadheeraj Rottela 3936ea6bcddSNagadheeraj Rottela value = instr->w4.iptr; 394*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD4 = 0x%016"PRIx64, instr->w4.u64); 395*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tILEN = %d", instr->w4.ilen); 396*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tIPTR = 0x%11"PRIx64, value); 3976ea6bcddSNagadheeraj Rottela if (instr->w0.dg && iptr_arr) { 3986ea6bcddSNagadheeraj Rottela for (i = 0; i < instr->w4.ilen; i++) { 3996ea6bcddSNagadheeraj Rottela value = iptr_arr[i].s.addr; 400*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\t\tZPTR[%d] : Length = %d Addr = 0x%11"PRIx64, 4016ea6bcddSNagadheeraj Rottela i, iptr_arr[i].s.length, value); 4026ea6bcddSNagadheeraj Rottela } 4036ea6bcddSNagadheeraj Rottela } 4046ea6bcddSNagadheeraj Rottela 405*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 4066ea6bcddSNagadheeraj Rottela 4076ea6bcddSNagadheeraj Rottela value = instr->w5.optr; 408*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD5 = 0x%016"PRIx64, instr->w5.u64); 409*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\t OLEN = %d", instr->w5.olen); 410*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\t OPTR = 0x%11"PRIx64, value); 4116ea6bcddSNagadheeraj Rottela if (instr->w0.ds && optr_arr) { 4126ea6bcddSNagadheeraj Rottela for (i = 0; i < instr->w5.olen; i++) { 4136ea6bcddSNagadheeraj Rottela value = optr_arr[i].s.addr; 414*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\t\tZPTR[%d] : Length = %d Addr = 0x%11"PRIx64, 4156ea6bcddSNagadheeraj Rottela i, optr_arr[i].s.length, value); 4166ea6bcddSNagadheeraj Rottela } 4176ea6bcddSNagadheeraj Rottela } 4186ea6bcddSNagadheeraj Rottela 419*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 4206ea6bcddSNagadheeraj Rottela 4216ea6bcddSNagadheeraj Rottela value = instr->w6.rptr; 422*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD6 = 0x%016"PRIx64, instr->w6.u64); 423*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tRPTR = 0x%11"PRIx64, value); 424*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 4256ea6bcddSNagadheeraj Rottela 426*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD7 = 0x%016"PRIx64, instr->w7.u64); 427*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tGRP = %x", instr->w7.grp); 428*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tADDR_MSB = 0x%5x", instr->w7.addr_msb); 429*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 4306ea6bcddSNagadheeraj Rottela } 4316ea6bcddSNagadheeraj Rottela 4326ea6bcddSNagadheeraj Rottela static void nitrox_dump_zip_result(struct nitrox_zip_instr *instr, 4336ea6bcddSNagadheeraj Rottela struct nitrox_zip_result *result) 4346ea6bcddSNagadheeraj Rottela { 435*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "ZIP result..(instr %p)", instr); 436*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD0 = 0x%016"PRIx64, result->w0.u64); 437*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tCRC32 = 0x%8x", result->w0.crc32); 438*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tADLER32 = 0x%8x", result->w0.adler32); 439*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 4406ea6bcddSNagadheeraj Rottela 441*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD1 = 0x%016"PRIx64, result->w1.u64); 442*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tTBYTESWRITTEN = %u", result->w1.tbyteswritten); 443*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tTBYTESREAD = %u", result->w1.tbytesread); 444*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 4456ea6bcddSNagadheeraj Rottela 446*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\tWORD2 = 0x%016"PRIx64, result->w2.u64); 447*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tTBITS = %u", result->w2.tbits); 448*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tEXN = %d", result->w2.exn); 449*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tEBITS = %x", result->w2.exbits); 450*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tEF = %d", result->w2.ef); 451*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG, "\t\tCOMPCODE = 0x%2x", result->w2.compcode); 452*e99981afSDavid Marchand NITROX_LOG_LINE(DEBUG,); 4536ea6bcddSNagadheeraj Rottela } 4546ea6bcddSNagadheeraj Rottela #else 4556ea6bcddSNagadheeraj Rottela #define nitrox_dump_databuf(name, m, off, datalen) 4566ea6bcddSNagadheeraj Rottela #define nitrox_dump_zip_instr(instr, hptr_arr, iptr_arr, optr_arr) 4576ea6bcddSNagadheeraj Rottela #define nitrox_dump_zip_result(instr, result) 4586ea6bcddSNagadheeraj Rottela #endif 4596ea6bcddSNagadheeraj Rottela 4606ea6bcddSNagadheeraj Rottela static int handle_zero_length_compression(struct nitrox_softreq *sr, 4616ea6bcddSNagadheeraj Rottela struct nitrox_comp_xform *xform) 4626ea6bcddSNagadheeraj Rottela { 4636ea6bcddSNagadheeraj Rottela union { 4646ea6bcddSNagadheeraj Rottela uint32_t num; 4656ea6bcddSNagadheeraj Rottela uint8_t bytes[4]; 4666ea6bcddSNagadheeraj Rottela } fblk; 4676ea6bcddSNagadheeraj Rottela uint32_t dstlen, rlen; 4686ea6bcddSNagadheeraj Rottela struct rte_mbuf *m; 4696ea6bcddSNagadheeraj Rottela uint32_t off; 4706ea6bcddSNagadheeraj Rottela uint32_t mlen; 4716ea6bcddSNagadheeraj Rottela uint32_t i = 0; 4726ea6bcddSNagadheeraj Rottela uint8_t *ptr; 4736ea6bcddSNagadheeraj Rottela 4746ea6bcddSNagadheeraj Rottela fblk.num = xform->exn ? (xform->exbits & 0x7F) : 0; 4756ea6bcddSNagadheeraj Rottela fblk.num |= (0x3 << xform->exn); 4766ea6bcddSNagadheeraj Rottela memset(&sr->zip_res, 0, sizeof(sr->zip_res)); 4776ea6bcddSNagadheeraj Rottela sr->zip_res.w1.tbytesread = xform->hlen; 4786ea6bcddSNagadheeraj Rottela sr->zip_res.w1.tbyteswritten = 2; 4796ea6bcddSNagadheeraj Rottela sr->zip_res.w2.ef = 1; 4806ea6bcddSNagadheeraj Rottela if (xform->exn == 7) 4816ea6bcddSNagadheeraj Rottela sr->zip_res.w1.tbyteswritten++; 4826ea6bcddSNagadheeraj Rottela 4836ea6bcddSNagadheeraj Rottela rlen = sr->zip_res.w1.tbyteswritten; 4846ea6bcddSNagadheeraj Rottela dstlen = rte_pktmbuf_pkt_len(sr->op->m_dst) - sr->op->dst.offset; 4856ea6bcddSNagadheeraj Rottela if (unlikely(dstlen < rlen)) 4866ea6bcddSNagadheeraj Rottela return -EIO; 4876ea6bcddSNagadheeraj Rottela 4886ea6bcddSNagadheeraj Rottela off = sr->op->dst.offset; 4896ea6bcddSNagadheeraj Rottela for (m = sr->op->m_dst; m && off > rte_pktmbuf_data_len(m); m = m->next) 4906ea6bcddSNagadheeraj Rottela off -= rte_pktmbuf_data_len(m); 4916ea6bcddSNagadheeraj Rottela 4926ea6bcddSNagadheeraj Rottela if (unlikely(!m)) 4936ea6bcddSNagadheeraj Rottela return -EIO; 4946ea6bcddSNagadheeraj Rottela 4956ea6bcddSNagadheeraj Rottela mlen = rte_pktmbuf_data_len(m) - off; 4966ea6bcddSNagadheeraj Rottela if (rlen <= mlen) 4976ea6bcddSNagadheeraj Rottela mlen = rlen; 4986ea6bcddSNagadheeraj Rottela 4996ea6bcddSNagadheeraj Rottela ptr = rte_pktmbuf_mtod_offset(m, uint8_t *, off); 5006ea6bcddSNagadheeraj Rottela memcpy(ptr, fblk.bytes, mlen); 5016ea6bcddSNagadheeraj Rottela i += mlen; 5026ea6bcddSNagadheeraj Rottela rlen -= mlen; 5036ea6bcddSNagadheeraj Rottela for (m = m->next; m && rlen; m = m->next) { 5046ea6bcddSNagadheeraj Rottela mlen = rte_pktmbuf_data_len(m) < rlen ? 5056ea6bcddSNagadheeraj Rottela rte_pktmbuf_data_len(m) : rlen; 5066ea6bcddSNagadheeraj Rottela ptr = rte_pktmbuf_mtod(m, uint8_t *); 5076ea6bcddSNagadheeraj Rottela memcpy(ptr, &fblk.bytes[i], mlen); 5086ea6bcddSNagadheeraj Rottela i += mlen; 5096ea6bcddSNagadheeraj Rottela rlen -= mlen; 5106ea6bcddSNagadheeraj Rottela } 5116ea6bcddSNagadheeraj Rottela 5126ea6bcddSNagadheeraj Rottela if (unlikely(rlen != 0)) 5136ea6bcddSNagadheeraj Rottela return -EIO; 5146ea6bcddSNagadheeraj Rottela 5156ea6bcddSNagadheeraj Rottela sr->zip_res.w2.compcode = NITROX_CC_SUCCESS; 5166ea6bcddSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_SUCCESS; 5176ea6bcddSNagadheeraj Rottela sr->zip_res.w0.u64 = rte_cpu_to_be_64(sr->zip_res.w0.u64); 5186ea6bcddSNagadheeraj Rottela sr->zip_res.w1.u64 = rte_cpu_to_be_64(sr->zip_res.w1.u64); 5196ea6bcddSNagadheeraj Rottela sr->zip_res.w2.u64 = rte_cpu_to_be_64(sr->zip_res.w2.u64); 5206ea6bcddSNagadheeraj Rottela return 0; 5216ea6bcddSNagadheeraj Rottela } 5226ea6bcddSNagadheeraj Rottela 523f008628aSNagadheeraj Rottela static int create_sglist_from_mbuf(struct nitrox_sgtable *sgtbl, 524f008628aSNagadheeraj Rottela struct rte_mbuf *mbuf, uint32_t off, 525f008628aSNagadheeraj Rottela uint32_t datalen, uint8_t extra_segs, 526f008628aSNagadheeraj Rottela int socket_id) 527f008628aSNagadheeraj Rottela { 528f008628aSNagadheeraj Rottela struct rte_mbuf *m; 529f008628aSNagadheeraj Rottela union nitrox_zip_zptr *sgl; 530f008628aSNagadheeraj Rottela struct nitrox_zip_iova_addr zip_addr; 531f008628aSNagadheeraj Rottela uint16_t nb_segs; 532f008628aSNagadheeraj Rottela uint16_t i; 533f008628aSNagadheeraj Rottela uint32_t mlen; 534f008628aSNagadheeraj Rottela 535f008628aSNagadheeraj Rottela if (unlikely(datalen > NITROX_ZIP_MAX_DATASIZE)) { 536*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Unsupported datalen %d, max supported %d", 537f008628aSNagadheeraj Rottela datalen, NITROX_ZIP_MAX_DATASIZE); 538f008628aSNagadheeraj Rottela return -ENOTSUP; 539f008628aSNagadheeraj Rottela } 540f008628aSNagadheeraj Rottela 541f008628aSNagadheeraj Rottela nb_segs = mbuf->nb_segs + extra_segs; 542f008628aSNagadheeraj Rottela for (m = mbuf; m && off > rte_pktmbuf_data_len(m); m = m->next) { 543f008628aSNagadheeraj Rottela off -= rte_pktmbuf_data_len(m); 544f008628aSNagadheeraj Rottela nb_segs--; 545f008628aSNagadheeraj Rottela } 546f008628aSNagadheeraj Rottela 547f008628aSNagadheeraj Rottela if (unlikely(nb_segs > NITROX_ZIP_MAX_ZPTRS)) { 548*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Mbuf has more segments %d than supported", 549f008628aSNagadheeraj Rottela nb_segs); 550f008628aSNagadheeraj Rottela return -ENOTSUP; 551f008628aSNagadheeraj Rottela } 552f008628aSNagadheeraj Rottela 553f008628aSNagadheeraj Rottela if (unlikely(nb_segs > sgtbl->nb_sgls)) { 554f008628aSNagadheeraj Rottela union nitrox_zip_zptr *sgl; 555f008628aSNagadheeraj Rottela 556*e99981afSDavid Marchand NITROX_LOG_LINE(INFO, "Mbuf has more segs %d than allocated %d", 557f008628aSNagadheeraj Rottela nb_segs, sgtbl->nb_sgls); 558f008628aSNagadheeraj Rottela sgl = rte_realloc_socket(sgtbl->sgl, 559f008628aSNagadheeraj Rottela sizeof(*sgtbl->sgl) * nb_segs, 560f008628aSNagadheeraj Rottela 8, socket_id); 561f008628aSNagadheeraj Rottela if (unlikely(!sgl)) { 562*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Failed to expand sglist memory"); 563f008628aSNagadheeraj Rottela return -ENOMEM; 564f008628aSNagadheeraj Rottela } 565f008628aSNagadheeraj Rottela 566f008628aSNagadheeraj Rottela sgtbl->sgl = sgl; 567f008628aSNagadheeraj Rottela sgtbl->nb_sgls = nb_segs; 568f008628aSNagadheeraj Rottela } 569f008628aSNagadheeraj Rottela 570f008628aSNagadheeraj Rottela sgtbl->filled_sgls = 0; 571f008628aSNagadheeraj Rottela sgtbl->total_bytes = 0; 572f008628aSNagadheeraj Rottela sgl = sgtbl->sgl; 573f008628aSNagadheeraj Rottela if (!m) 574f008628aSNagadheeraj Rottela return 0; 575f008628aSNagadheeraj Rottela 576f008628aSNagadheeraj Rottela mlen = rte_pktmbuf_data_len(m) - off; 577f008628aSNagadheeraj Rottela if (datalen <= mlen) 578f008628aSNagadheeraj Rottela mlen = datalen; 579f008628aSNagadheeraj Rottela 580f008628aSNagadheeraj Rottela i = 0; 581f008628aSNagadheeraj Rottela zip_addr.u64 = rte_pktmbuf_iova_offset(m, off); 582f008628aSNagadheeraj Rottela sgl[i].s.addr = zip_addr.zda.addr; 583f008628aSNagadheeraj Rottela sgl[i].s.length = mlen; 584f008628aSNagadheeraj Rottela sgl[i].s.le = 0; 585f008628aSNagadheeraj Rottela sgtbl->total_bytes += mlen; 586f008628aSNagadheeraj Rottela sgtbl->addr_msb = zip_addr.zda.addr_msb; 587f008628aSNagadheeraj Rottela datalen -= mlen; 588f008628aSNagadheeraj Rottela i++; 589f008628aSNagadheeraj Rottela for (m = m->next; m && datalen; m = m->next) { 590f008628aSNagadheeraj Rottela mlen = rte_pktmbuf_data_len(m) < datalen ? 591f008628aSNagadheeraj Rottela rte_pktmbuf_data_len(m) : datalen; 592f008628aSNagadheeraj Rottela zip_addr.u64 = rte_pktmbuf_iova(m); 593f008628aSNagadheeraj Rottela if (unlikely(zip_addr.zda.addr_msb != sgtbl->addr_msb)) { 594*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "zip_ptrs have different msb addr"); 595f008628aSNagadheeraj Rottela return -ENOTSUP; 596f008628aSNagadheeraj Rottela } 597f008628aSNagadheeraj Rottela 598f008628aSNagadheeraj Rottela sgl[i].s.addr = zip_addr.zda.addr; 599f008628aSNagadheeraj Rottela sgl[i].s.length = mlen; 600f008628aSNagadheeraj Rottela sgl[i].s.le = 0; 601f008628aSNagadheeraj Rottela sgtbl->total_bytes += mlen; 602f008628aSNagadheeraj Rottela datalen -= mlen; 603f008628aSNagadheeraj Rottela i++; 604f008628aSNagadheeraj Rottela } 605f008628aSNagadheeraj Rottela 606f008628aSNagadheeraj Rottela sgtbl->filled_sgls = i; 607f008628aSNagadheeraj Rottela return 0; 608f008628aSNagadheeraj Rottela } 609f008628aSNagadheeraj Rottela 6106ea6bcddSNagadheeraj Rottela static int softreq_init(struct nitrox_softreq *sr, 6116ea6bcddSNagadheeraj Rottela struct nitrox_comp_xform *xform) 612f008628aSNagadheeraj Rottela { 613f008628aSNagadheeraj Rottela struct rte_mempool *mp; 614f008628aSNagadheeraj Rottela int err; 6156ea6bcddSNagadheeraj Rottela bool need_decomp_threshold; 616f008628aSNagadheeraj Rottela 617f008628aSNagadheeraj Rottela mp = rte_mempool_from_obj(sr); 618f008628aSNagadheeraj Rottela if (unlikely(mp == NULL)) 619f008628aSNagadheeraj Rottela return -EINVAL; 620f008628aSNagadheeraj Rottela 621f008628aSNagadheeraj Rottela err = create_sglist_from_mbuf(&sr->src, sr->op->m_src, 622f008628aSNagadheeraj Rottela sr->op->src.offset, 623f008628aSNagadheeraj Rottela sr->op->src.length, 0, mp->socket_id); 624f008628aSNagadheeraj Rottela if (unlikely(err)) 625f008628aSNagadheeraj Rottela return err; 626f008628aSNagadheeraj Rottela 6276ea6bcddSNagadheeraj Rottela need_decomp_threshold = (sr->op->op_type == RTE_COMP_OP_STATELESS && 6286ea6bcddSNagadheeraj Rottela xform->op == NITROX_COMP_OP_DECOMPRESS); 629f008628aSNagadheeraj Rottela err = create_sglist_from_mbuf(&sr->dst, sr->op->m_dst, 630f008628aSNagadheeraj Rottela sr->op->dst.offset, 631f008628aSNagadheeraj Rottela rte_pktmbuf_pkt_len(sr->op->m_dst) - sr->op->dst.offset, 6326ea6bcddSNagadheeraj Rottela need_decomp_threshold ? 1 : 0, 633f008628aSNagadheeraj Rottela mp->socket_id); 634f008628aSNagadheeraj Rottela if (unlikely(err)) 635f008628aSNagadheeraj Rottela return err; 636f008628aSNagadheeraj Rottela 6376ea6bcddSNagadheeraj Rottela if (need_decomp_threshold) { 638f008628aSNagadheeraj Rottela struct nitrox_zip_iova_addr zip_addr; 639f008628aSNagadheeraj Rottela int i; 640f008628aSNagadheeraj Rottela 641f008628aSNagadheeraj Rottela zip_addr.u64 = rte_mempool_virt2iova(sr) + 642f008628aSNagadheeraj Rottela offsetof(struct nitrox_softreq, decomp_threshold); 643f008628aSNagadheeraj Rottela i = sr->dst.filled_sgls; 644f008628aSNagadheeraj Rottela sr->dst.sgl[i].s.addr = zip_addr.zda.addr; 645f008628aSNagadheeraj Rottela sr->dst.sgl[i].s.length = NITROX_ZIP_MAX_ONFSIZE; 646f008628aSNagadheeraj Rottela sr->dst.sgl[i].s.le = 0; 647f008628aSNagadheeraj Rottela sr->dst.total_bytes += NITROX_ZIP_MAX_ONFSIZE; 648f008628aSNagadheeraj Rottela sr->dst.filled_sgls++; 649f008628aSNagadheeraj Rottela } 650f008628aSNagadheeraj Rottela 651f008628aSNagadheeraj Rottela return 0; 652f008628aSNagadheeraj Rottela } 653f008628aSNagadheeraj Rottela 654f008628aSNagadheeraj Rottela static void nitrox_zip_instr_to_b64(struct nitrox_softreq *sr) 655f008628aSNagadheeraj Rottela { 656f008628aSNagadheeraj Rottela struct nitrox_zip_instr *instr = &sr->instr; 657f008628aSNagadheeraj Rottela int i; 658f008628aSNagadheeraj Rottela 659f008628aSNagadheeraj Rottela for (i = 0; instr->w0.dg && (i < instr->w4.ilen); i++) 660f008628aSNagadheeraj Rottela sr->src.sgl[i].u64 = rte_cpu_to_be_64(sr->src.sgl[i].u64); 661f008628aSNagadheeraj Rottela 662f008628aSNagadheeraj Rottela for (i = 0; instr->w0.ds && (i < instr->w5.olen); i++) 663f008628aSNagadheeraj Rottela sr->dst.sgl[i].u64 = rte_cpu_to_be_64(sr->dst.sgl[i].u64); 664f008628aSNagadheeraj Rottela 665f008628aSNagadheeraj Rottela instr->w0.u64 = rte_cpu_to_be_64(instr->w0.u64); 666f008628aSNagadheeraj Rottela instr->w1.u64 = rte_cpu_to_be_64(instr->w1.u64); 667f008628aSNagadheeraj Rottela instr->w2.u64 = rte_cpu_to_be_64(instr->w2.u64); 668f008628aSNagadheeraj Rottela instr->w3.u64 = rte_cpu_to_be_64(instr->w3.u64); 669f008628aSNagadheeraj Rottela instr->w4.u64 = rte_cpu_to_be_64(instr->w4.u64); 670f008628aSNagadheeraj Rottela instr->w5.u64 = rte_cpu_to_be_64(instr->w5.u64); 671f008628aSNagadheeraj Rottela instr->w6.u64 = rte_cpu_to_be_64(instr->w6.u64); 672f008628aSNagadheeraj Rottela instr->w7.u64 = rte_cpu_to_be_64(instr->w7.u64); 673f008628aSNagadheeraj Rottela } 674f008628aSNagadheeraj Rottela 6756ea6bcddSNagadheeraj Rottela static int process_zip_request(struct nitrox_softreq *sr) 676f008628aSNagadheeraj Rottela { 677f008628aSNagadheeraj Rottela struct nitrox_zip_instr *instr; 678f008628aSNagadheeraj Rottela struct nitrox_comp_xform *xform; 679f008628aSNagadheeraj Rottela struct nitrox_zip_iova_addr zip_addr; 6806ea6bcddSNagadheeraj Rottela uint64_t iptr_msb, optr_msb, rptr_msb, cptr_msb, hptr_msb; 681f008628aSNagadheeraj Rottela int err; 682f008628aSNagadheeraj Rottela 683f008628aSNagadheeraj Rottela xform = sr->op->private_xform; 684f008628aSNagadheeraj Rottela if (unlikely(xform == NULL)) { 685*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Invalid stateless comp op"); 686f008628aSNagadheeraj Rottela return -EINVAL; 687f008628aSNagadheeraj Rottela } 688f008628aSNagadheeraj Rottela 6896ea6bcddSNagadheeraj Rottela if (unlikely(sr->op->op_type == RTE_COMP_OP_STATEFUL && 6906ea6bcddSNagadheeraj Rottela xform->op == NITROX_COMP_OP_COMPRESS && 6916ea6bcddSNagadheeraj Rottela sr->op->flush_flag == RTE_COMP_FLUSH_FINAL && 6926ea6bcddSNagadheeraj Rottela sr->op->src.length == 0)) 6936ea6bcddSNagadheeraj Rottela return handle_zero_length_compression(sr, xform); 6946ea6bcddSNagadheeraj Rottela 6956ea6bcddSNagadheeraj Rottela if (unlikely(sr->op->op_type == RTE_COMP_OP_STATELESS && 6966ea6bcddSNagadheeraj Rottela xform->op == NITROX_COMP_OP_COMPRESS && 697f008628aSNagadheeraj Rottela sr->op->flush_flag != RTE_COMP_FLUSH_FULL && 698f008628aSNagadheeraj Rottela sr->op->flush_flag != RTE_COMP_FLUSH_FINAL)) { 699*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Invalid flush flag %d in stateless op", 700f008628aSNagadheeraj Rottela sr->op->flush_flag); 701f008628aSNagadheeraj Rottela return -EINVAL; 702f008628aSNagadheeraj Rottela } 703f008628aSNagadheeraj Rottela 7046ea6bcddSNagadheeraj Rottela err = softreq_init(sr, xform); 705f008628aSNagadheeraj Rottela if (unlikely(err)) 706f008628aSNagadheeraj Rottela return err; 707f008628aSNagadheeraj Rottela 708f008628aSNagadheeraj Rottela instr = &sr->instr; 709f008628aSNagadheeraj Rottela memset(instr, 0, sizeof(*instr)); 710f008628aSNagadheeraj Rottela /* word 0 */ 711f008628aSNagadheeraj Rottela instr->w0.tol = sr->dst.total_bytes; 7126ea6bcddSNagadheeraj Rottela instr->w0.exn = xform->exn; 7136ea6bcddSNagadheeraj Rottela instr->w0.exbits = xform->exbits; 714f008628aSNagadheeraj Rottela instr->w0.ca = 0; 715f008628aSNagadheeraj Rottela if (xform->op == NITROX_COMP_OP_DECOMPRESS || 7166ea6bcddSNagadheeraj Rottela sr->op->flush_flag == RTE_COMP_FLUSH_SYNC || 717f008628aSNagadheeraj Rottela sr->op->flush_flag == RTE_COMP_FLUSH_FULL) 718f008628aSNagadheeraj Rottela instr->w0.sf = 1; 719f008628aSNagadheeraj Rottela else 720f008628aSNagadheeraj Rottela instr->w0.sf = 0; 721f008628aSNagadheeraj Rottela 722f008628aSNagadheeraj Rottela instr->w0.ss = xform->level; 723f008628aSNagadheeraj Rottela instr->w0.cc = xform->algo; 7246ea6bcddSNagadheeraj Rottela if (sr->op->flush_flag == RTE_COMP_FLUSH_FINAL) 725f008628aSNagadheeraj Rottela instr->w0.ef = 1; 726f008628aSNagadheeraj Rottela else 727f008628aSNagadheeraj Rottela instr->w0.ef = 0; 728f008628aSNagadheeraj Rottela 7296ea6bcddSNagadheeraj Rottela instr->w0.bf = xform->bf; 730f008628aSNagadheeraj Rottela instr->w0.co = xform->op; 731f008628aSNagadheeraj Rottela if (sr->dst.filled_sgls > 1) 732f008628aSNagadheeraj Rottela instr->w0.ds = 1; 733f008628aSNagadheeraj Rottela else 734f008628aSNagadheeraj Rottela instr->w0.ds = 0; 735f008628aSNagadheeraj Rottela 736f008628aSNagadheeraj Rottela if (sr->src.filled_sgls > 1) 737f008628aSNagadheeraj Rottela instr->w0.dg = 1; 738f008628aSNagadheeraj Rottela else 739f008628aSNagadheeraj Rottela instr->w0.dg = 0; 740f008628aSNagadheeraj Rottela 741f008628aSNagadheeraj Rottela instr->w0.hg = 0; 742f008628aSNagadheeraj Rottela 743f008628aSNagadheeraj Rottela /* word 1 */ 7446ea6bcddSNagadheeraj Rottela instr->w1.hl = xform->hlen; 7456ea6bcddSNagadheeraj Rottela if (sr->op->op_type == RTE_COMP_OP_STATEFUL && !xform->bf) 7466ea6bcddSNagadheeraj Rottela instr->w1.adlercrc32 = xform->chksum; 7476ea6bcddSNagadheeraj Rottela else if (sr->op->op_type == RTE_COMP_OP_STATELESS && 7486ea6bcddSNagadheeraj Rottela sr->op->input_chksum != 0) 749f008628aSNagadheeraj Rottela instr->w1.adlercrc32 = sr->op->input_chksum; 750f008628aSNagadheeraj Rottela else if (xform->chksum_type == NITROX_CHKSUM_TYPE_ADLER32) 751f008628aSNagadheeraj Rottela instr->w1.adlercrc32 = 1; 752f008628aSNagadheeraj Rottela else if (xform->chksum_type == NITROX_CHKSUM_TYPE_CRC32) 753f008628aSNagadheeraj Rottela instr->w1.adlercrc32 = 0; 754f008628aSNagadheeraj Rottela 755f008628aSNagadheeraj Rottela /* word 2 */ 7566ea6bcddSNagadheeraj Rottela if (xform->context) 7576ea6bcddSNagadheeraj Rottela zip_addr.u64 = rte_malloc_virt2iova(xform->context); 7586ea6bcddSNagadheeraj Rottela else 7596ea6bcddSNagadheeraj Rottela zip_addr.u64 = 0; 7606ea6bcddSNagadheeraj Rottela 7616ea6bcddSNagadheeraj Rottela instr->w2.cptr = zip_addr.zda.addr; 7626ea6bcddSNagadheeraj Rottela cptr_msb = zip_addr.zda.addr_msb; 763f008628aSNagadheeraj Rottela 764f008628aSNagadheeraj Rottela /* word 3 */ 7656ea6bcddSNagadheeraj Rottela instr->w3.hlen = xform->hlen; 7666ea6bcddSNagadheeraj Rottela if (xform->history_window) 7676ea6bcddSNagadheeraj Rottela zip_addr.u64 = rte_malloc_virt2iova(xform->history_window); 7686ea6bcddSNagadheeraj Rottela else 7696ea6bcddSNagadheeraj Rottela zip_addr.u64 = 0; 7706ea6bcddSNagadheeraj Rottela 7716ea6bcddSNagadheeraj Rottela instr->w3.hptr = zip_addr.zda.addr; 7726ea6bcddSNagadheeraj Rottela hptr_msb = zip_addr.zda.addr_msb; 773f008628aSNagadheeraj Rottela 774f008628aSNagadheeraj Rottela /* word 4 */ 775f008628aSNagadheeraj Rottela if (sr->src.filled_sgls == 1) { 776f008628aSNagadheeraj Rottela instr->w4.ilen = sr->src.sgl[0].s.length; 777f008628aSNagadheeraj Rottela instr->w4.iptr = sr->src.sgl[0].s.addr; 778f008628aSNagadheeraj Rottela iptr_msb = sr->src.addr_msb; 779f008628aSNagadheeraj Rottela } else { 780f008628aSNagadheeraj Rottela zip_addr.u64 = rte_malloc_virt2iova(sr->src.sgl); 781f008628aSNagadheeraj Rottela instr->w4.ilen = sr->src.filled_sgls; 782f008628aSNagadheeraj Rottela instr->w4.iptr = zip_addr.zda.addr; 783f008628aSNagadheeraj Rottela iptr_msb = zip_addr.zda.addr_msb; 784f008628aSNagadheeraj Rottela } 785f008628aSNagadheeraj Rottela 786f008628aSNagadheeraj Rottela /* word 5 */ 787f008628aSNagadheeraj Rottela if (sr->dst.filled_sgls == 1) { 788f008628aSNagadheeraj Rottela instr->w5.olen = sr->dst.sgl[0].s.length; 789f008628aSNagadheeraj Rottela instr->w5.optr = sr->dst.sgl[0].s.addr; 790f008628aSNagadheeraj Rottela optr_msb = sr->dst.addr_msb; 791f008628aSNagadheeraj Rottela } else { 792f008628aSNagadheeraj Rottela zip_addr.u64 = rte_malloc_virt2iova(sr->dst.sgl); 793f008628aSNagadheeraj Rottela instr->w5.olen = sr->dst.filled_sgls; 794f008628aSNagadheeraj Rottela instr->w5.optr = zip_addr.zda.addr; 795f008628aSNagadheeraj Rottela optr_msb = zip_addr.zda.addr_msb; 796f008628aSNagadheeraj Rottela } 797f008628aSNagadheeraj Rottela 798f008628aSNagadheeraj Rottela /* word 6 */ 799f008628aSNagadheeraj Rottela memset(&sr->zip_res, 0, sizeof(sr->zip_res)); 800f008628aSNagadheeraj Rottela zip_addr.u64 = rte_mempool_virt2iova(sr) + 801f008628aSNagadheeraj Rottela offsetof(struct nitrox_softreq, zip_res); 802f008628aSNagadheeraj Rottela instr->w6.rptr = zip_addr.zda.addr; 803f008628aSNagadheeraj Rottela rptr_msb = zip_addr.zda.addr_msb; 804f008628aSNagadheeraj Rottela 8056ea6bcddSNagadheeraj Rottela if (unlikely(iptr_msb != optr_msb || iptr_msb != rptr_msb || 8066ea6bcddSNagadheeraj Rottela (xform->history_window && (iptr_msb != hptr_msb)) || 8076ea6bcddSNagadheeraj Rottela (xform->context && (iptr_msb != cptr_msb)))) { 808*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "addr_msb is not same for all addresses"); 809f008628aSNagadheeraj Rottela return -ENOTSUP; 810f008628aSNagadheeraj Rottela } 811f008628aSNagadheeraj Rottela 812f008628aSNagadheeraj Rottela /* word 7 */ 813f008628aSNagadheeraj Rottela instr->w7.addr_msb = iptr_msb; 814f008628aSNagadheeraj Rottela instr->w7.grp = 0; 815f008628aSNagadheeraj Rottela 8166ea6bcddSNagadheeraj Rottela nitrox_dump_zip_instr(instr, NULL, sr->src.sgl, sr->dst.sgl); 8176ea6bcddSNagadheeraj Rottela nitrox_dump_databuf("IN", sr->op->m_src, sr->op->src.offset, 8186ea6bcddSNagadheeraj Rottela sr->op->src.length); 819f008628aSNagadheeraj Rottela nitrox_zip_instr_to_b64(sr); 820f008628aSNagadheeraj Rottela return 0; 821f008628aSNagadheeraj Rottela } 822f008628aSNagadheeraj Rottela 823f008628aSNagadheeraj Rottela int 824f008628aSNagadheeraj Rottela nitrox_process_comp_req(struct rte_comp_op *op, struct nitrox_softreq *sr) 825f008628aSNagadheeraj Rottela { 826f008628aSNagadheeraj Rottela int err; 827f008628aSNagadheeraj Rottela 828f008628aSNagadheeraj Rottela sr->op = op; 8296ea6bcddSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED; 830f008628aSNagadheeraj Rottela err = process_zip_request(sr); 831f008628aSNagadheeraj Rottela if (unlikely(err)) 832f008628aSNagadheeraj Rottela goto err_exit; 833f008628aSNagadheeraj Rottela 834f008628aSNagadheeraj Rottela sr->timeout = rte_get_timer_cycles() + CMD_TIMEOUT * rte_get_timer_hz(); 835f008628aSNagadheeraj Rottela return 0; 836f008628aSNagadheeraj Rottela err_exit: 837f008628aSNagadheeraj Rottela if (err == -ENOMEM) 838f008628aSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_ERROR; 839f008628aSNagadheeraj Rottela else 840f008628aSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; 841f008628aSNagadheeraj Rottela 842f008628aSNagadheeraj Rottela return err; 843f008628aSNagadheeraj Rottela } 844f008628aSNagadheeraj Rottela 845f008628aSNagadheeraj Rottela static struct nitrox_zip_result zip_result_to_cpu64(struct nitrox_zip_result *r) 846f008628aSNagadheeraj Rottela { 847f008628aSNagadheeraj Rottela struct nitrox_zip_result out_res; 848f008628aSNagadheeraj Rottela 849f008628aSNagadheeraj Rottela out_res.w2.u64 = rte_be_to_cpu_64(r->w2.u64); 850f008628aSNagadheeraj Rottela out_res.w1.u64 = rte_be_to_cpu_64(r->w1.u64); 851f008628aSNagadheeraj Rottela out_res.w0.u64 = rte_be_to_cpu_64(r->w0.u64); 852f008628aSNagadheeraj Rottela return out_res; 853f008628aSNagadheeraj Rottela } 854f008628aSNagadheeraj Rottela 8556ea6bcddSNagadheeraj Rottela static int post_process_zip_stateless(struct nitrox_softreq *sr, 8566ea6bcddSNagadheeraj Rottela struct nitrox_comp_xform *xform, 8576ea6bcddSNagadheeraj Rottela struct nitrox_zip_result *zip_res) 8586ea6bcddSNagadheeraj Rottela { 8596ea6bcddSNagadheeraj Rottela int output_unused_bytes; 8606ea6bcddSNagadheeraj Rottela 8616ea6bcddSNagadheeraj Rottela if (unlikely(zip_res->w2.compcode != NITROX_CC_SUCCESS)) { 8626ea6bcddSNagadheeraj Rottela struct rte_comp_op *op = sr->op; 8636ea6bcddSNagadheeraj Rottela 864*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Dequeue error 0x%x", 8656ea6bcddSNagadheeraj Rottela zip_res->w2.compcode); 8666ea6bcddSNagadheeraj Rottela if (zip_res->w2.compcode == NITROX_CC_STOP || 8676ea6bcddSNagadheeraj Rottela zip_res->w2.compcode == NITROX_CC_DTRUNC) 8686ea6bcddSNagadheeraj Rottela op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; 8696ea6bcddSNagadheeraj Rottela else 8706ea6bcddSNagadheeraj Rottela op->status = RTE_COMP_OP_STATUS_ERROR; 8716ea6bcddSNagadheeraj Rottela 8726ea6bcddSNagadheeraj Rottela op->consumed = 0; 8736ea6bcddSNagadheeraj Rottela op->produced = 0; 8746ea6bcddSNagadheeraj Rottela return -EFAULT; 8756ea6bcddSNagadheeraj Rottela } 8766ea6bcddSNagadheeraj Rottela 8776ea6bcddSNagadheeraj Rottela output_unused_bytes = sr->dst.total_bytes - zip_res->w1.tbyteswritten; 8786ea6bcddSNagadheeraj Rottela if (unlikely(xform->op == NITROX_COMP_OP_DECOMPRESS && 8796ea6bcddSNagadheeraj Rottela output_unused_bytes < NITROX_ZIP_MAX_ONFSIZE)) { 880*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "TOL %d, Total bytes written %d", 8816ea6bcddSNagadheeraj Rottela sr->dst.total_bytes, zip_res->w1.tbyteswritten); 8826ea6bcddSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; 8836ea6bcddSNagadheeraj Rottela sr->op->consumed = 0; 8846ea6bcddSNagadheeraj Rottela sr->op->produced = sr->dst.total_bytes - NITROX_ZIP_MAX_ONFSIZE; 8856ea6bcddSNagadheeraj Rottela return -EIO; 8866ea6bcddSNagadheeraj Rottela } 8876ea6bcddSNagadheeraj Rottela 8886ea6bcddSNagadheeraj Rottela if (xform->chksum_type == NITROX_CHKSUM_TYPE_CRC32) 8896ea6bcddSNagadheeraj Rottela sr->op->output_chksum = zip_res->w0.crc32; 8906ea6bcddSNagadheeraj Rottela else if (xform->chksum_type == NITROX_CHKSUM_TYPE_ADLER32) 8916ea6bcddSNagadheeraj Rottela sr->op->output_chksum = zip_res->w0.adler32; 8926ea6bcddSNagadheeraj Rottela 8936ea6bcddSNagadheeraj Rottela sr->op->consumed = RTE_MIN(sr->op->src.length, 8946ea6bcddSNagadheeraj Rottela (uint32_t)zip_res->w1.tbytesread); 8956ea6bcddSNagadheeraj Rottela sr->op->produced = zip_res->w1.tbyteswritten; 8966ea6bcddSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_SUCCESS; 8976ea6bcddSNagadheeraj Rottela return 0; 8986ea6bcddSNagadheeraj Rottela } 8996ea6bcddSNagadheeraj Rottela 9006ea6bcddSNagadheeraj Rottela static int update_history(struct rte_mbuf *mbuf, uint32_t off, uint16_t datalen, 9016ea6bcddSNagadheeraj Rottela uint8_t *dst) 9026ea6bcddSNagadheeraj Rottela { 9036ea6bcddSNagadheeraj Rottela struct rte_mbuf *m; 9046ea6bcddSNagadheeraj Rottela uint32_t mlen; 9056ea6bcddSNagadheeraj Rottela uint16_t copied = 0; 9066ea6bcddSNagadheeraj Rottela 9076ea6bcddSNagadheeraj Rottela for (m = mbuf; m && off > rte_pktmbuf_data_len(m); m = m->next) 9086ea6bcddSNagadheeraj Rottela off -= rte_pktmbuf_data_len(m); 9096ea6bcddSNagadheeraj Rottela 9106ea6bcddSNagadheeraj Rottela if (unlikely(!m)) { 911*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Failed to update history. Invalid mbuf"); 9126ea6bcddSNagadheeraj Rottela return -EINVAL; 9136ea6bcddSNagadheeraj Rottela } 9146ea6bcddSNagadheeraj Rottela 9156ea6bcddSNagadheeraj Rottela mlen = rte_pktmbuf_data_len(m) - off; 9166ea6bcddSNagadheeraj Rottela if (datalen <= mlen) 9176ea6bcddSNagadheeraj Rottela mlen = datalen; 9186ea6bcddSNagadheeraj Rottela 9196ea6bcddSNagadheeraj Rottela memcpy(&dst[copied], rte_pktmbuf_mtod_offset(m, char *, off), mlen); 9206ea6bcddSNagadheeraj Rottela copied += mlen; 9216ea6bcddSNagadheeraj Rottela datalen -= mlen; 9226ea6bcddSNagadheeraj Rottela for (m = m->next; m && datalen; m = m->next) { 9236ea6bcddSNagadheeraj Rottela mlen = rte_pktmbuf_data_len(m) < datalen ? 9246ea6bcddSNagadheeraj Rottela rte_pktmbuf_data_len(m) : datalen; 9256ea6bcddSNagadheeraj Rottela memcpy(&dst[copied], rte_pktmbuf_mtod(m, char *), mlen); 9266ea6bcddSNagadheeraj Rottela copied += mlen; 9276ea6bcddSNagadheeraj Rottela datalen -= mlen; 9286ea6bcddSNagadheeraj Rottela } 9296ea6bcddSNagadheeraj Rottela 9306ea6bcddSNagadheeraj Rottela if (unlikely(datalen != 0)) { 931*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Failed to update history. Invalid datalen"); 9326ea6bcddSNagadheeraj Rottela return -EINVAL; 9336ea6bcddSNagadheeraj Rottela } 9346ea6bcddSNagadheeraj Rottela 9356ea6bcddSNagadheeraj Rottela return 0; 9366ea6bcddSNagadheeraj Rottela } 9376ea6bcddSNagadheeraj Rottela 9386ea6bcddSNagadheeraj Rottela static void reset_nitrox_xform(struct nitrox_comp_xform *xform) 9396ea6bcddSNagadheeraj Rottela { 9406ea6bcddSNagadheeraj Rottela xform->hlen = 0; 9416ea6bcddSNagadheeraj Rottela xform->exn = 0; 9426ea6bcddSNagadheeraj Rottela xform->exbits = 0; 9436ea6bcddSNagadheeraj Rottela xform->bf = true; 9446ea6bcddSNagadheeraj Rottela } 9456ea6bcddSNagadheeraj Rottela 9466ea6bcddSNagadheeraj Rottela static int post_process_zip_stateful(struct nitrox_softreq *sr, 9476ea6bcddSNagadheeraj Rottela struct nitrox_comp_xform *xform, 9486ea6bcddSNagadheeraj Rottela struct nitrox_zip_result *zip_res) 9496ea6bcddSNagadheeraj Rottela { 9506ea6bcddSNagadheeraj Rottela uint32_t bytesread = 0; 9516ea6bcddSNagadheeraj Rottela uint32_t chksum = 0; 9526ea6bcddSNagadheeraj Rottela 9536ea6bcddSNagadheeraj Rottela if (unlikely(zip_res->w2.compcode == NITROX_CC_DTRUNC)) { 9546ea6bcddSNagadheeraj Rottela sr->op->consumed = 0; 9556ea6bcddSNagadheeraj Rottela sr->op->produced = 0; 9566ea6bcddSNagadheeraj Rottela xform->hlen = 0; 9576ea6bcddSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE; 958*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Dequeue compress DTRUNC error"); 9596ea6bcddSNagadheeraj Rottela return 0; 9606ea6bcddSNagadheeraj Rottela } else if (unlikely(zip_res->w2.compcode == NITROX_CC_STOP)) { 9616ea6bcddSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE; 962*e99981afSDavid Marchand NITROX_LOG_LINE(NOTICE, "Dequeue decompress dynamic STOP"); 9636ea6bcddSNagadheeraj Rottela } else if (zip_res->w2.compcode == NITROX_CC_SUCCESS) { 9646ea6bcddSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_SUCCESS; 9656ea6bcddSNagadheeraj Rottela } else { 9666ea6bcddSNagadheeraj Rottela xform->hlen = 0; 9676ea6bcddSNagadheeraj Rottela xform->exn = 0; 9686ea6bcddSNagadheeraj Rottela xform->exbits = 0; 9696ea6bcddSNagadheeraj Rottela xform->bf = true; 9706ea6bcddSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_ERROR; 971*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Dequeue error 0x%x", 9726ea6bcddSNagadheeraj Rottela zip_res->w2.compcode); 9736ea6bcddSNagadheeraj Rottela return -EFAULT; 9746ea6bcddSNagadheeraj Rottela } 9756ea6bcddSNagadheeraj Rottela 9766ea6bcddSNagadheeraj Rottela if (xform->op == NITROX_COMP_OP_COMPRESS) { 9776ea6bcddSNagadheeraj Rottela if (zip_res->w1.tbytesread < xform->hlen) { 978*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Invalid bytesread"); 9796ea6bcddSNagadheeraj Rottela reset_nitrox_xform(xform); 9806ea6bcddSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_ERROR; 9816ea6bcddSNagadheeraj Rottela return -EFAULT; 9826ea6bcddSNagadheeraj Rottela } 9836ea6bcddSNagadheeraj Rottela 9846ea6bcddSNagadheeraj Rottela bytesread = zip_res->w1.tbytesread - xform->hlen; 9856ea6bcddSNagadheeraj Rottela } else { 9866ea6bcddSNagadheeraj Rottela bytesread = RTE_MIN(sr->op->src.length, 9876ea6bcddSNagadheeraj Rottela (uint32_t)zip_res->w1.tbytesread); 9886ea6bcddSNagadheeraj Rottela } 9896ea6bcddSNagadheeraj Rottela 9906ea6bcddSNagadheeraj Rottela if ((xform->op == NITROX_COMP_OP_COMPRESS && 9916ea6bcddSNagadheeraj Rottela (sr->op->flush_flag == RTE_COMP_FLUSH_NONE || 9926ea6bcddSNagadheeraj Rottela sr->op->flush_flag == RTE_COMP_FLUSH_SYNC)) || 9936ea6bcddSNagadheeraj Rottela (xform->op == NITROX_COMP_OP_DECOMPRESS && !zip_res->w2.ef)) { 9946ea6bcddSNagadheeraj Rottela struct rte_mbuf *mbuf; 9956ea6bcddSNagadheeraj Rottela uint32_t pktlen, m_off; 9966ea6bcddSNagadheeraj Rottela int err; 9976ea6bcddSNagadheeraj Rottela 9986ea6bcddSNagadheeraj Rottela if (xform->op == NITROX_COMP_OP_COMPRESS) { 9996ea6bcddSNagadheeraj Rottela mbuf = sr->op->m_src; 10006ea6bcddSNagadheeraj Rottela pktlen = bytesread; 10016ea6bcddSNagadheeraj Rottela m_off = sr->op->src.offset; 10026ea6bcddSNagadheeraj Rottela } else { 10036ea6bcddSNagadheeraj Rottela mbuf = sr->op->m_dst; 10046ea6bcddSNagadheeraj Rottela pktlen = zip_res->w1.tbyteswritten; 10056ea6bcddSNagadheeraj Rottela m_off = sr->op->dst.offset; 10066ea6bcddSNagadheeraj Rottela } 10076ea6bcddSNagadheeraj Rottela 10086ea6bcddSNagadheeraj Rottela if (pktlen >= xform->window_size) { 10096ea6bcddSNagadheeraj Rottela m_off += pktlen - xform->window_size; 10106ea6bcddSNagadheeraj Rottela err = update_history(mbuf, m_off, xform->window_size, 10116ea6bcddSNagadheeraj Rottela xform->history_window); 10126ea6bcddSNagadheeraj Rottela xform->hlen = xform->window_size; 10136ea6bcddSNagadheeraj Rottela } else if ((xform->hlen + pktlen) <= xform->window_size) { 10146ea6bcddSNagadheeraj Rottela err = update_history(mbuf, m_off, pktlen, 10156ea6bcddSNagadheeraj Rottela &xform->history_window[xform->hlen]); 10166ea6bcddSNagadheeraj Rottela xform->hlen += pktlen; 10176ea6bcddSNagadheeraj Rottela } else { 10186ea6bcddSNagadheeraj Rottela uint16_t shift_off, shift_len; 10196ea6bcddSNagadheeraj Rottela 10206ea6bcddSNagadheeraj Rottela shift_off = pktlen + xform->hlen - xform->window_size; 10216ea6bcddSNagadheeraj Rottela shift_len = xform->hlen - shift_off; 10226ea6bcddSNagadheeraj Rottela memmove(xform->history_window, 10236ea6bcddSNagadheeraj Rottela &xform->history_window[shift_off], 10246ea6bcddSNagadheeraj Rottela shift_len); 10256ea6bcddSNagadheeraj Rottela err = update_history(mbuf, m_off, pktlen, 10266ea6bcddSNagadheeraj Rottela &xform->history_window[shift_len]); 10276ea6bcddSNagadheeraj Rottela xform->hlen = xform->window_size; 10286ea6bcddSNagadheeraj Rottela 10296ea6bcddSNagadheeraj Rottela } 10306ea6bcddSNagadheeraj Rottela 10316ea6bcddSNagadheeraj Rottela if (unlikely(err)) { 10326ea6bcddSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_ERROR; 10336ea6bcddSNagadheeraj Rottela return err; 10346ea6bcddSNagadheeraj Rottela } 10356ea6bcddSNagadheeraj Rottela 10366ea6bcddSNagadheeraj Rottela if (xform->op == NITROX_COMP_OP_COMPRESS) { 10376ea6bcddSNagadheeraj Rottela xform->exn = zip_res->w2.exn; 10386ea6bcddSNagadheeraj Rottela xform->exbits = zip_res->w2.exbits; 10396ea6bcddSNagadheeraj Rottela } 10406ea6bcddSNagadheeraj Rottela 10416ea6bcddSNagadheeraj Rottela xform->bf = false; 10426ea6bcddSNagadheeraj Rottela } else { 10436ea6bcddSNagadheeraj Rottela reset_nitrox_xform(xform); 10446ea6bcddSNagadheeraj Rottela } 10456ea6bcddSNagadheeraj Rottela 10466ea6bcddSNagadheeraj Rottela if (xform->chksum_type == NITROX_CHKSUM_TYPE_CRC32) 10476ea6bcddSNagadheeraj Rottela chksum = zip_res->w0.crc32; 10486ea6bcddSNagadheeraj Rottela else if (xform->chksum_type == NITROX_CHKSUM_TYPE_ADLER32) 10496ea6bcddSNagadheeraj Rottela chksum = zip_res->w0.adler32; 10506ea6bcddSNagadheeraj Rottela 10516ea6bcddSNagadheeraj Rottela if (xform->bf) 10526ea6bcddSNagadheeraj Rottela sr->op->output_chksum = chksum; 10536ea6bcddSNagadheeraj Rottela else 10546ea6bcddSNagadheeraj Rottela xform->chksum = chksum; 10556ea6bcddSNagadheeraj Rottela 10566ea6bcddSNagadheeraj Rottela sr->op->consumed = bytesread; 10576ea6bcddSNagadheeraj Rottela sr->op->produced = zip_res->w1.tbyteswritten; 10586ea6bcddSNagadheeraj Rottela return 0; 10596ea6bcddSNagadheeraj Rottela } 10606ea6bcddSNagadheeraj Rottela 1061f008628aSNagadheeraj Rottela int 1062f008628aSNagadheeraj Rottela nitrox_check_comp_req(struct nitrox_softreq *sr, struct rte_comp_op **op) 1063f008628aSNagadheeraj Rottela { 1064f008628aSNagadheeraj Rottela struct nitrox_zip_result zip_res; 10656ea6bcddSNagadheeraj Rottela struct nitrox_comp_xform *xform; 1066f008628aSNagadheeraj Rottela int err = 0; 1067f008628aSNagadheeraj Rottela 1068f008628aSNagadheeraj Rottela zip_res = zip_result_to_cpu64(&sr->zip_res); 1069f008628aSNagadheeraj Rottela if (zip_res.w2.compcode == NITROX_CC_NOTDONE) { 1070f008628aSNagadheeraj Rottela if (rte_get_timer_cycles() >= sr->timeout) { 1071*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Op timedout"); 1072f008628aSNagadheeraj Rottela sr->op->status = RTE_COMP_OP_STATUS_ERROR; 1073f008628aSNagadheeraj Rottela err = -ETIMEDOUT; 1074f008628aSNagadheeraj Rottela goto exit; 1075f008628aSNagadheeraj Rottela } else { 1076f008628aSNagadheeraj Rottela return -EAGAIN; 1077f008628aSNagadheeraj Rottela } 1078f008628aSNagadheeraj Rottela } 1079f008628aSNagadheeraj Rottela 10806ea6bcddSNagadheeraj Rottela xform = sr->op->private_xform; 10816ea6bcddSNagadheeraj Rottela if (sr->op->op_type == RTE_COMP_OP_STATELESS) 10826ea6bcddSNagadheeraj Rottela err = post_process_zip_stateless(sr, xform, &zip_res); 1083f008628aSNagadheeraj Rottela else 10846ea6bcddSNagadheeraj Rottela err = post_process_zip_stateful(sr, xform, &zip_res); 1085f008628aSNagadheeraj Rottela 10866ea6bcddSNagadheeraj Rottela if (sr->op->status == RTE_COMP_OP_STATUS_SUCCESS && 10876ea6bcddSNagadheeraj Rottela xform->op == NITROX_COMP_OP_COMPRESS && 1088f008628aSNagadheeraj Rottela sr->op->flush_flag == RTE_COMP_FLUSH_FINAL && 1089f008628aSNagadheeraj Rottela zip_res.w2.exn) { 1090f008628aSNagadheeraj Rottela uint32_t datalen = zip_res.w1.tbyteswritten; 1091f008628aSNagadheeraj Rottela uint32_t off = sr->op->dst.offset; 1092f008628aSNagadheeraj Rottela struct rte_mbuf *m = sr->op->m_dst; 1093f008628aSNagadheeraj Rottela uint32_t mlen; 1094f008628aSNagadheeraj Rottela uint8_t *last_byte; 1095f008628aSNagadheeraj Rottela 1096f008628aSNagadheeraj Rottela for (; m && off > rte_pktmbuf_data_len(m); m = m->next) 1097f008628aSNagadheeraj Rottela off -= rte_pktmbuf_data_len(m); 1098f008628aSNagadheeraj Rottela 10991b47e7a5SNagadheeraj Rottela if (unlikely(m == NULL)) { 11001b47e7a5SNagadheeraj Rottela err = -EINVAL; 11011b47e7a5SNagadheeraj Rottela goto exit; 11021b47e7a5SNagadheeraj Rottela } 11031b47e7a5SNagadheeraj Rottela 1104f008628aSNagadheeraj Rottela mlen = rte_pktmbuf_data_len(m) - off; 1105f008628aSNagadheeraj Rottela for (; m && (datalen > mlen); m = m->next) 1106f008628aSNagadheeraj Rottela datalen -= mlen; 1107f008628aSNagadheeraj Rottela 11081b47e7a5SNagadheeraj Rottela if (unlikely(m == NULL)) { 11091b47e7a5SNagadheeraj Rottela err = -EINVAL; 11101b47e7a5SNagadheeraj Rottela goto exit; 11111b47e7a5SNagadheeraj Rottela } 11121b47e7a5SNagadheeraj Rottela 1113f008628aSNagadheeraj Rottela last_byte = rte_pktmbuf_mtod_offset(m, uint8_t *, datalen - 1); 1114f008628aSNagadheeraj Rottela *last_byte = zip_res.w2.exbits & 0xFF; 1115f008628aSNagadheeraj Rottela } 1116f008628aSNagadheeraj Rottela 1117f008628aSNagadheeraj Rottela exit: 1118f008628aSNagadheeraj Rottela *op = sr->op; 11196ea6bcddSNagadheeraj Rottela nitrox_dump_zip_result(&sr->instr, &zip_res); 11206ea6bcddSNagadheeraj Rottela nitrox_dump_databuf("OUT after", sr->op->m_dst, sr->op->dst.offset, 11216ea6bcddSNagadheeraj Rottela sr->op->produced); 1122f008628aSNagadheeraj Rottela return err; 1123f008628aSNagadheeraj Rottela } 1124f008628aSNagadheeraj Rottela 1125f008628aSNagadheeraj Rottela void * 1126f008628aSNagadheeraj Rottela nitrox_comp_instr_addr(struct nitrox_softreq *sr) 1127f008628aSNagadheeraj Rottela { 1128f008628aSNagadheeraj Rottela return &sr->instr; 1129f008628aSNagadheeraj Rottela } 1130f008628aSNagadheeraj Rottela 1131f008628aSNagadheeraj Rottela static void req_pool_obj_free(struct rte_mempool *mp, void *opaque, void *obj, 1132f008628aSNagadheeraj Rottela unsigned int obj_idx) 1133f008628aSNagadheeraj Rottela { 1134f008628aSNagadheeraj Rottela struct nitrox_softreq *sr; 1135f008628aSNagadheeraj Rottela 1136f008628aSNagadheeraj Rottela RTE_SET_USED(mp); 1137f008628aSNagadheeraj Rottela RTE_SET_USED(opaque); 1138f008628aSNagadheeraj Rottela RTE_SET_USED(obj_idx); 1139f008628aSNagadheeraj Rottela sr = obj; 1140f008628aSNagadheeraj Rottela rte_free(sr->src.sgl); 1141f008628aSNagadheeraj Rottela sr->src.sgl = NULL; 1142f008628aSNagadheeraj Rottela rte_free(sr->dst.sgl); 1143f008628aSNagadheeraj Rottela sr->dst.sgl = NULL; 1144f008628aSNagadheeraj Rottela } 1145f008628aSNagadheeraj Rottela 1146f008628aSNagadheeraj Rottela void 1147f008628aSNagadheeraj Rottela nitrox_comp_req_pool_free(struct rte_mempool *mp) 1148f008628aSNagadheeraj Rottela { 1149f008628aSNagadheeraj Rottela rte_mempool_obj_iter(mp, req_pool_obj_free, NULL); 1150f008628aSNagadheeraj Rottela rte_mempool_free(mp); 1151f008628aSNagadheeraj Rottela } 1152f008628aSNagadheeraj Rottela 1153f008628aSNagadheeraj Rottela static void req_pool_obj_init(struct rte_mempool *mp, void *arg, void *obj, 1154f008628aSNagadheeraj Rottela unsigned int obj_idx) 1155f008628aSNagadheeraj Rottela { 1156f008628aSNagadheeraj Rottela struct nitrox_softreq *sr; 1157f008628aSNagadheeraj Rottela int *err = arg; 1158f008628aSNagadheeraj Rottela 1159f008628aSNagadheeraj Rottela RTE_SET_USED(mp); 1160f008628aSNagadheeraj Rottela RTE_SET_USED(obj_idx); 1161f008628aSNagadheeraj Rottela sr = obj; 1162f008628aSNagadheeraj Rottela sr->src.sgl = rte_zmalloc_socket(NULL, 1163f008628aSNagadheeraj Rottela sizeof(*sr->src.sgl) * NITROX_ZIP_SGL_COUNT, 1164f008628aSNagadheeraj Rottela 8, mp->socket_id); 1165f008628aSNagadheeraj Rottela sr->dst.sgl = rte_zmalloc_socket(NULL, 1166f008628aSNagadheeraj Rottela sizeof(*sr->dst.sgl) * NITROX_ZIP_SGL_COUNT, 1167f008628aSNagadheeraj Rottela 8, mp->socket_id); 1168f008628aSNagadheeraj Rottela if (sr->src.sgl == NULL || sr->dst.sgl == NULL) { 1169*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Failed to allocate zip_sgl memory"); 1170f008628aSNagadheeraj Rottela *err = -ENOMEM; 1171f008628aSNagadheeraj Rottela } 1172f008628aSNagadheeraj Rottela 1173f008628aSNagadheeraj Rottela sr->src.nb_sgls = NITROX_ZIP_SGL_COUNT; 1174f008628aSNagadheeraj Rottela sr->src.filled_sgls = 0; 1175f008628aSNagadheeraj Rottela sr->dst.nb_sgls = NITROX_ZIP_SGL_COUNT; 1176f008628aSNagadheeraj Rottela sr->dst.filled_sgls = 0; 1177f008628aSNagadheeraj Rottela } 1178f008628aSNagadheeraj Rottela 1179f008628aSNagadheeraj Rottela struct rte_mempool * 1180f008628aSNagadheeraj Rottela nitrox_comp_req_pool_create(struct rte_compressdev *dev, uint32_t nobjs, 1181f008628aSNagadheeraj Rottela uint16_t qp_id, int socket_id) 1182f008628aSNagadheeraj Rottela { 1183f008628aSNagadheeraj Rottela char softreq_pool_name[RTE_RING_NAMESIZE]; 1184f008628aSNagadheeraj Rottela struct rte_mempool *mp; 1185f008628aSNagadheeraj Rottela int err = 0; 1186f008628aSNagadheeraj Rottela 1187f008628aSNagadheeraj Rottela snprintf(softreq_pool_name, RTE_RING_NAMESIZE, "%s_sr_%d", 1188f008628aSNagadheeraj Rottela dev->data->name, qp_id); 1189f008628aSNagadheeraj Rottela mp = rte_mempool_create(softreq_pool_name, 1190f008628aSNagadheeraj Rottela RTE_ALIGN_MUL_CEIL(nobjs, 64), 1191f008628aSNagadheeraj Rottela sizeof(struct nitrox_softreq), 1192f008628aSNagadheeraj Rottela 64, 0, NULL, NULL, req_pool_obj_init, &err, 1193f008628aSNagadheeraj Rottela socket_id, 0); 1194f008628aSNagadheeraj Rottela if (unlikely(!mp)) 1195*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Failed to create req pool, qid %d, err %d", 1196f008628aSNagadheeraj Rottela qp_id, rte_errno); 1197f008628aSNagadheeraj Rottela 1198f008628aSNagadheeraj Rottela if (unlikely(err)) { 1199f008628aSNagadheeraj Rottela nitrox_comp_req_pool_free(mp); 1200f008628aSNagadheeraj Rottela return NULL; 1201f008628aSNagadheeraj Rottela } 1202f008628aSNagadheeraj Rottela 1203f008628aSNagadheeraj Rottela return mp; 1204f008628aSNagadheeraj Rottela } 1205