Add enqueue datapath for zsda.<br /> <br />Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn> <br />---<br /> drivers/common/zsda/zsda_qp.c | 105 ++++++++++++++++++++++++++++++++++<br /> drivers/common/zsda/zsda_qp.h |   2 +<br /> 2 files changed, 107 insertions(+)<br /> <br />diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c<br />index abaef974a9..42a3611448 100644<br />--- a/drivers/common/zsda/zsda_qp.c<br />+++ b/drivers/common/zsda/zsda_qp.c<br />@@ -677,6 +677,111 @@ zsda_queue_pair_release(struct zsda_qp **qp_addr)<br />     return ZSDA_SUCCESS;<br /> }<br />  <br />+static int<br />+zsda_find_next_free_cookie(const struct zsda_queue *queue, void **op_cookie,<br />+              uint16_t *idx)<br />+{<br />+    uint16_t old_tail = queue->tail;<br />+    uint16_t tail = queue->tail;<br />+    struct zsda_op_cookie *cookie;<br />+<br />+    do {<br />+        cookie = op_cookie[tail];<br />+        if (!cookie->used) {<br />+            *idx = tail & (queue->queue_size - 1);<br />+            return ZSDA_SUCCESS;<br />+        }<br />+        tail = zsda_modulo_16(tail++, queue->modulo_mask);<br />+    } while (old_tail != tail);<br />+<br />+    return -EINVAL;<br />+}<br />+<br />+static int<br />+zsda_enqueue(void *op, struct zsda_qp *qp)<br />+{<br />+    uint16_t new_tail;<br />+    enum zsda_service_type type;<br />+    void **op_cookie;<br />+    int ret = ZSDA_SUCCESS;<br />+    struct zsda_queue *queue;<br />+<br />+    for (type = 0; type < ZSDA_SERVICE_INVALID; type++) {<br />+        if (qp->srv[type].used) {<br />+            if (!qp->srv[type].match(op))<br />+                continue;<br />+            queue = &qp->srv[type].tx_q;<br />+            op_cookie = qp->srv[type].op_cookies;<br />+<br />+            if (zsda_find_next_free_cookie(queue, op_cookie,<br />+                          &new_tail)) {<br />+                ret = -EBUSY;<br />+                break;<br />+            }<br />+            ret = qp->srv[type].tx_cb(op, queue, op_cookie,<br />+                          new_tail);<br />+            if (ret) {<br />+                qp->srv[type].stats.enqueue_err_count++;<br />+                ZSDA_LOG(ERR, "Failed! config wqe");<br />+                break;<br />+            }<br />+            qp->srv[type].stats.enqueued_count++;<br />+<br />+            queue->tail = zsda_modulo_16(new_tail + 1,<br />+                             queue->queue_size - 1);<br />+<br />+            if (new_tail > queue->tail)<br />+                queue->valid =<br />+                    zsda_modulo_8(queue->valid + 1,<br />+                    (uint8_t)(queue->cycle_size - 1));<br />+<br />+            queue->pushed_wqe++;<br />+            break;<br />+        }<br />+    }<br />+<br />+    return ret;<br />+}<br />+<br />+static void<br />+zsda_tx_write_tail(struct zsda_queue *queue)<br />+{<br />+    if (queue->pushed_wqe)<br />+        WRITE_CSR_WQ_TAIL(queue->io_addr, queue->hw_queue_number,<br />+                  queue->tail);<br />+<br />+    queue->pushed_wqe = 0;<br />+}<br />+<br />+uint16_t<br />+zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, uint16_t nb_ops)<br />+{<br />+    int ret = ZSDA_SUCCESS;<br />+    enum zsda_service_type type;<br />+    uint16_t i;<br />+    uint16_t nb_send = 0;<br />+    void *op;<br />+<br />+    if (nb_ops > ZSDA_MAX_DESC) {<br />+        ZSDA_LOG(ERR, "Enqueue number bigger than %d", ZSDA_MAX_DESC);<br />+        return 0;<br />+    }<br />+<br />+    for (i = 0; i < nb_ops; i++) {<br />+        op = ops[i];<br />+        ret = zsda_enqueue(op, qp);<br />+        if (ret < 0)<br />+            break;<br />+        nb_send++;<br />+    }<br />+<br />+    for (type = 0; type < ZSDA_SERVICE_INVALID; type++)<br />+        if (qp->srv[type].used)<br />+            zsda_tx_write_tail(&qp->srv[type].tx_q);<br />+<br />+    return nb_send;<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 />diff --git a/drivers/common/zsda/zsda_qp.h b/drivers/common/zsda/zsda_qp.h<br />index a9f0d38ba5..f9efff0e5a 100644<br />--- a/drivers/common/zsda/zsda_qp.h<br />+++ b/drivers/common/zsda/zsda_qp.h<br />@@ -135,6 +135,8 @@ int zsda_get_queue_cfg(struct zsda_pci_device *zsda_pci_dev);<br />  <br /> int zsda_queue_pair_release(struct zsda_qp **qp_addr);<br />  <br />+uint16_t zsda_enqueue_op_burst(struct zsda_qp *qp, void **ops, const uint16_t nb_ops);<br />+<br /> int zsda_common_setup_qp(uint32_t dev_id, struct zsda_qp **qp_addr,<br />             const uint16_t queue_pair_id,<br />             const struct zsda_qp_config *conf);<br />--  <br />2.27.0<br />