From: Jun Yang <[email protected]>

Convert the dpaa2 qdma devargs handling to the shared dpaax_devargs
table so each argument key is declared once and drives both the parse
table and the registered valid-args string.

Remove the custom check_devargs_handler()/dpaa2_qdma_get_devargs()
helpers and parse the arguments once at device init via
dpaax_get_devargs(), storing the results in a single dpdmai_dev->flags
bitfield (DPAA2_QDMA_FLE_PRE_POPULATE_FLAG, DPAA2_QDMA_DESC_DEBUG_FLAG,
DPAA2_QDMA_SHORT_FD_FLAG).

This drops the per-virtual-queue fle_pre_populate, using_short_fd and
flags fields, which only mirrored device-wide devargs, and makes the
copy paths read the device flags directly.

Signed-off-by: Jun Yang <[email protected]>
---
 drivers/dma/dpaa2/dpaa2_qdma.c | 92 +++++++++-------------------------
 drivers/dma/dpaa2/dpaa2_qdma.h | 15 +++---
 2 files changed, 33 insertions(+), 74 deletions(-)

diff --git a/drivers/dma/dpaa2/dpaa2_qdma.c b/drivers/dma/dpaa2/dpaa2_qdma.c
index 8d10edfd04..e981bf3e6d 100644
--- a/drivers/dma/dpaa2/dpaa2_qdma.c
+++ b/drivers/dma/dpaa2/dpaa2_qdma.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018-2024 NXP
+ * Copyright 2018-2026 NXP
  */
 
 #include <rte_eal.h>
@@ -11,56 +11,25 @@
 #include <mc/fsl_dpdmai.h>
 
 #include <rte_pmd_dpaax_qdma.h>
+#include <dpaax_devarg.h>
 #include "dpaa2_hw_dpio.h"
 #include "dpaa2_qdma.h"
 #include "dpaa2_qdma_logs.h"
 
-#define DPAA2_QDMA_FLE_PRE_POPULATE "fle_pre_populate"
-#define DPAA2_QDMA_DESC_DEBUG "desc_debug"
-#define DPAA2_QDMA_USING_SHORT_FD "short_fd"
+#define DPAA2_DEVARGS(ENTRY) \
+       ENTRY("fle_pre_populate", NULL, DPAA2_QDMA_FLE_PRE_POPULATE_FLAG) \
+       ENTRY("desc_debug", NULL, DPAA2_QDMA_DESC_DEBUG_FLAG) \
+       ENTRY("short_fd", NULL, DPAA2_QDMA_SHORT_FD_FLAG)
+
+static const struct dpaax_devargs s_dpaa2_qdma_devargs[] = {
+       DPAA2_DEVARGS(DPAAX_DEVARG_TABLE_ENTRY)
+};
 
 static uint32_t dpaa2_coherent_no_alloc_cache;
 static uint32_t dpaa2_coherent_alloc_cache;
 
 static struct fsl_mc_io s_proc_mc_reg;
 
-static int
-check_devargs_handler(__rte_unused const char *key, const char *value,
-                     __rte_unused void *opaque)
-{
-       if (strcmp(value, "1"))
-               return -1;
-
-       return 0;
-}
-
-static int
-dpaa2_qdma_get_devargs(struct rte_devargs *devargs, const char *key)
-{
-       struct rte_kvargs *kvlist;
-
-       if (!devargs)
-               return 0;
-
-       kvlist = rte_kvargs_parse(devargs->args, NULL);
-       if (!kvlist)
-               return 0;
-
-       if (!rte_kvargs_count(kvlist, key)) {
-               rte_kvargs_free(kvlist);
-               return 0;
-       }
-
-       if (rte_kvargs_process(kvlist, key,
-                              check_devargs_handler, NULL) < 0) {
-               rte_kvargs_free(kvlist);
-               return 0;
-       }
-       rte_kvargs_free(kvlist);
-
-       return 1;
-}
-
 static inline int
 qdma_cntx_idx_ring_eq(struct qdma_cntx_idx_ring *ring,
        const uint16_t *elem, uint16_t nb,
@@ -670,7 +639,7 @@ dpaa2_qdma_copy_sg(void *dev_private,
        DPAA2_SET_FD_COMPOUND_FMT(fd);
        DPAA2_SET_FD_FLC(fd, (uint64_t)cntx_sg);
 
-       if (qdma_vq->fle_pre_populate) {
+       if (dpdmai_dev->flags & DPAA2_QDMA_FLE_PRE_POPULATE_FLAG) {
                if (unlikely(!fle[DPAA2_QDMA_SRC_FLE].length)) {
                        fle_sdd_sg_pre_populate(cntx_sg, qdma_vq);
                        if (!qdma_dev->is_silent && cntx_sg && idx_addr) {
@@ -698,7 +667,7 @@ dpaa2_qdma_copy_sg(void *dev_private,
                        QBMAN_FLE_WORD4_FMT_SGE);
        }
 
-       if (unlikely(qdma_vq->flags & DPAA2_QDMA_DESC_DEBUG_FLAG))
+       if (unlikely(dpdmai_dev->flags & DPAA2_QDMA_DESC_DEBUG_FLAG))
                dpaa2_qdma_long_fmt_dump(cntx_sg->fle_sdd.fle);
 
        dpaa2_qdma_fd_save_att(fd, 0, DPAA2_QDMA_FD_SG);
@@ -844,7 +813,7 @@ dpaa2_qdma_short_copy(struct qdma_virt_queue *qdma_vq,
 static int
 dpaa2_qdma_long_copy(struct qdma_virt_queue *qdma_vq,
        rte_iova_t src, rte_iova_t dst, uint32_t length,
-       int is_silent, uint64_t flags)
+       int is_silent, uint64_t flags, uint32_t dev_flags)
 {
        int ret = 0, expected;
        struct qbman_fd *fd = &qdma_vq->fd[qdma_vq->fd_idx];
@@ -872,7 +841,7 @@ dpaa2_qdma_long_copy(struct qdma_virt_queue *qdma_vq,
        DPAA2_SET_FD_COMPOUND_FMT(fd);
        DPAA2_SET_FD_FLC(fd, (uint64_t)fle);
 
-       if (qdma_vq->fle_pre_populate) {
+       if (dev_flags & DPAA2_QDMA_FLE_PRE_POPULATE_FLAG) {
                if (unlikely(!fle[DPAA2_QDMA_SRC_FLE].length)) {
                        fle_sdd_pre_populate(fle_sdd,
                                &qdma_vq->rbp,
@@ -888,7 +857,7 @@ dpaa2_qdma_long_copy(struct qdma_virt_queue *qdma_vq,
                        QBMAN_FLE_WORD4_FMT_SBF);
        }
 
-       if (unlikely(qdma_vq->flags & DPAA2_QDMA_DESC_DEBUG_FLAG))
+       if (unlikely(dev_flags & DPAA2_QDMA_DESC_DEBUG_FLAG))
                dpaa2_qdma_long_fmt_dump(fle);
 
        dpaa2_qdma_fd_save_att(fd, DPAA2_QDMA_IDX_FROM_FLAG(flags),
@@ -921,12 +890,14 @@ dpaa2_qdma_copy(void *dev_private, uint16_t vchan,
        struct qdma_device *qdma_dev = dpdmai_dev->qdma_dev;
        struct qdma_virt_queue *qdma_vq = &qdma_dev->vqs[vchan];
 
-       if (qdma_vq->using_short_fd)
+       if (dpdmai_dev->flags & DPAA2_QDMA_SHORT_FD_FLAG) {
                return dpaa2_qdma_short_copy(qdma_vq, src, dst,
                                length, qdma_dev->is_silent, flags);
-       else
+       } else {
                return dpaa2_qdma_long_copy(qdma_vq, src, dst,
-                               length, qdma_dev->is_silent, flags);
+                               length, qdma_dev->is_silent, flags,
+                               dpdmai_dev->flags);
+       }
 }
 
 static inline int
@@ -1379,21 +1350,6 @@ dpaa2_qdma_vchan_setup(struct rte_dma_dev *dev, uint16_t 
vchan,
        if (ret)
                return ret;
 
-       if (dpaa2_qdma_get_devargs(dev->device->devargs, 
DPAA2_QDMA_FLE_PRE_POPULATE))
-               qdma_dev->vqs[vchan].fle_pre_populate = 1;
-       else
-               qdma_dev->vqs[vchan].fle_pre_populate = 0;
-
-       if (dpaa2_qdma_get_devargs(dev->device->devargs, DPAA2_QDMA_DESC_DEBUG))
-               qdma_dev->vqs[vchan].flags |= DPAA2_QDMA_DESC_DEBUG_FLAG;
-       else
-               qdma_dev->vqs[vchan].flags &= (~DPAA2_QDMA_DESC_DEBUG_FLAG);
-
-       if (dpaa2_qdma_get_devargs(dev->device->devargs, 
DPAA2_QDMA_USING_SHORT_FD))
-               qdma_dev->vqs[vchan].using_short_fd = 1;
-       else
-               qdma_dev->vqs[vchan].using_short_fd = 0;
-
        snprintf(pool_name, sizeof(pool_name),
                "qdma_fle_pool_dev%d_qid%d", dpdmai_dev->dpdmai_id, vchan);
        pool_size = sizeof(struct qdma_cntx_sg);
@@ -1656,6 +1612,9 @@ dpaa2_dpdmai_dev_init(struct rte_dma_dev *dev, uint32_t 
dpdmai_id)
 
        DPAA2_QDMA_FUNC_TRACE();
 
+       dpdmai_dev->flags = 0;
+       dpaax_get_devargs(s_dpaa2_qdma_devargs, dev, &dpdmai_dev->flags);
+
        if (!dpaa2_coherent_no_alloc_cache) {
                if (dpaa2_svr_family == SVR_LX2160A) {
                        dpaa2_coherent_no_alloc_cache =
@@ -1801,7 +1760,6 @@ static struct rte_dpaa2_driver rte_dpaa2_qdma_pmd = {
 
 RTE_PMD_REGISTER_DPAA2(dpaa2_qdma, rte_dpaa2_qdma_pmd);
 RTE_PMD_REGISTER_PARAM_STRING(dpaa2_qdma,
-       DPAA2_QDMA_FLE_PRE_POPULATE "=<int>"
-       DPAA2_QDMA_DESC_DEBUG"=<int>"
-       DPAA2_QDMA_USING_SHORT_FD"=<int>");
+       DPAA2_DEVARGS(DPAAX_DEVARG_STRING_ENTRY)
+);
 RTE_LOG_REGISTER_DEFAULT(dpaa2_qdma_logtype, INFO);
diff --git a/drivers/dma/dpaa2/dpaa2_qdma.h b/drivers/dma/dpaa2/dpaa2_qdma.h
index e2d2eb4fa8..4a5d1056f0 100644
--- a/drivers/dma/dpaa2/dpaa2_qdma.h
+++ b/drivers/dma/dpaa2/dpaa2_qdma.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018-2024 NXP
+ * Copyright 2018-2026 NXP
  */
 
 #ifndef _DPAA2_QDMA_H_
@@ -233,6 +233,12 @@ struct __rte_packed_begin qdma_cntx_sg {
 #define DPAA2_QDMA_IDX_FROM_FLAG(flag) \
        ((flag) >> RTE_DPAAX_QDMA_COPY_IDX_OFFSET)
 
+enum dpaa2_dpdmai_dev_flags {
+       DPAA2_QDMA_FLE_PRE_POPULATE_FLAG = RTE_BIT32(0),
+       DPAA2_QDMA_DESC_DEBUG_FLAG = RTE_BIT32(1),
+       DPAA2_QDMA_SHORT_FD_FLAG = RTE_BIT32(2)
+};
+
 /** Represents a DPDMAI device */
 struct dpaa2_dpdmai_dev {
        /** Pointer to Next device instance */
@@ -247,6 +253,7 @@ struct dpaa2_dpdmai_dev {
        struct dpaa2_queue rx_queue[DPAA2_DPDMAI_MAX_QUEUES];
        /** TX queues */
        struct dpaa2_queue tx_queue[DPAA2_DPDMAI_MAX_QUEUES];
+       uint32_t flags;
        struct qdma_device *qdma_dev;
 };
 
@@ -261,8 +268,6 @@ struct qdma_cntx_idx_ring {
        uint16_t nb_in_ring;
 };
 
-#define DPAA2_QDMA_DESC_DEBUG_FLAG (1 << 0)
-
 /** Represents a QDMA virtual queue */
 struct qdma_virt_queue {
        /** Associated hw queue */
@@ -273,8 +278,6 @@ struct qdma_virt_queue {
        void **fle_elem;
        /** Route by port */
        struct dpaa2_qdma_rbp rbp;
-       /** States if this vq is in use or not */
-       uint8_t fle_pre_populate;
        /** Number of descriptor for the virtual DMA channel */
        uint16_t nb_desc;
        /* Total number of enqueues on this VQ */
@@ -284,7 +287,6 @@ struct qdma_virt_queue {
        uint64_t copy_num;
 
        uint16_t vq_id;
-       uint32_t flags;
        struct qbman_fd fd[DPAA2_QDMA_MAX_DESC];
        uint16_t fd_idx;
        struct qdma_cntx_idx_ring *ring_cntx_idx;
@@ -295,7 +297,6 @@ struct qdma_virt_queue {
        uint16_t silent_idx;
 
        int num_valid_jobs;
-       int using_short_fd;
 
        struct rte_dma_stats stats;
 };
-- 
2.43.0

Reply via email to