add zsda compressdev dev interface implementation.<br /> <br />Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn> <br />---<br /> drivers/common/zsda/meson.build       |   1 +<br /> drivers/common/zsda/zsda_device.c     |   9 +-<br /> drivers/common/zsda/zsda_qp_common.c  |  57 +++++++++++<br /> drivers/common/zsda/zsda_qp_common.h  |  37 +++++++<br /> drivers/compress/zsda/zsda_comp_pmd.c | 133 +++++++++++++++++++++++++-<br /> drivers/compress/zsda/zsda_comp_pmd.h |   5 +<br /> 6 files changed, 236 insertions(+), 6 deletions(-)<br /> create mode 100644 drivers/common/zsda/zsda_qp_common.c<br /> <br />diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build<br />index 6ee2a68f4b..6e6d5ab006 100644<br />--- a/drivers/common/zsda/meson.build<br />+++ b/drivers/common/zsda/meson.build<br />@@ -12,6 +12,7 @@ sources += files(<br />         'zsda_device.c',<br />         'zsda_logs.c',<br />         'zsda_qp.c',<br />+        'zsda_qp_common.c',<br />         )<br />  <br /> zsda_compress = true<br />diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c<br />index 189614f881..8a89dc7fc9 100644<br />--- a/drivers/common/zsda/zsda_device.c<br />+++ b/drivers/common/zsda/zsda_device.c<br />@@ -147,9 +147,12 @@ zsda_pci_device_release(const struct rte_pci_device *pci_dev)<br /> }<br />  <br /> static int<br />-zsda_pci_dev_destroy(struct zsda_pci_device *zsda_pci_dev __rte_unused,<br />+zsda_pci_dev_destroy(struct zsda_pci_device *zsda_pci_dev,<br />                 const struct rte_pci_device *pci_dev)<br /> {<br />+<br />+    zsda_comp_dev_destroy(zsda_pci_dev);<br />+<br />     return zsda_pci_device_release(pci_dev);<br /> }<br />  <br />@@ -172,6 +175,10 @@ zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,<br />         return ret;<br />     }<br />  <br />+    ret = zsda_comp_dev_create(zsda_pci_dev);<br />+    if (ret)<br />+        ZSDA_LOG(ERR, "Failed! dev create.");<br />+<br />     return ret;<br /> }<br />  <br />diff --git a/drivers/common/zsda/zsda_qp_common.c b/drivers/common/zsda/zsda_qp_common.c<br />new file mode 100644<br />index 0000000000..5a249be675<br />--- /dev/null<br />+++ b/drivers/common/zsda/zsda_qp_common.c<br />@@ -0,0 +1,57 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2024 ZTE Corporation<br />+ */<br />+<br />+#include "zsda_qp_common.h" <br />+<br />+void<br />+zsda_queue_delete(const struct zsda_queue *queue)<br />+{<br />+    const struct rte_memzone *mz;<br />+<br />+    if (queue == NULL) {<br />+        ZSDA_LOG(DEBUG, "Invalid queue");<br />+        return;<br />+    }<br />+<br />+    mz = rte_memzone_lookup(queue->memz_name);<br />+    if (mz != NULL) {<br />+        memset(queue->base_addr, 0x0,<br />+               (uint16_t)(queue->queue_size * queue->msg_size));<br />+        rte_memzone_free(mz);<br />+    } else<br />+        ZSDA_LOG(DEBUG, "queue %s doesn't exist", queue->memz_name);<br />+}<br />+<br />+int<br />+zsda_queue_pair_release(struct zsda_qp **qp_addr)<br />+{<br />+    struct zsda_qp *qp = *qp_addr;<br />+    uint32_t i;<br />+    enum zsda_service_type type;<br />+<br />+    if (qp == NULL) {<br />+        ZSDA_LOG(DEBUG, "qp already freed");<br />+        return 0;<br />+    }<br />+<br />+    for (type = 0; type < ZSDA_SERVICE_INVALID; type++) {<br />+        if (!qp->srv[type].used)<br />+            continue;<br />+<br />+        zsda_queue_delete(&(qp->srv[type].tx_q));<br />+        zsda_queue_delete(&(qp->srv[type].rx_q));<br />+        qp->srv[type].used = false;<br />+        for (i = 0; i < qp->srv[type].nb_descriptors; i++)<br />+            rte_mempool_put(qp->srv[type].op_cookie_pool,<br />+                    qp->srv[type].op_cookies[i]);<br />+<br />+        rte_mempool_free(qp->srv[type].op_cookie_pool);<br />+        rte_free(qp->srv[type].op_cookies);<br />+    }<br />+<br />+    rte_free(qp);<br />+    *qp_addr = NULL;<br />+<br />+    return ZSDA_SUCCESS;<br />+}<br />diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h<br />index 414cea56cc..f2d2ea037d 100644<br />--- a/drivers/common/zsda/zsda_qp_common.h<br />+++ b/drivers/common/zsda/zsda_qp_common.h<br />@@ -72,4 +72,41 @@ struct __rte_packed_begin zsda_admin_resp_qcfg {<br />     uint8_t data[14];<br /> } __rte_packed_end;<br />  <br />+struct zsda_queue {<br />+    char memz_name[RTE_MEMZONE_NAMESIZE];<br />+    uint8_t *io_addr;<br />+    uint8_t *base_addr;       /* Base address */<br />+    rte_iova_t base_phys_addr; /* Queue physical address */<br />+    uint16_t head;           /* Shadow copy of the head */<br />+    uint16_t tail;           /* Shadow copy of the tail */<br />+    uint16_t modulo_mask;<br />+    uint16_t msg_size;<br />+    uint16_t queue_size;<br />+    uint16_t cycle_size;<br />+    uint16_t pushed_wqe;<br />+<br />+    uint8_t hw_queue_number;<br />+    uint32_t csr_head; /* last written head value */<br />+    uint32_t csr_tail; /* last written tail value */<br />+<br />+    uint8_t valid;<br />+    uint16_t sid;<br />+};<br />+<br />+struct qp_srv {<br />+    bool used;<br />+    struct zsda_queue tx_q;<br />+    struct zsda_queue rx_q;<br />+    struct rte_mempool *op_cookie_pool;<br />+    void **op_cookies;<br />+    uint16_t nb_descriptors;<br />+};<br />+<br />+struct zsda_qp {<br />+    struct qp_srv srv[ZSDA_MAX_SERVICES];<br />+};<br />+<br />+void zsda_queue_delete(const struct zsda_queue *queue);<br />+int zsda_queue_pair_release(struct zsda_qp **qp_addr);<br />+<br /> #endif /* _ZSDA_QP_COMMON_H_ */<br />diff --git a/drivers/compress/zsda/zsda_comp_pmd.c b/drivers/compress/zsda/zsda_comp_pmd.c<br />index d1c33f448c..7e4e0372df 100644<br />--- a/drivers/compress/zsda/zsda_comp_pmd.c<br />+++ b/drivers/compress/zsda/zsda_comp_pmd.c<br />@@ -8,13 +8,134 @@<br /> #include "zsda_qp_common.h" <br /> #include "zsda_comp_pmd.h" <br />  <br />+static int<br />+zsda_comp_xform_size(void)<br />+{<br />+    return RTE_ALIGN_CEIL(sizeof(struct zsda_comp_xform), 8);<br />+}<br />+<br />+static struct rte_mempool *<br />+zsda_comp_xform_pool_create(struct zsda_comp_dev_private *comp_dev,<br />+                struct rte_compressdev_config *config,<br />+                uint32_t num_elements)<br />+{<br />+    char xform_pool_name[RTE_MEMPOOL_NAMESIZE];<br />+    struct rte_mempool *mp;<br />+<br />+    snprintf(xform_pool_name, RTE_MEMPOOL_NAMESIZE, "%s_xforms",<br />+         comp_dev->zsda_pci_dev->name);<br />+<br />+    ZSDA_LOG(DEBUG, "xformpool: %s", xform_pool_name);<br />+    mp = rte_mempool_lookup(xform_pool_name);<br />+<br />+    if (mp != NULL) {<br />+        ZSDA_LOG(DEBUG, "xformpool already created");<br />+        if (mp->size != num_elements) {<br />+            ZSDA_LOG(DEBUG, "xformpool wrong size - delete it");<br />+            rte_mempool_free(mp);<br />+            mp = NULL;<br />+            comp_dev->xformpool = NULL;<br />+        }<br />+    } else {<br />+        mp = rte_mempool_create(xform_pool_name, num_elements,<br />+                    zsda_comp_xform_size(), 0, 0, NULL,<br />+                    NULL, NULL, NULL, config->socket_id, 0);<br />+        if (mp == NULL) {<br />+            ZSDA_LOG(ERR, "Failed! mp is NULL");<br />+            return NULL;<br />+        }<br />+    }<br />+<br />+    return mp;<br />+}<br />+<br />+static int<br />+zsda_comp_dev_config(struct rte_compressdev *dev,<br />+             struct rte_compressdev_config *config)<br />+{<br />+    struct zsda_comp_dev_private *comp_dev = dev->data->dev_private;<br />+<br />+    if (config->max_nb_priv_xforms) {<br />+        comp_dev->xformpool = zsda_comp_xform_pool_create(<br />+            comp_dev, config, config->max_nb_priv_xforms);<br />+        if (comp_dev->xformpool == NULL)<br />+            return -ENOMEM;<br />+    } else<br />+        comp_dev->xformpool = NULL;<br />+<br />+    return ZSDA_SUCCESS;<br />+}<br />+<br />+static int<br />+zsda_comp_dev_start(struct rte_compressdev *dev)<br />+{<br />+    struct zsda_comp_dev_private *comp_dev = dev->data->dev_private;<br />+    int ret;<br />+<br />+    ret = zsda_queue_start(comp_dev->zsda_pci_dev->pci_dev);<br />+<br />+    if (ret)<br />+        ZSDA_LOG(ERR, "Failed! zsda_queue_start.");<br />+<br />+    return ret;<br />+}<br />+<br />+static void<br />+zsda_comp_dev_stop(struct rte_compressdev *dev)<br />+{<br />+    struct zsda_comp_dev_private *comp_dev = dev->data->dev_private;<br />+<br />+    zsda_queue_stop(comp_dev->zsda_pci_dev->pci_dev);<br />+}<br />+<br />+static int<br />+zsda_comp_dev_close(struct rte_compressdev *dev)<br />+{<br />+    struct zsda_comp_dev_private *comp_dev = dev->data->dev_private;<br />+<br />+    rte_mempool_free(comp_dev->xformpool);<br />+    comp_dev->xformpool = NULL;<br />+<br />+    return ZSDA_SUCCESS;<br />+}<br />+<br />+static uint16_t<br />+zsda_comp_max_nb_qps(void)<br />+{<br />+    uint16_t comp = zsda_nb_qps.encomp;<br />+    uint16_t decomp = zsda_nb_qps.decomp;<br />+    uint16_t min = 0;<br />+<br />+    if ((comp == MAX_QPS_ON_FUNCTION) ||<br />+        (decomp == MAX_QPS_ON_FUNCTION))<br />+        min = MAX_QPS_ON_FUNCTION;<br />+    else<br />+        min = (comp < decomp) ? comp : decomp;<br />+    if (min == 0)<br />+        return MAX_QPS_ON_FUNCTION;<br />+    return min;<br />+}<br />+<br />+static void<br />+zsda_comp_dev_info_get(struct rte_compressdev *dev,<br />+               struct rte_compressdev_info *info)<br />+{<br />+    struct zsda_comp_dev_private *comp_dev = dev->data->dev_private;<br />+<br />+    if (info != NULL) {<br />+        info->max_nb_queue_pairs = zsda_comp_max_nb_qps();<br />+        info->feature_flags = dev->feature_flags;<br />+        info->capabilities = comp_dev->zsda_dev_capabilities;<br />+    }<br />+}<br />+<br /> static struct rte_compressdev_ops compress_zsda_ops = {<br />  <br />-    .dev_configure = NULL,<br />-    .dev_start = NULL,<br />-    .dev_stop = NULL,<br />-    .dev_close = NULL,<br />-    .dev_infos_get = NULL,<br />+    .dev_configure = zsda_comp_dev_config,<br />+    .dev_start = zsda_comp_dev_start,<br />+    .dev_stop = zsda_comp_dev_stop,<br />+    .dev_close = zsda_comp_dev_close,<br />+    .dev_infos_get = zsda_comp_dev_info_get,<br />  <br />     .stats_get = NULL,<br />     .stats_reset = NULL,<br />@@ -121,6 +242,8 @@ zsda_comp_dev_destroy(struct zsda_pci_device *zsda_pci_dev)<br />     if (rte_eal_process_type() == RTE_PROC_PRIMARY)<br />         rte_memzone_free(zsda_pci_dev->comp_dev->capa_mz);<br />  <br />+    zsda_comp_dev_close(comp_dev->compressdev);<br />+<br />     rte_compressdev_pmd_destroy(comp_dev->compressdev);<br />     zsda_pci_dev->comp_dev = NULL;<br />  <br />diff --git a/drivers/compress/zsda/zsda_comp_pmd.h b/drivers/compress/zsda/zsda_comp_pmd.h<br />index b83dcd7202..1e691d7cc6 100644<br />--- a/drivers/compress/zsda/zsda_comp_pmd.h<br />+++ b/drivers/compress/zsda/zsda_comp_pmd.h<br />@@ -29,6 +29,11 @@ struct zsda_comp_dev_private {<br />     /* Shared memzone for storing capabilities */<br /> };<br />  <br />+struct zsda_comp_xform {<br />+    enum rte_comp_xform_type type;<br />+    enum rte_comp_checksum_type checksum_type;<br />+};<br />+<br /> int zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev);<br />  <br /> int zsda_comp_dev_destroy(struct zsda_pci_device *zsda_pci_dev);<br />--  <br />2.27.0<br />