|
@@ -367,6 +367,258 @@ int cudbg_collect_tp_indirect(struct cudbg_init *pdbg_init,
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int cudbg_collect_sge_indirect(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 ireg_buf *ch_sge_dbg;
|
|
|
|
+ int i, rc;
|
|
|
|
+
|
|
|
|
+ rc = cudbg_get_buff(dbg_buff, sizeof(*ch_sge_dbg) * 2, &temp_buff);
|
|
|
|
+ if (rc)
|
|
|
|
+ return rc;
|
|
|
|
+
|
|
|
|
+ ch_sge_dbg = (struct ireg_buf *)temp_buff.data;
|
|
|
|
+ for (i = 0; i < 2; i++) {
|
|
|
|
+ struct ireg_field *sge_pio = &ch_sge_dbg->tp_pio;
|
|
|
|
+ u32 *buff = ch_sge_dbg->outbuf;
|
|
|
|
+
|
|
|
|
+ sge_pio->ireg_addr = t5_sge_dbg_index_array[i][0];
|
|
|
|
+ sge_pio->ireg_data = t5_sge_dbg_index_array[i][1];
|
|
|
|
+ sge_pio->ireg_local_offset = t5_sge_dbg_index_array[i][2];
|
|
|
|
+ sge_pio->ireg_offset_range = t5_sge_dbg_index_array[i][3];
|
|
|
|
+ t4_read_indirect(padap,
|
|
|
|
+ sge_pio->ireg_addr,
|
|
|
|
+ sge_pio->ireg_data,
|
|
|
|
+ buff,
|
|
|
|
+ sge_pio->ireg_offset_range,
|
|
|
|
+ sge_pio->ireg_local_offset);
|
|
|
|
+ ch_sge_dbg++;
|
|
|
|
+ }
|
|
|
|
+ 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)
|
|
|
|
+{
|
|
|
|
+ struct adapter *padap = pdbg_init->adap;
|
|
|
|
+ struct cudbg_buffer temp_buff = { 0 };
|
|
|
|
+ struct ireg_buf *ch_pcie;
|
|
|
|
+ int i, rc, n;
|
|
|
|
+ u32 size;
|
|
|
|
+
|
|
|
|
+ n = sizeof(t5_pcie_pdbg_array) / (IREG_NUM_ELEM * sizeof(u32));
|
|
|
|
+ size = sizeof(struct ireg_buf) * n * 2;
|
|
|
|
+ rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
|
|
|
|
+ if (rc)
|
|
|
|
+ return rc;
|
|
|
|
+
|
|
|
|
+ ch_pcie = (struct ireg_buf *)temp_buff.data;
|
|
|
|
+ /* PCIE_PDBG */
|
|
|
|
+ for (i = 0; i < n; i++) {
|
|
|
|
+ struct ireg_field *pcie_pio = &ch_pcie->tp_pio;
|
|
|
|
+ u32 *buff = ch_pcie->outbuf;
|
|
|
|
+
|
|
|
|
+ pcie_pio->ireg_addr = t5_pcie_pdbg_array[i][0];
|
|
|
|
+ pcie_pio->ireg_data = t5_pcie_pdbg_array[i][1];
|
|
|
|
+ pcie_pio->ireg_local_offset = t5_pcie_pdbg_array[i][2];
|
|
|
|
+ pcie_pio->ireg_offset_range = t5_pcie_pdbg_array[i][3];
|
|
|
|
+ t4_read_indirect(padap,
|
|
|
|
+ pcie_pio->ireg_addr,
|
|
|
|
+ pcie_pio->ireg_data,
|
|
|
|
+ buff,
|
|
|
|
+ pcie_pio->ireg_offset_range,
|
|
|
|
+ pcie_pio->ireg_local_offset);
|
|
|
|
+ ch_pcie++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* PCIE_CDBG */
|
|
|
|
+ n = sizeof(t5_pcie_cdbg_array) / (IREG_NUM_ELEM * sizeof(u32));
|
|
|
|
+ for (i = 0; i < n; i++) {
|
|
|
|
+ struct ireg_field *pcie_pio = &ch_pcie->tp_pio;
|
|
|
|
+ u32 *buff = ch_pcie->outbuf;
|
|
|
|
+
|
|
|
|
+ pcie_pio->ireg_addr = t5_pcie_cdbg_array[i][0];
|
|
|
|
+ pcie_pio->ireg_data = t5_pcie_cdbg_array[i][1];
|
|
|
|
+ pcie_pio->ireg_local_offset = t5_pcie_cdbg_array[i][2];
|
|
|
|
+ pcie_pio->ireg_offset_range = t5_pcie_cdbg_array[i][3];
|
|
|
|
+ t4_read_indirect(padap,
|
|
|
|
+ pcie_pio->ireg_addr,
|
|
|
|
+ pcie_pio->ireg_data,
|
|
|
|
+ buff,
|
|
|
|
+ pcie_pio->ireg_offset_range,
|
|
|
|
+ pcie_pio->ireg_local_offset);
|
|
|
|
+ ch_pcie++;
|
|
|
|
+ }
|
|
|
|
+ cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
|
|
|
+ return rc;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int cudbg_collect_pm_indirect(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 ireg_buf *ch_pm;
|
|
|
|
+ int i, rc, n;
|
|
|
|
+ u32 size;
|
|
|
|
+
|
|
|
|
+ n = sizeof(t5_pm_rx_array) / (IREG_NUM_ELEM * sizeof(u32));
|
|
|
|
+ size = sizeof(struct ireg_buf) * n * 2;
|
|
|
|
+ rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
|
|
|
|
+ if (rc)
|
|
|
|
+ return rc;
|
|
|
|
+
|
|
|
|
+ ch_pm = (struct ireg_buf *)temp_buff.data;
|
|
|
|
+ /* PM_RX */
|
|
|
|
+ for (i = 0; i < n; i++) {
|
|
|
|
+ struct ireg_field *pm_pio = &ch_pm->tp_pio;
|
|
|
|
+ u32 *buff = ch_pm->outbuf;
|
|
|
|
+
|
|
|
|
+ pm_pio->ireg_addr = t5_pm_rx_array[i][0];
|
|
|
|
+ pm_pio->ireg_data = t5_pm_rx_array[i][1];
|
|
|
|
+ pm_pio->ireg_local_offset = t5_pm_rx_array[i][2];
|
|
|
|
+ pm_pio->ireg_offset_range = t5_pm_rx_array[i][3];
|
|
|
|
+ t4_read_indirect(padap,
|
|
|
|
+ pm_pio->ireg_addr,
|
|
|
|
+ pm_pio->ireg_data,
|
|
|
|
+ buff,
|
|
|
|
+ pm_pio->ireg_offset_range,
|
|
|
|
+ pm_pio->ireg_local_offset);
|
|
|
|
+ ch_pm++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* PM_TX */
|
|
|
|
+ n = sizeof(t5_pm_tx_array) / (IREG_NUM_ELEM * sizeof(u32));
|
|
|
|
+ for (i = 0; i < n; i++) {
|
|
|
|
+ struct ireg_field *pm_pio = &ch_pm->tp_pio;
|
|
|
|
+ u32 *buff = ch_pm->outbuf;
|
|
|
|
+
|
|
|
|
+ pm_pio->ireg_addr = t5_pm_tx_array[i][0];
|
|
|
|
+ pm_pio->ireg_data = t5_pm_tx_array[i][1];
|
|
|
|
+ pm_pio->ireg_local_offset = t5_pm_tx_array[i][2];
|
|
|
|
+ pm_pio->ireg_offset_range = t5_pm_tx_array[i][3];
|
|
|
|
+ t4_read_indirect(padap,
|
|
|
|
+ pm_pio->ireg_addr,
|
|
|
|
+ pm_pio->ireg_data,
|
|
|
|
+ buff,
|
|
|
|
+ pm_pio->ireg_offset_range,
|
|
|
|
+ pm_pio->ireg_local_offset);
|
|
|
|
+ ch_pm++;
|
|
|
|
+ }
|
|
|
|
+ cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
|
|
|
+ return rc;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int cudbg_collect_ma_indirect(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 ireg_buf *ma_indr;
|
|
|
|
+ int i, rc, n;
|
|
|
|
+ u32 size, j;
|
|
|
|
+
|
|
|
|
+ if (CHELSIO_CHIP_VERSION(padap->params.chip) < CHELSIO_T6)
|
|
|
|
+ return CUDBG_STATUS_ENTITY_NOT_FOUND;
|
|
|
|
+
|
|
|
|
+ n = sizeof(t6_ma_ireg_array) / (IREG_NUM_ELEM * sizeof(u32));
|
|
|
|
+ size = sizeof(struct ireg_buf) * n * 2;
|
|
|
|
+ rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
|
|
|
|
+ if (rc)
|
|
|
|
+ return rc;
|
|
|
|
+
|
|
|
|
+ ma_indr = (struct ireg_buf *)temp_buff.data;
|
|
|
|
+ for (i = 0; i < n; i++) {
|
|
|
|
+ struct ireg_field *ma_fli = &ma_indr->tp_pio;
|
|
|
|
+ u32 *buff = ma_indr->outbuf;
|
|
|
|
+
|
|
|
|
+ ma_fli->ireg_addr = t6_ma_ireg_array[i][0];
|
|
|
|
+ ma_fli->ireg_data = t6_ma_ireg_array[i][1];
|
|
|
|
+ ma_fli->ireg_local_offset = t6_ma_ireg_array[i][2];
|
|
|
|
+ ma_fli->ireg_offset_range = t6_ma_ireg_array[i][3];
|
|
|
|
+ t4_read_indirect(padap, ma_fli->ireg_addr, ma_fli->ireg_data,
|
|
|
|
+ buff, ma_fli->ireg_offset_range,
|
|
|
|
+ ma_fli->ireg_local_offset);
|
|
|
|
+ ma_indr++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ n = sizeof(t6_ma_ireg_array2) / (IREG_NUM_ELEM * sizeof(u32));
|
|
|
|
+ for (i = 0; i < n; i++) {
|
|
|
|
+ struct ireg_field *ma_fli = &ma_indr->tp_pio;
|
|
|
|
+ u32 *buff = ma_indr->outbuf;
|
|
|
|
+
|
|
|
|
+ ma_fli->ireg_addr = t6_ma_ireg_array2[i][0];
|
|
|
|
+ ma_fli->ireg_data = t6_ma_ireg_array2[i][1];
|
|
|
|
+ ma_fli->ireg_local_offset = t6_ma_ireg_array2[i][2];
|
|
|
|
+ for (j = 0; j < t6_ma_ireg_array2[i][3]; j++) {
|
|
|
|
+ t4_read_indirect(padap, ma_fli->ireg_addr,
|
|
|
|
+ ma_fli->ireg_data, buff, 1,
|
|
|
|
+ ma_fli->ireg_local_offset);
|
|
|
|
+ buff++;
|
|
|
|
+ ma_fli->ireg_local_offset += 0x20;
|
|
|
|
+ }
|
|
|
|
+ ma_indr++;
|
|
|
|
+ }
|
|
|
|
+ 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)
|
|
|
|
+{
|
|
|
|
+ struct adapter *padap = pdbg_init->adap;
|
|
|
|
+ struct cudbg_buffer temp_buff = { 0 };
|
|
|
|
+ struct ireg_buf *up_cim;
|
|
|
|
+ int i, rc, n;
|
|
|
|
+ u32 size;
|
|
|
|
+
|
|
|
|
+ n = sizeof(t5_up_cim_reg_array) / (IREG_NUM_ELEM * sizeof(u32));
|
|
|
|
+ size = sizeof(struct ireg_buf) * n;
|
|
|
|
+ rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
|
|
|
|
+ if (rc)
|
|
|
|
+ return rc;
|
|
|
|
+
|
|
|
|
+ up_cim = (struct ireg_buf *)temp_buff.data;
|
|
|
|
+ for (i = 0; i < n; i++) {
|
|
|
|
+ struct ireg_field *up_cim_reg = &up_cim->tp_pio;
|
|
|
|
+ u32 *buff = up_cim->outbuf;
|
|
|
|
+
|
|
|
|
+ if (is_t5(padap->params.chip)) {
|
|
|
|
+ up_cim_reg->ireg_addr = t5_up_cim_reg_array[i][0];
|
|
|
|
+ up_cim_reg->ireg_data = t5_up_cim_reg_array[i][1];
|
|
|
|
+ up_cim_reg->ireg_local_offset =
|
|
|
|
+ t5_up_cim_reg_array[i][2];
|
|
|
|
+ up_cim_reg->ireg_offset_range =
|
|
|
|
+ t5_up_cim_reg_array[i][3];
|
|
|
|
+ } else if (is_t6(padap->params.chip)) {
|
|
|
|
+ up_cim_reg->ireg_addr = t6_up_cim_reg_array[i][0];
|
|
|
|
+ up_cim_reg->ireg_data = t6_up_cim_reg_array[i][1];
|
|
|
|
+ up_cim_reg->ireg_local_offset =
|
|
|
|
+ t6_up_cim_reg_array[i][2];
|
|
|
|
+ up_cim_reg->ireg_offset_range =
|
|
|
|
+ t6_up_cim_reg_array[i][3];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ rc = t4_cim_read(padap, up_cim_reg->ireg_local_offset,
|
|
|
|
+ up_cim_reg->ireg_offset_range, buff);
|
|
|
|
+ if (rc) {
|
|
|
|
+ cudbg_put_buff(&temp_buff, dbg_buff);
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
|
|
+ up_cim++;
|
|
|
|
+ }
|
|
|
|
+ cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
|
|
|
+ return rc;
|
|
|
|
+}
|
|
|
|
+
|
|
int cudbg_collect_mbox_log(struct cudbg_init *pdbg_init,
|
|
int cudbg_collect_mbox_log(struct cudbg_init *pdbg_init,
|
|
struct cudbg_buffer *dbg_buff,
|
|
struct cudbg_buffer *dbg_buff,
|
|
struct cudbg_error *cudbg_err)
|
|
struct cudbg_error *cudbg_err)
|
|
@@ -411,3 +663,40 @@ int cudbg_collect_mbox_log(struct cudbg_init *pdbg_init,
|
|
cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
|
cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+int cudbg_collect_hma_indirect(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 ireg_buf *hma_indr;
|
|
|
|
+ int i, rc, n;
|
|
|
|
+ u32 size;
|
|
|
|
+
|
|
|
|
+ if (CHELSIO_CHIP_VERSION(padap->params.chip) < CHELSIO_T6)
|
|
|
|
+ return CUDBG_STATUS_ENTITY_NOT_FOUND;
|
|
|
|
+
|
|
|
|
+ n = sizeof(t6_hma_ireg_array) / (IREG_NUM_ELEM * sizeof(u32));
|
|
|
|
+ size = sizeof(struct ireg_buf) * n;
|
|
|
|
+ rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
|
|
|
|
+ if (rc)
|
|
|
|
+ return rc;
|
|
|
|
+
|
|
|
|
+ hma_indr = (struct ireg_buf *)temp_buff.data;
|
|
|
|
+ for (i = 0; i < n; i++) {
|
|
|
|
+ struct ireg_field *hma_fli = &hma_indr->tp_pio;
|
|
|
|
+ u32 *buff = hma_indr->outbuf;
|
|
|
|
+
|
|
|
|
+ hma_fli->ireg_addr = t6_hma_ireg_array[i][0];
|
|
|
|
+ hma_fli->ireg_data = t6_hma_ireg_array[i][1];
|
|
|
|
+ hma_fli->ireg_local_offset = t6_hma_ireg_array[i][2];
|
|
|
|
+ hma_fli->ireg_offset_range = t6_hma_ireg_array[i][3];
|
|
|
|
+ t4_read_indirect(padap, hma_fli->ireg_addr, hma_fli->ireg_data,
|
|
|
|
+ buff, hma_fli->ireg_offset_range,
|
|
|
|
+ hma_fli->ireg_local_offset);
|
|
|
|
+ hma_indr++;
|
|
|
|
+ }
|
|
|
|
+ cudbg_write_and_release_buff(&temp_buff, dbg_buff);
|
|
|
|
+ return rc;
|
|
|
|
+}
|