get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/113121/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 113121,
    "url": "https://patches.dpdk.org/api/patches/113121/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20220620123544.3168-2-zhangfei.gao@linaro.org/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20220620123544.3168-2-zhangfei.gao@linaro.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220620123544.3168-2-zhangfei.gao@linaro.org",
    "date": "2022-06-20T12:35:42",
    "name": "[1/3] compress/uadk: add uadk compression PMD",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "e48da80a555bb50e28dba60d6f58e348903e2116",
    "submitter": {
        "id": 2701,
        "url": "https://patches.dpdk.org/api/people/2701/?format=api",
        "name": "Zhangfei Gao",
        "email": "zhangfei.gao@linaro.org"
    },
    "delegate": {
        "id": 6690,
        "url": "https://patches.dpdk.org/api/users/6690/?format=api",
        "username": "akhil",
        "first_name": "akhil",
        "last_name": "goyal",
        "email": "gakhil@marvell.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20220620123544.3168-2-zhangfei.gao@linaro.org/mbox/",
    "series": [
        {
            "id": 23635,
            "url": "https://patches.dpdk.org/api/series/23635/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=23635",
            "date": "2022-06-20T12:35:41",
            "name": "Add uadk compression and crypto PMD",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/23635/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/113121/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/113121/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id B6074A0545;\n\tMon, 20 Jun 2022 14:35:59 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 041A94280B;\n\tMon, 20 Jun 2022 14:35:58 +0200 (CEST)",
            "from mail-pj1-f53.google.com (mail-pj1-f53.google.com\n [209.85.216.53]) by mails.dpdk.org (Postfix) with ESMTP id DB42F4280B\n for <dev@dpdk.org>; Mon, 20 Jun 2022 14:35:56 +0200 (CEST)",
            "by mail-pj1-f53.google.com with SMTP id\n g16-20020a17090a7d1000b001ea9f820449so10623884pjl.5\n for <dev@dpdk.org>; Mon, 20 Jun 2022 05:35:56 -0700 (PDT)",
            "from localhost.localdomain ([199.101.192.181])\n by smtp.gmail.com with ESMTPSA id\n g10-20020a63be4a000000b0040c52ff0ba9sm6768967pgo.37.2022.06.20.05.35.52\n (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);\n Mon, 20 Jun 2022 05:35:55 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=ATYG4grn0XwFaUj3qg4thZ7A5Y7wllyRJh9kOEeRr0o=;\n b=SnRpUYL+b+bHisprOw8neKMYaSXfnsIaB4VCGfAeiK/VjNtfZASeb6RuCYT3F1Viem\n ltXEWriNXOYUa5WBlymiz+1AjsoV6/dcRqrpfUWqdxGTqcCG8hwuNWEZy4x//2OZn0PX\n wK7WXYtj+Hjq4Dwe+K+tM6GpjOiLHGy9tk2coz4NKUpltR3YMjFk9tWhAsz5oxOcPdit\n OhHV0VF+5uvTRQVAR7jAAzy7924r5yA1nw/hNKvoaWAL8VotV58tHtWfEA9HR4eNca9U\n dBZGFUY4K3v+D39uPtNKGG4EYaBNhKrapewpBW5Dz2Ah4+tVw6t3p7/1XYmPqByFMSSd\n 8M+A==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20210112;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=ATYG4grn0XwFaUj3qg4thZ7A5Y7wllyRJh9kOEeRr0o=;\n b=e4gW7uYGy6l8t04pdyWCix5eHvCKgnJBT73yEoHgGqv4kEWAu1X99kc/uLetQhF2Uv\n uu7EqDCDTo0psKhPmXhMqf8hn2FV51tQXPZtqXudhwz+k8uIeIYACtkwmQpg6/048Qk6\n Om4foI2y0utXXnJLZqkF1ASG5+2+3UCDl1pY3x3V0oiYBuGk9DVqpXVNv+ACegqzqK5g\n Hk9FkMN+KwSS7HHX2LMRVAwQED4x+f2Y/wFwphG9eY/iixgcPEMxgr27rzU3QAlhlLjC\n mS1Rh/tGn2Aoyodk6P0h+WRMrxkQNEUorgMLycs04fH5++Q05CpQSl1x2zq+6FcG3cPN\n sp2w==",
        "X-Gm-Message-State": "AJIora+8alR0YbR1vOE+hE1pFg7mlWL1vGwjbrADj8OB4zIdLj56UQag\n x7sJaYvFHc4L+LJu6HrXcz50cQ==",
        "X-Google-Smtp-Source": "\n AGRyM1sCDzqxS5O7Lhh7gug0qrY+drEM34SBEXAQu0CRHd8h1F4JciK1oxp3ydFlRK9kyAOL/YpO9Q==",
        "X-Received": "by 2002:a17:902:b496:b0:16a:1630:a944 with SMTP id\n y22-20020a170902b49600b0016a1630a944mr10056875plr.147.1655728556023;\n Mon, 20 Jun 2022 05:35:56 -0700 (PDT)",
        "From": "Zhangfei Gao <zhangfei.gao@linaro.org>",
        "To": "Akhil Goyal <gakhil@marvell.com>,\n Declan Doherty <declan.doherty@intel.com>,\n Fan Zhang <roy.fan.zhang@intel.com>,\n Ashish Gupta <ashish.gupta@marvell.com>, Ray Kinsella <mdr@ashroe.eu>",
        "Cc": "dev@dpdk.org,\n\tZhangfei Gao <zhangfei.gao@linaro.org>",
        "Subject": "[PATCH 1/3] compress/uadk: add uadk compression PMD",
        "Date": "Mon, 20 Jun 2022 20:35:42 +0800",
        "Message-Id": "<20220620123544.3168-2-zhangfei.gao@linaro.org>",
        "X-Mailer": "git-send-email 2.36.1",
        "In-Reply-To": "<20220620123544.3168-1-zhangfei.gao@linaro.org>",
        "References": "<20220620123544.3168-1-zhangfei.gao@linaro.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Add uadk compression & decompression PMD, which relies on uadk api.\n\nTest:\nsudo dpdk-test --vdev=compress_uadk\nRTE>>compressdev_autotest\nRTE>>quit\n\nSigned-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>\n---\n doc/guides/compressdevs/index.rst         |   1 +\n doc/guides/compressdevs/uadk.rst          |  60 +++\n drivers/compress/meson.build              |   1 +\n drivers/compress/uadk/meson.build         |  28 ++\n drivers/compress/uadk/uadk_compress_pmd.c | 489 ++++++++++++++++++++++\n drivers/compress/uadk/version.map         |   3 +\n 6 files changed, 582 insertions(+)\n create mode 100644 doc/guides/compressdevs/uadk.rst\n create mode 100644 drivers/compress/uadk/meson.build\n create mode 100644 drivers/compress/uadk/uadk_compress_pmd.c\n create mode 100644 drivers/compress/uadk/version.map",
    "diff": "diff --git a/doc/guides/compressdevs/index.rst b/doc/guides/compressdevs/index.rst\nindex 54a3ef4273..e47a9ab9cf 100644\n--- a/doc/guides/compressdevs/index.rst\n+++ b/doc/guides/compressdevs/index.rst\n@@ -14,4 +14,5 @@ Compression Device Drivers\n     mlx5\n     octeontx\n     qat_comp\n+    uadk\n     zlib\ndiff --git a/doc/guides/compressdevs/uadk.rst b/doc/guides/compressdevs/uadk.rst\nnew file mode 100644\nindex 0000000000..3f2c35e08e\n--- /dev/null\n+++ b/doc/guides/compressdevs/uadk.rst\n@@ -0,0 +1,60 @@\n+..  SPDX-License-Identifier: BSD-3-Clause\n+    Copyright 2022-2023 Huawei Technologies Co.,Ltd. All rights reserved.\n+    Copyright 2022-2023 Linaro ltd.\n+\n+UADK Compression Poll Mode Driver\n+=======================================================\n+\n+UADK compression PMD provides poll mode compression & decompression driver\n+All compression operations are using UADK compress API.\n+Hardware accelerators using UADK are supposed to be supported.\n+\n+Features\n+--------\n+\n+UADK compression PMD has support for:\n+\n+Compression/Decompression algorithm:\n+\n+    * DEFLATE - using Fixed and Dynamic Huffman encoding\n+\n+Window size support:\n+\n+    * 32K\n+\n+Checksum generation:\n+\n+    * CRC32, Adler and combined checksum\n+\n+Test steps\n+-----------\n+\n+   .. code-block:: console\n+\n+\t1. Build\n+\tcd dpdk\n+\tmkdir build\n+\tmeson build (--reconfigure)\n+\tcd build\n+\tninja\n+\tsudo ninja install\n+\n+\t2. Prepare\n+\techo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages\n+\techo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages\n+\techo 1024 > /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages\n+\techo 1024 > /sys/devices/system/node/node3/hugepages/hugepages-2048kB/nr_hugepages\n+\tmkdir -p /mnt/huge_2mb\n+\tmount -t hugetlbfs none /mnt/huge_2mb -o pagesize=2MB\n+\n+\t2 Test with compress_uadk\n+\tsudo dpdk-test --vdev=compress_uadk\n+\tRTE>>compressdev_autotest\n+\tRTE>>quit\n+\n+Dependency\n+------------\n+\n+UADK compression PMD relies on UADK library [1]\n+\n+[1] https://github.com/Linaro/uadk\ndiff --git a/drivers/compress/meson.build b/drivers/compress/meson.build\nindex abe043ab94..041a45ba41 100644\n--- a/drivers/compress/meson.build\n+++ b/drivers/compress/meson.build\n@@ -10,6 +10,7 @@ drivers = [\n         'mlx5',\n         'octeontx',\n         'zlib',\n+        'uadk',\n ]\n \n std_deps = ['compressdev'] # compressdev pulls in all other needed deps\ndiff --git a/drivers/compress/uadk/meson.build b/drivers/compress/uadk/meson.build\nnew file mode 100644\nindex 0000000000..579d673f8d\n--- /dev/null\n+++ b/drivers/compress/uadk/meson.build\n@@ -0,0 +1,28 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright 2022-2023 Huawei Technologies Co.,Ltd. All rights reserved.\n+# Copyright 2022-2023 Linaro ltd.\n+\n+if not is_linux\n+    build = false\n+    reason = 'only supported on Linux'\n+    subdir_done()\n+endif\n+\n+if arch_subdir != 'arm' or not dpdk_conf.get('RTE_ARCH_64')\n+    build = false\n+    reason = 'only supported on aarch64'\n+    subdir_done()\n+endif\n+\n+sources = files(\n+        'uadk_compress_pmd.c',\n+)\n+\n+deps += 'bus_vdev'\n+dep = cc.find_library('libwd_comp', dirs: ['/usr/local/lib'], required: false)\n+if not dep.found()\n+\tbuild = false\n+\treason = 'missing dependency, \"libwd_comp\"'\n+else\n+\text_deps += dep\n+endif\ndiff --git a/drivers/compress/uadk/uadk_compress_pmd.c b/drivers/compress/uadk/uadk_compress_pmd.c\nnew file mode 100644\nindex 0000000000..2e94961135\n--- /dev/null\n+++ b/drivers/compress/uadk/uadk_compress_pmd.c\n@@ -0,0 +1,489 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright 2022-2023 Huawei Technologies Co.,Ltd. All rights reserved.\n+ * Copyright 2022-2023 Linaro ltd.\n+ */\n+\n+#include <rte_bus_vdev.h>\n+#include <rte_compressdev_pmd.h>\n+#include <rte_malloc.h>\n+#include <uadk/wd_comp.h>\n+#include <uadk/wd_sched.h>\n+\n+struct uadk_compress_priv {\n+\tstruct rte_mempool *mp;\n+} __rte_cache_aligned;\n+\n+struct uadk_qp {\n+\tstruct rte_ring *processed_pkts;\n+\t/* Ring for placing process packets */\n+\tstruct rte_compressdev_stats qp_stats;\n+\t/* Queue pair statistics */\n+\tuint16_t id;\n+\t/* Queue Pair Identifier */\n+\tchar name[RTE_COMPRESSDEV_NAME_MAX_LEN];\n+\t/* Unique Queue Pair Name */\n+} __rte_cache_aligned;\n+\n+struct uadk_stream {\n+\thandle_t handle;\n+\tenum rte_comp_xform_type type;\n+} __rte_cache_aligned;\n+\n+RTE_LOG_REGISTER_DEFAULT(uadk_compress_logtype, INFO);\n+\n+#define UADK_LOG(level, fmt, ...)  \\\n+\trte_log(RTE_LOG_ ## level, uadk_compress_logtype,  \\\n+\t\t\"%s() line %u: \" fmt \"\\n\", __func__, __LINE__,  \\\n+\t\t## __VA_ARGS__)\n+\n+static int\n+uadk_compress_pmd_config(struct rte_compressdev *dev,\n+\t\t\t struct rte_compressdev_config *config)\n+{\n+\tchar mp_name[RTE_MEMPOOL_NAMESIZE];\n+\tstruct uadk_compress_priv *priv;\n+\tstruct rte_mempool *mp;\n+\tint ret;\n+\n+\tif (dev == NULL || config == NULL)\n+\t\treturn -EINVAL;\n+\n+\tsnprintf(mp_name, RTE_MEMPOOL_NAMESIZE,\n+\t\t \"stream_mp_%u\", dev->data->dev_id);\n+\tpriv = dev->data->dev_private;\n+\n+\t/* alloc resources */\n+\tret = wd_comp_env_init(NULL);\n+\tif (ret < 0)\n+\t\treturn -EINVAL;\n+\n+\tmp = priv->mp;\n+\tif (mp == NULL) {\n+\t\tmp = rte_mempool_create(mp_name,\n+\t\t\t\t\tconfig->max_nb_priv_xforms +\n+\t\t\t\t\tconfig->max_nb_streams,\n+\t\t\t\t\tsizeof(struct uadk_stream),\n+\t\t\t\t\t0, 0, NULL, NULL, NULL,\n+\t\t\t\t\tNULL, config->socket_id, 0);\n+\t\tif (mp == NULL) {\n+\t\t\tUADK_LOG(ERR, \"Cannot create private xform pool on socket %d\\n\",\n+\t\t\t\t config->socket_id);\n+\t\t\tret = -ENOMEM;\n+\t\t\tgoto err_mempool;\n+\t\t}\n+\t\tpriv->mp = mp;\n+\t}\n+\n+\treturn 0;\n+\n+err_mempool:\n+\twd_comp_env_uninit();\n+\treturn ret;\n+}\n+\n+static int\n+uadk_compress_pmd_start(struct rte_compressdev *dev __rte_unused)\n+{\n+\treturn 0;\n+}\n+\n+static void\n+uadk_compress_pmd_stop(struct rte_compressdev *dev __rte_unused)\n+{\n+}\n+\n+static int\n+uadk_compress_pmd_close(struct rte_compressdev *dev)\n+{\n+\tstruct uadk_compress_priv *priv =\n+\t\t(struct uadk_compress_priv *)dev->data->dev_private;\n+\n+\t/* free resources */\n+\trte_mempool_free(priv->mp);\n+\tpriv->mp = NULL;\n+\twd_comp_env_uninit();\n+\n+\treturn 0;\n+}\n+\n+static void\n+uadk_compress_pmd_stats_get(struct rte_compressdev *dev,\n+\t\t\t    struct rte_compressdev_stats *stats)\n+{\n+\tint qp_id;\n+\n+\tfor (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {\n+\t\tstruct uadk_qp *qp = dev->data->queue_pairs[qp_id];\n+\n+\t\tstats->enqueued_count += qp->qp_stats.enqueued_count;\n+\t\tstats->dequeued_count += qp->qp_stats.dequeued_count;\n+\t\tstats->enqueue_err_count += qp->qp_stats.enqueue_err_count;\n+\t\tstats->dequeue_err_count += qp->qp_stats.dequeue_err_count;\n+\t}\n+}\n+\n+static void\n+uadk_compress_pmd_stats_reset(struct rte_compressdev *dev __rte_unused)\n+{\n+}\n+\n+static const struct\n+rte_compressdev_capabilities uadk_compress_pmd_capabilities[] = {\n+\t{   /* Deflate */\n+\t\t.algo = RTE_COMP_ALGO_DEFLATE,\n+\t\t.comp_feature_flags = RTE_COMP_FF_SHAREABLE_PRIV_XFORM |\n+\t\t\t\t      RTE_COMP_FF_HUFFMAN_FIXED |\n+\t\t\t\t      RTE_COMP_FF_HUFFMAN_DYNAMIC,\n+\t},\n+\n+\tRTE_COMP_END_OF_CAPABILITIES_LIST()\n+};\n+\n+static void\n+uadk_compress_pmd_info_get(struct rte_compressdev *dev,\n+\t\t\t   struct rte_compressdev_info *dev_info)\n+{\n+\tif (dev_info != NULL) {\n+\t\tdev_info->driver_name = dev->device->driver->name;\n+\t\tdev_info->feature_flags = dev->feature_flags;\n+\t\tdev_info->capabilities = uadk_compress_pmd_capabilities;\n+\t}\n+}\n+\n+static int\n+uadk_compress_pmd_qp_release(struct rte_compressdev *dev, uint16_t qp_id)\n+{\n+\tstruct uadk_qp *qp = dev->data->queue_pairs[qp_id];\n+\n+\tif (qp != NULL) {\n+\t\trte_ring_free(qp->processed_pkts);\n+\t\trte_free(qp);\n+\t\tdev->data->queue_pairs[qp_id] = NULL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+uadk_pmd_qp_set_unique_name(struct rte_compressdev *dev,\n+\t\t\t    struct uadk_qp *qp)\n+{\n+\tunsigned int n = snprintf(qp->name, sizeof(qp->name),\n+\t\t\t\t \"uadk_pmd_%u_qp_%u\",\n+\t\t\t\t dev->data->dev_id, qp->id);\n+\n+\tif (n >= sizeof(qp->name))\n+\t\treturn -EINVAL;\n+\n+\treturn 0;\n+}\n+\n+static struct rte_ring *\n+uadk_pmd_qp_create_processed_pkts_ring(struct uadk_qp *qp,\n+\t\t\t\t       unsigned int ring_size, int socket_id)\n+{\n+\tstruct rte_ring *r = qp->processed_pkts;\n+\n+\tif (r) {\n+\t\tif (rte_ring_get_size(r) >= ring_size) {\n+\t\t\tUADK_LOG(INFO, \"Reusing existing ring %s for processed packets\",\n+\t\t\t\t qp->name);\n+\t\t\treturn r;\n+\t\t}\n+\n+\t\tUADK_LOG(ERR, \"Unable to reuse existing ring %s for processed packets\",\n+\t\t\t qp->name);\n+\t\treturn NULL;\n+\t}\n+\n+\treturn rte_ring_create(qp->name, ring_size, socket_id,\n+\t\t\t       RING_F_EXACT_SZ);\n+}\n+\n+static int\n+uadk_compress_pmd_qp_setup(struct rte_compressdev *dev, uint16_t qp_id,\n+\t\t\t   uint32_t max_inflight_ops, int socket_id)\n+{\n+\tstruct uadk_qp *qp = NULL;\n+\n+\t/* Free memory prior to re-allocation if needed. */\n+\tif (dev->data->queue_pairs[qp_id] != NULL)\n+\t\tuadk_compress_pmd_qp_release(dev, qp_id);\n+\n+\t/* Allocate the queue pair data structure. */\n+\tqp = rte_zmalloc_socket(\"uadk PMD Queue Pair\", sizeof(*qp),\n+\t\t\t\tRTE_CACHE_LINE_SIZE, socket_id);\n+\tif (qp == NULL)\n+\t\treturn (-ENOMEM);\n+\n+\tqp->id = qp_id;\n+\tdev->data->queue_pairs[qp_id] = qp;\n+\n+\tif (uadk_pmd_qp_set_unique_name(dev, qp))\n+\t\tgoto qp_setup_cleanup;\n+\n+\tqp->processed_pkts = uadk_pmd_qp_create_processed_pkts_ring(qp,\n+\t\t\t\t\t\tmax_inflight_ops, socket_id);\n+\tif (qp->processed_pkts == NULL)\n+\t\tgoto qp_setup_cleanup;\n+\n+\tmemset(&qp->qp_stats, 0, sizeof(qp->qp_stats));\n+\n+\treturn 0;\n+\n+qp_setup_cleanup:\n+\tif (qp) {\n+\t\trte_free(qp);\n+\t\tqp = NULL;\n+\t}\n+\treturn -EINVAL;\n+}\n+\n+static int\n+uadk_compress_pmd_xform_create(struct rte_compressdev *dev,\n+\t\t\t       const struct rte_comp_xform *xform,\n+\t\t\t       void **private_xform)\n+{\n+\tstruct uadk_compress_priv *priv = dev->data->dev_private;\n+\tstruct wd_comp_sess_setup setup = {0};\n+\tstruct sched_params param = {0};\n+\tstruct uadk_stream *stream;\n+\thandle_t handle;\n+\n+\tif (xform == NULL) {\n+\t\tUADK_LOG(ERR, \"invalid xform struct\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (rte_mempool_get(priv->mp, private_xform)) {\n+\t\tUADK_LOG(ERR, \"Couldn't get object from session mempool\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tstream = *((struct uadk_stream **)private_xform);\n+\n+\tswitch (xform->type) {\n+\tcase RTE_COMP_COMPRESS:\n+\t\tswitch (xform->compress.algo) {\n+\t\tcase RTE_COMP_ALGO_NULL:\n+\t\t\tbreak;\n+\t\tcase RTE_COMP_ALGO_DEFLATE:\n+\t\t\tsetup.alg_type = WD_ZLIB;\n+\t\t\tsetup.win_sz = WD_COMP_WS_8K;\n+\t\t\tsetup.comp_lv = WD_COMP_L8;\n+\t\t\tsetup.op_type = WD_DIR_COMPRESS;\n+\t\t\tparam.type = setup.op_type;\n+\t\t\tparam.numa_id = -1;\t/* choose nearby numa node */\n+\t\t\tsetup.sched_param = &param;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tgoto err;\n+\t\t}\n+\t\tbreak;\n+\tcase RTE_COMP_DECOMPRESS:\n+\t\tswitch (xform->decompress.algo) {\n+\t\tcase RTE_COMP_ALGO_NULL:\n+\t\t\tbreak;\n+\t\tcase RTE_COMP_ALGO_DEFLATE:\n+\t\t\tsetup.alg_type = WD_ZLIB;\n+\t\t\tsetup.comp_lv = WD_COMP_L8;\n+\t\t\tsetup.op_type = WD_DIR_DECOMPRESS;\n+\t\t\tparam.type = setup.op_type;\n+\t\t\tparam.numa_id = -1;\t/* choose nearby numa node */\n+\t\t\tsetup.sched_param = &param;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tgoto err;\n+\t\t}\n+\t\tbreak;\n+\tdefault:\n+\t\tUADK_LOG(ERR, \"Algorithm %u is not supported.\", xform->type);\n+\t\tgoto err;\n+\t}\n+\n+\thandle = wd_comp_alloc_sess(&setup);\n+\tif (!handle)\n+\t\tgoto err;\n+\n+\tstream->handle = handle;\n+\tstream->type = xform->type;\n+\n+\treturn 0;\n+\n+err:\n+\trte_mempool_put(priv->mp, private_xform);\n+\treturn -EINVAL;\n+}\n+\n+static int\n+uadk_compress_pmd_xform_free(struct rte_compressdev *dev __rte_unused, void *private_xform)\n+{\n+\tstruct uadk_stream *stream = (struct uadk_stream *)private_xform;\n+\tstruct rte_mempool *mp;\n+\n+\tif (!stream)\n+\t\treturn -EINVAL;\n+\n+\twd_comp_free_sess(stream->handle);\n+\tmemset(stream, 0, sizeof(struct uadk_stream));\n+\tmp = rte_mempool_from_obj(stream);\n+\trte_mempool_put(mp, stream);\n+\n+\treturn 0;\n+}\n+\n+static struct rte_compressdev_ops uadk_compress_pmd_ops = {\n+\t\t.dev_configure\t\t= uadk_compress_pmd_config,\n+\t\t.dev_start\t\t= uadk_compress_pmd_start,\n+\t\t.dev_stop\t\t= uadk_compress_pmd_stop,\n+\t\t.dev_close\t\t= uadk_compress_pmd_close,\n+\t\t.stats_get\t\t= uadk_compress_pmd_stats_get,\n+\t\t.stats_reset\t\t= uadk_compress_pmd_stats_reset,\n+\t\t.dev_infos_get\t\t= uadk_compress_pmd_info_get,\n+\t\t.queue_pair_setup\t= uadk_compress_pmd_qp_setup,\n+\t\t.queue_pair_release\t= uadk_compress_pmd_qp_release,\n+\t\t.private_xform_create\t= uadk_compress_pmd_xform_create,\n+\t\t.private_xform_free\t= uadk_compress_pmd_xform_free,\n+\t\t.stream_create\t\t= NULL,\n+\t\t.stream_free\t\t= NULL,\n+};\n+\n+static uint16_t\n+uadk_compress_pmd_enqueue_burst_sync(void *queue_pair,\n+\t\t\t\t     struct rte_comp_op **ops, uint16_t nb_ops)\n+{\n+\tstruct uadk_qp *qp = queue_pair;\n+\tstruct uadk_stream *stream;\n+\tstruct rte_comp_op *op;\n+\tuint16_t enqd = 0;\n+\tint i, ret = 0;\n+\n+\tfor (i = 0; i < nb_ops; i++) {\n+\t\top = ops[i];\n+\n+\t\tif (op->op_type == RTE_COMP_OP_STATEFUL) {\n+\t\t\top->status = RTE_COMP_OP_STATUS_INVALID_ARGS;\n+\t\t} else {\n+\t\t\t/* process stateless ops */\n+\t\t\tstream = (struct uadk_stream *)op->private_xform;\n+\t\t\tif (stream) {\n+\t\t\t\tstruct wd_comp_req req = {0};\n+\t\t\t\tuint16_t dst_len = rte_pktmbuf_data_len(op->m_dst);\n+\n+\t\t\t\treq.src = rte_pktmbuf_mtod(op->m_src, uint8_t *);\n+\t\t\t\treq.src_len = op->src.length;\n+\t\t\t\treq.dst = rte_pktmbuf_mtod(op->m_dst, uint8_t *);\n+\t\t\t\treq.dst_len = dst_len;\n+\t\t\t\treq.op_type = stream->type;\n+\t\t\t\treq.cb = NULL;\n+\t\t\t\treq.data_fmt = WD_FLAT_BUF;\n+\t\t\t\tdo {\n+\t\t\t\t\tret = wd_do_comp_sync(stream->handle, &req);\n+\t\t\t\t} while (ret == -WD_EBUSY);\n+\n+\t\t\t\top->consumed += req.src_len;\n+\n+\t\t\t\tif (req.dst_len <= dst_len) {\n+\t\t\t\t\top->produced += req.dst_len;\n+\t\t\t\t\top->status = RTE_COMP_OP_STATUS_SUCCESS;\n+\t\t\t\t} else  {\n+\t\t\t\t\top->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED;\n+\t\t\t\t}\n+\n+\t\t\t\tif (ret) {\n+\t\t\t\t\top->status = RTE_COMP_OP_STATUS_ERROR;\n+\t\t\t\t\tbreak;\n+\t\t\t\t}\n+\t\t\t} else {\n+\t\t\t\top->status = RTE_COMP_OP_STATUS_INVALID_ARGS;\n+\t\t\t}\n+\t\t}\n+\n+\t\t/* Whatever is out of op, put it into completion queue with\n+\t\t * its status\n+\t\t */\n+\t\tif (!ret)\n+\t\t\tret = rte_ring_enqueue(qp->processed_pkts, (void *)op);\n+\n+\t\tif (unlikely(ret)) {\n+\t\t\t/* increment count if failed to enqueue op */\n+\t\t\tqp->qp_stats.enqueue_err_count++;\n+\t\t} else {\n+\t\t\tqp->qp_stats.enqueued_count++;\n+\t\t\tenqd++;\n+\t\t}\n+\t}\n+\n+\treturn enqd;\n+}\n+\n+static uint16_t\n+uadk_compress_pmd_dequeue_burst_sync(void *queue_pair,\n+\t\t\t\t     struct rte_comp_op **ops,\n+\t\t\t\t     uint16_t nb_ops)\n+{\n+\tstruct uadk_qp *qp = queue_pair;\n+\tunsigned int nb_dequeued = 0;\n+\n+\tnb_dequeued = rte_ring_dequeue_burst(qp->processed_pkts,\n+\t\t\t(void **)ops, nb_ops, NULL);\n+\tqp->qp_stats.dequeued_count += nb_dequeued;\n+\n+\treturn nb_dequeued;\n+}\n+\n+static int\n+uadk_compress_probe(struct rte_vdev_device *vdev)\n+{\n+\tstruct rte_compressdev_pmd_init_params init_params = {\n+\t\t\"\",\n+\t\trte_socket_id(),\n+\t};\n+\tstruct rte_compressdev *compressdev;\n+\tconst char *name;\n+\n+\tname = rte_vdev_device_name(vdev);\n+\n+\tif (name == NULL)\n+\t\treturn -EINVAL;\n+\n+\tcompressdev = rte_compressdev_pmd_create(name, &vdev->device,\n+\t\t\tsizeof(struct uadk_compress_priv), &init_params);\n+\tif (compressdev == NULL) {\n+\t\tUADK_LOG(ERR, \"driver %s: create failed\", init_params.name);\n+\t\treturn -ENODEV;\n+\t}\n+\n+\tcompressdev->dev_ops = &uadk_compress_pmd_ops;\n+\tcompressdev->dequeue_burst = uadk_compress_pmd_dequeue_burst_sync;\n+\tcompressdev->enqueue_burst = uadk_compress_pmd_enqueue_burst_sync;\n+\tcompressdev->feature_flags = RTE_COMPDEV_FF_HW_ACCELERATED;\n+\n+\treturn 0;\n+}\n+\n+static int\n+uadk_compress_remove(struct rte_vdev_device *vdev)\n+{\n+\tstruct rte_compressdev *compressdev;\n+\tconst char *name;\n+\n+\tname = rte_vdev_device_name(vdev);\n+\tif (name == NULL)\n+\t\treturn -EINVAL;\n+\n+\tcompressdev = rte_compressdev_pmd_get_named_dev(name);\n+\tif (compressdev == NULL)\n+\t\treturn -ENODEV;\n+\n+\treturn rte_compressdev_pmd_destroy(compressdev);\n+}\n+\n+static struct rte_vdev_driver uadk_compress_pmd = {\n+\t.probe = uadk_compress_probe,\n+\t.remove = uadk_compress_remove,\n+};\n+\n+#define UADK_COMPRESS_DRIVER_NAME compress_uadk\n+\n+RTE_PMD_REGISTER_VDEV(UADK_COMPRESS_DRIVER_NAME, uadk_compress_pmd);\ndiff --git a/drivers/compress/uadk/version.map b/drivers/compress/uadk/version.map\nnew file mode 100644\nindex 0000000000..c2e0723b4c\n--- /dev/null\n+++ b/drivers/compress/uadk/version.map\n@@ -0,0 +1,3 @@\n+DPDK_22 {\n+\tlocal: *;\n+};\n",
    "prefixes": [
        "1/3"
    ]
}