@@ -2016,6 +2016,12 @@ static void bnxt_re_free_nqr_mem(struct bnxt_re_dev *rdev)
static void bnxt_re_clean_qdump(struct bnxt_re_dev *rdev)
{
+ struct bnxt_qplib_rcfw *rcfw = &rdev->rcfw;
+
+ vfree(rcfw->qp_ctxm_data);
+ vfree(rcfw->cq_ctxm_data);
+ vfree(rcfw->srq_ctxm_data);
+ vfree(rcfw->mrw_ctxm_data);
vfree(rdev->qdump_head.qdump);
}
@@ -2075,14 +2081,40 @@ static void bnxt_re_worker(struct work_struct *work)
schedule_delayed_work(&rdev->worker, msecs_to_jiffies(30000));
}
+static void bnxt_re_init_ctxm_size(struct bnxt_re_dev *rdev)
+{
+ struct bnxt_qplib_rcfw *rcfw = &rdev->rcfw;
+
+ if (bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx)) {
+ rcfw->qp_ctxm_size = BNXT_RE_CONTEXT_TYPE_QPC_SIZE_P7;
+ rcfw->cq_ctxm_size = BNXT_RE_CONTEXT_TYPE_CQ_SIZE_P7;
+ rcfw->srq_ctxm_size = BNXT_RE_CONTEXT_TYPE_SRQ_SIZE_P7;
+ rcfw->mrw_ctxm_size = BNXT_RE_CONTEXT_TYPE_MRW_SIZE_P7;
+
+ } else if (bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx)) {
+ rcfw->qp_ctxm_size = BNXT_RE_CONTEXT_TYPE_QPC_SIZE_P5;
+ rcfw->cq_ctxm_size = BNXT_RE_CONTEXT_TYPE_CQ_SIZE_P5;
+ rcfw->srq_ctxm_size = BNXT_RE_CONTEXT_TYPE_SRQ_SIZE_P5;
+ rcfw->mrw_ctxm_size = BNXT_RE_CONTEXT_TYPE_MRW_SIZE_P5;
+ }
+}
+
static void bnxt_re_init_qdump(struct bnxt_re_dev *rdev)
{
+ struct bnxt_qplib_rcfw *rcfw = &rdev->rcfw;
+
rdev->qdump_head.max_elements = BNXT_RE_MAX_QDUMP_ENTRIES;
rdev->qdump_head.index = 0;
rdev->snapdump_dbg_lvl = BNXT_RE_SNAPDUMP_ERR;
mutex_init(&rdev->qdump_head.lock);
rdev->qdump_head.qdump = vzalloc(rdev->qdump_head.max_elements *
sizeof(struct qdump_array));
+ /* Setup Context cache information */
+ bnxt_re_init_ctxm_size(rdev);
+ rcfw->qp_ctxm_data = vzalloc(BNXT_RE_MAX_QDUMP_ENTRIES * rcfw->qp_ctxm_size);
+ rcfw->cq_ctxm_data = vzalloc(BNXT_RE_MAX_QDUMP_ENTRIES * rcfw->cq_ctxm_size);
+ rcfw->srq_ctxm_data = vzalloc(BNXT_RE_MAX_QDUMP_ENTRIES * rcfw->srq_ctxm_size);
+ rcfw->mrw_ctxm_data = vzalloc(BNXT_RE_MAX_QDUMP_ENTRIES * rcfw->mrw_ctxm_size);
}
static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
@@ -903,6 +903,8 @@ int bnxt_qplib_init_rcfw(struct bnxt_qplib_rcfw *rcfw,
flags |= CMDQ_INITIALIZE_FW_FLAGS_OPTIMIZE_MODIFY_QP_SUPPORTED;
if (rcfw->res->en_dev->flags & BNXT_EN_FLAG_ROCE_VF_RES_MGMT)
flags |= CMDQ_INITIALIZE_FW_FLAGS_L2_VF_RESOURCE_MGMT;
+ if (is_roce_context_destroy_sb_enabled(rcfw->res->dattr->dev_cap_flags2))
+ flags |= CMDQ_INITIALIZE_FW_FLAGS_DESTROY_CONTEXT_SB_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);
@@ -228,6 +228,18 @@ struct bnxt_qplib_rcfw {
struct bnxt_qplib_qp_node *qp_tbl;
/* To synchronize the qp-handle hash table */
spinlock_t tbl_lock;
+ u32 qp_ctxm_data_index;
+ u32 cq_ctxm_data_index;
+ u32 mrw_ctxm_data_index;
+ u32 srq_ctxm_data_index;
+ u16 qp_ctxm_size;
+ u16 cq_ctxm_size;
+ u16 mrw_ctxm_size;
+ u16 srq_ctxm_size;
+ void *qp_ctxm_data;
+ void *cq_ctxm_data;
+ void *mrw_ctxm_data;
+ void *srq_ctxm_data;
u64 oos_prev;
u32 init_oos_stats;
u32 cmdq_depth;
@@ -592,4 +592,18 @@ static inline bool _is_cq_coalescing_supported(u16 dev_cap_ext_flags2)
return dev_cap_ext_flags2 & CREQ_QUERY_FUNC_RESP_SB_CQ_COALESCING_SUPPORTED;
}
+static inline bool is_roce_context_destroy_sb_enabled(u16 dev_cap_ext_flags2)
+{
+ return !!(dev_cap_ext_flags2 & CREQ_QUERY_FUNC_RESP_SB_DESTROY_CONTEXT_SB_SUPPORTED);
+}
+
+#define BNXT_RE_CONTEXT_TYPE_QPC_SIZE_P5 1088
+#define BNXT_RE_CONTEXT_TYPE_CQ_SIZE_P5 128
+#define BNXT_RE_CONTEXT_TYPE_MRW_SIZE_P5 128
+#define BNXT_RE_CONTEXT_TYPE_SRQ_SIZE_P5 192
+
+#define BNXT_RE_CONTEXT_TYPE_QPC_SIZE_P7 1088
+#define BNXT_RE_CONTEXT_TYPE_CQ_SIZE_P7 192
+#define BNXT_RE_CONTEXT_TYPE_MRW_SIZE_P7 192
+#define BNXT_RE_CONTEXT_TYPE_SRQ_SIZE_P7 192
#endif /* __BNXT_QPLIB_RES_H__ */
@@ -218,6 +218,7 @@ struct cmdq_initialize_fw {
#define CMDQ_INITIALIZE_FW_FLAGS_HW_REQUESTER_RETX_SUPPORTED 0x2UL
#define CMDQ_INITIALIZE_FW_FLAGS_OPTIMIZE_MODIFY_QP_SUPPORTED 0x8UL
#define CMDQ_INITIALIZE_FW_FLAGS_L2_VF_RESOURCE_MGMT 0x10UL
+ #define CMDQ_INITIALIZE_FW_FLAGS_DESTROY_CONTEXT_SB_SUPPORTED 0x20UL
__le16 cookie;
u8 resp_size;
u8 reserved8;
@@ -2215,6 +2216,7 @@ struct creq_query_func_resp_sb {
#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_IQM_MSN_TABLE (0x2UL << 4)
#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_LAST \
CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_IQM_MSN_TABLE
+ #define CREQ_QUERY_FUNC_RESP_SB_DESTROY_CONTEXT_SB_SUPPORTED 0x100UL
#define CREQ_QUERY_FUNC_RESP_SB_MIN_RNR_RTR_RTS_OPT_SUPPORTED 0x1000UL
__le16 max_xp_qp_size;
__le16 create_qp_batch_size;