cxgb4: collect hardware LA dumps
authorRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Thu, 26 Oct 2017 11:48:33 +0000 (17:18 +0530)
committerDavid S. Miller <davem@davemloft.net>
Fri, 27 Oct 2017 14:48:29 +0000 (23:48 +0900)
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>
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
drivers/net/ethernet/chelsio/cxgb4/t4_regs.h

index d7f3392..50540a6 100644 (file)
@@ -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] = {
index 9b8005e..f65db1b 100644 (file)
@@ -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,
index 19da54f..8b5a12b 100644 (file)
@@ -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)
index df24c40..ad6eff3 100644 (file)
@@ -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);
index 59740ac..8bc1b1d 100644 (file)
@@ -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;
index 82614e0..b5cd9a5 100644 (file)
 #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)