[v7 10/15] dma/dpaa: add silent mode support
Gagandeep Singh
g.singh at nxp.com
Tue Oct 15 09:13:58 CEST 2024
From: Jun Yang <jun.yang at nxp.com>
add silent mode support.
Signed-off-by: Jun Yang <jun.yang at nxp.com>
Signed-off-by: Gagandeep Singh <g.singh at 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
More information about the dev
mailing list