From: Saravanan Vajravel <saravanan.vajravel@xxxxxxxxxxxx> Dump the cached debug information when the L2 driver invokes the get_dump_data hook. Signed-off-by: Saravanan Vajravel <saravanan.vajravel@xxxxxxxxxxxx> Signed-off-by: Selvin Xavier <selvin.xavier@xxxxxxxxxxxx> --- drivers/infiniband/hw/bnxt_re/main.c | 109 +++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c index 76dd0fa..afde0ef 100644 --- a/drivers/infiniband/hw/bnxt_re/main.c +++ b/drivers/infiniband/hw/bnxt_re/main.c @@ -508,6 +508,106 @@ static void bnxt_re_dump_ctx(struct bnxt_re_dev *rdev, u32 seg_id, void *buf, { } +/* + * bnxt_re_snapdump_qp - Log QP dump to the coredump buffer + * @rdev - Pointer to RoCE device instance + * @buf - Pointer to dump buffer + * @buf_len - Buffer length + * + * This function will invoke ULP logger to capture snapshot of + * SQ/RQ/SCQ/RCQ of a QP in ASCII format. + * + * Returns: Buffer length + */ +static u32 bnxt_re_snapdump_qp(struct bnxt_re_dev *rdev, void *buf, u32 buf_len) +{ + u32 index, len = 0, count = 0; + struct qdump_qpinfo *qpinfo; + struct qdump_array *qdump; + + if (!rdev->qdump_head.qdump) + return 0; + + mutex_lock(&rdev->qdump_head.lock); + index = rdev->qdump_head.index; + while (count < rdev->qdump_head.max_elements) { + count++; + index = (!index) ? (rdev->qdump_head.max_elements - 1) : (index - 1); + qdump = &rdev->qdump_head.qdump[index]; + if (!qdump->valid || qdump->is_mr) + continue; + + qpinfo = &qdump->qpinfo; + len += snprintf(buf + len, buf_len - len, + "qp_handle 0x%.8x 0x%.8x (xid %d) dest_qp %d type %s state %s ", + (u32)(qpinfo->qp_handle >> 32), + (u32)(qpinfo->qp_handle & 0xFFFFFFFF), + qpinfo->id, qpinfo->dest_qpid, + __to_qp_type_str(qpinfo->type), + __to_qp_state_str(qpinfo->state)); + len += snprintf(buf + len, buf_len - len, + "is_usr %d scq_handle 0x%llx rcq_handle 0x%llx", + qpinfo->is_user, qpinfo->scq_handle, qpinfo->rcq_handle); + len += snprintf(buf + len, buf_len - len, + "scq_id %d rcq_id %d\n", + qpinfo->scq_id, qpinfo->rcq_id); + if (len >= buf_len) + goto dump_full; + + if (len >= buf_len) + goto dump_full; + } + mutex_unlock(&rdev->qdump_head.lock); + return len; + +dump_full: + mutex_unlock(&rdev->qdump_head.lock); + return buf_len; +} + +/* + * bnxt_re_snapdump_mr - Log PBL of MR to the coredump buffer + * @rdev - Pointer to RoCE device instance + * @buf - Pointer to dump buffer + * @buf_len - Buffer length + * + * This function will invoke ULP logger to capture PBL list of + * Memory Region in ASCII format. + * + * Returns: Buffer length + */ +static u32 bnxt_re_snapdump_mr(struct bnxt_re_dev *rdev, void *buf, u32 buf_len) +{ + u32 index, count = 0, len = 0; + struct qdump_array *qdump; + + if (!rdev->qdump_head.qdump) + return 0; + + mutex_lock(&rdev->qdump_head.lock); + index = rdev->qdump_head.index; + while (count < rdev->qdump_head.max_elements) { + count++; + index = (!index) ? (rdev->qdump_head.max_elements - 1) : (index - 1); + qdump = &rdev->qdump_head.qdump[index]; + if (!qdump->valid || !qdump->is_mr) + continue; + + len += snprintf(buf + len, buf_len - len, + "**MemoryRegion: type %d lkey 0x%x rkey 0x%x tot_sz %llu **\n", + qdump->mrinfo.type, qdump->mrinfo.lkey, + qdump->mrinfo.rkey, qdump->mrinfo.total_size); + if (len >= buf_len) + goto dump_full; + } + mutex_unlock(&rdev->qdump_head.lock); + return len; + +dump_full: + mutex_unlock(&rdev->qdump_head.lock); + return buf_len; +} + /* bnxt_re_snapdump - Collect RoCE debug data for coredump. * @rdev - rdma device instance * @buf - Pointer to dump buffer @@ -520,6 +620,15 @@ static void bnxt_re_dump_ctx(struct bnxt_re_dev *rdev, u32 seg_id, void *buf, */ static void bnxt_re_snapdump(struct bnxt_re_dev *rdev, void *buf, u32 buf_len) { + u32 len = 0; + + len += bnxt_re_snapdump_qp(rdev, buf + len, buf_len - len); + if (len >= buf_len) + return; + + len += bnxt_re_snapdump_mr(rdev, buf + len, buf_len - len); + if (len >= buf_len) + return; } #define BNXT_RE_TRACE_DUMP_SIZE 0x2000000 -- 2.5.5