Commit 1dde532d authored by Rahul Lakkireddy's avatar Rahul Lakkireddy Committed by David S. Miller

cxgb4: collect hardware dump in second kernel

Register callback to collect hardware/firmware dumps in second kernel
before hardware/firmware is initialized. The dumps for each device
will be available as elf notes in /proc/vmcore in second kernel.
Signed-off-by: default avatarRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: default avatarGanesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7efe48df
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include <linux/net_tstamp.h> #include <linux/net_tstamp.h>
#include <linux/ptp_clock_kernel.h> #include <linux/ptp_clock_kernel.h>
#include <linux/ptp_classify.h> #include <linux/ptp_classify.h>
#include <linux/crash_dump.h>
#include <asm/io.h> #include <asm/io.h>
#include "t4_chip_type.h" #include "t4_chip_type.h"
#include "cxgb4_uld.h" #include "cxgb4_uld.h"
...@@ -964,6 +965,9 @@ struct adapter { ...@@ -964,6 +965,9 @@ struct adapter {
struct hma_data hma; struct hma_data hma;
struct srq_data *srq; struct srq_data *srq;
/* Dump buffer for collecting logs in kdump kernel */
struct vmcoredd_data vmcoredd;
}; };
/* Support for "sched-class" command to allow a TX Scheduling Class to be /* Support for "sched-class" command to allow a TX Scheduling Class to be
......
...@@ -488,3 +488,28 @@ void cxgb4_init_ethtool_dump(struct adapter *adapter) ...@@ -488,3 +488,28 @@ void cxgb4_init_ethtool_dump(struct adapter *adapter)
adapter->eth_dump.version = adapter->params.fw_vers; adapter->eth_dump.version = adapter->params.fw_vers;
adapter->eth_dump.len = 0; adapter->eth_dump.len = 0;
} }
static int cxgb4_cudbg_vmcoredd_collect(struct vmcoredd_data *data, void *buf)
{
struct adapter *adap = container_of(data, struct adapter, vmcoredd);
u32 len = data->size;
return cxgb4_cudbg_collect(adap, buf, &len, CXGB4_ETH_DUMP_ALL);
}
int cxgb4_cudbg_vmcore_add_dump(struct adapter *adap)
{
struct vmcoredd_data *data = &adap->vmcoredd;
u32 len;
len = sizeof(struct cudbg_hdr) +
sizeof(struct cudbg_entity_hdr) * CUDBG_MAX_ENTITY;
len += CUDBG_DUMP_BUFF_SIZE;
data->size = len;
snprintf(data->dump_name, sizeof(data->dump_name), "%s_%s",
cxgb4_driver_name, adap->name);
data->vmcoredd_callback = cxgb4_cudbg_vmcoredd_collect;
return vmcore_add_device_dump(data);
}
...@@ -41,8 +41,11 @@ enum CXGB4_ETHTOOL_DUMP_FLAGS { ...@@ -41,8 +41,11 @@ enum CXGB4_ETHTOOL_DUMP_FLAGS {
CXGB4_ETH_DUMP_HW = (1 << 1), /* various FW and HW dumps */ CXGB4_ETH_DUMP_HW = (1 << 1), /* various FW and HW dumps */
}; };
#define CXGB4_ETH_DUMP_ALL (CXGB4_ETH_DUMP_MEM | CXGB4_ETH_DUMP_HW)
u32 cxgb4_get_dump_length(struct adapter *adap, u32 flag); u32 cxgb4_get_dump_length(struct adapter *adap, u32 flag);
int cxgb4_cudbg_collect(struct adapter *adap, void *buf, u32 *buf_size, int cxgb4_cudbg_collect(struct adapter *adap, void *buf, u32 *buf_size,
u32 flag); u32 flag);
void cxgb4_init_ethtool_dump(struct adapter *adapter); void cxgb4_init_ethtool_dump(struct adapter *adapter);
int cxgb4_cudbg_vmcore_add_dump(struct adapter *adap);
#endif /* __CXGB4_CUDBG_H__ */ #endif /* __CXGB4_CUDBG_H__ */
...@@ -5558,6 +5558,16 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -5558,6 +5558,16 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (err) if (err)
goto out_free_adapter; goto out_free_adapter;
if (is_kdump_kernel()) {
/* Collect hardware state and append to /proc/vmcore */
err = cxgb4_cudbg_vmcore_add_dump(adapter);
if (err) {
dev_warn(adapter->pdev_dev,
"Fail collecting vmcore device dump, err: %d. Continuing\n",
err);
err = 0;
}
}
if (!is_t4(adapter->params.chip)) { if (!is_t4(adapter->params.chip)) {
s_qpp = (QUEUESPERPAGEPF0_S + s_qpp = (QUEUESPERPAGEPF0_S +
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment