]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bnxt_en: Add FW trace coredump segments to the coredump
authorShruti Parab <shruti.parab@broadcom.com>
Fri, 15 Nov 2024 15:14:37 +0000 (07:14 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 19 Nov 2024 03:48:55 +0000 (19:48 -0800)
The FW trace coredump segments are very similar to the context
memory segments in the previous patch.  The main difference is
to call HWRM_DBG_LOG_BUFFER_FLUSH to flush the FW data to host
memory and to include an additional record in the coredump that
contains the head and tail information of the trace data.

Reviewed-by: Hongguang Gao <hongguang.gao@broadcom.com>
Signed-off-by: Shruti Parab <shruti.parab@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20241115151438.550106-12-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c
drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.h

index ff92443db01b35830ca75ce7357e4c41175ef09a..7236d8e548ab5d1974c3f56fc0b3837f20e95741 100644 (file)
@@ -25,8 +25,40 @@ static const u16 bnxt_bstore_to_seg_id[] = {
        [BNXT_CTX_FTQM]                 = BNXT_CTX_MEM_SEG_FTQM,
        [BNXT_CTX_MRAV]                 = BNXT_CTX_MEM_SEG_MRAV,
        [BNXT_CTX_TIM]                  = BNXT_CTX_MEM_SEG_TIM,
+       [BNXT_CTX_SRT]                  = BNXT_CTX_MEM_SEG_SRT,
+       [BNXT_CTX_SRT2]                 = BNXT_CTX_MEM_SEG_SRT2,
+       [BNXT_CTX_CRT]                  = BNXT_CTX_MEM_SEG_CRT,
+       [BNXT_CTX_CRT2]                 = BNXT_CTX_MEM_SEG_CRT2,
+       [BNXT_CTX_RIGP0]                = BNXT_CTX_MEM_SEG_RIGP0,
+       [BNXT_CTX_L2HWRM]               = BNXT_CTX_MEM_SEG_L2HWRM,
+       [BNXT_CTX_REHWRM]               = BNXT_CTX_MEM_SEG_REHWRM,
+       [BNXT_CTX_CA0]                  = BNXT_CTX_MEM_SEG_CA0,
+       [BNXT_CTX_CA1]                  = BNXT_CTX_MEM_SEG_CA1,
+       [BNXT_CTX_CA2]                  = BNXT_CTX_MEM_SEG_CA2,
+       [BNXT_CTX_RIGP1]                = BNXT_CTX_MEM_SEG_RIGP1,
 };
 
+static int bnxt_dbg_hwrm_log_buffer_flush(struct bnxt *bp, u16 type, u32 flags,
+                                         u32 *offset)
+{
+       struct hwrm_dbg_log_buffer_flush_output *resp;
+       struct hwrm_dbg_log_buffer_flush_input *req;
+       int rc;
+
+       rc = hwrm_req_init(bp, req, HWRM_DBG_LOG_BUFFER_FLUSH);
+       if (rc)
+               return rc;
+
+       req->flags = cpu_to_le32(flags);
+       req->type = cpu_to_le16(type);
+       resp = hwrm_req_hold(bp, req);
+       rc = hwrm_req_send(bp, req);
+       if (!rc)
+               *offset = le32_to_cpu(resp->current_buffer_offset);
+       hwrm_req_drop(bp, req);
+       return rc;
+}
+
 static int bnxt_hwrm_dbg_dma_data(struct bnxt *bp, void *msg,
                                  struct bnxt_hwrm_dbg_dma_info *info)
 {
@@ -279,9 +311,29 @@ bnxt_fill_coredump_record(struct bnxt *bp, struct bnxt_coredump_record *record,
        record->ioctl_high_version = 0;
 }
 
+static void bnxt_fill_drv_seg_record(struct bnxt *bp,
+                                    struct bnxt_driver_segment_record *record,
+                                    struct bnxt_ctx_mem_type *ctxm, u16 type)
+{
+       struct bnxt_bs_trace_info *bs_trace = &bp->bs_trace[type];
+       u32 offset = 0;
+       int rc = 0;
+
+       rc = bnxt_dbg_hwrm_log_buffer_flush(bp, type, 0, &offset);
+       if (rc)
+               return;
+
+       bnxt_bs_trace_check_wrap(bs_trace, offset);
+       record->max_entries = cpu_to_le32(ctxm->max_entries);
+       record->entry_size = cpu_to_le32(ctxm->entry_size);
+       record->offset = cpu_to_le32(bs_trace->last_offset);
+       record->wrapped = bs_trace->wrapped;
+}
+
 static u32 bnxt_get_ctx_coredump(struct bnxt *bp, void *buf, u32 offset,
                                 u32 *segs)
 {
+       struct bnxt_driver_segment_record record = {};
        struct bnxt_coredump_segment_hdr seg_hdr;
        struct bnxt_ctx_mem_info *ctx = bp->ctx;
        u32 comp_id = BNXT_DRV_COMP_ID;
@@ -295,22 +347,33 @@ static u32 bnxt_get_ctx_coredump(struct bnxt *bp, void *buf, u32 offset,
 
        if (buf)
                buf += offset;
-       for (type = 0 ; type <= BNXT_CTX_TIM; type++) {
+       for (type = 0 ; type <= BNXT_CTX_RIGP1; type++) {
                struct bnxt_ctx_mem_type *ctxm = &ctx->ctx_arr[type];
+               bool trace = bnxt_bs_trace_avail(bp, type);
                u32 seg_id = bnxt_bstore_to_seg_id[type];
-               size_t seg_len;
+               size_t seg_len, extra_hlen = 0;
 
-               if (!ctxm->entry_size || !ctxm->pg_info || !seg_id)
+               if (!ctxm->mem_valid || !seg_id)
                        continue;
 
+               if (trace)
+                       extra_hlen = BNXT_SEG_RCD_LEN;
                if (buf)
-                       data = buf + BNXT_SEG_HDR_LEN;
-               seg_len = bnxt_copy_ctx_mem(bp, ctxm, data, 0);
+                       data = buf + BNXT_SEG_HDR_LEN + extra_hlen;
+               seg_len = bnxt_copy_ctx_mem(bp, ctxm, data, 0) + extra_hlen;
                if (buf) {
                        bnxt_fill_coredump_seg_hdr(bp, &seg_hdr, NULL, seg_len,
                                                   0, 0, 0, comp_id, seg_id);
                        memcpy(buf, &seg_hdr, BNXT_SEG_HDR_LEN);
-                       buf += BNXT_SEG_HDR_LEN + seg_len;
+                       buf += BNXT_SEG_HDR_LEN;
+                       if (trace) {
+                               u16 trace_type = bnxt_bstore_to_trace[type];
+
+                               bnxt_fill_drv_seg_record(bp, &record, ctxm,
+                                                        trace_type);
+                               memcpy(buf, &record, BNXT_SEG_RCD_LEN);
+                       }
+                       buf += seg_len;
                }
                len += BNXT_SEG_HDR_LEN + seg_len;
                *segs += 1;
index 3a6084a51be895d55ac2f575383674cda65edc42..d1cd6387f3ab4b44ad987bf502f7de57693333ef 100644 (file)
@@ -68,6 +68,14 @@ struct bnxt_coredump_record {
        __le16 rsvd3[313];
 };
 
+struct bnxt_driver_segment_record {
+       __le32 max_entries;
+       __le32 entry_size;
+       __le32 offset;
+       __u8 wrapped:1;
+       __u8 unused[3];
+};
+
 #define BNXT_VER_GET_COMP_ID   2
 #define BNXT_DRV_COMP_ID       0xd
 
@@ -83,12 +91,25 @@ struct bnxt_coredump_record {
 #define BNXT_CTX_MEM_SEG_MRAV  (BNXT_CTX_MEM_SEG_ID_START + BNXT_CTX_MRAV)
 #define BNXT_CTX_MEM_SEG_TIM   (BNXT_CTX_MEM_SEG_ID_START + BNXT_CTX_TIM)
 
+#define BNXT_CTX_MEM_SEG_SRT   0x1
+#define BNXT_CTX_MEM_SEG_SRT2  0x2
+#define BNXT_CTX_MEM_SEG_CRT   0x3
+#define BNXT_CTX_MEM_SEG_CRT2  0x4
+#define BNXT_CTX_MEM_SEG_RIGP0 0x5
+#define BNXT_CTX_MEM_SEG_L2HWRM        0x6
+#define BNXT_CTX_MEM_SEG_REHWRM        0x7
+#define BNXT_CTX_MEM_SEG_CA0   0x8
+#define BNXT_CTX_MEM_SEG_CA1   0x9
+#define BNXT_CTX_MEM_SEG_CA2   0xa
+#define BNXT_CTX_MEM_SEG_RIGP1 0xb
+
 #define BNXT_CRASH_DUMP_LEN    (8 << 20)
 
 #define COREDUMP_LIST_BUF_LEN          2048
 #define COREDUMP_RETRIEVE_BUF_LEN      4096
 
 #define BNXT_SEG_HDR_LEN       sizeof(struct bnxt_coredump_segment_hdr)
+#define BNXT_SEG_RCD_LEN       sizeof(struct bnxt_driver_segment_record)
 
 struct bnxt_coredump {
        void            *data;