Skip to content

Commit 3b72946

Browse files
kadesai16rleon
authored andcommitted
RDMA/bnxt_re: Add support for querying HW contexts
Implements support for querying the hardware resource contexts. This raw data can be used for the debugging of the field issues. Signed-off-by: Kashyap Desai <[email protected]> Signed-off-by: Selvin Xavier <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Leon Romanovsky <[email protected]>
1 parent 7363eb7 commit 3b72946

File tree

5 files changed

+98
-0
lines changed

5 files changed

+98
-0
lines changed

drivers/infiniband/hw/bnxt_re/bnxt_re.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,4 +247,23 @@ static inline void bnxt_re_set_pacing_dev_state(struct bnxt_re_dev *rdev)
247247
rdev->qplib_res.pacing_data->dev_err_state =
248248
test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags);
249249
}
250+
251+
static inline int bnxt_re_read_context_allowed(struct bnxt_re_dev *rdev)
252+
{
253+
if (!bnxt_qplib_is_chip_gen_p5_p7(rdev->chip_ctx) ||
254+
rdev->rcfw.res->cctx->hwrm_intf_ver < HWRM_VERSION_READ_CTX)
255+
return -EOPNOTSUPP;
256+
return 0;
257+
}
258+
259+
#define BNXT_RE_CONTEXT_TYPE_QPC_SIZE_P5 1088
260+
#define BNXT_RE_CONTEXT_TYPE_CQ_SIZE_P5 128
261+
#define BNXT_RE_CONTEXT_TYPE_MRW_SIZE_P5 128
262+
#define BNXT_RE_CONTEXT_TYPE_SRQ_SIZE_P5 192
263+
264+
#define BNXT_RE_CONTEXT_TYPE_QPC_SIZE_P7 1088
265+
#define BNXT_RE_CONTEXT_TYPE_CQ_SIZE_P7 192
266+
#define BNXT_RE_CONTEXT_TYPE_MRW_SIZE_P7 192
267+
#define BNXT_RE_CONTEXT_TYPE_SRQ_SIZE_P7 192
268+
250269
#endif

drivers/infiniband/hw/bnxt_re/qplib_rcfw.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ static inline u32 bnxt_qplib_set_cmd_slots(struct cmdq_base *req)
131131
#define RCFW_CMD_IS_BLOCKING 0x8000
132132

133133
#define HWRM_VERSION_DEV_ATTR_MAX_DPI 0x1000A0000000DULL
134+
/* HWRM version 1.10.3.18 */
135+
#define HWRM_VERSION_READ_CTX 0x1000A00030012
134136

135137
/* Crsq buf is 1024-Byte */
136138
struct bnxt_qplib_crsbe {

drivers/infiniband/hw/bnxt_re/qplib_sp.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -972,3 +972,38 @@ int bnxt_qplib_modify_cc(struct bnxt_qplib_res *res,
972972
rc = bnxt_qplib_rcfw_send_message(res->rcfw, &msg);
973973
return rc;
974974
}
975+
976+
int bnxt_qplib_read_context(struct bnxt_qplib_rcfw *rcfw, u8 res_type,
977+
u32 xid, u32 resp_size, void *resp_va)
978+
{
979+
struct creq_read_context resp = {};
980+
struct bnxt_qplib_cmdqmsg msg = {};
981+
struct cmdq_read_context req = {};
982+
struct bnxt_qplib_rcfw_sbuf sbuf;
983+
int rc;
984+
985+
sbuf.size = resp_size;
986+
sbuf.sb = dma_alloc_coherent(&rcfw->pdev->dev, sbuf.size,
987+
&sbuf.dma_addr, GFP_KERNEL);
988+
if (!sbuf.sb)
989+
return -ENOMEM;
990+
991+
bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req,
992+
CMDQ_BASE_OPCODE_READ_CONTEXT, sizeof(req));
993+
req.resp_addr = cpu_to_le64(sbuf.dma_addr);
994+
req.resp_size = resp_size / BNXT_QPLIB_CMDQE_UNITS;
995+
996+
req.xid = cpu_to_le32(xid);
997+
req.type = res_type;
998+
999+
bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, &sbuf, sizeof(req),
1000+
sizeof(resp), 0);
1001+
rc = bnxt_qplib_rcfw_send_message(rcfw, &msg);
1002+
if (rc)
1003+
goto free_mem;
1004+
1005+
memcpy(resp_va, sbuf.sb, resp_size);
1006+
free_mem:
1007+
dma_free_coherent(&rcfw->pdev->dev, sbuf.size, sbuf.sb, sbuf.dma_addr);
1008+
return rc;
1009+
}

drivers/infiniband/hw/bnxt_re/qplib_sp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,8 @@ int bnxt_qplib_qext_stat(struct bnxt_qplib_rcfw *rcfw, u32 fid,
352352
struct bnxt_qplib_ext_stat *estat);
353353
int bnxt_qplib_modify_cc(struct bnxt_qplib_res *res,
354354
struct bnxt_qplib_cc_param *cc_param);
355+
int bnxt_qplib_read_context(struct bnxt_qplib_rcfw *rcfw, u8 type, u32 xid,
356+
u32 resp_size, void *resp_va);
355357

356358
#define BNXT_VAR_MAX_WQE 4352
357359
#define BNXT_VAR_MAX_SLOT_ALIGN 256

drivers/infiniband/hw/bnxt_re/roce_hsi.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2265,6 +2265,46 @@ struct creq_set_func_resources_resp {
22652265
u8 reserved48[6];
22662266
};
22672267

2268+
/* cmdq_read_context (size:192b/24B) */
2269+
struct cmdq_read_context {
2270+
u8 opcode;
2271+
#define CMDQ_READ_CONTEXT_OPCODE_READ_CONTEXT 0x85UL
2272+
#define CMDQ_READ_CONTEXT_OPCODE_LAST CMDQ_READ_CONTEXT_OPCODE_READ_CONTEXT
2273+
u8 cmd_size;
2274+
__le16 flags;
2275+
__le16 cookie;
2276+
u8 resp_size;
2277+
u8 reserved8;
2278+
__le64 resp_addr;
2279+
__le32 xid;
2280+
u8 type;
2281+
#define CMDQ_READ_CONTEXT_TYPE_QPC 0x0UL
2282+
#define CMDQ_READ_CONTEXT_TYPE_CQ 0x1UL
2283+
#define CMDQ_READ_CONTEXT_TYPE_MRW 0x2UL
2284+
#define CMDQ_READ_CONTEXT_TYPE_SRQ 0x3UL
2285+
#define CMDQ_READ_CONTEXT_TYPE_LAST CMDQ_READ_CONTEXT_TYPE_SRQ
2286+
u8 unused_0[3];
2287+
};
2288+
2289+
/* creq_read_context (size:128b/16B) */
2290+
struct creq_read_context {
2291+
u8 type;
2292+
#define CREQ_READ_CONTEXT_TYPE_MASK 0x3fUL
2293+
#define CREQ_READ_CONTEXT_TYPE_SFT 0
2294+
#define CREQ_READ_CONTEXT_TYPE_QP_EVENT 0x38UL
2295+
#define CREQ_READ_CONTEXT_TYPE_LAST CREQ_READ_CONTEXT_TYPE_QP_EVENT
2296+
u8 status;
2297+
__le16 cookie;
2298+
__le32 reserved32;
2299+
u8 v;
2300+
#define CREQ_READ_CONTEXT_V 0x1UL
2301+
u8 event;
2302+
#define CREQ_READ_CONTEXT_EVENT_READ_CONTEXT 0x85UL
2303+
#define CREQ_READ_CONTEXT_EVENT_LAST CREQ_READ_CONTEXT_EVENT_READ_CONTEXT
2304+
__le16 reserved16;
2305+
__le32 reserved_32;
2306+
};
2307+
22682308
/* cmdq_map_tc_to_cos (size:192b/24B) */
22692309
struct cmdq_map_tc_to_cos {
22702310
u8 opcode;

0 commit comments

Comments
 (0)