18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2017 Chelsio Communications. All rights reserved. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/sort.h> 78c2ecf20Sopenharmony_ci#include <linux/string.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include "t4_regs.h" 108c2ecf20Sopenharmony_ci#include "cxgb4.h" 118c2ecf20Sopenharmony_ci#include "cxgb4_cudbg.h" 128c2ecf20Sopenharmony_ci#include "cudbg_if.h" 138c2ecf20Sopenharmony_ci#include "cudbg_lib_common.h" 148c2ecf20Sopenharmony_ci#include "cudbg_entity.h" 158c2ecf20Sopenharmony_ci#include "cudbg_lib.h" 168c2ecf20Sopenharmony_ci#include "cudbg_zlib.h" 178c2ecf20Sopenharmony_ci#include "cxgb4_tc_mqprio.h" 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistatic const u32 t6_tp_pio_array[][IREG_NUM_ELEM] = { 208c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x020, 28}, /* t6_tp_pio_regs_20_to_3b */ 218c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x040, 10}, /* t6_tp_pio_regs_40_to_49 */ 228c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x050, 10}, /* t6_tp_pio_regs_50_to_59 */ 238c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x060, 14}, /* t6_tp_pio_regs_60_to_6d */ 248c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x06F, 1}, /* t6_tp_pio_regs_6f */ 258c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x070, 6}, /* t6_tp_pio_regs_70_to_75 */ 268c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x130, 18}, /* t6_tp_pio_regs_130_to_141 */ 278c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x145, 19}, /* t6_tp_pio_regs_145_to_157 */ 288c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x160, 1}, /* t6_tp_pio_regs_160 */ 298c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x230, 25}, /* t6_tp_pio_regs_230_to_248 */ 308c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x24a, 3}, /* t6_tp_pio_regs_24c */ 318c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x8C0, 1} /* t6_tp_pio_regs_8c0 */ 328c2ecf20Sopenharmony_ci}; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic const u32 t5_tp_pio_array[][IREG_NUM_ELEM] = { 358c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x020, 28}, /* t5_tp_pio_regs_20_to_3b */ 368c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x040, 19}, /* t5_tp_pio_regs_40_to_52 */ 378c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x054, 2}, /* t5_tp_pio_regs_54_to_55 */ 388c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x060, 13}, /* t5_tp_pio_regs_60_to_6c */ 398c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x06F, 1}, /* t5_tp_pio_regs_6f */ 408c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x120, 4}, /* t5_tp_pio_regs_120_to_123 */ 418c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x12b, 2}, /* t5_tp_pio_regs_12b_to_12c */ 428c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x12f, 21}, /* t5_tp_pio_regs_12f_to_143 */ 438c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x145, 19}, /* t5_tp_pio_regs_145_to_157 */ 448c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x230, 25}, /* t5_tp_pio_regs_230_to_248 */ 458c2ecf20Sopenharmony_ci {0x7e40, 0x7e44, 0x8C0, 1} /* t5_tp_pio_regs_8c0 */ 468c2ecf20Sopenharmony_ci}; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_cistatic const u32 t6_tp_tm_pio_array[][IREG_NUM_ELEM] = { 498c2ecf20Sopenharmony_ci {0x7e18, 0x7e1c, 0x0, 12} 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistatic const u32 t5_tp_tm_pio_array[][IREG_NUM_ELEM] = { 538c2ecf20Sopenharmony_ci {0x7e18, 0x7e1c, 0x0, 12} 548c2ecf20Sopenharmony_ci}; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cistatic const u32 t6_tp_mib_index_array[6][IREG_NUM_ELEM] = { 578c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x0, 13}, 588c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x10, 6}, 598c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x18, 21}, 608c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x30, 32}, 618c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x50, 22}, 628c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x68, 12} 638c2ecf20Sopenharmony_ci}; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic const u32 t5_tp_mib_index_array[9][IREG_NUM_ELEM] = { 668c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x0, 13}, 678c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x10, 6}, 688c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x18, 8}, 698c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x20, 13}, 708c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x30, 16}, 718c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x40, 16}, 728c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x50, 16}, 738c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x60, 6}, 748c2ecf20Sopenharmony_ci {0x7e50, 0x7e54, 0x68, 4} 758c2ecf20Sopenharmony_ci}; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_cistatic const u32 t5_sge_dbg_index_array[2][IREG_NUM_ELEM] = { 788c2ecf20Sopenharmony_ci {0x10cc, 0x10d0, 0x0, 16}, 798c2ecf20Sopenharmony_ci {0x10cc, 0x10d4, 0x0, 16}, 808c2ecf20Sopenharmony_ci}; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_cistatic const u32 t6_sge_qbase_index_array[] = { 838c2ecf20Sopenharmony_ci /* 1 addr reg SGE_QBASE_INDEX and 4 data reg SGE_QBASE_MAP[0-3] */ 848c2ecf20Sopenharmony_ci 0x1250, 0x1240, 0x1244, 0x1248, 0x124c, 858c2ecf20Sopenharmony_ci}; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_cistatic const u32 t5_pcie_pdbg_array[][IREG_NUM_ELEM] = { 888c2ecf20Sopenharmony_ci {0x5a04, 0x5a0c, 0x00, 0x20}, /* t5_pcie_pdbg_regs_00_to_20 */ 898c2ecf20Sopenharmony_ci {0x5a04, 0x5a0c, 0x21, 0x20}, /* t5_pcie_pdbg_regs_21_to_40 */ 908c2ecf20Sopenharmony_ci {0x5a04, 0x5a0c, 0x41, 0x10}, /* t5_pcie_pdbg_regs_41_to_50 */ 918c2ecf20Sopenharmony_ci}; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cistatic const u32 t5_pcie_cdbg_array[][IREG_NUM_ELEM] = { 948c2ecf20Sopenharmony_ci {0x5a10, 0x5a18, 0x00, 0x20}, /* t5_pcie_cdbg_regs_00_to_20 */ 958c2ecf20Sopenharmony_ci {0x5a10, 0x5a18, 0x21, 0x18}, /* t5_pcie_cdbg_regs_21_to_37 */ 968c2ecf20Sopenharmony_ci}; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cistatic const u32 t5_pm_rx_array[][IREG_NUM_ELEM] = { 998c2ecf20Sopenharmony_ci {0x8FD0, 0x8FD4, 0x10000, 0x20}, /* t5_pm_rx_regs_10000_to_10020 */ 1008c2ecf20Sopenharmony_ci {0x8FD0, 0x8FD4, 0x10021, 0x0D}, /* t5_pm_rx_regs_10021_to_1002c */ 1018c2ecf20Sopenharmony_ci}; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_cistatic const u32 t5_pm_tx_array[][IREG_NUM_ELEM] = { 1048c2ecf20Sopenharmony_ci {0x8FF0, 0x8FF4, 0x10000, 0x20}, /* t5_pm_tx_regs_10000_to_10020 */ 1058c2ecf20Sopenharmony_ci {0x8FF0, 0x8FF4, 0x10021, 0x1D}, /* t5_pm_tx_regs_10021_to_1003c */ 1068c2ecf20Sopenharmony_ci}; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cistatic const u32 t5_pcie_config_array[][2] = { 1098c2ecf20Sopenharmony_ci {0x0, 0x34}, 1108c2ecf20Sopenharmony_ci {0x3c, 0x40}, 1118c2ecf20Sopenharmony_ci {0x50, 0x64}, 1128c2ecf20Sopenharmony_ci {0x70, 0x80}, 1138c2ecf20Sopenharmony_ci {0x94, 0xa0}, 1148c2ecf20Sopenharmony_ci {0xb0, 0xb8}, 1158c2ecf20Sopenharmony_ci {0xd0, 0xd4}, 1168c2ecf20Sopenharmony_ci {0x100, 0x128}, 1178c2ecf20Sopenharmony_ci {0x140, 0x148}, 1188c2ecf20Sopenharmony_ci {0x150, 0x164}, 1198c2ecf20Sopenharmony_ci {0x170, 0x178}, 1208c2ecf20Sopenharmony_ci {0x180, 0x194}, 1218c2ecf20Sopenharmony_ci {0x1a0, 0x1b8}, 1228c2ecf20Sopenharmony_ci {0x1c0, 0x208}, 1238c2ecf20Sopenharmony_ci}; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_cistatic const u32 t6_ma_ireg_array[][IREG_NUM_ELEM] = { 1268c2ecf20Sopenharmony_ci {0x78f8, 0x78fc, 0xa000, 23}, /* t6_ma_regs_a000_to_a016 */ 1278c2ecf20Sopenharmony_ci {0x78f8, 0x78fc, 0xa400, 30}, /* t6_ma_regs_a400_to_a41e */ 1288c2ecf20Sopenharmony_ci {0x78f8, 0x78fc, 0xa800, 20} /* t6_ma_regs_a800_to_a813 */ 1298c2ecf20Sopenharmony_ci}; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_cistatic const u32 t6_ma_ireg_array2[][IREG_NUM_ELEM] = { 1328c2ecf20Sopenharmony_ci {0x78f8, 0x78fc, 0xe400, 17}, /* t6_ma_regs_e400_to_e600 */ 1338c2ecf20Sopenharmony_ci {0x78f8, 0x78fc, 0xe640, 13} /* t6_ma_regs_e640_to_e7c0 */ 1348c2ecf20Sopenharmony_ci}; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_cistatic const u32 t6_up_cim_reg_array[][IREG_NUM_ELEM + 1] = { 1378c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x2000, 0x20, 0}, /* up_cim_2000_to_207c */ 1388c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x2080, 0x1d, 0}, /* up_cim_2080_to_20fc */ 1398c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x00, 0x20, 0}, /* up_cim_00_to_7c */ 1408c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x80, 0x20, 0}, /* up_cim_80_to_fc */ 1418c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x100, 0x11, 0}, /* up_cim_100_to_14c */ 1428c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x200, 0x10, 0}, /* up_cim_200_to_23c */ 1438c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x240, 0x2, 0}, /* up_cim_240_to_244 */ 1448c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x250, 0x2, 0}, /* up_cim_250_to_254 */ 1458c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x260, 0x2, 0}, /* up_cim_260_to_264 */ 1468c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x270, 0x2, 0}, /* up_cim_270_to_274 */ 1478c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x280, 0x20, 0}, /* up_cim_280_to_2fc */ 1488c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x300, 0x20, 0}, /* up_cim_300_to_37c */ 1498c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x380, 0x14, 0}, /* up_cim_380_to_3cc */ 1508c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x4900, 0x4, 0x4}, /* up_cim_4900_to_4c60 */ 1518c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x4904, 0x4, 0x4}, /* up_cim_4904_to_4c64 */ 1528c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x4908, 0x4, 0x4}, /* up_cim_4908_to_4c68 */ 1538c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x4910, 0x4, 0x4}, /* up_cim_4910_to_4c70 */ 1548c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x4914, 0x4, 0x4}, /* up_cim_4914_to_4c74 */ 1558c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x4920, 0x10, 0x10}, /* up_cim_4920_to_4a10 */ 1568c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x4924, 0x10, 0x10}, /* up_cim_4924_to_4a14 */ 1578c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x4928, 0x10, 0x10}, /* up_cim_4928_to_4a18 */ 1588c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x492c, 0x10, 0x10}, /* up_cim_492c_to_4a1c */ 1598c2ecf20Sopenharmony_ci}; 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_cistatic const u32 t5_up_cim_reg_array[][IREG_NUM_ELEM + 1] = { 1628c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x2000, 0x20, 0}, /* up_cim_2000_to_207c */ 1638c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x2080, 0x19, 0}, /* up_cim_2080_to_20ec */ 1648c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x00, 0x20, 0}, /* up_cim_00_to_7c */ 1658c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x80, 0x20, 0}, /* up_cim_80_to_fc */ 1668c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x100, 0x11, 0}, /* up_cim_100_to_14c */ 1678c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x200, 0x10, 0}, /* up_cim_200_to_23c */ 1688c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x240, 0x2, 0}, /* up_cim_240_to_244 */ 1698c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x250, 0x2, 0}, /* up_cim_250_to_254 */ 1708c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x260, 0x2, 0}, /* up_cim_260_to_264 */ 1718c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x270, 0x2, 0}, /* up_cim_270_to_274 */ 1728c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x280, 0x20, 0}, /* up_cim_280_to_2fc */ 1738c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x300, 0x20, 0}, /* up_cim_300_to_37c */ 1748c2ecf20Sopenharmony_ci {0x7b50, 0x7b54, 0x380, 0x14, 0}, /* up_cim_380_to_3cc */ 1758c2ecf20Sopenharmony_ci}; 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_cistatic const u32 t6_hma_ireg_array[][IREG_NUM_ELEM] = { 1788c2ecf20Sopenharmony_ci {0x51320, 0x51324, 0xa000, 32} /* t6_hma_regs_a000_to_a01f */ 1798c2ecf20Sopenharmony_ci}; 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ciu32 cudbg_get_entity_length(struct adapter *adap, u32 entity) 1828c2ecf20Sopenharmony_ci{ 1838c2ecf20Sopenharmony_ci struct cudbg_tcam tcam_region = { 0 }; 1848c2ecf20Sopenharmony_ci u32 value, n = 0, len = 0; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci switch (entity) { 1878c2ecf20Sopenharmony_ci case CUDBG_REG_DUMP: 1888c2ecf20Sopenharmony_ci switch (CHELSIO_CHIP_VERSION(adap->params.chip)) { 1898c2ecf20Sopenharmony_ci case CHELSIO_T4: 1908c2ecf20Sopenharmony_ci len = T4_REGMAP_SIZE; 1918c2ecf20Sopenharmony_ci break; 1928c2ecf20Sopenharmony_ci case CHELSIO_T5: 1938c2ecf20Sopenharmony_ci case CHELSIO_T6: 1948c2ecf20Sopenharmony_ci len = T5_REGMAP_SIZE; 1958c2ecf20Sopenharmony_ci break; 1968c2ecf20Sopenharmony_ci default: 1978c2ecf20Sopenharmony_ci break; 1988c2ecf20Sopenharmony_ci } 1998c2ecf20Sopenharmony_ci break; 2008c2ecf20Sopenharmony_ci case CUDBG_DEV_LOG: 2018c2ecf20Sopenharmony_ci len = adap->params.devlog.size; 2028c2ecf20Sopenharmony_ci break; 2038c2ecf20Sopenharmony_ci case CUDBG_CIM_LA: 2048c2ecf20Sopenharmony_ci if (is_t6(adap->params.chip)) { 2058c2ecf20Sopenharmony_ci len = adap->params.cim_la_size / 10 + 1; 2068c2ecf20Sopenharmony_ci len *= 10 * sizeof(u32); 2078c2ecf20Sopenharmony_ci } else { 2088c2ecf20Sopenharmony_ci len = adap->params.cim_la_size / 8; 2098c2ecf20Sopenharmony_ci len *= 8 * sizeof(u32); 2108c2ecf20Sopenharmony_ci } 2118c2ecf20Sopenharmony_ci len += sizeof(u32); /* for reading CIM LA configuration */ 2128c2ecf20Sopenharmony_ci break; 2138c2ecf20Sopenharmony_ci case CUDBG_CIM_MA_LA: 2148c2ecf20Sopenharmony_ci len = 2 * CIM_MALA_SIZE * 5 * sizeof(u32); 2158c2ecf20Sopenharmony_ci break; 2168c2ecf20Sopenharmony_ci case CUDBG_CIM_QCFG: 2178c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_cim_qcfg); 2188c2ecf20Sopenharmony_ci break; 2198c2ecf20Sopenharmony_ci case CUDBG_CIM_IBQ_TP0: 2208c2ecf20Sopenharmony_ci case CUDBG_CIM_IBQ_TP1: 2218c2ecf20Sopenharmony_ci case CUDBG_CIM_IBQ_ULP: 2228c2ecf20Sopenharmony_ci case CUDBG_CIM_IBQ_SGE0: 2238c2ecf20Sopenharmony_ci case CUDBG_CIM_IBQ_SGE1: 2248c2ecf20Sopenharmony_ci case CUDBG_CIM_IBQ_NCSI: 2258c2ecf20Sopenharmony_ci len = CIM_IBQ_SIZE * 4 * sizeof(u32); 2268c2ecf20Sopenharmony_ci break; 2278c2ecf20Sopenharmony_ci case CUDBG_CIM_OBQ_ULP0: 2288c2ecf20Sopenharmony_ci len = cudbg_cim_obq_size(adap, 0); 2298c2ecf20Sopenharmony_ci break; 2308c2ecf20Sopenharmony_ci case CUDBG_CIM_OBQ_ULP1: 2318c2ecf20Sopenharmony_ci len = cudbg_cim_obq_size(adap, 1); 2328c2ecf20Sopenharmony_ci break; 2338c2ecf20Sopenharmony_ci case CUDBG_CIM_OBQ_ULP2: 2348c2ecf20Sopenharmony_ci len = cudbg_cim_obq_size(adap, 2); 2358c2ecf20Sopenharmony_ci break; 2368c2ecf20Sopenharmony_ci case CUDBG_CIM_OBQ_ULP3: 2378c2ecf20Sopenharmony_ci len = cudbg_cim_obq_size(adap, 3); 2388c2ecf20Sopenharmony_ci break; 2398c2ecf20Sopenharmony_ci case CUDBG_CIM_OBQ_SGE: 2408c2ecf20Sopenharmony_ci len = cudbg_cim_obq_size(adap, 4); 2418c2ecf20Sopenharmony_ci break; 2428c2ecf20Sopenharmony_ci case CUDBG_CIM_OBQ_NCSI: 2438c2ecf20Sopenharmony_ci len = cudbg_cim_obq_size(adap, 5); 2448c2ecf20Sopenharmony_ci break; 2458c2ecf20Sopenharmony_ci case CUDBG_CIM_OBQ_RXQ0: 2468c2ecf20Sopenharmony_ci len = cudbg_cim_obq_size(adap, 6); 2478c2ecf20Sopenharmony_ci break; 2488c2ecf20Sopenharmony_ci case CUDBG_CIM_OBQ_RXQ1: 2498c2ecf20Sopenharmony_ci len = cudbg_cim_obq_size(adap, 7); 2508c2ecf20Sopenharmony_ci break; 2518c2ecf20Sopenharmony_ci case CUDBG_EDC0: 2528c2ecf20Sopenharmony_ci value = t4_read_reg(adap, MA_TARGET_MEM_ENABLE_A); 2538c2ecf20Sopenharmony_ci if (value & EDRAM0_ENABLE_F) { 2548c2ecf20Sopenharmony_ci value = t4_read_reg(adap, MA_EDRAM0_BAR_A); 2558c2ecf20Sopenharmony_ci len = EDRAM0_SIZE_G(value); 2568c2ecf20Sopenharmony_ci } 2578c2ecf20Sopenharmony_ci len = cudbg_mbytes_to_bytes(len); 2588c2ecf20Sopenharmony_ci break; 2598c2ecf20Sopenharmony_ci case CUDBG_EDC1: 2608c2ecf20Sopenharmony_ci value = t4_read_reg(adap, MA_TARGET_MEM_ENABLE_A); 2618c2ecf20Sopenharmony_ci if (value & EDRAM1_ENABLE_F) { 2628c2ecf20Sopenharmony_ci value = t4_read_reg(adap, MA_EDRAM1_BAR_A); 2638c2ecf20Sopenharmony_ci len = EDRAM1_SIZE_G(value); 2648c2ecf20Sopenharmony_ci } 2658c2ecf20Sopenharmony_ci len = cudbg_mbytes_to_bytes(len); 2668c2ecf20Sopenharmony_ci break; 2678c2ecf20Sopenharmony_ci case CUDBG_MC0: 2688c2ecf20Sopenharmony_ci value = t4_read_reg(adap, MA_TARGET_MEM_ENABLE_A); 2698c2ecf20Sopenharmony_ci if (value & EXT_MEM0_ENABLE_F) { 2708c2ecf20Sopenharmony_ci value = t4_read_reg(adap, MA_EXT_MEMORY0_BAR_A); 2718c2ecf20Sopenharmony_ci len = EXT_MEM0_SIZE_G(value); 2728c2ecf20Sopenharmony_ci } 2738c2ecf20Sopenharmony_ci len = cudbg_mbytes_to_bytes(len); 2748c2ecf20Sopenharmony_ci break; 2758c2ecf20Sopenharmony_ci case CUDBG_MC1: 2768c2ecf20Sopenharmony_ci value = t4_read_reg(adap, MA_TARGET_MEM_ENABLE_A); 2778c2ecf20Sopenharmony_ci if (value & EXT_MEM1_ENABLE_F) { 2788c2ecf20Sopenharmony_ci value = t4_read_reg(adap, MA_EXT_MEMORY1_BAR_A); 2798c2ecf20Sopenharmony_ci len = EXT_MEM1_SIZE_G(value); 2808c2ecf20Sopenharmony_ci } 2818c2ecf20Sopenharmony_ci len = cudbg_mbytes_to_bytes(len); 2828c2ecf20Sopenharmony_ci break; 2838c2ecf20Sopenharmony_ci case CUDBG_RSS: 2848c2ecf20Sopenharmony_ci len = t4_chip_rss_size(adap) * sizeof(u16); 2858c2ecf20Sopenharmony_ci break; 2868c2ecf20Sopenharmony_ci case CUDBG_RSS_VF_CONF: 2878c2ecf20Sopenharmony_ci len = adap->params.arch.vfcount * 2888c2ecf20Sopenharmony_ci sizeof(struct cudbg_rss_vf_conf); 2898c2ecf20Sopenharmony_ci break; 2908c2ecf20Sopenharmony_ci case CUDBG_PATH_MTU: 2918c2ecf20Sopenharmony_ci len = NMTUS * sizeof(u16); 2928c2ecf20Sopenharmony_ci break; 2938c2ecf20Sopenharmony_ci case CUDBG_PM_STATS: 2948c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_pm_stats); 2958c2ecf20Sopenharmony_ci break; 2968c2ecf20Sopenharmony_ci case CUDBG_HW_SCHED: 2978c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_hw_sched); 2988c2ecf20Sopenharmony_ci break; 2998c2ecf20Sopenharmony_ci case CUDBG_TP_INDIRECT: 3008c2ecf20Sopenharmony_ci switch (CHELSIO_CHIP_VERSION(adap->params.chip)) { 3018c2ecf20Sopenharmony_ci case CHELSIO_T5: 3028c2ecf20Sopenharmony_ci n = sizeof(t5_tp_pio_array) + 3038c2ecf20Sopenharmony_ci sizeof(t5_tp_tm_pio_array) + 3048c2ecf20Sopenharmony_ci sizeof(t5_tp_mib_index_array); 3058c2ecf20Sopenharmony_ci break; 3068c2ecf20Sopenharmony_ci case CHELSIO_T6: 3078c2ecf20Sopenharmony_ci n = sizeof(t6_tp_pio_array) + 3088c2ecf20Sopenharmony_ci sizeof(t6_tp_tm_pio_array) + 3098c2ecf20Sopenharmony_ci sizeof(t6_tp_mib_index_array); 3108c2ecf20Sopenharmony_ci break; 3118c2ecf20Sopenharmony_ci default: 3128c2ecf20Sopenharmony_ci break; 3138c2ecf20Sopenharmony_ci } 3148c2ecf20Sopenharmony_ci n = n / (IREG_NUM_ELEM * sizeof(u32)); 3158c2ecf20Sopenharmony_ci len = sizeof(struct ireg_buf) * n; 3168c2ecf20Sopenharmony_ci break; 3178c2ecf20Sopenharmony_ci case CUDBG_SGE_INDIRECT: 3188c2ecf20Sopenharmony_ci len = sizeof(struct ireg_buf) * 2 + 3198c2ecf20Sopenharmony_ci sizeof(struct sge_qbase_reg_field); 3208c2ecf20Sopenharmony_ci break; 3218c2ecf20Sopenharmony_ci case CUDBG_ULPRX_LA: 3228c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_ulprx_la); 3238c2ecf20Sopenharmony_ci break; 3248c2ecf20Sopenharmony_ci case CUDBG_TP_LA: 3258c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_tp_la) + TPLA_SIZE * sizeof(u64); 3268c2ecf20Sopenharmony_ci break; 3278c2ecf20Sopenharmony_ci case CUDBG_MEMINFO: 3288c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_ver_hdr) + 3298c2ecf20Sopenharmony_ci sizeof(struct cudbg_meminfo); 3308c2ecf20Sopenharmony_ci break; 3318c2ecf20Sopenharmony_ci case CUDBG_CIM_PIF_LA: 3328c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_cim_pif_la); 3338c2ecf20Sopenharmony_ci len += 2 * CIM_PIFLA_SIZE * 6 * sizeof(u32); 3348c2ecf20Sopenharmony_ci break; 3358c2ecf20Sopenharmony_ci case CUDBG_CLK: 3368c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_clk_info); 3378c2ecf20Sopenharmony_ci break; 3388c2ecf20Sopenharmony_ci case CUDBG_PCIE_INDIRECT: 3398c2ecf20Sopenharmony_ci n = sizeof(t5_pcie_pdbg_array) / (IREG_NUM_ELEM * sizeof(u32)); 3408c2ecf20Sopenharmony_ci len = sizeof(struct ireg_buf) * n * 2; 3418c2ecf20Sopenharmony_ci break; 3428c2ecf20Sopenharmony_ci case CUDBG_PM_INDIRECT: 3438c2ecf20Sopenharmony_ci n = sizeof(t5_pm_rx_array) / (IREG_NUM_ELEM * sizeof(u32)); 3448c2ecf20Sopenharmony_ci len = sizeof(struct ireg_buf) * n * 2; 3458c2ecf20Sopenharmony_ci break; 3468c2ecf20Sopenharmony_ci case CUDBG_TID_INFO: 3478c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_tid_info_region_rev1); 3488c2ecf20Sopenharmony_ci break; 3498c2ecf20Sopenharmony_ci case CUDBG_PCIE_CONFIG: 3508c2ecf20Sopenharmony_ci len = sizeof(u32) * CUDBG_NUM_PCIE_CONFIG_REGS; 3518c2ecf20Sopenharmony_ci break; 3528c2ecf20Sopenharmony_ci case CUDBG_DUMP_CONTEXT: 3538c2ecf20Sopenharmony_ci len = cudbg_dump_context_size(adap); 3548c2ecf20Sopenharmony_ci break; 3558c2ecf20Sopenharmony_ci case CUDBG_MPS_TCAM: 3568c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_mps_tcam) * 3578c2ecf20Sopenharmony_ci adap->params.arch.mps_tcam_size; 3588c2ecf20Sopenharmony_ci break; 3598c2ecf20Sopenharmony_ci case CUDBG_VPD_DATA: 3608c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_vpd_data); 3618c2ecf20Sopenharmony_ci break; 3628c2ecf20Sopenharmony_ci case CUDBG_LE_TCAM: 3638c2ecf20Sopenharmony_ci cudbg_fill_le_tcam_info(adap, &tcam_region); 3648c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_tcam) + 3658c2ecf20Sopenharmony_ci sizeof(struct cudbg_tid_data) * tcam_region.max_tid; 3668c2ecf20Sopenharmony_ci break; 3678c2ecf20Sopenharmony_ci case CUDBG_CCTRL: 3688c2ecf20Sopenharmony_ci len = sizeof(u16) * NMTUS * NCCTRL_WIN; 3698c2ecf20Sopenharmony_ci break; 3708c2ecf20Sopenharmony_ci case CUDBG_MA_INDIRECT: 3718c2ecf20Sopenharmony_ci if (CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5) { 3728c2ecf20Sopenharmony_ci n = sizeof(t6_ma_ireg_array) / 3738c2ecf20Sopenharmony_ci (IREG_NUM_ELEM * sizeof(u32)); 3748c2ecf20Sopenharmony_ci len = sizeof(struct ireg_buf) * n * 2; 3758c2ecf20Sopenharmony_ci } 3768c2ecf20Sopenharmony_ci break; 3778c2ecf20Sopenharmony_ci case CUDBG_ULPTX_LA: 3788c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_ver_hdr) + 3798c2ecf20Sopenharmony_ci sizeof(struct cudbg_ulptx_la); 3808c2ecf20Sopenharmony_ci break; 3818c2ecf20Sopenharmony_ci case CUDBG_UP_CIM_INDIRECT: 3828c2ecf20Sopenharmony_ci n = 0; 3838c2ecf20Sopenharmony_ci if (is_t5(adap->params.chip)) 3848c2ecf20Sopenharmony_ci n = sizeof(t5_up_cim_reg_array) / 3858c2ecf20Sopenharmony_ci ((IREG_NUM_ELEM + 1) * sizeof(u32)); 3868c2ecf20Sopenharmony_ci else if (is_t6(adap->params.chip)) 3878c2ecf20Sopenharmony_ci n = sizeof(t6_up_cim_reg_array) / 3888c2ecf20Sopenharmony_ci ((IREG_NUM_ELEM + 1) * sizeof(u32)); 3898c2ecf20Sopenharmony_ci len = sizeof(struct ireg_buf) * n; 3908c2ecf20Sopenharmony_ci break; 3918c2ecf20Sopenharmony_ci case CUDBG_PBT_TABLE: 3928c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_pbt_tables); 3938c2ecf20Sopenharmony_ci break; 3948c2ecf20Sopenharmony_ci case CUDBG_MBOX_LOG: 3958c2ecf20Sopenharmony_ci len = sizeof(struct cudbg_mbox_log) * adap->mbox_log->size; 3968c2ecf20Sopenharmony_ci break; 3978c2ecf20Sopenharmony_ci case CUDBG_HMA_INDIRECT: 3988c2ecf20Sopenharmony_ci if (CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5) { 3998c2ecf20Sopenharmony_ci n = sizeof(t6_hma_ireg_array) / 4008c2ecf20Sopenharmony_ci (IREG_NUM_ELEM * sizeof(u32)); 4018c2ecf20Sopenharmony_ci len = sizeof(struct ireg_buf) * n; 4028c2ecf20Sopenharmony_ci } 4038c2ecf20Sopenharmony_ci break; 4048c2ecf20Sopenharmony_ci case CUDBG_HMA: 4058c2ecf20Sopenharmony_ci value = t4_read_reg(adap, MA_TARGET_MEM_ENABLE_A); 4068c2ecf20Sopenharmony_ci if (value & HMA_MUX_F) { 4078c2ecf20Sopenharmony_ci /* In T6, there's no MC1. So, HMA shares MC1 4088c2ecf20Sopenharmony_ci * address space. 4098c2ecf20Sopenharmony_ci */ 4108c2ecf20Sopenharmony_ci value = t4_read_reg(adap, MA_EXT_MEMORY1_BAR_A); 4118c2ecf20Sopenharmony_ci len = EXT_MEM1_SIZE_G(value); 4128c2ecf20Sopenharmony_ci } 4138c2ecf20Sopenharmony_ci len = cudbg_mbytes_to_bytes(len); 4148c2ecf20Sopenharmony_ci break; 4158c2ecf20Sopenharmony_ci case CUDBG_QDESC: 4168c2ecf20Sopenharmony_ci cudbg_fill_qdesc_num_and_size(adap, NULL, &len); 4178c2ecf20Sopenharmony_ci break; 4188c2ecf20Sopenharmony_ci default: 4198c2ecf20Sopenharmony_ci break; 4208c2ecf20Sopenharmony_ci } 4218c2ecf20Sopenharmony_ci 4228c2ecf20Sopenharmony_ci return len; 4238c2ecf20Sopenharmony_ci} 4248c2ecf20Sopenharmony_ci 4258c2ecf20Sopenharmony_cistatic int cudbg_do_compression(struct cudbg_init *pdbg_init, 4268c2ecf20Sopenharmony_ci struct cudbg_buffer *pin_buff, 4278c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff) 4288c2ecf20Sopenharmony_ci{ 4298c2ecf20Sopenharmony_ci struct cudbg_buffer temp_in_buff = { 0 }; 4308c2ecf20Sopenharmony_ci int bytes_left, bytes_read, bytes; 4318c2ecf20Sopenharmony_ci u32 offset = dbg_buff->offset; 4328c2ecf20Sopenharmony_ci int rc; 4338c2ecf20Sopenharmony_ci 4348c2ecf20Sopenharmony_ci temp_in_buff.offset = pin_buff->offset; 4358c2ecf20Sopenharmony_ci temp_in_buff.data = pin_buff->data; 4368c2ecf20Sopenharmony_ci temp_in_buff.size = pin_buff->size; 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_ci bytes_left = pin_buff->size; 4398c2ecf20Sopenharmony_ci bytes_read = 0; 4408c2ecf20Sopenharmony_ci while (bytes_left > 0) { 4418c2ecf20Sopenharmony_ci /* Do compression in smaller chunks */ 4428c2ecf20Sopenharmony_ci bytes = min_t(unsigned long, bytes_left, 4438c2ecf20Sopenharmony_ci (unsigned long)CUDBG_CHUNK_SIZE); 4448c2ecf20Sopenharmony_ci temp_in_buff.data = (char *)pin_buff->data + bytes_read; 4458c2ecf20Sopenharmony_ci temp_in_buff.size = bytes; 4468c2ecf20Sopenharmony_ci rc = cudbg_compress_buff(pdbg_init, &temp_in_buff, dbg_buff); 4478c2ecf20Sopenharmony_ci if (rc) 4488c2ecf20Sopenharmony_ci return rc; 4498c2ecf20Sopenharmony_ci bytes_left -= bytes; 4508c2ecf20Sopenharmony_ci bytes_read += bytes; 4518c2ecf20Sopenharmony_ci } 4528c2ecf20Sopenharmony_ci 4538c2ecf20Sopenharmony_ci pin_buff->size = dbg_buff->offset - offset; 4548c2ecf20Sopenharmony_ci return 0; 4558c2ecf20Sopenharmony_ci} 4568c2ecf20Sopenharmony_ci 4578c2ecf20Sopenharmony_cistatic int cudbg_write_and_release_buff(struct cudbg_init *pdbg_init, 4588c2ecf20Sopenharmony_ci struct cudbg_buffer *pin_buff, 4598c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff) 4608c2ecf20Sopenharmony_ci{ 4618c2ecf20Sopenharmony_ci int rc = 0; 4628c2ecf20Sopenharmony_ci 4638c2ecf20Sopenharmony_ci if (pdbg_init->compress_type == CUDBG_COMPRESSION_NONE) { 4648c2ecf20Sopenharmony_ci cudbg_update_buff(pin_buff, dbg_buff); 4658c2ecf20Sopenharmony_ci } else { 4668c2ecf20Sopenharmony_ci rc = cudbg_do_compression(pdbg_init, pin_buff, dbg_buff); 4678c2ecf20Sopenharmony_ci if (rc) 4688c2ecf20Sopenharmony_ci goto out; 4698c2ecf20Sopenharmony_ci } 4708c2ecf20Sopenharmony_ci 4718c2ecf20Sopenharmony_ciout: 4728c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, pin_buff); 4738c2ecf20Sopenharmony_ci return rc; 4748c2ecf20Sopenharmony_ci} 4758c2ecf20Sopenharmony_ci 4768c2ecf20Sopenharmony_cistatic int is_fw_attached(struct cudbg_init *pdbg_init) 4778c2ecf20Sopenharmony_ci{ 4788c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 4798c2ecf20Sopenharmony_ci 4808c2ecf20Sopenharmony_ci if (!(padap->flags & CXGB4_FW_OK) || padap->use_bd) 4818c2ecf20Sopenharmony_ci return 0; 4828c2ecf20Sopenharmony_ci 4838c2ecf20Sopenharmony_ci return 1; 4848c2ecf20Sopenharmony_ci} 4858c2ecf20Sopenharmony_ci 4868c2ecf20Sopenharmony_ci/* This function will add additional padding bytes into debug_buffer to make it 4878c2ecf20Sopenharmony_ci * 4 byte aligned. 4888c2ecf20Sopenharmony_ci */ 4898c2ecf20Sopenharmony_civoid cudbg_align_debug_buffer(struct cudbg_buffer *dbg_buff, 4908c2ecf20Sopenharmony_ci struct cudbg_entity_hdr *entity_hdr) 4918c2ecf20Sopenharmony_ci{ 4928c2ecf20Sopenharmony_ci u8 zero_buf[4] = {0}; 4938c2ecf20Sopenharmony_ci u8 padding, remain; 4948c2ecf20Sopenharmony_ci 4958c2ecf20Sopenharmony_ci remain = (dbg_buff->offset - entity_hdr->start_offset) % 4; 4968c2ecf20Sopenharmony_ci padding = 4 - remain; 4978c2ecf20Sopenharmony_ci if (remain) { 4988c2ecf20Sopenharmony_ci memcpy(((u8 *)dbg_buff->data) + dbg_buff->offset, &zero_buf, 4998c2ecf20Sopenharmony_ci padding); 5008c2ecf20Sopenharmony_ci dbg_buff->offset += padding; 5018c2ecf20Sopenharmony_ci entity_hdr->num_pad = padding; 5028c2ecf20Sopenharmony_ci } 5038c2ecf20Sopenharmony_ci entity_hdr->size = dbg_buff->offset - entity_hdr->start_offset; 5048c2ecf20Sopenharmony_ci} 5058c2ecf20Sopenharmony_ci 5068c2ecf20Sopenharmony_cistruct cudbg_entity_hdr *cudbg_get_entity_hdr(void *outbuf, int i) 5078c2ecf20Sopenharmony_ci{ 5088c2ecf20Sopenharmony_ci struct cudbg_hdr *cudbg_hdr = (struct cudbg_hdr *)outbuf; 5098c2ecf20Sopenharmony_ci 5108c2ecf20Sopenharmony_ci return (struct cudbg_entity_hdr *) 5118c2ecf20Sopenharmony_ci ((char *)outbuf + cudbg_hdr->hdr_len + 5128c2ecf20Sopenharmony_ci (sizeof(struct cudbg_entity_hdr) * (i - 1))); 5138c2ecf20Sopenharmony_ci} 5148c2ecf20Sopenharmony_ci 5158c2ecf20Sopenharmony_cistatic int cudbg_read_vpd_reg(struct adapter *padap, u32 addr, u32 len, 5168c2ecf20Sopenharmony_ci void *dest) 5178c2ecf20Sopenharmony_ci{ 5188c2ecf20Sopenharmony_ci int vaddr, rc; 5198c2ecf20Sopenharmony_ci 5208c2ecf20Sopenharmony_ci vaddr = t4_eeprom_ptov(addr, padap->pf, EEPROMPFSIZE); 5218c2ecf20Sopenharmony_ci if (vaddr < 0) 5228c2ecf20Sopenharmony_ci return vaddr; 5238c2ecf20Sopenharmony_ci 5248c2ecf20Sopenharmony_ci rc = pci_read_vpd(padap->pdev, vaddr, len, dest); 5258c2ecf20Sopenharmony_ci if (rc < 0) 5268c2ecf20Sopenharmony_ci return rc; 5278c2ecf20Sopenharmony_ci 5288c2ecf20Sopenharmony_ci return 0; 5298c2ecf20Sopenharmony_ci} 5308c2ecf20Sopenharmony_ci 5318c2ecf20Sopenharmony_cistatic int cudbg_mem_desc_cmp(const void *a, const void *b) 5328c2ecf20Sopenharmony_ci{ 5338c2ecf20Sopenharmony_ci return ((const struct cudbg_mem_desc *)a)->base - 5348c2ecf20Sopenharmony_ci ((const struct cudbg_mem_desc *)b)->base; 5358c2ecf20Sopenharmony_ci} 5368c2ecf20Sopenharmony_ci 5378c2ecf20Sopenharmony_ciint cudbg_fill_meminfo(struct adapter *padap, 5388c2ecf20Sopenharmony_ci struct cudbg_meminfo *meminfo_buff) 5398c2ecf20Sopenharmony_ci{ 5408c2ecf20Sopenharmony_ci struct cudbg_mem_desc *md; 5418c2ecf20Sopenharmony_ci u32 lo, hi, used, alloc; 5428c2ecf20Sopenharmony_ci int n, i; 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_ci memset(meminfo_buff->avail, 0, 5458c2ecf20Sopenharmony_ci ARRAY_SIZE(meminfo_buff->avail) * 5468c2ecf20Sopenharmony_ci sizeof(struct cudbg_mem_desc)); 5478c2ecf20Sopenharmony_ci memset(meminfo_buff->mem, 0, 5488c2ecf20Sopenharmony_ci (ARRAY_SIZE(cudbg_region) + 3) * sizeof(struct cudbg_mem_desc)); 5498c2ecf20Sopenharmony_ci md = meminfo_buff->mem; 5508c2ecf20Sopenharmony_ci 5518c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(meminfo_buff->mem); i++) { 5528c2ecf20Sopenharmony_ci meminfo_buff->mem[i].limit = 0; 5538c2ecf20Sopenharmony_ci meminfo_buff->mem[i].idx = i; 5548c2ecf20Sopenharmony_ci } 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_ci /* Find and sort the populated memory ranges */ 5578c2ecf20Sopenharmony_ci i = 0; 5588c2ecf20Sopenharmony_ci lo = t4_read_reg(padap, MA_TARGET_MEM_ENABLE_A); 5598c2ecf20Sopenharmony_ci if (lo & EDRAM0_ENABLE_F) { 5608c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, MA_EDRAM0_BAR_A); 5618c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base = 5628c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EDRAM0_BASE_G(hi)); 5638c2ecf20Sopenharmony_ci meminfo_buff->avail[i].limit = 5648c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base + 5658c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EDRAM0_SIZE_G(hi)); 5668c2ecf20Sopenharmony_ci meminfo_buff->avail[i].idx = 0; 5678c2ecf20Sopenharmony_ci i++; 5688c2ecf20Sopenharmony_ci } 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci if (lo & EDRAM1_ENABLE_F) { 5718c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, MA_EDRAM1_BAR_A); 5728c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base = 5738c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EDRAM1_BASE_G(hi)); 5748c2ecf20Sopenharmony_ci meminfo_buff->avail[i].limit = 5758c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base + 5768c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EDRAM1_SIZE_G(hi)); 5778c2ecf20Sopenharmony_ci meminfo_buff->avail[i].idx = 1; 5788c2ecf20Sopenharmony_ci i++; 5798c2ecf20Sopenharmony_ci } 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) { 5828c2ecf20Sopenharmony_ci if (lo & EXT_MEM0_ENABLE_F) { 5838c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, MA_EXT_MEMORY0_BAR_A); 5848c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base = 5858c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EXT_MEM_BASE_G(hi)); 5868c2ecf20Sopenharmony_ci meminfo_buff->avail[i].limit = 5878c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base + 5888c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EXT_MEM_SIZE_G(hi)); 5898c2ecf20Sopenharmony_ci meminfo_buff->avail[i].idx = 3; 5908c2ecf20Sopenharmony_ci i++; 5918c2ecf20Sopenharmony_ci } 5928c2ecf20Sopenharmony_ci 5938c2ecf20Sopenharmony_ci if (lo & EXT_MEM1_ENABLE_F) { 5948c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, MA_EXT_MEMORY1_BAR_A); 5958c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base = 5968c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EXT_MEM1_BASE_G(hi)); 5978c2ecf20Sopenharmony_ci meminfo_buff->avail[i].limit = 5988c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base + 5998c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EXT_MEM1_SIZE_G(hi)); 6008c2ecf20Sopenharmony_ci meminfo_buff->avail[i].idx = 4; 6018c2ecf20Sopenharmony_ci i++; 6028c2ecf20Sopenharmony_ci } 6038c2ecf20Sopenharmony_ci } else { 6048c2ecf20Sopenharmony_ci if (lo & EXT_MEM_ENABLE_F) { 6058c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, MA_EXT_MEMORY_BAR_A); 6068c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base = 6078c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EXT_MEM_BASE_G(hi)); 6088c2ecf20Sopenharmony_ci meminfo_buff->avail[i].limit = 6098c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base + 6108c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EXT_MEM_SIZE_G(hi)); 6118c2ecf20Sopenharmony_ci meminfo_buff->avail[i].idx = 2; 6128c2ecf20Sopenharmony_ci i++; 6138c2ecf20Sopenharmony_ci } 6148c2ecf20Sopenharmony_ci 6158c2ecf20Sopenharmony_ci if (lo & HMA_MUX_F) { 6168c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, MA_EXT_MEMORY1_BAR_A); 6178c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base = 6188c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EXT_MEM1_BASE_G(hi)); 6198c2ecf20Sopenharmony_ci meminfo_buff->avail[i].limit = 6208c2ecf20Sopenharmony_ci meminfo_buff->avail[i].base + 6218c2ecf20Sopenharmony_ci cudbg_mbytes_to_bytes(EXT_MEM1_SIZE_G(hi)); 6228c2ecf20Sopenharmony_ci meminfo_buff->avail[i].idx = 5; 6238c2ecf20Sopenharmony_ci i++; 6248c2ecf20Sopenharmony_ci } 6258c2ecf20Sopenharmony_ci } 6268c2ecf20Sopenharmony_ci 6278c2ecf20Sopenharmony_ci if (!i) /* no memory available */ 6288c2ecf20Sopenharmony_ci return CUDBG_STATUS_ENTITY_NOT_FOUND; 6298c2ecf20Sopenharmony_ci 6308c2ecf20Sopenharmony_ci meminfo_buff->avail_c = i; 6318c2ecf20Sopenharmony_ci sort(meminfo_buff->avail, i, sizeof(struct cudbg_mem_desc), 6328c2ecf20Sopenharmony_ci cudbg_mem_desc_cmp, NULL); 6338c2ecf20Sopenharmony_ci (md++)->base = t4_read_reg(padap, SGE_DBQ_CTXT_BADDR_A); 6348c2ecf20Sopenharmony_ci (md++)->base = t4_read_reg(padap, SGE_IMSG_CTXT_BADDR_A); 6358c2ecf20Sopenharmony_ci (md++)->base = t4_read_reg(padap, SGE_FLM_CACHE_BADDR_A); 6368c2ecf20Sopenharmony_ci (md++)->base = t4_read_reg(padap, TP_CMM_TCB_BASE_A); 6378c2ecf20Sopenharmony_ci (md++)->base = t4_read_reg(padap, TP_CMM_MM_BASE_A); 6388c2ecf20Sopenharmony_ci (md++)->base = t4_read_reg(padap, TP_CMM_TIMER_BASE_A); 6398c2ecf20Sopenharmony_ci (md++)->base = t4_read_reg(padap, TP_CMM_MM_RX_FLST_BASE_A); 6408c2ecf20Sopenharmony_ci (md++)->base = t4_read_reg(padap, TP_CMM_MM_TX_FLST_BASE_A); 6418c2ecf20Sopenharmony_ci (md++)->base = t4_read_reg(padap, TP_CMM_MM_PS_FLST_BASE_A); 6428c2ecf20Sopenharmony_ci 6438c2ecf20Sopenharmony_ci /* the next few have explicit upper bounds */ 6448c2ecf20Sopenharmony_ci md->base = t4_read_reg(padap, TP_PMM_TX_BASE_A); 6458c2ecf20Sopenharmony_ci md->limit = md->base - 1 + 6468c2ecf20Sopenharmony_ci t4_read_reg(padap, TP_PMM_TX_PAGE_SIZE_A) * 6478c2ecf20Sopenharmony_ci PMTXMAXPAGE_G(t4_read_reg(padap, TP_PMM_TX_MAX_PAGE_A)); 6488c2ecf20Sopenharmony_ci md++; 6498c2ecf20Sopenharmony_ci 6508c2ecf20Sopenharmony_ci md->base = t4_read_reg(padap, TP_PMM_RX_BASE_A); 6518c2ecf20Sopenharmony_ci md->limit = md->base - 1 + 6528c2ecf20Sopenharmony_ci t4_read_reg(padap, TP_PMM_RX_PAGE_SIZE_A) * 6538c2ecf20Sopenharmony_ci PMRXMAXPAGE_G(t4_read_reg(padap, TP_PMM_RX_MAX_PAGE_A)); 6548c2ecf20Sopenharmony_ci md++; 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_ci if (t4_read_reg(padap, LE_DB_CONFIG_A) & HASHEN_F) { 6578c2ecf20Sopenharmony_ci if (CHELSIO_CHIP_VERSION(padap->params.chip) <= CHELSIO_T5) { 6588c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, LE_DB_TID_HASHBASE_A) / 4; 6598c2ecf20Sopenharmony_ci md->base = t4_read_reg(padap, LE_DB_HASH_TID_BASE_A); 6608c2ecf20Sopenharmony_ci } else { 6618c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, LE_DB_HASH_TID_BASE_A); 6628c2ecf20Sopenharmony_ci md->base = t4_read_reg(padap, 6638c2ecf20Sopenharmony_ci LE_DB_HASH_TBL_BASE_ADDR_A); 6648c2ecf20Sopenharmony_ci } 6658c2ecf20Sopenharmony_ci md->limit = 0; 6668c2ecf20Sopenharmony_ci } else { 6678c2ecf20Sopenharmony_ci md->base = 0; 6688c2ecf20Sopenharmony_ci md->idx = ARRAY_SIZE(cudbg_region); /* hide it */ 6698c2ecf20Sopenharmony_ci } 6708c2ecf20Sopenharmony_ci md++; 6718c2ecf20Sopenharmony_ci 6728c2ecf20Sopenharmony_ci#define ulp_region(reg) do { \ 6738c2ecf20Sopenharmony_ci md->base = t4_read_reg(padap, ULP_ ## reg ## _LLIMIT_A);\ 6748c2ecf20Sopenharmony_ci (md++)->limit = t4_read_reg(padap, ULP_ ## reg ## _ULIMIT_A);\ 6758c2ecf20Sopenharmony_ci} while (0) 6768c2ecf20Sopenharmony_ci 6778c2ecf20Sopenharmony_ci ulp_region(RX_ISCSI); 6788c2ecf20Sopenharmony_ci ulp_region(RX_TDDP); 6798c2ecf20Sopenharmony_ci ulp_region(TX_TPT); 6808c2ecf20Sopenharmony_ci ulp_region(RX_STAG); 6818c2ecf20Sopenharmony_ci ulp_region(RX_RQ); 6828c2ecf20Sopenharmony_ci ulp_region(RX_RQUDP); 6838c2ecf20Sopenharmony_ci ulp_region(RX_PBL); 6848c2ecf20Sopenharmony_ci ulp_region(TX_PBL); 6858c2ecf20Sopenharmony_ci#undef ulp_region 6868c2ecf20Sopenharmony_ci md->base = 0; 6878c2ecf20Sopenharmony_ci md->idx = ARRAY_SIZE(cudbg_region); 6888c2ecf20Sopenharmony_ci if (!is_t4(padap->params.chip)) { 6898c2ecf20Sopenharmony_ci u32 fifo_size = t4_read_reg(padap, SGE_DBVFIFO_SIZE_A); 6908c2ecf20Sopenharmony_ci u32 sge_ctrl = t4_read_reg(padap, SGE_CONTROL2_A); 6918c2ecf20Sopenharmony_ci u32 size = 0; 6928c2ecf20Sopenharmony_ci 6938c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) { 6948c2ecf20Sopenharmony_ci if (sge_ctrl & VFIFO_ENABLE_F) 6958c2ecf20Sopenharmony_ci size = DBVFIFO_SIZE_G(fifo_size); 6968c2ecf20Sopenharmony_ci } else { 6978c2ecf20Sopenharmony_ci size = T6_DBVFIFO_SIZE_G(fifo_size); 6988c2ecf20Sopenharmony_ci } 6998c2ecf20Sopenharmony_ci 7008c2ecf20Sopenharmony_ci if (size) { 7018c2ecf20Sopenharmony_ci md->base = BASEADDR_G(t4_read_reg(padap, 7028c2ecf20Sopenharmony_ci SGE_DBVFIFO_BADDR_A)); 7038c2ecf20Sopenharmony_ci md->limit = md->base + (size << 2) - 1; 7048c2ecf20Sopenharmony_ci } 7058c2ecf20Sopenharmony_ci } 7068c2ecf20Sopenharmony_ci 7078c2ecf20Sopenharmony_ci md++; 7088c2ecf20Sopenharmony_ci 7098c2ecf20Sopenharmony_ci md->base = t4_read_reg(padap, ULP_RX_CTX_BASE_A); 7108c2ecf20Sopenharmony_ci md->limit = 0; 7118c2ecf20Sopenharmony_ci md++; 7128c2ecf20Sopenharmony_ci md->base = t4_read_reg(padap, ULP_TX_ERR_TABLE_BASE_A); 7138c2ecf20Sopenharmony_ci md->limit = 0; 7148c2ecf20Sopenharmony_ci md++; 7158c2ecf20Sopenharmony_ci 7168c2ecf20Sopenharmony_ci md->base = padap->vres.ocq.start; 7178c2ecf20Sopenharmony_ci if (padap->vres.ocq.size) 7188c2ecf20Sopenharmony_ci md->limit = md->base + padap->vres.ocq.size - 1; 7198c2ecf20Sopenharmony_ci else 7208c2ecf20Sopenharmony_ci md->idx = ARRAY_SIZE(cudbg_region); /* hide it */ 7218c2ecf20Sopenharmony_ci md++; 7228c2ecf20Sopenharmony_ci 7238c2ecf20Sopenharmony_ci /* add any address-space holes, there can be up to 3 */ 7248c2ecf20Sopenharmony_ci for (n = 0; n < i - 1; n++) 7258c2ecf20Sopenharmony_ci if (meminfo_buff->avail[n].limit < 7268c2ecf20Sopenharmony_ci meminfo_buff->avail[n + 1].base) 7278c2ecf20Sopenharmony_ci (md++)->base = meminfo_buff->avail[n].limit; 7288c2ecf20Sopenharmony_ci 7298c2ecf20Sopenharmony_ci if (meminfo_buff->avail[n].limit) 7308c2ecf20Sopenharmony_ci (md++)->base = meminfo_buff->avail[n].limit; 7318c2ecf20Sopenharmony_ci 7328c2ecf20Sopenharmony_ci n = md - meminfo_buff->mem; 7338c2ecf20Sopenharmony_ci meminfo_buff->mem_c = n; 7348c2ecf20Sopenharmony_ci 7358c2ecf20Sopenharmony_ci sort(meminfo_buff->mem, n, sizeof(struct cudbg_mem_desc), 7368c2ecf20Sopenharmony_ci cudbg_mem_desc_cmp, NULL); 7378c2ecf20Sopenharmony_ci 7388c2ecf20Sopenharmony_ci lo = t4_read_reg(padap, CIM_SDRAM_BASE_ADDR_A); 7398c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, CIM_SDRAM_ADDR_SIZE_A) + lo - 1; 7408c2ecf20Sopenharmony_ci meminfo_buff->up_ram_lo = lo; 7418c2ecf20Sopenharmony_ci meminfo_buff->up_ram_hi = hi; 7428c2ecf20Sopenharmony_ci 7438c2ecf20Sopenharmony_ci lo = t4_read_reg(padap, CIM_EXTMEM2_BASE_ADDR_A); 7448c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, CIM_EXTMEM2_ADDR_SIZE_A) + lo - 1; 7458c2ecf20Sopenharmony_ci meminfo_buff->up_extmem2_lo = lo; 7468c2ecf20Sopenharmony_ci meminfo_buff->up_extmem2_hi = hi; 7478c2ecf20Sopenharmony_ci 7488c2ecf20Sopenharmony_ci lo = t4_read_reg(padap, TP_PMM_RX_MAX_PAGE_A); 7498c2ecf20Sopenharmony_ci for (i = 0, meminfo_buff->free_rx_cnt = 0; i < 2; i++) 7508c2ecf20Sopenharmony_ci meminfo_buff->free_rx_cnt += 7518c2ecf20Sopenharmony_ci FREERXPAGECOUNT_G(t4_read_reg(padap, 7528c2ecf20Sopenharmony_ci TP_FLM_FREE_RX_CNT_A)); 7538c2ecf20Sopenharmony_ci 7548c2ecf20Sopenharmony_ci meminfo_buff->rx_pages_data[0] = PMRXMAXPAGE_G(lo); 7558c2ecf20Sopenharmony_ci meminfo_buff->rx_pages_data[1] = 7568c2ecf20Sopenharmony_ci t4_read_reg(padap, TP_PMM_RX_PAGE_SIZE_A) >> 10; 7578c2ecf20Sopenharmony_ci meminfo_buff->rx_pages_data[2] = (lo & PMRXNUMCHN_F) ? 2 : 1; 7588c2ecf20Sopenharmony_ci 7598c2ecf20Sopenharmony_ci lo = t4_read_reg(padap, TP_PMM_TX_MAX_PAGE_A); 7608c2ecf20Sopenharmony_ci hi = t4_read_reg(padap, TP_PMM_TX_PAGE_SIZE_A); 7618c2ecf20Sopenharmony_ci for (i = 0, meminfo_buff->free_tx_cnt = 0; i < 4; i++) 7628c2ecf20Sopenharmony_ci meminfo_buff->free_tx_cnt += 7638c2ecf20Sopenharmony_ci FREETXPAGECOUNT_G(t4_read_reg(padap, 7648c2ecf20Sopenharmony_ci TP_FLM_FREE_TX_CNT_A)); 7658c2ecf20Sopenharmony_ci 7668c2ecf20Sopenharmony_ci meminfo_buff->tx_pages_data[0] = PMTXMAXPAGE_G(lo); 7678c2ecf20Sopenharmony_ci meminfo_buff->tx_pages_data[1] = 7688c2ecf20Sopenharmony_ci hi >= (1 << 20) ? (hi >> 20) : (hi >> 10); 7698c2ecf20Sopenharmony_ci meminfo_buff->tx_pages_data[2] = 7708c2ecf20Sopenharmony_ci hi >= (1 << 20) ? 'M' : 'K'; 7718c2ecf20Sopenharmony_ci meminfo_buff->tx_pages_data[3] = 1 << PMTXNUMCHN_G(lo); 7728c2ecf20Sopenharmony_ci 7738c2ecf20Sopenharmony_ci meminfo_buff->p_structs = t4_read_reg(padap, TP_CMM_MM_MAX_PSTRUCT_A); 7748c2ecf20Sopenharmony_ci meminfo_buff->p_structs_free_cnt = 7758c2ecf20Sopenharmony_ci FREEPSTRUCTCOUNT_G(t4_read_reg(padap, TP_FLM_FREE_PS_CNT_A)); 7768c2ecf20Sopenharmony_ci 7778c2ecf20Sopenharmony_ci for (i = 0; i < 4; i++) { 7788c2ecf20Sopenharmony_ci if (CHELSIO_CHIP_VERSION(padap->params.chip) > CHELSIO_T5) 7798c2ecf20Sopenharmony_ci lo = t4_read_reg(padap, 7808c2ecf20Sopenharmony_ci MPS_RX_MAC_BG_PG_CNT0_A + i * 4); 7818c2ecf20Sopenharmony_ci else 7828c2ecf20Sopenharmony_ci lo = t4_read_reg(padap, MPS_RX_PG_RSV0_A + i * 4); 7838c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) { 7848c2ecf20Sopenharmony_ci used = T5_USED_G(lo); 7858c2ecf20Sopenharmony_ci alloc = T5_ALLOC_G(lo); 7868c2ecf20Sopenharmony_ci } else { 7878c2ecf20Sopenharmony_ci used = USED_G(lo); 7888c2ecf20Sopenharmony_ci alloc = ALLOC_G(lo); 7898c2ecf20Sopenharmony_ci } 7908c2ecf20Sopenharmony_ci meminfo_buff->port_used[i] = used; 7918c2ecf20Sopenharmony_ci meminfo_buff->port_alloc[i] = alloc; 7928c2ecf20Sopenharmony_ci } 7938c2ecf20Sopenharmony_ci 7948c2ecf20Sopenharmony_ci for (i = 0; i < padap->params.arch.nchan; i++) { 7958c2ecf20Sopenharmony_ci if (CHELSIO_CHIP_VERSION(padap->params.chip) > CHELSIO_T5) 7968c2ecf20Sopenharmony_ci lo = t4_read_reg(padap, 7978c2ecf20Sopenharmony_ci MPS_RX_LPBK_BG_PG_CNT0_A + i * 4); 7988c2ecf20Sopenharmony_ci else 7998c2ecf20Sopenharmony_ci lo = t4_read_reg(padap, MPS_RX_PG_RSV4_A + i * 4); 8008c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) { 8018c2ecf20Sopenharmony_ci used = T5_USED_G(lo); 8028c2ecf20Sopenharmony_ci alloc = T5_ALLOC_G(lo); 8038c2ecf20Sopenharmony_ci } else { 8048c2ecf20Sopenharmony_ci used = USED_G(lo); 8058c2ecf20Sopenharmony_ci alloc = ALLOC_G(lo); 8068c2ecf20Sopenharmony_ci } 8078c2ecf20Sopenharmony_ci meminfo_buff->loopback_used[i] = used; 8088c2ecf20Sopenharmony_ci meminfo_buff->loopback_alloc[i] = alloc; 8098c2ecf20Sopenharmony_ci } 8108c2ecf20Sopenharmony_ci 8118c2ecf20Sopenharmony_ci return 0; 8128c2ecf20Sopenharmony_ci} 8138c2ecf20Sopenharmony_ci 8148c2ecf20Sopenharmony_ciint cudbg_collect_reg_dump(struct cudbg_init *pdbg_init, 8158c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 8168c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 8178c2ecf20Sopenharmony_ci{ 8188c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 8198c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 8208c2ecf20Sopenharmony_ci u32 buf_size = 0; 8218c2ecf20Sopenharmony_ci int rc = 0; 8228c2ecf20Sopenharmony_ci 8238c2ecf20Sopenharmony_ci if (is_t4(padap->params.chip)) 8248c2ecf20Sopenharmony_ci buf_size = T4_REGMAP_SIZE; 8258c2ecf20Sopenharmony_ci else if (is_t5(padap->params.chip) || is_t6(padap->params.chip)) 8268c2ecf20Sopenharmony_ci buf_size = T5_REGMAP_SIZE; 8278c2ecf20Sopenharmony_ci 8288c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, buf_size, &temp_buff); 8298c2ecf20Sopenharmony_ci if (rc) 8308c2ecf20Sopenharmony_ci return rc; 8318c2ecf20Sopenharmony_ci t4_get_regs(padap, (void *)temp_buff.data, temp_buff.size); 8328c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 8338c2ecf20Sopenharmony_ci} 8348c2ecf20Sopenharmony_ci 8358c2ecf20Sopenharmony_ciint cudbg_collect_fw_devlog(struct cudbg_init *pdbg_init, 8368c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 8378c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 8388c2ecf20Sopenharmony_ci{ 8398c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 8408c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 8418c2ecf20Sopenharmony_ci struct devlog_params *dparams; 8428c2ecf20Sopenharmony_ci int rc = 0; 8438c2ecf20Sopenharmony_ci 8448c2ecf20Sopenharmony_ci rc = t4_init_devlog_params(padap); 8458c2ecf20Sopenharmony_ci if (rc < 0) { 8468c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 8478c2ecf20Sopenharmony_ci return rc; 8488c2ecf20Sopenharmony_ci } 8498c2ecf20Sopenharmony_ci 8508c2ecf20Sopenharmony_ci dparams = &padap->params.devlog; 8518c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, dparams->size, &temp_buff); 8528c2ecf20Sopenharmony_ci if (rc) 8538c2ecf20Sopenharmony_ci return rc; 8548c2ecf20Sopenharmony_ci 8558c2ecf20Sopenharmony_ci /* Collect FW devlog */ 8568c2ecf20Sopenharmony_ci if (dparams->start != 0) { 8578c2ecf20Sopenharmony_ci spin_lock(&padap->win0_lock); 8588c2ecf20Sopenharmony_ci rc = t4_memory_rw(padap, padap->params.drv_memwin, 8598c2ecf20Sopenharmony_ci dparams->memtype, dparams->start, 8608c2ecf20Sopenharmony_ci dparams->size, 8618c2ecf20Sopenharmony_ci (__be32 *)(char *)temp_buff.data, 8628c2ecf20Sopenharmony_ci 1); 8638c2ecf20Sopenharmony_ci spin_unlock(&padap->win0_lock); 8648c2ecf20Sopenharmony_ci if (rc) { 8658c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 8668c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 8678c2ecf20Sopenharmony_ci return rc; 8688c2ecf20Sopenharmony_ci } 8698c2ecf20Sopenharmony_ci } 8708c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 8718c2ecf20Sopenharmony_ci} 8728c2ecf20Sopenharmony_ci 8738c2ecf20Sopenharmony_ciint cudbg_collect_cim_la(struct cudbg_init *pdbg_init, 8748c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 8758c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 8768c2ecf20Sopenharmony_ci{ 8778c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 8788c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 8798c2ecf20Sopenharmony_ci int size, rc; 8808c2ecf20Sopenharmony_ci u32 cfg = 0; 8818c2ecf20Sopenharmony_ci 8828c2ecf20Sopenharmony_ci if (is_t6(padap->params.chip)) { 8838c2ecf20Sopenharmony_ci size = padap->params.cim_la_size / 10 + 1; 8848c2ecf20Sopenharmony_ci size *= 10 * sizeof(u32); 8858c2ecf20Sopenharmony_ci } else { 8868c2ecf20Sopenharmony_ci size = padap->params.cim_la_size / 8; 8878c2ecf20Sopenharmony_ci size *= 8 * sizeof(u32); 8888c2ecf20Sopenharmony_ci } 8898c2ecf20Sopenharmony_ci 8908c2ecf20Sopenharmony_ci size += sizeof(cfg); 8918c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 8928c2ecf20Sopenharmony_ci if (rc) 8938c2ecf20Sopenharmony_ci return rc; 8948c2ecf20Sopenharmony_ci 8958c2ecf20Sopenharmony_ci rc = t4_cim_read(padap, UP_UP_DBG_LA_CFG_A, 1, &cfg); 8968c2ecf20Sopenharmony_ci if (rc) { 8978c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 8988c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 8998c2ecf20Sopenharmony_ci return rc; 9008c2ecf20Sopenharmony_ci } 9018c2ecf20Sopenharmony_ci 9028c2ecf20Sopenharmony_ci memcpy((char *)temp_buff.data, &cfg, sizeof(cfg)); 9038c2ecf20Sopenharmony_ci rc = t4_cim_read_la(padap, 9048c2ecf20Sopenharmony_ci (u32 *)((char *)temp_buff.data + sizeof(cfg)), 9058c2ecf20Sopenharmony_ci NULL); 9068c2ecf20Sopenharmony_ci if (rc < 0) { 9078c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 9088c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 9098c2ecf20Sopenharmony_ci return rc; 9108c2ecf20Sopenharmony_ci } 9118c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 9128c2ecf20Sopenharmony_ci} 9138c2ecf20Sopenharmony_ci 9148c2ecf20Sopenharmony_ciint cudbg_collect_cim_ma_la(struct cudbg_init *pdbg_init, 9158c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 9168c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 9178c2ecf20Sopenharmony_ci{ 9188c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 9198c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 9208c2ecf20Sopenharmony_ci int size, rc; 9218c2ecf20Sopenharmony_ci 9228c2ecf20Sopenharmony_ci size = 2 * CIM_MALA_SIZE * 5 * sizeof(u32); 9238c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 9248c2ecf20Sopenharmony_ci if (rc) 9258c2ecf20Sopenharmony_ci return rc; 9268c2ecf20Sopenharmony_ci 9278c2ecf20Sopenharmony_ci t4_cim_read_ma_la(padap, 9288c2ecf20Sopenharmony_ci (u32 *)temp_buff.data, 9298c2ecf20Sopenharmony_ci (u32 *)((char *)temp_buff.data + 9308c2ecf20Sopenharmony_ci 5 * CIM_MALA_SIZE)); 9318c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 9328c2ecf20Sopenharmony_ci} 9338c2ecf20Sopenharmony_ci 9348c2ecf20Sopenharmony_ciint cudbg_collect_cim_qcfg(struct cudbg_init *pdbg_init, 9358c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 9368c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 9378c2ecf20Sopenharmony_ci{ 9388c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 9398c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 9408c2ecf20Sopenharmony_ci struct cudbg_cim_qcfg *cim_qcfg_data; 9418c2ecf20Sopenharmony_ci int rc; 9428c2ecf20Sopenharmony_ci 9438c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_cim_qcfg), 9448c2ecf20Sopenharmony_ci &temp_buff); 9458c2ecf20Sopenharmony_ci if (rc) 9468c2ecf20Sopenharmony_ci return rc; 9478c2ecf20Sopenharmony_ci 9488c2ecf20Sopenharmony_ci cim_qcfg_data = (struct cudbg_cim_qcfg *)temp_buff.data; 9498c2ecf20Sopenharmony_ci cim_qcfg_data->chip = padap->params.chip; 9508c2ecf20Sopenharmony_ci rc = t4_cim_read(padap, UP_IBQ_0_RDADDR_A, 9518c2ecf20Sopenharmony_ci ARRAY_SIZE(cim_qcfg_data->stat), cim_qcfg_data->stat); 9528c2ecf20Sopenharmony_ci if (rc) { 9538c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 9548c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 9558c2ecf20Sopenharmony_ci return rc; 9568c2ecf20Sopenharmony_ci } 9578c2ecf20Sopenharmony_ci 9588c2ecf20Sopenharmony_ci rc = t4_cim_read(padap, UP_OBQ_0_REALADDR_A, 9598c2ecf20Sopenharmony_ci ARRAY_SIZE(cim_qcfg_data->obq_wr), 9608c2ecf20Sopenharmony_ci cim_qcfg_data->obq_wr); 9618c2ecf20Sopenharmony_ci if (rc) { 9628c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 9638c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 9648c2ecf20Sopenharmony_ci return rc; 9658c2ecf20Sopenharmony_ci } 9668c2ecf20Sopenharmony_ci 9678c2ecf20Sopenharmony_ci t4_read_cimq_cfg(padap, cim_qcfg_data->base, cim_qcfg_data->size, 9688c2ecf20Sopenharmony_ci cim_qcfg_data->thres); 9698c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 9708c2ecf20Sopenharmony_ci} 9718c2ecf20Sopenharmony_ci 9728c2ecf20Sopenharmony_cistatic int cudbg_read_cim_ibq(struct cudbg_init *pdbg_init, 9738c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 9748c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err, int qid) 9758c2ecf20Sopenharmony_ci{ 9768c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 9778c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 9788c2ecf20Sopenharmony_ci int no_of_read_words, rc = 0; 9798c2ecf20Sopenharmony_ci u32 qsize; 9808c2ecf20Sopenharmony_ci 9818c2ecf20Sopenharmony_ci /* collect CIM IBQ */ 9828c2ecf20Sopenharmony_ci qsize = CIM_IBQ_SIZE * 4 * sizeof(u32); 9838c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, qsize, &temp_buff); 9848c2ecf20Sopenharmony_ci if (rc) 9858c2ecf20Sopenharmony_ci return rc; 9868c2ecf20Sopenharmony_ci 9878c2ecf20Sopenharmony_ci /* t4_read_cim_ibq will return no. of read words or error */ 9888c2ecf20Sopenharmony_ci no_of_read_words = t4_read_cim_ibq(padap, qid, 9898c2ecf20Sopenharmony_ci (u32 *)temp_buff.data, qsize); 9908c2ecf20Sopenharmony_ci /* no_of_read_words is less than or equal to 0 means error */ 9918c2ecf20Sopenharmony_ci if (no_of_read_words <= 0) { 9928c2ecf20Sopenharmony_ci if (!no_of_read_words) 9938c2ecf20Sopenharmony_ci rc = CUDBG_SYSTEM_ERROR; 9948c2ecf20Sopenharmony_ci else 9958c2ecf20Sopenharmony_ci rc = no_of_read_words; 9968c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 9978c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 9988c2ecf20Sopenharmony_ci return rc; 9998c2ecf20Sopenharmony_ci } 10008c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 10018c2ecf20Sopenharmony_ci} 10028c2ecf20Sopenharmony_ci 10038c2ecf20Sopenharmony_ciint cudbg_collect_cim_ibq_tp0(struct cudbg_init *pdbg_init, 10048c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 10058c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 10068c2ecf20Sopenharmony_ci{ 10078c2ecf20Sopenharmony_ci return cudbg_read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, 0); 10088c2ecf20Sopenharmony_ci} 10098c2ecf20Sopenharmony_ci 10108c2ecf20Sopenharmony_ciint cudbg_collect_cim_ibq_tp1(struct cudbg_init *pdbg_init, 10118c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 10128c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 10138c2ecf20Sopenharmony_ci{ 10148c2ecf20Sopenharmony_ci return cudbg_read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, 1); 10158c2ecf20Sopenharmony_ci} 10168c2ecf20Sopenharmony_ci 10178c2ecf20Sopenharmony_ciint cudbg_collect_cim_ibq_ulp(struct cudbg_init *pdbg_init, 10188c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 10198c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 10208c2ecf20Sopenharmony_ci{ 10218c2ecf20Sopenharmony_ci return cudbg_read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, 2); 10228c2ecf20Sopenharmony_ci} 10238c2ecf20Sopenharmony_ci 10248c2ecf20Sopenharmony_ciint cudbg_collect_cim_ibq_sge0(struct cudbg_init *pdbg_init, 10258c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 10268c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 10278c2ecf20Sopenharmony_ci{ 10288c2ecf20Sopenharmony_ci return cudbg_read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, 3); 10298c2ecf20Sopenharmony_ci} 10308c2ecf20Sopenharmony_ci 10318c2ecf20Sopenharmony_ciint cudbg_collect_cim_ibq_sge1(struct cudbg_init *pdbg_init, 10328c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 10338c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 10348c2ecf20Sopenharmony_ci{ 10358c2ecf20Sopenharmony_ci return cudbg_read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, 4); 10368c2ecf20Sopenharmony_ci} 10378c2ecf20Sopenharmony_ci 10388c2ecf20Sopenharmony_ciint cudbg_collect_cim_ibq_ncsi(struct cudbg_init *pdbg_init, 10398c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 10408c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 10418c2ecf20Sopenharmony_ci{ 10428c2ecf20Sopenharmony_ci return cudbg_read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, 5); 10438c2ecf20Sopenharmony_ci} 10448c2ecf20Sopenharmony_ci 10458c2ecf20Sopenharmony_ciu32 cudbg_cim_obq_size(struct adapter *padap, int qid) 10468c2ecf20Sopenharmony_ci{ 10478c2ecf20Sopenharmony_ci u32 value; 10488c2ecf20Sopenharmony_ci 10498c2ecf20Sopenharmony_ci t4_write_reg(padap, CIM_QUEUE_CONFIG_REF_A, OBQSELECT_F | 10508c2ecf20Sopenharmony_ci QUENUMSELECT_V(qid)); 10518c2ecf20Sopenharmony_ci value = t4_read_reg(padap, CIM_QUEUE_CONFIG_CTRL_A); 10528c2ecf20Sopenharmony_ci value = CIMQSIZE_G(value) * 64; /* size in number of words */ 10538c2ecf20Sopenharmony_ci return value * sizeof(u32); 10548c2ecf20Sopenharmony_ci} 10558c2ecf20Sopenharmony_ci 10568c2ecf20Sopenharmony_cistatic int cudbg_read_cim_obq(struct cudbg_init *pdbg_init, 10578c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 10588c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err, int qid) 10598c2ecf20Sopenharmony_ci{ 10608c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 10618c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 10628c2ecf20Sopenharmony_ci int no_of_read_words, rc = 0; 10638c2ecf20Sopenharmony_ci u32 qsize; 10648c2ecf20Sopenharmony_ci 10658c2ecf20Sopenharmony_ci /* collect CIM OBQ */ 10668c2ecf20Sopenharmony_ci qsize = cudbg_cim_obq_size(padap, qid); 10678c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, qsize, &temp_buff); 10688c2ecf20Sopenharmony_ci if (rc) 10698c2ecf20Sopenharmony_ci return rc; 10708c2ecf20Sopenharmony_ci 10718c2ecf20Sopenharmony_ci /* t4_read_cim_obq will return no. of read words or error */ 10728c2ecf20Sopenharmony_ci no_of_read_words = t4_read_cim_obq(padap, qid, 10738c2ecf20Sopenharmony_ci (u32 *)temp_buff.data, qsize); 10748c2ecf20Sopenharmony_ci /* no_of_read_words is less than or equal to 0 means error */ 10758c2ecf20Sopenharmony_ci if (no_of_read_words <= 0) { 10768c2ecf20Sopenharmony_ci if (!no_of_read_words) 10778c2ecf20Sopenharmony_ci rc = CUDBG_SYSTEM_ERROR; 10788c2ecf20Sopenharmony_ci else 10798c2ecf20Sopenharmony_ci rc = no_of_read_words; 10808c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 10818c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 10828c2ecf20Sopenharmony_ci return rc; 10838c2ecf20Sopenharmony_ci } 10848c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 10858c2ecf20Sopenharmony_ci} 10868c2ecf20Sopenharmony_ci 10878c2ecf20Sopenharmony_ciint cudbg_collect_cim_obq_ulp0(struct cudbg_init *pdbg_init, 10888c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 10898c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 10908c2ecf20Sopenharmony_ci{ 10918c2ecf20Sopenharmony_ci return cudbg_read_cim_obq(pdbg_init, dbg_buff, cudbg_err, 0); 10928c2ecf20Sopenharmony_ci} 10938c2ecf20Sopenharmony_ci 10948c2ecf20Sopenharmony_ciint cudbg_collect_cim_obq_ulp1(struct cudbg_init *pdbg_init, 10958c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 10968c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 10978c2ecf20Sopenharmony_ci{ 10988c2ecf20Sopenharmony_ci return cudbg_read_cim_obq(pdbg_init, dbg_buff, cudbg_err, 1); 10998c2ecf20Sopenharmony_ci} 11008c2ecf20Sopenharmony_ci 11018c2ecf20Sopenharmony_ciint cudbg_collect_cim_obq_ulp2(struct cudbg_init *pdbg_init, 11028c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 11038c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 11048c2ecf20Sopenharmony_ci{ 11058c2ecf20Sopenharmony_ci return cudbg_read_cim_obq(pdbg_init, dbg_buff, cudbg_err, 2); 11068c2ecf20Sopenharmony_ci} 11078c2ecf20Sopenharmony_ci 11088c2ecf20Sopenharmony_ciint cudbg_collect_cim_obq_ulp3(struct cudbg_init *pdbg_init, 11098c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 11108c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 11118c2ecf20Sopenharmony_ci{ 11128c2ecf20Sopenharmony_ci return cudbg_read_cim_obq(pdbg_init, dbg_buff, cudbg_err, 3); 11138c2ecf20Sopenharmony_ci} 11148c2ecf20Sopenharmony_ci 11158c2ecf20Sopenharmony_ciint cudbg_collect_cim_obq_sge(struct cudbg_init *pdbg_init, 11168c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 11178c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 11188c2ecf20Sopenharmony_ci{ 11198c2ecf20Sopenharmony_ci return cudbg_read_cim_obq(pdbg_init, dbg_buff, cudbg_err, 4); 11208c2ecf20Sopenharmony_ci} 11218c2ecf20Sopenharmony_ci 11228c2ecf20Sopenharmony_ciint cudbg_collect_cim_obq_ncsi(struct cudbg_init *pdbg_init, 11238c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 11248c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 11258c2ecf20Sopenharmony_ci{ 11268c2ecf20Sopenharmony_ci return cudbg_read_cim_obq(pdbg_init, dbg_buff, cudbg_err, 5); 11278c2ecf20Sopenharmony_ci} 11288c2ecf20Sopenharmony_ci 11298c2ecf20Sopenharmony_ciint cudbg_collect_obq_sge_rx_q0(struct cudbg_init *pdbg_init, 11308c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 11318c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 11328c2ecf20Sopenharmony_ci{ 11338c2ecf20Sopenharmony_ci return cudbg_read_cim_obq(pdbg_init, dbg_buff, cudbg_err, 6); 11348c2ecf20Sopenharmony_ci} 11358c2ecf20Sopenharmony_ci 11368c2ecf20Sopenharmony_ciint cudbg_collect_obq_sge_rx_q1(struct cudbg_init *pdbg_init, 11378c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 11388c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 11398c2ecf20Sopenharmony_ci{ 11408c2ecf20Sopenharmony_ci return cudbg_read_cim_obq(pdbg_init, dbg_buff, cudbg_err, 7); 11418c2ecf20Sopenharmony_ci} 11428c2ecf20Sopenharmony_ci 11438c2ecf20Sopenharmony_cistatic int cudbg_meminfo_get_mem_index(struct adapter *padap, 11448c2ecf20Sopenharmony_ci struct cudbg_meminfo *mem_info, 11458c2ecf20Sopenharmony_ci u8 mem_type, u8 *idx) 11468c2ecf20Sopenharmony_ci{ 11478c2ecf20Sopenharmony_ci u8 i, flag; 11488c2ecf20Sopenharmony_ci 11498c2ecf20Sopenharmony_ci switch (mem_type) { 11508c2ecf20Sopenharmony_ci case MEM_EDC0: 11518c2ecf20Sopenharmony_ci flag = EDC0_FLAG; 11528c2ecf20Sopenharmony_ci break; 11538c2ecf20Sopenharmony_ci case MEM_EDC1: 11548c2ecf20Sopenharmony_ci flag = EDC1_FLAG; 11558c2ecf20Sopenharmony_ci break; 11568c2ecf20Sopenharmony_ci case MEM_MC0: 11578c2ecf20Sopenharmony_ci /* Some T5 cards have both MC0 and MC1. */ 11588c2ecf20Sopenharmony_ci flag = is_t5(padap->params.chip) ? MC0_FLAG : MC_FLAG; 11598c2ecf20Sopenharmony_ci break; 11608c2ecf20Sopenharmony_ci case MEM_MC1: 11618c2ecf20Sopenharmony_ci flag = MC1_FLAG; 11628c2ecf20Sopenharmony_ci break; 11638c2ecf20Sopenharmony_ci case MEM_HMA: 11648c2ecf20Sopenharmony_ci flag = HMA_FLAG; 11658c2ecf20Sopenharmony_ci break; 11668c2ecf20Sopenharmony_ci default: 11678c2ecf20Sopenharmony_ci return CUDBG_STATUS_ENTITY_NOT_FOUND; 11688c2ecf20Sopenharmony_ci } 11698c2ecf20Sopenharmony_ci 11708c2ecf20Sopenharmony_ci for (i = 0; i < mem_info->avail_c; i++) { 11718c2ecf20Sopenharmony_ci if (mem_info->avail[i].idx == flag) { 11728c2ecf20Sopenharmony_ci *idx = i; 11738c2ecf20Sopenharmony_ci return 0; 11748c2ecf20Sopenharmony_ci } 11758c2ecf20Sopenharmony_ci } 11768c2ecf20Sopenharmony_ci 11778c2ecf20Sopenharmony_ci return CUDBG_STATUS_ENTITY_NOT_FOUND; 11788c2ecf20Sopenharmony_ci} 11798c2ecf20Sopenharmony_ci 11808c2ecf20Sopenharmony_ci/* Fetch the @region_name's start and end from @meminfo. */ 11818c2ecf20Sopenharmony_cistatic int cudbg_get_mem_region(struct adapter *padap, 11828c2ecf20Sopenharmony_ci struct cudbg_meminfo *meminfo, 11838c2ecf20Sopenharmony_ci u8 mem_type, const char *region_name, 11848c2ecf20Sopenharmony_ci struct cudbg_mem_desc *mem_desc) 11858c2ecf20Sopenharmony_ci{ 11868c2ecf20Sopenharmony_ci u8 mc, found = 0; 11878c2ecf20Sopenharmony_ci u32 idx = 0; 11888c2ecf20Sopenharmony_ci int rc, i; 11898c2ecf20Sopenharmony_ci 11908c2ecf20Sopenharmony_ci rc = cudbg_meminfo_get_mem_index(padap, meminfo, mem_type, &mc); 11918c2ecf20Sopenharmony_ci if (rc) 11928c2ecf20Sopenharmony_ci return rc; 11938c2ecf20Sopenharmony_ci 11948c2ecf20Sopenharmony_ci i = match_string(cudbg_region, ARRAY_SIZE(cudbg_region), region_name); 11958c2ecf20Sopenharmony_ci if (i < 0) 11968c2ecf20Sopenharmony_ci return -EINVAL; 11978c2ecf20Sopenharmony_ci 11988c2ecf20Sopenharmony_ci idx = i; 11998c2ecf20Sopenharmony_ci for (i = 0; i < meminfo->mem_c; i++) { 12008c2ecf20Sopenharmony_ci if (meminfo->mem[i].idx >= ARRAY_SIZE(cudbg_region)) 12018c2ecf20Sopenharmony_ci continue; /* Skip holes */ 12028c2ecf20Sopenharmony_ci 12038c2ecf20Sopenharmony_ci if (!(meminfo->mem[i].limit)) 12048c2ecf20Sopenharmony_ci meminfo->mem[i].limit = 12058c2ecf20Sopenharmony_ci i < meminfo->mem_c - 1 ? 12068c2ecf20Sopenharmony_ci meminfo->mem[i + 1].base - 1 : ~0; 12078c2ecf20Sopenharmony_ci 12088c2ecf20Sopenharmony_ci if (meminfo->mem[i].idx == idx) { 12098c2ecf20Sopenharmony_ci /* Check if the region exists in @mem_type memory */ 12108c2ecf20Sopenharmony_ci if (meminfo->mem[i].base < meminfo->avail[mc].base && 12118c2ecf20Sopenharmony_ci meminfo->mem[i].limit < meminfo->avail[mc].base) 12128c2ecf20Sopenharmony_ci return -EINVAL; 12138c2ecf20Sopenharmony_ci 12148c2ecf20Sopenharmony_ci if (meminfo->mem[i].base > meminfo->avail[mc].limit) 12158c2ecf20Sopenharmony_ci return -EINVAL; 12168c2ecf20Sopenharmony_ci 12178c2ecf20Sopenharmony_ci memcpy(mem_desc, &meminfo->mem[i], 12188c2ecf20Sopenharmony_ci sizeof(struct cudbg_mem_desc)); 12198c2ecf20Sopenharmony_ci found = 1; 12208c2ecf20Sopenharmony_ci break; 12218c2ecf20Sopenharmony_ci } 12228c2ecf20Sopenharmony_ci } 12238c2ecf20Sopenharmony_ci if (!found) 12248c2ecf20Sopenharmony_ci return -EINVAL; 12258c2ecf20Sopenharmony_ci 12268c2ecf20Sopenharmony_ci return 0; 12278c2ecf20Sopenharmony_ci} 12288c2ecf20Sopenharmony_ci 12298c2ecf20Sopenharmony_ci/* Fetch and update the start and end of the requested memory region w.r.t 0 12308c2ecf20Sopenharmony_ci * in the corresponding EDC/MC/HMA. 12318c2ecf20Sopenharmony_ci */ 12328c2ecf20Sopenharmony_cistatic int cudbg_get_mem_relative(struct adapter *padap, 12338c2ecf20Sopenharmony_ci struct cudbg_meminfo *meminfo, 12348c2ecf20Sopenharmony_ci u8 mem_type, u32 *out_base, u32 *out_end) 12358c2ecf20Sopenharmony_ci{ 12368c2ecf20Sopenharmony_ci u8 mc_idx; 12378c2ecf20Sopenharmony_ci int rc; 12388c2ecf20Sopenharmony_ci 12398c2ecf20Sopenharmony_ci rc = cudbg_meminfo_get_mem_index(padap, meminfo, mem_type, &mc_idx); 12408c2ecf20Sopenharmony_ci if (rc) 12418c2ecf20Sopenharmony_ci return rc; 12428c2ecf20Sopenharmony_ci 12438c2ecf20Sopenharmony_ci if (*out_base < meminfo->avail[mc_idx].base) 12448c2ecf20Sopenharmony_ci *out_base = 0; 12458c2ecf20Sopenharmony_ci else 12468c2ecf20Sopenharmony_ci *out_base -= meminfo->avail[mc_idx].base; 12478c2ecf20Sopenharmony_ci 12488c2ecf20Sopenharmony_ci if (*out_end > meminfo->avail[mc_idx].limit) 12498c2ecf20Sopenharmony_ci *out_end = meminfo->avail[mc_idx].limit; 12508c2ecf20Sopenharmony_ci else 12518c2ecf20Sopenharmony_ci *out_end -= meminfo->avail[mc_idx].base; 12528c2ecf20Sopenharmony_ci 12538c2ecf20Sopenharmony_ci return 0; 12548c2ecf20Sopenharmony_ci} 12558c2ecf20Sopenharmony_ci 12568c2ecf20Sopenharmony_ci/* Get TX and RX Payload region */ 12578c2ecf20Sopenharmony_cistatic int cudbg_get_payload_range(struct adapter *padap, u8 mem_type, 12588c2ecf20Sopenharmony_ci const char *region_name, 12598c2ecf20Sopenharmony_ci struct cudbg_region_info *payload) 12608c2ecf20Sopenharmony_ci{ 12618c2ecf20Sopenharmony_ci struct cudbg_mem_desc mem_desc = { 0 }; 12628c2ecf20Sopenharmony_ci struct cudbg_meminfo meminfo; 12638c2ecf20Sopenharmony_ci int rc; 12648c2ecf20Sopenharmony_ci 12658c2ecf20Sopenharmony_ci rc = cudbg_fill_meminfo(padap, &meminfo); 12668c2ecf20Sopenharmony_ci if (rc) 12678c2ecf20Sopenharmony_ci return rc; 12688c2ecf20Sopenharmony_ci 12698c2ecf20Sopenharmony_ci rc = cudbg_get_mem_region(padap, &meminfo, mem_type, region_name, 12708c2ecf20Sopenharmony_ci &mem_desc); 12718c2ecf20Sopenharmony_ci if (rc) { 12728c2ecf20Sopenharmony_ci payload->exist = false; 12738c2ecf20Sopenharmony_ci return 0; 12748c2ecf20Sopenharmony_ci } 12758c2ecf20Sopenharmony_ci 12768c2ecf20Sopenharmony_ci payload->exist = true; 12778c2ecf20Sopenharmony_ci payload->start = mem_desc.base; 12788c2ecf20Sopenharmony_ci payload->end = mem_desc.limit; 12798c2ecf20Sopenharmony_ci 12808c2ecf20Sopenharmony_ci return cudbg_get_mem_relative(padap, &meminfo, mem_type, 12818c2ecf20Sopenharmony_ci &payload->start, &payload->end); 12828c2ecf20Sopenharmony_ci} 12838c2ecf20Sopenharmony_ci 12848c2ecf20Sopenharmony_cistatic int cudbg_memory_read(struct cudbg_init *pdbg_init, int win, 12858c2ecf20Sopenharmony_ci int mtype, u32 addr, u32 len, void *hbuf) 12868c2ecf20Sopenharmony_ci{ 12878c2ecf20Sopenharmony_ci u32 win_pf, memoffset, mem_aperture, mem_base; 12888c2ecf20Sopenharmony_ci struct adapter *adap = pdbg_init->adap; 12898c2ecf20Sopenharmony_ci u32 pos, offset, resid; 12908c2ecf20Sopenharmony_ci u32 *res_buf; 12918c2ecf20Sopenharmony_ci u64 *buf; 12928c2ecf20Sopenharmony_ci int ret; 12938c2ecf20Sopenharmony_ci 12948c2ecf20Sopenharmony_ci /* Argument sanity checks ... 12958c2ecf20Sopenharmony_ci */ 12968c2ecf20Sopenharmony_ci if (addr & 0x3 || (uintptr_t)hbuf & 0x3) 12978c2ecf20Sopenharmony_ci return -EINVAL; 12988c2ecf20Sopenharmony_ci 12998c2ecf20Sopenharmony_ci buf = (u64 *)hbuf; 13008c2ecf20Sopenharmony_ci 13018c2ecf20Sopenharmony_ci /* Try to do 64-bit reads. Residual will be handled later. */ 13028c2ecf20Sopenharmony_ci resid = len & 0x7; 13038c2ecf20Sopenharmony_ci len -= resid; 13048c2ecf20Sopenharmony_ci 13058c2ecf20Sopenharmony_ci ret = t4_memory_rw_init(adap, win, mtype, &memoffset, &mem_base, 13068c2ecf20Sopenharmony_ci &mem_aperture); 13078c2ecf20Sopenharmony_ci if (ret) 13088c2ecf20Sopenharmony_ci return ret; 13098c2ecf20Sopenharmony_ci 13108c2ecf20Sopenharmony_ci addr = addr + memoffset; 13118c2ecf20Sopenharmony_ci win_pf = is_t4(adap->params.chip) ? 0 : PFNUM_V(adap->pf); 13128c2ecf20Sopenharmony_ci 13138c2ecf20Sopenharmony_ci pos = addr & ~(mem_aperture - 1); 13148c2ecf20Sopenharmony_ci offset = addr - pos; 13158c2ecf20Sopenharmony_ci 13168c2ecf20Sopenharmony_ci /* Set up initial PCI-E Memory Window to cover the start of our 13178c2ecf20Sopenharmony_ci * transfer. 13188c2ecf20Sopenharmony_ci */ 13198c2ecf20Sopenharmony_ci t4_memory_update_win(adap, win, pos | win_pf); 13208c2ecf20Sopenharmony_ci 13218c2ecf20Sopenharmony_ci /* Transfer data from the adapter */ 13228c2ecf20Sopenharmony_ci while (len > 0) { 13238c2ecf20Sopenharmony_ci *buf++ = le64_to_cpu((__force __le64) 13248c2ecf20Sopenharmony_ci t4_read_reg64(adap, mem_base + offset)); 13258c2ecf20Sopenharmony_ci offset += sizeof(u64); 13268c2ecf20Sopenharmony_ci len -= sizeof(u64); 13278c2ecf20Sopenharmony_ci 13288c2ecf20Sopenharmony_ci /* If we've reached the end of our current window aperture, 13298c2ecf20Sopenharmony_ci * move the PCI-E Memory Window on to the next. 13308c2ecf20Sopenharmony_ci */ 13318c2ecf20Sopenharmony_ci if (offset == mem_aperture) { 13328c2ecf20Sopenharmony_ci pos += mem_aperture; 13338c2ecf20Sopenharmony_ci offset = 0; 13348c2ecf20Sopenharmony_ci t4_memory_update_win(adap, win, pos | win_pf); 13358c2ecf20Sopenharmony_ci } 13368c2ecf20Sopenharmony_ci } 13378c2ecf20Sopenharmony_ci 13388c2ecf20Sopenharmony_ci res_buf = (u32 *)buf; 13398c2ecf20Sopenharmony_ci /* Read residual in 32-bit multiples */ 13408c2ecf20Sopenharmony_ci while (resid > sizeof(u32)) { 13418c2ecf20Sopenharmony_ci *res_buf++ = le32_to_cpu((__force __le32) 13428c2ecf20Sopenharmony_ci t4_read_reg(adap, mem_base + offset)); 13438c2ecf20Sopenharmony_ci offset += sizeof(u32); 13448c2ecf20Sopenharmony_ci resid -= sizeof(u32); 13458c2ecf20Sopenharmony_ci 13468c2ecf20Sopenharmony_ci /* If we've reached the end of our current window aperture, 13478c2ecf20Sopenharmony_ci * move the PCI-E Memory Window on to the next. 13488c2ecf20Sopenharmony_ci */ 13498c2ecf20Sopenharmony_ci if (offset == mem_aperture) { 13508c2ecf20Sopenharmony_ci pos += mem_aperture; 13518c2ecf20Sopenharmony_ci offset = 0; 13528c2ecf20Sopenharmony_ci t4_memory_update_win(adap, win, pos | win_pf); 13538c2ecf20Sopenharmony_ci } 13548c2ecf20Sopenharmony_ci } 13558c2ecf20Sopenharmony_ci 13568c2ecf20Sopenharmony_ci /* Transfer residual < 32-bits */ 13578c2ecf20Sopenharmony_ci if (resid) 13588c2ecf20Sopenharmony_ci t4_memory_rw_residual(adap, resid, mem_base + offset, 13598c2ecf20Sopenharmony_ci (u8 *)res_buf, T4_MEMORY_READ); 13608c2ecf20Sopenharmony_ci 13618c2ecf20Sopenharmony_ci return 0; 13628c2ecf20Sopenharmony_ci} 13638c2ecf20Sopenharmony_ci 13648c2ecf20Sopenharmony_ci#define CUDBG_YIELD_ITERATION 256 13658c2ecf20Sopenharmony_ci 13668c2ecf20Sopenharmony_cistatic int cudbg_read_fw_mem(struct cudbg_init *pdbg_init, 13678c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, u8 mem_type, 13688c2ecf20Sopenharmony_ci unsigned long tot_len, 13698c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 13708c2ecf20Sopenharmony_ci{ 13718c2ecf20Sopenharmony_ci static const char * const region_name[] = { "Tx payload:", 13728c2ecf20Sopenharmony_ci "Rx payload:" }; 13738c2ecf20Sopenharmony_ci unsigned long bytes, bytes_left, bytes_read = 0; 13748c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 13758c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 13768c2ecf20Sopenharmony_ci struct cudbg_region_info payload[2]; 13778c2ecf20Sopenharmony_ci u32 yield_count = 0; 13788c2ecf20Sopenharmony_ci int rc = 0; 13798c2ecf20Sopenharmony_ci u8 i; 13808c2ecf20Sopenharmony_ci 13818c2ecf20Sopenharmony_ci /* Get TX/RX Payload region range if they exist */ 13828c2ecf20Sopenharmony_ci memset(payload, 0, sizeof(payload)); 13838c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(region_name); i++) { 13848c2ecf20Sopenharmony_ci rc = cudbg_get_payload_range(padap, mem_type, region_name[i], 13858c2ecf20Sopenharmony_ci &payload[i]); 13868c2ecf20Sopenharmony_ci if (rc) 13878c2ecf20Sopenharmony_ci return rc; 13888c2ecf20Sopenharmony_ci 13898c2ecf20Sopenharmony_ci if (payload[i].exist) { 13908c2ecf20Sopenharmony_ci /* Align start and end to avoid wrap around */ 13918c2ecf20Sopenharmony_ci payload[i].start = roundup(payload[i].start, 13928c2ecf20Sopenharmony_ci CUDBG_CHUNK_SIZE); 13938c2ecf20Sopenharmony_ci payload[i].end = rounddown(payload[i].end, 13948c2ecf20Sopenharmony_ci CUDBG_CHUNK_SIZE); 13958c2ecf20Sopenharmony_ci } 13968c2ecf20Sopenharmony_ci } 13978c2ecf20Sopenharmony_ci 13988c2ecf20Sopenharmony_ci bytes_left = tot_len; 13998c2ecf20Sopenharmony_ci while (bytes_left > 0) { 14008c2ecf20Sopenharmony_ci /* As MC size is huge and read through PIO access, this 14018c2ecf20Sopenharmony_ci * loop will hold cpu for a longer time. OS may think that 14028c2ecf20Sopenharmony_ci * the process is hanged and will generate CPU stall traces. 14038c2ecf20Sopenharmony_ci * So yield the cpu regularly. 14048c2ecf20Sopenharmony_ci */ 14058c2ecf20Sopenharmony_ci yield_count++; 14068c2ecf20Sopenharmony_ci if (!(yield_count % CUDBG_YIELD_ITERATION)) 14078c2ecf20Sopenharmony_ci schedule(); 14088c2ecf20Sopenharmony_ci 14098c2ecf20Sopenharmony_ci bytes = min_t(unsigned long, bytes_left, 14108c2ecf20Sopenharmony_ci (unsigned long)CUDBG_CHUNK_SIZE); 14118c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, bytes, &temp_buff); 14128c2ecf20Sopenharmony_ci if (rc) 14138c2ecf20Sopenharmony_ci return rc; 14148c2ecf20Sopenharmony_ci 14158c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(payload); i++) 14168c2ecf20Sopenharmony_ci if (payload[i].exist && 14178c2ecf20Sopenharmony_ci bytes_read >= payload[i].start && 14188c2ecf20Sopenharmony_ci bytes_read + bytes <= payload[i].end) 14198c2ecf20Sopenharmony_ci /* TX and RX Payload regions can't overlap */ 14208c2ecf20Sopenharmony_ci goto skip_read; 14218c2ecf20Sopenharmony_ci 14228c2ecf20Sopenharmony_ci spin_lock(&padap->win0_lock); 14238c2ecf20Sopenharmony_ci rc = cudbg_memory_read(pdbg_init, MEMWIN_NIC, mem_type, 14248c2ecf20Sopenharmony_ci bytes_read, bytes, temp_buff.data); 14258c2ecf20Sopenharmony_ci spin_unlock(&padap->win0_lock); 14268c2ecf20Sopenharmony_ci if (rc) { 14278c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 14288c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 14298c2ecf20Sopenharmony_ci return rc; 14308c2ecf20Sopenharmony_ci } 14318c2ecf20Sopenharmony_ci 14328c2ecf20Sopenharmony_ciskip_read: 14338c2ecf20Sopenharmony_ci bytes_left -= bytes; 14348c2ecf20Sopenharmony_ci bytes_read += bytes; 14358c2ecf20Sopenharmony_ci rc = cudbg_write_and_release_buff(pdbg_init, &temp_buff, 14368c2ecf20Sopenharmony_ci dbg_buff); 14378c2ecf20Sopenharmony_ci if (rc) { 14388c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 14398c2ecf20Sopenharmony_ci return rc; 14408c2ecf20Sopenharmony_ci } 14418c2ecf20Sopenharmony_ci } 14428c2ecf20Sopenharmony_ci return rc; 14438c2ecf20Sopenharmony_ci} 14448c2ecf20Sopenharmony_ci 14458c2ecf20Sopenharmony_cistatic void cudbg_t4_fwcache(struct cudbg_init *pdbg_init, 14468c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 14478c2ecf20Sopenharmony_ci{ 14488c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 14498c2ecf20Sopenharmony_ci int rc; 14508c2ecf20Sopenharmony_ci 14518c2ecf20Sopenharmony_ci if (is_fw_attached(pdbg_init)) { 14528c2ecf20Sopenharmony_ci /* Flush uP dcache before reading edcX/mcX */ 14538c2ecf20Sopenharmony_ci rc = t4_fwcache(padap, FW_PARAM_DEV_FWCACHE_FLUSH); 14548c2ecf20Sopenharmony_ci if (rc) 14558c2ecf20Sopenharmony_ci cudbg_err->sys_warn = rc; 14568c2ecf20Sopenharmony_ci } 14578c2ecf20Sopenharmony_ci} 14588c2ecf20Sopenharmony_ci 14598c2ecf20Sopenharmony_cistatic int cudbg_mem_region_size(struct cudbg_init *pdbg_init, 14608c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err, 14618c2ecf20Sopenharmony_ci u8 mem_type, unsigned long *region_size) 14628c2ecf20Sopenharmony_ci{ 14638c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 14648c2ecf20Sopenharmony_ci struct cudbg_meminfo mem_info; 14658c2ecf20Sopenharmony_ci u8 mc_idx; 14668c2ecf20Sopenharmony_ci int rc; 14678c2ecf20Sopenharmony_ci 14688c2ecf20Sopenharmony_ci memset(&mem_info, 0, sizeof(struct cudbg_meminfo)); 14698c2ecf20Sopenharmony_ci rc = cudbg_fill_meminfo(padap, &mem_info); 14708c2ecf20Sopenharmony_ci if (rc) { 14718c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 14728c2ecf20Sopenharmony_ci return rc; 14738c2ecf20Sopenharmony_ci } 14748c2ecf20Sopenharmony_ci 14758c2ecf20Sopenharmony_ci cudbg_t4_fwcache(pdbg_init, cudbg_err); 14768c2ecf20Sopenharmony_ci rc = cudbg_meminfo_get_mem_index(padap, &mem_info, mem_type, &mc_idx); 14778c2ecf20Sopenharmony_ci if (rc) { 14788c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 14798c2ecf20Sopenharmony_ci return rc; 14808c2ecf20Sopenharmony_ci } 14818c2ecf20Sopenharmony_ci 14828c2ecf20Sopenharmony_ci if (region_size) 14838c2ecf20Sopenharmony_ci *region_size = mem_info.avail[mc_idx].limit - 14848c2ecf20Sopenharmony_ci mem_info.avail[mc_idx].base; 14858c2ecf20Sopenharmony_ci 14868c2ecf20Sopenharmony_ci return 0; 14878c2ecf20Sopenharmony_ci} 14888c2ecf20Sopenharmony_ci 14898c2ecf20Sopenharmony_cistatic int cudbg_collect_mem_region(struct cudbg_init *pdbg_init, 14908c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 14918c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err, 14928c2ecf20Sopenharmony_ci u8 mem_type) 14938c2ecf20Sopenharmony_ci{ 14948c2ecf20Sopenharmony_ci unsigned long size = 0; 14958c2ecf20Sopenharmony_ci int rc; 14968c2ecf20Sopenharmony_ci 14978c2ecf20Sopenharmony_ci rc = cudbg_mem_region_size(pdbg_init, cudbg_err, mem_type, &size); 14988c2ecf20Sopenharmony_ci if (rc) 14998c2ecf20Sopenharmony_ci return rc; 15008c2ecf20Sopenharmony_ci 15018c2ecf20Sopenharmony_ci return cudbg_read_fw_mem(pdbg_init, dbg_buff, mem_type, size, 15028c2ecf20Sopenharmony_ci cudbg_err); 15038c2ecf20Sopenharmony_ci} 15048c2ecf20Sopenharmony_ci 15058c2ecf20Sopenharmony_ciint cudbg_collect_edc0_meminfo(struct cudbg_init *pdbg_init, 15068c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 15078c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 15088c2ecf20Sopenharmony_ci{ 15098c2ecf20Sopenharmony_ci return cudbg_collect_mem_region(pdbg_init, dbg_buff, cudbg_err, 15108c2ecf20Sopenharmony_ci MEM_EDC0); 15118c2ecf20Sopenharmony_ci} 15128c2ecf20Sopenharmony_ci 15138c2ecf20Sopenharmony_ciint cudbg_collect_edc1_meminfo(struct cudbg_init *pdbg_init, 15148c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 15158c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 15168c2ecf20Sopenharmony_ci{ 15178c2ecf20Sopenharmony_ci return cudbg_collect_mem_region(pdbg_init, dbg_buff, cudbg_err, 15188c2ecf20Sopenharmony_ci MEM_EDC1); 15198c2ecf20Sopenharmony_ci} 15208c2ecf20Sopenharmony_ci 15218c2ecf20Sopenharmony_ciint cudbg_collect_mc0_meminfo(struct cudbg_init *pdbg_init, 15228c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 15238c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 15248c2ecf20Sopenharmony_ci{ 15258c2ecf20Sopenharmony_ci return cudbg_collect_mem_region(pdbg_init, dbg_buff, cudbg_err, 15268c2ecf20Sopenharmony_ci MEM_MC0); 15278c2ecf20Sopenharmony_ci} 15288c2ecf20Sopenharmony_ci 15298c2ecf20Sopenharmony_ciint cudbg_collect_mc1_meminfo(struct cudbg_init *pdbg_init, 15308c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 15318c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 15328c2ecf20Sopenharmony_ci{ 15338c2ecf20Sopenharmony_ci return cudbg_collect_mem_region(pdbg_init, dbg_buff, cudbg_err, 15348c2ecf20Sopenharmony_ci MEM_MC1); 15358c2ecf20Sopenharmony_ci} 15368c2ecf20Sopenharmony_ci 15378c2ecf20Sopenharmony_ciint cudbg_collect_hma_meminfo(struct cudbg_init *pdbg_init, 15388c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 15398c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 15408c2ecf20Sopenharmony_ci{ 15418c2ecf20Sopenharmony_ci return cudbg_collect_mem_region(pdbg_init, dbg_buff, cudbg_err, 15428c2ecf20Sopenharmony_ci MEM_HMA); 15438c2ecf20Sopenharmony_ci} 15448c2ecf20Sopenharmony_ci 15458c2ecf20Sopenharmony_ciint cudbg_collect_rss(struct cudbg_init *pdbg_init, 15468c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 15478c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 15488c2ecf20Sopenharmony_ci{ 15498c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 15508c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 15518c2ecf20Sopenharmony_ci int rc, nentries; 15528c2ecf20Sopenharmony_ci 15538c2ecf20Sopenharmony_ci nentries = t4_chip_rss_size(padap); 15548c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, nentries * sizeof(u16), 15558c2ecf20Sopenharmony_ci &temp_buff); 15568c2ecf20Sopenharmony_ci if (rc) 15578c2ecf20Sopenharmony_ci return rc; 15588c2ecf20Sopenharmony_ci 15598c2ecf20Sopenharmony_ci rc = t4_read_rss(padap, (u16 *)temp_buff.data); 15608c2ecf20Sopenharmony_ci if (rc) { 15618c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 15628c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 15638c2ecf20Sopenharmony_ci return rc; 15648c2ecf20Sopenharmony_ci } 15658c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 15668c2ecf20Sopenharmony_ci} 15678c2ecf20Sopenharmony_ci 15688c2ecf20Sopenharmony_ciint cudbg_collect_rss_vf_config(struct cudbg_init *pdbg_init, 15698c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 15708c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 15718c2ecf20Sopenharmony_ci{ 15728c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 15738c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 15748c2ecf20Sopenharmony_ci struct cudbg_rss_vf_conf *vfconf; 15758c2ecf20Sopenharmony_ci int vf, rc, vf_count; 15768c2ecf20Sopenharmony_ci 15778c2ecf20Sopenharmony_ci vf_count = padap->params.arch.vfcount; 15788c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, 15798c2ecf20Sopenharmony_ci vf_count * sizeof(struct cudbg_rss_vf_conf), 15808c2ecf20Sopenharmony_ci &temp_buff); 15818c2ecf20Sopenharmony_ci if (rc) 15828c2ecf20Sopenharmony_ci return rc; 15838c2ecf20Sopenharmony_ci 15848c2ecf20Sopenharmony_ci vfconf = (struct cudbg_rss_vf_conf *)temp_buff.data; 15858c2ecf20Sopenharmony_ci for (vf = 0; vf < vf_count; vf++) 15868c2ecf20Sopenharmony_ci t4_read_rss_vf_config(padap, vf, &vfconf[vf].rss_vf_vfl, 15878c2ecf20Sopenharmony_ci &vfconf[vf].rss_vf_vfh, true); 15888c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 15898c2ecf20Sopenharmony_ci} 15908c2ecf20Sopenharmony_ci 15918c2ecf20Sopenharmony_ciint cudbg_collect_path_mtu(struct cudbg_init *pdbg_init, 15928c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 15938c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 15948c2ecf20Sopenharmony_ci{ 15958c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 15968c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 15978c2ecf20Sopenharmony_ci int rc; 15988c2ecf20Sopenharmony_ci 15998c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, NMTUS * sizeof(u16), 16008c2ecf20Sopenharmony_ci &temp_buff); 16018c2ecf20Sopenharmony_ci if (rc) 16028c2ecf20Sopenharmony_ci return rc; 16038c2ecf20Sopenharmony_ci 16048c2ecf20Sopenharmony_ci t4_read_mtu_tbl(padap, (u16 *)temp_buff.data, NULL); 16058c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 16068c2ecf20Sopenharmony_ci} 16078c2ecf20Sopenharmony_ci 16088c2ecf20Sopenharmony_ciint cudbg_collect_pm_stats(struct cudbg_init *pdbg_init, 16098c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 16108c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 16118c2ecf20Sopenharmony_ci{ 16128c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 16138c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 16148c2ecf20Sopenharmony_ci struct cudbg_pm_stats *pm_stats_buff; 16158c2ecf20Sopenharmony_ci int rc; 16168c2ecf20Sopenharmony_ci 16178c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_pm_stats), 16188c2ecf20Sopenharmony_ci &temp_buff); 16198c2ecf20Sopenharmony_ci if (rc) 16208c2ecf20Sopenharmony_ci return rc; 16218c2ecf20Sopenharmony_ci 16228c2ecf20Sopenharmony_ci pm_stats_buff = (struct cudbg_pm_stats *)temp_buff.data; 16238c2ecf20Sopenharmony_ci t4_pmtx_get_stats(padap, pm_stats_buff->tx_cnt, pm_stats_buff->tx_cyc); 16248c2ecf20Sopenharmony_ci t4_pmrx_get_stats(padap, pm_stats_buff->rx_cnt, pm_stats_buff->rx_cyc); 16258c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 16268c2ecf20Sopenharmony_ci} 16278c2ecf20Sopenharmony_ci 16288c2ecf20Sopenharmony_ciint cudbg_collect_hw_sched(struct cudbg_init *pdbg_init, 16298c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 16308c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 16318c2ecf20Sopenharmony_ci{ 16328c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 16338c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 16348c2ecf20Sopenharmony_ci struct cudbg_hw_sched *hw_sched_buff; 16358c2ecf20Sopenharmony_ci int i, rc = 0; 16368c2ecf20Sopenharmony_ci 16378c2ecf20Sopenharmony_ci if (!padap->params.vpd.cclk) 16388c2ecf20Sopenharmony_ci return CUDBG_STATUS_CCLK_NOT_DEFINED; 16398c2ecf20Sopenharmony_ci 16408c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_hw_sched), 16418c2ecf20Sopenharmony_ci &temp_buff); 16428c2ecf20Sopenharmony_ci 16438c2ecf20Sopenharmony_ci if (rc) 16448c2ecf20Sopenharmony_ci return rc; 16458c2ecf20Sopenharmony_ci 16468c2ecf20Sopenharmony_ci hw_sched_buff = (struct cudbg_hw_sched *)temp_buff.data; 16478c2ecf20Sopenharmony_ci hw_sched_buff->map = t4_read_reg(padap, TP_TX_MOD_QUEUE_REQ_MAP_A); 16488c2ecf20Sopenharmony_ci hw_sched_buff->mode = TIMERMODE_G(t4_read_reg(padap, TP_MOD_CONFIG_A)); 16498c2ecf20Sopenharmony_ci t4_read_pace_tbl(padap, hw_sched_buff->pace_tab); 16508c2ecf20Sopenharmony_ci for (i = 0; i < NTX_SCHED; ++i) 16518c2ecf20Sopenharmony_ci t4_get_tx_sched(padap, i, &hw_sched_buff->kbps[i], 16528c2ecf20Sopenharmony_ci &hw_sched_buff->ipg[i], true); 16538c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 16548c2ecf20Sopenharmony_ci} 16558c2ecf20Sopenharmony_ci 16568c2ecf20Sopenharmony_ciint cudbg_collect_tp_indirect(struct cudbg_init *pdbg_init, 16578c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 16588c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 16598c2ecf20Sopenharmony_ci{ 16608c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 16618c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 16628c2ecf20Sopenharmony_ci struct ireg_buf *ch_tp_pio; 16638c2ecf20Sopenharmony_ci int i, rc, n = 0; 16648c2ecf20Sopenharmony_ci u32 size; 16658c2ecf20Sopenharmony_ci 16668c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) 16678c2ecf20Sopenharmony_ci n = sizeof(t5_tp_pio_array) + 16688c2ecf20Sopenharmony_ci sizeof(t5_tp_tm_pio_array) + 16698c2ecf20Sopenharmony_ci sizeof(t5_tp_mib_index_array); 16708c2ecf20Sopenharmony_ci else 16718c2ecf20Sopenharmony_ci n = sizeof(t6_tp_pio_array) + 16728c2ecf20Sopenharmony_ci sizeof(t6_tp_tm_pio_array) + 16738c2ecf20Sopenharmony_ci sizeof(t6_tp_mib_index_array); 16748c2ecf20Sopenharmony_ci 16758c2ecf20Sopenharmony_ci n = n / (IREG_NUM_ELEM * sizeof(u32)); 16768c2ecf20Sopenharmony_ci size = sizeof(struct ireg_buf) * n; 16778c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 16788c2ecf20Sopenharmony_ci if (rc) 16798c2ecf20Sopenharmony_ci return rc; 16808c2ecf20Sopenharmony_ci 16818c2ecf20Sopenharmony_ci ch_tp_pio = (struct ireg_buf *)temp_buff.data; 16828c2ecf20Sopenharmony_ci 16838c2ecf20Sopenharmony_ci /* TP_PIO */ 16848c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) 16858c2ecf20Sopenharmony_ci n = sizeof(t5_tp_pio_array) / (IREG_NUM_ELEM * sizeof(u32)); 16868c2ecf20Sopenharmony_ci else if (is_t6(padap->params.chip)) 16878c2ecf20Sopenharmony_ci n = sizeof(t6_tp_pio_array) / (IREG_NUM_ELEM * sizeof(u32)); 16888c2ecf20Sopenharmony_ci 16898c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 16908c2ecf20Sopenharmony_ci struct ireg_field *tp_pio = &ch_tp_pio->tp_pio; 16918c2ecf20Sopenharmony_ci u32 *buff = ch_tp_pio->outbuf; 16928c2ecf20Sopenharmony_ci 16938c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) { 16948c2ecf20Sopenharmony_ci tp_pio->ireg_addr = t5_tp_pio_array[i][0]; 16958c2ecf20Sopenharmony_ci tp_pio->ireg_data = t5_tp_pio_array[i][1]; 16968c2ecf20Sopenharmony_ci tp_pio->ireg_local_offset = t5_tp_pio_array[i][2]; 16978c2ecf20Sopenharmony_ci tp_pio->ireg_offset_range = t5_tp_pio_array[i][3]; 16988c2ecf20Sopenharmony_ci } else if (is_t6(padap->params.chip)) { 16998c2ecf20Sopenharmony_ci tp_pio->ireg_addr = t6_tp_pio_array[i][0]; 17008c2ecf20Sopenharmony_ci tp_pio->ireg_data = t6_tp_pio_array[i][1]; 17018c2ecf20Sopenharmony_ci tp_pio->ireg_local_offset = t6_tp_pio_array[i][2]; 17028c2ecf20Sopenharmony_ci tp_pio->ireg_offset_range = t6_tp_pio_array[i][3]; 17038c2ecf20Sopenharmony_ci } 17048c2ecf20Sopenharmony_ci t4_tp_pio_read(padap, buff, tp_pio->ireg_offset_range, 17058c2ecf20Sopenharmony_ci tp_pio->ireg_local_offset, true); 17068c2ecf20Sopenharmony_ci ch_tp_pio++; 17078c2ecf20Sopenharmony_ci } 17088c2ecf20Sopenharmony_ci 17098c2ecf20Sopenharmony_ci /* TP_TM_PIO */ 17108c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) 17118c2ecf20Sopenharmony_ci n = sizeof(t5_tp_tm_pio_array) / (IREG_NUM_ELEM * sizeof(u32)); 17128c2ecf20Sopenharmony_ci else if (is_t6(padap->params.chip)) 17138c2ecf20Sopenharmony_ci n = sizeof(t6_tp_tm_pio_array) / (IREG_NUM_ELEM * sizeof(u32)); 17148c2ecf20Sopenharmony_ci 17158c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 17168c2ecf20Sopenharmony_ci struct ireg_field *tp_pio = &ch_tp_pio->tp_pio; 17178c2ecf20Sopenharmony_ci u32 *buff = ch_tp_pio->outbuf; 17188c2ecf20Sopenharmony_ci 17198c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) { 17208c2ecf20Sopenharmony_ci tp_pio->ireg_addr = t5_tp_tm_pio_array[i][0]; 17218c2ecf20Sopenharmony_ci tp_pio->ireg_data = t5_tp_tm_pio_array[i][1]; 17228c2ecf20Sopenharmony_ci tp_pio->ireg_local_offset = t5_tp_tm_pio_array[i][2]; 17238c2ecf20Sopenharmony_ci tp_pio->ireg_offset_range = t5_tp_tm_pio_array[i][3]; 17248c2ecf20Sopenharmony_ci } else if (is_t6(padap->params.chip)) { 17258c2ecf20Sopenharmony_ci tp_pio->ireg_addr = t6_tp_tm_pio_array[i][0]; 17268c2ecf20Sopenharmony_ci tp_pio->ireg_data = t6_tp_tm_pio_array[i][1]; 17278c2ecf20Sopenharmony_ci tp_pio->ireg_local_offset = t6_tp_tm_pio_array[i][2]; 17288c2ecf20Sopenharmony_ci tp_pio->ireg_offset_range = t6_tp_tm_pio_array[i][3]; 17298c2ecf20Sopenharmony_ci } 17308c2ecf20Sopenharmony_ci t4_tp_tm_pio_read(padap, buff, tp_pio->ireg_offset_range, 17318c2ecf20Sopenharmony_ci tp_pio->ireg_local_offset, true); 17328c2ecf20Sopenharmony_ci ch_tp_pio++; 17338c2ecf20Sopenharmony_ci } 17348c2ecf20Sopenharmony_ci 17358c2ecf20Sopenharmony_ci /* TP_MIB_INDEX */ 17368c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) 17378c2ecf20Sopenharmony_ci n = sizeof(t5_tp_mib_index_array) / 17388c2ecf20Sopenharmony_ci (IREG_NUM_ELEM * sizeof(u32)); 17398c2ecf20Sopenharmony_ci else if (is_t6(padap->params.chip)) 17408c2ecf20Sopenharmony_ci n = sizeof(t6_tp_mib_index_array) / 17418c2ecf20Sopenharmony_ci (IREG_NUM_ELEM * sizeof(u32)); 17428c2ecf20Sopenharmony_ci 17438c2ecf20Sopenharmony_ci for (i = 0; i < n ; i++) { 17448c2ecf20Sopenharmony_ci struct ireg_field *tp_pio = &ch_tp_pio->tp_pio; 17458c2ecf20Sopenharmony_ci u32 *buff = ch_tp_pio->outbuf; 17468c2ecf20Sopenharmony_ci 17478c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) { 17488c2ecf20Sopenharmony_ci tp_pio->ireg_addr = t5_tp_mib_index_array[i][0]; 17498c2ecf20Sopenharmony_ci tp_pio->ireg_data = t5_tp_mib_index_array[i][1]; 17508c2ecf20Sopenharmony_ci tp_pio->ireg_local_offset = 17518c2ecf20Sopenharmony_ci t5_tp_mib_index_array[i][2]; 17528c2ecf20Sopenharmony_ci tp_pio->ireg_offset_range = 17538c2ecf20Sopenharmony_ci t5_tp_mib_index_array[i][3]; 17548c2ecf20Sopenharmony_ci } else if (is_t6(padap->params.chip)) { 17558c2ecf20Sopenharmony_ci tp_pio->ireg_addr = t6_tp_mib_index_array[i][0]; 17568c2ecf20Sopenharmony_ci tp_pio->ireg_data = t6_tp_mib_index_array[i][1]; 17578c2ecf20Sopenharmony_ci tp_pio->ireg_local_offset = 17588c2ecf20Sopenharmony_ci t6_tp_mib_index_array[i][2]; 17598c2ecf20Sopenharmony_ci tp_pio->ireg_offset_range = 17608c2ecf20Sopenharmony_ci t6_tp_mib_index_array[i][3]; 17618c2ecf20Sopenharmony_ci } 17628c2ecf20Sopenharmony_ci t4_tp_mib_read(padap, buff, tp_pio->ireg_offset_range, 17638c2ecf20Sopenharmony_ci tp_pio->ireg_local_offset, true); 17648c2ecf20Sopenharmony_ci ch_tp_pio++; 17658c2ecf20Sopenharmony_ci } 17668c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 17678c2ecf20Sopenharmony_ci} 17688c2ecf20Sopenharmony_ci 17698c2ecf20Sopenharmony_cistatic void cudbg_read_sge_qbase_indirect_reg(struct adapter *padap, 17708c2ecf20Sopenharmony_ci struct sge_qbase_reg_field *qbase, 17718c2ecf20Sopenharmony_ci u32 func, bool is_pf) 17728c2ecf20Sopenharmony_ci{ 17738c2ecf20Sopenharmony_ci u32 *buff, i; 17748c2ecf20Sopenharmony_ci 17758c2ecf20Sopenharmony_ci if (is_pf) { 17768c2ecf20Sopenharmony_ci buff = qbase->pf_data_value[func]; 17778c2ecf20Sopenharmony_ci } else { 17788c2ecf20Sopenharmony_ci buff = qbase->vf_data_value[func]; 17798c2ecf20Sopenharmony_ci /* In SGE_QBASE_INDEX, 17808c2ecf20Sopenharmony_ci * Entries 0->7 are PF0->7, Entries 8->263 are VFID0->256. 17818c2ecf20Sopenharmony_ci */ 17828c2ecf20Sopenharmony_ci func += 8; 17838c2ecf20Sopenharmony_ci } 17848c2ecf20Sopenharmony_ci 17858c2ecf20Sopenharmony_ci t4_write_reg(padap, qbase->reg_addr, func); 17868c2ecf20Sopenharmony_ci for (i = 0; i < SGE_QBASE_DATA_REG_NUM; i++, buff++) 17878c2ecf20Sopenharmony_ci *buff = t4_read_reg(padap, qbase->reg_data[i]); 17888c2ecf20Sopenharmony_ci} 17898c2ecf20Sopenharmony_ci 17908c2ecf20Sopenharmony_ciint cudbg_collect_sge_indirect(struct cudbg_init *pdbg_init, 17918c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 17928c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 17938c2ecf20Sopenharmony_ci{ 17948c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 17958c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 17968c2ecf20Sopenharmony_ci struct sge_qbase_reg_field *sge_qbase; 17978c2ecf20Sopenharmony_ci struct ireg_buf *ch_sge_dbg; 17988c2ecf20Sopenharmony_ci u8 padap_running = 0; 17998c2ecf20Sopenharmony_ci int i, rc; 18008c2ecf20Sopenharmony_ci u32 size; 18018c2ecf20Sopenharmony_ci 18028c2ecf20Sopenharmony_ci /* Accessing SGE_QBASE_MAP[0-3] and SGE_QBASE_INDEX regs can 18038c2ecf20Sopenharmony_ci * lead to SGE missing doorbells under heavy traffic. So, only 18048c2ecf20Sopenharmony_ci * collect them when adapter is idle. 18058c2ecf20Sopenharmony_ci */ 18068c2ecf20Sopenharmony_ci for_each_port(padap, i) { 18078c2ecf20Sopenharmony_ci padap_running = netif_running(padap->port[i]); 18088c2ecf20Sopenharmony_ci if (padap_running) 18098c2ecf20Sopenharmony_ci break; 18108c2ecf20Sopenharmony_ci } 18118c2ecf20Sopenharmony_ci 18128c2ecf20Sopenharmony_ci size = sizeof(*ch_sge_dbg) * 2; 18138c2ecf20Sopenharmony_ci if (!padap_running) 18148c2ecf20Sopenharmony_ci size += sizeof(*sge_qbase); 18158c2ecf20Sopenharmony_ci 18168c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 18178c2ecf20Sopenharmony_ci if (rc) 18188c2ecf20Sopenharmony_ci return rc; 18198c2ecf20Sopenharmony_ci 18208c2ecf20Sopenharmony_ci ch_sge_dbg = (struct ireg_buf *)temp_buff.data; 18218c2ecf20Sopenharmony_ci for (i = 0; i < 2; i++) { 18228c2ecf20Sopenharmony_ci struct ireg_field *sge_pio = &ch_sge_dbg->tp_pio; 18238c2ecf20Sopenharmony_ci u32 *buff = ch_sge_dbg->outbuf; 18248c2ecf20Sopenharmony_ci 18258c2ecf20Sopenharmony_ci sge_pio->ireg_addr = t5_sge_dbg_index_array[i][0]; 18268c2ecf20Sopenharmony_ci sge_pio->ireg_data = t5_sge_dbg_index_array[i][1]; 18278c2ecf20Sopenharmony_ci sge_pio->ireg_local_offset = t5_sge_dbg_index_array[i][2]; 18288c2ecf20Sopenharmony_ci sge_pio->ireg_offset_range = t5_sge_dbg_index_array[i][3]; 18298c2ecf20Sopenharmony_ci t4_read_indirect(padap, 18308c2ecf20Sopenharmony_ci sge_pio->ireg_addr, 18318c2ecf20Sopenharmony_ci sge_pio->ireg_data, 18328c2ecf20Sopenharmony_ci buff, 18338c2ecf20Sopenharmony_ci sge_pio->ireg_offset_range, 18348c2ecf20Sopenharmony_ci sge_pio->ireg_local_offset); 18358c2ecf20Sopenharmony_ci ch_sge_dbg++; 18368c2ecf20Sopenharmony_ci } 18378c2ecf20Sopenharmony_ci 18388c2ecf20Sopenharmony_ci if (CHELSIO_CHIP_VERSION(padap->params.chip) > CHELSIO_T5 && 18398c2ecf20Sopenharmony_ci !padap_running) { 18408c2ecf20Sopenharmony_ci sge_qbase = (struct sge_qbase_reg_field *)ch_sge_dbg; 18418c2ecf20Sopenharmony_ci /* 1 addr reg SGE_QBASE_INDEX and 4 data reg 18428c2ecf20Sopenharmony_ci * SGE_QBASE_MAP[0-3] 18438c2ecf20Sopenharmony_ci */ 18448c2ecf20Sopenharmony_ci sge_qbase->reg_addr = t6_sge_qbase_index_array[0]; 18458c2ecf20Sopenharmony_ci for (i = 0; i < SGE_QBASE_DATA_REG_NUM; i++) 18468c2ecf20Sopenharmony_ci sge_qbase->reg_data[i] = 18478c2ecf20Sopenharmony_ci t6_sge_qbase_index_array[i + 1]; 18488c2ecf20Sopenharmony_ci 18498c2ecf20Sopenharmony_ci for (i = 0; i <= PCIE_FW_MASTER_M; i++) 18508c2ecf20Sopenharmony_ci cudbg_read_sge_qbase_indirect_reg(padap, sge_qbase, 18518c2ecf20Sopenharmony_ci i, true); 18528c2ecf20Sopenharmony_ci 18538c2ecf20Sopenharmony_ci for (i = 0; i < padap->params.arch.vfcount; i++) 18548c2ecf20Sopenharmony_ci cudbg_read_sge_qbase_indirect_reg(padap, sge_qbase, 18558c2ecf20Sopenharmony_ci i, false); 18568c2ecf20Sopenharmony_ci 18578c2ecf20Sopenharmony_ci sge_qbase->vfcount = padap->params.arch.vfcount; 18588c2ecf20Sopenharmony_ci } 18598c2ecf20Sopenharmony_ci 18608c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 18618c2ecf20Sopenharmony_ci} 18628c2ecf20Sopenharmony_ci 18638c2ecf20Sopenharmony_ciint cudbg_collect_ulprx_la(struct cudbg_init *pdbg_init, 18648c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 18658c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 18668c2ecf20Sopenharmony_ci{ 18678c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 18688c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 18698c2ecf20Sopenharmony_ci struct cudbg_ulprx_la *ulprx_la_buff; 18708c2ecf20Sopenharmony_ci int rc; 18718c2ecf20Sopenharmony_ci 18728c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_ulprx_la), 18738c2ecf20Sopenharmony_ci &temp_buff); 18748c2ecf20Sopenharmony_ci if (rc) 18758c2ecf20Sopenharmony_ci return rc; 18768c2ecf20Sopenharmony_ci 18778c2ecf20Sopenharmony_ci ulprx_la_buff = (struct cudbg_ulprx_la *)temp_buff.data; 18788c2ecf20Sopenharmony_ci t4_ulprx_read_la(padap, (u32 *)ulprx_la_buff->data); 18798c2ecf20Sopenharmony_ci ulprx_la_buff->size = ULPRX_LA_SIZE; 18808c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 18818c2ecf20Sopenharmony_ci} 18828c2ecf20Sopenharmony_ci 18838c2ecf20Sopenharmony_ciint cudbg_collect_tp_la(struct cudbg_init *pdbg_init, 18848c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 18858c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 18868c2ecf20Sopenharmony_ci{ 18878c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 18888c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 18898c2ecf20Sopenharmony_ci struct cudbg_tp_la *tp_la_buff; 18908c2ecf20Sopenharmony_ci int size, rc; 18918c2ecf20Sopenharmony_ci 18928c2ecf20Sopenharmony_ci size = sizeof(struct cudbg_tp_la) + TPLA_SIZE * sizeof(u64); 18938c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 18948c2ecf20Sopenharmony_ci if (rc) 18958c2ecf20Sopenharmony_ci return rc; 18968c2ecf20Sopenharmony_ci 18978c2ecf20Sopenharmony_ci tp_la_buff = (struct cudbg_tp_la *)temp_buff.data; 18988c2ecf20Sopenharmony_ci tp_la_buff->mode = DBGLAMODE_G(t4_read_reg(padap, TP_DBG_LA_CONFIG_A)); 18998c2ecf20Sopenharmony_ci t4_tp_read_la(padap, (u64 *)tp_la_buff->data, NULL); 19008c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 19018c2ecf20Sopenharmony_ci} 19028c2ecf20Sopenharmony_ci 19038c2ecf20Sopenharmony_ciint cudbg_collect_meminfo(struct cudbg_init *pdbg_init, 19048c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 19058c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 19068c2ecf20Sopenharmony_ci{ 19078c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 19088c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 19098c2ecf20Sopenharmony_ci struct cudbg_meminfo *meminfo_buff; 19108c2ecf20Sopenharmony_ci struct cudbg_ver_hdr *ver_hdr; 19118c2ecf20Sopenharmony_ci int rc; 19128c2ecf20Sopenharmony_ci 19138c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, 19148c2ecf20Sopenharmony_ci sizeof(struct cudbg_ver_hdr) + 19158c2ecf20Sopenharmony_ci sizeof(struct cudbg_meminfo), 19168c2ecf20Sopenharmony_ci &temp_buff); 19178c2ecf20Sopenharmony_ci if (rc) 19188c2ecf20Sopenharmony_ci return rc; 19198c2ecf20Sopenharmony_ci 19208c2ecf20Sopenharmony_ci ver_hdr = (struct cudbg_ver_hdr *)temp_buff.data; 19218c2ecf20Sopenharmony_ci ver_hdr->signature = CUDBG_ENTITY_SIGNATURE; 19228c2ecf20Sopenharmony_ci ver_hdr->revision = CUDBG_MEMINFO_REV; 19238c2ecf20Sopenharmony_ci ver_hdr->size = sizeof(struct cudbg_meminfo); 19248c2ecf20Sopenharmony_ci 19258c2ecf20Sopenharmony_ci meminfo_buff = (struct cudbg_meminfo *)(temp_buff.data + 19268c2ecf20Sopenharmony_ci sizeof(*ver_hdr)); 19278c2ecf20Sopenharmony_ci rc = cudbg_fill_meminfo(padap, meminfo_buff); 19288c2ecf20Sopenharmony_ci if (rc) { 19298c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 19308c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 19318c2ecf20Sopenharmony_ci return rc; 19328c2ecf20Sopenharmony_ci } 19338c2ecf20Sopenharmony_ci 19348c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 19358c2ecf20Sopenharmony_ci} 19368c2ecf20Sopenharmony_ci 19378c2ecf20Sopenharmony_ciint cudbg_collect_cim_pif_la(struct cudbg_init *pdbg_init, 19388c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 19398c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 19408c2ecf20Sopenharmony_ci{ 19418c2ecf20Sopenharmony_ci struct cudbg_cim_pif_la *cim_pif_la_buff; 19428c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 19438c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 19448c2ecf20Sopenharmony_ci int size, rc; 19458c2ecf20Sopenharmony_ci 19468c2ecf20Sopenharmony_ci size = sizeof(struct cudbg_cim_pif_la) + 19478c2ecf20Sopenharmony_ci 2 * CIM_PIFLA_SIZE * 6 * sizeof(u32); 19488c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 19498c2ecf20Sopenharmony_ci if (rc) 19508c2ecf20Sopenharmony_ci return rc; 19518c2ecf20Sopenharmony_ci 19528c2ecf20Sopenharmony_ci cim_pif_la_buff = (struct cudbg_cim_pif_la *)temp_buff.data; 19538c2ecf20Sopenharmony_ci cim_pif_la_buff->size = CIM_PIFLA_SIZE; 19548c2ecf20Sopenharmony_ci t4_cim_read_pif_la(padap, (u32 *)cim_pif_la_buff->data, 19558c2ecf20Sopenharmony_ci (u32 *)cim_pif_la_buff->data + 6 * CIM_PIFLA_SIZE, 19568c2ecf20Sopenharmony_ci NULL, NULL); 19578c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 19588c2ecf20Sopenharmony_ci} 19598c2ecf20Sopenharmony_ci 19608c2ecf20Sopenharmony_ciint cudbg_collect_clk_info(struct cudbg_init *pdbg_init, 19618c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 19628c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 19638c2ecf20Sopenharmony_ci{ 19648c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 19658c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 19668c2ecf20Sopenharmony_ci struct cudbg_clk_info *clk_info_buff; 19678c2ecf20Sopenharmony_ci u64 tp_tick_us; 19688c2ecf20Sopenharmony_ci int rc; 19698c2ecf20Sopenharmony_ci 19708c2ecf20Sopenharmony_ci if (!padap->params.vpd.cclk) 19718c2ecf20Sopenharmony_ci return CUDBG_STATUS_CCLK_NOT_DEFINED; 19728c2ecf20Sopenharmony_ci 19738c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_clk_info), 19748c2ecf20Sopenharmony_ci &temp_buff); 19758c2ecf20Sopenharmony_ci if (rc) 19768c2ecf20Sopenharmony_ci return rc; 19778c2ecf20Sopenharmony_ci 19788c2ecf20Sopenharmony_ci clk_info_buff = (struct cudbg_clk_info *)temp_buff.data; 19798c2ecf20Sopenharmony_ci clk_info_buff->cclk_ps = 1000000000 / padap->params.vpd.cclk; /* psec */ 19808c2ecf20Sopenharmony_ci clk_info_buff->res = t4_read_reg(padap, TP_TIMER_RESOLUTION_A); 19818c2ecf20Sopenharmony_ci clk_info_buff->tre = TIMERRESOLUTION_G(clk_info_buff->res); 19828c2ecf20Sopenharmony_ci clk_info_buff->dack_re = DELAYEDACKRESOLUTION_G(clk_info_buff->res); 19838c2ecf20Sopenharmony_ci tp_tick_us = (clk_info_buff->cclk_ps << clk_info_buff->tre) / 1000000; 19848c2ecf20Sopenharmony_ci 19858c2ecf20Sopenharmony_ci clk_info_buff->dack_timer = 19868c2ecf20Sopenharmony_ci (clk_info_buff->cclk_ps << clk_info_buff->dack_re) / 1000000 * 19878c2ecf20Sopenharmony_ci t4_read_reg(padap, TP_DACK_TIMER_A); 19888c2ecf20Sopenharmony_ci clk_info_buff->retransmit_min = 19898c2ecf20Sopenharmony_ci tp_tick_us * t4_read_reg(padap, TP_RXT_MIN_A); 19908c2ecf20Sopenharmony_ci clk_info_buff->retransmit_max = 19918c2ecf20Sopenharmony_ci tp_tick_us * t4_read_reg(padap, TP_RXT_MAX_A); 19928c2ecf20Sopenharmony_ci clk_info_buff->persist_timer_min = 19938c2ecf20Sopenharmony_ci tp_tick_us * t4_read_reg(padap, TP_PERS_MIN_A); 19948c2ecf20Sopenharmony_ci clk_info_buff->persist_timer_max = 19958c2ecf20Sopenharmony_ci tp_tick_us * t4_read_reg(padap, TP_PERS_MAX_A); 19968c2ecf20Sopenharmony_ci clk_info_buff->keepalive_idle_timer = 19978c2ecf20Sopenharmony_ci tp_tick_us * t4_read_reg(padap, TP_KEEP_IDLE_A); 19988c2ecf20Sopenharmony_ci clk_info_buff->keepalive_interval = 19998c2ecf20Sopenharmony_ci tp_tick_us * t4_read_reg(padap, TP_KEEP_INTVL_A); 20008c2ecf20Sopenharmony_ci clk_info_buff->initial_srtt = 20018c2ecf20Sopenharmony_ci tp_tick_us * INITSRTT_G(t4_read_reg(padap, TP_INIT_SRTT_A)); 20028c2ecf20Sopenharmony_ci clk_info_buff->finwait2_timer = 20038c2ecf20Sopenharmony_ci tp_tick_us * t4_read_reg(padap, TP_FINWAIT2_TIMER_A); 20048c2ecf20Sopenharmony_ci 20058c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 20068c2ecf20Sopenharmony_ci} 20078c2ecf20Sopenharmony_ci 20088c2ecf20Sopenharmony_ciint cudbg_collect_pcie_indirect(struct cudbg_init *pdbg_init, 20098c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 20108c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 20118c2ecf20Sopenharmony_ci{ 20128c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 20138c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 20148c2ecf20Sopenharmony_ci struct ireg_buf *ch_pcie; 20158c2ecf20Sopenharmony_ci int i, rc, n; 20168c2ecf20Sopenharmony_ci u32 size; 20178c2ecf20Sopenharmony_ci 20188c2ecf20Sopenharmony_ci n = sizeof(t5_pcie_pdbg_array) / (IREG_NUM_ELEM * sizeof(u32)); 20198c2ecf20Sopenharmony_ci size = sizeof(struct ireg_buf) * n * 2; 20208c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 20218c2ecf20Sopenharmony_ci if (rc) 20228c2ecf20Sopenharmony_ci return rc; 20238c2ecf20Sopenharmony_ci 20248c2ecf20Sopenharmony_ci ch_pcie = (struct ireg_buf *)temp_buff.data; 20258c2ecf20Sopenharmony_ci /* PCIE_PDBG */ 20268c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 20278c2ecf20Sopenharmony_ci struct ireg_field *pcie_pio = &ch_pcie->tp_pio; 20288c2ecf20Sopenharmony_ci u32 *buff = ch_pcie->outbuf; 20298c2ecf20Sopenharmony_ci 20308c2ecf20Sopenharmony_ci pcie_pio->ireg_addr = t5_pcie_pdbg_array[i][0]; 20318c2ecf20Sopenharmony_ci pcie_pio->ireg_data = t5_pcie_pdbg_array[i][1]; 20328c2ecf20Sopenharmony_ci pcie_pio->ireg_local_offset = t5_pcie_pdbg_array[i][2]; 20338c2ecf20Sopenharmony_ci pcie_pio->ireg_offset_range = t5_pcie_pdbg_array[i][3]; 20348c2ecf20Sopenharmony_ci t4_read_indirect(padap, 20358c2ecf20Sopenharmony_ci pcie_pio->ireg_addr, 20368c2ecf20Sopenharmony_ci pcie_pio->ireg_data, 20378c2ecf20Sopenharmony_ci buff, 20388c2ecf20Sopenharmony_ci pcie_pio->ireg_offset_range, 20398c2ecf20Sopenharmony_ci pcie_pio->ireg_local_offset); 20408c2ecf20Sopenharmony_ci ch_pcie++; 20418c2ecf20Sopenharmony_ci } 20428c2ecf20Sopenharmony_ci 20438c2ecf20Sopenharmony_ci /* PCIE_CDBG */ 20448c2ecf20Sopenharmony_ci n = sizeof(t5_pcie_cdbg_array) / (IREG_NUM_ELEM * sizeof(u32)); 20458c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 20468c2ecf20Sopenharmony_ci struct ireg_field *pcie_pio = &ch_pcie->tp_pio; 20478c2ecf20Sopenharmony_ci u32 *buff = ch_pcie->outbuf; 20488c2ecf20Sopenharmony_ci 20498c2ecf20Sopenharmony_ci pcie_pio->ireg_addr = t5_pcie_cdbg_array[i][0]; 20508c2ecf20Sopenharmony_ci pcie_pio->ireg_data = t5_pcie_cdbg_array[i][1]; 20518c2ecf20Sopenharmony_ci pcie_pio->ireg_local_offset = t5_pcie_cdbg_array[i][2]; 20528c2ecf20Sopenharmony_ci pcie_pio->ireg_offset_range = t5_pcie_cdbg_array[i][3]; 20538c2ecf20Sopenharmony_ci t4_read_indirect(padap, 20548c2ecf20Sopenharmony_ci pcie_pio->ireg_addr, 20558c2ecf20Sopenharmony_ci pcie_pio->ireg_data, 20568c2ecf20Sopenharmony_ci buff, 20578c2ecf20Sopenharmony_ci pcie_pio->ireg_offset_range, 20588c2ecf20Sopenharmony_ci pcie_pio->ireg_local_offset); 20598c2ecf20Sopenharmony_ci ch_pcie++; 20608c2ecf20Sopenharmony_ci } 20618c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 20628c2ecf20Sopenharmony_ci} 20638c2ecf20Sopenharmony_ci 20648c2ecf20Sopenharmony_ciint cudbg_collect_pm_indirect(struct cudbg_init *pdbg_init, 20658c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 20668c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 20678c2ecf20Sopenharmony_ci{ 20688c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 20698c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 20708c2ecf20Sopenharmony_ci struct ireg_buf *ch_pm; 20718c2ecf20Sopenharmony_ci int i, rc, n; 20728c2ecf20Sopenharmony_ci u32 size; 20738c2ecf20Sopenharmony_ci 20748c2ecf20Sopenharmony_ci n = sizeof(t5_pm_rx_array) / (IREG_NUM_ELEM * sizeof(u32)); 20758c2ecf20Sopenharmony_ci size = sizeof(struct ireg_buf) * n * 2; 20768c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 20778c2ecf20Sopenharmony_ci if (rc) 20788c2ecf20Sopenharmony_ci return rc; 20798c2ecf20Sopenharmony_ci 20808c2ecf20Sopenharmony_ci ch_pm = (struct ireg_buf *)temp_buff.data; 20818c2ecf20Sopenharmony_ci /* PM_RX */ 20828c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 20838c2ecf20Sopenharmony_ci struct ireg_field *pm_pio = &ch_pm->tp_pio; 20848c2ecf20Sopenharmony_ci u32 *buff = ch_pm->outbuf; 20858c2ecf20Sopenharmony_ci 20868c2ecf20Sopenharmony_ci pm_pio->ireg_addr = t5_pm_rx_array[i][0]; 20878c2ecf20Sopenharmony_ci pm_pio->ireg_data = t5_pm_rx_array[i][1]; 20888c2ecf20Sopenharmony_ci pm_pio->ireg_local_offset = t5_pm_rx_array[i][2]; 20898c2ecf20Sopenharmony_ci pm_pio->ireg_offset_range = t5_pm_rx_array[i][3]; 20908c2ecf20Sopenharmony_ci t4_read_indirect(padap, 20918c2ecf20Sopenharmony_ci pm_pio->ireg_addr, 20928c2ecf20Sopenharmony_ci pm_pio->ireg_data, 20938c2ecf20Sopenharmony_ci buff, 20948c2ecf20Sopenharmony_ci pm_pio->ireg_offset_range, 20958c2ecf20Sopenharmony_ci pm_pio->ireg_local_offset); 20968c2ecf20Sopenharmony_ci ch_pm++; 20978c2ecf20Sopenharmony_ci } 20988c2ecf20Sopenharmony_ci 20998c2ecf20Sopenharmony_ci /* PM_TX */ 21008c2ecf20Sopenharmony_ci n = sizeof(t5_pm_tx_array) / (IREG_NUM_ELEM * sizeof(u32)); 21018c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 21028c2ecf20Sopenharmony_ci struct ireg_field *pm_pio = &ch_pm->tp_pio; 21038c2ecf20Sopenharmony_ci u32 *buff = ch_pm->outbuf; 21048c2ecf20Sopenharmony_ci 21058c2ecf20Sopenharmony_ci pm_pio->ireg_addr = t5_pm_tx_array[i][0]; 21068c2ecf20Sopenharmony_ci pm_pio->ireg_data = t5_pm_tx_array[i][1]; 21078c2ecf20Sopenharmony_ci pm_pio->ireg_local_offset = t5_pm_tx_array[i][2]; 21088c2ecf20Sopenharmony_ci pm_pio->ireg_offset_range = t5_pm_tx_array[i][3]; 21098c2ecf20Sopenharmony_ci t4_read_indirect(padap, 21108c2ecf20Sopenharmony_ci pm_pio->ireg_addr, 21118c2ecf20Sopenharmony_ci pm_pio->ireg_data, 21128c2ecf20Sopenharmony_ci buff, 21138c2ecf20Sopenharmony_ci pm_pio->ireg_offset_range, 21148c2ecf20Sopenharmony_ci pm_pio->ireg_local_offset); 21158c2ecf20Sopenharmony_ci ch_pm++; 21168c2ecf20Sopenharmony_ci } 21178c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 21188c2ecf20Sopenharmony_ci} 21198c2ecf20Sopenharmony_ci 21208c2ecf20Sopenharmony_ciint cudbg_collect_tid(struct cudbg_init *pdbg_init, 21218c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 21228c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 21238c2ecf20Sopenharmony_ci{ 21248c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 21258c2ecf20Sopenharmony_ci struct cudbg_tid_info_region_rev1 *tid1; 21268c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 21278c2ecf20Sopenharmony_ci struct cudbg_tid_info_region *tid; 21288c2ecf20Sopenharmony_ci u32 para[2], val[2]; 21298c2ecf20Sopenharmony_ci int rc; 21308c2ecf20Sopenharmony_ci 21318c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, 21328c2ecf20Sopenharmony_ci sizeof(struct cudbg_tid_info_region_rev1), 21338c2ecf20Sopenharmony_ci &temp_buff); 21348c2ecf20Sopenharmony_ci if (rc) 21358c2ecf20Sopenharmony_ci return rc; 21368c2ecf20Sopenharmony_ci 21378c2ecf20Sopenharmony_ci tid1 = (struct cudbg_tid_info_region_rev1 *)temp_buff.data; 21388c2ecf20Sopenharmony_ci tid = &tid1->tid; 21398c2ecf20Sopenharmony_ci tid1->ver_hdr.signature = CUDBG_ENTITY_SIGNATURE; 21408c2ecf20Sopenharmony_ci tid1->ver_hdr.revision = CUDBG_TID_INFO_REV; 21418c2ecf20Sopenharmony_ci tid1->ver_hdr.size = sizeof(struct cudbg_tid_info_region_rev1) - 21428c2ecf20Sopenharmony_ci sizeof(struct cudbg_ver_hdr); 21438c2ecf20Sopenharmony_ci 21448c2ecf20Sopenharmony_ci /* If firmware is not attached/alive, use backdoor register 21458c2ecf20Sopenharmony_ci * access to collect dump. 21468c2ecf20Sopenharmony_ci */ 21478c2ecf20Sopenharmony_ci if (!is_fw_attached(pdbg_init)) 21488c2ecf20Sopenharmony_ci goto fill_tid; 21498c2ecf20Sopenharmony_ci 21508c2ecf20Sopenharmony_ci#define FW_PARAM_PFVF_A(param) \ 21518c2ecf20Sopenharmony_ci (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_PFVF) | \ 21528c2ecf20Sopenharmony_ci FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_PFVF_##param) | \ 21538c2ecf20Sopenharmony_ci FW_PARAMS_PARAM_Y_V(0) | \ 21548c2ecf20Sopenharmony_ci FW_PARAMS_PARAM_Z_V(0)) 21558c2ecf20Sopenharmony_ci 21568c2ecf20Sopenharmony_ci para[0] = FW_PARAM_PFVF_A(ETHOFLD_START); 21578c2ecf20Sopenharmony_ci para[1] = FW_PARAM_PFVF_A(ETHOFLD_END); 21588c2ecf20Sopenharmony_ci rc = t4_query_params(padap, padap->mbox, padap->pf, 0, 2, para, val); 21598c2ecf20Sopenharmony_ci if (rc < 0) { 21608c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 21618c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 21628c2ecf20Sopenharmony_ci return rc; 21638c2ecf20Sopenharmony_ci } 21648c2ecf20Sopenharmony_ci tid->uotid_base = val[0]; 21658c2ecf20Sopenharmony_ci tid->nuotids = val[1] - val[0] + 1; 21668c2ecf20Sopenharmony_ci 21678c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) { 21688c2ecf20Sopenharmony_ci tid->sb = t4_read_reg(padap, LE_DB_SERVER_INDEX_A) / 4; 21698c2ecf20Sopenharmony_ci } else if (is_t6(padap->params.chip)) { 21708c2ecf20Sopenharmony_ci tid1->tid_start = 21718c2ecf20Sopenharmony_ci t4_read_reg(padap, LE_DB_ACTIVE_TABLE_START_INDEX_A); 21728c2ecf20Sopenharmony_ci tid->sb = t4_read_reg(padap, LE_DB_SRVR_START_INDEX_A); 21738c2ecf20Sopenharmony_ci 21748c2ecf20Sopenharmony_ci para[0] = FW_PARAM_PFVF_A(HPFILTER_START); 21758c2ecf20Sopenharmony_ci para[1] = FW_PARAM_PFVF_A(HPFILTER_END); 21768c2ecf20Sopenharmony_ci rc = t4_query_params(padap, padap->mbox, padap->pf, 0, 2, 21778c2ecf20Sopenharmony_ci para, val); 21788c2ecf20Sopenharmony_ci if (rc < 0) { 21798c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 21808c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 21818c2ecf20Sopenharmony_ci return rc; 21828c2ecf20Sopenharmony_ci } 21838c2ecf20Sopenharmony_ci tid->hpftid_base = val[0]; 21848c2ecf20Sopenharmony_ci tid->nhpftids = val[1] - val[0] + 1; 21858c2ecf20Sopenharmony_ci } 21868c2ecf20Sopenharmony_ci 21878c2ecf20Sopenharmony_ci#undef FW_PARAM_PFVF_A 21888c2ecf20Sopenharmony_ci 21898c2ecf20Sopenharmony_cifill_tid: 21908c2ecf20Sopenharmony_ci tid->ntids = padap->tids.ntids; 21918c2ecf20Sopenharmony_ci tid->nstids = padap->tids.nstids; 21928c2ecf20Sopenharmony_ci tid->stid_base = padap->tids.stid_base; 21938c2ecf20Sopenharmony_ci tid->hash_base = padap->tids.hash_base; 21948c2ecf20Sopenharmony_ci 21958c2ecf20Sopenharmony_ci tid->natids = padap->tids.natids; 21968c2ecf20Sopenharmony_ci tid->nftids = padap->tids.nftids; 21978c2ecf20Sopenharmony_ci tid->ftid_base = padap->tids.ftid_base; 21988c2ecf20Sopenharmony_ci tid->aftid_base = padap->tids.aftid_base; 21998c2ecf20Sopenharmony_ci tid->aftid_end = padap->tids.aftid_end; 22008c2ecf20Sopenharmony_ci 22018c2ecf20Sopenharmony_ci tid->sftid_base = padap->tids.sftid_base; 22028c2ecf20Sopenharmony_ci tid->nsftids = padap->tids.nsftids; 22038c2ecf20Sopenharmony_ci 22048c2ecf20Sopenharmony_ci tid->flags = padap->flags; 22058c2ecf20Sopenharmony_ci tid->le_db_conf = t4_read_reg(padap, LE_DB_CONFIG_A); 22068c2ecf20Sopenharmony_ci tid->ip_users = t4_read_reg(padap, LE_DB_ACT_CNT_IPV4_A); 22078c2ecf20Sopenharmony_ci tid->ipv6_users = t4_read_reg(padap, LE_DB_ACT_CNT_IPV6_A); 22088c2ecf20Sopenharmony_ci 22098c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 22108c2ecf20Sopenharmony_ci} 22118c2ecf20Sopenharmony_ci 22128c2ecf20Sopenharmony_ciint cudbg_collect_pcie_config(struct cudbg_init *pdbg_init, 22138c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 22148c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 22158c2ecf20Sopenharmony_ci{ 22168c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 22178c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 22188c2ecf20Sopenharmony_ci u32 size, *value, j; 22198c2ecf20Sopenharmony_ci int i, rc, n; 22208c2ecf20Sopenharmony_ci 22218c2ecf20Sopenharmony_ci size = sizeof(u32) * CUDBG_NUM_PCIE_CONFIG_REGS; 22228c2ecf20Sopenharmony_ci n = sizeof(t5_pcie_config_array) / (2 * sizeof(u32)); 22238c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 22248c2ecf20Sopenharmony_ci if (rc) 22258c2ecf20Sopenharmony_ci return rc; 22268c2ecf20Sopenharmony_ci 22278c2ecf20Sopenharmony_ci value = (u32 *)temp_buff.data; 22288c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 22298c2ecf20Sopenharmony_ci for (j = t5_pcie_config_array[i][0]; 22308c2ecf20Sopenharmony_ci j <= t5_pcie_config_array[i][1]; j += 4) { 22318c2ecf20Sopenharmony_ci t4_hw_pci_read_cfg4(padap, j, value); 22328c2ecf20Sopenharmony_ci value++; 22338c2ecf20Sopenharmony_ci } 22348c2ecf20Sopenharmony_ci } 22358c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 22368c2ecf20Sopenharmony_ci} 22378c2ecf20Sopenharmony_ci 22388c2ecf20Sopenharmony_cistatic int cudbg_sge_ctxt_check_valid(u32 *buf, int type) 22398c2ecf20Sopenharmony_ci{ 22408c2ecf20Sopenharmony_ci int index, bit, bit_pos = 0; 22418c2ecf20Sopenharmony_ci 22428c2ecf20Sopenharmony_ci switch (type) { 22438c2ecf20Sopenharmony_ci case CTXT_EGRESS: 22448c2ecf20Sopenharmony_ci bit_pos = 176; 22458c2ecf20Sopenharmony_ci break; 22468c2ecf20Sopenharmony_ci case CTXT_INGRESS: 22478c2ecf20Sopenharmony_ci bit_pos = 141; 22488c2ecf20Sopenharmony_ci break; 22498c2ecf20Sopenharmony_ci case CTXT_FLM: 22508c2ecf20Sopenharmony_ci bit_pos = 89; 22518c2ecf20Sopenharmony_ci break; 22528c2ecf20Sopenharmony_ci } 22538c2ecf20Sopenharmony_ci index = bit_pos / 32; 22548c2ecf20Sopenharmony_ci bit = bit_pos % 32; 22558c2ecf20Sopenharmony_ci return buf[index] & (1U << bit); 22568c2ecf20Sopenharmony_ci} 22578c2ecf20Sopenharmony_ci 22588c2ecf20Sopenharmony_cistatic int cudbg_get_ctxt_region_info(struct adapter *padap, 22598c2ecf20Sopenharmony_ci struct cudbg_region_info *ctx_info, 22608c2ecf20Sopenharmony_ci u8 *mem_type) 22618c2ecf20Sopenharmony_ci{ 22628c2ecf20Sopenharmony_ci struct cudbg_mem_desc mem_desc; 22638c2ecf20Sopenharmony_ci struct cudbg_meminfo meminfo; 22648c2ecf20Sopenharmony_ci u32 i, j, value, found; 22658c2ecf20Sopenharmony_ci u8 flq; 22668c2ecf20Sopenharmony_ci int rc; 22678c2ecf20Sopenharmony_ci 22688c2ecf20Sopenharmony_ci rc = cudbg_fill_meminfo(padap, &meminfo); 22698c2ecf20Sopenharmony_ci if (rc) 22708c2ecf20Sopenharmony_ci return rc; 22718c2ecf20Sopenharmony_ci 22728c2ecf20Sopenharmony_ci /* Get EGRESS and INGRESS context region size */ 22738c2ecf20Sopenharmony_ci for (i = CTXT_EGRESS; i <= CTXT_INGRESS; i++) { 22748c2ecf20Sopenharmony_ci found = 0; 22758c2ecf20Sopenharmony_ci memset(&mem_desc, 0, sizeof(struct cudbg_mem_desc)); 22768c2ecf20Sopenharmony_ci for (j = 0; j < ARRAY_SIZE(meminfo.avail); j++) { 22778c2ecf20Sopenharmony_ci rc = cudbg_get_mem_region(padap, &meminfo, j, 22788c2ecf20Sopenharmony_ci cudbg_region[i], 22798c2ecf20Sopenharmony_ci &mem_desc); 22808c2ecf20Sopenharmony_ci if (!rc) { 22818c2ecf20Sopenharmony_ci found = 1; 22828c2ecf20Sopenharmony_ci rc = cudbg_get_mem_relative(padap, &meminfo, j, 22838c2ecf20Sopenharmony_ci &mem_desc.base, 22848c2ecf20Sopenharmony_ci &mem_desc.limit); 22858c2ecf20Sopenharmony_ci if (rc) { 22868c2ecf20Sopenharmony_ci ctx_info[i].exist = false; 22878c2ecf20Sopenharmony_ci break; 22888c2ecf20Sopenharmony_ci } 22898c2ecf20Sopenharmony_ci ctx_info[i].exist = true; 22908c2ecf20Sopenharmony_ci ctx_info[i].start = mem_desc.base; 22918c2ecf20Sopenharmony_ci ctx_info[i].end = mem_desc.limit; 22928c2ecf20Sopenharmony_ci mem_type[i] = j; 22938c2ecf20Sopenharmony_ci break; 22948c2ecf20Sopenharmony_ci } 22958c2ecf20Sopenharmony_ci } 22968c2ecf20Sopenharmony_ci if (!found) 22978c2ecf20Sopenharmony_ci ctx_info[i].exist = false; 22988c2ecf20Sopenharmony_ci } 22998c2ecf20Sopenharmony_ci 23008c2ecf20Sopenharmony_ci /* Get FLM and CNM max qid. */ 23018c2ecf20Sopenharmony_ci value = t4_read_reg(padap, SGE_FLM_CFG_A); 23028c2ecf20Sopenharmony_ci 23038c2ecf20Sopenharmony_ci /* Get number of data freelist queues */ 23048c2ecf20Sopenharmony_ci flq = HDRSTARTFLQ_G(value); 23058c2ecf20Sopenharmony_ci ctx_info[CTXT_FLM].exist = true; 23068c2ecf20Sopenharmony_ci ctx_info[CTXT_FLM].end = (CUDBG_MAX_FL_QIDS >> flq) * SGE_CTXT_SIZE; 23078c2ecf20Sopenharmony_ci 23088c2ecf20Sopenharmony_ci /* The number of CONM contexts are same as number of freelist 23098c2ecf20Sopenharmony_ci * queues. 23108c2ecf20Sopenharmony_ci */ 23118c2ecf20Sopenharmony_ci ctx_info[CTXT_CNM].exist = true; 23128c2ecf20Sopenharmony_ci ctx_info[CTXT_CNM].end = ctx_info[CTXT_FLM].end; 23138c2ecf20Sopenharmony_ci 23148c2ecf20Sopenharmony_ci return 0; 23158c2ecf20Sopenharmony_ci} 23168c2ecf20Sopenharmony_ci 23178c2ecf20Sopenharmony_ciint cudbg_dump_context_size(struct adapter *padap) 23188c2ecf20Sopenharmony_ci{ 23198c2ecf20Sopenharmony_ci struct cudbg_region_info region_info[CTXT_CNM + 1] = { {0} }; 23208c2ecf20Sopenharmony_ci u8 mem_type[CTXT_INGRESS + 1] = { 0 }; 23218c2ecf20Sopenharmony_ci u32 i, size = 0; 23228c2ecf20Sopenharmony_ci int rc; 23238c2ecf20Sopenharmony_ci 23248c2ecf20Sopenharmony_ci /* Get max valid qid for each type of queue */ 23258c2ecf20Sopenharmony_ci rc = cudbg_get_ctxt_region_info(padap, region_info, mem_type); 23268c2ecf20Sopenharmony_ci if (rc) 23278c2ecf20Sopenharmony_ci return rc; 23288c2ecf20Sopenharmony_ci 23298c2ecf20Sopenharmony_ci for (i = 0; i < CTXT_CNM; i++) { 23308c2ecf20Sopenharmony_ci if (!region_info[i].exist) { 23318c2ecf20Sopenharmony_ci if (i == CTXT_EGRESS || i == CTXT_INGRESS) 23328c2ecf20Sopenharmony_ci size += CUDBG_LOWMEM_MAX_CTXT_QIDS * 23338c2ecf20Sopenharmony_ci SGE_CTXT_SIZE; 23348c2ecf20Sopenharmony_ci continue; 23358c2ecf20Sopenharmony_ci } 23368c2ecf20Sopenharmony_ci 23378c2ecf20Sopenharmony_ci size += (region_info[i].end - region_info[i].start + 1) / 23388c2ecf20Sopenharmony_ci SGE_CTXT_SIZE; 23398c2ecf20Sopenharmony_ci } 23408c2ecf20Sopenharmony_ci return size * sizeof(struct cudbg_ch_cntxt); 23418c2ecf20Sopenharmony_ci} 23428c2ecf20Sopenharmony_ci 23438c2ecf20Sopenharmony_cistatic void cudbg_read_sge_ctxt(struct cudbg_init *pdbg_init, u32 cid, 23448c2ecf20Sopenharmony_ci enum ctxt_type ctype, u32 *data) 23458c2ecf20Sopenharmony_ci{ 23468c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 23478c2ecf20Sopenharmony_ci int rc = -1; 23488c2ecf20Sopenharmony_ci 23498c2ecf20Sopenharmony_ci /* Under heavy traffic, the SGE Queue contexts registers will be 23508c2ecf20Sopenharmony_ci * frequently accessed by firmware. 23518c2ecf20Sopenharmony_ci * 23528c2ecf20Sopenharmony_ci * To avoid conflicts with firmware, always ask firmware to fetch 23538c2ecf20Sopenharmony_ci * the SGE Queue contexts via mailbox. On failure, fallback to 23548c2ecf20Sopenharmony_ci * accessing hardware registers directly. 23558c2ecf20Sopenharmony_ci */ 23568c2ecf20Sopenharmony_ci if (is_fw_attached(pdbg_init)) 23578c2ecf20Sopenharmony_ci rc = t4_sge_ctxt_rd(padap, padap->mbox, cid, ctype, data); 23588c2ecf20Sopenharmony_ci if (rc) 23598c2ecf20Sopenharmony_ci t4_sge_ctxt_rd_bd(padap, cid, ctype, data); 23608c2ecf20Sopenharmony_ci} 23618c2ecf20Sopenharmony_ci 23628c2ecf20Sopenharmony_cistatic void cudbg_get_sge_ctxt_fw(struct cudbg_init *pdbg_init, u32 max_qid, 23638c2ecf20Sopenharmony_ci u8 ctxt_type, 23648c2ecf20Sopenharmony_ci struct cudbg_ch_cntxt **out_buff) 23658c2ecf20Sopenharmony_ci{ 23668c2ecf20Sopenharmony_ci struct cudbg_ch_cntxt *buff = *out_buff; 23678c2ecf20Sopenharmony_ci int rc; 23688c2ecf20Sopenharmony_ci u32 j; 23698c2ecf20Sopenharmony_ci 23708c2ecf20Sopenharmony_ci for (j = 0; j < max_qid; j++) { 23718c2ecf20Sopenharmony_ci cudbg_read_sge_ctxt(pdbg_init, j, ctxt_type, buff->data); 23728c2ecf20Sopenharmony_ci rc = cudbg_sge_ctxt_check_valid(buff->data, ctxt_type); 23738c2ecf20Sopenharmony_ci if (!rc) 23748c2ecf20Sopenharmony_ci continue; 23758c2ecf20Sopenharmony_ci 23768c2ecf20Sopenharmony_ci buff->cntxt_type = ctxt_type; 23778c2ecf20Sopenharmony_ci buff->cntxt_id = j; 23788c2ecf20Sopenharmony_ci buff++; 23798c2ecf20Sopenharmony_ci if (ctxt_type == CTXT_FLM) { 23808c2ecf20Sopenharmony_ci cudbg_read_sge_ctxt(pdbg_init, j, CTXT_CNM, buff->data); 23818c2ecf20Sopenharmony_ci buff->cntxt_type = CTXT_CNM; 23828c2ecf20Sopenharmony_ci buff->cntxt_id = j; 23838c2ecf20Sopenharmony_ci buff++; 23848c2ecf20Sopenharmony_ci } 23858c2ecf20Sopenharmony_ci } 23868c2ecf20Sopenharmony_ci 23878c2ecf20Sopenharmony_ci *out_buff = buff; 23888c2ecf20Sopenharmony_ci} 23898c2ecf20Sopenharmony_ci 23908c2ecf20Sopenharmony_ciint cudbg_collect_dump_context(struct cudbg_init *pdbg_init, 23918c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 23928c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 23938c2ecf20Sopenharmony_ci{ 23948c2ecf20Sopenharmony_ci struct cudbg_region_info region_info[CTXT_CNM + 1] = { {0} }; 23958c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 23968c2ecf20Sopenharmony_ci u32 j, size, max_ctx_size, max_ctx_qid; 23978c2ecf20Sopenharmony_ci u8 mem_type[CTXT_INGRESS + 1] = { 0 }; 23988c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 23998c2ecf20Sopenharmony_ci struct cudbg_ch_cntxt *buff; 24008c2ecf20Sopenharmony_ci u8 *ctx_buf; 24018c2ecf20Sopenharmony_ci u8 i, k; 24028c2ecf20Sopenharmony_ci int rc; 24038c2ecf20Sopenharmony_ci 24048c2ecf20Sopenharmony_ci /* Get max valid qid for each type of queue */ 24058c2ecf20Sopenharmony_ci rc = cudbg_get_ctxt_region_info(padap, region_info, mem_type); 24068c2ecf20Sopenharmony_ci if (rc) 24078c2ecf20Sopenharmony_ci return rc; 24088c2ecf20Sopenharmony_ci 24098c2ecf20Sopenharmony_ci rc = cudbg_dump_context_size(padap); 24108c2ecf20Sopenharmony_ci if (rc <= 0) 24118c2ecf20Sopenharmony_ci return CUDBG_STATUS_ENTITY_NOT_FOUND; 24128c2ecf20Sopenharmony_ci 24138c2ecf20Sopenharmony_ci size = rc; 24148c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 24158c2ecf20Sopenharmony_ci if (rc) 24168c2ecf20Sopenharmony_ci return rc; 24178c2ecf20Sopenharmony_ci 24188c2ecf20Sopenharmony_ci /* Get buffer with enough space to read the biggest context 24198c2ecf20Sopenharmony_ci * region in memory. 24208c2ecf20Sopenharmony_ci */ 24218c2ecf20Sopenharmony_ci max_ctx_size = max(region_info[CTXT_EGRESS].end - 24228c2ecf20Sopenharmony_ci region_info[CTXT_EGRESS].start + 1, 24238c2ecf20Sopenharmony_ci region_info[CTXT_INGRESS].end - 24248c2ecf20Sopenharmony_ci region_info[CTXT_INGRESS].start + 1); 24258c2ecf20Sopenharmony_ci 24268c2ecf20Sopenharmony_ci ctx_buf = kvzalloc(max_ctx_size, GFP_KERNEL); 24278c2ecf20Sopenharmony_ci if (!ctx_buf) { 24288c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 24298c2ecf20Sopenharmony_ci return -ENOMEM; 24308c2ecf20Sopenharmony_ci } 24318c2ecf20Sopenharmony_ci 24328c2ecf20Sopenharmony_ci buff = (struct cudbg_ch_cntxt *)temp_buff.data; 24338c2ecf20Sopenharmony_ci 24348c2ecf20Sopenharmony_ci /* Collect EGRESS and INGRESS context data. 24358c2ecf20Sopenharmony_ci * In case of failures, fallback to collecting via FW or 24368c2ecf20Sopenharmony_ci * backdoor access. 24378c2ecf20Sopenharmony_ci */ 24388c2ecf20Sopenharmony_ci for (i = CTXT_EGRESS; i <= CTXT_INGRESS; i++) { 24398c2ecf20Sopenharmony_ci if (!region_info[i].exist) { 24408c2ecf20Sopenharmony_ci max_ctx_qid = CUDBG_LOWMEM_MAX_CTXT_QIDS; 24418c2ecf20Sopenharmony_ci cudbg_get_sge_ctxt_fw(pdbg_init, max_ctx_qid, i, 24428c2ecf20Sopenharmony_ci &buff); 24438c2ecf20Sopenharmony_ci continue; 24448c2ecf20Sopenharmony_ci } 24458c2ecf20Sopenharmony_ci 24468c2ecf20Sopenharmony_ci max_ctx_size = region_info[i].end - region_info[i].start + 1; 24478c2ecf20Sopenharmony_ci max_ctx_qid = max_ctx_size / SGE_CTXT_SIZE; 24488c2ecf20Sopenharmony_ci 24498c2ecf20Sopenharmony_ci /* If firmware is not attached/alive, use backdoor register 24508c2ecf20Sopenharmony_ci * access to collect dump. 24518c2ecf20Sopenharmony_ci */ 24528c2ecf20Sopenharmony_ci if (is_fw_attached(pdbg_init)) { 24538c2ecf20Sopenharmony_ci t4_sge_ctxt_flush(padap, padap->mbox, i); 24548c2ecf20Sopenharmony_ci 24558c2ecf20Sopenharmony_ci rc = t4_memory_rw(padap, MEMWIN_NIC, mem_type[i], 24568c2ecf20Sopenharmony_ci region_info[i].start, max_ctx_size, 24578c2ecf20Sopenharmony_ci (__be32 *)ctx_buf, 1); 24588c2ecf20Sopenharmony_ci } 24598c2ecf20Sopenharmony_ci 24608c2ecf20Sopenharmony_ci if (rc || !is_fw_attached(pdbg_init)) { 24618c2ecf20Sopenharmony_ci max_ctx_qid = CUDBG_LOWMEM_MAX_CTXT_QIDS; 24628c2ecf20Sopenharmony_ci cudbg_get_sge_ctxt_fw(pdbg_init, max_ctx_qid, i, 24638c2ecf20Sopenharmony_ci &buff); 24648c2ecf20Sopenharmony_ci continue; 24658c2ecf20Sopenharmony_ci } 24668c2ecf20Sopenharmony_ci 24678c2ecf20Sopenharmony_ci for (j = 0; j < max_ctx_qid; j++) { 24688c2ecf20Sopenharmony_ci __be64 *dst_off; 24698c2ecf20Sopenharmony_ci u64 *src_off; 24708c2ecf20Sopenharmony_ci 24718c2ecf20Sopenharmony_ci src_off = (u64 *)(ctx_buf + j * SGE_CTXT_SIZE); 24728c2ecf20Sopenharmony_ci dst_off = (__be64 *)buff->data; 24738c2ecf20Sopenharmony_ci 24748c2ecf20Sopenharmony_ci /* The data is stored in 64-bit cpu order. Convert it 24758c2ecf20Sopenharmony_ci * to big endian before parsing. 24768c2ecf20Sopenharmony_ci */ 24778c2ecf20Sopenharmony_ci for (k = 0; k < SGE_CTXT_SIZE / sizeof(u64); k++) 24788c2ecf20Sopenharmony_ci dst_off[k] = cpu_to_be64(src_off[k]); 24798c2ecf20Sopenharmony_ci 24808c2ecf20Sopenharmony_ci rc = cudbg_sge_ctxt_check_valid(buff->data, i); 24818c2ecf20Sopenharmony_ci if (!rc) 24828c2ecf20Sopenharmony_ci continue; 24838c2ecf20Sopenharmony_ci 24848c2ecf20Sopenharmony_ci buff->cntxt_type = i; 24858c2ecf20Sopenharmony_ci buff->cntxt_id = j; 24868c2ecf20Sopenharmony_ci buff++; 24878c2ecf20Sopenharmony_ci } 24888c2ecf20Sopenharmony_ci } 24898c2ecf20Sopenharmony_ci 24908c2ecf20Sopenharmony_ci kvfree(ctx_buf); 24918c2ecf20Sopenharmony_ci 24928c2ecf20Sopenharmony_ci /* Collect FREELIST and CONGESTION MANAGER contexts */ 24938c2ecf20Sopenharmony_ci max_ctx_size = region_info[CTXT_FLM].end - 24948c2ecf20Sopenharmony_ci region_info[CTXT_FLM].start + 1; 24958c2ecf20Sopenharmony_ci max_ctx_qid = max_ctx_size / SGE_CTXT_SIZE; 24968c2ecf20Sopenharmony_ci /* Since FLM and CONM are 1-to-1 mapped, the below function 24978c2ecf20Sopenharmony_ci * will fetch both FLM and CONM contexts. 24988c2ecf20Sopenharmony_ci */ 24998c2ecf20Sopenharmony_ci cudbg_get_sge_ctxt_fw(pdbg_init, max_ctx_qid, CTXT_FLM, &buff); 25008c2ecf20Sopenharmony_ci 25018c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 25028c2ecf20Sopenharmony_ci} 25038c2ecf20Sopenharmony_ci 25048c2ecf20Sopenharmony_cistatic inline void cudbg_tcamxy2valmask(u64 x, u64 y, u8 *addr, u64 *mask) 25058c2ecf20Sopenharmony_ci{ 25068c2ecf20Sopenharmony_ci *mask = x | y; 25078c2ecf20Sopenharmony_ci y = (__force u64)cpu_to_be64(y); 25088c2ecf20Sopenharmony_ci memcpy(addr, (char *)&y + 2, ETH_ALEN); 25098c2ecf20Sopenharmony_ci} 25108c2ecf20Sopenharmony_ci 25118c2ecf20Sopenharmony_cistatic void cudbg_mps_rpl_backdoor(struct adapter *padap, 25128c2ecf20Sopenharmony_ci struct fw_ldst_mps_rplc *mps_rplc) 25138c2ecf20Sopenharmony_ci{ 25148c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) { 25158c2ecf20Sopenharmony_ci mps_rplc->rplc255_224 = htonl(t4_read_reg(padap, 25168c2ecf20Sopenharmony_ci MPS_VF_RPLCT_MAP3_A)); 25178c2ecf20Sopenharmony_ci mps_rplc->rplc223_192 = htonl(t4_read_reg(padap, 25188c2ecf20Sopenharmony_ci MPS_VF_RPLCT_MAP2_A)); 25198c2ecf20Sopenharmony_ci mps_rplc->rplc191_160 = htonl(t4_read_reg(padap, 25208c2ecf20Sopenharmony_ci MPS_VF_RPLCT_MAP1_A)); 25218c2ecf20Sopenharmony_ci mps_rplc->rplc159_128 = htonl(t4_read_reg(padap, 25228c2ecf20Sopenharmony_ci MPS_VF_RPLCT_MAP0_A)); 25238c2ecf20Sopenharmony_ci } else { 25248c2ecf20Sopenharmony_ci mps_rplc->rplc255_224 = htonl(t4_read_reg(padap, 25258c2ecf20Sopenharmony_ci MPS_VF_RPLCT_MAP7_A)); 25268c2ecf20Sopenharmony_ci mps_rplc->rplc223_192 = htonl(t4_read_reg(padap, 25278c2ecf20Sopenharmony_ci MPS_VF_RPLCT_MAP6_A)); 25288c2ecf20Sopenharmony_ci mps_rplc->rplc191_160 = htonl(t4_read_reg(padap, 25298c2ecf20Sopenharmony_ci MPS_VF_RPLCT_MAP5_A)); 25308c2ecf20Sopenharmony_ci mps_rplc->rplc159_128 = htonl(t4_read_reg(padap, 25318c2ecf20Sopenharmony_ci MPS_VF_RPLCT_MAP4_A)); 25328c2ecf20Sopenharmony_ci } 25338c2ecf20Sopenharmony_ci mps_rplc->rplc127_96 = htonl(t4_read_reg(padap, MPS_VF_RPLCT_MAP3_A)); 25348c2ecf20Sopenharmony_ci mps_rplc->rplc95_64 = htonl(t4_read_reg(padap, MPS_VF_RPLCT_MAP2_A)); 25358c2ecf20Sopenharmony_ci mps_rplc->rplc63_32 = htonl(t4_read_reg(padap, MPS_VF_RPLCT_MAP1_A)); 25368c2ecf20Sopenharmony_ci mps_rplc->rplc31_0 = htonl(t4_read_reg(padap, MPS_VF_RPLCT_MAP0_A)); 25378c2ecf20Sopenharmony_ci} 25388c2ecf20Sopenharmony_ci 25398c2ecf20Sopenharmony_cistatic int cudbg_collect_tcam_index(struct cudbg_init *pdbg_init, 25408c2ecf20Sopenharmony_ci struct cudbg_mps_tcam *tcam, u32 idx) 25418c2ecf20Sopenharmony_ci{ 25428c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 25438c2ecf20Sopenharmony_ci u64 tcamy, tcamx, val; 25448c2ecf20Sopenharmony_ci u32 ctl, data2; 25458c2ecf20Sopenharmony_ci int rc = 0; 25468c2ecf20Sopenharmony_ci 25478c2ecf20Sopenharmony_ci if (CHELSIO_CHIP_VERSION(padap->params.chip) >= CHELSIO_T6) { 25488c2ecf20Sopenharmony_ci /* CtlReqID - 1: use Host Driver Requester ID 25498c2ecf20Sopenharmony_ci * CtlCmdType - 0: Read, 1: Write 25508c2ecf20Sopenharmony_ci * CtlTcamSel - 0: TCAM0, 1: TCAM1 25518c2ecf20Sopenharmony_ci * CtlXYBitSel- 0: Y bit, 1: X bit 25528c2ecf20Sopenharmony_ci */ 25538c2ecf20Sopenharmony_ci 25548c2ecf20Sopenharmony_ci /* Read tcamy */ 25558c2ecf20Sopenharmony_ci ctl = CTLREQID_V(1) | CTLCMDTYPE_V(0) | CTLXYBITSEL_V(0); 25568c2ecf20Sopenharmony_ci if (idx < 256) 25578c2ecf20Sopenharmony_ci ctl |= CTLTCAMINDEX_V(idx) | CTLTCAMSEL_V(0); 25588c2ecf20Sopenharmony_ci else 25598c2ecf20Sopenharmony_ci ctl |= CTLTCAMINDEX_V(idx - 256) | CTLTCAMSEL_V(1); 25608c2ecf20Sopenharmony_ci 25618c2ecf20Sopenharmony_ci t4_write_reg(padap, MPS_CLS_TCAM_DATA2_CTL_A, ctl); 25628c2ecf20Sopenharmony_ci val = t4_read_reg(padap, MPS_CLS_TCAM_RDATA1_REQ_ID1_A); 25638c2ecf20Sopenharmony_ci tcamy = DMACH_G(val) << 32; 25648c2ecf20Sopenharmony_ci tcamy |= t4_read_reg(padap, MPS_CLS_TCAM_RDATA0_REQ_ID1_A); 25658c2ecf20Sopenharmony_ci data2 = t4_read_reg(padap, MPS_CLS_TCAM_RDATA2_REQ_ID1_A); 25668c2ecf20Sopenharmony_ci tcam->lookup_type = DATALKPTYPE_G(data2); 25678c2ecf20Sopenharmony_ci 25688c2ecf20Sopenharmony_ci /* 0 - Outer header, 1 - Inner header 25698c2ecf20Sopenharmony_ci * [71:48] bit locations are overloaded for 25708c2ecf20Sopenharmony_ci * outer vs. inner lookup types. 25718c2ecf20Sopenharmony_ci */ 25728c2ecf20Sopenharmony_ci if (tcam->lookup_type && tcam->lookup_type != DATALKPTYPE_M) { 25738c2ecf20Sopenharmony_ci /* Inner header VNI */ 25748c2ecf20Sopenharmony_ci tcam->vniy = (data2 & DATAVIDH2_F) | DATAVIDH1_G(data2); 25758c2ecf20Sopenharmony_ci tcam->vniy = (tcam->vniy << 16) | VIDL_G(val); 25768c2ecf20Sopenharmony_ci tcam->dip_hit = data2 & DATADIPHIT_F; 25778c2ecf20Sopenharmony_ci } else { 25788c2ecf20Sopenharmony_ci tcam->vlan_vld = data2 & DATAVIDH2_F; 25798c2ecf20Sopenharmony_ci tcam->ivlan = VIDL_G(val); 25808c2ecf20Sopenharmony_ci } 25818c2ecf20Sopenharmony_ci 25828c2ecf20Sopenharmony_ci tcam->port_num = DATAPORTNUM_G(data2); 25838c2ecf20Sopenharmony_ci 25848c2ecf20Sopenharmony_ci /* Read tcamx. Change the control param */ 25858c2ecf20Sopenharmony_ci ctl |= CTLXYBITSEL_V(1); 25868c2ecf20Sopenharmony_ci t4_write_reg(padap, MPS_CLS_TCAM_DATA2_CTL_A, ctl); 25878c2ecf20Sopenharmony_ci val = t4_read_reg(padap, MPS_CLS_TCAM_RDATA1_REQ_ID1_A); 25888c2ecf20Sopenharmony_ci tcamx = DMACH_G(val) << 32; 25898c2ecf20Sopenharmony_ci tcamx |= t4_read_reg(padap, MPS_CLS_TCAM_RDATA0_REQ_ID1_A); 25908c2ecf20Sopenharmony_ci data2 = t4_read_reg(padap, MPS_CLS_TCAM_RDATA2_REQ_ID1_A); 25918c2ecf20Sopenharmony_ci if (tcam->lookup_type && tcam->lookup_type != DATALKPTYPE_M) { 25928c2ecf20Sopenharmony_ci /* Inner header VNI mask */ 25938c2ecf20Sopenharmony_ci tcam->vnix = (data2 & DATAVIDH2_F) | DATAVIDH1_G(data2); 25948c2ecf20Sopenharmony_ci tcam->vnix = (tcam->vnix << 16) | VIDL_G(val); 25958c2ecf20Sopenharmony_ci } 25968c2ecf20Sopenharmony_ci } else { 25978c2ecf20Sopenharmony_ci tcamy = t4_read_reg64(padap, MPS_CLS_TCAM_Y_L(idx)); 25988c2ecf20Sopenharmony_ci tcamx = t4_read_reg64(padap, MPS_CLS_TCAM_X_L(idx)); 25998c2ecf20Sopenharmony_ci } 26008c2ecf20Sopenharmony_ci 26018c2ecf20Sopenharmony_ci /* If no entry, return */ 26028c2ecf20Sopenharmony_ci if (tcamx & tcamy) 26038c2ecf20Sopenharmony_ci return rc; 26048c2ecf20Sopenharmony_ci 26058c2ecf20Sopenharmony_ci tcam->cls_lo = t4_read_reg(padap, MPS_CLS_SRAM_L(idx)); 26068c2ecf20Sopenharmony_ci tcam->cls_hi = t4_read_reg(padap, MPS_CLS_SRAM_H(idx)); 26078c2ecf20Sopenharmony_ci 26088c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) 26098c2ecf20Sopenharmony_ci tcam->repli = (tcam->cls_lo & REPLICATE_F); 26108c2ecf20Sopenharmony_ci else if (is_t6(padap->params.chip)) 26118c2ecf20Sopenharmony_ci tcam->repli = (tcam->cls_lo & T6_REPLICATE_F); 26128c2ecf20Sopenharmony_ci 26138c2ecf20Sopenharmony_ci if (tcam->repli) { 26148c2ecf20Sopenharmony_ci struct fw_ldst_cmd ldst_cmd; 26158c2ecf20Sopenharmony_ci struct fw_ldst_mps_rplc mps_rplc; 26168c2ecf20Sopenharmony_ci 26178c2ecf20Sopenharmony_ci memset(&ldst_cmd, 0, sizeof(ldst_cmd)); 26188c2ecf20Sopenharmony_ci ldst_cmd.op_to_addrspace = 26198c2ecf20Sopenharmony_ci htonl(FW_CMD_OP_V(FW_LDST_CMD) | 26208c2ecf20Sopenharmony_ci FW_CMD_REQUEST_F | FW_CMD_READ_F | 26218c2ecf20Sopenharmony_ci FW_LDST_CMD_ADDRSPACE_V(FW_LDST_ADDRSPC_MPS)); 26228c2ecf20Sopenharmony_ci ldst_cmd.cycles_to_len16 = htonl(FW_LEN16(ldst_cmd)); 26238c2ecf20Sopenharmony_ci ldst_cmd.u.mps.rplc.fid_idx = 26248c2ecf20Sopenharmony_ci htons(FW_LDST_CMD_FID_V(FW_LDST_MPS_RPLC) | 26258c2ecf20Sopenharmony_ci FW_LDST_CMD_IDX_V(idx)); 26268c2ecf20Sopenharmony_ci 26278c2ecf20Sopenharmony_ci /* If firmware is not attached/alive, use backdoor register 26288c2ecf20Sopenharmony_ci * access to collect dump. 26298c2ecf20Sopenharmony_ci */ 26308c2ecf20Sopenharmony_ci if (is_fw_attached(pdbg_init)) 26318c2ecf20Sopenharmony_ci rc = t4_wr_mbox(padap, padap->mbox, &ldst_cmd, 26328c2ecf20Sopenharmony_ci sizeof(ldst_cmd), &ldst_cmd); 26338c2ecf20Sopenharmony_ci 26348c2ecf20Sopenharmony_ci if (rc || !is_fw_attached(pdbg_init)) { 26358c2ecf20Sopenharmony_ci cudbg_mps_rpl_backdoor(padap, &mps_rplc); 26368c2ecf20Sopenharmony_ci /* Ignore error since we collected directly from 26378c2ecf20Sopenharmony_ci * reading registers. 26388c2ecf20Sopenharmony_ci */ 26398c2ecf20Sopenharmony_ci rc = 0; 26408c2ecf20Sopenharmony_ci } else { 26418c2ecf20Sopenharmony_ci mps_rplc = ldst_cmd.u.mps.rplc; 26428c2ecf20Sopenharmony_ci } 26438c2ecf20Sopenharmony_ci 26448c2ecf20Sopenharmony_ci tcam->rplc[0] = ntohl(mps_rplc.rplc31_0); 26458c2ecf20Sopenharmony_ci tcam->rplc[1] = ntohl(mps_rplc.rplc63_32); 26468c2ecf20Sopenharmony_ci tcam->rplc[2] = ntohl(mps_rplc.rplc95_64); 26478c2ecf20Sopenharmony_ci tcam->rplc[3] = ntohl(mps_rplc.rplc127_96); 26488c2ecf20Sopenharmony_ci if (padap->params.arch.mps_rplc_size > CUDBG_MAX_RPLC_SIZE) { 26498c2ecf20Sopenharmony_ci tcam->rplc[4] = ntohl(mps_rplc.rplc159_128); 26508c2ecf20Sopenharmony_ci tcam->rplc[5] = ntohl(mps_rplc.rplc191_160); 26518c2ecf20Sopenharmony_ci tcam->rplc[6] = ntohl(mps_rplc.rplc223_192); 26528c2ecf20Sopenharmony_ci tcam->rplc[7] = ntohl(mps_rplc.rplc255_224); 26538c2ecf20Sopenharmony_ci } 26548c2ecf20Sopenharmony_ci } 26558c2ecf20Sopenharmony_ci cudbg_tcamxy2valmask(tcamx, tcamy, tcam->addr, &tcam->mask); 26568c2ecf20Sopenharmony_ci tcam->idx = idx; 26578c2ecf20Sopenharmony_ci tcam->rplc_size = padap->params.arch.mps_rplc_size; 26588c2ecf20Sopenharmony_ci return rc; 26598c2ecf20Sopenharmony_ci} 26608c2ecf20Sopenharmony_ci 26618c2ecf20Sopenharmony_ciint cudbg_collect_mps_tcam(struct cudbg_init *pdbg_init, 26628c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 26638c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 26648c2ecf20Sopenharmony_ci{ 26658c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 26668c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 26678c2ecf20Sopenharmony_ci u32 size = 0, i, n, total_size = 0; 26688c2ecf20Sopenharmony_ci struct cudbg_mps_tcam *tcam; 26698c2ecf20Sopenharmony_ci int rc; 26708c2ecf20Sopenharmony_ci 26718c2ecf20Sopenharmony_ci n = padap->params.arch.mps_tcam_size; 26728c2ecf20Sopenharmony_ci size = sizeof(struct cudbg_mps_tcam) * n; 26738c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 26748c2ecf20Sopenharmony_ci if (rc) 26758c2ecf20Sopenharmony_ci return rc; 26768c2ecf20Sopenharmony_ci 26778c2ecf20Sopenharmony_ci tcam = (struct cudbg_mps_tcam *)temp_buff.data; 26788c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 26798c2ecf20Sopenharmony_ci rc = cudbg_collect_tcam_index(pdbg_init, tcam, i); 26808c2ecf20Sopenharmony_ci if (rc) { 26818c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 26828c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 26838c2ecf20Sopenharmony_ci return rc; 26848c2ecf20Sopenharmony_ci } 26858c2ecf20Sopenharmony_ci total_size += sizeof(struct cudbg_mps_tcam); 26868c2ecf20Sopenharmony_ci tcam++; 26878c2ecf20Sopenharmony_ci } 26888c2ecf20Sopenharmony_ci 26898c2ecf20Sopenharmony_ci if (!total_size) { 26908c2ecf20Sopenharmony_ci rc = CUDBG_SYSTEM_ERROR; 26918c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 26928c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 26938c2ecf20Sopenharmony_ci return rc; 26948c2ecf20Sopenharmony_ci } 26958c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 26968c2ecf20Sopenharmony_ci} 26978c2ecf20Sopenharmony_ci 26988c2ecf20Sopenharmony_ciint cudbg_collect_vpd_data(struct cudbg_init *pdbg_init, 26998c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 27008c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 27018c2ecf20Sopenharmony_ci{ 27028c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 27038c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 27048c2ecf20Sopenharmony_ci char vpd_str[CUDBG_VPD_VER_LEN + 1]; 27058c2ecf20Sopenharmony_ci u32 scfg_vers, vpd_vers, fw_vers; 27068c2ecf20Sopenharmony_ci struct cudbg_vpd_data *vpd_data; 27078c2ecf20Sopenharmony_ci struct vpd_params vpd = { 0 }; 27088c2ecf20Sopenharmony_ci int rc, ret; 27098c2ecf20Sopenharmony_ci 27108c2ecf20Sopenharmony_ci rc = t4_get_raw_vpd_params(padap, &vpd); 27118c2ecf20Sopenharmony_ci if (rc) 27128c2ecf20Sopenharmony_ci return rc; 27138c2ecf20Sopenharmony_ci 27148c2ecf20Sopenharmony_ci rc = t4_get_fw_version(padap, &fw_vers); 27158c2ecf20Sopenharmony_ci if (rc) 27168c2ecf20Sopenharmony_ci return rc; 27178c2ecf20Sopenharmony_ci 27188c2ecf20Sopenharmony_ci /* Serial Configuration Version is located beyond the PF's vpd size. 27198c2ecf20Sopenharmony_ci * Temporarily give access to entire EEPROM to get it. 27208c2ecf20Sopenharmony_ci */ 27218c2ecf20Sopenharmony_ci rc = pci_set_vpd_size(padap->pdev, EEPROMVSIZE); 27228c2ecf20Sopenharmony_ci if (rc < 0) 27238c2ecf20Sopenharmony_ci return rc; 27248c2ecf20Sopenharmony_ci 27258c2ecf20Sopenharmony_ci ret = cudbg_read_vpd_reg(padap, CUDBG_SCFG_VER_ADDR, CUDBG_SCFG_VER_LEN, 27268c2ecf20Sopenharmony_ci &scfg_vers); 27278c2ecf20Sopenharmony_ci 27288c2ecf20Sopenharmony_ci /* Restore back to original PF's vpd size */ 27298c2ecf20Sopenharmony_ci rc = pci_set_vpd_size(padap->pdev, CUDBG_VPD_PF_SIZE); 27308c2ecf20Sopenharmony_ci if (rc < 0) 27318c2ecf20Sopenharmony_ci return rc; 27328c2ecf20Sopenharmony_ci 27338c2ecf20Sopenharmony_ci if (ret) 27348c2ecf20Sopenharmony_ci return ret; 27358c2ecf20Sopenharmony_ci 27368c2ecf20Sopenharmony_ci rc = cudbg_read_vpd_reg(padap, CUDBG_VPD_VER_ADDR, CUDBG_VPD_VER_LEN, 27378c2ecf20Sopenharmony_ci vpd_str); 27388c2ecf20Sopenharmony_ci if (rc) 27398c2ecf20Sopenharmony_ci return rc; 27408c2ecf20Sopenharmony_ci 27418c2ecf20Sopenharmony_ci vpd_str[CUDBG_VPD_VER_LEN] = '\0'; 27428c2ecf20Sopenharmony_ci rc = kstrtouint(vpd_str, 0, &vpd_vers); 27438c2ecf20Sopenharmony_ci if (rc) 27448c2ecf20Sopenharmony_ci return rc; 27458c2ecf20Sopenharmony_ci 27468c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_vpd_data), 27478c2ecf20Sopenharmony_ci &temp_buff); 27488c2ecf20Sopenharmony_ci if (rc) 27498c2ecf20Sopenharmony_ci return rc; 27508c2ecf20Sopenharmony_ci 27518c2ecf20Sopenharmony_ci vpd_data = (struct cudbg_vpd_data *)temp_buff.data; 27528c2ecf20Sopenharmony_ci memcpy(vpd_data->sn, vpd.sn, SERNUM_LEN + 1); 27538c2ecf20Sopenharmony_ci memcpy(vpd_data->bn, vpd.pn, PN_LEN + 1); 27548c2ecf20Sopenharmony_ci memcpy(vpd_data->na, vpd.na, MACADDR_LEN + 1); 27558c2ecf20Sopenharmony_ci memcpy(vpd_data->mn, vpd.id, ID_LEN + 1); 27568c2ecf20Sopenharmony_ci vpd_data->scfg_vers = scfg_vers; 27578c2ecf20Sopenharmony_ci vpd_data->vpd_vers = vpd_vers; 27588c2ecf20Sopenharmony_ci vpd_data->fw_major = FW_HDR_FW_VER_MAJOR_G(fw_vers); 27598c2ecf20Sopenharmony_ci vpd_data->fw_minor = FW_HDR_FW_VER_MINOR_G(fw_vers); 27608c2ecf20Sopenharmony_ci vpd_data->fw_micro = FW_HDR_FW_VER_MICRO_G(fw_vers); 27618c2ecf20Sopenharmony_ci vpd_data->fw_build = FW_HDR_FW_VER_BUILD_G(fw_vers); 27628c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 27638c2ecf20Sopenharmony_ci} 27648c2ecf20Sopenharmony_ci 27658c2ecf20Sopenharmony_cistatic int cudbg_read_tid(struct cudbg_init *pdbg_init, u32 tid, 27668c2ecf20Sopenharmony_ci struct cudbg_tid_data *tid_data) 27678c2ecf20Sopenharmony_ci{ 27688c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 27698c2ecf20Sopenharmony_ci int i, cmd_retry = 8; 27708c2ecf20Sopenharmony_ci u32 val; 27718c2ecf20Sopenharmony_ci 27728c2ecf20Sopenharmony_ci /* Fill REQ_DATA regs with 0's */ 27738c2ecf20Sopenharmony_ci for (i = 0; i < NUM_LE_DB_DBGI_REQ_DATA_INSTANCES; i++) 27748c2ecf20Sopenharmony_ci t4_write_reg(padap, LE_DB_DBGI_REQ_DATA_A + (i << 2), 0); 27758c2ecf20Sopenharmony_ci 27768c2ecf20Sopenharmony_ci /* Write DBIG command */ 27778c2ecf20Sopenharmony_ci val = DBGICMD_V(4) | DBGITID_V(tid); 27788c2ecf20Sopenharmony_ci t4_write_reg(padap, LE_DB_DBGI_REQ_TCAM_CMD_A, val); 27798c2ecf20Sopenharmony_ci tid_data->dbig_cmd = val; 27808c2ecf20Sopenharmony_ci 27818c2ecf20Sopenharmony_ci val = DBGICMDSTRT_F | DBGICMDMODE_V(1); /* LE mode */ 27828c2ecf20Sopenharmony_ci t4_write_reg(padap, LE_DB_DBGI_CONFIG_A, val); 27838c2ecf20Sopenharmony_ci tid_data->dbig_conf = val; 27848c2ecf20Sopenharmony_ci 27858c2ecf20Sopenharmony_ci /* Poll the DBGICMDBUSY bit */ 27868c2ecf20Sopenharmony_ci val = 1; 27878c2ecf20Sopenharmony_ci while (val) { 27888c2ecf20Sopenharmony_ci val = t4_read_reg(padap, LE_DB_DBGI_CONFIG_A); 27898c2ecf20Sopenharmony_ci val = val & DBGICMDBUSY_F; 27908c2ecf20Sopenharmony_ci cmd_retry--; 27918c2ecf20Sopenharmony_ci if (!cmd_retry) 27928c2ecf20Sopenharmony_ci return CUDBG_SYSTEM_ERROR; 27938c2ecf20Sopenharmony_ci } 27948c2ecf20Sopenharmony_ci 27958c2ecf20Sopenharmony_ci /* Check RESP status */ 27968c2ecf20Sopenharmony_ci val = t4_read_reg(padap, LE_DB_DBGI_RSP_STATUS_A); 27978c2ecf20Sopenharmony_ci tid_data->dbig_rsp_stat = val; 27988c2ecf20Sopenharmony_ci if (!(val & 1)) 27998c2ecf20Sopenharmony_ci return CUDBG_SYSTEM_ERROR; 28008c2ecf20Sopenharmony_ci 28018c2ecf20Sopenharmony_ci /* Read RESP data */ 28028c2ecf20Sopenharmony_ci for (i = 0; i < NUM_LE_DB_DBGI_RSP_DATA_INSTANCES; i++) 28038c2ecf20Sopenharmony_ci tid_data->data[i] = t4_read_reg(padap, 28048c2ecf20Sopenharmony_ci LE_DB_DBGI_RSP_DATA_A + 28058c2ecf20Sopenharmony_ci (i << 2)); 28068c2ecf20Sopenharmony_ci tid_data->tid = tid; 28078c2ecf20Sopenharmony_ci return 0; 28088c2ecf20Sopenharmony_ci} 28098c2ecf20Sopenharmony_ci 28108c2ecf20Sopenharmony_cistatic int cudbg_get_le_type(u32 tid, struct cudbg_tcam tcam_region) 28118c2ecf20Sopenharmony_ci{ 28128c2ecf20Sopenharmony_ci int type = LE_ET_UNKNOWN; 28138c2ecf20Sopenharmony_ci 28148c2ecf20Sopenharmony_ci if (tid < tcam_region.server_start) 28158c2ecf20Sopenharmony_ci type = LE_ET_TCAM_CON; 28168c2ecf20Sopenharmony_ci else if (tid < tcam_region.filter_start) 28178c2ecf20Sopenharmony_ci type = LE_ET_TCAM_SERVER; 28188c2ecf20Sopenharmony_ci else if (tid < tcam_region.clip_start) 28198c2ecf20Sopenharmony_ci type = LE_ET_TCAM_FILTER; 28208c2ecf20Sopenharmony_ci else if (tid < tcam_region.routing_start) 28218c2ecf20Sopenharmony_ci type = LE_ET_TCAM_CLIP; 28228c2ecf20Sopenharmony_ci else if (tid < tcam_region.tid_hash_base) 28238c2ecf20Sopenharmony_ci type = LE_ET_TCAM_ROUTING; 28248c2ecf20Sopenharmony_ci else if (tid < tcam_region.max_tid) 28258c2ecf20Sopenharmony_ci type = LE_ET_HASH_CON; 28268c2ecf20Sopenharmony_ci else 28278c2ecf20Sopenharmony_ci type = LE_ET_INVALID_TID; 28288c2ecf20Sopenharmony_ci 28298c2ecf20Sopenharmony_ci return type; 28308c2ecf20Sopenharmony_ci} 28318c2ecf20Sopenharmony_ci 28328c2ecf20Sopenharmony_cistatic int cudbg_is_ipv6_entry(struct cudbg_tid_data *tid_data, 28338c2ecf20Sopenharmony_ci struct cudbg_tcam tcam_region) 28348c2ecf20Sopenharmony_ci{ 28358c2ecf20Sopenharmony_ci int ipv6 = 0; 28368c2ecf20Sopenharmony_ci int le_type; 28378c2ecf20Sopenharmony_ci 28388c2ecf20Sopenharmony_ci le_type = cudbg_get_le_type(tid_data->tid, tcam_region); 28398c2ecf20Sopenharmony_ci if (tid_data->tid & 1) 28408c2ecf20Sopenharmony_ci return 0; 28418c2ecf20Sopenharmony_ci 28428c2ecf20Sopenharmony_ci if (le_type == LE_ET_HASH_CON) { 28438c2ecf20Sopenharmony_ci ipv6 = tid_data->data[16] & 0x8000; 28448c2ecf20Sopenharmony_ci } else if (le_type == LE_ET_TCAM_CON) { 28458c2ecf20Sopenharmony_ci ipv6 = tid_data->data[16] & 0x8000; 28468c2ecf20Sopenharmony_ci if (ipv6) 28478c2ecf20Sopenharmony_ci ipv6 = tid_data->data[9] == 0x00C00000; 28488c2ecf20Sopenharmony_ci } else { 28498c2ecf20Sopenharmony_ci ipv6 = 0; 28508c2ecf20Sopenharmony_ci } 28518c2ecf20Sopenharmony_ci return ipv6; 28528c2ecf20Sopenharmony_ci} 28538c2ecf20Sopenharmony_ci 28548c2ecf20Sopenharmony_civoid cudbg_fill_le_tcam_info(struct adapter *padap, 28558c2ecf20Sopenharmony_ci struct cudbg_tcam *tcam_region) 28568c2ecf20Sopenharmony_ci{ 28578c2ecf20Sopenharmony_ci u32 value; 28588c2ecf20Sopenharmony_ci 28598c2ecf20Sopenharmony_ci /* Get the LE regions */ 28608c2ecf20Sopenharmony_ci value = t4_read_reg(padap, LE_DB_TID_HASHBASE_A); /* hash base index */ 28618c2ecf20Sopenharmony_ci tcam_region->tid_hash_base = value; 28628c2ecf20Sopenharmony_ci 28638c2ecf20Sopenharmony_ci /* Get routing table index */ 28648c2ecf20Sopenharmony_ci value = t4_read_reg(padap, LE_DB_ROUTING_TABLE_INDEX_A); 28658c2ecf20Sopenharmony_ci tcam_region->routing_start = value; 28668c2ecf20Sopenharmony_ci 28678c2ecf20Sopenharmony_ci /* Get clip table index. For T6 there is separate CLIP TCAM */ 28688c2ecf20Sopenharmony_ci if (is_t6(padap->params.chip)) 28698c2ecf20Sopenharmony_ci value = t4_read_reg(padap, LE_DB_CLCAM_TID_BASE_A); 28708c2ecf20Sopenharmony_ci else 28718c2ecf20Sopenharmony_ci value = t4_read_reg(padap, LE_DB_CLIP_TABLE_INDEX_A); 28728c2ecf20Sopenharmony_ci tcam_region->clip_start = value; 28738c2ecf20Sopenharmony_ci 28748c2ecf20Sopenharmony_ci /* Get filter table index */ 28758c2ecf20Sopenharmony_ci value = t4_read_reg(padap, LE_DB_FILTER_TABLE_INDEX_A); 28768c2ecf20Sopenharmony_ci tcam_region->filter_start = value; 28778c2ecf20Sopenharmony_ci 28788c2ecf20Sopenharmony_ci /* Get server table index */ 28798c2ecf20Sopenharmony_ci value = t4_read_reg(padap, LE_DB_SERVER_INDEX_A); 28808c2ecf20Sopenharmony_ci tcam_region->server_start = value; 28818c2ecf20Sopenharmony_ci 28828c2ecf20Sopenharmony_ci /* Check whether hash is enabled and calculate the max tids */ 28838c2ecf20Sopenharmony_ci value = t4_read_reg(padap, LE_DB_CONFIG_A); 28848c2ecf20Sopenharmony_ci if ((value >> HASHEN_S) & 1) { 28858c2ecf20Sopenharmony_ci value = t4_read_reg(padap, LE_DB_HASH_CONFIG_A); 28868c2ecf20Sopenharmony_ci if (CHELSIO_CHIP_VERSION(padap->params.chip) > CHELSIO_T5) { 28878c2ecf20Sopenharmony_ci tcam_region->max_tid = (value & 0xFFFFF) + 28888c2ecf20Sopenharmony_ci tcam_region->tid_hash_base; 28898c2ecf20Sopenharmony_ci } else { 28908c2ecf20Sopenharmony_ci value = HASHTIDSIZE_G(value); 28918c2ecf20Sopenharmony_ci value = 1 << value; 28928c2ecf20Sopenharmony_ci tcam_region->max_tid = value + 28938c2ecf20Sopenharmony_ci tcam_region->tid_hash_base; 28948c2ecf20Sopenharmony_ci } 28958c2ecf20Sopenharmony_ci } else { /* hash not enabled */ 28968c2ecf20Sopenharmony_ci if (is_t6(padap->params.chip)) 28978c2ecf20Sopenharmony_ci tcam_region->max_tid = (value & ASLIPCOMPEN_F) ? 28988c2ecf20Sopenharmony_ci CUDBG_MAX_TID_COMP_EN : 28998c2ecf20Sopenharmony_ci CUDBG_MAX_TID_COMP_DIS; 29008c2ecf20Sopenharmony_ci else 29018c2ecf20Sopenharmony_ci tcam_region->max_tid = CUDBG_MAX_TCAM_TID; 29028c2ecf20Sopenharmony_ci } 29038c2ecf20Sopenharmony_ci 29048c2ecf20Sopenharmony_ci if (is_t6(padap->params.chip)) 29058c2ecf20Sopenharmony_ci tcam_region->max_tid += CUDBG_T6_CLIP; 29068c2ecf20Sopenharmony_ci} 29078c2ecf20Sopenharmony_ci 29088c2ecf20Sopenharmony_ciint cudbg_collect_le_tcam(struct cudbg_init *pdbg_init, 29098c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 29108c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 29118c2ecf20Sopenharmony_ci{ 29128c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 29138c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 29148c2ecf20Sopenharmony_ci struct cudbg_tcam tcam_region = { 0 }; 29158c2ecf20Sopenharmony_ci struct cudbg_tid_data *tid_data; 29168c2ecf20Sopenharmony_ci u32 bytes = 0; 29178c2ecf20Sopenharmony_ci int rc, size; 29188c2ecf20Sopenharmony_ci u32 i; 29198c2ecf20Sopenharmony_ci 29208c2ecf20Sopenharmony_ci cudbg_fill_le_tcam_info(padap, &tcam_region); 29218c2ecf20Sopenharmony_ci 29228c2ecf20Sopenharmony_ci size = sizeof(struct cudbg_tid_data) * tcam_region.max_tid; 29238c2ecf20Sopenharmony_ci size += sizeof(struct cudbg_tcam); 29248c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 29258c2ecf20Sopenharmony_ci if (rc) 29268c2ecf20Sopenharmony_ci return rc; 29278c2ecf20Sopenharmony_ci 29288c2ecf20Sopenharmony_ci memcpy(temp_buff.data, &tcam_region, sizeof(struct cudbg_tcam)); 29298c2ecf20Sopenharmony_ci bytes = sizeof(struct cudbg_tcam); 29308c2ecf20Sopenharmony_ci tid_data = (struct cudbg_tid_data *)(temp_buff.data + bytes); 29318c2ecf20Sopenharmony_ci /* read all tid */ 29328c2ecf20Sopenharmony_ci for (i = 0; i < tcam_region.max_tid; ) { 29338c2ecf20Sopenharmony_ci rc = cudbg_read_tid(pdbg_init, i, tid_data); 29348c2ecf20Sopenharmony_ci if (rc) { 29358c2ecf20Sopenharmony_ci cudbg_err->sys_warn = CUDBG_STATUS_PARTIAL_DATA; 29368c2ecf20Sopenharmony_ci /* Update tcam header and exit */ 29378c2ecf20Sopenharmony_ci tcam_region.max_tid = i; 29388c2ecf20Sopenharmony_ci memcpy(temp_buff.data, &tcam_region, 29398c2ecf20Sopenharmony_ci sizeof(struct cudbg_tcam)); 29408c2ecf20Sopenharmony_ci goto out; 29418c2ecf20Sopenharmony_ci } 29428c2ecf20Sopenharmony_ci 29438c2ecf20Sopenharmony_ci if (cudbg_is_ipv6_entry(tid_data, tcam_region)) { 29448c2ecf20Sopenharmony_ci /* T6 CLIP TCAM: ipv6 takes 4 entries */ 29458c2ecf20Sopenharmony_ci if (is_t6(padap->params.chip) && 29468c2ecf20Sopenharmony_ci i >= tcam_region.clip_start && 29478c2ecf20Sopenharmony_ci i < tcam_region.clip_start + CUDBG_T6_CLIP) 29488c2ecf20Sopenharmony_ci i += 4; 29498c2ecf20Sopenharmony_ci else /* Main TCAM: ipv6 takes two tids */ 29508c2ecf20Sopenharmony_ci i += 2; 29518c2ecf20Sopenharmony_ci } else { 29528c2ecf20Sopenharmony_ci i++; 29538c2ecf20Sopenharmony_ci } 29548c2ecf20Sopenharmony_ci 29558c2ecf20Sopenharmony_ci tid_data++; 29568c2ecf20Sopenharmony_ci bytes += sizeof(struct cudbg_tid_data); 29578c2ecf20Sopenharmony_ci } 29588c2ecf20Sopenharmony_ci 29598c2ecf20Sopenharmony_ciout: 29608c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 29618c2ecf20Sopenharmony_ci} 29628c2ecf20Sopenharmony_ci 29638c2ecf20Sopenharmony_ciint cudbg_collect_cctrl(struct cudbg_init *pdbg_init, 29648c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 29658c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 29668c2ecf20Sopenharmony_ci{ 29678c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 29688c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 29698c2ecf20Sopenharmony_ci u32 size; 29708c2ecf20Sopenharmony_ci int rc; 29718c2ecf20Sopenharmony_ci 29728c2ecf20Sopenharmony_ci size = sizeof(u16) * NMTUS * NCCTRL_WIN; 29738c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 29748c2ecf20Sopenharmony_ci if (rc) 29758c2ecf20Sopenharmony_ci return rc; 29768c2ecf20Sopenharmony_ci 29778c2ecf20Sopenharmony_ci t4_read_cong_tbl(padap, (void *)temp_buff.data); 29788c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 29798c2ecf20Sopenharmony_ci} 29808c2ecf20Sopenharmony_ci 29818c2ecf20Sopenharmony_ciint cudbg_collect_ma_indirect(struct cudbg_init *pdbg_init, 29828c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 29838c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 29848c2ecf20Sopenharmony_ci{ 29858c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 29868c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 29878c2ecf20Sopenharmony_ci struct ireg_buf *ma_indr; 29888c2ecf20Sopenharmony_ci int i, rc, n; 29898c2ecf20Sopenharmony_ci u32 size, j; 29908c2ecf20Sopenharmony_ci 29918c2ecf20Sopenharmony_ci if (CHELSIO_CHIP_VERSION(padap->params.chip) < CHELSIO_T6) 29928c2ecf20Sopenharmony_ci return CUDBG_STATUS_ENTITY_NOT_FOUND; 29938c2ecf20Sopenharmony_ci 29948c2ecf20Sopenharmony_ci n = sizeof(t6_ma_ireg_array) / (IREG_NUM_ELEM * sizeof(u32)); 29958c2ecf20Sopenharmony_ci size = sizeof(struct ireg_buf) * n * 2; 29968c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 29978c2ecf20Sopenharmony_ci if (rc) 29988c2ecf20Sopenharmony_ci return rc; 29998c2ecf20Sopenharmony_ci 30008c2ecf20Sopenharmony_ci ma_indr = (struct ireg_buf *)temp_buff.data; 30018c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 30028c2ecf20Sopenharmony_ci struct ireg_field *ma_fli = &ma_indr->tp_pio; 30038c2ecf20Sopenharmony_ci u32 *buff = ma_indr->outbuf; 30048c2ecf20Sopenharmony_ci 30058c2ecf20Sopenharmony_ci ma_fli->ireg_addr = t6_ma_ireg_array[i][0]; 30068c2ecf20Sopenharmony_ci ma_fli->ireg_data = t6_ma_ireg_array[i][1]; 30078c2ecf20Sopenharmony_ci ma_fli->ireg_local_offset = t6_ma_ireg_array[i][2]; 30088c2ecf20Sopenharmony_ci ma_fli->ireg_offset_range = t6_ma_ireg_array[i][3]; 30098c2ecf20Sopenharmony_ci t4_read_indirect(padap, ma_fli->ireg_addr, ma_fli->ireg_data, 30108c2ecf20Sopenharmony_ci buff, ma_fli->ireg_offset_range, 30118c2ecf20Sopenharmony_ci ma_fli->ireg_local_offset); 30128c2ecf20Sopenharmony_ci ma_indr++; 30138c2ecf20Sopenharmony_ci } 30148c2ecf20Sopenharmony_ci 30158c2ecf20Sopenharmony_ci n = sizeof(t6_ma_ireg_array2) / (IREG_NUM_ELEM * sizeof(u32)); 30168c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 30178c2ecf20Sopenharmony_ci struct ireg_field *ma_fli = &ma_indr->tp_pio; 30188c2ecf20Sopenharmony_ci u32 *buff = ma_indr->outbuf; 30198c2ecf20Sopenharmony_ci 30208c2ecf20Sopenharmony_ci ma_fli->ireg_addr = t6_ma_ireg_array2[i][0]; 30218c2ecf20Sopenharmony_ci ma_fli->ireg_data = t6_ma_ireg_array2[i][1]; 30228c2ecf20Sopenharmony_ci ma_fli->ireg_local_offset = t6_ma_ireg_array2[i][2]; 30238c2ecf20Sopenharmony_ci for (j = 0; j < t6_ma_ireg_array2[i][3]; j++) { 30248c2ecf20Sopenharmony_ci t4_read_indirect(padap, ma_fli->ireg_addr, 30258c2ecf20Sopenharmony_ci ma_fli->ireg_data, buff, 1, 30268c2ecf20Sopenharmony_ci ma_fli->ireg_local_offset); 30278c2ecf20Sopenharmony_ci buff++; 30288c2ecf20Sopenharmony_ci ma_fli->ireg_local_offset += 0x20; 30298c2ecf20Sopenharmony_ci } 30308c2ecf20Sopenharmony_ci ma_indr++; 30318c2ecf20Sopenharmony_ci } 30328c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 30338c2ecf20Sopenharmony_ci} 30348c2ecf20Sopenharmony_ci 30358c2ecf20Sopenharmony_ciint cudbg_collect_ulptx_la(struct cudbg_init *pdbg_init, 30368c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 30378c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 30388c2ecf20Sopenharmony_ci{ 30398c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 30408c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 30418c2ecf20Sopenharmony_ci struct cudbg_ulptx_la *ulptx_la_buff; 30428c2ecf20Sopenharmony_ci struct cudbg_ver_hdr *ver_hdr; 30438c2ecf20Sopenharmony_ci u32 i, j; 30448c2ecf20Sopenharmony_ci int rc; 30458c2ecf20Sopenharmony_ci 30468c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, 30478c2ecf20Sopenharmony_ci sizeof(struct cudbg_ver_hdr) + 30488c2ecf20Sopenharmony_ci sizeof(struct cudbg_ulptx_la), 30498c2ecf20Sopenharmony_ci &temp_buff); 30508c2ecf20Sopenharmony_ci if (rc) 30518c2ecf20Sopenharmony_ci return rc; 30528c2ecf20Sopenharmony_ci 30538c2ecf20Sopenharmony_ci ver_hdr = (struct cudbg_ver_hdr *)temp_buff.data; 30548c2ecf20Sopenharmony_ci ver_hdr->signature = CUDBG_ENTITY_SIGNATURE; 30558c2ecf20Sopenharmony_ci ver_hdr->revision = CUDBG_ULPTX_LA_REV; 30568c2ecf20Sopenharmony_ci ver_hdr->size = sizeof(struct cudbg_ulptx_la); 30578c2ecf20Sopenharmony_ci 30588c2ecf20Sopenharmony_ci ulptx_la_buff = (struct cudbg_ulptx_la *)(temp_buff.data + 30598c2ecf20Sopenharmony_ci sizeof(*ver_hdr)); 30608c2ecf20Sopenharmony_ci for (i = 0; i < CUDBG_NUM_ULPTX; i++) { 30618c2ecf20Sopenharmony_ci ulptx_la_buff->rdptr[i] = t4_read_reg(padap, 30628c2ecf20Sopenharmony_ci ULP_TX_LA_RDPTR_0_A + 30638c2ecf20Sopenharmony_ci 0x10 * i); 30648c2ecf20Sopenharmony_ci ulptx_la_buff->wrptr[i] = t4_read_reg(padap, 30658c2ecf20Sopenharmony_ci ULP_TX_LA_WRPTR_0_A + 30668c2ecf20Sopenharmony_ci 0x10 * i); 30678c2ecf20Sopenharmony_ci ulptx_la_buff->rddata[i] = t4_read_reg(padap, 30688c2ecf20Sopenharmony_ci ULP_TX_LA_RDDATA_0_A + 30698c2ecf20Sopenharmony_ci 0x10 * i); 30708c2ecf20Sopenharmony_ci for (j = 0; j < CUDBG_NUM_ULPTX_READ; j++) 30718c2ecf20Sopenharmony_ci ulptx_la_buff->rd_data[i][j] = 30728c2ecf20Sopenharmony_ci t4_read_reg(padap, 30738c2ecf20Sopenharmony_ci ULP_TX_LA_RDDATA_0_A + 0x10 * i); 30748c2ecf20Sopenharmony_ci } 30758c2ecf20Sopenharmony_ci 30768c2ecf20Sopenharmony_ci for (i = 0; i < CUDBG_NUM_ULPTX_ASIC_READ; i++) { 30778c2ecf20Sopenharmony_ci t4_write_reg(padap, ULP_TX_ASIC_DEBUG_CTRL_A, 0x1); 30788c2ecf20Sopenharmony_ci ulptx_la_buff->rdptr_asic[i] = 30798c2ecf20Sopenharmony_ci t4_read_reg(padap, ULP_TX_ASIC_DEBUG_CTRL_A); 30808c2ecf20Sopenharmony_ci ulptx_la_buff->rddata_asic[i][0] = 30818c2ecf20Sopenharmony_ci t4_read_reg(padap, ULP_TX_ASIC_DEBUG_0_A); 30828c2ecf20Sopenharmony_ci ulptx_la_buff->rddata_asic[i][1] = 30838c2ecf20Sopenharmony_ci t4_read_reg(padap, ULP_TX_ASIC_DEBUG_1_A); 30848c2ecf20Sopenharmony_ci ulptx_la_buff->rddata_asic[i][2] = 30858c2ecf20Sopenharmony_ci t4_read_reg(padap, ULP_TX_ASIC_DEBUG_2_A); 30868c2ecf20Sopenharmony_ci ulptx_la_buff->rddata_asic[i][3] = 30878c2ecf20Sopenharmony_ci t4_read_reg(padap, ULP_TX_ASIC_DEBUG_3_A); 30888c2ecf20Sopenharmony_ci ulptx_la_buff->rddata_asic[i][4] = 30898c2ecf20Sopenharmony_ci t4_read_reg(padap, ULP_TX_ASIC_DEBUG_4_A); 30908c2ecf20Sopenharmony_ci ulptx_la_buff->rddata_asic[i][5] = 30918c2ecf20Sopenharmony_ci t4_read_reg(padap, PM_RX_BASE_ADDR); 30928c2ecf20Sopenharmony_ci } 30938c2ecf20Sopenharmony_ci 30948c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 30958c2ecf20Sopenharmony_ci} 30968c2ecf20Sopenharmony_ci 30978c2ecf20Sopenharmony_ciint cudbg_collect_up_cim_indirect(struct cudbg_init *pdbg_init, 30988c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 30998c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 31008c2ecf20Sopenharmony_ci{ 31018c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 31028c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 31038c2ecf20Sopenharmony_ci u32 local_offset, local_range; 31048c2ecf20Sopenharmony_ci struct ireg_buf *up_cim; 31058c2ecf20Sopenharmony_ci u32 size, j, iter; 31068c2ecf20Sopenharmony_ci u32 instance = 0; 31078c2ecf20Sopenharmony_ci int i, rc, n; 31088c2ecf20Sopenharmony_ci 31098c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) 31108c2ecf20Sopenharmony_ci n = sizeof(t5_up_cim_reg_array) / 31118c2ecf20Sopenharmony_ci ((IREG_NUM_ELEM + 1) * sizeof(u32)); 31128c2ecf20Sopenharmony_ci else if (is_t6(padap->params.chip)) 31138c2ecf20Sopenharmony_ci n = sizeof(t6_up_cim_reg_array) / 31148c2ecf20Sopenharmony_ci ((IREG_NUM_ELEM + 1) * sizeof(u32)); 31158c2ecf20Sopenharmony_ci else 31168c2ecf20Sopenharmony_ci return CUDBG_STATUS_NOT_IMPLEMENTED; 31178c2ecf20Sopenharmony_ci 31188c2ecf20Sopenharmony_ci size = sizeof(struct ireg_buf) * n; 31198c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 31208c2ecf20Sopenharmony_ci if (rc) 31218c2ecf20Sopenharmony_ci return rc; 31228c2ecf20Sopenharmony_ci 31238c2ecf20Sopenharmony_ci up_cim = (struct ireg_buf *)temp_buff.data; 31248c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 31258c2ecf20Sopenharmony_ci struct ireg_field *up_cim_reg = &up_cim->tp_pio; 31268c2ecf20Sopenharmony_ci u32 *buff = up_cim->outbuf; 31278c2ecf20Sopenharmony_ci 31288c2ecf20Sopenharmony_ci if (is_t5(padap->params.chip)) { 31298c2ecf20Sopenharmony_ci up_cim_reg->ireg_addr = t5_up_cim_reg_array[i][0]; 31308c2ecf20Sopenharmony_ci up_cim_reg->ireg_data = t5_up_cim_reg_array[i][1]; 31318c2ecf20Sopenharmony_ci up_cim_reg->ireg_local_offset = 31328c2ecf20Sopenharmony_ci t5_up_cim_reg_array[i][2]; 31338c2ecf20Sopenharmony_ci up_cim_reg->ireg_offset_range = 31348c2ecf20Sopenharmony_ci t5_up_cim_reg_array[i][3]; 31358c2ecf20Sopenharmony_ci instance = t5_up_cim_reg_array[i][4]; 31368c2ecf20Sopenharmony_ci } else if (is_t6(padap->params.chip)) { 31378c2ecf20Sopenharmony_ci up_cim_reg->ireg_addr = t6_up_cim_reg_array[i][0]; 31388c2ecf20Sopenharmony_ci up_cim_reg->ireg_data = t6_up_cim_reg_array[i][1]; 31398c2ecf20Sopenharmony_ci up_cim_reg->ireg_local_offset = 31408c2ecf20Sopenharmony_ci t6_up_cim_reg_array[i][2]; 31418c2ecf20Sopenharmony_ci up_cim_reg->ireg_offset_range = 31428c2ecf20Sopenharmony_ci t6_up_cim_reg_array[i][3]; 31438c2ecf20Sopenharmony_ci instance = t6_up_cim_reg_array[i][4]; 31448c2ecf20Sopenharmony_ci } 31458c2ecf20Sopenharmony_ci 31468c2ecf20Sopenharmony_ci switch (instance) { 31478c2ecf20Sopenharmony_ci case NUM_CIM_CTL_TSCH_CHANNEL_INSTANCES: 31488c2ecf20Sopenharmony_ci iter = up_cim_reg->ireg_offset_range; 31498c2ecf20Sopenharmony_ci local_offset = 0x120; 31508c2ecf20Sopenharmony_ci local_range = 1; 31518c2ecf20Sopenharmony_ci break; 31528c2ecf20Sopenharmony_ci case NUM_CIM_CTL_TSCH_CHANNEL_TSCH_CLASS_INSTANCES: 31538c2ecf20Sopenharmony_ci iter = up_cim_reg->ireg_offset_range; 31548c2ecf20Sopenharmony_ci local_offset = 0x10; 31558c2ecf20Sopenharmony_ci local_range = 1; 31568c2ecf20Sopenharmony_ci break; 31578c2ecf20Sopenharmony_ci default: 31588c2ecf20Sopenharmony_ci iter = 1; 31598c2ecf20Sopenharmony_ci local_offset = 0; 31608c2ecf20Sopenharmony_ci local_range = up_cim_reg->ireg_offset_range; 31618c2ecf20Sopenharmony_ci break; 31628c2ecf20Sopenharmony_ci } 31638c2ecf20Sopenharmony_ci 31648c2ecf20Sopenharmony_ci for (j = 0; j < iter; j++, buff++) { 31658c2ecf20Sopenharmony_ci rc = t4_cim_read(padap, 31668c2ecf20Sopenharmony_ci up_cim_reg->ireg_local_offset + 31678c2ecf20Sopenharmony_ci (j * local_offset), local_range, buff); 31688c2ecf20Sopenharmony_ci if (rc) { 31698c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 31708c2ecf20Sopenharmony_ci return rc; 31718c2ecf20Sopenharmony_ci } 31728c2ecf20Sopenharmony_ci } 31738c2ecf20Sopenharmony_ci up_cim++; 31748c2ecf20Sopenharmony_ci } 31758c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 31768c2ecf20Sopenharmony_ci} 31778c2ecf20Sopenharmony_ci 31788c2ecf20Sopenharmony_ciint cudbg_collect_pbt_tables(struct cudbg_init *pdbg_init, 31798c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 31808c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 31818c2ecf20Sopenharmony_ci{ 31828c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 31838c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 31848c2ecf20Sopenharmony_ci struct cudbg_pbt_tables *pbt; 31858c2ecf20Sopenharmony_ci int i, rc; 31868c2ecf20Sopenharmony_ci u32 addr; 31878c2ecf20Sopenharmony_ci 31888c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, 31898c2ecf20Sopenharmony_ci sizeof(struct cudbg_pbt_tables), 31908c2ecf20Sopenharmony_ci &temp_buff); 31918c2ecf20Sopenharmony_ci if (rc) 31928c2ecf20Sopenharmony_ci return rc; 31938c2ecf20Sopenharmony_ci 31948c2ecf20Sopenharmony_ci pbt = (struct cudbg_pbt_tables *)temp_buff.data; 31958c2ecf20Sopenharmony_ci /* PBT dynamic entries */ 31968c2ecf20Sopenharmony_ci addr = CUDBG_CHAC_PBT_ADDR; 31978c2ecf20Sopenharmony_ci for (i = 0; i < CUDBG_PBT_DYNAMIC_ENTRIES; i++) { 31988c2ecf20Sopenharmony_ci rc = t4_cim_read(padap, addr + (i * 4), 1, 31998c2ecf20Sopenharmony_ci &pbt->pbt_dynamic[i]); 32008c2ecf20Sopenharmony_ci if (rc) { 32018c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 32028c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 32038c2ecf20Sopenharmony_ci return rc; 32048c2ecf20Sopenharmony_ci } 32058c2ecf20Sopenharmony_ci } 32068c2ecf20Sopenharmony_ci 32078c2ecf20Sopenharmony_ci /* PBT static entries */ 32088c2ecf20Sopenharmony_ci /* static entries start when bit 6 is set */ 32098c2ecf20Sopenharmony_ci addr = CUDBG_CHAC_PBT_ADDR + (1 << 6); 32108c2ecf20Sopenharmony_ci for (i = 0; i < CUDBG_PBT_STATIC_ENTRIES; i++) { 32118c2ecf20Sopenharmony_ci rc = t4_cim_read(padap, addr + (i * 4), 1, 32128c2ecf20Sopenharmony_ci &pbt->pbt_static[i]); 32138c2ecf20Sopenharmony_ci if (rc) { 32148c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 32158c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 32168c2ecf20Sopenharmony_ci return rc; 32178c2ecf20Sopenharmony_ci } 32188c2ecf20Sopenharmony_ci } 32198c2ecf20Sopenharmony_ci 32208c2ecf20Sopenharmony_ci /* LRF entries */ 32218c2ecf20Sopenharmony_ci addr = CUDBG_CHAC_PBT_LRF; 32228c2ecf20Sopenharmony_ci for (i = 0; i < CUDBG_LRF_ENTRIES; i++) { 32238c2ecf20Sopenharmony_ci rc = t4_cim_read(padap, addr + (i * 4), 1, 32248c2ecf20Sopenharmony_ci &pbt->lrf_table[i]); 32258c2ecf20Sopenharmony_ci if (rc) { 32268c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 32278c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 32288c2ecf20Sopenharmony_ci return rc; 32298c2ecf20Sopenharmony_ci } 32308c2ecf20Sopenharmony_ci } 32318c2ecf20Sopenharmony_ci 32328c2ecf20Sopenharmony_ci /* PBT data entries */ 32338c2ecf20Sopenharmony_ci addr = CUDBG_CHAC_PBT_DATA; 32348c2ecf20Sopenharmony_ci for (i = 0; i < CUDBG_PBT_DATA_ENTRIES; i++) { 32358c2ecf20Sopenharmony_ci rc = t4_cim_read(padap, addr + (i * 4), 1, 32368c2ecf20Sopenharmony_ci &pbt->pbt_data[i]); 32378c2ecf20Sopenharmony_ci if (rc) { 32388c2ecf20Sopenharmony_ci cudbg_err->sys_err = rc; 32398c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 32408c2ecf20Sopenharmony_ci return rc; 32418c2ecf20Sopenharmony_ci } 32428c2ecf20Sopenharmony_ci } 32438c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 32448c2ecf20Sopenharmony_ci} 32458c2ecf20Sopenharmony_ci 32468c2ecf20Sopenharmony_ciint cudbg_collect_mbox_log(struct cudbg_init *pdbg_init, 32478c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 32488c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 32498c2ecf20Sopenharmony_ci{ 32508c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 32518c2ecf20Sopenharmony_ci struct cudbg_mbox_log *mboxlog = NULL; 32528c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 32538c2ecf20Sopenharmony_ci struct mbox_cmd_log *log = NULL; 32548c2ecf20Sopenharmony_ci struct mbox_cmd *entry; 32558c2ecf20Sopenharmony_ci unsigned int entry_idx; 32568c2ecf20Sopenharmony_ci u16 mbox_cmds; 32578c2ecf20Sopenharmony_ci int i, k, rc; 32588c2ecf20Sopenharmony_ci u64 flit; 32598c2ecf20Sopenharmony_ci u32 size; 32608c2ecf20Sopenharmony_ci 32618c2ecf20Sopenharmony_ci log = padap->mbox_log; 32628c2ecf20Sopenharmony_ci mbox_cmds = padap->mbox_log->size; 32638c2ecf20Sopenharmony_ci size = sizeof(struct cudbg_mbox_log) * mbox_cmds; 32648c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 32658c2ecf20Sopenharmony_ci if (rc) 32668c2ecf20Sopenharmony_ci return rc; 32678c2ecf20Sopenharmony_ci 32688c2ecf20Sopenharmony_ci mboxlog = (struct cudbg_mbox_log *)temp_buff.data; 32698c2ecf20Sopenharmony_ci for (k = 0; k < mbox_cmds; k++) { 32708c2ecf20Sopenharmony_ci entry_idx = log->cursor + k; 32718c2ecf20Sopenharmony_ci if (entry_idx >= log->size) 32728c2ecf20Sopenharmony_ci entry_idx -= log->size; 32738c2ecf20Sopenharmony_ci 32748c2ecf20Sopenharmony_ci entry = mbox_cmd_log_entry(log, entry_idx); 32758c2ecf20Sopenharmony_ci /* skip over unused entries */ 32768c2ecf20Sopenharmony_ci if (entry->timestamp == 0) 32778c2ecf20Sopenharmony_ci continue; 32788c2ecf20Sopenharmony_ci 32798c2ecf20Sopenharmony_ci memcpy(&mboxlog->entry, entry, sizeof(struct mbox_cmd)); 32808c2ecf20Sopenharmony_ci for (i = 0; i < MBOX_LEN / 8; i++) { 32818c2ecf20Sopenharmony_ci flit = entry->cmd[i]; 32828c2ecf20Sopenharmony_ci mboxlog->hi[i] = (u32)(flit >> 32); 32838c2ecf20Sopenharmony_ci mboxlog->lo[i] = (u32)flit; 32848c2ecf20Sopenharmony_ci } 32858c2ecf20Sopenharmony_ci mboxlog++; 32868c2ecf20Sopenharmony_ci } 32878c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 32888c2ecf20Sopenharmony_ci} 32898c2ecf20Sopenharmony_ci 32908c2ecf20Sopenharmony_ciint cudbg_collect_hma_indirect(struct cudbg_init *pdbg_init, 32918c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 32928c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 32938c2ecf20Sopenharmony_ci{ 32948c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 32958c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 32968c2ecf20Sopenharmony_ci struct ireg_buf *hma_indr; 32978c2ecf20Sopenharmony_ci int i, rc, n; 32988c2ecf20Sopenharmony_ci u32 size; 32998c2ecf20Sopenharmony_ci 33008c2ecf20Sopenharmony_ci if (CHELSIO_CHIP_VERSION(padap->params.chip) < CHELSIO_T6) 33018c2ecf20Sopenharmony_ci return CUDBG_STATUS_ENTITY_NOT_FOUND; 33028c2ecf20Sopenharmony_ci 33038c2ecf20Sopenharmony_ci n = sizeof(t6_hma_ireg_array) / (IREG_NUM_ELEM * sizeof(u32)); 33048c2ecf20Sopenharmony_ci size = sizeof(struct ireg_buf) * n; 33058c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff); 33068c2ecf20Sopenharmony_ci if (rc) 33078c2ecf20Sopenharmony_ci return rc; 33088c2ecf20Sopenharmony_ci 33098c2ecf20Sopenharmony_ci hma_indr = (struct ireg_buf *)temp_buff.data; 33108c2ecf20Sopenharmony_ci for (i = 0; i < n; i++) { 33118c2ecf20Sopenharmony_ci struct ireg_field *hma_fli = &hma_indr->tp_pio; 33128c2ecf20Sopenharmony_ci u32 *buff = hma_indr->outbuf; 33138c2ecf20Sopenharmony_ci 33148c2ecf20Sopenharmony_ci hma_fli->ireg_addr = t6_hma_ireg_array[i][0]; 33158c2ecf20Sopenharmony_ci hma_fli->ireg_data = t6_hma_ireg_array[i][1]; 33168c2ecf20Sopenharmony_ci hma_fli->ireg_local_offset = t6_hma_ireg_array[i][2]; 33178c2ecf20Sopenharmony_ci hma_fli->ireg_offset_range = t6_hma_ireg_array[i][3]; 33188c2ecf20Sopenharmony_ci t4_read_indirect(padap, hma_fli->ireg_addr, hma_fli->ireg_data, 33198c2ecf20Sopenharmony_ci buff, hma_fli->ireg_offset_range, 33208c2ecf20Sopenharmony_ci hma_fli->ireg_local_offset); 33218c2ecf20Sopenharmony_ci hma_indr++; 33228c2ecf20Sopenharmony_ci } 33238c2ecf20Sopenharmony_ci return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff); 33248c2ecf20Sopenharmony_ci} 33258c2ecf20Sopenharmony_ci 33268c2ecf20Sopenharmony_civoid cudbg_fill_qdesc_num_and_size(const struct adapter *padap, 33278c2ecf20Sopenharmony_ci u32 *num, u32 *size) 33288c2ecf20Sopenharmony_ci{ 33298c2ecf20Sopenharmony_ci u32 tot_entries = 0, tot_size = 0; 33308c2ecf20Sopenharmony_ci 33318c2ecf20Sopenharmony_ci /* NIC TXQ, RXQ, FLQ, and CTRLQ */ 33328c2ecf20Sopenharmony_ci tot_entries += MAX_ETH_QSETS * 3; 33338c2ecf20Sopenharmony_ci tot_entries += MAX_CTRL_QUEUES; 33348c2ecf20Sopenharmony_ci 33358c2ecf20Sopenharmony_ci tot_size += MAX_ETH_QSETS * MAX_TXQ_ENTRIES * MAX_TXQ_DESC_SIZE; 33368c2ecf20Sopenharmony_ci tot_size += MAX_ETH_QSETS * MAX_RSPQ_ENTRIES * MAX_RXQ_DESC_SIZE; 33378c2ecf20Sopenharmony_ci tot_size += MAX_ETH_QSETS * MAX_RX_BUFFERS * MAX_FL_DESC_SIZE; 33388c2ecf20Sopenharmony_ci tot_size += MAX_CTRL_QUEUES * MAX_CTRL_TXQ_ENTRIES * 33398c2ecf20Sopenharmony_ci MAX_CTRL_TXQ_DESC_SIZE; 33408c2ecf20Sopenharmony_ci 33418c2ecf20Sopenharmony_ci /* FW_EVTQ and INTRQ */ 33428c2ecf20Sopenharmony_ci tot_entries += INGQ_EXTRAS; 33438c2ecf20Sopenharmony_ci tot_size += INGQ_EXTRAS * MAX_RSPQ_ENTRIES * MAX_RXQ_DESC_SIZE; 33448c2ecf20Sopenharmony_ci 33458c2ecf20Sopenharmony_ci /* PTP_TXQ */ 33468c2ecf20Sopenharmony_ci tot_entries += 1; 33478c2ecf20Sopenharmony_ci tot_size += MAX_TXQ_ENTRIES * MAX_TXQ_DESC_SIZE; 33488c2ecf20Sopenharmony_ci 33498c2ecf20Sopenharmony_ci /* ULD TXQ, RXQ, and FLQ */ 33508c2ecf20Sopenharmony_ci tot_entries += CXGB4_TX_MAX * MAX_OFLD_QSETS; 33518c2ecf20Sopenharmony_ci tot_entries += CXGB4_ULD_MAX * MAX_ULD_QSETS * 2; 33528c2ecf20Sopenharmony_ci 33538c2ecf20Sopenharmony_ci tot_size += CXGB4_TX_MAX * MAX_OFLD_QSETS * MAX_TXQ_ENTRIES * 33548c2ecf20Sopenharmony_ci MAX_TXQ_DESC_SIZE; 33558c2ecf20Sopenharmony_ci tot_size += CXGB4_ULD_MAX * MAX_ULD_QSETS * MAX_RSPQ_ENTRIES * 33568c2ecf20Sopenharmony_ci MAX_RXQ_DESC_SIZE; 33578c2ecf20Sopenharmony_ci tot_size += CXGB4_ULD_MAX * MAX_ULD_QSETS * MAX_RX_BUFFERS * 33588c2ecf20Sopenharmony_ci MAX_FL_DESC_SIZE; 33598c2ecf20Sopenharmony_ci 33608c2ecf20Sopenharmony_ci /* ULD CIQ */ 33618c2ecf20Sopenharmony_ci tot_entries += CXGB4_ULD_MAX * MAX_ULD_QSETS; 33628c2ecf20Sopenharmony_ci tot_size += CXGB4_ULD_MAX * MAX_ULD_QSETS * SGE_MAX_IQ_SIZE * 33638c2ecf20Sopenharmony_ci MAX_RXQ_DESC_SIZE; 33648c2ecf20Sopenharmony_ci 33658c2ecf20Sopenharmony_ci /* ETHOFLD TXQ, RXQ, and FLQ */ 33668c2ecf20Sopenharmony_ci tot_entries += MAX_OFLD_QSETS * 3; 33678c2ecf20Sopenharmony_ci tot_size += MAX_OFLD_QSETS * MAX_TXQ_ENTRIES * MAX_TXQ_DESC_SIZE; 33688c2ecf20Sopenharmony_ci 33698c2ecf20Sopenharmony_ci tot_size += sizeof(struct cudbg_ver_hdr) + 33708c2ecf20Sopenharmony_ci sizeof(struct cudbg_qdesc_info) + 33718c2ecf20Sopenharmony_ci sizeof(struct cudbg_qdesc_entry) * tot_entries; 33728c2ecf20Sopenharmony_ci 33738c2ecf20Sopenharmony_ci if (num) 33748c2ecf20Sopenharmony_ci *num = tot_entries; 33758c2ecf20Sopenharmony_ci 33768c2ecf20Sopenharmony_ci if (size) 33778c2ecf20Sopenharmony_ci *size = tot_size; 33788c2ecf20Sopenharmony_ci} 33798c2ecf20Sopenharmony_ci 33808c2ecf20Sopenharmony_ciint cudbg_collect_qdesc(struct cudbg_init *pdbg_init, 33818c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 33828c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 33838c2ecf20Sopenharmony_ci{ 33848c2ecf20Sopenharmony_ci u32 num_queues = 0, tot_entries = 0, size = 0; 33858c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 33868c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = { 0 }; 33878c2ecf20Sopenharmony_ci struct cudbg_qdesc_entry *qdesc_entry; 33888c2ecf20Sopenharmony_ci struct cudbg_qdesc_info *qdesc_info; 33898c2ecf20Sopenharmony_ci struct cudbg_ver_hdr *ver_hdr; 33908c2ecf20Sopenharmony_ci struct sge *s = &padap->sge; 33918c2ecf20Sopenharmony_ci u32 i, j, cur_off, tot_len; 33928c2ecf20Sopenharmony_ci u8 *data; 33938c2ecf20Sopenharmony_ci int rc; 33948c2ecf20Sopenharmony_ci 33958c2ecf20Sopenharmony_ci cudbg_fill_qdesc_num_and_size(padap, &tot_entries, &size); 33968c2ecf20Sopenharmony_ci size = min_t(u32, size, CUDBG_DUMP_BUFF_SIZE); 33978c2ecf20Sopenharmony_ci tot_len = size; 33988c2ecf20Sopenharmony_ci data = kvzalloc(size, GFP_KERNEL); 33998c2ecf20Sopenharmony_ci if (!data) 34008c2ecf20Sopenharmony_ci return -ENOMEM; 34018c2ecf20Sopenharmony_ci 34028c2ecf20Sopenharmony_ci ver_hdr = (struct cudbg_ver_hdr *)data; 34038c2ecf20Sopenharmony_ci ver_hdr->signature = CUDBG_ENTITY_SIGNATURE; 34048c2ecf20Sopenharmony_ci ver_hdr->revision = CUDBG_QDESC_REV; 34058c2ecf20Sopenharmony_ci ver_hdr->size = sizeof(struct cudbg_qdesc_info); 34068c2ecf20Sopenharmony_ci size -= sizeof(*ver_hdr); 34078c2ecf20Sopenharmony_ci 34088c2ecf20Sopenharmony_ci qdesc_info = (struct cudbg_qdesc_info *)(data + 34098c2ecf20Sopenharmony_ci sizeof(*ver_hdr)); 34108c2ecf20Sopenharmony_ci size -= sizeof(*qdesc_info); 34118c2ecf20Sopenharmony_ci qdesc_entry = (struct cudbg_qdesc_entry *)qdesc_info->data; 34128c2ecf20Sopenharmony_ci 34138c2ecf20Sopenharmony_ci#define QDESC_GET(q, desc, type, label) do { \ 34148c2ecf20Sopenharmony_ci if (size <= 0) { \ 34158c2ecf20Sopenharmony_ci goto label; \ 34168c2ecf20Sopenharmony_ci } \ 34178c2ecf20Sopenharmony_ci if (desc) { \ 34188c2ecf20Sopenharmony_ci cudbg_fill_qdesc_##q(q, type, qdesc_entry); \ 34198c2ecf20Sopenharmony_ci size -= sizeof(*qdesc_entry) + qdesc_entry->data_size; \ 34208c2ecf20Sopenharmony_ci num_queues++; \ 34218c2ecf20Sopenharmony_ci qdesc_entry = cudbg_next_qdesc(qdesc_entry); \ 34228c2ecf20Sopenharmony_ci } \ 34238c2ecf20Sopenharmony_ci} while (0) 34248c2ecf20Sopenharmony_ci 34258c2ecf20Sopenharmony_ci#define QDESC_GET_TXQ(q, type, label) do { \ 34268c2ecf20Sopenharmony_ci struct sge_txq *txq = (struct sge_txq *)q; \ 34278c2ecf20Sopenharmony_ci QDESC_GET(txq, txq->desc, type, label); \ 34288c2ecf20Sopenharmony_ci} while (0) 34298c2ecf20Sopenharmony_ci 34308c2ecf20Sopenharmony_ci#define QDESC_GET_RXQ(q, type, label) do { \ 34318c2ecf20Sopenharmony_ci struct sge_rspq *rxq = (struct sge_rspq *)q; \ 34328c2ecf20Sopenharmony_ci QDESC_GET(rxq, rxq->desc, type, label); \ 34338c2ecf20Sopenharmony_ci} while (0) 34348c2ecf20Sopenharmony_ci 34358c2ecf20Sopenharmony_ci#define QDESC_GET_FLQ(q, type, label) do { \ 34368c2ecf20Sopenharmony_ci struct sge_fl *flq = (struct sge_fl *)q; \ 34378c2ecf20Sopenharmony_ci QDESC_GET(flq, flq->desc, type, label); \ 34388c2ecf20Sopenharmony_ci} while (0) 34398c2ecf20Sopenharmony_ci 34408c2ecf20Sopenharmony_ci /* NIC TXQ */ 34418c2ecf20Sopenharmony_ci for (i = 0; i < s->ethqsets; i++) 34428c2ecf20Sopenharmony_ci QDESC_GET_TXQ(&s->ethtxq[i].q, CUDBG_QTYPE_NIC_TXQ, out); 34438c2ecf20Sopenharmony_ci 34448c2ecf20Sopenharmony_ci /* NIC RXQ */ 34458c2ecf20Sopenharmony_ci for (i = 0; i < s->ethqsets; i++) 34468c2ecf20Sopenharmony_ci QDESC_GET_RXQ(&s->ethrxq[i].rspq, CUDBG_QTYPE_NIC_RXQ, out); 34478c2ecf20Sopenharmony_ci 34488c2ecf20Sopenharmony_ci /* NIC FLQ */ 34498c2ecf20Sopenharmony_ci for (i = 0; i < s->ethqsets; i++) 34508c2ecf20Sopenharmony_ci QDESC_GET_FLQ(&s->ethrxq[i].fl, CUDBG_QTYPE_NIC_FLQ, out); 34518c2ecf20Sopenharmony_ci 34528c2ecf20Sopenharmony_ci /* NIC CTRLQ */ 34538c2ecf20Sopenharmony_ci for (i = 0; i < padap->params.nports; i++) 34548c2ecf20Sopenharmony_ci QDESC_GET_TXQ(&s->ctrlq[i].q, CUDBG_QTYPE_CTRLQ, out); 34558c2ecf20Sopenharmony_ci 34568c2ecf20Sopenharmony_ci /* FW_EVTQ */ 34578c2ecf20Sopenharmony_ci QDESC_GET_RXQ(&s->fw_evtq, CUDBG_QTYPE_FWEVTQ, out); 34588c2ecf20Sopenharmony_ci 34598c2ecf20Sopenharmony_ci /* INTRQ */ 34608c2ecf20Sopenharmony_ci QDESC_GET_RXQ(&s->intrq, CUDBG_QTYPE_INTRQ, out); 34618c2ecf20Sopenharmony_ci 34628c2ecf20Sopenharmony_ci /* PTP_TXQ */ 34638c2ecf20Sopenharmony_ci QDESC_GET_TXQ(&s->ptptxq.q, CUDBG_QTYPE_PTP_TXQ, out); 34648c2ecf20Sopenharmony_ci 34658c2ecf20Sopenharmony_ci /* ULD Queues */ 34668c2ecf20Sopenharmony_ci mutex_lock(&uld_mutex); 34678c2ecf20Sopenharmony_ci 34688c2ecf20Sopenharmony_ci if (s->uld_txq_info) { 34698c2ecf20Sopenharmony_ci struct sge_uld_txq_info *utxq; 34708c2ecf20Sopenharmony_ci 34718c2ecf20Sopenharmony_ci /* ULD TXQ */ 34728c2ecf20Sopenharmony_ci for (j = 0; j < CXGB4_TX_MAX; j++) { 34738c2ecf20Sopenharmony_ci if (!s->uld_txq_info[j]) 34748c2ecf20Sopenharmony_ci continue; 34758c2ecf20Sopenharmony_ci 34768c2ecf20Sopenharmony_ci utxq = s->uld_txq_info[j]; 34778c2ecf20Sopenharmony_ci for (i = 0; i < utxq->ntxq; i++) 34788c2ecf20Sopenharmony_ci QDESC_GET_TXQ(&utxq->uldtxq[i].q, 34798c2ecf20Sopenharmony_ci cudbg_uld_txq_to_qtype(j), 34808c2ecf20Sopenharmony_ci out_unlock_uld); 34818c2ecf20Sopenharmony_ci } 34828c2ecf20Sopenharmony_ci } 34838c2ecf20Sopenharmony_ci 34848c2ecf20Sopenharmony_ci if (s->uld_rxq_info) { 34858c2ecf20Sopenharmony_ci struct sge_uld_rxq_info *urxq; 34868c2ecf20Sopenharmony_ci u32 base; 34878c2ecf20Sopenharmony_ci 34888c2ecf20Sopenharmony_ci /* ULD RXQ */ 34898c2ecf20Sopenharmony_ci for (j = 0; j < CXGB4_ULD_MAX; j++) { 34908c2ecf20Sopenharmony_ci if (!s->uld_rxq_info[j]) 34918c2ecf20Sopenharmony_ci continue; 34928c2ecf20Sopenharmony_ci 34938c2ecf20Sopenharmony_ci urxq = s->uld_rxq_info[j]; 34948c2ecf20Sopenharmony_ci for (i = 0; i < urxq->nrxq; i++) 34958c2ecf20Sopenharmony_ci QDESC_GET_RXQ(&urxq->uldrxq[i].rspq, 34968c2ecf20Sopenharmony_ci cudbg_uld_rxq_to_qtype(j), 34978c2ecf20Sopenharmony_ci out_unlock_uld); 34988c2ecf20Sopenharmony_ci } 34998c2ecf20Sopenharmony_ci 35008c2ecf20Sopenharmony_ci /* ULD FLQ */ 35018c2ecf20Sopenharmony_ci for (j = 0; j < CXGB4_ULD_MAX; j++) { 35028c2ecf20Sopenharmony_ci if (!s->uld_rxq_info[j]) 35038c2ecf20Sopenharmony_ci continue; 35048c2ecf20Sopenharmony_ci 35058c2ecf20Sopenharmony_ci urxq = s->uld_rxq_info[j]; 35068c2ecf20Sopenharmony_ci for (i = 0; i < urxq->nrxq; i++) 35078c2ecf20Sopenharmony_ci QDESC_GET_FLQ(&urxq->uldrxq[i].fl, 35088c2ecf20Sopenharmony_ci cudbg_uld_flq_to_qtype(j), 35098c2ecf20Sopenharmony_ci out_unlock_uld); 35108c2ecf20Sopenharmony_ci } 35118c2ecf20Sopenharmony_ci 35128c2ecf20Sopenharmony_ci /* ULD CIQ */ 35138c2ecf20Sopenharmony_ci for (j = 0; j < CXGB4_ULD_MAX; j++) { 35148c2ecf20Sopenharmony_ci if (!s->uld_rxq_info[j]) 35158c2ecf20Sopenharmony_ci continue; 35168c2ecf20Sopenharmony_ci 35178c2ecf20Sopenharmony_ci urxq = s->uld_rxq_info[j]; 35188c2ecf20Sopenharmony_ci base = urxq->nrxq; 35198c2ecf20Sopenharmony_ci for (i = 0; i < urxq->nciq; i++) 35208c2ecf20Sopenharmony_ci QDESC_GET_RXQ(&urxq->uldrxq[base + i].rspq, 35218c2ecf20Sopenharmony_ci cudbg_uld_ciq_to_qtype(j), 35228c2ecf20Sopenharmony_ci out_unlock_uld); 35238c2ecf20Sopenharmony_ci } 35248c2ecf20Sopenharmony_ci } 35258c2ecf20Sopenharmony_ci mutex_unlock(&uld_mutex); 35268c2ecf20Sopenharmony_ci 35278c2ecf20Sopenharmony_ci if (!padap->tc_mqprio) 35288c2ecf20Sopenharmony_ci goto out; 35298c2ecf20Sopenharmony_ci 35308c2ecf20Sopenharmony_ci mutex_lock(&padap->tc_mqprio->mqprio_mutex); 35318c2ecf20Sopenharmony_ci /* ETHOFLD TXQ */ 35328c2ecf20Sopenharmony_ci if (s->eohw_txq) 35338c2ecf20Sopenharmony_ci for (i = 0; i < s->eoqsets; i++) 35348c2ecf20Sopenharmony_ci QDESC_GET_TXQ(&s->eohw_txq[i].q, 35358c2ecf20Sopenharmony_ci CUDBG_QTYPE_ETHOFLD_TXQ, out_unlock_mqprio); 35368c2ecf20Sopenharmony_ci 35378c2ecf20Sopenharmony_ci /* ETHOFLD RXQ and FLQ */ 35388c2ecf20Sopenharmony_ci if (s->eohw_rxq) { 35398c2ecf20Sopenharmony_ci for (i = 0; i < s->eoqsets; i++) 35408c2ecf20Sopenharmony_ci QDESC_GET_RXQ(&s->eohw_rxq[i].rspq, 35418c2ecf20Sopenharmony_ci CUDBG_QTYPE_ETHOFLD_RXQ, out_unlock_mqprio); 35428c2ecf20Sopenharmony_ci 35438c2ecf20Sopenharmony_ci for (i = 0; i < s->eoqsets; i++) 35448c2ecf20Sopenharmony_ci QDESC_GET_FLQ(&s->eohw_rxq[i].fl, 35458c2ecf20Sopenharmony_ci CUDBG_QTYPE_ETHOFLD_FLQ, out_unlock_mqprio); 35468c2ecf20Sopenharmony_ci } 35478c2ecf20Sopenharmony_ci 35488c2ecf20Sopenharmony_ciout_unlock_mqprio: 35498c2ecf20Sopenharmony_ci mutex_unlock(&padap->tc_mqprio->mqprio_mutex); 35508c2ecf20Sopenharmony_ci 35518c2ecf20Sopenharmony_ciout: 35528c2ecf20Sopenharmony_ci qdesc_info->qdesc_entry_size = sizeof(*qdesc_entry); 35538c2ecf20Sopenharmony_ci qdesc_info->num_queues = num_queues; 35548c2ecf20Sopenharmony_ci cur_off = 0; 35558c2ecf20Sopenharmony_ci while (tot_len) { 35568c2ecf20Sopenharmony_ci u32 chunk_size = min_t(u32, tot_len, CUDBG_CHUNK_SIZE); 35578c2ecf20Sopenharmony_ci 35588c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, chunk_size, 35598c2ecf20Sopenharmony_ci &temp_buff); 35608c2ecf20Sopenharmony_ci if (rc) { 35618c2ecf20Sopenharmony_ci cudbg_err->sys_warn = CUDBG_STATUS_PARTIAL_DATA; 35628c2ecf20Sopenharmony_ci goto out_free; 35638c2ecf20Sopenharmony_ci } 35648c2ecf20Sopenharmony_ci 35658c2ecf20Sopenharmony_ci memcpy(temp_buff.data, data + cur_off, chunk_size); 35668c2ecf20Sopenharmony_ci tot_len -= chunk_size; 35678c2ecf20Sopenharmony_ci cur_off += chunk_size; 35688c2ecf20Sopenharmony_ci rc = cudbg_write_and_release_buff(pdbg_init, &temp_buff, 35698c2ecf20Sopenharmony_ci dbg_buff); 35708c2ecf20Sopenharmony_ci if (rc) { 35718c2ecf20Sopenharmony_ci cudbg_put_buff(pdbg_init, &temp_buff); 35728c2ecf20Sopenharmony_ci cudbg_err->sys_warn = CUDBG_STATUS_PARTIAL_DATA; 35738c2ecf20Sopenharmony_ci goto out_free; 35748c2ecf20Sopenharmony_ci } 35758c2ecf20Sopenharmony_ci } 35768c2ecf20Sopenharmony_ci 35778c2ecf20Sopenharmony_ciout_free: 35788c2ecf20Sopenharmony_ci if (data) 35798c2ecf20Sopenharmony_ci kvfree(data); 35808c2ecf20Sopenharmony_ci 35818c2ecf20Sopenharmony_ci#undef QDESC_GET_FLQ 35828c2ecf20Sopenharmony_ci#undef QDESC_GET_RXQ 35838c2ecf20Sopenharmony_ci#undef QDESC_GET_TXQ 35848c2ecf20Sopenharmony_ci#undef QDESC_GET 35858c2ecf20Sopenharmony_ci 35868c2ecf20Sopenharmony_ci return rc; 35878c2ecf20Sopenharmony_ci 35888c2ecf20Sopenharmony_ciout_unlock_uld: 35898c2ecf20Sopenharmony_ci mutex_unlock(&uld_mutex); 35908c2ecf20Sopenharmony_ci goto out; 35918c2ecf20Sopenharmony_ci} 35928c2ecf20Sopenharmony_ci 35938c2ecf20Sopenharmony_ciint cudbg_collect_flash(struct cudbg_init *pdbg_init, 35948c2ecf20Sopenharmony_ci struct cudbg_buffer *dbg_buff, 35958c2ecf20Sopenharmony_ci struct cudbg_error *cudbg_err) 35968c2ecf20Sopenharmony_ci{ 35978c2ecf20Sopenharmony_ci struct adapter *padap = pdbg_init->adap; 35988c2ecf20Sopenharmony_ci u32 count = padap->params.sf_size, n; 35998c2ecf20Sopenharmony_ci struct cudbg_buffer temp_buff = {0}; 36008c2ecf20Sopenharmony_ci u32 addr, i; 36018c2ecf20Sopenharmony_ci int rc; 36028c2ecf20Sopenharmony_ci 36038c2ecf20Sopenharmony_ci addr = FLASH_EXP_ROM_START; 36048c2ecf20Sopenharmony_ci 36058c2ecf20Sopenharmony_ci for (i = 0; i < count; i += SF_PAGE_SIZE) { 36068c2ecf20Sopenharmony_ci n = min_t(u32, count - i, SF_PAGE_SIZE); 36078c2ecf20Sopenharmony_ci 36088c2ecf20Sopenharmony_ci rc = cudbg_get_buff(pdbg_init, dbg_buff, n, &temp_buff); 36098c2ecf20Sopenharmony_ci if (rc) { 36108c2ecf20Sopenharmony_ci cudbg_err->sys_warn = CUDBG_STATUS_PARTIAL_DATA; 36118c2ecf20Sopenharmony_ci goto out; 36128c2ecf20Sopenharmony_ci } 36138c2ecf20Sopenharmony_ci rc = t4_read_flash(padap, addr, n, (u32 *)temp_buff.data, 0); 36148c2ecf20Sopenharmony_ci if (rc) 36158c2ecf20Sopenharmony_ci goto out; 36168c2ecf20Sopenharmony_ci 36178c2ecf20Sopenharmony_ci addr += (n * 4); 36188c2ecf20Sopenharmony_ci rc = cudbg_write_and_release_buff(pdbg_init, &temp_buff, 36198c2ecf20Sopenharmony_ci dbg_buff); 36208c2ecf20Sopenharmony_ci if (rc) { 36218c2ecf20Sopenharmony_ci cudbg_err->sys_warn = CUDBG_STATUS_PARTIAL_DATA; 36228c2ecf20Sopenharmony_ci goto out; 36238c2ecf20Sopenharmony_ci } 36248c2ecf20Sopenharmony_ci } 36258c2ecf20Sopenharmony_ci 36268c2ecf20Sopenharmony_ciout: 36278c2ecf20Sopenharmony_ci return rc; 36288c2ecf20Sopenharmony_ci} 3629