]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bnxt_en: Use FW defined resource limits for RoCE
authorHongguang Gao <hongguang.gao@broadcom.com>
Tue, 17 Dec 2024 18:26:15 +0000 (10:26 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 20 Dec 2024 01:30:00 +0000 (17:30 -0800)
If FW supports setting resource limits for RoCE, then just use the
FW limits instead of using some fixed values in the driver.  These
limits will be used to allocate context memory for QP, SRQ, AH, and
MR resources for RoCE.

Reviewed-by: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Hongguang Gao <hongguang.gao@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20241217182620.2454075-2-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h

index b86f980fa7ea60873dd769d0e0afd6554059ccdc..469352ac1f7e7e0b6db99dd0851848617adf89e9 100644 (file)
@@ -9117,10 +9117,18 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp)
        ena = 0;
        if ((bp->flags & BNXT_FLAG_ROCE_CAP) && !is_kdump_kernel()) {
                pg_lvl = 2;
-               extra_qps = min_t(u32, 65536, max_qps - l2_qps - qp1_qps);
-               /* allocate extra qps if fw supports RoCE fast qp destroy feature */
-               extra_qps += fast_qpmd_qps;
-               extra_srqs = min_t(u32, 8192, max_srqs - srqs);
+               if (BNXT_SW_RES_LMT(bp)) {
+                       extra_qps = max_qps - l2_qps - qp1_qps;
+                       extra_srqs = max_srqs - srqs;
+               } else {
+                       extra_qps = min_t(u32, 65536,
+                                         max_qps - l2_qps - qp1_qps);
+                       /* allocate extra qps if fw supports RoCE fast qp
+                        * destroy feature
+                        */
+                       extra_qps += fast_qpmd_qps;
+                       extra_srqs = min_t(u32, 8192, max_srqs - srqs);
+               }
                if (fast_qpmd_qps)
                        ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_QP_FAST_QPMD;
        }
@@ -9156,14 +9164,20 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp)
                goto skip_rdma;
 
        ctxm = &ctx->ctx_arr[BNXT_CTX_MRAV];
-       /* 128K extra is needed to accommodate static AH context
-        * allocation by f/w.
-        */
-       num_mr = min_t(u32, ctxm->max_entries / 2, 1024 * 256);
-       num_ah = min_t(u32, num_mr, 1024 * 128);
-       ctxm->split_entry_cnt = BNXT_CTX_MRAV_AV_SPLIT_ENTRY + 1;
-       if (!ctxm->mrav_av_entries || ctxm->mrav_av_entries > num_ah)
-               ctxm->mrav_av_entries = num_ah;
+       if (BNXT_SW_RES_LMT(bp) &&
+           ctxm->split_entry_cnt == BNXT_CTX_MRAV_AV_SPLIT_ENTRY + 1) {
+               num_ah = ctxm->mrav_av_entries;
+               num_mr = ctxm->max_entries - num_ah;
+       } else {
+               /* 128K extra is needed to accommodate static AH context
+                * allocation by f/w.
+                */
+               num_mr = min_t(u32, ctxm->max_entries / 2, 1024 * 256);
+               num_ah = min_t(u32, num_mr, 1024 * 128);
+               ctxm->split_entry_cnt = BNXT_CTX_MRAV_AV_SPLIT_ENTRY + 1;
+               if (!ctxm->mrav_av_entries || ctxm->mrav_av_entries > num_ah)
+                       ctxm->mrav_av_entries = num_ah;
+       }
 
        rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, num_mr + num_ah, 2);
        if (rc)
@@ -9470,6 +9484,9 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
                bp->flags |= BNXT_FLAG_UDP_GSO_CAP;
        if (flags_ext2 & FUNC_QCAPS_RESP_FLAGS_EXT2_TX_PKT_TS_CMPL_SUPPORTED)
                bp->fw_cap |= BNXT_FW_CAP_TX_TS_CMP;
+       if (flags_ext2 &
+           FUNC_QCAPS_RESP_FLAGS_EXT2_SW_MAX_RESOURCE_LIMITS_SUPPORTED)
+               bp->fw_cap |= BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS;
        if (BNXT_PF(bp) &&
            (flags_ext2 & FUNC_QCAPS_RESP_FLAGS_EXT2_ROCE_VF_RESOURCE_MGMT_SUPPORTED))
                bp->fw_cap |= BNXT_FW_CAP_ROCE_VF_RESC_MGMT_SUPPORTED;
index 7df7a2233307afc09c0bd24b13a30d256a258265..3e20d200da6203c6b1a6c36b63970fba623fb073 100644 (file)
@@ -2482,6 +2482,7 @@ struct bnxt {
        #define BNXT_FW_CAP_CFA_NTUPLE_RX_EXT_IP_PROTO  BIT_ULL(38)
        #define BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V3     BIT_ULL(39)
        #define BNXT_FW_CAP_VNIC_RE_FLUSH               BIT_ULL(40)
+       #define BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS      BIT_ULL(41)
 
        u32                     fw_dbg_cap;
 
@@ -2501,6 +2502,8 @@ struct bnxt {
        ((bp)->fw_cap & BNXT_FW_CAP_ENABLE_RDMA_SRIOV)
 #define BNXT_ROCE_VF_RESC_CAP(bp)      \
        ((bp)->fw_cap & BNXT_FW_CAP_ROCE_VF_RESC_MGMT_SUPPORTED)
+#define BNXT_SW_RES_LMT(bp)            \
+       ((bp)->fw_cap & BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS)
 
        u32                     hwrm_spec_code;
        u16                     hwrm_cmd_seq;
index b771c84cdd8951482021fcadf10e01f9519c774a..94c6a0928ca02999a8213662f6d491389b6a308d 100644 (file)
@@ -416,6 +416,8 @@ static void bnxt_set_edev_info(struct bnxt_en_dev *edev, struct bnxt *bp)
                edev->flags |= BNXT_EN_FLAG_VF;
        if (BNXT_ROCE_VF_RESC_CAP(bp))
                edev->flags |= BNXT_EN_FLAG_ROCE_VF_RES_MGMT;
+       if (BNXT_SW_RES_LMT(bp))
+               edev->flags |= BNXT_EN_FLAG_SW_RES_LMT;
 
        edev->chip_num = bp->chip_num;
        edev->hw_ring_stats_size = bp->hw_ring_stats_size;
index 5d6aac60f2365038d3e2f7f59d3a6bed7d2fc1a5..54ad9f8273d76f1e29b4deb77d332559aed7a07a 100644 (file)
@@ -65,6 +65,8 @@ struct bnxt_en_dev {
        #define BNXT_EN_FLAG_VF                 0x10
 #define BNXT_EN_VF(edev)       ((edev)->flags & BNXT_EN_FLAG_VF)
        #define BNXT_EN_FLAG_ROCE_VF_RES_MGMT   0x20
+       #define BNXT_EN_FLAG_SW_RES_LMT         0x40
+#define BNXT_EN_SW_RES_LMT(edev) ((edev)->flags & BNXT_EN_FLAG_SW_RES_LMT)
 
        struct bnxt_ulp                 *ulp_tbl;
        int                             l2_db_size;     /* Doorbell BAR size in