From: Mohammad Shuab Siddique <[email protected]>

Add multi-doorbell support to spread doorbell accesses across
multiple doorbell pages for improved performance on P5/P7 chips.

Detect capability via HWRM_FUNC_QCAPS
Round-robin DPI assignment for NQ rings per device
TX rings inherit DPI from parent NQ
RX/CQ rings use privileged DPI 0
P7: DPI 0=legacy, DPI 1=push, DPI 2+ for multi-DB
P5: DPI 0=legacy, DPI 1+ for multi-DB

Cc: [email protected]

Signed-off-by: Mohammad Shuab Siddique <[email protected]>
---
 drivers/net/bnxt/bnxt.h                | 13 +++++
 drivers/net/bnxt/bnxt_cpr.h            |  1 +
 drivers/net/bnxt/bnxt_hwrm.c           | 51 +++++++++++++++++--
 drivers/net/bnxt/bnxt_hwrm.h           |  2 +-
 drivers/net/bnxt/bnxt_mpc.c            |  4 +-
 drivers/net/bnxt/bnxt_ring.c           | 70 ++++++++++++++++++--------
 drivers/net/bnxt/bnxt_ring.h           |  3 +-
 drivers/net/bnxt/bnxt_rxr.h            |  1 +
 drivers/net/bnxt/bnxt_txr.h            |  1 +
 drivers/net/bnxt/hsi_struct_def_dpdk.h | 30 +++++++++++
 10 files changed, 147 insertions(+), 29 deletions(-)

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 83ae151066..30baabcf92 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -433,6 +433,13 @@ struct bnxt_coal {
 #define DB_PF_OFFSET                   0x10000
 #define DB_VF_OFFSET                   0x4000
 
+#define BNXT_PRIVILEGED_DPI            0
+#define BNXT_RESERVED_DPI_ONE          1
+#define BNXT_RESERVED_DPI_TWO          2
+#define BNXT_DEFAULT_DB_PAGE_SIZE      4096
+
+#define BNXT_KB_TO_BYTES(kb)           ((kb) * 1024)
+
 #define BNXT_RSS_TBL_SIZE_P5           512U
 #define BNXT_RSS_ENTRIES_PER_CTX_P5    64
 #define BNXT_MAX_RSS_CTXTS_P5 \
@@ -873,6 +880,7 @@ struct bnxt {
 #define BNXT_FW_CAP_RX_ALL_PKT_TS      BIT(11)
 #define BNXT_FW_CAP_BACKING_STORE_V2   BIT(12)
 #define BNXT_FW_CAP_RX_RATE_PROFILE    BIT(17)
+#define BNXT_FW_CAP_MULTI_DB           BIT(18)
 #define BNXT_FW_BACKING_STORE_V2_EN(bp)        \
        ((bp)->fw_cap & BNXT_FW_CAP_BACKING_STORE_V2)
 #define BNXT_FW_BACKING_STORE_V1_EN(bp)        \
@@ -1079,6 +1087,11 @@ struct bnxt {
        struct rte_eth_rss_conf rss_conf; /* RSS configuration. */
        uint16_t                tunnel_disable_flag; /* tunnel stateless 
offloads status */
        uint8_t                 chip_rev;
+       uint16_t                l2_db_multi_page_size_kb;       /* Multi-L2 DB 
BAR size in KB */
+       uint16_t                db_page_size;                   /* DB page size 
(typically 4KB) */
+       uint8_t                 nq_dpi_start;                   /* Starting DPI 
for NQ rings */
+       uint8_t                 nq_dpi_count;                   /* Number of 
DPI pages for NQ */
+       uint8_t                 nq_dpi_counter;                 /* Round-robin 
counter for NQ DPI */
 };
 
 static
diff --git a/drivers/net/bnxt/bnxt_cpr.h b/drivers/net/bnxt/bnxt_cpr.h
index 94f449e8b5..858ee15c47 100644
--- a/drivers/net/bnxt/bnxt_cpr.h
+++ b/drivers/net/bnxt/bnxt_cpr.h
@@ -89,6 +89,7 @@ struct bnxt_cp_ring_info {
        struct bnxt_ring        *cp_ring_struct;
        bool                    valid;
        uint32_t                epoch;
+       uint8_t                 dpi;
 };
 
 #define RX_CMP_L2_ERRORS                                               \
diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 0cef22b5ec..7c58727e59 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -1254,6 +1254,9 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
        if (flags_ext3 & 
HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT3_RX_RATE_PROFILE_SEL_SUPPORTED)
                bp->fw_cap |= BNXT_FW_CAP_RX_RATE_PROFILE;
 
+       if (flags_ext3 & 
HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT3_MULTI_L2_DB_SUPPORTED)
+               bp->fw_cap |= BNXT_FW_CAP_MULTI_DB;
+
        /* This block should be kept at the end of this function because it
         * sends another hwrm msg.
         */
@@ -2176,7 +2179,7 @@ int bnxt_hwrm_ring_alloc(struct bnxt *bp,
                         struct bnxt_ring *ring,
                         uint32_t ring_type, uint32_t map_index,
                         uint32_t stats_ctx_id, uint32_t cmpl_ring_id,
-                        uint16_t tx_cosq_id)
+                        uint16_t tx_cosq_id, uint16_t dpi)
 {
        int rc = 0;
        uint32_t enables = 0;
@@ -2280,6 +2283,11 @@ int bnxt_hwrm_ring_alloc(struct bnxt *bp,
                HWRM_UNLOCK();
                return -EINVAL;
        }
+
+       if (bp->fw_cap & BNXT_FW_CAP_MULTI_DB) {
+               req.dpi = rte_cpu_to_le_16(dpi);
+               enables |= HWRM_RING_ALLOC_INPUT_ENABLES_DPI_VALID;
+       }
        req.enables = rte_cpu_to_le_32(enables);
 
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB);
@@ -4195,12 +4203,15 @@ int bnxt_set_hwrm_link_config(struct bnxt *bp, bool 
link_up)
 
 int bnxt_hwrm_func_qcfg(struct bnxt *bp, uint16_t *mtu)
 {
-       struct hwrm_func_qcfg_input req = {0};
        struct hwrm_func_qcfg_output *resp = bp->hwrm_cmd_resp_addr;
+       struct hwrm_func_qcfg_input req = {0};
+       uint16_t l2_db_multi_kb;
+       uint16_t total_pages;
+       uint16_t svif_info;
        uint16_t flags;
        int rc = 0;
+
        bp->func_svif = BNXT_SVIF_INVALID;
-       uint16_t svif_info;
 
        HWRM_PREP(&req, HWRM_FUNC_QCFG, BNXT_USE_CHIMP_MB);
        req.fid = rte_cpu_to_le_16(0xffff);
@@ -4246,9 +4257,39 @@ int bnxt_hwrm_func_qcfg(struct bnxt *bp, uint16_t *mtu)
                bp->flags &= ~BNXT_FLAG_NPAR_PF;
                break;
        }
-
        bp->legacy_db_size =
-               rte_le_to_cpu_16(resp->legacy_l2_db_size_kb) * 1024;
+               BNXT_KB_TO_BYTES(rte_le_to_cpu_16(resp->legacy_l2_db_size_kb));
+
+       /* Configure multi-doorbell if supported */
+       if (bp->fw_cap & BNXT_FW_CAP_MULTI_DB) {
+               l2_db_multi_kb = 
rte_le_to_cpu_16(resp->l2_db_multi_page_size_kb);
+               bp->l2_db_multi_page_size_kb = l2_db_multi_kb ? l2_db_multi_kb :
+                       rte_le_to_cpu_16(resp->l2_doorbell_bar_size_kb);
+
+               if (bp->l2_db_multi_page_size_kb > 0) {
+                       bp->db_page_size = BNXT_DEFAULT_DB_PAGE_SIZE;
+                       total_pages = 
BNXT_KB_TO_BYTES(bp->l2_db_multi_page_size_kb) /
+                                       bp->db_page_size;
+
+                       /* P7: DPI 0=legacy, DPI 1=push reserved; P5: DPI 
0=legacy */
+                       bp->nq_dpi_start = BNXT_CHIP_P7(bp) ?
+                               BNXT_RESERVED_DPI_TWO : BNXT_RESERVED_DPI_ONE;
+                       bp->nq_dpi_count = (total_pages > bp->nq_dpi_start) ?
+                               (total_pages - bp->nq_dpi_start) : 0;
+                       bp->nq_dpi_counter = 0;
+                       PMD_DRV_LOG_LINE(INFO,
+                                       "Multi-doorbell: %u KB, "
+                                       "DPI range %u-%u (%u pages)",
+                                       bp->l2_db_multi_page_size_kb,
+                                       bp->nq_dpi_start,
+                                       bp->nq_dpi_start + bp->nq_dpi_count - 1,
+                                       bp->nq_dpi_count);
+               } else {
+                       PMD_DRV_LOG_LINE(INFO,
+                                       "Multi-doorbell supported "
+                                       "but no pages allocated");
+               }
+       }
 
        HWRM_UNLOCK();
 
diff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h
index ecb6335b3d..fc56223ab4 100644
--- a/drivers/net/bnxt/bnxt_hwrm.h
+++ b/drivers/net/bnxt/bnxt_hwrm.h
@@ -221,7 +221,7 @@ int bnxt_hwrm_ring_alloc(struct bnxt *bp,
                         struct bnxt_ring *ring,
                         uint32_t ring_type, uint32_t map_index,
                         uint32_t stats_ctx_id, uint32_t cmpl_ring_id,
-                        uint16_t tx_cosq_id);
+                        uint16_t tx_cosq_id, uint16_t dpi);
 int bnxt_hwrm_ring_free(struct bnxt *bp,
                        struct bnxt_ring *ring, uint32_t ring_type,
                        uint16_t cp_ring_id);
diff --git a/drivers/net/bnxt/bnxt_mpc.c b/drivers/net/bnxt/bnxt_mpc.c
index 259066fa61..d77f9dd308 100644
--- a/drivers/net/bnxt/bnxt_mpc.c
+++ b/drivers/net/bnxt/bnxt_mpc.c
@@ -502,7 +502,7 @@ static int bnxt_mpc_ring_alloc_one(struct bnxt *bp, enum 
bnxt_mpc_chnl chnl_id)
                                  map_index,
                                  cpr->hw_stats_ctx_id,
                                  cp_ring->fw_ring_id,
-                                 MPC_HW_COS_ID);
+                                 MPC_HW_COS_ID, BNXT_PRIVILEGED_DPI);
        if (rc) {
                PMD_DRV_LOG_LINE(ERR, "mpc ring %d tx ring alloc failed rc:%d!",
                            chnl_id, rc);
@@ -510,7 +510,7 @@ static int bnxt_mpc_ring_alloc_one(struct bnxt *bp, enum 
bnxt_mpc_chnl chnl_id)
        }
 
        bnxt_set_db(bp, &mpr->db, HWRM_RING_ALLOC_INPUT_RING_TYPE_TX, chnl_id,
-                   ring->fw_ring_id, ring->ring_mask);
+                   ring->fw_ring_id, ring->ring_mask, BNXT_PRIVILEGED_DPI);
 
        bnxt_hwrm_set_ring_coal(bp, &coal, cp_ring->fw_ring_id);
 
diff --git a/drivers/net/bnxt/bnxt_ring.c b/drivers/net/bnxt/bnxt_ring.c
index b6d411a931..ccca779b97 100644
--- a/drivers/net/bnxt/bnxt_ring.c
+++ b/drivers/net/bnxt/bnxt_ring.c
@@ -353,8 +353,11 @@ void bnxt_set_db(struct bnxt *bp,
                 uint32_t ring_type,
                 uint32_t map_idx,
                 uint32_t fid,
-                uint32_t ring_mask)
+                uint32_t ring_mask,
+                uint16_t dpi)
 {
+       uint64_t dpi_offset;
+
        if (BNXT_CHIP_P5_P7(bp)) {
                int db_offset = DB_PF_OFFSET;
                switch (ring_type) {
@@ -379,8 +382,14 @@ void bnxt_set_db(struct bnxt *bp,
                } else if (BNXT_VF(bp)) {
                        db_offset = DB_VF_OFFSET;
                }
-
                db->doorbell = (char *)bp->doorbell_base + db_offset;
+
+               if (bp->fw_cap & BNXT_FW_CAP_MULTI_DB &&
+                               dpi != BNXT_PRIVILEGED_DPI) {
+                       dpi_offset = (dpi - bp->nq_dpi_start) *
+                                       bp->db_page_size;
+                       db->doorbell = (char *)db->doorbell + dpi_offset;
+               }
                db->db_key64 |= (uint64_t)fid << DBR_XID_SFT;
                db->db_64 = true;
        } else {
@@ -404,32 +413,33 @@ void bnxt_set_db(struct bnxt *bp,
 int bnxt_alloc_cmpl_ring(struct bnxt *bp, int queue_index,
                         struct bnxt_cp_ring_info *cpr)
 {
-       struct bnxt_ring *cp_ring = cpr->cp_ring_struct;
-       uint32_t nq_ring_id = HWRM_NA_SIGNATURE;
        int cp_ring_index = queue_index + BNXT_RX_VEC_START;
        struct bnxt_cp_ring_info *nqr = bp->rxtx_nq_ring;
+       struct bnxt_ring *cp_ring = cpr->cp_ring_struct;
+       uint32_t nq_ring_id = HWRM_NA_SIGNATURE;
+       uint8_t dpi = BNXT_PRIVILEGED_DPI;
        uint8_t ring_type;
        int rc = 0;
 
        ring_type = HWRM_RING_ALLOC_INPUT_RING_TYPE_L2_CMPL;
 
        if (BNXT_HAS_NQ(bp)) {
-               if (nqr) {
-                       nq_ring_id = nqr->cp_ring_struct->fw_ring_id;
-               } else {
+               if (!nqr) {
                        PMD_DRV_LOG_LINE(ERR, "NQ ring is NULL");
                        return -EINVAL;
                }
+               nq_ring_id = nqr->cp_ring_struct->fw_ring_id;
        }
 
+       cpr->dpi = dpi;
        rc = bnxt_hwrm_ring_alloc(bp, cp_ring, ring_type, cp_ring_index,
-                                 HWRM_NA_SIGNATURE, nq_ring_id, 0);
+                                 HWRM_NA_SIGNATURE, nq_ring_id, 0, dpi);
        if (rc)
                return rc;
 
        cpr->cp_raw_cons = 0;
        bnxt_set_db(bp, &cpr->cp_db, ring_type, cp_ring_index,
-                   cp_ring->fw_ring_id, cp_ring->ring_mask);
+                   cp_ring->fw_ring_id, cp_ring->ring_mask, dpi);
        bnxt_db_cq(cpr);
 
        return 0;
@@ -437,10 +447,12 @@ int bnxt_alloc_cmpl_ring(struct bnxt *bp, int queue_index,
 
 int bnxt_alloc_rxtx_nq_ring(struct bnxt *bp)
 {
+       int ring_index = BNXT_NUM_ASYNC_CPR(bp);
+       uint8_t dpi = BNXT_PRIVILEGED_DPI;
        struct bnxt_cp_ring_info *nqr;
        struct bnxt_ring *ring;
-       int ring_index = BNXT_NUM_ASYNC_CPR(bp);
        uint8_t ring_type;
+       uint8_t offset;
        int rc = 0;
 
        if (!BNXT_HAS_NQ(bp) || bp->rxtx_nq_ring)
@@ -481,8 +493,18 @@ int bnxt_alloc_rxtx_nq_ring(struct bnxt *bp)
 
        ring_type = HWRM_RING_ALLOC_INPUT_RING_TYPE_NQ;
 
+       /* Assign DPI using round-robin if multi-doorbell is enabled */
+       if (bp->fw_cap & BNXT_FW_CAP_MULTI_DB && bp->nq_dpi_count > 0) {
+               offset = bp->nq_dpi_counter % bp->nq_dpi_count;
+               dpi = bp->nq_dpi_start + offset;
+               bp->nq_dpi_counter++;
+               PMD_DRV_LOG_LINE(DEBUG, "NQ ring assigned DPI %u", dpi);
+       }
+
+       nqr->dpi = dpi;
+
        rc = bnxt_hwrm_ring_alloc(bp, ring, ring_type, ring_index,
-                                 HWRM_NA_SIGNATURE, HWRM_NA_SIGNATURE, 0);
+                                 HWRM_NA_SIGNATURE, HWRM_NA_SIGNATURE, 0, dpi);
        if (rc) {
                rte_free(ring);
                rte_free(nqr);
@@ -490,7 +512,7 @@ int bnxt_alloc_rxtx_nq_ring(struct bnxt *bp)
        }
 
        bnxt_set_db(bp, &nqr->cp_db, ring_type, ring_index,
-                   ring->fw_ring_id, ring->ring_mask);
+                   ring->fw_ring_id, ring->ring_mask, dpi);
        bnxt_db_nq(nqr);
 
        bp->rxtx_nq_ring = nqr;
@@ -523,13 +545,16 @@ static int bnxt_alloc_rx_ring(struct bnxt *bp, int 
queue_index)
        struct bnxt_rx_ring_info *rxr = rxq->rx_ring;
        struct bnxt_ring *ring = rxr->rx_ring_struct;
        uint8_t ring_type;
+       uint16_t dpi;
        int rc = 0;
 
        ring_type = HWRM_RING_ALLOC_INPUT_RING_TYPE_RX;
+       dpi = BNXT_PRIVILEGED_DPI;
+       rxr->dpi = dpi;
 
        rc = bnxt_hwrm_ring_alloc(bp, ring, ring_type,
                                  queue_index, cpr->hw_stats_ctx_id,
-                                 cp_ring->fw_ring_id, 0);
+                                 cp_ring->fw_ring_id, 0, dpi);
        if (rc)
                return rc;
 
@@ -537,7 +562,7 @@ static int bnxt_alloc_rx_ring(struct bnxt *bp, int 
queue_index)
        if (BNXT_HAS_RING_GRPS(bp))
                bp->grp_info[queue_index].rx_fw_ring_id = ring->fw_ring_id;
        bnxt_set_db(bp, &rxr->rx_db, ring_type, queue_index, ring->fw_ring_id,
-                   ring->ring_mask);
+                   ring->ring_mask, dpi);
        bnxt_db_write(&rxr->rx_db, rxr->rx_raw_prod);
 
        return 0;
@@ -568,7 +593,8 @@ static int bnxt_alloc_rx_agg_ring(struct bnxt *bp, int 
queue_index)
        }
 
        rc = bnxt_hwrm_ring_alloc(bp, ring, ring_type, map_idx,
-                                 hw_stats_ctx_id, cp_ring->fw_ring_id, 0);
+                                 hw_stats_ctx_id, cp_ring->fw_ring_id, 0,
+                                 BNXT_PRIVILEGED_DPI);
 
        if (rc)
                return rc;
@@ -578,7 +604,7 @@ static int bnxt_alloc_rx_agg_ring(struct bnxt *bp, int 
queue_index)
        if (BNXT_HAS_RING_GRPS(bp))
                bp->grp_info[queue_index].ag_fw_ring_id = ring->fw_ring_id;
        bnxt_set_db(bp, &rxr->ag_db, ring_type, map_idx, ring->fw_ring_id,
-                   ring->ring_mask);
+                   ring->ring_mask, BNXT_PRIVILEGED_DPI);
        bnxt_db_write(&rxr->ag_db, rxr->ag_raw_prod);
 
        return 0;
@@ -796,14 +822,16 @@ int bnxt_alloc_async_cp_ring(struct bnxt *bp)
                ring_type = HWRM_RING_ALLOC_INPUT_RING_TYPE_L2_CMPL;
 
        rc = bnxt_hwrm_ring_alloc(bp, cp_ring, ring_type, 0,
-                                 HWRM_NA_SIGNATURE, HWRM_NA_SIGNATURE, 0);
+                                 HWRM_NA_SIGNATURE, HWRM_NA_SIGNATURE, 0,
+                                 BNXT_PRIVILEGED_DPI);
 
        if (rc)
                return rc;
 
        cpr->cp_raw_cons = 0;
+       cpr->dpi = BNXT_PRIVILEGED_DPI;
        bnxt_set_db(bp, &cpr->cp_db, ring_type, 0,
-                   cp_ring->fw_ring_id, cp_ring->ring_mask);
+                   cp_ring->fw_ring_id, cp_ring->ring_mask, 
BNXT_PRIVILEGED_DPI);
 
        if (BNXT_HAS_NQ(bp))
                bnxt_db_nq(cpr);
@@ -900,17 +928,19 @@ int bnxt_alloc_hwrm_tx_ring(struct bnxt *bp, int 
queue_index)
        else
                tx_cosq_id = bp->tx_cosq_id[0];
 
+       /* TX ring inherits DPI from parent NQ */
+       txr->dpi = bp->rxtx_nq_ring ? bp->rxtx_nq_ring->dpi : 
BNXT_PRIVILEGED_DPI;
        rc = bnxt_hwrm_ring_alloc(bp, ring,
                                  HWRM_RING_ALLOC_INPUT_RING_TYPE_TX,
                                  queue_index, cpr->hw_stats_ctx_id,
                                  cp_ring->fw_ring_id,
-                                 tx_cosq_id);
+                                 tx_cosq_id, txr->dpi);
        if (rc)
                goto err_out;
 
        bnxt_set_db(bp, &txr->tx_db, HWRM_RING_ALLOC_INPUT_RING_TYPE_TX,
                    queue_index, ring->fw_ring_id,
-                   ring->ring_mask);
+                   ring->ring_mask, txr->dpi);
        txq->index = idx;
 
        return rc;
diff --git a/drivers/net/bnxt/bnxt_ring.h b/drivers/net/bnxt/bnxt_ring.h
index 3e2bd634a8..496c3e111f 100644
--- a/drivers/net/bnxt/bnxt_ring.h
+++ b/drivers/net/bnxt/bnxt_ring.h
@@ -89,7 +89,8 @@ void bnxt_set_db(struct bnxt *bp,
                 uint32_t ring_type,
                 uint32_t map_idx,
                 uint32_t fid,
-                uint32_t ring_mask);
+                uint32_t ring_mask,
+                uint16_t dpi);
 
 static inline void bnxt_db_write(struct bnxt_db_info *db, uint32_t idx)
 {
diff --git a/drivers/net/bnxt/bnxt_rxr.h b/drivers/net/bnxt/bnxt_rxr.h
index 7357ca4427..82d6b86fa5 100644
--- a/drivers/net/bnxt/bnxt_rxr.h
+++ b/drivers/net/bnxt/bnxt_rxr.h
@@ -142,6 +142,7 @@ struct bnxt_rx_ring_info {
 
        uint32_t ol_flags_table[BNXT_OL_FLAGS_TBL_DIM];
        uint32_t ol_flags_err_table[BNXT_OL_FLAGS_ERR_TBL_DIM];
+       uint8_t                 dpi;  /* Doorbell page index for multi-doorbell 
support */
 };
 
 uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
diff --git a/drivers/net/bnxt/bnxt_txr.h b/drivers/net/bnxt/bnxt_txr.h
index 09078d545d..fd92a242c3 100644
--- a/drivers/net/bnxt/bnxt_txr.h
+++ b/drivers/net/bnxt/bnxt_txr.h
@@ -26,6 +26,7 @@ struct bnxt_tx_ring_info {
 
        unsigned short          *nr_bds;
        struct bnxt_ring        *tx_ring_struct;
+       uint8_t                 dpi;  /* Doorbell page index for multi-doorbell 
support */
 };
 
 static inline uint32_t bnxt_tx_bds_in_hw(struct bnxt_tx_queue *txq)
diff --git a/drivers/net/bnxt/hsi_struct_def_dpdk.h 
b/drivers/net/bnxt/hsi_struct_def_dpdk.h
index 06c61cba8f..26d5e9ca78 100644
--- a/drivers/net/bnxt/hsi_struct_def_dpdk.h
+++ b/drivers/net/bnxt/hsi_struct_def_dpdk.h
@@ -15744,6 +15744,15 @@ struct __rte_packed_begin hwrm_func_qcaps_output {
         */
        #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT3_MIRROR_ON_ROCE_SUPPORTED \
                UINT32_C(0x20)
+       /*
+        * When this bit is '1', it indicates that, when rx/tx/cq/nq l2
+        * rings are allocated, each ring can be associated with a
+        * non-common doorbell page index. When '0', a common doorbell
+        * page is used for all rings on a PF. This bit is only set on a
+        * PF.
+        */
+       #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT3_MULTI_L2_DB_SUPPORTED \
+               UINT32_C(0x200)
        /*
         * The number of VFs that can be used for RoCE on the function. If less
         * than max_vfs, roce vfs will be assigned to the first VF of the
@@ -16268,6 +16277,12 @@ struct __rte_packed_begin hwrm_func_qcfg_output {
         * of the doorbell BAR between L2 and RoCE is required.
         */
        uint16_t        l2_doorbell_bar_size_kb;
+       /*
+        * The size of the doorbell BAR in KBytes reserved for multi-L2
+        * doorbell pages. This area is a subset of l2_doorbell_bar_size_kb,
+        * which is size of the total doorbell BAR space reserved for L2.
+        */
+       uint16_t        l2_db_multi_page_size_kb;
        /*
         * A bitmask indicating the active endpoints. Each bit represents a
         * specific endpoint, with bit 0 indicating EP 0 and bit 3 indicating
@@ -45464,6 +45479,13 @@ struct __rte_packed_begin hwrm_ring_alloc_input {
         */
        #define HWRM_RING_ALLOC_INPUT_ENABLES_RX_RATE_PROFILE_VALID \
                UINT32_C(0x1000)
+       /*
+        * This bit must be '1' for the dpi field to be configured.
+        * This should only be used when 'multi_l2_db_supported'
+        * bit is set in flags_ext3 field of FUNC_QCAPS response.
+        */
+       #define HWRM_RING_ALLOC_INPUT_ENABLES_DPI_VALID \
+               UINT32_C(0x2000)
        /* Ring Type. */
        uint8_t ring_type;
        /* L2 Completion Ring (CR) */
@@ -45831,6 +45853,14 @@ struct __rte_packed_begin hwrm_ring_alloc_input {
         * record.
         */
        uint64_t        cq_handle;
+       /*
+        * The "doorbell page index" is specified when allocating a l2 ring.
+        * It is applicable for rx/tx/completion/nq rings, and should only be
+        * used when 'multi_l2_db_supported' bit is set in flags_ext3 field of
+        * FUNC_QCAPS response.
+        */
+       uint16_t        dpi;
+       uint16_t        unused_5[3];
 } __rte_packed_end;
 
 /* hwrm_ring_alloc_output (size:128b/16B) */
-- 
2.47.3

Reply via email to