Commit e72d45d2 authored by Kalesh AP's avatar Kalesh AP Committed by Leon Romanovsky
Browse files

RDMA/bnxt_re: Add support for QP rate limiting



Broadcom P7 chips supports applying rate limit to RC QPs.
It allows adjust shaper rate values during the INIT -> RTR,
RTR -> RTS, RTS -> RTS state changes or after QP transitions
to RTR or RTS.

Signed-off-by: default avatarDamodharam Ammepalli <damodharam.ammepalli@broadcom.com>
Reviewed-by: default avatarHongguang Gao <hongguang.gao@broadcom.com>
Signed-off-by: default avatarKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Link: https://patch.msgid.link/20260202133413.3182578-2-kalesh-anakkur.purayil@broadcom.com


Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent e5b0cfa3
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -2089,10 +2089,11 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
	unsigned int flags;
	u8 nw_type;

	if (qp_attr_mask & ~IB_QP_ATTR_STANDARD_BITS)
	if (qp_attr_mask & ~(IB_QP_ATTR_STANDARD_BITS | IB_QP_RATE_LIMIT))
		return -EOPNOTSUPP;

	qp->qplib_qp.modify_flags = 0;
	qp->qplib_qp.ext_modify_flags = 0;
	if (qp_attr_mask & IB_QP_STATE) {
		curr_qp_state = __to_ib_qp_state(qp->qplib_qp.cur_qp_state);
		new_qp_state = qp_attr->qp_state;
@@ -2129,6 +2130,15 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
			bnxt_re_unlock_cqs(qp, flags);
		}
	}

	if (qp_attr_mask & IB_QP_RATE_LIMIT) {
		if (qp->qplib_qp.type != IB_QPT_RC ||
		    !_is_modify_qp_rate_limit_supported(dev_attr->dev_cap_flags2))
			return -EOPNOTSUPP;
		qp->qplib_qp.ext_modify_flags |=
			CMDQ_MODIFY_QP_EXT_MODIFY_MASK_RATE_LIMIT_VALID;
		qp->qplib_qp.rate_limit = qp_attr->rate_limit;
	}
	if (qp_attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY) {
		qp->qplib_qp.modify_flags |=
				CMDQ_MODIFY_QP_MODIFY_MASK_EN_SQD_ASYNC_NOTIFY;
+11 −1
Original line number Diff line number Diff line
@@ -1313,8 +1313,8 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
	struct bnxt_qplib_cmdqmsg msg = {};
	struct cmdq_modify_qp req = {};
	u16 vlan_pcp_vlan_dei_vlan_id;
	u32 bmask, bmask_ext;
	u32 temp32[4];
	u32 bmask;
	int rc;

	bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req,
@@ -1329,9 +1329,16 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
		    is_optimized_state_transition(qp))
			bnxt_set_mandatory_attributes(res, qp, &req);
	}

	bmask = qp->modify_flags;
	req.modify_mask = cpu_to_le32(qp->modify_flags);
	bmask_ext = qp->ext_modify_flags;
	req.ext_modify_mask = cpu_to_le32(qp->ext_modify_flags);
	req.qp_cid = cpu_to_le32(qp->id);

	if (bmask_ext & CMDQ_MODIFY_QP_EXT_MODIFY_MASK_RATE_LIMIT_VALID)
		req.rate_limit = cpu_to_le32(qp->rate_limit);

	if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_STATE) {
		req.network_type_en_sqd_async_notify_new_state =
				(qp->state & CMDQ_MODIFY_QP_NEW_STATE_MASK) |
@@ -1429,6 +1436,9 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
	rc = bnxt_qplib_rcfw_send_message(rcfw, &msg);
	if (rc)
		return rc;

	if (bmask_ext & CMDQ_MODIFY_QP_EXT_MODIFY_MASK_RATE_LIMIT_VALID)
		qp->shaper_allocation_status = resp.shaper_allocation_status;
	qp->cur_qp_state = qp->state;
	return 0;
}
+3 −0
Original line number Diff line number Diff line
@@ -280,6 +280,7 @@ struct bnxt_qplib_qp {
	u8				state;
	u8				cur_qp_state;
	u64				modify_flags;
	u32				ext_modify_flags;
	u32				max_inline_data;
	u32				mtu;
	u8				path_mtu;
@@ -346,6 +347,8 @@ struct bnxt_qplib_qp {
	bool				is_host_msn_tbl;
	u8				tos_dscp;
	u32				ugid_index;
	u32				rate_limit;
	u8				shaper_allocation_status;
};

#define BNXT_RE_MAX_MSG_SIZE	0x80000000
+6 −0
Original line number Diff line number Diff line
@@ -623,4 +623,10 @@ static inline bool _is_max_srq_ext_supported(u16 dev_cap_ext_flags_2)
	return !!(dev_cap_ext_flags_2 & CREQ_QUERY_FUNC_RESP_SB_MAX_SRQ_EXTENDED);
}

static inline bool _is_modify_qp_rate_limit_supported(u16 dev_cap_ext_flags2)
{
	return dev_cap_ext_flags2 &
		CREQ_QUERY_FUNC_RESP_SB_MODIFY_QP_RATE_LIMIT_SUPPORTED;
}

#endif /* __BNXT_QPLIB_RES_H__ */
+5 −0
Original line number Diff line number Diff line
@@ -193,6 +193,11 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw)
		attr->max_dpi = le32_to_cpu(sb->max_dpi);

	attr->is_atomic = bnxt_qplib_is_atomic_cap(rcfw);

	if (_is_modify_qp_rate_limit_supported(attr->dev_cap_flags2)) {
		attr->rate_limit_min = le16_to_cpu(sb->rate_limit_min);
		attr->rate_limit_max = le32_to_cpu(sb->rate_limit_max);
	}
bail:
	dma_free_coherent(&rcfw->pdev->dev, sbuf.size,
			  sbuf.sb, sbuf.dma_addr);
Loading