Message ID | 1728928561-25607-2-git-send-email-selvin.xavier@broadcom.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | RDMA/bnxt_re: driver update | expand |
On Mon, Oct 14, 2024 at 10:55:58AM -0700, Selvin Xavier wrote: > From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> > > 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> > --- > drivers/infiniband/hw/bnxt_re/qplib_fp.c | 40 ++++++++++++++++++++++++++++++ > drivers/infiniband/hw/bnxt_re/qplib_rcfw.c | 6 ++++- > drivers/infiniband/hw/bnxt_re/qplib_res.h | 5 ++++ > drivers/infiniband/hw/bnxt_re/roce_hsi.h | 3 +++ > 4 files changed, 53 insertions(+), 1 deletion(-) <...> > diff --git a/drivers/infiniband/hw/bnxt_re/roce_hsi.h b/drivers/infiniband/hw/bnxt_re/roce_hsi.h > index 3ec8952..69d50d7 100644 > --- a/drivers/infiniband/hw/bnxt_re/roce_hsi.h > +++ b/drivers/infiniband/hw/bnxt_re/roce_hsi.h > @@ -216,6 +216,8 @@ 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_DRV_VERSION 0x4UL Where is this define used? > + #define CMDQ_INITIALIZE_FW_FLAGS_OPTIMIZE_MODIFY_QP_SUPPORTED 0x8UL Thanks
On Mon, Oct 28, 2024 at 5:29 PM Leon Romanovsky <leon@kernel.org> wrote: > > On Mon, Oct 14, 2024 at 10:55:58AM -0700, Selvin Xavier wrote: > > From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> > > > > 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> > > --- > > drivers/infiniband/hw/bnxt_re/qplib_fp.c | 40 ++++++++++++++++++++++++++++++ > > drivers/infiniband/hw/bnxt_re/qplib_rcfw.c | 6 ++++- > > drivers/infiniband/hw/bnxt_re/qplib_res.h | 5 ++++ > > drivers/infiniband/hw/bnxt_re/roce_hsi.h | 3 +++ > > 4 files changed, 53 insertions(+), 1 deletion(-) > > <...> > > > diff --git a/drivers/infiniband/hw/bnxt_re/roce_hsi.h b/drivers/infiniband/hw/bnxt_re/roce_hsi.h > > index 3ec8952..69d50d7 100644 > > --- a/drivers/infiniband/hw/bnxt_re/roce_hsi.h > > +++ b/drivers/infiniband/hw/bnxt_re/roce_hsi.h > > @@ -216,6 +216,8 @@ 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_DRV_VERSION 0x4UL > > Where is this define used? We are not using this field now. This is structure fields are copied from an autogenerated file. Since we updated this structure, we have copied all update to that structure. The value we are currently interested in is 0x8UL. Do you want me to repost the series after removing the above define? > > > + #define CMDQ_INITIALIZE_FW_FLAGS_OPTIMIZE_MODIFY_QP_SUPPORTED 0x8UL > > Thanks
On Mon, Oct 28, 2024 at 10:20:00PM +0530, Selvin Xavier wrote: > On Mon, Oct 28, 2024 at 5:29 PM Leon Romanovsky <leon@kernel.org> wrote: > > > > On Mon, Oct 14, 2024 at 10:55:58AM -0700, Selvin Xavier wrote: > > > From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> > > > > > > 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> > > > --- > > > drivers/infiniband/hw/bnxt_re/qplib_fp.c | 40 ++++++++++++++++++++++++++++++ > > > drivers/infiniband/hw/bnxt_re/qplib_rcfw.c | 6 ++++- > > > drivers/infiniband/hw/bnxt_re/qplib_res.h | 5 ++++ > > > drivers/infiniband/hw/bnxt_re/roce_hsi.h | 3 +++ > > > 4 files changed, 53 insertions(+), 1 deletion(-) > > > > <...> > > > > > diff --git a/drivers/infiniband/hw/bnxt_re/roce_hsi.h b/drivers/infiniband/hw/bnxt_re/roce_hsi.h > > > index 3ec8952..69d50d7 100644 > > > --- a/drivers/infiniband/hw/bnxt_re/roce_hsi.h > > > +++ b/drivers/infiniband/hw/bnxt_re/roce_hsi.h > > > @@ -216,6 +216,8 @@ 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_DRV_VERSION 0x4UL > > > > Where is this define used? > We are not using this field now. This is structure fields are copied > from an autogenerated file. Since we updated this structure, we have > copied all update to that structure. The value we > are currently interested in is 0x8UL. > > Do you want me to repost the series after removing the above define? I will remove it by myself, no need to repost. Thanks > > > > > + #define CMDQ_INITIALIZE_FW_FLAGS_OPTIMIZE_MODIFY_QP_SUPPORTED 0x8UL > > > > Thanks
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c index 42e98e5..ff2340c 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c +++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c @@ -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); diff --git a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c index 3ffaef0c..f5713e3 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c +++ b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c @@ -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); diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.h b/drivers/infiniband/hw/bnxt_re/qplib_res.h index c2f7103..ef198a6 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_res.h +++ b/drivers/infiniband/hw/bnxt_re/qplib_res.h @@ -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__ */ diff --git a/drivers/infiniband/hw/bnxt_re/roce_hsi.h b/drivers/infiniband/hw/bnxt_re/roce_hsi.h index 3ec8952..69d50d7 100644 --- a/drivers/infiniband/hw/bnxt_re/roce_hsi.h +++ b/drivers/infiniband/hw/bnxt_re/roce_hsi.h @@ -216,6 +216,8 @@ 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_DRV_VERSION 0x4UL + #define CMDQ_INITIALIZE_FW_FLAGS_OPTIMIZE_MODIFY_QP_SUPPORTED 0x8UL __le16 cookie; u8 resp_size; u8 reserved8; @@ -559,6 +561,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;