]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/bnxt_re: Add support for optimized modify QP
authorKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Wed, 16 Oct 2024 07:55:42 +0000 (00:55 -0700)
committerLeon Romanovsky <leon@kernel.org>
Mon, 28 Oct 2024 18:59:32 +0000 (20:59 +0200)
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: Saravanan Vajravel <saravanan.vajravel@broadcom.com>
Reviewed-by: Tushar Rane <tushar.rane@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://patch.msgid.link/1729065346-1364-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_rcfw.c
drivers/infiniband/hw/bnxt_re/qplib_res.h
drivers/infiniband/hw/bnxt_re/roce_hsi.h

index 42e98e5f94cb1a0755bc6fe96f7fe75c66b8e69d..ff2340c59fc16cd2b38602029c5c78928f7fa630 100644 (file)
@@ -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);
index 3ffaef0c26519424c35e1c690faad3ca9e73fcf9..f5713e3c39fb933cac6b93d47633a728b2f60a51 100644 (file)
@@ -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 @@ config_vf_res:
 
 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);
index c2f710364e0ffe7563c0aded8e40342e50433682..ef198a6fc85ac6f91b64153072e66558e49caed8 100644 (file)
@@ -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__ */
index 3ec895284e4931da37a4a9ddf6df4329854ec131..492417eb5896e68a8e699d21275f1bd095c4dd76 100644 (file)
@@ -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;