From: Jun Yang <jun.y...@nxp.com>

add silent mode support.

Signed-off-by: Jun Yang <jun.y...@nxp.com>
Signed-off-by: Gagandeep Singh <g.si...@nxp.com>
---
 drivers/dma/dpaa/dpaa_qdma.c | 46 ++++++++++++++++++++++++++++++++----
 drivers/dma/dpaa/dpaa_qdma.h |  1 +
 2 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/drivers/dma/dpaa/dpaa_qdma.c b/drivers/dma/dpaa/dpaa_qdma.c
index bb0d1a2bd4..3ae87fdf80 100644
--- a/drivers/dma/dpaa/dpaa_qdma.c
+++ b/drivers/dma/dpaa/dpaa_qdma.c
@@ -119,6 +119,7 @@ dma_pool_alloc(char *nm, int size, int aligned, dma_addr_t 
*phy_addr)
 static int
 fsl_qdma_pre_comp_sd_desc(struct fsl_qdma_queue *queue)
 {
+       struct fsl_qdma_engine *fsl_qdma = queue->engine;
        struct fsl_qdma_sdf *sdf;
        struct fsl_qdma_ddf *ddf;
        struct fsl_qdma_comp_cmd_desc *ccdf;
@@ -173,7 +174,8 @@ fsl_qdma_pre_comp_sd_desc(struct fsl_qdma_queue *queue)
                ccdf = &queue->cq[i];
                qdma_desc_addr_set64(ccdf, phy_ft);
                ccdf->format = FSL_QDMA_COMP_SG_FORMAT;
-
+               if (!fsl_qdma->is_silent)
+                       ccdf->ser = 1;
                ccdf->queue = queue->queue_id;
        }
        queue->ci = 0;
@@ -579,9 +581,12 @@ static int
 fsl_qdma_enqueue_desc_to_ring(struct fsl_qdma_queue *fsl_queue,
        uint16_t num)
 {
+       struct fsl_qdma_engine *fsl_qdma = fsl_queue->engine;
        uint16_t i, idx, start, dq;
        int ret, dq_cnt;
 
+       if (fsl_qdma->is_silent)
+               return 0;
 
        fsl_queue->desc_in_hw[fsl_queue->ci] = num;
 eq_again:
@@ -626,17 +631,34 @@ static int
 fsl_qdma_enqueue_overflow(struct fsl_qdma_queue *fsl_queue)
 {
        int overflow = 0;
+       uint32_t reg;
        uint16_t blk_drain, check_num, drain_num;
+       uint8_t *block = fsl_queue->block_vir;
        const struct rte_dma_stats *st = &fsl_queue->stats;
        struct fsl_qdma_engine *fsl_qdma = fsl_queue->engine;
 
        check_num = 0;
 overflow_check:
-       overflow = (fsl_qdma_queue_bd_in_hw(fsl_queue) >=
+       if (fsl_qdma->is_silent) {
+               reg = qdma_readl_be(block +
+                        FSL_QDMA_BCQSR(fsl_queue->queue_id));
+               overflow = (reg & FSL_QDMA_BCQSR_QF_XOFF_BE) ?
+                       1 : 0;
+       } else {
+               overflow = (fsl_qdma_queue_bd_in_hw(fsl_queue) >=
                        QDMA_QUEUE_CR_WM) ? 1 : 0;
+       }
 
-       if (likely(!overflow))
+       if (likely(!overflow)) {
                return 0;
+       } else if (fsl_qdma->is_silent) {
+               check_num++;
+               if (check_num >= 10000) {
+                       DPAA_QDMA_WARN("Waiting for HW complete in silent 
mode");
+                       check_num = 0;
+               }
+               goto overflow_check;
+       }
 
        DPAA_QDMA_DP_DEBUG("TC%d/Q%d submitted(%"PRIu64")-completed(%"PRIu64") 
>= %d",
                fsl_queue->block_id, fsl_queue->queue_id,
@@ -881,10 +903,13 @@ dpaa_get_channel(struct fsl_qdma_engine *fsl_qdma,
 }
 
 static int
-dpaa_qdma_configure(__rte_unused struct rte_dma_dev *dmadev,
-       __rte_unused const struct rte_dma_conf *dev_conf,
+dpaa_qdma_configure(struct rte_dma_dev *dmadev,
+       const struct rte_dma_conf *dev_conf,
        __rte_unused uint32_t conf_sz)
 {
+       struct fsl_qdma_engine *fsl_qdma = dmadev->data->dev_private;
+
+       fsl_qdma->is_silent = dev_conf->enable_silent;
        return 0;
 }
 
@@ -970,6 +995,12 @@ dpaa_qdma_dequeue_status(void *dev_private, uint16_t vchan,
        struct fsl_qdma_desc *desc_complete[nb_cpls];
        uint16_t i, dq_num;
 
+       if (unlikely(fsl_qdma->is_silent)) {
+               DPAA_QDMA_WARN("Can't dq in silent mode");
+
+               return 0;
+       }
+
        dq_num = dpaa_qdma_block_dequeue(fsl_qdma,
                        fsl_queue->block_id);
        DPAA_QDMA_DP_DEBUG("%s: block dq(%d)",
@@ -999,6 +1030,11 @@ dpaa_qdma_dequeue(void *dev_private,
        struct fsl_qdma_desc *desc_complete[nb_cpls];
        uint16_t i, dq_num;
 
+       if (unlikely(fsl_qdma->is_silent)) {
+               DPAA_QDMA_WARN("Can't dq in silent mode");
+
+               return 0;
+       }
 
        *has_error = false;
        dq_num = dpaa_qdma_block_dequeue(fsl_qdma,
diff --git a/drivers/dma/dpaa/dpaa_qdma.h b/drivers/dma/dpaa/dpaa_qdma.h
index 75c014f32f..9b69db517e 100644
--- a/drivers/dma/dpaa/dpaa_qdma.h
+++ b/drivers/dma/dpaa/dpaa_qdma.h
@@ -257,6 +257,7 @@ struct fsl_qdma_engine {
        struct fsl_qdma_queue *chan[QDMA_BLOCKS * QDMA_QUEUES];
        uint32_t num_blocks;
        int block_offset;
+       int is_silent;
 };
 
 #endif /* _DPAA_QDMA_H_ */
-- 
2.25.1

Reply via email to