1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017-2018 Intel Corporation
6 #include "rte_compressdev.h"
7 #include "rte_compressdev_internal.h"
9 const char * __rte_experimental
10 rte_comp_get_feature_name(uint64_t flag)
13 case RTE_COMP_FF_STATEFUL_COMPRESSION:
14 return "STATEFUL_COMPRESSION";
15 case RTE_COMP_FF_STATEFUL_DECOMPRESSION:
16 return "STATEFUL_DECOMPRESSION";
17 case RTE_COMP_FF_OOP_SGL_IN_SGL_OUT:
18 return "OOP_SGL_IN_SGL_OUT";
19 case RTE_COMP_FF_OOP_SGL_IN_LB_OUT:
20 return "OOP_SGL_IN_LB_OUT";
21 case RTE_COMP_FF_OOP_LB_IN_SGL_OUT:
22 return "OOP_LB_IN_SGL_OUT";
23 case RTE_COMP_FF_MULTI_PKT_CHECKSUM:
24 return "MULTI_PKT_CHECKSUM";
25 case RTE_COMP_FF_ADLER32_CHECKSUM:
26 return "ADLER32_CHECKSUM";
27 case RTE_COMP_FF_CRC32_CHECKSUM:
28 return "CRC32_CHECKSUM";
29 case RTE_COMP_FF_CRC32_ADLER32_CHECKSUM:
30 return "CRC32_ADLER32_CHECKSUM";
31 case RTE_COMP_FF_NONCOMPRESSED_BLOCKS:
32 return "NONCOMPRESSED_BLOCKS";
33 case RTE_COMP_FF_SHA1_HASH:
35 case RTE_COMP_FF_SHA2_SHA256_HASH:
36 return "SHA2_SHA256_HASH";
37 case RTE_COMP_FF_SHAREABLE_PRIV_XFORM:
38 return "SHAREABLE_PRIV_XFORM";
45 * Reset the fields of an operation to their default values.
47 * @note The private data associated with the operation is not zeroed.
50 * The operation to be reset
53 rte_comp_op_reset(struct rte_comp_op *op)
55 struct rte_mempool *tmp_mp = op->mempool;
56 rte_iova_t tmp_iova_addr = op->iova_addr;
58 memset(op, 0, sizeof(struct rte_comp_op));
59 op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
60 op->iova_addr = tmp_iova_addr;
65 * Private data structure belonging to an operation pool.
67 struct rte_comp_op_pool_private {
69 /**< Size of private user data with each operation. */
73 * Bulk allocate raw element from mempool and return as comp operations
76 * Compress operation mempool
78 * Array to place allocated operations
80 * Number of operations to allocate
83 * - -ENOENT: Not enough entries in the mempool; no ops are retrieved.
86 rte_comp_op_raw_bulk_alloc(struct rte_mempool *mempool,
87 struct rte_comp_op **ops, uint16_t nb_ops)
89 if (rte_mempool_get_bulk(mempool, (void **)ops, nb_ops) == 0)
95 /** Initialise rte_comp_op mempool element */
97 rte_comp_op_init(struct rte_mempool *mempool,
98 __rte_unused void *opaque_arg,
100 __rte_unused unsigned int i)
102 struct rte_comp_op *op = _op_data;
104 memset(_op_data, 0, mempool->elt_size);
106 op->status = RTE_COMP_OP_STATUS_NOT_PROCESSED;
107 op->iova_addr = rte_mem_virt2iova(_op_data);
108 op->mempool = mempool;
111 struct rte_mempool * __rte_experimental
112 rte_comp_op_pool_create(const char *name,
113 unsigned int nb_elts, unsigned int cache_size,
114 uint16_t user_size, int socket_id)
116 struct rte_comp_op_pool_private *priv;
118 unsigned int elt_size = sizeof(struct rte_comp_op) + user_size;
120 /* lookup mempool in case already allocated */
121 struct rte_mempool *mp = rte_mempool_lookup(name);
124 priv = (struct rte_comp_op_pool_private *)
125 rte_mempool_get_priv(mp);
127 if (mp->elt_size != elt_size ||
128 mp->cache_size < cache_size ||
129 mp->size < nb_elts ||
130 priv->user_size < user_size) {
133 "Mempool %s already exists but with incompatible parameters",
140 mp = rte_mempool_create(
145 sizeof(struct rte_comp_op_pool_private),
154 COMPRESSDEV_LOG(ERR, "Failed to create mempool %s", name);
158 priv = (struct rte_comp_op_pool_private *)
159 rte_mempool_get_priv(mp);
161 priv->user_size = user_size;
166 struct rte_comp_op * __rte_experimental
167 rte_comp_op_alloc(struct rte_mempool *mempool)
169 struct rte_comp_op *op = NULL;
172 retval = rte_comp_op_raw_bulk_alloc(mempool, &op, 1);
173 if (unlikely(retval < 0))
176 rte_comp_op_reset(op);
181 int __rte_experimental
182 rte_comp_op_bulk_alloc(struct rte_mempool *mempool,
183 struct rte_comp_op **ops, uint16_t nb_ops)
188 ret = rte_comp_op_raw_bulk_alloc(mempool, ops, nb_ops);
189 if (unlikely(ret < nb_ops))
192 for (i = 0; i < nb_ops; i++)
193 rte_comp_op_reset(ops[i]);
199 * free operation structure
200 * If operation has been allocate from a rte_mempool, then the operation will
201 * be returned to the mempool.
206 void __rte_experimental
207 rte_comp_op_free(struct rte_comp_op *op)
209 if (op != NULL && op->mempool != NULL)
210 rte_mempool_put(op->mempool, op);