From: Jun Yang <[email protected]>

Replace the hardcoded buffer acquire count of 8 with the FSL_BM_BURST_MAX
constant when acquiring buffers from the buffer pool. Use a single
bm_hw_buf_desc structure for HW initialization of the first entry and copy
it to remaining entries, ensuring consistent HW descriptor state across
all entries in the pool.

Signed-off-by: Jun Yang <[email protected]>
---
 drivers/bus/dpaa/base/qbman/bman.c  | 49 ++++++-----------------------
 drivers/bus/dpaa/include/fsl_bman.h | 46 ++++++++++++++++++++++-----
 drivers/mempool/dpaa/dpaa_mempool.c |  8 ++---
 3 files changed, 52 insertions(+), 51 deletions(-)

diff --git a/drivers/bus/dpaa/base/qbman/bman.c 
b/drivers/bus/dpaa/base/qbman/bman.c
index ee4232d0a0..889d657052 100644
--- a/drivers/bus/dpaa/base/qbman/bman.c
+++ b/drivers/bus/dpaa/base/qbman/bman.c
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
  *
  * Copyright 2008-2016 Freescale Semiconductor Inc.
- * Copyright 2017, 2024 NXP
+ * Copyright 2017, 2024-2026 NXP
  *
  */
 #include <rte_memcpy.h>
@@ -17,20 +17,6 @@
 #define IRQNAME                "BMan portal %d"
 #define MAX_IRQNAME    16      /* big enough for "BMan portal %d" */
 
-
-#define MAX_U16 UINT16_MAX
-#define MAX_U32 UINT32_MAX
-#ifndef BIT_SIZE
-#define BIT_SIZE(t) (sizeof(t) * 8)
-#endif
-#define MAX_U48 \
-       ((((uint64_t)MAX_U16) << BIT_SIZE(uint32_t)) | MAX_U32)
-#define HI16_OF_U48(x) \
-       (((x) >> BIT_SIZE(rte_be32_t)) & MAX_U16)
-#define LO32_OF_U48(x) ((x) & MAX_U32)
-#define U48_BY_HI16_LO32(hi, lo) \
-       (((hi) << BIT_SIZE(uint32_t)) | (lo))
-
 struct bman_portal {
        struct bm_portal p;
        /* 2-element array. pools[0] is mask, pools[1] is snapshot. */
@@ -273,7 +259,7 @@ bman_release_fast(struct bman_pool *pool, const uint64_t 
*bufs,
        struct bm_rcr_entry *r;
        uint8_t i, avail;
        uint64_t bpid = pool->params.bpid;
-       struct bm_hw_buf_desc bm_bufs[FSL_BM_BURST_MAX];
+       struct bm_buffer bm_bufs[FSL_BM_BURST_MAX];
 
 #ifdef RTE_LIBRTE_DPAA_HWDEBUG
        if (!num || (num > FSL_BM_BURST_MAX))
@@ -290,19 +276,15 @@ bman_release_fast(struct bman_pool *pool, const uint64_t 
*bufs,
        if (unlikely(!r))
                return -EBUSY;
 
+       bm_bufs[0].be_desc.bpid = bpid;
+       for (i = 0; i < num; i++)
+               bm_buffer_set64_to_be(&bm_bufs[i], bufs[i]);
        /*
         * we can copy all but the first entry, as this can trigger badness
         * with the valid-bit
         */
-       bm_bufs[0].bpid = bpid;
-       bm_bufs[0].hi_addr = cpu_to_be16(HI16_OF_U48(bufs[0]));
-       bm_bufs[0].lo_addr = cpu_to_be32(LO32_OF_U48(bufs[0]));
-       for (i = 1; i < num; i++) {
-               bm_bufs[i].hi_addr = cpu_to_be16(HI16_OF_U48(bufs[i]));
-               bm_bufs[i].lo_addr = cpu_to_be32(LO32_OF_U48(bufs[i]));
-       }
-
-       memcpy(r->bufs, bm_bufs, sizeof(struct bm_buffer) * num);
+       r->bufs[0].opaque = bm_bufs[0].opaque;
+       rte_memcpy(&r->bufs[1], &bm_bufs[1], sizeof(struct bm_buffer) * (num - 
1));
 
        bm_rcr_pvb_commit(&p->p, BM_RCR_VERB_CMD_BPID_SINGLE |
                (num & BM_RCR_VERB_BUFCOUNT_MASK));
@@ -360,16 +342,6 @@ __rte_unused bman_extract_addr(struct bm_buffer *buf)
        return buf->addr;
 }
 
-static inline uint64_t
-bman_hw_extract_addr(struct bm_hw_buf_desc *buf)
-{
-       uint64_t hi, lo;
-
-       hi = be16_to_cpu(buf->hi_addr);
-       lo = be32_to_cpu(buf->lo_addr);
-       return U48_BY_HI16_LO32(hi, lo);
-}
-
 RTE_EXPORT_INTERNAL_SYMBOL(bman_acquire_fast)
 int
 bman_acquire_fast(struct bman_pool *pool, uint64_t *bufs, uint8_t num)
@@ -378,7 +350,7 @@ bman_acquire_fast(struct bman_pool *pool, uint64_t *bufs, 
uint8_t num)
        struct bm_mc_command *mcc;
        struct bm_mc_result *mcr;
        uint8_t i, rst;
-       struct bm_hw_buf_desc bm_bufs[FSL_BM_BURST_MAX];
+       struct bm_buffer bm_bufs[FSL_BM_BURST_MAX];
 
 #ifdef RTE_LIBRTE_DPAA_HWDEBUG
        if (!num || (num > FSL_BM_BURST_MAX))
@@ -397,11 +369,10 @@ bman_acquire_fast(struct bman_pool *pool, uint64_t *bufs, 
uint8_t num)
        if (unlikely(rst < 1 || rst > FSL_BM_BURST_MAX))
                return -EINVAL;
 
-       rte_memcpy(bm_bufs, mcr->acquire.bufs,
-               sizeof(struct bm_buffer) * rst);
+       rte_memcpy(bm_bufs, mcr->acquire.bufs, sizeof(struct bm_buffer) * rst);
 
        for (i = 0; i < rst; i++)
-               bufs[i] = bman_hw_extract_addr(&bm_bufs[i]);
+               bufs[i] = bm_buffer_get64_from_be(&bm_bufs[i]);
 
        return rst;
 }
diff --git a/drivers/bus/dpaa/include/fsl_bman.h 
b/drivers/bus/dpaa/include/fsl_bman.h
index 2d24b89889..67a7a09618 100644
--- a/drivers/bus/dpaa/include/fsl_bman.h
+++ b/drivers/bus/dpaa/include/fsl_bman.h
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
  *
  * Copyright 2008-2012 Freescale Semiconductor, Inc.
- * Copyright 2024 NXP
+ * Copyright 2024-2026 NXP
  *
  */
 
@@ -42,6 +42,13 @@ struct bm_mc_result; /* MC result */
  * pool id specific to this buffer is needed (BM_RCR_VERB_CMD_BPID_MULTI,
  * BM_MCC_VERB_ACQUIRE), the 'bpid' field is used.
  */
+struct __rte_packed_begin bm_hw_buf_desc {
+       uint8_t rsv;
+       uint8_t bpid;
+       rte_be16_t hi; /* High 16-bits of 48-bit address */
+       rte_be32_t lo; /* Low 32-bits of 48-bit address */
+} __rte_packed_end;
+
 struct __rte_aligned(8) bm_buffer {
        union {
                struct {
@@ -66,17 +73,11 @@ struct __rte_aligned(8) bm_buffer {
                        u64 __notaddress:16;
 #endif
                };
+               struct bm_hw_buf_desc be_desc;
                u64 opaque;
        };
 };
 
-struct __rte_packed_begin bm_hw_buf_desc {
-       uint8_t rsv;
-       uint8_t bpid;
-       rte_be16_t hi_addr; /* High 16-bits of 48-bit address */
-       rte_be32_t lo_addr; /* Low 32-bits of 48-bit address */
-} __rte_packed_end;
-
 static inline u64 bm_buffer_get64(const struct bm_buffer *buf)
 {
        return buf->addr;
@@ -87,6 +88,17 @@ static inline dma_addr_t bm_buf_addr(const struct bm_buffer 
*buf)
        return (dma_addr_t)buf->addr;
 }
 
+#ifndef BIT_SIZE
+#define BIT_SIZE(t) (sizeof(t) * 8)
+#endif
+#define MAX_U48 \
+       ((((uint64_t)UINT16_MAX) << BIT_SIZE(uint32_t)) | UINT32_MAX)
+#define HI16_OF_U48(x) \
+       (((x) >> BIT_SIZE(uint32_t)) & UINT16_MAX)
+#define LO32_OF_U48(x) ((x) & UINT32_MAX)
+#define U48_BY_HI16_LO32(hi, lo) \
+       (((hi) << BIT_SIZE(uint32_t)) | (lo))
+
 #define bm_buffer_set64(buf, v) \
        do { \
                struct bm_buffer *__buf931 = (buf); \
@@ -94,6 +106,24 @@ static inline dma_addr_t bm_buf_addr(const struct bm_buffer 
*buf)
                __buf931->lo = lower_32_bits(v); \
        } while (0)
 
+#define bm_buffer_set64_to_be(buf, v) \
+       do { \
+               struct bm_buffer *__buf931 = (buf); \
+               \
+               __buf931->be_desc.hi = cpu_to_be16(HI16_OF_U48(v)); \
+               __buf931->be_desc.lo = cpu_to_be32(LO32_OF_U48(v)); \
+       } while (0)
+
+#define bm_buffer_get64_from_be(buf) \
+       ({ \
+               uint64_t hi, lo; \
+               struct bm_buffer *__buf931 = (buf); \
+               \
+               hi = be16_to_cpu(__buf931->be_desc.hi); \
+               lo = be32_to_cpu(__buf931->be_desc.lo); \
+               U48_BY_HI16_LO32(hi, lo); \
+       })
+
 #define FSL_BM_BURST_MAX 8
 
 /* See 1.5.3.5.4: "Release Command" */
diff --git a/drivers/mempool/dpaa/dpaa_mempool.c 
b/drivers/mempool/dpaa/dpaa_mempool.c
index 2f8555a026..3fdbcba646 100644
--- a/drivers/mempool/dpaa/dpaa_mempool.c
+++ b/drivers/mempool/dpaa/dpaa_mempool.c
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- *   Copyright 2017,2019,2023-2025 NXP
+ *   Copyright 2017,2019,2023-2026 NXP
  *
  */
 
@@ -50,7 +50,7 @@ static int
 dpaa_mbuf_create_pool(struct rte_mempool *mp)
 {
        struct bman_pool *bp;
-       struct bm_buffer bufs[8];
+       struct bm_buffer bufs[FSL_BM_BURST_MAX];
        struct dpaa_bp_info *bp_info;
        uint8_t bpid;
        int num_bufs = 0, ret = 0;
@@ -83,8 +83,8 @@ dpaa_mbuf_create_pool(struct rte_mempool *mp)
                 * then in 1s for the remainder.
                 */
                if (ret != 1)
-                       ret = bman_acquire(bp, bufs, 8, 0);
-               if (ret < 8)
+                       ret = bman_acquire(bp, bufs, FSL_BM_BURST_MAX, 0);
+               if (ret < FSL_BM_BURST_MAX)
                        ret = bman_acquire(bp, bufs, 1, 0);
                if (ret > 0)
                        num_bufs += ret;
-- 
2.25.1

Reply via email to