]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/bnxt_re: Allow MSN table capability check
authorSelvin Xavier <selvin.xavier@broadcom.com>
Tue, 28 May 2024 06:11:36 +0000 (23:11 -0700)
committerLeon Romanovsky <leon@kernel.org>
Thu, 30 May 2024 10:28:02 +0000 (13:28 +0300)
FW reports the HW capability to use PSN table or MSN table and
driver/library need to select it based on this capability.
Use the new capability instead of the older capability check for HW
retransmission while handling the MSN/PSN table. FW report
zero (PSN table) for older adapters to maintain backward compatibility.

Also, Updated the FW interface structures to handle the new fields.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://lore.kernel.org/r/1716876697-25970-2-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/bnxt_re/qplib_fp.c
drivers/infiniband/hw/bnxt_re/qplib_fp.h
drivers/infiniband/hw/bnxt_re/qplib_res.h
drivers/infiniband/hw/bnxt_re/qplib_sp.c
drivers/infiniband/hw/bnxt_re/qplib_sp.h
drivers/infiniband/hw/bnxt_re/roce_hsi.h

index 04258676d0726fb75c52f91cd3c724ee4a5c9114..49e4a4a50bfaeb2784330eec016be435f21aef0e 100644 (file)
@@ -984,7 +984,7 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
        u16 nsge;
 
        if (res->dattr)
-               qp->dev_cap_flags = res->dattr->dev_cap_flags;
+               qp->is_host_msn_tbl = _is_host_msn_table(res->dattr->dev_cap_flags2);
 
        sq->dbinfo.flags = 0;
        bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req,
@@ -1002,7 +1002,7 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
                         sizeof(struct sq_psn_search_ext) :
                         sizeof(struct sq_psn_search);
 
-               if (BNXT_RE_HW_RETX(qp->dev_cap_flags)) {
+               if (qp->is_host_msn_tbl) {
                        psn_sz = sizeof(struct sq_msn_search);
                        qp->msn = 0;
                }
@@ -1016,7 +1016,7 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
        hwq_attr.aux_depth = psn_sz ? bnxt_qplib_set_sq_size(sq, qp->wqe_mode)
                                    : 0;
        /* Update msn tbl size */
-       if (BNXT_RE_HW_RETX(qp->dev_cap_flags) && psn_sz) {
+       if (qp->is_host_msn_tbl && psn_sz) {
                hwq_attr.aux_depth = roundup_pow_of_two(bnxt_qplib_set_sq_size(sq, qp->wqe_mode));
                qp->msn_tbl_sz = hwq_attr.aux_depth;
                qp->msn = 0;
@@ -1637,7 +1637,7 @@ static void bnxt_qplib_fill_psn_search(struct bnxt_qplib_qp *qp,
        if (!swq->psn_search)
                return;
        /* Handle MSN differently on cap flags  */
-       if (BNXT_RE_HW_RETX(qp->dev_cap_flags)) {
+       if (qp->is_host_msn_tbl) {
                bnxt_qplib_fill_msn_search(qp, wqe, swq);
                return;
        }
@@ -1819,7 +1819,7 @@ int bnxt_qplib_post_send(struct bnxt_qplib_qp *qp,
        }
 
        swq = bnxt_qplib_get_swqe(sq, &wqe_idx);
-       bnxt_qplib_pull_psn_buff(qp, sq, swq, BNXT_RE_HW_RETX(qp->dev_cap_flags));
+       bnxt_qplib_pull_psn_buff(qp, sq, swq, qp->is_host_msn_tbl);
 
        idx = 0;
        swq->slot_idx = hwq->prod;
@@ -2009,7 +2009,7 @@ int bnxt_qplib_post_send(struct bnxt_qplib_qp *qp,
                rc = -EINVAL;
                goto done;
        }
-       if (!BNXT_RE_HW_RETX(qp->dev_cap_flags) || msn_update) {
+       if (!qp->is_host_msn_tbl || msn_update) {
                swq->next_psn = sq->psn & BTH_PSN_MASK;
                bnxt_qplib_fill_psn_search(qp, wqe, swq);
        }
index 7fd4506b3584f8b95d659a003c1511410a2efc24..4aaac84c1b1b7c519fc5178bf26f9998464be48e 100644 (file)
@@ -340,7 +340,7 @@ struct bnxt_qplib_qp {
        struct list_head                rq_flush;
        u32                             msn;
        u32                             msn_tbl_sz;
-       u16                             dev_cap_flags;
+       bool                            is_host_msn_tbl;
 };
 
 #define BNXT_QPLIB_MAX_CQE_ENTRY_SIZE  sizeof(struct cq_base)
index 61628f7f125326cfe1eb478e551388666673b36b..a0f78cde314f745bfa8d8eaf65c832ba65fe72fa 100644 (file)
@@ -554,6 +554,12 @@ static inline bool _is_hw_retx_supported(u16 dev_cap_flags)
 
 #define BNXT_RE_HW_RETX(a) _is_hw_retx_supported((a))
 
+static inline bool _is_host_msn_table(u16 dev_cap_ext_flags2)
+{
+       return (dev_cap_ext_flags2 & CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_MASK) ==
+               CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_HOST_MSN_TABLE;
+}
+
 static inline u8 bnxt_qplib_dbr_pacing_en(struct bnxt_qplib_chip_ctx *cctx)
 {
        return cctx->modes.dbr_pacing;
index 8beeedd1506144eaafb1491a05f77743fd543647..9328db92fa6db3ab02ce6bcddecd11c7fc4cefbe 100644 (file)
@@ -156,6 +156,7 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw,
                                    (0x01 << RCFW_DBR_BASE_PAGE_SHIFT);
        attr->max_sgid = BNXT_QPLIB_NUM_GIDS_SUPPORTED;
        attr->dev_cap_flags = le16_to_cpu(sb->dev_cap_flags);
+       attr->dev_cap_flags2 = le16_to_cpu(sb->dev_cap_ext_flags_2);
 
        bnxt_qplib_query_version(rcfw, attr->fw_ver);
 
index d33c78b96217a8c76cd603d489328afd85937c69..16a67d70a6fc4bcdf5a4df70b0ae1fc5f9fac13a 100644 (file)
@@ -72,6 +72,7 @@ struct bnxt_qplib_dev_attr {
        u8                              tqm_alloc_reqs[MAX_TQM_ALLOC_REQ];
        bool                            is_atomic;
        u16                             dev_cap_flags;
+       u16                             dev_cap_flags2;
        u32                             max_dpi;
 };
 
index 605c9463c4082e830d89d8c6bb7c2d697f06d65e..0425309695057ec83d7cc1e001b3b71f93180ea5 100644 (file)
@@ -2157,8 +2157,36 @@ struct creq_query_func_resp_sb {
        __le32  tqm_alloc_reqs[12];
        __le32  max_dpi;
        u8      max_sge_var_wqe;
-       u8      reserved_8;
+       u8      dev_cap_ext_flags;
+       #define CREQ_QUERY_FUNC_RESP_SB_ATOMIC_OPS_NOT_SUPPORTED         0x1UL
+       #define CREQ_QUERY_FUNC_RESP_SB_DRV_VERSION_RGTR_SUPPORTED       0x2UL
+       #define CREQ_QUERY_FUNC_RESP_SB_CREATE_QP_BATCH_SUPPORTED        0x4UL
+       #define CREQ_QUERY_FUNC_RESP_SB_DESTROY_QP_BATCH_SUPPORTED       0x8UL
+       #define CREQ_QUERY_FUNC_RESP_SB_ROCE_STATS_EXT_CTX_SUPPORTED     0x10UL
+       #define CREQ_QUERY_FUNC_RESP_SB_CREATE_SRQ_SGE_SUPPORTED         0x20UL
+       #define CREQ_QUERY_FUNC_RESP_SB_FIXED_SIZE_WQE_DISABLED          0x40UL
+       #define CREQ_QUERY_FUNC_RESP_SB_DCN_SUPPORTED                    0x80UL
        __le16  max_inline_data_var_wqe;
+       __le32  start_qid;
+       u8      max_msn_table_size;
+       u8      reserved8_1;
+       __le16  dev_cap_ext_flags_2;
+       #define CREQ_QUERY_FUNC_RESP_SB_OPTIMIZE_MODIFY_QP_SUPPORTED             0x1UL
+       #define CREQ_QUERY_FUNC_RESP_SB_CHANGE_UDP_SRC_PORT_WQE_SUPPORTED        0x2UL
+       #define CREQ_QUERY_FUNC_RESP_SB_CQ_COALESCING_SUPPORTED                  0x4UL
+       #define CREQ_QUERY_FUNC_RESP_SB_MEMORY_REGION_RO_SUPPORTED               0x8UL
+       #define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_MASK          0x30UL
+       #define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_SFT           4
+       #define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_HOST_PSN_TABLE  (0x0UL << 4)
+       #define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_HOST_MSN_TABLE  (0x1UL << 4)
+       #define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_IQM_MSN_TABLE   (0x2UL << 4)
+       #define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_LAST \
+                       CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_IQM_MSN_TABLE
+       __le16  max_xp_qp_size;
+       __le16  create_qp_batch_size;
+       __le16  destroy_qp_batch_size;
+       __le16  reserved16;
+       __le64  reserved64;
 };
 
 /* cmdq_set_func_resources (size:448b/56B) */