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

RDMA/bnxt_re: Add support for optimized modify QP



Modify QP improvements are for state transitions
from INIT -> RTR and RTR -> RTS.
In order to support the Modify QP Optimization feature,
the driver is expected to check for the feature support
in the CMDQ_QUERY_FUNC and register its support for this
feature with the FW in CMDQ_INITIALIZE_FIRMWARE.

Additionally, the driver is required to specify the new
fields and attribute masks for the transitions as follows:
1. INIT -> RTR:
   - New fields: srq_used, type.
   - enable srq_used when RC QP is configured to use SRQ.
   - set the type based on the QP type.
   - Mandatory masks:
     - RC: CMDQ_MODIFY_QP_MODIFY_MASK_ACCESS,
           CMDQ_MODIFY_QP_MODIFY_MASK_PKEY
     - UD QP and QP1: CMDQ_MODIFY_QP_MODIFY_MASK_PKEY,
                      CMDQ_MODIFY_QP_MODIFY_MASK_QKEY
2. RTR -> RTS:
   - New fields: type
   - set the type based on the QP type.
   - Mandatory masks:
     - RC: CMDQ_MODIFY_QP_MODIFY_MASK_ACCESS
     - UD QP and QP1: CMDQ_MODIFY_QP_MODIFY_MASK_QKEY

Reviewed-by: default avatarSaravanan Vajravel <saravanan.vajravel@broadcom.com>
Reviewed-by: default avatarTushar Rane <tushar.rane@broadcom.com>
Signed-off-by: default avatarKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: default avatarSelvin Xavier <selvin.xavier@broadcom.com>
Link: https://patch.msgid.link/1729065346-1364-2-git-send-email-selvin.xavier@broadcom.com


Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent c11db1bf
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -1277,6 +1277,40 @@ static void __filter_modify_flags(struct bnxt_qplib_qp *qp)
	}
}

static void bnxt_set_mandatory_attributes(struct bnxt_qplib_qp *qp,
					  struct cmdq_modify_qp *req)
{
	u32 mandatory_flags = 0;

	if (qp->type == CMDQ_MODIFY_QP_QP_TYPE_RC)
		mandatory_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_ACCESS;

	if (qp->cur_qp_state == CMDQ_MODIFY_QP_NEW_STATE_INIT &&
	    qp->state == CMDQ_MODIFY_QP_NEW_STATE_RTR) {
		if (qp->type == CMDQ_MODIFY_QP_QP_TYPE_RC && qp->srq)
			req->flags = cpu_to_le16(CMDQ_MODIFY_QP_FLAGS_SRQ_USED);
		mandatory_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_PKEY;
	}

	if (qp->type == CMDQ_MODIFY_QP_QP_TYPE_UD ||
	    qp->type == CMDQ_MODIFY_QP_QP_TYPE_GSI)
		mandatory_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_QKEY;

	qp->modify_flags |= mandatory_flags;
	req->qp_type = qp->type;
}

static bool is_optimized_state_transition(struct bnxt_qplib_qp *qp)
{
	if ((qp->cur_qp_state == CMDQ_MODIFY_QP_NEW_STATE_INIT &&
	     qp->state == CMDQ_MODIFY_QP_NEW_STATE_RTR) ||
	    (qp->cur_qp_state == CMDQ_MODIFY_QP_NEW_STATE_RTR &&
	     qp->state == CMDQ_MODIFY_QP_NEW_STATE_RTS))
		return true;

	return false;
}

int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
{
	struct bnxt_qplib_rcfw *rcfw = res->rcfw;
@@ -1293,6 +1327,12 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)

	/* Filter out the qp_attr_mask based on the state->new transition */
	__filter_modify_flags(qp);
	if (qp->modify_flags & CMDQ_MODIFY_QP_MODIFY_MASK_STATE) {
		/* Set mandatory attributes for INIT -> RTR and RTR -> RTS transition */
		if (_is_optimize_modify_qp_supported(res->dattr->dev_cap_flags2) &&
		    is_optimized_state_transition(qp))
			bnxt_set_mandatory_attributes(qp, &req);
	}
	bmask = qp->modify_flags;
	req.modify_mask = cpu_to_le32(qp->modify_flags);
	req.qp_cid = cpu_to_le32(qp->id);
+5 −1
Original line number Diff line number Diff line
@@ -832,6 +832,7 @@ int bnxt_qplib_init_rcfw(struct bnxt_qplib_rcfw *rcfw,
	struct creq_initialize_fw_resp resp = {};
	struct cmdq_initialize_fw req = {};
	struct bnxt_qplib_cmdqmsg msg = {};
	u16 flags = 0;
	u8 pgsz, lvl;
	int rc;

@@ -906,7 +907,10 @@ int bnxt_qplib_init_rcfw(struct bnxt_qplib_rcfw *rcfw,

skip_ctx_setup:
	if (BNXT_RE_HW_RETX(rcfw->res->dattr->dev_cap_flags))
		req.flags |= cpu_to_le16(CMDQ_INITIALIZE_FW_FLAGS_HW_REQUESTER_RETX_SUPPORTED);
		flags |= CMDQ_INITIALIZE_FW_FLAGS_HW_REQUESTER_RETX_SUPPORTED;
	if (_is_optimize_modify_qp_supported(rcfw->res->dattr->dev_cap_flags2))
		flags |= CMDQ_INITIALIZE_FW_FLAGS_OPTIMIZE_MODIFY_QP_SUPPORTED;
	req.flags |= cpu_to_le16(flags);
	req.stat_ctx_id = cpu_to_le32(ctx->stats.fw_id);
	bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), sizeof(resp), 0);
	rc = bnxt_qplib_rcfw_send_message(rcfw, &msg);
+5 −0
Original line number Diff line number Diff line
@@ -576,4 +576,9 @@ static inline bool _is_relaxed_ordering_supported(u16 dev_cap_ext_flags2)
	return dev_cap_ext_flags2 & CREQ_QUERY_FUNC_RESP_SB_MEMORY_REGION_RO_SUPPORTED;
}

static inline bool _is_optimize_modify_qp_supported(u16 dev_cap_ext_flags2)
{
	return dev_cap_ext_flags2 & CREQ_QUERY_FUNC_RESP_SB_OPTIMIZE_MODIFY_QP_SUPPORTED;
}

#endif /* __BNXT_QPLIB_RES_H__ */
+2 −0
Original line number Diff line number Diff line
@@ -216,6 +216,7 @@ struct cmdq_initialize_fw {
	__le16	flags;
	#define CMDQ_INITIALIZE_FW_FLAGS_MRAV_RESERVATION_SPLIT          0x1UL
	#define CMDQ_INITIALIZE_FW_FLAGS_HW_REQUESTER_RETX_SUPPORTED     0x2UL
	#define CMDQ_INITIALIZE_FW_FLAGS_OPTIMIZE_MODIFY_QP_SUPPORTED    0x8UL
	__le16	cookie;
	u8	resp_size;
	u8	reserved8;
@@ -559,6 +560,7 @@ struct cmdq_modify_qp {
	#define CMDQ_MODIFY_QP_OPCODE_LAST     CMDQ_MODIFY_QP_OPCODE_MODIFY_QP
	u8	cmd_size;
	__le16	flags;
	 #define CMDQ_MODIFY_QP_FLAGS_SRQ_USED       0x1UL
	__le16	cookie;
	u8	resp_size;
	u8	qp_type;