1ab81e23cSAlexander Lobakin // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) 2c965db44STomer Tayar /* QLogic qed NIC Driver 3c965db44STomer Tayar * Copyright (c) 2015 QLogic Corporation 46c95dd8fSPrabhakar Kushwaha * Copyright (c) 2019-2021 Marvell International Ltd. 5c965db44STomer Tayar */ 6c965db44STomer Tayar 7c965db44STomer Tayar #include <linux/module.h> 8c965db44STomer Tayar #include <linux/vmalloc.h> 9c965db44STomer Tayar #include <linux/crc32.h> 10c965db44STomer Tayar #include "qed.h" 118a52bbabSMichal Kalderon #include "qed_cxt.h" 12c965db44STomer Tayar #include "qed_hsi.h" 13ee824f4bSOmkar Kulkarni #include "qed_dbg_hsi.h" 14c965db44STomer Tayar #include "qed_hw.h" 15c965db44STomer Tayar #include "qed_mcp.h" 16c965db44STomer Tayar #include "qed_reg_addr.h" 17c965db44STomer Tayar 18c965db44STomer Tayar /* Memory groups enum */ 19c965db44STomer Tayar enum mem_groups { 20c965db44STomer Tayar MEM_GROUP_PXP_MEM, 21c965db44STomer Tayar MEM_GROUP_DMAE_MEM, 22c965db44STomer Tayar MEM_GROUP_CM_MEM, 23c965db44STomer Tayar MEM_GROUP_QM_MEM, 24da090917STomer Tayar MEM_GROUP_DORQ_MEM, 25c965db44STomer Tayar MEM_GROUP_BRB_RAM, 26c965db44STomer Tayar MEM_GROUP_BRB_MEM, 27c965db44STomer Tayar MEM_GROUP_PRS_MEM, 28da090917STomer Tayar MEM_GROUP_SDM_MEM, 297b6859fbSMintz, Yuval MEM_GROUP_PBUF, 302d22bc83SMichal Kalderon MEM_GROUP_IOR, 31da090917STomer Tayar MEM_GROUP_RAM, 322d22bc83SMichal Kalderon MEM_GROUP_BTB_RAM, 33da090917STomer Tayar MEM_GROUP_RDIF_CTX, 34da090917STomer Tayar MEM_GROUP_TDIF_CTX, 35da090917STomer Tayar MEM_GROUP_CFC_MEM, 362d22bc83SMichal Kalderon MEM_GROUP_CONN_CFC_MEM, 372d22bc83SMichal Kalderon MEM_GROUP_CAU_PI, 382d22bc83SMichal Kalderon MEM_GROUP_CAU_MEM, 392d22bc83SMichal Kalderon MEM_GROUP_CAU_MEM_EXT, 402d22bc83SMichal Kalderon MEM_GROUP_PXP_ILT, 412d22bc83SMichal Kalderon MEM_GROUP_MULD_MEM, 422d22bc83SMichal Kalderon MEM_GROUP_BTB_MEM, 43c965db44STomer Tayar MEM_GROUP_IGU_MEM, 44c965db44STomer Tayar MEM_GROUP_IGU_MSIX, 45c965db44STomer Tayar MEM_GROUP_CAU_SB, 46c965db44STomer Tayar MEM_GROUP_BMB_RAM, 47c965db44STomer Tayar MEM_GROUP_BMB_MEM, 482d22bc83SMichal Kalderon MEM_GROUP_TM_MEM, 492d22bc83SMichal Kalderon MEM_GROUP_TASK_CFC_MEM, 50c965db44STomer Tayar MEM_GROUPS_NUM 51c965db44STomer Tayar }; 52c965db44STomer Tayar 53c965db44STomer Tayar /* Memory groups names */ 54c965db44STomer Tayar static const char * const s_mem_group_names[] = { 55c965db44STomer Tayar "PXP_MEM", 56c965db44STomer Tayar "DMAE_MEM", 57c965db44STomer Tayar "CM_MEM", 58c965db44STomer Tayar "QM_MEM", 59da090917STomer Tayar "DORQ_MEM", 60c965db44STomer Tayar "BRB_RAM", 61c965db44STomer Tayar "BRB_MEM", 62c965db44STomer Tayar "PRS_MEM", 63da090917STomer Tayar "SDM_MEM", 647b6859fbSMintz, Yuval "PBUF", 652d22bc83SMichal Kalderon "IOR", 66da090917STomer Tayar "RAM", 672d22bc83SMichal Kalderon "BTB_RAM", 68da090917STomer Tayar "RDIF_CTX", 69da090917STomer Tayar "TDIF_CTX", 70da090917STomer Tayar "CFC_MEM", 712d22bc83SMichal Kalderon "CONN_CFC_MEM", 722d22bc83SMichal Kalderon "CAU_PI", 732d22bc83SMichal Kalderon "CAU_MEM", 742d22bc83SMichal Kalderon "CAU_MEM_EXT", 752d22bc83SMichal Kalderon "PXP_ILT", 762d22bc83SMichal Kalderon "MULD_MEM", 772d22bc83SMichal Kalderon "BTB_MEM", 78c965db44STomer Tayar "IGU_MEM", 79c965db44STomer Tayar "IGU_MSIX", 80c965db44STomer Tayar "CAU_SB", 81c965db44STomer Tayar "BMB_RAM", 82c965db44STomer Tayar "BMB_MEM", 832d22bc83SMichal Kalderon "TM_MEM", 842d22bc83SMichal Kalderon "TASK_CFC_MEM", 85c965db44STomer Tayar }; 86c965db44STomer Tayar 87c965db44STomer Tayar /* Idle check conditions */ 887b6859fbSMintz, Yuval 897b6859fbSMintz, Yuval static u32 cond5(const u32 *r, const u32 *imm) 90c965db44STomer Tayar { 91c965db44STomer Tayar return ((r[0] & imm[0]) != imm[1]) && ((r[1] & imm[2]) != imm[3]); 92c965db44STomer Tayar } 93c965db44STomer Tayar 947b6859fbSMintz, Yuval static u32 cond7(const u32 *r, const u32 *imm) 95c965db44STomer Tayar { 96c965db44STomer Tayar return ((r[0] >> imm[0]) & imm[1]) != imm[2]; 97c965db44STomer Tayar } 98c965db44STomer Tayar 997b6859fbSMintz, Yuval static u32 cond6(const u32 *r, const u32 *imm) 100c965db44STomer Tayar { 101c965db44STomer Tayar return (r[0] & imm[0]) != imm[1]; 102c965db44STomer Tayar } 103c965db44STomer Tayar 1047b6859fbSMintz, Yuval static u32 cond9(const u32 *r, const u32 *imm) 105c965db44STomer Tayar { 106c965db44STomer Tayar return ((r[0] & imm[0]) >> imm[1]) != 107c965db44STomer Tayar (((r[0] & imm[2]) >> imm[3]) | ((r[1] & imm[4]) << imm[5])); 108c965db44STomer Tayar } 109c965db44STomer Tayar 1107b6859fbSMintz, Yuval static u32 cond10(const u32 *r, const u32 *imm) 111c965db44STomer Tayar { 112c965db44STomer Tayar return ((r[0] & imm[0]) >> imm[1]) != (r[0] & imm[2]); 113c965db44STomer Tayar } 114c965db44STomer Tayar 1157b6859fbSMintz, Yuval static u32 cond4(const u32 *r, const u32 *imm) 116c965db44STomer Tayar { 117c965db44STomer Tayar return (r[0] & ~imm[0]) != imm[1]; 118c965db44STomer Tayar } 119c965db44STomer Tayar 120c965db44STomer Tayar static u32 cond0(const u32 *r, const u32 *imm) 121c965db44STomer Tayar { 1227b6859fbSMintz, Yuval return (r[0] & ~r[1]) != imm[0]; 1237b6859fbSMintz, Yuval } 1247b6859fbSMintz, Yuval 1256c95dd8fSPrabhakar Kushwaha static u32 cond14(const u32 *r, const u32 *imm) 1266c95dd8fSPrabhakar Kushwaha { 1276c95dd8fSPrabhakar Kushwaha return (r[0] | imm[0]) != imm[1]; 1286c95dd8fSPrabhakar Kushwaha } 1296c95dd8fSPrabhakar Kushwaha 1307b6859fbSMintz, Yuval static u32 cond1(const u32 *r, const u32 *imm) 1317b6859fbSMintz, Yuval { 132c965db44STomer Tayar return r[0] != imm[0]; 133c965db44STomer Tayar } 134c965db44STomer Tayar 1357b6859fbSMintz, Yuval static u32 cond11(const u32 *r, const u32 *imm) 136c965db44STomer Tayar { 137c965db44STomer Tayar return r[0] != r[1] && r[2] == imm[0]; 138c965db44STomer Tayar } 139c965db44STomer Tayar 1407b6859fbSMintz, Yuval static u32 cond12(const u32 *r, const u32 *imm) 141c965db44STomer Tayar { 142c965db44STomer Tayar return r[0] != r[1] && r[2] > imm[0]; 143c965db44STomer Tayar } 144c965db44STomer Tayar 145c965db44STomer Tayar static u32 cond3(const u32 *r, const u32 *imm) 146c965db44STomer Tayar { 147c965db44STomer Tayar return r[0] != r[1]; 148c965db44STomer Tayar } 149c965db44STomer Tayar 1507b6859fbSMintz, Yuval static u32 cond13(const u32 *r, const u32 *imm) 151c965db44STomer Tayar { 152c965db44STomer Tayar return r[0] & imm[0]; 153c965db44STomer Tayar } 154c965db44STomer Tayar 1557b6859fbSMintz, Yuval static u32 cond8(const u32 *r, const u32 *imm) 156c965db44STomer Tayar { 157c965db44STomer Tayar return r[0] < (r[1] - imm[0]); 158c965db44STomer Tayar } 159c965db44STomer Tayar 160c965db44STomer Tayar static u32 cond2(const u32 *r, const u32 *imm) 161c965db44STomer Tayar { 162c965db44STomer Tayar return r[0] > imm[0]; 163c965db44STomer Tayar } 164c965db44STomer Tayar 165c965db44STomer Tayar /* Array of Idle Check conditions */ 166c965db44STomer Tayar static u32(*cond_arr[]) (const u32 *r, const u32 *imm) = { 167c965db44STomer Tayar cond0, 168c965db44STomer Tayar cond1, 169c965db44STomer Tayar cond2, 170c965db44STomer Tayar cond3, 171c965db44STomer Tayar cond4, 172c965db44STomer Tayar cond5, 173c965db44STomer Tayar cond6, 174c965db44STomer Tayar cond7, 175c965db44STomer Tayar cond8, 176c965db44STomer Tayar cond9, 177c965db44STomer Tayar cond10, 178c965db44STomer Tayar cond11, 179c965db44STomer Tayar cond12, 1807b6859fbSMintz, Yuval cond13, 1816c95dd8fSPrabhakar Kushwaha cond14, 182c965db44STomer Tayar }; 183c965db44STomer Tayar 1842d22bc83SMichal Kalderon #define NUM_PHYS_BLOCKS 84 1852d22bc83SMichal Kalderon 1862d22bc83SMichal Kalderon #define NUM_DBG_RESET_REGS 8 1872d22bc83SMichal Kalderon 188c965db44STomer Tayar /******************************* Data Types **********************************/ 189c965db44STomer Tayar 1902d22bc83SMichal Kalderon enum hw_types { 1912d22bc83SMichal Kalderon HW_TYPE_ASIC, 192c965db44STomer Tayar PLATFORM_RESERVED, 193c965db44STomer Tayar PLATFORM_RESERVED2, 194c965db44STomer Tayar PLATFORM_RESERVED3, 1952d22bc83SMichal Kalderon PLATFORM_RESERVED4, 1962d22bc83SMichal Kalderon MAX_HW_TYPES 1972d22bc83SMichal Kalderon }; 1982d22bc83SMichal Kalderon 1992d22bc83SMichal Kalderon /* CM context types */ 2002d22bc83SMichal Kalderon enum cm_ctx_types { 2012d22bc83SMichal Kalderon CM_CTX_CONN_AG, 2022d22bc83SMichal Kalderon CM_CTX_CONN_ST, 2032d22bc83SMichal Kalderon CM_CTX_TASK_AG, 2042d22bc83SMichal Kalderon CM_CTX_TASK_ST, 2052d22bc83SMichal Kalderon NUM_CM_CTX_TYPES 2062d22bc83SMichal Kalderon }; 2072d22bc83SMichal Kalderon 2082d22bc83SMichal Kalderon /* Debug bus frame modes */ 2092d22bc83SMichal Kalderon enum dbg_bus_frame_modes { 2102d22bc83SMichal Kalderon DBG_BUS_FRAME_MODE_4ST = 0, /* 4 Storm dwords (no HW) */ 2112d22bc83SMichal Kalderon DBG_BUS_FRAME_MODE_2ST_2HW = 1, /* 2 Storm dwords, 2 HW dwords */ 2122d22bc83SMichal Kalderon DBG_BUS_FRAME_MODE_1ST_3HW = 2, /* 1 Storm dwords, 3 HW dwords */ 2132d22bc83SMichal Kalderon DBG_BUS_FRAME_MODE_4HW = 3, /* 4 HW dwords (no Storms) */ 2142d22bc83SMichal Kalderon DBG_BUS_FRAME_MODE_8HW = 4, /* 8 HW dwords (no Storms) */ 2152d22bc83SMichal Kalderon DBG_BUS_NUM_FRAME_MODES 216c965db44STomer Tayar }; 217c965db44STomer Tayar 2186c95dd8fSPrabhakar Kushwaha /* Debug bus SEMI frame modes */ 2196c95dd8fSPrabhakar Kushwaha enum dbg_bus_semi_frame_modes { 2206c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_4FAST = 0, /* 4 fast dw */ 2216c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_2FAST_2SLOW = 1, /* 2 fast dw, 2 slow dw */ 2226c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_1FAST_3SLOW = 2, /* 1 fast dw,3 slow dw */ 2236c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_4SLOW = 3, /* 4 slow dw */ 2246c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_NUM_FRAME_MODES 2256c95dd8fSPrabhakar Kushwaha }; 2266c95dd8fSPrabhakar Kushwaha 2276c95dd8fSPrabhakar Kushwaha /* Debug bus filter types */ 2286c95dd8fSPrabhakar Kushwaha enum dbg_bus_filter_types { 2296c95dd8fSPrabhakar Kushwaha DBG_BUS_FILTER_TYPE_OFF, /* Filter always off */ 2306c95dd8fSPrabhakar Kushwaha DBG_BUS_FILTER_TYPE_PRE, /* Filter before trigger only */ 2316c95dd8fSPrabhakar Kushwaha DBG_BUS_FILTER_TYPE_POST, /* Filter after trigger only */ 2326c95dd8fSPrabhakar Kushwaha DBG_BUS_FILTER_TYPE_ON /* Filter always on */ 2336c95dd8fSPrabhakar Kushwaha }; 2346c95dd8fSPrabhakar Kushwaha 2356c95dd8fSPrabhakar Kushwaha /* Debug bus pre-trigger recording types */ 2366c95dd8fSPrabhakar Kushwaha enum dbg_bus_pre_trigger_types { 2376c95dd8fSPrabhakar Kushwaha DBG_BUS_PRE_TRIGGER_FROM_ZERO, /* Record from time 0 */ 2386c95dd8fSPrabhakar Kushwaha DBG_BUS_PRE_TRIGGER_NUM_CHUNKS, /* Record some chunks before trigger */ 2396c95dd8fSPrabhakar Kushwaha DBG_BUS_PRE_TRIGGER_DROP /* Drop data before trigger */ 2406c95dd8fSPrabhakar Kushwaha }; 2416c95dd8fSPrabhakar Kushwaha 2426c95dd8fSPrabhakar Kushwaha /* Debug bus post-trigger recording types */ 2436c95dd8fSPrabhakar Kushwaha enum dbg_bus_post_trigger_types { 2446c95dd8fSPrabhakar Kushwaha DBG_BUS_POST_TRIGGER_RECORD, /* Start recording after trigger */ 2456c95dd8fSPrabhakar Kushwaha DBG_BUS_POST_TRIGGER_DROP /* Drop data after trigger */ 2466c95dd8fSPrabhakar Kushwaha }; 2476c95dd8fSPrabhakar Kushwaha 2486c95dd8fSPrabhakar Kushwaha /* Debug bus other engine mode */ 2496c95dd8fSPrabhakar Kushwaha enum dbg_bus_other_engine_modes { 2506c95dd8fSPrabhakar Kushwaha DBG_BUS_OTHER_ENGINE_MODE_NONE, 2516c95dd8fSPrabhakar Kushwaha DBG_BUS_OTHER_ENGINE_MODE_DOUBLE_BW_TX, 2526c95dd8fSPrabhakar Kushwaha DBG_BUS_OTHER_ENGINE_MODE_DOUBLE_BW_RX, 2536c95dd8fSPrabhakar Kushwaha DBG_BUS_OTHER_ENGINE_MODE_CROSS_ENGINE_TX, 2546c95dd8fSPrabhakar Kushwaha DBG_BUS_OTHER_ENGINE_MODE_CROSS_ENGINE_RX 2556c95dd8fSPrabhakar Kushwaha }; 2566c95dd8fSPrabhakar Kushwaha 2576c95dd8fSPrabhakar Kushwaha /* DBG block Framing mode definitions */ 2586c95dd8fSPrabhakar Kushwaha struct framing_mode_defs { 2596c95dd8fSPrabhakar Kushwaha u8 id; 2606c95dd8fSPrabhakar Kushwaha u8 blocks_dword_mask; 2616c95dd8fSPrabhakar Kushwaha u8 storms_dword_mask; 2626c95dd8fSPrabhakar Kushwaha u8 semi_framing_mode_id; 2636c95dd8fSPrabhakar Kushwaha u8 full_buf_thr; 2646c95dd8fSPrabhakar Kushwaha }; 2656c95dd8fSPrabhakar Kushwaha 266c965db44STomer Tayar /* Chip constant definitions */ 267c965db44STomer Tayar struct chip_defs { 268c965db44STomer Tayar const char *name; 2696c95dd8fSPrabhakar Kushwaha u8 dwords_per_cycle; 2706c95dd8fSPrabhakar Kushwaha u8 num_framing_modes; 2718a52bbabSMichal Kalderon u32 num_ilt_pages; 2726c95dd8fSPrabhakar Kushwaha struct framing_mode_defs *framing_modes; 273c965db44STomer Tayar }; 274c965db44STomer Tayar 2752d22bc83SMichal Kalderon /* HW type constant definitions */ 2762d22bc83SMichal Kalderon struct hw_type_defs { 277c965db44STomer Tayar const char *name; 278c965db44STomer Tayar u32 delay_factor; 279da090917STomer Tayar u32 dmae_thresh; 280da090917STomer Tayar u32 log_thresh; 281c965db44STomer Tayar }; 282c965db44STomer Tayar 2832d22bc83SMichal Kalderon /* RBC reset definitions */ 2842d22bc83SMichal Kalderon struct rbc_reset_defs { 2852d22bc83SMichal Kalderon u32 reset_reg_addr; 2862d22bc83SMichal Kalderon u32 reset_val[MAX_CHIP_IDS]; 2872d22bc83SMichal Kalderon }; 2882d22bc83SMichal Kalderon 2897b6859fbSMintz, Yuval /* Storm constant definitions. 2907b6859fbSMintz, Yuval * Addresses are in bytes, sizes are in quad-regs. 2917b6859fbSMintz, Yuval */ 292c965db44STomer Tayar struct storm_defs { 293c965db44STomer Tayar char letter; 2942d22bc83SMichal Kalderon enum block_id sem_block_id; 295c965db44STomer Tayar enum dbg_bus_clients dbg_client_id[MAX_CHIP_IDS]; 296c965db44STomer Tayar bool has_vfc; 297c965db44STomer Tayar u32 sem_fast_mem_addr; 298c965db44STomer Tayar u32 sem_frame_mode_addr; 299c965db44STomer Tayar u32 sem_slow_enable_addr; 300c965db44STomer Tayar u32 sem_slow_mode_addr; 301c965db44STomer Tayar u32 sem_slow_mode1_conf_addr; 302c965db44STomer Tayar u32 sem_sync_dbg_empty_addr; 3032d22bc83SMichal Kalderon u32 sem_gpre_vect_addr; 304c965db44STomer Tayar u32 cm_ctx_wr_addr; 3052d22bc83SMichal Kalderon u32 cm_ctx_rd_addr[NUM_CM_CTX_TYPES]; 3062d22bc83SMichal Kalderon u32 cm_ctx_lid_sizes[MAX_CHIP_IDS][NUM_CM_CTX_TYPES]; 307c965db44STomer Tayar }; 308c965db44STomer Tayar 3092d22bc83SMichal Kalderon /* Debug Bus Constraint operation constant definitions */ 3102d22bc83SMichal Kalderon struct dbg_bus_constraint_op_defs { 3112d22bc83SMichal Kalderon u8 hw_op_val; 3122d22bc83SMichal Kalderon bool is_cyclic; 3132d22bc83SMichal Kalderon }; 3142d22bc83SMichal Kalderon 3152d22bc83SMichal Kalderon /* Storm Mode definitions */ 3162d22bc83SMichal Kalderon struct storm_mode_defs { 317c965db44STomer Tayar const char *name; 3182d22bc83SMichal Kalderon bool is_fast_dbg; 3192d22bc83SMichal Kalderon u8 id_in_hw; 3202d22bc83SMichal Kalderon u32 src_disable_reg_addr; 3212d22bc83SMichal Kalderon u32 src_enable_val; 322da090917STomer Tayar bool exists[MAX_CHIP_IDS]; 323c965db44STomer Tayar }; 324c965db44STomer Tayar 325c965db44STomer Tayar struct grc_param_defs { 326c965db44STomer Tayar u32 default_val[MAX_CHIP_IDS]; 327c965db44STomer Tayar u32 min; 328c965db44STomer Tayar u32 max; 329c965db44STomer Tayar bool is_preset; 33050bc60cbSMichal Kalderon bool is_persistent; 331c965db44STomer Tayar u32 exclude_all_preset_val; 3322d22bc83SMichal Kalderon u32 crash_preset_val[MAX_CHIP_IDS]; 333c965db44STomer Tayar }; 334c965db44STomer Tayar 3357b6859fbSMintz, Yuval /* Address is in 128b units. Width is in bits. */ 336c965db44STomer Tayar struct rss_mem_defs { 337c965db44STomer Tayar const char *mem_name; 338c965db44STomer Tayar const char *type_name; 3397b6859fbSMintz, Yuval u32 addr; 340da090917STomer Tayar u32 entry_width; 341c965db44STomer Tayar u32 num_entries[MAX_CHIP_IDS]; 342c965db44STomer Tayar }; 343c965db44STomer Tayar 344c965db44STomer Tayar struct vfc_ram_defs { 345c965db44STomer Tayar const char *mem_name; 346c965db44STomer Tayar const char *type_name; 347c965db44STomer Tayar u32 base_row; 348c965db44STomer Tayar u32 num_rows; 349c965db44STomer Tayar }; 350c965db44STomer Tayar 351c965db44STomer Tayar struct big_ram_defs { 352c965db44STomer Tayar const char *instance_name; 353c965db44STomer Tayar enum mem_groups mem_group_id; 354c965db44STomer Tayar enum mem_groups ram_mem_group_id; 355c965db44STomer Tayar enum dbg_grc_params grc_param; 356c965db44STomer Tayar u32 addr_reg_addr; 357c965db44STomer Tayar u32 data_reg_addr; 358da090917STomer Tayar u32 is_256b_reg_addr; 359da090917STomer Tayar u32 is_256b_bit_offset[MAX_CHIP_IDS]; 360da090917STomer Tayar u32 ram_size[MAX_CHIP_IDS]; /* In dwords */ 361c965db44STomer Tayar }; 362c965db44STomer Tayar 363c965db44STomer Tayar struct phy_defs { 364c965db44STomer Tayar const char *phy_name; 3657b6859fbSMintz, Yuval 3667b6859fbSMintz, Yuval /* PHY base GRC address */ 367c965db44STomer Tayar u32 base_addr; 3687b6859fbSMintz, Yuval 3697b6859fbSMintz, Yuval /* Relative address of indirect TBUS address register (bits 0..7) */ 370c965db44STomer Tayar u32 tbus_addr_lo_addr; 3717b6859fbSMintz, Yuval 3727b6859fbSMintz, Yuval /* Relative address of indirect TBUS address register (bits 8..10) */ 373c965db44STomer Tayar u32 tbus_addr_hi_addr; 3747b6859fbSMintz, Yuval 3757b6859fbSMintz, Yuval /* Relative address of indirect TBUS data register (bits 0..7) */ 376c965db44STomer Tayar u32 tbus_data_lo_addr; 3777b6859fbSMintz, Yuval 3787b6859fbSMintz, Yuval /* Relative address of indirect TBUS data register (bits 8..11) */ 379c965db44STomer Tayar u32 tbus_data_hi_addr; 380c965db44STomer Tayar }; 381c965db44STomer Tayar 382d52c89f1SMichal Kalderon /* Split type definitions */ 383d52c89f1SMichal Kalderon struct split_type_defs { 384d52c89f1SMichal Kalderon const char *name; 385d52c89f1SMichal Kalderon }; 386d52c89f1SMichal Kalderon 387c965db44STomer Tayar /******************************** Constants **********************************/ 388c965db44STomer Tayar 389c965db44STomer Tayar #define BYTES_IN_DWORD sizeof(u32) 390c965db44STomer Tayar /* In the macros below, size and offset are specified in bits */ 391c965db44STomer Tayar #define CEIL_DWORDS(size) DIV_ROUND_UP(size, 32) 392c965db44STomer Tayar #define FIELD_BIT_OFFSET(type, field) type ## _ ## field ## _ ## OFFSET 393c965db44STomer Tayar #define FIELD_BIT_SIZE(type, field) type ## _ ## field ## _ ## SIZE 394c965db44STomer Tayar #define FIELD_DWORD_OFFSET(type, field) \ 3956c95dd8fSPrabhakar Kushwaha ((int)(FIELD_BIT_OFFSET(type, field) / 32)) 396c965db44STomer Tayar #define FIELD_DWORD_SHIFT(type, field) (FIELD_BIT_OFFSET(type, field) % 32) 397c965db44STomer Tayar #define FIELD_BIT_MASK(type, field) \ 398c965db44STomer Tayar (((1 << FIELD_BIT_SIZE(type, field)) - 1) << \ 399c965db44STomer Tayar FIELD_DWORD_SHIFT(type, field)) 4007b6859fbSMintz, Yuval 401c965db44STomer Tayar #define SET_VAR_FIELD(var, type, field, val) \ 402c965db44STomer Tayar do { \ 403c965db44STomer Tayar var[FIELD_DWORD_OFFSET(type, field)] &= \ 404c965db44STomer Tayar (~FIELD_BIT_MASK(type, field)); \ 405c965db44STomer Tayar var[FIELD_DWORD_OFFSET(type, field)] |= \ 406c965db44STomer Tayar (val) << FIELD_DWORD_SHIFT(type, field); \ 407c965db44STomer Tayar } while (0) 4087b6859fbSMintz, Yuval 409c965db44STomer Tayar #define ARR_REG_WR(dev, ptt, addr, arr, arr_size) \ 410c965db44STomer Tayar do { \ 411c965db44STomer Tayar for (i = 0; i < (arr_size); i++) \ 412c965db44STomer Tayar qed_wr(dev, ptt, addr, (arr)[i]); \ 413c965db44STomer Tayar } while (0) 4147b6859fbSMintz, Yuval 415c965db44STomer Tayar #define DWORDS_TO_BYTES(dwords) ((dwords) * BYTES_IN_DWORD) 416c965db44STomer Tayar #define BYTES_TO_DWORDS(bytes) ((bytes) / BYTES_IN_DWORD) 4177b6859fbSMintz, Yuval 4182d22bc83SMichal Kalderon /* extra lines include a signature line + optional latency events line */ 4192d22bc83SMichal Kalderon #define NUM_EXTRA_DBG_LINES(block) \ 4202d22bc83SMichal Kalderon (GET_FIELD((block)->flags, DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS) ? 2 : 1) 4212d22bc83SMichal Kalderon #define NUM_DBG_LINES(block) \ 4222d22bc83SMichal Kalderon ((block)->num_of_dbg_bus_lines + NUM_EXTRA_DBG_LINES(block)) 4232d22bc83SMichal Kalderon 4242d22bc83SMichal Kalderon #define USE_DMAE true 4252d22bc83SMichal Kalderon #define PROTECT_WIDE_BUS true 4267b6859fbSMintz, Yuval 427c965db44STomer Tayar #define RAM_LINES_TO_DWORDS(lines) ((lines) * 2) 428c965db44STomer Tayar #define RAM_LINES_TO_BYTES(lines) \ 429c965db44STomer Tayar DWORDS_TO_BYTES(RAM_LINES_TO_DWORDS(lines)) 4307b6859fbSMintz, Yuval 431c965db44STomer Tayar #define REG_DUMP_LEN_SHIFT 24 432c965db44STomer Tayar #define MEM_DUMP_ENTRY_SIZE_DWORDS \ 433c965db44STomer Tayar BYTES_TO_DWORDS(sizeof(struct dbg_dump_mem)) 4347b6859fbSMintz, Yuval 435c965db44STomer Tayar #define IDLE_CHK_RULE_SIZE_DWORDS \ 436c965db44STomer Tayar BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_rule)) 4377b6859fbSMintz, Yuval 438c965db44STomer Tayar #define IDLE_CHK_RESULT_HDR_DWORDS \ 439c965db44STomer Tayar BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_hdr)) 4407b6859fbSMintz, Yuval 441c965db44STomer Tayar #define IDLE_CHK_RESULT_REG_HDR_DWORDS \ 442c965db44STomer Tayar BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_reg_hdr)) 4437b6859fbSMintz, Yuval 4448a52bbabSMichal Kalderon #define PAGE_MEM_DESC_SIZE_DWORDS \ 4458a52bbabSMichal Kalderon BYTES_TO_DWORDS(sizeof(struct phys_mem_desc)) 4468a52bbabSMichal Kalderon 447c965db44STomer Tayar #define IDLE_CHK_MAX_ENTRIES_SIZE 32 448c965db44STomer Tayar 449c965db44STomer Tayar /* The sizes and offsets below are specified in bits */ 450c965db44STomer Tayar #define VFC_CAM_CMD_STRUCT_SIZE 64 451c965db44STomer Tayar #define VFC_CAM_CMD_ROW_OFFSET 48 452c965db44STomer Tayar #define VFC_CAM_CMD_ROW_SIZE 9 453c965db44STomer Tayar #define VFC_CAM_ADDR_STRUCT_SIZE 16 454c965db44STomer Tayar #define VFC_CAM_ADDR_OP_OFFSET 0 455c965db44STomer Tayar #define VFC_CAM_ADDR_OP_SIZE 4 456c965db44STomer Tayar #define VFC_CAM_RESP_STRUCT_SIZE 256 457c965db44STomer Tayar #define VFC_RAM_ADDR_STRUCT_SIZE 16 458c965db44STomer Tayar #define VFC_RAM_ADDR_OP_OFFSET 0 459c965db44STomer Tayar #define VFC_RAM_ADDR_OP_SIZE 2 460c965db44STomer Tayar #define VFC_RAM_ADDR_ROW_OFFSET 2 461c965db44STomer Tayar #define VFC_RAM_ADDR_ROW_SIZE 10 462c965db44STomer Tayar #define VFC_RAM_RESP_STRUCT_SIZE 256 4637b6859fbSMintz, Yuval 464c965db44STomer Tayar #define VFC_CAM_CMD_DWORDS CEIL_DWORDS(VFC_CAM_CMD_STRUCT_SIZE) 465c965db44STomer Tayar #define VFC_CAM_ADDR_DWORDS CEIL_DWORDS(VFC_CAM_ADDR_STRUCT_SIZE) 466c965db44STomer Tayar #define VFC_CAM_RESP_DWORDS CEIL_DWORDS(VFC_CAM_RESP_STRUCT_SIZE) 467c965db44STomer Tayar #define VFC_RAM_CMD_DWORDS VFC_CAM_CMD_DWORDS 468c965db44STomer Tayar #define VFC_RAM_ADDR_DWORDS CEIL_DWORDS(VFC_RAM_ADDR_STRUCT_SIZE) 469c965db44STomer Tayar #define VFC_RAM_RESP_DWORDS CEIL_DWORDS(VFC_RAM_RESP_STRUCT_SIZE) 4707b6859fbSMintz, Yuval 471c965db44STomer Tayar #define NUM_VFC_RAM_TYPES 4 4727b6859fbSMintz, Yuval 473c965db44STomer Tayar #define VFC_CAM_NUM_ROWS 512 4747b6859fbSMintz, Yuval 475c965db44STomer Tayar #define VFC_OPCODE_CAM_RD 14 476c965db44STomer Tayar #define VFC_OPCODE_RAM_RD 0 4777b6859fbSMintz, Yuval 478c965db44STomer Tayar #define NUM_RSS_MEM_TYPES 5 4797b6859fbSMintz, Yuval 480c965db44STomer Tayar #define NUM_BIG_RAM_TYPES 3 481c7d852e3SDenis Bolotin #define BIG_RAM_NAME_LEN 3 4827b6859fbSMintz, Yuval 483c965db44STomer Tayar #define NUM_PHY_TBUS_ADDRESSES 2048 484c965db44STomer Tayar #define PHY_DUMP_SIZE_DWORDS (NUM_PHY_TBUS_ADDRESSES / 2) 4857b6859fbSMintz, Yuval 486c965db44STomer Tayar #define RESET_REG_UNRESET_OFFSET 4 4877b6859fbSMintz, Yuval 488c965db44STomer Tayar #define STALL_DELAY_MS 500 4897b6859fbSMintz, Yuval 490c965db44STomer Tayar #define STATIC_DEBUG_LINE_DWORDS 9 4917b6859fbSMintz, Yuval 49220921c0cSManish Chopra #define NUM_COMMON_GLOBAL_PARAMS 10 4932d22bc83SMichal Kalderon 4942d22bc83SMichal Kalderon #define MAX_RECURSION_DEPTH 10 4957b6859fbSMintz, Yuval 4966c95dd8fSPrabhakar Kushwaha #define FW_IMG_KUKU 0 497c965db44STomer Tayar #define FW_IMG_MAIN 1 4986c95dd8fSPrabhakar Kushwaha #define FW_IMG_L2B 2 4997b6859fbSMintz, Yuval 500c965db44STomer Tayar #define REG_FIFO_ELEMENT_DWORDS 2 5017b6859fbSMintz, Yuval #define REG_FIFO_DEPTH_ELEMENTS 32 502c965db44STomer Tayar #define REG_FIFO_DEPTH_DWORDS \ 503c965db44STomer Tayar (REG_FIFO_ELEMENT_DWORDS * REG_FIFO_DEPTH_ELEMENTS) 5047b6859fbSMintz, Yuval 505c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORDS 4 5067b6859fbSMintz, Yuval #define IGU_FIFO_DEPTH_ELEMENTS 64 507c965db44STomer Tayar #define IGU_FIFO_DEPTH_DWORDS \ 508c965db44STomer Tayar (IGU_FIFO_ELEMENT_DWORDS * IGU_FIFO_DEPTH_ELEMENTS) 5097b6859fbSMintz, Yuval 510c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_DWORDS 2 5117b6859fbSMintz, Yuval #define PROTECTION_OVERRIDE_DEPTH_ELEMENTS 20 512c965db44STomer Tayar #define PROTECTION_OVERRIDE_DEPTH_DWORDS \ 513c965db44STomer Tayar (PROTECTION_OVERRIDE_DEPTH_ELEMENTS * \ 514c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_DWORDS) 5157b6859fbSMintz, Yuval 516c965db44STomer Tayar #define MCP_SPAD_TRACE_OFFSIZE_ADDR \ 517c965db44STomer Tayar (MCP_REG_SCRATCH + \ 518c965db44STomer Tayar offsetof(struct static_init, sections[SPAD_SECTION_TRACE])) 5197b6859fbSMintz, Yuval 5202d22bc83SMichal Kalderon #define MAX_SW_PLTAFORM_STR_SIZE 64 5212d22bc83SMichal Kalderon 522c965db44STomer Tayar #define EMPTY_FW_VERSION_STR "???_???_???_???" 523c965db44STomer Tayar #define EMPTY_FW_IMAGE_STR "???????????????" 524c965db44STomer Tayar 525c965db44STomer Tayar /***************************** Constant Arrays *******************************/ 526c965db44STomer Tayar 5276c95dd8fSPrabhakar Kushwaha /* DBG block framing mode definitions, in descending preference order */ 5286c95dd8fSPrabhakar Kushwaha static struct framing_mode_defs s_framing_mode_defs[4] = { 5296c95dd8fSPrabhakar Kushwaha {DBG_BUS_FRAME_MODE_4ST, 0x0, 0xf, 5306c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_4FAST, 5316c95dd8fSPrabhakar Kushwaha 10}, 5326c95dd8fSPrabhakar Kushwaha {DBG_BUS_FRAME_MODE_4HW, 0xf, 0x0, DBG_BUS_SEMI_FRAME_MODE_4SLOW, 5336c95dd8fSPrabhakar Kushwaha 10}, 5346c95dd8fSPrabhakar Kushwaha {DBG_BUS_FRAME_MODE_2ST_2HW, 0x3, 0xc, 5356c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_2FAST_2SLOW, 10}, 5366c95dd8fSPrabhakar Kushwaha {DBG_BUS_FRAME_MODE_1ST_3HW, 0x7, 0x8, 5376c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_1FAST_3SLOW, 10} 5386c95dd8fSPrabhakar Kushwaha }; 5396c95dd8fSPrabhakar Kushwaha 540c965db44STomer Tayar /* Chip constant definitions array */ 541c965db44STomer Tayar static struct chip_defs s_chip_defs[MAX_CHIP_IDS] = { 5426c95dd8fSPrabhakar Kushwaha {"bb", 4, DBG_BUS_NUM_FRAME_MODES, PSWRQ2_REG_ILT_MEMORY_SIZE_BB / 2, 5436c95dd8fSPrabhakar Kushwaha s_framing_mode_defs}, 5446c95dd8fSPrabhakar Kushwaha {"ah", 4, DBG_BUS_NUM_FRAME_MODES, PSWRQ2_REG_ILT_MEMORY_SIZE_K2 / 2, 5456c95dd8fSPrabhakar Kushwaha s_framing_mode_defs} 546c965db44STomer Tayar }; 547c965db44STomer Tayar 548c965db44STomer Tayar /* Storm constant definitions array */ 549c965db44STomer Tayar static struct storm_defs s_storm_defs[] = { 550c965db44STomer Tayar /* Tstorm */ 551c965db44STomer Tayar {'T', BLOCK_TSEM, 5522d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT}, 5532d22bc83SMichal Kalderon true, 554c965db44STomer Tayar TSEM_REG_FAST_MEMORY, 5556c95dd8fSPrabhakar Kushwaha TSEM_REG_DBG_FRAME_MODE, TSEM_REG_SLOW_DBG_ACTIVE, 5566c95dd8fSPrabhakar Kushwaha TSEM_REG_SLOW_DBG_MODE, TSEM_REG_DBG_MODE1_CFG, 5572d22bc83SMichal Kalderon TSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_DBG_GPRE_VECT, 558c965db44STomer Tayar TCM_REG_CTX_RBC_ACCS, 5592d22bc83SMichal Kalderon {TCM_REG_AGG_CON_CTX, TCM_REG_SM_CON_CTX, TCM_REG_AGG_TASK_CTX, 5602d22bc83SMichal Kalderon TCM_REG_SM_TASK_CTX}, 5612d22bc83SMichal Kalderon {{4, 16, 2, 4}, {4, 16, 2, 4}} /* {bb} {k2} */ 5622d22bc83SMichal Kalderon }, 5637b6859fbSMintz, Yuval 564c965db44STomer Tayar /* Mstorm */ 565c965db44STomer Tayar {'M', BLOCK_MSEM, 5662d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM}, 5672d22bc83SMichal Kalderon false, 568c965db44STomer Tayar MSEM_REG_FAST_MEMORY, 5696c95dd8fSPrabhakar Kushwaha MSEM_REG_DBG_FRAME_MODE, 5706c95dd8fSPrabhakar Kushwaha MSEM_REG_SLOW_DBG_ACTIVE, 5716c95dd8fSPrabhakar Kushwaha MSEM_REG_SLOW_DBG_MODE, 5726c95dd8fSPrabhakar Kushwaha MSEM_REG_DBG_MODE1_CFG, 5732d22bc83SMichal Kalderon MSEM_REG_SYNC_DBG_EMPTY, 5742d22bc83SMichal Kalderon MSEM_REG_DBG_GPRE_VECT, 575c965db44STomer Tayar MCM_REG_CTX_RBC_ACCS, 5762d22bc83SMichal Kalderon {MCM_REG_AGG_CON_CTX, MCM_REG_SM_CON_CTX, MCM_REG_AGG_TASK_CTX, 5772d22bc83SMichal Kalderon MCM_REG_SM_TASK_CTX }, 5782d22bc83SMichal Kalderon {{1, 10, 2, 7}, {1, 10, 2, 7}} /* {bb} {k2}*/ 5792d22bc83SMichal Kalderon }, 5807b6859fbSMintz, Yuval 581c965db44STomer Tayar /* Ustorm */ 582c965db44STomer Tayar {'U', BLOCK_USEM, 5832d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU}, 5842d22bc83SMichal Kalderon false, 585c965db44STomer Tayar USEM_REG_FAST_MEMORY, 5866c95dd8fSPrabhakar Kushwaha USEM_REG_DBG_FRAME_MODE, 5876c95dd8fSPrabhakar Kushwaha USEM_REG_SLOW_DBG_ACTIVE, 5886c95dd8fSPrabhakar Kushwaha USEM_REG_SLOW_DBG_MODE, 5896c95dd8fSPrabhakar Kushwaha USEM_REG_DBG_MODE1_CFG, 5902d22bc83SMichal Kalderon USEM_REG_SYNC_DBG_EMPTY, 5912d22bc83SMichal Kalderon USEM_REG_DBG_GPRE_VECT, 592c965db44STomer Tayar UCM_REG_CTX_RBC_ACCS, 5932d22bc83SMichal Kalderon {UCM_REG_AGG_CON_CTX, UCM_REG_SM_CON_CTX, UCM_REG_AGG_TASK_CTX, 5942d22bc83SMichal Kalderon UCM_REG_SM_TASK_CTX}, 5952d22bc83SMichal Kalderon {{2, 13, 3, 3}, {2, 13, 3, 3}} /* {bb} {k2} */ 5962d22bc83SMichal Kalderon }, 5977b6859fbSMintz, Yuval 598c965db44STomer Tayar /* Xstorm */ 599c965db44STomer Tayar {'X', BLOCK_XSEM, 6002d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX}, 6012d22bc83SMichal Kalderon false, 602c965db44STomer Tayar XSEM_REG_FAST_MEMORY, 6036c95dd8fSPrabhakar Kushwaha XSEM_REG_DBG_FRAME_MODE, 6046c95dd8fSPrabhakar Kushwaha XSEM_REG_SLOW_DBG_ACTIVE, 6056c95dd8fSPrabhakar Kushwaha XSEM_REG_SLOW_DBG_MODE, 6066c95dd8fSPrabhakar Kushwaha XSEM_REG_DBG_MODE1_CFG, 6072d22bc83SMichal Kalderon XSEM_REG_SYNC_DBG_EMPTY, 6082d22bc83SMichal Kalderon XSEM_REG_DBG_GPRE_VECT, 609c965db44STomer Tayar XCM_REG_CTX_RBC_ACCS, 6102d22bc83SMichal Kalderon {XCM_REG_AGG_CON_CTX, XCM_REG_SM_CON_CTX, 0, 0}, 6112d22bc83SMichal Kalderon {{9, 15, 0, 0}, {9, 15, 0, 0}} /* {bb} {k2} */ 6122d22bc83SMichal Kalderon }, 6137b6859fbSMintz, Yuval 614c965db44STomer Tayar /* Ystorm */ 615c965db44STomer Tayar {'Y', BLOCK_YSEM, 6162d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY}, 6172d22bc83SMichal Kalderon false, 618c965db44STomer Tayar YSEM_REG_FAST_MEMORY, 6196c95dd8fSPrabhakar Kushwaha YSEM_REG_DBG_FRAME_MODE, 6206c95dd8fSPrabhakar Kushwaha YSEM_REG_SLOW_DBG_ACTIVE, 6216c95dd8fSPrabhakar Kushwaha YSEM_REG_SLOW_DBG_MODE, 6226c95dd8fSPrabhakar Kushwaha YSEM_REG_DBG_MODE1_CFG, 6232d22bc83SMichal Kalderon YSEM_REG_SYNC_DBG_EMPTY, 6242d22bc83SMichal Kalderon YSEM_REG_DBG_GPRE_VECT, 625c965db44STomer Tayar YCM_REG_CTX_RBC_ACCS, 6262d22bc83SMichal Kalderon {YCM_REG_AGG_CON_CTX, YCM_REG_SM_CON_CTX, YCM_REG_AGG_TASK_CTX, 6272d22bc83SMichal Kalderon YCM_REG_SM_TASK_CTX}, 6282d22bc83SMichal Kalderon {{2, 3, 2, 12}, {2, 3, 2, 12}} /* {bb} {k2} */ 6292d22bc83SMichal Kalderon }, 6307b6859fbSMintz, Yuval 631c965db44STomer Tayar /* Pstorm */ 632c965db44STomer Tayar {'P', BLOCK_PSEM, 6332d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS}, 6342d22bc83SMichal Kalderon true, 635c965db44STomer Tayar PSEM_REG_FAST_MEMORY, 6366c95dd8fSPrabhakar Kushwaha PSEM_REG_DBG_FRAME_MODE, 6376c95dd8fSPrabhakar Kushwaha PSEM_REG_SLOW_DBG_ACTIVE, 6386c95dd8fSPrabhakar Kushwaha PSEM_REG_SLOW_DBG_MODE, 6396c95dd8fSPrabhakar Kushwaha PSEM_REG_DBG_MODE1_CFG, 6402d22bc83SMichal Kalderon PSEM_REG_SYNC_DBG_EMPTY, 6412d22bc83SMichal Kalderon PSEM_REG_DBG_GPRE_VECT, 642c965db44STomer Tayar PCM_REG_CTX_RBC_ACCS, 6432d22bc83SMichal Kalderon {0, PCM_REG_SM_CON_CTX, 0, 0}, 6442d22bc83SMichal Kalderon {{0, 10, 0, 0}, {0, 10, 0, 0}} /* {bb} {k2} */ 6452d22bc83SMichal Kalderon }, 646c965db44STomer Tayar }; 647c965db44STomer Tayar 6482d22bc83SMichal Kalderon static struct hw_type_defs s_hw_type_defs[] = { 6492d22bc83SMichal Kalderon /* HW_TYPE_ASIC */ 650da090917STomer Tayar {"asic", 1, 256, 32768}, 651da090917STomer Tayar {"reserved", 0, 0, 0}, 652da090917STomer Tayar {"reserved2", 0, 0, 0}, 6536c95dd8fSPrabhakar Kushwaha {"reserved3", 0, 0, 0}, 6546c95dd8fSPrabhakar Kushwaha {"reserved4", 0, 0, 0} 655c965db44STomer Tayar }; 656c965db44STomer Tayar 657c965db44STomer Tayar static struct grc_param_defs s_grc_param_defs[] = { 6587b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_TSTORM */ 6592d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 6607b6859fbSMintz, Yuval 6617b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_MSTORM */ 6622d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 6637b6859fbSMintz, Yuval 6647b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_USTORM */ 6652d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 6667b6859fbSMintz, Yuval 6677b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_XSTORM */ 6682d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 6697b6859fbSMintz, Yuval 6707b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_YSTORM */ 6712d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 6727b6859fbSMintz, Yuval 6737b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_PSTORM */ 6742d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 6757b6859fbSMintz, Yuval 6767b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_REGS */ 6772d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6787b6859fbSMintz, Yuval 6797b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_RAM */ 6802d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6817b6859fbSMintz, Yuval 6827b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_PBUF */ 6832d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6847b6859fbSMintz, Yuval 6857b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_IOR */ 6862d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {1, 1}}, 6877b6859fbSMintz, Yuval 6887b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_VFC */ 6892d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {1, 1}}, 6907b6859fbSMintz, Yuval 6917b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_CM_CTX */ 6922d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6937b6859fbSMintz, Yuval 6947b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_ILT */ 6952d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6967b6859fbSMintz, Yuval 6977b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_RSS */ 6982d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6997b6859fbSMintz, Yuval 7007b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_CAU */ 7012d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7027b6859fbSMintz, Yuval 7037b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_QM */ 7042d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7057b6859fbSMintz, Yuval 7067b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_MCP */ 7072d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7087b6859fbSMintz, Yuval 7092d22bc83SMichal Kalderon /* DBG_GRC_PARAM_DUMP_DORQ */ 7102d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7117b6859fbSMintz, Yuval 7127b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_CFC */ 7132d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7147b6859fbSMintz, Yuval 7157b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_IGU */ 7162d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7177b6859fbSMintz, Yuval 7187b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_BRB */ 7192d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {1, 1}}, 7207b6859fbSMintz, Yuval 7217b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_BTB */ 7222d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {1, 1}}, 7237b6859fbSMintz, Yuval 7247b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_BMB */ 7252d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7267b6859fbSMintz, Yuval 7272d22bc83SMichal Kalderon /* DBG_GRC_PARAM_RESERVED1 */ 7282d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7297b6859fbSMintz, Yuval 7307b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_MULD */ 7312d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7327b6859fbSMintz, Yuval 7337b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_PRS */ 7342d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7357b6859fbSMintz, Yuval 7367b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_DMAE */ 7372d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7387b6859fbSMintz, Yuval 7397b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_TM */ 7402d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7417b6859fbSMintz, Yuval 7427b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_SDM */ 7432d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7447b6859fbSMintz, Yuval 7457b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_DIF */ 7462d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7477b6859fbSMintz, Yuval 7487b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_STATIC */ 7492d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7507b6859fbSMintz, Yuval 7517b6859fbSMintz, Yuval /* DBG_GRC_PARAM_UNSTALL */ 7522d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7537b6859fbSMintz, Yuval 7542d22bc83SMichal Kalderon /* DBG_GRC_PARAM_RESERVED2 */ 7552d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7567b6859fbSMintz, Yuval 7572d22bc83SMichal Kalderon /* DBG_GRC_PARAM_MCP_TRACE_META_SIZE */ 7582d22bc83SMichal Kalderon {{0, 0}, 1, 0xffffffff, false, true, 0, {0, 0}}, 7597b6859fbSMintz, Yuval 7607b6859fbSMintz, Yuval /* DBG_GRC_PARAM_EXCLUDE_ALL */ 7612d22bc83SMichal Kalderon {{0, 0}, 0, 1, true, false, 0, {0, 0}}, 7627b6859fbSMintz, Yuval 7637b6859fbSMintz, Yuval /* DBG_GRC_PARAM_CRASH */ 7642d22bc83SMichal Kalderon {{0, 0}, 0, 1, true, false, 0, {0, 0}}, 7657b6859fbSMintz, Yuval 7667b6859fbSMintz, Yuval /* DBG_GRC_PARAM_PARITY_SAFE */ 7672d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7687b6859fbSMintz, Yuval 7697b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_CM */ 7702d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 7717b6859fbSMintz, Yuval 7727b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_PHY */ 7732d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7747b6859fbSMintz, Yuval 7757b6859fbSMintz, Yuval /* DBG_GRC_PARAM_NO_MCP */ 7762d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7777b6859fbSMintz, Yuval 7787b6859fbSMintz, Yuval /* DBG_GRC_PARAM_NO_FW_VER */ 7792d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7808a52bbabSMichal Kalderon 7818a52bbabSMichal Kalderon /* DBG_GRC_PARAM_RESERVED3 */ 7822d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7838a52bbabSMichal Kalderon 7848a52bbabSMichal Kalderon /* DBG_GRC_PARAM_DUMP_MCP_HW_DUMP */ 7852d22bc83SMichal Kalderon {{0, 1}, 0, 1, false, false, 0, {0, 1}}, 7868a52bbabSMichal Kalderon 7878a52bbabSMichal Kalderon /* DBG_GRC_PARAM_DUMP_ILT_CDUC */ 7882d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {0, 0}}, 7898a52bbabSMichal Kalderon 7908a52bbabSMichal Kalderon /* DBG_GRC_PARAM_DUMP_ILT_CDUT */ 7912d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {0, 0}}, 7928a52bbabSMichal Kalderon 7938a52bbabSMichal Kalderon /* DBG_GRC_PARAM_DUMP_CAU_EXT */ 7942d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {1, 1}} 795c965db44STomer Tayar }; 796c965db44STomer Tayar 797c965db44STomer Tayar static struct rss_mem_defs s_rss_mem_defs[] = { 798da090917STomer Tayar {"rss_mem_cid", "rss_cid", 0, 32, 7992d22bc83SMichal Kalderon {256, 320}}, 8007b6859fbSMintz, Yuval 801da090917STomer Tayar {"rss_mem_key_msb", "rss_key", 1024, 256, 8022d22bc83SMichal Kalderon {128, 208}}, 8037b6859fbSMintz, Yuval 804da090917STomer Tayar {"rss_mem_key_lsb", "rss_key", 2048, 64, 8052d22bc83SMichal Kalderon {128, 208}}, 8067b6859fbSMintz, Yuval 807da090917STomer Tayar {"rss_mem_info", "rss_info", 3072, 16, 8082d22bc83SMichal Kalderon {128, 208}}, 8097b6859fbSMintz, Yuval 810da090917STomer Tayar {"rss_mem_ind", "rss_ind", 4096, 16, 8112d22bc83SMichal Kalderon {16384, 26624}} 812c965db44STomer Tayar }; 813c965db44STomer Tayar 814c965db44STomer Tayar static struct vfc_ram_defs s_vfc_ram_defs[] = { 815c965db44STomer Tayar {"vfc_ram_tt1", "vfc_ram", 0, 512}, 816c965db44STomer Tayar {"vfc_ram_mtt2", "vfc_ram", 512, 128}, 817c965db44STomer Tayar {"vfc_ram_stt2", "vfc_ram", 640, 32}, 818c965db44STomer Tayar {"vfc_ram_ro_vect", "vfc_ram", 672, 32} 819c965db44STomer Tayar }; 820c965db44STomer Tayar 821c965db44STomer Tayar static struct big_ram_defs s_big_ram_defs[] = { 822c965db44STomer Tayar {"BRB", MEM_GROUP_BRB_MEM, MEM_GROUP_BRB_RAM, DBG_GRC_PARAM_DUMP_BRB, 823c965db44STomer Tayar BRB_REG_BIG_RAM_ADDRESS, BRB_REG_BIG_RAM_DATA, 8242d22bc83SMichal Kalderon MISC_REG_BLOCK_256B_EN, {0, 0}, 8252d22bc83SMichal Kalderon {153600, 180224}}, 8267b6859fbSMintz, Yuval 827c965db44STomer Tayar {"BTB", MEM_GROUP_BTB_MEM, MEM_GROUP_BTB_RAM, DBG_GRC_PARAM_DUMP_BTB, 828c965db44STomer Tayar BTB_REG_BIG_RAM_ADDRESS, BTB_REG_BIG_RAM_DATA, 8292d22bc83SMichal Kalderon MISC_REG_BLOCK_256B_EN, {0, 1}, 8302d22bc83SMichal Kalderon {92160, 117760}}, 8317b6859fbSMintz, Yuval 832c965db44STomer Tayar {"BMB", MEM_GROUP_BMB_MEM, MEM_GROUP_BMB_RAM, DBG_GRC_PARAM_DUMP_BMB, 833c965db44STomer Tayar BMB_REG_BIG_RAM_ADDRESS, BMB_REG_BIG_RAM_DATA, 8342d22bc83SMichal Kalderon MISCS_REG_BLOCK_256B_EN, {0, 0}, 8352d22bc83SMichal Kalderon {36864, 36864}} 836c965db44STomer Tayar }; 837c965db44STomer Tayar 8382d22bc83SMichal Kalderon static struct rbc_reset_defs s_rbc_reset_defs[] = { 839da090917STomer Tayar {MISCS_REG_RESET_PL_HV, 8402d22bc83SMichal Kalderon {0x0, 0x400}}, 841da090917STomer Tayar {MISC_REG_RESET_PL_PDA_VMAIN_1, 8422d22bc83SMichal Kalderon {0x4404040, 0x4404040}}, 843da090917STomer Tayar {MISC_REG_RESET_PL_PDA_VMAIN_2, 8442d22bc83SMichal Kalderon {0x7, 0x7c00007}}, 845da090917STomer Tayar {MISC_REG_RESET_PL_PDA_VAUX, 8462d22bc83SMichal Kalderon {0x2, 0x2}}, 847c965db44STomer Tayar }; 848c965db44STomer Tayar 849c965db44STomer Tayar static struct phy_defs s_phy_defs[] = { 8507b6859fbSMintz, Yuval {"nw_phy", NWS_REG_NWS_CMU_K2, 8516c95dd8fSPrabhakar Kushwaha PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_7_0_K2, 8526c95dd8fSPrabhakar Kushwaha PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_15_8_K2, 8536c95dd8fSPrabhakar Kushwaha PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_7_0_K2, 8546c95dd8fSPrabhakar Kushwaha PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_11_8_K2}, 8556c95dd8fSPrabhakar Kushwaha {"sgmii_phy", MS_REG_MS_CMU_K2, 8566c95dd8fSPrabhakar Kushwaha PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X132_K2, 8576c95dd8fSPrabhakar Kushwaha PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X133_K2, 8586c95dd8fSPrabhakar Kushwaha PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X130_K2, 8596c95dd8fSPrabhakar Kushwaha PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X131_K2}, 8606c95dd8fSPrabhakar Kushwaha {"pcie_phy0", PHY_PCIE_REG_PHY0_K2, 8616c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2, 8626c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2, 8636c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2, 8646c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2}, 8656c95dd8fSPrabhakar Kushwaha {"pcie_phy1", PHY_PCIE_REG_PHY1_K2, 8666c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2, 8676c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2, 8686c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2, 8696c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2}, 870c965db44STomer Tayar }; 871c965db44STomer Tayar 872d52c89f1SMichal Kalderon static struct split_type_defs s_split_type_defs[] = { 873d52c89f1SMichal Kalderon /* SPLIT_TYPE_NONE */ 874d52c89f1SMichal Kalderon {"eng"}, 875d52c89f1SMichal Kalderon 876d52c89f1SMichal Kalderon /* SPLIT_TYPE_PORT */ 877d52c89f1SMichal Kalderon {"port"}, 878d52c89f1SMichal Kalderon 879d52c89f1SMichal Kalderon /* SPLIT_TYPE_PF */ 880d52c89f1SMichal Kalderon {"pf"}, 881d52c89f1SMichal Kalderon 882d52c89f1SMichal Kalderon /* SPLIT_TYPE_PORT_PF */ 883d52c89f1SMichal Kalderon {"port"}, 884d52c89f1SMichal Kalderon 885d52c89f1SMichal Kalderon /* SPLIT_TYPE_VF */ 886d52c89f1SMichal Kalderon {"vf"} 887d52c89f1SMichal Kalderon }; 888d52c89f1SMichal Kalderon 8896c95dd8fSPrabhakar Kushwaha /******************************** Variables **********************************/ 8906c95dd8fSPrabhakar Kushwaha 8916c95dd8fSPrabhakar Kushwaha /* The version of the calling app */ 8926c95dd8fSPrabhakar Kushwaha static u32 s_app_ver; 8936c95dd8fSPrabhakar Kushwaha 894c965db44STomer Tayar /**************************** Private Functions ******************************/ 895c965db44STomer Tayar 8966c95dd8fSPrabhakar Kushwaha static void qed_static_asserts(void) 8976c95dd8fSPrabhakar Kushwaha { 8986c95dd8fSPrabhakar Kushwaha } 8996c95dd8fSPrabhakar Kushwaha 900c965db44STomer Tayar /* Reads and returns a single dword from the specified unaligned buffer */ 901c965db44STomer Tayar static u32 qed_read_unaligned_dword(u8 *buf) 902c965db44STomer Tayar { 903c965db44STomer Tayar u32 dword; 904c965db44STomer Tayar 905c965db44STomer Tayar memcpy((u8 *)&dword, buf, sizeof(dword)); 906c965db44STomer Tayar return dword; 907c965db44STomer Tayar } 908c965db44STomer Tayar 9093b86bd07SSudarsana Reddy Kalluru /* Sets the value of the specified GRC param */ 9103b86bd07SSudarsana Reddy Kalluru static void qed_grc_set_param(struct qed_hwfn *p_hwfn, 9113b86bd07SSudarsana Reddy Kalluru enum dbg_grc_params grc_param, u32 val) 9123b86bd07SSudarsana Reddy Kalluru { 9133b86bd07SSudarsana Reddy Kalluru struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 9143b86bd07SSudarsana Reddy Kalluru 9153b86bd07SSudarsana Reddy Kalluru dev_data->grc.param_val[grc_param] = val; 9163b86bd07SSudarsana Reddy Kalluru } 9173b86bd07SSudarsana Reddy Kalluru 918be086e7cSMintz, Yuval /* Returns the value of the specified GRC param */ 919be086e7cSMintz, Yuval static u32 qed_grc_get_param(struct qed_hwfn *p_hwfn, 920be086e7cSMintz, Yuval enum dbg_grc_params grc_param) 921be086e7cSMintz, Yuval { 922be086e7cSMintz, Yuval struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 923be086e7cSMintz, Yuval 924be086e7cSMintz, Yuval return dev_data->grc.param_val[grc_param]; 925be086e7cSMintz, Yuval } 926be086e7cSMintz, Yuval 927be086e7cSMintz, Yuval /* Initializes the GRC parameters */ 928be086e7cSMintz, Yuval static void qed_dbg_grc_init_params(struct qed_hwfn *p_hwfn) 929be086e7cSMintz, Yuval { 930be086e7cSMintz, Yuval struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 931be086e7cSMintz, Yuval 932be086e7cSMintz, Yuval if (!dev_data->grc.params_initialized) { 933be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 934be086e7cSMintz, Yuval dev_data->grc.params_initialized = 1; 935be086e7cSMintz, Yuval } 936be086e7cSMintz, Yuval } 937be086e7cSMintz, Yuval 9382d22bc83SMichal Kalderon /* Sets pointer and size for the specified binary buffer type */ 9392d22bc83SMichal Kalderon static void qed_set_dbg_bin_buf(struct qed_hwfn *p_hwfn, 9402d22bc83SMichal Kalderon enum bin_dbg_buffer_type buf_type, 9412d22bc83SMichal Kalderon const u32 *ptr, u32 size) 9422d22bc83SMichal Kalderon { 9432d22bc83SMichal Kalderon struct virt_mem_desc *buf = &p_hwfn->dbg_arrays[buf_type]; 9442d22bc83SMichal Kalderon 9452d22bc83SMichal Kalderon buf->ptr = (void *)ptr; 9462d22bc83SMichal Kalderon buf->size = size; 9472d22bc83SMichal Kalderon } 9482d22bc83SMichal Kalderon 949c965db44STomer Tayar /* Initializes debug data for the specified device */ 9502d22bc83SMichal Kalderon static enum dbg_status qed_dbg_dev_init(struct qed_hwfn *p_hwfn) 951c965db44STomer Tayar { 952c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 953d52c89f1SMichal Kalderon u8 num_pfs = 0, max_pfs_per_port = 0; 954c965db44STomer Tayar 955c965db44STomer Tayar if (dev_data->initialized) 956c965db44STomer Tayar return DBG_STATUS_OK; 957c965db44STomer Tayar 9586c95dd8fSPrabhakar Kushwaha if (!s_app_ver) 9596c95dd8fSPrabhakar Kushwaha return DBG_STATUS_APP_VERSION_NOT_SET; 9606c95dd8fSPrabhakar Kushwaha 961d52c89f1SMichal Kalderon /* Set chip */ 962c965db44STomer Tayar if (QED_IS_K2(p_hwfn->cdev)) { 963c965db44STomer Tayar dev_data->chip_id = CHIP_K2; 964c965db44STomer Tayar dev_data->mode_enable[MODE_K2] = 1; 965d52c89f1SMichal Kalderon dev_data->num_vfs = MAX_NUM_VFS_K2; 966d52c89f1SMichal Kalderon num_pfs = MAX_NUM_PFS_K2; 967d52c89f1SMichal Kalderon max_pfs_per_port = MAX_NUM_PFS_K2 / 2; 968c965db44STomer Tayar } else if (QED_IS_BB_B0(p_hwfn->cdev)) { 9697b6859fbSMintz, Yuval dev_data->chip_id = CHIP_BB; 9709c79ddaaSMintz, Yuval dev_data->mode_enable[MODE_BB] = 1; 971d52c89f1SMichal Kalderon dev_data->num_vfs = MAX_NUM_VFS_BB; 972d52c89f1SMichal Kalderon num_pfs = MAX_NUM_PFS_BB; 973d52c89f1SMichal Kalderon max_pfs_per_port = MAX_NUM_PFS_BB; 974c965db44STomer Tayar } else { 975c965db44STomer Tayar return DBG_STATUS_UNKNOWN_CHIP; 976c965db44STomer Tayar } 977c965db44STomer Tayar 9782d22bc83SMichal Kalderon /* Set HW type */ 9792d22bc83SMichal Kalderon dev_data->hw_type = HW_TYPE_ASIC; 980c965db44STomer Tayar dev_data->mode_enable[MODE_ASIC] = 1; 981be086e7cSMintz, Yuval 982d52c89f1SMichal Kalderon /* Set port mode */ 9832d22bc83SMichal Kalderon switch (p_hwfn->cdev->num_ports_in_engine) { 9842d22bc83SMichal Kalderon case 1: 985d52c89f1SMichal Kalderon dev_data->mode_enable[MODE_PORTS_PER_ENG_1] = 1; 986d52c89f1SMichal Kalderon break; 9872d22bc83SMichal Kalderon case 2: 988d52c89f1SMichal Kalderon dev_data->mode_enable[MODE_PORTS_PER_ENG_2] = 1; 989d52c89f1SMichal Kalderon break; 9902d22bc83SMichal Kalderon case 4: 991d52c89f1SMichal Kalderon dev_data->mode_enable[MODE_PORTS_PER_ENG_4] = 1; 992d52c89f1SMichal Kalderon break; 993d52c89f1SMichal Kalderon } 994d52c89f1SMichal Kalderon 995d52c89f1SMichal Kalderon /* Set 100G mode */ 9962d22bc83SMichal Kalderon if (QED_IS_CMT(p_hwfn->cdev)) 997d52c89f1SMichal Kalderon dev_data->mode_enable[MODE_100G] = 1; 998d52c89f1SMichal Kalderon 999d52c89f1SMichal Kalderon /* Set number of ports */ 1000d52c89f1SMichal Kalderon if (dev_data->mode_enable[MODE_PORTS_PER_ENG_1] || 1001d52c89f1SMichal Kalderon dev_data->mode_enable[MODE_100G]) 1002d52c89f1SMichal Kalderon dev_data->num_ports = 1; 1003d52c89f1SMichal Kalderon else if (dev_data->mode_enable[MODE_PORTS_PER_ENG_2]) 1004d52c89f1SMichal Kalderon dev_data->num_ports = 2; 1005d52c89f1SMichal Kalderon else if (dev_data->mode_enable[MODE_PORTS_PER_ENG_4]) 1006d52c89f1SMichal Kalderon dev_data->num_ports = 4; 1007d52c89f1SMichal Kalderon 1008d52c89f1SMichal Kalderon /* Set number of PFs per port */ 1009d52c89f1SMichal Kalderon dev_data->num_pfs_per_port = min_t(u32, 1010d52c89f1SMichal Kalderon num_pfs / dev_data->num_ports, 1011d52c89f1SMichal Kalderon max_pfs_per_port); 1012d52c89f1SMichal Kalderon 1013be086e7cSMintz, Yuval /* Initializes the GRC parameters */ 1014be086e7cSMintz, Yuval qed_dbg_grc_init_params(p_hwfn); 1015be086e7cSMintz, Yuval 1016da090917STomer Tayar dev_data->use_dmae = true; 1017da090917STomer Tayar dev_data->initialized = 1; 10187b6859fbSMintz, Yuval 1019c965db44STomer Tayar return DBG_STATUS_OK; 1020c965db44STomer Tayar } 1021c965db44STomer Tayar 10222d22bc83SMichal Kalderon static const struct dbg_block *get_dbg_block(struct qed_hwfn *p_hwfn, 10237b6859fbSMintz, Yuval enum block_id block_id) 10247b6859fbSMintz, Yuval { 10252d22bc83SMichal Kalderon const struct dbg_block *dbg_block; 10262d22bc83SMichal Kalderon 10272d22bc83SMichal Kalderon dbg_block = p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS].ptr; 10282d22bc83SMichal Kalderon return dbg_block + block_id; 10292d22bc83SMichal Kalderon } 10302d22bc83SMichal Kalderon 10312d22bc83SMichal Kalderon static const struct dbg_block_chip *qed_get_dbg_block_per_chip(struct qed_hwfn 10322d22bc83SMichal Kalderon *p_hwfn, 10332d22bc83SMichal Kalderon enum block_id 10342d22bc83SMichal Kalderon block_id) 10352d22bc83SMichal Kalderon { 10367b6859fbSMintz, Yuval struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 10377b6859fbSMintz, Yuval 10382d22bc83SMichal Kalderon return (const struct dbg_block_chip *) 10392d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_CHIP_DATA].ptr + 10402d22bc83SMichal Kalderon block_id * MAX_CHIP_IDS + dev_data->chip_id; 10412d22bc83SMichal Kalderon } 10422d22bc83SMichal Kalderon 10432d22bc83SMichal Kalderon static const struct dbg_reset_reg *qed_get_dbg_reset_reg(struct qed_hwfn 10442d22bc83SMichal Kalderon *p_hwfn, 10452d22bc83SMichal Kalderon u8 reset_reg_id) 10462d22bc83SMichal Kalderon { 10472d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 10482d22bc83SMichal Kalderon 10492d22bc83SMichal Kalderon return (const struct dbg_reset_reg *) 10502d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_RESET_REGS].ptr + 10512d22bc83SMichal Kalderon reset_reg_id * MAX_CHIP_IDS + dev_data->chip_id; 10527b6859fbSMintz, Yuval } 10537b6859fbSMintz, Yuval 1054c965db44STomer Tayar /* Reads the FW info structure for the specified Storm from the chip, 1055c965db44STomer Tayar * and writes it to the specified fw_info pointer. 1056c965db44STomer Tayar */ 1057d52c89f1SMichal Kalderon static void qed_read_storm_fw_info(struct qed_hwfn *p_hwfn, 1058c965db44STomer Tayar struct qed_ptt *p_ptt, 1059c965db44STomer Tayar u8 storm_id, struct fw_info *fw_info) 1060c965db44STomer Tayar { 10617b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 1062c965db44STomer Tayar struct fw_info_location fw_info_location; 10635ab90341SAlexander Lobakin u32 addr, i, size, *dest; 1064c965db44STomer Tayar 1065c965db44STomer Tayar memset(&fw_info_location, 0, sizeof(fw_info_location)); 1066c965db44STomer Tayar memset(fw_info, 0, sizeof(*fw_info)); 10677b6859fbSMintz, Yuval 10687b6859fbSMintz, Yuval /* Read first the address that points to fw_info location. 10697b6859fbSMintz, Yuval * The address is located in the last line of the Storm RAM. 10707b6859fbSMintz, Yuval */ 10717b6859fbSMintz, Yuval addr = storm->sem_fast_mem_addr + SEM_FAST_REG_INT_RAM + 10722d22bc83SMichal Kalderon DWORDS_TO_BYTES(SEM_FAST_REG_INT_RAM_SIZE) - 10737b6859fbSMintz, Yuval sizeof(fw_info_location); 10742d22bc83SMichal Kalderon 10757b6859fbSMintz, Yuval dest = (u32 *)&fw_info_location; 10765ab90341SAlexander Lobakin size = BYTES_TO_DWORDS(sizeof(fw_info_location)); 10777b6859fbSMintz, Yuval 10785ab90341SAlexander Lobakin for (i = 0; i < size; i++, addr += BYTES_IN_DWORD) 1079c965db44STomer Tayar dest[i] = qed_rd(p_hwfn, p_ptt, addr); 10807b6859fbSMintz, Yuval 10817b6859fbSMintz, Yuval /* Read FW version info from Storm RAM */ 10825ab90341SAlexander Lobakin size = le32_to_cpu(fw_info_location.size); 10835ab90341SAlexander Lobakin if (!size || size > sizeof(*fw_info)) 10845ab90341SAlexander Lobakin return; 10855ab90341SAlexander Lobakin 10865ab90341SAlexander Lobakin addr = le32_to_cpu(fw_info_location.grc_addr); 1087c965db44STomer Tayar dest = (u32 *)fw_info; 10885ab90341SAlexander Lobakin size = BYTES_TO_DWORDS(size); 10895ab90341SAlexander Lobakin 10905ab90341SAlexander Lobakin for (i = 0; i < size; i++, addr += BYTES_IN_DWORD) 1091c965db44STomer Tayar dest[i] = qed_rd(p_hwfn, p_ptt, addr); 1092c965db44STomer Tayar } 1093c965db44STomer Tayar 10947b6859fbSMintz, Yuval /* Dumps the specified string to the specified buffer. 10957b6859fbSMintz, Yuval * Returns the dumped size in bytes. 1096c965db44STomer Tayar */ 1097c965db44STomer Tayar static u32 qed_dump_str(char *dump_buf, bool dump, const char *str) 1098c965db44STomer Tayar { 1099c965db44STomer Tayar if (dump) 1100c965db44STomer Tayar strcpy(dump_buf, str); 11017b6859fbSMintz, Yuval 1102c965db44STomer Tayar return (u32)strlen(str) + 1; 1103c965db44STomer Tayar } 1104c965db44STomer Tayar 11057b6859fbSMintz, Yuval /* Dumps zeros to align the specified buffer to dwords. 11067b6859fbSMintz, Yuval * Returns the dumped size in bytes. 1107c965db44STomer Tayar */ 1108c965db44STomer Tayar static u32 qed_dump_align(char *dump_buf, bool dump, u32 byte_offset) 1109c965db44STomer Tayar { 11107b6859fbSMintz, Yuval u8 offset_in_dword, align_size; 1111c965db44STomer Tayar 11127b6859fbSMintz, Yuval offset_in_dword = (u8)(byte_offset & 0x3); 1113c965db44STomer Tayar align_size = offset_in_dword ? BYTES_IN_DWORD - offset_in_dword : 0; 1114c965db44STomer Tayar 1115c965db44STomer Tayar if (dump && align_size) 1116c965db44STomer Tayar memset(dump_buf, 0, align_size); 11177b6859fbSMintz, Yuval 1118c965db44STomer Tayar return align_size; 1119c965db44STomer Tayar } 1120c965db44STomer Tayar 1121c965db44STomer Tayar /* Writes the specified string param to the specified buffer. 1122c965db44STomer Tayar * Returns the dumped size in dwords. 1123c965db44STomer Tayar */ 1124c965db44STomer Tayar static u32 qed_dump_str_param(u32 *dump_buf, 1125c965db44STomer Tayar bool dump, 1126c965db44STomer Tayar const char *param_name, const char *param_val) 1127c965db44STomer Tayar { 1128c965db44STomer Tayar char *char_buf = (char *)dump_buf; 1129c965db44STomer Tayar u32 offset = 0; 1130c965db44STomer Tayar 1131c965db44STomer Tayar /* Dump param name */ 1132c965db44STomer Tayar offset += qed_dump_str(char_buf + offset, dump, param_name); 1133c965db44STomer Tayar 1134c965db44STomer Tayar /* Indicate a string param value */ 1135c965db44STomer Tayar if (dump) 1136c965db44STomer Tayar *(char_buf + offset) = 1; 1137c965db44STomer Tayar offset++; 1138c965db44STomer Tayar 1139c965db44STomer Tayar /* Dump param value */ 1140c965db44STomer Tayar offset += qed_dump_str(char_buf + offset, dump, param_val); 1141c965db44STomer Tayar 1142c965db44STomer Tayar /* Align buffer to next dword */ 1143c965db44STomer Tayar offset += qed_dump_align(char_buf + offset, dump, offset); 11447b6859fbSMintz, Yuval 1145c965db44STomer Tayar return BYTES_TO_DWORDS(offset); 1146c965db44STomer Tayar } 1147c965db44STomer Tayar 1148c965db44STomer Tayar /* Writes the specified numeric param to the specified buffer. 1149c965db44STomer Tayar * Returns the dumped size in dwords. 1150c965db44STomer Tayar */ 1151c965db44STomer Tayar static u32 qed_dump_num_param(u32 *dump_buf, 1152c965db44STomer Tayar bool dump, const char *param_name, u32 param_val) 1153c965db44STomer Tayar { 1154c965db44STomer Tayar char *char_buf = (char *)dump_buf; 1155c965db44STomer Tayar u32 offset = 0; 1156c965db44STomer Tayar 1157c965db44STomer Tayar /* Dump param name */ 1158c965db44STomer Tayar offset += qed_dump_str(char_buf + offset, dump, param_name); 1159c965db44STomer Tayar 1160c965db44STomer Tayar /* Indicate a numeric param value */ 1161c965db44STomer Tayar if (dump) 1162c965db44STomer Tayar *(char_buf + offset) = 0; 1163c965db44STomer Tayar offset++; 1164c965db44STomer Tayar 1165c965db44STomer Tayar /* Align buffer to next dword */ 1166c965db44STomer Tayar offset += qed_dump_align(char_buf + offset, dump, offset); 1167c965db44STomer Tayar 1168c965db44STomer Tayar /* Dump param value (and change offset from bytes to dwords) */ 1169c965db44STomer Tayar offset = BYTES_TO_DWORDS(offset); 1170c965db44STomer Tayar if (dump) 1171c965db44STomer Tayar *(dump_buf + offset) = param_val; 1172c965db44STomer Tayar offset++; 11737b6859fbSMintz, Yuval 1174c965db44STomer Tayar return offset; 1175c965db44STomer Tayar } 1176c965db44STomer Tayar 1177c965db44STomer Tayar /* Reads the FW version and writes it as a param to the specified buffer. 1178c965db44STomer Tayar * Returns the dumped size in dwords. 1179c965db44STomer Tayar */ 1180c965db44STomer Tayar static u32 qed_dump_fw_ver_param(struct qed_hwfn *p_hwfn, 1181c965db44STomer Tayar struct qed_ptt *p_ptt, 1182c965db44STomer Tayar u32 *dump_buf, bool dump) 1183c965db44STomer Tayar { 1184c965db44STomer Tayar char fw_ver_str[16] = EMPTY_FW_VERSION_STR; 1185c965db44STomer Tayar char fw_img_str[16] = EMPTY_FW_IMAGE_STR; 1186c965db44STomer Tayar struct fw_info fw_info = { {0}, {0} }; 1187c965db44STomer Tayar u32 offset = 0; 1188c965db44STomer Tayar 1189be086e7cSMintz, Yuval if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) { 1190d52c89f1SMichal Kalderon /* Read FW info from chip */ 1191d52c89f1SMichal Kalderon qed_read_fw_info(p_hwfn, p_ptt, &fw_info); 1192c965db44STomer Tayar 1193c965db44STomer Tayar /* Create FW version/image strings */ 11947b6859fbSMintz, Yuval if (snprintf(fw_ver_str, sizeof(fw_ver_str), 11957b6859fbSMintz, Yuval "%d_%d_%d_%d", fw_info.ver.num.major, 11967b6859fbSMintz, Yuval fw_info.ver.num.minor, fw_info.ver.num.rev, 11977b6859fbSMintz, Yuval fw_info.ver.num.eng) < 0) 1198c965db44STomer Tayar DP_NOTICE(p_hwfn, 1199c965db44STomer Tayar "Unexpected debug error: invalid FW version string\n"); 1200c965db44STomer Tayar switch (fw_info.ver.image_id) { 12016c95dd8fSPrabhakar Kushwaha case FW_IMG_KUKU: 12026c95dd8fSPrabhakar Kushwaha strcpy(fw_img_str, "kuku"); 12036c95dd8fSPrabhakar Kushwaha break; 1204c965db44STomer Tayar case FW_IMG_MAIN: 1205c965db44STomer Tayar strcpy(fw_img_str, "main"); 1206c965db44STomer Tayar break; 12076c95dd8fSPrabhakar Kushwaha case FW_IMG_L2B: 12086c95dd8fSPrabhakar Kushwaha strcpy(fw_img_str, "l2b"); 12096c95dd8fSPrabhakar Kushwaha break; 1210c965db44STomer Tayar default: 1211c965db44STomer Tayar strcpy(fw_img_str, "unknown"); 1212c965db44STomer Tayar break; 1213c965db44STomer Tayar } 1214c965db44STomer Tayar } 1215c965db44STomer Tayar 1216c965db44STomer Tayar /* Dump FW version, image and timestamp */ 1217c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1218c965db44STomer Tayar dump, "fw-version", fw_ver_str); 1219c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1220c965db44STomer Tayar dump, "fw-image", fw_img_str); 12211451e467SAlexander Lobakin offset += qed_dump_num_param(dump_buf + offset, dump, "fw-timestamp", 12225ab90341SAlexander Lobakin le32_to_cpu(fw_info.ver.timestamp)); 12237b6859fbSMintz, Yuval 1224c965db44STomer Tayar return offset; 1225c965db44STomer Tayar } 1226c965db44STomer Tayar 1227c965db44STomer Tayar /* Reads the MFW version and writes it as a param to the specified buffer. 1228c965db44STomer Tayar * Returns the dumped size in dwords. 1229c965db44STomer Tayar */ 1230c965db44STomer Tayar static u32 qed_dump_mfw_ver_param(struct qed_hwfn *p_hwfn, 1231c965db44STomer Tayar struct qed_ptt *p_ptt, 1232c965db44STomer Tayar u32 *dump_buf, bool dump) 1233c965db44STomer Tayar { 1234c965db44STomer Tayar char mfw_ver_str[16] = EMPTY_FW_VERSION_STR; 1235c965db44STomer Tayar 12367b6859fbSMintz, Yuval if (dump && 12377b6859fbSMintz, Yuval !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) { 1238c965db44STomer Tayar u32 global_section_offsize, global_section_addr, mfw_ver; 1239c965db44STomer Tayar u32 public_data_addr, global_section_offsize_addr; 1240c965db44STomer Tayar 12417b6859fbSMintz, Yuval /* Find MCP public data GRC address. Needs to be ORed with 12427b6859fbSMintz, Yuval * MCP_REG_SCRATCH due to a HW bug. 1243c965db44STomer Tayar */ 12447b6859fbSMintz, Yuval public_data_addr = qed_rd(p_hwfn, 12457b6859fbSMintz, Yuval p_ptt, 1246c965db44STomer Tayar MISC_REG_SHARED_MEM_ADDR) | 1247c965db44STomer Tayar MCP_REG_SCRATCH; 1248c965db44STomer Tayar 1249c965db44STomer Tayar /* Find MCP public global section offset */ 1250c965db44STomer Tayar global_section_offsize_addr = public_data_addr + 1251c965db44STomer Tayar offsetof(struct mcp_public_data, 1252c965db44STomer Tayar sections) + 1253c965db44STomer Tayar sizeof(offsize_t) * PUBLIC_GLOBAL; 1254c965db44STomer Tayar global_section_offsize = qed_rd(p_hwfn, p_ptt, 1255c965db44STomer Tayar global_section_offsize_addr); 12567b6859fbSMintz, Yuval global_section_addr = 12577b6859fbSMintz, Yuval MCP_REG_SCRATCH + 12587b6859fbSMintz, Yuval (global_section_offsize & OFFSIZE_OFFSET_MASK) * 4; 1259c965db44STomer Tayar 1260c965db44STomer Tayar /* Read MFW version from MCP public global section */ 1261c965db44STomer Tayar mfw_ver = qed_rd(p_hwfn, p_ptt, 1262c965db44STomer Tayar global_section_addr + 1263c965db44STomer Tayar offsetof(struct public_global, mfw_ver)); 1264c965db44STomer Tayar 1265c965db44STomer Tayar /* Dump MFW version param */ 12667b6859fbSMintz, Yuval if (snprintf(mfw_ver_str, sizeof(mfw_ver_str), "%d_%d_%d_%d", 12677b6859fbSMintz, Yuval (u8)(mfw_ver >> 24), (u8)(mfw_ver >> 16), 12687b6859fbSMintz, Yuval (u8)(mfw_ver >> 8), (u8)mfw_ver) < 0) 1269c965db44STomer Tayar DP_NOTICE(p_hwfn, 1270c965db44STomer Tayar "Unexpected debug error: invalid MFW version string\n"); 1271c965db44STomer Tayar } 1272c965db44STomer Tayar 1273c965db44STomer Tayar return qed_dump_str_param(dump_buf, dump, "mfw-version", mfw_ver_str); 1274c965db44STomer Tayar } 1275c965db44STomer Tayar 12762d22bc83SMichal Kalderon /* Reads the chip revision from the chip and writes it as a param to the 12772d22bc83SMichal Kalderon * specified buffer. Returns the dumped size in dwords. 12782d22bc83SMichal Kalderon */ 12792d22bc83SMichal Kalderon static u32 qed_dump_chip_revision_param(struct qed_hwfn *p_hwfn, 12802d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 12812d22bc83SMichal Kalderon u32 *dump_buf, bool dump) 12822d22bc83SMichal Kalderon { 12832d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 12842d22bc83SMichal Kalderon char param_str[3] = "??"; 12852d22bc83SMichal Kalderon 12862d22bc83SMichal Kalderon if (dev_data->hw_type == HW_TYPE_ASIC) { 12872d22bc83SMichal Kalderon u32 chip_rev, chip_metal; 12882d22bc83SMichal Kalderon 12892d22bc83SMichal Kalderon chip_rev = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_REV); 12902d22bc83SMichal Kalderon chip_metal = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_METAL); 12912d22bc83SMichal Kalderon 12922d22bc83SMichal Kalderon param_str[0] = 'a' + (u8)chip_rev; 12932d22bc83SMichal Kalderon param_str[1] = '0' + (u8)chip_metal; 12942d22bc83SMichal Kalderon } 12952d22bc83SMichal Kalderon 12962d22bc83SMichal Kalderon return qed_dump_str_param(dump_buf, dump, "chip-revision", param_str); 12972d22bc83SMichal Kalderon } 12982d22bc83SMichal Kalderon 1299c965db44STomer Tayar /* Writes a section header to the specified buffer. 1300c965db44STomer Tayar * Returns the dumped size in dwords. 1301c965db44STomer Tayar */ 1302c965db44STomer Tayar static u32 qed_dump_section_hdr(u32 *dump_buf, 1303c965db44STomer Tayar bool dump, const char *name, u32 num_params) 1304c965db44STomer Tayar { 1305c965db44STomer Tayar return qed_dump_num_param(dump_buf, dump, name, num_params); 1306c965db44STomer Tayar } 1307c965db44STomer Tayar 1308c965db44STomer Tayar /* Writes the common global params to the specified buffer. 1309c965db44STomer Tayar * Returns the dumped size in dwords. 1310c965db44STomer Tayar */ 1311c965db44STomer Tayar static u32 qed_dump_common_global_params(struct qed_hwfn *p_hwfn, 1312c965db44STomer Tayar struct qed_ptt *p_ptt, 1313c965db44STomer Tayar u32 *dump_buf, 1314c965db44STomer Tayar bool dump, 1315c965db44STomer Tayar u8 num_specific_global_params) 1316c965db44STomer Tayar { 1317c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 1318c965db44STomer Tayar u32 offset = 0; 13197b6859fbSMintz, Yuval u8 num_params; 1320c965db44STomer Tayar 13217b6859fbSMintz, Yuval /* Dump global params section header */ 13222d22bc83SMichal Kalderon num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params + 13232d22bc83SMichal Kalderon (dev_data->chip_id == CHIP_BB ? 1 : 0); 1324c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 1325be086e7cSMintz, Yuval dump, "global_params", num_params); 1326c965db44STomer Tayar 1327c965db44STomer Tayar /* Store params */ 1328c965db44STomer Tayar offset += qed_dump_fw_ver_param(p_hwfn, p_ptt, dump_buf + offset, dump); 1329c965db44STomer Tayar offset += qed_dump_mfw_ver_param(p_hwfn, 1330c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 13312d22bc83SMichal Kalderon offset += qed_dump_chip_revision_param(p_hwfn, 13322d22bc83SMichal Kalderon p_ptt, dump_buf + offset, dump); 1333c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 1334c965db44STomer Tayar dump, "tools-version", TOOLS_VERSION); 1335c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1336c965db44STomer Tayar dump, 1337c965db44STomer Tayar "chip", 1338c965db44STomer Tayar s_chip_defs[dev_data->chip_id].name); 1339c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1340c965db44STomer Tayar dump, 1341c965db44STomer Tayar "platform", 13422d22bc83SMichal Kalderon s_hw_type_defs[dev_data->hw_type].name); 13432d22bc83SMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 13442d22bc83SMichal Kalderon dump, "pci-func", p_hwfn->abs_pf_id); 13456c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 13466c95dd8fSPrabhakar Kushwaha dump, "epoch", qed_get_epoch_time()); 13472d22bc83SMichal Kalderon if (dev_data->chip_id == CHIP_BB) 13482d22bc83SMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 13492d22bc83SMichal Kalderon dump, "path", QED_PATH_ID(p_hwfn)); 13507b6859fbSMintz, Yuval 1351c965db44STomer Tayar return offset; 1352c965db44STomer Tayar } 1353c965db44STomer Tayar 13547b6859fbSMintz, Yuval /* Writes the "last" section (including CRC) to the specified buffer at the 13557b6859fbSMintz, Yuval * given offset. Returns the dumped size in dwords. 1356c965db44STomer Tayar */ 1357da090917STomer Tayar static u32 qed_dump_last_section(u32 *dump_buf, u32 offset, bool dump) 1358c965db44STomer Tayar { 13597b6859fbSMintz, Yuval u32 start_offset = offset; 1360c965db44STomer Tayar 1361c965db44STomer Tayar /* Dump CRC section header */ 1362c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, dump, "last", 0); 1363c965db44STomer Tayar 13647b6859fbSMintz, Yuval /* Calculate CRC32 and add it to the dword after the "last" section */ 1365c965db44STomer Tayar if (dump) 13667b6859fbSMintz, Yuval *(dump_buf + offset) = ~crc32(0xffffffff, 13677b6859fbSMintz, Yuval (u8 *)dump_buf, 1368c965db44STomer Tayar DWORDS_TO_BYTES(offset)); 13697b6859fbSMintz, Yuval 1370c965db44STomer Tayar offset++; 13717b6859fbSMintz, Yuval 1372c965db44STomer Tayar return offset - start_offset; 1373c965db44STomer Tayar } 1374c965db44STomer Tayar 1375c965db44STomer Tayar /* Update blocks reset state */ 1376c965db44STomer Tayar static void qed_update_blocks_reset_state(struct qed_hwfn *p_hwfn, 1377c965db44STomer Tayar struct qed_ptt *p_ptt) 1378c965db44STomer Tayar { 1379c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 13802d22bc83SMichal Kalderon u32 reg_val[NUM_DBG_RESET_REGS] = { 0 }; 13812d22bc83SMichal Kalderon u8 rst_reg_id; 13822d22bc83SMichal Kalderon u32 blk_id; 1383c965db44STomer Tayar 1384c965db44STomer Tayar /* Read reset registers */ 13852d22bc83SMichal Kalderon for (rst_reg_id = 0; rst_reg_id < NUM_DBG_RESET_REGS; rst_reg_id++) { 13862d22bc83SMichal Kalderon const struct dbg_reset_reg *rst_reg; 13872d22bc83SMichal Kalderon bool rst_reg_removed; 13882d22bc83SMichal Kalderon u32 rst_reg_addr; 13892d22bc83SMichal Kalderon 13902d22bc83SMichal Kalderon rst_reg = qed_get_dbg_reset_reg(p_hwfn, rst_reg_id); 13912d22bc83SMichal Kalderon rst_reg_removed = GET_FIELD(rst_reg->data, 13922d22bc83SMichal Kalderon DBG_RESET_REG_IS_REMOVED); 13932d22bc83SMichal Kalderon rst_reg_addr = DWORDS_TO_BYTES(GET_FIELD(rst_reg->data, 13942d22bc83SMichal Kalderon DBG_RESET_REG_ADDR)); 13952d22bc83SMichal Kalderon 13962d22bc83SMichal Kalderon if (!rst_reg_removed) 13972d22bc83SMichal Kalderon reg_val[rst_reg_id] = qed_rd(p_hwfn, p_ptt, 13982d22bc83SMichal Kalderon rst_reg_addr); 13992d22bc83SMichal Kalderon } 1400c965db44STomer Tayar 1401c965db44STomer Tayar /* Check if blocks are in reset */ 14022d22bc83SMichal Kalderon for (blk_id = 0; blk_id < NUM_PHYS_BLOCKS; blk_id++) { 14032d22bc83SMichal Kalderon const struct dbg_block_chip *blk; 14042d22bc83SMichal Kalderon bool has_rst_reg; 14052d22bc83SMichal Kalderon bool is_removed; 14067b6859fbSMintz, Yuval 14072d22bc83SMichal Kalderon blk = qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)blk_id); 14082d22bc83SMichal Kalderon is_removed = GET_FIELD(blk->flags, DBG_BLOCK_CHIP_IS_REMOVED); 14092d22bc83SMichal Kalderon has_rst_reg = GET_FIELD(blk->flags, 14102d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_RESET_REG); 14112d22bc83SMichal Kalderon 14122d22bc83SMichal Kalderon if (!is_removed && has_rst_reg) 14132d22bc83SMichal Kalderon dev_data->block_in_reset[blk_id] = 14142d22bc83SMichal Kalderon !(reg_val[blk->reset_reg_id] & 14152d22bc83SMichal Kalderon BIT(blk->reset_reg_bit_offset)); 14167b6859fbSMintz, Yuval } 1417c965db44STomer Tayar } 1418c965db44STomer Tayar 14192d22bc83SMichal Kalderon /* is_mode_match recursive function */ 14202d22bc83SMichal Kalderon static bool qed_is_mode_match_rec(struct qed_hwfn *p_hwfn, 14212d22bc83SMichal Kalderon u16 *modes_buf_offset, u8 rec_depth) 14222d22bc83SMichal Kalderon { 14232d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 14242d22bc83SMichal Kalderon u8 *dbg_array; 14252d22bc83SMichal Kalderon bool arg1, arg2; 14262d22bc83SMichal Kalderon u8 tree_val; 14272d22bc83SMichal Kalderon 14282d22bc83SMichal Kalderon if (rec_depth > MAX_RECURSION_DEPTH) { 14292d22bc83SMichal Kalderon DP_NOTICE(p_hwfn, 14302d22bc83SMichal Kalderon "Unexpected error: is_mode_match_rec exceeded the max recursion depth. This is probably due to a corrupt init/debug buffer.\n"); 14312d22bc83SMichal Kalderon return false; 14322d22bc83SMichal Kalderon } 14332d22bc83SMichal Kalderon 14342d22bc83SMichal Kalderon /* Get next element from modes tree buffer */ 14352d22bc83SMichal Kalderon dbg_array = p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr; 14362d22bc83SMichal Kalderon tree_val = dbg_array[(*modes_buf_offset)++]; 14372d22bc83SMichal Kalderon 14382d22bc83SMichal Kalderon switch (tree_val) { 14392d22bc83SMichal Kalderon case INIT_MODE_OP_NOT: 14402d22bc83SMichal Kalderon return !qed_is_mode_match_rec(p_hwfn, 14412d22bc83SMichal Kalderon modes_buf_offset, rec_depth + 1); 14422d22bc83SMichal Kalderon case INIT_MODE_OP_OR: 14432d22bc83SMichal Kalderon case INIT_MODE_OP_AND: 14442d22bc83SMichal Kalderon arg1 = qed_is_mode_match_rec(p_hwfn, 14452d22bc83SMichal Kalderon modes_buf_offset, rec_depth + 1); 14462d22bc83SMichal Kalderon arg2 = qed_is_mode_match_rec(p_hwfn, 14472d22bc83SMichal Kalderon modes_buf_offset, rec_depth + 1); 14482d22bc83SMichal Kalderon return (tree_val == INIT_MODE_OP_OR) ? (arg1 || 14492d22bc83SMichal Kalderon arg2) : (arg1 && arg2); 14502d22bc83SMichal Kalderon default: 14512d22bc83SMichal Kalderon return dev_data->mode_enable[tree_val - MAX_INIT_MODE_OPS] > 0; 14522d22bc83SMichal Kalderon } 14532d22bc83SMichal Kalderon } 14542d22bc83SMichal Kalderon 14552d22bc83SMichal Kalderon /* Returns true if the mode (specified using modes_buf_offset) is enabled */ 14562d22bc83SMichal Kalderon static bool qed_is_mode_match(struct qed_hwfn *p_hwfn, u16 *modes_buf_offset) 14572d22bc83SMichal Kalderon { 14582d22bc83SMichal Kalderon return qed_is_mode_match_rec(p_hwfn, modes_buf_offset, 0); 14592d22bc83SMichal Kalderon } 14602d22bc83SMichal Kalderon 1461c965db44STomer Tayar /* Enable / disable the Debug block */ 1462c965db44STomer Tayar static void qed_bus_enable_dbg_block(struct qed_hwfn *p_hwfn, 1463c965db44STomer Tayar struct qed_ptt *p_ptt, bool enable) 1464c965db44STomer Tayar { 1465c965db44STomer Tayar qed_wr(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON, enable ? 1 : 0); 1466c965db44STomer Tayar } 1467c965db44STomer Tayar 1468c965db44STomer Tayar /* Resets the Debug block */ 1469c965db44STomer Tayar static void qed_bus_reset_dbg_block(struct qed_hwfn *p_hwfn, 1470c965db44STomer Tayar struct qed_ptt *p_ptt) 1471c965db44STomer Tayar { 14722d22bc83SMichal Kalderon u32 reset_reg_addr, old_reset_reg_val, new_reset_reg_val; 14732d22bc83SMichal Kalderon const struct dbg_reset_reg *reset_reg; 14742d22bc83SMichal Kalderon const struct dbg_block_chip *block; 1475c965db44STomer Tayar 14762d22bc83SMichal Kalderon block = qed_get_dbg_block_per_chip(p_hwfn, BLOCK_DBG); 14772d22bc83SMichal Kalderon reset_reg = qed_get_dbg_reset_reg(p_hwfn, block->reset_reg_id); 14782d22bc83SMichal Kalderon reset_reg_addr = 14792d22bc83SMichal Kalderon DWORDS_TO_BYTES(GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR)); 14802d22bc83SMichal Kalderon 14812d22bc83SMichal Kalderon old_reset_reg_val = qed_rd(p_hwfn, p_ptt, reset_reg_addr); 14827b6859fbSMintz, Yuval new_reset_reg_val = 14832d22bc83SMichal Kalderon old_reset_reg_val & ~BIT(block->reset_reg_bit_offset); 1484c965db44STomer Tayar 14852d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, reset_reg_addr, new_reset_reg_val); 14862d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, reset_reg_addr, old_reset_reg_val); 1487c965db44STomer Tayar } 1488c965db44STomer Tayar 14897b6859fbSMintz, Yuval /* Enable / disable Debug Bus clients according to the specified mask 14907b6859fbSMintz, Yuval * (1 = enable, 0 = disable). 1491c965db44STomer Tayar */ 1492c965db44STomer Tayar static void qed_bus_enable_clients(struct qed_hwfn *p_hwfn, 1493c965db44STomer Tayar struct qed_ptt *p_ptt, u32 client_mask) 1494c965db44STomer Tayar { 1495c965db44STomer Tayar qed_wr(p_hwfn, p_ptt, DBG_REG_CLIENT_ENABLE, client_mask); 1496c965db44STomer Tayar } 1497c965db44STomer Tayar 14982d22bc83SMichal Kalderon static void qed_bus_config_dbg_line(struct qed_hwfn *p_hwfn, 14992d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 15002d22bc83SMichal Kalderon enum block_id block_id, 15012d22bc83SMichal Kalderon u8 line_id, 15022d22bc83SMichal Kalderon u8 enable_mask, 15032d22bc83SMichal Kalderon u8 right_shift, 15042d22bc83SMichal Kalderon u8 force_valid_mask, u8 force_frame_mask) 15052d22bc83SMichal Kalderon { 15062d22bc83SMichal Kalderon const struct dbg_block_chip *block = 15072d22bc83SMichal Kalderon qed_get_dbg_block_per_chip(p_hwfn, block_id); 15082d22bc83SMichal Kalderon 15092d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_select_reg_addr), 15102d22bc83SMichal Kalderon line_id); 15112d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_dword_enable_reg_addr), 15122d22bc83SMichal Kalderon enable_mask); 15132d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_shift_reg_addr), 15142d22bc83SMichal Kalderon right_shift); 15152d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_valid_reg_addr), 15162d22bc83SMichal Kalderon force_valid_mask); 15172d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_frame_reg_addr), 15182d22bc83SMichal Kalderon force_frame_mask); 15192d22bc83SMichal Kalderon } 15202d22bc83SMichal Kalderon 15212d22bc83SMichal Kalderon /* Disable debug bus in all blocks */ 15222d22bc83SMichal Kalderon static void qed_bus_disable_blocks(struct qed_hwfn *p_hwfn, 15232d22bc83SMichal Kalderon struct qed_ptt *p_ptt) 1524c965db44STomer Tayar { 1525c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 15262d22bc83SMichal Kalderon u32 block_id; 15277b6859fbSMintz, Yuval 15282d22bc83SMichal Kalderon /* Disable all blocks */ 15292d22bc83SMichal Kalderon for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) { 15302d22bc83SMichal Kalderon const struct dbg_block_chip *block_per_chip = 15312d22bc83SMichal Kalderon qed_get_dbg_block_per_chip(p_hwfn, 15322d22bc83SMichal Kalderon (enum block_id)block_id); 1533c965db44STomer Tayar 15342d22bc83SMichal Kalderon if (GET_FIELD(block_per_chip->flags, 15352d22bc83SMichal Kalderon DBG_BLOCK_CHIP_IS_REMOVED) || 15362d22bc83SMichal Kalderon dev_data->block_in_reset[block_id]) 15372d22bc83SMichal Kalderon continue; 15382d22bc83SMichal Kalderon 15392d22bc83SMichal Kalderon /* Disable debug bus */ 15402d22bc83SMichal Kalderon if (GET_FIELD(block_per_chip->flags, 15412d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_DBG_BUS)) { 15422d22bc83SMichal Kalderon u32 dbg_en_addr = 15432d22bc83SMichal Kalderon block_per_chip->dbg_dword_enable_reg_addr; 15442d22bc83SMichal Kalderon u16 modes_buf_offset = 15452d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 15462d22bc83SMichal Kalderon DBG_MODE_HDR_MODES_BUF_OFFSET); 15472d22bc83SMichal Kalderon bool eval_mode = 15482d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 15492d22bc83SMichal Kalderon DBG_MODE_HDR_EVAL_MODE) > 0; 15502d22bc83SMichal Kalderon 15512d22bc83SMichal Kalderon if (!eval_mode || 15522d22bc83SMichal Kalderon qed_is_mode_match(p_hwfn, &modes_buf_offset)) 15532d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, 15542d22bc83SMichal Kalderon DWORDS_TO_BYTES(dbg_en_addr), 15552d22bc83SMichal Kalderon 0); 15562d22bc83SMichal Kalderon } 1557c965db44STomer Tayar } 1558c965db44STomer Tayar } 1559c965db44STomer Tayar 1560c965db44STomer Tayar /* Returns true if the specified entity (indicated by GRC param) should be 1561c965db44STomer Tayar * included in the dump, false otherwise. 1562c965db44STomer Tayar */ 1563c965db44STomer Tayar static bool qed_grc_is_included(struct qed_hwfn *p_hwfn, 1564c965db44STomer Tayar enum dbg_grc_params grc_param) 1565c965db44STomer Tayar { 1566c965db44STomer Tayar return qed_grc_get_param(p_hwfn, grc_param) > 0; 1567c965db44STomer Tayar } 1568c965db44STomer Tayar 15692d22bc83SMichal Kalderon /* Returns the storm_id that matches the specified Storm letter, 15702d22bc83SMichal Kalderon * or MAX_DBG_STORMS if invalid storm letter. 15712d22bc83SMichal Kalderon */ 15722d22bc83SMichal Kalderon static enum dbg_storms qed_get_id_from_letter(char storm_letter) 15732d22bc83SMichal Kalderon { 15742d22bc83SMichal Kalderon u8 storm_id; 15752d22bc83SMichal Kalderon 15762d22bc83SMichal Kalderon for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) 15772d22bc83SMichal Kalderon if (s_storm_defs[storm_id].letter == storm_letter) 15782d22bc83SMichal Kalderon return (enum dbg_storms)storm_id; 15792d22bc83SMichal Kalderon 15802d22bc83SMichal Kalderon return MAX_DBG_STORMS; 15812d22bc83SMichal Kalderon } 15822d22bc83SMichal Kalderon 1583c965db44STomer Tayar /* Returns true of the specified Storm should be included in the dump, false 1584c965db44STomer Tayar * otherwise. 1585c965db44STomer Tayar */ 1586c965db44STomer Tayar static bool qed_grc_is_storm_included(struct qed_hwfn *p_hwfn, 1587c965db44STomer Tayar enum dbg_storms storm) 1588c965db44STomer Tayar { 1589c965db44STomer Tayar return qed_grc_get_param(p_hwfn, (enum dbg_grc_params)storm) > 0; 1590c965db44STomer Tayar } 1591c965db44STomer Tayar 1592c965db44STomer Tayar /* Returns true if the specified memory should be included in the dump, false 1593c965db44STomer Tayar * otherwise. 1594c965db44STomer Tayar */ 1595c965db44STomer Tayar static bool qed_grc_is_mem_included(struct qed_hwfn *p_hwfn, 1596c965db44STomer Tayar enum block_id block_id, u8 mem_group_id) 1597c965db44STomer Tayar { 15982d22bc83SMichal Kalderon const struct dbg_block *block; 1599c965db44STomer Tayar u8 i; 1600c965db44STomer Tayar 16012d22bc83SMichal Kalderon block = get_dbg_block(p_hwfn, block_id); 16022d22bc83SMichal Kalderon 16032d22bc83SMichal Kalderon /* If the block is associated with a Storm, check Storm match */ 16042d22bc83SMichal Kalderon if (block->associated_storm_letter) { 16052d22bc83SMichal Kalderon enum dbg_storms associated_storm_id = 16062d22bc83SMichal Kalderon qed_get_id_from_letter(block->associated_storm_letter); 16072d22bc83SMichal Kalderon 16082d22bc83SMichal Kalderon if (associated_storm_id == MAX_DBG_STORMS || 16092d22bc83SMichal Kalderon !qed_grc_is_storm_included(p_hwfn, associated_storm_id)) 1610c965db44STomer Tayar return false; 16112d22bc83SMichal Kalderon } 1612c965db44STomer Tayar 16137b6859fbSMintz, Yuval for (i = 0; i < NUM_BIG_RAM_TYPES; i++) { 16147b6859fbSMintz, Yuval struct big_ram_defs *big_ram = &s_big_ram_defs[i]; 1615c965db44STomer Tayar 16167b6859fbSMintz, Yuval if (mem_group_id == big_ram->mem_group_id || 16177b6859fbSMintz, Yuval mem_group_id == big_ram->ram_mem_group_id) 16187b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, big_ram->grc_param); 16197b6859fbSMintz, Yuval } 16207b6859fbSMintz, Yuval 16217b6859fbSMintz, Yuval switch (mem_group_id) { 16227b6859fbSMintz, Yuval case MEM_GROUP_PXP_ILT: 16237b6859fbSMintz, Yuval case MEM_GROUP_PXP_MEM: 16247b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PXP); 16257b6859fbSMintz, Yuval case MEM_GROUP_RAM: 16267b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RAM); 16277b6859fbSMintz, Yuval case MEM_GROUP_PBUF: 16287b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PBUF); 16297b6859fbSMintz, Yuval case MEM_GROUP_CAU_MEM: 16307b6859fbSMintz, Yuval case MEM_GROUP_CAU_SB: 16317b6859fbSMintz, Yuval case MEM_GROUP_CAU_PI: 16327b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU); 16332d22bc83SMichal Kalderon case MEM_GROUP_CAU_MEM_EXT: 16342d22bc83SMichal Kalderon return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU_EXT); 16357b6859fbSMintz, Yuval case MEM_GROUP_QM_MEM: 16367b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_QM); 16377b6859fbSMintz, Yuval case MEM_GROUP_CFC_MEM: 16387b6859fbSMintz, Yuval case MEM_GROUP_CONN_CFC_MEM: 16397b6859fbSMintz, Yuval case MEM_GROUP_TASK_CFC_MEM: 1640da090917STomer Tayar return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CFC) || 1641da090917STomer Tayar qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX); 16422d22bc83SMichal Kalderon case MEM_GROUP_DORQ_MEM: 16432d22bc83SMichal Kalderon return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DORQ); 16447b6859fbSMintz, Yuval case MEM_GROUP_IGU_MEM: 16457b6859fbSMintz, Yuval case MEM_GROUP_IGU_MSIX: 16467b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IGU); 16477b6859fbSMintz, Yuval case MEM_GROUP_MULD_MEM: 16487b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MULD); 16497b6859fbSMintz, Yuval case MEM_GROUP_PRS_MEM: 16507b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PRS); 16517b6859fbSMintz, Yuval case MEM_GROUP_DMAE_MEM: 16527b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DMAE); 16537b6859fbSMintz, Yuval case MEM_GROUP_TM_MEM: 16547b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_TM); 16557b6859fbSMintz, Yuval case MEM_GROUP_SDM_MEM: 16567b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_SDM); 16577b6859fbSMintz, Yuval case MEM_GROUP_TDIF_CTX: 16587b6859fbSMintz, Yuval case MEM_GROUP_RDIF_CTX: 16597b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DIF); 16607b6859fbSMintz, Yuval case MEM_GROUP_CM_MEM: 16617b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM); 16627b6859fbSMintz, Yuval case MEM_GROUP_IOR: 16637b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR); 16647b6859fbSMintz, Yuval default: 1665c965db44STomer Tayar return true; 1666c965db44STomer Tayar } 16677b6859fbSMintz, Yuval } 1668c965db44STomer Tayar 1669c965db44STomer Tayar /* Stalls all Storms */ 1670c965db44STomer Tayar static void qed_grc_stall_storms(struct qed_hwfn *p_hwfn, 1671c965db44STomer Tayar struct qed_ptt *p_ptt, bool stall) 1672c965db44STomer Tayar { 16737b6859fbSMintz, Yuval u32 reg_addr; 1674c965db44STomer Tayar u8 storm_id; 1675c965db44STomer Tayar 1676c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 16777b6859fbSMintz, Yuval if (!qed_grc_is_storm_included(p_hwfn, 16787b6859fbSMintz, Yuval (enum dbg_storms)storm_id)) 16797b6859fbSMintz, Yuval continue; 1680c965db44STomer Tayar 16817b6859fbSMintz, Yuval reg_addr = s_storm_defs[storm_id].sem_fast_mem_addr + 16826c95dd8fSPrabhakar Kushwaha SEM_FAST_REG_STALL_0; 16837b6859fbSMintz, Yuval qed_wr(p_hwfn, p_ptt, reg_addr, stall ? 1 : 0); 1684c965db44STomer Tayar } 1685c965db44STomer Tayar 1686c965db44STomer Tayar msleep(STALL_DELAY_MS); 1687c965db44STomer Tayar } 1688c965db44STomer Tayar 16892d22bc83SMichal Kalderon /* Takes all blocks out of reset. If rbc_only is true, only RBC clients are 16902d22bc83SMichal Kalderon * taken out of reset. 16912d22bc83SMichal Kalderon */ 1692c965db44STomer Tayar static void qed_grc_unreset_blocks(struct qed_hwfn *p_hwfn, 16932d22bc83SMichal Kalderon struct qed_ptt *p_ptt, bool rbc_only) 1694c965db44STomer Tayar { 1695c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 16962d22bc83SMichal Kalderon u8 chip_id = dev_data->chip_id; 16972d22bc83SMichal Kalderon u32 i; 16982d22bc83SMichal Kalderon 16992d22bc83SMichal Kalderon /* Take RBCs out of reset */ 17002d22bc83SMichal Kalderon for (i = 0; i < ARRAY_SIZE(s_rbc_reset_defs); i++) 17012d22bc83SMichal Kalderon if (s_rbc_reset_defs[i].reset_val[dev_data->chip_id]) 17022d22bc83SMichal Kalderon qed_wr(p_hwfn, 17032d22bc83SMichal Kalderon p_ptt, 17042d22bc83SMichal Kalderon s_rbc_reset_defs[i].reset_reg_addr + 17052d22bc83SMichal Kalderon RESET_REG_UNRESET_OFFSET, 17062d22bc83SMichal Kalderon s_rbc_reset_defs[i].reset_val[chip_id]); 17072d22bc83SMichal Kalderon 17082d22bc83SMichal Kalderon if (!rbc_only) { 17092d22bc83SMichal Kalderon u32 reg_val[NUM_DBG_RESET_REGS] = { 0 }; 17102d22bc83SMichal Kalderon u8 reset_reg_id; 17112d22bc83SMichal Kalderon u32 block_id; 1712c965db44STomer Tayar 1713c965db44STomer Tayar /* Fill reset regs values */ 17142d22bc83SMichal Kalderon for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) { 17152d22bc83SMichal Kalderon bool is_removed, has_reset_reg, unreset_before_dump; 17162d22bc83SMichal Kalderon const struct dbg_block_chip *block; 17177b6859fbSMintz, Yuval 17182d22bc83SMichal Kalderon block = qed_get_dbg_block_per_chip(p_hwfn, 17192d22bc83SMichal Kalderon (enum block_id) 17202d22bc83SMichal Kalderon block_id); 17212d22bc83SMichal Kalderon is_removed = 17222d22bc83SMichal Kalderon GET_FIELD(block->flags, DBG_BLOCK_CHIP_IS_REMOVED); 17232d22bc83SMichal Kalderon has_reset_reg = 17242d22bc83SMichal Kalderon GET_FIELD(block->flags, 17252d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_RESET_REG); 17262d22bc83SMichal Kalderon unreset_before_dump = 17272d22bc83SMichal Kalderon GET_FIELD(block->flags, 17282d22bc83SMichal Kalderon DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP); 17292d22bc83SMichal Kalderon 17302d22bc83SMichal Kalderon if (!is_removed && has_reset_reg && unreset_before_dump) 17312d22bc83SMichal Kalderon reg_val[block->reset_reg_id] |= 17322d22bc83SMichal Kalderon BIT(block->reset_reg_bit_offset); 17337b6859fbSMintz, Yuval } 1734c965db44STomer Tayar 1735c965db44STomer Tayar /* Write reset registers */ 17362d22bc83SMichal Kalderon for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS; 17372d22bc83SMichal Kalderon reset_reg_id++) { 17382d22bc83SMichal Kalderon const struct dbg_reset_reg *reset_reg; 17392d22bc83SMichal Kalderon u32 reset_reg_addr; 17402d22bc83SMichal Kalderon 17412d22bc83SMichal Kalderon reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id); 17422d22bc83SMichal Kalderon 17432d22bc83SMichal Kalderon if (GET_FIELD 17442d22bc83SMichal Kalderon (reset_reg->data, DBG_RESET_REG_IS_REMOVED)) 17457b6859fbSMintz, Yuval continue; 17467b6859fbSMintz, Yuval 17472d22bc83SMichal Kalderon if (reg_val[reset_reg_id]) { 17482d22bc83SMichal Kalderon reset_reg_addr = 17492d22bc83SMichal Kalderon GET_FIELD(reset_reg->data, 17502d22bc83SMichal Kalderon DBG_RESET_REG_ADDR); 1751c965db44STomer Tayar qed_wr(p_hwfn, 1752c965db44STomer Tayar p_ptt, 17532d22bc83SMichal Kalderon DWORDS_TO_BYTES(reset_reg_addr) + 17542d22bc83SMichal Kalderon RESET_REG_UNRESET_OFFSET, 17552d22bc83SMichal Kalderon reg_val[reset_reg_id]); 17562d22bc83SMichal Kalderon } 17572d22bc83SMichal Kalderon } 1758c965db44STomer Tayar } 1759c965db44STomer Tayar } 1760c965db44STomer Tayar 1761be086e7cSMintz, Yuval /* Returns the attention block data of the specified block */ 1762c965db44STomer Tayar static const struct dbg_attn_block_type_data * 17632d22bc83SMichal Kalderon qed_get_block_attn_data(struct qed_hwfn *p_hwfn, 17642d22bc83SMichal Kalderon enum block_id block_id, enum dbg_attn_type attn_type) 1765c965db44STomer Tayar { 1766c965db44STomer Tayar const struct dbg_attn_block *base_attn_block_arr = 1767c965db44STomer Tayar (const struct dbg_attn_block *) 17682d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr; 1769c965db44STomer Tayar 1770c965db44STomer Tayar return &base_attn_block_arr[block_id].per_type_data[attn_type]; 1771c965db44STomer Tayar } 1772c965db44STomer Tayar 1773c965db44STomer Tayar /* Returns the attention registers of the specified block */ 1774c965db44STomer Tayar static const struct dbg_attn_reg * 17752d22bc83SMichal Kalderon qed_get_block_attn_regs(struct qed_hwfn *p_hwfn, 17762d22bc83SMichal Kalderon enum block_id block_id, enum dbg_attn_type attn_type, 1777c965db44STomer Tayar u8 *num_attn_regs) 1778c965db44STomer Tayar { 1779c965db44STomer Tayar const struct dbg_attn_block_type_data *block_type_data = 17802d22bc83SMichal Kalderon qed_get_block_attn_data(p_hwfn, block_id, attn_type); 1781c965db44STomer Tayar 1782c965db44STomer Tayar *num_attn_regs = block_type_data->num_regs; 17837b6859fbSMintz, Yuval 17842d22bc83SMichal Kalderon return (const struct dbg_attn_reg *) 17852d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr + 17862d22bc83SMichal Kalderon block_type_data->regs_offset; 1787c965db44STomer Tayar } 1788c965db44STomer Tayar 1789c965db44STomer Tayar /* For each block, clear the status of all parities */ 1790c965db44STomer Tayar static void qed_grc_clear_all_prty(struct qed_hwfn *p_hwfn, 1791c965db44STomer Tayar struct qed_ptt *p_ptt) 1792c965db44STomer Tayar { 1793c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 17947b6859fbSMintz, Yuval const struct dbg_attn_reg *attn_reg_arr; 17956c95dd8fSPrabhakar Kushwaha u32 block_id, sts_clr_address; 1796c965db44STomer Tayar u8 reg_idx, num_attn_regs; 1797c965db44STomer Tayar 17982d22bc83SMichal Kalderon for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) { 1799c965db44STomer Tayar if (dev_data->block_in_reset[block_id]) 1800c965db44STomer Tayar continue; 1801c965db44STomer Tayar 18022d22bc83SMichal Kalderon attn_reg_arr = qed_get_block_attn_regs(p_hwfn, 18032d22bc83SMichal Kalderon (enum block_id)block_id, 1804c965db44STomer Tayar ATTN_TYPE_PARITY, 1805c965db44STomer Tayar &num_attn_regs); 18067b6859fbSMintz, Yuval 1807c965db44STomer Tayar for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) { 1808c965db44STomer Tayar const struct dbg_attn_reg *reg_data = 1809c965db44STomer Tayar &attn_reg_arr[reg_idx]; 18107b6859fbSMintz, Yuval u16 modes_buf_offset; 18117b6859fbSMintz, Yuval bool eval_mode; 1812c965db44STomer Tayar 1813c965db44STomer Tayar /* Check mode */ 18147b6859fbSMintz, Yuval eval_mode = GET_FIELD(reg_data->mode.data, 1815c965db44STomer Tayar DBG_MODE_HDR_EVAL_MODE) > 0; 18167b6859fbSMintz, Yuval modes_buf_offset = 1817c965db44STomer Tayar GET_FIELD(reg_data->mode.data, 1818c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 1819c965db44STomer Tayar 18206c95dd8fSPrabhakar Kushwaha sts_clr_address = reg_data->sts_clr_address; 18217b6859fbSMintz, Yuval /* If Mode match: clear parity status */ 1822c965db44STomer Tayar if (!eval_mode || 1823c965db44STomer Tayar qed_is_mode_match(p_hwfn, &modes_buf_offset)) 1824c965db44STomer Tayar qed_rd(p_hwfn, p_ptt, 18256c95dd8fSPrabhakar Kushwaha DWORDS_TO_BYTES(sts_clr_address)); 1826c965db44STomer Tayar } 1827c965db44STomer Tayar } 1828c965db44STomer Tayar } 1829c965db44STomer Tayar 18306c95dd8fSPrabhakar Kushwaha /* Finds the meta data image in NVRAM */ 18316c95dd8fSPrabhakar Kushwaha static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn, 18326c95dd8fSPrabhakar Kushwaha struct qed_ptt *p_ptt, 18336c95dd8fSPrabhakar Kushwaha u32 image_type, 18346c95dd8fSPrabhakar Kushwaha u32 *nvram_offset_bytes, 18356c95dd8fSPrabhakar Kushwaha u32 *nvram_size_bytes) 18366c95dd8fSPrabhakar Kushwaha { 18376c95dd8fSPrabhakar Kushwaha u32 ret_mcp_resp, ret_mcp_param, ret_txn_size; 18386c95dd8fSPrabhakar Kushwaha struct mcp_file_att file_att; 18396c95dd8fSPrabhakar Kushwaha int nvm_result; 18406c95dd8fSPrabhakar Kushwaha 18416c95dd8fSPrabhakar Kushwaha /* Call NVRAM get file command */ 18426c95dd8fSPrabhakar Kushwaha nvm_result = qed_mcp_nvm_rd_cmd(p_hwfn, 18436c95dd8fSPrabhakar Kushwaha p_ptt, 18446c95dd8fSPrabhakar Kushwaha DRV_MSG_CODE_NVM_GET_FILE_ATT, 18456c95dd8fSPrabhakar Kushwaha image_type, 18466c95dd8fSPrabhakar Kushwaha &ret_mcp_resp, 18476c95dd8fSPrabhakar Kushwaha &ret_mcp_param, 18486c95dd8fSPrabhakar Kushwaha &ret_txn_size, 18496c95dd8fSPrabhakar Kushwaha (u32 *)&file_att, false); 18506c95dd8fSPrabhakar Kushwaha 18516c95dd8fSPrabhakar Kushwaha /* Check response */ 18526c95dd8fSPrabhakar Kushwaha if (nvm_result || (ret_mcp_resp & FW_MSG_CODE_MASK) != 18536c95dd8fSPrabhakar Kushwaha FW_MSG_CODE_NVM_OK) 18546c95dd8fSPrabhakar Kushwaha return DBG_STATUS_NVRAM_GET_IMAGE_FAILED; 18556c95dd8fSPrabhakar Kushwaha 18566c95dd8fSPrabhakar Kushwaha /* Update return values */ 18576c95dd8fSPrabhakar Kushwaha *nvram_offset_bytes = file_att.nvm_start_addr; 18586c95dd8fSPrabhakar Kushwaha *nvram_size_bytes = file_att.len; 18596c95dd8fSPrabhakar Kushwaha 18606c95dd8fSPrabhakar Kushwaha DP_VERBOSE(p_hwfn, 18616c95dd8fSPrabhakar Kushwaha QED_MSG_DEBUG, 18626c95dd8fSPrabhakar Kushwaha "find_nvram_image: found NVRAM image of type %d in NVRAM offset %d bytes with size %d bytes\n", 18636c95dd8fSPrabhakar Kushwaha image_type, *nvram_offset_bytes, *nvram_size_bytes); 18646c95dd8fSPrabhakar Kushwaha 18656c95dd8fSPrabhakar Kushwaha /* Check alignment */ 18666c95dd8fSPrabhakar Kushwaha if (*nvram_size_bytes & 0x3) 18676c95dd8fSPrabhakar Kushwaha return DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE; 18686c95dd8fSPrabhakar Kushwaha 18696c95dd8fSPrabhakar Kushwaha return DBG_STATUS_OK; 18706c95dd8fSPrabhakar Kushwaha } 18716c95dd8fSPrabhakar Kushwaha 18726c95dd8fSPrabhakar Kushwaha /* Reads data from NVRAM */ 18736c95dd8fSPrabhakar Kushwaha static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn, 18746c95dd8fSPrabhakar Kushwaha struct qed_ptt *p_ptt, 18756c95dd8fSPrabhakar Kushwaha u32 nvram_offset_bytes, 18766c95dd8fSPrabhakar Kushwaha u32 nvram_size_bytes, u32 *ret_buf) 18776c95dd8fSPrabhakar Kushwaha { 18786c95dd8fSPrabhakar Kushwaha u32 ret_mcp_resp, ret_mcp_param, ret_read_size, bytes_to_copy; 18796c95dd8fSPrabhakar Kushwaha s32 bytes_left = nvram_size_bytes; 18806c95dd8fSPrabhakar Kushwaha u32 read_offset = 0, param = 0; 18816c95dd8fSPrabhakar Kushwaha 18826c95dd8fSPrabhakar Kushwaha DP_VERBOSE(p_hwfn, 18836c95dd8fSPrabhakar Kushwaha QED_MSG_DEBUG, 18846c95dd8fSPrabhakar Kushwaha "nvram_read: reading image of size %d bytes from NVRAM\n", 18856c95dd8fSPrabhakar Kushwaha nvram_size_bytes); 18866c95dd8fSPrabhakar Kushwaha 18876c95dd8fSPrabhakar Kushwaha do { 18886c95dd8fSPrabhakar Kushwaha bytes_to_copy = 18896c95dd8fSPrabhakar Kushwaha (bytes_left > 18906c95dd8fSPrabhakar Kushwaha MCP_DRV_NVM_BUF_LEN) ? MCP_DRV_NVM_BUF_LEN : bytes_left; 18916c95dd8fSPrabhakar Kushwaha 18926c95dd8fSPrabhakar Kushwaha /* Call NVRAM read command */ 18936c95dd8fSPrabhakar Kushwaha SET_MFW_FIELD(param, 18946c95dd8fSPrabhakar Kushwaha DRV_MB_PARAM_NVM_OFFSET, 18956c95dd8fSPrabhakar Kushwaha nvram_offset_bytes + read_offset); 18966c95dd8fSPrabhakar Kushwaha SET_MFW_FIELD(param, DRV_MB_PARAM_NVM_LEN, bytes_to_copy); 18976c95dd8fSPrabhakar Kushwaha if (qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt, 18986c95dd8fSPrabhakar Kushwaha DRV_MSG_CODE_NVM_READ_NVRAM, param, 18996c95dd8fSPrabhakar Kushwaha &ret_mcp_resp, 19006c95dd8fSPrabhakar Kushwaha &ret_mcp_param, &ret_read_size, 19016c95dd8fSPrabhakar Kushwaha (u32 *)((u8 *)ret_buf + read_offset), 19026c95dd8fSPrabhakar Kushwaha false)) 19036c95dd8fSPrabhakar Kushwaha return DBG_STATUS_NVRAM_READ_FAILED; 19046c95dd8fSPrabhakar Kushwaha 19056c95dd8fSPrabhakar Kushwaha /* Check response */ 19066c95dd8fSPrabhakar Kushwaha if ((ret_mcp_resp & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK) 19076c95dd8fSPrabhakar Kushwaha return DBG_STATUS_NVRAM_READ_FAILED; 19086c95dd8fSPrabhakar Kushwaha 19096c95dd8fSPrabhakar Kushwaha /* Update read offset */ 19106c95dd8fSPrabhakar Kushwaha read_offset += ret_read_size; 19116c95dd8fSPrabhakar Kushwaha bytes_left -= ret_read_size; 19126c95dd8fSPrabhakar Kushwaha } while (bytes_left > 0); 19136c95dd8fSPrabhakar Kushwaha 19146c95dd8fSPrabhakar Kushwaha return DBG_STATUS_OK; 19156c95dd8fSPrabhakar Kushwaha } 19166c95dd8fSPrabhakar Kushwaha 1917c965db44STomer Tayar /* Dumps GRC registers section header. Returns the dumped size in dwords. 19182d22bc83SMichal Kalderon * the following parameters are dumped: 19197b6859fbSMintz, Yuval * - count: no. of dumped entries 1920d52c89f1SMichal Kalderon * - split_type: split type 1921d52c89f1SMichal Kalderon * - split_id: split ID (dumped only if split_id != SPLIT_TYPE_NONE) 19222d22bc83SMichal Kalderon * - reg_type_name: register type name (dumped only if reg_type_name != NULL) 1923c965db44STomer Tayar */ 1924c965db44STomer Tayar static u32 qed_grc_dump_regs_hdr(u32 *dump_buf, 1925c965db44STomer Tayar bool dump, 1926c965db44STomer Tayar u32 num_reg_entries, 1927d52c89f1SMichal Kalderon enum init_split_types split_type, 19282d22bc83SMichal Kalderon u8 split_id, const char *reg_type_name) 1929c965db44STomer Tayar { 1930d52c89f1SMichal Kalderon u8 num_params = 2 + 19312d22bc83SMichal Kalderon (split_type != SPLIT_TYPE_NONE ? 1 : 0) + (reg_type_name ? 1 : 0); 1932c965db44STomer Tayar u32 offset = 0; 1933c965db44STomer Tayar 1934c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 1935c965db44STomer Tayar dump, "grc_regs", num_params); 1936c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 1937c965db44STomer Tayar dump, "count", num_reg_entries); 1938c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1939d52c89f1SMichal Kalderon dump, "split", 1940d52c89f1SMichal Kalderon s_split_type_defs[split_type].name); 1941d52c89f1SMichal Kalderon if (split_type != SPLIT_TYPE_NONE) 1942c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 1943c965db44STomer Tayar dump, "id", split_id); 19442d22bc83SMichal Kalderon if (reg_type_name) 1945c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 19462d22bc83SMichal Kalderon dump, "type", reg_type_name); 19477b6859fbSMintz, Yuval 1948c965db44STomer Tayar return offset; 1949c965db44STomer Tayar } 1950c965db44STomer Tayar 1951da090917STomer Tayar /* Reads the specified registers into the specified buffer. 1952da090917STomer Tayar * The addr and len arguments are specified in dwords. 1953da090917STomer Tayar */ 1954da090917STomer Tayar void qed_read_regs(struct qed_hwfn *p_hwfn, 1955da090917STomer Tayar struct qed_ptt *p_ptt, u32 *buf, u32 addr, u32 len) 1956da090917STomer Tayar { 1957da090917STomer Tayar u32 i; 1958da090917STomer Tayar 1959da090917STomer Tayar for (i = 0; i < len; i++) 1960da090917STomer Tayar buf[i] = qed_rd(p_hwfn, p_ptt, DWORDS_TO_BYTES(addr + i)); 1961da090917STomer Tayar } 1962da090917STomer Tayar 1963be086e7cSMintz, Yuval /* Dumps the GRC registers in the specified address range. 1964be086e7cSMintz, Yuval * Returns the dumped size in dwords. 19657b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 1966be086e7cSMintz, Yuval */ 1967be086e7cSMintz, Yuval static u32 qed_grc_dump_addr_range(struct qed_hwfn *p_hwfn, 19687b6859fbSMintz, Yuval struct qed_ptt *p_ptt, 19697b6859fbSMintz, Yuval u32 *dump_buf, 1970d52c89f1SMichal Kalderon bool dump, u32 addr, u32 len, bool wide_bus, 1971d52c89f1SMichal Kalderon enum init_split_types split_type, 1972d52c89f1SMichal Kalderon u8 split_id) 1973be086e7cSMintz, Yuval { 1974da090917STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 1975*7d841182SJiri Slaby (SUSE) u8 port_id = 0, pf_id = 0, vf_id = 0; 19762d22bc83SMichal Kalderon bool read_using_dmae = false; 19772d22bc83SMichal Kalderon u32 thresh; 1978*7d841182SJiri Slaby (SUSE) u16 fid; 1979be086e7cSMintz, Yuval 19807b6859fbSMintz, Yuval if (!dump) 19817b6859fbSMintz, Yuval return len; 19827b6859fbSMintz, Yuval 1983d52c89f1SMichal Kalderon switch (split_type) { 1984d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT: 1985d52c89f1SMichal Kalderon port_id = split_id; 1986d52c89f1SMichal Kalderon break; 1987d52c89f1SMichal Kalderon case SPLIT_TYPE_PF: 1988d52c89f1SMichal Kalderon pf_id = split_id; 1989d52c89f1SMichal Kalderon break; 1990d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT_PF: 1991d52c89f1SMichal Kalderon port_id = split_id / dev_data->num_pfs_per_port; 1992d52c89f1SMichal Kalderon pf_id = port_id + dev_data->num_ports * 1993d52c89f1SMichal Kalderon (split_id % dev_data->num_pfs_per_port); 1994d52c89f1SMichal Kalderon break; 1995d52c89f1SMichal Kalderon case SPLIT_TYPE_VF: 1996d52c89f1SMichal Kalderon vf_id = split_id; 1997d52c89f1SMichal Kalderon break; 1998d52c89f1SMichal Kalderon default: 1999d52c89f1SMichal Kalderon break; 2000d52c89f1SMichal Kalderon } 2001d52c89f1SMichal Kalderon 2002da090917STomer Tayar /* Try reading using DMAE */ 20032d22bc83SMichal Kalderon if (dev_data->use_dmae && split_type != SPLIT_TYPE_VF && 20042d22bc83SMichal Kalderon (len >= s_hw_type_defs[dev_data->hw_type].dmae_thresh || 20052d22bc83SMichal Kalderon (PROTECT_WIDE_BUS && wide_bus))) { 20062d22bc83SMichal Kalderon struct qed_dmae_params dmae_params; 20072d22bc83SMichal Kalderon 20082d22bc83SMichal Kalderon /* Set DMAE params */ 20092d22bc83SMichal Kalderon memset(&dmae_params, 0, sizeof(dmae_params)); 20102d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_COMPLETION_DST, 1); 20112d22bc83SMichal Kalderon switch (split_type) { 20122d22bc83SMichal Kalderon case SPLIT_TYPE_PORT: 20132d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID, 20142d22bc83SMichal Kalderon 1); 20152d22bc83SMichal Kalderon dmae_params.port_id = port_id; 20162d22bc83SMichal Kalderon break; 20172d22bc83SMichal Kalderon case SPLIT_TYPE_PF: 20182d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, 20192d22bc83SMichal Kalderon QED_DMAE_PARAMS_SRC_PF_VALID, 1); 20202d22bc83SMichal Kalderon dmae_params.src_pfid = pf_id; 20212d22bc83SMichal Kalderon break; 20222d22bc83SMichal Kalderon case SPLIT_TYPE_PORT_PF: 20232d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID, 20242d22bc83SMichal Kalderon 1); 20252d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, 20262d22bc83SMichal Kalderon QED_DMAE_PARAMS_SRC_PF_VALID, 1); 20272d22bc83SMichal Kalderon dmae_params.port_id = port_id; 20282d22bc83SMichal Kalderon dmae_params.src_pfid = pf_id; 20292d22bc83SMichal Kalderon break; 20302d22bc83SMichal Kalderon default: 20312d22bc83SMichal Kalderon break; 20322d22bc83SMichal Kalderon } 20332d22bc83SMichal Kalderon 20342d22bc83SMichal Kalderon /* Execute DMAE command */ 20352d22bc83SMichal Kalderon read_using_dmae = !qed_dmae_grc2host(p_hwfn, 20362d22bc83SMichal Kalderon p_ptt, 20372d22bc83SMichal Kalderon DWORDS_TO_BYTES(addr), 20382d22bc83SMichal Kalderon (u64)(uintptr_t)(dump_buf), 20392d22bc83SMichal Kalderon len, &dmae_params); 20402d22bc83SMichal Kalderon if (!read_using_dmae) { 2041da090917STomer Tayar dev_data->use_dmae = 0; 2042da090917STomer Tayar DP_VERBOSE(p_hwfn, 2043da090917STomer Tayar QED_MSG_DEBUG, 2044da090917STomer Tayar "Failed reading from chip using DMAE, using GRC instead\n"); 2045da090917STomer Tayar } 20462d22bc83SMichal Kalderon } 20472d22bc83SMichal Kalderon 20482d22bc83SMichal Kalderon if (read_using_dmae) 20492d22bc83SMichal Kalderon goto print_log; 2050da090917STomer Tayar 2051d52c89f1SMichal Kalderon /* If not read using DMAE, read using GRC */ 2052d52c89f1SMichal Kalderon 2053d52c89f1SMichal Kalderon /* Set pretend */ 20542d22bc83SMichal Kalderon if (split_type != dev_data->pretend.split_type || 20552d22bc83SMichal Kalderon split_id != dev_data->pretend.split_id) { 2056d52c89f1SMichal Kalderon switch (split_type) { 2057d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT: 2058d52c89f1SMichal Kalderon qed_port_pretend(p_hwfn, p_ptt, port_id); 2059d52c89f1SMichal Kalderon break; 2060d52c89f1SMichal Kalderon case SPLIT_TYPE_PF: 20612d22bc83SMichal Kalderon fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID, 20622d22bc83SMichal Kalderon pf_id); 2063d52c89f1SMichal Kalderon qed_fid_pretend(p_hwfn, p_ptt, fid); 2064d52c89f1SMichal Kalderon break; 2065d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT_PF: 20662d22bc83SMichal Kalderon fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID, 20672d22bc83SMichal Kalderon pf_id); 2068d52c89f1SMichal Kalderon qed_port_fid_pretend(p_hwfn, p_ptt, port_id, fid); 2069d52c89f1SMichal Kalderon break; 2070d52c89f1SMichal Kalderon case SPLIT_TYPE_VF: 20712d22bc83SMichal Kalderon fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFVALID, 1) 20722d22bc83SMichal Kalderon | FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFID, 20732d22bc83SMichal Kalderon vf_id); 2074d52c89f1SMichal Kalderon qed_fid_pretend(p_hwfn, p_ptt, fid); 2075d52c89f1SMichal Kalderon break; 2076d52c89f1SMichal Kalderon default: 2077d52c89f1SMichal Kalderon break; 2078d52c89f1SMichal Kalderon } 2079d52c89f1SMichal Kalderon 2080d52c89f1SMichal Kalderon dev_data->pretend.split_type = (u8)split_type; 2081d52c89f1SMichal Kalderon dev_data->pretend.split_id = split_id; 2082d52c89f1SMichal Kalderon } 2083d52c89f1SMichal Kalderon 2084d52c89f1SMichal Kalderon /* Read registers using GRC */ 2085da090917STomer Tayar qed_read_regs(p_hwfn, p_ptt, dump_buf, addr, len); 2086da090917STomer Tayar 20872d22bc83SMichal Kalderon print_log: 20882d22bc83SMichal Kalderon /* Print log */ 20892d22bc83SMichal Kalderon dev_data->num_regs_read += len; 20902d22bc83SMichal Kalderon thresh = s_hw_type_defs[dev_data->hw_type].log_thresh; 20912d22bc83SMichal Kalderon if ((dev_data->num_regs_read / thresh) > 20922d22bc83SMichal Kalderon ((dev_data->num_regs_read - len) / thresh)) 20932d22bc83SMichal Kalderon DP_VERBOSE(p_hwfn, 20942d22bc83SMichal Kalderon QED_MSG_DEBUG, 20952d22bc83SMichal Kalderon "Dumped %d registers...\n", dev_data->num_regs_read); 20962d22bc83SMichal Kalderon 2097da090917STomer Tayar return len; 2098be086e7cSMintz, Yuval } 2099be086e7cSMintz, Yuval 21007b6859fbSMintz, Yuval /* Dumps GRC registers sequence header. Returns the dumped size in dwords. 21017b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 21027b6859fbSMintz, Yuval */ 21037b6859fbSMintz, Yuval static u32 qed_grc_dump_reg_entry_hdr(u32 *dump_buf, 21047b6859fbSMintz, Yuval bool dump, u32 addr, u32 len) 2105be086e7cSMintz, Yuval { 2106be086e7cSMintz, Yuval if (dump) 2107be086e7cSMintz, Yuval *dump_buf = addr | (len << REG_DUMP_LEN_SHIFT); 21087b6859fbSMintz, Yuval 2109be086e7cSMintz, Yuval return 1; 2110be086e7cSMintz, Yuval } 2111be086e7cSMintz, Yuval 21127b6859fbSMintz, Yuval /* Dumps GRC registers sequence. Returns the dumped size in dwords. 21137b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 21147b6859fbSMintz, Yuval */ 2115c965db44STomer Tayar static u32 qed_grc_dump_reg_entry(struct qed_hwfn *p_hwfn, 21167b6859fbSMintz, Yuval struct qed_ptt *p_ptt, 21177b6859fbSMintz, Yuval u32 *dump_buf, 2118d52c89f1SMichal Kalderon bool dump, u32 addr, u32 len, bool wide_bus, 2119d52c89f1SMichal Kalderon enum init_split_types split_type, u8 split_id) 2120c965db44STomer Tayar { 2121be086e7cSMintz, Yuval u32 offset = 0; 2122c965db44STomer Tayar 2123be086e7cSMintz, Yuval offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, len); 2124be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 2125c965db44STomer Tayar p_ptt, 21267b6859fbSMintz, Yuval dump_buf + offset, 2127d52c89f1SMichal Kalderon dump, addr, len, wide_bus, 2128d52c89f1SMichal Kalderon split_type, split_id); 21297b6859fbSMintz, Yuval 2130be086e7cSMintz, Yuval return offset; 2131be086e7cSMintz, Yuval } 2132be086e7cSMintz, Yuval 2133be086e7cSMintz, Yuval /* Dumps GRC registers sequence with skip cycle. 2134be086e7cSMintz, Yuval * Returns the dumped size in dwords. 21357b6859fbSMintz, Yuval * - addr: start GRC address in dwords 21367b6859fbSMintz, Yuval * - total_len: total no. of dwords to dump 21377b6859fbSMintz, Yuval * - read_len: no. consecutive dwords to read 21387b6859fbSMintz, Yuval * - skip_len: no. of dwords to skip (and fill with zeros) 2139be086e7cSMintz, Yuval */ 2140be086e7cSMintz, Yuval static u32 qed_grc_dump_reg_entry_skip(struct qed_hwfn *p_hwfn, 21417b6859fbSMintz, Yuval struct qed_ptt *p_ptt, 21427b6859fbSMintz, Yuval u32 *dump_buf, 21437b6859fbSMintz, Yuval bool dump, 21447b6859fbSMintz, Yuval u32 addr, 21457b6859fbSMintz, Yuval u32 total_len, 2146be086e7cSMintz, Yuval u32 read_len, u32 skip_len) 2147be086e7cSMintz, Yuval { 2148be086e7cSMintz, Yuval u32 offset = 0, reg_offset = 0; 2149be086e7cSMintz, Yuval 2150be086e7cSMintz, Yuval offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, total_len); 21517b6859fbSMintz, Yuval 21527b6859fbSMintz, Yuval if (!dump) 21537b6859fbSMintz, Yuval return offset + total_len; 21547b6859fbSMintz, Yuval 2155be086e7cSMintz, Yuval while (reg_offset < total_len) { 21567b6859fbSMintz, Yuval u32 curr_len = min_t(u32, read_len, total_len - reg_offset); 21577b6859fbSMintz, Yuval 2158be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 2159be086e7cSMintz, Yuval p_ptt, 2160be086e7cSMintz, Yuval dump_buf + offset, 2161d52c89f1SMichal Kalderon dump, addr, curr_len, false, 2162d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 2163be086e7cSMintz, Yuval reg_offset += curr_len; 2164be086e7cSMintz, Yuval addr += curr_len; 21657b6859fbSMintz, Yuval 2166be086e7cSMintz, Yuval if (reg_offset < total_len) { 21677b6859fbSMintz, Yuval curr_len = min_t(u32, skip_len, total_len - skip_len); 21687b6859fbSMintz, Yuval memset(dump_buf + offset, 0, DWORDS_TO_BYTES(curr_len)); 2169be086e7cSMintz, Yuval offset += curr_len; 2170be086e7cSMintz, Yuval reg_offset += curr_len; 2171be086e7cSMintz, Yuval addr += curr_len; 2172be086e7cSMintz, Yuval } 2173be086e7cSMintz, Yuval } 2174c965db44STomer Tayar 2175c965db44STomer Tayar return offset; 2176c965db44STomer Tayar } 2177c965db44STomer Tayar 2178c965db44STomer Tayar /* Dumps GRC registers entries. Returns the dumped size in dwords. */ 2179c965db44STomer Tayar static u32 qed_grc_dump_regs_entries(struct qed_hwfn *p_hwfn, 2180c965db44STomer Tayar struct qed_ptt *p_ptt, 21812d22bc83SMichal Kalderon struct virt_mem_desc input_regs_arr, 2182c965db44STomer Tayar u32 *dump_buf, 2183c965db44STomer Tayar bool dump, 2184d52c89f1SMichal Kalderon enum init_split_types split_type, 2185d52c89f1SMichal Kalderon u8 split_id, 2186c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID], 2187c965db44STomer Tayar u32 *num_dumped_reg_entries) 2188c965db44STomer Tayar { 2189c965db44STomer Tayar u32 i, offset = 0, input_offset = 0; 2190c965db44STomer Tayar bool mode_match = true; 2191c965db44STomer Tayar 2192c965db44STomer Tayar *num_dumped_reg_entries = 0; 21937b6859fbSMintz, Yuval 21942d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(input_regs_arr.size)) { 2195c965db44STomer Tayar const struct dbg_dump_cond_hdr *cond_hdr = 2196c965db44STomer Tayar (const struct dbg_dump_cond_hdr *) 21972d22bc83SMichal Kalderon input_regs_arr.ptr + input_offset++; 21987b6859fbSMintz, Yuval u16 modes_buf_offset; 21997b6859fbSMintz, Yuval bool eval_mode; 2200c965db44STomer Tayar 2201c965db44STomer Tayar /* Check mode/block */ 22027b6859fbSMintz, Yuval eval_mode = GET_FIELD(cond_hdr->mode.data, 22037b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 2204c965db44STomer Tayar if (eval_mode) { 22057b6859fbSMintz, Yuval modes_buf_offset = 2206c965db44STomer Tayar GET_FIELD(cond_hdr->mode.data, 2207c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 2208c965db44STomer Tayar mode_match = qed_is_mode_match(p_hwfn, 2209c965db44STomer Tayar &modes_buf_offset); 2210c965db44STomer Tayar } 2211c965db44STomer Tayar 22127b6859fbSMintz, Yuval if (!mode_match || !block_enable[cond_hdr->block_id]) { 22137b6859fbSMintz, Yuval input_offset += cond_hdr->data_size; 22147b6859fbSMintz, Yuval continue; 22157b6859fbSMintz, Yuval } 22167b6859fbSMintz, Yuval 22177b6859fbSMintz, Yuval for (i = 0; i < cond_hdr->data_size; i++, input_offset++) { 2218c965db44STomer Tayar const struct dbg_dump_reg *reg = 2219c965db44STomer Tayar (const struct dbg_dump_reg *) 22202d22bc83SMichal Kalderon input_regs_arr.ptr + input_offset; 2221be086e7cSMintz, Yuval u32 addr, len; 22227b6859fbSMintz, Yuval bool wide_bus; 2223c965db44STomer Tayar 22247b6859fbSMintz, Yuval addr = GET_FIELD(reg->data, DBG_DUMP_REG_ADDRESS); 2225be086e7cSMintz, Yuval len = GET_FIELD(reg->data, DBG_DUMP_REG_LENGTH); 22267b6859fbSMintz, Yuval wide_bus = GET_FIELD(reg->data, DBG_DUMP_REG_WIDE_BUS); 22277b6859fbSMintz, Yuval offset += qed_grc_dump_reg_entry(p_hwfn, 22287b6859fbSMintz, Yuval p_ptt, 2229be086e7cSMintz, Yuval dump_buf + offset, 2230be086e7cSMintz, Yuval dump, 2231be086e7cSMintz, Yuval addr, 22327b6859fbSMintz, Yuval len, 2233d52c89f1SMichal Kalderon wide_bus, 2234d52c89f1SMichal Kalderon split_type, split_id); 2235c965db44STomer Tayar (*num_dumped_reg_entries)++; 2236c965db44STomer Tayar } 2237c965db44STomer Tayar } 2238c965db44STomer Tayar 2239c965db44STomer Tayar return offset; 2240c965db44STomer Tayar } 2241c965db44STomer Tayar 2242c965db44STomer Tayar /* Dumps GRC registers entries. Returns the dumped size in dwords. */ 2243c965db44STomer Tayar static u32 qed_grc_dump_split_data(struct qed_hwfn *p_hwfn, 2244c965db44STomer Tayar struct qed_ptt *p_ptt, 22452d22bc83SMichal Kalderon struct virt_mem_desc input_regs_arr, 2246c965db44STomer Tayar u32 *dump_buf, 2247c965db44STomer Tayar bool dump, 2248c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID], 2249d52c89f1SMichal Kalderon enum init_split_types split_type, 22502d22bc83SMichal Kalderon u8 split_id, const char *reg_type_name) 2251c965db44STomer Tayar { 2252d52c89f1SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 2253d52c89f1SMichal Kalderon enum init_split_types hdr_split_type = split_type; 2254c965db44STomer Tayar u32 num_dumped_reg_entries, offset; 2255d52c89f1SMichal Kalderon u8 hdr_split_id = split_id; 2256d52c89f1SMichal Kalderon 2257d52c89f1SMichal Kalderon /* In PORT_PF split type, print a port split header */ 2258d52c89f1SMichal Kalderon if (split_type == SPLIT_TYPE_PORT_PF) { 2259d52c89f1SMichal Kalderon hdr_split_type = SPLIT_TYPE_PORT; 2260d52c89f1SMichal Kalderon hdr_split_id = split_id / dev_data->num_pfs_per_port; 2261d52c89f1SMichal Kalderon } 2262c965db44STomer Tayar 2263c965db44STomer Tayar /* Calculate register dump header size (and skip it for now) */ 2264c965db44STomer Tayar offset = qed_grc_dump_regs_hdr(dump_buf, 2265c965db44STomer Tayar false, 2266c965db44STomer Tayar 0, 2267d52c89f1SMichal Kalderon hdr_split_type, 22682d22bc83SMichal Kalderon hdr_split_id, reg_type_name); 2269c965db44STomer Tayar 2270c965db44STomer Tayar /* Dump registers */ 2271c965db44STomer Tayar offset += qed_grc_dump_regs_entries(p_hwfn, 2272c965db44STomer Tayar p_ptt, 2273c965db44STomer Tayar input_regs_arr, 2274c965db44STomer Tayar dump_buf + offset, 2275c965db44STomer Tayar dump, 2276d52c89f1SMichal Kalderon split_type, 2277d52c89f1SMichal Kalderon split_id, 2278c965db44STomer Tayar block_enable, 2279c965db44STomer Tayar &num_dumped_reg_entries); 2280c965db44STomer Tayar 2281c965db44STomer Tayar /* Write register dump header */ 2282c965db44STomer Tayar if (dump && num_dumped_reg_entries > 0) 2283c965db44STomer Tayar qed_grc_dump_regs_hdr(dump_buf, 2284c965db44STomer Tayar dump, 2285c965db44STomer Tayar num_dumped_reg_entries, 2286d52c89f1SMichal Kalderon hdr_split_type, 22872d22bc83SMichal Kalderon hdr_split_id, reg_type_name); 2288c965db44STomer Tayar 2289c965db44STomer Tayar return num_dumped_reg_entries > 0 ? offset : 0; 2290c965db44STomer Tayar } 2291c965db44STomer Tayar 22927b6859fbSMintz, Yuval /* Dumps registers according to the input registers array. Returns the dumped 22937b6859fbSMintz, Yuval * size in dwords. 2294c965db44STomer Tayar */ 2295c965db44STomer Tayar static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn, 2296c965db44STomer Tayar struct qed_ptt *p_ptt, 2297c965db44STomer Tayar u32 *dump_buf, 2298c965db44STomer Tayar bool dump, 2299c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID], 23002d22bc83SMichal Kalderon const char *reg_type_name) 2301c965db44STomer Tayar { 23022d22bc83SMichal Kalderon struct virt_mem_desc *dbg_buf = 23032d22bc83SMichal Kalderon &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG]; 2304c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 2305c965db44STomer Tayar u32 offset = 0, input_offset = 0; 23062d22bc83SMichal Kalderon 23072d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) { 23087b6859fbSMintz, Yuval const struct dbg_dump_split_hdr *split_hdr; 23092d22bc83SMichal Kalderon struct virt_mem_desc curr_input_regs_arr; 2310d52c89f1SMichal Kalderon enum init_split_types split_type; 2311d52c89f1SMichal Kalderon u16 split_count = 0; 23127b6859fbSMintz, Yuval u32 split_data_size; 2313d52c89f1SMichal Kalderon u8 split_id; 23147b6859fbSMintz, Yuval 23157b6859fbSMintz, Yuval split_hdr = 2316c965db44STomer Tayar (const struct dbg_dump_split_hdr *) 23172d22bc83SMichal Kalderon dbg_buf->ptr + input_offset++; 2318d52c89f1SMichal Kalderon split_type = 23197b6859fbSMintz, Yuval GET_FIELD(split_hdr->hdr, 2320c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID); 23212d22bc83SMichal Kalderon split_data_size = GET_FIELD(split_hdr->hdr, 2322c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_DATA_SIZE); 23237b6859fbSMintz, Yuval curr_input_regs_arr.ptr = 23242d22bc83SMichal Kalderon (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr + 23252d22bc83SMichal Kalderon input_offset; 23262d22bc83SMichal Kalderon curr_input_regs_arr.size = DWORDS_TO_BYTES(split_data_size); 2327c965db44STomer Tayar 2328d52c89f1SMichal Kalderon switch (split_type) { 2329c965db44STomer Tayar case SPLIT_TYPE_NONE: 2330d52c89f1SMichal Kalderon split_count = 1; 2331c965db44STomer Tayar break; 2332c965db44STomer Tayar case SPLIT_TYPE_PORT: 2333d52c89f1SMichal Kalderon split_count = dev_data->num_ports; 2334c965db44STomer Tayar break; 2335c965db44STomer Tayar case SPLIT_TYPE_PF: 2336c965db44STomer Tayar case SPLIT_TYPE_PORT_PF: 2337d52c89f1SMichal Kalderon split_count = dev_data->num_ports * 2338d52c89f1SMichal Kalderon dev_data->num_pfs_per_port; 2339be086e7cSMintz, Yuval break; 2340be086e7cSMintz, Yuval case SPLIT_TYPE_VF: 2341d52c89f1SMichal Kalderon split_count = dev_data->num_vfs; 2342d52c89f1SMichal Kalderon break; 2343d52c89f1SMichal Kalderon default: 2344d52c89f1SMichal Kalderon return 0; 2345be086e7cSMintz, Yuval } 2346be086e7cSMintz, Yuval 2347d52c89f1SMichal Kalderon for (split_id = 0; split_id < split_count; split_id++) 2348d52c89f1SMichal Kalderon offset += qed_grc_dump_split_data(p_hwfn, p_ptt, 2349be086e7cSMintz, Yuval curr_input_regs_arr, 2350be086e7cSMintz, Yuval dump_buf + offset, 2351be086e7cSMintz, Yuval dump, block_enable, 2352d52c89f1SMichal Kalderon split_type, 2353d52c89f1SMichal Kalderon split_id, 23542d22bc83SMichal Kalderon reg_type_name); 2355c965db44STomer Tayar 2356c965db44STomer Tayar input_offset += split_data_size; 2357c965db44STomer Tayar } 2358c965db44STomer Tayar 2359d52c89f1SMichal Kalderon /* Cancel pretends (pretend to original PF) */ 2360be086e7cSMintz, Yuval if (dump) { 23612d22bc83SMichal Kalderon qed_fid_pretend(p_hwfn, p_ptt, 23622d22bc83SMichal Kalderon FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID, 23632d22bc83SMichal Kalderon p_hwfn->rel_pf_id)); 2364d52c89f1SMichal Kalderon dev_data->pretend.split_type = SPLIT_TYPE_NONE; 2365d52c89f1SMichal Kalderon dev_data->pretend.split_id = 0; 2366be086e7cSMintz, Yuval } 2367be086e7cSMintz, Yuval 2368c965db44STomer Tayar return offset; 2369c965db44STomer Tayar } 2370c965db44STomer Tayar 2371c965db44STomer Tayar /* Dump reset registers. Returns the dumped size in dwords. */ 2372c965db44STomer Tayar static u32 qed_grc_dump_reset_regs(struct qed_hwfn *p_hwfn, 2373c965db44STomer Tayar struct qed_ptt *p_ptt, 2374c965db44STomer Tayar u32 *dump_buf, bool dump) 2375c965db44STomer Tayar { 23762d22bc83SMichal Kalderon u32 offset = 0, num_regs = 0; 23772d22bc83SMichal Kalderon u8 reset_reg_id; 2378c965db44STomer Tayar 2379c965db44STomer Tayar /* Calculate header size */ 2380c965db44STomer Tayar offset += qed_grc_dump_regs_hdr(dump_buf, 23812d22bc83SMichal Kalderon false, 23822d22bc83SMichal Kalderon 0, SPLIT_TYPE_NONE, 0, "RESET_REGS"); 2383c965db44STomer Tayar 2384c965db44STomer Tayar /* Write reset registers */ 23852d22bc83SMichal Kalderon for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS; 23862d22bc83SMichal Kalderon reset_reg_id++) { 23872d22bc83SMichal Kalderon const struct dbg_reset_reg *reset_reg; 23882d22bc83SMichal Kalderon u32 reset_reg_addr; 23892d22bc83SMichal Kalderon 23902d22bc83SMichal Kalderon reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id); 23912d22bc83SMichal Kalderon 23922d22bc83SMichal Kalderon if (GET_FIELD(reset_reg->data, DBG_RESET_REG_IS_REMOVED)) 23937b6859fbSMintz, Yuval continue; 2394be086e7cSMintz, Yuval 23952d22bc83SMichal Kalderon reset_reg_addr = GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR); 2396c965db44STomer Tayar offset += qed_grc_dump_reg_entry(p_hwfn, 2397c965db44STomer Tayar p_ptt, 2398c965db44STomer Tayar dump_buf + offset, 2399c965db44STomer Tayar dump, 24002d22bc83SMichal Kalderon reset_reg_addr, 24012d22bc83SMichal Kalderon 1, false, SPLIT_TYPE_NONE, 0); 2402c965db44STomer Tayar num_regs++; 2403c965db44STomer Tayar } 2404c965db44STomer Tayar 2405c965db44STomer Tayar /* Write header */ 2406c965db44STomer Tayar if (dump) 2407c965db44STomer Tayar qed_grc_dump_regs_hdr(dump_buf, 2408d52c89f1SMichal Kalderon true, num_regs, SPLIT_TYPE_NONE, 24092d22bc83SMichal Kalderon 0, "RESET_REGS"); 24107b6859fbSMintz, Yuval 2411c965db44STomer Tayar return offset; 2412c965db44STomer Tayar } 2413c965db44STomer Tayar 24147b6859fbSMintz, Yuval /* Dump registers that are modified during GRC Dump and therefore must be 24157b6859fbSMintz, Yuval * dumped first. Returns the dumped size in dwords. 2416c965db44STomer Tayar */ 2417c965db44STomer Tayar static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn, 2418c965db44STomer Tayar struct qed_ptt *p_ptt, 2419c965db44STomer Tayar u32 *dump_buf, bool dump) 2420c965db44STomer Tayar { 2421c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 24222d22bc83SMichal Kalderon u32 block_id, offset = 0, stall_regs_offset; 24237b6859fbSMintz, Yuval const struct dbg_attn_reg *attn_reg_arr; 2424c965db44STomer Tayar u8 storm_id, reg_idx, num_attn_regs; 24252d22bc83SMichal Kalderon u32 num_reg_entries = 0; 2426c965db44STomer Tayar 24272d22bc83SMichal Kalderon /* Write empty header for attention registers */ 2428c965db44STomer Tayar offset += qed_grc_dump_regs_hdr(dump_buf, 24292d22bc83SMichal Kalderon false, 24302d22bc83SMichal Kalderon 0, SPLIT_TYPE_NONE, 0, "ATTN_REGS"); 2431c965db44STomer Tayar 2432c965db44STomer Tayar /* Write parity registers */ 24332d22bc83SMichal Kalderon for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) { 2434c965db44STomer Tayar if (dev_data->block_in_reset[block_id] && dump) 2435c965db44STomer Tayar continue; 2436c965db44STomer Tayar 24372d22bc83SMichal Kalderon attn_reg_arr = qed_get_block_attn_regs(p_hwfn, 24382d22bc83SMichal Kalderon (enum block_id)block_id, 2439c965db44STomer Tayar ATTN_TYPE_PARITY, 2440c965db44STomer Tayar &num_attn_regs); 24417b6859fbSMintz, Yuval 2442c965db44STomer Tayar for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) { 2443c965db44STomer Tayar const struct dbg_attn_reg *reg_data = 2444c965db44STomer Tayar &attn_reg_arr[reg_idx]; 2445c965db44STomer Tayar u16 modes_buf_offset; 2446c965db44STomer Tayar bool eval_mode; 2447be086e7cSMintz, Yuval u32 addr; 2448c965db44STomer Tayar 2449c965db44STomer Tayar /* Check mode */ 2450c965db44STomer Tayar eval_mode = GET_FIELD(reg_data->mode.data, 2451c965db44STomer Tayar DBG_MODE_HDR_EVAL_MODE) > 0; 2452c965db44STomer Tayar modes_buf_offset = 2453c965db44STomer Tayar GET_FIELD(reg_data->mode.data, 2454c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 24557b6859fbSMintz, Yuval if (eval_mode && 24567b6859fbSMintz, Yuval !qed_is_mode_match(p_hwfn, &modes_buf_offset)) 24577b6859fbSMintz, Yuval continue; 24587b6859fbSMintz, Yuval 24597b6859fbSMintz, Yuval /* Mode match: read & dump registers */ 2460be086e7cSMintz, Yuval addr = reg_data->mask_address; 24617b6859fbSMintz, Yuval offset += qed_grc_dump_reg_entry(p_hwfn, 2462c965db44STomer Tayar p_ptt, 2463c965db44STomer Tayar dump_buf + offset, 2464c965db44STomer Tayar dump, 2465be086e7cSMintz, Yuval addr, 2466d52c89f1SMichal Kalderon 1, false, 2467d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 2468be086e7cSMintz, Yuval addr = GET_FIELD(reg_data->data, 2469be086e7cSMintz, Yuval DBG_ATTN_REG_STS_ADDRESS); 24707b6859fbSMintz, Yuval offset += qed_grc_dump_reg_entry(p_hwfn, 2471c965db44STomer Tayar p_ptt, 2472c965db44STomer Tayar dump_buf + offset, 2473c965db44STomer Tayar dump, 2474be086e7cSMintz, Yuval addr, 2475d52c89f1SMichal Kalderon 1, false, 2476d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 2477c965db44STomer Tayar num_reg_entries += 2; 2478c965db44STomer Tayar } 2479c965db44STomer Tayar } 2480c965db44STomer Tayar 24812d22bc83SMichal Kalderon /* Overwrite header for attention registers */ 24822d22bc83SMichal Kalderon if (dump) 24832d22bc83SMichal Kalderon qed_grc_dump_regs_hdr(dump_buf, 24842d22bc83SMichal Kalderon true, 24852d22bc83SMichal Kalderon num_reg_entries, 24862d22bc83SMichal Kalderon SPLIT_TYPE_NONE, 0, "ATTN_REGS"); 24872d22bc83SMichal Kalderon 24882d22bc83SMichal Kalderon /* Write empty header for stall registers */ 24892d22bc83SMichal Kalderon stall_regs_offset = offset; 24902d22bc83SMichal Kalderon offset += qed_grc_dump_regs_hdr(dump_buf, 24912d22bc83SMichal Kalderon false, 0, SPLIT_TYPE_NONE, 0, "REGS"); 24922d22bc83SMichal Kalderon 24937b6859fbSMintz, Yuval /* Write Storm stall status registers */ 24942d22bc83SMichal Kalderon for (storm_id = 0, num_reg_entries = 0; storm_id < MAX_DBG_STORMS; 24952d22bc83SMichal Kalderon storm_id++) { 24967b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 2497be086e7cSMintz, Yuval u32 addr; 2498be086e7cSMintz, Yuval 24992d22bc83SMichal Kalderon if (dev_data->block_in_reset[storm->sem_block_id] && dump) 2500c965db44STomer Tayar continue; 2501c965db44STomer Tayar 2502be086e7cSMintz, Yuval addr = 25032d22bc83SMichal Kalderon BYTES_TO_DWORDS(storm->sem_fast_mem_addr + 2504be086e7cSMintz, Yuval SEM_FAST_REG_STALLED); 2505c965db44STomer Tayar offset += qed_grc_dump_reg_entry(p_hwfn, 2506c965db44STomer Tayar p_ptt, 2507c965db44STomer Tayar dump_buf + offset, 2508c965db44STomer Tayar dump, 2509be086e7cSMintz, Yuval addr, 25107b6859fbSMintz, Yuval 1, 2511d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 2512c965db44STomer Tayar num_reg_entries++; 2513c965db44STomer Tayar } 2514c965db44STomer Tayar 25152d22bc83SMichal Kalderon /* Overwrite header for stall registers */ 2516c965db44STomer Tayar if (dump) 25172d22bc83SMichal Kalderon qed_grc_dump_regs_hdr(dump_buf + stall_regs_offset, 2518c965db44STomer Tayar true, 25192d22bc83SMichal Kalderon num_reg_entries, 25202d22bc83SMichal Kalderon SPLIT_TYPE_NONE, 0, "REGS"); 25217b6859fbSMintz, Yuval 2522c965db44STomer Tayar return offset; 2523c965db44STomer Tayar } 2524c965db44STomer Tayar 2525be086e7cSMintz, Yuval /* Dumps registers that can't be represented in the debug arrays */ 2526be086e7cSMintz, Yuval static u32 qed_grc_dump_special_regs(struct qed_hwfn *p_hwfn, 2527be086e7cSMintz, Yuval struct qed_ptt *p_ptt, 2528be086e7cSMintz, Yuval u32 *dump_buf, bool dump) 2529be086e7cSMintz, Yuval { 2530be086e7cSMintz, Yuval u32 offset = 0, addr; 2531be086e7cSMintz, Yuval 2532be086e7cSMintz, Yuval offset += qed_grc_dump_regs_hdr(dump_buf, 25332d22bc83SMichal Kalderon dump, 2, SPLIT_TYPE_NONE, 0, "REGS"); 2534be086e7cSMintz, Yuval 2535be086e7cSMintz, Yuval /* Dump R/TDIF_REG_DEBUG_ERROR_INFO_SIZE (every 8'th register should be 2536be086e7cSMintz, Yuval * skipped). 2537be086e7cSMintz, Yuval */ 2538be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(RDIF_REG_DEBUG_ERROR_INFO); 2539be086e7cSMintz, Yuval offset += qed_grc_dump_reg_entry_skip(p_hwfn, 2540be086e7cSMintz, Yuval p_ptt, 2541be086e7cSMintz, Yuval dump_buf + offset, 2542be086e7cSMintz, Yuval dump, 2543be086e7cSMintz, Yuval addr, 2544be086e7cSMintz, Yuval RDIF_REG_DEBUG_ERROR_INFO_SIZE, 2545be086e7cSMintz, Yuval 7, 2546be086e7cSMintz, Yuval 1); 2547be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(TDIF_REG_DEBUG_ERROR_INFO); 2548be086e7cSMintz, Yuval offset += 2549be086e7cSMintz, Yuval qed_grc_dump_reg_entry_skip(p_hwfn, 2550be086e7cSMintz, Yuval p_ptt, 2551be086e7cSMintz, Yuval dump_buf + offset, 2552be086e7cSMintz, Yuval dump, 2553be086e7cSMintz, Yuval addr, 2554be086e7cSMintz, Yuval TDIF_REG_DEBUG_ERROR_INFO_SIZE, 2555be086e7cSMintz, Yuval 7, 2556be086e7cSMintz, Yuval 1); 2557be086e7cSMintz, Yuval 2558be086e7cSMintz, Yuval return offset; 2559be086e7cSMintz, Yuval } 2560be086e7cSMintz, Yuval 25617b6859fbSMintz, Yuval /* Dumps a GRC memory header (section and params). Returns the dumped size in 25627b6859fbSMintz, Yuval * dwords. The following parameters are dumped: 25637b6859fbSMintz, Yuval * - name: dumped only if it's not NULL. 25647b6859fbSMintz, Yuval * - addr: in dwords, dumped only if name is NULL. 25657b6859fbSMintz, Yuval * - len: in dwords, always dumped. 25667b6859fbSMintz, Yuval * - width: dumped if it's not zero. 25677b6859fbSMintz, Yuval * - packed: dumped only if it's not false. 25687b6859fbSMintz, Yuval * - mem_group: always dumped. 25697b6859fbSMintz, Yuval * - is_storm: true only if the memory is related to a Storm. 25707b6859fbSMintz, Yuval * - storm_letter: valid only if is_storm is true. 25717b6859fbSMintz, Yuval * 2572c965db44STomer Tayar */ 2573c965db44STomer Tayar static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn, 2574c965db44STomer Tayar u32 *dump_buf, 2575c965db44STomer Tayar bool dump, 2576c965db44STomer Tayar const char *name, 2577be086e7cSMintz, Yuval u32 addr, 2578be086e7cSMintz, Yuval u32 len, 2579c965db44STomer Tayar u32 bit_width, 2580c965db44STomer Tayar bool packed, 25812d22bc83SMichal Kalderon const char *mem_group, char storm_letter) 2582c965db44STomer Tayar { 2583c965db44STomer Tayar u8 num_params = 3; 2584c965db44STomer Tayar u32 offset = 0; 2585c965db44STomer Tayar char buf[64]; 2586c965db44STomer Tayar 2587be086e7cSMintz, Yuval if (!len) 2588c965db44STomer Tayar DP_NOTICE(p_hwfn, 2589c965db44STomer Tayar "Unexpected GRC Dump error: dumped memory size must be non-zero\n"); 25907b6859fbSMintz, Yuval 2591c965db44STomer Tayar if (bit_width) 2592c965db44STomer Tayar num_params++; 2593c965db44STomer Tayar if (packed) 2594c965db44STomer Tayar num_params++; 2595c965db44STomer Tayar 2596c965db44STomer Tayar /* Dump section header */ 2597c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 2598c965db44STomer Tayar dump, "grc_mem", num_params); 25997b6859fbSMintz, Yuval 2600c965db44STomer Tayar if (name) { 2601c965db44STomer Tayar /* Dump name */ 26022d22bc83SMichal Kalderon if (storm_letter) { 2603c965db44STomer Tayar strcpy(buf, "?STORM_"); 2604c965db44STomer Tayar buf[0] = storm_letter; 2605c965db44STomer Tayar strcpy(buf + strlen(buf), name); 2606c965db44STomer Tayar } else { 2607c965db44STomer Tayar strcpy(buf, name); 2608c965db44STomer Tayar } 2609c965db44STomer Tayar 2610c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 2611c965db44STomer Tayar dump, "name", buf); 2612c965db44STomer Tayar } else { 2613c965db44STomer Tayar /* Dump address */ 26147b6859fbSMintz, Yuval u32 addr_in_bytes = DWORDS_TO_BYTES(addr); 26157b6859fbSMintz, Yuval 2616c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 26177b6859fbSMintz, Yuval dump, "addr", addr_in_bytes); 2618c965db44STomer Tayar } 2619c965db44STomer Tayar 2620c965db44STomer Tayar /* Dump len */ 2621be086e7cSMintz, Yuval offset += qed_dump_num_param(dump_buf + offset, dump, "len", len); 2622c965db44STomer Tayar 2623c965db44STomer Tayar /* Dump bit width */ 2624c965db44STomer Tayar if (bit_width) 2625c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 2626c965db44STomer Tayar dump, "width", bit_width); 2627c965db44STomer Tayar 2628c965db44STomer Tayar /* Dump packed */ 2629c965db44STomer Tayar if (packed) 2630c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 2631c965db44STomer Tayar dump, "packed", 1); 2632c965db44STomer Tayar 2633c965db44STomer Tayar /* Dump reg type */ 26342d22bc83SMichal Kalderon if (storm_letter) { 2635c965db44STomer Tayar strcpy(buf, "?STORM_"); 2636c965db44STomer Tayar buf[0] = storm_letter; 2637c965db44STomer Tayar strcpy(buf + strlen(buf), mem_group); 2638c965db44STomer Tayar } else { 2639c965db44STomer Tayar strcpy(buf, mem_group); 2640c965db44STomer Tayar } 2641c965db44STomer Tayar 2642c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, dump, "type", buf); 26437b6859fbSMintz, Yuval 2644c965db44STomer Tayar return offset; 2645c965db44STomer Tayar } 2646c965db44STomer Tayar 2647c965db44STomer Tayar /* Dumps a single GRC memory. If name is NULL, the memory is stored by address. 2648c965db44STomer Tayar * Returns the dumped size in dwords. 26497b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 2650c965db44STomer Tayar */ 2651c965db44STomer Tayar static u32 qed_grc_dump_mem(struct qed_hwfn *p_hwfn, 2652c965db44STomer Tayar struct qed_ptt *p_ptt, 2653c965db44STomer Tayar u32 *dump_buf, 2654c965db44STomer Tayar bool dump, 2655c965db44STomer Tayar const char *name, 2656be086e7cSMintz, Yuval u32 addr, 2657be086e7cSMintz, Yuval u32 len, 26587b6859fbSMintz, Yuval bool wide_bus, 2659c965db44STomer Tayar u32 bit_width, 2660c965db44STomer Tayar bool packed, 26612d22bc83SMichal Kalderon const char *mem_group, char storm_letter) 2662c965db44STomer Tayar { 2663c965db44STomer Tayar u32 offset = 0; 2664c965db44STomer Tayar 2665c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 2666c965db44STomer Tayar dump_buf + offset, 2667c965db44STomer Tayar dump, 2668c965db44STomer Tayar name, 2669be086e7cSMintz, Yuval addr, 2670be086e7cSMintz, Yuval len, 2671c965db44STomer Tayar bit_width, 26722d22bc83SMichal Kalderon packed, mem_group, storm_letter); 2673be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 2674be086e7cSMintz, Yuval p_ptt, 26757b6859fbSMintz, Yuval dump_buf + offset, 2676d52c89f1SMichal Kalderon dump, addr, len, wide_bus, 2677d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 26787b6859fbSMintz, Yuval 2679c965db44STomer Tayar return offset; 2680c965db44STomer Tayar } 2681c965db44STomer Tayar 2682c965db44STomer Tayar /* Dumps GRC memories entries. Returns the dumped size in dwords. */ 2683c965db44STomer Tayar static u32 qed_grc_dump_mem_entries(struct qed_hwfn *p_hwfn, 2684c965db44STomer Tayar struct qed_ptt *p_ptt, 26852d22bc83SMichal Kalderon struct virt_mem_desc input_mems_arr, 2686c965db44STomer Tayar u32 *dump_buf, bool dump) 2687c965db44STomer Tayar { 2688c965db44STomer Tayar u32 i, offset = 0, input_offset = 0; 2689c965db44STomer Tayar bool mode_match = true; 2690c965db44STomer Tayar 26912d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(input_mems_arr.size)) { 2692c965db44STomer Tayar const struct dbg_dump_cond_hdr *cond_hdr; 26937b6859fbSMintz, Yuval u16 modes_buf_offset; 2694c965db44STomer Tayar u32 num_entries; 2695c965db44STomer Tayar bool eval_mode; 2696c965db44STomer Tayar 26972d22bc83SMichal Kalderon cond_hdr = 26982d22bc83SMichal Kalderon (const struct dbg_dump_cond_hdr *)input_mems_arr.ptr + 26992d22bc83SMichal Kalderon input_offset++; 27007b6859fbSMintz, Yuval num_entries = cond_hdr->data_size / MEM_DUMP_ENTRY_SIZE_DWORDS; 2701c965db44STomer Tayar 2702c965db44STomer Tayar /* Check required mode */ 27037b6859fbSMintz, Yuval eval_mode = GET_FIELD(cond_hdr->mode.data, 27047b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 2705c965db44STomer Tayar if (eval_mode) { 27067b6859fbSMintz, Yuval modes_buf_offset = 2707c965db44STomer Tayar GET_FIELD(cond_hdr->mode.data, 2708c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 2709c965db44STomer Tayar mode_match = qed_is_mode_match(p_hwfn, 2710c965db44STomer Tayar &modes_buf_offset); 2711c965db44STomer Tayar } 2712c965db44STomer Tayar 2713c965db44STomer Tayar if (!mode_match) { 2714c965db44STomer Tayar input_offset += cond_hdr->data_size; 2715c965db44STomer Tayar continue; 2716c965db44STomer Tayar } 2717c965db44STomer Tayar 2718c965db44STomer Tayar for (i = 0; i < num_entries; 2719c965db44STomer Tayar i++, input_offset += MEM_DUMP_ENTRY_SIZE_DWORDS) { 2720c965db44STomer Tayar const struct dbg_dump_mem *mem = 27212d22bc83SMichal Kalderon (const struct dbg_dump_mem *)((u32 *) 27222d22bc83SMichal Kalderon input_mems_arr.ptr 27232d22bc83SMichal Kalderon + input_offset); 27242d22bc83SMichal Kalderon const struct dbg_block *block; 27252d22bc83SMichal Kalderon char storm_letter = 0; 27267b6859fbSMintz, Yuval u32 mem_addr, mem_len; 27272d22bc83SMichal Kalderon bool mem_wide_bus; 27282d22bc83SMichal Kalderon u8 mem_group_id; 27297b6859fbSMintz, Yuval 27302d22bc83SMichal Kalderon mem_group_id = GET_FIELD(mem->dword0, 27312d22bc83SMichal Kalderon DBG_DUMP_MEM_MEM_GROUP_ID); 2732c965db44STomer Tayar if (mem_group_id >= MEM_GROUPS_NUM) { 2733c965db44STomer Tayar DP_NOTICE(p_hwfn, "Invalid mem_group_id\n"); 2734c965db44STomer Tayar return 0; 2735c965db44STomer Tayar } 2736c965db44STomer Tayar 27377b6859fbSMintz, Yuval if (!qed_grc_is_mem_included(p_hwfn, 27382d22bc83SMichal Kalderon (enum block_id) 27392d22bc83SMichal Kalderon cond_hdr->block_id, 27407b6859fbSMintz, Yuval mem_group_id)) 27417b6859fbSMintz, Yuval continue; 27427b6859fbSMintz, Yuval 27437b6859fbSMintz, Yuval mem_addr = GET_FIELD(mem->dword0, DBG_DUMP_MEM_ADDRESS); 27447b6859fbSMintz, Yuval mem_len = GET_FIELD(mem->dword1, DBG_DUMP_MEM_LENGTH); 27457b6859fbSMintz, Yuval mem_wide_bus = GET_FIELD(mem->dword1, 27467b6859fbSMintz, Yuval DBG_DUMP_MEM_WIDE_BUS); 2747c965db44STomer Tayar 27482d22bc83SMichal Kalderon block = get_dbg_block(p_hwfn, 27492d22bc83SMichal Kalderon cond_hdr->block_id); 27502d22bc83SMichal Kalderon 27512d22bc83SMichal Kalderon /* If memory is associated with Storm, 27522d22bc83SMichal Kalderon * update storm details 2753c965db44STomer Tayar */ 27542d22bc83SMichal Kalderon if (block->associated_storm_letter) 27552d22bc83SMichal Kalderon storm_letter = block->associated_storm_letter; 2756c965db44STomer Tayar 2757c965db44STomer Tayar /* Dump memory */ 27587b6859fbSMintz, Yuval offset += qed_grc_dump_mem(p_hwfn, 27597b6859fbSMintz, Yuval p_ptt, 27607b6859fbSMintz, Yuval dump_buf + offset, 27617b6859fbSMintz, Yuval dump, 27627b6859fbSMintz, Yuval NULL, 27637b6859fbSMintz, Yuval mem_addr, 27647b6859fbSMintz, Yuval mem_len, 27657b6859fbSMintz, Yuval mem_wide_bus, 27667b6859fbSMintz, Yuval 0, 2767c965db44STomer Tayar false, 2768c965db44STomer Tayar s_mem_group_names[mem_group_id], 27697b6859fbSMintz, Yuval storm_letter); 2770c965db44STomer Tayar } 2771c965db44STomer Tayar } 2772c965db44STomer Tayar 2773c965db44STomer Tayar return offset; 2774c965db44STomer Tayar } 2775c965db44STomer Tayar 2776c965db44STomer Tayar /* Dumps GRC memories according to the input array dump_mem. 2777c965db44STomer Tayar * Returns the dumped size in dwords. 2778c965db44STomer Tayar */ 2779c965db44STomer Tayar static u32 qed_grc_dump_memories(struct qed_hwfn *p_hwfn, 2780c965db44STomer Tayar struct qed_ptt *p_ptt, 2781c965db44STomer Tayar u32 *dump_buf, bool dump) 2782c965db44STomer Tayar { 27832d22bc83SMichal Kalderon struct virt_mem_desc *dbg_buf = 27842d22bc83SMichal Kalderon &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM]; 2785c965db44STomer Tayar u32 offset = 0, input_offset = 0; 2786c965db44STomer Tayar 27872d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) { 27887b6859fbSMintz, Yuval const struct dbg_dump_split_hdr *split_hdr; 27892d22bc83SMichal Kalderon struct virt_mem_desc curr_input_mems_arr; 2790d52c89f1SMichal Kalderon enum init_split_types split_type; 27917b6859fbSMintz, Yuval u32 split_data_size; 27927b6859fbSMintz, Yuval 27932d22bc83SMichal Kalderon split_hdr = 27942d22bc83SMichal Kalderon (const struct dbg_dump_split_hdr *)dbg_buf->ptr + 27952d22bc83SMichal Kalderon input_offset++; 27962d22bc83SMichal Kalderon split_type = GET_FIELD(split_hdr->hdr, 2797c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID); 27982d22bc83SMichal Kalderon split_data_size = GET_FIELD(split_hdr->hdr, 2799c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_DATA_SIZE); 28002d22bc83SMichal Kalderon curr_input_mems_arr.ptr = (u32 *)dbg_buf->ptr + input_offset; 28012d22bc83SMichal Kalderon curr_input_mems_arr.size = DWORDS_TO_BYTES(split_data_size); 2802c965db44STomer Tayar 2803d52c89f1SMichal Kalderon if (split_type == SPLIT_TYPE_NONE) 2804c965db44STomer Tayar offset += qed_grc_dump_mem_entries(p_hwfn, 2805c965db44STomer Tayar p_ptt, 2806c965db44STomer Tayar curr_input_mems_arr, 2807c965db44STomer Tayar dump_buf + offset, 2808c965db44STomer Tayar dump); 2809d52c89f1SMichal Kalderon else 2810c965db44STomer Tayar DP_NOTICE(p_hwfn, 2811c965db44STomer Tayar "Dumping split memories is currently not supported\n"); 2812c965db44STomer Tayar 2813c965db44STomer Tayar input_offset += split_data_size; 2814c965db44STomer Tayar } 2815c965db44STomer Tayar 2816c965db44STomer Tayar return offset; 2817c965db44STomer Tayar } 2818c965db44STomer Tayar 2819c965db44STomer Tayar /* Dumps GRC context data for the specified Storm. 2820c965db44STomer Tayar * Returns the dumped size in dwords. 28217b6859fbSMintz, Yuval * The lid_size argument is specified in quad-regs. 2822c965db44STomer Tayar */ 2823c965db44STomer Tayar static u32 qed_grc_dump_ctx_data(struct qed_hwfn *p_hwfn, 2824c965db44STomer Tayar struct qed_ptt *p_ptt, 2825c965db44STomer Tayar u32 *dump_buf, 2826c965db44STomer Tayar bool dump, 2827c965db44STomer Tayar const char *name, 2828c965db44STomer Tayar u32 num_lids, 28292d22bc83SMichal Kalderon enum cm_ctx_types ctx_type, u8 storm_id) 2830c965db44STomer Tayar { 28312d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 28327b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 28332d22bc83SMichal Kalderon u32 i, lid, lid_size, total_size; 28342d22bc83SMichal Kalderon u32 rd_reg_addr, offset = 0; 28352d22bc83SMichal Kalderon 28362d22bc83SMichal Kalderon /* Convert quad-regs to dwords */ 28372d22bc83SMichal Kalderon lid_size = storm->cm_ctx_lid_sizes[dev_data->chip_id][ctx_type] * 4; 2838c965db44STomer Tayar 2839c965db44STomer Tayar if (!lid_size) 2840c965db44STomer Tayar return 0; 28417b6859fbSMintz, Yuval 2842c965db44STomer Tayar total_size = num_lids * lid_size; 28437b6859fbSMintz, Yuval 2844c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 2845c965db44STomer Tayar dump_buf + offset, 2846c965db44STomer Tayar dump, 2847c965db44STomer Tayar name, 2848c965db44STomer Tayar 0, 2849c965db44STomer Tayar total_size, 2850c965db44STomer Tayar lid_size * 32, 28512d22bc83SMichal Kalderon false, name, storm->letter); 28527b6859fbSMintz, Yuval 28537b6859fbSMintz, Yuval if (!dump) 28547b6859fbSMintz, Yuval return offset + total_size; 2855c965db44STomer Tayar 28562d22bc83SMichal Kalderon rd_reg_addr = BYTES_TO_DWORDS(storm->cm_ctx_rd_addr[ctx_type]); 28572d22bc83SMichal Kalderon 2858c965db44STomer Tayar /* Dump context data */ 2859c965db44STomer Tayar for (lid = 0; lid < num_lids; lid++) { 28602d22bc83SMichal Kalderon for (i = 0; i < lid_size; i++) { 2861c965db44STomer Tayar qed_wr(p_hwfn, 28627b6859fbSMintz, Yuval p_ptt, storm->cm_ctx_wr_addr, (i << 9) | lid); 28632d22bc83SMichal Kalderon offset += qed_grc_dump_addr_range(p_hwfn, 28642d22bc83SMichal Kalderon p_ptt, 28652d22bc83SMichal Kalderon dump_buf + offset, 28662d22bc83SMichal Kalderon dump, 28672d22bc83SMichal Kalderon rd_reg_addr, 28682d22bc83SMichal Kalderon 1, 28692d22bc83SMichal Kalderon false, 28702d22bc83SMichal Kalderon SPLIT_TYPE_NONE, 0); 2871c965db44STomer Tayar } 2872c965db44STomer Tayar } 2873c965db44STomer Tayar 2874c965db44STomer Tayar return offset; 2875c965db44STomer Tayar } 2876c965db44STomer Tayar 2877c965db44STomer Tayar /* Dumps GRC contexts. Returns the dumped size in dwords. */ 2878c965db44STomer Tayar static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn, 2879c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 2880c965db44STomer Tayar { 2881c965db44STomer Tayar u32 offset = 0; 2882c965db44STomer Tayar u8 storm_id; 2883c965db44STomer Tayar 2884c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 2885c965db44STomer Tayar if (!qed_grc_is_storm_included(p_hwfn, 2886c965db44STomer Tayar (enum dbg_storms)storm_id)) 2887c965db44STomer Tayar continue; 2888c965db44STomer Tayar 2889c965db44STomer Tayar /* Dump Conn AG context size */ 28902d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2891c965db44STomer Tayar p_ptt, 2892c965db44STomer Tayar dump_buf + offset, 2893c965db44STomer Tayar dump, 2894c965db44STomer Tayar "CONN_AG_CTX", 28952d22bc83SMichal Kalderon NUM_OF_LCIDS, 28962d22bc83SMichal Kalderon CM_CTX_CONN_AG, storm_id); 2897c965db44STomer Tayar 2898c965db44STomer Tayar /* Dump Conn ST context size */ 28992d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2900c965db44STomer Tayar p_ptt, 2901c965db44STomer Tayar dump_buf + offset, 2902c965db44STomer Tayar dump, 2903c965db44STomer Tayar "CONN_ST_CTX", 29042d22bc83SMichal Kalderon NUM_OF_LCIDS, 29052d22bc83SMichal Kalderon CM_CTX_CONN_ST, storm_id); 2906c965db44STomer Tayar 2907c965db44STomer Tayar /* Dump Task AG context size */ 29082d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2909c965db44STomer Tayar p_ptt, 2910c965db44STomer Tayar dump_buf + offset, 2911c965db44STomer Tayar dump, 2912c965db44STomer Tayar "TASK_AG_CTX", 29132d22bc83SMichal Kalderon NUM_OF_LTIDS, 29142d22bc83SMichal Kalderon CM_CTX_TASK_AG, storm_id); 2915c965db44STomer Tayar 2916c965db44STomer Tayar /* Dump Task ST context size */ 29172d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2918c965db44STomer Tayar p_ptt, 2919c965db44STomer Tayar dump_buf + offset, 2920c965db44STomer Tayar dump, 2921c965db44STomer Tayar "TASK_ST_CTX", 29222d22bc83SMichal Kalderon NUM_OF_LTIDS, 29232d22bc83SMichal Kalderon CM_CTX_TASK_ST, storm_id); 2924c965db44STomer Tayar } 2925c965db44STomer Tayar 2926c965db44STomer Tayar return offset; 2927c965db44STomer Tayar } 2928c965db44STomer Tayar 29292d22bc83SMichal Kalderon #define VFC_STATUS_RESP_READY_BIT 0 29302d22bc83SMichal Kalderon #define VFC_STATUS_BUSY_BIT 1 29312d22bc83SMichal Kalderon #define VFC_STATUS_SENDING_CMD_BIT 2 29322d22bc83SMichal Kalderon 29332d22bc83SMichal Kalderon #define VFC_POLLING_DELAY_MS 1 29342d22bc83SMichal Kalderon #define VFC_POLLING_COUNT 20 29352d22bc83SMichal Kalderon 29362d22bc83SMichal Kalderon /* Reads data from VFC. Returns the number of dwords read (0 on error). 29372d22bc83SMichal Kalderon * Sizes are specified in dwords. 29382d22bc83SMichal Kalderon */ 29392d22bc83SMichal Kalderon static u32 qed_grc_dump_read_from_vfc(struct qed_hwfn *p_hwfn, 29402d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 29412d22bc83SMichal Kalderon struct storm_defs *storm, 29422d22bc83SMichal Kalderon u32 *cmd_data, 29432d22bc83SMichal Kalderon u32 cmd_size, 29442d22bc83SMichal Kalderon u32 *addr_data, 29452d22bc83SMichal Kalderon u32 addr_size, 29462d22bc83SMichal Kalderon u32 resp_size, u32 *dump_buf) 2947c965db44STomer Tayar { 29482d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 29492d22bc83SMichal Kalderon u32 vfc_status, polling_ms, polling_count = 0, i; 29502d22bc83SMichal Kalderon u32 reg_addr, sem_base; 29512d22bc83SMichal Kalderon bool is_ready = false; 2952c965db44STomer Tayar 29532d22bc83SMichal Kalderon sem_base = storm->sem_fast_mem_addr; 29542d22bc83SMichal Kalderon polling_ms = VFC_POLLING_DELAY_MS * 29552d22bc83SMichal Kalderon s_hw_type_defs[dev_data->hw_type].delay_factor; 2956c965db44STomer Tayar 29572d22bc83SMichal Kalderon /* Write VFC command */ 29582d22bc83SMichal Kalderon ARR_REG_WR(p_hwfn, 2959c965db44STomer Tayar p_ptt, 29602d22bc83SMichal Kalderon sem_base + SEM_FAST_REG_VFC_DATA_WR, 29612d22bc83SMichal Kalderon cmd_data, cmd_size); 29622d22bc83SMichal Kalderon 29632d22bc83SMichal Kalderon /* Write VFC address */ 29642d22bc83SMichal Kalderon ARR_REG_WR(p_hwfn, 29652d22bc83SMichal Kalderon p_ptt, 29662d22bc83SMichal Kalderon sem_base + SEM_FAST_REG_VFC_ADDR, 29672d22bc83SMichal Kalderon addr_data, addr_size); 29682d22bc83SMichal Kalderon 29692d22bc83SMichal Kalderon /* Read response */ 29702d22bc83SMichal Kalderon for (i = 0; i < resp_size; i++) { 29712d22bc83SMichal Kalderon /* Poll until ready */ 29722d22bc83SMichal Kalderon do { 29732d22bc83SMichal Kalderon reg_addr = sem_base + SEM_FAST_REG_VFC_STATUS; 29742d22bc83SMichal Kalderon qed_grc_dump_addr_range(p_hwfn, 29752d22bc83SMichal Kalderon p_ptt, 29762d22bc83SMichal Kalderon &vfc_status, 2977c965db44STomer Tayar true, 29782d22bc83SMichal Kalderon BYTES_TO_DWORDS(reg_addr), 29792d22bc83SMichal Kalderon 1, 29802d22bc83SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 29812d22bc83SMichal Kalderon is_ready = vfc_status & BIT(VFC_STATUS_RESP_READY_BIT); 29822d22bc83SMichal Kalderon 29832d22bc83SMichal Kalderon if (!is_ready) { 29842d22bc83SMichal Kalderon if (polling_count++ == VFC_POLLING_COUNT) 29852d22bc83SMichal Kalderon return 0; 29862d22bc83SMichal Kalderon 29872d22bc83SMichal Kalderon msleep(polling_ms); 2988c965db44STomer Tayar } 29892d22bc83SMichal Kalderon } while (!is_ready); 29902d22bc83SMichal Kalderon 29912d22bc83SMichal Kalderon reg_addr = sem_base + SEM_FAST_REG_VFC_DATA_RD; 29922d22bc83SMichal Kalderon qed_grc_dump_addr_range(p_hwfn, 29932d22bc83SMichal Kalderon p_ptt, 29942d22bc83SMichal Kalderon dump_buf + i, 29952d22bc83SMichal Kalderon true, 29962d22bc83SMichal Kalderon BYTES_TO_DWORDS(reg_addr), 29972d22bc83SMichal Kalderon 1, false, SPLIT_TYPE_NONE, 0); 2998c965db44STomer Tayar } 2999c965db44STomer Tayar 30002d22bc83SMichal Kalderon return resp_size; 3001c965db44STomer Tayar } 3002c965db44STomer Tayar 3003c965db44STomer Tayar /* Dump VFC CAM. Returns the dumped size in dwords. */ 3004c965db44STomer Tayar static u32 qed_grc_dump_vfc_cam(struct qed_hwfn *p_hwfn, 3005c965db44STomer Tayar struct qed_ptt *p_ptt, 3006c965db44STomer Tayar u32 *dump_buf, bool dump, u8 storm_id) 3007c965db44STomer Tayar { 3008c965db44STomer Tayar u32 total_size = VFC_CAM_NUM_ROWS * VFC_CAM_RESP_DWORDS; 30097b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 3010c965db44STomer Tayar u32 cam_addr[VFC_CAM_ADDR_DWORDS] = { 0 }; 3011c965db44STomer Tayar u32 cam_cmd[VFC_CAM_CMD_DWORDS] = { 0 }; 30122d22bc83SMichal Kalderon u32 row, offset = 0; 3013c965db44STomer Tayar 3014c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3015c965db44STomer Tayar dump_buf + offset, 3016c965db44STomer Tayar dump, 3017c965db44STomer Tayar "vfc_cam", 3018c965db44STomer Tayar 0, 3019c965db44STomer Tayar total_size, 3020c965db44STomer Tayar 256, 30212d22bc83SMichal Kalderon false, "vfc_cam", storm->letter); 30227b6859fbSMintz, Yuval 30237b6859fbSMintz, Yuval if (!dump) 30247b6859fbSMintz, Yuval return offset + total_size; 30257b6859fbSMintz, Yuval 3026c965db44STomer Tayar /* Prepare CAM address */ 3027c965db44STomer Tayar SET_VAR_FIELD(cam_addr, VFC_CAM_ADDR, OP, VFC_OPCODE_CAM_RD); 30287b6859fbSMintz, Yuval 30292d22bc83SMichal Kalderon /* Read VFC CAM data */ 30302d22bc83SMichal Kalderon for (row = 0; row < VFC_CAM_NUM_ROWS; row++) { 3031c965db44STomer Tayar SET_VAR_FIELD(cam_cmd, VFC_CAM_CMD, ROW, row); 30322d22bc83SMichal Kalderon offset += qed_grc_dump_read_from_vfc(p_hwfn, 3033c965db44STomer Tayar p_ptt, 30342d22bc83SMichal Kalderon storm, 30352d22bc83SMichal Kalderon cam_cmd, 30362d22bc83SMichal Kalderon VFC_CAM_CMD_DWORDS, 30372d22bc83SMichal Kalderon cam_addr, 30382d22bc83SMichal Kalderon VFC_CAM_ADDR_DWORDS, 30392d22bc83SMichal Kalderon VFC_CAM_RESP_DWORDS, 30402d22bc83SMichal Kalderon dump_buf + offset); 3041c965db44STomer Tayar } 3042c965db44STomer Tayar 3043c965db44STomer Tayar return offset; 3044c965db44STomer Tayar } 3045c965db44STomer Tayar 3046c965db44STomer Tayar /* Dump VFC RAM. Returns the dumped size in dwords. */ 3047c965db44STomer Tayar static u32 qed_grc_dump_vfc_ram(struct qed_hwfn *p_hwfn, 3048c965db44STomer Tayar struct qed_ptt *p_ptt, 3049c965db44STomer Tayar u32 *dump_buf, 3050c965db44STomer Tayar bool dump, 3051c965db44STomer Tayar u8 storm_id, struct vfc_ram_defs *ram_defs) 3052c965db44STomer Tayar { 3053c965db44STomer Tayar u32 total_size = ram_defs->num_rows * VFC_RAM_RESP_DWORDS; 30547b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 3055c965db44STomer Tayar u32 ram_addr[VFC_RAM_ADDR_DWORDS] = { 0 }; 3056c965db44STomer Tayar u32 ram_cmd[VFC_RAM_CMD_DWORDS] = { 0 }; 30572d22bc83SMichal Kalderon u32 row, offset = 0; 3058c965db44STomer Tayar 3059c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3060c965db44STomer Tayar dump_buf + offset, 3061c965db44STomer Tayar dump, 3062c965db44STomer Tayar ram_defs->mem_name, 3063c965db44STomer Tayar 0, 3064c965db44STomer Tayar total_size, 3065c965db44STomer Tayar 256, 3066c965db44STomer Tayar false, 3067c965db44STomer Tayar ram_defs->type_name, 30682d22bc83SMichal Kalderon storm->letter); 3069c965db44STomer Tayar 3070c965db44STomer Tayar if (!dump) 3071c965db44STomer Tayar return offset + total_size; 3072c965db44STomer Tayar 30732d22bc83SMichal Kalderon /* Prepare RAM address */ 30742d22bc83SMichal Kalderon SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, OP, VFC_OPCODE_RAM_RD); 30752d22bc83SMichal Kalderon 30762d22bc83SMichal Kalderon /* Read VFC RAM data */ 3077c965db44STomer Tayar for (row = ram_defs->base_row; 30782d22bc83SMichal Kalderon row < ram_defs->base_row + ram_defs->num_rows; row++) { 3079c965db44STomer Tayar SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, ROW, row); 30802d22bc83SMichal Kalderon offset += qed_grc_dump_read_from_vfc(p_hwfn, 3081c965db44STomer Tayar p_ptt, 30822d22bc83SMichal Kalderon storm, 30832d22bc83SMichal Kalderon ram_cmd, 30842d22bc83SMichal Kalderon VFC_RAM_CMD_DWORDS, 30852d22bc83SMichal Kalderon ram_addr, 30862d22bc83SMichal Kalderon VFC_RAM_ADDR_DWORDS, 30872d22bc83SMichal Kalderon VFC_RAM_RESP_DWORDS, 30882d22bc83SMichal Kalderon dump_buf + offset); 3089c965db44STomer Tayar } 3090c965db44STomer Tayar 3091c965db44STomer Tayar return offset; 3092c965db44STomer Tayar } 3093c965db44STomer Tayar 3094c965db44STomer Tayar /* Dumps GRC VFC data. Returns the dumped size in dwords. */ 3095c965db44STomer Tayar static u32 qed_grc_dump_vfc(struct qed_hwfn *p_hwfn, 3096c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3097c965db44STomer Tayar { 3098c965db44STomer Tayar u8 storm_id, i; 3099c965db44STomer Tayar u32 offset = 0; 3100c965db44STomer Tayar 3101c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 31027b6859fbSMintz, Yuval if (!qed_grc_is_storm_included(p_hwfn, 31037b6859fbSMintz, Yuval (enum dbg_storms)storm_id) || 31042d22bc83SMichal Kalderon !s_storm_defs[storm_id].has_vfc) 31057b6859fbSMintz, Yuval continue; 31067b6859fbSMintz, Yuval 3107c965db44STomer Tayar /* Read CAM */ 3108c965db44STomer Tayar offset += qed_grc_dump_vfc_cam(p_hwfn, 3109c965db44STomer Tayar p_ptt, 3110c965db44STomer Tayar dump_buf + offset, 3111c965db44STomer Tayar dump, storm_id); 3112c965db44STomer Tayar 3113c965db44STomer Tayar /* Read RAM */ 3114c965db44STomer Tayar for (i = 0; i < NUM_VFC_RAM_TYPES; i++) 3115c965db44STomer Tayar offset += qed_grc_dump_vfc_ram(p_hwfn, 3116c965db44STomer Tayar p_ptt, 31177b6859fbSMintz, Yuval dump_buf + offset, 3118c965db44STomer Tayar dump, 3119c965db44STomer Tayar storm_id, 31207b6859fbSMintz, Yuval &s_vfc_ram_defs[i]); 3121c965db44STomer Tayar } 3122c965db44STomer Tayar 3123c965db44STomer Tayar return offset; 3124c965db44STomer Tayar } 3125c965db44STomer Tayar 3126c965db44STomer Tayar /* Dumps GRC RSS data. Returns the dumped size in dwords. */ 3127c965db44STomer Tayar static u32 qed_grc_dump_rss(struct qed_hwfn *p_hwfn, 3128c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3129c965db44STomer Tayar { 3130c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 3131c965db44STomer Tayar u32 offset = 0; 3132c965db44STomer Tayar u8 rss_mem_id; 3133c965db44STomer Tayar 3134c965db44STomer Tayar for (rss_mem_id = 0; rss_mem_id < NUM_RSS_MEM_TYPES; rss_mem_id++) { 3135da090917STomer Tayar u32 rss_addr, num_entries, total_dwords; 31367b6859fbSMintz, Yuval struct rss_mem_defs *rss_defs; 3137da090917STomer Tayar u32 addr, num_dwords_to_read; 31387b6859fbSMintz, Yuval bool packed; 31397b6859fbSMintz, Yuval 31407b6859fbSMintz, Yuval rss_defs = &s_rss_mem_defs[rss_mem_id]; 31417b6859fbSMintz, Yuval rss_addr = rss_defs->addr; 31427b6859fbSMintz, Yuval num_entries = rss_defs->num_entries[dev_data->chip_id]; 3143da090917STomer Tayar total_dwords = (num_entries * rss_defs->entry_width) / 32; 3144da090917STomer Tayar packed = (rss_defs->entry_width == 16); 3145c965db44STomer Tayar 3146c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3147c965db44STomer Tayar dump_buf + offset, 3148c965db44STomer Tayar dump, 3149c965db44STomer Tayar rss_defs->mem_name, 3150be086e7cSMintz, Yuval 0, 3151be086e7cSMintz, Yuval total_dwords, 3152da090917STomer Tayar rss_defs->entry_width, 3153c965db44STomer Tayar packed, 31542d22bc83SMichal Kalderon rss_defs->type_name, 0); 3155c965db44STomer Tayar 31567b6859fbSMintz, Yuval /* Dump RSS data */ 3157c965db44STomer Tayar if (!dump) { 3158be086e7cSMintz, Yuval offset += total_dwords; 3159c965db44STomer Tayar continue; 3160c965db44STomer Tayar } 3161c965db44STomer Tayar 3162be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(RSS_REG_RSS_RAM_DATA); 3163da090917STomer Tayar while (total_dwords) { 3164da090917STomer Tayar num_dwords_to_read = min_t(u32, 3165da090917STomer Tayar RSS_REG_RSS_RAM_DATA_SIZE, 3166da090917STomer Tayar total_dwords); 3167be086e7cSMintz, Yuval qed_wr(p_hwfn, p_ptt, RSS_REG_RSS_RAM_ADDR, rss_addr); 3168be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3169be086e7cSMintz, Yuval p_ptt, 31707b6859fbSMintz, Yuval dump_buf + offset, 3171be086e7cSMintz, Yuval dump, 3172be086e7cSMintz, Yuval addr, 3173da090917STomer Tayar num_dwords_to_read, 3174d52c89f1SMichal Kalderon false, 3175d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 3176da090917STomer Tayar total_dwords -= num_dwords_to_read; 3177da090917STomer Tayar rss_addr++; 3178c965db44STomer Tayar } 3179c965db44STomer Tayar } 3180c965db44STomer Tayar 3181c965db44STomer Tayar return offset; 3182c965db44STomer Tayar } 3183c965db44STomer Tayar 3184c965db44STomer Tayar /* Dumps GRC Big RAM. Returns the dumped size in dwords. */ 3185c965db44STomer Tayar static u32 qed_grc_dump_big_ram(struct qed_hwfn *p_hwfn, 3186c965db44STomer Tayar struct qed_ptt *p_ptt, 3187c965db44STomer Tayar u32 *dump_buf, bool dump, u8 big_ram_id) 3188c965db44STomer Tayar { 3189c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 3190da090917STomer Tayar u32 block_size, ram_size, offset = 0, reg_val, i; 3191c965db44STomer Tayar char mem_name[12] = "???_BIG_RAM"; 3192c965db44STomer Tayar char type_name[8] = "???_RAM"; 3193be086e7cSMintz, Yuval struct big_ram_defs *big_ram; 3194c965db44STomer Tayar 3195be086e7cSMintz, Yuval big_ram = &s_big_ram_defs[big_ram_id]; 3196da090917STomer Tayar ram_size = big_ram->ram_size[dev_data->chip_id]; 3197da090917STomer Tayar 3198da090917STomer Tayar reg_val = qed_rd(p_hwfn, p_ptt, big_ram->is_256b_reg_addr); 3199da090917STomer Tayar block_size = reg_val & 3200da090917STomer Tayar BIT(big_ram->is_256b_bit_offset[dev_data->chip_id]) ? 256 3201da090917STomer Tayar : 128; 3202c965db44STomer Tayar 3203c7d852e3SDenis Bolotin strncpy(type_name, big_ram->instance_name, BIG_RAM_NAME_LEN); 3204c7d852e3SDenis Bolotin strncpy(mem_name, big_ram->instance_name, BIG_RAM_NAME_LEN); 3205c965db44STomer Tayar 3206c965db44STomer Tayar /* Dump memory header */ 3207c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3208c965db44STomer Tayar dump_buf + offset, 3209c965db44STomer Tayar dump, 3210c965db44STomer Tayar mem_name, 3211c965db44STomer Tayar 0, 3212c965db44STomer Tayar ram_size, 3213da090917STomer Tayar block_size * 8, 32142d22bc83SMichal Kalderon false, type_name, 0); 3215c965db44STomer Tayar 32167b6859fbSMintz, Yuval /* Read and dump Big RAM data */ 3217c965db44STomer Tayar if (!dump) 3218c965db44STomer Tayar return offset + ram_size; 3219c965db44STomer Tayar 32207b6859fbSMintz, Yuval /* Dump Big RAM */ 3221da090917STomer Tayar for (i = 0; i < DIV_ROUND_UP(ram_size, BRB_REG_BIG_RAM_DATA_SIZE); 3222da090917STomer Tayar i++) { 3223be086e7cSMintz, Yuval u32 addr, len; 3224be086e7cSMintz, Yuval 3225be086e7cSMintz, Yuval qed_wr(p_hwfn, p_ptt, big_ram->addr_reg_addr, i); 3226be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(big_ram->data_reg_addr); 3227da090917STomer Tayar len = BRB_REG_BIG_RAM_DATA_SIZE; 3228be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3229be086e7cSMintz, Yuval p_ptt, 3230be086e7cSMintz, Yuval dump_buf + offset, 3231be086e7cSMintz, Yuval dump, 3232be086e7cSMintz, Yuval addr, 32337b6859fbSMintz, Yuval len, 3234d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 3235c965db44STomer Tayar } 3236c965db44STomer Tayar 3237c965db44STomer Tayar return offset; 3238c965db44STomer Tayar } 3239c965db44STomer Tayar 32402d22bc83SMichal Kalderon /* Dumps MCP scratchpad. Returns the dumped size in dwords. */ 3241c965db44STomer Tayar static u32 qed_grc_dump_mcp(struct qed_hwfn *p_hwfn, 3242c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3243c965db44STomer Tayar { 3244c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID] = { 0 }; 3245be086e7cSMintz, Yuval u32 offset = 0, addr; 3246c965db44STomer Tayar bool halted = false; 3247c965db44STomer Tayar 3248c965db44STomer Tayar /* Halt MCP */ 3249be086e7cSMintz, Yuval if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) { 3250c965db44STomer Tayar halted = !qed_mcp_halt(p_hwfn, p_ptt); 3251c965db44STomer Tayar if (!halted) 3252c965db44STomer Tayar DP_NOTICE(p_hwfn, "MCP halt failed!\n"); 3253c965db44STomer Tayar } 3254c965db44STomer Tayar 3255c965db44STomer Tayar /* Dump MCP scratchpad */ 3256c965db44STomer Tayar offset += qed_grc_dump_mem(p_hwfn, 3257c965db44STomer Tayar p_ptt, 3258c965db44STomer Tayar dump_buf + offset, 3259c965db44STomer Tayar dump, 3260c965db44STomer Tayar NULL, 3261be086e7cSMintz, Yuval BYTES_TO_DWORDS(MCP_REG_SCRATCH), 32622d22bc83SMichal Kalderon MCP_REG_SCRATCH_SIZE, 32632d22bc83SMichal Kalderon false, 0, false, "MCP", 0); 3264c965db44STomer Tayar 3265c965db44STomer Tayar /* Dump MCP cpu_reg_file */ 3266c965db44STomer Tayar offset += qed_grc_dump_mem(p_hwfn, 3267c965db44STomer Tayar p_ptt, 3268c965db44STomer Tayar dump_buf + offset, 3269c965db44STomer Tayar dump, 3270c965db44STomer Tayar NULL, 3271be086e7cSMintz, Yuval BYTES_TO_DWORDS(MCP_REG_CPU_REG_FILE), 3272c965db44STomer Tayar MCP_REG_CPU_REG_FILE_SIZE, 32732d22bc83SMichal Kalderon false, 0, false, "MCP", 0); 3274c965db44STomer Tayar 3275c965db44STomer Tayar /* Dump MCP registers */ 3276c965db44STomer Tayar block_enable[BLOCK_MCP] = true; 3277c965db44STomer Tayar offset += qed_grc_dump_registers(p_hwfn, 3278c965db44STomer Tayar p_ptt, 3279c965db44STomer Tayar dump_buf + offset, 32802d22bc83SMichal Kalderon dump, block_enable, "MCP"); 3281c965db44STomer Tayar 3282c965db44STomer Tayar /* Dump required non-MCP registers */ 3283c965db44STomer Tayar offset += qed_grc_dump_regs_hdr(dump_buf + offset, 3284d52c89f1SMichal Kalderon dump, 1, SPLIT_TYPE_NONE, 0, 32852d22bc83SMichal Kalderon "MCP"); 3286be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(MISC_REG_SHARED_MEM_ADDR); 3287c965db44STomer Tayar offset += qed_grc_dump_reg_entry(p_hwfn, 3288c965db44STomer Tayar p_ptt, 3289c965db44STomer Tayar dump_buf + offset, 3290c965db44STomer Tayar dump, 3291be086e7cSMintz, Yuval addr, 32927b6859fbSMintz, Yuval 1, 3293d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 3294c965db44STomer Tayar 3295c965db44STomer Tayar /* Release MCP */ 3296c965db44STomer Tayar if (halted && qed_mcp_resume(p_hwfn, p_ptt)) 3297c965db44STomer Tayar DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n"); 32987b6859fbSMintz, Yuval 3299c965db44STomer Tayar return offset; 3300c965db44STomer Tayar } 3301c965db44STomer Tayar 33022d22bc83SMichal Kalderon /* Dumps the tbus indirect memory for all PHYs. 33032d22bc83SMichal Kalderon * Returns the dumped size in dwords. 33042d22bc83SMichal Kalderon */ 3305c965db44STomer Tayar static u32 qed_grc_dump_phy(struct qed_hwfn *p_hwfn, 3306c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3307c965db44STomer Tayar { 3308c965db44STomer Tayar u32 offset = 0, tbus_lo_offset, tbus_hi_offset; 3309c965db44STomer Tayar char mem_name[32]; 3310c965db44STomer Tayar u8 phy_id; 3311c965db44STomer Tayar 3312c965db44STomer Tayar for (phy_id = 0; phy_id < ARRAY_SIZE(s_phy_defs); phy_id++) { 33137b6859fbSMintz, Yuval u32 addr_lo_addr, addr_hi_addr, data_lo_addr, data_hi_addr; 33147b6859fbSMintz, Yuval struct phy_defs *phy_defs; 33157b6859fbSMintz, Yuval u8 *bytes_buf; 3316c965db44STomer Tayar 33177b6859fbSMintz, Yuval phy_defs = &s_phy_defs[phy_id]; 33187b6859fbSMintz, Yuval addr_lo_addr = phy_defs->base_addr + 33197b6859fbSMintz, Yuval phy_defs->tbus_addr_lo_addr; 33207b6859fbSMintz, Yuval addr_hi_addr = phy_defs->base_addr + 33217b6859fbSMintz, Yuval phy_defs->tbus_addr_hi_addr; 33227b6859fbSMintz, Yuval data_lo_addr = phy_defs->base_addr + 33237b6859fbSMintz, Yuval phy_defs->tbus_data_lo_addr; 33247b6859fbSMintz, Yuval data_hi_addr = phy_defs->base_addr + 33257b6859fbSMintz, Yuval phy_defs->tbus_data_hi_addr; 33267b6859fbSMintz, Yuval 33277b6859fbSMintz, Yuval if (snprintf(mem_name, sizeof(mem_name), "tbus_%s", 33287b6859fbSMintz, Yuval phy_defs->phy_name) < 0) 3329c965db44STomer Tayar DP_NOTICE(p_hwfn, 3330c965db44STomer Tayar "Unexpected debug error: invalid PHY memory name\n"); 33317b6859fbSMintz, Yuval 3332c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3333c965db44STomer Tayar dump_buf + offset, 3334c965db44STomer Tayar dump, 3335c965db44STomer Tayar mem_name, 3336c965db44STomer Tayar 0, 3337c965db44STomer Tayar PHY_DUMP_SIZE_DWORDS, 33382d22bc83SMichal Kalderon 16, true, mem_name, 0); 33397b6859fbSMintz, Yuval 33407b6859fbSMintz, Yuval if (!dump) { 33417b6859fbSMintz, Yuval offset += PHY_DUMP_SIZE_DWORDS; 33427b6859fbSMintz, Yuval continue; 33437b6859fbSMintz, Yuval } 3344c965db44STomer Tayar 3345da090917STomer Tayar bytes_buf = (u8 *)(dump_buf + offset); 3346c965db44STomer Tayar for (tbus_hi_offset = 0; 3347c965db44STomer Tayar tbus_hi_offset < (NUM_PHY_TBUS_ADDRESSES >> 8); 3348c965db44STomer Tayar tbus_hi_offset++) { 33497b6859fbSMintz, Yuval qed_wr(p_hwfn, p_ptt, addr_hi_addr, tbus_hi_offset); 3350c965db44STomer Tayar for (tbus_lo_offset = 0; tbus_lo_offset < 256; 3351c965db44STomer Tayar tbus_lo_offset++) { 3352c965db44STomer Tayar qed_wr(p_hwfn, 33537b6859fbSMintz, Yuval p_ptt, addr_lo_addr, tbus_lo_offset); 33547b6859fbSMintz, Yuval *(bytes_buf++) = (u8)qed_rd(p_hwfn, 3355c965db44STomer Tayar p_ptt, 3356c965db44STomer Tayar data_lo_addr); 33577b6859fbSMintz, Yuval *(bytes_buf++) = (u8)qed_rd(p_hwfn, 33587b6859fbSMintz, Yuval p_ptt, 3359c965db44STomer Tayar data_hi_addr); 3360c965db44STomer Tayar } 3361c965db44STomer Tayar } 3362c965db44STomer Tayar 3363c965db44STomer Tayar offset += PHY_DUMP_SIZE_DWORDS; 3364c965db44STomer Tayar } 3365c965db44STomer Tayar 3366c965db44STomer Tayar return offset; 3367c965db44STomer Tayar } 3368c965db44STomer Tayar 33692d22bc83SMichal Kalderon /* Dumps the MCP HW dump from NVRAM. Returns the dumped size in dwords. */ 33702d22bc83SMichal Kalderon static u32 qed_grc_dump_mcp_hw_dump(struct qed_hwfn *p_hwfn, 33712d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 33722d22bc83SMichal Kalderon u32 *dump_buf, bool dump) 33732d22bc83SMichal Kalderon { 33742d22bc83SMichal Kalderon u32 hw_dump_offset_bytes = 0, hw_dump_size_bytes = 0; 33752d22bc83SMichal Kalderon u32 hw_dump_size_dwords = 0, offset = 0; 33762d22bc83SMichal Kalderon enum dbg_status status; 33772d22bc83SMichal Kalderon 33782d22bc83SMichal Kalderon /* Read HW dump image from NVRAM */ 33792d22bc83SMichal Kalderon status = qed_find_nvram_image(p_hwfn, 33802d22bc83SMichal Kalderon p_ptt, 33812d22bc83SMichal Kalderon NVM_TYPE_HW_DUMP_OUT, 33822d22bc83SMichal Kalderon &hw_dump_offset_bytes, 33832d22bc83SMichal Kalderon &hw_dump_size_bytes); 33842d22bc83SMichal Kalderon if (status != DBG_STATUS_OK) 33852d22bc83SMichal Kalderon return 0; 33862d22bc83SMichal Kalderon 33872d22bc83SMichal Kalderon hw_dump_size_dwords = BYTES_TO_DWORDS(hw_dump_size_bytes); 33882d22bc83SMichal Kalderon 33892d22bc83SMichal Kalderon /* Dump HW dump image section */ 33902d22bc83SMichal Kalderon offset += qed_dump_section_hdr(dump_buf + offset, 33912d22bc83SMichal Kalderon dump, "mcp_hw_dump", 1); 33922d22bc83SMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 33932d22bc83SMichal Kalderon dump, "size", hw_dump_size_dwords); 33942d22bc83SMichal Kalderon 33952d22bc83SMichal Kalderon /* Read MCP HW dump image into dump buffer */ 33962d22bc83SMichal Kalderon if (dump && hw_dump_size_dwords) { 33972d22bc83SMichal Kalderon status = qed_nvram_read(p_hwfn, 33982d22bc83SMichal Kalderon p_ptt, 33992d22bc83SMichal Kalderon hw_dump_offset_bytes, 34002d22bc83SMichal Kalderon hw_dump_size_bytes, dump_buf + offset); 34012d22bc83SMichal Kalderon if (status != DBG_STATUS_OK) { 34022d22bc83SMichal Kalderon DP_NOTICE(p_hwfn, 34032d22bc83SMichal Kalderon "Failed to read MCP HW Dump image from NVRAM\n"); 34042d22bc83SMichal Kalderon return 0; 34052d22bc83SMichal Kalderon } 34062d22bc83SMichal Kalderon } 34072d22bc83SMichal Kalderon offset += hw_dump_size_dwords; 34082d22bc83SMichal Kalderon 34092d22bc83SMichal Kalderon return offset; 3410c965db44STomer Tayar } 3411c965db44STomer Tayar 3412c965db44STomer Tayar /* Dumps Static Debug data. Returns the dumped size in dwords. */ 3413c965db44STomer Tayar static u32 qed_grc_dump_static_debug(struct qed_hwfn *p_hwfn, 3414c965db44STomer Tayar struct qed_ptt *p_ptt, 3415c965db44STomer Tayar u32 *dump_buf, bool dump) 3416c965db44STomer Tayar { 3417c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 34182d22bc83SMichal Kalderon u32 block_id, line_id, offset = 0, addr, len; 34197b6859fbSMintz, Yuval 3420da090917STomer Tayar /* Don't dump static debug if a debug bus recording is in progress */ 3421da090917STomer Tayar if (dump && qed_rd(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON)) 34227b6859fbSMintz, Yuval return 0; 3423c965db44STomer Tayar 3424c965db44STomer Tayar if (dump) { 34252d22bc83SMichal Kalderon /* Disable debug bus in all blocks */ 34262d22bc83SMichal Kalderon qed_bus_disable_blocks(p_hwfn, p_ptt); 3427c965db44STomer Tayar 3428c965db44STomer Tayar qed_bus_reset_dbg_block(p_hwfn, p_ptt); 34292d22bc83SMichal Kalderon qed_wr(p_hwfn, 34302d22bc83SMichal Kalderon p_ptt, DBG_REG_FRAMING_MODE, DBG_BUS_FRAME_MODE_8HW); 3431c965db44STomer Tayar qed_wr(p_hwfn, 3432c965db44STomer Tayar p_ptt, DBG_REG_DEBUG_TARGET, DBG_BUS_TARGET_ID_INT_BUF); 3433c965db44STomer Tayar qed_wr(p_hwfn, p_ptt, DBG_REG_FULL_MODE, 1); 3434c965db44STomer Tayar qed_bus_enable_dbg_block(p_hwfn, p_ptt, true); 3435c965db44STomer Tayar } 3436c965db44STomer Tayar 3437c965db44STomer Tayar /* Dump all static debug lines for each relevant block */ 3438c965db44STomer Tayar for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) { 34392d22bc83SMichal Kalderon const struct dbg_block_chip *block_per_chip; 34402d22bc83SMichal Kalderon const struct dbg_block *block; 34412d22bc83SMichal Kalderon bool is_removed, has_dbg_bus; 34422d22bc83SMichal Kalderon u16 modes_buf_offset; 34432d22bc83SMichal Kalderon u32 block_dwords; 3444c965db44STomer Tayar 34452d22bc83SMichal Kalderon block_per_chip = 34462d22bc83SMichal Kalderon qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)block_id); 34472d22bc83SMichal Kalderon is_removed = GET_FIELD(block_per_chip->flags, 34482d22bc83SMichal Kalderon DBG_BLOCK_CHIP_IS_REMOVED); 34492d22bc83SMichal Kalderon has_dbg_bus = GET_FIELD(block_per_chip->flags, 34502d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_DBG_BUS); 34512d22bc83SMichal Kalderon 34522d22bc83SMichal Kalderon if (!is_removed && has_dbg_bus && 34532d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 34542d22bc83SMichal Kalderon DBG_MODE_HDR_EVAL_MODE) > 0) { 34552d22bc83SMichal Kalderon modes_buf_offset = 34562d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 34572d22bc83SMichal Kalderon DBG_MODE_HDR_MODES_BUF_OFFSET); 34582d22bc83SMichal Kalderon if (!qed_is_mode_match(p_hwfn, &modes_buf_offset)) 34592d22bc83SMichal Kalderon has_dbg_bus = false; 34602d22bc83SMichal Kalderon } 34612d22bc83SMichal Kalderon 34622d22bc83SMichal Kalderon if (is_removed || !has_dbg_bus) 34632d22bc83SMichal Kalderon continue; 34642d22bc83SMichal Kalderon 34652d22bc83SMichal Kalderon block_dwords = NUM_DBG_LINES(block_per_chip) * 34667b6859fbSMintz, Yuval STATIC_DEBUG_LINE_DWORDS; 34677b6859fbSMintz, Yuval 3468c965db44STomer Tayar /* Dump static section params */ 34692d22bc83SMichal Kalderon block = get_dbg_block(p_hwfn, (enum block_id)block_id); 3470c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3471c965db44STomer Tayar dump_buf + offset, 3472c965db44STomer Tayar dump, 34737b6859fbSMintz, Yuval block->name, 34747b6859fbSMintz, Yuval 0, 34757b6859fbSMintz, Yuval block_dwords, 34762d22bc83SMichal Kalderon 32, false, "STATIC", 0); 3477c965db44STomer Tayar 34787b6859fbSMintz, Yuval if (!dump) { 34797b6859fbSMintz, Yuval offset += block_dwords; 34807b6859fbSMintz, Yuval continue; 34817b6859fbSMintz, Yuval } 34827b6859fbSMintz, Yuval 34837b6859fbSMintz, Yuval /* If all lines are invalid - dump zeros */ 34847b6859fbSMintz, Yuval if (dev_data->block_in_reset[block_id]) { 34857b6859fbSMintz, Yuval memset(dump_buf + offset, 0, 34867b6859fbSMintz, Yuval DWORDS_TO_BYTES(block_dwords)); 34877b6859fbSMintz, Yuval offset += block_dwords; 34887b6859fbSMintz, Yuval continue; 34897b6859fbSMintz, Yuval } 3490c965db44STomer Tayar 3491c965db44STomer Tayar /* Enable block's client */ 34927b6859fbSMintz, Yuval qed_bus_enable_clients(p_hwfn, 34937b6859fbSMintz, Yuval p_ptt, 34942d22bc83SMichal Kalderon BIT(block_per_chip->dbg_client_id)); 3495c965db44STomer Tayar 34967b6859fbSMintz, Yuval addr = BYTES_TO_DWORDS(DBG_REG_CALENDAR_OUT_DATA); 34977b6859fbSMintz, Yuval len = STATIC_DEBUG_LINE_DWORDS; 34982d22bc83SMichal Kalderon for (line_id = 0; line_id < (u32)NUM_DBG_LINES(block_per_chip); 3499c965db44STomer Tayar line_id++) { 3500c965db44STomer Tayar /* Configure debug line ID */ 35012d22bc83SMichal Kalderon qed_bus_config_dbg_line(p_hwfn, 3502c965db44STomer Tayar p_ptt, 3503c965db44STomer Tayar (enum block_id)block_id, 35047b6859fbSMintz, Yuval (u8)line_id, 0xf, 0, 0, 0); 3505c965db44STomer Tayar 3506c965db44STomer Tayar /* Read debug line info */ 35077b6859fbSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3508be086e7cSMintz, Yuval p_ptt, 3509be086e7cSMintz, Yuval dump_buf + offset, 3510be086e7cSMintz, Yuval dump, 3511be086e7cSMintz, Yuval addr, 35127b6859fbSMintz, Yuval len, 3513d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 3514d52c89f1SMichal Kalderon 0); 3515c965db44STomer Tayar } 3516c965db44STomer Tayar 3517c965db44STomer Tayar /* Disable block's client and debug output */ 3518c965db44STomer Tayar qed_bus_enable_clients(p_hwfn, p_ptt, 0); 35192d22bc83SMichal Kalderon qed_bus_config_dbg_line(p_hwfn, p_ptt, 35202d22bc83SMichal Kalderon (enum block_id)block_id, 0, 0, 0, 0, 0); 3521c965db44STomer Tayar } 3522c965db44STomer Tayar 3523c965db44STomer Tayar if (dump) { 3524c965db44STomer Tayar qed_bus_enable_dbg_block(p_hwfn, p_ptt, false); 3525c965db44STomer Tayar qed_bus_enable_clients(p_hwfn, p_ptt, 0); 3526c965db44STomer Tayar } 3527c965db44STomer Tayar 3528c965db44STomer Tayar return offset; 3529c965db44STomer Tayar } 3530c965db44STomer Tayar 3531c965db44STomer Tayar /* Performs GRC Dump to the specified buffer. 3532c965db44STomer Tayar * Returns the dumped size in dwords. 3533c965db44STomer Tayar */ 3534c965db44STomer Tayar static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn, 3535c965db44STomer Tayar struct qed_ptt *p_ptt, 3536c965db44STomer Tayar u32 *dump_buf, 3537c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 3538c965db44STomer Tayar { 3539c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 3540c965db44STomer Tayar bool parities_masked = false; 35416c95dd8fSPrabhakar Kushwaha u32 dwords_read, offset = 0; 3542d52c89f1SMichal Kalderon u8 i; 3543c965db44STomer Tayar 3544c965db44STomer Tayar *num_dumped_dwords = 0; 3545d52c89f1SMichal Kalderon dev_data->num_regs_read = 0; 3546c965db44STomer Tayar 3547c965db44STomer Tayar /* Update reset state */ 3548d52c89f1SMichal Kalderon if (dump) 3549c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 3550c965db44STomer Tayar 3551c965db44STomer Tayar /* Dump global params */ 3552c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 3553c965db44STomer Tayar p_ptt, 3554c965db44STomer Tayar dump_buf + offset, dump, 4); 3555c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 3556c965db44STomer Tayar dump, "dump-type", "grc-dump"); 3557c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 3558c965db44STomer Tayar dump, 3559c965db44STomer Tayar "num-lcids", 35602d22bc83SMichal Kalderon NUM_OF_LCIDS); 3561c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 3562c965db44STomer Tayar dump, 3563c965db44STomer Tayar "num-ltids", 35642d22bc83SMichal Kalderon NUM_OF_LTIDS); 3565c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 3566d52c89f1SMichal Kalderon dump, "num-ports", dev_data->num_ports); 3567c965db44STomer Tayar 3568c965db44STomer Tayar /* Dump reset registers (dumped before taking blocks out of reset ) */ 3569c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) 3570c965db44STomer Tayar offset += qed_grc_dump_reset_regs(p_hwfn, 3571c965db44STomer Tayar p_ptt, 3572c965db44STomer Tayar dump_buf + offset, dump); 3573c965db44STomer Tayar 3574c965db44STomer Tayar /* Take all blocks out of reset (using reset registers) */ 3575c965db44STomer Tayar if (dump) { 35762d22bc83SMichal Kalderon qed_grc_unreset_blocks(p_hwfn, p_ptt, false); 3577c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 3578c965db44STomer Tayar } 3579c965db44STomer Tayar 3580c965db44STomer Tayar /* Disable all parities using MFW command */ 35817b6859fbSMintz, Yuval if (dump && 35827b6859fbSMintz, Yuval !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) { 3583c965db44STomer Tayar parities_masked = !qed_mcp_mask_parities(p_hwfn, p_ptt, 1); 3584c965db44STomer Tayar if (!parities_masked) { 3585be086e7cSMintz, Yuval DP_NOTICE(p_hwfn, 3586be086e7cSMintz, Yuval "Failed to mask parities using MFW\n"); 3587c965db44STomer Tayar if (qed_grc_get_param 3588c965db44STomer Tayar (p_hwfn, DBG_GRC_PARAM_PARITY_SAFE)) 3589c965db44STomer Tayar return DBG_STATUS_MCP_COULD_NOT_MASK_PRTY; 3590c965db44STomer Tayar } 3591c965db44STomer Tayar } 3592c965db44STomer Tayar 3593c965db44STomer Tayar /* Dump modified registers (dumped before modifying them) */ 3594c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) 3595c965db44STomer Tayar offset += qed_grc_dump_modified_regs(p_hwfn, 3596c965db44STomer Tayar p_ptt, 3597c965db44STomer Tayar dump_buf + offset, dump); 3598c965db44STomer Tayar 3599c965db44STomer Tayar /* Stall storms */ 3600c965db44STomer Tayar if (dump && 3601c965db44STomer Tayar (qed_grc_is_included(p_hwfn, 3602c965db44STomer Tayar DBG_GRC_PARAM_DUMP_IOR) || 3603c965db44STomer Tayar qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC))) 3604c965db44STomer Tayar qed_grc_stall_storms(p_hwfn, p_ptt, true); 3605c965db44STomer Tayar 3606c965db44STomer Tayar /* Dump all regs */ 3607c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) { 3608c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID]; 3609c965db44STomer Tayar 36107b6859fbSMintz, Yuval /* Dump all blocks except MCP */ 3611c965db44STomer Tayar for (i = 0; i < MAX_BLOCK_ID; i++) 3612c965db44STomer Tayar block_enable[i] = true; 3613c965db44STomer Tayar block_enable[BLOCK_MCP] = false; 3614c965db44STomer Tayar offset += qed_grc_dump_registers(p_hwfn, 3615c965db44STomer Tayar p_ptt, 3616c965db44STomer Tayar dump_buf + 3617c965db44STomer Tayar offset, 3618c965db44STomer Tayar dump, 36192d22bc83SMichal Kalderon block_enable, NULL); 3620be086e7cSMintz, Yuval 3621be086e7cSMintz, Yuval /* Dump special registers */ 3622be086e7cSMintz, Yuval offset += qed_grc_dump_special_regs(p_hwfn, 3623be086e7cSMintz, Yuval p_ptt, 3624be086e7cSMintz, Yuval dump_buf + offset, dump); 3625c965db44STomer Tayar } 3626c965db44STomer Tayar 3627c965db44STomer Tayar /* Dump memories */ 3628c965db44STomer Tayar offset += qed_grc_dump_memories(p_hwfn, p_ptt, dump_buf + offset, dump); 3629c965db44STomer Tayar 3630c965db44STomer Tayar /* Dump MCP */ 3631c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP)) 3632c965db44STomer Tayar offset += qed_grc_dump_mcp(p_hwfn, 3633c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3634c965db44STomer Tayar 3635c965db44STomer Tayar /* Dump context */ 3636c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX)) 3637c965db44STomer Tayar offset += qed_grc_dump_ctx(p_hwfn, 3638c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3639c965db44STomer Tayar 3640c965db44STomer Tayar /* Dump RSS memories */ 3641c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RSS)) 3642c965db44STomer Tayar offset += qed_grc_dump_rss(p_hwfn, 3643c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3644c965db44STomer Tayar 3645c965db44STomer Tayar /* Dump Big RAM */ 3646c965db44STomer Tayar for (i = 0; i < NUM_BIG_RAM_TYPES; i++) 3647c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, s_big_ram_defs[i].grc_param)) 3648c965db44STomer Tayar offset += qed_grc_dump_big_ram(p_hwfn, 3649c965db44STomer Tayar p_ptt, 3650c965db44STomer Tayar dump_buf + offset, 3651c965db44STomer Tayar dump, i); 3652c965db44STomer Tayar 3653c965db44STomer Tayar /* Dump VFC */ 36542d22bc83SMichal Kalderon if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)) { 36552d22bc83SMichal Kalderon dwords_read = qed_grc_dump_vfc(p_hwfn, 3656c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 36572d22bc83SMichal Kalderon offset += dwords_read; 36582d22bc83SMichal Kalderon if (!dwords_read) 36592d22bc83SMichal Kalderon return DBG_STATUS_VFC_READ_ERROR; 36602d22bc83SMichal Kalderon } 3661c965db44STomer Tayar 3662c965db44STomer Tayar /* Dump PHY tbus */ 3663c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, 3664c965db44STomer Tayar DBG_GRC_PARAM_DUMP_PHY) && dev_data->chip_id == 36652d22bc83SMichal Kalderon CHIP_K2 && dev_data->hw_type == HW_TYPE_ASIC) 3666c965db44STomer Tayar offset += qed_grc_dump_phy(p_hwfn, 3667c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3668c965db44STomer Tayar 36692d22bc83SMichal Kalderon /* Dump MCP HW Dump */ 36702d22bc83SMichal Kalderon if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP_HW_DUMP) && 36712d22bc83SMichal Kalderon !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP) && 1) 36722d22bc83SMichal Kalderon offset += qed_grc_dump_mcp_hw_dump(p_hwfn, 36732d22bc83SMichal Kalderon p_ptt, 36742d22bc83SMichal Kalderon dump_buf + offset, dump); 36752d22bc83SMichal Kalderon 3676d52c89f1SMichal Kalderon /* Dump static debug data (only if not during debug bus recording) */ 3677c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, 3678c965db44STomer Tayar DBG_GRC_PARAM_DUMP_STATIC) && 3679d52c89f1SMichal Kalderon (!dump || dev_data->bus.state == DBG_BUS_STATE_IDLE)) 3680c965db44STomer Tayar offset += qed_grc_dump_static_debug(p_hwfn, 3681c965db44STomer Tayar p_ptt, 3682c965db44STomer Tayar dump_buf + offset, dump); 3683c965db44STomer Tayar 3684c965db44STomer Tayar /* Dump last section */ 3685da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 36867b6859fbSMintz, Yuval 3687c965db44STomer Tayar if (dump) { 3688c965db44STomer Tayar /* Unstall storms */ 3689c965db44STomer Tayar if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_UNSTALL)) 3690c965db44STomer Tayar qed_grc_stall_storms(p_hwfn, p_ptt, false); 3691c965db44STomer Tayar 3692c965db44STomer Tayar /* Clear parity status */ 3693c965db44STomer Tayar qed_grc_clear_all_prty(p_hwfn, p_ptt); 3694c965db44STomer Tayar 3695c965db44STomer Tayar /* Enable all parities using MFW command */ 3696c965db44STomer Tayar if (parities_masked) 3697c965db44STomer Tayar qed_mcp_mask_parities(p_hwfn, p_ptt, 0); 3698c965db44STomer Tayar } 3699c965db44STomer Tayar 3700c965db44STomer Tayar *num_dumped_dwords = offset; 3701c965db44STomer Tayar 3702c965db44STomer Tayar return DBG_STATUS_OK; 3703c965db44STomer Tayar } 3704c965db44STomer Tayar 3705c965db44STomer Tayar /* Writes the specified failing Idle Check rule to the specified buffer. 3706c965db44STomer Tayar * Returns the dumped size in dwords. 3707c965db44STomer Tayar */ 3708c965db44STomer Tayar static u32 qed_idle_chk_dump_failure(struct qed_hwfn *p_hwfn, 3709c965db44STomer Tayar struct qed_ptt *p_ptt, 37106c95dd8fSPrabhakar Kushwaha u32 *dump_buf, 3711c965db44STomer Tayar bool dump, 3712c965db44STomer Tayar u16 rule_id, 3713c965db44STomer Tayar const struct dbg_idle_chk_rule *rule, 3714c965db44STomer Tayar u16 fail_entry_id, u32 *cond_reg_values) 3715c965db44STomer Tayar { 3716c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 37177b6859fbSMintz, Yuval const struct dbg_idle_chk_cond_reg *cond_regs; 37187b6859fbSMintz, Yuval const struct dbg_idle_chk_info_reg *info_regs; 37197b6859fbSMintz, Yuval u32 i, next_reg_offset = 0, offset = 0; 37207b6859fbSMintz, Yuval struct dbg_idle_chk_result_hdr *hdr; 37217b6859fbSMintz, Yuval const union dbg_idle_chk_reg *regs; 3722c965db44STomer Tayar u8 reg_id; 3723c965db44STomer Tayar 37247b6859fbSMintz, Yuval hdr = (struct dbg_idle_chk_result_hdr *)dump_buf; 37252d22bc83SMichal Kalderon regs = (const union dbg_idle_chk_reg *) 37262d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr + 37272d22bc83SMichal Kalderon rule->reg_offset; 37287b6859fbSMintz, Yuval cond_regs = ®s[0].cond_reg; 37297b6859fbSMintz, Yuval info_regs = ®s[rule->num_cond_regs].info_reg; 37307b6859fbSMintz, Yuval 3731c965db44STomer Tayar /* Dump rule data */ 3732c965db44STomer Tayar if (dump) { 3733c965db44STomer Tayar memset(hdr, 0, sizeof(*hdr)); 3734c965db44STomer Tayar hdr->rule_id = rule_id; 3735c965db44STomer Tayar hdr->mem_entry_id = fail_entry_id; 3736c965db44STomer Tayar hdr->severity = rule->severity; 3737c965db44STomer Tayar hdr->num_dumped_cond_regs = rule->num_cond_regs; 3738c965db44STomer Tayar } 3739c965db44STomer Tayar 3740c965db44STomer Tayar offset += IDLE_CHK_RESULT_HDR_DWORDS; 3741c965db44STomer Tayar 3742c965db44STomer Tayar /* Dump condition register values */ 3743c965db44STomer Tayar for (reg_id = 0; reg_id < rule->num_cond_regs; reg_id++) { 3744c965db44STomer Tayar const struct dbg_idle_chk_cond_reg *reg = &cond_regs[reg_id]; 37457b6859fbSMintz, Yuval struct dbg_idle_chk_result_reg_hdr *reg_hdr; 37467b6859fbSMintz, Yuval 37472d22bc83SMichal Kalderon reg_hdr = 37482d22bc83SMichal Kalderon (struct dbg_idle_chk_result_reg_hdr *)(dump_buf + offset); 3749c965db44STomer Tayar 3750c965db44STomer Tayar /* Write register header */ 37517b6859fbSMintz, Yuval if (!dump) { 37527b6859fbSMintz, Yuval offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + 37537b6859fbSMintz, Yuval reg->entry_size; 37547b6859fbSMintz, Yuval continue; 37557b6859fbSMintz, Yuval } 37567b6859fbSMintz, Yuval 3757c965db44STomer Tayar offset += IDLE_CHK_RESULT_REG_HDR_DWORDS; 37587b6859fbSMintz, Yuval memset(reg_hdr, 0, sizeof(*reg_hdr)); 3759c965db44STomer Tayar reg_hdr->start_entry = reg->start_entry; 3760c965db44STomer Tayar reg_hdr->size = reg->entry_size; 3761c965db44STomer Tayar SET_FIELD(reg_hdr->data, 3762c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM, 37637b6859fbSMintz, Yuval reg->num_entries > 1 || reg->start_entry > 0 ? 1 : 0); 3764c965db44STomer Tayar SET_FIELD(reg_hdr->data, 3765c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, reg_id); 3766c965db44STomer Tayar 3767c965db44STomer Tayar /* Write register values */ 37687b6859fbSMintz, Yuval for (i = 0; i < reg_hdr->size; i++, next_reg_offset++, offset++) 37697b6859fbSMintz, Yuval dump_buf[offset] = cond_reg_values[next_reg_offset]; 3770c965db44STomer Tayar } 3771c965db44STomer Tayar 3772c965db44STomer Tayar /* Dump info register values */ 3773c965db44STomer Tayar for (reg_id = 0; reg_id < rule->num_info_regs; reg_id++) { 3774c965db44STomer Tayar const struct dbg_idle_chk_info_reg *reg = &info_regs[reg_id]; 3775c965db44STomer Tayar u32 block_id; 3776c965db44STomer Tayar 37777b6859fbSMintz, Yuval /* Check if register's block is in reset */ 3778c965db44STomer Tayar if (!dump) { 3779c965db44STomer Tayar offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + reg->size; 3780c965db44STomer Tayar continue; 3781c965db44STomer Tayar } 3782c965db44STomer Tayar 3783c965db44STomer Tayar block_id = GET_FIELD(reg->data, DBG_IDLE_CHK_INFO_REG_BLOCK_ID); 3784c965db44STomer Tayar if (block_id >= MAX_BLOCK_ID) { 3785c965db44STomer Tayar DP_NOTICE(p_hwfn, "Invalid block_id\n"); 3786c965db44STomer Tayar return 0; 3787c965db44STomer Tayar } 3788c965db44STomer Tayar 3789c965db44STomer Tayar if (!dev_data->block_in_reset[block_id]) { 37907b6859fbSMintz, Yuval struct dbg_idle_chk_result_reg_hdr *reg_hdr; 37917b6859fbSMintz, Yuval bool wide_bus, eval_mode, mode_match = true; 37927b6859fbSMintz, Yuval u16 modes_buf_offset; 37937b6859fbSMintz, Yuval u32 addr; 37947b6859fbSMintz, Yuval 37957b6859fbSMintz, Yuval reg_hdr = (struct dbg_idle_chk_result_reg_hdr *) 37967b6859fbSMintz, Yuval (dump_buf + offset); 3797c965db44STomer Tayar 3798c965db44STomer Tayar /* Check mode */ 37997b6859fbSMintz, Yuval eval_mode = GET_FIELD(reg->mode.data, 38007b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 3801c965db44STomer Tayar if (eval_mode) { 38027b6859fbSMintz, Yuval modes_buf_offset = 3803c965db44STomer Tayar GET_FIELD(reg->mode.data, 3804c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 3805c965db44STomer Tayar mode_match = 3806c965db44STomer Tayar qed_is_mode_match(p_hwfn, 3807c965db44STomer Tayar &modes_buf_offset); 3808c965db44STomer Tayar } 3809c965db44STomer Tayar 38107b6859fbSMintz, Yuval if (!mode_match) 38117b6859fbSMintz, Yuval continue; 38127b6859fbSMintz, Yuval 38137b6859fbSMintz, Yuval addr = GET_FIELD(reg->data, 3814be086e7cSMintz, Yuval DBG_IDLE_CHK_INFO_REG_ADDRESS); 38157b6859fbSMintz, Yuval wide_bus = GET_FIELD(reg->data, 38167b6859fbSMintz, Yuval DBG_IDLE_CHK_INFO_REG_WIDE_BUS); 3817c965db44STomer Tayar 3818c965db44STomer Tayar /* Write register header */ 3819c965db44STomer Tayar offset += IDLE_CHK_RESULT_REG_HDR_DWORDS; 3820c965db44STomer Tayar hdr->num_dumped_info_regs++; 3821c965db44STomer Tayar memset(reg_hdr, 0, sizeof(*reg_hdr)); 3822c965db44STomer Tayar reg_hdr->size = reg->size; 3823c965db44STomer Tayar SET_FIELD(reg_hdr->data, 3824c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, 3825c965db44STomer Tayar rule->num_cond_regs + reg_id); 3826c965db44STomer Tayar 3827c965db44STomer Tayar /* Write register values */ 38287b6859fbSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3829be086e7cSMintz, Yuval p_ptt, 3830be086e7cSMintz, Yuval dump_buf + offset, 3831be086e7cSMintz, Yuval dump, 3832be086e7cSMintz, Yuval addr, 3833d52c89f1SMichal Kalderon reg->size, wide_bus, 3834d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 3835c965db44STomer Tayar } 3836c965db44STomer Tayar } 3837c965db44STomer Tayar 3838c965db44STomer Tayar return offset; 3839c965db44STomer Tayar } 3840c965db44STomer Tayar 3841c965db44STomer Tayar /* Dumps idle check rule entries. Returns the dumped size in dwords. */ 3842c965db44STomer Tayar static u32 3843c965db44STomer Tayar qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 3844c965db44STomer Tayar u32 *dump_buf, bool dump, 3845c965db44STomer Tayar const struct dbg_idle_chk_rule *input_rules, 3846c965db44STomer Tayar u32 num_input_rules, u32 *num_failing_rules) 3847c965db44STomer Tayar { 3848c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 3849c965db44STomer Tayar u32 cond_reg_values[IDLE_CHK_MAX_ENTRIES_SIZE]; 3850be086e7cSMintz, Yuval u32 i, offset = 0; 3851c965db44STomer Tayar u16 entry_id; 3852c965db44STomer Tayar u8 reg_id; 3853c965db44STomer Tayar 3854c965db44STomer Tayar *num_failing_rules = 0; 38557b6859fbSMintz, Yuval 3856c965db44STomer Tayar for (i = 0; i < num_input_rules; i++) { 3857c965db44STomer Tayar const struct dbg_idle_chk_cond_reg *cond_regs; 3858c965db44STomer Tayar const struct dbg_idle_chk_rule *rule; 3859c965db44STomer Tayar const union dbg_idle_chk_reg *regs; 3860c965db44STomer Tayar u16 num_reg_entries = 1; 3861c965db44STomer Tayar bool check_rule = true; 3862c965db44STomer Tayar const u32 *imm_values; 3863c965db44STomer Tayar 3864c965db44STomer Tayar rule = &input_rules[i]; 38652d22bc83SMichal Kalderon regs = (const union dbg_idle_chk_reg *) 38662d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr + 38672d22bc83SMichal Kalderon rule->reg_offset; 3868c965db44STomer Tayar cond_regs = ®s[0].cond_reg; 38692d22bc83SMichal Kalderon imm_values = 38702d22bc83SMichal Kalderon (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr + 38712d22bc83SMichal Kalderon rule->imm_offset; 3872c965db44STomer Tayar 3873c965db44STomer Tayar /* Check if all condition register blocks are out of reset, and 3874c965db44STomer Tayar * find maximal number of entries (all condition registers that 3875c965db44STomer Tayar * are memories must have the same size, which is > 1). 3876c965db44STomer Tayar */ 3877c965db44STomer Tayar for (reg_id = 0; reg_id < rule->num_cond_regs && check_rule; 3878c965db44STomer Tayar reg_id++) { 38797b6859fbSMintz, Yuval u32 block_id = 38807b6859fbSMintz, Yuval GET_FIELD(cond_regs[reg_id].data, 3881c965db44STomer Tayar DBG_IDLE_CHK_COND_REG_BLOCK_ID); 3882c965db44STomer Tayar 3883c965db44STomer Tayar if (block_id >= MAX_BLOCK_ID) { 3884c965db44STomer Tayar DP_NOTICE(p_hwfn, "Invalid block_id\n"); 3885c965db44STomer Tayar return 0; 3886c965db44STomer Tayar } 3887c965db44STomer Tayar 3888c965db44STomer Tayar check_rule = !dev_data->block_in_reset[block_id]; 3889c965db44STomer Tayar if (cond_regs[reg_id].num_entries > num_reg_entries) 3890c965db44STomer Tayar num_reg_entries = cond_regs[reg_id].num_entries; 3891c965db44STomer Tayar } 3892c965db44STomer Tayar 3893c965db44STomer Tayar if (!check_rule && dump) 3894c965db44STomer Tayar continue; 3895c965db44STomer Tayar 3896be086e7cSMintz, Yuval if (!dump) { 3897da090917STomer Tayar u32 entry_dump_size = 3898da090917STomer Tayar qed_idle_chk_dump_failure(p_hwfn, 3899be086e7cSMintz, Yuval p_ptt, 3900be086e7cSMintz, Yuval dump_buf + offset, 3901be086e7cSMintz, Yuval false, 3902be086e7cSMintz, Yuval rule->rule_id, 3903be086e7cSMintz, Yuval rule, 3904da090917STomer Tayar 0, 3905be086e7cSMintz, Yuval NULL); 3906da090917STomer Tayar 3907da090917STomer Tayar offset += num_reg_entries * entry_dump_size; 3908da090917STomer Tayar (*num_failing_rules) += num_reg_entries; 3909da090917STomer Tayar continue; 3910be086e7cSMintz, Yuval } 3911be086e7cSMintz, Yuval 3912da090917STomer Tayar /* Go over all register entries (number of entries is the same 3913da090917STomer Tayar * for all condition registers). 3914da090917STomer Tayar */ 3915da090917STomer Tayar for (entry_id = 0; entry_id < num_reg_entries; entry_id++) { 3916da090917STomer Tayar u32 next_reg_offset = 0; 3917da090917STomer Tayar 3918c965db44STomer Tayar /* Read current entry of all condition registers */ 3919be086e7cSMintz, Yuval for (reg_id = 0; reg_id < rule->num_cond_regs; 3920c965db44STomer Tayar reg_id++) { 3921be086e7cSMintz, Yuval const struct dbg_idle_chk_cond_reg *reg = 3922be086e7cSMintz, Yuval &cond_regs[reg_id]; 39237b6859fbSMintz, Yuval u32 padded_entry_size, addr; 39247b6859fbSMintz, Yuval bool wide_bus; 3925c965db44STomer Tayar 3926be086e7cSMintz, Yuval /* Find GRC address (if it's a memory, the 3927be086e7cSMintz, Yuval * address of the specific entry is calculated). 3928c965db44STomer Tayar */ 39297b6859fbSMintz, Yuval addr = GET_FIELD(reg->data, 3930be086e7cSMintz, Yuval DBG_IDLE_CHK_COND_REG_ADDRESS); 39317b6859fbSMintz, Yuval wide_bus = 39327b6859fbSMintz, Yuval GET_FIELD(reg->data, 39337b6859fbSMintz, Yuval DBG_IDLE_CHK_COND_REG_WIDE_BUS); 3934c965db44STomer Tayar if (reg->num_entries > 1 || 3935c965db44STomer Tayar reg->start_entry > 0) { 39367b6859fbSMintz, Yuval padded_entry_size = 3937c965db44STomer Tayar reg->entry_size > 1 ? 3938da090917STomer Tayar roundup_pow_of_two(reg->entry_size) : 3939da090917STomer Tayar 1; 3940be086e7cSMintz, Yuval addr += (reg->start_entry + entry_id) * 3941be086e7cSMintz, Yuval padded_entry_size; 3942c965db44STomer Tayar } 3943c965db44STomer Tayar 3944c965db44STomer Tayar /* Read registers */ 3945c965db44STomer Tayar if (next_reg_offset + reg->entry_size >= 3946c965db44STomer Tayar IDLE_CHK_MAX_ENTRIES_SIZE) { 3947c965db44STomer Tayar DP_NOTICE(p_hwfn, 3948c965db44STomer Tayar "idle check registers entry is too large\n"); 3949c965db44STomer Tayar return 0; 3950c965db44STomer Tayar } 3951c965db44STomer Tayar 3952be086e7cSMintz, Yuval next_reg_offset += 39537b6859fbSMintz, Yuval qed_grc_dump_addr_range(p_hwfn, p_ptt, 3954be086e7cSMintz, Yuval cond_reg_values + 3955be086e7cSMintz, Yuval next_reg_offset, 3956be086e7cSMintz, Yuval dump, addr, 39577b6859fbSMintz, Yuval reg->entry_size, 3958d52c89f1SMichal Kalderon wide_bus, 3959d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 3960c965db44STomer Tayar } 3961c965db44STomer Tayar 39627b6859fbSMintz, Yuval /* Call rule condition function. 39637b6859fbSMintz, Yuval * If returns true, it's a failure. 3964c965db44STomer Tayar */ 3965c965db44STomer Tayar if ((*cond_arr[rule->cond_id]) (cond_reg_values, 3966be086e7cSMintz, Yuval imm_values)) { 39677b6859fbSMintz, Yuval offset += qed_idle_chk_dump_failure(p_hwfn, 3968c965db44STomer Tayar p_ptt, 3969c965db44STomer Tayar dump_buf + offset, 3970c965db44STomer Tayar dump, 3971c965db44STomer Tayar rule->rule_id, 3972c965db44STomer Tayar rule, 3973c965db44STomer Tayar entry_id, 3974c965db44STomer Tayar cond_reg_values); 3975c965db44STomer Tayar (*num_failing_rules)++; 3976c965db44STomer Tayar } 3977c965db44STomer Tayar } 3978c965db44STomer Tayar } 3979c965db44STomer Tayar 3980c965db44STomer Tayar return offset; 3981c965db44STomer Tayar } 3982c965db44STomer Tayar 3983c965db44STomer Tayar /* Performs Idle Check Dump to the specified buffer. 3984c965db44STomer Tayar * Returns the dumped size in dwords. 3985c965db44STomer Tayar */ 3986c965db44STomer Tayar static u32 qed_idle_chk_dump(struct qed_hwfn *p_hwfn, 3987c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3988c965db44STomer Tayar { 39892d22bc83SMichal Kalderon struct virt_mem_desc *dbg_buf = 39902d22bc83SMichal Kalderon &p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES]; 39912d22bc83SMichal Kalderon u32 num_failing_rules_offset, offset = 0, 39922d22bc83SMichal Kalderon input_offset = 0, num_failing_rules = 0; 3993c965db44STomer Tayar 39942d22bc83SMichal Kalderon /* Dump global params - 1 must match below amount of params */ 3995c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 3996c965db44STomer Tayar p_ptt, 3997c965db44STomer Tayar dump_buf + offset, dump, 1); 3998c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 3999c965db44STomer Tayar dump, "dump-type", "idle-chk"); 4000c965db44STomer Tayar 4001c965db44STomer Tayar /* Dump idle check section header with a single parameter */ 4002c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, dump, "idle_chk", 1); 4003c965db44STomer Tayar num_failing_rules_offset = offset; 4004c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "num_rules", 0); 40057b6859fbSMintz, Yuval 40062d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) { 4007c965db44STomer Tayar const struct dbg_idle_chk_cond_hdr *cond_hdr = 40082d22bc83SMichal Kalderon (const struct dbg_idle_chk_cond_hdr *)dbg_buf->ptr + 40092d22bc83SMichal Kalderon input_offset++; 40107b6859fbSMintz, Yuval bool eval_mode, mode_match = true; 40117b6859fbSMintz, Yuval u32 curr_failing_rules; 40127b6859fbSMintz, Yuval u16 modes_buf_offset; 4013c965db44STomer Tayar 4014c965db44STomer Tayar /* Check mode */ 40157b6859fbSMintz, Yuval eval_mode = GET_FIELD(cond_hdr->mode.data, 40167b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 4017c965db44STomer Tayar if (eval_mode) { 40187b6859fbSMintz, Yuval modes_buf_offset = 4019c965db44STomer Tayar GET_FIELD(cond_hdr->mode.data, 4020c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 4021c965db44STomer Tayar mode_match = qed_is_mode_match(p_hwfn, 4022c965db44STomer Tayar &modes_buf_offset); 4023c965db44STomer Tayar } 4024c965db44STomer Tayar 4025c965db44STomer Tayar if (mode_match) { 40262d22bc83SMichal Kalderon const struct dbg_idle_chk_rule *rule = 40272d22bc83SMichal Kalderon (const struct dbg_idle_chk_rule *)((u32 *) 40282d22bc83SMichal Kalderon dbg_buf->ptr 40292d22bc83SMichal Kalderon + input_offset); 40302d22bc83SMichal Kalderon u32 num_input_rules = 40312d22bc83SMichal Kalderon cond_hdr->data_size / IDLE_CHK_RULE_SIZE_DWORDS; 4032c965db44STomer Tayar offset += 4033c965db44STomer Tayar qed_idle_chk_dump_rule_entries(p_hwfn, 4034c965db44STomer Tayar p_ptt, 40352d22bc83SMichal Kalderon dump_buf + 40362d22bc83SMichal Kalderon offset, 4037c965db44STomer Tayar dump, 40382d22bc83SMichal Kalderon rule, 40392d22bc83SMichal Kalderon num_input_rules, 4040c965db44STomer Tayar &curr_failing_rules); 4041c965db44STomer Tayar num_failing_rules += curr_failing_rules; 4042c965db44STomer Tayar } 4043c965db44STomer Tayar 4044c965db44STomer Tayar input_offset += cond_hdr->data_size; 4045c965db44STomer Tayar } 4046c965db44STomer Tayar 4047c965db44STomer Tayar /* Overwrite num_rules parameter */ 4048c965db44STomer Tayar if (dump) 4049c965db44STomer Tayar qed_dump_num_param(dump_buf + num_failing_rules_offset, 4050c965db44STomer Tayar dump, "num_rules", num_failing_rules); 4051c965db44STomer Tayar 40527b6859fbSMintz, Yuval /* Dump last section */ 4053da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 40547b6859fbSMintz, Yuval 4055c965db44STomer Tayar return offset; 4056c965db44STomer Tayar } 4057c965db44STomer Tayar 4058c965db44STomer Tayar /* Get info on the MCP Trace data in the scratchpad: 40597b6859fbSMintz, Yuval * - trace_data_grc_addr (OUT): trace data GRC address in bytes 40607b6859fbSMintz, Yuval * - trace_data_size (OUT): trace data size in bytes (without the header) 4061c965db44STomer Tayar */ 4062c965db44STomer Tayar static enum dbg_status qed_mcp_trace_get_data_info(struct qed_hwfn *p_hwfn, 4063c965db44STomer Tayar struct qed_ptt *p_ptt, 4064c965db44STomer Tayar u32 *trace_data_grc_addr, 40657b6859fbSMintz, Yuval u32 *trace_data_size) 4066c965db44STomer Tayar { 40677b6859fbSMintz, Yuval u32 spad_trace_offsize, signature; 4068c965db44STomer Tayar 40697b6859fbSMintz, Yuval /* Read trace section offsize structure from MCP scratchpad */ 40707b6859fbSMintz, Yuval spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR); 40717b6859fbSMintz, Yuval 40727b6859fbSMintz, Yuval /* Extract trace section address from offsize (in scratchpad) */ 4073c965db44STomer Tayar *trace_data_grc_addr = 4074c965db44STomer Tayar MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize); 4075c965db44STomer Tayar 4076c965db44STomer Tayar /* Read signature from MCP trace section */ 4077c965db44STomer Tayar signature = qed_rd(p_hwfn, p_ptt, 4078c965db44STomer Tayar *trace_data_grc_addr + 4079c965db44STomer Tayar offsetof(struct mcp_trace, signature)); 40807b6859fbSMintz, Yuval 4081c965db44STomer Tayar if (signature != MFW_TRACE_SIGNATURE) 4082c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 4083c965db44STomer Tayar 4084c965db44STomer Tayar /* Read trace size from MCP trace section */ 40857b6859fbSMintz, Yuval *trace_data_size = qed_rd(p_hwfn, 4086c965db44STomer Tayar p_ptt, 4087c965db44STomer Tayar *trace_data_grc_addr + 4088c965db44STomer Tayar offsetof(struct mcp_trace, size)); 40897b6859fbSMintz, Yuval 4090c965db44STomer Tayar return DBG_STATUS_OK; 4091c965db44STomer Tayar } 4092c965db44STomer Tayar 40937b6859fbSMintz, Yuval /* Reads MCP trace meta data image from NVRAM 40947b6859fbSMintz, Yuval * - running_bundle_id (OUT): running bundle ID (invalid when loaded from file) 40957b6859fbSMintz, Yuval * - trace_meta_offset (OUT): trace meta offset in NVRAM in bytes (invalid when 40967b6859fbSMintz, Yuval * loaded from file). 40977b6859fbSMintz, Yuval * - trace_meta_size (OUT): size in bytes of the trace meta data. 4098c965db44STomer Tayar */ 4099c965db44STomer Tayar static enum dbg_status qed_mcp_trace_get_meta_info(struct qed_hwfn *p_hwfn, 4100c965db44STomer Tayar struct qed_ptt *p_ptt, 4101c965db44STomer Tayar u32 trace_data_size_bytes, 4102c965db44STomer Tayar u32 *running_bundle_id, 41037b6859fbSMintz, Yuval u32 *trace_meta_offset, 41047b6859fbSMintz, Yuval u32 *trace_meta_size) 4105c965db44STomer Tayar { 41067b6859fbSMintz, Yuval u32 spad_trace_offsize, nvram_image_type, running_mfw_addr; 41077b6859fbSMintz, Yuval 4108c965db44STomer Tayar /* Read MCP trace section offsize structure from MCP scratchpad */ 41097b6859fbSMintz, Yuval spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR); 4110c965db44STomer Tayar 4111c965db44STomer Tayar /* Find running bundle ID */ 41127b6859fbSMintz, Yuval running_mfw_addr = 4113c965db44STomer Tayar MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize) + 4114c965db44STomer Tayar QED_SECTION_SIZE(spad_trace_offsize) + trace_data_size_bytes; 4115c965db44STomer Tayar *running_bundle_id = qed_rd(p_hwfn, p_ptt, running_mfw_addr); 4116c965db44STomer Tayar if (*running_bundle_id > 1) 4117c965db44STomer Tayar return DBG_STATUS_INVALID_NVRAM_BUNDLE; 4118c965db44STomer Tayar 4119c965db44STomer Tayar /* Find image in NVRAM */ 4120c965db44STomer Tayar nvram_image_type = 4121c965db44STomer Tayar (*running_bundle_id == 4122c965db44STomer Tayar DIR_ID_1) ? NVM_TYPE_MFW_TRACE1 : NVM_TYPE_MFW_TRACE2; 4123be086e7cSMintz, Yuval return qed_find_nvram_image(p_hwfn, 4124c965db44STomer Tayar p_ptt, 4125c965db44STomer Tayar nvram_image_type, 41267b6859fbSMintz, Yuval trace_meta_offset, trace_meta_size); 4127c965db44STomer Tayar } 4128c965db44STomer Tayar 41297b6859fbSMintz, Yuval /* Reads the MCP Trace meta data from NVRAM into the specified buffer */ 4130c965db44STomer Tayar static enum dbg_status qed_mcp_trace_read_meta(struct qed_hwfn *p_hwfn, 4131c965db44STomer Tayar struct qed_ptt *p_ptt, 4132c965db44STomer Tayar u32 nvram_offset_in_bytes, 4133c965db44STomer Tayar u32 size_in_bytes, u32 *buf) 4134c965db44STomer Tayar { 41357b6859fbSMintz, Yuval u8 modules_num, module_len, i, *byte_buf = (u8 *)buf; 41367b6859fbSMintz, Yuval enum dbg_status status; 4137c965db44STomer Tayar u32 signature; 4138c965db44STomer Tayar 4139c965db44STomer Tayar /* Read meta data from NVRAM */ 41407b6859fbSMintz, Yuval status = qed_nvram_read(p_hwfn, 4141c965db44STomer Tayar p_ptt, 41427b6859fbSMintz, Yuval nvram_offset_in_bytes, size_in_bytes, buf); 4143c965db44STomer Tayar if (status != DBG_STATUS_OK) 4144c965db44STomer Tayar return status; 4145c965db44STomer Tayar 4146c965db44STomer Tayar /* Extract and check first signature */ 4147c965db44STomer Tayar signature = qed_read_unaligned_dword(byte_buf); 41487b6859fbSMintz, Yuval byte_buf += sizeof(signature); 41497b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 4150c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 4151c965db44STomer Tayar 4152c965db44STomer Tayar /* Extract number of modules */ 4153c965db44STomer Tayar modules_num = *(byte_buf++); 4154c965db44STomer Tayar 4155c965db44STomer Tayar /* Skip all modules */ 4156c965db44STomer Tayar for (i = 0; i < modules_num; i++) { 41577b6859fbSMintz, Yuval module_len = *(byte_buf++); 4158c965db44STomer Tayar byte_buf += module_len; 4159c965db44STomer Tayar } 4160c965db44STomer Tayar 4161c965db44STomer Tayar /* Extract and check second signature */ 4162c965db44STomer Tayar signature = qed_read_unaligned_dword(byte_buf); 41637b6859fbSMintz, Yuval byte_buf += sizeof(signature); 41647b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 4165c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 41667b6859fbSMintz, Yuval 4167c965db44STomer Tayar return DBG_STATUS_OK; 4168c965db44STomer Tayar } 4169c965db44STomer Tayar 4170c965db44STomer Tayar /* Dump MCP Trace */ 41718c93beafSYuval Mintz static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn, 4172c965db44STomer Tayar struct qed_ptt *p_ptt, 4173c965db44STomer Tayar u32 *dump_buf, 4174c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 4175c965db44STomer Tayar { 4176c965db44STomer Tayar u32 trace_data_grc_addr, trace_data_size_bytes, trace_data_size_dwords; 4177be086e7cSMintz, Yuval u32 trace_meta_size_dwords = 0, running_bundle_id, offset = 0; 4178be086e7cSMintz, Yuval u32 trace_meta_offset_bytes = 0, trace_meta_size_bytes = 0; 4179c965db44STomer Tayar enum dbg_status status; 4180c965db44STomer Tayar int halted = 0; 41812d22bc83SMichal Kalderon bool use_mfw; 4182c965db44STomer Tayar 4183c965db44STomer Tayar *num_dumped_dwords = 0; 4184c965db44STomer Tayar 41852d22bc83SMichal Kalderon use_mfw = !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP); 41867b6859fbSMintz, Yuval 4187c965db44STomer Tayar /* Get trace data info */ 4188c965db44STomer Tayar status = qed_mcp_trace_get_data_info(p_hwfn, 4189c965db44STomer Tayar p_ptt, 4190c965db44STomer Tayar &trace_data_grc_addr, 4191c965db44STomer Tayar &trace_data_size_bytes); 4192c965db44STomer Tayar if (status != DBG_STATUS_OK) 4193c965db44STomer Tayar return status; 4194c965db44STomer Tayar 4195c965db44STomer Tayar /* Dump global params */ 4196c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4197c965db44STomer Tayar p_ptt, 4198c965db44STomer Tayar dump_buf + offset, dump, 1); 4199c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4200c965db44STomer Tayar dump, "dump-type", "mcp-trace"); 4201c965db44STomer Tayar 4202c965db44STomer Tayar /* Halt MCP while reading from scratchpad so the read data will be 42037b6859fbSMintz, Yuval * consistent. if halt fails, MCP trace is taken anyway, with a small 4204c965db44STomer Tayar * risk that it may be corrupt. 4205c965db44STomer Tayar */ 42062d22bc83SMichal Kalderon if (dump && use_mfw) { 4207c965db44STomer Tayar halted = !qed_mcp_halt(p_hwfn, p_ptt); 4208c965db44STomer Tayar if (!halted) 4209c965db44STomer Tayar DP_NOTICE(p_hwfn, "MCP halt failed!\n"); 4210c965db44STomer Tayar } 4211c965db44STomer Tayar 4212c965db44STomer Tayar /* Find trace data size */ 4213c965db44STomer Tayar trace_data_size_dwords = 4214c965db44STomer Tayar DIV_ROUND_UP(trace_data_size_bytes + sizeof(struct mcp_trace), 4215c965db44STomer Tayar BYTES_IN_DWORD); 4216c965db44STomer Tayar 4217c965db44STomer Tayar /* Dump trace data section header and param */ 4218c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4219c965db44STomer Tayar dump, "mcp_trace_data", 1); 4220c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 4221c965db44STomer Tayar dump, "size", trace_data_size_dwords); 4222c965db44STomer Tayar 4223c965db44STomer Tayar /* Read trace data from scratchpad into dump buffer */ 4224be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 4225c965db44STomer Tayar p_ptt, 4226be086e7cSMintz, Yuval dump_buf + offset, 4227be086e7cSMintz, Yuval dump, 4228be086e7cSMintz, Yuval BYTES_TO_DWORDS(trace_data_grc_addr), 4229d52c89f1SMichal Kalderon trace_data_size_dwords, false, 4230d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 4231c965db44STomer Tayar 4232c965db44STomer Tayar /* Resume MCP (only if halt succeeded) */ 42337b6859fbSMintz, Yuval if (halted && qed_mcp_resume(p_hwfn, p_ptt)) 4234c965db44STomer Tayar DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n"); 4235c965db44STomer Tayar 4236c965db44STomer Tayar /* Dump trace meta section header */ 4237c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4238c965db44STomer Tayar dump, "mcp_trace_meta", 1); 4239c965db44STomer Tayar 424050bc60cbSMichal Kalderon /* If MCP Trace meta size parameter was set, use it. 424150bc60cbSMichal Kalderon * Otherwise, read trace meta. 424250bc60cbSMichal Kalderon * trace_meta_size_bytes is dword-aligned. 424350bc60cbSMichal Kalderon */ 424450bc60cbSMichal Kalderon trace_meta_size_bytes = 424550bc60cbSMichal Kalderon qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_MCP_TRACE_META_SIZE); 42462d22bc83SMichal Kalderon if ((!trace_meta_size_bytes || dump) && use_mfw) 4247c965db44STomer Tayar status = qed_mcp_trace_get_meta_info(p_hwfn, 4248c965db44STomer Tayar p_ptt, 4249c965db44STomer Tayar trace_data_size_bytes, 4250c965db44STomer Tayar &running_bundle_id, 4251c965db44STomer Tayar &trace_meta_offset_bytes, 4252c965db44STomer Tayar &trace_meta_size_bytes); 4253be086e7cSMintz, Yuval if (status == DBG_STATUS_OK) 42542d22bc83SMichal Kalderon trace_meta_size_dwords = BYTES_TO_DWORDS(trace_meta_size_bytes); 4255c965db44STomer Tayar 4256be086e7cSMintz, Yuval /* Dump trace meta size param */ 4257be086e7cSMintz, Yuval offset += qed_dump_num_param(dump_buf + offset, 4258be086e7cSMintz, Yuval dump, "size", trace_meta_size_dwords); 4259c965db44STomer Tayar 4260c965db44STomer Tayar /* Read trace meta image into dump buffer */ 4261be086e7cSMintz, Yuval if (dump && trace_meta_size_dwords) 4262c965db44STomer Tayar status = qed_mcp_trace_read_meta(p_hwfn, 4263c965db44STomer Tayar p_ptt, 4264c965db44STomer Tayar trace_meta_offset_bytes, 4265c965db44STomer Tayar trace_meta_size_bytes, 4266c965db44STomer Tayar dump_buf + offset); 4267be086e7cSMintz, Yuval if (status == DBG_STATUS_OK) 4268c965db44STomer Tayar offset += trace_meta_size_dwords; 4269c965db44STomer Tayar 42707b6859fbSMintz, Yuval /* Dump last section */ 4271da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 42727b6859fbSMintz, Yuval 4273c965db44STomer Tayar *num_dumped_dwords = offset; 4274c965db44STomer Tayar 4275be086e7cSMintz, Yuval /* If no mcp access, indicate that the dump doesn't contain the meta 4276be086e7cSMintz, Yuval * data from NVRAM. 4277be086e7cSMintz, Yuval */ 42782d22bc83SMichal Kalderon return use_mfw ? status : DBG_STATUS_NVRAM_GET_IMAGE_FAILED; 4279c965db44STomer Tayar } 4280c965db44STomer Tayar 4281c965db44STomer Tayar /* Dump GRC FIFO */ 42828c93beafSYuval Mintz static enum dbg_status qed_reg_fifo_dump(struct qed_hwfn *p_hwfn, 4283c965db44STomer Tayar struct qed_ptt *p_ptt, 4284c965db44STomer Tayar u32 *dump_buf, 4285c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 4286c965db44STomer Tayar { 4287da090917STomer Tayar u32 dwords_read, size_param_offset, offset = 0, addr, len; 4288c965db44STomer Tayar bool fifo_has_data; 4289c965db44STomer Tayar 4290c965db44STomer Tayar *num_dumped_dwords = 0; 4291c965db44STomer Tayar 4292c965db44STomer Tayar /* Dump global params */ 4293c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4294c965db44STomer Tayar p_ptt, 4295c965db44STomer Tayar dump_buf + offset, dump, 1); 4296c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4297c965db44STomer Tayar dump, "dump-type", "reg-fifo"); 4298c965db44STomer Tayar 42997b6859fbSMintz, Yuval /* Dump fifo data section header and param. The size param is 0 for 43007b6859fbSMintz, Yuval * now, and is overwritten after reading the FIFO. 4301c965db44STomer Tayar */ 4302c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4303c965db44STomer Tayar dump, "reg_fifo_data", 1); 4304c965db44STomer Tayar size_param_offset = offset; 4305c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0); 4306c965db44STomer Tayar 4307c965db44STomer Tayar if (!dump) { 4308c965db44STomer Tayar /* FIFO max size is REG_FIFO_DEPTH_DWORDS. There is no way to 4309c965db44STomer Tayar * test how much data is available, except for reading it. 4310c965db44STomer Tayar */ 4311c965db44STomer Tayar offset += REG_FIFO_DEPTH_DWORDS; 43127b6859fbSMintz, Yuval goto out; 4313c965db44STomer Tayar } 4314c965db44STomer Tayar 4315c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4316c965db44STomer Tayar GRC_REG_TRACE_FIFO_VALID_DATA) > 0; 4317c965db44STomer Tayar 4318c965db44STomer Tayar /* Pull available data from fifo. Use DMAE since this is widebus memory 4319c965db44STomer Tayar * and must be accessed atomically. Test for dwords_read not passing 4320c965db44STomer Tayar * buffer size since more entries could be added to the buffer as we are 4321c965db44STomer Tayar * emptying it. 4322c965db44STomer Tayar */ 4323da090917STomer Tayar addr = BYTES_TO_DWORDS(GRC_REG_TRACE_FIFO); 4324da090917STomer Tayar len = REG_FIFO_ELEMENT_DWORDS; 4325c965db44STomer Tayar for (dwords_read = 0; 4326c965db44STomer Tayar fifo_has_data && dwords_read < REG_FIFO_DEPTH_DWORDS; 4327da090917STomer Tayar dwords_read += REG_FIFO_ELEMENT_DWORDS) { 4328da090917STomer Tayar offset += qed_grc_dump_addr_range(p_hwfn, 4329da090917STomer Tayar p_ptt, 4330da090917STomer Tayar dump_buf + offset, 4331da090917STomer Tayar true, 4332da090917STomer Tayar addr, 4333da090917STomer Tayar len, 4334d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 4335d52c89f1SMichal Kalderon 0); 4336c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4337c965db44STomer Tayar GRC_REG_TRACE_FIFO_VALID_DATA) > 0; 4338c965db44STomer Tayar } 4339c965db44STomer Tayar 4340c965db44STomer Tayar qed_dump_num_param(dump_buf + size_param_offset, dump, "size", 4341c965db44STomer Tayar dwords_read); 43427b6859fbSMintz, Yuval out: 43437b6859fbSMintz, Yuval /* Dump last section */ 4344da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 4345c965db44STomer Tayar 4346c965db44STomer Tayar *num_dumped_dwords = offset; 43477b6859fbSMintz, Yuval 4348c965db44STomer Tayar return DBG_STATUS_OK; 4349c965db44STomer Tayar } 4350c965db44STomer Tayar 4351c965db44STomer Tayar /* Dump IGU FIFO */ 43528c93beafSYuval Mintz static enum dbg_status qed_igu_fifo_dump(struct qed_hwfn *p_hwfn, 4353c965db44STomer Tayar struct qed_ptt *p_ptt, 4354c965db44STomer Tayar u32 *dump_buf, 4355c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 4356c965db44STomer Tayar { 4357da090917STomer Tayar u32 dwords_read, size_param_offset, offset = 0, addr, len; 4358c965db44STomer Tayar bool fifo_has_data; 4359c965db44STomer Tayar 4360c965db44STomer Tayar *num_dumped_dwords = 0; 4361c965db44STomer Tayar 4362c965db44STomer Tayar /* Dump global params */ 4363c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4364c965db44STomer Tayar p_ptt, 4365c965db44STomer Tayar dump_buf + offset, dump, 1); 4366c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4367c965db44STomer Tayar dump, "dump-type", "igu-fifo"); 4368c965db44STomer Tayar 43697b6859fbSMintz, Yuval /* Dump fifo data section header and param. The size param is 0 for 43707b6859fbSMintz, Yuval * now, and is overwritten after reading the FIFO. 4371c965db44STomer Tayar */ 4372c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4373c965db44STomer Tayar dump, "igu_fifo_data", 1); 4374c965db44STomer Tayar size_param_offset = offset; 4375c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0); 4376c965db44STomer Tayar 4377c965db44STomer Tayar if (!dump) { 4378c965db44STomer Tayar /* FIFO max size is IGU_FIFO_DEPTH_DWORDS. There is no way to 4379c965db44STomer Tayar * test how much data is available, except for reading it. 4380c965db44STomer Tayar */ 4381c965db44STomer Tayar offset += IGU_FIFO_DEPTH_DWORDS; 43827b6859fbSMintz, Yuval goto out; 4383c965db44STomer Tayar } 4384c965db44STomer Tayar 4385c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4386c965db44STomer Tayar IGU_REG_ERROR_HANDLING_DATA_VALID) > 0; 4387c965db44STomer Tayar 4388c965db44STomer Tayar /* Pull available data from fifo. Use DMAE since this is widebus memory 4389c965db44STomer Tayar * and must be accessed atomically. Test for dwords_read not passing 4390c965db44STomer Tayar * buffer size since more entries could be added to the buffer as we are 4391c965db44STomer Tayar * emptying it. 4392c965db44STomer Tayar */ 4393da090917STomer Tayar addr = BYTES_TO_DWORDS(IGU_REG_ERROR_HANDLING_MEMORY); 4394da090917STomer Tayar len = IGU_FIFO_ELEMENT_DWORDS; 4395c965db44STomer Tayar for (dwords_read = 0; 4396c965db44STomer Tayar fifo_has_data && dwords_read < IGU_FIFO_DEPTH_DWORDS; 4397da090917STomer Tayar dwords_read += IGU_FIFO_ELEMENT_DWORDS) { 4398da090917STomer Tayar offset += qed_grc_dump_addr_range(p_hwfn, 4399da090917STomer Tayar p_ptt, 4400da090917STomer Tayar dump_buf + offset, 4401da090917STomer Tayar true, 4402da090917STomer Tayar addr, 4403da090917STomer Tayar len, 4404d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 4405d52c89f1SMichal Kalderon 0); 4406c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4407c965db44STomer Tayar IGU_REG_ERROR_HANDLING_DATA_VALID) > 0; 4408c965db44STomer Tayar } 4409c965db44STomer Tayar 4410c965db44STomer Tayar qed_dump_num_param(dump_buf + size_param_offset, dump, "size", 4411c965db44STomer Tayar dwords_read); 44127b6859fbSMintz, Yuval out: 44137b6859fbSMintz, Yuval /* Dump last section */ 4414da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 4415c965db44STomer Tayar 4416c965db44STomer Tayar *num_dumped_dwords = offset; 44177b6859fbSMintz, Yuval 4418c965db44STomer Tayar return DBG_STATUS_OK; 4419c965db44STomer Tayar } 4420c965db44STomer Tayar 4421c965db44STomer Tayar /* Protection Override dump */ 44228c93beafSYuval Mintz static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn, 4423c965db44STomer Tayar struct qed_ptt *p_ptt, 4424c965db44STomer Tayar u32 *dump_buf, 44258c93beafSYuval Mintz bool dump, 44268c93beafSYuval Mintz u32 *num_dumped_dwords) 4427c965db44STomer Tayar { 4428da090917STomer Tayar u32 size_param_offset, override_window_dwords, offset = 0, addr; 4429c965db44STomer Tayar 4430c965db44STomer Tayar *num_dumped_dwords = 0; 4431c965db44STomer Tayar 4432c965db44STomer Tayar /* Dump global params */ 4433c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4434c965db44STomer Tayar p_ptt, 4435c965db44STomer Tayar dump_buf + offset, dump, 1); 4436c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4437c965db44STomer Tayar dump, "dump-type", "protection-override"); 4438c965db44STomer Tayar 44397b6859fbSMintz, Yuval /* Dump data section header and param. The size param is 0 for now, 44407b6859fbSMintz, Yuval * and is overwritten after reading the data. 4441c965db44STomer Tayar */ 4442c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4443c965db44STomer Tayar dump, "protection_override_data", 1); 4444c965db44STomer Tayar size_param_offset = offset; 4445c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0); 4446c965db44STomer Tayar 4447c965db44STomer Tayar if (!dump) { 4448c965db44STomer Tayar offset += PROTECTION_OVERRIDE_DEPTH_DWORDS; 44497b6859fbSMintz, Yuval goto out; 4450c965db44STomer Tayar } 4451c965db44STomer Tayar 4452c965db44STomer Tayar /* Add override window info to buffer */ 4453c965db44STomer Tayar override_window_dwords = 4454da090917STomer Tayar qed_rd(p_hwfn, p_ptt, GRC_REG_NUMBER_VALID_OVERRIDE_WINDOW) * 4455c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_DWORDS; 44568a52bbabSMichal Kalderon if (override_window_dwords) { 4457da090917STomer Tayar addr = BYTES_TO_DWORDS(GRC_REG_PROTECTION_OVERRIDE_WINDOW); 4458da090917STomer Tayar offset += qed_grc_dump_addr_range(p_hwfn, 4459da090917STomer Tayar p_ptt, 4460da090917STomer Tayar dump_buf + offset, 4461da090917STomer Tayar true, 4462da090917STomer Tayar addr, 4463da090917STomer Tayar override_window_dwords, 4464d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 0); 4465c965db44STomer Tayar qed_dump_num_param(dump_buf + size_param_offset, dump, "size", 4466c965db44STomer Tayar override_window_dwords); 44678a52bbabSMichal Kalderon } 44687b6859fbSMintz, Yuval out: 44697b6859fbSMintz, Yuval /* Dump last section */ 4470da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 4471c965db44STomer Tayar 4472c965db44STomer Tayar *num_dumped_dwords = offset; 44737b6859fbSMintz, Yuval 4474c965db44STomer Tayar return DBG_STATUS_OK; 4475c965db44STomer Tayar } 4476c965db44STomer Tayar 4477c965db44STomer Tayar /* Performs FW Asserts Dump to the specified buffer. 4478c965db44STomer Tayar * Returns the dumped size in dwords. 4479c965db44STomer Tayar */ 4480c965db44STomer Tayar static u32 qed_fw_asserts_dump(struct qed_hwfn *p_hwfn, 4481c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 4482c965db44STomer Tayar { 4483c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 4484be086e7cSMintz, Yuval struct fw_asserts_ram_section *asserts; 4485c965db44STomer Tayar char storm_letter_str[2] = "?"; 4486c965db44STomer Tayar struct fw_info fw_info; 4487be086e7cSMintz, Yuval u32 offset = 0; 4488c965db44STomer Tayar u8 storm_id; 4489c965db44STomer Tayar 4490c965db44STomer Tayar /* Dump global params */ 4491c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4492c965db44STomer Tayar p_ptt, 4493c965db44STomer Tayar dump_buf + offset, dump, 1); 4494c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4495c965db44STomer Tayar dump, "dump-type", "fw-asserts"); 44967b6859fbSMintz, Yuval 44977b6859fbSMintz, Yuval /* Find Storm dump size */ 4498c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 4499be086e7cSMintz, Yuval u32 fw_asserts_section_addr, next_list_idx_addr, next_list_idx; 45007b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 4501be086e7cSMintz, Yuval u32 last_list_idx, addr; 4502c965db44STomer Tayar 45032d22bc83SMichal Kalderon if (dev_data->block_in_reset[storm->sem_block_id]) 4504c965db44STomer Tayar continue; 4505c965db44STomer Tayar 4506c965db44STomer Tayar /* Read FW info for the current Storm */ 4507d52c89f1SMichal Kalderon qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, &fw_info); 4508c965db44STomer Tayar 4509be086e7cSMintz, Yuval asserts = &fw_info.fw_asserts_section; 4510be086e7cSMintz, Yuval 4511c965db44STomer Tayar /* Dump FW Asserts section header and params */ 45127b6859fbSMintz, Yuval storm_letter_str[0] = storm->letter; 45137b6859fbSMintz, Yuval offset += qed_dump_section_hdr(dump_buf + offset, 45147b6859fbSMintz, Yuval dump, "fw_asserts", 2); 45157b6859fbSMintz, Yuval offset += qed_dump_str_param(dump_buf + offset, 45167b6859fbSMintz, Yuval dump, "storm", storm_letter_str); 45177b6859fbSMintz, Yuval offset += qed_dump_num_param(dump_buf + offset, 45187b6859fbSMintz, Yuval dump, 45197b6859fbSMintz, Yuval "size", 4520be086e7cSMintz, Yuval asserts->list_element_dword_size); 4521c965db44STomer Tayar 45227b6859fbSMintz, Yuval /* Read and dump FW Asserts data */ 4523c965db44STomer Tayar if (!dump) { 4524be086e7cSMintz, Yuval offset += asserts->list_element_dword_size; 4525c965db44STomer Tayar continue; 4526c965db44STomer Tayar } 4527c965db44STomer Tayar 45285ab90341SAlexander Lobakin addr = le16_to_cpu(asserts->section_ram_line_offset); 45297b6859fbSMintz, Yuval fw_asserts_section_addr = storm->sem_fast_mem_addr + 4530c965db44STomer Tayar SEM_FAST_REG_INT_RAM + 45315ab90341SAlexander Lobakin RAM_LINES_TO_BYTES(addr); 45325ab90341SAlexander Lobakin 45337b6859fbSMintz, Yuval next_list_idx_addr = fw_asserts_section_addr + 4534be086e7cSMintz, Yuval DWORDS_TO_BYTES(asserts->list_next_index_dword_offset); 4535c965db44STomer Tayar next_list_idx = qed_rd(p_hwfn, p_ptt, next_list_idx_addr); 4536da090917STomer Tayar last_list_idx = (next_list_idx > 0 ? 4537da090917STomer Tayar next_list_idx : 4538da090917STomer Tayar asserts->list_num_elements) - 1; 4539be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(fw_asserts_section_addr) + 4540be086e7cSMintz, Yuval asserts->list_dword_offset + 4541be086e7cSMintz, Yuval last_list_idx * asserts->list_element_dword_size; 4542be086e7cSMintz, Yuval offset += 4543be086e7cSMintz, Yuval qed_grc_dump_addr_range(p_hwfn, p_ptt, 4544be086e7cSMintz, Yuval dump_buf + offset, 4545be086e7cSMintz, Yuval dump, addr, 45467b6859fbSMintz, Yuval asserts->list_element_dword_size, 4547d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 4548c965db44STomer Tayar } 4549c965db44STomer Tayar 4550c965db44STomer Tayar /* Dump last section */ 4551da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 45527b6859fbSMintz, Yuval 4553c965db44STomer Tayar return offset; 4554c965db44STomer Tayar } 4555c965db44STomer Tayar 45568a52bbabSMichal Kalderon /* Dumps the specified ILT pages to the specified buffer. 45578a52bbabSMichal Kalderon * Returns the dumped size in dwords. 45588a52bbabSMichal Kalderon */ 45596c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump_pages_range(u32 *dump_buf, u32 *given_offset, 45606c95dd8fSPrabhakar Kushwaha bool *dump, u32 start_page_id, 45618a52bbabSMichal Kalderon u32 num_pages, 45628a52bbabSMichal Kalderon struct phys_mem_desc *ilt_pages, 45636c95dd8fSPrabhakar Kushwaha bool dump_page_ids, u32 buf_size_in_dwords, 45646c95dd8fSPrabhakar Kushwaha u32 *given_actual_dump_size_in_dwords) 45658a52bbabSMichal Kalderon { 45666c95dd8fSPrabhakar Kushwaha u32 actual_dump_size_in_dwords = *given_actual_dump_size_in_dwords; 45676c95dd8fSPrabhakar Kushwaha u32 page_id, end_page_id, offset = *given_offset; 45686c95dd8fSPrabhakar Kushwaha struct phys_mem_desc *mem_desc = NULL; 45696c95dd8fSPrabhakar Kushwaha bool continue_dump = *dump; 45706c95dd8fSPrabhakar Kushwaha u32 partial_page_size = 0; 45718a52bbabSMichal Kalderon 45728a52bbabSMichal Kalderon if (num_pages == 0) 45738a52bbabSMichal Kalderon return offset; 45748a52bbabSMichal Kalderon 45758a52bbabSMichal Kalderon end_page_id = start_page_id + num_pages - 1; 45768a52bbabSMichal Kalderon 45778a52bbabSMichal Kalderon for (page_id = start_page_id; page_id <= end_page_id; page_id++) { 45786c95dd8fSPrabhakar Kushwaha mem_desc = &ilt_pages[page_id]; 45798a52bbabSMichal Kalderon if (!ilt_pages[page_id].virt_addr) 45808a52bbabSMichal Kalderon continue; 45818a52bbabSMichal Kalderon 45828a52bbabSMichal Kalderon if (dump_page_ids) { 45836c95dd8fSPrabhakar Kushwaha /* Copy page ID to dump buffer 45846c95dd8fSPrabhakar Kushwaha * (if dump is needed and buffer is not full) 45856c95dd8fSPrabhakar Kushwaha */ 45866c95dd8fSPrabhakar Kushwaha if ((continue_dump) && 45876c95dd8fSPrabhakar Kushwaha (offset + 1 > buf_size_in_dwords)) { 45886c95dd8fSPrabhakar Kushwaha continue_dump = false; 45896c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 45906c95dd8fSPrabhakar Kushwaha } 45916c95dd8fSPrabhakar Kushwaha if (continue_dump) 45928a52bbabSMichal Kalderon *(dump_buf + offset) = page_id; 45938a52bbabSMichal Kalderon offset++; 45948a52bbabSMichal Kalderon } else { 45958a52bbabSMichal Kalderon /* Copy page memory to dump buffer */ 45966c95dd8fSPrabhakar Kushwaha if ((continue_dump) && 45976c95dd8fSPrabhakar Kushwaha (offset + BYTES_TO_DWORDS(mem_desc->size) > 45986c95dd8fSPrabhakar Kushwaha buf_size_in_dwords)) { 45996c95dd8fSPrabhakar Kushwaha if (offset + BYTES_TO_DWORDS(mem_desc->size) > 46006c95dd8fSPrabhakar Kushwaha buf_size_in_dwords) { 46016c95dd8fSPrabhakar Kushwaha partial_page_size = 46026c95dd8fSPrabhakar Kushwaha buf_size_in_dwords - offset; 46036c95dd8fSPrabhakar Kushwaha memcpy(dump_buf + offset, 46046c95dd8fSPrabhakar Kushwaha mem_desc->virt_addr, 46056c95dd8fSPrabhakar Kushwaha partial_page_size); 46066c95dd8fSPrabhakar Kushwaha continue_dump = false; 46076c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = 46086c95dd8fSPrabhakar Kushwaha offset + partial_page_size; 46096c95dd8fSPrabhakar Kushwaha } 46106c95dd8fSPrabhakar Kushwaha } 46116c95dd8fSPrabhakar Kushwaha 46126c95dd8fSPrabhakar Kushwaha if (continue_dump) 46138a52bbabSMichal Kalderon memcpy(dump_buf + offset, 46148a52bbabSMichal Kalderon mem_desc->virt_addr, mem_desc->size); 46158a52bbabSMichal Kalderon offset += BYTES_TO_DWORDS(mem_desc->size); 46168a52bbabSMichal Kalderon } 46178a52bbabSMichal Kalderon } 46188a52bbabSMichal Kalderon 46196c95dd8fSPrabhakar Kushwaha *dump = continue_dump; 46206c95dd8fSPrabhakar Kushwaha *given_offset = offset; 46216c95dd8fSPrabhakar Kushwaha *given_actual_dump_size_in_dwords = actual_dump_size_in_dwords; 46226c95dd8fSPrabhakar Kushwaha 46238a52bbabSMichal Kalderon return offset; 46248a52bbabSMichal Kalderon } 46258a52bbabSMichal Kalderon 46268a52bbabSMichal Kalderon /* Dumps a section containing the dumped ILT pages. 46278a52bbabSMichal Kalderon * Returns the dumped size in dwords. 46288a52bbabSMichal Kalderon */ 46298a52bbabSMichal Kalderon static u32 qed_ilt_dump_pages_section(struct qed_hwfn *p_hwfn, 46308a52bbabSMichal Kalderon u32 *dump_buf, 46316c95dd8fSPrabhakar Kushwaha u32 *given_offset, 46326c95dd8fSPrabhakar Kushwaha bool *dump, 46338a52bbabSMichal Kalderon u32 valid_conn_pf_pages, 46348a52bbabSMichal Kalderon u32 valid_conn_vf_pages, 46358a52bbabSMichal Kalderon struct phys_mem_desc *ilt_pages, 46366c95dd8fSPrabhakar Kushwaha bool dump_page_ids, 46376c95dd8fSPrabhakar Kushwaha u32 buf_size_in_dwords, 46386c95dd8fSPrabhakar Kushwaha u32 *given_actual_dump_size_in_dwords) 46398a52bbabSMichal Kalderon { 46408a52bbabSMichal Kalderon struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients; 46416c95dd8fSPrabhakar Kushwaha u32 pf_start_line, start_page_id, offset = *given_offset; 46428a52bbabSMichal Kalderon u32 cdut_pf_init_pages, cdut_vf_init_pages; 46438a52bbabSMichal Kalderon u32 cdut_pf_work_pages, cdut_vf_work_pages; 46448a52bbabSMichal Kalderon u32 base_data_offset, size_param_offset; 46456c95dd8fSPrabhakar Kushwaha u32 src_pages; 46466c95dd8fSPrabhakar Kushwaha u32 section_header_and_param_size; 46478a52bbabSMichal Kalderon u32 cdut_pf_pages, cdut_vf_pages; 46486c95dd8fSPrabhakar Kushwaha u32 actual_dump_size_in_dwords; 46496c95dd8fSPrabhakar Kushwaha bool continue_dump = *dump; 46506c95dd8fSPrabhakar Kushwaha bool update_size = *dump; 46518a52bbabSMichal Kalderon const char *section_name; 46526c95dd8fSPrabhakar Kushwaha u32 i; 46538a52bbabSMichal Kalderon 46546c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = *given_actual_dump_size_in_dwords; 46558a52bbabSMichal Kalderon section_name = dump_page_ids ? "ilt_page_ids" : "ilt_page_mem"; 46568a52bbabSMichal Kalderon cdut_pf_init_pages = qed_get_cdut_num_pf_init_pages(p_hwfn); 46578a52bbabSMichal Kalderon cdut_vf_init_pages = qed_get_cdut_num_vf_init_pages(p_hwfn); 46588a52bbabSMichal Kalderon cdut_pf_work_pages = qed_get_cdut_num_pf_work_pages(p_hwfn); 46598a52bbabSMichal Kalderon cdut_vf_work_pages = qed_get_cdut_num_vf_work_pages(p_hwfn); 46608a52bbabSMichal Kalderon cdut_pf_pages = cdut_pf_init_pages + cdut_pf_work_pages; 46618a52bbabSMichal Kalderon cdut_vf_pages = cdut_vf_init_pages + cdut_vf_work_pages; 46628a52bbabSMichal Kalderon pf_start_line = p_hwfn->p_cxt_mngr->pf_start_line; 46636c95dd8fSPrabhakar Kushwaha section_header_and_param_size = qed_dump_section_hdr(NULL, 46646c95dd8fSPrabhakar Kushwaha false, 46656c95dd8fSPrabhakar Kushwaha section_name, 46666c95dd8fSPrabhakar Kushwaha 1) + 46676c95dd8fSPrabhakar Kushwaha qed_dump_num_param(NULL, false, "size", 0); 46688a52bbabSMichal Kalderon 46696c95dd8fSPrabhakar Kushwaha if ((continue_dump) && 46706c95dd8fSPrabhakar Kushwaha (offset + section_header_and_param_size > buf_size_in_dwords)) { 46716c95dd8fSPrabhakar Kushwaha continue_dump = false; 46726c95dd8fSPrabhakar Kushwaha update_size = false; 46736c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 46746c95dd8fSPrabhakar Kushwaha } 46756c95dd8fSPrabhakar Kushwaha 46766c95dd8fSPrabhakar Kushwaha offset += qed_dump_section_hdr(dump_buf + offset, 46776c95dd8fSPrabhakar Kushwaha continue_dump, section_name, 1); 46788a52bbabSMichal Kalderon 46798a52bbabSMichal Kalderon /* Dump size parameter (0 for now, overwritten with real size later) */ 46808a52bbabSMichal Kalderon size_param_offset = offset; 46816c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 46826c95dd8fSPrabhakar Kushwaha continue_dump, "size", 0); 46838a52bbabSMichal Kalderon base_data_offset = offset; 46848a52bbabSMichal Kalderon 46858a52bbabSMichal Kalderon /* CDUC pages are ordered as follows: 46868a52bbabSMichal Kalderon * - PF pages - valid section (included in PF connection type mapping) 46878a52bbabSMichal Kalderon * - PF pages - invalid section (not dumped) 46888a52bbabSMichal Kalderon * - For each VF in the PF: 46898a52bbabSMichal Kalderon * - VF pages - valid section (included in VF connection type mapping) 46908a52bbabSMichal Kalderon * - VF pages - invalid section (not dumped) 46918a52bbabSMichal Kalderon */ 46928a52bbabSMichal Kalderon if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUC)) { 46938a52bbabSMichal Kalderon /* Dump connection PF pages */ 46948a52bbabSMichal Kalderon start_page_id = clients[ILT_CLI_CDUC].first.val - pf_start_line; 46956c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_range(dump_buf, &offset, &continue_dump, 46966c95dd8fSPrabhakar Kushwaha start_page_id, valid_conn_pf_pages, 46976c95dd8fSPrabhakar Kushwaha ilt_pages, dump_page_ids, 46986c95dd8fSPrabhakar Kushwaha buf_size_in_dwords, 46996c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 47008a52bbabSMichal Kalderon 47018a52bbabSMichal Kalderon /* Dump connection VF pages */ 47028a52bbabSMichal Kalderon start_page_id += clients[ILT_CLI_CDUC].pf_total_lines; 47038a52bbabSMichal Kalderon for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count; 47048a52bbabSMichal Kalderon i++, start_page_id += clients[ILT_CLI_CDUC].vf_total_lines) 47056c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_range(dump_buf, &offset, 47066c95dd8fSPrabhakar Kushwaha &continue_dump, start_page_id, 47078a52bbabSMichal Kalderon valid_conn_vf_pages, 47086c95dd8fSPrabhakar Kushwaha ilt_pages, dump_page_ids, 47096c95dd8fSPrabhakar Kushwaha buf_size_in_dwords, 47106c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 47118a52bbabSMichal Kalderon } 47128a52bbabSMichal Kalderon 47138a52bbabSMichal Kalderon /* CDUT pages are ordered as follows: 47148a52bbabSMichal Kalderon * - PF init pages (not dumped) 47158a52bbabSMichal Kalderon * - PF work pages 47168a52bbabSMichal Kalderon * - For each VF in the PF: 47178a52bbabSMichal Kalderon * - VF init pages (not dumped) 47188a52bbabSMichal Kalderon * - VF work pages 47198a52bbabSMichal Kalderon */ 47208a52bbabSMichal Kalderon if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUT)) { 47218a52bbabSMichal Kalderon /* Dump task PF pages */ 47228a52bbabSMichal Kalderon start_page_id = clients[ILT_CLI_CDUT].first.val + 47238a52bbabSMichal Kalderon cdut_pf_init_pages - pf_start_line; 47246c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_range(dump_buf, &offset, &continue_dump, 47256c95dd8fSPrabhakar Kushwaha start_page_id, cdut_pf_work_pages, 47266c95dd8fSPrabhakar Kushwaha ilt_pages, dump_page_ids, 47276c95dd8fSPrabhakar Kushwaha buf_size_in_dwords, 47286c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 47298a52bbabSMichal Kalderon 47308a52bbabSMichal Kalderon /* Dump task VF pages */ 47318a52bbabSMichal Kalderon start_page_id = clients[ILT_CLI_CDUT].first.val + 47328a52bbabSMichal Kalderon cdut_pf_pages + cdut_vf_init_pages - pf_start_line; 47338a52bbabSMichal Kalderon for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count; 47348a52bbabSMichal Kalderon i++, start_page_id += cdut_vf_pages) 47356c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_range(dump_buf, &offset, 47366c95dd8fSPrabhakar Kushwaha &continue_dump, start_page_id, 47376c95dd8fSPrabhakar Kushwaha cdut_vf_work_pages, ilt_pages, 47386c95dd8fSPrabhakar Kushwaha dump_page_ids, 47396c95dd8fSPrabhakar Kushwaha buf_size_in_dwords, 47406c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 47416c95dd8fSPrabhakar Kushwaha } 47426c95dd8fSPrabhakar Kushwaha 47436c95dd8fSPrabhakar Kushwaha /*Dump Searcher pages */ 47446c95dd8fSPrabhakar Kushwaha if (clients[ILT_CLI_SRC].active) { 47456c95dd8fSPrabhakar Kushwaha start_page_id = clients[ILT_CLI_SRC].first.val - pf_start_line; 47466c95dd8fSPrabhakar Kushwaha src_pages = clients[ILT_CLI_SRC].last.val - 47476c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_SRC].first.val + 1; 47486c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_range(dump_buf, &offset, &continue_dump, 47496c95dd8fSPrabhakar Kushwaha start_page_id, src_pages, ilt_pages, 47506c95dd8fSPrabhakar Kushwaha dump_page_ids, buf_size_in_dwords, 47516c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 47528a52bbabSMichal Kalderon } 47538a52bbabSMichal Kalderon 47548a52bbabSMichal Kalderon /* Overwrite size param */ 47556c95dd8fSPrabhakar Kushwaha if (update_size) { 47566c95dd8fSPrabhakar Kushwaha u32 section_size = (*dump == continue_dump) ? 47576c95dd8fSPrabhakar Kushwaha offset - base_data_offset : 47586c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords - base_data_offset; 47596c95dd8fSPrabhakar Kushwaha if (section_size > 0) 47608a52bbabSMichal Kalderon qed_dump_num_param(dump_buf + size_param_offset, 47616c95dd8fSPrabhakar Kushwaha *dump, "size", section_size); 47626c95dd8fSPrabhakar Kushwaha else if ((section_size == 0) && (*dump != continue_dump)) 47636c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords -= 47646c95dd8fSPrabhakar Kushwaha section_header_and_param_size; 47656c95dd8fSPrabhakar Kushwaha } 47666c95dd8fSPrabhakar Kushwaha 47676c95dd8fSPrabhakar Kushwaha *dump = continue_dump; 47686c95dd8fSPrabhakar Kushwaha *given_offset = offset; 47696c95dd8fSPrabhakar Kushwaha *given_actual_dump_size_in_dwords = actual_dump_size_in_dwords; 47708a52bbabSMichal Kalderon 47718a52bbabSMichal Kalderon return offset; 47728a52bbabSMichal Kalderon } 47738a52bbabSMichal Kalderon 47746c95dd8fSPrabhakar Kushwaha /* Dumps a section containing the global parameters. 47756c95dd8fSPrabhakar Kushwaha * Part of ilt dump process 47768a52bbabSMichal Kalderon * Returns the dumped size in dwords. 47778a52bbabSMichal Kalderon */ 47786c95dd8fSPrabhakar Kushwaha static u32 47796c95dd8fSPrabhakar Kushwaha qed_ilt_dump_dump_common_global_params(struct qed_hwfn *p_hwfn, 47806c95dd8fSPrabhakar Kushwaha struct qed_ptt *p_ptt, 47816c95dd8fSPrabhakar Kushwaha u32 *dump_buf, 47826c95dd8fSPrabhakar Kushwaha bool dump, 47836c95dd8fSPrabhakar Kushwaha u32 cduc_page_size, 47846c95dd8fSPrabhakar Kushwaha u32 conn_ctx_size, 47856c95dd8fSPrabhakar Kushwaha u32 cdut_page_size, 47866c95dd8fSPrabhakar Kushwaha u32 *full_dump_size_param_offset, 47876c95dd8fSPrabhakar Kushwaha u32 *actual_dump_size_param_offset) 47888a52bbabSMichal Kalderon { 47898a52bbabSMichal Kalderon struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients; 47906c95dd8fSPrabhakar Kushwaha u32 offset = 0; 47918a52bbabSMichal Kalderon 47928a52bbabSMichal Kalderon offset += qed_dump_common_global_params(p_hwfn, p_ptt, 47936c95dd8fSPrabhakar Kushwaha dump_buf + offset, 47946c95dd8fSPrabhakar Kushwaha dump, 30); 47958a52bbabSMichal Kalderon offset += qed_dump_str_param(dump_buf + offset, 47966c95dd8fSPrabhakar Kushwaha dump, 47976c95dd8fSPrabhakar Kushwaha "dump-type", "ilt-dump"); 47988a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47998a52bbabSMichal Kalderon dump, 48006c95dd8fSPrabhakar Kushwaha "cduc-page-size", 48016c95dd8fSPrabhakar Kushwaha cduc_page_size); 48028a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48038a52bbabSMichal Kalderon dump, 48048a52bbabSMichal Kalderon "cduc-first-page-id", 48058a52bbabSMichal Kalderon clients[ILT_CLI_CDUC].first.val); 48068a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48078a52bbabSMichal Kalderon dump, 48088a52bbabSMichal Kalderon "cduc-last-page-id", 48098a52bbabSMichal Kalderon clients[ILT_CLI_CDUC].last.val); 48108a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48118a52bbabSMichal Kalderon dump, 48128a52bbabSMichal Kalderon "cduc-num-pf-pages", 48136c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_CDUC].pf_total_lines); 48148a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48158a52bbabSMichal Kalderon dump, 48168a52bbabSMichal Kalderon "cduc-num-vf-pages", 48176c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_CDUC].vf_total_lines); 48188a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48198a52bbabSMichal Kalderon dump, 48208a52bbabSMichal Kalderon "max-conn-ctx-size", 48218a52bbabSMichal Kalderon conn_ctx_size); 48228a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48238a52bbabSMichal Kalderon dump, 48246c95dd8fSPrabhakar Kushwaha "cdut-page-size", 48256c95dd8fSPrabhakar Kushwaha cdut_page_size); 48268a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48278a52bbabSMichal Kalderon dump, 48288a52bbabSMichal Kalderon "cdut-first-page-id", 48298a52bbabSMichal Kalderon clients[ILT_CLI_CDUT].first.val); 48308a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48318a52bbabSMichal Kalderon dump, 48328a52bbabSMichal Kalderon "cdut-last-page-id", 48338a52bbabSMichal Kalderon clients[ILT_CLI_CDUT].last.val); 48348a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48358a52bbabSMichal Kalderon dump, 48368a52bbabSMichal Kalderon "cdut-num-pf-init-pages", 48378a52bbabSMichal Kalderon qed_get_cdut_num_pf_init_pages(p_hwfn)); 48388a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48398a52bbabSMichal Kalderon dump, 48408a52bbabSMichal Kalderon "cdut-num-vf-init-pages", 48418a52bbabSMichal Kalderon qed_get_cdut_num_vf_init_pages(p_hwfn)); 48428a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48438a52bbabSMichal Kalderon dump, 48448a52bbabSMichal Kalderon "cdut-num-pf-work-pages", 48458a52bbabSMichal Kalderon qed_get_cdut_num_pf_work_pages(p_hwfn)); 48468a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48478a52bbabSMichal Kalderon dump, 48488a52bbabSMichal Kalderon "cdut-num-vf-work-pages", 48498a52bbabSMichal Kalderon qed_get_cdut_num_vf_work_pages(p_hwfn)); 48508a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48518a52bbabSMichal Kalderon dump, 48528a52bbabSMichal Kalderon "max-task-ctx-size", 48538a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->task_ctx_size); 48548a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48558a52bbabSMichal Kalderon dump, 48568a52bbabSMichal Kalderon "first-vf-id-in-pf", 48578a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->first_vf_in_pf); 48586c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 48598a52bbabSMichal Kalderon dump, 48608a52bbabSMichal Kalderon "num-vfs-in-pf", 48618a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->vf_count); 48628a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48638a52bbabSMichal Kalderon dump, 48646c95dd8fSPrabhakar Kushwaha "ptr-size-bytes", 48656c95dd8fSPrabhakar Kushwaha sizeof(void *)); 48668a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48678a52bbabSMichal Kalderon dump, 48688a52bbabSMichal Kalderon "pf-start-line", 48698a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->pf_start_line); 48708a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48718a52bbabSMichal Kalderon dump, 48728a52bbabSMichal Kalderon "page-mem-desc-size-dwords", 48738a52bbabSMichal Kalderon PAGE_MEM_DESC_SIZE_DWORDS); 48748a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48758a52bbabSMichal Kalderon dump, 48768a52bbabSMichal Kalderon "ilt-shadow-size", 48778a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->ilt_shadow_size); 48786c95dd8fSPrabhakar Kushwaha 48796c95dd8fSPrabhakar Kushwaha *full_dump_size_param_offset = offset; 48806c95dd8fSPrabhakar Kushwaha 48816c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 48826c95dd8fSPrabhakar Kushwaha dump, "dump-size-full", 0); 48836c95dd8fSPrabhakar Kushwaha 48846c95dd8fSPrabhakar Kushwaha *actual_dump_size_param_offset = offset; 48856c95dd8fSPrabhakar Kushwaha 48866c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 48876c95dd8fSPrabhakar Kushwaha dump, 48886c95dd8fSPrabhakar Kushwaha "dump-size-actual", 0); 48896c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 48906c95dd8fSPrabhakar Kushwaha dump, 48916c95dd8fSPrabhakar Kushwaha "iscsi_task_pages", 48926c95dd8fSPrabhakar Kushwaha p_hwfn->p_cxt_mngr->iscsi_task_pages); 48936c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 48946c95dd8fSPrabhakar Kushwaha dump, 48956c95dd8fSPrabhakar Kushwaha "fcoe_task_pages", 48966c95dd8fSPrabhakar Kushwaha p_hwfn->p_cxt_mngr->fcoe_task_pages); 48976c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 48986c95dd8fSPrabhakar Kushwaha dump, 48996c95dd8fSPrabhakar Kushwaha "roce_task_pages", 49006c95dd8fSPrabhakar Kushwaha p_hwfn->p_cxt_mngr->roce_task_pages); 49016c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 49026c95dd8fSPrabhakar Kushwaha dump, 49036c95dd8fSPrabhakar Kushwaha "eth_task_pages", 49046c95dd8fSPrabhakar Kushwaha p_hwfn->p_cxt_mngr->eth_task_pages); 49056c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 49066c95dd8fSPrabhakar Kushwaha dump, 49076c95dd8fSPrabhakar Kushwaha "src-first-page-id", 49086c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_SRC].first.val); 49096c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 49106c95dd8fSPrabhakar Kushwaha dump, 49116c95dd8fSPrabhakar Kushwaha "src-last-page-id", 49126c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_SRC].last.val); 49136c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 49146c95dd8fSPrabhakar Kushwaha dump, 49156c95dd8fSPrabhakar Kushwaha "src-is-active", 49166c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_SRC].active); 49176c95dd8fSPrabhakar Kushwaha 49188a52bbabSMichal Kalderon /* Additional/Less parameters require matching of number in call to 49198a52bbabSMichal Kalderon * dump_common_global_params() 49208a52bbabSMichal Kalderon */ 49218a52bbabSMichal Kalderon 49226c95dd8fSPrabhakar Kushwaha return offset; 49236c95dd8fSPrabhakar Kushwaha } 49246c95dd8fSPrabhakar Kushwaha 49256c95dd8fSPrabhakar Kushwaha /* Dump section containing number of PF CIDs per connection type. 49266c95dd8fSPrabhakar Kushwaha * Part of ilt dump process. 49276c95dd8fSPrabhakar Kushwaha * Returns the dumped size in dwords. 49286c95dd8fSPrabhakar Kushwaha */ 49296c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump_dump_num_pf_cids(struct qed_hwfn *p_hwfn, 49306c95dd8fSPrabhakar Kushwaha u32 *dump_buf, 49316c95dd8fSPrabhakar Kushwaha bool dump, u32 *valid_conn_pf_cids) 49326c95dd8fSPrabhakar Kushwaha { 49336c95dd8fSPrabhakar Kushwaha u32 num_pf_cids = 0; 49346c95dd8fSPrabhakar Kushwaha u32 offset = 0; 49356c95dd8fSPrabhakar Kushwaha u8 conn_type; 49366c95dd8fSPrabhakar Kushwaha 49378a52bbabSMichal Kalderon offset += qed_dump_section_hdr(dump_buf + offset, 49388a52bbabSMichal Kalderon dump, "num_pf_cids_per_conn_type", 1); 49398a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 4940fb09a1edSShai Malin dump, "size", NUM_OF_CONNECTION_TYPES); 49416c95dd8fSPrabhakar Kushwaha for (conn_type = 0, *valid_conn_pf_cids = 0; 4942fb09a1edSShai Malin conn_type < NUM_OF_CONNECTION_TYPES; conn_type++, offset++) { 49436c95dd8fSPrabhakar Kushwaha num_pf_cids = p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cid_count; 49448a52bbabSMichal Kalderon if (dump) 49458a52bbabSMichal Kalderon *(dump_buf + offset) = num_pf_cids; 49466c95dd8fSPrabhakar Kushwaha *valid_conn_pf_cids += num_pf_cids; 49478a52bbabSMichal Kalderon } 49488a52bbabSMichal Kalderon 49496c95dd8fSPrabhakar Kushwaha return offset; 49506c95dd8fSPrabhakar Kushwaha } 49516c95dd8fSPrabhakar Kushwaha 49526c95dd8fSPrabhakar Kushwaha /* Dump section containing number of VF CIDs per connection type 49536c95dd8fSPrabhakar Kushwaha * Part of ilt dump process. 49546c95dd8fSPrabhakar Kushwaha * Returns the dumped size in dwords. 49556c95dd8fSPrabhakar Kushwaha */ 49566c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump_dump_num_vf_cids(struct qed_hwfn *p_hwfn, 49576c95dd8fSPrabhakar Kushwaha u32 *dump_buf, 49586c95dd8fSPrabhakar Kushwaha bool dump, u32 *valid_conn_vf_cids) 49596c95dd8fSPrabhakar Kushwaha { 49606c95dd8fSPrabhakar Kushwaha u32 num_vf_cids = 0; 49616c95dd8fSPrabhakar Kushwaha u32 offset = 0; 49626c95dd8fSPrabhakar Kushwaha u8 conn_type; 49636c95dd8fSPrabhakar Kushwaha 49646c95dd8fSPrabhakar Kushwaha offset += qed_dump_section_hdr(dump_buf + offset, dump, 49656c95dd8fSPrabhakar Kushwaha "num_vf_cids_per_conn_type", 1); 49668a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 4967fb09a1edSShai Malin dump, "size", NUM_OF_CONNECTION_TYPES); 49686c95dd8fSPrabhakar Kushwaha for (conn_type = 0, *valid_conn_vf_cids = 0; 4969fb09a1edSShai Malin conn_type < NUM_OF_CONNECTION_TYPES; conn_type++, offset++) { 49706c95dd8fSPrabhakar Kushwaha num_vf_cids = 49718a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cids_per_vf; 49728a52bbabSMichal Kalderon if (dump) 49738a52bbabSMichal Kalderon *(dump_buf + offset) = num_vf_cids; 49746c95dd8fSPrabhakar Kushwaha *valid_conn_vf_cids += num_vf_cids; 49758a52bbabSMichal Kalderon } 49768a52bbabSMichal Kalderon 49776c95dd8fSPrabhakar Kushwaha return offset; 49786c95dd8fSPrabhakar Kushwaha } 49796c95dd8fSPrabhakar Kushwaha 49806c95dd8fSPrabhakar Kushwaha /* Performs ILT Dump to the specified buffer. 49816c95dd8fSPrabhakar Kushwaha * buf_size_in_dwords - The dumped buffer size. 49826c95dd8fSPrabhakar Kushwaha * Returns the dumped size in dwords. 49836c95dd8fSPrabhakar Kushwaha */ 49846c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump(struct qed_hwfn *p_hwfn, 49856c95dd8fSPrabhakar Kushwaha struct qed_ptt *p_ptt, 49866c95dd8fSPrabhakar Kushwaha u32 *dump_buf, u32 buf_size_in_dwords, bool dump) 49876c95dd8fSPrabhakar Kushwaha { 49886c95dd8fSPrabhakar Kushwaha #if ((!defined VMWARE) && (!defined UEFI)) 49896c95dd8fSPrabhakar Kushwaha struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients; 49906c95dd8fSPrabhakar Kushwaha #endif 49916c95dd8fSPrabhakar Kushwaha u32 valid_conn_vf_cids = 0, 49926c95dd8fSPrabhakar Kushwaha valid_conn_vf_pages, offset = 0, real_dumped_size = 0; 49936c95dd8fSPrabhakar Kushwaha u32 valid_conn_pf_cids = 0, valid_conn_pf_pages, num_pages; 49946c95dd8fSPrabhakar Kushwaha u32 num_cids_per_page, conn_ctx_size; 49956c95dd8fSPrabhakar Kushwaha u32 cduc_page_size, cdut_page_size; 49966c95dd8fSPrabhakar Kushwaha u32 actual_dump_size_in_dwords = 0; 49976c95dd8fSPrabhakar Kushwaha struct phys_mem_desc *ilt_pages; 49986c95dd8fSPrabhakar Kushwaha u32 actul_dump_off = 0; 49996c95dd8fSPrabhakar Kushwaha u32 last_section_size; 50006c95dd8fSPrabhakar Kushwaha u32 full_dump_off = 0; 50016c95dd8fSPrabhakar Kushwaha u32 section_size = 0; 50026c95dd8fSPrabhakar Kushwaha bool continue_dump; 50036c95dd8fSPrabhakar Kushwaha u32 page_id; 50046c95dd8fSPrabhakar Kushwaha 50056c95dd8fSPrabhakar Kushwaha last_section_size = qed_dump_last_section(NULL, 0, false); 50066c95dd8fSPrabhakar Kushwaha cduc_page_size = 1 << 50076c95dd8fSPrabhakar Kushwaha (clients[ILT_CLI_CDUC].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN); 50086c95dd8fSPrabhakar Kushwaha cdut_page_size = 1 << 50096c95dd8fSPrabhakar Kushwaha (clients[ILT_CLI_CDUT].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN); 50106c95dd8fSPrabhakar Kushwaha conn_ctx_size = p_hwfn->p_cxt_mngr->conn_ctx_size; 50116c95dd8fSPrabhakar Kushwaha num_cids_per_page = (int)(cduc_page_size / conn_ctx_size); 50126c95dd8fSPrabhakar Kushwaha ilt_pages = p_hwfn->p_cxt_mngr->ilt_shadow; 50136c95dd8fSPrabhakar Kushwaha continue_dump = dump; 50146c95dd8fSPrabhakar Kushwaha 50156c95dd8fSPrabhakar Kushwaha /* if need to dump then save memory for the last section 50166c95dd8fSPrabhakar Kushwaha * (last section calculates CRC of dumped data) 50176c95dd8fSPrabhakar Kushwaha */ 50186c95dd8fSPrabhakar Kushwaha if (dump) { 50196c95dd8fSPrabhakar Kushwaha if (buf_size_in_dwords >= last_section_size) { 50206c95dd8fSPrabhakar Kushwaha buf_size_in_dwords -= last_section_size; 50216c95dd8fSPrabhakar Kushwaha } else { 50226c95dd8fSPrabhakar Kushwaha continue_dump = false; 50236c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 50246c95dd8fSPrabhakar Kushwaha } 50256c95dd8fSPrabhakar Kushwaha } 50266c95dd8fSPrabhakar Kushwaha 50276c95dd8fSPrabhakar Kushwaha /* Dump global params */ 50286c95dd8fSPrabhakar Kushwaha 50296c95dd8fSPrabhakar Kushwaha /* if need to dump then first check that there is enough memory 50306c95dd8fSPrabhakar Kushwaha * in dumped buffer for this section calculate the size of this 50316c95dd8fSPrabhakar Kushwaha * section without dumping. if there is not enough memory - then 50326c95dd8fSPrabhakar Kushwaha * stop the dumping. 50336c95dd8fSPrabhakar Kushwaha */ 50346c95dd8fSPrabhakar Kushwaha if (continue_dump) { 50356c95dd8fSPrabhakar Kushwaha section_size = 50366c95dd8fSPrabhakar Kushwaha qed_ilt_dump_dump_common_global_params(p_hwfn, 50376c95dd8fSPrabhakar Kushwaha p_ptt, 50386c95dd8fSPrabhakar Kushwaha NULL, 50396c95dd8fSPrabhakar Kushwaha false, 50406c95dd8fSPrabhakar Kushwaha cduc_page_size, 50416c95dd8fSPrabhakar Kushwaha conn_ctx_size, 50426c95dd8fSPrabhakar Kushwaha cdut_page_size, 50436c95dd8fSPrabhakar Kushwaha &full_dump_off, 50446c95dd8fSPrabhakar Kushwaha &actul_dump_off); 50456c95dd8fSPrabhakar Kushwaha if (offset + section_size > buf_size_in_dwords) { 50466c95dd8fSPrabhakar Kushwaha continue_dump = false; 50476c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 50486c95dd8fSPrabhakar Kushwaha } 50496c95dd8fSPrabhakar Kushwaha } 50506c95dd8fSPrabhakar Kushwaha 50516c95dd8fSPrabhakar Kushwaha offset += qed_ilt_dump_dump_common_global_params(p_hwfn, 50526c95dd8fSPrabhakar Kushwaha p_ptt, 50536c95dd8fSPrabhakar Kushwaha dump_buf + offset, 50546c95dd8fSPrabhakar Kushwaha continue_dump, 50556c95dd8fSPrabhakar Kushwaha cduc_page_size, 50566c95dd8fSPrabhakar Kushwaha conn_ctx_size, 50576c95dd8fSPrabhakar Kushwaha cdut_page_size, 50586c95dd8fSPrabhakar Kushwaha &full_dump_off, 50596c95dd8fSPrabhakar Kushwaha &actul_dump_off); 50606c95dd8fSPrabhakar Kushwaha 50616c95dd8fSPrabhakar Kushwaha /* Dump section containing number of PF CIDs per connection type 50626c95dd8fSPrabhakar Kushwaha * If need to dump then first check that there is enough memory in 50636c95dd8fSPrabhakar Kushwaha * dumped buffer for this section. 50646c95dd8fSPrabhakar Kushwaha */ 50656c95dd8fSPrabhakar Kushwaha if (continue_dump) { 50666c95dd8fSPrabhakar Kushwaha section_size = 50676c95dd8fSPrabhakar Kushwaha qed_ilt_dump_dump_num_pf_cids(p_hwfn, 50686c95dd8fSPrabhakar Kushwaha NULL, 50696c95dd8fSPrabhakar Kushwaha false, 50706c95dd8fSPrabhakar Kushwaha &valid_conn_pf_cids); 50716c95dd8fSPrabhakar Kushwaha if (offset + section_size > buf_size_in_dwords) { 50726c95dd8fSPrabhakar Kushwaha continue_dump = false; 50736c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 50746c95dd8fSPrabhakar Kushwaha } 50756c95dd8fSPrabhakar Kushwaha } 50766c95dd8fSPrabhakar Kushwaha 50776c95dd8fSPrabhakar Kushwaha offset += qed_ilt_dump_dump_num_pf_cids(p_hwfn, 50786c95dd8fSPrabhakar Kushwaha dump_buf + offset, 50796c95dd8fSPrabhakar Kushwaha continue_dump, 50806c95dd8fSPrabhakar Kushwaha &valid_conn_pf_cids); 50816c95dd8fSPrabhakar Kushwaha 50826c95dd8fSPrabhakar Kushwaha /* Dump section containing number of VF CIDs per connection type 50836c95dd8fSPrabhakar Kushwaha * If need to dump then first check that there is enough memory in 50846c95dd8fSPrabhakar Kushwaha * dumped buffer for this section. 50856c95dd8fSPrabhakar Kushwaha */ 50866c95dd8fSPrabhakar Kushwaha if (continue_dump) { 50876c95dd8fSPrabhakar Kushwaha section_size = 50886c95dd8fSPrabhakar Kushwaha qed_ilt_dump_dump_num_vf_cids(p_hwfn, 50896c95dd8fSPrabhakar Kushwaha NULL, 50906c95dd8fSPrabhakar Kushwaha false, 50916c95dd8fSPrabhakar Kushwaha &valid_conn_vf_cids); 50926c95dd8fSPrabhakar Kushwaha if (offset + section_size > buf_size_in_dwords) { 50936c95dd8fSPrabhakar Kushwaha continue_dump = false; 50946c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 50956c95dd8fSPrabhakar Kushwaha } 50966c95dd8fSPrabhakar Kushwaha } 50976c95dd8fSPrabhakar Kushwaha 50986c95dd8fSPrabhakar Kushwaha offset += qed_ilt_dump_dump_num_vf_cids(p_hwfn, 50996c95dd8fSPrabhakar Kushwaha dump_buf + offset, 51006c95dd8fSPrabhakar Kushwaha continue_dump, 51016c95dd8fSPrabhakar Kushwaha &valid_conn_vf_cids); 51026c95dd8fSPrabhakar Kushwaha 51036c95dd8fSPrabhakar Kushwaha /* Dump section containing physical memory descriptors for each 51046c95dd8fSPrabhakar Kushwaha * ILT page. 51056c95dd8fSPrabhakar Kushwaha */ 51068a52bbabSMichal Kalderon num_pages = p_hwfn->p_cxt_mngr->ilt_shadow_size; 51076c95dd8fSPrabhakar Kushwaha 51086c95dd8fSPrabhakar Kushwaha /* If need to dump then first check that there is enough memory 51096c95dd8fSPrabhakar Kushwaha * in dumped buffer for the section header. 51106c95dd8fSPrabhakar Kushwaha */ 51116c95dd8fSPrabhakar Kushwaha if (continue_dump) { 51126c95dd8fSPrabhakar Kushwaha section_size = qed_dump_section_hdr(NULL, 51136c95dd8fSPrabhakar Kushwaha false, 51146c95dd8fSPrabhakar Kushwaha "ilt_page_desc", 51156c95dd8fSPrabhakar Kushwaha 1) + 51166c95dd8fSPrabhakar Kushwaha qed_dump_num_param(NULL, 51176c95dd8fSPrabhakar Kushwaha false, 51186c95dd8fSPrabhakar Kushwaha "size", 51196c95dd8fSPrabhakar Kushwaha num_pages * PAGE_MEM_DESC_SIZE_DWORDS); 51206c95dd8fSPrabhakar Kushwaha if (offset + section_size > buf_size_in_dwords) { 51216c95dd8fSPrabhakar Kushwaha continue_dump = false; 51226c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 51236c95dd8fSPrabhakar Kushwaha } 51246c95dd8fSPrabhakar Kushwaha } 51256c95dd8fSPrabhakar Kushwaha 51268a52bbabSMichal Kalderon offset += qed_dump_section_hdr(dump_buf + offset, 51276c95dd8fSPrabhakar Kushwaha continue_dump, "ilt_page_desc", 1); 51288a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 51296c95dd8fSPrabhakar Kushwaha continue_dump, 51308a52bbabSMichal Kalderon "size", 51318a52bbabSMichal Kalderon num_pages * PAGE_MEM_DESC_SIZE_DWORDS); 51328a52bbabSMichal Kalderon 51336c95dd8fSPrabhakar Kushwaha /* Copy memory descriptors to dump buffer 51346c95dd8fSPrabhakar Kushwaha * If need to dump then dump till the dump buffer size 51356c95dd8fSPrabhakar Kushwaha */ 51366c95dd8fSPrabhakar Kushwaha if (continue_dump) { 51378a52bbabSMichal Kalderon for (page_id = 0; page_id < num_pages; 51386c95dd8fSPrabhakar Kushwaha page_id++, offset += PAGE_MEM_DESC_SIZE_DWORDS) { 51396c95dd8fSPrabhakar Kushwaha if (continue_dump && 51406c95dd8fSPrabhakar Kushwaha (offset + PAGE_MEM_DESC_SIZE_DWORDS <= 51416c95dd8fSPrabhakar Kushwaha buf_size_in_dwords)) { 51428a52bbabSMichal Kalderon memcpy(dump_buf + offset, 51438a52bbabSMichal Kalderon &ilt_pages[page_id], 51446c95dd8fSPrabhakar Kushwaha DWORDS_TO_BYTES 51456c95dd8fSPrabhakar Kushwaha (PAGE_MEM_DESC_SIZE_DWORDS)); 51466c95dd8fSPrabhakar Kushwaha } else { 51476c95dd8fSPrabhakar Kushwaha if (continue_dump) { 51486c95dd8fSPrabhakar Kushwaha continue_dump = false; 51496c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 51506c95dd8fSPrabhakar Kushwaha } 51516c95dd8fSPrabhakar Kushwaha } 51526c95dd8fSPrabhakar Kushwaha } 51538a52bbabSMichal Kalderon } else { 51548a52bbabSMichal Kalderon offset += num_pages * PAGE_MEM_DESC_SIZE_DWORDS; 51558a52bbabSMichal Kalderon } 51568a52bbabSMichal Kalderon 51578a52bbabSMichal Kalderon valid_conn_pf_pages = DIV_ROUND_UP(valid_conn_pf_cids, 51588a52bbabSMichal Kalderon num_cids_per_page); 51598a52bbabSMichal Kalderon valid_conn_vf_pages = DIV_ROUND_UP(valid_conn_vf_cids, 51608a52bbabSMichal Kalderon num_cids_per_page); 51618a52bbabSMichal Kalderon 51628a52bbabSMichal Kalderon /* Dump ILT pages IDs */ 51636c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_section(p_hwfn, dump_buf, &offset, &continue_dump, 51646c95dd8fSPrabhakar Kushwaha valid_conn_pf_pages, valid_conn_vf_pages, 51656c95dd8fSPrabhakar Kushwaha ilt_pages, true, buf_size_in_dwords, 51666c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 51678a52bbabSMichal Kalderon 51688a52bbabSMichal Kalderon /* Dump ILT pages memory */ 51696c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_section(p_hwfn, dump_buf, &offset, &continue_dump, 51706c95dd8fSPrabhakar Kushwaha valid_conn_pf_pages, valid_conn_vf_pages, 51716c95dd8fSPrabhakar Kushwaha ilt_pages, false, buf_size_in_dwords, 51726c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 51736c95dd8fSPrabhakar Kushwaha 51746c95dd8fSPrabhakar Kushwaha real_dumped_size = 51756c95dd8fSPrabhakar Kushwaha (continue_dump == dump) ? offset : actual_dump_size_in_dwords; 51766c95dd8fSPrabhakar Kushwaha qed_dump_num_param(dump_buf + full_dump_off, dump, 51776c95dd8fSPrabhakar Kushwaha "full-dump-size", offset + last_section_size); 51786c95dd8fSPrabhakar Kushwaha qed_dump_num_param(dump_buf + actul_dump_off, 51798a52bbabSMichal Kalderon dump, 51806c95dd8fSPrabhakar Kushwaha "actual-dump-size", 51816c95dd8fSPrabhakar Kushwaha real_dumped_size + last_section_size); 51828a52bbabSMichal Kalderon 51838a52bbabSMichal Kalderon /* Dump last section */ 51846c95dd8fSPrabhakar Kushwaha real_dumped_size += qed_dump_last_section(dump_buf, 51856c95dd8fSPrabhakar Kushwaha real_dumped_size, dump); 51868a52bbabSMichal Kalderon 51876c95dd8fSPrabhakar Kushwaha return real_dumped_size; 51888a52bbabSMichal Kalderon } 51898a52bbabSMichal Kalderon 5190c965db44STomer Tayar /***************************** Public Functions *******************************/ 5191c965db44STomer Tayar 51922d22bc83SMichal Kalderon enum dbg_status qed_dbg_set_bin_ptr(struct qed_hwfn *p_hwfn, 51932d22bc83SMichal Kalderon const u8 * const bin_ptr) 5194c965db44STomer Tayar { 51952d22bc83SMichal Kalderon struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr; 5196c965db44STomer Tayar u8 buf_id; 5197c965db44STomer Tayar 51982d22bc83SMichal Kalderon /* Convert binary data to debug arrays */ 51992d22bc83SMichal Kalderon for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) 52002d22bc83SMichal Kalderon qed_set_dbg_bin_buf(p_hwfn, 52012d22bc83SMichal Kalderon buf_id, 52022d22bc83SMichal Kalderon (u32 *)(bin_ptr + buf_hdrs[buf_id].offset), 52032d22bc83SMichal Kalderon buf_hdrs[buf_id].length); 5204c965db44STomer Tayar 5205c965db44STomer Tayar return DBG_STATUS_OK; 5206c965db44STomer Tayar } 5207c965db44STomer Tayar 52086c95dd8fSPrabhakar Kushwaha static enum dbg_status qed_dbg_set_app_ver(u32 ver) 52096c95dd8fSPrabhakar Kushwaha { 52106c95dd8fSPrabhakar Kushwaha if (ver < TOOLS_VERSION) 52116c95dd8fSPrabhakar Kushwaha return DBG_STATUS_UNSUPPORTED_APP_VERSION; 52126c95dd8fSPrabhakar Kushwaha 52136c95dd8fSPrabhakar Kushwaha s_app_ver = ver; 52146c95dd8fSPrabhakar Kushwaha 52156c95dd8fSPrabhakar Kushwaha return DBG_STATUS_OK; 52166c95dd8fSPrabhakar Kushwaha } 52176c95dd8fSPrabhakar Kushwaha 5218d52c89f1SMichal Kalderon bool qed_read_fw_info(struct qed_hwfn *p_hwfn, 5219d52c89f1SMichal Kalderon struct qed_ptt *p_ptt, struct fw_info *fw_info) 5220d52c89f1SMichal Kalderon { 5221d52c89f1SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 5222d52c89f1SMichal Kalderon u8 storm_id; 5223d52c89f1SMichal Kalderon 5224d52c89f1SMichal Kalderon for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 5225d52c89f1SMichal Kalderon struct storm_defs *storm = &s_storm_defs[storm_id]; 5226d52c89f1SMichal Kalderon 5227d52c89f1SMichal Kalderon /* Skip Storm if it's in reset */ 52282d22bc83SMichal Kalderon if (dev_data->block_in_reset[storm->sem_block_id]) 5229d52c89f1SMichal Kalderon continue; 5230d52c89f1SMichal Kalderon 5231d52c89f1SMichal Kalderon /* Read FW info for the current Storm */ 5232d52c89f1SMichal Kalderon qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, fw_info); 5233d52c89f1SMichal Kalderon 5234d52c89f1SMichal Kalderon return true; 5235d52c89f1SMichal Kalderon } 5236d52c89f1SMichal Kalderon 5237d52c89f1SMichal Kalderon return false; 5238d52c89f1SMichal Kalderon } 5239d52c89f1SMichal Kalderon 52403b86bd07SSudarsana Reddy Kalluru enum dbg_status qed_dbg_grc_config(struct qed_hwfn *p_hwfn, 52413b86bd07SSudarsana Reddy Kalluru enum dbg_grc_params grc_param, u32 val) 52423b86bd07SSudarsana Reddy Kalluru { 52432d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 52443b86bd07SSudarsana Reddy Kalluru enum dbg_status status; 52453b86bd07SSudarsana Reddy Kalluru int i; 52463b86bd07SSudarsana Reddy Kalluru 52472d22bc83SMichal Kalderon DP_VERBOSE(p_hwfn, 52482d22bc83SMichal Kalderon QED_MSG_DEBUG, 52493b86bd07SSudarsana Reddy Kalluru "dbg_grc_config: paramId = %d, val = %d\n", grc_param, val); 52503b86bd07SSudarsana Reddy Kalluru 52512d22bc83SMichal Kalderon status = qed_dbg_dev_init(p_hwfn); 52523b86bd07SSudarsana Reddy Kalluru if (status != DBG_STATUS_OK) 52533b86bd07SSudarsana Reddy Kalluru return status; 52543b86bd07SSudarsana Reddy Kalluru 52553b86bd07SSudarsana Reddy Kalluru /* Initializes the GRC parameters (if not initialized). Needed in order 52563b86bd07SSudarsana Reddy Kalluru * to set the default parameter values for the first time. 52573b86bd07SSudarsana Reddy Kalluru */ 52583b86bd07SSudarsana Reddy Kalluru qed_dbg_grc_init_params(p_hwfn); 52593b86bd07SSudarsana Reddy Kalluru 526050515cacSJean Sacren if (grc_param >= MAX_DBG_GRC_PARAMS) 52613b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 52623b86bd07SSudarsana Reddy Kalluru if (val < s_grc_param_defs[grc_param].min || 52633b86bd07SSudarsana Reddy Kalluru val > s_grc_param_defs[grc_param].max) 52643b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 52653b86bd07SSudarsana Reddy Kalluru 52663b86bd07SSudarsana Reddy Kalluru if (s_grc_param_defs[grc_param].is_preset) { 52673b86bd07SSudarsana Reddy Kalluru /* Preset param */ 52683b86bd07SSudarsana Reddy Kalluru 52693b86bd07SSudarsana Reddy Kalluru /* Disabling a preset is not allowed. Call 52703b86bd07SSudarsana Reddy Kalluru * dbg_grc_set_params_default instead. 52713b86bd07SSudarsana Reddy Kalluru */ 52723b86bd07SSudarsana Reddy Kalluru if (!val) 52733b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 52743b86bd07SSudarsana Reddy Kalluru 52753b86bd07SSudarsana Reddy Kalluru /* Update all params with the preset values */ 52763b86bd07SSudarsana Reddy Kalluru for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) { 52772d22bc83SMichal Kalderon struct grc_param_defs *defs = &s_grc_param_defs[i]; 52783b86bd07SSudarsana Reddy Kalluru u32 preset_val; 52793b86bd07SSudarsana Reddy Kalluru /* Skip persistent params */ 52802d22bc83SMichal Kalderon if (defs->is_persistent) 52813b86bd07SSudarsana Reddy Kalluru continue; 52823b86bd07SSudarsana Reddy Kalluru 52833b86bd07SSudarsana Reddy Kalluru /* Find preset value */ 52843b86bd07SSudarsana Reddy Kalluru if (grc_param == DBG_GRC_PARAM_EXCLUDE_ALL) 52853b86bd07SSudarsana Reddy Kalluru preset_val = 52862d22bc83SMichal Kalderon defs->exclude_all_preset_val; 52873b86bd07SSudarsana Reddy Kalluru else if (grc_param == DBG_GRC_PARAM_CRASH) 52883b86bd07SSudarsana Reddy Kalluru preset_val = 52892d22bc83SMichal Kalderon defs->crash_preset_val[dev_data->chip_id]; 52903b86bd07SSudarsana Reddy Kalluru else 52913b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 52923b86bd07SSudarsana Reddy Kalluru 52932d22bc83SMichal Kalderon qed_grc_set_param(p_hwfn, i, preset_val); 52943b86bd07SSudarsana Reddy Kalluru } 52953b86bd07SSudarsana Reddy Kalluru } else { 52963b86bd07SSudarsana Reddy Kalluru /* Regular param - set its value */ 52973b86bd07SSudarsana Reddy Kalluru qed_grc_set_param(p_hwfn, grc_param, val); 52983b86bd07SSudarsana Reddy Kalluru } 52993b86bd07SSudarsana Reddy Kalluru 53003b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_OK; 53013b86bd07SSudarsana Reddy Kalluru } 53023b86bd07SSudarsana Reddy Kalluru 5303be086e7cSMintz, Yuval /* Assign default GRC param values */ 5304be086e7cSMintz, Yuval void qed_dbg_grc_set_params_default(struct qed_hwfn *p_hwfn) 5305be086e7cSMintz, Yuval { 5306be086e7cSMintz, Yuval struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 5307be086e7cSMintz, Yuval u32 i; 5308be086e7cSMintz, Yuval 5309be086e7cSMintz, Yuval for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) 531050bc60cbSMichal Kalderon if (!s_grc_param_defs[i].is_persistent) 5311be086e7cSMintz, Yuval dev_data->grc.param_val[i] = 5312be086e7cSMintz, Yuval s_grc_param_defs[i].default_val[dev_data->chip_id]; 5313be086e7cSMintz, Yuval } 5314be086e7cSMintz, Yuval 5315c965db44STomer Tayar enum dbg_status qed_dbg_grc_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5316c965db44STomer Tayar struct qed_ptt *p_ptt, 5317c965db44STomer Tayar u32 *buf_size) 5318c965db44STomer Tayar { 53192d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5320c965db44STomer Tayar 5321c965db44STomer Tayar *buf_size = 0; 53227b6859fbSMintz, Yuval 5323c965db44STomer Tayar if (status != DBG_STATUS_OK) 5324c965db44STomer Tayar return status; 53257b6859fbSMintz, Yuval 53262d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr || 53272d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr || 53282d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr || 53292d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr || 53302d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr) 5331c965db44STomer Tayar return DBG_STATUS_DBG_ARRAY_NOT_SET; 53327b6859fbSMintz, Yuval 5333c965db44STomer Tayar return qed_grc_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5334c965db44STomer Tayar } 5335c965db44STomer Tayar 5336c965db44STomer Tayar enum dbg_status qed_dbg_grc_dump(struct qed_hwfn *p_hwfn, 5337c965db44STomer Tayar struct qed_ptt *p_ptt, 5338c965db44STomer Tayar u32 *dump_buf, 5339c965db44STomer Tayar u32 buf_size_in_dwords, 5340c965db44STomer Tayar u32 *num_dumped_dwords) 5341c965db44STomer Tayar { 5342c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5343c965db44STomer Tayar enum dbg_status status; 5344c965db44STomer Tayar 5345c965db44STomer Tayar *num_dumped_dwords = 0; 53467b6859fbSMintz, Yuval 53477b6859fbSMintz, Yuval status = qed_dbg_grc_get_dump_buf_size(p_hwfn, 53487b6859fbSMintz, Yuval p_ptt, 53497b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5350c965db44STomer Tayar if (status != DBG_STATUS_OK) 5351c965db44STomer Tayar return status; 53527b6859fbSMintz, Yuval 5353c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5354c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5355c965db44STomer Tayar 53566c95dd8fSPrabhakar Kushwaha /* Doesn't do anything, needed for compile time asserts */ 53576c95dd8fSPrabhakar Kushwaha qed_static_asserts(); 53586c95dd8fSPrabhakar Kushwaha 5359c965db44STomer Tayar /* GRC Dump */ 5360c965db44STomer Tayar status = qed_grc_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords); 5361c965db44STomer Tayar 5362be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5363be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5364be086e7cSMintz, Yuval 5365c965db44STomer Tayar return status; 5366c965db44STomer Tayar } 5367c965db44STomer Tayar 5368c965db44STomer Tayar enum dbg_status qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5369c965db44STomer Tayar struct qed_ptt *p_ptt, 5370c965db44STomer Tayar u32 *buf_size) 5371c965db44STomer Tayar { 5372c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 53732d22bc83SMichal Kalderon struct idle_chk_data *idle_chk = &dev_data->idle_chk; 53747b6859fbSMintz, Yuval enum dbg_status status; 5375c965db44STomer Tayar 5376c965db44STomer Tayar *buf_size = 0; 53777b6859fbSMintz, Yuval 53782d22bc83SMichal Kalderon status = qed_dbg_dev_init(p_hwfn); 5379c965db44STomer Tayar if (status != DBG_STATUS_OK) 5380c965db44STomer Tayar return status; 53817b6859fbSMintz, Yuval 53822d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr || 53832d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr || 53842d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr || 53852d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr) 5386c965db44STomer Tayar return DBG_STATUS_DBG_ARRAY_NOT_SET; 53877b6859fbSMintz, Yuval 53887b6859fbSMintz, Yuval if (!idle_chk->buf_size_set) { 53897b6859fbSMintz, Yuval idle_chk->buf_size = qed_idle_chk_dump(p_hwfn, 53907b6859fbSMintz, Yuval p_ptt, NULL, false); 53917b6859fbSMintz, Yuval idle_chk->buf_size_set = true; 5392c965db44STomer Tayar } 5393c965db44STomer Tayar 53947b6859fbSMintz, Yuval *buf_size = idle_chk->buf_size; 53957b6859fbSMintz, Yuval 5396c965db44STomer Tayar return DBG_STATUS_OK; 5397c965db44STomer Tayar } 5398c965db44STomer Tayar 5399c965db44STomer Tayar enum dbg_status qed_dbg_idle_chk_dump(struct qed_hwfn *p_hwfn, 5400c965db44STomer Tayar struct qed_ptt *p_ptt, 5401c965db44STomer Tayar u32 *dump_buf, 5402c965db44STomer Tayar u32 buf_size_in_dwords, 5403c965db44STomer Tayar u32 *num_dumped_dwords) 5404c965db44STomer Tayar { 5405c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5406c965db44STomer Tayar enum dbg_status status; 5407c965db44STomer Tayar 5408c965db44STomer Tayar *num_dumped_dwords = 0; 54097b6859fbSMintz, Yuval 54107b6859fbSMintz, Yuval status = qed_dbg_idle_chk_get_dump_buf_size(p_hwfn, 54117b6859fbSMintz, Yuval p_ptt, 54127b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5413c965db44STomer Tayar if (status != DBG_STATUS_OK) 5414c965db44STomer Tayar return status; 54157b6859fbSMintz, Yuval 5416c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5417c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5418c965db44STomer Tayar 5419c965db44STomer Tayar /* Update reset state */ 54202d22bc83SMichal Kalderon qed_grc_unreset_blocks(p_hwfn, p_ptt, true); 5421c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5422c965db44STomer Tayar 5423c965db44STomer Tayar /* Idle Check Dump */ 5424c965db44STomer Tayar *num_dumped_dwords = qed_idle_chk_dump(p_hwfn, p_ptt, dump_buf, true); 5425be086e7cSMintz, Yuval 5426be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5427be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5428be086e7cSMintz, Yuval 5429c965db44STomer Tayar return DBG_STATUS_OK; 5430c965db44STomer Tayar } 5431c965db44STomer Tayar 5432c965db44STomer Tayar enum dbg_status qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5433c965db44STomer Tayar struct qed_ptt *p_ptt, 5434c965db44STomer Tayar u32 *buf_size) 5435c965db44STomer Tayar { 54362d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5437c965db44STomer Tayar 5438c965db44STomer Tayar *buf_size = 0; 54397b6859fbSMintz, Yuval 5440c965db44STomer Tayar if (status != DBG_STATUS_OK) 5441c965db44STomer Tayar return status; 54427b6859fbSMintz, Yuval 5443c965db44STomer Tayar return qed_mcp_trace_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5444c965db44STomer Tayar } 5445c965db44STomer Tayar 5446c965db44STomer Tayar enum dbg_status qed_dbg_mcp_trace_dump(struct qed_hwfn *p_hwfn, 5447c965db44STomer Tayar struct qed_ptt *p_ptt, 5448c965db44STomer Tayar u32 *dump_buf, 5449c965db44STomer Tayar u32 buf_size_in_dwords, 5450c965db44STomer Tayar u32 *num_dumped_dwords) 5451c965db44STomer Tayar { 5452c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5453c965db44STomer Tayar enum dbg_status status; 5454c965db44STomer Tayar 5455be086e7cSMintz, Yuval status = 54567b6859fbSMintz, Yuval qed_dbg_mcp_trace_get_dump_buf_size(p_hwfn, 54577b6859fbSMintz, Yuval p_ptt, 5458c965db44STomer Tayar &needed_buf_size_in_dwords); 54597b6859fbSMintz, Yuval if (status != DBG_STATUS_OK && status != 54607b6859fbSMintz, Yuval DBG_STATUS_NVRAM_GET_IMAGE_FAILED) 5461c965db44STomer Tayar return status; 5462be086e7cSMintz, Yuval 5463c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5464c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5465c965db44STomer Tayar 5466c965db44STomer Tayar /* Update reset state */ 5467c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5468c965db44STomer Tayar 5469c965db44STomer Tayar /* Perform dump */ 5470be086e7cSMintz, Yuval status = qed_mcp_trace_dump(p_hwfn, 5471c965db44STomer Tayar p_ptt, dump_buf, true, num_dumped_dwords); 5472be086e7cSMintz, Yuval 5473be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5474be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5475be086e7cSMintz, Yuval 5476be086e7cSMintz, Yuval return status; 5477c965db44STomer Tayar } 5478c965db44STomer Tayar 5479c965db44STomer Tayar enum dbg_status qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5480c965db44STomer Tayar struct qed_ptt *p_ptt, 5481c965db44STomer Tayar u32 *buf_size) 5482c965db44STomer Tayar { 54832d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5484c965db44STomer Tayar 5485c965db44STomer Tayar *buf_size = 0; 54867b6859fbSMintz, Yuval 5487c965db44STomer Tayar if (status != DBG_STATUS_OK) 5488c965db44STomer Tayar return status; 54897b6859fbSMintz, Yuval 5490c965db44STomer Tayar return qed_reg_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5491c965db44STomer Tayar } 5492c965db44STomer Tayar 5493c965db44STomer Tayar enum dbg_status qed_dbg_reg_fifo_dump(struct qed_hwfn *p_hwfn, 5494c965db44STomer Tayar struct qed_ptt *p_ptt, 5495c965db44STomer Tayar u32 *dump_buf, 5496c965db44STomer Tayar u32 buf_size_in_dwords, 5497c965db44STomer Tayar u32 *num_dumped_dwords) 5498c965db44STomer Tayar { 5499c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5500c965db44STomer Tayar enum dbg_status status; 5501c965db44STomer Tayar 5502c965db44STomer Tayar *num_dumped_dwords = 0; 55037b6859fbSMintz, Yuval 55047b6859fbSMintz, Yuval status = qed_dbg_reg_fifo_get_dump_buf_size(p_hwfn, 55057b6859fbSMintz, Yuval p_ptt, 55067b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5507c965db44STomer Tayar if (status != DBG_STATUS_OK) 5508c965db44STomer Tayar return status; 55097b6859fbSMintz, Yuval 5510c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5511c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5512c965db44STomer Tayar 5513c965db44STomer Tayar /* Update reset state */ 5514c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5515be086e7cSMintz, Yuval 5516be086e7cSMintz, Yuval status = qed_reg_fifo_dump(p_hwfn, 5517c965db44STomer Tayar p_ptt, dump_buf, true, num_dumped_dwords); 5518be086e7cSMintz, Yuval 5519be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5520be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5521be086e7cSMintz, Yuval 5522be086e7cSMintz, Yuval return status; 5523c965db44STomer Tayar } 5524c965db44STomer Tayar 5525c965db44STomer Tayar enum dbg_status qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5526c965db44STomer Tayar struct qed_ptt *p_ptt, 5527c965db44STomer Tayar u32 *buf_size) 5528c965db44STomer Tayar { 55292d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5530c965db44STomer Tayar 5531c965db44STomer Tayar *buf_size = 0; 55327b6859fbSMintz, Yuval 5533c965db44STomer Tayar if (status != DBG_STATUS_OK) 5534c965db44STomer Tayar return status; 55357b6859fbSMintz, Yuval 5536c965db44STomer Tayar return qed_igu_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5537c965db44STomer Tayar } 5538c965db44STomer Tayar 5539c965db44STomer Tayar enum dbg_status qed_dbg_igu_fifo_dump(struct qed_hwfn *p_hwfn, 5540c965db44STomer Tayar struct qed_ptt *p_ptt, 5541c965db44STomer Tayar u32 *dump_buf, 5542c965db44STomer Tayar u32 buf_size_in_dwords, 5543c965db44STomer Tayar u32 *num_dumped_dwords) 5544c965db44STomer Tayar { 5545c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5546c965db44STomer Tayar enum dbg_status status; 5547c965db44STomer Tayar 5548c965db44STomer Tayar *num_dumped_dwords = 0; 55497b6859fbSMintz, Yuval 55507b6859fbSMintz, Yuval status = qed_dbg_igu_fifo_get_dump_buf_size(p_hwfn, 55517b6859fbSMintz, Yuval p_ptt, 55527b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5553c965db44STomer Tayar if (status != DBG_STATUS_OK) 5554c965db44STomer Tayar return status; 55557b6859fbSMintz, Yuval 5556c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5557c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5558c965db44STomer Tayar 5559c965db44STomer Tayar /* Update reset state */ 5560c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5561be086e7cSMintz, Yuval 5562be086e7cSMintz, Yuval status = qed_igu_fifo_dump(p_hwfn, 5563c965db44STomer Tayar p_ptt, dump_buf, true, num_dumped_dwords); 5564be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5565be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5566be086e7cSMintz, Yuval 5567be086e7cSMintz, Yuval return status; 5568c965db44STomer Tayar } 5569c965db44STomer Tayar 5570c965db44STomer Tayar enum dbg_status 5571c965db44STomer Tayar qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5572c965db44STomer Tayar struct qed_ptt *p_ptt, 5573c965db44STomer Tayar u32 *buf_size) 5574c965db44STomer Tayar { 55752d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5576c965db44STomer Tayar 5577c965db44STomer Tayar *buf_size = 0; 55787b6859fbSMintz, Yuval 5579c965db44STomer Tayar if (status != DBG_STATUS_OK) 5580c965db44STomer Tayar return status; 55817b6859fbSMintz, Yuval 5582c965db44STomer Tayar return qed_protection_override_dump(p_hwfn, 5583c965db44STomer Tayar p_ptt, NULL, false, buf_size); 5584c965db44STomer Tayar } 5585c965db44STomer Tayar 5586c965db44STomer Tayar enum dbg_status qed_dbg_protection_override_dump(struct qed_hwfn *p_hwfn, 5587c965db44STomer Tayar struct qed_ptt *p_ptt, 5588c965db44STomer Tayar u32 *dump_buf, 5589c965db44STomer Tayar u32 buf_size_in_dwords, 5590c965db44STomer Tayar u32 *num_dumped_dwords) 5591c965db44STomer Tayar { 55927b6859fbSMintz, Yuval u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords; 5593c965db44STomer Tayar enum dbg_status status; 5594c965db44STomer Tayar 5595c965db44STomer Tayar *num_dumped_dwords = 0; 55967b6859fbSMintz, Yuval 55977b6859fbSMintz, Yuval status = 55987b6859fbSMintz, Yuval qed_dbg_protection_override_get_dump_buf_size(p_hwfn, 55997b6859fbSMintz, Yuval p_ptt, 56007b6859fbSMintz, Yuval p_size); 5601c965db44STomer Tayar if (status != DBG_STATUS_OK) 5602c965db44STomer Tayar return status; 56037b6859fbSMintz, Yuval 5604c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5605c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5606c965db44STomer Tayar 5607c965db44STomer Tayar /* Update reset state */ 5608c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5609be086e7cSMintz, Yuval 5610be086e7cSMintz, Yuval status = qed_protection_override_dump(p_hwfn, 5611c965db44STomer Tayar p_ptt, 5612be086e7cSMintz, Yuval dump_buf, 5613be086e7cSMintz, Yuval true, num_dumped_dwords); 5614be086e7cSMintz, Yuval 5615be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5616be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5617be086e7cSMintz, Yuval 5618be086e7cSMintz, Yuval return status; 5619c965db44STomer Tayar } 5620c965db44STomer Tayar 5621c965db44STomer Tayar enum dbg_status qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5622c965db44STomer Tayar struct qed_ptt *p_ptt, 5623c965db44STomer Tayar u32 *buf_size) 5624c965db44STomer Tayar { 56252d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5626c965db44STomer Tayar 5627c965db44STomer Tayar *buf_size = 0; 56287b6859fbSMintz, Yuval 5629c965db44STomer Tayar if (status != DBG_STATUS_OK) 5630c965db44STomer Tayar return status; 5631c965db44STomer Tayar 5632c965db44STomer Tayar /* Update reset state */ 5633c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 56347b6859fbSMintz, Yuval 5635c965db44STomer Tayar *buf_size = qed_fw_asserts_dump(p_hwfn, p_ptt, NULL, false); 56367b6859fbSMintz, Yuval 5637c965db44STomer Tayar return DBG_STATUS_OK; 5638c965db44STomer Tayar } 5639c965db44STomer Tayar 5640c965db44STomer Tayar enum dbg_status qed_dbg_fw_asserts_dump(struct qed_hwfn *p_hwfn, 5641c965db44STomer Tayar struct qed_ptt *p_ptt, 5642c965db44STomer Tayar u32 *dump_buf, 5643c965db44STomer Tayar u32 buf_size_in_dwords, 5644c965db44STomer Tayar u32 *num_dumped_dwords) 5645c965db44STomer Tayar { 56467b6859fbSMintz, Yuval u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords; 5647c965db44STomer Tayar enum dbg_status status; 5648c965db44STomer Tayar 5649c965db44STomer Tayar *num_dumped_dwords = 0; 56507b6859fbSMintz, Yuval 56517b6859fbSMintz, Yuval status = 56527b6859fbSMintz, Yuval qed_dbg_fw_asserts_get_dump_buf_size(p_hwfn, 56537b6859fbSMintz, Yuval p_ptt, 56547b6859fbSMintz, Yuval p_size); 5655c965db44STomer Tayar if (status != DBG_STATUS_OK) 5656c965db44STomer Tayar return status; 56577b6859fbSMintz, Yuval 5658c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5659c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5660c965db44STomer Tayar 5661c965db44STomer Tayar *num_dumped_dwords = qed_fw_asserts_dump(p_hwfn, p_ptt, dump_buf, true); 56627b6859fbSMintz, Yuval 56637b6859fbSMintz, Yuval /* Revert GRC params to their default */ 56647b6859fbSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 56657b6859fbSMintz, Yuval 5666c965db44STomer Tayar return DBG_STATUS_OK; 5667c965db44STomer Tayar } 5668c965db44STomer Tayar 56698a52bbabSMichal Kalderon static enum dbg_status qed_dbg_ilt_get_dump_buf_size(struct qed_hwfn *p_hwfn, 56708a52bbabSMichal Kalderon struct qed_ptt *p_ptt, 56718a52bbabSMichal Kalderon u32 *buf_size) 56728a52bbabSMichal Kalderon { 56732d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 56748a52bbabSMichal Kalderon 56758a52bbabSMichal Kalderon *buf_size = 0; 56768a52bbabSMichal Kalderon 56778a52bbabSMichal Kalderon if (status != DBG_STATUS_OK) 56788a52bbabSMichal Kalderon return status; 56798a52bbabSMichal Kalderon 56806c95dd8fSPrabhakar Kushwaha *buf_size = qed_ilt_dump(p_hwfn, p_ptt, NULL, 0, false); 56818a52bbabSMichal Kalderon 56828a52bbabSMichal Kalderon return DBG_STATUS_OK; 56838a52bbabSMichal Kalderon } 56848a52bbabSMichal Kalderon 56858a52bbabSMichal Kalderon static enum dbg_status qed_dbg_ilt_dump(struct qed_hwfn *p_hwfn, 56868a52bbabSMichal Kalderon struct qed_ptt *p_ptt, 56878a52bbabSMichal Kalderon u32 *dump_buf, 56888a52bbabSMichal Kalderon u32 buf_size_in_dwords, 56898a52bbabSMichal Kalderon u32 *num_dumped_dwords) 56908a52bbabSMichal Kalderon { 56916c95dd8fSPrabhakar Kushwaha *num_dumped_dwords = qed_ilt_dump(p_hwfn, 56928a52bbabSMichal Kalderon p_ptt, 56936c95dd8fSPrabhakar Kushwaha dump_buf, buf_size_in_dwords, true); 56948a52bbabSMichal Kalderon 56958a52bbabSMichal Kalderon /* Reveret GRC params to their default */ 56968a52bbabSMichal Kalderon qed_dbg_grc_set_params_default(p_hwfn); 56978a52bbabSMichal Kalderon 56988a52bbabSMichal Kalderon return DBG_STATUS_OK; 56998a52bbabSMichal Kalderon } 57008a52bbabSMichal Kalderon 57010ebbd1c8SMintz, Yuval enum dbg_status qed_dbg_read_attn(struct qed_hwfn *p_hwfn, 57020ebbd1c8SMintz, Yuval struct qed_ptt *p_ptt, 57030ebbd1c8SMintz, Yuval enum block_id block_id, 57040ebbd1c8SMintz, Yuval enum dbg_attn_type attn_type, 57050ebbd1c8SMintz, Yuval bool clear_status, 57060ebbd1c8SMintz, Yuval struct dbg_attn_block_result *results) 57070ebbd1c8SMintz, Yuval { 57082d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 57090ebbd1c8SMintz, Yuval u8 reg_idx, num_attn_regs, num_result_regs = 0; 57100ebbd1c8SMintz, Yuval const struct dbg_attn_reg *attn_reg_arr; 57110ebbd1c8SMintz, Yuval 57120ebbd1c8SMintz, Yuval if (status != DBG_STATUS_OK) 57130ebbd1c8SMintz, Yuval return status; 57140ebbd1c8SMintz, Yuval 57152d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr || 57162d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr || 57172d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr) 57180ebbd1c8SMintz, Yuval return DBG_STATUS_DBG_ARRAY_NOT_SET; 57190ebbd1c8SMintz, Yuval 57202d22bc83SMichal Kalderon attn_reg_arr = qed_get_block_attn_regs(p_hwfn, 57212d22bc83SMichal Kalderon block_id, 57220ebbd1c8SMintz, Yuval attn_type, &num_attn_regs); 57230ebbd1c8SMintz, Yuval 57240ebbd1c8SMintz, Yuval for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) { 57250ebbd1c8SMintz, Yuval const struct dbg_attn_reg *reg_data = &attn_reg_arr[reg_idx]; 57260ebbd1c8SMintz, Yuval struct dbg_attn_reg_result *reg_result; 57270ebbd1c8SMintz, Yuval u32 sts_addr, sts_val; 57280ebbd1c8SMintz, Yuval u16 modes_buf_offset; 57290ebbd1c8SMintz, Yuval bool eval_mode; 57300ebbd1c8SMintz, Yuval 57310ebbd1c8SMintz, Yuval /* Check mode */ 57320ebbd1c8SMintz, Yuval eval_mode = GET_FIELD(reg_data->mode.data, 57330ebbd1c8SMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 57340ebbd1c8SMintz, Yuval modes_buf_offset = GET_FIELD(reg_data->mode.data, 57350ebbd1c8SMintz, Yuval DBG_MODE_HDR_MODES_BUF_OFFSET); 57360ebbd1c8SMintz, Yuval if (eval_mode && !qed_is_mode_match(p_hwfn, &modes_buf_offset)) 57370ebbd1c8SMintz, Yuval continue; 57380ebbd1c8SMintz, Yuval 57390ebbd1c8SMintz, Yuval /* Mode match - read attention status register */ 57400ebbd1c8SMintz, Yuval sts_addr = DWORDS_TO_BYTES(clear_status ? 57410ebbd1c8SMintz, Yuval reg_data->sts_clr_address : 57420ebbd1c8SMintz, Yuval GET_FIELD(reg_data->data, 57430ebbd1c8SMintz, Yuval DBG_ATTN_REG_STS_ADDRESS)); 57440ebbd1c8SMintz, Yuval sts_val = qed_rd(p_hwfn, p_ptt, sts_addr); 57450ebbd1c8SMintz, Yuval if (!sts_val) 57460ebbd1c8SMintz, Yuval continue; 57470ebbd1c8SMintz, Yuval 57480ebbd1c8SMintz, Yuval /* Non-zero attention status - add to results */ 57490ebbd1c8SMintz, Yuval reg_result = &results->reg_results[num_result_regs]; 57500ebbd1c8SMintz, Yuval SET_FIELD(reg_result->data, 57510ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_STS_ADDRESS, sts_addr); 57520ebbd1c8SMintz, Yuval SET_FIELD(reg_result->data, 57530ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_NUM_REG_ATTN, 57540ebbd1c8SMintz, Yuval GET_FIELD(reg_data->data, DBG_ATTN_REG_NUM_REG_ATTN)); 57550ebbd1c8SMintz, Yuval reg_result->block_attn_offset = reg_data->block_attn_offset; 57560ebbd1c8SMintz, Yuval reg_result->sts_val = sts_val; 57570ebbd1c8SMintz, Yuval reg_result->mask_val = qed_rd(p_hwfn, 57580ebbd1c8SMintz, Yuval p_ptt, 57590ebbd1c8SMintz, Yuval DWORDS_TO_BYTES 57600ebbd1c8SMintz, Yuval (reg_data->mask_address)); 57610ebbd1c8SMintz, Yuval num_result_regs++; 57620ebbd1c8SMintz, Yuval } 57630ebbd1c8SMintz, Yuval 57640ebbd1c8SMintz, Yuval results->block_id = (u8)block_id; 57650ebbd1c8SMintz, Yuval results->names_offset = 57662d22bc83SMichal Kalderon qed_get_block_attn_data(p_hwfn, block_id, attn_type)->names_offset; 57670ebbd1c8SMintz, Yuval SET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE, attn_type); 57680ebbd1c8SMintz, Yuval SET_FIELD(results->data, 57690ebbd1c8SMintz, Yuval DBG_ATTN_BLOCK_RESULT_NUM_REGS, num_result_regs); 57700ebbd1c8SMintz, Yuval 57710ebbd1c8SMintz, Yuval return DBG_STATUS_OK; 57720ebbd1c8SMintz, Yuval } 57730ebbd1c8SMintz, Yuval 5774c965db44STomer Tayar /******************************* Data Types **********************************/ 5775c965db44STomer Tayar 57767b6859fbSMintz, Yuval /* REG fifo element */ 5777c965db44STomer Tayar struct reg_fifo_element { 5778c965db44STomer Tayar u64 data; 5779c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDRESS_SHIFT 0 5780c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDRESS_MASK 0x7fffff 5781c965db44STomer Tayar #define REG_FIFO_ELEMENT_ACCESS_SHIFT 23 5782c965db44STomer Tayar #define REG_FIFO_ELEMENT_ACCESS_MASK 0x1 5783c965db44STomer Tayar #define REG_FIFO_ELEMENT_PF_SHIFT 24 5784c965db44STomer Tayar #define REG_FIFO_ELEMENT_PF_MASK 0xf 5785c965db44STomer Tayar #define REG_FIFO_ELEMENT_VF_SHIFT 28 5786c965db44STomer Tayar #define REG_FIFO_ELEMENT_VF_MASK 0xff 5787c965db44STomer Tayar #define REG_FIFO_ELEMENT_PORT_SHIFT 36 5788c965db44STomer Tayar #define REG_FIFO_ELEMENT_PORT_MASK 0x3 5789c965db44STomer Tayar #define REG_FIFO_ELEMENT_PRIVILEGE_SHIFT 38 5790c965db44STomer Tayar #define REG_FIFO_ELEMENT_PRIVILEGE_MASK 0x3 5791c965db44STomer Tayar #define REG_FIFO_ELEMENT_PROTECTION_SHIFT 40 5792c965db44STomer Tayar #define REG_FIFO_ELEMENT_PROTECTION_MASK 0x7 5793c965db44STomer Tayar #define REG_FIFO_ELEMENT_MASTER_SHIFT 43 5794c965db44STomer Tayar #define REG_FIFO_ELEMENT_MASTER_MASK 0xf 5795c965db44STomer Tayar #define REG_FIFO_ELEMENT_ERROR_SHIFT 47 5796c965db44STomer Tayar #define REG_FIFO_ELEMENT_ERROR_MASK 0x1f 5797c965db44STomer Tayar }; 5798c965db44STomer Tayar 57992d22bc83SMichal Kalderon /* REG fifo error element */ 58002d22bc83SMichal Kalderon struct reg_fifo_err { 58012d22bc83SMichal Kalderon u32 err_code; 58022d22bc83SMichal Kalderon const char *err_msg; 58032d22bc83SMichal Kalderon }; 58042d22bc83SMichal Kalderon 5805c965db44STomer Tayar /* IGU fifo element */ 5806c965db44STomer Tayar struct igu_fifo_element { 5807c965db44STomer Tayar u32 dword0; 5808c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_FID_SHIFT 0 5809c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_FID_MASK 0xff 5810c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_SHIFT 8 5811c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_MASK 0x1 5812c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_SHIFT 9 5813c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_MASK 0xf 5814c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_SHIFT 13 5815c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_MASK 0xf 5816c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_SHIFT 17 5817c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_MASK 0x7fff 5818c965db44STomer Tayar u32 dword1; 5819c965db44STomer Tayar u32 dword2; 5820c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_SHIFT 0 5821c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_MASK 0x1 5822c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_SHIFT 1 5823c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_MASK 0xffffffff 5824c965db44STomer Tayar u32 reserved; 5825c965db44STomer Tayar }; 5826c965db44STomer Tayar 5827c965db44STomer Tayar struct igu_fifo_wr_data { 5828c965db44STomer Tayar u32 data; 5829c965db44STomer Tayar #define IGU_FIFO_WR_DATA_PROD_CONS_SHIFT 0 5830c965db44STomer Tayar #define IGU_FIFO_WR_DATA_PROD_CONS_MASK 0xffffff 5831c965db44STomer Tayar #define IGU_FIFO_WR_DATA_UPDATE_FLAG_SHIFT 24 5832c965db44STomer Tayar #define IGU_FIFO_WR_DATA_UPDATE_FLAG_MASK 0x1 5833c965db44STomer Tayar #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_SHIFT 25 5834c965db44STomer Tayar #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_MASK 0x3 5835c965db44STomer Tayar #define IGU_FIFO_WR_DATA_SEGMENT_SHIFT 27 5836c965db44STomer Tayar #define IGU_FIFO_WR_DATA_SEGMENT_MASK 0x1 5837c965db44STomer Tayar #define IGU_FIFO_WR_DATA_TIMER_MASK_SHIFT 28 5838c965db44STomer Tayar #define IGU_FIFO_WR_DATA_TIMER_MASK_MASK 0x1 5839c965db44STomer Tayar #define IGU_FIFO_WR_DATA_CMD_TYPE_SHIFT 31 5840c965db44STomer Tayar #define IGU_FIFO_WR_DATA_CMD_TYPE_MASK 0x1 5841c965db44STomer Tayar }; 5842c965db44STomer Tayar 5843c965db44STomer Tayar struct igu_fifo_cleanup_wr_data { 5844c965db44STomer Tayar u32 data; 5845c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_SHIFT 0 5846c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_MASK 0x7ffffff 5847c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_SHIFT 27 5848c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_MASK 0x1 5849c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_SHIFT 28 5850c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_MASK 0x7 5851c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_SHIFT 31 5852c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_MASK 0x1 5853c965db44STomer Tayar }; 5854c965db44STomer Tayar 5855c965db44STomer Tayar /* Protection override element */ 5856c965db44STomer Tayar struct protection_override_element { 5857c965db44STomer Tayar u64 data; 5858c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_SHIFT 0 5859c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_MASK 0x7fffff 5860c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_SHIFT 23 5861c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_MASK 0xffffff 5862c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_SHIFT 47 5863c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_MASK 0x1 5864c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_SHIFT 48 5865c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_MASK 0x1 5866c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_SHIFT 49 5867c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_MASK 0x7 5868c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_SHIFT 52 5869c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_MASK 0x7 5870c965db44STomer Tayar }; 5871c965db44STomer Tayar 5872c965db44STomer Tayar enum igu_fifo_sources { 5873c965db44STomer Tayar IGU_SRC_PXP0, 5874c965db44STomer Tayar IGU_SRC_PXP1, 5875c965db44STomer Tayar IGU_SRC_PXP2, 5876c965db44STomer Tayar IGU_SRC_PXP3, 5877c965db44STomer Tayar IGU_SRC_PXP4, 5878c965db44STomer Tayar IGU_SRC_PXP5, 5879c965db44STomer Tayar IGU_SRC_PXP6, 5880c965db44STomer Tayar IGU_SRC_PXP7, 5881c965db44STomer Tayar IGU_SRC_CAU, 5882c965db44STomer Tayar IGU_SRC_ATTN, 5883c965db44STomer Tayar IGU_SRC_GRC 5884c965db44STomer Tayar }; 5885c965db44STomer Tayar 5886c965db44STomer Tayar enum igu_fifo_addr_types { 5887c965db44STomer Tayar IGU_ADDR_TYPE_MSIX_MEM, 5888c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_PBA, 5889c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_INT_ACK, 5890c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS, 5891c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT, 5892c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_PROD_UPDATE, 5893c965db44STomer Tayar IGU_ADDR_TYPE_RESERVED 5894c965db44STomer Tayar }; 5895c965db44STomer Tayar 5896c965db44STomer Tayar struct igu_fifo_addr_data { 5897c965db44STomer Tayar u16 start_addr; 5898c965db44STomer Tayar u16 end_addr; 5899c965db44STomer Tayar char *desc; 5900c965db44STomer Tayar char *vf_desc; 5901c965db44STomer Tayar enum igu_fifo_addr_types type; 5902c965db44STomer Tayar }; 5903c965db44STomer Tayar 5904c965db44STomer Tayar /******************************** Constants **********************************/ 5905c965db44STomer Tayar 5906c965db44STomer Tayar #define MAX_MSG_LEN 1024 59077b6859fbSMintz, Yuval 5908c965db44STomer Tayar #define MCP_TRACE_MAX_MODULE_LEN 8 5909c965db44STomer Tayar #define MCP_TRACE_FORMAT_MAX_PARAMS 3 5910c965db44STomer Tayar #define MCP_TRACE_FORMAT_PARAM_WIDTH \ 59112d22bc83SMichal Kalderon (MCP_TRACE_FORMAT_P2_SIZE_OFFSET - MCP_TRACE_FORMAT_P1_SIZE_OFFSET) 59127b6859fbSMintz, Yuval 5913c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDR_FACTOR 4 5914c965db44STomer Tayar #define REG_FIFO_ELEMENT_IS_PF_VF_VAL 127 59157b6859fbSMintz, Yuval 5916c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR 4 5917c965db44STomer Tayar 5918c965db44STomer Tayar /***************************** Constant Arrays *******************************/ 5919c965db44STomer Tayar 5920c965db44STomer Tayar /* Status string array */ 5921c965db44STomer Tayar static const char * const s_status_str[] = { 59227b6859fbSMintz, Yuval /* DBG_STATUS_OK */ 5923c965db44STomer Tayar "Operation completed successfully", 59247b6859fbSMintz, Yuval 59257b6859fbSMintz, Yuval /* DBG_STATUS_APP_VERSION_NOT_SET */ 5926c965db44STomer Tayar "Debug application version wasn't set", 59277b6859fbSMintz, Yuval 59287b6859fbSMintz, Yuval /* DBG_STATUS_UNSUPPORTED_APP_VERSION */ 5929c965db44STomer Tayar "Unsupported debug application version", 59307b6859fbSMintz, Yuval 59317b6859fbSMintz, Yuval /* DBG_STATUS_DBG_BLOCK_NOT_RESET */ 5932c965db44STomer Tayar "The debug block wasn't reset since the last recording", 59337b6859fbSMintz, Yuval 59347b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_ARGS */ 5935c965db44STomer Tayar "Invalid arguments", 59367b6859fbSMintz, Yuval 59377b6859fbSMintz, Yuval /* DBG_STATUS_OUTPUT_ALREADY_SET */ 5938c965db44STomer Tayar "The debug output was already set", 59397b6859fbSMintz, Yuval 59407b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_PCI_BUF_SIZE */ 5941c965db44STomer Tayar "Invalid PCI buffer size", 59427b6859fbSMintz, Yuval 59437b6859fbSMintz, Yuval /* DBG_STATUS_PCI_BUF_ALLOC_FAILED */ 5944c965db44STomer Tayar "PCI buffer allocation failed", 59457b6859fbSMintz, Yuval 59467b6859fbSMintz, Yuval /* DBG_STATUS_PCI_BUF_NOT_ALLOCATED */ 5947c965db44STomer Tayar "A PCI buffer wasn't allocated", 59487b6859fbSMintz, Yuval 59492d22bc83SMichal Kalderon /* DBG_STATUS_INVALID_FILTER_TRIGGER_DWORDS */ 59502d22bc83SMichal Kalderon "The filter/trigger constraint dword offsets are not enabled for recording", 5951a5124386SColin Ian King /* DBG_STATUS_NO_MATCHING_FRAMING_MODE */ 5952a5124386SColin Ian King "No matching framing mode", 59537b6859fbSMintz, Yuval 59542d22bc83SMichal Kalderon /* DBG_STATUS_VFC_READ_ERROR */ 59552d22bc83SMichal Kalderon "Error reading from VFC", 59567b6859fbSMintz, Yuval 59577b6859fbSMintz, Yuval /* DBG_STATUS_STORM_ALREADY_ENABLED */ 5958c965db44STomer Tayar "The Storm was already enabled", 59597b6859fbSMintz, Yuval 59607b6859fbSMintz, Yuval /* DBG_STATUS_STORM_NOT_ENABLED */ 5961c965db44STomer Tayar "The specified Storm wasn't enabled", 59627b6859fbSMintz, Yuval 59637b6859fbSMintz, Yuval /* DBG_STATUS_BLOCK_ALREADY_ENABLED */ 5964c965db44STomer Tayar "The block was already enabled", 59657b6859fbSMintz, Yuval 59667b6859fbSMintz, Yuval /* DBG_STATUS_BLOCK_NOT_ENABLED */ 5967c965db44STomer Tayar "The specified block wasn't enabled", 59687b6859fbSMintz, Yuval 59697b6859fbSMintz, Yuval /* DBG_STATUS_NO_INPUT_ENABLED */ 5970c965db44STomer Tayar "No input was enabled for recording", 59717b6859fbSMintz, Yuval 59722d22bc83SMichal Kalderon /* DBG_STATUS_NO_FILTER_TRIGGER_256B */ 59732d22bc83SMichal Kalderon "Filters and triggers are not allowed in E4 256-bit mode", 59747b6859fbSMintz, Yuval 59757b6859fbSMintz, Yuval /* DBG_STATUS_FILTER_ALREADY_ENABLED */ 5976c965db44STomer Tayar "The filter was already enabled", 59777b6859fbSMintz, Yuval 59787b6859fbSMintz, Yuval /* DBG_STATUS_TRIGGER_ALREADY_ENABLED */ 5979c965db44STomer Tayar "The trigger was already enabled", 59807b6859fbSMintz, Yuval 59817b6859fbSMintz, Yuval /* DBG_STATUS_TRIGGER_NOT_ENABLED */ 5982c965db44STomer Tayar "The trigger wasn't enabled", 59837b6859fbSMintz, Yuval 59847b6859fbSMintz, Yuval /* DBG_STATUS_CANT_ADD_CONSTRAINT */ 5985c965db44STomer Tayar "A constraint can be added only after a filter was enabled or a trigger state was added", 59867b6859fbSMintz, Yuval 59877b6859fbSMintz, Yuval /* DBG_STATUS_TOO_MANY_TRIGGER_STATES */ 5988c965db44STomer Tayar "Cannot add more than 3 trigger states", 59897b6859fbSMintz, Yuval 59907b6859fbSMintz, Yuval /* DBG_STATUS_TOO_MANY_CONSTRAINTS */ 5991c965db44STomer Tayar "Cannot add more than 4 constraints per filter or trigger state", 59927b6859fbSMintz, Yuval 59937b6859fbSMintz, Yuval /* DBG_STATUS_RECORDING_NOT_STARTED */ 5994c965db44STomer Tayar "The recording wasn't started", 59957b6859fbSMintz, Yuval 59967b6859fbSMintz, Yuval /* DBG_STATUS_DATA_DIDNT_TRIGGER */ 5997c965db44STomer Tayar "A trigger was configured, but it didn't trigger", 59987b6859fbSMintz, Yuval 59997b6859fbSMintz, Yuval /* DBG_STATUS_NO_DATA_RECORDED */ 6000c965db44STomer Tayar "No data was recorded", 60017b6859fbSMintz, Yuval 60027b6859fbSMintz, Yuval /* DBG_STATUS_DUMP_BUF_TOO_SMALL */ 6003c965db44STomer Tayar "Dump buffer is too small", 60047b6859fbSMintz, Yuval 60057b6859fbSMintz, Yuval /* DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED */ 6006c965db44STomer Tayar "Dumped data is not aligned to chunks", 60077b6859fbSMintz, Yuval 60087b6859fbSMintz, Yuval /* DBG_STATUS_UNKNOWN_CHIP */ 6009c965db44STomer Tayar "Unknown chip", 60107b6859fbSMintz, Yuval 60117b6859fbSMintz, Yuval /* DBG_STATUS_VIRT_MEM_ALLOC_FAILED */ 6012c965db44STomer Tayar "Failed allocating virtual memory", 60137b6859fbSMintz, Yuval 60147b6859fbSMintz, Yuval /* DBG_STATUS_BLOCK_IN_RESET */ 6015c965db44STomer Tayar "The input block is in reset", 60167b6859fbSMintz, Yuval 60177b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_TRACE_SIGNATURE */ 6018c965db44STomer Tayar "Invalid MCP trace signature found in NVRAM", 60197b6859fbSMintz, Yuval 60207b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_NVRAM_BUNDLE */ 6021c965db44STomer Tayar "Invalid bundle ID found in NVRAM", 60227b6859fbSMintz, Yuval 60237b6859fbSMintz, Yuval /* DBG_STATUS_NVRAM_GET_IMAGE_FAILED */ 6024c965db44STomer Tayar "Failed getting NVRAM image", 60257b6859fbSMintz, Yuval 60267b6859fbSMintz, Yuval /* DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE */ 6027c965db44STomer Tayar "NVRAM image is not dword-aligned", 60287b6859fbSMintz, Yuval 60297b6859fbSMintz, Yuval /* DBG_STATUS_NVRAM_READ_FAILED */ 6030c965db44STomer Tayar "Failed reading from NVRAM", 60317b6859fbSMintz, Yuval 60327b6859fbSMintz, Yuval /* DBG_STATUS_IDLE_CHK_PARSE_FAILED */ 6033c965db44STomer Tayar "Idle check parsing failed", 60347b6859fbSMintz, Yuval 60357b6859fbSMintz, Yuval /* DBG_STATUS_MCP_TRACE_BAD_DATA */ 6036c965db44STomer Tayar "MCP Trace data is corrupt", 60377b6859fbSMintz, Yuval 60387b6859fbSMintz, Yuval /* DBG_STATUS_MCP_TRACE_NO_META */ 60397b6859fbSMintz, Yuval "Dump doesn't contain meta data - it must be provided in image file", 60407b6859fbSMintz, Yuval 60417b6859fbSMintz, Yuval /* DBG_STATUS_MCP_COULD_NOT_HALT */ 6042c965db44STomer Tayar "Failed to halt MCP", 60437b6859fbSMintz, Yuval 60447b6859fbSMintz, Yuval /* DBG_STATUS_MCP_COULD_NOT_RESUME */ 6045c965db44STomer Tayar "Failed to resume MCP after halt", 60467b6859fbSMintz, Yuval 60472d22bc83SMichal Kalderon /* DBG_STATUS_RESERVED0 */ 60482d22bc83SMichal Kalderon "", 60497b6859fbSMintz, Yuval 60507b6859fbSMintz, Yuval /* DBG_STATUS_SEMI_FIFO_NOT_EMPTY */ 6051c965db44STomer Tayar "Failed to empty SEMI sync FIFO", 60527b6859fbSMintz, Yuval 60537b6859fbSMintz, Yuval /* DBG_STATUS_IGU_FIFO_BAD_DATA */ 6054c965db44STomer Tayar "IGU FIFO data is corrupt", 60557b6859fbSMintz, Yuval 60567b6859fbSMintz, Yuval /* DBG_STATUS_MCP_COULD_NOT_MASK_PRTY */ 6057c965db44STomer Tayar "MCP failed to mask parities", 60587b6859fbSMintz, Yuval 60597b6859fbSMintz, Yuval /* DBG_STATUS_FW_ASSERTS_PARSE_FAILED */ 6060c965db44STomer Tayar "FW Asserts parsing failed", 60617b6859fbSMintz, Yuval 60627b6859fbSMintz, Yuval /* DBG_STATUS_REG_FIFO_BAD_DATA */ 6063c965db44STomer Tayar "GRC FIFO data is corrupt", 60647b6859fbSMintz, Yuval 60657b6859fbSMintz, Yuval /* DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA */ 6066c965db44STomer Tayar "Protection Override data is corrupt", 60677b6859fbSMintz, Yuval 60687b6859fbSMintz, Yuval /* DBG_STATUS_DBG_ARRAY_NOT_SET */ 6069c965db44STomer Tayar "Debug arrays were not set (when using binary files, dbg_set_bin_ptr must be called)", 60707b6859fbSMintz, Yuval 60712d22bc83SMichal Kalderon /* DBG_STATUS_RESERVED1 */ 60722d22bc83SMichal Kalderon "", 60737b6859fbSMintz, Yuval 60747b6859fbSMintz, Yuval /* DBG_STATUS_NON_MATCHING_LINES */ 60752d22bc83SMichal Kalderon "Non-matching debug lines - in E4, all lines must be of the same type (either 128b or 256b)", 60767b6859fbSMintz, Yuval 60772d22bc83SMichal Kalderon /* DBG_STATUS_INSUFFICIENT_HW_IDS */ 60782d22bc83SMichal Kalderon "Insufficient HW IDs. Try to record less Storms/blocks", 60797b6859fbSMintz, Yuval 60807b6859fbSMintz, Yuval /* DBG_STATUS_DBG_BUS_IN_USE */ 60812d22bc83SMichal Kalderon "The debug bus is in use", 60822d22bc83SMichal Kalderon 60832d22bc83SMichal Kalderon /* DBG_STATUS_INVALID_STORM_DBG_MODE */ 60842d22bc83SMichal Kalderon "The storm debug mode is not supported in the current chip", 60852d22bc83SMichal Kalderon 60862d22bc83SMichal Kalderon /* DBG_STATUS_OTHER_ENGINE_BB_ONLY */ 60872d22bc83SMichal Kalderon "Other engine is supported only in BB", 60882d22bc83SMichal Kalderon 60892d22bc83SMichal Kalderon /* DBG_STATUS_FILTER_SINGLE_HW_ID */ 60902d22bc83SMichal Kalderon "The configured filter mode requires a single Storm/block input", 60912d22bc83SMichal Kalderon 60922d22bc83SMichal Kalderon /* DBG_STATUS_TRIGGER_SINGLE_HW_ID */ 60932d22bc83SMichal Kalderon "The configured filter mode requires that all the constraints of a single trigger state will be defined on a single Storm/block input", 60942d22bc83SMichal Kalderon 60952d22bc83SMichal Kalderon /* DBG_STATUS_MISSING_TRIGGER_STATE_STORM */ 60966c95dd8fSPrabhakar Kushwaha "When triggering on Storm data, the Storm to trigger on must be specified", 60976c95dd8fSPrabhakar Kushwaha 60986c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_FAILED_TO_REQUEST_OFFSIZE */ 60996c95dd8fSPrabhakar Kushwaha "Failed to request MDUMP2 Offsize", 61006c95dd8fSPrabhakar Kushwaha 61016c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_FAILED_VALIDATION_OF_DATA_CRC */ 61026c95dd8fSPrabhakar Kushwaha "Expected CRC (part of the MDUMP2 data) is different than the calculated CRC over that data", 61036c95dd8fSPrabhakar Kushwaha 61046c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_INVALID_SIGNATURE */ 61056c95dd8fSPrabhakar Kushwaha "Invalid Signature found at start of MDUMP2", 61066c95dd8fSPrabhakar Kushwaha 61076c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_INVALID_LOG_SIZE */ 61086c95dd8fSPrabhakar Kushwaha "Invalid Log Size of MDUMP2", 61096c95dd8fSPrabhakar Kushwaha 61106c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_INVALID_LOG_HDR */ 61116c95dd8fSPrabhakar Kushwaha "Invalid Log Header of MDUMP2", 61126c95dd8fSPrabhakar Kushwaha 61136c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_INVALID_LOG_DATA */ 61146c95dd8fSPrabhakar Kushwaha "Invalid Log Data of MDUMP2", 61156c95dd8fSPrabhakar Kushwaha 61166c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_EXTRACTING_NUM_PORTS */ 61176c95dd8fSPrabhakar Kushwaha "Could not extract number of ports from regval buf of MDUMP2", 61186c95dd8fSPrabhakar Kushwaha 61196c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_EXTRACTING_MFW_STATUS */ 61206c95dd8fSPrabhakar Kushwaha "Could not extract MFW (link) status from regval buf of MDUMP2", 61216c95dd8fSPrabhakar Kushwaha 61226c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_DISPLAYING_LINKDUMP */ 61236c95dd8fSPrabhakar Kushwaha "Could not display linkdump of MDUMP2", 61246c95dd8fSPrabhakar Kushwaha 61256c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_READING_PHY_CFG */ 61266c95dd8fSPrabhakar Kushwaha "Could not read PHY CFG of MDUMP2", 61276c95dd8fSPrabhakar Kushwaha 61286c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_READING_PLL_MODE */ 61296c95dd8fSPrabhakar Kushwaha "Could not read PLL Mode of MDUMP2", 61306c95dd8fSPrabhakar Kushwaha 61316c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_READING_LANE_REGS */ 61326c95dd8fSPrabhakar Kushwaha "Could not read TSCF/TSCE Lane Regs of MDUMP2", 61336c95dd8fSPrabhakar Kushwaha 61346c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_ALLOCATING_BUF */ 61356c95dd8fSPrabhakar Kushwaha "Could not allocate MDUMP2 reg-val internal buffer" 6136c965db44STomer Tayar }; 6137c965db44STomer Tayar 6138c965db44STomer Tayar /* Idle check severity names array */ 6139c965db44STomer Tayar static const char * const s_idle_chk_severity_str[] = { 6140c965db44STomer Tayar "Error", 6141c965db44STomer Tayar "Error if no traffic", 6142c965db44STomer Tayar "Warning" 6143c965db44STomer Tayar }; 6144c965db44STomer Tayar 6145c965db44STomer Tayar /* MCP Trace level names array */ 6146c965db44STomer Tayar static const char * const s_mcp_trace_level_str[] = { 6147c965db44STomer Tayar "ERROR", 6148c965db44STomer Tayar "TRACE", 6149c965db44STomer Tayar "DEBUG" 6150c965db44STomer Tayar }; 6151c965db44STomer Tayar 61527b6859fbSMintz, Yuval /* Access type names array */ 6153c965db44STomer Tayar static const char * const s_access_strs[] = { 6154c965db44STomer Tayar "read", 6155c965db44STomer Tayar "write" 6156c965db44STomer Tayar }; 6157c965db44STomer Tayar 61587b6859fbSMintz, Yuval /* Privilege type names array */ 6159c965db44STomer Tayar static const char * const s_privilege_strs[] = { 6160c965db44STomer Tayar "VF", 6161c965db44STomer Tayar "PDA", 6162c965db44STomer Tayar "HV", 6163c965db44STomer Tayar "UA" 6164c965db44STomer Tayar }; 6165c965db44STomer Tayar 61667b6859fbSMintz, Yuval /* Protection type names array */ 6167c965db44STomer Tayar static const char * const s_protection_strs[] = { 6168c965db44STomer Tayar "(default)", 6169c965db44STomer Tayar "(default)", 6170c965db44STomer Tayar "(default)", 6171c965db44STomer Tayar "(default)", 6172c965db44STomer Tayar "override VF", 6173c965db44STomer Tayar "override PDA", 6174c965db44STomer Tayar "override HV", 6175c965db44STomer Tayar "override UA" 6176c965db44STomer Tayar }; 6177c965db44STomer Tayar 61787b6859fbSMintz, Yuval /* Master type names array */ 6179c965db44STomer Tayar static const char * const s_master_strs[] = { 6180c965db44STomer Tayar "???", 6181c965db44STomer Tayar "pxp", 6182c965db44STomer Tayar "mcp", 6183c965db44STomer Tayar "msdm", 6184c965db44STomer Tayar "psdm", 6185c965db44STomer Tayar "ysdm", 6186c965db44STomer Tayar "usdm", 6187c965db44STomer Tayar "tsdm", 6188c965db44STomer Tayar "xsdm", 6189c965db44STomer Tayar "dbu", 6190c965db44STomer Tayar "dmae", 61912d22bc83SMichal Kalderon "jdap", 6192c965db44STomer Tayar "???", 6193c965db44STomer Tayar "???", 6194c965db44STomer Tayar "???", 6195c965db44STomer Tayar "???" 6196c965db44STomer Tayar }; 6197c965db44STomer Tayar 61987b6859fbSMintz, Yuval /* REG FIFO error messages array */ 61992d22bc83SMichal Kalderon static struct reg_fifo_err s_reg_fifo_errors[] = { 62002d22bc83SMichal Kalderon {1, "grc timeout"}, 62012d22bc83SMichal Kalderon {2, "address doesn't belong to any block"}, 62022d22bc83SMichal Kalderon {4, "reserved address in block or write to read-only address"}, 62032d22bc83SMichal Kalderon {8, "privilege/protection mismatch"}, 62042d22bc83SMichal Kalderon {16, "path isolation error"}, 62052d22bc83SMichal Kalderon {17, "RSL error"} 6206c965db44STomer Tayar }; 6207c965db44STomer Tayar 62087b6859fbSMintz, Yuval /* IGU FIFO sources array */ 6209c965db44STomer Tayar static const char * const s_igu_fifo_source_strs[] = { 6210c965db44STomer Tayar "TSTORM", 6211c965db44STomer Tayar "MSTORM", 6212c965db44STomer Tayar "USTORM", 6213c965db44STomer Tayar "XSTORM", 6214c965db44STomer Tayar "YSTORM", 6215c965db44STomer Tayar "PSTORM", 6216c965db44STomer Tayar "PCIE", 6217c965db44STomer Tayar "NIG_QM_PBF", 6218c965db44STomer Tayar "CAU", 6219c965db44STomer Tayar "ATTN", 6220c965db44STomer Tayar "GRC", 6221c965db44STomer Tayar }; 6222c965db44STomer Tayar 62237b6859fbSMintz, Yuval /* IGU FIFO error messages */ 6224c965db44STomer Tayar static const char * const s_igu_fifo_error_strs[] = { 6225c965db44STomer Tayar "no error", 6226c965db44STomer Tayar "length error", 6227c965db44STomer Tayar "function disabled", 62281d510657SColin Ian King "VF sent command to attention address", 6229c965db44STomer Tayar "host sent prod update command", 6230c965db44STomer Tayar "read of during interrupt register while in MIMD mode", 6231c965db44STomer Tayar "access to PXP BAR reserved address", 6232c965db44STomer Tayar "producer update command to attention index", 6233c965db44STomer Tayar "unknown error", 6234c965db44STomer Tayar "SB index not valid", 6235c965db44STomer Tayar "SB relative index and FID not found", 6236c965db44STomer Tayar "FID not match", 6237c965db44STomer Tayar "command with error flag asserted (PCI error or CAU discard)", 6238c965db44STomer Tayar "VF sent cleanup and RF cleanup is disabled", 6239c965db44STomer Tayar "cleanup command on type bigger than 4" 6240c965db44STomer Tayar }; 6241c965db44STomer Tayar 6242c965db44STomer Tayar /* IGU FIFO address data */ 6243c965db44STomer Tayar static const struct igu_fifo_addr_data s_igu_fifo_addr_data[] = { 62447b6859fbSMintz, Yuval {0x0, 0x101, "MSI-X Memory", NULL, 62457b6859fbSMintz, Yuval IGU_ADDR_TYPE_MSIX_MEM}, 62467b6859fbSMintz, Yuval {0x102, 0x1ff, "reserved", NULL, 62477b6859fbSMintz, Yuval IGU_ADDR_TYPE_RESERVED}, 62487b6859fbSMintz, Yuval {0x200, 0x200, "Write PBA[0:63]", NULL, 62497b6859fbSMintz, Yuval IGU_ADDR_TYPE_WRITE_PBA}, 6250c965db44STomer Tayar {0x201, 0x201, "Write PBA[64:127]", "reserved", 6251c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_PBA}, 62527b6859fbSMintz, Yuval {0x202, 0x202, "Write PBA[128]", "reserved", 62537b6859fbSMintz, Yuval IGU_ADDR_TYPE_WRITE_PBA}, 62547b6859fbSMintz, Yuval {0x203, 0x3ff, "reserved", NULL, 62557b6859fbSMintz, Yuval IGU_ADDR_TYPE_RESERVED}, 6256c965db44STomer Tayar {0x400, 0x5ef, "Write interrupt acknowledgment", NULL, 6257c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_INT_ACK}, 6258c965db44STomer Tayar {0x5f0, 0x5f0, "Attention bits update", NULL, 6259c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS}, 6260c965db44STomer Tayar {0x5f1, 0x5f1, "Attention bits set", NULL, 6261c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS}, 6262c965db44STomer Tayar {0x5f2, 0x5f2, "Attention bits clear", NULL, 6263c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS}, 6264c965db44STomer Tayar {0x5f3, 0x5f3, "Read interrupt 0:63 with mask", NULL, 6265c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 6266c965db44STomer Tayar {0x5f4, 0x5f4, "Read interrupt 0:31 with mask", NULL, 6267c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 6268c965db44STomer Tayar {0x5f5, 0x5f5, "Read interrupt 32:63 with mask", NULL, 6269c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 6270c965db44STomer Tayar {0x5f6, 0x5f6, "Read interrupt 0:63 without mask", NULL, 6271c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 62727b6859fbSMintz, Yuval {0x5f7, 0x5ff, "reserved", NULL, 62737b6859fbSMintz, Yuval IGU_ADDR_TYPE_RESERVED}, 62747b6859fbSMintz, Yuval {0x600, 0x7ff, "Producer update", NULL, 62757b6859fbSMintz, Yuval IGU_ADDR_TYPE_WRITE_PROD_UPDATE} 6276c965db44STomer Tayar }; 6277c965db44STomer Tayar 6278c965db44STomer Tayar /******************************** Variables **********************************/ 6279c965db44STomer Tayar 6280c965db44STomer Tayar /* Temporary buffer, used for print size calculations */ 6281c965db44STomer Tayar static char s_temp_buf[MAX_MSG_LEN]; 6282c965db44STomer Tayar 62837b6859fbSMintz, Yuval /**************************** Private Functions ******************************/ 6284c965db44STomer Tayar 62856c95dd8fSPrabhakar Kushwaha static void qed_user_static_asserts(void) 62866c95dd8fSPrabhakar Kushwaha { 62876c95dd8fSPrabhakar Kushwaha } 62886c95dd8fSPrabhakar Kushwaha 6289c965db44STomer Tayar static u32 qed_cyclic_add(u32 a, u32 b, u32 size) 6290c965db44STomer Tayar { 6291c965db44STomer Tayar return (a + b) % size; 6292c965db44STomer Tayar } 6293c965db44STomer Tayar 6294c965db44STomer Tayar static u32 qed_cyclic_sub(u32 a, u32 b, u32 size) 6295c965db44STomer Tayar { 6296c965db44STomer Tayar return (size + a - b) % size; 6297c965db44STomer Tayar } 6298c965db44STomer Tayar 6299c965db44STomer Tayar /* Reads the specified number of bytes from the specified cyclic buffer (up to 4 6300c965db44STomer Tayar * bytes) and returns them as a dword value. the specified buffer offset is 6301c965db44STomer Tayar * updated. 6302c965db44STomer Tayar */ 6303c965db44STomer Tayar static u32 qed_read_from_cyclic_buf(void *buf, 6304c965db44STomer Tayar u32 *offset, 6305c965db44STomer Tayar u32 buf_size, u8 num_bytes_to_read) 6306c965db44STomer Tayar { 63077b6859fbSMintz, Yuval u8 i, *val_ptr, *bytes_buf = (u8 *)buf; 6308c965db44STomer Tayar u32 val = 0; 6309c965db44STomer Tayar 6310c965db44STomer Tayar val_ptr = (u8 *)&val; 6311c965db44STomer Tayar 631250bc60cbSMichal Kalderon /* Assume running on a LITTLE ENDIAN and the buffer is network order 631350bc60cbSMichal Kalderon * (BIG ENDIAN), as high order bytes are placed in lower memory address. 631450bc60cbSMichal Kalderon */ 6315c965db44STomer Tayar for (i = 0; i < num_bytes_to_read; i++) { 6316c965db44STomer Tayar val_ptr[i] = bytes_buf[*offset]; 6317c965db44STomer Tayar *offset = qed_cyclic_add(*offset, 1, buf_size); 6318c965db44STomer Tayar } 6319c965db44STomer Tayar 6320c965db44STomer Tayar return val; 6321c965db44STomer Tayar } 6322c965db44STomer Tayar 6323c965db44STomer Tayar /* Reads and returns the next byte from the specified buffer. 6324c965db44STomer Tayar * The specified buffer offset is updated. 6325c965db44STomer Tayar */ 6326c965db44STomer Tayar static u8 qed_read_byte_from_buf(void *buf, u32 *offset) 6327c965db44STomer Tayar { 6328c965db44STomer Tayar return ((u8 *)buf)[(*offset)++]; 6329c965db44STomer Tayar } 6330c965db44STomer Tayar 6331c965db44STomer Tayar /* Reads and returns the next dword from the specified buffer. 6332c965db44STomer Tayar * The specified buffer offset is updated. 6333c965db44STomer Tayar */ 6334c965db44STomer Tayar static u32 qed_read_dword_from_buf(void *buf, u32 *offset) 6335c965db44STomer Tayar { 6336c965db44STomer Tayar u32 dword_val = *(u32 *)&((u8 *)buf)[*offset]; 6337c965db44STomer Tayar 6338c965db44STomer Tayar *offset += 4; 63397b6859fbSMintz, Yuval 6340c965db44STomer Tayar return dword_val; 6341c965db44STomer Tayar } 6342c965db44STomer Tayar 6343c965db44STomer Tayar /* Reads the next string from the specified buffer, and copies it to the 6344c965db44STomer Tayar * specified pointer. The specified buffer offset is updated. 6345c965db44STomer Tayar */ 6346c965db44STomer Tayar static void qed_read_str_from_buf(void *buf, u32 *offset, u32 size, char *dest) 6347c965db44STomer Tayar { 6348c965db44STomer Tayar const char *source_str = &((const char *)buf)[*offset]; 6349c965db44STomer Tayar 6350c965db44STomer Tayar strncpy(dest, source_str, size); 6351c965db44STomer Tayar dest[size - 1] = '\0'; 6352c965db44STomer Tayar *offset += size; 6353c965db44STomer Tayar } 6354c965db44STomer Tayar 6355c965db44STomer Tayar /* Returns a pointer to the specified offset (in bytes) of the specified buffer. 6356c965db44STomer Tayar * If the specified buffer in NULL, a temporary buffer pointer is returned. 6357c965db44STomer Tayar */ 6358c965db44STomer Tayar static char *qed_get_buf_ptr(void *buf, u32 offset) 6359c965db44STomer Tayar { 6360c965db44STomer Tayar return buf ? (char *)buf + offset : s_temp_buf; 6361c965db44STomer Tayar } 6362c965db44STomer Tayar 6363c965db44STomer Tayar /* Reads a param from the specified buffer. Returns the number of dwords read. 6364c965db44STomer Tayar * If the returned str_param is NULL, the param is numeric and its value is 6365c965db44STomer Tayar * returned in num_param. 6366c965db44STomer Tayar * Otheriwise, the param is a string and its pointer is returned in str_param. 6367c965db44STomer Tayar */ 6368c965db44STomer Tayar static u32 qed_read_param(u32 *dump_buf, 6369c965db44STomer Tayar const char **param_name, 6370c965db44STomer Tayar const char **param_str_val, u32 *param_num_val) 6371c965db44STomer Tayar { 6372c965db44STomer Tayar char *char_buf = (char *)dump_buf; 63737b6859fbSMintz, Yuval size_t offset = 0; 6374c965db44STomer Tayar 6375c965db44STomer Tayar /* Extract param name */ 6376c965db44STomer Tayar *param_name = char_buf; 6377c965db44STomer Tayar offset += strlen(*param_name) + 1; 6378c965db44STomer Tayar 6379c965db44STomer Tayar /* Check param type */ 6380c965db44STomer Tayar if (*(char_buf + offset++)) { 6381c965db44STomer Tayar /* String param */ 6382c965db44STomer Tayar *param_str_val = char_buf + offset; 6383da090917STomer Tayar *param_num_val = 0; 6384c965db44STomer Tayar offset += strlen(*param_str_val) + 1; 6385c965db44STomer Tayar if (offset & 0x3) 6386c965db44STomer Tayar offset += (4 - (offset & 0x3)); 6387c965db44STomer Tayar } else { 6388c965db44STomer Tayar /* Numeric param */ 6389c965db44STomer Tayar *param_str_val = NULL; 6390c965db44STomer Tayar if (offset & 0x3) 6391c965db44STomer Tayar offset += (4 - (offset & 0x3)); 6392c965db44STomer Tayar *param_num_val = *(u32 *)(char_buf + offset); 6393c965db44STomer Tayar offset += 4; 6394c965db44STomer Tayar } 6395c965db44STomer Tayar 639650bc60cbSMichal Kalderon return (u32)offset / 4; 6397c965db44STomer Tayar } 6398c965db44STomer Tayar 6399c965db44STomer Tayar /* Reads a section header from the specified buffer. 6400c965db44STomer Tayar * Returns the number of dwords read. 6401c965db44STomer Tayar */ 6402c965db44STomer Tayar static u32 qed_read_section_hdr(u32 *dump_buf, 6403c965db44STomer Tayar const char **section_name, 6404c965db44STomer Tayar u32 *num_section_params) 6405c965db44STomer Tayar { 6406c965db44STomer Tayar const char *param_str_val; 6407c965db44STomer Tayar 6408c965db44STomer Tayar return qed_read_param(dump_buf, 6409c965db44STomer Tayar section_name, ¶m_str_val, num_section_params); 6410c965db44STomer Tayar } 6411c965db44STomer Tayar 6412c965db44STomer Tayar /* Reads section params from the specified buffer and prints them to the results 6413c965db44STomer Tayar * buffer. Returns the number of dwords read. 6414c965db44STomer Tayar */ 6415c965db44STomer Tayar static u32 qed_print_section_params(u32 *dump_buf, 6416c965db44STomer Tayar u32 num_section_params, 6417c965db44STomer Tayar char *results_buf, u32 *num_chars_printed) 6418c965db44STomer Tayar { 6419c965db44STomer Tayar u32 i, dump_offset = 0, results_offset = 0; 6420c965db44STomer Tayar 6421c965db44STomer Tayar for (i = 0; i < num_section_params; i++) { 64227b6859fbSMintz, Yuval const char *param_name, *param_str_val; 6423c965db44STomer Tayar u32 param_num_val = 0; 6424c965db44STomer Tayar 6425c965db44STomer Tayar dump_offset += qed_read_param(dump_buf + dump_offset, 6426c965db44STomer Tayar ¶m_name, 6427c965db44STomer Tayar ¶m_str_val, ¶m_num_val); 64287b6859fbSMintz, Yuval 6429c965db44STomer Tayar if (param_str_val) 6430c965db44STomer Tayar results_offset += 6431c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6432c965db44STomer Tayar results_offset), 6433c965db44STomer Tayar "%s: %s\n", param_name, param_str_val); 6434c965db44STomer Tayar else if (strcmp(param_name, "fw-timestamp")) 6435c965db44STomer Tayar results_offset += 6436c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6437c965db44STomer Tayar results_offset), 6438c965db44STomer Tayar "%s: %d\n", param_name, param_num_val); 6439c965db44STomer Tayar } 6440c965db44STomer Tayar 64417b6859fbSMintz, Yuval results_offset += sprintf(qed_get_buf_ptr(results_buf, results_offset), 64427b6859fbSMintz, Yuval "\n"); 6443c965db44STomer Tayar 64447b6859fbSMintz, Yuval *num_chars_printed = results_offset; 64457b6859fbSMintz, Yuval 64467b6859fbSMintz, Yuval return dump_offset; 6447c965db44STomer Tayar } 6448c965db44STomer Tayar 64492d22bc83SMichal Kalderon /* Returns the block name that matches the specified block ID, 64502d22bc83SMichal Kalderon * or NULL if not found. 64512d22bc83SMichal Kalderon */ 64522d22bc83SMichal Kalderon static const char *qed_dbg_get_block_name(struct qed_hwfn *p_hwfn, 64532d22bc83SMichal Kalderon enum block_id block_id) 64542d22bc83SMichal Kalderon { 64552d22bc83SMichal Kalderon const struct dbg_block_user *block = 64562d22bc83SMichal Kalderon (const struct dbg_block_user *) 64572d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_USER_DATA].ptr + block_id; 64582d22bc83SMichal Kalderon 64592d22bc83SMichal Kalderon return (const char *)block->name; 64602d22bc83SMichal Kalderon } 64612d22bc83SMichal Kalderon 64622d22bc83SMichal Kalderon static struct dbg_tools_user_data *qed_dbg_get_user_data(struct qed_hwfn 64632d22bc83SMichal Kalderon *p_hwfn) 6464a3f72307SDenis Bolotin { 6465a3f72307SDenis Bolotin return (struct dbg_tools_user_data *)p_hwfn->dbg_user_info; 6466a3f72307SDenis Bolotin } 6467a3f72307SDenis Bolotin 6468c965db44STomer Tayar /* Parses the idle check rules and returns the number of characters printed. 6469c965db44STomer Tayar * In case of parsing error, returns 0. 6470c965db44STomer Tayar */ 64712d22bc83SMichal Kalderon static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn, 64722d22bc83SMichal Kalderon u32 *dump_buf, 6473c965db44STomer Tayar u32 *dump_buf_end, 6474c965db44STomer Tayar u32 num_rules, 6475c965db44STomer Tayar bool print_fw_idle_chk, 6476c965db44STomer Tayar char *results_buf, 6477c965db44STomer Tayar u32 *num_errors, u32 *num_warnings) 6478c965db44STomer Tayar { 64797b6859fbSMintz, Yuval /* Offset in results_buf in bytes */ 64807b6859fbSMintz, Yuval u32 results_offset = 0; 64817b6859fbSMintz, Yuval 64827b6859fbSMintz, Yuval u32 rule_idx; 6483c965db44STomer Tayar u16 i, j; 6484c965db44STomer Tayar 6485c965db44STomer Tayar *num_errors = 0; 6486c965db44STomer Tayar *num_warnings = 0; 6487c965db44STomer Tayar 6488c965db44STomer Tayar /* Go over dumped results */ 6489c965db44STomer Tayar for (rule_idx = 0; rule_idx < num_rules && dump_buf < dump_buf_end; 6490c965db44STomer Tayar rule_idx++) { 6491c965db44STomer Tayar const struct dbg_idle_chk_rule_parsing_data *rule_parsing_data; 6492c965db44STomer Tayar struct dbg_idle_chk_result_hdr *hdr; 64937b6859fbSMintz, Yuval const char *parsing_str, *lsi_msg; 6494c965db44STomer Tayar u32 parsing_str_offset; 6495c965db44STomer Tayar bool has_fw_msg; 64967b6859fbSMintz, Yuval u8 curr_reg_id; 6497c965db44STomer Tayar 6498c965db44STomer Tayar hdr = (struct dbg_idle_chk_result_hdr *)dump_buf; 6499c965db44STomer Tayar rule_parsing_data = 6500c965db44STomer Tayar (const struct dbg_idle_chk_rule_parsing_data *) 65012d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr + 65022d22bc83SMichal Kalderon hdr->rule_id; 6503c965db44STomer Tayar parsing_str_offset = 6504c965db44STomer Tayar GET_FIELD(rule_parsing_data->data, 6505c965db44STomer Tayar DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET); 6506c965db44STomer Tayar has_fw_msg = 6507c965db44STomer Tayar GET_FIELD(rule_parsing_data->data, 6508c965db44STomer Tayar DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG) > 0; 65092d22bc83SMichal Kalderon parsing_str = (const char *) 65102d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr + 65112d22bc83SMichal Kalderon parsing_str_offset; 6512c965db44STomer Tayar lsi_msg = parsing_str; 65137b6859fbSMintz, Yuval curr_reg_id = 0; 6514c965db44STomer Tayar 6515c965db44STomer Tayar if (hdr->severity >= MAX_DBG_IDLE_CHK_SEVERITY_TYPES) 6516c965db44STomer Tayar return 0; 6517c965db44STomer Tayar 6518c965db44STomer Tayar /* Skip rule header */ 65197b6859fbSMintz, Yuval dump_buf += BYTES_TO_DWORDS(sizeof(*hdr)); 6520c965db44STomer Tayar 6521c965db44STomer Tayar /* Update errors/warnings count */ 6522c965db44STomer Tayar if (hdr->severity == IDLE_CHK_SEVERITY_ERROR || 6523c965db44STomer Tayar hdr->severity == IDLE_CHK_SEVERITY_ERROR_NO_TRAFFIC) 6524c965db44STomer Tayar (*num_errors)++; 6525c965db44STomer Tayar else 6526c965db44STomer Tayar (*num_warnings)++; 6527c965db44STomer Tayar 6528c965db44STomer Tayar /* Print rule severity */ 6529c965db44STomer Tayar results_offset += 6530c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6531c965db44STomer Tayar results_offset), "%s: ", 6532c965db44STomer Tayar s_idle_chk_severity_str[hdr->severity]); 6533c965db44STomer Tayar 6534c965db44STomer Tayar /* Print rule message */ 6535c965db44STomer Tayar if (has_fw_msg) 6536c965db44STomer Tayar parsing_str += strlen(parsing_str) + 1; 6537c965db44STomer Tayar results_offset += 6538c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6539c965db44STomer Tayar results_offset), "%s.", 6540c965db44STomer Tayar has_fw_msg && 6541c965db44STomer Tayar print_fw_idle_chk ? parsing_str : lsi_msg); 6542c965db44STomer Tayar parsing_str += strlen(parsing_str) + 1; 6543c965db44STomer Tayar 6544c965db44STomer Tayar /* Print register values */ 6545c965db44STomer Tayar results_offset += 6546c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6547c965db44STomer Tayar results_offset), " Registers:"); 6548c965db44STomer Tayar for (i = 0; 6549c965db44STomer Tayar i < hdr->num_dumped_cond_regs + hdr->num_dumped_info_regs; 6550c965db44STomer Tayar i++) { 65517b6859fbSMintz, Yuval struct dbg_idle_chk_result_reg_hdr *reg_hdr; 65527b6859fbSMintz, Yuval bool is_mem; 65537b6859fbSMintz, Yuval u8 reg_id; 65547b6859fbSMintz, Yuval 65557b6859fbSMintz, Yuval reg_hdr = 65567b6859fbSMintz, Yuval (struct dbg_idle_chk_result_reg_hdr *)dump_buf; 65577b6859fbSMintz, Yuval is_mem = GET_FIELD(reg_hdr->data, 6558c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM); 65597b6859fbSMintz, Yuval reg_id = GET_FIELD(reg_hdr->data, 6560c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID); 6561c965db44STomer Tayar 6562c965db44STomer Tayar /* Skip reg header */ 65637b6859fbSMintz, Yuval dump_buf += BYTES_TO_DWORDS(sizeof(*reg_hdr)); 6564c965db44STomer Tayar 6565c965db44STomer Tayar /* Skip register names until the required reg_id is 6566c965db44STomer Tayar * reached. 6567c965db44STomer Tayar */ 65686c95dd8fSPrabhakar Kushwaha for (; reg_id > curr_reg_id; curr_reg_id++) 65696c95dd8fSPrabhakar Kushwaha parsing_str += strlen(parsing_str) + 1; 6570c965db44STomer Tayar 6571c965db44STomer Tayar results_offset += 6572c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6573c965db44STomer Tayar results_offset), " %s", 6574c965db44STomer Tayar parsing_str); 6575c965db44STomer Tayar if (i < hdr->num_dumped_cond_regs && is_mem) 6576c965db44STomer Tayar results_offset += 6577c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6578c965db44STomer Tayar results_offset), 6579c965db44STomer Tayar "[%d]", hdr->mem_entry_id + 6580c965db44STomer Tayar reg_hdr->start_entry); 6581c965db44STomer Tayar results_offset += 6582c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6583c965db44STomer Tayar results_offset), "="); 6584c965db44STomer Tayar for (j = 0; j < reg_hdr->size; j++, dump_buf++) { 6585c965db44STomer Tayar results_offset += 6586c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6587c965db44STomer Tayar results_offset), 6588c965db44STomer Tayar "0x%x", *dump_buf); 6589c965db44STomer Tayar if (j < reg_hdr->size - 1) 6590c965db44STomer Tayar results_offset += 6591c965db44STomer Tayar sprintf(qed_get_buf_ptr 6592c965db44STomer Tayar (results_buf, 6593c965db44STomer Tayar results_offset), ","); 6594c965db44STomer Tayar } 6595c965db44STomer Tayar } 6596c965db44STomer Tayar 6597c965db44STomer Tayar results_offset += 6598c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, results_offset), "\n"); 6599c965db44STomer Tayar } 6600c965db44STomer Tayar 6601c965db44STomer Tayar /* Check if end of dump buffer was exceeded */ 6602c965db44STomer Tayar if (dump_buf > dump_buf_end) 6603c965db44STomer Tayar return 0; 66047b6859fbSMintz, Yuval 6605c965db44STomer Tayar return results_offset; 6606c965db44STomer Tayar } 6607c965db44STomer Tayar 6608c965db44STomer Tayar /* Parses an idle check dump buffer. 6609c965db44STomer Tayar * If result_buf is not NULL, the idle check results are printed to it. 6610c965db44STomer Tayar * In any case, the required results buffer size is assigned to 6611c965db44STomer Tayar * parsed_results_bytes. 6612c965db44STomer Tayar * The parsing status is returned. 6613c965db44STomer Tayar */ 66142d22bc83SMichal Kalderon static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn, 66152d22bc83SMichal Kalderon u32 *dump_buf, 6616c965db44STomer Tayar u32 num_dumped_dwords, 6617c965db44STomer Tayar char *results_buf, 6618c965db44STomer Tayar u32 *parsed_results_bytes, 6619c965db44STomer Tayar u32 *num_errors, 6620c965db44STomer Tayar u32 *num_warnings) 6621c965db44STomer Tayar { 66226c95dd8fSPrabhakar Kushwaha u32 num_section_params = 0, num_rules, num_rules_not_dumped; 6623c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 6624c965db44STomer Tayar u32 *dump_buf_end = dump_buf + num_dumped_dwords; 66257b6859fbSMintz, Yuval 66267b6859fbSMintz, Yuval /* Offset in results_buf in bytes */ 66277b6859fbSMintz, Yuval u32 results_offset = 0; 6628c965db44STomer Tayar 6629c965db44STomer Tayar *parsed_results_bytes = 0; 6630c965db44STomer Tayar *num_errors = 0; 6631c965db44STomer Tayar *num_warnings = 0; 66327b6859fbSMintz, Yuval 66332d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr || 66342d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr) 6635c965db44STomer Tayar return DBG_STATUS_DBG_ARRAY_NOT_SET; 6636c965db44STomer Tayar 6637c965db44STomer Tayar /* Read global_params section */ 6638c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6639c965db44STomer Tayar §ion_name, &num_section_params); 6640c965db44STomer Tayar if (strcmp(section_name, "global_params")) 6641c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6642c965db44STomer Tayar 6643c965db44STomer Tayar /* Print global params */ 6644c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 6645c965db44STomer Tayar num_section_params, 6646c965db44STomer Tayar results_buf, &results_offset); 6647c965db44STomer Tayar 66486c95dd8fSPrabhakar Kushwaha /* Read idle_chk section 66496c95dd8fSPrabhakar Kushwaha * There may be 1 or 2 idle_chk section parameters: 66506c95dd8fSPrabhakar Kushwaha * - 1st is "num_rules" 66516c95dd8fSPrabhakar Kushwaha * - 2nd is "num_rules_not_dumped" (optional) 66526c95dd8fSPrabhakar Kushwaha */ 66536c95dd8fSPrabhakar Kushwaha 6654c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6655c965db44STomer Tayar §ion_name, &num_section_params); 66566c95dd8fSPrabhakar Kushwaha if (strcmp(section_name, "idle_chk") || 66576c95dd8fSPrabhakar Kushwaha (num_section_params != 2 && num_section_params != 1)) 6658c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6659c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 6660c965db44STomer Tayar ¶m_name, ¶m_str_val, &num_rules); 66617b6859fbSMintz, Yuval if (strcmp(param_name, "num_rules")) 6662c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 66636c95dd8fSPrabhakar Kushwaha if (num_section_params > 1) { 66646c95dd8fSPrabhakar Kushwaha dump_buf += qed_read_param(dump_buf, 66656c95dd8fSPrabhakar Kushwaha ¶m_name, 66666c95dd8fSPrabhakar Kushwaha ¶m_str_val, 66676c95dd8fSPrabhakar Kushwaha &num_rules_not_dumped); 66686c95dd8fSPrabhakar Kushwaha if (strcmp(param_name, "num_rules_not_dumped")) 66696c95dd8fSPrabhakar Kushwaha return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 66706c95dd8fSPrabhakar Kushwaha } else { 66716c95dd8fSPrabhakar Kushwaha num_rules_not_dumped = 0; 66726c95dd8fSPrabhakar Kushwaha } 6673c965db44STomer Tayar 6674c965db44STomer Tayar if (num_rules) { 6675c965db44STomer Tayar u32 rules_print_size; 6676c965db44STomer Tayar 6677c965db44STomer Tayar /* Print FW output */ 6678c965db44STomer Tayar results_offset += 6679c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6680c965db44STomer Tayar results_offset), 6681c965db44STomer Tayar "FW_IDLE_CHECK:\n"); 6682c965db44STomer Tayar rules_print_size = 66832d22bc83SMichal Kalderon qed_parse_idle_chk_dump_rules(p_hwfn, 66842d22bc83SMichal Kalderon dump_buf, 6685da090917STomer Tayar dump_buf_end, 6686da090917STomer Tayar num_rules, 6687c965db44STomer Tayar true, 6688c965db44STomer Tayar results_buf ? 6689c965db44STomer Tayar results_buf + 6690da090917STomer Tayar results_offset : 6691da090917STomer Tayar NULL, 6692da090917STomer Tayar num_errors, 6693da090917STomer Tayar num_warnings); 6694c965db44STomer Tayar results_offset += rules_print_size; 66957b6859fbSMintz, Yuval if (!rules_print_size) 6696c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6697c965db44STomer Tayar 6698c965db44STomer Tayar /* Print LSI output */ 6699c965db44STomer Tayar results_offset += 6700c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6701c965db44STomer Tayar results_offset), 6702c965db44STomer Tayar "\nLSI_IDLE_CHECK:\n"); 6703c965db44STomer Tayar rules_print_size = 67042d22bc83SMichal Kalderon qed_parse_idle_chk_dump_rules(p_hwfn, 67052d22bc83SMichal Kalderon dump_buf, 6706da090917STomer Tayar dump_buf_end, 6707da090917STomer Tayar num_rules, 6708c965db44STomer Tayar false, 6709c965db44STomer Tayar results_buf ? 6710c965db44STomer Tayar results_buf + 6711da090917STomer Tayar results_offset : 6712da090917STomer Tayar NULL, 6713da090917STomer Tayar num_errors, 6714da090917STomer Tayar num_warnings); 6715c965db44STomer Tayar results_offset += rules_print_size; 67167b6859fbSMintz, Yuval if (!rules_print_size) 6717c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6718c965db44STomer Tayar } 6719c965db44STomer Tayar 6720c965db44STomer Tayar /* Print errors/warnings count */ 67217b6859fbSMintz, Yuval if (*num_errors) 6722c965db44STomer Tayar results_offset += 6723c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6724c965db44STomer Tayar results_offset), 6725c965db44STomer Tayar "\nIdle Check failed!!! (with %d errors and %d warnings)\n", 6726c965db44STomer Tayar *num_errors, *num_warnings); 67277b6859fbSMintz, Yuval else if (*num_warnings) 6728c965db44STomer Tayar results_offset += 6729c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6730c965db44STomer Tayar results_offset), 67317b6859fbSMintz, Yuval "\nIdle Check completed successfully (with %d warnings)\n", 6732c965db44STomer Tayar *num_warnings); 67337b6859fbSMintz, Yuval else 6734c965db44STomer Tayar results_offset += 6735c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6736c965db44STomer Tayar results_offset), 67377b6859fbSMintz, Yuval "\nIdle Check completed successfully\n"); 6738c965db44STomer Tayar 67396c95dd8fSPrabhakar Kushwaha if (num_rules_not_dumped) 67406c95dd8fSPrabhakar Kushwaha results_offset += 67416c95dd8fSPrabhakar Kushwaha sprintf(qed_get_buf_ptr(results_buf, 67426c95dd8fSPrabhakar Kushwaha results_offset), 67436c95dd8fSPrabhakar Kushwaha "\nIdle Check Partially dumped : num_rules_not_dumped = %d\n", 67446c95dd8fSPrabhakar Kushwaha num_rules_not_dumped); 67456c95dd8fSPrabhakar Kushwaha 6746c965db44STomer Tayar /* Add 1 for string NULL termination */ 6747c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 67487b6859fbSMintz, Yuval 6749c965db44STomer Tayar return DBG_STATUS_OK; 6750c965db44STomer Tayar } 6751c965db44STomer Tayar 6752c965db44STomer Tayar /* Allocates and fills MCP Trace meta data based on the specified meta data 6753c965db44STomer Tayar * dump buffer. 6754c965db44STomer Tayar * Returns debug status code. 6755c965db44STomer Tayar */ 6756a3f72307SDenis Bolotin static enum dbg_status 6757a3f72307SDenis Bolotin qed_mcp_trace_alloc_meta_data(struct qed_hwfn *p_hwfn, 6758a3f72307SDenis Bolotin const u32 *meta_buf) 6759c965db44STomer Tayar { 6760a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data; 6761c965db44STomer Tayar u32 offset = 0, signature, i; 6762a3f72307SDenis Bolotin struct mcp_trace_meta *meta; 6763a3f72307SDenis Bolotin u8 *meta_buf_bytes; 6764a3f72307SDenis Bolotin 6765a3f72307SDenis Bolotin dev_user_data = qed_dbg_get_user_data(p_hwfn); 6766a3f72307SDenis Bolotin meta = &dev_user_data->mcp_trace_meta; 6767a3f72307SDenis Bolotin meta_buf_bytes = (u8 *)meta_buf; 6768c965db44STomer Tayar 676950bc60cbSMichal Kalderon /* Free the previous meta before loading a new one. */ 6770a3f72307SDenis Bolotin if (meta->is_allocated) 6771a3f72307SDenis Bolotin qed_mcp_trace_free_meta_data(p_hwfn); 677250bc60cbSMichal Kalderon 6773c965db44STomer Tayar memset(meta, 0, sizeof(*meta)); 6774c965db44STomer Tayar 6775c965db44STomer Tayar /* Read first signature */ 6776c965db44STomer Tayar signature = qed_read_dword_from_buf(meta_buf_bytes, &offset); 67777b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 6778c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 6779c965db44STomer Tayar 67807b6859fbSMintz, Yuval /* Read no. of modules and allocate memory for their pointers */ 6781c965db44STomer Tayar meta->modules_num = qed_read_byte_from_buf(meta_buf_bytes, &offset); 67826396bb22SKees Cook meta->modules = kcalloc(meta->modules_num, sizeof(char *), 67836396bb22SKees Cook GFP_KERNEL); 6784c965db44STomer Tayar if (!meta->modules) 6785c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6786c965db44STomer Tayar 6787c965db44STomer Tayar /* Allocate and read all module strings */ 6788c965db44STomer Tayar for (i = 0; i < meta->modules_num; i++) { 6789c965db44STomer Tayar u8 module_len = qed_read_byte_from_buf(meta_buf_bytes, &offset); 6790c965db44STomer Tayar 6791c965db44STomer Tayar *(meta->modules + i) = kzalloc(module_len, GFP_KERNEL); 6792c965db44STomer Tayar if (!(*(meta->modules + i))) { 6793c965db44STomer Tayar /* Update number of modules to be released */ 6794c965db44STomer Tayar meta->modules_num = i ? i - 1 : 0; 6795c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6796c965db44STomer Tayar } 6797c965db44STomer Tayar 6798c965db44STomer Tayar qed_read_str_from_buf(meta_buf_bytes, &offset, module_len, 6799c965db44STomer Tayar *(meta->modules + i)); 6800c965db44STomer Tayar if (module_len > MCP_TRACE_MAX_MODULE_LEN) 6801c965db44STomer Tayar (*(meta->modules + i))[MCP_TRACE_MAX_MODULE_LEN] = '\0'; 6802c965db44STomer Tayar } 6803c965db44STomer Tayar 6804c965db44STomer Tayar /* Read second signature */ 6805c965db44STomer Tayar signature = qed_read_dword_from_buf(meta_buf_bytes, &offset); 68067b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 6807c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 6808c965db44STomer Tayar 6809c965db44STomer Tayar /* Read number of formats and allocate memory for all formats */ 6810c965db44STomer Tayar meta->formats_num = qed_read_dword_from_buf(meta_buf_bytes, &offset); 68116396bb22SKees Cook meta->formats = kcalloc(meta->formats_num, 6812c965db44STomer Tayar sizeof(struct mcp_trace_format), 6813c965db44STomer Tayar GFP_KERNEL); 6814c965db44STomer Tayar if (!meta->formats) 6815c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6816c965db44STomer Tayar 6817c965db44STomer Tayar /* Allocate and read all strings */ 6818c965db44STomer Tayar for (i = 0; i < meta->formats_num; i++) { 6819c965db44STomer Tayar struct mcp_trace_format *format_ptr = &meta->formats[i]; 6820c965db44STomer Tayar u8 format_len; 6821c965db44STomer Tayar 6822c965db44STomer Tayar format_ptr->data = qed_read_dword_from_buf(meta_buf_bytes, 6823c965db44STomer Tayar &offset); 68242d22bc83SMichal Kalderon format_len = GET_MFW_FIELD(format_ptr->data, 68252d22bc83SMichal Kalderon MCP_TRACE_FORMAT_LEN); 6826c965db44STomer Tayar format_ptr->format_str = kzalloc(format_len, GFP_KERNEL); 6827c965db44STomer Tayar if (!format_ptr->format_str) { 6828c965db44STomer Tayar /* Update number of modules to be released */ 6829c965db44STomer Tayar meta->formats_num = i ? i - 1 : 0; 6830c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6831c965db44STomer Tayar } 6832c965db44STomer Tayar 6833c965db44STomer Tayar qed_read_str_from_buf(meta_buf_bytes, 6834c965db44STomer Tayar &offset, 6835c965db44STomer Tayar format_len, format_ptr->format_str); 6836c965db44STomer Tayar } 6837c965db44STomer Tayar 6838a3f72307SDenis Bolotin meta->is_allocated = true; 6839c965db44STomer Tayar return DBG_STATUS_OK; 6840c965db44STomer Tayar } 6841c965db44STomer Tayar 684250bc60cbSMichal Kalderon /* Parses an MCP trace buffer. If result_buf is not NULL, the MCP Trace results 684350bc60cbSMichal Kalderon * are printed to it. The parsing status is returned. 684450bc60cbSMichal Kalderon * Arguments: 684550bc60cbSMichal Kalderon * trace_buf - MCP trace cyclic buffer 684650bc60cbSMichal Kalderon * trace_buf_size - MCP trace cyclic buffer size in bytes 684750bc60cbSMichal Kalderon * data_offset - offset in bytes of the data to parse in the MCP trace cyclic 684850bc60cbSMichal Kalderon * buffer. 684950bc60cbSMichal Kalderon * data_size - size in bytes of data to parse. 685050bc60cbSMichal Kalderon * parsed_buf - destination buffer for parsed data. 6851a3f72307SDenis Bolotin * parsed_results_bytes - size of parsed data in bytes. 685250bc60cbSMichal Kalderon */ 6853a3f72307SDenis Bolotin static enum dbg_status qed_parse_mcp_trace_buf(struct qed_hwfn *p_hwfn, 6854a3f72307SDenis Bolotin u8 *trace_buf, 685550bc60cbSMichal Kalderon u32 trace_buf_size, 685650bc60cbSMichal Kalderon u32 data_offset, 685750bc60cbSMichal Kalderon u32 data_size, 685850bc60cbSMichal Kalderon char *parsed_buf, 6859a3f72307SDenis Bolotin u32 *parsed_results_bytes) 686050bc60cbSMichal Kalderon { 6861a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data; 6862a3f72307SDenis Bolotin struct mcp_trace_meta *meta; 686350bc60cbSMichal Kalderon u32 param_mask, param_shift; 686450bc60cbSMichal Kalderon enum dbg_status status; 686550bc60cbSMichal Kalderon 6866a3f72307SDenis Bolotin dev_user_data = qed_dbg_get_user_data(p_hwfn); 6867a3f72307SDenis Bolotin meta = &dev_user_data->mcp_trace_meta; 6868a3f72307SDenis Bolotin *parsed_results_bytes = 0; 686950bc60cbSMichal Kalderon 6870a3f72307SDenis Bolotin if (!meta->is_allocated) 687150bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 687250bc60cbSMichal Kalderon 687350bc60cbSMichal Kalderon status = DBG_STATUS_OK; 687450bc60cbSMichal Kalderon 687550bc60cbSMichal Kalderon while (data_size) { 687650bc60cbSMichal Kalderon struct mcp_trace_format *format_ptr; 687750bc60cbSMichal Kalderon u8 format_level, format_module; 687850bc60cbSMichal Kalderon u32 params[3] = { 0, 0, 0 }; 687950bc60cbSMichal Kalderon u32 header, format_idx, i; 688050bc60cbSMichal Kalderon 688150bc60cbSMichal Kalderon if (data_size < MFW_TRACE_ENTRY_SIZE) 688250bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 688350bc60cbSMichal Kalderon 688450bc60cbSMichal Kalderon header = qed_read_from_cyclic_buf(trace_buf, 688550bc60cbSMichal Kalderon &data_offset, 688650bc60cbSMichal Kalderon trace_buf_size, 688750bc60cbSMichal Kalderon MFW_TRACE_ENTRY_SIZE); 688850bc60cbSMichal Kalderon data_size -= MFW_TRACE_ENTRY_SIZE; 688950bc60cbSMichal Kalderon format_idx = header & MFW_TRACE_EVENTID_MASK; 689050bc60cbSMichal Kalderon 689150bc60cbSMichal Kalderon /* Skip message if its index doesn't exist in the meta data */ 6892a3f72307SDenis Bolotin if (format_idx >= meta->formats_num) { 68932d22bc83SMichal Kalderon u8 format_size = (u8)GET_MFW_FIELD(header, 68942d22bc83SMichal Kalderon MFW_TRACE_PRM_SIZE); 689550bc60cbSMichal Kalderon 689650bc60cbSMichal Kalderon if (data_size < format_size) 689750bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 689850bc60cbSMichal Kalderon 689950bc60cbSMichal Kalderon data_offset = qed_cyclic_add(data_offset, 690050bc60cbSMichal Kalderon format_size, 690150bc60cbSMichal Kalderon trace_buf_size); 690250bc60cbSMichal Kalderon data_size -= format_size; 690350bc60cbSMichal Kalderon continue; 690450bc60cbSMichal Kalderon } 690550bc60cbSMichal Kalderon 6906a3f72307SDenis Bolotin format_ptr = &meta->formats[format_idx]; 690750bc60cbSMichal Kalderon 690850bc60cbSMichal Kalderon for (i = 0, 69092d22bc83SMichal Kalderon param_mask = MCP_TRACE_FORMAT_P1_SIZE_MASK, param_shift = 69102d22bc83SMichal Kalderon MCP_TRACE_FORMAT_P1_SIZE_OFFSET; 691150bc60cbSMichal Kalderon i < MCP_TRACE_FORMAT_MAX_PARAMS; 69122d22bc83SMichal Kalderon i++, param_mask <<= MCP_TRACE_FORMAT_PARAM_WIDTH, 691350bc60cbSMichal Kalderon param_shift += MCP_TRACE_FORMAT_PARAM_WIDTH) { 691450bc60cbSMichal Kalderon /* Extract param size (0..3) */ 691550bc60cbSMichal Kalderon u8 param_size = (u8)((format_ptr->data & param_mask) >> 691650bc60cbSMichal Kalderon param_shift); 691750bc60cbSMichal Kalderon 691850bc60cbSMichal Kalderon /* If the param size is zero, there are no other 691950bc60cbSMichal Kalderon * parameters. 692050bc60cbSMichal Kalderon */ 692150bc60cbSMichal Kalderon if (!param_size) 692250bc60cbSMichal Kalderon break; 692350bc60cbSMichal Kalderon 692450bc60cbSMichal Kalderon /* Size is encoded using 2 bits, where 3 is used to 692550bc60cbSMichal Kalderon * encode 4. 692650bc60cbSMichal Kalderon */ 692750bc60cbSMichal Kalderon if (param_size == 3) 692850bc60cbSMichal Kalderon param_size = 4; 692950bc60cbSMichal Kalderon 693050bc60cbSMichal Kalderon if (data_size < param_size) 693150bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 693250bc60cbSMichal Kalderon 693350bc60cbSMichal Kalderon params[i] = qed_read_from_cyclic_buf(trace_buf, 693450bc60cbSMichal Kalderon &data_offset, 693550bc60cbSMichal Kalderon trace_buf_size, 693650bc60cbSMichal Kalderon param_size); 693750bc60cbSMichal Kalderon data_size -= param_size; 693850bc60cbSMichal Kalderon } 693950bc60cbSMichal Kalderon 69402d22bc83SMichal Kalderon format_level = (u8)GET_MFW_FIELD(format_ptr->data, 69412d22bc83SMichal Kalderon MCP_TRACE_FORMAT_LEVEL); 69422d22bc83SMichal Kalderon format_module = (u8)GET_MFW_FIELD(format_ptr->data, 69432d22bc83SMichal Kalderon MCP_TRACE_FORMAT_MODULE); 694450bc60cbSMichal Kalderon if (format_level >= ARRAY_SIZE(s_mcp_trace_level_str)) 694550bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 694650bc60cbSMichal Kalderon 694750bc60cbSMichal Kalderon /* Print current message to results buffer */ 6948a3f72307SDenis Bolotin *parsed_results_bytes += 6949a3f72307SDenis Bolotin sprintf(qed_get_buf_ptr(parsed_buf, 6950a3f72307SDenis Bolotin *parsed_results_bytes), 695150bc60cbSMichal Kalderon "%s %-8s: ", 695250bc60cbSMichal Kalderon s_mcp_trace_level_str[format_level], 6953a3f72307SDenis Bolotin meta->modules[format_module]); 6954a3f72307SDenis Bolotin *parsed_results_bytes += 6955a3f72307SDenis Bolotin sprintf(qed_get_buf_ptr(parsed_buf, *parsed_results_bytes), 695650bc60cbSMichal Kalderon format_ptr->format_str, 695750bc60cbSMichal Kalderon params[0], params[1], params[2]); 695850bc60cbSMichal Kalderon } 695950bc60cbSMichal Kalderon 696050bc60cbSMichal Kalderon /* Add string NULL terminator */ 6961a3f72307SDenis Bolotin (*parsed_results_bytes)++; 696250bc60cbSMichal Kalderon 696350bc60cbSMichal Kalderon return status; 696450bc60cbSMichal Kalderon } 696550bc60cbSMichal Kalderon 6966c965db44STomer Tayar /* Parses an MCP Trace dump buffer. 6967c965db44STomer Tayar * If result_buf is not NULL, the MCP Trace results are printed to it. 6968c965db44STomer Tayar * In any case, the required results buffer size is assigned to 6969a3f72307SDenis Bolotin * parsed_results_bytes. 6970c965db44STomer Tayar * The parsing status is returned. 6971c965db44STomer Tayar */ 6972c965db44STomer Tayar static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn, 6973c965db44STomer Tayar u32 *dump_buf, 6974a3f72307SDenis Bolotin char *results_buf, 6975a3f72307SDenis Bolotin u32 *parsed_results_bytes, 6976a3f72307SDenis Bolotin bool free_meta_data) 6977c965db44STomer Tayar { 6978c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 697950bc60cbSMichal Kalderon u32 data_size, trace_data_dwords, trace_meta_dwords; 6980a3f72307SDenis Bolotin u32 offset, results_offset, results_buf_bytes; 698150bc60cbSMichal Kalderon u32 param_num_val, num_section_params; 6982c965db44STomer Tayar struct mcp_trace *trace; 6983c965db44STomer Tayar enum dbg_status status; 6984c965db44STomer Tayar const u32 *meta_buf; 6985c965db44STomer Tayar u8 *trace_buf; 6986c965db44STomer Tayar 6987a3f72307SDenis Bolotin *parsed_results_bytes = 0; 6988c965db44STomer Tayar 6989c965db44STomer Tayar /* Read global_params section */ 6990c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6991c965db44STomer Tayar §ion_name, &num_section_params); 6992c965db44STomer Tayar if (strcmp(section_name, "global_params")) 6993c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 6994c965db44STomer Tayar 6995c965db44STomer Tayar /* Print global params */ 6996c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 6997c965db44STomer Tayar num_section_params, 6998a3f72307SDenis Bolotin results_buf, &results_offset); 6999c965db44STomer Tayar 7000c965db44STomer Tayar /* Read trace_data section */ 7001c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7002c965db44STomer Tayar §ion_name, &num_section_params); 7003c965db44STomer Tayar if (strcmp(section_name, "mcp_trace_data") || num_section_params != 1) 7004c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 7005c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 7006c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 7007c965db44STomer Tayar if (strcmp(param_name, "size")) 7008c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 7009c965db44STomer Tayar trace_data_dwords = param_num_val; 7010c965db44STomer Tayar 7011c965db44STomer Tayar /* Prepare trace info */ 7012c965db44STomer Tayar trace = (struct mcp_trace *)dump_buf; 7013a3f72307SDenis Bolotin if (trace->signature != MFW_TRACE_SIGNATURE || !trace->size) 7014a3f72307SDenis Bolotin return DBG_STATUS_MCP_TRACE_BAD_DATA; 7015a3f72307SDenis Bolotin 70167b6859fbSMintz, Yuval trace_buf = (u8 *)dump_buf + sizeof(*trace); 7017c965db44STomer Tayar offset = trace->trace_oldest; 701850bc60cbSMichal Kalderon data_size = qed_cyclic_sub(trace->trace_prod, offset, trace->size); 7019c965db44STomer Tayar dump_buf += trace_data_dwords; 7020c965db44STomer Tayar 7021c965db44STomer Tayar /* Read meta_data section */ 7022c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7023c965db44STomer Tayar §ion_name, &num_section_params); 7024c965db44STomer Tayar if (strcmp(section_name, "mcp_trace_meta")) 7025c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 7026c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 7027c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 70287b6859fbSMintz, Yuval if (strcmp(param_name, "size")) 7029c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 7030c965db44STomer Tayar trace_meta_dwords = param_num_val; 7031c965db44STomer Tayar 7032c965db44STomer Tayar /* Choose meta data buffer */ 7033c965db44STomer Tayar if (!trace_meta_dwords) { 7034c965db44STomer Tayar /* Dump doesn't include meta data */ 7035a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data = 7036a3f72307SDenis Bolotin qed_dbg_get_user_data(p_hwfn); 7037a3f72307SDenis Bolotin 7038a3f72307SDenis Bolotin if (!dev_user_data->mcp_trace_user_meta_buf) 7039c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_NO_META; 7040a3f72307SDenis Bolotin 7041a3f72307SDenis Bolotin meta_buf = dev_user_data->mcp_trace_user_meta_buf; 7042c965db44STomer Tayar } else { 7043c965db44STomer Tayar /* Dump includes meta data */ 7044c965db44STomer Tayar meta_buf = dump_buf; 7045c965db44STomer Tayar } 7046c965db44STomer Tayar 7047c965db44STomer Tayar /* Allocate meta data memory */ 7048a3f72307SDenis Bolotin status = qed_mcp_trace_alloc_meta_data(p_hwfn, meta_buf); 7049c965db44STomer Tayar if (status != DBG_STATUS_OK) 7050c965db44STomer Tayar return status; 705150bc60cbSMichal Kalderon 7052a3f72307SDenis Bolotin status = qed_parse_mcp_trace_buf(p_hwfn, 7053a3f72307SDenis Bolotin trace_buf, 705450bc60cbSMichal Kalderon trace->size, 705550bc60cbSMichal Kalderon offset, 705650bc60cbSMichal Kalderon data_size, 7057a3f72307SDenis Bolotin results_buf ? 7058a3f72307SDenis Bolotin results_buf + results_offset : 705950bc60cbSMichal Kalderon NULL, 7060a3f72307SDenis Bolotin &results_buf_bytes); 706150bc60cbSMichal Kalderon if (status != DBG_STATUS_OK) 706250bc60cbSMichal Kalderon return status; 706350bc60cbSMichal Kalderon 7064a3f72307SDenis Bolotin if (free_meta_data) 7065a3f72307SDenis Bolotin qed_mcp_trace_free_meta_data(p_hwfn); 7066a3f72307SDenis Bolotin 7067a3f72307SDenis Bolotin *parsed_results_bytes = results_offset + results_buf_bytes; 706850bc60cbSMichal Kalderon 706950bc60cbSMichal Kalderon return DBG_STATUS_OK; 7070c965db44STomer Tayar } 7071c965db44STomer Tayar 7072c965db44STomer Tayar /* Parses a Reg FIFO dump buffer. 7073c965db44STomer Tayar * If result_buf is not NULL, the Reg FIFO results are printed to it. 7074c965db44STomer Tayar * In any case, the required results buffer size is assigned to 7075c965db44STomer Tayar * parsed_results_bytes. 7076c965db44STomer Tayar * The parsing status is returned. 7077c965db44STomer Tayar */ 7078da090917STomer Tayar static enum dbg_status qed_parse_reg_fifo_dump(u32 *dump_buf, 7079c965db44STomer Tayar char *results_buf, 7080c965db44STomer Tayar u32 *parsed_results_bytes) 7081c965db44STomer Tayar { 7082c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 70837b6859fbSMintz, Yuval u32 param_num_val, num_section_params, num_elements; 7084c965db44STomer Tayar struct reg_fifo_element *elements; 70852d22bc83SMichal Kalderon u8 i, j, err_code, vf_val; 70867b6859fbSMintz, Yuval u32 results_offset = 0; 7087c965db44STomer Tayar char vf_str[4]; 7088c965db44STomer Tayar 7089c965db44STomer Tayar /* Read global_params section */ 7090c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7091c965db44STomer Tayar §ion_name, &num_section_params); 7092c965db44STomer Tayar if (strcmp(section_name, "global_params")) 7093c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 7094c965db44STomer Tayar 7095c965db44STomer Tayar /* Print global params */ 7096c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 7097c965db44STomer Tayar num_section_params, 7098c965db44STomer Tayar results_buf, &results_offset); 7099c965db44STomer Tayar 7100c965db44STomer Tayar /* Read reg_fifo_data section */ 7101c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7102c965db44STomer Tayar §ion_name, &num_section_params); 7103c965db44STomer Tayar if (strcmp(section_name, "reg_fifo_data")) 7104c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 7105c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 7106c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 7107c965db44STomer Tayar if (strcmp(param_name, "size")) 7108c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 7109c965db44STomer Tayar if (param_num_val % REG_FIFO_ELEMENT_DWORDS) 7110c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 7111c965db44STomer Tayar num_elements = param_num_val / REG_FIFO_ELEMENT_DWORDS; 7112c965db44STomer Tayar elements = (struct reg_fifo_element *)dump_buf; 7113c965db44STomer Tayar 7114c965db44STomer Tayar /* Decode elements */ 7115c965db44STomer Tayar for (i = 0; i < num_elements; i++) { 71162d22bc83SMichal Kalderon const char *err_msg = NULL; 7117c965db44STomer Tayar 7118c965db44STomer Tayar /* Discover if element belongs to a VF or a PF */ 7119c965db44STomer Tayar vf_val = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_VF); 7120c965db44STomer Tayar if (vf_val == REG_FIFO_ELEMENT_IS_PF_VF_VAL) 7121c965db44STomer Tayar sprintf(vf_str, "%s", "N/A"); 7122c965db44STomer Tayar else 7123c965db44STomer Tayar sprintf(vf_str, "%d", vf_val); 7124c965db44STomer Tayar 71252d22bc83SMichal Kalderon /* Find error message */ 71262d22bc83SMichal Kalderon err_code = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_ERROR); 71272d22bc83SMichal Kalderon for (j = 0; j < ARRAY_SIZE(s_reg_fifo_errors) && !err_msg; j++) 71282d22bc83SMichal Kalderon if (err_code == s_reg_fifo_errors[j].err_code) 71292d22bc83SMichal Kalderon err_msg = s_reg_fifo_errors[j].err_msg; 71302d22bc83SMichal Kalderon 7131c965db44STomer Tayar /* Add parsed element to parsed buffer */ 7132c965db44STomer Tayar results_offset += 7133c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 7134c965db44STomer Tayar results_offset), 71352d22bc83SMichal Kalderon "raw: 0x%016llx, address: 0x%07x, access: %-5s, pf: %2d, vf: %s, port: %d, privilege: %-3s, protection: %-12s, master: %-4s, error: %s\n", 7136c965db44STomer Tayar elements[i].data, 7137be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 7138c965db44STomer Tayar REG_FIFO_ELEMENT_ADDRESS) * 7139c965db44STomer Tayar REG_FIFO_ELEMENT_ADDR_FACTOR, 7140c965db44STomer Tayar s_access_strs[GET_FIELD(elements[i].data, 7141c965db44STomer Tayar REG_FIFO_ELEMENT_ACCESS)], 7142be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 71437b6859fbSMintz, Yuval REG_FIFO_ELEMENT_PF), 71447b6859fbSMintz, Yuval vf_str, 7145be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 7146c965db44STomer Tayar REG_FIFO_ELEMENT_PORT), 71477b6859fbSMintz, Yuval s_privilege_strs[GET_FIELD(elements[i].data, 7148c965db44STomer Tayar REG_FIFO_ELEMENT_PRIVILEGE)], 7149c965db44STomer Tayar s_protection_strs[GET_FIELD(elements[i].data, 7150c965db44STomer Tayar REG_FIFO_ELEMENT_PROTECTION)], 7151c965db44STomer Tayar s_master_strs[GET_FIELD(elements[i].data, 71522d22bc83SMichal Kalderon REG_FIFO_ELEMENT_MASTER)], 71532d22bc83SMichal Kalderon err_msg ? err_msg : "unknown error code"); 7154c965db44STomer Tayar } 7155c965db44STomer Tayar 7156c965db44STomer Tayar results_offset += sprintf(qed_get_buf_ptr(results_buf, 7157c965db44STomer Tayar results_offset), 7158c965db44STomer Tayar "fifo contained %d elements", num_elements); 7159c965db44STomer Tayar 7160c965db44STomer Tayar /* Add 1 for string NULL termination */ 7161c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 71627b6859fbSMintz, Yuval 7163c965db44STomer Tayar return DBG_STATUS_OK; 7164c965db44STomer Tayar } 7165c965db44STomer Tayar 71667b6859fbSMintz, Yuval static enum dbg_status qed_parse_igu_fifo_element(struct igu_fifo_element 71677b6859fbSMintz, Yuval *element, char 71687b6859fbSMintz, Yuval *results_buf, 7169da090917STomer Tayar u32 *results_offset) 7170c965db44STomer Tayar { 71717b6859fbSMintz, Yuval const struct igu_fifo_addr_data *found_addr = NULL; 71727b6859fbSMintz, Yuval u8 source, err_type, i, is_cleanup; 71737b6859fbSMintz, Yuval char parsed_addr_data[32]; 71747b6859fbSMintz, Yuval char parsed_wr_data[256]; 71757b6859fbSMintz, Yuval u32 wr_data, prod_cons; 71767b6859fbSMintz, Yuval bool is_wr_cmd, is_pf; 71777b6859fbSMintz, Yuval u16 cmd_addr; 71787b6859fbSMintz, Yuval u64 dword12; 71797b6859fbSMintz, Yuval 71807b6859fbSMintz, Yuval /* Dword12 (dword index 1 and 2) contains bits 32..95 of the 71817b6859fbSMintz, Yuval * FIFO element. 71827b6859fbSMintz, Yuval */ 71837b6859fbSMintz, Yuval dword12 = ((u64)element->dword2 << 32) | element->dword1; 71847b6859fbSMintz, Yuval is_wr_cmd = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD); 71857b6859fbSMintz, Yuval is_pf = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_IS_PF); 71867b6859fbSMintz, Yuval cmd_addr = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR); 71877b6859fbSMintz, Yuval source = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_SOURCE); 71887b6859fbSMintz, Yuval err_type = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE); 71897b6859fbSMintz, Yuval 71907b6859fbSMintz, Yuval if (source >= ARRAY_SIZE(s_igu_fifo_source_strs)) 71917b6859fbSMintz, Yuval return DBG_STATUS_IGU_FIFO_BAD_DATA; 71927b6859fbSMintz, Yuval if (err_type >= ARRAY_SIZE(s_igu_fifo_error_strs)) 71937b6859fbSMintz, Yuval return DBG_STATUS_IGU_FIFO_BAD_DATA; 71947b6859fbSMintz, Yuval 71957b6859fbSMintz, Yuval /* Find address data */ 71967b6859fbSMintz, Yuval for (i = 0; i < ARRAY_SIZE(s_igu_fifo_addr_data) && !found_addr; i++) { 71977b6859fbSMintz, Yuval const struct igu_fifo_addr_data *curr_addr = 71987b6859fbSMintz, Yuval &s_igu_fifo_addr_data[i]; 71997b6859fbSMintz, Yuval 72007b6859fbSMintz, Yuval if (cmd_addr >= curr_addr->start_addr && cmd_addr <= 72017b6859fbSMintz, Yuval curr_addr->end_addr) 72027b6859fbSMintz, Yuval found_addr = curr_addr; 7203c965db44STomer Tayar } 7204c965db44STomer Tayar 72057b6859fbSMintz, Yuval if (!found_addr) 72067b6859fbSMintz, Yuval return DBG_STATUS_IGU_FIFO_BAD_DATA; 7207c965db44STomer Tayar 72087b6859fbSMintz, Yuval /* Prepare parsed address data */ 72097b6859fbSMintz, Yuval switch (found_addr->type) { 72107b6859fbSMintz, Yuval case IGU_ADDR_TYPE_MSIX_MEM: 72117b6859fbSMintz, Yuval sprintf(parsed_addr_data, " vector_num = 0x%x", cmd_addr / 2); 72127b6859fbSMintz, Yuval break; 72137b6859fbSMintz, Yuval case IGU_ADDR_TYPE_WRITE_INT_ACK: 72147b6859fbSMintz, Yuval case IGU_ADDR_TYPE_WRITE_PROD_UPDATE: 72157b6859fbSMintz, Yuval sprintf(parsed_addr_data, 72167b6859fbSMintz, Yuval " SB = 0x%x", cmd_addr - found_addr->start_addr); 72177b6859fbSMintz, Yuval break; 72187b6859fbSMintz, Yuval default: 72197b6859fbSMintz, Yuval parsed_addr_data[0] = '\0'; 72207b6859fbSMintz, Yuval } 72217b6859fbSMintz, Yuval 72227b6859fbSMintz, Yuval if (!is_wr_cmd) { 72237b6859fbSMintz, Yuval parsed_wr_data[0] = '\0'; 72247b6859fbSMintz, Yuval goto out; 72257b6859fbSMintz, Yuval } 72267b6859fbSMintz, Yuval 72277b6859fbSMintz, Yuval /* Prepare parsed write data */ 72287b6859fbSMintz, Yuval wr_data = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_WR_DATA); 72297b6859fbSMintz, Yuval prod_cons = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_PROD_CONS); 72307b6859fbSMintz, Yuval is_cleanup = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_CMD_TYPE); 72317b6859fbSMintz, Yuval 72327b6859fbSMintz, Yuval if (source == IGU_SRC_ATTN) { 72337b6859fbSMintz, Yuval sprintf(parsed_wr_data, "prod: 0x%x, ", prod_cons); 72347b6859fbSMintz, Yuval } else { 72357b6859fbSMintz, Yuval if (is_cleanup) { 72367b6859fbSMintz, Yuval u8 cleanup_val, cleanup_type; 72377b6859fbSMintz, Yuval 72387b6859fbSMintz, Yuval cleanup_val = 72397b6859fbSMintz, Yuval GET_FIELD(wr_data, 72407b6859fbSMintz, Yuval IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL); 72417b6859fbSMintz, Yuval cleanup_type = 72427b6859fbSMintz, Yuval GET_FIELD(wr_data, 72437b6859fbSMintz, Yuval IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE); 72447b6859fbSMintz, Yuval 72457b6859fbSMintz, Yuval sprintf(parsed_wr_data, 72467b6859fbSMintz, Yuval "cmd_type: cleanup, cleanup_val: %s, cleanup_type : %d, ", 72477b6859fbSMintz, Yuval cleanup_val ? "set" : "clear", 72487b6859fbSMintz, Yuval cleanup_type); 72497b6859fbSMintz, Yuval } else { 72507b6859fbSMintz, Yuval u8 update_flag, en_dis_int_for_sb, segment; 72517b6859fbSMintz, Yuval u8 timer_mask; 72527b6859fbSMintz, Yuval 72537b6859fbSMintz, Yuval update_flag = GET_FIELD(wr_data, 72547b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_UPDATE_FLAG); 72557b6859fbSMintz, Yuval en_dis_int_for_sb = 72567b6859fbSMintz, Yuval GET_FIELD(wr_data, 72577b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB); 72587b6859fbSMintz, Yuval segment = GET_FIELD(wr_data, 72597b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_SEGMENT); 72607b6859fbSMintz, Yuval timer_mask = GET_FIELD(wr_data, 72617b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_TIMER_MASK); 72627b6859fbSMintz, Yuval 72637b6859fbSMintz, Yuval sprintf(parsed_wr_data, 72647b6859fbSMintz, Yuval "cmd_type: prod/cons update, prod/cons: 0x%x, update_flag: %s, en_dis_int_for_sb : %s, segment : %s, timer_mask = %d, ", 72657b6859fbSMintz, Yuval prod_cons, 72667b6859fbSMintz, Yuval update_flag ? "update" : "nop", 7267da090917STomer Tayar en_dis_int_for_sb ? 7268da090917STomer Tayar (en_dis_int_for_sb == 1 ? "disable" : "nop") : 7269da090917STomer Tayar "enable", 72707b6859fbSMintz, Yuval segment ? "attn" : "regular", 72717b6859fbSMintz, Yuval timer_mask); 72727b6859fbSMintz, Yuval } 72737b6859fbSMintz, Yuval } 72747b6859fbSMintz, Yuval out: 72757b6859fbSMintz, Yuval /* Add parsed element to parsed buffer */ 72767b6859fbSMintz, Yuval *results_offset += sprintf(qed_get_buf_ptr(results_buf, 72777b6859fbSMintz, Yuval *results_offset), 72787b6859fbSMintz, Yuval "raw: 0x%01x%08x%08x, %s: %d, source : %s, type : %s, cmd_addr : 0x%x(%s%s), %serror: %s\n", 72797b6859fbSMintz, Yuval element->dword2, element->dword1, 72807b6859fbSMintz, Yuval element->dword0, 72817b6859fbSMintz, Yuval is_pf ? "pf" : "vf", 72827b6859fbSMintz, Yuval GET_FIELD(element->dword0, 72837b6859fbSMintz, Yuval IGU_FIFO_ELEMENT_DWORD0_FID), 72847b6859fbSMintz, Yuval s_igu_fifo_source_strs[source], 72857b6859fbSMintz, Yuval is_wr_cmd ? "wr" : "rd", 72867b6859fbSMintz, Yuval cmd_addr, 72877b6859fbSMintz, Yuval (!is_pf && found_addr->vf_desc) 72887b6859fbSMintz, Yuval ? found_addr->vf_desc 72897b6859fbSMintz, Yuval : found_addr->desc, 72907b6859fbSMintz, Yuval parsed_addr_data, 72917b6859fbSMintz, Yuval parsed_wr_data, 72927b6859fbSMintz, Yuval s_igu_fifo_error_strs[err_type]); 72937b6859fbSMintz, Yuval 72947b6859fbSMintz, Yuval return DBG_STATUS_OK; 7295c965db44STomer Tayar } 7296c965db44STomer Tayar 7297c965db44STomer Tayar /* Parses an IGU FIFO dump buffer. 7298c965db44STomer Tayar * If result_buf is not NULL, the IGU FIFO results are printed to it. 7299c965db44STomer Tayar * In any case, the required results buffer size is assigned to 7300c965db44STomer Tayar * parsed_results_bytes. 7301c965db44STomer Tayar * The parsing status is returned. 7302c965db44STomer Tayar */ 7303da090917STomer Tayar static enum dbg_status qed_parse_igu_fifo_dump(u32 *dump_buf, 7304c965db44STomer Tayar char *results_buf, 7305c965db44STomer Tayar u32 *parsed_results_bytes) 7306c965db44STomer Tayar { 7307c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 73087b6859fbSMintz, Yuval u32 param_num_val, num_section_params, num_elements; 7309c965db44STomer Tayar struct igu_fifo_element *elements; 73107b6859fbSMintz, Yuval enum dbg_status status; 73117b6859fbSMintz, Yuval u32 results_offset = 0; 73127b6859fbSMintz, Yuval u8 i; 7313c965db44STomer Tayar 7314c965db44STomer Tayar /* Read global_params section */ 7315c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7316c965db44STomer Tayar §ion_name, &num_section_params); 7317c965db44STomer Tayar if (strcmp(section_name, "global_params")) 7318c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 7319c965db44STomer Tayar 7320c965db44STomer Tayar /* Print global params */ 7321c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 7322c965db44STomer Tayar num_section_params, 7323c965db44STomer Tayar results_buf, &results_offset); 7324c965db44STomer Tayar 7325c965db44STomer Tayar /* Read igu_fifo_data section */ 7326c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7327c965db44STomer Tayar §ion_name, &num_section_params); 7328c965db44STomer Tayar if (strcmp(section_name, "igu_fifo_data")) 7329c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 7330c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 7331c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 7332c965db44STomer Tayar if (strcmp(param_name, "size")) 7333c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 7334c965db44STomer Tayar if (param_num_val % IGU_FIFO_ELEMENT_DWORDS) 7335c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 7336c965db44STomer Tayar num_elements = param_num_val / IGU_FIFO_ELEMENT_DWORDS; 7337c965db44STomer Tayar elements = (struct igu_fifo_element *)dump_buf; 7338c965db44STomer Tayar 7339c965db44STomer Tayar /* Decode elements */ 7340c965db44STomer Tayar for (i = 0; i < num_elements; i++) { 73417b6859fbSMintz, Yuval status = qed_parse_igu_fifo_element(&elements[i], 73427b6859fbSMintz, Yuval results_buf, 7343da090917STomer Tayar &results_offset); 73447b6859fbSMintz, Yuval if (status != DBG_STATUS_OK) 73457b6859fbSMintz, Yuval return status; 7346c965db44STomer Tayar } 7347c965db44STomer Tayar 7348c965db44STomer Tayar results_offset += sprintf(qed_get_buf_ptr(results_buf, 7349c965db44STomer Tayar results_offset), 7350c965db44STomer Tayar "fifo contained %d elements", num_elements); 7351c965db44STomer Tayar 7352c965db44STomer Tayar /* Add 1 for string NULL termination */ 7353c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 73547b6859fbSMintz, Yuval 7355c965db44STomer Tayar return DBG_STATUS_OK; 7356c965db44STomer Tayar } 7357c965db44STomer Tayar 7358c965db44STomer Tayar static enum dbg_status 7359da090917STomer Tayar qed_parse_protection_override_dump(u32 *dump_buf, 7360c965db44STomer Tayar char *results_buf, 7361c965db44STomer Tayar u32 *parsed_results_bytes) 7362c965db44STomer Tayar { 7363c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 73647b6859fbSMintz, Yuval u32 param_num_val, num_section_params, num_elements; 7365c965db44STomer Tayar struct protection_override_element *elements; 73667b6859fbSMintz, Yuval u32 results_offset = 0; 7367c965db44STomer Tayar u8 i; 7368c965db44STomer Tayar 7369c965db44STomer Tayar /* Read global_params section */ 7370c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7371c965db44STomer Tayar §ion_name, &num_section_params); 7372c965db44STomer Tayar if (strcmp(section_name, "global_params")) 7373c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 7374c965db44STomer Tayar 7375c965db44STomer Tayar /* Print global params */ 7376c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 7377c965db44STomer Tayar num_section_params, 7378c965db44STomer Tayar results_buf, &results_offset); 7379c965db44STomer Tayar 7380c965db44STomer Tayar /* Read protection_override_data section */ 7381c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7382c965db44STomer Tayar §ion_name, &num_section_params); 7383c965db44STomer Tayar if (strcmp(section_name, "protection_override_data")) 7384c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 7385c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 7386c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 7387c965db44STomer Tayar if (strcmp(param_name, "size")) 7388c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 73897b6859fbSMintz, Yuval if (param_num_val % PROTECTION_OVERRIDE_ELEMENT_DWORDS) 7390c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 7391c965db44STomer Tayar num_elements = param_num_val / PROTECTION_OVERRIDE_ELEMENT_DWORDS; 7392c965db44STomer Tayar elements = (struct protection_override_element *)dump_buf; 7393c965db44STomer Tayar 7394c965db44STomer Tayar /* Decode elements */ 7395c965db44STomer Tayar for (i = 0; i < num_elements; i++) { 7396c965db44STomer Tayar u32 address = GET_FIELD(elements[i].data, 7397c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_ADDRESS) * 7398c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR; 7399c965db44STomer Tayar 7400c965db44STomer Tayar results_offset += 7401c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 7402c965db44STomer Tayar results_offset), 7403be086e7cSMintz, Yuval "window %2d, address: 0x%07x, size: %7d regs, read: %d, write: %d, read protection: %-12s, write protection: %-12s\n", 7404c965db44STomer Tayar i, address, 7405be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 7406c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE), 7407be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 7408c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_READ), 7409be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 7410c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_WRITE), 7411c965db44STomer Tayar s_protection_strs[GET_FIELD(elements[i].data, 7412c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION)], 7413c965db44STomer Tayar s_protection_strs[GET_FIELD(elements[i].data, 7414c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION)]); 7415c965db44STomer Tayar } 7416c965db44STomer Tayar 7417c965db44STomer Tayar results_offset += sprintf(qed_get_buf_ptr(results_buf, 7418c965db44STomer Tayar results_offset), 7419c965db44STomer Tayar "protection override contained %d elements", 7420c965db44STomer Tayar num_elements); 7421c965db44STomer Tayar 7422c965db44STomer Tayar /* Add 1 for string NULL termination */ 7423c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 74247b6859fbSMintz, Yuval 7425c965db44STomer Tayar return DBG_STATUS_OK; 7426c965db44STomer Tayar } 7427c965db44STomer Tayar 74287b6859fbSMintz, Yuval /* Parses a FW Asserts dump buffer. 74297b6859fbSMintz, Yuval * If result_buf is not NULL, the FW Asserts results are printed to it. 74307b6859fbSMintz, Yuval * In any case, the required results buffer size is assigned to 74317b6859fbSMintz, Yuval * parsed_results_bytes. 74327b6859fbSMintz, Yuval * The parsing status is returned. 74337b6859fbSMintz, Yuval */ 7434da090917STomer Tayar static enum dbg_status qed_parse_fw_asserts_dump(u32 *dump_buf, 74357b6859fbSMintz, Yuval char *results_buf, 74367b6859fbSMintz, Yuval u32 *parsed_results_bytes) 74377b6859fbSMintz, Yuval { 74387b6859fbSMintz, Yuval u32 num_section_params, param_num_val, i, results_offset = 0; 74397b6859fbSMintz, Yuval const char *param_name, *param_str_val, *section_name; 74407b6859fbSMintz, Yuval bool last_section_found = false; 74417b6859fbSMintz, Yuval 74427b6859fbSMintz, Yuval *parsed_results_bytes = 0; 74437b6859fbSMintz, Yuval 74447b6859fbSMintz, Yuval /* Read global_params section */ 74457b6859fbSMintz, Yuval dump_buf += qed_read_section_hdr(dump_buf, 74467b6859fbSMintz, Yuval §ion_name, &num_section_params); 74477b6859fbSMintz, Yuval if (strcmp(section_name, "global_params")) 74487b6859fbSMintz, Yuval return DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 74497b6859fbSMintz, Yuval 74507b6859fbSMintz, Yuval /* Print global params */ 74517b6859fbSMintz, Yuval dump_buf += qed_print_section_params(dump_buf, 74527b6859fbSMintz, Yuval num_section_params, 74537b6859fbSMintz, Yuval results_buf, &results_offset); 74547b6859fbSMintz, Yuval 74557b6859fbSMintz, Yuval while (!last_section_found) { 74567b6859fbSMintz, Yuval dump_buf += qed_read_section_hdr(dump_buf, 74577b6859fbSMintz, Yuval §ion_name, 74587b6859fbSMintz, Yuval &num_section_params); 74597b6859fbSMintz, Yuval if (!strcmp(section_name, "fw_asserts")) { 74607b6859fbSMintz, Yuval /* Extract params */ 74617b6859fbSMintz, Yuval const char *storm_letter = NULL; 74627b6859fbSMintz, Yuval u32 storm_dump_size = 0; 74637b6859fbSMintz, Yuval 74647b6859fbSMintz, Yuval for (i = 0; i < num_section_params; i++) { 74657b6859fbSMintz, Yuval dump_buf += qed_read_param(dump_buf, 74667b6859fbSMintz, Yuval ¶m_name, 74677b6859fbSMintz, Yuval ¶m_str_val, 74687b6859fbSMintz, Yuval ¶m_num_val); 74697b6859fbSMintz, Yuval if (!strcmp(param_name, "storm")) 74707b6859fbSMintz, Yuval storm_letter = param_str_val; 74717b6859fbSMintz, Yuval else if (!strcmp(param_name, "size")) 74727b6859fbSMintz, Yuval storm_dump_size = param_num_val; 74737b6859fbSMintz, Yuval else 74747b6859fbSMintz, Yuval return 74757b6859fbSMintz, Yuval DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 74767b6859fbSMintz, Yuval } 74777b6859fbSMintz, Yuval 74787b6859fbSMintz, Yuval if (!storm_letter || !storm_dump_size) 74797b6859fbSMintz, Yuval return DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 74807b6859fbSMintz, Yuval 74817b6859fbSMintz, Yuval /* Print data */ 74827b6859fbSMintz, Yuval results_offset += 74837b6859fbSMintz, Yuval sprintf(qed_get_buf_ptr(results_buf, 74847b6859fbSMintz, Yuval results_offset), 74857b6859fbSMintz, Yuval "\n%sSTORM_ASSERT: size=%d\n", 74867b6859fbSMintz, Yuval storm_letter, storm_dump_size); 74877b6859fbSMintz, Yuval for (i = 0; i < storm_dump_size; i++, dump_buf++) 74887b6859fbSMintz, Yuval results_offset += 74897b6859fbSMintz, Yuval sprintf(qed_get_buf_ptr(results_buf, 74907b6859fbSMintz, Yuval results_offset), 74917b6859fbSMintz, Yuval "%08x\n", *dump_buf); 74927b6859fbSMintz, Yuval } else if (!strcmp(section_name, "last")) { 74937b6859fbSMintz, Yuval last_section_found = true; 74947b6859fbSMintz, Yuval } else { 74957b6859fbSMintz, Yuval return DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 74967b6859fbSMintz, Yuval } 74977b6859fbSMintz, Yuval } 74987b6859fbSMintz, Yuval 74997b6859fbSMintz, Yuval /* Add 1 for string NULL termination */ 75007b6859fbSMintz, Yuval *parsed_results_bytes = results_offset + 1; 75017b6859fbSMintz, Yuval 75027b6859fbSMintz, Yuval return DBG_STATUS_OK; 75037b6859fbSMintz, Yuval } 75047b6859fbSMintz, Yuval 75057b6859fbSMintz, Yuval /***************************** Public Functions *******************************/ 75067b6859fbSMintz, Yuval 75072d22bc83SMichal Kalderon enum dbg_status qed_dbg_user_set_bin_ptr(struct qed_hwfn *p_hwfn, 75082d22bc83SMichal Kalderon const u8 * const bin_ptr) 75097b6859fbSMintz, Yuval { 75102d22bc83SMichal Kalderon struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr; 75117b6859fbSMintz, Yuval u8 buf_id; 75127b6859fbSMintz, Yuval 75137b6859fbSMintz, Yuval /* Convert binary data to debug arrays */ 75142d22bc83SMichal Kalderon for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) 75152d22bc83SMichal Kalderon qed_set_dbg_bin_buf(p_hwfn, 75162d22bc83SMichal Kalderon (enum bin_dbg_buffer_type)buf_id, 75172d22bc83SMichal Kalderon (u32 *)(bin_ptr + buf_hdrs[buf_id].offset), 75182d22bc83SMichal Kalderon buf_hdrs[buf_id].length); 75197b6859fbSMintz, Yuval 75207b6859fbSMintz, Yuval return DBG_STATUS_OK; 75217b6859fbSMintz, Yuval } 75227b6859fbSMintz, Yuval 75232d22bc83SMichal Kalderon enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn, 75242d22bc83SMichal Kalderon void **user_data_ptr) 7525a3f72307SDenis Bolotin { 75262d22bc83SMichal Kalderon *user_data_ptr = kzalloc(sizeof(struct dbg_tools_user_data), 7527a3f72307SDenis Bolotin GFP_KERNEL); 75282d22bc83SMichal Kalderon if (!(*user_data_ptr)) 7529a3f72307SDenis Bolotin return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 7530a3f72307SDenis Bolotin 7531a3f72307SDenis Bolotin return DBG_STATUS_OK; 7532a3f72307SDenis Bolotin } 7533a3f72307SDenis Bolotin 75347b6859fbSMintz, Yuval const char *qed_dbg_get_status_str(enum dbg_status status) 75357b6859fbSMintz, Yuval { 75367b6859fbSMintz, Yuval return (status < 75377b6859fbSMintz, Yuval MAX_DBG_STATUS) ? s_status_str[status] : "Invalid debug status"; 75387b6859fbSMintz, Yuval } 75397b6859fbSMintz, Yuval 75407b6859fbSMintz, Yuval enum dbg_status qed_get_idle_chk_results_buf_size(struct qed_hwfn *p_hwfn, 75417b6859fbSMintz, Yuval u32 *dump_buf, 75427b6859fbSMintz, Yuval u32 num_dumped_dwords, 75437b6859fbSMintz, Yuval u32 *results_buf_size) 75447b6859fbSMintz, Yuval { 75457b6859fbSMintz, Yuval u32 num_errors, num_warnings; 75467b6859fbSMintz, Yuval 75472d22bc83SMichal Kalderon return qed_parse_idle_chk_dump(p_hwfn, 75482d22bc83SMichal Kalderon dump_buf, 75497b6859fbSMintz, Yuval num_dumped_dwords, 75507b6859fbSMintz, Yuval NULL, 75517b6859fbSMintz, Yuval results_buf_size, 75527b6859fbSMintz, Yuval &num_errors, &num_warnings); 75537b6859fbSMintz, Yuval } 75547b6859fbSMintz, Yuval 75557b6859fbSMintz, Yuval enum dbg_status qed_print_idle_chk_results(struct qed_hwfn *p_hwfn, 75567b6859fbSMintz, Yuval u32 *dump_buf, 75577b6859fbSMintz, Yuval u32 num_dumped_dwords, 75587b6859fbSMintz, Yuval char *results_buf, 7559da090917STomer Tayar u32 *num_errors, 7560da090917STomer Tayar u32 *num_warnings) 75617b6859fbSMintz, Yuval { 75627b6859fbSMintz, Yuval u32 parsed_buf_size; 75637b6859fbSMintz, Yuval 75642d22bc83SMichal Kalderon return qed_parse_idle_chk_dump(p_hwfn, 75652d22bc83SMichal Kalderon dump_buf, 75667b6859fbSMintz, Yuval num_dumped_dwords, 75677b6859fbSMintz, Yuval results_buf, 75687b6859fbSMintz, Yuval &parsed_buf_size, 75697b6859fbSMintz, Yuval num_errors, num_warnings); 75707b6859fbSMintz, Yuval } 75717b6859fbSMintz, Yuval 7572a3f72307SDenis Bolotin void qed_dbg_mcp_trace_set_meta_data(struct qed_hwfn *p_hwfn, 7573a3f72307SDenis Bolotin const u32 *meta_buf) 75747b6859fbSMintz, Yuval { 7575a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data = 7576a3f72307SDenis Bolotin qed_dbg_get_user_data(p_hwfn); 7577a3f72307SDenis Bolotin 7578a3f72307SDenis Bolotin dev_user_data->mcp_trace_user_meta_buf = meta_buf; 75797b6859fbSMintz, Yuval } 75807b6859fbSMintz, Yuval 75817b6859fbSMintz, Yuval enum dbg_status qed_get_mcp_trace_results_buf_size(struct qed_hwfn *p_hwfn, 75827b6859fbSMintz, Yuval u32 *dump_buf, 75837b6859fbSMintz, Yuval u32 num_dumped_dwords, 75847b6859fbSMintz, Yuval u32 *results_buf_size) 75857b6859fbSMintz, Yuval { 75867b6859fbSMintz, Yuval return qed_parse_mcp_trace_dump(p_hwfn, 7587a3f72307SDenis Bolotin dump_buf, NULL, results_buf_size, true); 75887b6859fbSMintz, Yuval } 75897b6859fbSMintz, Yuval 75907b6859fbSMintz, Yuval enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn, 75917b6859fbSMintz, Yuval u32 *dump_buf, 75927b6859fbSMintz, Yuval u32 num_dumped_dwords, 75937b6859fbSMintz, Yuval char *results_buf) 75947b6859fbSMintz, Yuval { 75957b6859fbSMintz, Yuval u32 parsed_buf_size; 75967b6859fbSMintz, Yuval 75976c95dd8fSPrabhakar Kushwaha /* Doesn't do anything, needed for compile time asserts */ 75986c95dd8fSPrabhakar Kushwaha qed_user_static_asserts(); 75996c95dd8fSPrabhakar Kushwaha 76007b6859fbSMintz, Yuval return qed_parse_mcp_trace_dump(p_hwfn, 76017b6859fbSMintz, Yuval dump_buf, 7602a3f72307SDenis Bolotin results_buf, &parsed_buf_size, true); 76037b6859fbSMintz, Yuval } 76047b6859fbSMintz, Yuval 7605a3f72307SDenis Bolotin enum dbg_status qed_print_mcp_trace_results_cont(struct qed_hwfn *p_hwfn, 7606a3f72307SDenis Bolotin u32 *dump_buf, 7607a3f72307SDenis Bolotin char *results_buf) 7608a3f72307SDenis Bolotin { 7609a3f72307SDenis Bolotin u32 parsed_buf_size; 7610a3f72307SDenis Bolotin 7611a3f72307SDenis Bolotin return qed_parse_mcp_trace_dump(p_hwfn, dump_buf, results_buf, 7612a3f72307SDenis Bolotin &parsed_buf_size, false); 7613a3f72307SDenis Bolotin } 7614a3f72307SDenis Bolotin 7615a3f72307SDenis Bolotin enum dbg_status qed_print_mcp_trace_line(struct qed_hwfn *p_hwfn, 7616a3f72307SDenis Bolotin u8 *dump_buf, 761750bc60cbSMichal Kalderon u32 num_dumped_bytes, 761850bc60cbSMichal Kalderon char *results_buf) 761950bc60cbSMichal Kalderon { 7620a3f72307SDenis Bolotin u32 parsed_results_bytes; 762150bc60cbSMichal Kalderon 7622a3f72307SDenis Bolotin return qed_parse_mcp_trace_buf(p_hwfn, 7623a3f72307SDenis Bolotin dump_buf, 762450bc60cbSMichal Kalderon num_dumped_bytes, 762550bc60cbSMichal Kalderon 0, 762650bc60cbSMichal Kalderon num_dumped_bytes, 7627a3f72307SDenis Bolotin results_buf, &parsed_results_bytes); 7628a3f72307SDenis Bolotin } 7629a3f72307SDenis Bolotin 7630a3f72307SDenis Bolotin /* Frees the specified MCP Trace meta data */ 7631a3f72307SDenis Bolotin void qed_mcp_trace_free_meta_data(struct qed_hwfn *p_hwfn) 7632a3f72307SDenis Bolotin { 7633a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data; 7634a3f72307SDenis Bolotin struct mcp_trace_meta *meta; 7635a3f72307SDenis Bolotin u32 i; 7636a3f72307SDenis Bolotin 7637a3f72307SDenis Bolotin dev_user_data = qed_dbg_get_user_data(p_hwfn); 7638a3f72307SDenis Bolotin meta = &dev_user_data->mcp_trace_meta; 7639a3f72307SDenis Bolotin if (!meta->is_allocated) 7640a3f72307SDenis Bolotin return; 7641a3f72307SDenis Bolotin 7642a3f72307SDenis Bolotin /* Release modules */ 7643a3f72307SDenis Bolotin if (meta->modules) { 7644a3f72307SDenis Bolotin for (i = 0; i < meta->modules_num; i++) 7645a3f72307SDenis Bolotin kfree(meta->modules[i]); 7646a3f72307SDenis Bolotin kfree(meta->modules); 7647a3f72307SDenis Bolotin } 7648a3f72307SDenis Bolotin 7649a3f72307SDenis Bolotin /* Release formats */ 7650a3f72307SDenis Bolotin if (meta->formats) { 7651a3f72307SDenis Bolotin for (i = 0; i < meta->formats_num; i++) 7652a3f72307SDenis Bolotin kfree(meta->formats[i].format_str); 7653a3f72307SDenis Bolotin kfree(meta->formats); 7654a3f72307SDenis Bolotin } 7655a3f72307SDenis Bolotin 7656a3f72307SDenis Bolotin meta->is_allocated = false; 765750bc60cbSMichal Kalderon } 765850bc60cbSMichal Kalderon 76597b6859fbSMintz, Yuval enum dbg_status qed_get_reg_fifo_results_buf_size(struct qed_hwfn *p_hwfn, 76607b6859fbSMintz, Yuval u32 *dump_buf, 76617b6859fbSMintz, Yuval u32 num_dumped_dwords, 76627b6859fbSMintz, Yuval u32 *results_buf_size) 76637b6859fbSMintz, Yuval { 7664da090917STomer Tayar return qed_parse_reg_fifo_dump(dump_buf, NULL, results_buf_size); 76657b6859fbSMintz, Yuval } 76667b6859fbSMintz, Yuval 76677b6859fbSMintz, Yuval enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn, 76687b6859fbSMintz, Yuval u32 *dump_buf, 76697b6859fbSMintz, Yuval u32 num_dumped_dwords, 76707b6859fbSMintz, Yuval char *results_buf) 76717b6859fbSMintz, Yuval { 76727b6859fbSMintz, Yuval u32 parsed_buf_size; 76737b6859fbSMintz, Yuval 7674da090917STomer Tayar return qed_parse_reg_fifo_dump(dump_buf, results_buf, &parsed_buf_size); 76757b6859fbSMintz, Yuval } 76767b6859fbSMintz, Yuval 76777b6859fbSMintz, Yuval enum dbg_status qed_get_igu_fifo_results_buf_size(struct qed_hwfn *p_hwfn, 76787b6859fbSMintz, Yuval u32 *dump_buf, 76797b6859fbSMintz, Yuval u32 num_dumped_dwords, 76807b6859fbSMintz, Yuval u32 *results_buf_size) 76817b6859fbSMintz, Yuval { 7682da090917STomer Tayar return qed_parse_igu_fifo_dump(dump_buf, NULL, results_buf_size); 76837b6859fbSMintz, Yuval } 76847b6859fbSMintz, Yuval 76857b6859fbSMintz, Yuval enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn, 76867b6859fbSMintz, Yuval u32 *dump_buf, 76877b6859fbSMintz, Yuval u32 num_dumped_dwords, 76887b6859fbSMintz, Yuval char *results_buf) 76897b6859fbSMintz, Yuval { 76907b6859fbSMintz, Yuval u32 parsed_buf_size; 76917b6859fbSMintz, Yuval 7692da090917STomer Tayar return qed_parse_igu_fifo_dump(dump_buf, results_buf, &parsed_buf_size); 76937b6859fbSMintz, Yuval } 76947b6859fbSMintz, Yuval 7695c965db44STomer Tayar enum dbg_status 7696c965db44STomer Tayar qed_get_protection_override_results_buf_size(struct qed_hwfn *p_hwfn, 7697c965db44STomer Tayar u32 *dump_buf, 7698c965db44STomer Tayar u32 num_dumped_dwords, 7699c965db44STomer Tayar u32 *results_buf_size) 7700c965db44STomer Tayar { 7701da090917STomer Tayar return qed_parse_protection_override_dump(dump_buf, 7702c965db44STomer Tayar NULL, results_buf_size); 7703c965db44STomer Tayar } 7704c965db44STomer Tayar 7705c965db44STomer Tayar enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn, 7706c965db44STomer Tayar u32 *dump_buf, 7707c965db44STomer Tayar u32 num_dumped_dwords, 7708c965db44STomer Tayar char *results_buf) 7709c965db44STomer Tayar { 7710c965db44STomer Tayar u32 parsed_buf_size; 7711c965db44STomer Tayar 7712da090917STomer Tayar return qed_parse_protection_override_dump(dump_buf, 7713c965db44STomer Tayar results_buf, 7714c965db44STomer Tayar &parsed_buf_size); 7715c965db44STomer Tayar } 7716c965db44STomer Tayar 7717c965db44STomer Tayar enum dbg_status qed_get_fw_asserts_results_buf_size(struct qed_hwfn *p_hwfn, 7718c965db44STomer Tayar u32 *dump_buf, 7719c965db44STomer Tayar u32 num_dumped_dwords, 7720c965db44STomer Tayar u32 *results_buf_size) 7721c965db44STomer Tayar { 7722da090917STomer Tayar return qed_parse_fw_asserts_dump(dump_buf, NULL, results_buf_size); 7723c965db44STomer Tayar } 7724c965db44STomer Tayar 7725c965db44STomer Tayar enum dbg_status qed_print_fw_asserts_results(struct qed_hwfn *p_hwfn, 7726c965db44STomer Tayar u32 *dump_buf, 7727c965db44STomer Tayar u32 num_dumped_dwords, 7728c965db44STomer Tayar char *results_buf) 7729c965db44STomer Tayar { 7730c965db44STomer Tayar u32 parsed_buf_size; 7731c965db44STomer Tayar 7732da090917STomer Tayar return qed_parse_fw_asserts_dump(dump_buf, 7733c965db44STomer Tayar results_buf, &parsed_buf_size); 7734c965db44STomer Tayar } 7735c965db44STomer Tayar 77360ebbd1c8SMintz, Yuval enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn, 77370ebbd1c8SMintz, Yuval struct dbg_attn_block_result *results) 77380ebbd1c8SMintz, Yuval { 77390ebbd1c8SMintz, Yuval const u32 *block_attn_name_offsets; 77402d22bc83SMichal Kalderon const char *attn_name_base; 77410ebbd1c8SMintz, Yuval const char *block_name; 77422d22bc83SMichal Kalderon enum dbg_attn_type attn_type; 77430ebbd1c8SMintz, Yuval u8 num_regs, i, j; 77440ebbd1c8SMintz, Yuval 77450ebbd1c8SMintz, Yuval num_regs = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_NUM_REGS); 77462d22bc83SMichal Kalderon attn_type = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE); 77472d22bc83SMichal Kalderon block_name = qed_dbg_get_block_name(p_hwfn, results->block_id); 77482d22bc83SMichal Kalderon if (!block_name) 77492d22bc83SMichal Kalderon return DBG_STATUS_INVALID_ARGS; 77500ebbd1c8SMintz, Yuval 77512d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr || 77522d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr || 77532d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr) 77540ebbd1c8SMintz, Yuval return DBG_STATUS_DBG_ARRAY_NOT_SET; 77550ebbd1c8SMintz, Yuval 77562d22bc83SMichal Kalderon block_attn_name_offsets = 77572d22bc83SMichal Kalderon (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr + 77582d22bc83SMichal Kalderon results->names_offset; 77592d22bc83SMichal Kalderon 77602d22bc83SMichal Kalderon attn_name_base = p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr; 77610ebbd1c8SMintz, Yuval 77620ebbd1c8SMintz, Yuval /* Go over registers with a non-zero attention status */ 77630ebbd1c8SMintz, Yuval for (i = 0; i < num_regs; i++) { 7764da090917STomer Tayar struct dbg_attn_bit_mapping *bit_mapping; 77650ebbd1c8SMintz, Yuval struct dbg_attn_reg_result *reg_result; 77660ebbd1c8SMintz, Yuval u8 num_reg_attn, bit_idx = 0; 77670ebbd1c8SMintz, Yuval 77680ebbd1c8SMintz, Yuval reg_result = &results->reg_results[i]; 77690ebbd1c8SMintz, Yuval num_reg_attn = GET_FIELD(reg_result->data, 77700ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_NUM_REG_ATTN); 77712d22bc83SMichal Kalderon bit_mapping = (struct dbg_attn_bit_mapping *) 77722d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr + 77732d22bc83SMichal Kalderon reg_result->block_attn_offset; 77740ebbd1c8SMintz, Yuval 77750ebbd1c8SMintz, Yuval /* Go over attention status bits */ 77766c95dd8fSPrabhakar Kushwaha for (j = 0; j < num_reg_attn; j++) { 7777da090917STomer Tayar u16 attn_idx_val = GET_FIELD(bit_mapping[j].data, 77780ebbd1c8SMintz, Yuval DBG_ATTN_BIT_MAPPING_VAL); 77790ebbd1c8SMintz, Yuval const char *attn_name, *attn_type_str, *masked_str; 77802d22bc83SMichal Kalderon u32 attn_name_offset; 77812d22bc83SMichal Kalderon u32 sts_addr; 77820ebbd1c8SMintz, Yuval 77830ebbd1c8SMintz, Yuval /* Check if bit mask should be advanced (due to unused 77840ebbd1c8SMintz, Yuval * bits). 77850ebbd1c8SMintz, Yuval */ 7786da090917STomer Tayar if (GET_FIELD(bit_mapping[j].data, 77870ebbd1c8SMintz, Yuval DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT)) { 77880ebbd1c8SMintz, Yuval bit_idx += (u8)attn_idx_val; 77890ebbd1c8SMintz, Yuval continue; 77900ebbd1c8SMintz, Yuval } 77910ebbd1c8SMintz, Yuval 77920ebbd1c8SMintz, Yuval /* Check current bit index */ 77936c95dd8fSPrabhakar Kushwaha if (reg_result->sts_val & BIT(bit_idx)) { 77942d22bc83SMichal Kalderon /* An attention bit with value=1 was found 77952d22bc83SMichal Kalderon * Find attention name 77962d22bc83SMichal Kalderon */ 7797da090917STomer Tayar attn_name_offset = 7798da090917STomer Tayar block_attn_name_offsets[attn_idx_val]; 77992d22bc83SMichal Kalderon attn_name = attn_name_base + attn_name_offset; 78002d22bc83SMichal Kalderon attn_type_str = 78012d22bc83SMichal Kalderon (attn_type == 78022d22bc83SMichal Kalderon ATTN_TYPE_INTERRUPT ? "Interrupt" : 78032d22bc83SMichal Kalderon "Parity"); 78046c95dd8fSPrabhakar Kushwaha masked_str = reg_result->mask_val & 78056c95dd8fSPrabhakar Kushwaha BIT(bit_idx) ? 78060ebbd1c8SMintz, Yuval " [masked]" : ""; 78076c95dd8fSPrabhakar Kushwaha sts_addr = 78086c95dd8fSPrabhakar Kushwaha GET_FIELD(reg_result->data, 78090ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_STS_ADDRESS); 78100ebbd1c8SMintz, Yuval DP_NOTICE(p_hwfn, 78110ebbd1c8SMintz, Yuval "%s (%s) : %s [address 0x%08x, bit %d]%s\n", 78120ebbd1c8SMintz, Yuval block_name, attn_type_str, attn_name, 78132d22bc83SMichal Kalderon sts_addr * 4, bit_idx, masked_str); 78140ebbd1c8SMintz, Yuval } 78156c95dd8fSPrabhakar Kushwaha 78166c95dd8fSPrabhakar Kushwaha bit_idx++; 78176c95dd8fSPrabhakar Kushwaha } 78180ebbd1c8SMintz, Yuval } 78190ebbd1c8SMintz, Yuval 78200ebbd1c8SMintz, Yuval return DBG_STATUS_OK; 78210ebbd1c8SMintz, Yuval } 78220ebbd1c8SMintz, Yuval 7823c965db44STomer Tayar /* Wrapper for unifying the idle_chk and mcp_trace api */ 78248c93beafSYuval Mintz static enum dbg_status 78258c93beafSYuval Mintz qed_print_idle_chk_results_wrapper(struct qed_hwfn *p_hwfn, 7826c965db44STomer Tayar u32 *dump_buf, 7827c965db44STomer Tayar u32 num_dumped_dwords, 7828c965db44STomer Tayar char *results_buf) 7829c965db44STomer Tayar { 7830c965db44STomer Tayar u32 num_errors, num_warnnings; 7831c965db44STomer Tayar 7832c965db44STomer Tayar return qed_print_idle_chk_results(p_hwfn, dump_buf, num_dumped_dwords, 7833c965db44STomer Tayar results_buf, &num_errors, 7834c965db44STomer Tayar &num_warnnings); 7835c965db44STomer Tayar } 7836c965db44STomer Tayar 78376c95dd8fSPrabhakar Kushwaha static DEFINE_MUTEX(qed_dbg_lock); 78386c95dd8fSPrabhakar Kushwaha 78396c95dd8fSPrabhakar Kushwaha #define MAX_PHY_RESULT_BUFFER 9000 78406c95dd8fSPrabhakar Kushwaha 78416c95dd8fSPrabhakar Kushwaha /******************************** Feature Meta data section ******************/ 78426c95dd8fSPrabhakar Kushwaha 78436c95dd8fSPrabhakar Kushwaha #define GRC_NUM_STR_FUNCS 2 78446c95dd8fSPrabhakar Kushwaha #define IDLE_CHK_NUM_STR_FUNCS 1 78456c95dd8fSPrabhakar Kushwaha #define MCP_TRACE_NUM_STR_FUNCS 1 78466c95dd8fSPrabhakar Kushwaha #define REG_FIFO_NUM_STR_FUNCS 1 78476c95dd8fSPrabhakar Kushwaha #define IGU_FIFO_NUM_STR_FUNCS 1 78486c95dd8fSPrabhakar Kushwaha #define PROTECTION_OVERRIDE_NUM_STR_FUNCS 1 78496c95dd8fSPrabhakar Kushwaha #define FW_ASSERTS_NUM_STR_FUNCS 1 78506c95dd8fSPrabhakar Kushwaha #define ILT_NUM_STR_FUNCS 1 78516c95dd8fSPrabhakar Kushwaha #define PHY_NUM_STR_FUNCS 20 78526c95dd8fSPrabhakar Kushwaha 7853c965db44STomer Tayar /* Feature meta data lookup table */ 7854c965db44STomer Tayar static struct { 7855c965db44STomer Tayar char *name; 78566c95dd8fSPrabhakar Kushwaha u32 num_funcs; 7857c965db44STomer Tayar enum dbg_status (*get_size)(struct qed_hwfn *p_hwfn, 7858c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *size); 7859c965db44STomer Tayar enum dbg_status (*perform_dump)(struct qed_hwfn *p_hwfn, 7860c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, 7861c965db44STomer Tayar u32 buf_size, u32 *dumped_dwords); 7862c965db44STomer Tayar enum dbg_status (*print_results)(struct qed_hwfn *p_hwfn, 7863c965db44STomer Tayar u32 *dump_buf, u32 num_dumped_dwords, 7864c965db44STomer Tayar char *results_buf); 7865c965db44STomer Tayar enum dbg_status (*results_buf_size)(struct qed_hwfn *p_hwfn, 7866c965db44STomer Tayar u32 *dump_buf, 7867c965db44STomer Tayar u32 num_dumped_dwords, 7868c965db44STomer Tayar u32 *results_buf_size); 78696c95dd8fSPrabhakar Kushwaha const struct qed_func_lookup *hsi_func_lookup; 7870c965db44STomer Tayar } qed_features_lookup[] = { 7871c965db44STomer Tayar { 78726c95dd8fSPrabhakar Kushwaha "grc", GRC_NUM_STR_FUNCS, qed_dbg_grc_get_dump_buf_size, 78736c95dd8fSPrabhakar Kushwaha qed_dbg_grc_dump, NULL, NULL, NULL}, { 78746c95dd8fSPrabhakar Kushwaha "idle_chk", IDLE_CHK_NUM_STR_FUNCS, 7875c965db44STomer Tayar qed_dbg_idle_chk_get_dump_buf_size, 7876c965db44STomer Tayar qed_dbg_idle_chk_dump, 7877c965db44STomer Tayar qed_print_idle_chk_results_wrapper, 78786c95dd8fSPrabhakar Kushwaha qed_get_idle_chk_results_buf_size, 78796c95dd8fSPrabhakar Kushwaha NULL}, { 78806c95dd8fSPrabhakar Kushwaha "mcp_trace", MCP_TRACE_NUM_STR_FUNCS, 7881c965db44STomer Tayar qed_dbg_mcp_trace_get_dump_buf_size, 7882c965db44STomer Tayar qed_dbg_mcp_trace_dump, qed_print_mcp_trace_results, 78836c95dd8fSPrabhakar Kushwaha qed_get_mcp_trace_results_buf_size, 78846c95dd8fSPrabhakar Kushwaha NULL}, { 78856c95dd8fSPrabhakar Kushwaha "reg_fifo", REG_FIFO_NUM_STR_FUNCS, 7886c965db44STomer Tayar qed_dbg_reg_fifo_get_dump_buf_size, 7887c965db44STomer Tayar qed_dbg_reg_fifo_dump, qed_print_reg_fifo_results, 78886c95dd8fSPrabhakar Kushwaha qed_get_reg_fifo_results_buf_size, 78896c95dd8fSPrabhakar Kushwaha NULL}, { 78906c95dd8fSPrabhakar Kushwaha "igu_fifo", IGU_FIFO_NUM_STR_FUNCS, 7891c965db44STomer Tayar qed_dbg_igu_fifo_get_dump_buf_size, 7892c965db44STomer Tayar qed_dbg_igu_fifo_dump, qed_print_igu_fifo_results, 78936c95dd8fSPrabhakar Kushwaha qed_get_igu_fifo_results_buf_size, 78946c95dd8fSPrabhakar Kushwaha NULL}, { 78956c95dd8fSPrabhakar Kushwaha "protection_override", PROTECTION_OVERRIDE_NUM_STR_FUNCS, 7896c965db44STomer Tayar qed_dbg_protection_override_get_dump_buf_size, 7897c965db44STomer Tayar qed_dbg_protection_override_dump, 7898c965db44STomer Tayar qed_print_protection_override_results, 78996c95dd8fSPrabhakar Kushwaha qed_get_protection_override_results_buf_size, 79006c95dd8fSPrabhakar Kushwaha NULL}, { 79016c95dd8fSPrabhakar Kushwaha "fw_asserts", FW_ASSERTS_NUM_STR_FUNCS, 7902c965db44STomer Tayar qed_dbg_fw_asserts_get_dump_buf_size, 7903c965db44STomer Tayar qed_dbg_fw_asserts_dump, 7904c965db44STomer Tayar qed_print_fw_asserts_results, 79056c95dd8fSPrabhakar Kushwaha qed_get_fw_asserts_results_buf_size, 79066c95dd8fSPrabhakar Kushwaha NULL}, { 79076c95dd8fSPrabhakar Kushwaha "ilt", ILT_NUM_STR_FUNCS, qed_dbg_ilt_get_dump_buf_size, 79086c95dd8fSPrabhakar Kushwaha qed_dbg_ilt_dump, NULL, NULL, NULL},}; 7909c965db44STomer Tayar 7910c965db44STomer Tayar static void qed_dbg_print_feature(u8 *p_text_buf, u32 text_size) 7911c965db44STomer Tayar { 7912c965db44STomer Tayar u32 i, precision = 80; 7913c965db44STomer Tayar 7914c965db44STomer Tayar if (!p_text_buf) 7915c965db44STomer Tayar return; 7916c965db44STomer Tayar 7917c965db44STomer Tayar pr_notice("\n%.*s", precision, p_text_buf); 7918c965db44STomer Tayar for (i = precision; i < text_size; i += precision) 7919c965db44STomer Tayar pr_cont("%.*s", precision, p_text_buf + i); 7920c965db44STomer Tayar pr_cont("\n"); 7921c965db44STomer Tayar } 7922c965db44STomer Tayar 7923c965db44STomer Tayar #define QED_RESULTS_BUF_MIN_SIZE 16 7924c965db44STomer Tayar /* Generic function for decoding debug feature info */ 79258c93beafSYuval Mintz static enum dbg_status format_feature(struct qed_hwfn *p_hwfn, 7926c965db44STomer Tayar enum qed_dbg_features feature_idx) 7927c965db44STomer Tayar { 7928c965db44STomer Tayar struct qed_dbg_feature *feature = 7929ca352f00SIgor Russkikh &p_hwfn->cdev->dbg_features[feature_idx]; 79306c95dd8fSPrabhakar Kushwaha u32 txt_size_bytes, null_char_pos, i; 79316c95dd8fSPrabhakar Kushwaha u32 *dbuf, dwords; 7932c965db44STomer Tayar enum dbg_status rc; 7933c965db44STomer Tayar char *text_buf; 7934c965db44STomer Tayar 7935c965db44STomer Tayar /* Check if feature supports formatting capability */ 7936c965db44STomer Tayar if (!qed_features_lookup[feature_idx].results_buf_size) 7937c965db44STomer Tayar return DBG_STATUS_OK; 7938c965db44STomer Tayar 79396c95dd8fSPrabhakar Kushwaha dbuf = (u32 *)feature->dump_buf; 79406c95dd8fSPrabhakar Kushwaha dwords = feature->dumped_dwords; 79416c95dd8fSPrabhakar Kushwaha 7942c965db44STomer Tayar /* Obtain size of formatted output */ 79436c95dd8fSPrabhakar Kushwaha rc = qed_features_lookup[feature_idx].results_buf_size(p_hwfn, 79446c95dd8fSPrabhakar Kushwaha dbuf, 79456c95dd8fSPrabhakar Kushwaha dwords, 79466c95dd8fSPrabhakar Kushwaha &txt_size_bytes); 7947c965db44STomer Tayar if (rc != DBG_STATUS_OK) 7948c965db44STomer Tayar return rc; 7949c965db44STomer Tayar 79506c95dd8fSPrabhakar Kushwaha /* Make sure that the allocated size is a multiple of dword 79516c95dd8fSPrabhakar Kushwaha * (4 bytes). 79526c95dd8fSPrabhakar Kushwaha */ 79536c95dd8fSPrabhakar Kushwaha null_char_pos = txt_size_bytes - 1; 79546c95dd8fSPrabhakar Kushwaha txt_size_bytes = (txt_size_bytes + 3) & ~0x3; 7955c965db44STomer Tayar 79566c95dd8fSPrabhakar Kushwaha if (txt_size_bytes < QED_RESULTS_BUF_MIN_SIZE) { 7957c965db44STomer Tayar DP_NOTICE(p_hwfn->cdev, 7958c965db44STomer Tayar "formatted size of feature was too small %d. Aborting\n", 79596c95dd8fSPrabhakar Kushwaha txt_size_bytes); 7960c965db44STomer Tayar return DBG_STATUS_INVALID_ARGS; 7961c965db44STomer Tayar } 7962c965db44STomer Tayar 79636c95dd8fSPrabhakar Kushwaha /* allocate temp text buf */ 79646c95dd8fSPrabhakar Kushwaha text_buf = vzalloc(txt_size_bytes); 79656c95dd8fSPrabhakar Kushwaha if (!text_buf) { 79666c95dd8fSPrabhakar Kushwaha DP_NOTICE(p_hwfn->cdev, 79676c95dd8fSPrabhakar Kushwaha "failed to allocate text buffer. Aborting\n"); 7968c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 79696c95dd8fSPrabhakar Kushwaha } 7970c965db44STomer Tayar 7971c965db44STomer Tayar /* Decode feature opcodes to string on temp buf */ 79726c95dd8fSPrabhakar Kushwaha rc = qed_features_lookup[feature_idx].print_results(p_hwfn, 79736c95dd8fSPrabhakar Kushwaha dbuf, 79746c95dd8fSPrabhakar Kushwaha dwords, 79756c95dd8fSPrabhakar Kushwaha text_buf); 7976c965db44STomer Tayar if (rc != DBG_STATUS_OK) { 7977c965db44STomer Tayar vfree(text_buf); 7978c965db44STomer Tayar return rc; 7979c965db44STomer Tayar } 7980c965db44STomer Tayar 7981c965db44STomer Tayar /* Replace the original null character with a '\n' character. 7982c965db44STomer Tayar * The bytes that were added as a result of the dword alignment are also 7983c965db44STomer Tayar * padded with '\n' characters. 7984c965db44STomer Tayar */ 79856c95dd8fSPrabhakar Kushwaha for (i = null_char_pos; i < txt_size_bytes; i++) 7986c965db44STomer Tayar text_buf[i] = '\n'; 7987c965db44STomer Tayar 7988c965db44STomer Tayar /* Dump printable feature to log */ 7989ca352f00SIgor Russkikh if (p_hwfn->cdev->print_dbg_data) 79906c95dd8fSPrabhakar Kushwaha qed_dbg_print_feature(text_buf, txt_size_bytes); 7991c965db44STomer Tayar 79926c95dd8fSPrabhakar Kushwaha /* Dump binary data as is to the output file */ 7993da328711SAlexander Lobakin if (p_hwfn->cdev->dbg_bin_dump) { 7994da328711SAlexander Lobakin vfree(text_buf); 79956c95dd8fSPrabhakar Kushwaha return rc; 7996da328711SAlexander Lobakin } 7997da328711SAlexander Lobakin 79986c95dd8fSPrabhakar Kushwaha /* Free the old dump_buf and point the dump_buf to the newly allocated 7999c965db44STomer Tayar * and formatted text buffer. 8000c965db44STomer Tayar */ 8001c965db44STomer Tayar vfree(feature->dump_buf); 8002c965db44STomer Tayar feature->dump_buf = text_buf; 80036c95dd8fSPrabhakar Kushwaha feature->buf_size = txt_size_bytes; 80046c95dd8fSPrabhakar Kushwaha feature->dumped_dwords = txt_size_bytes / 4; 80056c95dd8fSPrabhakar Kushwaha 8006c965db44STomer Tayar return rc; 8007c965db44STomer Tayar } 8008c965db44STomer Tayar 80098a52bbabSMichal Kalderon #define MAX_DBG_FEATURE_SIZE_DWORDS 0x3FFFFFFF 80108a52bbabSMichal Kalderon 8011c965db44STomer Tayar /* Generic function for performing the dump of a debug feature. */ 80128c93beafSYuval Mintz static enum dbg_status qed_dbg_dump(struct qed_hwfn *p_hwfn, 80138c93beafSYuval Mintz struct qed_ptt *p_ptt, 8014c965db44STomer Tayar enum qed_dbg_features feature_idx) 8015c965db44STomer Tayar { 8016c965db44STomer Tayar struct qed_dbg_feature *feature = 8017ca352f00SIgor Russkikh &p_hwfn->cdev->dbg_features[feature_idx]; 80186c95dd8fSPrabhakar Kushwaha u32 buf_size_dwords, *dbuf, *dwords; 8019c965db44STomer Tayar enum dbg_status rc; 8020c965db44STomer Tayar 8021c965db44STomer Tayar DP_NOTICE(p_hwfn->cdev, "Collecting a debug feature [\"%s\"]\n", 8022c965db44STomer Tayar qed_features_lookup[feature_idx].name); 8023c965db44STomer Tayar 8024c965db44STomer Tayar /* Dump_buf was already allocated need to free (this can happen if dump 8025c965db44STomer Tayar * was called but file was never read). 8026c965db44STomer Tayar * We can't use the buffer as is since size may have changed. 8027c965db44STomer Tayar */ 8028c965db44STomer Tayar if (feature->dump_buf) { 8029c965db44STomer Tayar vfree(feature->dump_buf); 8030c965db44STomer Tayar feature->dump_buf = NULL; 8031c965db44STomer Tayar } 8032c965db44STomer Tayar 8033c965db44STomer Tayar /* Get buffer size from hsi, allocate accordingly, and perform the 8034c965db44STomer Tayar * dump. 8035c965db44STomer Tayar */ 8036c965db44STomer Tayar rc = qed_features_lookup[feature_idx].get_size(p_hwfn, p_ptt, 8037c965db44STomer Tayar &buf_size_dwords); 8038be086e7cSMintz, Yuval if (rc != DBG_STATUS_OK && rc != DBG_STATUS_NVRAM_GET_IMAGE_FAILED) 8039c965db44STomer Tayar return rc; 80402d22bc83SMichal Kalderon 80412d22bc83SMichal Kalderon if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS) { 80422d22bc83SMichal Kalderon feature->buf_size = 0; 80432d22bc83SMichal Kalderon DP_NOTICE(p_hwfn->cdev, 80442d22bc83SMichal Kalderon "Debug feature [\"%s\"] size (0x%x dwords) exceeds maximum size (0x%x dwords)\n", 80452d22bc83SMichal Kalderon qed_features_lookup[feature_idx].name, 80462d22bc83SMichal Kalderon buf_size_dwords, MAX_DBG_FEATURE_SIZE_DWORDS); 80472d22bc83SMichal Kalderon 80482d22bc83SMichal Kalderon return DBG_STATUS_OK; 80492d22bc83SMichal Kalderon } 80502d22bc83SMichal Kalderon 8051c965db44STomer Tayar feature->buf_size = buf_size_dwords * sizeof(u32); 8052c965db44STomer Tayar feature->dump_buf = vmalloc(feature->buf_size); 8053c965db44STomer Tayar if (!feature->dump_buf) 8054c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 8055c965db44STomer Tayar 80566c95dd8fSPrabhakar Kushwaha dbuf = (u32 *)feature->dump_buf; 80576c95dd8fSPrabhakar Kushwaha dwords = &feature->dumped_dwords; 80586c95dd8fSPrabhakar Kushwaha rc = qed_features_lookup[feature_idx].perform_dump(p_hwfn, p_ptt, 80596c95dd8fSPrabhakar Kushwaha dbuf, 80606c95dd8fSPrabhakar Kushwaha feature->buf_size / 80616c95dd8fSPrabhakar Kushwaha sizeof(u32), 80626c95dd8fSPrabhakar Kushwaha dwords); 8063c965db44STomer Tayar 8064c965db44STomer Tayar /* If mcp is stuck we get DBG_STATUS_NVRAM_GET_IMAGE_FAILED error. 80656c95dd8fSPrabhakar Kushwaha * In this case the buffer holds valid binary data, but we won't able 8066c965db44STomer Tayar * to parse it (since parsing relies on data in NVRAM which is only 8067c965db44STomer Tayar * accessible when MFW is responsive). skip the formatting but return 8068c965db44STomer Tayar * success so that binary data is provided. 8069c965db44STomer Tayar */ 8070c965db44STomer Tayar if (rc == DBG_STATUS_NVRAM_GET_IMAGE_FAILED) 8071c965db44STomer Tayar return DBG_STATUS_OK; 8072c965db44STomer Tayar 8073c965db44STomer Tayar if (rc != DBG_STATUS_OK) 8074c965db44STomer Tayar return rc; 8075c965db44STomer Tayar 8076c965db44STomer Tayar /* Format output */ 8077c965db44STomer Tayar rc = format_feature(p_hwfn, feature_idx); 8078c965db44STomer Tayar return rc; 8079c965db44STomer Tayar } 8080c965db44STomer Tayar 8081c965db44STomer Tayar int qed_dbg_grc(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 8082c965db44STomer Tayar { 8083c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_GRC, num_dumped_bytes); 8084c965db44STomer Tayar } 8085c965db44STomer Tayar 8086c965db44STomer Tayar int qed_dbg_grc_size(struct qed_dev *cdev) 8087c965db44STomer Tayar { 8088c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_GRC); 8089c965db44STomer Tayar } 8090c965db44STomer Tayar 8091c965db44STomer Tayar int qed_dbg_idle_chk(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 8092c965db44STomer Tayar { 8093c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IDLE_CHK, 8094c965db44STomer Tayar num_dumped_bytes); 8095c965db44STomer Tayar } 8096c965db44STomer Tayar 8097c965db44STomer Tayar int qed_dbg_idle_chk_size(struct qed_dev *cdev) 8098c965db44STomer Tayar { 8099c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_IDLE_CHK); 8100c965db44STomer Tayar } 8101c965db44STomer Tayar 8102c965db44STomer Tayar int qed_dbg_reg_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 8103c965db44STomer Tayar { 8104c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_REG_FIFO, 8105c965db44STomer Tayar num_dumped_bytes); 8106c965db44STomer Tayar } 8107c965db44STomer Tayar 8108c965db44STomer Tayar int qed_dbg_reg_fifo_size(struct qed_dev *cdev) 8109c965db44STomer Tayar { 8110c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_REG_FIFO); 8111c965db44STomer Tayar } 8112c965db44STomer Tayar 8113c965db44STomer Tayar int qed_dbg_igu_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 8114c965db44STomer Tayar { 8115c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IGU_FIFO, 8116c965db44STomer Tayar num_dumped_bytes); 8117c965db44STomer Tayar } 8118c965db44STomer Tayar 8119c965db44STomer Tayar int qed_dbg_igu_fifo_size(struct qed_dev *cdev) 8120c965db44STomer Tayar { 8121c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_IGU_FIFO); 8122c965db44STomer Tayar } 8123c965db44STomer Tayar 8124bf774d14SYueHaibing static int qed_dbg_nvm_image_length(struct qed_hwfn *p_hwfn, 81251ac4329aSDenis Bolotin enum qed_nvm_images image_id, u32 *length) 81261ac4329aSDenis Bolotin { 81271ac4329aSDenis Bolotin struct qed_nvm_image_att image_att; 81281ac4329aSDenis Bolotin int rc; 81291ac4329aSDenis Bolotin 81301ac4329aSDenis Bolotin *length = 0; 81311ac4329aSDenis Bolotin rc = qed_mcp_get_nvm_image_att(p_hwfn, image_id, &image_att); 81321ac4329aSDenis Bolotin if (rc) 81331ac4329aSDenis Bolotin return rc; 81341ac4329aSDenis Bolotin 81351ac4329aSDenis Bolotin *length = image_att.length; 81361ac4329aSDenis Bolotin 81371ac4329aSDenis Bolotin return rc; 81381ac4329aSDenis Bolotin } 81391ac4329aSDenis Bolotin 8140bf774d14SYueHaibing static int qed_dbg_nvm_image(struct qed_dev *cdev, void *buffer, 8141bf774d14SYueHaibing u32 *num_dumped_bytes, 8142bf774d14SYueHaibing enum qed_nvm_images image_id) 81431ac4329aSDenis Bolotin { 81441ac4329aSDenis Bolotin struct qed_hwfn *p_hwfn = 8145ca352f00SIgor Russkikh &cdev->hwfns[cdev->engine_for_debug]; 81465ab90341SAlexander Lobakin u32 len_rounded; 81471ac4329aSDenis Bolotin int rc; 81481ac4329aSDenis Bolotin 81491ac4329aSDenis Bolotin *num_dumped_bytes = 0; 81501ac4329aSDenis Bolotin rc = qed_dbg_nvm_image_length(p_hwfn, image_id, &len_rounded); 81511ac4329aSDenis Bolotin if (rc) 81521ac4329aSDenis Bolotin return rc; 81531ac4329aSDenis Bolotin 81541ac4329aSDenis Bolotin DP_NOTICE(p_hwfn->cdev, 81551ac4329aSDenis Bolotin "Collecting a debug feature [\"nvram image %d\"]\n", 81561ac4329aSDenis Bolotin image_id); 81571ac4329aSDenis Bolotin 81581ac4329aSDenis Bolotin len_rounded = roundup(len_rounded, sizeof(u32)); 81591ac4329aSDenis Bolotin rc = qed_mcp_get_nvm_image(p_hwfn, image_id, buffer, len_rounded); 81601ac4329aSDenis Bolotin if (rc) 81611ac4329aSDenis Bolotin return rc; 81621ac4329aSDenis Bolotin 81631ac4329aSDenis Bolotin /* QED_NVM_IMAGE_NVM_META image is not swapped like other images */ 81641ac4329aSDenis Bolotin if (image_id != QED_NVM_IMAGE_NVM_META) 81655ab90341SAlexander Lobakin cpu_to_be32_array((__force __be32 *)buffer, 81665ab90341SAlexander Lobakin (const u32 *)buffer, 81675ab90341SAlexander Lobakin len_rounded / sizeof(u32)); 81681ac4329aSDenis Bolotin 81691ac4329aSDenis Bolotin *num_dumped_bytes = len_rounded; 81701ac4329aSDenis Bolotin 81711ac4329aSDenis Bolotin return rc; 81721ac4329aSDenis Bolotin } 81731ac4329aSDenis Bolotin 8174c965db44STomer Tayar int qed_dbg_protection_override(struct qed_dev *cdev, void *buffer, 8175c965db44STomer Tayar u32 *num_dumped_bytes) 8176c965db44STomer Tayar { 8177c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_PROTECTION_OVERRIDE, 8178c965db44STomer Tayar num_dumped_bytes); 8179c965db44STomer Tayar } 8180c965db44STomer Tayar 8181c965db44STomer Tayar int qed_dbg_protection_override_size(struct qed_dev *cdev) 8182c965db44STomer Tayar { 8183c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_PROTECTION_OVERRIDE); 8184c965db44STomer Tayar } 8185c965db44STomer Tayar 8186c965db44STomer Tayar int qed_dbg_fw_asserts(struct qed_dev *cdev, void *buffer, 8187c965db44STomer Tayar u32 *num_dumped_bytes) 8188c965db44STomer Tayar { 8189c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_FW_ASSERTS, 8190c965db44STomer Tayar num_dumped_bytes); 8191c965db44STomer Tayar } 8192c965db44STomer Tayar 8193c965db44STomer Tayar int qed_dbg_fw_asserts_size(struct qed_dev *cdev) 8194c965db44STomer Tayar { 8195c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_FW_ASSERTS); 8196c965db44STomer Tayar } 8197c965db44STomer Tayar 81988a52bbabSMichal Kalderon int qed_dbg_ilt(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 81998a52bbabSMichal Kalderon { 82008a52bbabSMichal Kalderon return qed_dbg_feature(cdev, buffer, DBG_FEATURE_ILT, num_dumped_bytes); 82018a52bbabSMichal Kalderon } 82028a52bbabSMichal Kalderon 82038a52bbabSMichal Kalderon int qed_dbg_ilt_size(struct qed_dev *cdev) 82048a52bbabSMichal Kalderon { 82058a52bbabSMichal Kalderon return qed_dbg_feature_size(cdev, DBG_FEATURE_ILT); 82068a52bbabSMichal Kalderon } 82078a52bbabSMichal Kalderon 8208c965db44STomer Tayar int qed_dbg_mcp_trace(struct qed_dev *cdev, void *buffer, 8209c965db44STomer Tayar u32 *num_dumped_bytes) 8210c965db44STomer Tayar { 8211c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_MCP_TRACE, 8212c965db44STomer Tayar num_dumped_bytes); 8213c965db44STomer Tayar } 8214c965db44STomer Tayar 8215c965db44STomer Tayar int qed_dbg_mcp_trace_size(struct qed_dev *cdev) 8216c965db44STomer Tayar { 8217c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_MCP_TRACE); 8218c965db44STomer Tayar } 8219c965db44STomer Tayar 8220c965db44STomer Tayar /* Defines the amount of bytes allocated for recording the length of debugfs 8221c965db44STomer Tayar * feature buffer. 8222c965db44STomer Tayar */ 8223c965db44STomer Tayar #define REGDUMP_HEADER_SIZE sizeof(u32) 82248a52bbabSMichal Kalderon #define REGDUMP_HEADER_SIZE_SHIFT 0 82258a52bbabSMichal Kalderon #define REGDUMP_HEADER_SIZE_MASK 0xffffff 8226c965db44STomer Tayar #define REGDUMP_HEADER_FEATURE_SHIFT 24 8227da328711SAlexander Lobakin #define REGDUMP_HEADER_FEATURE_MASK 0x1f 8228da328711SAlexander Lobakin #define REGDUMP_HEADER_BIN_DUMP_SHIFT 29 8229da328711SAlexander Lobakin #define REGDUMP_HEADER_BIN_DUMP_MASK 0x1 8230c965db44STomer Tayar #define REGDUMP_HEADER_OMIT_ENGINE_SHIFT 30 82318a52bbabSMichal Kalderon #define REGDUMP_HEADER_OMIT_ENGINE_MASK 0x1 82328a52bbabSMichal Kalderon #define REGDUMP_HEADER_ENGINE_SHIFT 31 82338a52bbabSMichal Kalderon #define REGDUMP_HEADER_ENGINE_MASK 0x1 82348a52bbabSMichal Kalderon #define REGDUMP_MAX_SIZE 0x1000000 82358a52bbabSMichal Kalderon #define ILT_DUMP_MAX_SIZE (1024 * 1024 * 15) 82368a52bbabSMichal Kalderon 8237c965db44STomer Tayar enum debug_print_features { 8238c965db44STomer Tayar OLD_MODE = 0, 8239c965db44STomer Tayar IDLE_CHK = 1, 8240c965db44STomer Tayar GRC_DUMP = 2, 8241c965db44STomer Tayar MCP_TRACE = 3, 8242c965db44STomer Tayar REG_FIFO = 4, 8243c965db44STomer Tayar PROTECTION_OVERRIDE = 5, 8244c965db44STomer Tayar IGU_FIFO = 6, 8245c965db44STomer Tayar PHY = 7, 8246c965db44STomer Tayar FW_ASSERTS = 8, 82471ac4329aSDenis Bolotin NVM_CFG1 = 9, 82481ac4329aSDenis Bolotin DEFAULT_CFG = 10, 82491ac4329aSDenis Bolotin NVM_META = 11, 82508a52bbabSMichal Kalderon MDUMP = 12, 82518a52bbabSMichal Kalderon ILT_DUMP = 13, 8252c965db44STomer Tayar }; 8253c965db44STomer Tayar 82542d22bc83SMichal Kalderon static u32 qed_calc_regdump_header(struct qed_dev *cdev, 82552d22bc83SMichal Kalderon enum debug_print_features feature, 82566c95dd8fSPrabhakar Kushwaha int engine, u32 feature_size, 82576c95dd8fSPrabhakar Kushwaha u8 omit_engine, u8 dbg_bin_dump) 8258c965db44STomer Tayar { 82592d22bc83SMichal Kalderon u32 res = 0; 82602d22bc83SMichal Kalderon 82612d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_SIZE, feature_size); 82622d22bc83SMichal Kalderon if (res != feature_size) 82632d22bc83SMichal Kalderon DP_NOTICE(cdev, 82642d22bc83SMichal Kalderon "Feature %d is too large (size 0x%x) and will corrupt the dump\n", 82652d22bc83SMichal Kalderon feature, feature_size); 82662d22bc83SMichal Kalderon 82672d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_FEATURE, feature); 82686c95dd8fSPrabhakar Kushwaha SET_FIELD(res, REGDUMP_HEADER_BIN_DUMP, dbg_bin_dump); 82692d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_OMIT_ENGINE, omit_engine); 82702d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_ENGINE, engine); 82712d22bc83SMichal Kalderon 82722d22bc83SMichal Kalderon return res; 8273c965db44STomer Tayar } 8274c965db44STomer Tayar 8275c965db44STomer Tayar int qed_dbg_all_data(struct qed_dev *cdev, void *buffer) 8276c965db44STomer Tayar { 8277c965db44STomer Tayar u8 cur_engine, omit_engine = 0, org_engine; 82786c95dd8fSPrabhakar Kushwaha struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug]; 82793b86bd07SSudarsana Reddy Kalluru struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 82806c95dd8fSPrabhakar Kushwaha int grc_params[MAX_DBG_GRC_PARAMS], rc, i; 8281c965db44STomer Tayar u32 offset = 0, feature_size; 8282c965db44STomer Tayar 82833b86bd07SSudarsana Reddy Kalluru for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) 82843b86bd07SSudarsana Reddy Kalluru grc_params[i] = dev_data->grc.param_val[i]; 82853b86bd07SSudarsana Reddy Kalluru 82862d22bc83SMichal Kalderon if (!QED_IS_CMT(cdev)) 8287c965db44STomer Tayar omit_engine = 1; 8288c965db44STomer Tayar 82896c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump = 1; 82902d22bc83SMichal Kalderon mutex_lock(&qed_dbg_lock); 82912d22bc83SMichal Kalderon 8292c965db44STomer Tayar org_engine = qed_get_debug_engine(cdev); 8293c965db44STomer Tayar for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) { 8294c965db44STomer Tayar /* Collect idle_chks and grcDump for each hw function */ 8295c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, 8296c965db44STomer Tayar "obtaining idle_chk and grcdump for current engine\n"); 8297c965db44STomer Tayar qed_set_debug_engine(cdev, cur_engine); 8298c965db44STomer Tayar 8299c965db44STomer Tayar /* First idle_chk */ 8300c965db44STomer Tayar rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset + 8301c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8302c965db44STomer Tayar if (!rc) { 8303c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 83046c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, IDLE_CHK, 83056c95dd8fSPrabhakar Kushwaha cur_engine, 83066c95dd8fSPrabhakar Kushwaha feature_size, 83076c95dd8fSPrabhakar Kushwaha omit_engine, 83086c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8309c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8310c965db44STomer Tayar } else { 8311c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc); 8312c965db44STomer Tayar } 8313c965db44STomer Tayar 8314c965db44STomer Tayar /* Second idle_chk */ 8315c965db44STomer Tayar rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset + 8316c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8317c965db44STomer Tayar if (!rc) { 8318c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 83196c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, IDLE_CHK, 83206c95dd8fSPrabhakar Kushwaha cur_engine, 83216c95dd8fSPrabhakar Kushwaha feature_size, 83226c95dd8fSPrabhakar Kushwaha omit_engine, 83236c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8324c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8325c965db44STomer Tayar } else { 8326c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc); 8327c965db44STomer Tayar } 8328c965db44STomer Tayar 8329c965db44STomer Tayar /* reg_fifo dump */ 8330c965db44STomer Tayar rc = qed_dbg_reg_fifo(cdev, (u8 *)buffer + offset + 8331c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8332c965db44STomer Tayar if (!rc) { 8333c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 83346c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, REG_FIFO, 83356c95dd8fSPrabhakar Kushwaha cur_engine, 83366c95dd8fSPrabhakar Kushwaha feature_size, 83376c95dd8fSPrabhakar Kushwaha omit_engine, 83386c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8339c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8340c965db44STomer Tayar } else { 8341c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_reg_fifo failed. rc = %d\n", rc); 8342c965db44STomer Tayar } 8343c965db44STomer Tayar 8344c965db44STomer Tayar /* igu_fifo dump */ 8345c965db44STomer Tayar rc = qed_dbg_igu_fifo(cdev, (u8 *)buffer + offset + 8346c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8347c965db44STomer Tayar if (!rc) { 8348c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 83496c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, IGU_FIFO, 83506c95dd8fSPrabhakar Kushwaha cur_engine, 83516c95dd8fSPrabhakar Kushwaha feature_size, 83526c95dd8fSPrabhakar Kushwaha omit_engine, 83536c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8354c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8355c965db44STomer Tayar } else { 8356c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_igu_fifo failed. rc = %d", rc); 8357c965db44STomer Tayar } 8358c965db44STomer Tayar 8359c965db44STomer Tayar /* protection_override dump */ 8360c965db44STomer Tayar rc = qed_dbg_protection_override(cdev, (u8 *)buffer + offset + 8361c965db44STomer Tayar REGDUMP_HEADER_SIZE, 8362c965db44STomer Tayar &feature_size); 8363c965db44STomer Tayar if (!rc) { 8364c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 83656c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, 83666c95dd8fSPrabhakar Kushwaha PROTECTION_OVERRIDE, 8367c965db44STomer Tayar cur_engine, 83686c95dd8fSPrabhakar Kushwaha feature_size, 83696c95dd8fSPrabhakar Kushwaha omit_engine, 83706c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8371c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8372c965db44STomer Tayar } else { 8373c965db44STomer Tayar DP_ERR(cdev, 8374c965db44STomer Tayar "qed_dbg_protection_override failed. rc = %d\n", 8375c965db44STomer Tayar rc); 8376c965db44STomer Tayar } 8377c965db44STomer Tayar 8378c965db44STomer Tayar /* fw_asserts dump */ 8379c965db44STomer Tayar rc = qed_dbg_fw_asserts(cdev, (u8 *)buffer + offset + 8380c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8381c965db44STomer Tayar if (!rc) { 8382c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 83832d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, FW_ASSERTS, 83846c95dd8fSPrabhakar Kushwaha cur_engine, 83856c95dd8fSPrabhakar Kushwaha feature_size, 83866c95dd8fSPrabhakar Kushwaha omit_engine, 83876c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8388c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8389c965db44STomer Tayar } else { 8390c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_fw_asserts failed. rc = %d\n", 8391c965db44STomer Tayar rc); 8392c965db44STomer Tayar } 8393c965db44STomer Tayar 83948a52bbabSMichal Kalderon feature_size = qed_dbg_ilt_size(cdev); 83956c95dd8fSPrabhakar Kushwaha if (!cdev->disable_ilt_dump && feature_size < 83966c95dd8fSPrabhakar Kushwaha ILT_DUMP_MAX_SIZE) { 83978a52bbabSMichal Kalderon rc = qed_dbg_ilt(cdev, (u8 *)buffer + offset + 83988a52bbabSMichal Kalderon REGDUMP_HEADER_SIZE, &feature_size); 83998a52bbabSMichal Kalderon if (!rc) { 84008a52bbabSMichal Kalderon *(u32 *)((u8 *)buffer + offset) = 84012d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, ILT_DUMP, 84028a52bbabSMichal Kalderon cur_engine, 84038a52bbabSMichal Kalderon feature_size, 84046c95dd8fSPrabhakar Kushwaha omit_engine, 84056c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 84066c95dd8fSPrabhakar Kushwaha offset += (feature_size + REGDUMP_HEADER_SIZE); 84078a52bbabSMichal Kalderon } else { 84088a52bbabSMichal Kalderon DP_ERR(cdev, "qed_dbg_ilt failed. rc = %d\n", 84098a52bbabSMichal Kalderon rc); 84108a52bbabSMichal Kalderon } 84118a52bbabSMichal Kalderon } 84123b86bd07SSudarsana Reddy Kalluru 84136c95dd8fSPrabhakar Kushwaha /* Grc dump - must be last because when mcp stuck it will 8414c965db44STomer Tayar * clutter idle_chk, reg_fifo, ... 8415c965db44STomer Tayar */ 84162d22bc83SMichal Kalderon for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) 84172d22bc83SMichal Kalderon dev_data->grc.param_val[i] = grc_params[i]; 84182d22bc83SMichal Kalderon 8419c965db44STomer Tayar rc = qed_dbg_grc(cdev, (u8 *)buffer + offset + 8420c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8421c965db44STomer Tayar if (!rc) { 8422c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 84232d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, GRC_DUMP, 84242d22bc83SMichal Kalderon cur_engine, 84256c95dd8fSPrabhakar Kushwaha feature_size, 84266c95dd8fSPrabhakar Kushwaha omit_engine, 84276c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8428c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8429c965db44STomer Tayar } else { 8430c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_grc failed. rc = %d", rc); 8431c965db44STomer Tayar } 8432c965db44STomer Tayar } 8433c965db44STomer Tayar 843450bc60cbSMichal Kalderon qed_set_debug_engine(cdev, org_engine); 84352d22bc83SMichal Kalderon 8436c965db44STomer Tayar /* mcp_trace */ 8437c965db44STomer Tayar rc = qed_dbg_mcp_trace(cdev, (u8 *)buffer + offset + 8438c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8439c965db44STomer Tayar if (!rc) { 8440c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 84412d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, MCP_TRACE, cur_engine, 84426c95dd8fSPrabhakar Kushwaha feature_size, omit_engine, 84436c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8444c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8445c965db44STomer Tayar } else { 8446c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_mcp_trace failed. rc = %d\n", rc); 8447c965db44STomer Tayar } 8448c965db44STomer Tayar 84491ac4329aSDenis Bolotin /* nvm cfg1 */ 84501ac4329aSDenis Bolotin rc = qed_dbg_nvm_image(cdev, 84512d22bc83SMichal Kalderon (u8 *)buffer + offset + 84522d22bc83SMichal Kalderon REGDUMP_HEADER_SIZE, &feature_size, 84532d22bc83SMichal Kalderon QED_NVM_IMAGE_NVM_CFG1); 84541ac4329aSDenis Bolotin if (!rc) { 84551ac4329aSDenis Bolotin *(u32 *)((u8 *)buffer + offset) = 84562d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, NVM_CFG1, cur_engine, 84576c95dd8fSPrabhakar Kushwaha feature_size, omit_engine, 84586c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 84591ac4329aSDenis Bolotin offset += (feature_size + REGDUMP_HEADER_SIZE); 84601ac4329aSDenis Bolotin } else if (rc != -ENOENT) { 84611ac4329aSDenis Bolotin DP_ERR(cdev, 84621ac4329aSDenis Bolotin "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 84636c95dd8fSPrabhakar Kushwaha QED_NVM_IMAGE_NVM_CFG1, "QED_NVM_IMAGE_NVM_CFG1", 84646c95dd8fSPrabhakar Kushwaha rc); 84651ac4329aSDenis Bolotin } 84661ac4329aSDenis Bolotin 84671ac4329aSDenis Bolotin /* nvm default */ 84681ac4329aSDenis Bolotin rc = qed_dbg_nvm_image(cdev, 84696c95dd8fSPrabhakar Kushwaha (u8 *)buffer + offset + 84706c95dd8fSPrabhakar Kushwaha REGDUMP_HEADER_SIZE, &feature_size, 84716c95dd8fSPrabhakar Kushwaha QED_NVM_IMAGE_DEFAULT_CFG); 84721ac4329aSDenis Bolotin if (!rc) { 84731ac4329aSDenis Bolotin *(u32 *)((u8 *)buffer + offset) = 84746c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, DEFAULT_CFG, 84756c95dd8fSPrabhakar Kushwaha cur_engine, feature_size, 84766c95dd8fSPrabhakar Kushwaha omit_engine, 84776c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 84781ac4329aSDenis Bolotin offset += (feature_size + REGDUMP_HEADER_SIZE); 84791ac4329aSDenis Bolotin } else if (rc != -ENOENT) { 84801ac4329aSDenis Bolotin DP_ERR(cdev, 84811ac4329aSDenis Bolotin "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 84826c95dd8fSPrabhakar Kushwaha QED_NVM_IMAGE_DEFAULT_CFG, 84836c95dd8fSPrabhakar Kushwaha "QED_NVM_IMAGE_DEFAULT_CFG", rc); 84841ac4329aSDenis Bolotin } 84851ac4329aSDenis Bolotin 84861ac4329aSDenis Bolotin /* nvm meta */ 84871ac4329aSDenis Bolotin rc = qed_dbg_nvm_image(cdev, 84886c95dd8fSPrabhakar Kushwaha (u8 *)buffer + offset + 84896c95dd8fSPrabhakar Kushwaha REGDUMP_HEADER_SIZE, &feature_size, 84906c95dd8fSPrabhakar Kushwaha QED_NVM_IMAGE_NVM_META); 84911ac4329aSDenis Bolotin if (!rc) { 84921ac4329aSDenis Bolotin *(u32 *)((u8 *)buffer + offset) = 84932d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, NVM_META, cur_engine, 84946c95dd8fSPrabhakar Kushwaha feature_size, omit_engine, 84956c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 84961ac4329aSDenis Bolotin offset += (feature_size + REGDUMP_HEADER_SIZE); 84971ac4329aSDenis Bolotin } else if (rc != -ENOENT) { 84981ac4329aSDenis Bolotin DP_ERR(cdev, 84991ac4329aSDenis Bolotin "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 85006c95dd8fSPrabhakar Kushwaha QED_NVM_IMAGE_NVM_META, "QED_NVM_IMAGE_NVM_META", 85016c95dd8fSPrabhakar Kushwaha rc); 85021ac4329aSDenis Bolotin } 85031ac4329aSDenis Bolotin 85048a52bbabSMichal Kalderon /* nvm mdump */ 85058a52bbabSMichal Kalderon rc = qed_dbg_nvm_image(cdev, (u8 *)buffer + offset + 85068a52bbabSMichal Kalderon REGDUMP_HEADER_SIZE, &feature_size, 85078a52bbabSMichal Kalderon QED_NVM_IMAGE_MDUMP); 85088a52bbabSMichal Kalderon if (!rc) { 85098a52bbabSMichal Kalderon *(u32 *)((u8 *)buffer + offset) = 85102d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, MDUMP, cur_engine, 85116c95dd8fSPrabhakar Kushwaha feature_size, omit_engine, 85126c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 85138a52bbabSMichal Kalderon offset += (feature_size + REGDUMP_HEADER_SIZE); 85148a52bbabSMichal Kalderon } else if (rc != -ENOENT) { 85158a52bbabSMichal Kalderon DP_ERR(cdev, 85168a52bbabSMichal Kalderon "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 85178a52bbabSMichal Kalderon QED_NVM_IMAGE_MDUMP, "QED_NVM_IMAGE_MDUMP", rc); 85188a52bbabSMichal Kalderon } 85198a52bbabSMichal Kalderon 85202d22bc83SMichal Kalderon mutex_unlock(&qed_dbg_lock); 85216c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump = 0; 85222d22bc83SMichal Kalderon 8523c965db44STomer Tayar return 0; 8524c965db44STomer Tayar } 8525c965db44STomer Tayar 8526c965db44STomer Tayar int qed_dbg_all_data_size(struct qed_dev *cdev) 8527c965db44STomer Tayar { 85288a52bbabSMichal Kalderon u32 regs_len = 0, image_len = 0, ilt_len = 0, total_ilt_len = 0; 85296c95dd8fSPrabhakar Kushwaha struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug]; 8530c965db44STomer Tayar u8 cur_engine, org_engine; 8531c965db44STomer Tayar 85322d22bc83SMichal Kalderon cdev->disable_ilt_dump = false; 8533c965db44STomer Tayar org_engine = qed_get_debug_engine(cdev); 8534c965db44STomer Tayar for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) { 8535c965db44STomer Tayar /* Engine specific */ 8536c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, 8537c965db44STomer Tayar "calculating idle_chk and grcdump register length for current engine\n"); 8538c965db44STomer Tayar qed_set_debug_engine(cdev, cur_engine); 8539c965db44STomer Tayar regs_len += REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) + 8540c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) + 8541c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_grc_size(cdev) + 8542c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_reg_fifo_size(cdev) + 8543c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_igu_fifo_size(cdev) + 8544c965db44STomer Tayar REGDUMP_HEADER_SIZE + 8545c965db44STomer Tayar qed_dbg_protection_override_size(cdev) + 8546c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_fw_asserts_size(cdev); 85478a52bbabSMichal Kalderon ilt_len = REGDUMP_HEADER_SIZE + qed_dbg_ilt_size(cdev); 85488a52bbabSMichal Kalderon if (ilt_len < ILT_DUMP_MAX_SIZE) { 85498a52bbabSMichal Kalderon total_ilt_len += ilt_len; 85508a52bbabSMichal Kalderon regs_len += ilt_len; 85518a52bbabSMichal Kalderon } 8552c965db44STomer Tayar } 8553c965db44STomer Tayar 855450bc60cbSMichal Kalderon qed_set_debug_engine(cdev, org_engine); 855550bc60cbSMichal Kalderon 8556c965db44STomer Tayar /* Engine common */ 85576c95dd8fSPrabhakar Kushwaha regs_len += REGDUMP_HEADER_SIZE + qed_dbg_mcp_trace_size(cdev) + 85586c95dd8fSPrabhakar Kushwaha REGDUMP_HEADER_SIZE + qed_dbg_phy_size(cdev); 85591ac4329aSDenis Bolotin qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_CFG1, &image_len); 85601ac4329aSDenis Bolotin if (image_len) 85611ac4329aSDenis Bolotin regs_len += REGDUMP_HEADER_SIZE + image_len; 85621ac4329aSDenis Bolotin qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_DEFAULT_CFG, &image_len); 85631ac4329aSDenis Bolotin if (image_len) 85641ac4329aSDenis Bolotin regs_len += REGDUMP_HEADER_SIZE + image_len; 85651ac4329aSDenis Bolotin qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_META, &image_len); 85661ac4329aSDenis Bolotin if (image_len) 85671ac4329aSDenis Bolotin regs_len += REGDUMP_HEADER_SIZE + image_len; 85688a52bbabSMichal Kalderon qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_MDUMP, &image_len); 85698a52bbabSMichal Kalderon if (image_len) 85708a52bbabSMichal Kalderon regs_len += REGDUMP_HEADER_SIZE + image_len; 85718a52bbabSMichal Kalderon 85728a52bbabSMichal Kalderon if (regs_len > REGDUMP_MAX_SIZE) { 85738a52bbabSMichal Kalderon DP_VERBOSE(cdev, QED_MSG_DEBUG, 85748a52bbabSMichal Kalderon "Dump exceeds max size 0x%x, disable ILT dump\n", 85758a52bbabSMichal Kalderon REGDUMP_MAX_SIZE); 85768a52bbabSMichal Kalderon cdev->disable_ilt_dump = true; 85778a52bbabSMichal Kalderon regs_len -= total_ilt_len; 85788a52bbabSMichal Kalderon } 8579c965db44STomer Tayar 8580c965db44STomer Tayar return regs_len; 8581c965db44STomer Tayar } 8582c965db44STomer Tayar 8583c965db44STomer Tayar int qed_dbg_feature(struct qed_dev *cdev, void *buffer, 8584c965db44STomer Tayar enum qed_dbg_features feature, u32 *num_dumped_bytes) 8585c965db44STomer Tayar { 85866c95dd8fSPrabhakar Kushwaha struct qed_dbg_feature *qed_feature = &cdev->dbg_features[feature]; 85876c95dd8fSPrabhakar Kushwaha struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug]; 8588c965db44STomer Tayar enum dbg_status dbg_rc; 8589c965db44STomer Tayar struct qed_ptt *p_ptt; 8590c965db44STomer Tayar int rc = 0; 8591c965db44STomer Tayar 8592c965db44STomer Tayar /* Acquire ptt */ 8593c965db44STomer Tayar p_ptt = qed_ptt_acquire(p_hwfn); 8594c965db44STomer Tayar if (!p_ptt) 8595c965db44STomer Tayar return -EINVAL; 8596c965db44STomer Tayar 8597c965db44STomer Tayar /* Get dump */ 8598c965db44STomer Tayar dbg_rc = qed_dbg_dump(p_hwfn, p_ptt, feature); 8599c965db44STomer Tayar if (dbg_rc != DBG_STATUS_OK) { 8600c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, "%s\n", 8601c965db44STomer Tayar qed_dbg_get_status_str(dbg_rc)); 8602c965db44STomer Tayar *num_dumped_bytes = 0; 8603c965db44STomer Tayar rc = -EINVAL; 8604c965db44STomer Tayar goto out; 8605c965db44STomer Tayar } 8606c965db44STomer Tayar 8607c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, 8608c965db44STomer Tayar "copying debugfs feature to external buffer\n"); 8609c965db44STomer Tayar memcpy(buffer, qed_feature->dump_buf, qed_feature->buf_size); 8610ca352f00SIgor Russkikh *num_dumped_bytes = cdev->dbg_features[feature].dumped_dwords * 8611c965db44STomer Tayar 4; 8612c965db44STomer Tayar 8613c965db44STomer Tayar out: 8614c965db44STomer Tayar qed_ptt_release(p_hwfn, p_ptt); 8615c965db44STomer Tayar return rc; 8616c965db44STomer Tayar } 8617c965db44STomer Tayar 8618c965db44STomer Tayar int qed_dbg_feature_size(struct qed_dev *cdev, enum qed_dbg_features feature) 8619c965db44STomer Tayar { 86202d22bc83SMichal Kalderon struct qed_dbg_feature *qed_feature = &cdev->dbg_features[feature]; 86216c95dd8fSPrabhakar Kushwaha struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug]; 8622c965db44STomer Tayar struct qed_ptt *p_ptt = qed_ptt_acquire(p_hwfn); 8623c965db44STomer Tayar u32 buf_size_dwords; 8624c965db44STomer Tayar enum dbg_status rc; 8625c965db44STomer Tayar 8626c965db44STomer Tayar if (!p_ptt) 8627c965db44STomer Tayar return -EINVAL; 8628c965db44STomer Tayar 8629c965db44STomer Tayar rc = qed_features_lookup[feature].get_size(p_hwfn, p_ptt, 8630c965db44STomer Tayar &buf_size_dwords); 8631c965db44STomer Tayar if (rc != DBG_STATUS_OK) 8632c965db44STomer Tayar buf_size_dwords = 0; 8633c965db44STomer Tayar 86348a52bbabSMichal Kalderon /* Feature will not be dumped if it exceeds maximum size */ 86358a52bbabSMichal Kalderon if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS) 86368a52bbabSMichal Kalderon buf_size_dwords = 0; 86378a52bbabSMichal Kalderon 8638c965db44STomer Tayar qed_ptt_release(p_hwfn, p_ptt); 8639c965db44STomer Tayar qed_feature->buf_size = buf_size_dwords * sizeof(u32); 8640c965db44STomer Tayar return qed_feature->buf_size; 8641c965db44STomer Tayar } 8642c965db44STomer Tayar 86436c95dd8fSPrabhakar Kushwaha int qed_dbg_phy_size(struct qed_dev *cdev) 86446c95dd8fSPrabhakar Kushwaha { 86456c95dd8fSPrabhakar Kushwaha /* return max size of phy info and 86466c95dd8fSPrabhakar Kushwaha * phy mac_stat multiplied by the number of ports 86476c95dd8fSPrabhakar Kushwaha */ 86486c95dd8fSPrabhakar Kushwaha return MAX_PHY_RESULT_BUFFER * (1 + qed_device_num_ports(cdev)); 86496c95dd8fSPrabhakar Kushwaha } 86506c95dd8fSPrabhakar Kushwaha 8651c965db44STomer Tayar u8 qed_get_debug_engine(struct qed_dev *cdev) 8652c965db44STomer Tayar { 8653ca352f00SIgor Russkikh return cdev->engine_for_debug; 8654c965db44STomer Tayar } 8655c965db44STomer Tayar 8656c965db44STomer Tayar void qed_set_debug_engine(struct qed_dev *cdev, int engine_number) 8657c965db44STomer Tayar { 8658c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, "set debug engine to %d\n", 8659c965db44STomer Tayar engine_number); 8660ca352f00SIgor Russkikh cdev->engine_for_debug = engine_number; 8661c965db44STomer Tayar } 8662c965db44STomer Tayar 8663c965db44STomer Tayar void qed_dbg_pf_init(struct qed_dev *cdev) 8664c965db44STomer Tayar { 86652d22bc83SMichal Kalderon const u8 *dbg_values = NULL; 86662d22bc83SMichal Kalderon int i; 8667c965db44STomer Tayar 86686c95dd8fSPrabhakar Kushwaha /* Sync ver with debugbus qed code */ 86696c95dd8fSPrabhakar Kushwaha qed_dbg_set_app_ver(TOOLS_VERSION); 86706c95dd8fSPrabhakar Kushwaha 8671c965db44STomer Tayar /* Debug values are after init values. 8672c965db44STomer Tayar * The offset is the first dword of the file. 8673c965db44STomer Tayar */ 8674c965db44STomer Tayar dbg_values = cdev->firmware->data + *(u32 *)cdev->firmware->data; 86752d22bc83SMichal Kalderon 86762d22bc83SMichal Kalderon for_each_hwfn(cdev, i) { 86772d22bc83SMichal Kalderon qed_dbg_set_bin_ptr(&cdev->hwfns[i], dbg_values); 86782d22bc83SMichal Kalderon qed_dbg_user_set_bin_ptr(&cdev->hwfns[i], dbg_values); 86792d22bc83SMichal Kalderon } 86802d22bc83SMichal Kalderon 86812d22bc83SMichal Kalderon /* Set the hwfn to be 0 as default */ 8682ca352f00SIgor Russkikh cdev->engine_for_debug = 0; 8683c965db44STomer Tayar } 8684c965db44STomer Tayar 8685c965db44STomer Tayar void qed_dbg_pf_exit(struct qed_dev *cdev) 8686c965db44STomer Tayar { 8687c965db44STomer Tayar struct qed_dbg_feature *feature = NULL; 8688c965db44STomer Tayar enum qed_dbg_features feature_idx; 8689c965db44STomer Tayar 86902d22bc83SMichal Kalderon /* debug features' buffers may be allocated if debug feature was used 86912d22bc83SMichal Kalderon * but dump wasn't called 8692c965db44STomer Tayar */ 8693c965db44STomer Tayar for (feature_idx = 0; feature_idx < DBG_FEATURE_NUM; feature_idx++) { 86942d22bc83SMichal Kalderon feature = &cdev->dbg_features[feature_idx]; 8695c965db44STomer Tayar if (feature->dump_buf) { 8696c965db44STomer Tayar vfree(feature->dump_buf); 8697c965db44STomer Tayar feature->dump_buf = NULL; 8698c965db44STomer Tayar } 8699c965db44STomer Tayar } 8700c965db44STomer Tayar } 8701