cxgb4: collect firmware mbox and device log dump
authorRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Fri, 13 Oct 2017 13:18:16 +0000 (18:48 +0530)
committerDavid S. Miller <davem@davemloft.net>
Sun, 15 Oct 2017 01:35:14 +0000 (18:35 -0700)
Collect firmware mbox and device logs before collecting the rest of
the hardware dumps to snap the firmware state before the mailbox logs
are updated by other hardware dumps.

Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: Ganesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cudbg_entity.h
drivers/net/ethernet/chelsio/cxgb4/cudbg_if.h
drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c
drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.h
drivers/net/ethernet/chelsio/cxgb4/cxgb4_cudbg.c

index 71a426d..2b717e7 100644 (file)
@@ -26,4 +26,10 @@ struct card_mem {
        u16 size_edc1;
        u16 mem_flag;
 };
+
+struct cudbg_mbox_log {
+       struct mbox_cmd entry;
+       u32 hi[MBOX_LEN / 8];
+       u32 lo[MBOX_LEN / 8];
+};
 #endif /* __CUDBG_ENTITY_H__ */
index 8bcea98..0a37d9b 100644 (file)
 
 enum cudbg_dbg_entity_type {
        CUDBG_REG_DUMP = 1,
+       CUDBG_DEV_LOG = 2,
        CUDBG_EDC0 = 18,
        CUDBG_EDC1 = 19,
+       CUDBG_MBOX_LOG = 66,
        CUDBG_MAX_ENTITY = 70,
 };
 
index fb0e97e..960635e 100644 (file)
@@ -90,6 +90,45 @@ int cudbg_collect_reg_dump(struct cudbg_init *pdbg_init,
        return rc;
 }
 
+int cudbg_collect_fw_devlog(struct cudbg_init *pdbg_init,
+                           struct cudbg_buffer *dbg_buff,
+                           struct cudbg_error *cudbg_err)
+{
+       struct adapter *padap = pdbg_init->adap;
+       struct cudbg_buffer temp_buff = { 0 };
+       struct devlog_params *dparams;
+       int rc = 0;
+
+       rc = t4_init_devlog_params(padap);
+       if (rc < 0) {
+               cudbg_err->sys_err = rc;
+               return rc;
+       }
+
+       dparams = &padap->params.devlog;
+       rc = cudbg_get_buff(dbg_buff, dparams->size, &temp_buff);
+       if (rc)
+               return rc;
+
+       /* Collect FW devlog */
+       if (dparams->start != 0) {
+               spin_lock(&padap->win0_lock);
+               rc = t4_memory_rw(padap, padap->params.drv_memwin,
+                                 dparams->memtype, dparams->start,
+                                 dparams->size,
+                                 (__be32 *)(char *)temp_buff.data,
+                                 1);
+               spin_unlock(&padap->win0_lock);
+               if (rc) {
+                       cudbg_err->sys_err = rc;
+                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       return rc;
+               }
+       }
+       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
+       return rc;
+}
+
 static int cudbg_read_fw_mem(struct cudbg_init *pdbg_init,
                             struct cudbg_buffer *dbg_buff, u8 mem_type,
                             unsigned long tot_len,
@@ -213,3 +252,48 @@ int cudbg_collect_edc1_meminfo(struct cudbg_init *pdbg_init,
        return cudbg_collect_mem_region(pdbg_init, dbg_buff, cudbg_err,
                                        MEM_EDC1);
 }
+
+int cudbg_collect_mbox_log(struct cudbg_init *pdbg_init,
+                          struct cudbg_buffer *dbg_buff,
+                          struct cudbg_error *cudbg_err)
+{
+       struct adapter *padap = pdbg_init->adap;
+       struct cudbg_mbox_log *mboxlog = NULL;
+       struct cudbg_buffer temp_buff = { 0 };
+       struct mbox_cmd_log *log = NULL;
+       struct mbox_cmd *entry;
+       unsigned int entry_idx;
+       u16 mbox_cmds;
+       int i, k, rc;
+       u64 flit;
+       u32 size;
+
+       log = padap->mbox_log;
+       mbox_cmds = padap->mbox_log->size;
+       size = sizeof(struct cudbg_mbox_log) * mbox_cmds;
+       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       if (rc)
+               return rc;
+
+       mboxlog = (struct cudbg_mbox_log *)temp_buff.data;
+       for (k = 0; k < mbox_cmds; k++) {
+               entry_idx = log->cursor + k;
+               if (entry_idx >= log->size)
+                       entry_idx -= log->size;
+
+               entry = mbox_cmd_log_entry(log, entry_idx);
+               /* skip over unused entries */
+               if (entry->timestamp == 0)
+                       continue;
+
+               memcpy(&mboxlog->entry, entry, sizeof(struct mbox_cmd));
+               for (i = 0; i < MBOX_LEN / 8; i++) {
+                       flit = entry->cmd[i];
+                       mboxlog->hi[i] = (u32)(flit >> 32);
+                       mboxlog->lo[i] = (u32)flit;
+               }
+               mboxlog++;
+       }
+       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
+       return rc;
+}
index f7be509..690591b 100644 (file)
 int cudbg_collect_reg_dump(struct cudbg_init *pdbg_init,
                           struct cudbg_buffer *dbg_buff,
                           struct cudbg_error *cudbg_err);
+int cudbg_collect_fw_devlog(struct cudbg_init *pdbg_init,
+                           struct cudbg_buffer *dbg_buff,
+                           struct cudbg_error *cudbg_err);
 int cudbg_collect_edc0_meminfo(struct cudbg_init *pdbg_init,
                               struct cudbg_buffer *dbg_buff,
                               struct cudbg_error *cudbg_err);
 int cudbg_collect_edc1_meminfo(struct cudbg_init *pdbg_init,
                               struct cudbg_buffer *dbg_buff,
                               struct cudbg_error *cudbg_err);
+int cudbg_collect_mbox_log(struct cudbg_init *pdbg_init,
+                          struct cudbg_buffer *dbg_buff,
+                          struct cudbg_error *cudbg_err);
 
 struct cudbg_entity_hdr *cudbg_get_entity_hdr(void *outbuf, int i);
 void cudbg_align_debug_buffer(struct cudbg_buffer *dbg_buff,
index 286d172..f8c4f41 100644 (file)
@@ -18,6 +18,7 @@
 #include "t4_regs.h"
 #include "cxgb4.h"
 #include "cxgb4_cudbg.h"
+#include "cudbg_entity.h"
 
 static const struct cxgb4_collect_entity cxgb4_collect_mem_dump[] = {
        { CUDBG_EDC0, cudbg_collect_edc0_meminfo },
@@ -25,6 +26,8 @@ static const struct cxgb4_collect_entity cxgb4_collect_mem_dump[] = {
 };
 
 static const struct cxgb4_collect_entity cxgb4_collect_hw_dump[] = {
+       { CUDBG_MBOX_LOG, cudbg_collect_mbox_log },
+       { CUDBG_DEV_LOG, cudbg_collect_fw_devlog },
        { CUDBG_REG_DUMP, cudbg_collect_reg_dump },
 };
 
@@ -46,6 +49,9 @@ static u32 cxgb4_get_entity_length(struct adapter *adap, u32 entity)
                        break;
                }
                break;
+       case CUDBG_DEV_LOG:
+               len = adap->params.devlog.size;
+               break;
        case CUDBG_EDC0:
                value = t4_read_reg(adap, MA_TARGET_MEM_ENABLE_A);
                if (value & EDRAM0_ENABLE_F) {
@@ -62,6 +68,9 @@ static u32 cxgb4_get_entity_length(struct adapter *adap, u32 entity)
                }
                len = cudbg_mbytes_to_bytes(len);
                break;
+       case CUDBG_MBOX_LOG:
+               len = sizeof(struct cudbg_mbox_log) * adap->mbox_log->size;
+               break;
        default:
                break;
        }