mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-29 22:14:41 +08:00
cxgb4: collect hardware LA dumps
Collect CIM, CIM_MA, ULP_RX, TP, CIM_PIF, and ULP_TX logic analyzer 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>
This commit is contained in:
parent
123196b693
commit
27887bc7cb
@ -45,6 +45,32 @@ struct ireg_buf {
|
||||
u32 outbuf[32];
|
||||
};
|
||||
|
||||
struct cudbg_ulprx_la {
|
||||
u32 data[ULPRX_LA_SIZE * 8];
|
||||
u32 size;
|
||||
};
|
||||
|
||||
struct cudbg_tp_la {
|
||||
u32 size;
|
||||
u32 mode;
|
||||
u8 data[0];
|
||||
};
|
||||
|
||||
struct cudbg_cim_pif_la {
|
||||
int size;
|
||||
u8 data[0];
|
||||
};
|
||||
|
||||
#define CUDBG_NUM_ULPTX 11
|
||||
#define CUDBG_NUM_ULPTX_READ 512
|
||||
|
||||
struct cudbg_ulptx_la {
|
||||
u32 rdptr[CUDBG_NUM_ULPTX];
|
||||
u32 wrptr[CUDBG_NUM_ULPTX];
|
||||
u32 rddata[CUDBG_NUM_ULPTX];
|
||||
u32 rd_data[CUDBG_NUM_ULPTX][CUDBG_NUM_ULPTX_READ];
|
||||
};
|
||||
|
||||
#define IREG_NUM_ELEM 4
|
||||
|
||||
static const u32 t6_tp_pio_array[][IREG_NUM_ELEM] = {
|
||||
|
@ -29,6 +29,8 @@
|
||||
enum cudbg_dbg_entity_type {
|
||||
CUDBG_REG_DUMP = 1,
|
||||
CUDBG_DEV_LOG = 2,
|
||||
CUDBG_CIM_LA = 3,
|
||||
CUDBG_CIM_MA_LA = 4,
|
||||
CUDBG_CIM_IBQ_TP0 = 6,
|
||||
CUDBG_CIM_IBQ_TP1 = 7,
|
||||
CUDBG_CIM_IBQ_ULP = 8,
|
||||
@ -45,11 +47,15 @@ enum cudbg_dbg_entity_type {
|
||||
CUDBG_EDC1 = 19,
|
||||
CUDBG_TP_INDIRECT = 36,
|
||||
CUDBG_SGE_INDIRECT = 37,
|
||||
CUDBG_ULPRX_LA = 41,
|
||||
CUDBG_TP_LA = 43,
|
||||
CUDBG_CIM_PIF_LA = 45,
|
||||
CUDBG_CIM_OBQ_RXQ0 = 47,
|
||||
CUDBG_CIM_OBQ_RXQ1 = 48,
|
||||
CUDBG_PCIE_INDIRECT = 50,
|
||||
CUDBG_PM_INDIRECT = 51,
|
||||
CUDBG_MA_INDIRECT = 61,
|
||||
CUDBG_ULPTX_LA = 62,
|
||||
CUDBG_UP_CIM_INDIRECT = 64,
|
||||
CUDBG_MBOX_LOG = 66,
|
||||
CUDBG_HMA_INDIRECT = 67,
|
||||
|
@ -129,6 +129,69 @@ int cudbg_collect_fw_devlog(struct cudbg_init *pdbg_init,
|
||||
return rc;
|
||||
}
|
||||
|
||||
int cudbg_collect_cim_la(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 };
|
||||
int size, rc;
|
||||
u32 cfg = 0;
|
||||
|
||||
if (is_t6(padap->params.chip)) {
|
||||
size = padap->params.cim_la_size / 10 + 1;
|
||||
size *= 11 * sizeof(u32);
|
||||
} else {
|
||||
size = padap->params.cim_la_size / 8;
|
||||
size *= 8 * sizeof(u32);
|
||||
}
|
||||
|
||||
size += sizeof(cfg);
|
||||
rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = t4_cim_read(padap, UP_UP_DBG_LA_CFG_A, 1, &cfg);
|
||||
if (rc) {
|
||||
cudbg_err->sys_err = rc;
|
||||
cudbg_put_buff(&temp_buff, dbg_buff);
|
||||
return rc;
|
||||
}
|
||||
|
||||
memcpy((char *)temp_buff.data, &cfg, sizeof(cfg));
|
||||
rc = t4_cim_read_la(padap,
|
||||
(u32 *)((char *)temp_buff.data + sizeof(cfg)),
|
||||
NULL);
|
||||
if (rc < 0) {
|
||||
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;
|
||||
}
|
||||
|
||||
int cudbg_collect_cim_ma_la(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 };
|
||||
int size, rc;
|
||||
|
||||
size = 2 * CIM_MALA_SIZE * 5 * sizeof(u32);
|
||||
rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
t4_cim_read_ma_la(padap,
|
||||
(u32 *)temp_buff.data,
|
||||
(u32 *)((char *)temp_buff.data +
|
||||
5 * CIM_MALA_SIZE));
|
||||
cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cudbg_read_cim_ibq(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err, int qid)
|
||||
@ -574,6 +637,72 @@ int cudbg_collect_sge_indirect(struct cudbg_init *pdbg_init,
|
||||
return rc;
|
||||
}
|
||||
|
||||
int cudbg_collect_ulprx_la(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 cudbg_ulprx_la *ulprx_la_buff;
|
||||
int rc;
|
||||
|
||||
rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_ulprx_la),
|
||||
&temp_buff);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
ulprx_la_buff = (struct cudbg_ulprx_la *)temp_buff.data;
|
||||
t4_ulprx_read_la(padap, (u32 *)ulprx_la_buff->data);
|
||||
ulprx_la_buff->size = ULPRX_LA_SIZE;
|
||||
cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int cudbg_collect_tp_la(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 cudbg_tp_la *tp_la_buff;
|
||||
int size, rc;
|
||||
|
||||
size = sizeof(struct cudbg_tp_la) + TPLA_SIZE * sizeof(u64);
|
||||
rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
tp_la_buff = (struct cudbg_tp_la *)temp_buff.data;
|
||||
tp_la_buff->mode = DBGLAMODE_G(t4_read_reg(padap, TP_DBG_LA_CONFIG_A));
|
||||
t4_tp_read_la(padap, (u64 *)tp_la_buff->data, NULL);
|
||||
cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int cudbg_collect_cim_pif_la(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err)
|
||||
{
|
||||
struct cudbg_cim_pif_la *cim_pif_la_buff;
|
||||
struct adapter *padap = pdbg_init->adap;
|
||||
struct cudbg_buffer temp_buff = { 0 };
|
||||
int size, rc;
|
||||
|
||||
size = sizeof(struct cudbg_cim_pif_la) +
|
||||
2 * CIM_PIFLA_SIZE * 6 * sizeof(u32);
|
||||
rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
cim_pif_la_buff = (struct cudbg_cim_pif_la *)temp_buff.data;
|
||||
cim_pif_la_buff->size = CIM_PIFLA_SIZE;
|
||||
t4_cim_read_pif_la(padap, (u32 *)cim_pif_la_buff->data,
|
||||
(u32 *)cim_pif_la_buff->data + 6 * CIM_PIFLA_SIZE,
|
||||
NULL, NULL);
|
||||
cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int cudbg_collect_pcie_indirect(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err)
|
||||
@ -743,6 +872,41 @@ int cudbg_collect_ma_indirect(struct cudbg_init *pdbg_init,
|
||||
return rc;
|
||||
}
|
||||
|
||||
int cudbg_collect_ulptx_la(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 cudbg_ulptx_la *ulptx_la_buff;
|
||||
u32 i, j;
|
||||
int rc;
|
||||
|
||||
rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_ulptx_la),
|
||||
&temp_buff);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
ulptx_la_buff = (struct cudbg_ulptx_la *)temp_buff.data;
|
||||
for (i = 0; i < CUDBG_NUM_ULPTX; i++) {
|
||||
ulptx_la_buff->rdptr[i] = t4_read_reg(padap,
|
||||
ULP_TX_LA_RDPTR_0_A +
|
||||
0x10 * i);
|
||||
ulptx_la_buff->wrptr[i] = t4_read_reg(padap,
|
||||
ULP_TX_LA_WRPTR_0_A +
|
||||
0x10 * i);
|
||||
ulptx_la_buff->rddata[i] = t4_read_reg(padap,
|
||||
ULP_TX_LA_RDDATA_0_A +
|
||||
0x10 * i);
|
||||
for (j = 0; j < CUDBG_NUM_ULPTX_READ; j++)
|
||||
ulptx_la_buff->rd_data[i][j] =
|
||||
t4_read_reg(padap,
|
||||
ULP_TX_LA_RDDATA_0_A + 0x10 * i);
|
||||
}
|
||||
cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int cudbg_collect_up_cim_indirect(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err)
|
||||
|
@ -24,6 +24,12 @@ int cudbg_collect_reg_dump(struct cudbg_init *pdbg_init,
|
||||
int cudbg_collect_fw_devlog(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
int cudbg_collect_cim_la(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
int cudbg_collect_cim_ma_la(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
int cudbg_collect_cim_ibq_tp0(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
@ -72,6 +78,15 @@ int cudbg_collect_tp_indirect(struct cudbg_init *pdbg_init,
|
||||
int cudbg_collect_sge_indirect(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
int cudbg_collect_ulprx_la(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
int cudbg_collect_tp_la(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
int cudbg_collect_cim_pif_la(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
int cudbg_collect_obq_sge_rx_q0(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
@ -87,6 +102,9 @@ int cudbg_collect_pm_indirect(struct cudbg_init *pdbg_init,
|
||||
int cudbg_collect_ma_indirect(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
int cudbg_collect_ulptx_la(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
int cudbg_collect_up_cim_indirect(struct cudbg_init *pdbg_init,
|
||||
struct cudbg_buffer *dbg_buff,
|
||||
struct cudbg_error *cudbg_err);
|
||||
|
@ -29,6 +29,8 @@ 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 },
|
||||
{ CUDBG_CIM_LA, cudbg_collect_cim_la },
|
||||
{ CUDBG_CIM_MA_LA, cudbg_collect_cim_ma_la },
|
||||
{ CUDBG_CIM_IBQ_TP0, cudbg_collect_cim_ibq_tp0 },
|
||||
{ CUDBG_CIM_IBQ_TP1, cudbg_collect_cim_ibq_tp1 },
|
||||
{ CUDBG_CIM_IBQ_ULP, cudbg_collect_cim_ibq_ulp },
|
||||
@ -43,11 +45,15 @@ static const struct cxgb4_collect_entity cxgb4_collect_hw_dump[] = {
|
||||
{ CUDBG_CIM_OBQ_NCSI, cudbg_collect_cim_obq_ncsi },
|
||||
{ CUDBG_TP_INDIRECT, cudbg_collect_tp_indirect },
|
||||
{ CUDBG_SGE_INDIRECT, cudbg_collect_sge_indirect },
|
||||
{ CUDBG_ULPRX_LA, cudbg_collect_ulprx_la },
|
||||
{ CUDBG_TP_LA, cudbg_collect_tp_la },
|
||||
{ CUDBG_CIM_PIF_LA, cudbg_collect_cim_pif_la },
|
||||
{ CUDBG_CIM_OBQ_RXQ0, cudbg_collect_obq_sge_rx_q0 },
|
||||
{ CUDBG_CIM_OBQ_RXQ1, cudbg_collect_obq_sge_rx_q1 },
|
||||
{ CUDBG_PCIE_INDIRECT, cudbg_collect_pcie_indirect },
|
||||
{ CUDBG_PM_INDIRECT, cudbg_collect_pm_indirect },
|
||||
{ CUDBG_MA_INDIRECT, cudbg_collect_ma_indirect },
|
||||
{ CUDBG_ULPTX_LA, cudbg_collect_ulptx_la },
|
||||
{ CUDBG_UP_CIM_INDIRECT, cudbg_collect_up_cim_indirect },
|
||||
{ CUDBG_HMA_INDIRECT, cudbg_collect_hma_indirect },
|
||||
};
|
||||
@ -73,6 +79,19 @@ static u32 cxgb4_get_entity_length(struct adapter *adap, u32 entity)
|
||||
case CUDBG_DEV_LOG:
|
||||
len = adap->params.devlog.size;
|
||||
break;
|
||||
case CUDBG_CIM_LA:
|
||||
if (is_t6(adap->params.chip)) {
|
||||
len = adap->params.cim_la_size / 10 + 1;
|
||||
len *= 11 * sizeof(u32);
|
||||
} else {
|
||||
len = adap->params.cim_la_size / 8;
|
||||
len *= 8 * sizeof(u32);
|
||||
}
|
||||
len += sizeof(u32); /* for reading CIM LA configuration */
|
||||
break;
|
||||
case CUDBG_CIM_MA_LA:
|
||||
len = 2 * CIM_MALA_SIZE * 5 * sizeof(u32);
|
||||
break;
|
||||
case CUDBG_CIM_IBQ_TP0:
|
||||
case CUDBG_CIM_IBQ_TP1:
|
||||
case CUDBG_CIM_IBQ_ULP:
|
||||
@ -142,6 +161,16 @@ static u32 cxgb4_get_entity_length(struct adapter *adap, u32 entity)
|
||||
case CUDBG_SGE_INDIRECT:
|
||||
len = sizeof(struct ireg_buf) * 2;
|
||||
break;
|
||||
case CUDBG_ULPRX_LA:
|
||||
len = sizeof(struct cudbg_ulprx_la);
|
||||
break;
|
||||
case CUDBG_TP_LA:
|
||||
len = sizeof(struct cudbg_tp_la) + TPLA_SIZE * sizeof(u64);
|
||||
break;
|
||||
case CUDBG_CIM_PIF_LA:
|
||||
len = sizeof(struct cudbg_cim_pif_la);
|
||||
len += 2 * CIM_PIFLA_SIZE * 6 * sizeof(u32);
|
||||
break;
|
||||
case CUDBG_PCIE_INDIRECT:
|
||||
n = sizeof(t5_pcie_pdbg_array) / (IREG_NUM_ELEM * sizeof(u32));
|
||||
len = sizeof(struct ireg_buf) * n * 2;
|
||||
@ -157,6 +186,9 @@ static u32 cxgb4_get_entity_length(struct adapter *adap, u32 entity)
|
||||
len = sizeof(struct ireg_buf) * n * 2;
|
||||
}
|
||||
break;
|
||||
case CUDBG_ULPTX_LA:
|
||||
len = sizeof(struct cudbg_ulptx_la);
|
||||
break;
|
||||
case CUDBG_UP_CIM_INDIRECT:
|
||||
n = sizeof(t5_up_cim_reg_array) / (IREG_NUM_ELEM * sizeof(u32));
|
||||
len = sizeof(struct ireg_buf) * n;
|
||||
|
@ -1629,6 +1629,10 @@
|
||||
#define IESPI_PAR_ERROR_V(x) ((x) << IESPI_PAR_ERROR_S)
|
||||
#define IESPI_PAR_ERROR_F IESPI_PAR_ERROR_V(1U)
|
||||
|
||||
#define ULP_TX_LA_RDPTR_0_A 0x8ec0
|
||||
#define ULP_TX_LA_RDDATA_0_A 0x8ec4
|
||||
#define ULP_TX_LA_WRPTR_0_A 0x8ec8
|
||||
|
||||
#define PMRX_E_PCMD_PAR_ERROR_S 0
|
||||
#define PMRX_E_PCMD_PAR_ERROR_V(x) ((x) << PMRX_E_PCMD_PAR_ERROR_S)
|
||||
#define PMRX_E_PCMD_PAR_ERROR_F PMRX_E_PCMD_PAR_ERROR_V(1U)
|
||||
|
Loading…
Reference in New Issue
Block a user