add zsda compressdev dev interface implementation.<br /> <br />Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn> <br />---<br /> drivers/common/zsda/zsda_qp.c         |  51 ++++++++++<br /> drivers/common/zsda/zsda_qp.h         |   3 +<br /> drivers/common/zsda/zsda_qp_common.h  |  34 +++++++<br /> drivers/compress/zsda/zsda_comp_pmd.c | 133 +++++++++++++++++++++++++-<br /> drivers/compress/zsda/zsda_comp_pmd.h |   5 +<br /> 5 files changed, 221 insertions(+), 5 deletions(-)<br /> <br />diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c<br />index a87ec0f93a..1ad609675d 100644<br />--- a/drivers/common/zsda/zsda_qp.c<br />+++ b/drivers/common/zsda/zsda_qp.c<br />@@ -129,6 +129,31 @@ zsda_admin_q_clear(const struct rte_pci_device *pci_dev)<br />     return ret;<br /> }<br />  <br />+static int<br />+zsda_single_queue_start(uint8_t *mmio_base, const uint8_t id)<br />+{<br />+    uint8_t *addr_start = mmio_base + ZSDA_IO_Q_START + (4 * id);<br />+<br />+    ZSDA_CSR_WRITE32(addr_start, ZSDA_Q_START);<br />+    return zsda_check_write(addr_start, ZSDA_Q_START);<br />+}<br />+<br />+static int<br />+zsda_single_queue_stop(uint8_t *mmio_base, const uint8_t id)<br />+{<br />+    int ret;<br />+    uint8_t *addr_stop = mmio_base + ZSDA_IO_Q_STOP + (4 * id);<br />+    uint8_t *addr_resp = mmio_base + ZSDA_IO_Q_STOP_RESP + (4 * id);<br />+<br />+    ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID);<br />+    ZSDA_CSR_WRITE32(addr_stop, ZSDA_Q_STOP);<br />+<br />+    ret = zsda_check_write(addr_resp, ZSDA_RESP_VALID);<br />+    ZSDA_CSR_WRITE32(addr_resp, ZSDA_RESP_INVALID);<br />+<br />+    return ret;<br />+}<br />+<br /> static int<br /> zsda_single_queue_clear(uint8_t *mmio_base, const uint8_t id)<br /> {<br />@@ -144,6 +169,32 @@ zsda_single_queue_clear(uint8_t *mmio_base, const uint8_t id)<br />     return ret;<br /> }<br />  <br />+int<br />+zsda_queue_start(const struct rte_pci_device *pci_dev)<br />+{<br />+    uint8_t *mmio_base = pci_dev->mem_resource[0].addr;<br />+    uint8_t id;<br />+    int ret = ZSDA_SUCCESS;<br />+<br />+    for (id = 0; id < zsda_num_used_qps; id++)<br />+        ret |= zsda_single_queue_start(mmio_base, id);<br />+<br />+    return ret;<br />+}<br />+<br />+int<br />+zsda_queue_stop(const struct rte_pci_device *pci_dev)<br />+{<br />+    uint8_t *mmio_base = pci_dev->mem_resource[0].addr;<br />+    uint8_t id;<br />+    int ret = ZSDA_SUCCESS;<br />+<br />+    for (id = 0; id < zsda_num_used_qps; id++)<br />+        ret |= zsda_single_queue_stop(mmio_base, id);<br />+<br />+    return ret;<br />+}<br />+<br /> static int<br /> zsda_queue_clear(const struct rte_pci_device *pci_dev)<br /> {<br />diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h<br />index 0347b0f6cd..c07b8cc653 100644<br />--- a/drivers/common/zsda/zsda_qp.h<br />+++ b/drivers/common/zsda/zsda_qp.h<br />@@ -90,6 +90,9 @@ struct zsda_num_qps {<br />  <br /> extern struct zsda_num_qps zsda_nb_qps;<br />  <br />+int zsda_queue_start(const struct rte_pci_device *pci_dev);<br />+int zsda_queue_stop(const struct rte_pci_device *pci_dev);<br />+<br /> int zsda_queue_init(struct zsda_pci_device *zsda_pci_dev);<br />  <br /> #endif /* _ZSDA_QP_H_ */<br />diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h<br />index e69dd03bc9..550411dbc4 100644<br />--- a/drivers/common/zsda/zsda_qp_common.h<br />+++ b/drivers/common/zsda/zsda_qp_common.h<br />@@ -59,4 +59,38 @@ 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 /> #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 a9cb1f2996..07c03a8d13 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 />@@ -97,6 +218,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 />