Commit b1b66ae0 authored by Hongguang Gao's avatar Hongguang Gao Committed by Jakub Kicinski
Browse files

bnxt_en: Use FW defined resource limits for RoCE



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: default avatarDamodharam Ammepalli <damodharam.ammepalli@broadcom.com>
Reviewed-by: default avatarKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: default avatarHongguang Gao <hongguang.gao@broadcom.com>
Signed-off-by: default avatarSelvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20241217182620.2454075-2-michael.chan@broadcom.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 07e5c4eb
Loading
Loading
Loading
Loading
+29 −12
Original line number Diff line number Diff line
@@ -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 */
		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,6 +9164,11 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp)
		goto skip_rdma;

	ctxm = &ctx->ctx_arr[BNXT_CTX_MRAV];
	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.
		 */
@@ -9164,6 +9177,7 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp)
		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;
+3 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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