1d66269c0SZhangfei Gao /* SPDX-License-Identifier: BSD-3-Clause
2d66269c0SZhangfei Gao * Copyright 2024-2025 Huawei Technologies Co.,Ltd. All rights reserved.
3d66269c0SZhangfei Gao * Copyright 2024-2025 Linaro ltd.
4d66269c0SZhangfei Gao */
5d66269c0SZhangfei Gao
6d66269c0SZhangfei Gao #include <bus_vdev_driver.h>
7d66269c0SZhangfei Gao #include <rte_compressdev_pmd.h>
8d66269c0SZhangfei Gao #include <rte_malloc.h>
9d66269c0SZhangfei Gao
10d66269c0SZhangfei Gao #include <uadk/wd_comp.h>
11d66269c0SZhangfei Gao #include <uadk/wd_sched.h>
12d66269c0SZhangfei Gao
13d66269c0SZhangfei Gao #include "uadk_compress_pmd_private.h"
14d66269c0SZhangfei Gao
1596df3648SZhangfei Gao static const struct
1696df3648SZhangfei Gao rte_compressdev_capabilities uadk_compress_pmd_capabilities[] = {
1796df3648SZhangfei Gao { /* Deflate */
1896df3648SZhangfei Gao .algo = RTE_COMP_ALGO_DEFLATE,
1996df3648SZhangfei Gao .comp_feature_flags = RTE_COMP_FF_SHAREABLE_PRIV_XFORM |
2096df3648SZhangfei Gao RTE_COMP_FF_HUFFMAN_FIXED |
2196df3648SZhangfei Gao RTE_COMP_FF_HUFFMAN_DYNAMIC,
2296df3648SZhangfei Gao },
2396df3648SZhangfei Gao
2496df3648SZhangfei Gao RTE_COMP_END_OF_CAPABILITIES_LIST()
2596df3648SZhangfei Gao };
2696df3648SZhangfei Gao
2796df3648SZhangfei Gao static int
uadk_compress_pmd_config(struct rte_compressdev * dev,struct rte_compressdev_config * config __rte_unused)2896df3648SZhangfei Gao uadk_compress_pmd_config(struct rte_compressdev *dev,
2996df3648SZhangfei Gao struct rte_compressdev_config *config __rte_unused)
3096df3648SZhangfei Gao {
3196df3648SZhangfei Gao struct uadk_compress_priv *priv = dev->data->dev_private;
3296df3648SZhangfei Gao int ret;
3396df3648SZhangfei Gao
3496df3648SZhangfei Gao if (!priv->env_init) {
3596df3648SZhangfei Gao ret = wd_comp_env_init(NULL);
3696df3648SZhangfei Gao if (ret < 0)
3796df3648SZhangfei Gao return -EINVAL;
3896df3648SZhangfei Gao priv->env_init = true;
3996df3648SZhangfei Gao }
4096df3648SZhangfei Gao
4196df3648SZhangfei Gao return 0;
4296df3648SZhangfei Gao }
4396df3648SZhangfei Gao
4496df3648SZhangfei Gao static int
uadk_compress_pmd_start(struct rte_compressdev * dev __rte_unused)4596df3648SZhangfei Gao uadk_compress_pmd_start(struct rte_compressdev *dev __rte_unused)
4696df3648SZhangfei Gao {
4796df3648SZhangfei Gao return 0;
4896df3648SZhangfei Gao }
4996df3648SZhangfei Gao
5096df3648SZhangfei Gao static void
uadk_compress_pmd_stop(struct rte_compressdev * dev __rte_unused)5196df3648SZhangfei Gao uadk_compress_pmd_stop(struct rte_compressdev *dev __rte_unused)
5296df3648SZhangfei Gao {
5396df3648SZhangfei Gao }
5496df3648SZhangfei Gao
5596df3648SZhangfei Gao static int
uadk_compress_pmd_close(struct rte_compressdev * dev)5696df3648SZhangfei Gao uadk_compress_pmd_close(struct rte_compressdev *dev)
5796df3648SZhangfei Gao {
5896df3648SZhangfei Gao struct uadk_compress_priv *priv = dev->data->dev_private;
5996df3648SZhangfei Gao
6096df3648SZhangfei Gao if (priv->env_init) {
6196df3648SZhangfei Gao wd_comp_env_uninit();
6296df3648SZhangfei Gao priv->env_init = false;
6396df3648SZhangfei Gao }
6496df3648SZhangfei Gao
6596df3648SZhangfei Gao return 0;
6696df3648SZhangfei Gao }
6796df3648SZhangfei Gao
6896df3648SZhangfei Gao static void
uadk_compress_pmd_stats_get(struct rte_compressdev * dev,struct rte_compressdev_stats * stats)6996df3648SZhangfei Gao uadk_compress_pmd_stats_get(struct rte_compressdev *dev,
7096df3648SZhangfei Gao struct rte_compressdev_stats *stats)
7196df3648SZhangfei Gao {
7296df3648SZhangfei Gao int qp_id;
7396df3648SZhangfei Gao
7496df3648SZhangfei Gao for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
7596df3648SZhangfei Gao struct uadk_compress_qp *qp = dev->data->queue_pairs[qp_id];
7696df3648SZhangfei Gao
7796df3648SZhangfei Gao stats->enqueued_count += qp->qp_stats.enqueued_count;
7896df3648SZhangfei Gao stats->dequeued_count += qp->qp_stats.dequeued_count;
7996df3648SZhangfei Gao stats->enqueue_err_count += qp->qp_stats.enqueue_err_count;
8096df3648SZhangfei Gao stats->dequeue_err_count += qp->qp_stats.dequeue_err_count;
8196df3648SZhangfei Gao }
8296df3648SZhangfei Gao }
8396df3648SZhangfei Gao
8496df3648SZhangfei Gao static void
uadk_compress_pmd_stats_reset(struct rte_compressdev * dev)8596df3648SZhangfei Gao uadk_compress_pmd_stats_reset(struct rte_compressdev *dev)
8696df3648SZhangfei Gao {
8796df3648SZhangfei Gao int qp_id;
8896df3648SZhangfei Gao
8996df3648SZhangfei Gao for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
9096df3648SZhangfei Gao struct uadk_compress_qp *qp = dev->data->queue_pairs[qp_id];
9196df3648SZhangfei Gao
9296df3648SZhangfei Gao memset(&qp->qp_stats, 0, sizeof(qp->qp_stats));
9396df3648SZhangfei Gao }
9496df3648SZhangfei Gao }
9596df3648SZhangfei Gao
9696df3648SZhangfei Gao static void
uadk_compress_pmd_info_get(struct rte_compressdev * dev,struct rte_compressdev_info * dev_info)9796df3648SZhangfei Gao uadk_compress_pmd_info_get(struct rte_compressdev *dev,
9896df3648SZhangfei Gao struct rte_compressdev_info *dev_info)
9996df3648SZhangfei Gao {
10096df3648SZhangfei Gao if (dev_info != NULL) {
10196df3648SZhangfei Gao dev_info->driver_name = dev->device->driver->name;
10296df3648SZhangfei Gao dev_info->feature_flags = dev->feature_flags;
10396df3648SZhangfei Gao dev_info->capabilities = uadk_compress_pmd_capabilities;
10496df3648SZhangfei Gao }
10596df3648SZhangfei Gao }
10696df3648SZhangfei Gao
10796df3648SZhangfei Gao static int
uadk_compress_pmd_qp_release(struct rte_compressdev * dev,uint16_t qp_id)10896df3648SZhangfei Gao uadk_compress_pmd_qp_release(struct rte_compressdev *dev, uint16_t qp_id)
10996df3648SZhangfei Gao {
11096df3648SZhangfei Gao struct uadk_compress_qp *qp = dev->data->queue_pairs[qp_id];
11196df3648SZhangfei Gao
11296df3648SZhangfei Gao if (qp != NULL) {
11396df3648SZhangfei Gao rte_ring_free(qp->processed_pkts);
11496df3648SZhangfei Gao rte_free(qp);
11596df3648SZhangfei Gao dev->data->queue_pairs[qp_id] = NULL;
11696df3648SZhangfei Gao }
11796df3648SZhangfei Gao
11896df3648SZhangfei Gao return 0;
11996df3648SZhangfei Gao }
12096df3648SZhangfei Gao
12196df3648SZhangfei Gao static int
uadk_pmd_qp_set_unique_name(struct rte_compressdev * dev,struct uadk_compress_qp * qp)12296df3648SZhangfei Gao uadk_pmd_qp_set_unique_name(struct rte_compressdev *dev,
12396df3648SZhangfei Gao struct uadk_compress_qp *qp)
12496df3648SZhangfei Gao {
12596df3648SZhangfei Gao unsigned int n = snprintf(qp->name, sizeof(qp->name),
12696df3648SZhangfei Gao "uadk_pmd_%u_qp_%u",
12796df3648SZhangfei Gao dev->data->dev_id, qp->id);
12896df3648SZhangfei Gao
12996df3648SZhangfei Gao if (n >= sizeof(qp->name))
13096df3648SZhangfei Gao return -EINVAL;
13196df3648SZhangfei Gao
13296df3648SZhangfei Gao return 0;
13396df3648SZhangfei Gao }
13496df3648SZhangfei Gao
13596df3648SZhangfei Gao static struct rte_ring *
uadk_pmd_qp_create_processed_pkts_ring(struct uadk_compress_qp * qp,unsigned int ring_size,int socket_id)13696df3648SZhangfei Gao uadk_pmd_qp_create_processed_pkts_ring(struct uadk_compress_qp *qp,
13796df3648SZhangfei Gao unsigned int ring_size, int socket_id)
13896df3648SZhangfei Gao {
13996df3648SZhangfei Gao struct rte_ring *r = qp->processed_pkts;
14096df3648SZhangfei Gao
14196df3648SZhangfei Gao if (r) {
14296df3648SZhangfei Gao if (rte_ring_get_size(r) >= ring_size) {
14396df3648SZhangfei Gao UADK_LOG(INFO, "Reusing existing ring %s for processed packets",
14496df3648SZhangfei Gao qp->name);
14596df3648SZhangfei Gao return r;
14696df3648SZhangfei Gao }
14796df3648SZhangfei Gao
14896df3648SZhangfei Gao UADK_LOG(ERR, "Unable to reuse existing ring %s for processed packets",
14996df3648SZhangfei Gao qp->name);
15096df3648SZhangfei Gao return NULL;
15196df3648SZhangfei Gao }
15296df3648SZhangfei Gao
15396df3648SZhangfei Gao return rte_ring_create(qp->name, ring_size, socket_id,
15496df3648SZhangfei Gao RING_F_EXACT_SZ);
15596df3648SZhangfei Gao }
15696df3648SZhangfei Gao
15796df3648SZhangfei Gao static int
uadk_compress_pmd_qp_setup(struct rte_compressdev * dev,uint16_t qp_id,uint32_t max_inflight_ops,int socket_id)15896df3648SZhangfei Gao uadk_compress_pmd_qp_setup(struct rte_compressdev *dev, uint16_t qp_id,
15996df3648SZhangfei Gao uint32_t max_inflight_ops, int socket_id)
16096df3648SZhangfei Gao {
16196df3648SZhangfei Gao struct uadk_compress_qp *qp = NULL;
16296df3648SZhangfei Gao
16396df3648SZhangfei Gao /* Free memory prior to re-allocation if needed. */
16496df3648SZhangfei Gao if (dev->data->queue_pairs[qp_id] != NULL)
16596df3648SZhangfei Gao uadk_compress_pmd_qp_release(dev, qp_id);
16696df3648SZhangfei Gao
16796df3648SZhangfei Gao /* Allocate the queue pair data structure. */
16896df3648SZhangfei Gao qp = rte_zmalloc_socket("uadk PMD Queue Pair", sizeof(*qp),
16996df3648SZhangfei Gao RTE_CACHE_LINE_SIZE, socket_id);
17096df3648SZhangfei Gao if (qp == NULL)
17196df3648SZhangfei Gao return (-ENOMEM);
17296df3648SZhangfei Gao
17396df3648SZhangfei Gao qp->id = qp_id;
17496df3648SZhangfei Gao dev->data->queue_pairs[qp_id] = qp;
17596df3648SZhangfei Gao
17696df3648SZhangfei Gao if (uadk_pmd_qp_set_unique_name(dev, qp))
17796df3648SZhangfei Gao goto qp_setup_cleanup;
17896df3648SZhangfei Gao
17996df3648SZhangfei Gao qp->processed_pkts = uadk_pmd_qp_create_processed_pkts_ring(qp,
18096df3648SZhangfei Gao max_inflight_ops, socket_id);
18196df3648SZhangfei Gao if (qp->processed_pkts == NULL)
18296df3648SZhangfei Gao goto qp_setup_cleanup;
18396df3648SZhangfei Gao
18496df3648SZhangfei Gao memset(&qp->qp_stats, 0, sizeof(qp->qp_stats));
18596df3648SZhangfei Gao
18696df3648SZhangfei Gao return 0;
18796df3648SZhangfei Gao
18896df3648SZhangfei Gao qp_setup_cleanup:
18996df3648SZhangfei Gao if (qp) {
19096df3648SZhangfei Gao rte_free(qp);
19196df3648SZhangfei Gao qp = NULL;
19296df3648SZhangfei Gao }
19396df3648SZhangfei Gao return -EINVAL;
19496df3648SZhangfei Gao }
19596df3648SZhangfei Gao
19696df3648SZhangfei Gao static int
uadk_compress_pmd_xform_create(struct rte_compressdev * dev __rte_unused,const struct rte_comp_xform * xform,void ** private_xform)19796df3648SZhangfei Gao uadk_compress_pmd_xform_create(struct rte_compressdev *dev __rte_unused,
19896df3648SZhangfei Gao const struct rte_comp_xform *xform,
19996df3648SZhangfei Gao void **private_xform)
20096df3648SZhangfei Gao {
20196df3648SZhangfei Gao struct wd_comp_sess_setup setup = {0};
20296df3648SZhangfei Gao struct sched_params param = {0};
20396df3648SZhangfei Gao struct uadk_compress_xform *xfrm;
20496df3648SZhangfei Gao handle_t handle;
20596df3648SZhangfei Gao
20696df3648SZhangfei Gao if (xform == NULL) {
20796df3648SZhangfei Gao UADK_LOG(ERR, "invalid xform struct");
20896df3648SZhangfei Gao return -EINVAL;
20996df3648SZhangfei Gao }
21096df3648SZhangfei Gao
21196df3648SZhangfei Gao xfrm = rte_malloc(NULL, sizeof(struct uadk_compress_xform), 0);
21296df3648SZhangfei Gao if (xfrm == NULL)
21396df3648SZhangfei Gao return -ENOMEM;
21496df3648SZhangfei Gao
21596df3648SZhangfei Gao switch (xform->type) {
21696df3648SZhangfei Gao case RTE_COMP_COMPRESS:
21796df3648SZhangfei Gao switch (xform->compress.algo) {
21896df3648SZhangfei Gao case RTE_COMP_ALGO_NULL:
21996df3648SZhangfei Gao break;
22096df3648SZhangfei Gao case RTE_COMP_ALGO_DEFLATE:
22196df3648SZhangfei Gao setup.alg_type = WD_DEFLATE;
22296df3648SZhangfei Gao setup.win_sz = WD_COMP_WS_8K;
22396df3648SZhangfei Gao setup.comp_lv = WD_COMP_L8;
22496df3648SZhangfei Gao setup.op_type = WD_DIR_COMPRESS;
22596df3648SZhangfei Gao param.type = setup.op_type;
22696df3648SZhangfei Gao param.numa_id = -1; /* choose nearby numa node */
22796df3648SZhangfei Gao setup.sched_param = ¶m;
22896df3648SZhangfei Gao break;
22996df3648SZhangfei Gao default:
23096df3648SZhangfei Gao goto err;
23196df3648SZhangfei Gao }
23296df3648SZhangfei Gao break;
23396df3648SZhangfei Gao case RTE_COMP_DECOMPRESS:
23496df3648SZhangfei Gao switch (xform->decompress.algo) {
23596df3648SZhangfei Gao case RTE_COMP_ALGO_NULL:
23696df3648SZhangfei Gao break;
23796df3648SZhangfei Gao case RTE_COMP_ALGO_DEFLATE:
23896df3648SZhangfei Gao setup.alg_type = WD_DEFLATE;
23996df3648SZhangfei Gao setup.comp_lv = WD_COMP_L8;
24096df3648SZhangfei Gao setup.op_type = WD_DIR_DECOMPRESS;
24196df3648SZhangfei Gao param.type = setup.op_type;
24296df3648SZhangfei Gao param.numa_id = -1; /* choose nearby numa node */
24396df3648SZhangfei Gao setup.sched_param = ¶m;
24496df3648SZhangfei Gao break;
24596df3648SZhangfei Gao default:
24696df3648SZhangfei Gao goto err;
24796df3648SZhangfei Gao }
24896df3648SZhangfei Gao break;
24996df3648SZhangfei Gao default:
25096df3648SZhangfei Gao UADK_LOG(ERR, "Algorithm %u is not supported.", xform->type);
25196df3648SZhangfei Gao goto err;
25296df3648SZhangfei Gao }
25396df3648SZhangfei Gao
25496df3648SZhangfei Gao handle = wd_comp_alloc_sess(&setup);
25596df3648SZhangfei Gao if (!handle)
25696df3648SZhangfei Gao goto err;
25796df3648SZhangfei Gao
25896df3648SZhangfei Gao xfrm->handle = handle;
25996df3648SZhangfei Gao xfrm->type = xform->type;
26096df3648SZhangfei Gao *private_xform = xfrm;
26196df3648SZhangfei Gao return 0;
26296df3648SZhangfei Gao
26396df3648SZhangfei Gao err:
26496df3648SZhangfei Gao rte_free(xfrm);
26596df3648SZhangfei Gao return -EINVAL;
26696df3648SZhangfei Gao }
26796df3648SZhangfei Gao
26896df3648SZhangfei Gao static int
uadk_compress_pmd_xform_free(struct rte_compressdev * dev __rte_unused,void * xform)26996df3648SZhangfei Gao uadk_compress_pmd_xform_free(struct rte_compressdev *dev __rte_unused, void *xform)
27096df3648SZhangfei Gao {
27196df3648SZhangfei Gao if (!xform)
27296df3648SZhangfei Gao return -EINVAL;
27396df3648SZhangfei Gao
27496df3648SZhangfei Gao wd_comp_free_sess(((struct uadk_compress_xform *)xform)->handle);
27596df3648SZhangfei Gao rte_free(xform);
27696df3648SZhangfei Gao
27796df3648SZhangfei Gao return 0;
27896df3648SZhangfei Gao }
27996df3648SZhangfei Gao
28096df3648SZhangfei Gao static struct rte_compressdev_ops uadk_compress_pmd_ops = {
28196df3648SZhangfei Gao .dev_configure = uadk_compress_pmd_config,
28296df3648SZhangfei Gao .dev_start = uadk_compress_pmd_start,
28396df3648SZhangfei Gao .dev_stop = uadk_compress_pmd_stop,
28496df3648SZhangfei Gao .dev_close = uadk_compress_pmd_close,
28596df3648SZhangfei Gao .stats_get = uadk_compress_pmd_stats_get,
28696df3648SZhangfei Gao .stats_reset = uadk_compress_pmd_stats_reset,
28796df3648SZhangfei Gao .dev_infos_get = uadk_compress_pmd_info_get,
28896df3648SZhangfei Gao .queue_pair_setup = uadk_compress_pmd_qp_setup,
28996df3648SZhangfei Gao .queue_pair_release = uadk_compress_pmd_qp_release,
29096df3648SZhangfei Gao .private_xform_create = uadk_compress_pmd_xform_create,
29196df3648SZhangfei Gao .private_xform_free = uadk_compress_pmd_xform_free,
29296df3648SZhangfei Gao };
293d66269c0SZhangfei Gao
294*dbfe8027SZhangfei Gao static uint16_t
uadk_compress_pmd_enqueue_burst_sync(void * queue_pair,struct rte_comp_op ** ops,uint16_t nb_ops)295*dbfe8027SZhangfei Gao uadk_compress_pmd_enqueue_burst_sync(void *queue_pair,
296*dbfe8027SZhangfei Gao struct rte_comp_op **ops, uint16_t nb_ops)
297*dbfe8027SZhangfei Gao {
298*dbfe8027SZhangfei Gao struct uadk_compress_qp *qp = queue_pair;
299*dbfe8027SZhangfei Gao struct uadk_compress_xform *xform;
300*dbfe8027SZhangfei Gao struct rte_comp_op *op;
301*dbfe8027SZhangfei Gao uint16_t enqd = 0;
302*dbfe8027SZhangfei Gao int i, ret = 0;
303*dbfe8027SZhangfei Gao
304*dbfe8027SZhangfei Gao for (i = 0; i < nb_ops; i++) {
305*dbfe8027SZhangfei Gao op = ops[i];
306*dbfe8027SZhangfei Gao
307*dbfe8027SZhangfei Gao if (op->op_type == RTE_COMP_OP_STATEFUL) {
308*dbfe8027SZhangfei Gao op->status = RTE_COMP_OP_STATUS_INVALID_ARGS;
309*dbfe8027SZhangfei Gao } else {
310*dbfe8027SZhangfei Gao /* process stateless ops */
311*dbfe8027SZhangfei Gao xform = op->private_xform;
312*dbfe8027SZhangfei Gao if (xform) {
313*dbfe8027SZhangfei Gao struct wd_comp_req req = {0};
314*dbfe8027SZhangfei Gao uint16_t dst_len = rte_pktmbuf_data_len(op->m_dst);
315*dbfe8027SZhangfei Gao
316*dbfe8027SZhangfei Gao req.src = rte_pktmbuf_mtod(op->m_src, uint8_t *);
317*dbfe8027SZhangfei Gao req.src_len = op->src.length;
318*dbfe8027SZhangfei Gao req.dst = rte_pktmbuf_mtod(op->m_dst, uint8_t *);
319*dbfe8027SZhangfei Gao req.dst_len = dst_len;
320*dbfe8027SZhangfei Gao req.op_type = (enum wd_comp_op_type)xform->type;
321*dbfe8027SZhangfei Gao req.cb = NULL;
322*dbfe8027SZhangfei Gao req.data_fmt = WD_FLAT_BUF;
323*dbfe8027SZhangfei Gao do {
324*dbfe8027SZhangfei Gao ret = wd_do_comp_sync(xform->handle, &req);
325*dbfe8027SZhangfei Gao } while (ret == -WD_EBUSY);
326*dbfe8027SZhangfei Gao
327*dbfe8027SZhangfei Gao op->consumed += req.src_len;
328*dbfe8027SZhangfei Gao
329*dbfe8027SZhangfei Gao if (req.dst_len <= dst_len) {
330*dbfe8027SZhangfei Gao op->produced += req.dst_len;
331*dbfe8027SZhangfei Gao op->status = RTE_COMP_OP_STATUS_SUCCESS;
332*dbfe8027SZhangfei Gao } else {
333*dbfe8027SZhangfei Gao op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED;
334*dbfe8027SZhangfei Gao }
335*dbfe8027SZhangfei Gao
336*dbfe8027SZhangfei Gao if (ret) {
337*dbfe8027SZhangfei Gao op->status = RTE_COMP_OP_STATUS_ERROR;
338*dbfe8027SZhangfei Gao break;
339*dbfe8027SZhangfei Gao }
340*dbfe8027SZhangfei Gao } else {
341*dbfe8027SZhangfei Gao op->status = RTE_COMP_OP_STATUS_INVALID_ARGS;
342*dbfe8027SZhangfei Gao }
343*dbfe8027SZhangfei Gao }
344*dbfe8027SZhangfei Gao
345*dbfe8027SZhangfei Gao /* Whatever is out of op, put it into completion queue with
346*dbfe8027SZhangfei Gao * its status
347*dbfe8027SZhangfei Gao */
348*dbfe8027SZhangfei Gao if (!ret)
349*dbfe8027SZhangfei Gao ret = rte_ring_enqueue(qp->processed_pkts, (void *)op);
350*dbfe8027SZhangfei Gao
351*dbfe8027SZhangfei Gao if (unlikely(ret)) {
352*dbfe8027SZhangfei Gao /* increment count if failed to enqueue op */
353*dbfe8027SZhangfei Gao qp->qp_stats.enqueue_err_count++;
354*dbfe8027SZhangfei Gao } else {
355*dbfe8027SZhangfei Gao qp->qp_stats.enqueued_count++;
356*dbfe8027SZhangfei Gao enqd++;
357*dbfe8027SZhangfei Gao }
358*dbfe8027SZhangfei Gao }
359*dbfe8027SZhangfei Gao
360*dbfe8027SZhangfei Gao return enqd;
361*dbfe8027SZhangfei Gao }
362*dbfe8027SZhangfei Gao
363*dbfe8027SZhangfei Gao static uint16_t
uadk_compress_pmd_dequeue_burst_sync(void * queue_pair,struct rte_comp_op ** ops,uint16_t nb_ops)364*dbfe8027SZhangfei Gao uadk_compress_pmd_dequeue_burst_sync(void *queue_pair,
365*dbfe8027SZhangfei Gao struct rte_comp_op **ops,
366*dbfe8027SZhangfei Gao uint16_t nb_ops)
367*dbfe8027SZhangfei Gao {
368*dbfe8027SZhangfei Gao struct uadk_compress_qp *qp = queue_pair;
369*dbfe8027SZhangfei Gao unsigned int nb_dequeued = 0;
370*dbfe8027SZhangfei Gao
371*dbfe8027SZhangfei Gao nb_dequeued = rte_ring_dequeue_burst(qp->processed_pkts,
372*dbfe8027SZhangfei Gao (void **)ops, nb_ops, NULL);
373*dbfe8027SZhangfei Gao qp->qp_stats.dequeued_count += nb_dequeued;
374*dbfe8027SZhangfei Gao
375*dbfe8027SZhangfei Gao return nb_dequeued;
376*dbfe8027SZhangfei Gao }
377*dbfe8027SZhangfei Gao
378d66269c0SZhangfei Gao static int
uadk_compress_probe(struct rte_vdev_device * vdev)379d66269c0SZhangfei Gao uadk_compress_probe(struct rte_vdev_device *vdev)
380d66269c0SZhangfei Gao {
381d66269c0SZhangfei Gao struct rte_compressdev_pmd_init_params init_params = {
382d66269c0SZhangfei Gao "",
383d66269c0SZhangfei Gao rte_socket_id(),
384d66269c0SZhangfei Gao };
385d66269c0SZhangfei Gao struct rte_compressdev *compressdev;
386d66269c0SZhangfei Gao struct uacce_dev *udev;
387d66269c0SZhangfei Gao const char *name;
388d66269c0SZhangfei Gao
389d66269c0SZhangfei Gao udev = wd_get_accel_dev("deflate");
390d66269c0SZhangfei Gao if (!udev)
391d66269c0SZhangfei Gao return -ENODEV;
392d66269c0SZhangfei Gao
393d66269c0SZhangfei Gao name = rte_vdev_device_name(vdev);
394d66269c0SZhangfei Gao if (name == NULL)
395d66269c0SZhangfei Gao return -EINVAL;
396d66269c0SZhangfei Gao
397d66269c0SZhangfei Gao compressdev = rte_compressdev_pmd_create(name, &vdev->device,
398d66269c0SZhangfei Gao sizeof(struct uadk_compress_priv), &init_params);
399d66269c0SZhangfei Gao if (compressdev == NULL) {
400d66269c0SZhangfei Gao UADK_LOG(ERR, "driver %s: create failed", init_params.name);
401d66269c0SZhangfei Gao return -ENODEV;
402d66269c0SZhangfei Gao }
403d66269c0SZhangfei Gao
404d66269c0SZhangfei Gao compressdev->dev_ops = &uadk_compress_pmd_ops;
405*dbfe8027SZhangfei Gao compressdev->dequeue_burst = uadk_compress_pmd_dequeue_burst_sync;
406*dbfe8027SZhangfei Gao compressdev->enqueue_burst = uadk_compress_pmd_enqueue_burst_sync;
407d66269c0SZhangfei Gao compressdev->feature_flags = RTE_COMPDEV_FF_HW_ACCELERATED;
408d66269c0SZhangfei Gao
409d66269c0SZhangfei Gao return 0;
410d66269c0SZhangfei Gao }
411d66269c0SZhangfei Gao
412d66269c0SZhangfei Gao static int
uadk_compress_remove(struct rte_vdev_device * vdev)413d66269c0SZhangfei Gao uadk_compress_remove(struct rte_vdev_device *vdev)
414d66269c0SZhangfei Gao {
415d66269c0SZhangfei Gao struct rte_compressdev *compressdev;
416d66269c0SZhangfei Gao const char *name;
417d66269c0SZhangfei Gao
418d66269c0SZhangfei Gao name = rte_vdev_device_name(vdev);
419d66269c0SZhangfei Gao if (name == NULL)
420d66269c0SZhangfei Gao return -EINVAL;
421d66269c0SZhangfei Gao
422d66269c0SZhangfei Gao compressdev = rte_compressdev_pmd_get_named_dev(name);
423d66269c0SZhangfei Gao if (compressdev == NULL)
424d66269c0SZhangfei Gao return -ENODEV;
425d66269c0SZhangfei Gao
426d66269c0SZhangfei Gao return rte_compressdev_pmd_destroy(compressdev);
427d66269c0SZhangfei Gao }
428d66269c0SZhangfei Gao
429d66269c0SZhangfei Gao static struct rte_vdev_driver uadk_compress_pmd = {
430d66269c0SZhangfei Gao .probe = uadk_compress_probe,
431d66269c0SZhangfei Gao .remove = uadk_compress_remove,
432d66269c0SZhangfei Gao };
433d66269c0SZhangfei Gao
434d66269c0SZhangfei Gao #define UADK_COMPRESS_DRIVER_NAME compress_uadk
435d66269c0SZhangfei Gao RTE_PMD_REGISTER_VDEV(UADK_COMPRESS_DRIVER_NAME, uadk_compress_pmd);
436d66269c0SZhangfei Gao RTE_LOG_REGISTER_DEFAULT(uadk_compress_logtype, INFO);
437