]> git.droids-corp.org - dpdk.git/commitdiff
bus/dpaa: make vdqcr configurable
authorNipun Gupta <nipun.gupta@nxp.com>
Fri, 6 Jul 2018 08:10:05 +0000 (13:40 +0530)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 12 Jul 2018 12:39:54 +0000 (14:39 +0200)
This patch add support for configurable vdqcr exact flag.
This boost the performance, however this can give
side effects for some extra packet fetch. Which has been
taken care in the patch as well.

Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
Acked-by: Shreyansh Jain <shreyansh.jain@nxp.com>
drivers/bus/dpaa/base/qbman/qman.c
drivers/bus/dpaa/include/fsl_qman.h
drivers/crypto/dpaa_sec/dpaa_sec.c
drivers/net/dpaa/dpaa_rxtx.c

index 13c4315966bc4cf0bc445cbb5dad8b6b2404ec5d..f5fe5eff92abaee275d07a8b00c252e8fee28300 100644 (file)
@@ -2002,13 +2002,13 @@ int qman_query_congestion(struct qm_mcr_querycongestion *congestion)
        return 0;
 }
 
-int qman_set_vdq(struct qman_fq *fq, u16 num)
+int qman_set_vdq(struct qman_fq *fq, u16 num, uint32_t vdqcr_flags)
 {
        struct qman_portal *p = get_affine_portal();
        uint32_t vdqcr;
        int ret = -EBUSY;
 
-       vdqcr = QM_VDQCR_EXACT;
+       vdqcr = vdqcr_flags;
        vdqcr |= QM_VDQCR_NUMFRAMES_SET(num);
 
        if ((fq->state != qman_fq_state_parked) &&
index e4ad7ae48ad73eed089294b638f80dad8a634f34..b18cf037049deb82fa33dd53a2d87929acdbc75e 100644 (file)
@@ -1332,10 +1332,11 @@ unsigned int qman_portal_poll_rx(unsigned int poll_limit,
  * qman_set_vdq - Issue a volatile dequeue command
  * @fq: Frame Queue on which the volatile dequeue command is issued
  * @num: Number of Frames requested for volatile dequeue
+ * @vdqcr_flags: QM_VDQCR_EXACT flag to for VDQCR command
  *
  * This function will issue a volatile dequeue command to the QMAN.
  */
-int qman_set_vdq(struct qman_fq *fq, u16 num);
+int qman_set_vdq(struct qman_fq *fq, u16 num, uint32_t vdqcr_flags);
 
 /**
  * qman_dequeue - Get the DQRR entry after volatile dequeue command
index f8536b9494439ee6eb690fb4b465b88de43e5154..f571050b77361814b87c0cc73007abad64dd918c 100644 (file)
@@ -526,12 +526,25 @@ dpaa_sec_deq(struct dpaa_sec_qp *qp, struct rte_crypto_op **ops, int nb_ops)
 {
        struct qman_fq *fq;
        unsigned int pkts = 0;
-       int ret;
+       int num_rx_bufs, ret;
        struct qm_dqrr_entry *dq;
+       uint32_t vdqcr_flags = 0;
 
        fq = &qp->outq;
-       ret = qman_set_vdq(fq, (nb_ops > DPAA_MAX_DEQUEUE_NUM_FRAMES) ?
-                               DPAA_MAX_DEQUEUE_NUM_FRAMES : nb_ops);
+       /*
+        * Until request for four buffers, we provide exact number of buffers.
+        * Otherwise we do not set the QM_VDQCR_EXACT flag.
+        * Not setting QM_VDQCR_EXACT flag can provide two more buffers than
+        * requested, so we request two less in this case.
+        */
+       if (nb_ops < 4) {
+               vdqcr_flags = QM_VDQCR_EXACT;
+               num_rx_bufs = nb_ops;
+       } else {
+               num_rx_bufs = nb_ops > DPAA_MAX_DEQUEUE_NUM_FRAMES ?
+                       (DPAA_MAX_DEQUEUE_NUM_FRAMES - 2) : (nb_ops - 2);
+       }
+       ret = qman_set_vdq(fq, num_rx_bufs, vdqcr_flags);
        if (ret)
                return 0;
 
index 805bc305a74ec6babdb48fd0b4b805d4852d233e..168b77e49bb265823dee1c18f870af6a44329610 100644 (file)
@@ -560,7 +560,8 @@ uint16_t dpaa_eth_queue_rx(void *q,
        struct qman_fq *fq = q;
        struct qm_dqrr_entry *dq;
        uint32_t num_rx = 0, ifid = ((struct dpaa_if *)fq->dpaa_intf)->ifid;
-       int ret;
+       int num_rx_bufs, ret;
+       uint32_t vdqcr_flags = 0;
 
        if (likely(fq->is_static))
                return dpaa_eth_queue_portal_rx(fq, bufs, nb_bufs);
@@ -573,8 +574,19 @@ uint16_t dpaa_eth_queue_rx(void *q,
                }
        }
 
-       ret = qman_set_vdq(fq, (nb_bufs > DPAA_MAX_DEQUEUE_NUM_FRAMES) ?
-                               DPAA_MAX_DEQUEUE_NUM_FRAMES : nb_bufs);
+       /* Until request for four buffers, we provide exact number of buffers.
+        * Otherwise we do not set the QM_VDQCR_EXACT flag.
+        * Not setting QM_VDQCR_EXACT flag can provide two more buffers than
+        * requested, so we request two less in this case.
+        */
+       if (nb_bufs < 4) {
+               vdqcr_flags = QM_VDQCR_EXACT;
+               num_rx_bufs = nb_bufs;
+       } else {
+               num_rx_bufs = nb_bufs > DPAA_MAX_DEQUEUE_NUM_FRAMES ?
+                       (DPAA_MAX_DEQUEUE_NUM_FRAMES - 2) : (nb_bufs - 2);
+       }
+       ret = qman_set_vdq(fq, num_rx_bufs, vdqcr_flags);
        if (ret)
                return 0;