Add zsda compressdev qp interface implementation.<br /> <br />Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn> <br />---<br /> drivers/common/zsda/zsda_device.c     |   1 -<br /> drivers/common/zsda/zsda_device.h     |   3 +-<br /> drivers/common/zsda/zsda_qp.c         | 248 ++++++++++++++++++++++++++<br /> drivers/common/zsda/zsda_qp.h         | 122 +++++++++----<br /> drivers/common/zsda/zsda_qp_common.c  |   2 +-<br /> drivers/common/zsda/zsda_qp_common.h  |  67 +++++++<br /> drivers/compress/zsda/zsda_comp_pmd.c | 107 ++++++++++-<br /> 7 files changed, 507 insertions(+), 43 deletions(-)<br /> <br />diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c<br />index 5c835651ea..5297c80ef9 100644<br />--- a/drivers/common/zsda/zsda_device.c<br />+++ b/drivers/common/zsda/zsda_device.c<br />@@ -11,7 +11,6 @@<br /> #include "zsda_device.h" <br /> #include "zsda_logs.h" <br /> #include "zsda_qp.h" <br />-<br /> /* per-process array of device data */<br /> struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES];<br /> static int zsda_nb_pci_devices;<br />diff --git a/drivers/common/zsda/zsda_device.h b/drivers/common/zsda/zsda_device.h<br />index b744e8df2d..0bd1805d25 100644<br />--- a/drivers/common/zsda/zsda_device.h<br />+++ b/drivers/common/zsda/zsda_device.h<br />@@ -5,13 +5,12 @@<br /> #ifndef _ZSDA_DEVICE_H_<br /> #define _ZSDA_DEVICE_H_<br />  <br />-#include <rte_memzone.h> <br /> #include "bus_pci_driver.h" <br />+<br /> #include "zsda_qp_common.h" <br />  <br /> #define MAX_QPS_ON_FUNCTION        128<br /> #define ZSDA_DEV_NAME_MAX_LEN    64<br />-#define ZSDA_MAX_DEV RTE_PMD_ZSDA_MAX_PCI_DEVICES<br />  <br /> struct zsda_device_info {<br />     const struct rte_memzone *mz;<br />diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c<br />index 7e000d5b3f..658b0b69e3 100644<br />--- a/drivers/common/zsda/zsda_qp.c<br />+++ b/drivers/common/zsda/zsda_qp.c<br />@@ -12,6 +12,8 @@<br /> #define MAGIC_SEND 0xab<br /> #define MAGIC_RECV 0xcd<br /> #define ADMIN_VER 1<br />+#define RING_DIR_TX 0<br />+#define RING_DIR_RX 1<br />  <br /> static uint8_t zsda_num_used_qps;<br />  <br />@@ -523,3 +525,249 @@ zsda_queue_init(struct zsda_pci_device *zsda_pci_dev)<br />  <br />     return ret;<br /> }<br />+<br />+struct zsda_qp_hw *<br />+zsda_qps_hw_per_service(struct zsda_pci_device *zsda_pci_dev,<br />+            const enum zsda_service_type service)<br />+{<br />+    struct zsda_qp_hw *qp_hw = NULL;<br />+<br />+    if (service < ZSDA_SERVICE_INVALID)<br />+        qp_hw = &(zsda_pci_dev->zsda_hw_qps[service]);<br />+<br />+    return qp_hw;<br />+}<br />+<br />+static const struct rte_memzone *<br />+zsda_queue_dma_zone_reserve(const char *queue_name,<br />+                const unsigned int queue_size,<br />+                const unsigned int socket_id)<br />+{<br />+    const struct rte_memzone *mz;<br />+<br />+    mz = rte_memzone_lookup(queue_name);<br />+    if (mz != 0) {<br />+        if (((size_t)queue_size <= mz->len) && <br />+            ((socket_id == (SOCKET_ID_ANY & 0xffff)) ||<br />+             (socket_id == (mz->socket_id & 0xffff)))) {<br />+            ZSDA_LOG(DEBUG,<br />+                 "re-use memzone already allocated for %s",<br />+                 queue_name);<br />+            return mz;<br />+        }<br />+        ZSDA_LOG(ERR, "Failed! queue_name exist");<br />+        return NULL;<br />+    }<br />+<br />+    mz = rte_memzone_reserve_aligned(queue_name, queue_size,<br />+                       (int)(socket_id & 0xfff),<br />+                       RTE_MEMZONE_IOVA_CONTIG, queue_size);<br />+<br />+    return mz;<br />+}<br />+<br />+static int<br />+zsda_queue_create(const uint32_t dev_id, struct zsda_queue *queue,<br />+          const struct zsda_qp_config *qp_conf, const uint8_t dir)<br />+{<br />+    void *io_addr;<br />+    const struct rte_memzone *qp_mz;<br />+    struct qinfo qcfg = {0};<br />+<br />+    uint16_t desc_size = ((dir == RING_DIR_TX) ? qp_conf->hw->tx_msg_size<br />+                           : qp_conf->hw->rx_msg_size);<br />+    unsigned int queue_size_bytes = qp_conf->nb_descriptors * desc_size;<br />+<br />+    queue->hw_queue_number =<br />+        ((dir == RING_DIR_TX) ? qp_conf->hw->tx_ring_num<br />+                      : qp_conf->hw->rx_ring_num);<br />+<br />+    struct rte_pci_device *pci_dev = zsda_devs[dev_id].pci_dev;<br />+    struct zsda_pci_device *zsda_dev =<br />+        (struct zsda_pci_device *)zsda_devs[dev_id].mz->addr;<br />+<br />+    zsda_get_queue_cfg_by_id(zsda_dev, queue->hw_queue_number, &qcfg);<br />+<br />+    if (dir == RING_DIR_TX)<br />+        snprintf(queue->memz_name, sizeof(queue->memz_name),<br />+             "%s_%d_%s_%s_%d", pci_dev->driver->driver.name, dev_id,<br />+             qp_conf->service_str, "qptxmem",<br />+             queue->hw_queue_number);<br />+    else<br />+        snprintf(queue->memz_name, sizeof(queue->memz_name),<br />+             "%s_%d_%s_%s_%d", pci_dev->driver->driver.name, dev_id,<br />+             qp_conf->service_str, "qprxmem",<br />+             queue->hw_queue_number);<br />+<br />+    qp_mz = zsda_queue_dma_zone_reserve(queue->memz_name, queue_size_bytes,<br />+                       rte_socket_id());<br />+    if (qp_mz == NULL) {<br />+        ZSDA_LOG(ERR, "Failed! qp_mz is NULL");<br />+        return -ENOMEM;<br />+    }<br />+<br />+    queue->base_addr = qp_mz->addr;<br />+    queue->base_phys_addr = qp_mz->iova;<br />+    queue->modulo_mask = MAX_NUM_OPS;<br />+    queue->msg_size = desc_size;<br />+<br />+    queue->head = (dir == RING_DIR_TX) ? qcfg.wq_head : qcfg.cq_head;<br />+    queue->tail = (dir == RING_DIR_TX) ? qcfg.wq_tail : qcfg.cq_tail;<br />+<br />+    if ((queue->head == 0) && (queue->tail == 0))<br />+        qcfg.cycle += 1;<br />+<br />+    queue->valid = qcfg.cycle & (ZSDA_MAX_CYCLE - 1);<br />+    queue->queue_size = ZSDA_MAX_DESC;<br />+    queue->cycle_size = ZSDA_MAX_CYCLE;<br />+    queue->io_addr = pci_dev->mem_resource[0].addr;<br />+<br />+    memset(queue->base_addr, 0x0, queue_size_bytes);<br />+    io_addr = pci_dev->mem_resource[0].addr;<br />+<br />+    if (dir == RING_DIR_TX)<br />+        ZSDA_CSR_WQ_RING_BASE(io_addr, queue->hw_queue_number,<br />+                      queue->base_phys_addr);<br />+    else<br />+        ZSDA_CSR_CQ_RING_BASE(io_addr, queue->hw_queue_number,<br />+                      queue->base_phys_addr);<br />+<br />+    return 0;<br />+}<br />+<br />+static int<br />+zsda_cookie_init(const uint32_t dev_id, struct zsda_qp **qp_addr,<br />+        const uint16_t queue_pair_id,<br />+        const struct zsda_qp_config *zsda_qp_conf)<br />+{<br />+    struct zsda_qp *qp = *qp_addr;<br />+    struct rte_pci_device *pci_dev = zsda_devs[dev_id].pci_dev;<br />+    char op_cookie_pool_name[RTE_RING_NAMESIZE];<br />+    uint32_t i;<br />+    enum zsda_service_type type = zsda_qp_conf->service_type;<br />+<br />+    if (zsda_qp_conf->nb_descriptors != ZSDA_MAX_DESC)<br />+        ZSDA_LOG(ERR, "Can't create qp for %u descriptors",<br />+             zsda_qp_conf->nb_descriptors);<br />+<br />+    qp->srv[type].nb_descriptors = zsda_qp_conf->nb_descriptors;<br />+<br />+    qp->srv[type].op_cookies = rte_zmalloc_socket(<br />+        "zsda PMD op cookie pointer",<br />+        zsda_qp_conf->nb_descriptors *<br />+            sizeof(*qp->srv[type].op_cookies),<br />+        RTE_CACHE_LINE_SIZE, zsda_qp_conf->socket_id);<br />+<br />+    if (qp->srv[type].op_cookies == NULL) {<br />+        ZSDA_LOG(ERR, "Failed! op_cookies is NULL");<br />+        return -ENOMEM;<br />+    }<br />+<br />+    snprintf(op_cookie_pool_name, RTE_RING_NAMESIZE, "%s%d_cks_%s_qp%hu",<br />+         pci_dev->driver->driver.name, dev_id,<br />+         zsda_qp_conf->service_str, queue_pair_id);<br />+<br />+    qp->srv[type].op_cookie_pool = rte_mempool_lookup(op_cookie_pool_name);<br />+    if (qp->srv[type].op_cookie_pool == NULL)<br />+        qp->srv[type].op_cookie_pool = rte_mempool_create(<br />+            op_cookie_pool_name, qp->srv[type].nb_descriptors,<br />+            zsda_qp_conf->cookie_size, 64, 0, NULL, NULL, NULL,<br />+            NULL, (int)(rte_socket_id() & 0xfff), 0);<br />+    if (!qp->srv[type].op_cookie_pool) {<br />+        ZSDA_LOG(ERR, "Failed! op_cookie_pool is NULL");<br />+        goto exit;<br />+    }<br />+<br />+    for (i = 0; i < qp->srv[type].nb_descriptors; i++) {<br />+        if (rte_mempool_get(qp->srv[type].op_cookie_pool,<br />+                    &qp->srv[type].op_cookies[i])) {<br />+            ZSDA_LOG(ERR, "ZSDA PMD Cannot get op_cookie");<br />+            goto exit;<br />+        }<br />+        memset(qp->srv[type].op_cookies[i], 0,<br />+               zsda_qp_conf->cookie_size);<br />+    }<br />+    return ZSDA_SUCCESS;<br />+<br />+exit:<br />+<br />+    rte_mempool_free(qp->srv[type].op_cookie_pool);<br />+    rte_free(qp->srv[type].op_cookies);<br />+<br />+    return -EFAULT;<br />+}<br />+<br />+static int<br />+zsda_queue_pair_setup(const uint32_t dev_id, struct zsda_qp **qp_addr,<br />+              const uint16_t queue_pair_id,<br />+              const struct zsda_qp_config *zsda_qp_conf)<br />+{<br />+    struct zsda_qp *qp = *qp_addr;<br />+    struct rte_pci_device *pci_dev = zsda_devs[dev_id].pci_dev;<br />+    int ret;<br />+    enum zsda_service_type type = zsda_qp_conf->service_type;<br />+<br />+    if (type >= ZSDA_SERVICE_INVALID) {<br />+        ZSDA_LOG(ERR, "Failed! service type");<br />+        return -EINVAL;<br />+    }<br />+<br />+    if (pci_dev->mem_resource[0].addr == NULL) {<br />+        ZSDA_LOG(ERR, "Failed! mem_resource[0].addr is NULL");<br />+        return -EINVAL;<br />+    }<br />+<br />+    if (zsda_queue_create(dev_id, &(qp->srv[type].tx_q), zsda_qp_conf,<br />+                  RING_DIR_TX) != 0) {<br />+        ZSDA_LOG(ERR, "Failed! zsda_queue_create tx");<br />+        return -EFAULT;<br />+    }<br />+<br />+    if (zsda_queue_create(dev_id, &(qp->srv[type].rx_q), zsda_qp_conf,<br />+                  RING_DIR_RX) != 0) {<br />+        ZSDA_LOG(ERR, "Failed! zsda_queue_create rx");<br />+        zsda_queue_delete(&(qp->srv[type].tx_q));<br />+        return -EFAULT;<br />+    }<br />+<br />+    ret = zsda_cookie_init(dev_id, qp_addr, queue_pair_id, zsda_qp_conf);<br />+    if (ret) {<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 />+    }<br />+    qp->srv[type].used = true;<br />+    return ret;<br />+}<br />+<br />+int<br />+zsda_common_setup_qp(uint32_t zsda_dev_id, struct zsda_qp **qp_addr,<br />+        const uint16_t queue_pair_id, const struct zsda_qp_config *conf)<br />+{<br />+    uint32_t i;<br />+    int ret;<br />+    struct zsda_qp *qp;<br />+    rte_iova_t cookie_phys_addr;<br />+<br />+    ret = zsda_queue_pair_setup(zsda_dev_id, qp_addr, queue_pair_id, conf);<br />+    if (ret)<br />+        return ret;<br />+<br />+    qp = (struct zsda_qp *)*qp_addr;<br />+<br />+    for (i = 0; i < qp->srv[conf->service_type].nb_descriptors; i++) {<br />+        struct zsda_op_cookie *cookie =<br />+            qp->srv[conf->service_type].op_cookies[i];<br />+        cookie_phys_addr = rte_mempool_virt2iova(cookie);<br />+<br />+        cookie->comp_head_phys_addr = cookie_phys_addr +<br />+            offsetof(struct zsda_op_cookie, comp_head);<br />+<br />+        cookie->sgl_src_phys_addr = cookie_phys_addr +<br />+            offsetof(struct zsda_op_cookie, sgl_src);<br />+<br />+        cookie->sgl_dst_phys_addr = cookie_phys_addr +<br />+            offsetof(struct zsda_op_cookie, sgl_dst);<br />+    }<br />+    return ret;<br />+}<br />diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h<br />index 194adbc1fa..c9c78f4a8c 100644<br />--- a/drivers/common/zsda/zsda_qp.h<br />+++ b/drivers/common/zsda/zsda_qp.h<br />@@ -5,6 +5,8 @@<br /> #ifndef _ZSDA_QP_H_<br /> #define _ZSDA_QP_H_<br />  <br />+#include "zsda_qp_common.h" <br />+<br /> #include "zsda_device.h" <br />  <br /> #define ZSDA_ADMIN_Q_START        0x100<br />@@ -50,6 +52,49 @@<br /> #define ZSDA_TIME_SLEEP_US    100<br /> #define ZSDA_TIME_NUM        500<br />  <br />+#define WQ_CSR_LBASE 0x1000<br />+#define WQ_CSR_UBASE 0x1004<br />+#define CQ_CSR_LBASE 0x1400<br />+#define CQ_CSR_UBASE 0x1404<br />+#define WQ_TAIL         0x1800<br />+#define CQ_HEAD         0x1804<br />+<br />+/* CSR write macro */<br />+#define ZSDA_CSR_WR(csrAddr, csrOffset, val)                                   \<br />+    rte_write32(val, (((uint8_t *)csrAddr) + csrOffset))<br />+#define ZSDA_CSR_WC_WR(csrAddr, csrOffset, val)                                \<br />+    rte_write32_wc(val, (((uint8_t *)csrAddr) + csrOffset))<br />+<br />+/* CSR read macro */<br />+#define ZSDA_CSR_RD(csrAddr, csrOffset)                                        \<br />+    rte_read32((((uint8_t *)csrAddr) + csrOffset))<br />+<br />+#define ZSDA_CSR_WQ_RING_BASE(csr_base_addr, ring, value)                      \<br />+    do {                                                                   \<br />+        uint32_t l_base = 0, u_base = 0;                               \<br />+        l_base = (uint32_t)(value & 0xFFFFFFFF);                       \<br />+        u_base = (uint32_t)((value & 0xFFFFFFFF00000000ULL) >> 32);    \<br />+        ZSDA_CSR_WR(csr_base_addr, (ring << 3) + WQ_CSR_LBASE,         \<br />+                l_base);                                           \<br />+        ZSDA_LOG(INFO, "l_basg - offset:0x%x, value:0x%x",             \<br />+             ((ring << 3) + WQ_CSR_LBASE), l_base);                \<br />+        ZSDA_CSR_WR(csr_base_addr, (ring << 3) + WQ_CSR_UBASE,         \<br />+                u_base);                                           \<br />+        ZSDA_LOG(INFO, "h_base - offset:0x%x, value:0x%x",             \<br />+             ((ring << 3) + WQ_CSR_UBASE), u_base);                \<br />+    } while (0)<br />+<br />+#define ZSDA_CSR_CQ_RING_BASE(csr_base_addr, ring, value)                      \<br />+    do {                                                                   \<br />+        uint32_t l_base = 0, u_base = 0;                               \<br />+        l_base = (uint32_t)(value & 0xFFFFFFFF);                       \<br />+        u_base = (uint32_t)((value & 0xFFFFFFFF00000000ULL) >> 32);    \<br />+        ZSDA_CSR_WR(csr_base_addr, (ring << 3) + CQ_CSR_LBASE,         \<br />+                l_base);                                           \<br />+        ZSDA_CSR_WR(csr_base_addr, (ring << 3) + CQ_CSR_UBASE,         \<br />+                u_base);                                           \<br />+    } while (0)<br />+<br /> extern struct zsda_num_qps zsda_nb_qps;<br />  <br /> enum zsda_admin_msg_id {<br />@@ -79,43 +124,6 @@ struct ring_size {<br />     uint16_t rx_msg_size;<br /> };<br />  <br />-struct zsda_admin_req {<br />-    uint16_t msg_type;<br />-    uint8_t data[26];<br />-} __rte_packed;<br />-<br />-struct zsda_admin_resp {<br />-    uint16_t msg_type;<br />-    uint8_t data[26];<br />-} __rte_packed;<br />-<br />-struct zsda_admin_req_qcfg {<br />-    uint16_t msg_type;<br />-    uint8_t qid;<br />-    uint8_t data[25];<br />-} __rte_packed;<br />-<br />-struct zsda_test_msg {<br />-    uint32_t msg_type;<br />-    uint32_t data_in;<br />-    uint8_t data[20];<br />-} __rte_packed;<br />-<br />-struct qinfo {<br />-    uint16_t q_type;<br />-    uint16_t wq_tail;<br />-    uint16_t wq_head;<br />-    uint16_t cq_tail;<br />-    uint16_t cq_head;<br />-    uint16_t cycle;<br />-} __rte_packed;<br />-<br />-struct zsda_admin_resp_qcfg {<br />-    uint16_t msg_type;<br />-    struct qinfo qcfg;<br />-    uint8_t data[14];<br />-} __rte_packed;<br />-<br /> struct zsda_num_qps {<br />     uint16_t encomp;<br />     uint16_t decomp;<br />@@ -124,6 +132,39 @@ struct zsda_num_qps {<br />     uint16_t hash;<br /> };<br />  <br />+struct zsda_qp_config {<br />+    enum zsda_service_type service_type;<br />+    const struct zsda_qp_hw_data *hw;<br />+    uint16_t nb_descriptors;<br />+    uint32_t cookie_size;<br />+    int socket_id;<br />+    const char *service_str;<br />+};<br />+<br />+struct zsda_buf {<br />+    uint64_t addr;<br />+    uint32_t len;<br />+    uint8_t resrvd[3];<br />+    uint8_t type;<br />+} __rte_packed;<br />+<br />+struct __rte_cache_aligned zsda_sgl {<br />+    struct zsda_buf buffers[ZSDA_SGL_MAX_NUMBER];<br />+};<br />+<br />+struct zsda_op_cookie {<br />+    struct zsda_sgl sgl_src;<br />+    struct zsda_sgl sgl_dst;<br />+    phys_addr_t sgl_src_phys_addr;<br />+    phys_addr_t sgl_dst_phys_addr;<br />+    phys_addr_t comp_head_phys_addr;<br />+    uint8_t comp_head[COMP_REMOVE_SPACE_LEN];<br />+    uint16_t sid;<br />+    bool used;<br />+    bool decomp_no_tail;<br />+    void *op;<br />+};<br />+<br /> extern struct zsda_num_qps zsda_nb_qps;<br />  <br /> int zsda_queue_start(const struct rte_pci_device *pci_dev);<br />@@ -131,4 +172,11 @@ 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 />+struct zsda_qp_hw *<br />+zsda_qps_hw_per_service(struct zsda_pci_device *zsda_pci_dev,<br />+            const enum zsda_service_type service);<br />+<br />+int zsda_common_setup_qp(uint32_t dev_id, struct zsda_qp **qp_addr,<br />+        const uint16_t queue_pair_id, const struct zsda_qp_config *conf);<br />+<br /> #endif /* _ZSDA_QP_H_ */<br />diff --git a/drivers/common/zsda/zsda_qp_common.c b/drivers/common/zsda/zsda_qp_common.c<br />index 70367e6c82..577392871f 100644<br />--- a/drivers/common/zsda/zsda_qp_common.c<br />+++ b/drivers/common/zsda/zsda_qp_common.c<br />@@ -4,7 +4,7 @@<br />  <br /> #include "zsda_qp_common.h" <br />  <br />-static void<br />+void<br /> zsda_queue_delete(const struct zsda_queue *queue)<br /> {<br />     const struct rte_memzone *mz;<br />diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h<br />index 603c0e9e3a..de746ad00b 100644<br />--- a/drivers/common/zsda/zsda_qp_common.h<br />+++ b/drivers/common/zsda/zsda_qp_common.h<br />@@ -31,6 +31,52 @@ enum zsda_service_type {<br /> #define ZSDA_CSR_READ8(addr)          rte_read8((addr))<br /> #define ZSDA_CSR_WRITE8(addr, value)  rte_write8_relaxed((value), (addr))<br />  <br />+#define NB_DES                    512<br />+#define ZSDA_SGL_MAX_NUMBER        512<br />+#define COMP_REMOVE_SPACE_LEN 16<br />+<br />+#define ZSDA_MAX_DESC        512<br />+#define ZSDA_MAX_CYCLE        256<br />+#define ZSDA_MAX_DEV        RTE_PMD_ZSDA_MAX_PCI_DEVICES<br />+#define MAX_NUM_OPS            0x1FF<br />+<br />+struct zsda_admin_req {<br />+    uint16_t msg_type;<br />+    uint8_t data[26];<br />+} __rte_packed;<br />+<br />+struct zsda_admin_resp {<br />+    uint16_t msg_type;<br />+    uint8_t data[26];<br />+} __rte_packed;<br />+<br />+struct zsda_admin_req_qcfg {<br />+    uint16_t msg_type;<br />+    uint8_t qid;<br />+    uint8_t data[25];<br />+} __rte_packed;<br />+<br />+struct zsda_test_msg {<br />+    uint32_t msg_type;<br />+    uint32_t data_in;<br />+    uint8_t data[20];<br />+} __rte_packed;<br />+<br />+struct qinfo {<br />+    uint16_t q_type;<br />+    uint16_t wq_tail;<br />+    uint16_t wq_head;<br />+    uint16_t cq_tail;<br />+    uint16_t cq_head;<br />+    uint16_t cycle;<br />+} __rte_packed;<br />+<br />+struct zsda_admin_resp_qcfg {<br />+    uint16_t msg_type;<br />+    struct qinfo qcfg;<br />+    uint8_t data[14];<br />+} __rte_packed;<br />+<br /> struct zsda_queue {<br />     char memz_name[RTE_MEMZONE_NAMESIZE];<br />     uint8_t *io_addr;<br />@@ -64,10 +110,30 @@ struct zsda_qp_stat {<br />     uint64_t dequeue_err_count;<br /> };<br />  <br />+struct zsda_cqe {<br />+    uint8_t valid; /* cqe_cycle */<br />+    uint8_t op_code;<br />+    uint16_t sid;<br />+    uint8_t state;<br />+    uint8_t result;<br />+    uint16_t zsda_wq_id;<br />+    uint32_t tx_real_length;<br />+    uint16_t err0;<br />+    uint16_t err1;<br />+} __rte_packed;<br />+<br />+typedef int (*rx_callback)(void *cookie_in, struct zsda_cqe *cqe);<br />+typedef int (*tx_callback)(void *op_in, const struct zsda_queue *queue,<br />+               void **op_cookies, const uint16_t new_tail);<br />+typedef int (*srv_match)(const void *op_in);<br />+<br /> struct qp_srv {<br />     bool used;<br />     struct zsda_queue tx_q;<br />     struct zsda_queue rx_q;<br />+    rx_callback rx_cb;<br />+    tx_callback tx_cb;<br />+    srv_match match;<br />     struct zsda_qp_stat stats;<br />     struct rte_mempool *op_cookie_pool;<br />     void **op_cookies;<br />@@ -82,5 +148,6 @@ int zsda_queue_pair_release(struct zsda_qp **qp_addr);<br /> void zsda_stats_get(void **queue_pairs, const uint32_t nb_queue_pairs,<br />           struct zsda_qp_stat *stats);<br /> void zsda_stats_reset(void **queue_pairs, const uint32_t nb_queue_pairs);<br />+void zsda_queue_delete(const struct zsda_queue *queue);<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 e9682e93cd..9824f7c83f 100644<br />--- a/drivers/compress/zsda/zsda_comp_pmd.c<br />+++ b/drivers/compress/zsda/zsda_comp_pmd.c<br />@@ -210,6 +210,109 @@ zsda_comp_private_xform_free(struct rte_compressdev *dev __rte_unused,<br />     return -EINVAL;<br /> }<br />  <br />+static int<br />+zsda_setup_comp_queue(struct zsda_pci_device *zsda_pci_dev, const uint16_t qp_id,<br />+         struct zsda_qp *qp, uint16_t nb_des, int socket_id)<br />+{<br />+    enum zsda_service_type type = ZSDA_SERVICE_ENCOMPRESSION;<br />+    struct zsda_qp_config conf;<br />+    int ret;<br />+    struct zsda_qp_hw *qp_hw;<br />+<br />+    qp_hw = zsda_qps_hw_per_service(zsda_pci_dev, type);<br />+    conf.hw = qp_hw->data + qp_id;<br />+    conf.service_type = type;<br />+    conf.cookie_size = sizeof(struct zsda_op_cookie);<br />+    conf.nb_descriptors = nb_des;<br />+    conf.socket_id = socket_id;<br />+    conf.service_str = "comp";<br />+<br />+    ret = zsda_common_setup_qp(zsda_pci_dev->zsda_dev_id, &qp, qp_id, &conf);<br />+    qp->srv[type].rx_cb = NULL;<br />+    qp->srv[type].tx_cb = NULL;<br />+    qp->srv[type].match = NULL;<br />+<br />+    return ret;<br />+}<br />+<br />+static int<br />+zsda_setup_decomp_queue(struct zsda_pci_device *zsda_pci_dev, const uint16_t qp_id,<br />+           struct zsda_qp *qp, uint16_t nb_des, int socket_id)<br />+{<br />+    enum zsda_service_type type = ZSDA_SERVICE_DECOMPRESSION;<br />+    struct zsda_qp_config conf;<br />+    int ret;<br />+    struct zsda_qp_hw *qp_hw;<br />+<br />+    qp_hw = zsda_qps_hw_per_service(zsda_pci_dev, type);<br />+    conf.hw = qp_hw->data + qp_id;<br />+    conf.service_type = type;<br />+    conf.cookie_size = sizeof(struct zsda_op_cookie);<br />+    conf.nb_descriptors = nb_des;<br />+    conf.socket_id = socket_id;<br />+    conf.service_str = "decomp";<br />+<br />+    ret = zsda_common_setup_qp(zsda_pci_dev->zsda_dev_id, &qp, qp_id, &conf);<br />+    qp->srv[type].rx_cb = NULL;<br />+    qp->srv[type].tx_cb = NULL;<br />+    qp->srv[type].match = NULL;<br />+<br />+    return ret;<br />+}<br />+<br />+static int<br />+zsda_comp_qp_setup(struct rte_compressdev *dev, uint16_t qp_id,<br />+           uint32_t max_inflight_ops, int socket_id)<br />+{<br />+    int ret = ZSDA_SUCCESS;<br />+    struct zsda_qp *qp_new;<br />+<br />+    struct zsda_qp **qp_addr =<br />+        (struct zsda_qp **)&(dev->data->queue_pairs[qp_id]);<br />+    struct zsda_comp_dev_private *comp_priv = dev->data->dev_private;<br />+    struct zsda_pci_device *zsda_pci_dev = comp_priv->zsda_pci_dev;<br />+    uint16_t num_qps_comp = zsda_nb_qps.encomp;<br />+    uint16_t num_qps_decomp = zsda_nb_qps.decomp;<br />+    uint16_t nb_des = max_inflight_ops & 0xffff;<br />+<br />+    nb_des = (nb_des == NB_DES) ? nb_des : NB_DES;<br />+<br />+    if (*qp_addr != NULL) {<br />+        ret = zsda_comp_qp_release(dev, qp_id);<br />+        if (ret)<br />+            return ret;<br />+    }<br />+<br />+    qp_new = rte_zmalloc_socket("zsda PMD qp metadata", sizeof(*qp_new),<br />+                    RTE_CACHE_LINE_SIZE, socket_id);<br />+    if (qp_new == NULL) {<br />+        ZSDA_LOG(ERR, "Failed! qp_new is NULL");<br />+        return -ENOMEM;<br />+    }<br />+<br />+    if (num_qps_comp == MAX_QPS_ON_FUNCTION)<br />+        ret = zsda_setup_comp_queue(zsda_pci_dev, qp_id, qp_new, nb_des,<br />+                    socket_id);<br />+    else if (num_qps_decomp == MAX_QPS_ON_FUNCTION)<br />+        ret = zsda_setup_decomp_queue(zsda_pci_dev, qp_id, qp_new, nb_des,<br />+                      socket_id);<br />+    else {<br />+        ret = zsda_setup_comp_queue(zsda_pci_dev, qp_id, qp_new, nb_des,<br />+                    socket_id);<br />+        ret |= zsda_setup_decomp_queue(zsda_pci_dev, qp_id, qp_new, nb_des,<br />+                      socket_id);<br />+    }<br />+<br />+    if (ret) {<br />+        rte_free(qp_new);<br />+        return ret;<br />+    }<br />+<br />+    *qp_addr = qp_new;<br />+<br />+    return ret;<br />+}<br />+<br /> static struct rte_compressdev_ops compress_zsda_ops = {<br />  <br />     .dev_configure = zsda_comp_dev_config,<br />@@ -220,8 +323,8 @@ static struct rte_compressdev_ops compress_zsda_ops = {<br />  <br />     .stats_get = zsda_comp_stats_get,<br />     .stats_reset = zsda_comp_stats_reset,<br />-    .queue_pair_setup = NULL,<br />-    .queue_pair_release = NULL,<br />+    .queue_pair_setup = zsda_comp_qp_setup,<br />+    .queue_pair_release = zsda_comp_qp_release,<br />  <br />     .private_xform_create = zsda_comp_private_xform_create,<br />     .private_xform_free = zsda_comp_private_xform_free,<br />--  <br />2.27.0<br />