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 4*6c95dd8fSPrabhakar 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 125*6c95dd8fSPrabhakar Kushwaha static u32 cond14(const u32 *r, const u32 *imm) 126*6c95dd8fSPrabhakar Kushwaha { 127*6c95dd8fSPrabhakar Kushwaha return (r[0] | imm[0]) != imm[1]; 128*6c95dd8fSPrabhakar Kushwaha } 129*6c95dd8fSPrabhakar 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, 181*6c95dd8fSPrabhakar 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 218*6c95dd8fSPrabhakar Kushwaha /* Debug bus SEMI frame modes */ 219*6c95dd8fSPrabhakar Kushwaha enum dbg_bus_semi_frame_modes { 220*6c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_4FAST = 0, /* 4 fast dw */ 221*6c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_2FAST_2SLOW = 1, /* 2 fast dw, 2 slow dw */ 222*6c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_1FAST_3SLOW = 2, /* 1 fast dw,3 slow dw */ 223*6c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_4SLOW = 3, /* 4 slow dw */ 224*6c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_NUM_FRAME_MODES 225*6c95dd8fSPrabhakar Kushwaha }; 226*6c95dd8fSPrabhakar Kushwaha 227*6c95dd8fSPrabhakar Kushwaha /* Debug bus filter types */ 228*6c95dd8fSPrabhakar Kushwaha enum dbg_bus_filter_types { 229*6c95dd8fSPrabhakar Kushwaha DBG_BUS_FILTER_TYPE_OFF, /* Filter always off */ 230*6c95dd8fSPrabhakar Kushwaha DBG_BUS_FILTER_TYPE_PRE, /* Filter before trigger only */ 231*6c95dd8fSPrabhakar Kushwaha DBG_BUS_FILTER_TYPE_POST, /* Filter after trigger only */ 232*6c95dd8fSPrabhakar Kushwaha DBG_BUS_FILTER_TYPE_ON /* Filter always on */ 233*6c95dd8fSPrabhakar Kushwaha }; 234*6c95dd8fSPrabhakar Kushwaha 235*6c95dd8fSPrabhakar Kushwaha /* Debug bus pre-trigger recording types */ 236*6c95dd8fSPrabhakar Kushwaha enum dbg_bus_pre_trigger_types { 237*6c95dd8fSPrabhakar Kushwaha DBG_BUS_PRE_TRIGGER_FROM_ZERO, /* Record from time 0 */ 238*6c95dd8fSPrabhakar Kushwaha DBG_BUS_PRE_TRIGGER_NUM_CHUNKS, /* Record some chunks before trigger */ 239*6c95dd8fSPrabhakar Kushwaha DBG_BUS_PRE_TRIGGER_DROP /* Drop data before trigger */ 240*6c95dd8fSPrabhakar Kushwaha }; 241*6c95dd8fSPrabhakar Kushwaha 242*6c95dd8fSPrabhakar Kushwaha /* Debug bus post-trigger recording types */ 243*6c95dd8fSPrabhakar Kushwaha enum dbg_bus_post_trigger_types { 244*6c95dd8fSPrabhakar Kushwaha DBG_BUS_POST_TRIGGER_RECORD, /* Start recording after trigger */ 245*6c95dd8fSPrabhakar Kushwaha DBG_BUS_POST_TRIGGER_DROP /* Drop data after trigger */ 246*6c95dd8fSPrabhakar Kushwaha }; 247*6c95dd8fSPrabhakar Kushwaha 248*6c95dd8fSPrabhakar Kushwaha /* Debug bus other engine mode */ 249*6c95dd8fSPrabhakar Kushwaha enum dbg_bus_other_engine_modes { 250*6c95dd8fSPrabhakar Kushwaha DBG_BUS_OTHER_ENGINE_MODE_NONE, 251*6c95dd8fSPrabhakar Kushwaha DBG_BUS_OTHER_ENGINE_MODE_DOUBLE_BW_TX, 252*6c95dd8fSPrabhakar Kushwaha DBG_BUS_OTHER_ENGINE_MODE_DOUBLE_BW_RX, 253*6c95dd8fSPrabhakar Kushwaha DBG_BUS_OTHER_ENGINE_MODE_CROSS_ENGINE_TX, 254*6c95dd8fSPrabhakar Kushwaha DBG_BUS_OTHER_ENGINE_MODE_CROSS_ENGINE_RX 255*6c95dd8fSPrabhakar Kushwaha }; 256*6c95dd8fSPrabhakar Kushwaha 257*6c95dd8fSPrabhakar Kushwaha /* DBG block Framing mode definitions */ 258*6c95dd8fSPrabhakar Kushwaha struct framing_mode_defs { 259*6c95dd8fSPrabhakar Kushwaha u8 id; 260*6c95dd8fSPrabhakar Kushwaha u8 blocks_dword_mask; 261*6c95dd8fSPrabhakar Kushwaha u8 storms_dword_mask; 262*6c95dd8fSPrabhakar Kushwaha u8 semi_framing_mode_id; 263*6c95dd8fSPrabhakar Kushwaha u8 full_buf_thr; 264*6c95dd8fSPrabhakar Kushwaha }; 265*6c95dd8fSPrabhakar Kushwaha 266c965db44STomer Tayar /* Chip constant definitions */ 267c965db44STomer Tayar struct chip_defs { 268c965db44STomer Tayar const char *name; 269*6c95dd8fSPrabhakar Kushwaha u8 dwords_per_cycle; 270*6c95dd8fSPrabhakar Kushwaha u8 num_framing_modes; 2718a52bbabSMichal Kalderon u32 num_ilt_pages; 272*6c95dd8fSPrabhakar 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) \ 395*6c95dd8fSPrabhakar 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 492*6c95dd8fSPrabhakar Kushwaha #define NUM_COMMON_GLOBAL_PARAMS 11 4932d22bc83SMichal Kalderon 4942d22bc83SMichal Kalderon #define MAX_RECURSION_DEPTH 10 4957b6859fbSMintz, Yuval 496*6c95dd8fSPrabhakar Kushwaha #define FW_IMG_KUKU 0 497c965db44STomer Tayar #define FW_IMG_MAIN 1 498*6c95dd8fSPrabhakar 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 527*6c95dd8fSPrabhakar Kushwaha /* DBG block framing mode definitions, in descending preference order */ 528*6c95dd8fSPrabhakar Kushwaha static struct framing_mode_defs s_framing_mode_defs[4] = { 529*6c95dd8fSPrabhakar Kushwaha {DBG_BUS_FRAME_MODE_4ST, 0x0, 0xf, 530*6c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_4FAST, 531*6c95dd8fSPrabhakar Kushwaha 10}, 532*6c95dd8fSPrabhakar Kushwaha {DBG_BUS_FRAME_MODE_4HW, 0xf, 0x0, DBG_BUS_SEMI_FRAME_MODE_4SLOW, 533*6c95dd8fSPrabhakar Kushwaha 10}, 534*6c95dd8fSPrabhakar Kushwaha {DBG_BUS_FRAME_MODE_2ST_2HW, 0x3, 0xc, 535*6c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_2FAST_2SLOW, 10}, 536*6c95dd8fSPrabhakar Kushwaha {DBG_BUS_FRAME_MODE_1ST_3HW, 0x7, 0x8, 537*6c95dd8fSPrabhakar Kushwaha DBG_BUS_SEMI_FRAME_MODE_1FAST_3SLOW, 10} 538*6c95dd8fSPrabhakar Kushwaha }; 539*6c95dd8fSPrabhakar Kushwaha 540c965db44STomer Tayar /* Chip constant definitions array */ 541c965db44STomer Tayar static struct chip_defs s_chip_defs[MAX_CHIP_IDS] = { 542*6c95dd8fSPrabhakar Kushwaha {"bb", 4, DBG_BUS_NUM_FRAME_MODES, PSWRQ2_REG_ILT_MEMORY_SIZE_BB / 2, 543*6c95dd8fSPrabhakar Kushwaha s_framing_mode_defs}, 544*6c95dd8fSPrabhakar Kushwaha {"ah", 4, DBG_BUS_NUM_FRAME_MODES, PSWRQ2_REG_ILT_MEMORY_SIZE_K2 / 2, 545*6c95dd8fSPrabhakar 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, 555*6c95dd8fSPrabhakar Kushwaha TSEM_REG_DBG_FRAME_MODE, TSEM_REG_SLOW_DBG_ACTIVE, 556*6c95dd8fSPrabhakar 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, 569*6c95dd8fSPrabhakar Kushwaha MSEM_REG_DBG_FRAME_MODE, 570*6c95dd8fSPrabhakar Kushwaha MSEM_REG_SLOW_DBG_ACTIVE, 571*6c95dd8fSPrabhakar Kushwaha MSEM_REG_SLOW_DBG_MODE, 572*6c95dd8fSPrabhakar 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, 586*6c95dd8fSPrabhakar Kushwaha USEM_REG_DBG_FRAME_MODE, 587*6c95dd8fSPrabhakar Kushwaha USEM_REG_SLOW_DBG_ACTIVE, 588*6c95dd8fSPrabhakar Kushwaha USEM_REG_SLOW_DBG_MODE, 589*6c95dd8fSPrabhakar 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, 603*6c95dd8fSPrabhakar Kushwaha XSEM_REG_DBG_FRAME_MODE, 604*6c95dd8fSPrabhakar Kushwaha XSEM_REG_SLOW_DBG_ACTIVE, 605*6c95dd8fSPrabhakar Kushwaha XSEM_REG_SLOW_DBG_MODE, 606*6c95dd8fSPrabhakar 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, 619*6c95dd8fSPrabhakar Kushwaha YSEM_REG_DBG_FRAME_MODE, 620*6c95dd8fSPrabhakar Kushwaha YSEM_REG_SLOW_DBG_ACTIVE, 621*6c95dd8fSPrabhakar Kushwaha YSEM_REG_SLOW_DBG_MODE, 622*6c95dd8fSPrabhakar 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, 636*6c95dd8fSPrabhakar Kushwaha PSEM_REG_DBG_FRAME_MODE, 637*6c95dd8fSPrabhakar Kushwaha PSEM_REG_SLOW_DBG_ACTIVE, 638*6c95dd8fSPrabhakar Kushwaha PSEM_REG_SLOW_DBG_MODE, 639*6c95dd8fSPrabhakar 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}, 653*6c95dd8fSPrabhakar Kushwaha {"reserved3", 0, 0, 0}, 654*6c95dd8fSPrabhakar 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, 851*6c95dd8fSPrabhakar Kushwaha PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_7_0_K2, 852*6c95dd8fSPrabhakar Kushwaha PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_15_8_K2, 853*6c95dd8fSPrabhakar Kushwaha PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_7_0_K2, 854*6c95dd8fSPrabhakar Kushwaha PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_11_8_K2}, 855*6c95dd8fSPrabhakar Kushwaha {"sgmii_phy", MS_REG_MS_CMU_K2, 856*6c95dd8fSPrabhakar Kushwaha PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X132_K2, 857*6c95dd8fSPrabhakar Kushwaha PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X133_K2, 858*6c95dd8fSPrabhakar Kushwaha PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X130_K2, 859*6c95dd8fSPrabhakar Kushwaha PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X131_K2}, 860*6c95dd8fSPrabhakar Kushwaha {"pcie_phy0", PHY_PCIE_REG_PHY0_K2, 861*6c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2, 862*6c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2, 863*6c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2, 864*6c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2}, 865*6c95dd8fSPrabhakar Kushwaha {"pcie_phy1", PHY_PCIE_REG_PHY1_K2, 866*6c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2, 867*6c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2, 868*6c95dd8fSPrabhakar Kushwaha PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2, 869*6c95dd8fSPrabhakar 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 889*6c95dd8fSPrabhakar Kushwaha /******************************** Variables **********************************/ 890*6c95dd8fSPrabhakar Kushwaha 891*6c95dd8fSPrabhakar Kushwaha /* The version of the calling app */ 892*6c95dd8fSPrabhakar Kushwaha static u32 s_app_ver; 893*6c95dd8fSPrabhakar Kushwaha 894c965db44STomer Tayar /**************************** Private Functions ******************************/ 895c965db44STomer Tayar 896*6c95dd8fSPrabhakar Kushwaha static void qed_static_asserts(void) 897*6c95dd8fSPrabhakar Kushwaha { 898*6c95dd8fSPrabhakar Kushwaha } 899*6c95dd8fSPrabhakar 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 958*6c95dd8fSPrabhakar Kushwaha if (!s_app_ver) 959*6c95dd8fSPrabhakar Kushwaha return DBG_STATUS_APP_VERSION_NOT_SET; 960*6c95dd8fSPrabhakar 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) { 1201*6c95dd8fSPrabhakar Kushwaha case FW_IMG_KUKU: 1202*6c95dd8fSPrabhakar Kushwaha strcpy(fw_img_str, "kuku"); 1203*6c95dd8fSPrabhakar Kushwaha break; 1204c965db44STomer Tayar case FW_IMG_MAIN: 1205c965db44STomer Tayar strcpy(fw_img_str, "main"); 1206c965db44STomer Tayar break; 1207*6c95dd8fSPrabhakar Kushwaha case FW_IMG_L2B: 1208*6c95dd8fSPrabhakar Kushwaha strcpy(fw_img_str, "l2b"); 1209*6c95dd8fSPrabhakar 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; 1318*6c95dd8fSPrabhakar Kushwaha char sw_platform_str[MAX_SW_PLTAFORM_STR_SIZE]; 1319c965db44STomer Tayar u32 offset = 0; 13207b6859fbSMintz, Yuval u8 num_params; 1321c965db44STomer Tayar 13227b6859fbSMintz, Yuval /* Dump global params section header */ 13232d22bc83SMichal Kalderon num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params + 13242d22bc83SMichal Kalderon (dev_data->chip_id == CHIP_BB ? 1 : 0); 1325c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 1326be086e7cSMintz, Yuval dump, "global_params", num_params); 1327c965db44STomer Tayar 1328c965db44STomer Tayar /* Store params */ 1329c965db44STomer Tayar offset += qed_dump_fw_ver_param(p_hwfn, p_ptt, dump_buf + offset, dump); 1330c965db44STomer Tayar offset += qed_dump_mfw_ver_param(p_hwfn, 1331c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 13322d22bc83SMichal Kalderon offset += qed_dump_chip_revision_param(p_hwfn, 13332d22bc83SMichal Kalderon p_ptt, dump_buf + offset, dump); 1334c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 1335c965db44STomer Tayar dump, "tools-version", TOOLS_VERSION); 1336c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1337c965db44STomer Tayar dump, 1338c965db44STomer Tayar "chip", 1339c965db44STomer Tayar s_chip_defs[dev_data->chip_id].name); 1340c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1341c965db44STomer Tayar dump, 1342c965db44STomer Tayar "platform", 13432d22bc83SMichal Kalderon s_hw_type_defs[dev_data->hw_type].name); 1344*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_str_param(dump_buf + offset, 1345*6c95dd8fSPrabhakar Kushwaha dump, "sw-platform", sw_platform_str); 13462d22bc83SMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 13472d22bc83SMichal Kalderon dump, "pci-func", p_hwfn->abs_pf_id); 1348*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 1349*6c95dd8fSPrabhakar Kushwaha dump, "epoch", qed_get_epoch_time()); 13502d22bc83SMichal Kalderon if (dev_data->chip_id == CHIP_BB) 13512d22bc83SMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 13522d22bc83SMichal Kalderon dump, "path", QED_PATH_ID(p_hwfn)); 13537b6859fbSMintz, Yuval 1354c965db44STomer Tayar return offset; 1355c965db44STomer Tayar } 1356c965db44STomer Tayar 13577b6859fbSMintz, Yuval /* Writes the "last" section (including CRC) to the specified buffer at the 13587b6859fbSMintz, Yuval * given offset. Returns the dumped size in dwords. 1359c965db44STomer Tayar */ 1360da090917STomer Tayar static u32 qed_dump_last_section(u32 *dump_buf, u32 offset, bool dump) 1361c965db44STomer Tayar { 13627b6859fbSMintz, Yuval u32 start_offset = offset; 1363c965db44STomer Tayar 1364c965db44STomer Tayar /* Dump CRC section header */ 1365c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, dump, "last", 0); 1366c965db44STomer Tayar 13677b6859fbSMintz, Yuval /* Calculate CRC32 and add it to the dword after the "last" section */ 1368c965db44STomer Tayar if (dump) 13697b6859fbSMintz, Yuval *(dump_buf + offset) = ~crc32(0xffffffff, 13707b6859fbSMintz, Yuval (u8 *)dump_buf, 1371c965db44STomer Tayar DWORDS_TO_BYTES(offset)); 13727b6859fbSMintz, Yuval 1373c965db44STomer Tayar offset++; 13747b6859fbSMintz, Yuval 1375c965db44STomer Tayar return offset - start_offset; 1376c965db44STomer Tayar } 1377c965db44STomer Tayar 1378c965db44STomer Tayar /* Update blocks reset state */ 1379c965db44STomer Tayar static void qed_update_blocks_reset_state(struct qed_hwfn *p_hwfn, 1380c965db44STomer Tayar struct qed_ptt *p_ptt) 1381c965db44STomer Tayar { 1382c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 13832d22bc83SMichal Kalderon u32 reg_val[NUM_DBG_RESET_REGS] = { 0 }; 13842d22bc83SMichal Kalderon u8 rst_reg_id; 13852d22bc83SMichal Kalderon u32 blk_id; 1386c965db44STomer Tayar 1387c965db44STomer Tayar /* Read reset registers */ 13882d22bc83SMichal Kalderon for (rst_reg_id = 0; rst_reg_id < NUM_DBG_RESET_REGS; rst_reg_id++) { 13892d22bc83SMichal Kalderon const struct dbg_reset_reg *rst_reg; 13902d22bc83SMichal Kalderon bool rst_reg_removed; 13912d22bc83SMichal Kalderon u32 rst_reg_addr; 13922d22bc83SMichal Kalderon 13932d22bc83SMichal Kalderon rst_reg = qed_get_dbg_reset_reg(p_hwfn, rst_reg_id); 13942d22bc83SMichal Kalderon rst_reg_removed = GET_FIELD(rst_reg->data, 13952d22bc83SMichal Kalderon DBG_RESET_REG_IS_REMOVED); 13962d22bc83SMichal Kalderon rst_reg_addr = DWORDS_TO_BYTES(GET_FIELD(rst_reg->data, 13972d22bc83SMichal Kalderon DBG_RESET_REG_ADDR)); 13982d22bc83SMichal Kalderon 13992d22bc83SMichal Kalderon if (!rst_reg_removed) 14002d22bc83SMichal Kalderon reg_val[rst_reg_id] = qed_rd(p_hwfn, p_ptt, 14012d22bc83SMichal Kalderon rst_reg_addr); 14022d22bc83SMichal Kalderon } 1403c965db44STomer Tayar 1404c965db44STomer Tayar /* Check if blocks are in reset */ 14052d22bc83SMichal Kalderon for (blk_id = 0; blk_id < NUM_PHYS_BLOCKS; blk_id++) { 14062d22bc83SMichal Kalderon const struct dbg_block_chip *blk; 14072d22bc83SMichal Kalderon bool has_rst_reg; 14082d22bc83SMichal Kalderon bool is_removed; 14097b6859fbSMintz, Yuval 14102d22bc83SMichal Kalderon blk = qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)blk_id); 14112d22bc83SMichal Kalderon is_removed = GET_FIELD(blk->flags, DBG_BLOCK_CHIP_IS_REMOVED); 14122d22bc83SMichal Kalderon has_rst_reg = GET_FIELD(blk->flags, 14132d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_RESET_REG); 14142d22bc83SMichal Kalderon 14152d22bc83SMichal Kalderon if (!is_removed && has_rst_reg) 14162d22bc83SMichal Kalderon dev_data->block_in_reset[blk_id] = 14172d22bc83SMichal Kalderon !(reg_val[blk->reset_reg_id] & 14182d22bc83SMichal Kalderon BIT(blk->reset_reg_bit_offset)); 14197b6859fbSMintz, Yuval } 1420c965db44STomer Tayar } 1421c965db44STomer Tayar 14222d22bc83SMichal Kalderon /* is_mode_match recursive function */ 14232d22bc83SMichal Kalderon static bool qed_is_mode_match_rec(struct qed_hwfn *p_hwfn, 14242d22bc83SMichal Kalderon u16 *modes_buf_offset, u8 rec_depth) 14252d22bc83SMichal Kalderon { 14262d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 14272d22bc83SMichal Kalderon u8 *dbg_array; 14282d22bc83SMichal Kalderon bool arg1, arg2; 14292d22bc83SMichal Kalderon u8 tree_val; 14302d22bc83SMichal Kalderon 14312d22bc83SMichal Kalderon if (rec_depth > MAX_RECURSION_DEPTH) { 14322d22bc83SMichal Kalderon DP_NOTICE(p_hwfn, 14332d22bc83SMichal Kalderon "Unexpected error: is_mode_match_rec exceeded the max recursion depth. This is probably due to a corrupt init/debug buffer.\n"); 14342d22bc83SMichal Kalderon return false; 14352d22bc83SMichal Kalderon } 14362d22bc83SMichal Kalderon 14372d22bc83SMichal Kalderon /* Get next element from modes tree buffer */ 14382d22bc83SMichal Kalderon dbg_array = p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr; 14392d22bc83SMichal Kalderon tree_val = dbg_array[(*modes_buf_offset)++]; 14402d22bc83SMichal Kalderon 14412d22bc83SMichal Kalderon switch (tree_val) { 14422d22bc83SMichal Kalderon case INIT_MODE_OP_NOT: 14432d22bc83SMichal Kalderon return !qed_is_mode_match_rec(p_hwfn, 14442d22bc83SMichal Kalderon modes_buf_offset, rec_depth + 1); 14452d22bc83SMichal Kalderon case INIT_MODE_OP_OR: 14462d22bc83SMichal Kalderon case INIT_MODE_OP_AND: 14472d22bc83SMichal Kalderon arg1 = qed_is_mode_match_rec(p_hwfn, 14482d22bc83SMichal Kalderon modes_buf_offset, rec_depth + 1); 14492d22bc83SMichal Kalderon arg2 = qed_is_mode_match_rec(p_hwfn, 14502d22bc83SMichal Kalderon modes_buf_offset, rec_depth + 1); 14512d22bc83SMichal Kalderon return (tree_val == INIT_MODE_OP_OR) ? (arg1 || 14522d22bc83SMichal Kalderon arg2) : (arg1 && arg2); 14532d22bc83SMichal Kalderon default: 14542d22bc83SMichal Kalderon return dev_data->mode_enable[tree_val - MAX_INIT_MODE_OPS] > 0; 14552d22bc83SMichal Kalderon } 14562d22bc83SMichal Kalderon } 14572d22bc83SMichal Kalderon 14582d22bc83SMichal Kalderon /* Returns true if the mode (specified using modes_buf_offset) is enabled */ 14592d22bc83SMichal Kalderon static bool qed_is_mode_match(struct qed_hwfn *p_hwfn, u16 *modes_buf_offset) 14602d22bc83SMichal Kalderon { 14612d22bc83SMichal Kalderon return qed_is_mode_match_rec(p_hwfn, modes_buf_offset, 0); 14622d22bc83SMichal Kalderon } 14632d22bc83SMichal Kalderon 1464c965db44STomer Tayar /* Enable / disable the Debug block */ 1465c965db44STomer Tayar static void qed_bus_enable_dbg_block(struct qed_hwfn *p_hwfn, 1466c965db44STomer Tayar struct qed_ptt *p_ptt, bool enable) 1467c965db44STomer Tayar { 1468c965db44STomer Tayar qed_wr(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON, enable ? 1 : 0); 1469c965db44STomer Tayar } 1470c965db44STomer Tayar 1471c965db44STomer Tayar /* Resets the Debug block */ 1472c965db44STomer Tayar static void qed_bus_reset_dbg_block(struct qed_hwfn *p_hwfn, 1473c965db44STomer Tayar struct qed_ptt *p_ptt) 1474c965db44STomer Tayar { 14752d22bc83SMichal Kalderon u32 reset_reg_addr, old_reset_reg_val, new_reset_reg_val; 14762d22bc83SMichal Kalderon const struct dbg_reset_reg *reset_reg; 14772d22bc83SMichal Kalderon const struct dbg_block_chip *block; 1478c965db44STomer Tayar 14792d22bc83SMichal Kalderon block = qed_get_dbg_block_per_chip(p_hwfn, BLOCK_DBG); 14802d22bc83SMichal Kalderon reset_reg = qed_get_dbg_reset_reg(p_hwfn, block->reset_reg_id); 14812d22bc83SMichal Kalderon reset_reg_addr = 14822d22bc83SMichal Kalderon DWORDS_TO_BYTES(GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR)); 14832d22bc83SMichal Kalderon 14842d22bc83SMichal Kalderon old_reset_reg_val = qed_rd(p_hwfn, p_ptt, reset_reg_addr); 14857b6859fbSMintz, Yuval new_reset_reg_val = 14862d22bc83SMichal Kalderon old_reset_reg_val & ~BIT(block->reset_reg_bit_offset); 1487c965db44STomer Tayar 14882d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, reset_reg_addr, new_reset_reg_val); 14892d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, reset_reg_addr, old_reset_reg_val); 1490c965db44STomer Tayar } 1491c965db44STomer Tayar 14927b6859fbSMintz, Yuval /* Enable / disable Debug Bus clients according to the specified mask 14937b6859fbSMintz, Yuval * (1 = enable, 0 = disable). 1494c965db44STomer Tayar */ 1495c965db44STomer Tayar static void qed_bus_enable_clients(struct qed_hwfn *p_hwfn, 1496c965db44STomer Tayar struct qed_ptt *p_ptt, u32 client_mask) 1497c965db44STomer Tayar { 1498c965db44STomer Tayar qed_wr(p_hwfn, p_ptt, DBG_REG_CLIENT_ENABLE, client_mask); 1499c965db44STomer Tayar } 1500c965db44STomer Tayar 15012d22bc83SMichal Kalderon static void qed_bus_config_dbg_line(struct qed_hwfn *p_hwfn, 15022d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 15032d22bc83SMichal Kalderon enum block_id block_id, 15042d22bc83SMichal Kalderon u8 line_id, 15052d22bc83SMichal Kalderon u8 enable_mask, 15062d22bc83SMichal Kalderon u8 right_shift, 15072d22bc83SMichal Kalderon u8 force_valid_mask, u8 force_frame_mask) 15082d22bc83SMichal Kalderon { 15092d22bc83SMichal Kalderon const struct dbg_block_chip *block = 15102d22bc83SMichal Kalderon qed_get_dbg_block_per_chip(p_hwfn, block_id); 15112d22bc83SMichal Kalderon 15122d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_select_reg_addr), 15132d22bc83SMichal Kalderon line_id); 15142d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_dword_enable_reg_addr), 15152d22bc83SMichal Kalderon enable_mask); 15162d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_shift_reg_addr), 15172d22bc83SMichal Kalderon right_shift); 15182d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_valid_reg_addr), 15192d22bc83SMichal Kalderon force_valid_mask); 15202d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_frame_reg_addr), 15212d22bc83SMichal Kalderon force_frame_mask); 15222d22bc83SMichal Kalderon } 15232d22bc83SMichal Kalderon 15242d22bc83SMichal Kalderon /* Disable debug bus in all blocks */ 15252d22bc83SMichal Kalderon static void qed_bus_disable_blocks(struct qed_hwfn *p_hwfn, 15262d22bc83SMichal Kalderon struct qed_ptt *p_ptt) 1527c965db44STomer Tayar { 1528c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 15292d22bc83SMichal Kalderon u32 block_id; 15307b6859fbSMintz, Yuval 15312d22bc83SMichal Kalderon /* Disable all blocks */ 15322d22bc83SMichal Kalderon for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) { 15332d22bc83SMichal Kalderon const struct dbg_block_chip *block_per_chip = 15342d22bc83SMichal Kalderon qed_get_dbg_block_per_chip(p_hwfn, 15352d22bc83SMichal Kalderon (enum block_id)block_id); 1536c965db44STomer Tayar 15372d22bc83SMichal Kalderon if (GET_FIELD(block_per_chip->flags, 15382d22bc83SMichal Kalderon DBG_BLOCK_CHIP_IS_REMOVED) || 15392d22bc83SMichal Kalderon dev_data->block_in_reset[block_id]) 15402d22bc83SMichal Kalderon continue; 15412d22bc83SMichal Kalderon 15422d22bc83SMichal Kalderon /* Disable debug bus */ 15432d22bc83SMichal Kalderon if (GET_FIELD(block_per_chip->flags, 15442d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_DBG_BUS)) { 15452d22bc83SMichal Kalderon u32 dbg_en_addr = 15462d22bc83SMichal Kalderon block_per_chip->dbg_dword_enable_reg_addr; 15472d22bc83SMichal Kalderon u16 modes_buf_offset = 15482d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 15492d22bc83SMichal Kalderon DBG_MODE_HDR_MODES_BUF_OFFSET); 15502d22bc83SMichal Kalderon bool eval_mode = 15512d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 15522d22bc83SMichal Kalderon DBG_MODE_HDR_EVAL_MODE) > 0; 15532d22bc83SMichal Kalderon 15542d22bc83SMichal Kalderon if (!eval_mode || 15552d22bc83SMichal Kalderon qed_is_mode_match(p_hwfn, &modes_buf_offset)) 15562d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, 15572d22bc83SMichal Kalderon DWORDS_TO_BYTES(dbg_en_addr), 15582d22bc83SMichal Kalderon 0); 15592d22bc83SMichal Kalderon } 1560c965db44STomer Tayar } 1561c965db44STomer Tayar } 1562c965db44STomer Tayar 1563c965db44STomer Tayar /* Returns true if the specified entity (indicated by GRC param) should be 1564c965db44STomer Tayar * included in the dump, false otherwise. 1565c965db44STomer Tayar */ 1566c965db44STomer Tayar static bool qed_grc_is_included(struct qed_hwfn *p_hwfn, 1567c965db44STomer Tayar enum dbg_grc_params grc_param) 1568c965db44STomer Tayar { 1569c965db44STomer Tayar return qed_grc_get_param(p_hwfn, grc_param) > 0; 1570c965db44STomer Tayar } 1571c965db44STomer Tayar 15722d22bc83SMichal Kalderon /* Returns the storm_id that matches the specified Storm letter, 15732d22bc83SMichal Kalderon * or MAX_DBG_STORMS if invalid storm letter. 15742d22bc83SMichal Kalderon */ 15752d22bc83SMichal Kalderon static enum dbg_storms qed_get_id_from_letter(char storm_letter) 15762d22bc83SMichal Kalderon { 15772d22bc83SMichal Kalderon u8 storm_id; 15782d22bc83SMichal Kalderon 15792d22bc83SMichal Kalderon for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) 15802d22bc83SMichal Kalderon if (s_storm_defs[storm_id].letter == storm_letter) 15812d22bc83SMichal Kalderon return (enum dbg_storms)storm_id; 15822d22bc83SMichal Kalderon 15832d22bc83SMichal Kalderon return MAX_DBG_STORMS; 15842d22bc83SMichal Kalderon } 15852d22bc83SMichal Kalderon 1586c965db44STomer Tayar /* Returns true of the specified Storm should be included in the dump, false 1587c965db44STomer Tayar * otherwise. 1588c965db44STomer Tayar */ 1589c965db44STomer Tayar static bool qed_grc_is_storm_included(struct qed_hwfn *p_hwfn, 1590c965db44STomer Tayar enum dbg_storms storm) 1591c965db44STomer Tayar { 1592c965db44STomer Tayar return qed_grc_get_param(p_hwfn, (enum dbg_grc_params)storm) > 0; 1593c965db44STomer Tayar } 1594c965db44STomer Tayar 1595c965db44STomer Tayar /* Returns true if the specified memory should be included in the dump, false 1596c965db44STomer Tayar * otherwise. 1597c965db44STomer Tayar */ 1598c965db44STomer Tayar static bool qed_grc_is_mem_included(struct qed_hwfn *p_hwfn, 1599c965db44STomer Tayar enum block_id block_id, u8 mem_group_id) 1600c965db44STomer Tayar { 16012d22bc83SMichal Kalderon const struct dbg_block *block; 1602c965db44STomer Tayar u8 i; 1603c965db44STomer Tayar 16042d22bc83SMichal Kalderon block = get_dbg_block(p_hwfn, block_id); 16052d22bc83SMichal Kalderon 16062d22bc83SMichal Kalderon /* If the block is associated with a Storm, check Storm match */ 16072d22bc83SMichal Kalderon if (block->associated_storm_letter) { 16082d22bc83SMichal Kalderon enum dbg_storms associated_storm_id = 16092d22bc83SMichal Kalderon qed_get_id_from_letter(block->associated_storm_letter); 16102d22bc83SMichal Kalderon 16112d22bc83SMichal Kalderon if (associated_storm_id == MAX_DBG_STORMS || 16122d22bc83SMichal Kalderon !qed_grc_is_storm_included(p_hwfn, associated_storm_id)) 1613c965db44STomer Tayar return false; 16142d22bc83SMichal Kalderon } 1615c965db44STomer Tayar 16167b6859fbSMintz, Yuval for (i = 0; i < NUM_BIG_RAM_TYPES; i++) { 16177b6859fbSMintz, Yuval struct big_ram_defs *big_ram = &s_big_ram_defs[i]; 1618c965db44STomer Tayar 16197b6859fbSMintz, Yuval if (mem_group_id == big_ram->mem_group_id || 16207b6859fbSMintz, Yuval mem_group_id == big_ram->ram_mem_group_id) 16217b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, big_ram->grc_param); 16227b6859fbSMintz, Yuval } 16237b6859fbSMintz, Yuval 16247b6859fbSMintz, Yuval switch (mem_group_id) { 16257b6859fbSMintz, Yuval case MEM_GROUP_PXP_ILT: 16267b6859fbSMintz, Yuval case MEM_GROUP_PXP_MEM: 16277b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PXP); 16287b6859fbSMintz, Yuval case MEM_GROUP_RAM: 16297b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RAM); 16307b6859fbSMintz, Yuval case MEM_GROUP_PBUF: 16317b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PBUF); 16327b6859fbSMintz, Yuval case MEM_GROUP_CAU_MEM: 16337b6859fbSMintz, Yuval case MEM_GROUP_CAU_SB: 16347b6859fbSMintz, Yuval case MEM_GROUP_CAU_PI: 16357b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU); 16362d22bc83SMichal Kalderon case MEM_GROUP_CAU_MEM_EXT: 16372d22bc83SMichal Kalderon return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU_EXT); 16387b6859fbSMintz, Yuval case MEM_GROUP_QM_MEM: 16397b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_QM); 16407b6859fbSMintz, Yuval case MEM_GROUP_CFC_MEM: 16417b6859fbSMintz, Yuval case MEM_GROUP_CONN_CFC_MEM: 16427b6859fbSMintz, Yuval case MEM_GROUP_TASK_CFC_MEM: 1643da090917STomer Tayar return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CFC) || 1644da090917STomer Tayar qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX); 16452d22bc83SMichal Kalderon case MEM_GROUP_DORQ_MEM: 16462d22bc83SMichal Kalderon return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DORQ); 16477b6859fbSMintz, Yuval case MEM_GROUP_IGU_MEM: 16487b6859fbSMintz, Yuval case MEM_GROUP_IGU_MSIX: 16497b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IGU); 16507b6859fbSMintz, Yuval case MEM_GROUP_MULD_MEM: 16517b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MULD); 16527b6859fbSMintz, Yuval case MEM_GROUP_PRS_MEM: 16537b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PRS); 16547b6859fbSMintz, Yuval case MEM_GROUP_DMAE_MEM: 16557b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DMAE); 16567b6859fbSMintz, Yuval case MEM_GROUP_TM_MEM: 16577b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_TM); 16587b6859fbSMintz, Yuval case MEM_GROUP_SDM_MEM: 16597b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_SDM); 16607b6859fbSMintz, Yuval case MEM_GROUP_TDIF_CTX: 16617b6859fbSMintz, Yuval case MEM_GROUP_RDIF_CTX: 16627b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DIF); 16637b6859fbSMintz, Yuval case MEM_GROUP_CM_MEM: 16647b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM); 16657b6859fbSMintz, Yuval case MEM_GROUP_IOR: 16667b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR); 16677b6859fbSMintz, Yuval default: 1668c965db44STomer Tayar return true; 1669c965db44STomer Tayar } 16707b6859fbSMintz, Yuval } 1671c965db44STomer Tayar 1672c965db44STomer Tayar /* Stalls all Storms */ 1673c965db44STomer Tayar static void qed_grc_stall_storms(struct qed_hwfn *p_hwfn, 1674c965db44STomer Tayar struct qed_ptt *p_ptt, bool stall) 1675c965db44STomer Tayar { 16767b6859fbSMintz, Yuval u32 reg_addr; 1677c965db44STomer Tayar u8 storm_id; 1678c965db44STomer Tayar 1679c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 16807b6859fbSMintz, Yuval if (!qed_grc_is_storm_included(p_hwfn, 16817b6859fbSMintz, Yuval (enum dbg_storms)storm_id)) 16827b6859fbSMintz, Yuval continue; 1683c965db44STomer Tayar 16847b6859fbSMintz, Yuval reg_addr = s_storm_defs[storm_id].sem_fast_mem_addr + 1685*6c95dd8fSPrabhakar Kushwaha SEM_FAST_REG_STALL_0; 16867b6859fbSMintz, Yuval qed_wr(p_hwfn, p_ptt, reg_addr, stall ? 1 : 0); 1687c965db44STomer Tayar } 1688c965db44STomer Tayar 1689c965db44STomer Tayar msleep(STALL_DELAY_MS); 1690c965db44STomer Tayar } 1691c965db44STomer Tayar 16922d22bc83SMichal Kalderon /* Takes all blocks out of reset. If rbc_only is true, only RBC clients are 16932d22bc83SMichal Kalderon * taken out of reset. 16942d22bc83SMichal Kalderon */ 1695c965db44STomer Tayar static void qed_grc_unreset_blocks(struct qed_hwfn *p_hwfn, 16962d22bc83SMichal Kalderon struct qed_ptt *p_ptt, bool rbc_only) 1697c965db44STomer Tayar { 1698c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 16992d22bc83SMichal Kalderon u8 chip_id = dev_data->chip_id; 17002d22bc83SMichal Kalderon u32 i; 17012d22bc83SMichal Kalderon 17022d22bc83SMichal Kalderon /* Take RBCs out of reset */ 17032d22bc83SMichal Kalderon for (i = 0; i < ARRAY_SIZE(s_rbc_reset_defs); i++) 17042d22bc83SMichal Kalderon if (s_rbc_reset_defs[i].reset_val[dev_data->chip_id]) 17052d22bc83SMichal Kalderon qed_wr(p_hwfn, 17062d22bc83SMichal Kalderon p_ptt, 17072d22bc83SMichal Kalderon s_rbc_reset_defs[i].reset_reg_addr + 17082d22bc83SMichal Kalderon RESET_REG_UNRESET_OFFSET, 17092d22bc83SMichal Kalderon s_rbc_reset_defs[i].reset_val[chip_id]); 17102d22bc83SMichal Kalderon 17112d22bc83SMichal Kalderon if (!rbc_only) { 17122d22bc83SMichal Kalderon u32 reg_val[NUM_DBG_RESET_REGS] = { 0 }; 17132d22bc83SMichal Kalderon u8 reset_reg_id; 17142d22bc83SMichal Kalderon u32 block_id; 1715c965db44STomer Tayar 1716c965db44STomer Tayar /* Fill reset regs values */ 17172d22bc83SMichal Kalderon for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) { 17182d22bc83SMichal Kalderon bool is_removed, has_reset_reg, unreset_before_dump; 17192d22bc83SMichal Kalderon const struct dbg_block_chip *block; 17207b6859fbSMintz, Yuval 17212d22bc83SMichal Kalderon block = qed_get_dbg_block_per_chip(p_hwfn, 17222d22bc83SMichal Kalderon (enum block_id) 17232d22bc83SMichal Kalderon block_id); 17242d22bc83SMichal Kalderon is_removed = 17252d22bc83SMichal Kalderon GET_FIELD(block->flags, DBG_BLOCK_CHIP_IS_REMOVED); 17262d22bc83SMichal Kalderon has_reset_reg = 17272d22bc83SMichal Kalderon GET_FIELD(block->flags, 17282d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_RESET_REG); 17292d22bc83SMichal Kalderon unreset_before_dump = 17302d22bc83SMichal Kalderon GET_FIELD(block->flags, 17312d22bc83SMichal Kalderon DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP); 17322d22bc83SMichal Kalderon 17332d22bc83SMichal Kalderon if (!is_removed && has_reset_reg && unreset_before_dump) 17342d22bc83SMichal Kalderon reg_val[block->reset_reg_id] |= 17352d22bc83SMichal Kalderon BIT(block->reset_reg_bit_offset); 17367b6859fbSMintz, Yuval } 1737c965db44STomer Tayar 1738c965db44STomer Tayar /* Write reset registers */ 17392d22bc83SMichal Kalderon for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS; 17402d22bc83SMichal Kalderon reset_reg_id++) { 17412d22bc83SMichal Kalderon const struct dbg_reset_reg *reset_reg; 17422d22bc83SMichal Kalderon u32 reset_reg_addr; 17432d22bc83SMichal Kalderon 17442d22bc83SMichal Kalderon reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id); 17452d22bc83SMichal Kalderon 17462d22bc83SMichal Kalderon if (GET_FIELD 17472d22bc83SMichal Kalderon (reset_reg->data, DBG_RESET_REG_IS_REMOVED)) 17487b6859fbSMintz, Yuval continue; 17497b6859fbSMintz, Yuval 17502d22bc83SMichal Kalderon if (reg_val[reset_reg_id]) { 17512d22bc83SMichal Kalderon reset_reg_addr = 17522d22bc83SMichal Kalderon GET_FIELD(reset_reg->data, 17532d22bc83SMichal Kalderon DBG_RESET_REG_ADDR); 1754c965db44STomer Tayar qed_wr(p_hwfn, 1755c965db44STomer Tayar p_ptt, 17562d22bc83SMichal Kalderon DWORDS_TO_BYTES(reset_reg_addr) + 17572d22bc83SMichal Kalderon RESET_REG_UNRESET_OFFSET, 17582d22bc83SMichal Kalderon reg_val[reset_reg_id]); 17592d22bc83SMichal Kalderon } 17602d22bc83SMichal Kalderon } 1761c965db44STomer Tayar } 1762c965db44STomer Tayar } 1763c965db44STomer Tayar 1764be086e7cSMintz, Yuval /* Returns the attention block data of the specified block */ 1765c965db44STomer Tayar static const struct dbg_attn_block_type_data * 17662d22bc83SMichal Kalderon qed_get_block_attn_data(struct qed_hwfn *p_hwfn, 17672d22bc83SMichal Kalderon enum block_id block_id, enum dbg_attn_type attn_type) 1768c965db44STomer Tayar { 1769c965db44STomer Tayar const struct dbg_attn_block *base_attn_block_arr = 1770c965db44STomer Tayar (const struct dbg_attn_block *) 17712d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr; 1772c965db44STomer Tayar 1773c965db44STomer Tayar return &base_attn_block_arr[block_id].per_type_data[attn_type]; 1774c965db44STomer Tayar } 1775c965db44STomer Tayar 1776c965db44STomer Tayar /* Returns the attention registers of the specified block */ 1777c965db44STomer Tayar static const struct dbg_attn_reg * 17782d22bc83SMichal Kalderon qed_get_block_attn_regs(struct qed_hwfn *p_hwfn, 17792d22bc83SMichal Kalderon enum block_id block_id, enum dbg_attn_type attn_type, 1780c965db44STomer Tayar u8 *num_attn_regs) 1781c965db44STomer Tayar { 1782c965db44STomer Tayar const struct dbg_attn_block_type_data *block_type_data = 17832d22bc83SMichal Kalderon qed_get_block_attn_data(p_hwfn, block_id, attn_type); 1784c965db44STomer Tayar 1785c965db44STomer Tayar *num_attn_regs = block_type_data->num_regs; 17867b6859fbSMintz, Yuval 17872d22bc83SMichal Kalderon return (const struct dbg_attn_reg *) 17882d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr + 17892d22bc83SMichal Kalderon block_type_data->regs_offset; 1790c965db44STomer Tayar } 1791c965db44STomer Tayar 1792c965db44STomer Tayar /* For each block, clear the status of all parities */ 1793c965db44STomer Tayar static void qed_grc_clear_all_prty(struct qed_hwfn *p_hwfn, 1794c965db44STomer Tayar struct qed_ptt *p_ptt) 1795c965db44STomer Tayar { 1796c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 17977b6859fbSMintz, Yuval const struct dbg_attn_reg *attn_reg_arr; 1798*6c95dd8fSPrabhakar Kushwaha u32 block_id, sts_clr_address; 1799c965db44STomer Tayar u8 reg_idx, num_attn_regs; 1800c965db44STomer Tayar 18012d22bc83SMichal Kalderon for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) { 1802c965db44STomer Tayar if (dev_data->block_in_reset[block_id]) 1803c965db44STomer Tayar continue; 1804c965db44STomer Tayar 18052d22bc83SMichal Kalderon attn_reg_arr = qed_get_block_attn_regs(p_hwfn, 18062d22bc83SMichal Kalderon (enum block_id)block_id, 1807c965db44STomer Tayar ATTN_TYPE_PARITY, 1808c965db44STomer Tayar &num_attn_regs); 18097b6859fbSMintz, Yuval 1810c965db44STomer Tayar for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) { 1811c965db44STomer Tayar const struct dbg_attn_reg *reg_data = 1812c965db44STomer Tayar &attn_reg_arr[reg_idx]; 18137b6859fbSMintz, Yuval u16 modes_buf_offset; 18147b6859fbSMintz, Yuval bool eval_mode; 1815c965db44STomer Tayar 1816c965db44STomer Tayar /* Check mode */ 18177b6859fbSMintz, Yuval eval_mode = GET_FIELD(reg_data->mode.data, 1818c965db44STomer Tayar DBG_MODE_HDR_EVAL_MODE) > 0; 18197b6859fbSMintz, Yuval modes_buf_offset = 1820c965db44STomer Tayar GET_FIELD(reg_data->mode.data, 1821c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 1822c965db44STomer Tayar 1823*6c95dd8fSPrabhakar Kushwaha sts_clr_address = reg_data->sts_clr_address; 18247b6859fbSMintz, Yuval /* If Mode match: clear parity status */ 1825c965db44STomer Tayar if (!eval_mode || 1826c965db44STomer Tayar qed_is_mode_match(p_hwfn, &modes_buf_offset)) 1827c965db44STomer Tayar qed_rd(p_hwfn, p_ptt, 1828*6c95dd8fSPrabhakar Kushwaha DWORDS_TO_BYTES(sts_clr_address)); 1829c965db44STomer Tayar } 1830c965db44STomer Tayar } 1831c965db44STomer Tayar } 1832c965db44STomer Tayar 1833*6c95dd8fSPrabhakar Kushwaha /* Finds the meta data image in NVRAM */ 1834*6c95dd8fSPrabhakar Kushwaha static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn, 1835*6c95dd8fSPrabhakar Kushwaha struct qed_ptt *p_ptt, 1836*6c95dd8fSPrabhakar Kushwaha u32 image_type, 1837*6c95dd8fSPrabhakar Kushwaha u32 *nvram_offset_bytes, 1838*6c95dd8fSPrabhakar Kushwaha u32 *nvram_size_bytes) 1839*6c95dd8fSPrabhakar Kushwaha { 1840*6c95dd8fSPrabhakar Kushwaha u32 ret_mcp_resp, ret_mcp_param, ret_txn_size; 1841*6c95dd8fSPrabhakar Kushwaha struct mcp_file_att file_att; 1842*6c95dd8fSPrabhakar Kushwaha int nvm_result; 1843*6c95dd8fSPrabhakar Kushwaha 1844*6c95dd8fSPrabhakar Kushwaha /* Call NVRAM get file command */ 1845*6c95dd8fSPrabhakar Kushwaha nvm_result = qed_mcp_nvm_rd_cmd(p_hwfn, 1846*6c95dd8fSPrabhakar Kushwaha p_ptt, 1847*6c95dd8fSPrabhakar Kushwaha DRV_MSG_CODE_NVM_GET_FILE_ATT, 1848*6c95dd8fSPrabhakar Kushwaha image_type, 1849*6c95dd8fSPrabhakar Kushwaha &ret_mcp_resp, 1850*6c95dd8fSPrabhakar Kushwaha &ret_mcp_param, 1851*6c95dd8fSPrabhakar Kushwaha &ret_txn_size, 1852*6c95dd8fSPrabhakar Kushwaha (u32 *)&file_att, false); 1853*6c95dd8fSPrabhakar Kushwaha 1854*6c95dd8fSPrabhakar Kushwaha /* Check response */ 1855*6c95dd8fSPrabhakar Kushwaha if (nvm_result || (ret_mcp_resp & FW_MSG_CODE_MASK) != 1856*6c95dd8fSPrabhakar Kushwaha FW_MSG_CODE_NVM_OK) 1857*6c95dd8fSPrabhakar Kushwaha return DBG_STATUS_NVRAM_GET_IMAGE_FAILED; 1858*6c95dd8fSPrabhakar Kushwaha 1859*6c95dd8fSPrabhakar Kushwaha /* Update return values */ 1860*6c95dd8fSPrabhakar Kushwaha *nvram_offset_bytes = file_att.nvm_start_addr; 1861*6c95dd8fSPrabhakar Kushwaha *nvram_size_bytes = file_att.len; 1862*6c95dd8fSPrabhakar Kushwaha 1863*6c95dd8fSPrabhakar Kushwaha DP_VERBOSE(p_hwfn, 1864*6c95dd8fSPrabhakar Kushwaha QED_MSG_DEBUG, 1865*6c95dd8fSPrabhakar Kushwaha "find_nvram_image: found NVRAM image of type %d in NVRAM offset %d bytes with size %d bytes\n", 1866*6c95dd8fSPrabhakar Kushwaha image_type, *nvram_offset_bytes, *nvram_size_bytes); 1867*6c95dd8fSPrabhakar Kushwaha 1868*6c95dd8fSPrabhakar Kushwaha /* Check alignment */ 1869*6c95dd8fSPrabhakar Kushwaha if (*nvram_size_bytes & 0x3) 1870*6c95dd8fSPrabhakar Kushwaha return DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE; 1871*6c95dd8fSPrabhakar Kushwaha 1872*6c95dd8fSPrabhakar Kushwaha return DBG_STATUS_OK; 1873*6c95dd8fSPrabhakar Kushwaha } 1874*6c95dd8fSPrabhakar Kushwaha 1875*6c95dd8fSPrabhakar Kushwaha /* Reads data from NVRAM */ 1876*6c95dd8fSPrabhakar Kushwaha static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn, 1877*6c95dd8fSPrabhakar Kushwaha struct qed_ptt *p_ptt, 1878*6c95dd8fSPrabhakar Kushwaha u32 nvram_offset_bytes, 1879*6c95dd8fSPrabhakar Kushwaha u32 nvram_size_bytes, u32 *ret_buf) 1880*6c95dd8fSPrabhakar Kushwaha { 1881*6c95dd8fSPrabhakar Kushwaha u32 ret_mcp_resp, ret_mcp_param, ret_read_size, bytes_to_copy; 1882*6c95dd8fSPrabhakar Kushwaha s32 bytes_left = nvram_size_bytes; 1883*6c95dd8fSPrabhakar Kushwaha u32 read_offset = 0, param = 0; 1884*6c95dd8fSPrabhakar Kushwaha 1885*6c95dd8fSPrabhakar Kushwaha DP_VERBOSE(p_hwfn, 1886*6c95dd8fSPrabhakar Kushwaha QED_MSG_DEBUG, 1887*6c95dd8fSPrabhakar Kushwaha "nvram_read: reading image of size %d bytes from NVRAM\n", 1888*6c95dd8fSPrabhakar Kushwaha nvram_size_bytes); 1889*6c95dd8fSPrabhakar Kushwaha 1890*6c95dd8fSPrabhakar Kushwaha do { 1891*6c95dd8fSPrabhakar Kushwaha bytes_to_copy = 1892*6c95dd8fSPrabhakar Kushwaha (bytes_left > 1893*6c95dd8fSPrabhakar Kushwaha MCP_DRV_NVM_BUF_LEN) ? MCP_DRV_NVM_BUF_LEN : bytes_left; 1894*6c95dd8fSPrabhakar Kushwaha 1895*6c95dd8fSPrabhakar Kushwaha /* Call NVRAM read command */ 1896*6c95dd8fSPrabhakar Kushwaha SET_MFW_FIELD(param, 1897*6c95dd8fSPrabhakar Kushwaha DRV_MB_PARAM_NVM_OFFSET, 1898*6c95dd8fSPrabhakar Kushwaha nvram_offset_bytes + read_offset); 1899*6c95dd8fSPrabhakar Kushwaha SET_MFW_FIELD(param, DRV_MB_PARAM_NVM_LEN, bytes_to_copy); 1900*6c95dd8fSPrabhakar Kushwaha if (qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt, 1901*6c95dd8fSPrabhakar Kushwaha DRV_MSG_CODE_NVM_READ_NVRAM, param, 1902*6c95dd8fSPrabhakar Kushwaha &ret_mcp_resp, 1903*6c95dd8fSPrabhakar Kushwaha &ret_mcp_param, &ret_read_size, 1904*6c95dd8fSPrabhakar Kushwaha (u32 *)((u8 *)ret_buf + read_offset), 1905*6c95dd8fSPrabhakar Kushwaha false)) 1906*6c95dd8fSPrabhakar Kushwaha return DBG_STATUS_NVRAM_READ_FAILED; 1907*6c95dd8fSPrabhakar Kushwaha 1908*6c95dd8fSPrabhakar Kushwaha /* Check response */ 1909*6c95dd8fSPrabhakar Kushwaha if ((ret_mcp_resp & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK) 1910*6c95dd8fSPrabhakar Kushwaha return DBG_STATUS_NVRAM_READ_FAILED; 1911*6c95dd8fSPrabhakar Kushwaha 1912*6c95dd8fSPrabhakar Kushwaha /* Update read offset */ 1913*6c95dd8fSPrabhakar Kushwaha read_offset += ret_read_size; 1914*6c95dd8fSPrabhakar Kushwaha bytes_left -= ret_read_size; 1915*6c95dd8fSPrabhakar Kushwaha } while (bytes_left > 0); 1916*6c95dd8fSPrabhakar Kushwaha 1917*6c95dd8fSPrabhakar Kushwaha return DBG_STATUS_OK; 1918*6c95dd8fSPrabhakar Kushwaha } 1919*6c95dd8fSPrabhakar Kushwaha 1920c965db44STomer Tayar /* Dumps GRC registers section header. Returns the dumped size in dwords. 19212d22bc83SMichal Kalderon * the following parameters are dumped: 19227b6859fbSMintz, Yuval * - count: no. of dumped entries 1923d52c89f1SMichal Kalderon * - split_type: split type 1924d52c89f1SMichal Kalderon * - split_id: split ID (dumped only if split_id != SPLIT_TYPE_NONE) 19252d22bc83SMichal Kalderon * - reg_type_name: register type name (dumped only if reg_type_name != NULL) 1926c965db44STomer Tayar */ 1927c965db44STomer Tayar static u32 qed_grc_dump_regs_hdr(u32 *dump_buf, 1928c965db44STomer Tayar bool dump, 1929c965db44STomer Tayar u32 num_reg_entries, 1930d52c89f1SMichal Kalderon enum init_split_types split_type, 19312d22bc83SMichal Kalderon u8 split_id, const char *reg_type_name) 1932c965db44STomer Tayar { 1933d52c89f1SMichal Kalderon u8 num_params = 2 + 19342d22bc83SMichal Kalderon (split_type != SPLIT_TYPE_NONE ? 1 : 0) + (reg_type_name ? 1 : 0); 1935c965db44STomer Tayar u32 offset = 0; 1936c965db44STomer Tayar 1937c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 1938c965db44STomer Tayar dump, "grc_regs", num_params); 1939c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 1940c965db44STomer Tayar dump, "count", num_reg_entries); 1941c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1942d52c89f1SMichal Kalderon dump, "split", 1943d52c89f1SMichal Kalderon s_split_type_defs[split_type].name); 1944d52c89f1SMichal Kalderon if (split_type != SPLIT_TYPE_NONE) 1945c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 1946c965db44STomer Tayar dump, "id", split_id); 19472d22bc83SMichal Kalderon if (reg_type_name) 1948c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 19492d22bc83SMichal Kalderon dump, "type", reg_type_name); 19507b6859fbSMintz, Yuval 1951c965db44STomer Tayar return offset; 1952c965db44STomer Tayar } 1953c965db44STomer Tayar 1954da090917STomer Tayar /* Reads the specified registers into the specified buffer. 1955da090917STomer Tayar * The addr and len arguments are specified in dwords. 1956da090917STomer Tayar */ 1957da090917STomer Tayar void qed_read_regs(struct qed_hwfn *p_hwfn, 1958da090917STomer Tayar struct qed_ptt *p_ptt, u32 *buf, u32 addr, u32 len) 1959da090917STomer Tayar { 1960da090917STomer Tayar u32 i; 1961da090917STomer Tayar 1962da090917STomer Tayar for (i = 0; i < len; i++) 1963da090917STomer Tayar buf[i] = qed_rd(p_hwfn, p_ptt, DWORDS_TO_BYTES(addr + i)); 1964da090917STomer Tayar } 1965da090917STomer Tayar 1966be086e7cSMintz, Yuval /* Dumps the GRC registers in the specified address range. 1967be086e7cSMintz, Yuval * Returns the dumped size in dwords. 19687b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 1969be086e7cSMintz, Yuval */ 1970be086e7cSMintz, Yuval static u32 qed_grc_dump_addr_range(struct qed_hwfn *p_hwfn, 19717b6859fbSMintz, Yuval struct qed_ptt *p_ptt, 19727b6859fbSMintz, Yuval u32 *dump_buf, 1973d52c89f1SMichal Kalderon bool dump, u32 addr, u32 len, bool wide_bus, 1974d52c89f1SMichal Kalderon enum init_split_types split_type, 1975d52c89f1SMichal Kalderon u8 split_id) 1976be086e7cSMintz, Yuval { 1977da090917STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 1978d52c89f1SMichal Kalderon u8 port_id = 0, pf_id = 0, vf_id = 0, fid = 0; 19792d22bc83SMichal Kalderon bool read_using_dmae = false; 19802d22bc83SMichal Kalderon u32 thresh; 1981be086e7cSMintz, Yuval 19827b6859fbSMintz, Yuval if (!dump) 19837b6859fbSMintz, Yuval return len; 19847b6859fbSMintz, Yuval 1985d52c89f1SMichal Kalderon switch (split_type) { 1986d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT: 1987d52c89f1SMichal Kalderon port_id = split_id; 1988d52c89f1SMichal Kalderon break; 1989d52c89f1SMichal Kalderon case SPLIT_TYPE_PF: 1990d52c89f1SMichal Kalderon pf_id = split_id; 1991d52c89f1SMichal Kalderon break; 1992d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT_PF: 1993d52c89f1SMichal Kalderon port_id = split_id / dev_data->num_pfs_per_port; 1994d52c89f1SMichal Kalderon pf_id = port_id + dev_data->num_ports * 1995d52c89f1SMichal Kalderon (split_id % dev_data->num_pfs_per_port); 1996d52c89f1SMichal Kalderon break; 1997d52c89f1SMichal Kalderon case SPLIT_TYPE_VF: 1998d52c89f1SMichal Kalderon vf_id = split_id; 1999d52c89f1SMichal Kalderon break; 2000d52c89f1SMichal Kalderon default: 2001d52c89f1SMichal Kalderon break; 2002d52c89f1SMichal Kalderon } 2003d52c89f1SMichal Kalderon 2004da090917STomer Tayar /* Try reading using DMAE */ 20052d22bc83SMichal Kalderon if (dev_data->use_dmae && split_type != SPLIT_TYPE_VF && 20062d22bc83SMichal Kalderon (len >= s_hw_type_defs[dev_data->hw_type].dmae_thresh || 20072d22bc83SMichal Kalderon (PROTECT_WIDE_BUS && wide_bus))) { 20082d22bc83SMichal Kalderon struct qed_dmae_params dmae_params; 20092d22bc83SMichal Kalderon 20102d22bc83SMichal Kalderon /* Set DMAE params */ 20112d22bc83SMichal Kalderon memset(&dmae_params, 0, sizeof(dmae_params)); 20122d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_COMPLETION_DST, 1); 20132d22bc83SMichal Kalderon switch (split_type) { 20142d22bc83SMichal Kalderon case SPLIT_TYPE_PORT: 20152d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID, 20162d22bc83SMichal Kalderon 1); 20172d22bc83SMichal Kalderon dmae_params.port_id = port_id; 20182d22bc83SMichal Kalderon break; 20192d22bc83SMichal Kalderon case SPLIT_TYPE_PF: 20202d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, 20212d22bc83SMichal Kalderon QED_DMAE_PARAMS_SRC_PF_VALID, 1); 20222d22bc83SMichal Kalderon dmae_params.src_pfid = pf_id; 20232d22bc83SMichal Kalderon break; 20242d22bc83SMichal Kalderon case SPLIT_TYPE_PORT_PF: 20252d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID, 20262d22bc83SMichal Kalderon 1); 20272d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, 20282d22bc83SMichal Kalderon QED_DMAE_PARAMS_SRC_PF_VALID, 1); 20292d22bc83SMichal Kalderon dmae_params.port_id = port_id; 20302d22bc83SMichal Kalderon dmae_params.src_pfid = pf_id; 20312d22bc83SMichal Kalderon break; 20322d22bc83SMichal Kalderon default: 20332d22bc83SMichal Kalderon break; 20342d22bc83SMichal Kalderon } 20352d22bc83SMichal Kalderon 20362d22bc83SMichal Kalderon /* Execute DMAE command */ 20372d22bc83SMichal Kalderon read_using_dmae = !qed_dmae_grc2host(p_hwfn, 20382d22bc83SMichal Kalderon p_ptt, 20392d22bc83SMichal Kalderon DWORDS_TO_BYTES(addr), 20402d22bc83SMichal Kalderon (u64)(uintptr_t)(dump_buf), 20412d22bc83SMichal Kalderon len, &dmae_params); 20422d22bc83SMichal Kalderon if (!read_using_dmae) { 2043da090917STomer Tayar dev_data->use_dmae = 0; 2044da090917STomer Tayar DP_VERBOSE(p_hwfn, 2045da090917STomer Tayar QED_MSG_DEBUG, 2046da090917STomer Tayar "Failed reading from chip using DMAE, using GRC instead\n"); 2047da090917STomer Tayar } 20482d22bc83SMichal Kalderon } 20492d22bc83SMichal Kalderon 20502d22bc83SMichal Kalderon if (read_using_dmae) 20512d22bc83SMichal Kalderon goto print_log; 2052da090917STomer Tayar 2053d52c89f1SMichal Kalderon /* If not read using DMAE, read using GRC */ 2054d52c89f1SMichal Kalderon 2055d52c89f1SMichal Kalderon /* Set pretend */ 20562d22bc83SMichal Kalderon if (split_type != dev_data->pretend.split_type || 20572d22bc83SMichal Kalderon split_id != dev_data->pretend.split_id) { 2058d52c89f1SMichal Kalderon switch (split_type) { 2059d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT: 2060d52c89f1SMichal Kalderon qed_port_pretend(p_hwfn, p_ptt, port_id); 2061d52c89f1SMichal Kalderon break; 2062d52c89f1SMichal Kalderon case SPLIT_TYPE_PF: 20632d22bc83SMichal Kalderon fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID, 20642d22bc83SMichal Kalderon pf_id); 2065d52c89f1SMichal Kalderon qed_fid_pretend(p_hwfn, p_ptt, fid); 2066d52c89f1SMichal Kalderon break; 2067d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT_PF: 20682d22bc83SMichal Kalderon fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID, 20692d22bc83SMichal Kalderon pf_id); 2070d52c89f1SMichal Kalderon qed_port_fid_pretend(p_hwfn, p_ptt, port_id, fid); 2071d52c89f1SMichal Kalderon break; 2072d52c89f1SMichal Kalderon case SPLIT_TYPE_VF: 20732d22bc83SMichal Kalderon fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFVALID, 1) 20742d22bc83SMichal Kalderon | FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFID, 20752d22bc83SMichal Kalderon vf_id); 2076d52c89f1SMichal Kalderon qed_fid_pretend(p_hwfn, p_ptt, fid); 2077d52c89f1SMichal Kalderon break; 2078d52c89f1SMichal Kalderon default: 2079d52c89f1SMichal Kalderon break; 2080d52c89f1SMichal Kalderon } 2081d52c89f1SMichal Kalderon 2082d52c89f1SMichal Kalderon dev_data->pretend.split_type = (u8)split_type; 2083d52c89f1SMichal Kalderon dev_data->pretend.split_id = split_id; 2084d52c89f1SMichal Kalderon } 2085d52c89f1SMichal Kalderon 2086d52c89f1SMichal Kalderon /* Read registers using GRC */ 2087da090917STomer Tayar qed_read_regs(p_hwfn, p_ptt, dump_buf, addr, len); 2088da090917STomer Tayar 20892d22bc83SMichal Kalderon print_log: 20902d22bc83SMichal Kalderon /* Print log */ 20912d22bc83SMichal Kalderon dev_data->num_regs_read += len; 20922d22bc83SMichal Kalderon thresh = s_hw_type_defs[dev_data->hw_type].log_thresh; 20932d22bc83SMichal Kalderon if ((dev_data->num_regs_read / thresh) > 20942d22bc83SMichal Kalderon ((dev_data->num_regs_read - len) / thresh)) 20952d22bc83SMichal Kalderon DP_VERBOSE(p_hwfn, 20962d22bc83SMichal Kalderon QED_MSG_DEBUG, 20972d22bc83SMichal Kalderon "Dumped %d registers...\n", dev_data->num_regs_read); 20982d22bc83SMichal Kalderon 2099da090917STomer Tayar return len; 2100be086e7cSMintz, Yuval } 2101be086e7cSMintz, Yuval 21027b6859fbSMintz, Yuval /* Dumps GRC registers sequence header. Returns the dumped size in dwords. 21037b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 21047b6859fbSMintz, Yuval */ 21057b6859fbSMintz, Yuval static u32 qed_grc_dump_reg_entry_hdr(u32 *dump_buf, 21067b6859fbSMintz, Yuval bool dump, u32 addr, u32 len) 2107be086e7cSMintz, Yuval { 2108be086e7cSMintz, Yuval if (dump) 2109be086e7cSMintz, Yuval *dump_buf = addr | (len << REG_DUMP_LEN_SHIFT); 21107b6859fbSMintz, Yuval 2111be086e7cSMintz, Yuval return 1; 2112be086e7cSMintz, Yuval } 2113be086e7cSMintz, Yuval 21147b6859fbSMintz, Yuval /* Dumps GRC registers sequence. Returns the dumped size in dwords. 21157b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 21167b6859fbSMintz, Yuval */ 2117c965db44STomer Tayar static u32 qed_grc_dump_reg_entry(struct qed_hwfn *p_hwfn, 21187b6859fbSMintz, Yuval struct qed_ptt *p_ptt, 21197b6859fbSMintz, Yuval u32 *dump_buf, 2120d52c89f1SMichal Kalderon bool dump, u32 addr, u32 len, bool wide_bus, 2121d52c89f1SMichal Kalderon enum init_split_types split_type, u8 split_id) 2122c965db44STomer Tayar { 2123be086e7cSMintz, Yuval u32 offset = 0; 2124c965db44STomer Tayar 2125be086e7cSMintz, Yuval offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, len); 2126be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 2127c965db44STomer Tayar p_ptt, 21287b6859fbSMintz, Yuval dump_buf + offset, 2129d52c89f1SMichal Kalderon dump, addr, len, wide_bus, 2130d52c89f1SMichal Kalderon split_type, split_id); 21317b6859fbSMintz, Yuval 2132be086e7cSMintz, Yuval return offset; 2133be086e7cSMintz, Yuval } 2134be086e7cSMintz, Yuval 2135be086e7cSMintz, Yuval /* Dumps GRC registers sequence with skip cycle. 2136be086e7cSMintz, Yuval * Returns the dumped size in dwords. 21377b6859fbSMintz, Yuval * - addr: start GRC address in dwords 21387b6859fbSMintz, Yuval * - total_len: total no. of dwords to dump 21397b6859fbSMintz, Yuval * - read_len: no. consecutive dwords to read 21407b6859fbSMintz, Yuval * - skip_len: no. of dwords to skip (and fill with zeros) 2141be086e7cSMintz, Yuval */ 2142be086e7cSMintz, Yuval static u32 qed_grc_dump_reg_entry_skip(struct qed_hwfn *p_hwfn, 21437b6859fbSMintz, Yuval struct qed_ptt *p_ptt, 21447b6859fbSMintz, Yuval u32 *dump_buf, 21457b6859fbSMintz, Yuval bool dump, 21467b6859fbSMintz, Yuval u32 addr, 21477b6859fbSMintz, Yuval u32 total_len, 2148be086e7cSMintz, Yuval u32 read_len, u32 skip_len) 2149be086e7cSMintz, Yuval { 2150be086e7cSMintz, Yuval u32 offset = 0, reg_offset = 0; 2151be086e7cSMintz, Yuval 2152be086e7cSMintz, Yuval offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, total_len); 21537b6859fbSMintz, Yuval 21547b6859fbSMintz, Yuval if (!dump) 21557b6859fbSMintz, Yuval return offset + total_len; 21567b6859fbSMintz, Yuval 2157be086e7cSMintz, Yuval while (reg_offset < total_len) { 21587b6859fbSMintz, Yuval u32 curr_len = min_t(u32, read_len, total_len - reg_offset); 21597b6859fbSMintz, Yuval 2160be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 2161be086e7cSMintz, Yuval p_ptt, 2162be086e7cSMintz, Yuval dump_buf + offset, 2163d52c89f1SMichal Kalderon dump, addr, curr_len, false, 2164d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 2165be086e7cSMintz, Yuval reg_offset += curr_len; 2166be086e7cSMintz, Yuval addr += curr_len; 21677b6859fbSMintz, Yuval 2168be086e7cSMintz, Yuval if (reg_offset < total_len) { 21697b6859fbSMintz, Yuval curr_len = min_t(u32, skip_len, total_len - skip_len); 21707b6859fbSMintz, Yuval memset(dump_buf + offset, 0, DWORDS_TO_BYTES(curr_len)); 2171be086e7cSMintz, Yuval offset += curr_len; 2172be086e7cSMintz, Yuval reg_offset += curr_len; 2173be086e7cSMintz, Yuval addr += curr_len; 2174be086e7cSMintz, Yuval } 2175be086e7cSMintz, Yuval } 2176c965db44STomer Tayar 2177c965db44STomer Tayar return offset; 2178c965db44STomer Tayar } 2179c965db44STomer Tayar 2180c965db44STomer Tayar /* Dumps GRC registers entries. Returns the dumped size in dwords. */ 2181c965db44STomer Tayar static u32 qed_grc_dump_regs_entries(struct qed_hwfn *p_hwfn, 2182c965db44STomer Tayar struct qed_ptt *p_ptt, 21832d22bc83SMichal Kalderon struct virt_mem_desc input_regs_arr, 2184c965db44STomer Tayar u32 *dump_buf, 2185c965db44STomer Tayar bool dump, 2186d52c89f1SMichal Kalderon enum init_split_types split_type, 2187d52c89f1SMichal Kalderon u8 split_id, 2188c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID], 2189c965db44STomer Tayar u32 *num_dumped_reg_entries) 2190c965db44STomer Tayar { 2191c965db44STomer Tayar u32 i, offset = 0, input_offset = 0; 2192c965db44STomer Tayar bool mode_match = true; 2193c965db44STomer Tayar 2194c965db44STomer Tayar *num_dumped_reg_entries = 0; 21957b6859fbSMintz, Yuval 21962d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(input_regs_arr.size)) { 2197c965db44STomer Tayar const struct dbg_dump_cond_hdr *cond_hdr = 2198c965db44STomer Tayar (const struct dbg_dump_cond_hdr *) 21992d22bc83SMichal Kalderon input_regs_arr.ptr + input_offset++; 22007b6859fbSMintz, Yuval u16 modes_buf_offset; 22017b6859fbSMintz, Yuval bool eval_mode; 2202c965db44STomer Tayar 2203c965db44STomer Tayar /* Check mode/block */ 22047b6859fbSMintz, Yuval eval_mode = GET_FIELD(cond_hdr->mode.data, 22057b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 2206c965db44STomer Tayar if (eval_mode) { 22077b6859fbSMintz, Yuval modes_buf_offset = 2208c965db44STomer Tayar GET_FIELD(cond_hdr->mode.data, 2209c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 2210c965db44STomer Tayar mode_match = qed_is_mode_match(p_hwfn, 2211c965db44STomer Tayar &modes_buf_offset); 2212c965db44STomer Tayar } 2213c965db44STomer Tayar 22147b6859fbSMintz, Yuval if (!mode_match || !block_enable[cond_hdr->block_id]) { 22157b6859fbSMintz, Yuval input_offset += cond_hdr->data_size; 22167b6859fbSMintz, Yuval continue; 22177b6859fbSMintz, Yuval } 22187b6859fbSMintz, Yuval 22197b6859fbSMintz, Yuval for (i = 0; i < cond_hdr->data_size; i++, input_offset++) { 2220c965db44STomer Tayar const struct dbg_dump_reg *reg = 2221c965db44STomer Tayar (const struct dbg_dump_reg *) 22222d22bc83SMichal Kalderon input_regs_arr.ptr + input_offset; 2223be086e7cSMintz, Yuval u32 addr, len; 22247b6859fbSMintz, Yuval bool wide_bus; 2225c965db44STomer Tayar 22267b6859fbSMintz, Yuval addr = GET_FIELD(reg->data, DBG_DUMP_REG_ADDRESS); 2227be086e7cSMintz, Yuval len = GET_FIELD(reg->data, DBG_DUMP_REG_LENGTH); 22287b6859fbSMintz, Yuval wide_bus = GET_FIELD(reg->data, DBG_DUMP_REG_WIDE_BUS); 22297b6859fbSMintz, Yuval offset += qed_grc_dump_reg_entry(p_hwfn, 22307b6859fbSMintz, Yuval p_ptt, 2231be086e7cSMintz, Yuval dump_buf + offset, 2232be086e7cSMintz, Yuval dump, 2233be086e7cSMintz, Yuval addr, 22347b6859fbSMintz, Yuval len, 2235d52c89f1SMichal Kalderon wide_bus, 2236d52c89f1SMichal Kalderon split_type, split_id); 2237c965db44STomer Tayar (*num_dumped_reg_entries)++; 2238c965db44STomer Tayar } 2239c965db44STomer Tayar } 2240c965db44STomer Tayar 2241c965db44STomer Tayar return offset; 2242c965db44STomer Tayar } 2243c965db44STomer Tayar 2244c965db44STomer Tayar /* Dumps GRC registers entries. Returns the dumped size in dwords. */ 2245c965db44STomer Tayar static u32 qed_grc_dump_split_data(struct qed_hwfn *p_hwfn, 2246c965db44STomer Tayar struct qed_ptt *p_ptt, 22472d22bc83SMichal Kalderon struct virt_mem_desc input_regs_arr, 2248c965db44STomer Tayar u32 *dump_buf, 2249c965db44STomer Tayar bool dump, 2250c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID], 2251d52c89f1SMichal Kalderon enum init_split_types split_type, 22522d22bc83SMichal Kalderon u8 split_id, const char *reg_type_name) 2253c965db44STomer Tayar { 2254d52c89f1SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 2255d52c89f1SMichal Kalderon enum init_split_types hdr_split_type = split_type; 2256c965db44STomer Tayar u32 num_dumped_reg_entries, offset; 2257d52c89f1SMichal Kalderon u8 hdr_split_id = split_id; 2258d52c89f1SMichal Kalderon 2259d52c89f1SMichal Kalderon /* In PORT_PF split type, print a port split header */ 2260d52c89f1SMichal Kalderon if (split_type == SPLIT_TYPE_PORT_PF) { 2261d52c89f1SMichal Kalderon hdr_split_type = SPLIT_TYPE_PORT; 2262d52c89f1SMichal Kalderon hdr_split_id = split_id / dev_data->num_pfs_per_port; 2263d52c89f1SMichal Kalderon } 2264c965db44STomer Tayar 2265c965db44STomer Tayar /* Calculate register dump header size (and skip it for now) */ 2266c965db44STomer Tayar offset = qed_grc_dump_regs_hdr(dump_buf, 2267c965db44STomer Tayar false, 2268c965db44STomer Tayar 0, 2269d52c89f1SMichal Kalderon hdr_split_type, 22702d22bc83SMichal Kalderon hdr_split_id, reg_type_name); 2271c965db44STomer Tayar 2272c965db44STomer Tayar /* Dump registers */ 2273c965db44STomer Tayar offset += qed_grc_dump_regs_entries(p_hwfn, 2274c965db44STomer Tayar p_ptt, 2275c965db44STomer Tayar input_regs_arr, 2276c965db44STomer Tayar dump_buf + offset, 2277c965db44STomer Tayar dump, 2278d52c89f1SMichal Kalderon split_type, 2279d52c89f1SMichal Kalderon split_id, 2280c965db44STomer Tayar block_enable, 2281c965db44STomer Tayar &num_dumped_reg_entries); 2282c965db44STomer Tayar 2283c965db44STomer Tayar /* Write register dump header */ 2284c965db44STomer Tayar if (dump && num_dumped_reg_entries > 0) 2285c965db44STomer Tayar qed_grc_dump_regs_hdr(dump_buf, 2286c965db44STomer Tayar dump, 2287c965db44STomer Tayar num_dumped_reg_entries, 2288d52c89f1SMichal Kalderon hdr_split_type, 22892d22bc83SMichal Kalderon hdr_split_id, reg_type_name); 2290c965db44STomer Tayar 2291c965db44STomer Tayar return num_dumped_reg_entries > 0 ? offset : 0; 2292c965db44STomer Tayar } 2293c965db44STomer Tayar 22947b6859fbSMintz, Yuval /* Dumps registers according to the input registers array. Returns the dumped 22957b6859fbSMintz, Yuval * size in dwords. 2296c965db44STomer Tayar */ 2297c965db44STomer Tayar static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn, 2298c965db44STomer Tayar struct qed_ptt *p_ptt, 2299c965db44STomer Tayar u32 *dump_buf, 2300c965db44STomer Tayar bool dump, 2301c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID], 23022d22bc83SMichal Kalderon const char *reg_type_name) 2303c965db44STomer Tayar { 23042d22bc83SMichal Kalderon struct virt_mem_desc *dbg_buf = 23052d22bc83SMichal Kalderon &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG]; 2306c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 2307c965db44STomer Tayar u32 offset = 0, input_offset = 0; 23082d22bc83SMichal Kalderon 23092d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) { 23107b6859fbSMintz, Yuval const struct dbg_dump_split_hdr *split_hdr; 23112d22bc83SMichal Kalderon struct virt_mem_desc curr_input_regs_arr; 2312d52c89f1SMichal Kalderon enum init_split_types split_type; 2313d52c89f1SMichal Kalderon u16 split_count = 0; 23147b6859fbSMintz, Yuval u32 split_data_size; 2315d52c89f1SMichal Kalderon u8 split_id; 23167b6859fbSMintz, Yuval 23177b6859fbSMintz, Yuval split_hdr = 2318c965db44STomer Tayar (const struct dbg_dump_split_hdr *) 23192d22bc83SMichal Kalderon dbg_buf->ptr + input_offset++; 2320d52c89f1SMichal Kalderon split_type = 23217b6859fbSMintz, Yuval GET_FIELD(split_hdr->hdr, 2322c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID); 23232d22bc83SMichal Kalderon split_data_size = GET_FIELD(split_hdr->hdr, 2324c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_DATA_SIZE); 23257b6859fbSMintz, Yuval curr_input_regs_arr.ptr = 23262d22bc83SMichal Kalderon (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr + 23272d22bc83SMichal Kalderon input_offset; 23282d22bc83SMichal Kalderon curr_input_regs_arr.size = DWORDS_TO_BYTES(split_data_size); 2329c965db44STomer Tayar 2330d52c89f1SMichal Kalderon switch (split_type) { 2331c965db44STomer Tayar case SPLIT_TYPE_NONE: 2332d52c89f1SMichal Kalderon split_count = 1; 2333c965db44STomer Tayar break; 2334c965db44STomer Tayar case SPLIT_TYPE_PORT: 2335d52c89f1SMichal Kalderon split_count = dev_data->num_ports; 2336c965db44STomer Tayar break; 2337c965db44STomer Tayar case SPLIT_TYPE_PF: 2338c965db44STomer Tayar case SPLIT_TYPE_PORT_PF: 2339d52c89f1SMichal Kalderon split_count = dev_data->num_ports * 2340d52c89f1SMichal Kalderon dev_data->num_pfs_per_port; 2341be086e7cSMintz, Yuval break; 2342be086e7cSMintz, Yuval case SPLIT_TYPE_VF: 2343d52c89f1SMichal Kalderon split_count = dev_data->num_vfs; 2344d52c89f1SMichal Kalderon break; 2345d52c89f1SMichal Kalderon default: 2346d52c89f1SMichal Kalderon return 0; 2347be086e7cSMintz, Yuval } 2348be086e7cSMintz, Yuval 2349d52c89f1SMichal Kalderon for (split_id = 0; split_id < split_count; split_id++) 2350d52c89f1SMichal Kalderon offset += qed_grc_dump_split_data(p_hwfn, p_ptt, 2351be086e7cSMintz, Yuval curr_input_regs_arr, 2352be086e7cSMintz, Yuval dump_buf + offset, 2353be086e7cSMintz, Yuval dump, block_enable, 2354d52c89f1SMichal Kalderon split_type, 2355d52c89f1SMichal Kalderon split_id, 23562d22bc83SMichal Kalderon reg_type_name); 2357c965db44STomer Tayar 2358c965db44STomer Tayar input_offset += split_data_size; 2359c965db44STomer Tayar } 2360c965db44STomer Tayar 2361d52c89f1SMichal Kalderon /* Cancel pretends (pretend to original PF) */ 2362be086e7cSMintz, Yuval if (dump) { 23632d22bc83SMichal Kalderon qed_fid_pretend(p_hwfn, p_ptt, 23642d22bc83SMichal Kalderon FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID, 23652d22bc83SMichal Kalderon p_hwfn->rel_pf_id)); 2366d52c89f1SMichal Kalderon dev_data->pretend.split_type = SPLIT_TYPE_NONE; 2367d52c89f1SMichal Kalderon dev_data->pretend.split_id = 0; 2368be086e7cSMintz, Yuval } 2369be086e7cSMintz, Yuval 2370c965db44STomer Tayar return offset; 2371c965db44STomer Tayar } 2372c965db44STomer Tayar 2373c965db44STomer Tayar /* Dump reset registers. Returns the dumped size in dwords. */ 2374c965db44STomer Tayar static u32 qed_grc_dump_reset_regs(struct qed_hwfn *p_hwfn, 2375c965db44STomer Tayar struct qed_ptt *p_ptt, 2376c965db44STomer Tayar u32 *dump_buf, bool dump) 2377c965db44STomer Tayar { 23782d22bc83SMichal Kalderon u32 offset = 0, num_regs = 0; 23792d22bc83SMichal Kalderon u8 reset_reg_id; 2380c965db44STomer Tayar 2381c965db44STomer Tayar /* Calculate header size */ 2382c965db44STomer Tayar offset += qed_grc_dump_regs_hdr(dump_buf, 23832d22bc83SMichal Kalderon false, 23842d22bc83SMichal Kalderon 0, SPLIT_TYPE_NONE, 0, "RESET_REGS"); 2385c965db44STomer Tayar 2386c965db44STomer Tayar /* Write reset registers */ 23872d22bc83SMichal Kalderon for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS; 23882d22bc83SMichal Kalderon reset_reg_id++) { 23892d22bc83SMichal Kalderon const struct dbg_reset_reg *reset_reg; 23902d22bc83SMichal Kalderon u32 reset_reg_addr; 23912d22bc83SMichal Kalderon 23922d22bc83SMichal Kalderon reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id); 23932d22bc83SMichal Kalderon 23942d22bc83SMichal Kalderon if (GET_FIELD(reset_reg->data, DBG_RESET_REG_IS_REMOVED)) 23957b6859fbSMintz, Yuval continue; 2396be086e7cSMintz, Yuval 23972d22bc83SMichal Kalderon reset_reg_addr = GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR); 2398c965db44STomer Tayar offset += qed_grc_dump_reg_entry(p_hwfn, 2399c965db44STomer Tayar p_ptt, 2400c965db44STomer Tayar dump_buf + offset, 2401c965db44STomer Tayar dump, 24022d22bc83SMichal Kalderon reset_reg_addr, 24032d22bc83SMichal Kalderon 1, false, SPLIT_TYPE_NONE, 0); 2404c965db44STomer Tayar num_regs++; 2405c965db44STomer Tayar } 2406c965db44STomer Tayar 2407c965db44STomer Tayar /* Write header */ 2408c965db44STomer Tayar if (dump) 2409c965db44STomer Tayar qed_grc_dump_regs_hdr(dump_buf, 2410d52c89f1SMichal Kalderon true, num_regs, SPLIT_TYPE_NONE, 24112d22bc83SMichal Kalderon 0, "RESET_REGS"); 24127b6859fbSMintz, Yuval 2413c965db44STomer Tayar return offset; 2414c965db44STomer Tayar } 2415c965db44STomer Tayar 24167b6859fbSMintz, Yuval /* Dump registers that are modified during GRC Dump and therefore must be 24177b6859fbSMintz, Yuval * dumped first. Returns the dumped size in dwords. 2418c965db44STomer Tayar */ 2419c965db44STomer Tayar static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn, 2420c965db44STomer Tayar struct qed_ptt *p_ptt, 2421c965db44STomer Tayar u32 *dump_buf, bool dump) 2422c965db44STomer Tayar { 2423c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 24242d22bc83SMichal Kalderon u32 block_id, offset = 0, stall_regs_offset; 24257b6859fbSMintz, Yuval const struct dbg_attn_reg *attn_reg_arr; 2426c965db44STomer Tayar u8 storm_id, reg_idx, num_attn_regs; 24272d22bc83SMichal Kalderon u32 num_reg_entries = 0; 2428c965db44STomer Tayar 24292d22bc83SMichal Kalderon /* Write empty header for attention registers */ 2430c965db44STomer Tayar offset += qed_grc_dump_regs_hdr(dump_buf, 24312d22bc83SMichal Kalderon false, 24322d22bc83SMichal Kalderon 0, SPLIT_TYPE_NONE, 0, "ATTN_REGS"); 2433c965db44STomer Tayar 2434c965db44STomer Tayar /* Write parity registers */ 24352d22bc83SMichal Kalderon for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) { 2436c965db44STomer Tayar if (dev_data->block_in_reset[block_id] && dump) 2437c965db44STomer Tayar continue; 2438c965db44STomer Tayar 24392d22bc83SMichal Kalderon attn_reg_arr = qed_get_block_attn_regs(p_hwfn, 24402d22bc83SMichal Kalderon (enum block_id)block_id, 2441c965db44STomer Tayar ATTN_TYPE_PARITY, 2442c965db44STomer Tayar &num_attn_regs); 24437b6859fbSMintz, Yuval 2444c965db44STomer Tayar for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) { 2445c965db44STomer Tayar const struct dbg_attn_reg *reg_data = 2446c965db44STomer Tayar &attn_reg_arr[reg_idx]; 2447c965db44STomer Tayar u16 modes_buf_offset; 2448c965db44STomer Tayar bool eval_mode; 2449be086e7cSMintz, Yuval u32 addr; 2450c965db44STomer Tayar 2451c965db44STomer Tayar /* Check mode */ 2452c965db44STomer Tayar eval_mode = GET_FIELD(reg_data->mode.data, 2453c965db44STomer Tayar DBG_MODE_HDR_EVAL_MODE) > 0; 2454c965db44STomer Tayar modes_buf_offset = 2455c965db44STomer Tayar GET_FIELD(reg_data->mode.data, 2456c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 24577b6859fbSMintz, Yuval if (eval_mode && 24587b6859fbSMintz, Yuval !qed_is_mode_match(p_hwfn, &modes_buf_offset)) 24597b6859fbSMintz, Yuval continue; 24607b6859fbSMintz, Yuval 24617b6859fbSMintz, Yuval /* Mode match: read & dump registers */ 2462be086e7cSMintz, Yuval addr = reg_data->mask_address; 24637b6859fbSMintz, Yuval offset += qed_grc_dump_reg_entry(p_hwfn, 2464c965db44STomer Tayar p_ptt, 2465c965db44STomer Tayar dump_buf + offset, 2466c965db44STomer Tayar dump, 2467be086e7cSMintz, Yuval addr, 2468d52c89f1SMichal Kalderon 1, false, 2469d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 2470be086e7cSMintz, Yuval addr = GET_FIELD(reg_data->data, 2471be086e7cSMintz, Yuval DBG_ATTN_REG_STS_ADDRESS); 24727b6859fbSMintz, Yuval offset += qed_grc_dump_reg_entry(p_hwfn, 2473c965db44STomer Tayar p_ptt, 2474c965db44STomer Tayar dump_buf + offset, 2475c965db44STomer Tayar dump, 2476be086e7cSMintz, Yuval addr, 2477d52c89f1SMichal Kalderon 1, false, 2478d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 2479c965db44STomer Tayar num_reg_entries += 2; 2480c965db44STomer Tayar } 2481c965db44STomer Tayar } 2482c965db44STomer Tayar 24832d22bc83SMichal Kalderon /* Overwrite header for attention registers */ 24842d22bc83SMichal Kalderon if (dump) 24852d22bc83SMichal Kalderon qed_grc_dump_regs_hdr(dump_buf, 24862d22bc83SMichal Kalderon true, 24872d22bc83SMichal Kalderon num_reg_entries, 24882d22bc83SMichal Kalderon SPLIT_TYPE_NONE, 0, "ATTN_REGS"); 24892d22bc83SMichal Kalderon 24902d22bc83SMichal Kalderon /* Write empty header for stall registers */ 24912d22bc83SMichal Kalderon stall_regs_offset = offset; 24922d22bc83SMichal Kalderon offset += qed_grc_dump_regs_hdr(dump_buf, 24932d22bc83SMichal Kalderon false, 0, SPLIT_TYPE_NONE, 0, "REGS"); 24942d22bc83SMichal Kalderon 24957b6859fbSMintz, Yuval /* Write Storm stall status registers */ 24962d22bc83SMichal Kalderon for (storm_id = 0, num_reg_entries = 0; storm_id < MAX_DBG_STORMS; 24972d22bc83SMichal Kalderon storm_id++) { 24987b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 2499be086e7cSMintz, Yuval u32 addr; 2500be086e7cSMintz, Yuval 25012d22bc83SMichal Kalderon if (dev_data->block_in_reset[storm->sem_block_id] && dump) 2502c965db44STomer Tayar continue; 2503c965db44STomer Tayar 2504be086e7cSMintz, Yuval addr = 25052d22bc83SMichal Kalderon BYTES_TO_DWORDS(storm->sem_fast_mem_addr + 2506be086e7cSMintz, Yuval SEM_FAST_REG_STALLED); 2507c965db44STomer Tayar offset += qed_grc_dump_reg_entry(p_hwfn, 2508c965db44STomer Tayar p_ptt, 2509c965db44STomer Tayar dump_buf + offset, 2510c965db44STomer Tayar dump, 2511be086e7cSMintz, Yuval addr, 25127b6859fbSMintz, Yuval 1, 2513d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 2514c965db44STomer Tayar num_reg_entries++; 2515c965db44STomer Tayar } 2516c965db44STomer Tayar 25172d22bc83SMichal Kalderon /* Overwrite header for stall registers */ 2518c965db44STomer Tayar if (dump) 25192d22bc83SMichal Kalderon qed_grc_dump_regs_hdr(dump_buf + stall_regs_offset, 2520c965db44STomer Tayar true, 25212d22bc83SMichal Kalderon num_reg_entries, 25222d22bc83SMichal Kalderon SPLIT_TYPE_NONE, 0, "REGS"); 25237b6859fbSMintz, Yuval 2524c965db44STomer Tayar return offset; 2525c965db44STomer Tayar } 2526c965db44STomer Tayar 2527be086e7cSMintz, Yuval /* Dumps registers that can't be represented in the debug arrays */ 2528be086e7cSMintz, Yuval static u32 qed_grc_dump_special_regs(struct qed_hwfn *p_hwfn, 2529be086e7cSMintz, Yuval struct qed_ptt *p_ptt, 2530be086e7cSMintz, Yuval u32 *dump_buf, bool dump) 2531be086e7cSMintz, Yuval { 2532be086e7cSMintz, Yuval u32 offset = 0, addr; 2533be086e7cSMintz, Yuval 2534be086e7cSMintz, Yuval offset += qed_grc_dump_regs_hdr(dump_buf, 25352d22bc83SMichal Kalderon dump, 2, SPLIT_TYPE_NONE, 0, "REGS"); 2536be086e7cSMintz, Yuval 2537be086e7cSMintz, Yuval /* Dump R/TDIF_REG_DEBUG_ERROR_INFO_SIZE (every 8'th register should be 2538be086e7cSMintz, Yuval * skipped). 2539be086e7cSMintz, Yuval */ 2540be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(RDIF_REG_DEBUG_ERROR_INFO); 2541be086e7cSMintz, Yuval offset += qed_grc_dump_reg_entry_skip(p_hwfn, 2542be086e7cSMintz, Yuval p_ptt, 2543be086e7cSMintz, Yuval dump_buf + offset, 2544be086e7cSMintz, Yuval dump, 2545be086e7cSMintz, Yuval addr, 2546be086e7cSMintz, Yuval RDIF_REG_DEBUG_ERROR_INFO_SIZE, 2547be086e7cSMintz, Yuval 7, 2548be086e7cSMintz, Yuval 1); 2549be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(TDIF_REG_DEBUG_ERROR_INFO); 2550be086e7cSMintz, Yuval offset += 2551be086e7cSMintz, Yuval qed_grc_dump_reg_entry_skip(p_hwfn, 2552be086e7cSMintz, Yuval p_ptt, 2553be086e7cSMintz, Yuval dump_buf + offset, 2554be086e7cSMintz, Yuval dump, 2555be086e7cSMintz, Yuval addr, 2556be086e7cSMintz, Yuval TDIF_REG_DEBUG_ERROR_INFO_SIZE, 2557be086e7cSMintz, Yuval 7, 2558be086e7cSMintz, Yuval 1); 2559be086e7cSMintz, Yuval 2560be086e7cSMintz, Yuval return offset; 2561be086e7cSMintz, Yuval } 2562be086e7cSMintz, Yuval 25637b6859fbSMintz, Yuval /* Dumps a GRC memory header (section and params). Returns the dumped size in 25647b6859fbSMintz, Yuval * dwords. The following parameters are dumped: 25657b6859fbSMintz, Yuval * - name: dumped only if it's not NULL. 25667b6859fbSMintz, Yuval * - addr: in dwords, dumped only if name is NULL. 25677b6859fbSMintz, Yuval * - len: in dwords, always dumped. 25687b6859fbSMintz, Yuval * - width: dumped if it's not zero. 25697b6859fbSMintz, Yuval * - packed: dumped only if it's not false. 25707b6859fbSMintz, Yuval * - mem_group: always dumped. 25717b6859fbSMintz, Yuval * - is_storm: true only if the memory is related to a Storm. 25727b6859fbSMintz, Yuval * - storm_letter: valid only if is_storm is true. 25737b6859fbSMintz, Yuval * 2574c965db44STomer Tayar */ 2575c965db44STomer Tayar static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn, 2576c965db44STomer Tayar u32 *dump_buf, 2577c965db44STomer Tayar bool dump, 2578c965db44STomer Tayar const char *name, 2579be086e7cSMintz, Yuval u32 addr, 2580be086e7cSMintz, Yuval u32 len, 2581c965db44STomer Tayar u32 bit_width, 2582c965db44STomer Tayar bool packed, 25832d22bc83SMichal Kalderon const char *mem_group, char storm_letter) 2584c965db44STomer Tayar { 2585c965db44STomer Tayar u8 num_params = 3; 2586c965db44STomer Tayar u32 offset = 0; 2587c965db44STomer Tayar char buf[64]; 2588c965db44STomer Tayar 2589be086e7cSMintz, Yuval if (!len) 2590c965db44STomer Tayar DP_NOTICE(p_hwfn, 2591c965db44STomer Tayar "Unexpected GRC Dump error: dumped memory size must be non-zero\n"); 25927b6859fbSMintz, Yuval 2593c965db44STomer Tayar if (bit_width) 2594c965db44STomer Tayar num_params++; 2595c965db44STomer Tayar if (packed) 2596c965db44STomer Tayar num_params++; 2597c965db44STomer Tayar 2598c965db44STomer Tayar /* Dump section header */ 2599c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 2600c965db44STomer Tayar dump, "grc_mem", num_params); 26017b6859fbSMintz, Yuval 2602c965db44STomer Tayar if (name) { 2603c965db44STomer Tayar /* Dump name */ 26042d22bc83SMichal Kalderon if (storm_letter) { 2605c965db44STomer Tayar strcpy(buf, "?STORM_"); 2606c965db44STomer Tayar buf[0] = storm_letter; 2607c965db44STomer Tayar strcpy(buf + strlen(buf), name); 2608c965db44STomer Tayar } else { 2609c965db44STomer Tayar strcpy(buf, name); 2610c965db44STomer Tayar } 2611c965db44STomer Tayar 2612c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 2613c965db44STomer Tayar dump, "name", buf); 2614c965db44STomer Tayar } else { 2615c965db44STomer Tayar /* Dump address */ 26167b6859fbSMintz, Yuval u32 addr_in_bytes = DWORDS_TO_BYTES(addr); 26177b6859fbSMintz, Yuval 2618c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 26197b6859fbSMintz, Yuval dump, "addr", addr_in_bytes); 2620c965db44STomer Tayar } 2621c965db44STomer Tayar 2622c965db44STomer Tayar /* Dump len */ 2623be086e7cSMintz, Yuval offset += qed_dump_num_param(dump_buf + offset, dump, "len", len); 2624c965db44STomer Tayar 2625c965db44STomer Tayar /* Dump bit width */ 2626c965db44STomer Tayar if (bit_width) 2627c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 2628c965db44STomer Tayar dump, "width", bit_width); 2629c965db44STomer Tayar 2630c965db44STomer Tayar /* Dump packed */ 2631c965db44STomer Tayar if (packed) 2632c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 2633c965db44STomer Tayar dump, "packed", 1); 2634c965db44STomer Tayar 2635c965db44STomer Tayar /* Dump reg type */ 26362d22bc83SMichal Kalderon if (storm_letter) { 2637c965db44STomer Tayar strcpy(buf, "?STORM_"); 2638c965db44STomer Tayar buf[0] = storm_letter; 2639c965db44STomer Tayar strcpy(buf + strlen(buf), mem_group); 2640c965db44STomer Tayar } else { 2641c965db44STomer Tayar strcpy(buf, mem_group); 2642c965db44STomer Tayar } 2643c965db44STomer Tayar 2644c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, dump, "type", buf); 26457b6859fbSMintz, Yuval 2646c965db44STomer Tayar return offset; 2647c965db44STomer Tayar } 2648c965db44STomer Tayar 2649c965db44STomer Tayar /* Dumps a single GRC memory. If name is NULL, the memory is stored by address. 2650c965db44STomer Tayar * Returns the dumped size in dwords. 26517b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 2652c965db44STomer Tayar */ 2653c965db44STomer Tayar static u32 qed_grc_dump_mem(struct qed_hwfn *p_hwfn, 2654c965db44STomer Tayar struct qed_ptt *p_ptt, 2655c965db44STomer Tayar u32 *dump_buf, 2656c965db44STomer Tayar bool dump, 2657c965db44STomer Tayar const char *name, 2658be086e7cSMintz, Yuval u32 addr, 2659be086e7cSMintz, Yuval u32 len, 26607b6859fbSMintz, Yuval bool wide_bus, 2661c965db44STomer Tayar u32 bit_width, 2662c965db44STomer Tayar bool packed, 26632d22bc83SMichal Kalderon const char *mem_group, char storm_letter) 2664c965db44STomer Tayar { 2665c965db44STomer Tayar u32 offset = 0; 2666c965db44STomer Tayar 2667c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 2668c965db44STomer Tayar dump_buf + offset, 2669c965db44STomer Tayar dump, 2670c965db44STomer Tayar name, 2671be086e7cSMintz, Yuval addr, 2672be086e7cSMintz, Yuval len, 2673c965db44STomer Tayar bit_width, 26742d22bc83SMichal Kalderon packed, mem_group, storm_letter); 2675be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 2676be086e7cSMintz, Yuval p_ptt, 26777b6859fbSMintz, Yuval dump_buf + offset, 2678d52c89f1SMichal Kalderon dump, addr, len, wide_bus, 2679d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 26807b6859fbSMintz, Yuval 2681c965db44STomer Tayar return offset; 2682c965db44STomer Tayar } 2683c965db44STomer Tayar 2684c965db44STomer Tayar /* Dumps GRC memories entries. Returns the dumped size in dwords. */ 2685c965db44STomer Tayar static u32 qed_grc_dump_mem_entries(struct qed_hwfn *p_hwfn, 2686c965db44STomer Tayar struct qed_ptt *p_ptt, 26872d22bc83SMichal Kalderon struct virt_mem_desc input_mems_arr, 2688c965db44STomer Tayar u32 *dump_buf, bool dump) 2689c965db44STomer Tayar { 2690c965db44STomer Tayar u32 i, offset = 0, input_offset = 0; 2691c965db44STomer Tayar bool mode_match = true; 2692c965db44STomer Tayar 26932d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(input_mems_arr.size)) { 2694c965db44STomer Tayar const struct dbg_dump_cond_hdr *cond_hdr; 26957b6859fbSMintz, Yuval u16 modes_buf_offset; 2696c965db44STomer Tayar u32 num_entries; 2697c965db44STomer Tayar bool eval_mode; 2698c965db44STomer Tayar 26992d22bc83SMichal Kalderon cond_hdr = 27002d22bc83SMichal Kalderon (const struct dbg_dump_cond_hdr *)input_mems_arr.ptr + 27012d22bc83SMichal Kalderon input_offset++; 27027b6859fbSMintz, Yuval num_entries = cond_hdr->data_size / MEM_DUMP_ENTRY_SIZE_DWORDS; 2703c965db44STomer Tayar 2704c965db44STomer Tayar /* Check required mode */ 27057b6859fbSMintz, Yuval eval_mode = GET_FIELD(cond_hdr->mode.data, 27067b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 2707c965db44STomer Tayar if (eval_mode) { 27087b6859fbSMintz, Yuval modes_buf_offset = 2709c965db44STomer Tayar GET_FIELD(cond_hdr->mode.data, 2710c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 2711c965db44STomer Tayar mode_match = qed_is_mode_match(p_hwfn, 2712c965db44STomer Tayar &modes_buf_offset); 2713c965db44STomer Tayar } 2714c965db44STomer Tayar 2715c965db44STomer Tayar if (!mode_match) { 2716c965db44STomer Tayar input_offset += cond_hdr->data_size; 2717c965db44STomer Tayar continue; 2718c965db44STomer Tayar } 2719c965db44STomer Tayar 2720c965db44STomer Tayar for (i = 0; i < num_entries; 2721c965db44STomer Tayar i++, input_offset += MEM_DUMP_ENTRY_SIZE_DWORDS) { 2722c965db44STomer Tayar const struct dbg_dump_mem *mem = 27232d22bc83SMichal Kalderon (const struct dbg_dump_mem *)((u32 *) 27242d22bc83SMichal Kalderon input_mems_arr.ptr 27252d22bc83SMichal Kalderon + input_offset); 27262d22bc83SMichal Kalderon const struct dbg_block *block; 27272d22bc83SMichal Kalderon char storm_letter = 0; 27287b6859fbSMintz, Yuval u32 mem_addr, mem_len; 27292d22bc83SMichal Kalderon bool mem_wide_bus; 27302d22bc83SMichal Kalderon u8 mem_group_id; 27317b6859fbSMintz, Yuval 27322d22bc83SMichal Kalderon mem_group_id = GET_FIELD(mem->dword0, 27332d22bc83SMichal Kalderon DBG_DUMP_MEM_MEM_GROUP_ID); 2734c965db44STomer Tayar if (mem_group_id >= MEM_GROUPS_NUM) { 2735c965db44STomer Tayar DP_NOTICE(p_hwfn, "Invalid mem_group_id\n"); 2736c965db44STomer Tayar return 0; 2737c965db44STomer Tayar } 2738c965db44STomer Tayar 27397b6859fbSMintz, Yuval if (!qed_grc_is_mem_included(p_hwfn, 27402d22bc83SMichal Kalderon (enum block_id) 27412d22bc83SMichal Kalderon cond_hdr->block_id, 27427b6859fbSMintz, Yuval mem_group_id)) 27437b6859fbSMintz, Yuval continue; 27447b6859fbSMintz, Yuval 27457b6859fbSMintz, Yuval mem_addr = GET_FIELD(mem->dword0, DBG_DUMP_MEM_ADDRESS); 27467b6859fbSMintz, Yuval mem_len = GET_FIELD(mem->dword1, DBG_DUMP_MEM_LENGTH); 27477b6859fbSMintz, Yuval mem_wide_bus = GET_FIELD(mem->dword1, 27487b6859fbSMintz, Yuval DBG_DUMP_MEM_WIDE_BUS); 2749c965db44STomer Tayar 27502d22bc83SMichal Kalderon block = get_dbg_block(p_hwfn, 27512d22bc83SMichal Kalderon cond_hdr->block_id); 27522d22bc83SMichal Kalderon 27532d22bc83SMichal Kalderon /* If memory is associated with Storm, 27542d22bc83SMichal Kalderon * update storm details 2755c965db44STomer Tayar */ 27562d22bc83SMichal Kalderon if (block->associated_storm_letter) 27572d22bc83SMichal Kalderon storm_letter = block->associated_storm_letter; 2758c965db44STomer Tayar 2759c965db44STomer Tayar /* Dump memory */ 27607b6859fbSMintz, Yuval offset += qed_grc_dump_mem(p_hwfn, 27617b6859fbSMintz, Yuval p_ptt, 27627b6859fbSMintz, Yuval dump_buf + offset, 27637b6859fbSMintz, Yuval dump, 27647b6859fbSMintz, Yuval NULL, 27657b6859fbSMintz, Yuval mem_addr, 27667b6859fbSMintz, Yuval mem_len, 27677b6859fbSMintz, Yuval mem_wide_bus, 27687b6859fbSMintz, Yuval 0, 2769c965db44STomer Tayar false, 2770c965db44STomer Tayar s_mem_group_names[mem_group_id], 27717b6859fbSMintz, Yuval storm_letter); 2772c965db44STomer Tayar } 2773c965db44STomer Tayar } 2774c965db44STomer Tayar 2775c965db44STomer Tayar return offset; 2776c965db44STomer Tayar } 2777c965db44STomer Tayar 2778c965db44STomer Tayar /* Dumps GRC memories according to the input array dump_mem. 2779c965db44STomer Tayar * Returns the dumped size in dwords. 2780c965db44STomer Tayar */ 2781c965db44STomer Tayar static u32 qed_grc_dump_memories(struct qed_hwfn *p_hwfn, 2782c965db44STomer Tayar struct qed_ptt *p_ptt, 2783c965db44STomer Tayar u32 *dump_buf, bool dump) 2784c965db44STomer Tayar { 27852d22bc83SMichal Kalderon struct virt_mem_desc *dbg_buf = 27862d22bc83SMichal Kalderon &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM]; 2787c965db44STomer Tayar u32 offset = 0, input_offset = 0; 2788c965db44STomer Tayar 27892d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) { 27907b6859fbSMintz, Yuval const struct dbg_dump_split_hdr *split_hdr; 27912d22bc83SMichal Kalderon struct virt_mem_desc curr_input_mems_arr; 2792d52c89f1SMichal Kalderon enum init_split_types split_type; 27937b6859fbSMintz, Yuval u32 split_data_size; 27947b6859fbSMintz, Yuval 27952d22bc83SMichal Kalderon split_hdr = 27962d22bc83SMichal Kalderon (const struct dbg_dump_split_hdr *)dbg_buf->ptr + 27972d22bc83SMichal Kalderon input_offset++; 27982d22bc83SMichal Kalderon split_type = GET_FIELD(split_hdr->hdr, 2799c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID); 28002d22bc83SMichal Kalderon split_data_size = GET_FIELD(split_hdr->hdr, 2801c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_DATA_SIZE); 28022d22bc83SMichal Kalderon curr_input_mems_arr.ptr = (u32 *)dbg_buf->ptr + input_offset; 28032d22bc83SMichal Kalderon curr_input_mems_arr.size = DWORDS_TO_BYTES(split_data_size); 2804c965db44STomer Tayar 2805d52c89f1SMichal Kalderon if (split_type == SPLIT_TYPE_NONE) 2806c965db44STomer Tayar offset += qed_grc_dump_mem_entries(p_hwfn, 2807c965db44STomer Tayar p_ptt, 2808c965db44STomer Tayar curr_input_mems_arr, 2809c965db44STomer Tayar dump_buf + offset, 2810c965db44STomer Tayar dump); 2811d52c89f1SMichal Kalderon else 2812c965db44STomer Tayar DP_NOTICE(p_hwfn, 2813c965db44STomer Tayar "Dumping split memories is currently not supported\n"); 2814c965db44STomer Tayar 2815c965db44STomer Tayar input_offset += split_data_size; 2816c965db44STomer Tayar } 2817c965db44STomer Tayar 2818c965db44STomer Tayar return offset; 2819c965db44STomer Tayar } 2820c965db44STomer Tayar 2821c965db44STomer Tayar /* Dumps GRC context data for the specified Storm. 2822c965db44STomer Tayar * Returns the dumped size in dwords. 28237b6859fbSMintz, Yuval * The lid_size argument is specified in quad-regs. 2824c965db44STomer Tayar */ 2825c965db44STomer Tayar static u32 qed_grc_dump_ctx_data(struct qed_hwfn *p_hwfn, 2826c965db44STomer Tayar struct qed_ptt *p_ptt, 2827c965db44STomer Tayar u32 *dump_buf, 2828c965db44STomer Tayar bool dump, 2829c965db44STomer Tayar const char *name, 2830c965db44STomer Tayar u32 num_lids, 28312d22bc83SMichal Kalderon enum cm_ctx_types ctx_type, u8 storm_id) 2832c965db44STomer Tayar { 28332d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 28347b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 28352d22bc83SMichal Kalderon u32 i, lid, lid_size, total_size; 28362d22bc83SMichal Kalderon u32 rd_reg_addr, offset = 0; 28372d22bc83SMichal Kalderon 28382d22bc83SMichal Kalderon /* Convert quad-regs to dwords */ 28392d22bc83SMichal Kalderon lid_size = storm->cm_ctx_lid_sizes[dev_data->chip_id][ctx_type] * 4; 2840c965db44STomer Tayar 2841c965db44STomer Tayar if (!lid_size) 2842c965db44STomer Tayar return 0; 28437b6859fbSMintz, Yuval 2844c965db44STomer Tayar total_size = num_lids * lid_size; 28457b6859fbSMintz, Yuval 2846c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 2847c965db44STomer Tayar dump_buf + offset, 2848c965db44STomer Tayar dump, 2849c965db44STomer Tayar name, 2850c965db44STomer Tayar 0, 2851c965db44STomer Tayar total_size, 2852c965db44STomer Tayar lid_size * 32, 28532d22bc83SMichal Kalderon false, name, storm->letter); 28547b6859fbSMintz, Yuval 28557b6859fbSMintz, Yuval if (!dump) 28567b6859fbSMintz, Yuval return offset + total_size; 2857c965db44STomer Tayar 28582d22bc83SMichal Kalderon rd_reg_addr = BYTES_TO_DWORDS(storm->cm_ctx_rd_addr[ctx_type]); 28592d22bc83SMichal Kalderon 2860c965db44STomer Tayar /* Dump context data */ 2861c965db44STomer Tayar for (lid = 0; lid < num_lids; lid++) { 28622d22bc83SMichal Kalderon for (i = 0; i < lid_size; i++) { 2863c965db44STomer Tayar qed_wr(p_hwfn, 28647b6859fbSMintz, Yuval p_ptt, storm->cm_ctx_wr_addr, (i << 9) | lid); 28652d22bc83SMichal Kalderon offset += qed_grc_dump_addr_range(p_hwfn, 28662d22bc83SMichal Kalderon p_ptt, 28672d22bc83SMichal Kalderon dump_buf + offset, 28682d22bc83SMichal Kalderon dump, 28692d22bc83SMichal Kalderon rd_reg_addr, 28702d22bc83SMichal Kalderon 1, 28712d22bc83SMichal Kalderon false, 28722d22bc83SMichal Kalderon SPLIT_TYPE_NONE, 0); 2873c965db44STomer Tayar } 2874c965db44STomer Tayar } 2875c965db44STomer Tayar 2876c965db44STomer Tayar return offset; 2877c965db44STomer Tayar } 2878c965db44STomer Tayar 2879c965db44STomer Tayar /* Dumps GRC contexts. Returns the dumped size in dwords. */ 2880c965db44STomer Tayar static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn, 2881c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 2882c965db44STomer Tayar { 2883c965db44STomer Tayar u32 offset = 0; 2884c965db44STomer Tayar u8 storm_id; 2885c965db44STomer Tayar 2886c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 2887c965db44STomer Tayar if (!qed_grc_is_storm_included(p_hwfn, 2888c965db44STomer Tayar (enum dbg_storms)storm_id)) 2889c965db44STomer Tayar continue; 2890c965db44STomer Tayar 2891c965db44STomer Tayar /* Dump Conn AG context size */ 28922d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2893c965db44STomer Tayar p_ptt, 2894c965db44STomer Tayar dump_buf + offset, 2895c965db44STomer Tayar dump, 2896c965db44STomer Tayar "CONN_AG_CTX", 28972d22bc83SMichal Kalderon NUM_OF_LCIDS, 28982d22bc83SMichal Kalderon CM_CTX_CONN_AG, storm_id); 2899c965db44STomer Tayar 2900c965db44STomer Tayar /* Dump Conn ST context size */ 29012d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2902c965db44STomer Tayar p_ptt, 2903c965db44STomer Tayar dump_buf + offset, 2904c965db44STomer Tayar dump, 2905c965db44STomer Tayar "CONN_ST_CTX", 29062d22bc83SMichal Kalderon NUM_OF_LCIDS, 29072d22bc83SMichal Kalderon CM_CTX_CONN_ST, storm_id); 2908c965db44STomer Tayar 2909c965db44STomer Tayar /* Dump Task AG context size */ 29102d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2911c965db44STomer Tayar p_ptt, 2912c965db44STomer Tayar dump_buf + offset, 2913c965db44STomer Tayar dump, 2914c965db44STomer Tayar "TASK_AG_CTX", 29152d22bc83SMichal Kalderon NUM_OF_LTIDS, 29162d22bc83SMichal Kalderon CM_CTX_TASK_AG, storm_id); 2917c965db44STomer Tayar 2918c965db44STomer Tayar /* Dump Task ST context size */ 29192d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2920c965db44STomer Tayar p_ptt, 2921c965db44STomer Tayar dump_buf + offset, 2922c965db44STomer Tayar dump, 2923c965db44STomer Tayar "TASK_ST_CTX", 29242d22bc83SMichal Kalderon NUM_OF_LTIDS, 29252d22bc83SMichal Kalderon CM_CTX_TASK_ST, storm_id); 2926c965db44STomer Tayar } 2927c965db44STomer Tayar 2928c965db44STomer Tayar return offset; 2929c965db44STomer Tayar } 2930c965db44STomer Tayar 29312d22bc83SMichal Kalderon #define VFC_STATUS_RESP_READY_BIT 0 29322d22bc83SMichal Kalderon #define VFC_STATUS_BUSY_BIT 1 29332d22bc83SMichal Kalderon #define VFC_STATUS_SENDING_CMD_BIT 2 29342d22bc83SMichal Kalderon 29352d22bc83SMichal Kalderon #define VFC_POLLING_DELAY_MS 1 29362d22bc83SMichal Kalderon #define VFC_POLLING_COUNT 20 29372d22bc83SMichal Kalderon 29382d22bc83SMichal Kalderon /* Reads data from VFC. Returns the number of dwords read (0 on error). 29392d22bc83SMichal Kalderon * Sizes are specified in dwords. 29402d22bc83SMichal Kalderon */ 29412d22bc83SMichal Kalderon static u32 qed_grc_dump_read_from_vfc(struct qed_hwfn *p_hwfn, 29422d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 29432d22bc83SMichal Kalderon struct storm_defs *storm, 29442d22bc83SMichal Kalderon u32 *cmd_data, 29452d22bc83SMichal Kalderon u32 cmd_size, 29462d22bc83SMichal Kalderon u32 *addr_data, 29472d22bc83SMichal Kalderon u32 addr_size, 29482d22bc83SMichal Kalderon u32 resp_size, u32 *dump_buf) 2949c965db44STomer Tayar { 29502d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 29512d22bc83SMichal Kalderon u32 vfc_status, polling_ms, polling_count = 0, i; 29522d22bc83SMichal Kalderon u32 reg_addr, sem_base; 29532d22bc83SMichal Kalderon bool is_ready = false; 2954c965db44STomer Tayar 29552d22bc83SMichal Kalderon sem_base = storm->sem_fast_mem_addr; 29562d22bc83SMichal Kalderon polling_ms = VFC_POLLING_DELAY_MS * 29572d22bc83SMichal Kalderon s_hw_type_defs[dev_data->hw_type].delay_factor; 2958c965db44STomer Tayar 29592d22bc83SMichal Kalderon /* Write VFC command */ 29602d22bc83SMichal Kalderon ARR_REG_WR(p_hwfn, 2961c965db44STomer Tayar p_ptt, 29622d22bc83SMichal Kalderon sem_base + SEM_FAST_REG_VFC_DATA_WR, 29632d22bc83SMichal Kalderon cmd_data, cmd_size); 29642d22bc83SMichal Kalderon 29652d22bc83SMichal Kalderon /* Write VFC address */ 29662d22bc83SMichal Kalderon ARR_REG_WR(p_hwfn, 29672d22bc83SMichal Kalderon p_ptt, 29682d22bc83SMichal Kalderon sem_base + SEM_FAST_REG_VFC_ADDR, 29692d22bc83SMichal Kalderon addr_data, addr_size); 29702d22bc83SMichal Kalderon 29712d22bc83SMichal Kalderon /* Read response */ 29722d22bc83SMichal Kalderon for (i = 0; i < resp_size; i++) { 29732d22bc83SMichal Kalderon /* Poll until ready */ 29742d22bc83SMichal Kalderon do { 29752d22bc83SMichal Kalderon reg_addr = sem_base + SEM_FAST_REG_VFC_STATUS; 29762d22bc83SMichal Kalderon qed_grc_dump_addr_range(p_hwfn, 29772d22bc83SMichal Kalderon p_ptt, 29782d22bc83SMichal Kalderon &vfc_status, 2979c965db44STomer Tayar true, 29802d22bc83SMichal Kalderon BYTES_TO_DWORDS(reg_addr), 29812d22bc83SMichal Kalderon 1, 29822d22bc83SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 29832d22bc83SMichal Kalderon is_ready = vfc_status & BIT(VFC_STATUS_RESP_READY_BIT); 29842d22bc83SMichal Kalderon 29852d22bc83SMichal Kalderon if (!is_ready) { 29862d22bc83SMichal Kalderon if (polling_count++ == VFC_POLLING_COUNT) 29872d22bc83SMichal Kalderon return 0; 29882d22bc83SMichal Kalderon 29892d22bc83SMichal Kalderon msleep(polling_ms); 2990c965db44STomer Tayar } 29912d22bc83SMichal Kalderon } while (!is_ready); 29922d22bc83SMichal Kalderon 29932d22bc83SMichal Kalderon reg_addr = sem_base + SEM_FAST_REG_VFC_DATA_RD; 29942d22bc83SMichal Kalderon qed_grc_dump_addr_range(p_hwfn, 29952d22bc83SMichal Kalderon p_ptt, 29962d22bc83SMichal Kalderon dump_buf + i, 29972d22bc83SMichal Kalderon true, 29982d22bc83SMichal Kalderon BYTES_TO_DWORDS(reg_addr), 29992d22bc83SMichal Kalderon 1, false, SPLIT_TYPE_NONE, 0); 3000c965db44STomer Tayar } 3001c965db44STomer Tayar 30022d22bc83SMichal Kalderon return resp_size; 3003c965db44STomer Tayar } 3004c965db44STomer Tayar 3005c965db44STomer Tayar /* Dump VFC CAM. Returns the dumped size in dwords. */ 3006c965db44STomer Tayar static u32 qed_grc_dump_vfc_cam(struct qed_hwfn *p_hwfn, 3007c965db44STomer Tayar struct qed_ptt *p_ptt, 3008c965db44STomer Tayar u32 *dump_buf, bool dump, u8 storm_id) 3009c965db44STomer Tayar { 3010c965db44STomer Tayar u32 total_size = VFC_CAM_NUM_ROWS * VFC_CAM_RESP_DWORDS; 30117b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 3012c965db44STomer Tayar u32 cam_addr[VFC_CAM_ADDR_DWORDS] = { 0 }; 3013c965db44STomer Tayar u32 cam_cmd[VFC_CAM_CMD_DWORDS] = { 0 }; 30142d22bc83SMichal Kalderon u32 row, offset = 0; 3015c965db44STomer Tayar 3016c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3017c965db44STomer Tayar dump_buf + offset, 3018c965db44STomer Tayar dump, 3019c965db44STomer Tayar "vfc_cam", 3020c965db44STomer Tayar 0, 3021c965db44STomer Tayar total_size, 3022c965db44STomer Tayar 256, 30232d22bc83SMichal Kalderon false, "vfc_cam", storm->letter); 30247b6859fbSMintz, Yuval 30257b6859fbSMintz, Yuval if (!dump) 30267b6859fbSMintz, Yuval return offset + total_size; 30277b6859fbSMintz, Yuval 3028c965db44STomer Tayar /* Prepare CAM address */ 3029c965db44STomer Tayar SET_VAR_FIELD(cam_addr, VFC_CAM_ADDR, OP, VFC_OPCODE_CAM_RD); 30307b6859fbSMintz, Yuval 30312d22bc83SMichal Kalderon /* Read VFC CAM data */ 30322d22bc83SMichal Kalderon for (row = 0; row < VFC_CAM_NUM_ROWS; row++) { 3033c965db44STomer Tayar SET_VAR_FIELD(cam_cmd, VFC_CAM_CMD, ROW, row); 30342d22bc83SMichal Kalderon offset += qed_grc_dump_read_from_vfc(p_hwfn, 3035c965db44STomer Tayar p_ptt, 30362d22bc83SMichal Kalderon storm, 30372d22bc83SMichal Kalderon cam_cmd, 30382d22bc83SMichal Kalderon VFC_CAM_CMD_DWORDS, 30392d22bc83SMichal Kalderon cam_addr, 30402d22bc83SMichal Kalderon VFC_CAM_ADDR_DWORDS, 30412d22bc83SMichal Kalderon VFC_CAM_RESP_DWORDS, 30422d22bc83SMichal Kalderon dump_buf + offset); 3043c965db44STomer Tayar } 3044c965db44STomer Tayar 3045c965db44STomer Tayar return offset; 3046c965db44STomer Tayar } 3047c965db44STomer Tayar 3048c965db44STomer Tayar /* Dump VFC RAM. Returns the dumped size in dwords. */ 3049c965db44STomer Tayar static u32 qed_grc_dump_vfc_ram(struct qed_hwfn *p_hwfn, 3050c965db44STomer Tayar struct qed_ptt *p_ptt, 3051c965db44STomer Tayar u32 *dump_buf, 3052c965db44STomer Tayar bool dump, 3053c965db44STomer Tayar u8 storm_id, struct vfc_ram_defs *ram_defs) 3054c965db44STomer Tayar { 3055c965db44STomer Tayar u32 total_size = ram_defs->num_rows * VFC_RAM_RESP_DWORDS; 30567b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 3057c965db44STomer Tayar u32 ram_addr[VFC_RAM_ADDR_DWORDS] = { 0 }; 3058c965db44STomer Tayar u32 ram_cmd[VFC_RAM_CMD_DWORDS] = { 0 }; 30592d22bc83SMichal Kalderon u32 row, offset = 0; 3060c965db44STomer Tayar 3061c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3062c965db44STomer Tayar dump_buf + offset, 3063c965db44STomer Tayar dump, 3064c965db44STomer Tayar ram_defs->mem_name, 3065c965db44STomer Tayar 0, 3066c965db44STomer Tayar total_size, 3067c965db44STomer Tayar 256, 3068c965db44STomer Tayar false, 3069c965db44STomer Tayar ram_defs->type_name, 30702d22bc83SMichal Kalderon storm->letter); 3071c965db44STomer Tayar 3072c965db44STomer Tayar if (!dump) 3073c965db44STomer Tayar return offset + total_size; 3074c965db44STomer Tayar 30752d22bc83SMichal Kalderon /* Prepare RAM address */ 30762d22bc83SMichal Kalderon SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, OP, VFC_OPCODE_RAM_RD); 30772d22bc83SMichal Kalderon 30782d22bc83SMichal Kalderon /* Read VFC RAM data */ 3079c965db44STomer Tayar for (row = ram_defs->base_row; 30802d22bc83SMichal Kalderon row < ram_defs->base_row + ram_defs->num_rows; row++) { 3081c965db44STomer Tayar SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, ROW, row); 30822d22bc83SMichal Kalderon offset += qed_grc_dump_read_from_vfc(p_hwfn, 3083c965db44STomer Tayar p_ptt, 30842d22bc83SMichal Kalderon storm, 30852d22bc83SMichal Kalderon ram_cmd, 30862d22bc83SMichal Kalderon VFC_RAM_CMD_DWORDS, 30872d22bc83SMichal Kalderon ram_addr, 30882d22bc83SMichal Kalderon VFC_RAM_ADDR_DWORDS, 30892d22bc83SMichal Kalderon VFC_RAM_RESP_DWORDS, 30902d22bc83SMichal Kalderon dump_buf + offset); 3091c965db44STomer Tayar } 3092c965db44STomer Tayar 3093c965db44STomer Tayar return offset; 3094c965db44STomer Tayar } 3095c965db44STomer Tayar 3096c965db44STomer Tayar /* Dumps GRC VFC data. Returns the dumped size in dwords. */ 3097c965db44STomer Tayar static u32 qed_grc_dump_vfc(struct qed_hwfn *p_hwfn, 3098c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3099c965db44STomer Tayar { 3100c965db44STomer Tayar u8 storm_id, i; 3101c965db44STomer Tayar u32 offset = 0; 3102c965db44STomer Tayar 3103c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 31047b6859fbSMintz, Yuval if (!qed_grc_is_storm_included(p_hwfn, 31057b6859fbSMintz, Yuval (enum dbg_storms)storm_id) || 31062d22bc83SMichal Kalderon !s_storm_defs[storm_id].has_vfc) 31077b6859fbSMintz, Yuval continue; 31087b6859fbSMintz, Yuval 3109c965db44STomer Tayar /* Read CAM */ 3110c965db44STomer Tayar offset += qed_grc_dump_vfc_cam(p_hwfn, 3111c965db44STomer Tayar p_ptt, 3112c965db44STomer Tayar dump_buf + offset, 3113c965db44STomer Tayar dump, storm_id); 3114c965db44STomer Tayar 3115c965db44STomer Tayar /* Read RAM */ 3116c965db44STomer Tayar for (i = 0; i < NUM_VFC_RAM_TYPES; i++) 3117c965db44STomer Tayar offset += qed_grc_dump_vfc_ram(p_hwfn, 3118c965db44STomer Tayar p_ptt, 31197b6859fbSMintz, Yuval dump_buf + offset, 3120c965db44STomer Tayar dump, 3121c965db44STomer Tayar storm_id, 31227b6859fbSMintz, Yuval &s_vfc_ram_defs[i]); 3123c965db44STomer Tayar } 3124c965db44STomer Tayar 3125c965db44STomer Tayar return offset; 3126c965db44STomer Tayar } 3127c965db44STomer Tayar 3128c965db44STomer Tayar /* Dumps GRC RSS data. Returns the dumped size in dwords. */ 3129c965db44STomer Tayar static u32 qed_grc_dump_rss(struct qed_hwfn *p_hwfn, 3130c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3131c965db44STomer Tayar { 3132c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 3133c965db44STomer Tayar u32 offset = 0; 3134c965db44STomer Tayar u8 rss_mem_id; 3135c965db44STomer Tayar 3136c965db44STomer Tayar for (rss_mem_id = 0; rss_mem_id < NUM_RSS_MEM_TYPES; rss_mem_id++) { 3137da090917STomer Tayar u32 rss_addr, num_entries, total_dwords; 31387b6859fbSMintz, Yuval struct rss_mem_defs *rss_defs; 3139da090917STomer Tayar u32 addr, num_dwords_to_read; 31407b6859fbSMintz, Yuval bool packed; 31417b6859fbSMintz, Yuval 31427b6859fbSMintz, Yuval rss_defs = &s_rss_mem_defs[rss_mem_id]; 31437b6859fbSMintz, Yuval rss_addr = rss_defs->addr; 31447b6859fbSMintz, Yuval num_entries = rss_defs->num_entries[dev_data->chip_id]; 3145da090917STomer Tayar total_dwords = (num_entries * rss_defs->entry_width) / 32; 3146da090917STomer Tayar packed = (rss_defs->entry_width == 16); 3147c965db44STomer Tayar 3148c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3149c965db44STomer Tayar dump_buf + offset, 3150c965db44STomer Tayar dump, 3151c965db44STomer Tayar rss_defs->mem_name, 3152be086e7cSMintz, Yuval 0, 3153be086e7cSMintz, Yuval total_dwords, 3154da090917STomer Tayar rss_defs->entry_width, 3155c965db44STomer Tayar packed, 31562d22bc83SMichal Kalderon rss_defs->type_name, 0); 3157c965db44STomer Tayar 31587b6859fbSMintz, Yuval /* Dump RSS data */ 3159c965db44STomer Tayar if (!dump) { 3160be086e7cSMintz, Yuval offset += total_dwords; 3161c965db44STomer Tayar continue; 3162c965db44STomer Tayar } 3163c965db44STomer Tayar 3164be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(RSS_REG_RSS_RAM_DATA); 3165da090917STomer Tayar while (total_dwords) { 3166da090917STomer Tayar num_dwords_to_read = min_t(u32, 3167da090917STomer Tayar RSS_REG_RSS_RAM_DATA_SIZE, 3168da090917STomer Tayar total_dwords); 3169be086e7cSMintz, Yuval qed_wr(p_hwfn, p_ptt, RSS_REG_RSS_RAM_ADDR, rss_addr); 3170be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3171be086e7cSMintz, Yuval p_ptt, 31727b6859fbSMintz, Yuval dump_buf + offset, 3173be086e7cSMintz, Yuval dump, 3174be086e7cSMintz, Yuval addr, 3175da090917STomer Tayar num_dwords_to_read, 3176d52c89f1SMichal Kalderon false, 3177d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 3178da090917STomer Tayar total_dwords -= num_dwords_to_read; 3179da090917STomer Tayar rss_addr++; 3180c965db44STomer Tayar } 3181c965db44STomer Tayar } 3182c965db44STomer Tayar 3183c965db44STomer Tayar return offset; 3184c965db44STomer Tayar } 3185c965db44STomer Tayar 3186c965db44STomer Tayar /* Dumps GRC Big RAM. Returns the dumped size in dwords. */ 3187c965db44STomer Tayar static u32 qed_grc_dump_big_ram(struct qed_hwfn *p_hwfn, 3188c965db44STomer Tayar struct qed_ptt *p_ptt, 3189c965db44STomer Tayar u32 *dump_buf, bool dump, u8 big_ram_id) 3190c965db44STomer Tayar { 3191c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 3192da090917STomer Tayar u32 block_size, ram_size, offset = 0, reg_val, i; 3193c965db44STomer Tayar char mem_name[12] = "???_BIG_RAM"; 3194c965db44STomer Tayar char type_name[8] = "???_RAM"; 3195be086e7cSMintz, Yuval struct big_ram_defs *big_ram; 3196c965db44STomer Tayar 3197be086e7cSMintz, Yuval big_ram = &s_big_ram_defs[big_ram_id]; 3198da090917STomer Tayar ram_size = big_ram->ram_size[dev_data->chip_id]; 3199da090917STomer Tayar 3200da090917STomer Tayar reg_val = qed_rd(p_hwfn, p_ptt, big_ram->is_256b_reg_addr); 3201da090917STomer Tayar block_size = reg_val & 3202da090917STomer Tayar BIT(big_ram->is_256b_bit_offset[dev_data->chip_id]) ? 256 3203da090917STomer Tayar : 128; 3204c965db44STomer Tayar 3205c7d852e3SDenis Bolotin strncpy(type_name, big_ram->instance_name, BIG_RAM_NAME_LEN); 3206c7d852e3SDenis Bolotin strncpy(mem_name, big_ram->instance_name, BIG_RAM_NAME_LEN); 3207c965db44STomer Tayar 3208c965db44STomer Tayar /* Dump memory header */ 3209c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3210c965db44STomer Tayar dump_buf + offset, 3211c965db44STomer Tayar dump, 3212c965db44STomer Tayar mem_name, 3213c965db44STomer Tayar 0, 3214c965db44STomer Tayar ram_size, 3215da090917STomer Tayar block_size * 8, 32162d22bc83SMichal Kalderon false, type_name, 0); 3217c965db44STomer Tayar 32187b6859fbSMintz, Yuval /* Read and dump Big RAM data */ 3219c965db44STomer Tayar if (!dump) 3220c965db44STomer Tayar return offset + ram_size; 3221c965db44STomer Tayar 32227b6859fbSMintz, Yuval /* Dump Big RAM */ 3223da090917STomer Tayar for (i = 0; i < DIV_ROUND_UP(ram_size, BRB_REG_BIG_RAM_DATA_SIZE); 3224da090917STomer Tayar i++) { 3225be086e7cSMintz, Yuval u32 addr, len; 3226be086e7cSMintz, Yuval 3227be086e7cSMintz, Yuval qed_wr(p_hwfn, p_ptt, big_ram->addr_reg_addr, i); 3228be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(big_ram->data_reg_addr); 3229da090917STomer Tayar len = BRB_REG_BIG_RAM_DATA_SIZE; 3230be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3231be086e7cSMintz, Yuval p_ptt, 3232be086e7cSMintz, Yuval dump_buf + offset, 3233be086e7cSMintz, Yuval dump, 3234be086e7cSMintz, Yuval addr, 32357b6859fbSMintz, Yuval len, 3236d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 3237c965db44STomer Tayar } 3238c965db44STomer Tayar 3239c965db44STomer Tayar return offset; 3240c965db44STomer Tayar } 3241c965db44STomer Tayar 32422d22bc83SMichal Kalderon /* Dumps MCP scratchpad. Returns the dumped size in dwords. */ 3243c965db44STomer Tayar static u32 qed_grc_dump_mcp(struct qed_hwfn *p_hwfn, 3244c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3245c965db44STomer Tayar { 3246c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID] = { 0 }; 3247be086e7cSMintz, Yuval u32 offset = 0, addr; 3248c965db44STomer Tayar bool halted = false; 3249c965db44STomer Tayar 3250c965db44STomer Tayar /* Halt MCP */ 3251be086e7cSMintz, Yuval if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) { 3252c965db44STomer Tayar halted = !qed_mcp_halt(p_hwfn, p_ptt); 3253c965db44STomer Tayar if (!halted) 3254c965db44STomer Tayar DP_NOTICE(p_hwfn, "MCP halt failed!\n"); 3255c965db44STomer Tayar } 3256c965db44STomer Tayar 3257c965db44STomer Tayar /* Dump MCP scratchpad */ 3258c965db44STomer Tayar offset += qed_grc_dump_mem(p_hwfn, 3259c965db44STomer Tayar p_ptt, 3260c965db44STomer Tayar dump_buf + offset, 3261c965db44STomer Tayar dump, 3262c965db44STomer Tayar NULL, 3263be086e7cSMintz, Yuval BYTES_TO_DWORDS(MCP_REG_SCRATCH), 32642d22bc83SMichal Kalderon MCP_REG_SCRATCH_SIZE, 32652d22bc83SMichal Kalderon false, 0, false, "MCP", 0); 3266c965db44STomer Tayar 3267c965db44STomer Tayar /* Dump MCP cpu_reg_file */ 3268c965db44STomer Tayar offset += qed_grc_dump_mem(p_hwfn, 3269c965db44STomer Tayar p_ptt, 3270c965db44STomer Tayar dump_buf + offset, 3271c965db44STomer Tayar dump, 3272c965db44STomer Tayar NULL, 3273be086e7cSMintz, Yuval BYTES_TO_DWORDS(MCP_REG_CPU_REG_FILE), 3274c965db44STomer Tayar MCP_REG_CPU_REG_FILE_SIZE, 32752d22bc83SMichal Kalderon false, 0, false, "MCP", 0); 3276c965db44STomer Tayar 3277c965db44STomer Tayar /* Dump MCP registers */ 3278c965db44STomer Tayar block_enable[BLOCK_MCP] = true; 3279c965db44STomer Tayar offset += qed_grc_dump_registers(p_hwfn, 3280c965db44STomer Tayar p_ptt, 3281c965db44STomer Tayar dump_buf + offset, 32822d22bc83SMichal Kalderon dump, block_enable, "MCP"); 3283c965db44STomer Tayar 3284c965db44STomer Tayar /* Dump required non-MCP registers */ 3285c965db44STomer Tayar offset += qed_grc_dump_regs_hdr(dump_buf + offset, 3286d52c89f1SMichal Kalderon dump, 1, SPLIT_TYPE_NONE, 0, 32872d22bc83SMichal Kalderon "MCP"); 3288be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(MISC_REG_SHARED_MEM_ADDR); 3289c965db44STomer Tayar offset += qed_grc_dump_reg_entry(p_hwfn, 3290c965db44STomer Tayar p_ptt, 3291c965db44STomer Tayar dump_buf + offset, 3292c965db44STomer Tayar dump, 3293be086e7cSMintz, Yuval addr, 32947b6859fbSMintz, Yuval 1, 3295d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 3296c965db44STomer Tayar 3297c965db44STomer Tayar /* Release MCP */ 3298c965db44STomer Tayar if (halted && qed_mcp_resume(p_hwfn, p_ptt)) 3299c965db44STomer Tayar DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n"); 33007b6859fbSMintz, Yuval 3301c965db44STomer Tayar return offset; 3302c965db44STomer Tayar } 3303c965db44STomer Tayar 33042d22bc83SMichal Kalderon /* Dumps the tbus indirect memory for all PHYs. 33052d22bc83SMichal Kalderon * Returns the dumped size in dwords. 33062d22bc83SMichal Kalderon */ 3307c965db44STomer Tayar static u32 qed_grc_dump_phy(struct qed_hwfn *p_hwfn, 3308c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3309c965db44STomer Tayar { 3310c965db44STomer Tayar u32 offset = 0, tbus_lo_offset, tbus_hi_offset; 3311c965db44STomer Tayar char mem_name[32]; 3312c965db44STomer Tayar u8 phy_id; 3313c965db44STomer Tayar 3314c965db44STomer Tayar for (phy_id = 0; phy_id < ARRAY_SIZE(s_phy_defs); phy_id++) { 33157b6859fbSMintz, Yuval u32 addr_lo_addr, addr_hi_addr, data_lo_addr, data_hi_addr; 33167b6859fbSMintz, Yuval struct phy_defs *phy_defs; 33177b6859fbSMintz, Yuval u8 *bytes_buf; 3318c965db44STomer Tayar 33197b6859fbSMintz, Yuval phy_defs = &s_phy_defs[phy_id]; 33207b6859fbSMintz, Yuval addr_lo_addr = phy_defs->base_addr + 33217b6859fbSMintz, Yuval phy_defs->tbus_addr_lo_addr; 33227b6859fbSMintz, Yuval addr_hi_addr = phy_defs->base_addr + 33237b6859fbSMintz, Yuval phy_defs->tbus_addr_hi_addr; 33247b6859fbSMintz, Yuval data_lo_addr = phy_defs->base_addr + 33257b6859fbSMintz, Yuval phy_defs->tbus_data_lo_addr; 33267b6859fbSMintz, Yuval data_hi_addr = phy_defs->base_addr + 33277b6859fbSMintz, Yuval phy_defs->tbus_data_hi_addr; 33287b6859fbSMintz, Yuval 33297b6859fbSMintz, Yuval if (snprintf(mem_name, sizeof(mem_name), "tbus_%s", 33307b6859fbSMintz, Yuval phy_defs->phy_name) < 0) 3331c965db44STomer Tayar DP_NOTICE(p_hwfn, 3332c965db44STomer Tayar "Unexpected debug error: invalid PHY memory name\n"); 33337b6859fbSMintz, Yuval 3334c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3335c965db44STomer Tayar dump_buf + offset, 3336c965db44STomer Tayar dump, 3337c965db44STomer Tayar mem_name, 3338c965db44STomer Tayar 0, 3339c965db44STomer Tayar PHY_DUMP_SIZE_DWORDS, 33402d22bc83SMichal Kalderon 16, true, mem_name, 0); 33417b6859fbSMintz, Yuval 33427b6859fbSMintz, Yuval if (!dump) { 33437b6859fbSMintz, Yuval offset += PHY_DUMP_SIZE_DWORDS; 33447b6859fbSMintz, Yuval continue; 33457b6859fbSMintz, Yuval } 3346c965db44STomer Tayar 3347da090917STomer Tayar bytes_buf = (u8 *)(dump_buf + offset); 3348c965db44STomer Tayar for (tbus_hi_offset = 0; 3349c965db44STomer Tayar tbus_hi_offset < (NUM_PHY_TBUS_ADDRESSES >> 8); 3350c965db44STomer Tayar tbus_hi_offset++) { 33517b6859fbSMintz, Yuval qed_wr(p_hwfn, p_ptt, addr_hi_addr, tbus_hi_offset); 3352c965db44STomer Tayar for (tbus_lo_offset = 0; tbus_lo_offset < 256; 3353c965db44STomer Tayar tbus_lo_offset++) { 3354c965db44STomer Tayar qed_wr(p_hwfn, 33557b6859fbSMintz, Yuval p_ptt, addr_lo_addr, tbus_lo_offset); 33567b6859fbSMintz, Yuval *(bytes_buf++) = (u8)qed_rd(p_hwfn, 3357c965db44STomer Tayar p_ptt, 3358c965db44STomer Tayar data_lo_addr); 33597b6859fbSMintz, Yuval *(bytes_buf++) = (u8)qed_rd(p_hwfn, 33607b6859fbSMintz, Yuval p_ptt, 3361c965db44STomer Tayar data_hi_addr); 3362c965db44STomer Tayar } 3363c965db44STomer Tayar } 3364c965db44STomer Tayar 3365c965db44STomer Tayar offset += PHY_DUMP_SIZE_DWORDS; 3366c965db44STomer Tayar } 3367c965db44STomer Tayar 3368c965db44STomer Tayar return offset; 3369c965db44STomer Tayar } 3370c965db44STomer Tayar 33712d22bc83SMichal Kalderon /* Dumps the MCP HW dump from NVRAM. Returns the dumped size in dwords. */ 33722d22bc83SMichal Kalderon static u32 qed_grc_dump_mcp_hw_dump(struct qed_hwfn *p_hwfn, 33732d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 33742d22bc83SMichal Kalderon u32 *dump_buf, bool dump) 33752d22bc83SMichal Kalderon { 33762d22bc83SMichal Kalderon u32 hw_dump_offset_bytes = 0, hw_dump_size_bytes = 0; 33772d22bc83SMichal Kalderon u32 hw_dump_size_dwords = 0, offset = 0; 33782d22bc83SMichal Kalderon enum dbg_status status; 33792d22bc83SMichal Kalderon 33802d22bc83SMichal Kalderon /* Read HW dump image from NVRAM */ 33812d22bc83SMichal Kalderon status = qed_find_nvram_image(p_hwfn, 33822d22bc83SMichal Kalderon p_ptt, 33832d22bc83SMichal Kalderon NVM_TYPE_HW_DUMP_OUT, 33842d22bc83SMichal Kalderon &hw_dump_offset_bytes, 33852d22bc83SMichal Kalderon &hw_dump_size_bytes); 33862d22bc83SMichal Kalderon if (status != DBG_STATUS_OK) 33872d22bc83SMichal Kalderon return 0; 33882d22bc83SMichal Kalderon 33892d22bc83SMichal Kalderon hw_dump_size_dwords = BYTES_TO_DWORDS(hw_dump_size_bytes); 33902d22bc83SMichal Kalderon 33912d22bc83SMichal Kalderon /* Dump HW dump image section */ 33922d22bc83SMichal Kalderon offset += qed_dump_section_hdr(dump_buf + offset, 33932d22bc83SMichal Kalderon dump, "mcp_hw_dump", 1); 33942d22bc83SMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 33952d22bc83SMichal Kalderon dump, "size", hw_dump_size_dwords); 33962d22bc83SMichal Kalderon 33972d22bc83SMichal Kalderon /* Read MCP HW dump image into dump buffer */ 33982d22bc83SMichal Kalderon if (dump && hw_dump_size_dwords) { 33992d22bc83SMichal Kalderon status = qed_nvram_read(p_hwfn, 34002d22bc83SMichal Kalderon p_ptt, 34012d22bc83SMichal Kalderon hw_dump_offset_bytes, 34022d22bc83SMichal Kalderon hw_dump_size_bytes, dump_buf + offset); 34032d22bc83SMichal Kalderon if (status != DBG_STATUS_OK) { 34042d22bc83SMichal Kalderon DP_NOTICE(p_hwfn, 34052d22bc83SMichal Kalderon "Failed to read MCP HW Dump image from NVRAM\n"); 34062d22bc83SMichal Kalderon return 0; 34072d22bc83SMichal Kalderon } 34082d22bc83SMichal Kalderon } 34092d22bc83SMichal Kalderon offset += hw_dump_size_dwords; 34102d22bc83SMichal Kalderon 34112d22bc83SMichal Kalderon return offset; 3412c965db44STomer Tayar } 3413c965db44STomer Tayar 3414c965db44STomer Tayar /* Dumps Static Debug data. Returns the dumped size in dwords. */ 3415c965db44STomer Tayar static u32 qed_grc_dump_static_debug(struct qed_hwfn *p_hwfn, 3416c965db44STomer Tayar struct qed_ptt *p_ptt, 3417c965db44STomer Tayar u32 *dump_buf, bool dump) 3418c965db44STomer Tayar { 3419c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 34202d22bc83SMichal Kalderon u32 block_id, line_id, offset = 0, addr, len; 34217b6859fbSMintz, Yuval 3422da090917STomer Tayar /* Don't dump static debug if a debug bus recording is in progress */ 3423da090917STomer Tayar if (dump && qed_rd(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON)) 34247b6859fbSMintz, Yuval return 0; 3425c965db44STomer Tayar 3426c965db44STomer Tayar if (dump) { 34272d22bc83SMichal Kalderon /* Disable debug bus in all blocks */ 34282d22bc83SMichal Kalderon qed_bus_disable_blocks(p_hwfn, p_ptt); 3429c965db44STomer Tayar 3430c965db44STomer Tayar qed_bus_reset_dbg_block(p_hwfn, p_ptt); 34312d22bc83SMichal Kalderon qed_wr(p_hwfn, 34322d22bc83SMichal Kalderon p_ptt, DBG_REG_FRAMING_MODE, DBG_BUS_FRAME_MODE_8HW); 3433c965db44STomer Tayar qed_wr(p_hwfn, 3434c965db44STomer Tayar p_ptt, DBG_REG_DEBUG_TARGET, DBG_BUS_TARGET_ID_INT_BUF); 3435c965db44STomer Tayar qed_wr(p_hwfn, p_ptt, DBG_REG_FULL_MODE, 1); 3436c965db44STomer Tayar qed_bus_enable_dbg_block(p_hwfn, p_ptt, true); 3437c965db44STomer Tayar } 3438c965db44STomer Tayar 3439c965db44STomer Tayar /* Dump all static debug lines for each relevant block */ 3440c965db44STomer Tayar for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) { 34412d22bc83SMichal Kalderon const struct dbg_block_chip *block_per_chip; 34422d22bc83SMichal Kalderon const struct dbg_block *block; 34432d22bc83SMichal Kalderon bool is_removed, has_dbg_bus; 34442d22bc83SMichal Kalderon u16 modes_buf_offset; 34452d22bc83SMichal Kalderon u32 block_dwords; 3446c965db44STomer Tayar 34472d22bc83SMichal Kalderon block_per_chip = 34482d22bc83SMichal Kalderon qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)block_id); 34492d22bc83SMichal Kalderon is_removed = GET_FIELD(block_per_chip->flags, 34502d22bc83SMichal Kalderon DBG_BLOCK_CHIP_IS_REMOVED); 34512d22bc83SMichal Kalderon has_dbg_bus = GET_FIELD(block_per_chip->flags, 34522d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_DBG_BUS); 34532d22bc83SMichal Kalderon 34542d22bc83SMichal Kalderon if (!is_removed && has_dbg_bus && 34552d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 34562d22bc83SMichal Kalderon DBG_MODE_HDR_EVAL_MODE) > 0) { 34572d22bc83SMichal Kalderon modes_buf_offset = 34582d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 34592d22bc83SMichal Kalderon DBG_MODE_HDR_MODES_BUF_OFFSET); 34602d22bc83SMichal Kalderon if (!qed_is_mode_match(p_hwfn, &modes_buf_offset)) 34612d22bc83SMichal Kalderon has_dbg_bus = false; 34622d22bc83SMichal Kalderon } 34632d22bc83SMichal Kalderon 34642d22bc83SMichal Kalderon if (is_removed || !has_dbg_bus) 34652d22bc83SMichal Kalderon continue; 34662d22bc83SMichal Kalderon 34672d22bc83SMichal Kalderon block_dwords = NUM_DBG_LINES(block_per_chip) * 34687b6859fbSMintz, Yuval STATIC_DEBUG_LINE_DWORDS; 34697b6859fbSMintz, Yuval 3470c965db44STomer Tayar /* Dump static section params */ 34712d22bc83SMichal Kalderon block = get_dbg_block(p_hwfn, (enum block_id)block_id); 3472c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3473c965db44STomer Tayar dump_buf + offset, 3474c965db44STomer Tayar dump, 34757b6859fbSMintz, Yuval block->name, 34767b6859fbSMintz, Yuval 0, 34777b6859fbSMintz, Yuval block_dwords, 34782d22bc83SMichal Kalderon 32, false, "STATIC", 0); 3479c965db44STomer Tayar 34807b6859fbSMintz, Yuval if (!dump) { 34817b6859fbSMintz, Yuval offset += block_dwords; 34827b6859fbSMintz, Yuval continue; 34837b6859fbSMintz, Yuval } 34847b6859fbSMintz, Yuval 34857b6859fbSMintz, Yuval /* If all lines are invalid - dump zeros */ 34867b6859fbSMintz, Yuval if (dev_data->block_in_reset[block_id]) { 34877b6859fbSMintz, Yuval memset(dump_buf + offset, 0, 34887b6859fbSMintz, Yuval DWORDS_TO_BYTES(block_dwords)); 34897b6859fbSMintz, Yuval offset += block_dwords; 34907b6859fbSMintz, Yuval continue; 34917b6859fbSMintz, Yuval } 3492c965db44STomer Tayar 3493c965db44STomer Tayar /* Enable block's client */ 34947b6859fbSMintz, Yuval qed_bus_enable_clients(p_hwfn, 34957b6859fbSMintz, Yuval p_ptt, 34962d22bc83SMichal Kalderon BIT(block_per_chip->dbg_client_id)); 3497c965db44STomer Tayar 34987b6859fbSMintz, Yuval addr = BYTES_TO_DWORDS(DBG_REG_CALENDAR_OUT_DATA); 34997b6859fbSMintz, Yuval len = STATIC_DEBUG_LINE_DWORDS; 35002d22bc83SMichal Kalderon for (line_id = 0; line_id < (u32)NUM_DBG_LINES(block_per_chip); 3501c965db44STomer Tayar line_id++) { 3502c965db44STomer Tayar /* Configure debug line ID */ 35032d22bc83SMichal Kalderon qed_bus_config_dbg_line(p_hwfn, 3504c965db44STomer Tayar p_ptt, 3505c965db44STomer Tayar (enum block_id)block_id, 35067b6859fbSMintz, Yuval (u8)line_id, 0xf, 0, 0, 0); 3507c965db44STomer Tayar 3508c965db44STomer Tayar /* Read debug line info */ 35097b6859fbSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3510be086e7cSMintz, Yuval p_ptt, 3511be086e7cSMintz, Yuval dump_buf + offset, 3512be086e7cSMintz, Yuval dump, 3513be086e7cSMintz, Yuval addr, 35147b6859fbSMintz, Yuval len, 3515d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 3516d52c89f1SMichal Kalderon 0); 3517c965db44STomer Tayar } 3518c965db44STomer Tayar 3519c965db44STomer Tayar /* Disable block's client and debug output */ 3520c965db44STomer Tayar qed_bus_enable_clients(p_hwfn, p_ptt, 0); 35212d22bc83SMichal Kalderon qed_bus_config_dbg_line(p_hwfn, p_ptt, 35222d22bc83SMichal Kalderon (enum block_id)block_id, 0, 0, 0, 0, 0); 3523c965db44STomer Tayar } 3524c965db44STomer Tayar 3525c965db44STomer Tayar if (dump) { 3526c965db44STomer Tayar qed_bus_enable_dbg_block(p_hwfn, p_ptt, false); 3527c965db44STomer Tayar qed_bus_enable_clients(p_hwfn, p_ptt, 0); 3528c965db44STomer Tayar } 3529c965db44STomer Tayar 3530c965db44STomer Tayar return offset; 3531c965db44STomer Tayar } 3532c965db44STomer Tayar 3533c965db44STomer Tayar /* Performs GRC Dump to the specified buffer. 3534c965db44STomer Tayar * Returns the dumped size in dwords. 3535c965db44STomer Tayar */ 3536c965db44STomer Tayar static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn, 3537c965db44STomer Tayar struct qed_ptt *p_ptt, 3538c965db44STomer Tayar u32 *dump_buf, 3539c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 3540c965db44STomer Tayar { 3541c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 3542c965db44STomer Tayar bool parities_masked = false; 3543*6c95dd8fSPrabhakar Kushwaha u32 dwords_read, offset = 0; 3544d52c89f1SMichal Kalderon u8 i; 3545c965db44STomer Tayar 3546c965db44STomer Tayar *num_dumped_dwords = 0; 3547d52c89f1SMichal Kalderon dev_data->num_regs_read = 0; 3548c965db44STomer Tayar 3549c965db44STomer Tayar /* Update reset state */ 3550d52c89f1SMichal Kalderon if (dump) 3551c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 3552c965db44STomer Tayar 3553c965db44STomer Tayar /* Dump global params */ 3554c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 3555c965db44STomer Tayar p_ptt, 3556c965db44STomer Tayar dump_buf + offset, dump, 4); 3557c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 3558c965db44STomer Tayar dump, "dump-type", "grc-dump"); 3559c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 3560c965db44STomer Tayar dump, 3561c965db44STomer Tayar "num-lcids", 35622d22bc83SMichal Kalderon NUM_OF_LCIDS); 3563c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 3564c965db44STomer Tayar dump, 3565c965db44STomer Tayar "num-ltids", 35662d22bc83SMichal Kalderon NUM_OF_LTIDS); 3567c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 3568d52c89f1SMichal Kalderon dump, "num-ports", dev_data->num_ports); 3569c965db44STomer Tayar 3570c965db44STomer Tayar /* Dump reset registers (dumped before taking blocks out of reset ) */ 3571c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) 3572c965db44STomer Tayar offset += qed_grc_dump_reset_regs(p_hwfn, 3573c965db44STomer Tayar p_ptt, 3574c965db44STomer Tayar dump_buf + offset, dump); 3575c965db44STomer Tayar 3576c965db44STomer Tayar /* Take all blocks out of reset (using reset registers) */ 3577c965db44STomer Tayar if (dump) { 35782d22bc83SMichal Kalderon qed_grc_unreset_blocks(p_hwfn, p_ptt, false); 3579c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 3580c965db44STomer Tayar } 3581c965db44STomer Tayar 3582c965db44STomer Tayar /* Disable all parities using MFW command */ 35837b6859fbSMintz, Yuval if (dump && 35847b6859fbSMintz, Yuval !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) { 3585c965db44STomer Tayar parities_masked = !qed_mcp_mask_parities(p_hwfn, p_ptt, 1); 3586c965db44STomer Tayar if (!parities_masked) { 3587be086e7cSMintz, Yuval DP_NOTICE(p_hwfn, 3588be086e7cSMintz, Yuval "Failed to mask parities using MFW\n"); 3589c965db44STomer Tayar if (qed_grc_get_param 3590c965db44STomer Tayar (p_hwfn, DBG_GRC_PARAM_PARITY_SAFE)) 3591c965db44STomer Tayar return DBG_STATUS_MCP_COULD_NOT_MASK_PRTY; 3592c965db44STomer Tayar } 3593c965db44STomer Tayar } 3594c965db44STomer Tayar 3595c965db44STomer Tayar /* Dump modified registers (dumped before modifying them) */ 3596c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) 3597c965db44STomer Tayar offset += qed_grc_dump_modified_regs(p_hwfn, 3598c965db44STomer Tayar p_ptt, 3599c965db44STomer Tayar dump_buf + offset, dump); 3600c965db44STomer Tayar 3601c965db44STomer Tayar /* Stall storms */ 3602c965db44STomer Tayar if (dump && 3603c965db44STomer Tayar (qed_grc_is_included(p_hwfn, 3604c965db44STomer Tayar DBG_GRC_PARAM_DUMP_IOR) || 3605c965db44STomer Tayar qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC))) 3606c965db44STomer Tayar qed_grc_stall_storms(p_hwfn, p_ptt, true); 3607c965db44STomer Tayar 3608c965db44STomer Tayar /* Dump all regs */ 3609c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) { 3610c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID]; 3611c965db44STomer Tayar 36127b6859fbSMintz, Yuval /* Dump all blocks except MCP */ 3613c965db44STomer Tayar for (i = 0; i < MAX_BLOCK_ID; i++) 3614c965db44STomer Tayar block_enable[i] = true; 3615c965db44STomer Tayar block_enable[BLOCK_MCP] = false; 3616c965db44STomer Tayar offset += qed_grc_dump_registers(p_hwfn, 3617c965db44STomer Tayar p_ptt, 3618c965db44STomer Tayar dump_buf + 3619c965db44STomer Tayar offset, 3620c965db44STomer Tayar dump, 36212d22bc83SMichal Kalderon block_enable, NULL); 3622be086e7cSMintz, Yuval 3623be086e7cSMintz, Yuval /* Dump special registers */ 3624be086e7cSMintz, Yuval offset += qed_grc_dump_special_regs(p_hwfn, 3625be086e7cSMintz, Yuval p_ptt, 3626be086e7cSMintz, Yuval dump_buf + offset, dump); 3627c965db44STomer Tayar } 3628c965db44STomer Tayar 3629c965db44STomer Tayar /* Dump memories */ 3630c965db44STomer Tayar offset += qed_grc_dump_memories(p_hwfn, p_ptt, dump_buf + offset, dump); 3631c965db44STomer Tayar 3632c965db44STomer Tayar /* Dump MCP */ 3633c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP)) 3634c965db44STomer Tayar offset += qed_grc_dump_mcp(p_hwfn, 3635c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3636c965db44STomer Tayar 3637c965db44STomer Tayar /* Dump context */ 3638c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX)) 3639c965db44STomer Tayar offset += qed_grc_dump_ctx(p_hwfn, 3640c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3641c965db44STomer Tayar 3642c965db44STomer Tayar /* Dump RSS memories */ 3643c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RSS)) 3644c965db44STomer Tayar offset += qed_grc_dump_rss(p_hwfn, 3645c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3646c965db44STomer Tayar 3647c965db44STomer Tayar /* Dump Big RAM */ 3648c965db44STomer Tayar for (i = 0; i < NUM_BIG_RAM_TYPES; i++) 3649c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, s_big_ram_defs[i].grc_param)) 3650c965db44STomer Tayar offset += qed_grc_dump_big_ram(p_hwfn, 3651c965db44STomer Tayar p_ptt, 3652c965db44STomer Tayar dump_buf + offset, 3653c965db44STomer Tayar dump, i); 3654c965db44STomer Tayar 3655c965db44STomer Tayar /* Dump VFC */ 36562d22bc83SMichal Kalderon if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)) { 36572d22bc83SMichal Kalderon dwords_read = qed_grc_dump_vfc(p_hwfn, 3658c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 36592d22bc83SMichal Kalderon offset += dwords_read; 36602d22bc83SMichal Kalderon if (!dwords_read) 36612d22bc83SMichal Kalderon return DBG_STATUS_VFC_READ_ERROR; 36622d22bc83SMichal Kalderon } 3663c965db44STomer Tayar 3664c965db44STomer Tayar /* Dump PHY tbus */ 3665c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, 3666c965db44STomer Tayar DBG_GRC_PARAM_DUMP_PHY) && dev_data->chip_id == 36672d22bc83SMichal Kalderon CHIP_K2 && dev_data->hw_type == HW_TYPE_ASIC) 3668c965db44STomer Tayar offset += qed_grc_dump_phy(p_hwfn, 3669c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3670c965db44STomer Tayar 36712d22bc83SMichal Kalderon /* Dump MCP HW Dump */ 36722d22bc83SMichal Kalderon if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP_HW_DUMP) && 36732d22bc83SMichal Kalderon !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP) && 1) 36742d22bc83SMichal Kalderon offset += qed_grc_dump_mcp_hw_dump(p_hwfn, 36752d22bc83SMichal Kalderon p_ptt, 36762d22bc83SMichal Kalderon dump_buf + offset, dump); 36772d22bc83SMichal Kalderon 3678d52c89f1SMichal Kalderon /* Dump static debug data (only if not during debug bus recording) */ 3679c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, 3680c965db44STomer Tayar DBG_GRC_PARAM_DUMP_STATIC) && 3681d52c89f1SMichal Kalderon (!dump || dev_data->bus.state == DBG_BUS_STATE_IDLE)) 3682c965db44STomer Tayar offset += qed_grc_dump_static_debug(p_hwfn, 3683c965db44STomer Tayar p_ptt, 3684c965db44STomer Tayar dump_buf + offset, dump); 3685c965db44STomer Tayar 3686c965db44STomer Tayar /* Dump last section */ 3687da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 36887b6859fbSMintz, Yuval 3689c965db44STomer Tayar if (dump) { 3690c965db44STomer Tayar /* Unstall storms */ 3691c965db44STomer Tayar if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_UNSTALL)) 3692c965db44STomer Tayar qed_grc_stall_storms(p_hwfn, p_ptt, false); 3693c965db44STomer Tayar 3694c965db44STomer Tayar /* Clear parity status */ 3695c965db44STomer Tayar qed_grc_clear_all_prty(p_hwfn, p_ptt); 3696c965db44STomer Tayar 3697c965db44STomer Tayar /* Enable all parities using MFW command */ 3698c965db44STomer Tayar if (parities_masked) 3699c965db44STomer Tayar qed_mcp_mask_parities(p_hwfn, p_ptt, 0); 3700c965db44STomer Tayar } 3701c965db44STomer Tayar 3702c965db44STomer Tayar *num_dumped_dwords = offset; 3703c965db44STomer Tayar 3704c965db44STomer Tayar return DBG_STATUS_OK; 3705c965db44STomer Tayar } 3706c965db44STomer Tayar 3707c965db44STomer Tayar /* Writes the specified failing Idle Check rule to the specified buffer. 3708c965db44STomer Tayar * Returns the dumped size in dwords. 3709c965db44STomer Tayar */ 3710c965db44STomer Tayar static u32 qed_idle_chk_dump_failure(struct qed_hwfn *p_hwfn, 3711c965db44STomer Tayar struct qed_ptt *p_ptt, 3712*6c95dd8fSPrabhakar Kushwaha u32 *dump_buf, 3713c965db44STomer Tayar bool dump, 3714c965db44STomer Tayar u16 rule_id, 3715c965db44STomer Tayar const struct dbg_idle_chk_rule *rule, 3716c965db44STomer Tayar u16 fail_entry_id, u32 *cond_reg_values) 3717c965db44STomer Tayar { 3718c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 37197b6859fbSMintz, Yuval const struct dbg_idle_chk_cond_reg *cond_regs; 37207b6859fbSMintz, Yuval const struct dbg_idle_chk_info_reg *info_regs; 37217b6859fbSMintz, Yuval u32 i, next_reg_offset = 0, offset = 0; 37227b6859fbSMintz, Yuval struct dbg_idle_chk_result_hdr *hdr; 37237b6859fbSMintz, Yuval const union dbg_idle_chk_reg *regs; 3724c965db44STomer Tayar u8 reg_id; 3725c965db44STomer Tayar 37267b6859fbSMintz, Yuval hdr = (struct dbg_idle_chk_result_hdr *)dump_buf; 37272d22bc83SMichal Kalderon regs = (const union dbg_idle_chk_reg *) 37282d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr + 37292d22bc83SMichal Kalderon rule->reg_offset; 37307b6859fbSMintz, Yuval cond_regs = ®s[0].cond_reg; 37317b6859fbSMintz, Yuval info_regs = ®s[rule->num_cond_regs].info_reg; 37327b6859fbSMintz, Yuval 3733c965db44STomer Tayar /* Dump rule data */ 3734c965db44STomer Tayar if (dump) { 3735c965db44STomer Tayar memset(hdr, 0, sizeof(*hdr)); 3736c965db44STomer Tayar hdr->rule_id = rule_id; 3737c965db44STomer Tayar hdr->mem_entry_id = fail_entry_id; 3738c965db44STomer Tayar hdr->severity = rule->severity; 3739c965db44STomer Tayar hdr->num_dumped_cond_regs = rule->num_cond_regs; 3740c965db44STomer Tayar } 3741c965db44STomer Tayar 3742c965db44STomer Tayar offset += IDLE_CHK_RESULT_HDR_DWORDS; 3743c965db44STomer Tayar 3744c965db44STomer Tayar /* Dump condition register values */ 3745c965db44STomer Tayar for (reg_id = 0; reg_id < rule->num_cond_regs; reg_id++) { 3746c965db44STomer Tayar const struct dbg_idle_chk_cond_reg *reg = &cond_regs[reg_id]; 37477b6859fbSMintz, Yuval struct dbg_idle_chk_result_reg_hdr *reg_hdr; 37487b6859fbSMintz, Yuval 37492d22bc83SMichal Kalderon reg_hdr = 37502d22bc83SMichal Kalderon (struct dbg_idle_chk_result_reg_hdr *)(dump_buf + offset); 3751c965db44STomer Tayar 3752c965db44STomer Tayar /* Write register header */ 37537b6859fbSMintz, Yuval if (!dump) { 37547b6859fbSMintz, Yuval offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + 37557b6859fbSMintz, Yuval reg->entry_size; 37567b6859fbSMintz, Yuval continue; 37577b6859fbSMintz, Yuval } 37587b6859fbSMintz, Yuval 3759c965db44STomer Tayar offset += IDLE_CHK_RESULT_REG_HDR_DWORDS; 37607b6859fbSMintz, Yuval memset(reg_hdr, 0, sizeof(*reg_hdr)); 3761c965db44STomer Tayar reg_hdr->start_entry = reg->start_entry; 3762c965db44STomer Tayar reg_hdr->size = reg->entry_size; 3763c965db44STomer Tayar SET_FIELD(reg_hdr->data, 3764c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM, 37657b6859fbSMintz, Yuval reg->num_entries > 1 || reg->start_entry > 0 ? 1 : 0); 3766c965db44STomer Tayar SET_FIELD(reg_hdr->data, 3767c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, reg_id); 3768c965db44STomer Tayar 3769c965db44STomer Tayar /* Write register values */ 37707b6859fbSMintz, Yuval for (i = 0; i < reg_hdr->size; i++, next_reg_offset++, offset++) 37717b6859fbSMintz, Yuval dump_buf[offset] = cond_reg_values[next_reg_offset]; 3772c965db44STomer Tayar } 3773c965db44STomer Tayar 3774c965db44STomer Tayar /* Dump info register values */ 3775c965db44STomer Tayar for (reg_id = 0; reg_id < rule->num_info_regs; reg_id++) { 3776c965db44STomer Tayar const struct dbg_idle_chk_info_reg *reg = &info_regs[reg_id]; 3777c965db44STomer Tayar u32 block_id; 3778c965db44STomer Tayar 37797b6859fbSMintz, Yuval /* Check if register's block is in reset */ 3780c965db44STomer Tayar if (!dump) { 3781c965db44STomer Tayar offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + reg->size; 3782c965db44STomer Tayar continue; 3783c965db44STomer Tayar } 3784c965db44STomer Tayar 3785c965db44STomer Tayar block_id = GET_FIELD(reg->data, DBG_IDLE_CHK_INFO_REG_BLOCK_ID); 3786c965db44STomer Tayar if (block_id >= MAX_BLOCK_ID) { 3787c965db44STomer Tayar DP_NOTICE(p_hwfn, "Invalid block_id\n"); 3788c965db44STomer Tayar return 0; 3789c965db44STomer Tayar } 3790c965db44STomer Tayar 3791c965db44STomer Tayar if (!dev_data->block_in_reset[block_id]) { 37927b6859fbSMintz, Yuval struct dbg_idle_chk_result_reg_hdr *reg_hdr; 37937b6859fbSMintz, Yuval bool wide_bus, eval_mode, mode_match = true; 37947b6859fbSMintz, Yuval u16 modes_buf_offset; 37957b6859fbSMintz, Yuval u32 addr; 37967b6859fbSMintz, Yuval 37977b6859fbSMintz, Yuval reg_hdr = (struct dbg_idle_chk_result_reg_hdr *) 37987b6859fbSMintz, Yuval (dump_buf + offset); 3799c965db44STomer Tayar 3800c965db44STomer Tayar /* Check mode */ 38017b6859fbSMintz, Yuval eval_mode = GET_FIELD(reg->mode.data, 38027b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 3803c965db44STomer Tayar if (eval_mode) { 38047b6859fbSMintz, Yuval modes_buf_offset = 3805c965db44STomer Tayar GET_FIELD(reg->mode.data, 3806c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 3807c965db44STomer Tayar mode_match = 3808c965db44STomer Tayar qed_is_mode_match(p_hwfn, 3809c965db44STomer Tayar &modes_buf_offset); 3810c965db44STomer Tayar } 3811c965db44STomer Tayar 38127b6859fbSMintz, Yuval if (!mode_match) 38137b6859fbSMintz, Yuval continue; 38147b6859fbSMintz, Yuval 38157b6859fbSMintz, Yuval addr = GET_FIELD(reg->data, 3816be086e7cSMintz, Yuval DBG_IDLE_CHK_INFO_REG_ADDRESS); 38177b6859fbSMintz, Yuval wide_bus = GET_FIELD(reg->data, 38187b6859fbSMintz, Yuval DBG_IDLE_CHK_INFO_REG_WIDE_BUS); 3819c965db44STomer Tayar 3820c965db44STomer Tayar /* Write register header */ 3821c965db44STomer Tayar offset += IDLE_CHK_RESULT_REG_HDR_DWORDS; 3822c965db44STomer Tayar hdr->num_dumped_info_regs++; 3823c965db44STomer Tayar memset(reg_hdr, 0, sizeof(*reg_hdr)); 3824c965db44STomer Tayar reg_hdr->size = reg->size; 3825c965db44STomer Tayar SET_FIELD(reg_hdr->data, 3826c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, 3827c965db44STomer Tayar rule->num_cond_regs + reg_id); 3828c965db44STomer Tayar 3829c965db44STomer Tayar /* Write register values */ 38307b6859fbSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3831be086e7cSMintz, Yuval p_ptt, 3832be086e7cSMintz, Yuval dump_buf + offset, 3833be086e7cSMintz, Yuval dump, 3834be086e7cSMintz, Yuval addr, 3835d52c89f1SMichal Kalderon reg->size, wide_bus, 3836d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 3837c965db44STomer Tayar } 3838c965db44STomer Tayar } 3839c965db44STomer Tayar 3840c965db44STomer Tayar return offset; 3841c965db44STomer Tayar } 3842c965db44STomer Tayar 3843c965db44STomer Tayar /* Dumps idle check rule entries. Returns the dumped size in dwords. */ 3844c965db44STomer Tayar static u32 3845c965db44STomer Tayar qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 3846c965db44STomer Tayar u32 *dump_buf, bool dump, 3847c965db44STomer Tayar const struct dbg_idle_chk_rule *input_rules, 3848c965db44STomer Tayar u32 num_input_rules, u32 *num_failing_rules) 3849c965db44STomer Tayar { 3850c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 3851c965db44STomer Tayar u32 cond_reg_values[IDLE_CHK_MAX_ENTRIES_SIZE]; 3852be086e7cSMintz, Yuval u32 i, offset = 0; 3853c965db44STomer Tayar u16 entry_id; 3854c965db44STomer Tayar u8 reg_id; 3855c965db44STomer Tayar 3856c965db44STomer Tayar *num_failing_rules = 0; 38577b6859fbSMintz, Yuval 3858c965db44STomer Tayar for (i = 0; i < num_input_rules; i++) { 3859c965db44STomer Tayar const struct dbg_idle_chk_cond_reg *cond_regs; 3860c965db44STomer Tayar const struct dbg_idle_chk_rule *rule; 3861c965db44STomer Tayar const union dbg_idle_chk_reg *regs; 3862c965db44STomer Tayar u16 num_reg_entries = 1; 3863c965db44STomer Tayar bool check_rule = true; 3864c965db44STomer Tayar const u32 *imm_values; 3865c965db44STomer Tayar 3866c965db44STomer Tayar rule = &input_rules[i]; 38672d22bc83SMichal Kalderon regs = (const union dbg_idle_chk_reg *) 38682d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr + 38692d22bc83SMichal Kalderon rule->reg_offset; 3870c965db44STomer Tayar cond_regs = ®s[0].cond_reg; 38712d22bc83SMichal Kalderon imm_values = 38722d22bc83SMichal Kalderon (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr + 38732d22bc83SMichal Kalderon rule->imm_offset; 3874c965db44STomer Tayar 3875c965db44STomer Tayar /* Check if all condition register blocks are out of reset, and 3876c965db44STomer Tayar * find maximal number of entries (all condition registers that 3877c965db44STomer Tayar * are memories must have the same size, which is > 1). 3878c965db44STomer Tayar */ 3879c965db44STomer Tayar for (reg_id = 0; reg_id < rule->num_cond_regs && check_rule; 3880c965db44STomer Tayar reg_id++) { 38817b6859fbSMintz, Yuval u32 block_id = 38827b6859fbSMintz, Yuval GET_FIELD(cond_regs[reg_id].data, 3883c965db44STomer Tayar DBG_IDLE_CHK_COND_REG_BLOCK_ID); 3884c965db44STomer Tayar 3885c965db44STomer Tayar if (block_id >= MAX_BLOCK_ID) { 3886c965db44STomer Tayar DP_NOTICE(p_hwfn, "Invalid block_id\n"); 3887c965db44STomer Tayar return 0; 3888c965db44STomer Tayar } 3889c965db44STomer Tayar 3890c965db44STomer Tayar check_rule = !dev_data->block_in_reset[block_id]; 3891c965db44STomer Tayar if (cond_regs[reg_id].num_entries > num_reg_entries) 3892c965db44STomer Tayar num_reg_entries = cond_regs[reg_id].num_entries; 3893c965db44STomer Tayar } 3894c965db44STomer Tayar 3895c965db44STomer Tayar if (!check_rule && dump) 3896c965db44STomer Tayar continue; 3897c965db44STomer Tayar 3898be086e7cSMintz, Yuval if (!dump) { 3899da090917STomer Tayar u32 entry_dump_size = 3900da090917STomer Tayar qed_idle_chk_dump_failure(p_hwfn, 3901be086e7cSMintz, Yuval p_ptt, 3902be086e7cSMintz, Yuval dump_buf + offset, 3903be086e7cSMintz, Yuval false, 3904be086e7cSMintz, Yuval rule->rule_id, 3905be086e7cSMintz, Yuval rule, 3906da090917STomer Tayar 0, 3907be086e7cSMintz, Yuval NULL); 3908da090917STomer Tayar 3909da090917STomer Tayar offset += num_reg_entries * entry_dump_size; 3910da090917STomer Tayar (*num_failing_rules) += num_reg_entries; 3911da090917STomer Tayar continue; 3912be086e7cSMintz, Yuval } 3913be086e7cSMintz, Yuval 3914da090917STomer Tayar /* Go over all register entries (number of entries is the same 3915da090917STomer Tayar * for all condition registers). 3916da090917STomer Tayar */ 3917da090917STomer Tayar for (entry_id = 0; entry_id < num_reg_entries; entry_id++) { 3918da090917STomer Tayar u32 next_reg_offset = 0; 3919da090917STomer Tayar 3920c965db44STomer Tayar /* Read current entry of all condition registers */ 3921be086e7cSMintz, Yuval for (reg_id = 0; reg_id < rule->num_cond_regs; 3922c965db44STomer Tayar reg_id++) { 3923be086e7cSMintz, Yuval const struct dbg_idle_chk_cond_reg *reg = 3924be086e7cSMintz, Yuval &cond_regs[reg_id]; 39257b6859fbSMintz, Yuval u32 padded_entry_size, addr; 39267b6859fbSMintz, Yuval bool wide_bus; 3927c965db44STomer Tayar 3928be086e7cSMintz, Yuval /* Find GRC address (if it's a memory, the 3929be086e7cSMintz, Yuval * address of the specific entry is calculated). 3930c965db44STomer Tayar */ 39317b6859fbSMintz, Yuval addr = GET_FIELD(reg->data, 3932be086e7cSMintz, Yuval DBG_IDLE_CHK_COND_REG_ADDRESS); 39337b6859fbSMintz, Yuval wide_bus = 39347b6859fbSMintz, Yuval GET_FIELD(reg->data, 39357b6859fbSMintz, Yuval DBG_IDLE_CHK_COND_REG_WIDE_BUS); 3936c965db44STomer Tayar if (reg->num_entries > 1 || 3937c965db44STomer Tayar reg->start_entry > 0) { 39387b6859fbSMintz, Yuval padded_entry_size = 3939c965db44STomer Tayar reg->entry_size > 1 ? 3940da090917STomer Tayar roundup_pow_of_two(reg->entry_size) : 3941da090917STomer Tayar 1; 3942be086e7cSMintz, Yuval addr += (reg->start_entry + entry_id) * 3943be086e7cSMintz, Yuval padded_entry_size; 3944c965db44STomer Tayar } 3945c965db44STomer Tayar 3946c965db44STomer Tayar /* Read registers */ 3947c965db44STomer Tayar if (next_reg_offset + reg->entry_size >= 3948c965db44STomer Tayar IDLE_CHK_MAX_ENTRIES_SIZE) { 3949c965db44STomer Tayar DP_NOTICE(p_hwfn, 3950c965db44STomer Tayar "idle check registers entry is too large\n"); 3951c965db44STomer Tayar return 0; 3952c965db44STomer Tayar } 3953c965db44STomer Tayar 3954be086e7cSMintz, Yuval next_reg_offset += 39557b6859fbSMintz, Yuval qed_grc_dump_addr_range(p_hwfn, p_ptt, 3956be086e7cSMintz, Yuval cond_reg_values + 3957be086e7cSMintz, Yuval next_reg_offset, 3958be086e7cSMintz, Yuval dump, addr, 39597b6859fbSMintz, Yuval reg->entry_size, 3960d52c89f1SMichal Kalderon wide_bus, 3961d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 3962c965db44STomer Tayar } 3963c965db44STomer Tayar 39647b6859fbSMintz, Yuval /* Call rule condition function. 39657b6859fbSMintz, Yuval * If returns true, it's a failure. 3966c965db44STomer Tayar */ 3967c965db44STomer Tayar if ((*cond_arr[rule->cond_id]) (cond_reg_values, 3968be086e7cSMintz, Yuval imm_values)) { 39697b6859fbSMintz, Yuval offset += qed_idle_chk_dump_failure(p_hwfn, 3970c965db44STomer Tayar p_ptt, 3971c965db44STomer Tayar dump_buf + offset, 3972c965db44STomer Tayar dump, 3973c965db44STomer Tayar rule->rule_id, 3974c965db44STomer Tayar rule, 3975c965db44STomer Tayar entry_id, 3976c965db44STomer Tayar cond_reg_values); 3977c965db44STomer Tayar (*num_failing_rules)++; 3978c965db44STomer Tayar } 3979c965db44STomer Tayar } 3980c965db44STomer Tayar } 3981c965db44STomer Tayar 3982c965db44STomer Tayar return offset; 3983c965db44STomer Tayar } 3984c965db44STomer Tayar 3985c965db44STomer Tayar /* Performs Idle Check Dump to the specified buffer. 3986c965db44STomer Tayar * Returns the dumped size in dwords. 3987c965db44STomer Tayar */ 3988c965db44STomer Tayar static u32 qed_idle_chk_dump(struct qed_hwfn *p_hwfn, 3989c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3990c965db44STomer Tayar { 39912d22bc83SMichal Kalderon struct virt_mem_desc *dbg_buf = 39922d22bc83SMichal Kalderon &p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES]; 39932d22bc83SMichal Kalderon u32 num_failing_rules_offset, offset = 0, 39942d22bc83SMichal Kalderon input_offset = 0, num_failing_rules = 0; 3995c965db44STomer Tayar 39962d22bc83SMichal Kalderon /* Dump global params - 1 must match below amount of params */ 3997c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 3998c965db44STomer Tayar p_ptt, 3999c965db44STomer Tayar dump_buf + offset, dump, 1); 4000c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4001c965db44STomer Tayar dump, "dump-type", "idle-chk"); 4002c965db44STomer Tayar 4003c965db44STomer Tayar /* Dump idle check section header with a single parameter */ 4004c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, dump, "idle_chk", 1); 4005c965db44STomer Tayar num_failing_rules_offset = offset; 4006c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "num_rules", 0); 40077b6859fbSMintz, Yuval 40082d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) { 4009c965db44STomer Tayar const struct dbg_idle_chk_cond_hdr *cond_hdr = 40102d22bc83SMichal Kalderon (const struct dbg_idle_chk_cond_hdr *)dbg_buf->ptr + 40112d22bc83SMichal Kalderon input_offset++; 40127b6859fbSMintz, Yuval bool eval_mode, mode_match = true; 40137b6859fbSMintz, Yuval u32 curr_failing_rules; 40147b6859fbSMintz, Yuval u16 modes_buf_offset; 4015c965db44STomer Tayar 4016c965db44STomer Tayar /* Check mode */ 40177b6859fbSMintz, Yuval eval_mode = GET_FIELD(cond_hdr->mode.data, 40187b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 4019c965db44STomer Tayar if (eval_mode) { 40207b6859fbSMintz, Yuval modes_buf_offset = 4021c965db44STomer Tayar GET_FIELD(cond_hdr->mode.data, 4022c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 4023c965db44STomer Tayar mode_match = qed_is_mode_match(p_hwfn, 4024c965db44STomer Tayar &modes_buf_offset); 4025c965db44STomer Tayar } 4026c965db44STomer Tayar 4027c965db44STomer Tayar if (mode_match) { 40282d22bc83SMichal Kalderon const struct dbg_idle_chk_rule *rule = 40292d22bc83SMichal Kalderon (const struct dbg_idle_chk_rule *)((u32 *) 40302d22bc83SMichal Kalderon dbg_buf->ptr 40312d22bc83SMichal Kalderon + input_offset); 40322d22bc83SMichal Kalderon u32 num_input_rules = 40332d22bc83SMichal Kalderon cond_hdr->data_size / IDLE_CHK_RULE_SIZE_DWORDS; 4034c965db44STomer Tayar offset += 4035c965db44STomer Tayar qed_idle_chk_dump_rule_entries(p_hwfn, 4036c965db44STomer Tayar p_ptt, 40372d22bc83SMichal Kalderon dump_buf + 40382d22bc83SMichal Kalderon offset, 4039c965db44STomer Tayar dump, 40402d22bc83SMichal Kalderon rule, 40412d22bc83SMichal Kalderon num_input_rules, 4042c965db44STomer Tayar &curr_failing_rules); 4043c965db44STomer Tayar num_failing_rules += curr_failing_rules; 4044c965db44STomer Tayar } 4045c965db44STomer Tayar 4046c965db44STomer Tayar input_offset += cond_hdr->data_size; 4047c965db44STomer Tayar } 4048c965db44STomer Tayar 4049c965db44STomer Tayar /* Overwrite num_rules parameter */ 4050c965db44STomer Tayar if (dump) 4051c965db44STomer Tayar qed_dump_num_param(dump_buf + num_failing_rules_offset, 4052c965db44STomer Tayar dump, "num_rules", num_failing_rules); 4053c965db44STomer Tayar 40547b6859fbSMintz, Yuval /* Dump last section */ 4055da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 40567b6859fbSMintz, Yuval 4057c965db44STomer Tayar return offset; 4058c965db44STomer Tayar } 4059c965db44STomer Tayar 4060c965db44STomer Tayar /* Get info on the MCP Trace data in the scratchpad: 40617b6859fbSMintz, Yuval * - trace_data_grc_addr (OUT): trace data GRC address in bytes 40627b6859fbSMintz, Yuval * - trace_data_size (OUT): trace data size in bytes (without the header) 4063c965db44STomer Tayar */ 4064c965db44STomer Tayar static enum dbg_status qed_mcp_trace_get_data_info(struct qed_hwfn *p_hwfn, 4065c965db44STomer Tayar struct qed_ptt *p_ptt, 4066c965db44STomer Tayar u32 *trace_data_grc_addr, 40677b6859fbSMintz, Yuval u32 *trace_data_size) 4068c965db44STomer Tayar { 40697b6859fbSMintz, Yuval u32 spad_trace_offsize, signature; 4070c965db44STomer Tayar 40717b6859fbSMintz, Yuval /* Read trace section offsize structure from MCP scratchpad */ 40727b6859fbSMintz, Yuval spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR); 40737b6859fbSMintz, Yuval 40747b6859fbSMintz, Yuval /* Extract trace section address from offsize (in scratchpad) */ 4075c965db44STomer Tayar *trace_data_grc_addr = 4076c965db44STomer Tayar MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize); 4077c965db44STomer Tayar 4078c965db44STomer Tayar /* Read signature from MCP trace section */ 4079c965db44STomer Tayar signature = qed_rd(p_hwfn, p_ptt, 4080c965db44STomer Tayar *trace_data_grc_addr + 4081c965db44STomer Tayar offsetof(struct mcp_trace, signature)); 40827b6859fbSMintz, Yuval 4083c965db44STomer Tayar if (signature != MFW_TRACE_SIGNATURE) 4084c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 4085c965db44STomer Tayar 4086c965db44STomer Tayar /* Read trace size from MCP trace section */ 40877b6859fbSMintz, Yuval *trace_data_size = qed_rd(p_hwfn, 4088c965db44STomer Tayar p_ptt, 4089c965db44STomer Tayar *trace_data_grc_addr + 4090c965db44STomer Tayar offsetof(struct mcp_trace, size)); 40917b6859fbSMintz, Yuval 4092c965db44STomer Tayar return DBG_STATUS_OK; 4093c965db44STomer Tayar } 4094c965db44STomer Tayar 40957b6859fbSMintz, Yuval /* Reads MCP trace meta data image from NVRAM 40967b6859fbSMintz, Yuval * - running_bundle_id (OUT): running bundle ID (invalid when loaded from file) 40977b6859fbSMintz, Yuval * - trace_meta_offset (OUT): trace meta offset in NVRAM in bytes (invalid when 40987b6859fbSMintz, Yuval * loaded from file). 40997b6859fbSMintz, Yuval * - trace_meta_size (OUT): size in bytes of the trace meta data. 4100c965db44STomer Tayar */ 4101c965db44STomer Tayar static enum dbg_status qed_mcp_trace_get_meta_info(struct qed_hwfn *p_hwfn, 4102c965db44STomer Tayar struct qed_ptt *p_ptt, 4103c965db44STomer Tayar u32 trace_data_size_bytes, 4104c965db44STomer Tayar u32 *running_bundle_id, 41057b6859fbSMintz, Yuval u32 *trace_meta_offset, 41067b6859fbSMintz, Yuval u32 *trace_meta_size) 4107c965db44STomer Tayar { 41087b6859fbSMintz, Yuval u32 spad_trace_offsize, nvram_image_type, running_mfw_addr; 41097b6859fbSMintz, Yuval 4110c965db44STomer Tayar /* Read MCP trace section offsize structure from MCP scratchpad */ 41117b6859fbSMintz, Yuval spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR); 4112c965db44STomer Tayar 4113c965db44STomer Tayar /* Find running bundle ID */ 41147b6859fbSMintz, Yuval running_mfw_addr = 4115c965db44STomer Tayar MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize) + 4116c965db44STomer Tayar QED_SECTION_SIZE(spad_trace_offsize) + trace_data_size_bytes; 4117c965db44STomer Tayar *running_bundle_id = qed_rd(p_hwfn, p_ptt, running_mfw_addr); 4118c965db44STomer Tayar if (*running_bundle_id > 1) 4119c965db44STomer Tayar return DBG_STATUS_INVALID_NVRAM_BUNDLE; 4120c965db44STomer Tayar 4121c965db44STomer Tayar /* Find image in NVRAM */ 4122c965db44STomer Tayar nvram_image_type = 4123c965db44STomer Tayar (*running_bundle_id == 4124c965db44STomer Tayar DIR_ID_1) ? NVM_TYPE_MFW_TRACE1 : NVM_TYPE_MFW_TRACE2; 4125be086e7cSMintz, Yuval return qed_find_nvram_image(p_hwfn, 4126c965db44STomer Tayar p_ptt, 4127c965db44STomer Tayar nvram_image_type, 41287b6859fbSMintz, Yuval trace_meta_offset, trace_meta_size); 4129c965db44STomer Tayar } 4130c965db44STomer Tayar 41317b6859fbSMintz, Yuval /* Reads the MCP Trace meta data from NVRAM into the specified buffer */ 4132c965db44STomer Tayar static enum dbg_status qed_mcp_trace_read_meta(struct qed_hwfn *p_hwfn, 4133c965db44STomer Tayar struct qed_ptt *p_ptt, 4134c965db44STomer Tayar u32 nvram_offset_in_bytes, 4135c965db44STomer Tayar u32 size_in_bytes, u32 *buf) 4136c965db44STomer Tayar { 41377b6859fbSMintz, Yuval u8 modules_num, module_len, i, *byte_buf = (u8 *)buf; 41387b6859fbSMintz, Yuval enum dbg_status status; 4139c965db44STomer Tayar u32 signature; 4140c965db44STomer Tayar 4141c965db44STomer Tayar /* Read meta data from NVRAM */ 41427b6859fbSMintz, Yuval status = qed_nvram_read(p_hwfn, 4143c965db44STomer Tayar p_ptt, 41447b6859fbSMintz, Yuval nvram_offset_in_bytes, size_in_bytes, buf); 4145c965db44STomer Tayar if (status != DBG_STATUS_OK) 4146c965db44STomer Tayar return status; 4147c965db44STomer Tayar 4148c965db44STomer Tayar /* Extract and check first signature */ 4149c965db44STomer Tayar signature = qed_read_unaligned_dword(byte_buf); 41507b6859fbSMintz, Yuval byte_buf += sizeof(signature); 41517b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 4152c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 4153c965db44STomer Tayar 4154c965db44STomer Tayar /* Extract number of modules */ 4155c965db44STomer Tayar modules_num = *(byte_buf++); 4156c965db44STomer Tayar 4157c965db44STomer Tayar /* Skip all modules */ 4158c965db44STomer Tayar for (i = 0; i < modules_num; i++) { 41597b6859fbSMintz, Yuval module_len = *(byte_buf++); 4160c965db44STomer Tayar byte_buf += module_len; 4161c965db44STomer Tayar } 4162c965db44STomer Tayar 4163c965db44STomer Tayar /* Extract and check second signature */ 4164c965db44STomer Tayar signature = qed_read_unaligned_dword(byte_buf); 41657b6859fbSMintz, Yuval byte_buf += sizeof(signature); 41667b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 4167c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 41687b6859fbSMintz, Yuval 4169c965db44STomer Tayar return DBG_STATUS_OK; 4170c965db44STomer Tayar } 4171c965db44STomer Tayar 4172c965db44STomer Tayar /* Dump MCP Trace */ 41738c93beafSYuval Mintz static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn, 4174c965db44STomer Tayar struct qed_ptt *p_ptt, 4175c965db44STomer Tayar u32 *dump_buf, 4176c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 4177c965db44STomer Tayar { 4178c965db44STomer Tayar u32 trace_data_grc_addr, trace_data_size_bytes, trace_data_size_dwords; 4179be086e7cSMintz, Yuval u32 trace_meta_size_dwords = 0, running_bundle_id, offset = 0; 4180be086e7cSMintz, Yuval u32 trace_meta_offset_bytes = 0, trace_meta_size_bytes = 0; 4181c965db44STomer Tayar enum dbg_status status; 4182c965db44STomer Tayar int halted = 0; 41832d22bc83SMichal Kalderon bool use_mfw; 4184c965db44STomer Tayar 4185c965db44STomer Tayar *num_dumped_dwords = 0; 4186c965db44STomer Tayar 41872d22bc83SMichal Kalderon use_mfw = !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP); 41887b6859fbSMintz, Yuval 4189c965db44STomer Tayar /* Get trace data info */ 4190c965db44STomer Tayar status = qed_mcp_trace_get_data_info(p_hwfn, 4191c965db44STomer Tayar p_ptt, 4192c965db44STomer Tayar &trace_data_grc_addr, 4193c965db44STomer Tayar &trace_data_size_bytes); 4194c965db44STomer Tayar if (status != DBG_STATUS_OK) 4195c965db44STomer Tayar return status; 4196c965db44STomer Tayar 4197c965db44STomer Tayar /* Dump global params */ 4198c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4199c965db44STomer Tayar p_ptt, 4200c965db44STomer Tayar dump_buf + offset, dump, 1); 4201c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4202c965db44STomer Tayar dump, "dump-type", "mcp-trace"); 4203c965db44STomer Tayar 4204c965db44STomer Tayar /* Halt MCP while reading from scratchpad so the read data will be 42057b6859fbSMintz, Yuval * consistent. if halt fails, MCP trace is taken anyway, with a small 4206c965db44STomer Tayar * risk that it may be corrupt. 4207c965db44STomer Tayar */ 42082d22bc83SMichal Kalderon if (dump && use_mfw) { 4209c965db44STomer Tayar halted = !qed_mcp_halt(p_hwfn, p_ptt); 4210c965db44STomer Tayar if (!halted) 4211c965db44STomer Tayar DP_NOTICE(p_hwfn, "MCP halt failed!\n"); 4212c965db44STomer Tayar } 4213c965db44STomer Tayar 4214c965db44STomer Tayar /* Find trace data size */ 4215c965db44STomer Tayar trace_data_size_dwords = 4216c965db44STomer Tayar DIV_ROUND_UP(trace_data_size_bytes + sizeof(struct mcp_trace), 4217c965db44STomer Tayar BYTES_IN_DWORD); 4218c965db44STomer Tayar 4219c965db44STomer Tayar /* Dump trace data section header and param */ 4220c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4221c965db44STomer Tayar dump, "mcp_trace_data", 1); 4222c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 4223c965db44STomer Tayar dump, "size", trace_data_size_dwords); 4224c965db44STomer Tayar 4225c965db44STomer Tayar /* Read trace data from scratchpad into dump buffer */ 4226be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 4227c965db44STomer Tayar p_ptt, 4228be086e7cSMintz, Yuval dump_buf + offset, 4229be086e7cSMintz, Yuval dump, 4230be086e7cSMintz, Yuval BYTES_TO_DWORDS(trace_data_grc_addr), 4231d52c89f1SMichal Kalderon trace_data_size_dwords, false, 4232d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 4233c965db44STomer Tayar 4234c965db44STomer Tayar /* Resume MCP (only if halt succeeded) */ 42357b6859fbSMintz, Yuval if (halted && qed_mcp_resume(p_hwfn, p_ptt)) 4236c965db44STomer Tayar DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n"); 4237c965db44STomer Tayar 4238c965db44STomer Tayar /* Dump trace meta section header */ 4239c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4240c965db44STomer Tayar dump, "mcp_trace_meta", 1); 4241c965db44STomer Tayar 424250bc60cbSMichal Kalderon /* If MCP Trace meta size parameter was set, use it. 424350bc60cbSMichal Kalderon * Otherwise, read trace meta. 424450bc60cbSMichal Kalderon * trace_meta_size_bytes is dword-aligned. 424550bc60cbSMichal Kalderon */ 424650bc60cbSMichal Kalderon trace_meta_size_bytes = 424750bc60cbSMichal Kalderon qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_MCP_TRACE_META_SIZE); 42482d22bc83SMichal Kalderon if ((!trace_meta_size_bytes || dump) && use_mfw) 4249c965db44STomer Tayar status = qed_mcp_trace_get_meta_info(p_hwfn, 4250c965db44STomer Tayar p_ptt, 4251c965db44STomer Tayar trace_data_size_bytes, 4252c965db44STomer Tayar &running_bundle_id, 4253c965db44STomer Tayar &trace_meta_offset_bytes, 4254c965db44STomer Tayar &trace_meta_size_bytes); 4255be086e7cSMintz, Yuval if (status == DBG_STATUS_OK) 42562d22bc83SMichal Kalderon trace_meta_size_dwords = BYTES_TO_DWORDS(trace_meta_size_bytes); 4257c965db44STomer Tayar 4258be086e7cSMintz, Yuval /* Dump trace meta size param */ 4259be086e7cSMintz, Yuval offset += qed_dump_num_param(dump_buf + offset, 4260be086e7cSMintz, Yuval dump, "size", trace_meta_size_dwords); 4261c965db44STomer Tayar 4262c965db44STomer Tayar /* Read trace meta image into dump buffer */ 4263be086e7cSMintz, Yuval if (dump && trace_meta_size_dwords) 4264c965db44STomer Tayar status = qed_mcp_trace_read_meta(p_hwfn, 4265c965db44STomer Tayar p_ptt, 4266c965db44STomer Tayar trace_meta_offset_bytes, 4267c965db44STomer Tayar trace_meta_size_bytes, 4268c965db44STomer Tayar dump_buf + offset); 4269be086e7cSMintz, Yuval if (status == DBG_STATUS_OK) 4270c965db44STomer Tayar offset += trace_meta_size_dwords; 4271c965db44STomer Tayar 42727b6859fbSMintz, Yuval /* Dump last section */ 4273da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 42747b6859fbSMintz, Yuval 4275c965db44STomer Tayar *num_dumped_dwords = offset; 4276c965db44STomer Tayar 4277be086e7cSMintz, Yuval /* If no mcp access, indicate that the dump doesn't contain the meta 4278be086e7cSMintz, Yuval * data from NVRAM. 4279be086e7cSMintz, Yuval */ 42802d22bc83SMichal Kalderon return use_mfw ? status : DBG_STATUS_NVRAM_GET_IMAGE_FAILED; 4281c965db44STomer Tayar } 4282c965db44STomer Tayar 4283c965db44STomer Tayar /* Dump GRC FIFO */ 42848c93beafSYuval Mintz static enum dbg_status qed_reg_fifo_dump(struct qed_hwfn *p_hwfn, 4285c965db44STomer Tayar struct qed_ptt *p_ptt, 4286c965db44STomer Tayar u32 *dump_buf, 4287c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 4288c965db44STomer Tayar { 4289da090917STomer Tayar u32 dwords_read, size_param_offset, offset = 0, addr, len; 4290c965db44STomer Tayar bool fifo_has_data; 4291c965db44STomer Tayar 4292c965db44STomer Tayar *num_dumped_dwords = 0; 4293c965db44STomer Tayar 4294c965db44STomer Tayar /* Dump global params */ 4295c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4296c965db44STomer Tayar p_ptt, 4297c965db44STomer Tayar dump_buf + offset, dump, 1); 4298c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4299c965db44STomer Tayar dump, "dump-type", "reg-fifo"); 4300c965db44STomer Tayar 43017b6859fbSMintz, Yuval /* Dump fifo data section header and param. The size param is 0 for 43027b6859fbSMintz, Yuval * now, and is overwritten after reading the FIFO. 4303c965db44STomer Tayar */ 4304c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4305c965db44STomer Tayar dump, "reg_fifo_data", 1); 4306c965db44STomer Tayar size_param_offset = offset; 4307c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0); 4308c965db44STomer Tayar 4309c965db44STomer Tayar if (!dump) { 4310c965db44STomer Tayar /* FIFO max size is REG_FIFO_DEPTH_DWORDS. There is no way to 4311c965db44STomer Tayar * test how much data is available, except for reading it. 4312c965db44STomer Tayar */ 4313c965db44STomer Tayar offset += REG_FIFO_DEPTH_DWORDS; 43147b6859fbSMintz, Yuval goto out; 4315c965db44STomer Tayar } 4316c965db44STomer Tayar 4317c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4318c965db44STomer Tayar GRC_REG_TRACE_FIFO_VALID_DATA) > 0; 4319c965db44STomer Tayar 4320c965db44STomer Tayar /* Pull available data from fifo. Use DMAE since this is widebus memory 4321c965db44STomer Tayar * and must be accessed atomically. Test for dwords_read not passing 4322c965db44STomer Tayar * buffer size since more entries could be added to the buffer as we are 4323c965db44STomer Tayar * emptying it. 4324c965db44STomer Tayar */ 4325da090917STomer Tayar addr = BYTES_TO_DWORDS(GRC_REG_TRACE_FIFO); 4326da090917STomer Tayar len = REG_FIFO_ELEMENT_DWORDS; 4327c965db44STomer Tayar for (dwords_read = 0; 4328c965db44STomer Tayar fifo_has_data && dwords_read < REG_FIFO_DEPTH_DWORDS; 4329da090917STomer Tayar dwords_read += REG_FIFO_ELEMENT_DWORDS) { 4330da090917STomer Tayar offset += qed_grc_dump_addr_range(p_hwfn, 4331da090917STomer Tayar p_ptt, 4332da090917STomer Tayar dump_buf + offset, 4333da090917STomer Tayar true, 4334da090917STomer Tayar addr, 4335da090917STomer Tayar len, 4336d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 4337d52c89f1SMichal Kalderon 0); 4338c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4339c965db44STomer Tayar GRC_REG_TRACE_FIFO_VALID_DATA) > 0; 4340c965db44STomer Tayar } 4341c965db44STomer Tayar 4342c965db44STomer Tayar qed_dump_num_param(dump_buf + size_param_offset, dump, "size", 4343c965db44STomer Tayar dwords_read); 43447b6859fbSMintz, Yuval out: 43457b6859fbSMintz, Yuval /* Dump last section */ 4346da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 4347c965db44STomer Tayar 4348c965db44STomer Tayar *num_dumped_dwords = offset; 43497b6859fbSMintz, Yuval 4350c965db44STomer Tayar return DBG_STATUS_OK; 4351c965db44STomer Tayar } 4352c965db44STomer Tayar 4353c965db44STomer Tayar /* Dump IGU FIFO */ 43548c93beafSYuval Mintz static enum dbg_status qed_igu_fifo_dump(struct qed_hwfn *p_hwfn, 4355c965db44STomer Tayar struct qed_ptt *p_ptt, 4356c965db44STomer Tayar u32 *dump_buf, 4357c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 4358c965db44STomer Tayar { 4359da090917STomer Tayar u32 dwords_read, size_param_offset, offset = 0, addr, len; 4360c965db44STomer Tayar bool fifo_has_data; 4361c965db44STomer Tayar 4362c965db44STomer Tayar *num_dumped_dwords = 0; 4363c965db44STomer Tayar 4364c965db44STomer Tayar /* Dump global params */ 4365c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4366c965db44STomer Tayar p_ptt, 4367c965db44STomer Tayar dump_buf + offset, dump, 1); 4368c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4369c965db44STomer Tayar dump, "dump-type", "igu-fifo"); 4370c965db44STomer Tayar 43717b6859fbSMintz, Yuval /* Dump fifo data section header and param. The size param is 0 for 43727b6859fbSMintz, Yuval * now, and is overwritten after reading the FIFO. 4373c965db44STomer Tayar */ 4374c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4375c965db44STomer Tayar dump, "igu_fifo_data", 1); 4376c965db44STomer Tayar size_param_offset = offset; 4377c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0); 4378c965db44STomer Tayar 4379c965db44STomer Tayar if (!dump) { 4380c965db44STomer Tayar /* FIFO max size is IGU_FIFO_DEPTH_DWORDS. There is no way to 4381c965db44STomer Tayar * test how much data is available, except for reading it. 4382c965db44STomer Tayar */ 4383c965db44STomer Tayar offset += IGU_FIFO_DEPTH_DWORDS; 43847b6859fbSMintz, Yuval goto out; 4385c965db44STomer Tayar } 4386c965db44STomer Tayar 4387c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4388c965db44STomer Tayar IGU_REG_ERROR_HANDLING_DATA_VALID) > 0; 4389c965db44STomer Tayar 4390c965db44STomer Tayar /* Pull available data from fifo. Use DMAE since this is widebus memory 4391c965db44STomer Tayar * and must be accessed atomically. Test for dwords_read not passing 4392c965db44STomer Tayar * buffer size since more entries could be added to the buffer as we are 4393c965db44STomer Tayar * emptying it. 4394c965db44STomer Tayar */ 4395da090917STomer Tayar addr = BYTES_TO_DWORDS(IGU_REG_ERROR_HANDLING_MEMORY); 4396da090917STomer Tayar len = IGU_FIFO_ELEMENT_DWORDS; 4397c965db44STomer Tayar for (dwords_read = 0; 4398c965db44STomer Tayar fifo_has_data && dwords_read < IGU_FIFO_DEPTH_DWORDS; 4399da090917STomer Tayar dwords_read += IGU_FIFO_ELEMENT_DWORDS) { 4400da090917STomer Tayar offset += qed_grc_dump_addr_range(p_hwfn, 4401da090917STomer Tayar p_ptt, 4402da090917STomer Tayar dump_buf + offset, 4403da090917STomer Tayar true, 4404da090917STomer Tayar addr, 4405da090917STomer Tayar len, 4406d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 4407d52c89f1SMichal Kalderon 0); 4408c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4409c965db44STomer Tayar IGU_REG_ERROR_HANDLING_DATA_VALID) > 0; 4410c965db44STomer Tayar } 4411c965db44STomer Tayar 4412c965db44STomer Tayar qed_dump_num_param(dump_buf + size_param_offset, dump, "size", 4413c965db44STomer Tayar dwords_read); 44147b6859fbSMintz, Yuval out: 44157b6859fbSMintz, Yuval /* Dump last section */ 4416da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 4417c965db44STomer Tayar 4418c965db44STomer Tayar *num_dumped_dwords = offset; 44197b6859fbSMintz, Yuval 4420c965db44STomer Tayar return DBG_STATUS_OK; 4421c965db44STomer Tayar } 4422c965db44STomer Tayar 4423c965db44STomer Tayar /* Protection Override dump */ 44248c93beafSYuval Mintz static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn, 4425c965db44STomer Tayar struct qed_ptt *p_ptt, 4426c965db44STomer Tayar u32 *dump_buf, 44278c93beafSYuval Mintz bool dump, 44288c93beafSYuval Mintz u32 *num_dumped_dwords) 4429c965db44STomer Tayar { 4430da090917STomer Tayar u32 size_param_offset, override_window_dwords, offset = 0, addr; 4431c965db44STomer Tayar 4432c965db44STomer Tayar *num_dumped_dwords = 0; 4433c965db44STomer Tayar 4434c965db44STomer Tayar /* Dump global params */ 4435c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4436c965db44STomer Tayar p_ptt, 4437c965db44STomer Tayar dump_buf + offset, dump, 1); 4438c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4439c965db44STomer Tayar dump, "dump-type", "protection-override"); 4440c965db44STomer Tayar 44417b6859fbSMintz, Yuval /* Dump data section header and param. The size param is 0 for now, 44427b6859fbSMintz, Yuval * and is overwritten after reading the data. 4443c965db44STomer Tayar */ 4444c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4445c965db44STomer Tayar dump, "protection_override_data", 1); 4446c965db44STomer Tayar size_param_offset = offset; 4447c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0); 4448c965db44STomer Tayar 4449c965db44STomer Tayar if (!dump) { 4450c965db44STomer Tayar offset += PROTECTION_OVERRIDE_DEPTH_DWORDS; 44517b6859fbSMintz, Yuval goto out; 4452c965db44STomer Tayar } 4453c965db44STomer Tayar 4454c965db44STomer Tayar /* Add override window info to buffer */ 4455c965db44STomer Tayar override_window_dwords = 4456da090917STomer Tayar qed_rd(p_hwfn, p_ptt, GRC_REG_NUMBER_VALID_OVERRIDE_WINDOW) * 4457c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_DWORDS; 44588a52bbabSMichal Kalderon if (override_window_dwords) { 4459da090917STomer Tayar addr = BYTES_TO_DWORDS(GRC_REG_PROTECTION_OVERRIDE_WINDOW); 4460da090917STomer Tayar offset += qed_grc_dump_addr_range(p_hwfn, 4461da090917STomer Tayar p_ptt, 4462da090917STomer Tayar dump_buf + offset, 4463da090917STomer Tayar true, 4464da090917STomer Tayar addr, 4465da090917STomer Tayar override_window_dwords, 4466d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 0); 4467c965db44STomer Tayar qed_dump_num_param(dump_buf + size_param_offset, dump, "size", 4468c965db44STomer Tayar override_window_dwords); 44698a52bbabSMichal Kalderon } 44707b6859fbSMintz, Yuval out: 44717b6859fbSMintz, Yuval /* Dump last section */ 4472da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 4473c965db44STomer Tayar 4474c965db44STomer Tayar *num_dumped_dwords = offset; 44757b6859fbSMintz, Yuval 4476c965db44STomer Tayar return DBG_STATUS_OK; 4477c965db44STomer Tayar } 4478c965db44STomer Tayar 4479c965db44STomer Tayar /* Performs FW Asserts Dump to the specified buffer. 4480c965db44STomer Tayar * Returns the dumped size in dwords. 4481c965db44STomer Tayar */ 4482c965db44STomer Tayar static u32 qed_fw_asserts_dump(struct qed_hwfn *p_hwfn, 4483c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 4484c965db44STomer Tayar { 4485c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 4486be086e7cSMintz, Yuval struct fw_asserts_ram_section *asserts; 4487c965db44STomer Tayar char storm_letter_str[2] = "?"; 4488c965db44STomer Tayar struct fw_info fw_info; 4489be086e7cSMintz, Yuval u32 offset = 0; 4490c965db44STomer Tayar u8 storm_id; 4491c965db44STomer Tayar 4492c965db44STomer Tayar /* Dump global params */ 4493c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4494c965db44STomer Tayar p_ptt, 4495c965db44STomer Tayar dump_buf + offset, dump, 1); 4496c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4497c965db44STomer Tayar dump, "dump-type", "fw-asserts"); 44987b6859fbSMintz, Yuval 44997b6859fbSMintz, Yuval /* Find Storm dump size */ 4500c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 4501be086e7cSMintz, Yuval u32 fw_asserts_section_addr, next_list_idx_addr, next_list_idx; 45027b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 4503be086e7cSMintz, Yuval u32 last_list_idx, addr; 4504c965db44STomer Tayar 45052d22bc83SMichal Kalderon if (dev_data->block_in_reset[storm->sem_block_id]) 4506c965db44STomer Tayar continue; 4507c965db44STomer Tayar 4508c965db44STomer Tayar /* Read FW info for the current Storm */ 4509d52c89f1SMichal Kalderon qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, &fw_info); 4510c965db44STomer Tayar 4511be086e7cSMintz, Yuval asserts = &fw_info.fw_asserts_section; 4512be086e7cSMintz, Yuval 4513c965db44STomer Tayar /* Dump FW Asserts section header and params */ 45147b6859fbSMintz, Yuval storm_letter_str[0] = storm->letter; 45157b6859fbSMintz, Yuval offset += qed_dump_section_hdr(dump_buf + offset, 45167b6859fbSMintz, Yuval dump, "fw_asserts", 2); 45177b6859fbSMintz, Yuval offset += qed_dump_str_param(dump_buf + offset, 45187b6859fbSMintz, Yuval dump, "storm", storm_letter_str); 45197b6859fbSMintz, Yuval offset += qed_dump_num_param(dump_buf + offset, 45207b6859fbSMintz, Yuval dump, 45217b6859fbSMintz, Yuval "size", 4522be086e7cSMintz, Yuval asserts->list_element_dword_size); 4523c965db44STomer Tayar 45247b6859fbSMintz, Yuval /* Read and dump FW Asserts data */ 4525c965db44STomer Tayar if (!dump) { 4526be086e7cSMintz, Yuval offset += asserts->list_element_dword_size; 4527c965db44STomer Tayar continue; 4528c965db44STomer Tayar } 4529c965db44STomer Tayar 45305ab90341SAlexander Lobakin addr = le16_to_cpu(asserts->section_ram_line_offset); 45317b6859fbSMintz, Yuval fw_asserts_section_addr = storm->sem_fast_mem_addr + 4532c965db44STomer Tayar SEM_FAST_REG_INT_RAM + 45335ab90341SAlexander Lobakin RAM_LINES_TO_BYTES(addr); 45345ab90341SAlexander Lobakin 45357b6859fbSMintz, Yuval next_list_idx_addr = fw_asserts_section_addr + 4536be086e7cSMintz, Yuval DWORDS_TO_BYTES(asserts->list_next_index_dword_offset); 4537c965db44STomer Tayar next_list_idx = qed_rd(p_hwfn, p_ptt, next_list_idx_addr); 4538da090917STomer Tayar last_list_idx = (next_list_idx > 0 ? 4539da090917STomer Tayar next_list_idx : 4540da090917STomer Tayar asserts->list_num_elements) - 1; 4541be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(fw_asserts_section_addr) + 4542be086e7cSMintz, Yuval asserts->list_dword_offset + 4543be086e7cSMintz, Yuval last_list_idx * asserts->list_element_dword_size; 4544be086e7cSMintz, Yuval offset += 4545be086e7cSMintz, Yuval qed_grc_dump_addr_range(p_hwfn, p_ptt, 4546be086e7cSMintz, Yuval dump_buf + offset, 4547be086e7cSMintz, Yuval dump, addr, 45487b6859fbSMintz, Yuval asserts->list_element_dword_size, 4549d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 4550c965db44STomer Tayar } 4551c965db44STomer Tayar 4552c965db44STomer Tayar /* Dump last section */ 4553da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 45547b6859fbSMintz, Yuval 4555c965db44STomer Tayar return offset; 4556c965db44STomer Tayar } 4557c965db44STomer Tayar 45588a52bbabSMichal Kalderon /* Dumps the specified ILT pages to the specified buffer. 45598a52bbabSMichal Kalderon * Returns the dumped size in dwords. 45608a52bbabSMichal Kalderon */ 4561*6c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump_pages_range(u32 *dump_buf, u32 *given_offset, 4562*6c95dd8fSPrabhakar Kushwaha bool *dump, u32 start_page_id, 45638a52bbabSMichal Kalderon u32 num_pages, 45648a52bbabSMichal Kalderon struct phys_mem_desc *ilt_pages, 4565*6c95dd8fSPrabhakar Kushwaha bool dump_page_ids, u32 buf_size_in_dwords, 4566*6c95dd8fSPrabhakar Kushwaha u32 *given_actual_dump_size_in_dwords) 45678a52bbabSMichal Kalderon { 4568*6c95dd8fSPrabhakar Kushwaha u32 actual_dump_size_in_dwords = *given_actual_dump_size_in_dwords; 4569*6c95dd8fSPrabhakar Kushwaha u32 page_id, end_page_id, offset = *given_offset; 4570*6c95dd8fSPrabhakar Kushwaha struct phys_mem_desc *mem_desc = NULL; 4571*6c95dd8fSPrabhakar Kushwaha bool continue_dump = *dump; 4572*6c95dd8fSPrabhakar Kushwaha u32 partial_page_size = 0; 45738a52bbabSMichal Kalderon 45748a52bbabSMichal Kalderon if (num_pages == 0) 45758a52bbabSMichal Kalderon return offset; 45768a52bbabSMichal Kalderon 45778a52bbabSMichal Kalderon end_page_id = start_page_id + num_pages - 1; 45788a52bbabSMichal Kalderon 45798a52bbabSMichal Kalderon for (page_id = start_page_id; page_id <= end_page_id; page_id++) { 4580*6c95dd8fSPrabhakar Kushwaha mem_desc = &ilt_pages[page_id]; 45818a52bbabSMichal Kalderon if (!ilt_pages[page_id].virt_addr) 45828a52bbabSMichal Kalderon continue; 45838a52bbabSMichal Kalderon 45848a52bbabSMichal Kalderon if (dump_page_ids) { 4585*6c95dd8fSPrabhakar Kushwaha /* Copy page ID to dump buffer 4586*6c95dd8fSPrabhakar Kushwaha * (if dump is needed and buffer is not full) 4587*6c95dd8fSPrabhakar Kushwaha */ 4588*6c95dd8fSPrabhakar Kushwaha if ((continue_dump) && 4589*6c95dd8fSPrabhakar Kushwaha (offset + 1 > buf_size_in_dwords)) { 4590*6c95dd8fSPrabhakar Kushwaha continue_dump = false; 4591*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 4592*6c95dd8fSPrabhakar Kushwaha } 4593*6c95dd8fSPrabhakar Kushwaha if (continue_dump) 45948a52bbabSMichal Kalderon *(dump_buf + offset) = page_id; 45958a52bbabSMichal Kalderon offset++; 45968a52bbabSMichal Kalderon } else { 45978a52bbabSMichal Kalderon /* Copy page memory to dump buffer */ 4598*6c95dd8fSPrabhakar Kushwaha if ((continue_dump) && 4599*6c95dd8fSPrabhakar Kushwaha (offset + BYTES_TO_DWORDS(mem_desc->size) > 4600*6c95dd8fSPrabhakar Kushwaha buf_size_in_dwords)) { 4601*6c95dd8fSPrabhakar Kushwaha if (offset + BYTES_TO_DWORDS(mem_desc->size) > 4602*6c95dd8fSPrabhakar Kushwaha buf_size_in_dwords) { 4603*6c95dd8fSPrabhakar Kushwaha partial_page_size = 4604*6c95dd8fSPrabhakar Kushwaha buf_size_in_dwords - offset; 4605*6c95dd8fSPrabhakar Kushwaha memcpy(dump_buf + offset, 4606*6c95dd8fSPrabhakar Kushwaha mem_desc->virt_addr, 4607*6c95dd8fSPrabhakar Kushwaha partial_page_size); 4608*6c95dd8fSPrabhakar Kushwaha continue_dump = false; 4609*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = 4610*6c95dd8fSPrabhakar Kushwaha offset + partial_page_size; 4611*6c95dd8fSPrabhakar Kushwaha } 4612*6c95dd8fSPrabhakar Kushwaha } 4613*6c95dd8fSPrabhakar Kushwaha 4614*6c95dd8fSPrabhakar Kushwaha if (continue_dump) 46158a52bbabSMichal Kalderon memcpy(dump_buf + offset, 46168a52bbabSMichal Kalderon mem_desc->virt_addr, mem_desc->size); 46178a52bbabSMichal Kalderon offset += BYTES_TO_DWORDS(mem_desc->size); 46188a52bbabSMichal Kalderon } 46198a52bbabSMichal Kalderon } 46208a52bbabSMichal Kalderon 4621*6c95dd8fSPrabhakar Kushwaha *dump = continue_dump; 4622*6c95dd8fSPrabhakar Kushwaha *given_offset = offset; 4623*6c95dd8fSPrabhakar Kushwaha *given_actual_dump_size_in_dwords = actual_dump_size_in_dwords; 4624*6c95dd8fSPrabhakar Kushwaha 46258a52bbabSMichal Kalderon return offset; 46268a52bbabSMichal Kalderon } 46278a52bbabSMichal Kalderon 46288a52bbabSMichal Kalderon /* Dumps a section containing the dumped ILT pages. 46298a52bbabSMichal Kalderon * Returns the dumped size in dwords. 46308a52bbabSMichal Kalderon */ 46318a52bbabSMichal Kalderon static u32 qed_ilt_dump_pages_section(struct qed_hwfn *p_hwfn, 46328a52bbabSMichal Kalderon u32 *dump_buf, 4633*6c95dd8fSPrabhakar Kushwaha u32 *given_offset, 4634*6c95dd8fSPrabhakar Kushwaha bool *dump, 46358a52bbabSMichal Kalderon u32 valid_conn_pf_pages, 46368a52bbabSMichal Kalderon u32 valid_conn_vf_pages, 46378a52bbabSMichal Kalderon struct phys_mem_desc *ilt_pages, 4638*6c95dd8fSPrabhakar Kushwaha bool dump_page_ids, 4639*6c95dd8fSPrabhakar Kushwaha u32 buf_size_in_dwords, 4640*6c95dd8fSPrabhakar Kushwaha u32 *given_actual_dump_size_in_dwords) 46418a52bbabSMichal Kalderon { 46428a52bbabSMichal Kalderon struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients; 4643*6c95dd8fSPrabhakar Kushwaha u32 pf_start_line, start_page_id, offset = *given_offset; 46448a52bbabSMichal Kalderon u32 cdut_pf_init_pages, cdut_vf_init_pages; 46458a52bbabSMichal Kalderon u32 cdut_pf_work_pages, cdut_vf_work_pages; 46468a52bbabSMichal Kalderon u32 base_data_offset, size_param_offset; 4647*6c95dd8fSPrabhakar Kushwaha u32 src_pages; 4648*6c95dd8fSPrabhakar Kushwaha u32 section_header_and_param_size; 46498a52bbabSMichal Kalderon u32 cdut_pf_pages, cdut_vf_pages; 4650*6c95dd8fSPrabhakar Kushwaha u32 actual_dump_size_in_dwords; 4651*6c95dd8fSPrabhakar Kushwaha bool continue_dump = *dump; 4652*6c95dd8fSPrabhakar Kushwaha bool update_size = *dump; 46538a52bbabSMichal Kalderon const char *section_name; 4654*6c95dd8fSPrabhakar Kushwaha u32 i; 46558a52bbabSMichal Kalderon 4656*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = *given_actual_dump_size_in_dwords; 46578a52bbabSMichal Kalderon section_name = dump_page_ids ? "ilt_page_ids" : "ilt_page_mem"; 46588a52bbabSMichal Kalderon cdut_pf_init_pages = qed_get_cdut_num_pf_init_pages(p_hwfn); 46598a52bbabSMichal Kalderon cdut_vf_init_pages = qed_get_cdut_num_vf_init_pages(p_hwfn); 46608a52bbabSMichal Kalderon cdut_pf_work_pages = qed_get_cdut_num_pf_work_pages(p_hwfn); 46618a52bbabSMichal Kalderon cdut_vf_work_pages = qed_get_cdut_num_vf_work_pages(p_hwfn); 46628a52bbabSMichal Kalderon cdut_pf_pages = cdut_pf_init_pages + cdut_pf_work_pages; 46638a52bbabSMichal Kalderon cdut_vf_pages = cdut_vf_init_pages + cdut_vf_work_pages; 46648a52bbabSMichal Kalderon pf_start_line = p_hwfn->p_cxt_mngr->pf_start_line; 4665*6c95dd8fSPrabhakar Kushwaha section_header_and_param_size = qed_dump_section_hdr(NULL, 4666*6c95dd8fSPrabhakar Kushwaha false, 4667*6c95dd8fSPrabhakar Kushwaha section_name, 4668*6c95dd8fSPrabhakar Kushwaha 1) + 4669*6c95dd8fSPrabhakar Kushwaha qed_dump_num_param(NULL, false, "size", 0); 46708a52bbabSMichal Kalderon 4671*6c95dd8fSPrabhakar Kushwaha if ((continue_dump) && 4672*6c95dd8fSPrabhakar Kushwaha (offset + section_header_and_param_size > buf_size_in_dwords)) { 4673*6c95dd8fSPrabhakar Kushwaha continue_dump = false; 4674*6c95dd8fSPrabhakar Kushwaha update_size = false; 4675*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 4676*6c95dd8fSPrabhakar Kushwaha } 4677*6c95dd8fSPrabhakar Kushwaha 4678*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_section_hdr(dump_buf + offset, 4679*6c95dd8fSPrabhakar Kushwaha continue_dump, section_name, 1); 46808a52bbabSMichal Kalderon 46818a52bbabSMichal Kalderon /* Dump size parameter (0 for now, overwritten with real size later) */ 46828a52bbabSMichal Kalderon size_param_offset = offset; 4683*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 4684*6c95dd8fSPrabhakar Kushwaha continue_dump, "size", 0); 46858a52bbabSMichal Kalderon base_data_offset = offset; 46868a52bbabSMichal Kalderon 46878a52bbabSMichal Kalderon /* CDUC pages are ordered as follows: 46888a52bbabSMichal Kalderon * - PF pages - valid section (included in PF connection type mapping) 46898a52bbabSMichal Kalderon * - PF pages - invalid section (not dumped) 46908a52bbabSMichal Kalderon * - For each VF in the PF: 46918a52bbabSMichal Kalderon * - VF pages - valid section (included in VF connection type mapping) 46928a52bbabSMichal Kalderon * - VF pages - invalid section (not dumped) 46938a52bbabSMichal Kalderon */ 46948a52bbabSMichal Kalderon if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUC)) { 46958a52bbabSMichal Kalderon /* Dump connection PF pages */ 46968a52bbabSMichal Kalderon start_page_id = clients[ILT_CLI_CDUC].first.val - pf_start_line; 4697*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_range(dump_buf, &offset, &continue_dump, 4698*6c95dd8fSPrabhakar Kushwaha start_page_id, valid_conn_pf_pages, 4699*6c95dd8fSPrabhakar Kushwaha ilt_pages, dump_page_ids, 4700*6c95dd8fSPrabhakar Kushwaha buf_size_in_dwords, 4701*6c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 47028a52bbabSMichal Kalderon 47038a52bbabSMichal Kalderon /* Dump connection VF pages */ 47048a52bbabSMichal Kalderon start_page_id += clients[ILT_CLI_CDUC].pf_total_lines; 47058a52bbabSMichal Kalderon for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count; 47068a52bbabSMichal Kalderon i++, start_page_id += clients[ILT_CLI_CDUC].vf_total_lines) 4707*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_range(dump_buf, &offset, 4708*6c95dd8fSPrabhakar Kushwaha &continue_dump, start_page_id, 47098a52bbabSMichal Kalderon valid_conn_vf_pages, 4710*6c95dd8fSPrabhakar Kushwaha ilt_pages, dump_page_ids, 4711*6c95dd8fSPrabhakar Kushwaha buf_size_in_dwords, 4712*6c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 47138a52bbabSMichal Kalderon } 47148a52bbabSMichal Kalderon 47158a52bbabSMichal Kalderon /* CDUT pages are ordered as follows: 47168a52bbabSMichal Kalderon * - PF init pages (not dumped) 47178a52bbabSMichal Kalderon * - PF work pages 47188a52bbabSMichal Kalderon * - For each VF in the PF: 47198a52bbabSMichal Kalderon * - VF init pages (not dumped) 47208a52bbabSMichal Kalderon * - VF work pages 47218a52bbabSMichal Kalderon */ 47228a52bbabSMichal Kalderon if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUT)) { 47238a52bbabSMichal Kalderon /* Dump task PF pages */ 47248a52bbabSMichal Kalderon start_page_id = clients[ILT_CLI_CDUT].first.val + 47258a52bbabSMichal Kalderon cdut_pf_init_pages - pf_start_line; 4726*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_range(dump_buf, &offset, &continue_dump, 4727*6c95dd8fSPrabhakar Kushwaha start_page_id, cdut_pf_work_pages, 4728*6c95dd8fSPrabhakar Kushwaha ilt_pages, dump_page_ids, 4729*6c95dd8fSPrabhakar Kushwaha buf_size_in_dwords, 4730*6c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 47318a52bbabSMichal Kalderon 47328a52bbabSMichal Kalderon /* Dump task VF pages */ 47338a52bbabSMichal Kalderon start_page_id = clients[ILT_CLI_CDUT].first.val + 47348a52bbabSMichal Kalderon cdut_pf_pages + cdut_vf_init_pages - pf_start_line; 47358a52bbabSMichal Kalderon for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count; 47368a52bbabSMichal Kalderon i++, start_page_id += cdut_vf_pages) 4737*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_range(dump_buf, &offset, 4738*6c95dd8fSPrabhakar Kushwaha &continue_dump, start_page_id, 4739*6c95dd8fSPrabhakar Kushwaha cdut_vf_work_pages, ilt_pages, 4740*6c95dd8fSPrabhakar Kushwaha dump_page_ids, 4741*6c95dd8fSPrabhakar Kushwaha buf_size_in_dwords, 4742*6c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 4743*6c95dd8fSPrabhakar Kushwaha } 4744*6c95dd8fSPrabhakar Kushwaha 4745*6c95dd8fSPrabhakar Kushwaha /*Dump Searcher pages */ 4746*6c95dd8fSPrabhakar Kushwaha if (clients[ILT_CLI_SRC].active) { 4747*6c95dd8fSPrabhakar Kushwaha start_page_id = clients[ILT_CLI_SRC].first.val - pf_start_line; 4748*6c95dd8fSPrabhakar Kushwaha src_pages = clients[ILT_CLI_SRC].last.val - 4749*6c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_SRC].first.val + 1; 4750*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_range(dump_buf, &offset, &continue_dump, 4751*6c95dd8fSPrabhakar Kushwaha start_page_id, src_pages, ilt_pages, 4752*6c95dd8fSPrabhakar Kushwaha dump_page_ids, buf_size_in_dwords, 4753*6c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 47548a52bbabSMichal Kalderon } 47558a52bbabSMichal Kalderon 47568a52bbabSMichal Kalderon /* Overwrite size param */ 4757*6c95dd8fSPrabhakar Kushwaha if (update_size) { 4758*6c95dd8fSPrabhakar Kushwaha u32 section_size = (*dump == continue_dump) ? 4759*6c95dd8fSPrabhakar Kushwaha offset - base_data_offset : 4760*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords - base_data_offset; 4761*6c95dd8fSPrabhakar Kushwaha if (section_size > 0) 47628a52bbabSMichal Kalderon qed_dump_num_param(dump_buf + size_param_offset, 4763*6c95dd8fSPrabhakar Kushwaha *dump, "size", section_size); 4764*6c95dd8fSPrabhakar Kushwaha else if ((section_size == 0) && (*dump != continue_dump)) 4765*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords -= 4766*6c95dd8fSPrabhakar Kushwaha section_header_and_param_size; 4767*6c95dd8fSPrabhakar Kushwaha } 4768*6c95dd8fSPrabhakar Kushwaha 4769*6c95dd8fSPrabhakar Kushwaha *dump = continue_dump; 4770*6c95dd8fSPrabhakar Kushwaha *given_offset = offset; 4771*6c95dd8fSPrabhakar Kushwaha *given_actual_dump_size_in_dwords = actual_dump_size_in_dwords; 47728a52bbabSMichal Kalderon 47738a52bbabSMichal Kalderon return offset; 47748a52bbabSMichal Kalderon } 47758a52bbabSMichal Kalderon 4776*6c95dd8fSPrabhakar Kushwaha /* Dumps a section containing the global parameters. 4777*6c95dd8fSPrabhakar Kushwaha * Part of ilt dump process 47788a52bbabSMichal Kalderon * Returns the dumped size in dwords. 47798a52bbabSMichal Kalderon */ 4780*6c95dd8fSPrabhakar Kushwaha static u32 4781*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_dump_common_global_params(struct qed_hwfn *p_hwfn, 4782*6c95dd8fSPrabhakar Kushwaha struct qed_ptt *p_ptt, 4783*6c95dd8fSPrabhakar Kushwaha u32 *dump_buf, 4784*6c95dd8fSPrabhakar Kushwaha bool dump, 4785*6c95dd8fSPrabhakar Kushwaha u32 cduc_page_size, 4786*6c95dd8fSPrabhakar Kushwaha u32 conn_ctx_size, 4787*6c95dd8fSPrabhakar Kushwaha u32 cdut_page_size, 4788*6c95dd8fSPrabhakar Kushwaha u32 *full_dump_size_param_offset, 4789*6c95dd8fSPrabhakar Kushwaha u32 *actual_dump_size_param_offset) 47908a52bbabSMichal Kalderon { 47918a52bbabSMichal Kalderon struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients; 4792*6c95dd8fSPrabhakar Kushwaha u32 offset = 0; 47938a52bbabSMichal Kalderon 47948a52bbabSMichal Kalderon offset += qed_dump_common_global_params(p_hwfn, p_ptt, 4795*6c95dd8fSPrabhakar Kushwaha dump_buf + offset, 4796*6c95dd8fSPrabhakar Kushwaha dump, 30); 47978a52bbabSMichal Kalderon offset += qed_dump_str_param(dump_buf + offset, 4798*6c95dd8fSPrabhakar Kushwaha dump, 4799*6c95dd8fSPrabhakar Kushwaha "dump-type", "ilt-dump"); 48008a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48018a52bbabSMichal Kalderon dump, 4802*6c95dd8fSPrabhakar Kushwaha "cduc-page-size", 4803*6c95dd8fSPrabhakar Kushwaha cduc_page_size); 48048a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48058a52bbabSMichal Kalderon dump, 48068a52bbabSMichal Kalderon "cduc-first-page-id", 48078a52bbabSMichal Kalderon clients[ILT_CLI_CDUC].first.val); 48088a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48098a52bbabSMichal Kalderon dump, 48108a52bbabSMichal Kalderon "cduc-last-page-id", 48118a52bbabSMichal Kalderon clients[ILT_CLI_CDUC].last.val); 48128a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48138a52bbabSMichal Kalderon dump, 48148a52bbabSMichal Kalderon "cduc-num-pf-pages", 4815*6c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_CDUC].pf_total_lines); 48168a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48178a52bbabSMichal Kalderon dump, 48188a52bbabSMichal Kalderon "cduc-num-vf-pages", 4819*6c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_CDUC].vf_total_lines); 48208a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48218a52bbabSMichal Kalderon dump, 48228a52bbabSMichal Kalderon "max-conn-ctx-size", 48238a52bbabSMichal Kalderon conn_ctx_size); 48248a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48258a52bbabSMichal Kalderon dump, 4826*6c95dd8fSPrabhakar Kushwaha "cdut-page-size", 4827*6c95dd8fSPrabhakar Kushwaha cdut_page_size); 48288a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48298a52bbabSMichal Kalderon dump, 48308a52bbabSMichal Kalderon "cdut-first-page-id", 48318a52bbabSMichal Kalderon clients[ILT_CLI_CDUT].first.val); 48328a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48338a52bbabSMichal Kalderon dump, 48348a52bbabSMichal Kalderon "cdut-last-page-id", 48358a52bbabSMichal Kalderon clients[ILT_CLI_CDUT].last.val); 48368a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48378a52bbabSMichal Kalderon dump, 48388a52bbabSMichal Kalderon "cdut-num-pf-init-pages", 48398a52bbabSMichal Kalderon qed_get_cdut_num_pf_init_pages(p_hwfn)); 48408a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48418a52bbabSMichal Kalderon dump, 48428a52bbabSMichal Kalderon "cdut-num-vf-init-pages", 48438a52bbabSMichal Kalderon qed_get_cdut_num_vf_init_pages(p_hwfn)); 48448a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48458a52bbabSMichal Kalderon dump, 48468a52bbabSMichal Kalderon "cdut-num-pf-work-pages", 48478a52bbabSMichal Kalderon qed_get_cdut_num_pf_work_pages(p_hwfn)); 48488a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48498a52bbabSMichal Kalderon dump, 48508a52bbabSMichal Kalderon "cdut-num-vf-work-pages", 48518a52bbabSMichal Kalderon qed_get_cdut_num_vf_work_pages(p_hwfn)); 48528a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48538a52bbabSMichal Kalderon dump, 48548a52bbabSMichal Kalderon "max-task-ctx-size", 48558a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->task_ctx_size); 48568a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48578a52bbabSMichal Kalderon dump, 48588a52bbabSMichal Kalderon "first-vf-id-in-pf", 48598a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->first_vf_in_pf); 4860*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 48618a52bbabSMichal Kalderon dump, 48628a52bbabSMichal Kalderon "num-vfs-in-pf", 48638a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->vf_count); 48648a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48658a52bbabSMichal Kalderon dump, 4866*6c95dd8fSPrabhakar Kushwaha "ptr-size-bytes", 4867*6c95dd8fSPrabhakar Kushwaha sizeof(void *)); 48688a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48698a52bbabSMichal Kalderon dump, 48708a52bbabSMichal Kalderon "pf-start-line", 48718a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->pf_start_line); 48728a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48738a52bbabSMichal Kalderon dump, 48748a52bbabSMichal Kalderon "page-mem-desc-size-dwords", 48758a52bbabSMichal Kalderon PAGE_MEM_DESC_SIZE_DWORDS); 48768a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 48778a52bbabSMichal Kalderon dump, 48788a52bbabSMichal Kalderon "ilt-shadow-size", 48798a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->ilt_shadow_size); 4880*6c95dd8fSPrabhakar Kushwaha 4881*6c95dd8fSPrabhakar Kushwaha *full_dump_size_param_offset = offset; 4882*6c95dd8fSPrabhakar Kushwaha 4883*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 4884*6c95dd8fSPrabhakar Kushwaha dump, "dump-size-full", 0); 4885*6c95dd8fSPrabhakar Kushwaha 4886*6c95dd8fSPrabhakar Kushwaha *actual_dump_size_param_offset = offset; 4887*6c95dd8fSPrabhakar Kushwaha 4888*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 4889*6c95dd8fSPrabhakar Kushwaha dump, 4890*6c95dd8fSPrabhakar Kushwaha "dump-size-actual", 0); 4891*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 4892*6c95dd8fSPrabhakar Kushwaha dump, 4893*6c95dd8fSPrabhakar Kushwaha "iscsi_task_pages", 4894*6c95dd8fSPrabhakar Kushwaha p_hwfn->p_cxt_mngr->iscsi_task_pages); 4895*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 4896*6c95dd8fSPrabhakar Kushwaha dump, 4897*6c95dd8fSPrabhakar Kushwaha "fcoe_task_pages", 4898*6c95dd8fSPrabhakar Kushwaha p_hwfn->p_cxt_mngr->fcoe_task_pages); 4899*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 4900*6c95dd8fSPrabhakar Kushwaha dump, 4901*6c95dd8fSPrabhakar Kushwaha "roce_task_pages", 4902*6c95dd8fSPrabhakar Kushwaha p_hwfn->p_cxt_mngr->roce_task_pages); 4903*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 4904*6c95dd8fSPrabhakar Kushwaha dump, 4905*6c95dd8fSPrabhakar Kushwaha "eth_task_pages", 4906*6c95dd8fSPrabhakar Kushwaha p_hwfn->p_cxt_mngr->eth_task_pages); 4907*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 4908*6c95dd8fSPrabhakar Kushwaha dump, 4909*6c95dd8fSPrabhakar Kushwaha "src-first-page-id", 4910*6c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_SRC].first.val); 4911*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 4912*6c95dd8fSPrabhakar Kushwaha dump, 4913*6c95dd8fSPrabhakar Kushwaha "src-last-page-id", 4914*6c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_SRC].last.val); 4915*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_num_param(dump_buf + offset, 4916*6c95dd8fSPrabhakar Kushwaha dump, 4917*6c95dd8fSPrabhakar Kushwaha "src-is-active", 4918*6c95dd8fSPrabhakar Kushwaha clients[ILT_CLI_SRC].active); 4919*6c95dd8fSPrabhakar Kushwaha 49208a52bbabSMichal Kalderon /* Additional/Less parameters require matching of number in call to 49218a52bbabSMichal Kalderon * dump_common_global_params() 49228a52bbabSMichal Kalderon */ 49238a52bbabSMichal Kalderon 4924*6c95dd8fSPrabhakar Kushwaha return offset; 4925*6c95dd8fSPrabhakar Kushwaha } 4926*6c95dd8fSPrabhakar Kushwaha 4927*6c95dd8fSPrabhakar Kushwaha /* Dump section containing number of PF CIDs per connection type. 4928*6c95dd8fSPrabhakar Kushwaha * Part of ilt dump process. 4929*6c95dd8fSPrabhakar Kushwaha * Returns the dumped size in dwords. 4930*6c95dd8fSPrabhakar Kushwaha */ 4931*6c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump_dump_num_pf_cids(struct qed_hwfn *p_hwfn, 4932*6c95dd8fSPrabhakar Kushwaha u32 *dump_buf, 4933*6c95dd8fSPrabhakar Kushwaha bool dump, u32 *valid_conn_pf_cids) 4934*6c95dd8fSPrabhakar Kushwaha { 4935*6c95dd8fSPrabhakar Kushwaha u32 num_pf_cids = 0; 4936*6c95dd8fSPrabhakar Kushwaha u32 offset = 0; 4937*6c95dd8fSPrabhakar Kushwaha u8 conn_type; 4938*6c95dd8fSPrabhakar Kushwaha 49398a52bbabSMichal Kalderon offset += qed_dump_section_hdr(dump_buf + offset, 49408a52bbabSMichal Kalderon dump, "num_pf_cids_per_conn_type", 1); 49418a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 4942fb09a1edSShai Malin dump, "size", NUM_OF_CONNECTION_TYPES); 4943*6c95dd8fSPrabhakar Kushwaha for (conn_type = 0, *valid_conn_pf_cids = 0; 4944fb09a1edSShai Malin conn_type < NUM_OF_CONNECTION_TYPES; conn_type++, offset++) { 4945*6c95dd8fSPrabhakar Kushwaha num_pf_cids = p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cid_count; 49468a52bbabSMichal Kalderon if (dump) 49478a52bbabSMichal Kalderon *(dump_buf + offset) = num_pf_cids; 4948*6c95dd8fSPrabhakar Kushwaha *valid_conn_pf_cids += num_pf_cids; 49498a52bbabSMichal Kalderon } 49508a52bbabSMichal Kalderon 4951*6c95dd8fSPrabhakar Kushwaha return offset; 4952*6c95dd8fSPrabhakar Kushwaha } 4953*6c95dd8fSPrabhakar Kushwaha 4954*6c95dd8fSPrabhakar Kushwaha /* Dump section containing number of VF CIDs per connection type 4955*6c95dd8fSPrabhakar Kushwaha * Part of ilt dump process. 4956*6c95dd8fSPrabhakar Kushwaha * Returns the dumped size in dwords. 4957*6c95dd8fSPrabhakar Kushwaha */ 4958*6c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump_dump_num_vf_cids(struct qed_hwfn *p_hwfn, 4959*6c95dd8fSPrabhakar Kushwaha u32 *dump_buf, 4960*6c95dd8fSPrabhakar Kushwaha bool dump, u32 *valid_conn_vf_cids) 4961*6c95dd8fSPrabhakar Kushwaha { 4962*6c95dd8fSPrabhakar Kushwaha u32 num_vf_cids = 0; 4963*6c95dd8fSPrabhakar Kushwaha u32 offset = 0; 4964*6c95dd8fSPrabhakar Kushwaha u8 conn_type; 4965*6c95dd8fSPrabhakar Kushwaha 4966*6c95dd8fSPrabhakar Kushwaha offset += qed_dump_section_hdr(dump_buf + offset, dump, 4967*6c95dd8fSPrabhakar Kushwaha "num_vf_cids_per_conn_type", 1); 49688a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 4969fb09a1edSShai Malin dump, "size", NUM_OF_CONNECTION_TYPES); 4970*6c95dd8fSPrabhakar Kushwaha for (conn_type = 0, *valid_conn_vf_cids = 0; 4971fb09a1edSShai Malin conn_type < NUM_OF_CONNECTION_TYPES; conn_type++, offset++) { 4972*6c95dd8fSPrabhakar Kushwaha num_vf_cids = 49738a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cids_per_vf; 49748a52bbabSMichal Kalderon if (dump) 49758a52bbabSMichal Kalderon *(dump_buf + offset) = num_vf_cids; 4976*6c95dd8fSPrabhakar Kushwaha *valid_conn_vf_cids += num_vf_cids; 49778a52bbabSMichal Kalderon } 49788a52bbabSMichal Kalderon 4979*6c95dd8fSPrabhakar Kushwaha return offset; 4980*6c95dd8fSPrabhakar Kushwaha } 4981*6c95dd8fSPrabhakar Kushwaha 4982*6c95dd8fSPrabhakar Kushwaha /* Performs ILT Dump to the specified buffer. 4983*6c95dd8fSPrabhakar Kushwaha * buf_size_in_dwords - The dumped buffer size. 4984*6c95dd8fSPrabhakar Kushwaha * Returns the dumped size in dwords. 4985*6c95dd8fSPrabhakar Kushwaha */ 4986*6c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump(struct qed_hwfn *p_hwfn, 4987*6c95dd8fSPrabhakar Kushwaha struct qed_ptt *p_ptt, 4988*6c95dd8fSPrabhakar Kushwaha u32 *dump_buf, u32 buf_size_in_dwords, bool dump) 4989*6c95dd8fSPrabhakar Kushwaha { 4990*6c95dd8fSPrabhakar Kushwaha #if ((!defined VMWARE) && (!defined UEFI)) 4991*6c95dd8fSPrabhakar Kushwaha struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients; 4992*6c95dd8fSPrabhakar Kushwaha #endif 4993*6c95dd8fSPrabhakar Kushwaha u32 valid_conn_vf_cids = 0, 4994*6c95dd8fSPrabhakar Kushwaha valid_conn_vf_pages, offset = 0, real_dumped_size = 0; 4995*6c95dd8fSPrabhakar Kushwaha u32 valid_conn_pf_cids = 0, valid_conn_pf_pages, num_pages; 4996*6c95dd8fSPrabhakar Kushwaha u32 num_cids_per_page, conn_ctx_size; 4997*6c95dd8fSPrabhakar Kushwaha u32 cduc_page_size, cdut_page_size; 4998*6c95dd8fSPrabhakar Kushwaha u32 actual_dump_size_in_dwords = 0; 4999*6c95dd8fSPrabhakar Kushwaha struct phys_mem_desc *ilt_pages; 5000*6c95dd8fSPrabhakar Kushwaha u32 actul_dump_off = 0; 5001*6c95dd8fSPrabhakar Kushwaha u32 last_section_size; 5002*6c95dd8fSPrabhakar Kushwaha u32 full_dump_off = 0; 5003*6c95dd8fSPrabhakar Kushwaha u32 section_size = 0; 5004*6c95dd8fSPrabhakar Kushwaha bool continue_dump; 5005*6c95dd8fSPrabhakar Kushwaha u32 page_id; 5006*6c95dd8fSPrabhakar Kushwaha 5007*6c95dd8fSPrabhakar Kushwaha last_section_size = qed_dump_last_section(NULL, 0, false); 5008*6c95dd8fSPrabhakar Kushwaha cduc_page_size = 1 << 5009*6c95dd8fSPrabhakar Kushwaha (clients[ILT_CLI_CDUC].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN); 5010*6c95dd8fSPrabhakar Kushwaha cdut_page_size = 1 << 5011*6c95dd8fSPrabhakar Kushwaha (clients[ILT_CLI_CDUT].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN); 5012*6c95dd8fSPrabhakar Kushwaha conn_ctx_size = p_hwfn->p_cxt_mngr->conn_ctx_size; 5013*6c95dd8fSPrabhakar Kushwaha num_cids_per_page = (int)(cduc_page_size / conn_ctx_size); 5014*6c95dd8fSPrabhakar Kushwaha ilt_pages = p_hwfn->p_cxt_mngr->ilt_shadow; 5015*6c95dd8fSPrabhakar Kushwaha continue_dump = dump; 5016*6c95dd8fSPrabhakar Kushwaha 5017*6c95dd8fSPrabhakar Kushwaha /* if need to dump then save memory for the last section 5018*6c95dd8fSPrabhakar Kushwaha * (last section calculates CRC of dumped data) 5019*6c95dd8fSPrabhakar Kushwaha */ 5020*6c95dd8fSPrabhakar Kushwaha if (dump) { 5021*6c95dd8fSPrabhakar Kushwaha if (buf_size_in_dwords >= last_section_size) { 5022*6c95dd8fSPrabhakar Kushwaha buf_size_in_dwords -= last_section_size; 5023*6c95dd8fSPrabhakar Kushwaha } else { 5024*6c95dd8fSPrabhakar Kushwaha continue_dump = false; 5025*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 5026*6c95dd8fSPrabhakar Kushwaha } 5027*6c95dd8fSPrabhakar Kushwaha } 5028*6c95dd8fSPrabhakar Kushwaha 5029*6c95dd8fSPrabhakar Kushwaha /* Dump global params */ 5030*6c95dd8fSPrabhakar Kushwaha 5031*6c95dd8fSPrabhakar Kushwaha /* if need to dump then first check that there is enough memory 5032*6c95dd8fSPrabhakar Kushwaha * in dumped buffer for this section calculate the size of this 5033*6c95dd8fSPrabhakar Kushwaha * section without dumping. if there is not enough memory - then 5034*6c95dd8fSPrabhakar Kushwaha * stop the dumping. 5035*6c95dd8fSPrabhakar Kushwaha */ 5036*6c95dd8fSPrabhakar Kushwaha if (continue_dump) { 5037*6c95dd8fSPrabhakar Kushwaha section_size = 5038*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_dump_common_global_params(p_hwfn, 5039*6c95dd8fSPrabhakar Kushwaha p_ptt, 5040*6c95dd8fSPrabhakar Kushwaha NULL, 5041*6c95dd8fSPrabhakar Kushwaha false, 5042*6c95dd8fSPrabhakar Kushwaha cduc_page_size, 5043*6c95dd8fSPrabhakar Kushwaha conn_ctx_size, 5044*6c95dd8fSPrabhakar Kushwaha cdut_page_size, 5045*6c95dd8fSPrabhakar Kushwaha &full_dump_off, 5046*6c95dd8fSPrabhakar Kushwaha &actul_dump_off); 5047*6c95dd8fSPrabhakar Kushwaha if (offset + section_size > buf_size_in_dwords) { 5048*6c95dd8fSPrabhakar Kushwaha continue_dump = false; 5049*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 5050*6c95dd8fSPrabhakar Kushwaha } 5051*6c95dd8fSPrabhakar Kushwaha } 5052*6c95dd8fSPrabhakar Kushwaha 5053*6c95dd8fSPrabhakar Kushwaha offset += qed_ilt_dump_dump_common_global_params(p_hwfn, 5054*6c95dd8fSPrabhakar Kushwaha p_ptt, 5055*6c95dd8fSPrabhakar Kushwaha dump_buf + offset, 5056*6c95dd8fSPrabhakar Kushwaha continue_dump, 5057*6c95dd8fSPrabhakar Kushwaha cduc_page_size, 5058*6c95dd8fSPrabhakar Kushwaha conn_ctx_size, 5059*6c95dd8fSPrabhakar Kushwaha cdut_page_size, 5060*6c95dd8fSPrabhakar Kushwaha &full_dump_off, 5061*6c95dd8fSPrabhakar Kushwaha &actul_dump_off); 5062*6c95dd8fSPrabhakar Kushwaha 5063*6c95dd8fSPrabhakar Kushwaha /* Dump section containing number of PF CIDs per connection type 5064*6c95dd8fSPrabhakar Kushwaha * If need to dump then first check that there is enough memory in 5065*6c95dd8fSPrabhakar Kushwaha * dumped buffer for this section. 5066*6c95dd8fSPrabhakar Kushwaha */ 5067*6c95dd8fSPrabhakar Kushwaha if (continue_dump) { 5068*6c95dd8fSPrabhakar Kushwaha section_size = 5069*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_dump_num_pf_cids(p_hwfn, 5070*6c95dd8fSPrabhakar Kushwaha NULL, 5071*6c95dd8fSPrabhakar Kushwaha false, 5072*6c95dd8fSPrabhakar Kushwaha &valid_conn_pf_cids); 5073*6c95dd8fSPrabhakar Kushwaha if (offset + section_size > buf_size_in_dwords) { 5074*6c95dd8fSPrabhakar Kushwaha continue_dump = false; 5075*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 5076*6c95dd8fSPrabhakar Kushwaha } 5077*6c95dd8fSPrabhakar Kushwaha } 5078*6c95dd8fSPrabhakar Kushwaha 5079*6c95dd8fSPrabhakar Kushwaha offset += qed_ilt_dump_dump_num_pf_cids(p_hwfn, 5080*6c95dd8fSPrabhakar Kushwaha dump_buf + offset, 5081*6c95dd8fSPrabhakar Kushwaha continue_dump, 5082*6c95dd8fSPrabhakar Kushwaha &valid_conn_pf_cids); 5083*6c95dd8fSPrabhakar Kushwaha 5084*6c95dd8fSPrabhakar Kushwaha /* Dump section containing number of VF CIDs per connection type 5085*6c95dd8fSPrabhakar Kushwaha * If need to dump then first check that there is enough memory in 5086*6c95dd8fSPrabhakar Kushwaha * dumped buffer for this section. 5087*6c95dd8fSPrabhakar Kushwaha */ 5088*6c95dd8fSPrabhakar Kushwaha if (continue_dump) { 5089*6c95dd8fSPrabhakar Kushwaha section_size = 5090*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_dump_num_vf_cids(p_hwfn, 5091*6c95dd8fSPrabhakar Kushwaha NULL, 5092*6c95dd8fSPrabhakar Kushwaha false, 5093*6c95dd8fSPrabhakar Kushwaha &valid_conn_vf_cids); 5094*6c95dd8fSPrabhakar Kushwaha if (offset + section_size > buf_size_in_dwords) { 5095*6c95dd8fSPrabhakar Kushwaha continue_dump = false; 5096*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 5097*6c95dd8fSPrabhakar Kushwaha } 5098*6c95dd8fSPrabhakar Kushwaha } 5099*6c95dd8fSPrabhakar Kushwaha 5100*6c95dd8fSPrabhakar Kushwaha offset += qed_ilt_dump_dump_num_vf_cids(p_hwfn, 5101*6c95dd8fSPrabhakar Kushwaha dump_buf + offset, 5102*6c95dd8fSPrabhakar Kushwaha continue_dump, 5103*6c95dd8fSPrabhakar Kushwaha &valid_conn_vf_cids); 5104*6c95dd8fSPrabhakar Kushwaha 5105*6c95dd8fSPrabhakar Kushwaha /* Dump section containing physical memory descriptors for each 5106*6c95dd8fSPrabhakar Kushwaha * ILT page. 5107*6c95dd8fSPrabhakar Kushwaha */ 51088a52bbabSMichal Kalderon num_pages = p_hwfn->p_cxt_mngr->ilt_shadow_size; 5109*6c95dd8fSPrabhakar Kushwaha 5110*6c95dd8fSPrabhakar Kushwaha /* If need to dump then first check that there is enough memory 5111*6c95dd8fSPrabhakar Kushwaha * in dumped buffer for the section header. 5112*6c95dd8fSPrabhakar Kushwaha */ 5113*6c95dd8fSPrabhakar Kushwaha if (continue_dump) { 5114*6c95dd8fSPrabhakar Kushwaha section_size = qed_dump_section_hdr(NULL, 5115*6c95dd8fSPrabhakar Kushwaha false, 5116*6c95dd8fSPrabhakar Kushwaha "ilt_page_desc", 5117*6c95dd8fSPrabhakar Kushwaha 1) + 5118*6c95dd8fSPrabhakar Kushwaha qed_dump_num_param(NULL, 5119*6c95dd8fSPrabhakar Kushwaha false, 5120*6c95dd8fSPrabhakar Kushwaha "size", 5121*6c95dd8fSPrabhakar Kushwaha num_pages * PAGE_MEM_DESC_SIZE_DWORDS); 5122*6c95dd8fSPrabhakar Kushwaha if (offset + section_size > buf_size_in_dwords) { 5123*6c95dd8fSPrabhakar Kushwaha continue_dump = false; 5124*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 5125*6c95dd8fSPrabhakar Kushwaha } 5126*6c95dd8fSPrabhakar Kushwaha } 5127*6c95dd8fSPrabhakar Kushwaha 51288a52bbabSMichal Kalderon offset += qed_dump_section_hdr(dump_buf + offset, 5129*6c95dd8fSPrabhakar Kushwaha continue_dump, "ilt_page_desc", 1); 51308a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 5131*6c95dd8fSPrabhakar Kushwaha continue_dump, 51328a52bbabSMichal Kalderon "size", 51338a52bbabSMichal Kalderon num_pages * PAGE_MEM_DESC_SIZE_DWORDS); 51348a52bbabSMichal Kalderon 5135*6c95dd8fSPrabhakar Kushwaha /* Copy memory descriptors to dump buffer 5136*6c95dd8fSPrabhakar Kushwaha * If need to dump then dump till the dump buffer size 5137*6c95dd8fSPrabhakar Kushwaha */ 5138*6c95dd8fSPrabhakar Kushwaha if (continue_dump) { 51398a52bbabSMichal Kalderon for (page_id = 0; page_id < num_pages; 5140*6c95dd8fSPrabhakar Kushwaha page_id++, offset += PAGE_MEM_DESC_SIZE_DWORDS) { 5141*6c95dd8fSPrabhakar Kushwaha if (continue_dump && 5142*6c95dd8fSPrabhakar Kushwaha (offset + PAGE_MEM_DESC_SIZE_DWORDS <= 5143*6c95dd8fSPrabhakar Kushwaha buf_size_in_dwords)) { 51448a52bbabSMichal Kalderon memcpy(dump_buf + offset, 51458a52bbabSMichal Kalderon &ilt_pages[page_id], 5146*6c95dd8fSPrabhakar Kushwaha DWORDS_TO_BYTES 5147*6c95dd8fSPrabhakar Kushwaha (PAGE_MEM_DESC_SIZE_DWORDS)); 5148*6c95dd8fSPrabhakar Kushwaha } else { 5149*6c95dd8fSPrabhakar Kushwaha if (continue_dump) { 5150*6c95dd8fSPrabhakar Kushwaha continue_dump = false; 5151*6c95dd8fSPrabhakar Kushwaha actual_dump_size_in_dwords = offset; 5152*6c95dd8fSPrabhakar Kushwaha } 5153*6c95dd8fSPrabhakar Kushwaha } 5154*6c95dd8fSPrabhakar Kushwaha } 51558a52bbabSMichal Kalderon } else { 51568a52bbabSMichal Kalderon offset += num_pages * PAGE_MEM_DESC_SIZE_DWORDS; 51578a52bbabSMichal Kalderon } 51588a52bbabSMichal Kalderon 51598a52bbabSMichal Kalderon valid_conn_pf_pages = DIV_ROUND_UP(valid_conn_pf_cids, 51608a52bbabSMichal Kalderon num_cids_per_page); 51618a52bbabSMichal Kalderon valid_conn_vf_pages = DIV_ROUND_UP(valid_conn_vf_cids, 51628a52bbabSMichal Kalderon num_cids_per_page); 51638a52bbabSMichal Kalderon 51648a52bbabSMichal Kalderon /* Dump ILT pages IDs */ 5165*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_section(p_hwfn, dump_buf, &offset, &continue_dump, 5166*6c95dd8fSPrabhakar Kushwaha valid_conn_pf_pages, valid_conn_vf_pages, 5167*6c95dd8fSPrabhakar Kushwaha ilt_pages, true, buf_size_in_dwords, 5168*6c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 51698a52bbabSMichal Kalderon 51708a52bbabSMichal Kalderon /* Dump ILT pages memory */ 5171*6c95dd8fSPrabhakar Kushwaha qed_ilt_dump_pages_section(p_hwfn, dump_buf, &offset, &continue_dump, 5172*6c95dd8fSPrabhakar Kushwaha valid_conn_pf_pages, valid_conn_vf_pages, 5173*6c95dd8fSPrabhakar Kushwaha ilt_pages, false, buf_size_in_dwords, 5174*6c95dd8fSPrabhakar Kushwaha &actual_dump_size_in_dwords); 5175*6c95dd8fSPrabhakar Kushwaha 5176*6c95dd8fSPrabhakar Kushwaha real_dumped_size = 5177*6c95dd8fSPrabhakar Kushwaha (continue_dump == dump) ? offset : actual_dump_size_in_dwords; 5178*6c95dd8fSPrabhakar Kushwaha qed_dump_num_param(dump_buf + full_dump_off, dump, 5179*6c95dd8fSPrabhakar Kushwaha "full-dump-size", offset + last_section_size); 5180*6c95dd8fSPrabhakar Kushwaha qed_dump_num_param(dump_buf + actul_dump_off, 51818a52bbabSMichal Kalderon dump, 5182*6c95dd8fSPrabhakar Kushwaha "actual-dump-size", 5183*6c95dd8fSPrabhakar Kushwaha real_dumped_size + last_section_size); 51848a52bbabSMichal Kalderon 51858a52bbabSMichal Kalderon /* Dump last section */ 5186*6c95dd8fSPrabhakar Kushwaha real_dumped_size += qed_dump_last_section(dump_buf, 5187*6c95dd8fSPrabhakar Kushwaha real_dumped_size, dump); 51888a52bbabSMichal Kalderon 5189*6c95dd8fSPrabhakar Kushwaha return real_dumped_size; 51908a52bbabSMichal Kalderon } 51918a52bbabSMichal Kalderon 5192c965db44STomer Tayar /***************************** Public Functions *******************************/ 5193c965db44STomer Tayar 51942d22bc83SMichal Kalderon enum dbg_status qed_dbg_set_bin_ptr(struct qed_hwfn *p_hwfn, 51952d22bc83SMichal Kalderon const u8 * const bin_ptr) 5196c965db44STomer Tayar { 51972d22bc83SMichal Kalderon struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr; 5198c965db44STomer Tayar u8 buf_id; 5199c965db44STomer Tayar 52002d22bc83SMichal Kalderon /* Convert binary data to debug arrays */ 52012d22bc83SMichal Kalderon for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) 52022d22bc83SMichal Kalderon qed_set_dbg_bin_buf(p_hwfn, 52032d22bc83SMichal Kalderon buf_id, 52042d22bc83SMichal Kalderon (u32 *)(bin_ptr + buf_hdrs[buf_id].offset), 52052d22bc83SMichal Kalderon buf_hdrs[buf_id].length); 5206c965db44STomer Tayar 5207c965db44STomer Tayar return DBG_STATUS_OK; 5208c965db44STomer Tayar } 5209c965db44STomer Tayar 5210*6c95dd8fSPrabhakar Kushwaha static enum dbg_status qed_dbg_set_app_ver(u32 ver) 5211*6c95dd8fSPrabhakar Kushwaha { 5212*6c95dd8fSPrabhakar Kushwaha if (ver < TOOLS_VERSION) 5213*6c95dd8fSPrabhakar Kushwaha return DBG_STATUS_UNSUPPORTED_APP_VERSION; 5214*6c95dd8fSPrabhakar Kushwaha 5215*6c95dd8fSPrabhakar Kushwaha s_app_ver = ver; 5216*6c95dd8fSPrabhakar Kushwaha 5217*6c95dd8fSPrabhakar Kushwaha return DBG_STATUS_OK; 5218*6c95dd8fSPrabhakar Kushwaha } 5219*6c95dd8fSPrabhakar Kushwaha 5220d52c89f1SMichal Kalderon bool qed_read_fw_info(struct qed_hwfn *p_hwfn, 5221d52c89f1SMichal Kalderon struct qed_ptt *p_ptt, struct fw_info *fw_info) 5222d52c89f1SMichal Kalderon { 5223d52c89f1SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 5224d52c89f1SMichal Kalderon u8 storm_id; 5225d52c89f1SMichal Kalderon 5226d52c89f1SMichal Kalderon for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 5227d52c89f1SMichal Kalderon struct storm_defs *storm = &s_storm_defs[storm_id]; 5228d52c89f1SMichal Kalderon 5229d52c89f1SMichal Kalderon /* Skip Storm if it's in reset */ 52302d22bc83SMichal Kalderon if (dev_data->block_in_reset[storm->sem_block_id]) 5231d52c89f1SMichal Kalderon continue; 5232d52c89f1SMichal Kalderon 5233d52c89f1SMichal Kalderon /* Read FW info for the current Storm */ 5234d52c89f1SMichal Kalderon qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, fw_info); 5235d52c89f1SMichal Kalderon 5236d52c89f1SMichal Kalderon return true; 5237d52c89f1SMichal Kalderon } 5238d52c89f1SMichal Kalderon 5239d52c89f1SMichal Kalderon return false; 5240d52c89f1SMichal Kalderon } 5241d52c89f1SMichal Kalderon 52423b86bd07SSudarsana Reddy Kalluru enum dbg_status qed_dbg_grc_config(struct qed_hwfn *p_hwfn, 52433b86bd07SSudarsana Reddy Kalluru enum dbg_grc_params grc_param, u32 val) 52443b86bd07SSudarsana Reddy Kalluru { 52452d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 52463b86bd07SSudarsana Reddy Kalluru enum dbg_status status; 52473b86bd07SSudarsana Reddy Kalluru int i; 52483b86bd07SSudarsana Reddy Kalluru 52492d22bc83SMichal Kalderon DP_VERBOSE(p_hwfn, 52502d22bc83SMichal Kalderon QED_MSG_DEBUG, 52513b86bd07SSudarsana Reddy Kalluru "dbg_grc_config: paramId = %d, val = %d\n", grc_param, val); 52523b86bd07SSudarsana Reddy Kalluru 52532d22bc83SMichal Kalderon status = qed_dbg_dev_init(p_hwfn); 52543b86bd07SSudarsana Reddy Kalluru if (status != DBG_STATUS_OK) 52553b86bd07SSudarsana Reddy Kalluru return status; 52563b86bd07SSudarsana Reddy Kalluru 52573b86bd07SSudarsana Reddy Kalluru /* Initializes the GRC parameters (if not initialized). Needed in order 52583b86bd07SSudarsana Reddy Kalluru * to set the default parameter values for the first time. 52593b86bd07SSudarsana Reddy Kalluru */ 52603b86bd07SSudarsana Reddy Kalluru qed_dbg_grc_init_params(p_hwfn); 52613b86bd07SSudarsana Reddy Kalluru 5262*6c95dd8fSPrabhakar Kushwaha if (grc_param >= MAX_DBG_GRC_PARAMS || grc_param < 0) 52633b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 52643b86bd07SSudarsana Reddy Kalluru if (val < s_grc_param_defs[grc_param].min || 52653b86bd07SSudarsana Reddy Kalluru val > s_grc_param_defs[grc_param].max) 52663b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 52673b86bd07SSudarsana Reddy Kalluru 52683b86bd07SSudarsana Reddy Kalluru if (s_grc_param_defs[grc_param].is_preset) { 52693b86bd07SSudarsana Reddy Kalluru /* Preset param */ 52703b86bd07SSudarsana Reddy Kalluru 52713b86bd07SSudarsana Reddy Kalluru /* Disabling a preset is not allowed. Call 52723b86bd07SSudarsana Reddy Kalluru * dbg_grc_set_params_default instead. 52733b86bd07SSudarsana Reddy Kalluru */ 52743b86bd07SSudarsana Reddy Kalluru if (!val) 52753b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 52763b86bd07SSudarsana Reddy Kalluru 52773b86bd07SSudarsana Reddy Kalluru /* Update all params with the preset values */ 52783b86bd07SSudarsana Reddy Kalluru for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) { 52792d22bc83SMichal Kalderon struct grc_param_defs *defs = &s_grc_param_defs[i]; 52803b86bd07SSudarsana Reddy Kalluru u32 preset_val; 52813b86bd07SSudarsana Reddy Kalluru /* Skip persistent params */ 52822d22bc83SMichal Kalderon if (defs->is_persistent) 52833b86bd07SSudarsana Reddy Kalluru continue; 52843b86bd07SSudarsana Reddy Kalluru 52853b86bd07SSudarsana Reddy Kalluru /* Find preset value */ 52863b86bd07SSudarsana Reddy Kalluru if (grc_param == DBG_GRC_PARAM_EXCLUDE_ALL) 52873b86bd07SSudarsana Reddy Kalluru preset_val = 52882d22bc83SMichal Kalderon defs->exclude_all_preset_val; 52893b86bd07SSudarsana Reddy Kalluru else if (grc_param == DBG_GRC_PARAM_CRASH) 52903b86bd07SSudarsana Reddy Kalluru preset_val = 52912d22bc83SMichal Kalderon defs->crash_preset_val[dev_data->chip_id]; 52923b86bd07SSudarsana Reddy Kalluru else 52933b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 52943b86bd07SSudarsana Reddy Kalluru 52952d22bc83SMichal Kalderon qed_grc_set_param(p_hwfn, i, preset_val); 52963b86bd07SSudarsana Reddy Kalluru } 52973b86bd07SSudarsana Reddy Kalluru } else { 52983b86bd07SSudarsana Reddy Kalluru /* Regular param - set its value */ 52993b86bd07SSudarsana Reddy Kalluru qed_grc_set_param(p_hwfn, grc_param, val); 53003b86bd07SSudarsana Reddy Kalluru } 53013b86bd07SSudarsana Reddy Kalluru 53023b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_OK; 53033b86bd07SSudarsana Reddy Kalluru } 53043b86bd07SSudarsana Reddy Kalluru 5305be086e7cSMintz, Yuval /* Assign default GRC param values */ 5306be086e7cSMintz, Yuval void qed_dbg_grc_set_params_default(struct qed_hwfn *p_hwfn) 5307be086e7cSMintz, Yuval { 5308be086e7cSMintz, Yuval struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 5309be086e7cSMintz, Yuval u32 i; 5310be086e7cSMintz, Yuval 5311be086e7cSMintz, Yuval for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) 531250bc60cbSMichal Kalderon if (!s_grc_param_defs[i].is_persistent) 5313be086e7cSMintz, Yuval dev_data->grc.param_val[i] = 5314be086e7cSMintz, Yuval s_grc_param_defs[i].default_val[dev_data->chip_id]; 5315be086e7cSMintz, Yuval } 5316be086e7cSMintz, Yuval 5317c965db44STomer Tayar enum dbg_status qed_dbg_grc_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5318c965db44STomer Tayar struct qed_ptt *p_ptt, 5319c965db44STomer Tayar u32 *buf_size) 5320c965db44STomer Tayar { 53212d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5322c965db44STomer Tayar 5323c965db44STomer Tayar *buf_size = 0; 53247b6859fbSMintz, Yuval 5325c965db44STomer Tayar if (status != DBG_STATUS_OK) 5326c965db44STomer Tayar return status; 53277b6859fbSMintz, Yuval 53282d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr || 53292d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr || 53302d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr || 53312d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr || 53322d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr) 5333c965db44STomer Tayar return DBG_STATUS_DBG_ARRAY_NOT_SET; 53347b6859fbSMintz, Yuval 5335c965db44STomer Tayar return qed_grc_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5336c965db44STomer Tayar } 5337c965db44STomer Tayar 5338c965db44STomer Tayar enum dbg_status qed_dbg_grc_dump(struct qed_hwfn *p_hwfn, 5339c965db44STomer Tayar struct qed_ptt *p_ptt, 5340c965db44STomer Tayar u32 *dump_buf, 5341c965db44STomer Tayar u32 buf_size_in_dwords, 5342c965db44STomer Tayar u32 *num_dumped_dwords) 5343c965db44STomer Tayar { 5344c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5345c965db44STomer Tayar enum dbg_status status; 5346c965db44STomer Tayar 5347c965db44STomer Tayar *num_dumped_dwords = 0; 53487b6859fbSMintz, Yuval 53497b6859fbSMintz, Yuval status = qed_dbg_grc_get_dump_buf_size(p_hwfn, 53507b6859fbSMintz, Yuval p_ptt, 53517b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5352c965db44STomer Tayar if (status != DBG_STATUS_OK) 5353c965db44STomer Tayar return status; 53547b6859fbSMintz, Yuval 5355c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5356c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5357c965db44STomer Tayar 5358*6c95dd8fSPrabhakar Kushwaha /* Doesn't do anything, needed for compile time asserts */ 5359*6c95dd8fSPrabhakar Kushwaha qed_static_asserts(); 5360*6c95dd8fSPrabhakar Kushwaha 5361c965db44STomer Tayar /* GRC Dump */ 5362c965db44STomer Tayar status = qed_grc_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords); 5363c965db44STomer Tayar 5364be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5365be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5366be086e7cSMintz, Yuval 5367c965db44STomer Tayar return status; 5368c965db44STomer Tayar } 5369c965db44STomer Tayar 5370c965db44STomer Tayar enum dbg_status qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5371c965db44STomer Tayar struct qed_ptt *p_ptt, 5372c965db44STomer Tayar u32 *buf_size) 5373c965db44STomer Tayar { 5374c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 53752d22bc83SMichal Kalderon struct idle_chk_data *idle_chk = &dev_data->idle_chk; 53767b6859fbSMintz, Yuval enum dbg_status status; 5377c965db44STomer Tayar 5378c965db44STomer Tayar *buf_size = 0; 53797b6859fbSMintz, Yuval 53802d22bc83SMichal Kalderon status = qed_dbg_dev_init(p_hwfn); 5381c965db44STomer Tayar if (status != DBG_STATUS_OK) 5382c965db44STomer Tayar return status; 53837b6859fbSMintz, Yuval 53842d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr || 53852d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr || 53862d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr || 53872d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr) 5388c965db44STomer Tayar return DBG_STATUS_DBG_ARRAY_NOT_SET; 53897b6859fbSMintz, Yuval 53907b6859fbSMintz, Yuval if (!idle_chk->buf_size_set) { 53917b6859fbSMintz, Yuval idle_chk->buf_size = qed_idle_chk_dump(p_hwfn, 53927b6859fbSMintz, Yuval p_ptt, NULL, false); 53937b6859fbSMintz, Yuval idle_chk->buf_size_set = true; 5394c965db44STomer Tayar } 5395c965db44STomer Tayar 53967b6859fbSMintz, Yuval *buf_size = idle_chk->buf_size; 53977b6859fbSMintz, Yuval 5398c965db44STomer Tayar return DBG_STATUS_OK; 5399c965db44STomer Tayar } 5400c965db44STomer Tayar 5401c965db44STomer Tayar enum dbg_status qed_dbg_idle_chk_dump(struct qed_hwfn *p_hwfn, 5402c965db44STomer Tayar struct qed_ptt *p_ptt, 5403c965db44STomer Tayar u32 *dump_buf, 5404c965db44STomer Tayar u32 buf_size_in_dwords, 5405c965db44STomer Tayar u32 *num_dumped_dwords) 5406c965db44STomer Tayar { 5407c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5408c965db44STomer Tayar enum dbg_status status; 5409c965db44STomer Tayar 5410c965db44STomer Tayar *num_dumped_dwords = 0; 54117b6859fbSMintz, Yuval 54127b6859fbSMintz, Yuval status = qed_dbg_idle_chk_get_dump_buf_size(p_hwfn, 54137b6859fbSMintz, Yuval p_ptt, 54147b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5415c965db44STomer Tayar if (status != DBG_STATUS_OK) 5416c965db44STomer Tayar return status; 54177b6859fbSMintz, Yuval 5418c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5419c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5420c965db44STomer Tayar 5421c965db44STomer Tayar /* Update reset state */ 54222d22bc83SMichal Kalderon qed_grc_unreset_blocks(p_hwfn, p_ptt, true); 5423c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5424c965db44STomer Tayar 5425c965db44STomer Tayar /* Idle Check Dump */ 5426c965db44STomer Tayar *num_dumped_dwords = qed_idle_chk_dump(p_hwfn, p_ptt, dump_buf, true); 5427be086e7cSMintz, Yuval 5428be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5429be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5430be086e7cSMintz, Yuval 5431c965db44STomer Tayar return DBG_STATUS_OK; 5432c965db44STomer Tayar } 5433c965db44STomer Tayar 5434c965db44STomer Tayar enum dbg_status qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5435c965db44STomer Tayar struct qed_ptt *p_ptt, 5436c965db44STomer Tayar u32 *buf_size) 5437c965db44STomer Tayar { 54382d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5439c965db44STomer Tayar 5440c965db44STomer Tayar *buf_size = 0; 54417b6859fbSMintz, Yuval 5442c965db44STomer Tayar if (status != DBG_STATUS_OK) 5443c965db44STomer Tayar return status; 54447b6859fbSMintz, Yuval 5445c965db44STomer Tayar return qed_mcp_trace_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5446c965db44STomer Tayar } 5447c965db44STomer Tayar 5448c965db44STomer Tayar enum dbg_status qed_dbg_mcp_trace_dump(struct qed_hwfn *p_hwfn, 5449c965db44STomer Tayar struct qed_ptt *p_ptt, 5450c965db44STomer Tayar u32 *dump_buf, 5451c965db44STomer Tayar u32 buf_size_in_dwords, 5452c965db44STomer Tayar u32 *num_dumped_dwords) 5453c965db44STomer Tayar { 5454c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5455c965db44STomer Tayar enum dbg_status status; 5456c965db44STomer Tayar 5457be086e7cSMintz, Yuval status = 54587b6859fbSMintz, Yuval qed_dbg_mcp_trace_get_dump_buf_size(p_hwfn, 54597b6859fbSMintz, Yuval p_ptt, 5460c965db44STomer Tayar &needed_buf_size_in_dwords); 54617b6859fbSMintz, Yuval if (status != DBG_STATUS_OK && status != 54627b6859fbSMintz, Yuval DBG_STATUS_NVRAM_GET_IMAGE_FAILED) 5463c965db44STomer Tayar return status; 5464be086e7cSMintz, Yuval 5465c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5466c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5467c965db44STomer Tayar 5468c965db44STomer Tayar /* Update reset state */ 5469c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5470c965db44STomer Tayar 5471c965db44STomer Tayar /* Perform dump */ 5472be086e7cSMintz, Yuval status = qed_mcp_trace_dump(p_hwfn, 5473c965db44STomer Tayar p_ptt, dump_buf, true, num_dumped_dwords); 5474be086e7cSMintz, Yuval 5475be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5476be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5477be086e7cSMintz, Yuval 5478be086e7cSMintz, Yuval return status; 5479c965db44STomer Tayar } 5480c965db44STomer Tayar 5481c965db44STomer Tayar enum dbg_status qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5482c965db44STomer Tayar struct qed_ptt *p_ptt, 5483c965db44STomer Tayar u32 *buf_size) 5484c965db44STomer Tayar { 54852d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5486c965db44STomer Tayar 5487c965db44STomer Tayar *buf_size = 0; 54887b6859fbSMintz, Yuval 5489c965db44STomer Tayar if (status != DBG_STATUS_OK) 5490c965db44STomer Tayar return status; 54917b6859fbSMintz, Yuval 5492c965db44STomer Tayar return qed_reg_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5493c965db44STomer Tayar } 5494c965db44STomer Tayar 5495c965db44STomer Tayar enum dbg_status qed_dbg_reg_fifo_dump(struct qed_hwfn *p_hwfn, 5496c965db44STomer Tayar struct qed_ptt *p_ptt, 5497c965db44STomer Tayar u32 *dump_buf, 5498c965db44STomer Tayar u32 buf_size_in_dwords, 5499c965db44STomer Tayar u32 *num_dumped_dwords) 5500c965db44STomer Tayar { 5501c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5502c965db44STomer Tayar enum dbg_status status; 5503c965db44STomer Tayar 5504c965db44STomer Tayar *num_dumped_dwords = 0; 55057b6859fbSMintz, Yuval 55067b6859fbSMintz, Yuval status = qed_dbg_reg_fifo_get_dump_buf_size(p_hwfn, 55077b6859fbSMintz, Yuval p_ptt, 55087b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5509c965db44STomer Tayar if (status != DBG_STATUS_OK) 5510c965db44STomer Tayar return status; 55117b6859fbSMintz, Yuval 5512c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5513c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5514c965db44STomer Tayar 5515c965db44STomer Tayar /* Update reset state */ 5516c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5517be086e7cSMintz, Yuval 5518be086e7cSMintz, Yuval status = qed_reg_fifo_dump(p_hwfn, 5519c965db44STomer Tayar p_ptt, dump_buf, true, num_dumped_dwords); 5520be086e7cSMintz, Yuval 5521be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5522be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5523be086e7cSMintz, Yuval 5524be086e7cSMintz, Yuval return status; 5525c965db44STomer Tayar } 5526c965db44STomer Tayar 5527c965db44STomer Tayar enum dbg_status qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5528c965db44STomer Tayar struct qed_ptt *p_ptt, 5529c965db44STomer Tayar u32 *buf_size) 5530c965db44STomer Tayar { 55312d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5532c965db44STomer Tayar 5533c965db44STomer Tayar *buf_size = 0; 55347b6859fbSMintz, Yuval 5535c965db44STomer Tayar if (status != DBG_STATUS_OK) 5536c965db44STomer Tayar return status; 55377b6859fbSMintz, Yuval 5538c965db44STomer Tayar return qed_igu_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5539c965db44STomer Tayar } 5540c965db44STomer Tayar 5541c965db44STomer Tayar enum dbg_status qed_dbg_igu_fifo_dump(struct qed_hwfn *p_hwfn, 5542c965db44STomer Tayar struct qed_ptt *p_ptt, 5543c965db44STomer Tayar u32 *dump_buf, 5544c965db44STomer Tayar u32 buf_size_in_dwords, 5545c965db44STomer Tayar u32 *num_dumped_dwords) 5546c965db44STomer Tayar { 5547c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5548c965db44STomer Tayar enum dbg_status status; 5549c965db44STomer Tayar 5550c965db44STomer Tayar *num_dumped_dwords = 0; 55517b6859fbSMintz, Yuval 55527b6859fbSMintz, Yuval status = qed_dbg_igu_fifo_get_dump_buf_size(p_hwfn, 55537b6859fbSMintz, Yuval p_ptt, 55547b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5555c965db44STomer Tayar if (status != DBG_STATUS_OK) 5556c965db44STomer Tayar return status; 55577b6859fbSMintz, Yuval 5558c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5559c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5560c965db44STomer Tayar 5561c965db44STomer Tayar /* Update reset state */ 5562c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5563be086e7cSMintz, Yuval 5564be086e7cSMintz, Yuval status = qed_igu_fifo_dump(p_hwfn, 5565c965db44STomer Tayar p_ptt, dump_buf, true, num_dumped_dwords); 5566be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5567be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5568be086e7cSMintz, Yuval 5569be086e7cSMintz, Yuval return status; 5570c965db44STomer Tayar } 5571c965db44STomer Tayar 5572c965db44STomer Tayar enum dbg_status 5573c965db44STomer Tayar qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5574c965db44STomer Tayar struct qed_ptt *p_ptt, 5575c965db44STomer Tayar u32 *buf_size) 5576c965db44STomer Tayar { 55772d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5578c965db44STomer Tayar 5579c965db44STomer Tayar *buf_size = 0; 55807b6859fbSMintz, Yuval 5581c965db44STomer Tayar if (status != DBG_STATUS_OK) 5582c965db44STomer Tayar return status; 55837b6859fbSMintz, Yuval 5584c965db44STomer Tayar return qed_protection_override_dump(p_hwfn, 5585c965db44STomer Tayar p_ptt, NULL, false, buf_size); 5586c965db44STomer Tayar } 5587c965db44STomer Tayar 5588c965db44STomer Tayar enum dbg_status qed_dbg_protection_override_dump(struct qed_hwfn *p_hwfn, 5589c965db44STomer Tayar struct qed_ptt *p_ptt, 5590c965db44STomer Tayar u32 *dump_buf, 5591c965db44STomer Tayar u32 buf_size_in_dwords, 5592c965db44STomer Tayar u32 *num_dumped_dwords) 5593c965db44STomer Tayar { 55947b6859fbSMintz, Yuval u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords; 5595c965db44STomer Tayar enum dbg_status status; 5596c965db44STomer Tayar 5597c965db44STomer Tayar *num_dumped_dwords = 0; 55987b6859fbSMintz, Yuval 55997b6859fbSMintz, Yuval status = 56007b6859fbSMintz, Yuval qed_dbg_protection_override_get_dump_buf_size(p_hwfn, 56017b6859fbSMintz, Yuval p_ptt, 56027b6859fbSMintz, Yuval p_size); 5603c965db44STomer Tayar if (status != DBG_STATUS_OK) 5604c965db44STomer Tayar return status; 56057b6859fbSMintz, Yuval 5606c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5607c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5608c965db44STomer Tayar 5609c965db44STomer Tayar /* Update reset state */ 5610c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5611be086e7cSMintz, Yuval 5612be086e7cSMintz, Yuval status = qed_protection_override_dump(p_hwfn, 5613c965db44STomer Tayar p_ptt, 5614be086e7cSMintz, Yuval dump_buf, 5615be086e7cSMintz, Yuval true, num_dumped_dwords); 5616be086e7cSMintz, Yuval 5617be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5618be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5619be086e7cSMintz, Yuval 5620be086e7cSMintz, Yuval return status; 5621c965db44STomer Tayar } 5622c965db44STomer Tayar 5623c965db44STomer Tayar enum dbg_status qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5624c965db44STomer Tayar struct qed_ptt *p_ptt, 5625c965db44STomer Tayar u32 *buf_size) 5626c965db44STomer Tayar { 56272d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5628c965db44STomer Tayar 5629c965db44STomer Tayar *buf_size = 0; 56307b6859fbSMintz, Yuval 5631c965db44STomer Tayar if (status != DBG_STATUS_OK) 5632c965db44STomer Tayar return status; 5633c965db44STomer Tayar 5634c965db44STomer Tayar /* Update reset state */ 5635c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 56367b6859fbSMintz, Yuval 5637c965db44STomer Tayar *buf_size = qed_fw_asserts_dump(p_hwfn, p_ptt, NULL, false); 56387b6859fbSMintz, Yuval 5639c965db44STomer Tayar return DBG_STATUS_OK; 5640c965db44STomer Tayar } 5641c965db44STomer Tayar 5642c965db44STomer Tayar enum dbg_status qed_dbg_fw_asserts_dump(struct qed_hwfn *p_hwfn, 5643c965db44STomer Tayar struct qed_ptt *p_ptt, 5644c965db44STomer Tayar u32 *dump_buf, 5645c965db44STomer Tayar u32 buf_size_in_dwords, 5646c965db44STomer Tayar u32 *num_dumped_dwords) 5647c965db44STomer Tayar { 56487b6859fbSMintz, Yuval u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords; 5649c965db44STomer Tayar enum dbg_status status; 5650c965db44STomer Tayar 5651c965db44STomer Tayar *num_dumped_dwords = 0; 56527b6859fbSMintz, Yuval 56537b6859fbSMintz, Yuval status = 56547b6859fbSMintz, Yuval qed_dbg_fw_asserts_get_dump_buf_size(p_hwfn, 56557b6859fbSMintz, Yuval p_ptt, 56567b6859fbSMintz, Yuval p_size); 5657c965db44STomer Tayar if (status != DBG_STATUS_OK) 5658c965db44STomer Tayar return status; 56597b6859fbSMintz, Yuval 5660c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5661c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5662c965db44STomer Tayar 5663c965db44STomer Tayar *num_dumped_dwords = qed_fw_asserts_dump(p_hwfn, p_ptt, dump_buf, true); 56647b6859fbSMintz, Yuval 56657b6859fbSMintz, Yuval /* Revert GRC params to their default */ 56667b6859fbSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 56677b6859fbSMintz, Yuval 5668c965db44STomer Tayar return DBG_STATUS_OK; 5669c965db44STomer Tayar } 5670c965db44STomer Tayar 56718a52bbabSMichal Kalderon static enum dbg_status qed_dbg_ilt_get_dump_buf_size(struct qed_hwfn *p_hwfn, 56728a52bbabSMichal Kalderon struct qed_ptt *p_ptt, 56738a52bbabSMichal Kalderon u32 *buf_size) 56748a52bbabSMichal Kalderon { 56752d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 56768a52bbabSMichal Kalderon 56778a52bbabSMichal Kalderon *buf_size = 0; 56788a52bbabSMichal Kalderon 56798a52bbabSMichal Kalderon if (status != DBG_STATUS_OK) 56808a52bbabSMichal Kalderon return status; 56818a52bbabSMichal Kalderon 5682*6c95dd8fSPrabhakar Kushwaha *buf_size = qed_ilt_dump(p_hwfn, p_ptt, NULL, 0, false); 56838a52bbabSMichal Kalderon 56848a52bbabSMichal Kalderon return DBG_STATUS_OK; 56858a52bbabSMichal Kalderon } 56868a52bbabSMichal Kalderon 56878a52bbabSMichal Kalderon static enum dbg_status qed_dbg_ilt_dump(struct qed_hwfn *p_hwfn, 56888a52bbabSMichal Kalderon struct qed_ptt *p_ptt, 56898a52bbabSMichal Kalderon u32 *dump_buf, 56908a52bbabSMichal Kalderon u32 buf_size_in_dwords, 56918a52bbabSMichal Kalderon u32 *num_dumped_dwords) 56928a52bbabSMichal Kalderon { 5693*6c95dd8fSPrabhakar Kushwaha *num_dumped_dwords = qed_ilt_dump(p_hwfn, 56948a52bbabSMichal Kalderon p_ptt, 5695*6c95dd8fSPrabhakar Kushwaha dump_buf, buf_size_in_dwords, true); 56968a52bbabSMichal Kalderon 56978a52bbabSMichal Kalderon /* Reveret GRC params to their default */ 56988a52bbabSMichal Kalderon qed_dbg_grc_set_params_default(p_hwfn); 56998a52bbabSMichal Kalderon 57008a52bbabSMichal Kalderon return DBG_STATUS_OK; 57018a52bbabSMichal Kalderon } 57028a52bbabSMichal Kalderon 57030ebbd1c8SMintz, Yuval enum dbg_status qed_dbg_read_attn(struct qed_hwfn *p_hwfn, 57040ebbd1c8SMintz, Yuval struct qed_ptt *p_ptt, 57050ebbd1c8SMintz, Yuval enum block_id block_id, 57060ebbd1c8SMintz, Yuval enum dbg_attn_type attn_type, 57070ebbd1c8SMintz, Yuval bool clear_status, 57080ebbd1c8SMintz, Yuval struct dbg_attn_block_result *results) 57090ebbd1c8SMintz, Yuval { 57102d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 57110ebbd1c8SMintz, Yuval u8 reg_idx, num_attn_regs, num_result_regs = 0; 57120ebbd1c8SMintz, Yuval const struct dbg_attn_reg *attn_reg_arr; 57130ebbd1c8SMintz, Yuval 57140ebbd1c8SMintz, Yuval if (status != DBG_STATUS_OK) 57150ebbd1c8SMintz, Yuval return status; 57160ebbd1c8SMintz, Yuval 57172d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr || 57182d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr || 57192d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr) 57200ebbd1c8SMintz, Yuval return DBG_STATUS_DBG_ARRAY_NOT_SET; 57210ebbd1c8SMintz, Yuval 57222d22bc83SMichal Kalderon attn_reg_arr = qed_get_block_attn_regs(p_hwfn, 57232d22bc83SMichal Kalderon block_id, 57240ebbd1c8SMintz, Yuval attn_type, &num_attn_regs); 57250ebbd1c8SMintz, Yuval 57260ebbd1c8SMintz, Yuval for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) { 57270ebbd1c8SMintz, Yuval const struct dbg_attn_reg *reg_data = &attn_reg_arr[reg_idx]; 57280ebbd1c8SMintz, Yuval struct dbg_attn_reg_result *reg_result; 57290ebbd1c8SMintz, Yuval u32 sts_addr, sts_val; 57300ebbd1c8SMintz, Yuval u16 modes_buf_offset; 57310ebbd1c8SMintz, Yuval bool eval_mode; 57320ebbd1c8SMintz, Yuval 57330ebbd1c8SMintz, Yuval /* Check mode */ 57340ebbd1c8SMintz, Yuval eval_mode = GET_FIELD(reg_data->mode.data, 57350ebbd1c8SMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 57360ebbd1c8SMintz, Yuval modes_buf_offset = GET_FIELD(reg_data->mode.data, 57370ebbd1c8SMintz, Yuval DBG_MODE_HDR_MODES_BUF_OFFSET); 57380ebbd1c8SMintz, Yuval if (eval_mode && !qed_is_mode_match(p_hwfn, &modes_buf_offset)) 57390ebbd1c8SMintz, Yuval continue; 57400ebbd1c8SMintz, Yuval 57410ebbd1c8SMintz, Yuval /* Mode match - read attention status register */ 57420ebbd1c8SMintz, Yuval sts_addr = DWORDS_TO_BYTES(clear_status ? 57430ebbd1c8SMintz, Yuval reg_data->sts_clr_address : 57440ebbd1c8SMintz, Yuval GET_FIELD(reg_data->data, 57450ebbd1c8SMintz, Yuval DBG_ATTN_REG_STS_ADDRESS)); 57460ebbd1c8SMintz, Yuval sts_val = qed_rd(p_hwfn, p_ptt, sts_addr); 57470ebbd1c8SMintz, Yuval if (!sts_val) 57480ebbd1c8SMintz, Yuval continue; 57490ebbd1c8SMintz, Yuval 57500ebbd1c8SMintz, Yuval /* Non-zero attention status - add to results */ 57510ebbd1c8SMintz, Yuval reg_result = &results->reg_results[num_result_regs]; 57520ebbd1c8SMintz, Yuval SET_FIELD(reg_result->data, 57530ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_STS_ADDRESS, sts_addr); 57540ebbd1c8SMintz, Yuval SET_FIELD(reg_result->data, 57550ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_NUM_REG_ATTN, 57560ebbd1c8SMintz, Yuval GET_FIELD(reg_data->data, DBG_ATTN_REG_NUM_REG_ATTN)); 57570ebbd1c8SMintz, Yuval reg_result->block_attn_offset = reg_data->block_attn_offset; 57580ebbd1c8SMintz, Yuval reg_result->sts_val = sts_val; 57590ebbd1c8SMintz, Yuval reg_result->mask_val = qed_rd(p_hwfn, 57600ebbd1c8SMintz, Yuval p_ptt, 57610ebbd1c8SMintz, Yuval DWORDS_TO_BYTES 57620ebbd1c8SMintz, Yuval (reg_data->mask_address)); 57630ebbd1c8SMintz, Yuval num_result_regs++; 57640ebbd1c8SMintz, Yuval } 57650ebbd1c8SMintz, Yuval 57660ebbd1c8SMintz, Yuval results->block_id = (u8)block_id; 57670ebbd1c8SMintz, Yuval results->names_offset = 57682d22bc83SMichal Kalderon qed_get_block_attn_data(p_hwfn, block_id, attn_type)->names_offset; 57690ebbd1c8SMintz, Yuval SET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE, attn_type); 57700ebbd1c8SMintz, Yuval SET_FIELD(results->data, 57710ebbd1c8SMintz, Yuval DBG_ATTN_BLOCK_RESULT_NUM_REGS, num_result_regs); 57720ebbd1c8SMintz, Yuval 57730ebbd1c8SMintz, Yuval return DBG_STATUS_OK; 57740ebbd1c8SMintz, Yuval } 57750ebbd1c8SMintz, Yuval 5776c965db44STomer Tayar /******************************* Data Types **********************************/ 5777c965db44STomer Tayar 57787b6859fbSMintz, Yuval /* REG fifo element */ 5779c965db44STomer Tayar struct reg_fifo_element { 5780c965db44STomer Tayar u64 data; 5781c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDRESS_SHIFT 0 5782c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDRESS_MASK 0x7fffff 5783c965db44STomer Tayar #define REG_FIFO_ELEMENT_ACCESS_SHIFT 23 5784c965db44STomer Tayar #define REG_FIFO_ELEMENT_ACCESS_MASK 0x1 5785c965db44STomer Tayar #define REG_FIFO_ELEMENT_PF_SHIFT 24 5786c965db44STomer Tayar #define REG_FIFO_ELEMENT_PF_MASK 0xf 5787c965db44STomer Tayar #define REG_FIFO_ELEMENT_VF_SHIFT 28 5788c965db44STomer Tayar #define REG_FIFO_ELEMENT_VF_MASK 0xff 5789c965db44STomer Tayar #define REG_FIFO_ELEMENT_PORT_SHIFT 36 5790c965db44STomer Tayar #define REG_FIFO_ELEMENT_PORT_MASK 0x3 5791c965db44STomer Tayar #define REG_FIFO_ELEMENT_PRIVILEGE_SHIFT 38 5792c965db44STomer Tayar #define REG_FIFO_ELEMENT_PRIVILEGE_MASK 0x3 5793c965db44STomer Tayar #define REG_FIFO_ELEMENT_PROTECTION_SHIFT 40 5794c965db44STomer Tayar #define REG_FIFO_ELEMENT_PROTECTION_MASK 0x7 5795c965db44STomer Tayar #define REG_FIFO_ELEMENT_MASTER_SHIFT 43 5796c965db44STomer Tayar #define REG_FIFO_ELEMENT_MASTER_MASK 0xf 5797c965db44STomer Tayar #define REG_FIFO_ELEMENT_ERROR_SHIFT 47 5798c965db44STomer Tayar #define REG_FIFO_ELEMENT_ERROR_MASK 0x1f 5799c965db44STomer Tayar }; 5800c965db44STomer Tayar 58012d22bc83SMichal Kalderon /* REG fifo error element */ 58022d22bc83SMichal Kalderon struct reg_fifo_err { 58032d22bc83SMichal Kalderon u32 err_code; 58042d22bc83SMichal Kalderon const char *err_msg; 58052d22bc83SMichal Kalderon }; 58062d22bc83SMichal Kalderon 5807c965db44STomer Tayar /* IGU fifo element */ 5808c965db44STomer Tayar struct igu_fifo_element { 5809c965db44STomer Tayar u32 dword0; 5810c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_FID_SHIFT 0 5811c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_FID_MASK 0xff 5812c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_SHIFT 8 5813c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_MASK 0x1 5814c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_SHIFT 9 5815c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_MASK 0xf 5816c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_SHIFT 13 5817c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_MASK 0xf 5818c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_SHIFT 17 5819c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_MASK 0x7fff 5820c965db44STomer Tayar u32 dword1; 5821c965db44STomer Tayar u32 dword2; 5822c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_SHIFT 0 5823c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_MASK 0x1 5824c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_SHIFT 1 5825c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_MASK 0xffffffff 5826c965db44STomer Tayar u32 reserved; 5827c965db44STomer Tayar }; 5828c965db44STomer Tayar 5829c965db44STomer Tayar struct igu_fifo_wr_data { 5830c965db44STomer Tayar u32 data; 5831c965db44STomer Tayar #define IGU_FIFO_WR_DATA_PROD_CONS_SHIFT 0 5832c965db44STomer Tayar #define IGU_FIFO_WR_DATA_PROD_CONS_MASK 0xffffff 5833c965db44STomer Tayar #define IGU_FIFO_WR_DATA_UPDATE_FLAG_SHIFT 24 5834c965db44STomer Tayar #define IGU_FIFO_WR_DATA_UPDATE_FLAG_MASK 0x1 5835c965db44STomer Tayar #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_SHIFT 25 5836c965db44STomer Tayar #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_MASK 0x3 5837c965db44STomer Tayar #define IGU_FIFO_WR_DATA_SEGMENT_SHIFT 27 5838c965db44STomer Tayar #define IGU_FIFO_WR_DATA_SEGMENT_MASK 0x1 5839c965db44STomer Tayar #define IGU_FIFO_WR_DATA_TIMER_MASK_SHIFT 28 5840c965db44STomer Tayar #define IGU_FIFO_WR_DATA_TIMER_MASK_MASK 0x1 5841c965db44STomer Tayar #define IGU_FIFO_WR_DATA_CMD_TYPE_SHIFT 31 5842c965db44STomer Tayar #define IGU_FIFO_WR_DATA_CMD_TYPE_MASK 0x1 5843c965db44STomer Tayar }; 5844c965db44STomer Tayar 5845c965db44STomer Tayar struct igu_fifo_cleanup_wr_data { 5846c965db44STomer Tayar u32 data; 5847c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_SHIFT 0 5848c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_MASK 0x7ffffff 5849c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_SHIFT 27 5850c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_MASK 0x1 5851c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_SHIFT 28 5852c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_MASK 0x7 5853c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_SHIFT 31 5854c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_MASK 0x1 5855c965db44STomer Tayar }; 5856c965db44STomer Tayar 5857c965db44STomer Tayar /* Protection override element */ 5858c965db44STomer Tayar struct protection_override_element { 5859c965db44STomer Tayar u64 data; 5860c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_SHIFT 0 5861c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_MASK 0x7fffff 5862c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_SHIFT 23 5863c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_MASK 0xffffff 5864c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_SHIFT 47 5865c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_MASK 0x1 5866c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_SHIFT 48 5867c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_MASK 0x1 5868c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_SHIFT 49 5869c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_MASK 0x7 5870c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_SHIFT 52 5871c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_MASK 0x7 5872c965db44STomer Tayar }; 5873c965db44STomer Tayar 5874c965db44STomer Tayar enum igu_fifo_sources { 5875c965db44STomer Tayar IGU_SRC_PXP0, 5876c965db44STomer Tayar IGU_SRC_PXP1, 5877c965db44STomer Tayar IGU_SRC_PXP2, 5878c965db44STomer Tayar IGU_SRC_PXP3, 5879c965db44STomer Tayar IGU_SRC_PXP4, 5880c965db44STomer Tayar IGU_SRC_PXP5, 5881c965db44STomer Tayar IGU_SRC_PXP6, 5882c965db44STomer Tayar IGU_SRC_PXP7, 5883c965db44STomer Tayar IGU_SRC_CAU, 5884c965db44STomer Tayar IGU_SRC_ATTN, 5885c965db44STomer Tayar IGU_SRC_GRC 5886c965db44STomer Tayar }; 5887c965db44STomer Tayar 5888c965db44STomer Tayar enum igu_fifo_addr_types { 5889c965db44STomer Tayar IGU_ADDR_TYPE_MSIX_MEM, 5890c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_PBA, 5891c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_INT_ACK, 5892c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS, 5893c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT, 5894c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_PROD_UPDATE, 5895c965db44STomer Tayar IGU_ADDR_TYPE_RESERVED 5896c965db44STomer Tayar }; 5897c965db44STomer Tayar 5898c965db44STomer Tayar struct igu_fifo_addr_data { 5899c965db44STomer Tayar u16 start_addr; 5900c965db44STomer Tayar u16 end_addr; 5901c965db44STomer Tayar char *desc; 5902c965db44STomer Tayar char *vf_desc; 5903c965db44STomer Tayar enum igu_fifo_addr_types type; 5904c965db44STomer Tayar }; 5905c965db44STomer Tayar 5906c965db44STomer Tayar /******************************** Constants **********************************/ 5907c965db44STomer Tayar 5908c965db44STomer Tayar #define MAX_MSG_LEN 1024 59097b6859fbSMintz, Yuval 5910c965db44STomer Tayar #define MCP_TRACE_MAX_MODULE_LEN 8 5911c965db44STomer Tayar #define MCP_TRACE_FORMAT_MAX_PARAMS 3 5912c965db44STomer Tayar #define MCP_TRACE_FORMAT_PARAM_WIDTH \ 59132d22bc83SMichal Kalderon (MCP_TRACE_FORMAT_P2_SIZE_OFFSET - MCP_TRACE_FORMAT_P1_SIZE_OFFSET) 59147b6859fbSMintz, Yuval 5915c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDR_FACTOR 4 5916c965db44STomer Tayar #define REG_FIFO_ELEMENT_IS_PF_VF_VAL 127 59177b6859fbSMintz, Yuval 5918c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR 4 5919c965db44STomer Tayar 5920c965db44STomer Tayar /***************************** Constant Arrays *******************************/ 5921c965db44STomer Tayar 5922c965db44STomer Tayar /* Status string array */ 5923c965db44STomer Tayar static const char * const s_status_str[] = { 59247b6859fbSMintz, Yuval /* DBG_STATUS_OK */ 5925c965db44STomer Tayar "Operation completed successfully", 59267b6859fbSMintz, Yuval 59277b6859fbSMintz, Yuval /* DBG_STATUS_APP_VERSION_NOT_SET */ 5928c965db44STomer Tayar "Debug application version wasn't set", 59297b6859fbSMintz, Yuval 59307b6859fbSMintz, Yuval /* DBG_STATUS_UNSUPPORTED_APP_VERSION */ 5931c965db44STomer Tayar "Unsupported debug application version", 59327b6859fbSMintz, Yuval 59337b6859fbSMintz, Yuval /* DBG_STATUS_DBG_BLOCK_NOT_RESET */ 5934c965db44STomer Tayar "The debug block wasn't reset since the last recording", 59357b6859fbSMintz, Yuval 59367b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_ARGS */ 5937c965db44STomer Tayar "Invalid arguments", 59387b6859fbSMintz, Yuval 59397b6859fbSMintz, Yuval /* DBG_STATUS_OUTPUT_ALREADY_SET */ 5940c965db44STomer Tayar "The debug output was already set", 59417b6859fbSMintz, Yuval 59427b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_PCI_BUF_SIZE */ 5943c965db44STomer Tayar "Invalid PCI buffer size", 59447b6859fbSMintz, Yuval 59457b6859fbSMintz, Yuval /* DBG_STATUS_PCI_BUF_ALLOC_FAILED */ 5946c965db44STomer Tayar "PCI buffer allocation failed", 59477b6859fbSMintz, Yuval 59487b6859fbSMintz, Yuval /* DBG_STATUS_PCI_BUF_NOT_ALLOCATED */ 5949c965db44STomer Tayar "A PCI buffer wasn't allocated", 59507b6859fbSMintz, Yuval 59512d22bc83SMichal Kalderon /* DBG_STATUS_INVALID_FILTER_TRIGGER_DWORDS */ 59522d22bc83SMichal Kalderon "The filter/trigger constraint dword offsets are not enabled for recording", 5953a5124386SColin Ian King /* DBG_STATUS_NO_MATCHING_FRAMING_MODE */ 5954a5124386SColin Ian King "No matching framing mode", 59557b6859fbSMintz, Yuval 59562d22bc83SMichal Kalderon /* DBG_STATUS_VFC_READ_ERROR */ 59572d22bc83SMichal Kalderon "Error reading from VFC", 59587b6859fbSMintz, Yuval 59597b6859fbSMintz, Yuval /* DBG_STATUS_STORM_ALREADY_ENABLED */ 5960c965db44STomer Tayar "The Storm was already enabled", 59617b6859fbSMintz, Yuval 59627b6859fbSMintz, Yuval /* DBG_STATUS_STORM_NOT_ENABLED */ 5963c965db44STomer Tayar "The specified Storm wasn't enabled", 59647b6859fbSMintz, Yuval 59657b6859fbSMintz, Yuval /* DBG_STATUS_BLOCK_ALREADY_ENABLED */ 5966c965db44STomer Tayar "The block was already enabled", 59677b6859fbSMintz, Yuval 59687b6859fbSMintz, Yuval /* DBG_STATUS_BLOCK_NOT_ENABLED */ 5969c965db44STomer Tayar "The specified block wasn't enabled", 59707b6859fbSMintz, Yuval 59717b6859fbSMintz, Yuval /* DBG_STATUS_NO_INPUT_ENABLED */ 5972c965db44STomer Tayar "No input was enabled for recording", 59737b6859fbSMintz, Yuval 59742d22bc83SMichal Kalderon /* DBG_STATUS_NO_FILTER_TRIGGER_256B */ 59752d22bc83SMichal Kalderon "Filters and triggers are not allowed in E4 256-bit mode", 59767b6859fbSMintz, Yuval 59777b6859fbSMintz, Yuval /* DBG_STATUS_FILTER_ALREADY_ENABLED */ 5978c965db44STomer Tayar "The filter was already enabled", 59797b6859fbSMintz, Yuval 59807b6859fbSMintz, Yuval /* DBG_STATUS_TRIGGER_ALREADY_ENABLED */ 5981c965db44STomer Tayar "The trigger was already enabled", 59827b6859fbSMintz, Yuval 59837b6859fbSMintz, Yuval /* DBG_STATUS_TRIGGER_NOT_ENABLED */ 5984c965db44STomer Tayar "The trigger wasn't enabled", 59857b6859fbSMintz, Yuval 59867b6859fbSMintz, Yuval /* DBG_STATUS_CANT_ADD_CONSTRAINT */ 5987c965db44STomer Tayar "A constraint can be added only after a filter was enabled or a trigger state was added", 59887b6859fbSMintz, Yuval 59897b6859fbSMintz, Yuval /* DBG_STATUS_TOO_MANY_TRIGGER_STATES */ 5990c965db44STomer Tayar "Cannot add more than 3 trigger states", 59917b6859fbSMintz, Yuval 59927b6859fbSMintz, Yuval /* DBG_STATUS_TOO_MANY_CONSTRAINTS */ 5993c965db44STomer Tayar "Cannot add more than 4 constraints per filter or trigger state", 59947b6859fbSMintz, Yuval 59957b6859fbSMintz, Yuval /* DBG_STATUS_RECORDING_NOT_STARTED */ 5996c965db44STomer Tayar "The recording wasn't started", 59977b6859fbSMintz, Yuval 59987b6859fbSMintz, Yuval /* DBG_STATUS_DATA_DIDNT_TRIGGER */ 5999c965db44STomer Tayar "A trigger was configured, but it didn't trigger", 60007b6859fbSMintz, Yuval 60017b6859fbSMintz, Yuval /* DBG_STATUS_NO_DATA_RECORDED */ 6002c965db44STomer Tayar "No data was recorded", 60037b6859fbSMintz, Yuval 60047b6859fbSMintz, Yuval /* DBG_STATUS_DUMP_BUF_TOO_SMALL */ 6005c965db44STomer Tayar "Dump buffer is too small", 60067b6859fbSMintz, Yuval 60077b6859fbSMintz, Yuval /* DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED */ 6008c965db44STomer Tayar "Dumped data is not aligned to chunks", 60097b6859fbSMintz, Yuval 60107b6859fbSMintz, Yuval /* DBG_STATUS_UNKNOWN_CHIP */ 6011c965db44STomer Tayar "Unknown chip", 60127b6859fbSMintz, Yuval 60137b6859fbSMintz, Yuval /* DBG_STATUS_VIRT_MEM_ALLOC_FAILED */ 6014c965db44STomer Tayar "Failed allocating virtual memory", 60157b6859fbSMintz, Yuval 60167b6859fbSMintz, Yuval /* DBG_STATUS_BLOCK_IN_RESET */ 6017c965db44STomer Tayar "The input block is in reset", 60187b6859fbSMintz, Yuval 60197b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_TRACE_SIGNATURE */ 6020c965db44STomer Tayar "Invalid MCP trace signature found in NVRAM", 60217b6859fbSMintz, Yuval 60227b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_NVRAM_BUNDLE */ 6023c965db44STomer Tayar "Invalid bundle ID found in NVRAM", 60247b6859fbSMintz, Yuval 60257b6859fbSMintz, Yuval /* DBG_STATUS_NVRAM_GET_IMAGE_FAILED */ 6026c965db44STomer Tayar "Failed getting NVRAM image", 60277b6859fbSMintz, Yuval 60287b6859fbSMintz, Yuval /* DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE */ 6029c965db44STomer Tayar "NVRAM image is not dword-aligned", 60307b6859fbSMintz, Yuval 60317b6859fbSMintz, Yuval /* DBG_STATUS_NVRAM_READ_FAILED */ 6032c965db44STomer Tayar "Failed reading from NVRAM", 60337b6859fbSMintz, Yuval 60347b6859fbSMintz, Yuval /* DBG_STATUS_IDLE_CHK_PARSE_FAILED */ 6035c965db44STomer Tayar "Idle check parsing failed", 60367b6859fbSMintz, Yuval 60377b6859fbSMintz, Yuval /* DBG_STATUS_MCP_TRACE_BAD_DATA */ 6038c965db44STomer Tayar "MCP Trace data is corrupt", 60397b6859fbSMintz, Yuval 60407b6859fbSMintz, Yuval /* DBG_STATUS_MCP_TRACE_NO_META */ 60417b6859fbSMintz, Yuval "Dump doesn't contain meta data - it must be provided in image file", 60427b6859fbSMintz, Yuval 60437b6859fbSMintz, Yuval /* DBG_STATUS_MCP_COULD_NOT_HALT */ 6044c965db44STomer Tayar "Failed to halt MCP", 60457b6859fbSMintz, Yuval 60467b6859fbSMintz, Yuval /* DBG_STATUS_MCP_COULD_NOT_RESUME */ 6047c965db44STomer Tayar "Failed to resume MCP after halt", 60487b6859fbSMintz, Yuval 60492d22bc83SMichal Kalderon /* DBG_STATUS_RESERVED0 */ 60502d22bc83SMichal Kalderon "", 60517b6859fbSMintz, Yuval 60527b6859fbSMintz, Yuval /* DBG_STATUS_SEMI_FIFO_NOT_EMPTY */ 6053c965db44STomer Tayar "Failed to empty SEMI sync FIFO", 60547b6859fbSMintz, Yuval 60557b6859fbSMintz, Yuval /* DBG_STATUS_IGU_FIFO_BAD_DATA */ 6056c965db44STomer Tayar "IGU FIFO data is corrupt", 60577b6859fbSMintz, Yuval 60587b6859fbSMintz, Yuval /* DBG_STATUS_MCP_COULD_NOT_MASK_PRTY */ 6059c965db44STomer Tayar "MCP failed to mask parities", 60607b6859fbSMintz, Yuval 60617b6859fbSMintz, Yuval /* DBG_STATUS_FW_ASSERTS_PARSE_FAILED */ 6062c965db44STomer Tayar "FW Asserts parsing failed", 60637b6859fbSMintz, Yuval 60647b6859fbSMintz, Yuval /* DBG_STATUS_REG_FIFO_BAD_DATA */ 6065c965db44STomer Tayar "GRC FIFO data is corrupt", 60667b6859fbSMintz, Yuval 60677b6859fbSMintz, Yuval /* DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA */ 6068c965db44STomer Tayar "Protection Override data is corrupt", 60697b6859fbSMintz, Yuval 60707b6859fbSMintz, Yuval /* DBG_STATUS_DBG_ARRAY_NOT_SET */ 6071c965db44STomer Tayar "Debug arrays were not set (when using binary files, dbg_set_bin_ptr must be called)", 60727b6859fbSMintz, Yuval 60732d22bc83SMichal Kalderon /* DBG_STATUS_RESERVED1 */ 60742d22bc83SMichal Kalderon "", 60757b6859fbSMintz, Yuval 60767b6859fbSMintz, Yuval /* DBG_STATUS_NON_MATCHING_LINES */ 60772d22bc83SMichal Kalderon "Non-matching debug lines - in E4, all lines must be of the same type (either 128b or 256b)", 60787b6859fbSMintz, Yuval 60792d22bc83SMichal Kalderon /* DBG_STATUS_INSUFFICIENT_HW_IDS */ 60802d22bc83SMichal Kalderon "Insufficient HW IDs. Try to record less Storms/blocks", 60817b6859fbSMintz, Yuval 60827b6859fbSMintz, Yuval /* DBG_STATUS_DBG_BUS_IN_USE */ 60832d22bc83SMichal Kalderon "The debug bus is in use", 60842d22bc83SMichal Kalderon 60852d22bc83SMichal Kalderon /* DBG_STATUS_INVALID_STORM_DBG_MODE */ 60862d22bc83SMichal Kalderon "The storm debug mode is not supported in the current chip", 60872d22bc83SMichal Kalderon 60882d22bc83SMichal Kalderon /* DBG_STATUS_OTHER_ENGINE_BB_ONLY */ 60892d22bc83SMichal Kalderon "Other engine is supported only in BB", 60902d22bc83SMichal Kalderon 60912d22bc83SMichal Kalderon /* DBG_STATUS_FILTER_SINGLE_HW_ID */ 60922d22bc83SMichal Kalderon "The configured filter mode requires a single Storm/block input", 60932d22bc83SMichal Kalderon 60942d22bc83SMichal Kalderon /* DBG_STATUS_TRIGGER_SINGLE_HW_ID */ 60952d22bc83SMichal Kalderon "The configured filter mode requires that all the constraints of a single trigger state will be defined on a single Storm/block input", 60962d22bc83SMichal Kalderon 60972d22bc83SMichal Kalderon /* DBG_STATUS_MISSING_TRIGGER_STATE_STORM */ 6098*6c95dd8fSPrabhakar Kushwaha "When triggering on Storm data, the Storm to trigger on must be specified", 6099*6c95dd8fSPrabhakar Kushwaha 6100*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_FAILED_TO_REQUEST_OFFSIZE */ 6101*6c95dd8fSPrabhakar Kushwaha "Failed to request MDUMP2 Offsize", 6102*6c95dd8fSPrabhakar Kushwaha 6103*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_FAILED_VALIDATION_OF_DATA_CRC */ 6104*6c95dd8fSPrabhakar Kushwaha "Expected CRC (part of the MDUMP2 data) is different than the calculated CRC over that data", 6105*6c95dd8fSPrabhakar Kushwaha 6106*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_INVALID_SIGNATURE */ 6107*6c95dd8fSPrabhakar Kushwaha "Invalid Signature found at start of MDUMP2", 6108*6c95dd8fSPrabhakar Kushwaha 6109*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_INVALID_LOG_SIZE */ 6110*6c95dd8fSPrabhakar Kushwaha "Invalid Log Size of MDUMP2", 6111*6c95dd8fSPrabhakar Kushwaha 6112*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_INVALID_LOG_HDR */ 6113*6c95dd8fSPrabhakar Kushwaha "Invalid Log Header of MDUMP2", 6114*6c95dd8fSPrabhakar Kushwaha 6115*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_INVALID_LOG_DATA */ 6116*6c95dd8fSPrabhakar Kushwaha "Invalid Log Data of MDUMP2", 6117*6c95dd8fSPrabhakar Kushwaha 6118*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_EXTRACTING_NUM_PORTS */ 6119*6c95dd8fSPrabhakar Kushwaha "Could not extract number of ports from regval buf of MDUMP2", 6120*6c95dd8fSPrabhakar Kushwaha 6121*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_EXTRACTING_MFW_STATUS */ 6122*6c95dd8fSPrabhakar Kushwaha "Could not extract MFW (link) status from regval buf of MDUMP2", 6123*6c95dd8fSPrabhakar Kushwaha 6124*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_DISPLAYING_LINKDUMP */ 6125*6c95dd8fSPrabhakar Kushwaha "Could not display linkdump of MDUMP2", 6126*6c95dd8fSPrabhakar Kushwaha 6127*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_READING_PHY_CFG */ 6128*6c95dd8fSPrabhakar Kushwaha "Could not read PHY CFG of MDUMP2", 6129*6c95dd8fSPrabhakar Kushwaha 6130*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_READING_PLL_MODE */ 6131*6c95dd8fSPrabhakar Kushwaha "Could not read PLL Mode of MDUMP2", 6132*6c95dd8fSPrabhakar Kushwaha 6133*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_READING_LANE_REGS */ 6134*6c95dd8fSPrabhakar Kushwaha "Could not read TSCF/TSCE Lane Regs of MDUMP2", 6135*6c95dd8fSPrabhakar Kushwaha 6136*6c95dd8fSPrabhakar Kushwaha /* DBG_STATUS_MDUMP2_ERROR_ALLOCATING_BUF */ 6137*6c95dd8fSPrabhakar Kushwaha "Could not allocate MDUMP2 reg-val internal buffer" 6138c965db44STomer Tayar }; 6139c965db44STomer Tayar 6140c965db44STomer Tayar /* Idle check severity names array */ 6141c965db44STomer Tayar static const char * const s_idle_chk_severity_str[] = { 6142c965db44STomer Tayar "Error", 6143c965db44STomer Tayar "Error if no traffic", 6144c965db44STomer Tayar "Warning" 6145c965db44STomer Tayar }; 6146c965db44STomer Tayar 6147c965db44STomer Tayar /* MCP Trace level names array */ 6148c965db44STomer Tayar static const char * const s_mcp_trace_level_str[] = { 6149c965db44STomer Tayar "ERROR", 6150c965db44STomer Tayar "TRACE", 6151c965db44STomer Tayar "DEBUG" 6152c965db44STomer Tayar }; 6153c965db44STomer Tayar 61547b6859fbSMintz, Yuval /* Access type names array */ 6155c965db44STomer Tayar static const char * const s_access_strs[] = { 6156c965db44STomer Tayar "read", 6157c965db44STomer Tayar "write" 6158c965db44STomer Tayar }; 6159c965db44STomer Tayar 61607b6859fbSMintz, Yuval /* Privilege type names array */ 6161c965db44STomer Tayar static const char * const s_privilege_strs[] = { 6162c965db44STomer Tayar "VF", 6163c965db44STomer Tayar "PDA", 6164c965db44STomer Tayar "HV", 6165c965db44STomer Tayar "UA" 6166c965db44STomer Tayar }; 6167c965db44STomer Tayar 61687b6859fbSMintz, Yuval /* Protection type names array */ 6169c965db44STomer Tayar static const char * const s_protection_strs[] = { 6170c965db44STomer Tayar "(default)", 6171c965db44STomer Tayar "(default)", 6172c965db44STomer Tayar "(default)", 6173c965db44STomer Tayar "(default)", 6174c965db44STomer Tayar "override VF", 6175c965db44STomer Tayar "override PDA", 6176c965db44STomer Tayar "override HV", 6177c965db44STomer Tayar "override UA" 6178c965db44STomer Tayar }; 6179c965db44STomer Tayar 61807b6859fbSMintz, Yuval /* Master type names array */ 6181c965db44STomer Tayar static const char * const s_master_strs[] = { 6182c965db44STomer Tayar "???", 6183c965db44STomer Tayar "pxp", 6184c965db44STomer Tayar "mcp", 6185c965db44STomer Tayar "msdm", 6186c965db44STomer Tayar "psdm", 6187c965db44STomer Tayar "ysdm", 6188c965db44STomer Tayar "usdm", 6189c965db44STomer Tayar "tsdm", 6190c965db44STomer Tayar "xsdm", 6191c965db44STomer Tayar "dbu", 6192c965db44STomer Tayar "dmae", 61932d22bc83SMichal Kalderon "jdap", 6194c965db44STomer Tayar "???", 6195c965db44STomer Tayar "???", 6196c965db44STomer Tayar "???", 6197c965db44STomer Tayar "???" 6198c965db44STomer Tayar }; 6199c965db44STomer Tayar 62007b6859fbSMintz, Yuval /* REG FIFO error messages array */ 62012d22bc83SMichal Kalderon static struct reg_fifo_err s_reg_fifo_errors[] = { 62022d22bc83SMichal Kalderon {1, "grc timeout"}, 62032d22bc83SMichal Kalderon {2, "address doesn't belong to any block"}, 62042d22bc83SMichal Kalderon {4, "reserved address in block or write to read-only address"}, 62052d22bc83SMichal Kalderon {8, "privilege/protection mismatch"}, 62062d22bc83SMichal Kalderon {16, "path isolation error"}, 62072d22bc83SMichal Kalderon {17, "RSL error"} 6208c965db44STomer Tayar }; 6209c965db44STomer Tayar 62107b6859fbSMintz, Yuval /* IGU FIFO sources array */ 6211c965db44STomer Tayar static const char * const s_igu_fifo_source_strs[] = { 6212c965db44STomer Tayar "TSTORM", 6213c965db44STomer Tayar "MSTORM", 6214c965db44STomer Tayar "USTORM", 6215c965db44STomer Tayar "XSTORM", 6216c965db44STomer Tayar "YSTORM", 6217c965db44STomer Tayar "PSTORM", 6218c965db44STomer Tayar "PCIE", 6219c965db44STomer Tayar "NIG_QM_PBF", 6220c965db44STomer Tayar "CAU", 6221c965db44STomer Tayar "ATTN", 6222c965db44STomer Tayar "GRC", 6223c965db44STomer Tayar }; 6224c965db44STomer Tayar 62257b6859fbSMintz, Yuval /* IGU FIFO error messages */ 6226c965db44STomer Tayar static const char * const s_igu_fifo_error_strs[] = { 6227c965db44STomer Tayar "no error", 6228c965db44STomer Tayar "length error", 6229c965db44STomer Tayar "function disabled", 62301d510657SColin Ian King "VF sent command to attention address", 6231c965db44STomer Tayar "host sent prod update command", 6232c965db44STomer Tayar "read of during interrupt register while in MIMD mode", 6233c965db44STomer Tayar "access to PXP BAR reserved address", 6234c965db44STomer Tayar "producer update command to attention index", 6235c965db44STomer Tayar "unknown error", 6236c965db44STomer Tayar "SB index not valid", 6237c965db44STomer Tayar "SB relative index and FID not found", 6238c965db44STomer Tayar "FID not match", 6239c965db44STomer Tayar "command with error flag asserted (PCI error or CAU discard)", 6240c965db44STomer Tayar "VF sent cleanup and RF cleanup is disabled", 6241c965db44STomer Tayar "cleanup command on type bigger than 4" 6242c965db44STomer Tayar }; 6243c965db44STomer Tayar 6244c965db44STomer Tayar /* IGU FIFO address data */ 6245c965db44STomer Tayar static const struct igu_fifo_addr_data s_igu_fifo_addr_data[] = { 62467b6859fbSMintz, Yuval {0x0, 0x101, "MSI-X Memory", NULL, 62477b6859fbSMintz, Yuval IGU_ADDR_TYPE_MSIX_MEM}, 62487b6859fbSMintz, Yuval {0x102, 0x1ff, "reserved", NULL, 62497b6859fbSMintz, Yuval IGU_ADDR_TYPE_RESERVED}, 62507b6859fbSMintz, Yuval {0x200, 0x200, "Write PBA[0:63]", NULL, 62517b6859fbSMintz, Yuval IGU_ADDR_TYPE_WRITE_PBA}, 6252c965db44STomer Tayar {0x201, 0x201, "Write PBA[64:127]", "reserved", 6253c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_PBA}, 62547b6859fbSMintz, Yuval {0x202, 0x202, "Write PBA[128]", "reserved", 62557b6859fbSMintz, Yuval IGU_ADDR_TYPE_WRITE_PBA}, 62567b6859fbSMintz, Yuval {0x203, 0x3ff, "reserved", NULL, 62577b6859fbSMintz, Yuval IGU_ADDR_TYPE_RESERVED}, 6258c965db44STomer Tayar {0x400, 0x5ef, "Write interrupt acknowledgment", NULL, 6259c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_INT_ACK}, 6260c965db44STomer Tayar {0x5f0, 0x5f0, "Attention bits update", NULL, 6261c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS}, 6262c965db44STomer Tayar {0x5f1, 0x5f1, "Attention bits set", NULL, 6263c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS}, 6264c965db44STomer Tayar {0x5f2, 0x5f2, "Attention bits clear", NULL, 6265c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS}, 6266c965db44STomer Tayar {0x5f3, 0x5f3, "Read interrupt 0:63 with mask", NULL, 6267c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 6268c965db44STomer Tayar {0x5f4, 0x5f4, "Read interrupt 0:31 with mask", NULL, 6269c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 6270c965db44STomer Tayar {0x5f5, 0x5f5, "Read interrupt 32:63 with mask", NULL, 6271c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 6272c965db44STomer Tayar {0x5f6, 0x5f6, "Read interrupt 0:63 without mask", NULL, 6273c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 62747b6859fbSMintz, Yuval {0x5f7, 0x5ff, "reserved", NULL, 62757b6859fbSMintz, Yuval IGU_ADDR_TYPE_RESERVED}, 62767b6859fbSMintz, Yuval {0x600, 0x7ff, "Producer update", NULL, 62777b6859fbSMintz, Yuval IGU_ADDR_TYPE_WRITE_PROD_UPDATE} 6278c965db44STomer Tayar }; 6279c965db44STomer Tayar 6280c965db44STomer Tayar /******************************** Variables **********************************/ 6281c965db44STomer Tayar 6282c965db44STomer Tayar /* Temporary buffer, used for print size calculations */ 6283c965db44STomer Tayar static char s_temp_buf[MAX_MSG_LEN]; 6284c965db44STomer Tayar 62857b6859fbSMintz, Yuval /**************************** Private Functions ******************************/ 6286c965db44STomer Tayar 6287*6c95dd8fSPrabhakar Kushwaha static void qed_user_static_asserts(void) 6288*6c95dd8fSPrabhakar Kushwaha { 6289*6c95dd8fSPrabhakar Kushwaha } 6290*6c95dd8fSPrabhakar Kushwaha 6291c965db44STomer Tayar static u32 qed_cyclic_add(u32 a, u32 b, u32 size) 6292c965db44STomer Tayar { 6293c965db44STomer Tayar return (a + b) % size; 6294c965db44STomer Tayar } 6295c965db44STomer Tayar 6296c965db44STomer Tayar static u32 qed_cyclic_sub(u32 a, u32 b, u32 size) 6297c965db44STomer Tayar { 6298c965db44STomer Tayar return (size + a - b) % size; 6299c965db44STomer Tayar } 6300c965db44STomer Tayar 6301c965db44STomer Tayar /* Reads the specified number of bytes from the specified cyclic buffer (up to 4 6302c965db44STomer Tayar * bytes) and returns them as a dword value. the specified buffer offset is 6303c965db44STomer Tayar * updated. 6304c965db44STomer Tayar */ 6305c965db44STomer Tayar static u32 qed_read_from_cyclic_buf(void *buf, 6306c965db44STomer Tayar u32 *offset, 6307c965db44STomer Tayar u32 buf_size, u8 num_bytes_to_read) 6308c965db44STomer Tayar { 63097b6859fbSMintz, Yuval u8 i, *val_ptr, *bytes_buf = (u8 *)buf; 6310c965db44STomer Tayar u32 val = 0; 6311c965db44STomer Tayar 6312c965db44STomer Tayar val_ptr = (u8 *)&val; 6313c965db44STomer Tayar 631450bc60cbSMichal Kalderon /* Assume running on a LITTLE ENDIAN and the buffer is network order 631550bc60cbSMichal Kalderon * (BIG ENDIAN), as high order bytes are placed in lower memory address. 631650bc60cbSMichal Kalderon */ 6317c965db44STomer Tayar for (i = 0; i < num_bytes_to_read; i++) { 6318c965db44STomer Tayar val_ptr[i] = bytes_buf[*offset]; 6319c965db44STomer Tayar *offset = qed_cyclic_add(*offset, 1, buf_size); 6320c965db44STomer Tayar } 6321c965db44STomer Tayar 6322c965db44STomer Tayar return val; 6323c965db44STomer Tayar } 6324c965db44STomer Tayar 6325c965db44STomer Tayar /* Reads and returns the next byte from the specified buffer. 6326c965db44STomer Tayar * The specified buffer offset is updated. 6327c965db44STomer Tayar */ 6328c965db44STomer Tayar static u8 qed_read_byte_from_buf(void *buf, u32 *offset) 6329c965db44STomer Tayar { 6330c965db44STomer Tayar return ((u8 *)buf)[(*offset)++]; 6331c965db44STomer Tayar } 6332c965db44STomer Tayar 6333c965db44STomer Tayar /* Reads and returns the next dword from the specified buffer. 6334c965db44STomer Tayar * The specified buffer offset is updated. 6335c965db44STomer Tayar */ 6336c965db44STomer Tayar static u32 qed_read_dword_from_buf(void *buf, u32 *offset) 6337c965db44STomer Tayar { 6338c965db44STomer Tayar u32 dword_val = *(u32 *)&((u8 *)buf)[*offset]; 6339c965db44STomer Tayar 6340c965db44STomer Tayar *offset += 4; 63417b6859fbSMintz, Yuval 6342c965db44STomer Tayar return dword_val; 6343c965db44STomer Tayar } 6344c965db44STomer Tayar 6345c965db44STomer Tayar /* Reads the next string from the specified buffer, and copies it to the 6346c965db44STomer Tayar * specified pointer. The specified buffer offset is updated. 6347c965db44STomer Tayar */ 6348c965db44STomer Tayar static void qed_read_str_from_buf(void *buf, u32 *offset, u32 size, char *dest) 6349c965db44STomer Tayar { 6350c965db44STomer Tayar const char *source_str = &((const char *)buf)[*offset]; 6351c965db44STomer Tayar 6352c965db44STomer Tayar strncpy(dest, source_str, size); 6353c965db44STomer Tayar dest[size - 1] = '\0'; 6354c965db44STomer Tayar *offset += size; 6355c965db44STomer Tayar } 6356c965db44STomer Tayar 6357c965db44STomer Tayar /* Returns a pointer to the specified offset (in bytes) of the specified buffer. 6358c965db44STomer Tayar * If the specified buffer in NULL, a temporary buffer pointer is returned. 6359c965db44STomer Tayar */ 6360c965db44STomer Tayar static char *qed_get_buf_ptr(void *buf, u32 offset) 6361c965db44STomer Tayar { 6362c965db44STomer Tayar return buf ? (char *)buf + offset : s_temp_buf; 6363c965db44STomer Tayar } 6364c965db44STomer Tayar 6365c965db44STomer Tayar /* Reads a param from the specified buffer. Returns the number of dwords read. 6366c965db44STomer Tayar * If the returned str_param is NULL, the param is numeric and its value is 6367c965db44STomer Tayar * returned in num_param. 6368c965db44STomer Tayar * Otheriwise, the param is a string and its pointer is returned in str_param. 6369c965db44STomer Tayar */ 6370c965db44STomer Tayar static u32 qed_read_param(u32 *dump_buf, 6371c965db44STomer Tayar const char **param_name, 6372c965db44STomer Tayar const char **param_str_val, u32 *param_num_val) 6373c965db44STomer Tayar { 6374c965db44STomer Tayar char *char_buf = (char *)dump_buf; 63757b6859fbSMintz, Yuval size_t offset = 0; 6376c965db44STomer Tayar 6377c965db44STomer Tayar /* Extract param name */ 6378c965db44STomer Tayar *param_name = char_buf; 6379c965db44STomer Tayar offset += strlen(*param_name) + 1; 6380c965db44STomer Tayar 6381c965db44STomer Tayar /* Check param type */ 6382c965db44STomer Tayar if (*(char_buf + offset++)) { 6383c965db44STomer Tayar /* String param */ 6384c965db44STomer Tayar *param_str_val = char_buf + offset; 6385da090917STomer Tayar *param_num_val = 0; 6386c965db44STomer Tayar offset += strlen(*param_str_val) + 1; 6387c965db44STomer Tayar if (offset & 0x3) 6388c965db44STomer Tayar offset += (4 - (offset & 0x3)); 6389c965db44STomer Tayar } else { 6390c965db44STomer Tayar /* Numeric param */ 6391c965db44STomer Tayar *param_str_val = NULL; 6392c965db44STomer Tayar if (offset & 0x3) 6393c965db44STomer Tayar offset += (4 - (offset & 0x3)); 6394c965db44STomer Tayar *param_num_val = *(u32 *)(char_buf + offset); 6395c965db44STomer Tayar offset += 4; 6396c965db44STomer Tayar } 6397c965db44STomer Tayar 639850bc60cbSMichal Kalderon return (u32)offset / 4; 6399c965db44STomer Tayar } 6400c965db44STomer Tayar 6401c965db44STomer Tayar /* Reads a section header from the specified buffer. 6402c965db44STomer Tayar * Returns the number of dwords read. 6403c965db44STomer Tayar */ 6404c965db44STomer Tayar static u32 qed_read_section_hdr(u32 *dump_buf, 6405c965db44STomer Tayar const char **section_name, 6406c965db44STomer Tayar u32 *num_section_params) 6407c965db44STomer Tayar { 6408c965db44STomer Tayar const char *param_str_val; 6409c965db44STomer Tayar 6410c965db44STomer Tayar return qed_read_param(dump_buf, 6411c965db44STomer Tayar section_name, ¶m_str_val, num_section_params); 6412c965db44STomer Tayar } 6413c965db44STomer Tayar 6414c965db44STomer Tayar /* Reads section params from the specified buffer and prints them to the results 6415c965db44STomer Tayar * buffer. Returns the number of dwords read. 6416c965db44STomer Tayar */ 6417c965db44STomer Tayar static u32 qed_print_section_params(u32 *dump_buf, 6418c965db44STomer Tayar u32 num_section_params, 6419c965db44STomer Tayar char *results_buf, u32 *num_chars_printed) 6420c965db44STomer Tayar { 6421c965db44STomer Tayar u32 i, dump_offset = 0, results_offset = 0; 6422c965db44STomer Tayar 6423c965db44STomer Tayar for (i = 0; i < num_section_params; i++) { 64247b6859fbSMintz, Yuval const char *param_name, *param_str_val; 6425c965db44STomer Tayar u32 param_num_val = 0; 6426c965db44STomer Tayar 6427c965db44STomer Tayar dump_offset += qed_read_param(dump_buf + dump_offset, 6428c965db44STomer Tayar ¶m_name, 6429c965db44STomer Tayar ¶m_str_val, ¶m_num_val); 64307b6859fbSMintz, Yuval 6431c965db44STomer Tayar if (param_str_val) 6432c965db44STomer Tayar results_offset += 6433c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6434c965db44STomer Tayar results_offset), 6435c965db44STomer Tayar "%s: %s\n", param_name, param_str_val); 6436c965db44STomer Tayar else if (strcmp(param_name, "fw-timestamp")) 6437c965db44STomer Tayar results_offset += 6438c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6439c965db44STomer Tayar results_offset), 6440c965db44STomer Tayar "%s: %d\n", param_name, param_num_val); 6441c965db44STomer Tayar } 6442c965db44STomer Tayar 64437b6859fbSMintz, Yuval results_offset += sprintf(qed_get_buf_ptr(results_buf, results_offset), 64447b6859fbSMintz, Yuval "\n"); 6445c965db44STomer Tayar 64467b6859fbSMintz, Yuval *num_chars_printed = results_offset; 64477b6859fbSMintz, Yuval 64487b6859fbSMintz, Yuval return dump_offset; 6449c965db44STomer Tayar } 6450c965db44STomer Tayar 64512d22bc83SMichal Kalderon /* Returns the block name that matches the specified block ID, 64522d22bc83SMichal Kalderon * or NULL if not found. 64532d22bc83SMichal Kalderon */ 64542d22bc83SMichal Kalderon static const char *qed_dbg_get_block_name(struct qed_hwfn *p_hwfn, 64552d22bc83SMichal Kalderon enum block_id block_id) 64562d22bc83SMichal Kalderon { 64572d22bc83SMichal Kalderon const struct dbg_block_user *block = 64582d22bc83SMichal Kalderon (const struct dbg_block_user *) 64592d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_USER_DATA].ptr + block_id; 64602d22bc83SMichal Kalderon 64612d22bc83SMichal Kalderon return (const char *)block->name; 64622d22bc83SMichal Kalderon } 64632d22bc83SMichal Kalderon 64642d22bc83SMichal Kalderon static struct dbg_tools_user_data *qed_dbg_get_user_data(struct qed_hwfn 64652d22bc83SMichal Kalderon *p_hwfn) 6466a3f72307SDenis Bolotin { 6467a3f72307SDenis Bolotin return (struct dbg_tools_user_data *)p_hwfn->dbg_user_info; 6468a3f72307SDenis Bolotin } 6469a3f72307SDenis Bolotin 6470c965db44STomer Tayar /* Parses the idle check rules and returns the number of characters printed. 6471c965db44STomer Tayar * In case of parsing error, returns 0. 6472c965db44STomer Tayar */ 64732d22bc83SMichal Kalderon static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn, 64742d22bc83SMichal Kalderon u32 *dump_buf, 6475c965db44STomer Tayar u32 *dump_buf_end, 6476c965db44STomer Tayar u32 num_rules, 6477c965db44STomer Tayar bool print_fw_idle_chk, 6478c965db44STomer Tayar char *results_buf, 6479c965db44STomer Tayar u32 *num_errors, u32 *num_warnings) 6480c965db44STomer Tayar { 64817b6859fbSMintz, Yuval /* Offset in results_buf in bytes */ 64827b6859fbSMintz, Yuval u32 results_offset = 0; 64837b6859fbSMintz, Yuval 64847b6859fbSMintz, Yuval u32 rule_idx; 6485c965db44STomer Tayar u16 i, j; 6486c965db44STomer Tayar 6487c965db44STomer Tayar *num_errors = 0; 6488c965db44STomer Tayar *num_warnings = 0; 6489c965db44STomer Tayar 6490c965db44STomer Tayar /* Go over dumped results */ 6491c965db44STomer Tayar for (rule_idx = 0; rule_idx < num_rules && dump_buf < dump_buf_end; 6492c965db44STomer Tayar rule_idx++) { 6493c965db44STomer Tayar const struct dbg_idle_chk_rule_parsing_data *rule_parsing_data; 6494c965db44STomer Tayar struct dbg_idle_chk_result_hdr *hdr; 64957b6859fbSMintz, Yuval const char *parsing_str, *lsi_msg; 6496c965db44STomer Tayar u32 parsing_str_offset; 6497c965db44STomer Tayar bool has_fw_msg; 64987b6859fbSMintz, Yuval u8 curr_reg_id; 6499c965db44STomer Tayar 6500c965db44STomer Tayar hdr = (struct dbg_idle_chk_result_hdr *)dump_buf; 6501c965db44STomer Tayar rule_parsing_data = 6502c965db44STomer Tayar (const struct dbg_idle_chk_rule_parsing_data *) 65032d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr + 65042d22bc83SMichal Kalderon hdr->rule_id; 6505c965db44STomer Tayar parsing_str_offset = 6506c965db44STomer Tayar GET_FIELD(rule_parsing_data->data, 6507c965db44STomer Tayar DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET); 6508c965db44STomer Tayar has_fw_msg = 6509c965db44STomer Tayar GET_FIELD(rule_parsing_data->data, 6510c965db44STomer Tayar DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG) > 0; 65112d22bc83SMichal Kalderon parsing_str = (const char *) 65122d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr + 65132d22bc83SMichal Kalderon parsing_str_offset; 6514c965db44STomer Tayar lsi_msg = parsing_str; 65157b6859fbSMintz, Yuval curr_reg_id = 0; 6516c965db44STomer Tayar 6517c965db44STomer Tayar if (hdr->severity >= MAX_DBG_IDLE_CHK_SEVERITY_TYPES) 6518c965db44STomer Tayar return 0; 6519c965db44STomer Tayar 6520c965db44STomer Tayar /* Skip rule header */ 65217b6859fbSMintz, Yuval dump_buf += BYTES_TO_DWORDS(sizeof(*hdr)); 6522c965db44STomer Tayar 6523c965db44STomer Tayar /* Update errors/warnings count */ 6524c965db44STomer Tayar if (hdr->severity == IDLE_CHK_SEVERITY_ERROR || 6525c965db44STomer Tayar hdr->severity == IDLE_CHK_SEVERITY_ERROR_NO_TRAFFIC) 6526c965db44STomer Tayar (*num_errors)++; 6527c965db44STomer Tayar else 6528c965db44STomer Tayar (*num_warnings)++; 6529c965db44STomer Tayar 6530c965db44STomer Tayar /* Print rule severity */ 6531c965db44STomer Tayar results_offset += 6532c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6533c965db44STomer Tayar results_offset), "%s: ", 6534c965db44STomer Tayar s_idle_chk_severity_str[hdr->severity]); 6535c965db44STomer Tayar 6536c965db44STomer Tayar /* Print rule message */ 6537c965db44STomer Tayar if (has_fw_msg) 6538c965db44STomer Tayar parsing_str += strlen(parsing_str) + 1; 6539c965db44STomer Tayar results_offset += 6540c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6541c965db44STomer Tayar results_offset), "%s.", 6542c965db44STomer Tayar has_fw_msg && 6543c965db44STomer Tayar print_fw_idle_chk ? parsing_str : lsi_msg); 6544c965db44STomer Tayar parsing_str += strlen(parsing_str) + 1; 6545c965db44STomer Tayar 6546c965db44STomer Tayar /* Print register values */ 6547c965db44STomer Tayar results_offset += 6548c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6549c965db44STomer Tayar results_offset), " Registers:"); 6550c965db44STomer Tayar for (i = 0; 6551c965db44STomer Tayar i < hdr->num_dumped_cond_regs + hdr->num_dumped_info_regs; 6552c965db44STomer Tayar i++) { 65537b6859fbSMintz, Yuval struct dbg_idle_chk_result_reg_hdr *reg_hdr; 65547b6859fbSMintz, Yuval bool is_mem; 65557b6859fbSMintz, Yuval u8 reg_id; 65567b6859fbSMintz, Yuval 65577b6859fbSMintz, Yuval reg_hdr = 65587b6859fbSMintz, Yuval (struct dbg_idle_chk_result_reg_hdr *)dump_buf; 65597b6859fbSMintz, Yuval is_mem = GET_FIELD(reg_hdr->data, 6560c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM); 65617b6859fbSMintz, Yuval reg_id = GET_FIELD(reg_hdr->data, 6562c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID); 6563c965db44STomer Tayar 6564c965db44STomer Tayar /* Skip reg header */ 65657b6859fbSMintz, Yuval dump_buf += BYTES_TO_DWORDS(sizeof(*reg_hdr)); 6566c965db44STomer Tayar 6567c965db44STomer Tayar /* Skip register names until the required reg_id is 6568c965db44STomer Tayar * reached. 6569c965db44STomer Tayar */ 6570*6c95dd8fSPrabhakar Kushwaha for (; reg_id > curr_reg_id; curr_reg_id++) 6571*6c95dd8fSPrabhakar Kushwaha parsing_str += strlen(parsing_str) + 1; 6572c965db44STomer Tayar 6573c965db44STomer Tayar results_offset += 6574c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6575c965db44STomer Tayar results_offset), " %s", 6576c965db44STomer Tayar parsing_str); 6577c965db44STomer Tayar if (i < hdr->num_dumped_cond_regs && is_mem) 6578c965db44STomer Tayar results_offset += 6579c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6580c965db44STomer Tayar results_offset), 6581c965db44STomer Tayar "[%d]", hdr->mem_entry_id + 6582c965db44STomer Tayar reg_hdr->start_entry); 6583c965db44STomer Tayar results_offset += 6584c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6585c965db44STomer Tayar results_offset), "="); 6586c965db44STomer Tayar for (j = 0; j < reg_hdr->size; j++, dump_buf++) { 6587c965db44STomer Tayar results_offset += 6588c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6589c965db44STomer Tayar results_offset), 6590c965db44STomer Tayar "0x%x", *dump_buf); 6591c965db44STomer Tayar if (j < reg_hdr->size - 1) 6592c965db44STomer Tayar results_offset += 6593c965db44STomer Tayar sprintf(qed_get_buf_ptr 6594c965db44STomer Tayar (results_buf, 6595c965db44STomer Tayar results_offset), ","); 6596c965db44STomer Tayar } 6597c965db44STomer Tayar } 6598c965db44STomer Tayar 6599c965db44STomer Tayar results_offset += 6600c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, results_offset), "\n"); 6601c965db44STomer Tayar } 6602c965db44STomer Tayar 6603c965db44STomer Tayar /* Check if end of dump buffer was exceeded */ 6604c965db44STomer Tayar if (dump_buf > dump_buf_end) 6605c965db44STomer Tayar return 0; 66067b6859fbSMintz, Yuval 6607c965db44STomer Tayar return results_offset; 6608c965db44STomer Tayar } 6609c965db44STomer Tayar 6610c965db44STomer Tayar /* Parses an idle check dump buffer. 6611c965db44STomer Tayar * If result_buf is not NULL, the idle check results are printed to it. 6612c965db44STomer Tayar * In any case, the required results buffer size is assigned to 6613c965db44STomer Tayar * parsed_results_bytes. 6614c965db44STomer Tayar * The parsing status is returned. 6615c965db44STomer Tayar */ 66162d22bc83SMichal Kalderon static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn, 66172d22bc83SMichal Kalderon u32 *dump_buf, 6618c965db44STomer Tayar u32 num_dumped_dwords, 6619c965db44STomer Tayar char *results_buf, 6620c965db44STomer Tayar u32 *parsed_results_bytes, 6621c965db44STomer Tayar u32 *num_errors, 6622c965db44STomer Tayar u32 *num_warnings) 6623c965db44STomer Tayar { 6624*6c95dd8fSPrabhakar Kushwaha u32 num_section_params = 0, num_rules, num_rules_not_dumped; 6625c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 6626c965db44STomer Tayar u32 *dump_buf_end = dump_buf + num_dumped_dwords; 66277b6859fbSMintz, Yuval 66287b6859fbSMintz, Yuval /* Offset in results_buf in bytes */ 66297b6859fbSMintz, Yuval u32 results_offset = 0; 6630c965db44STomer Tayar 6631c965db44STomer Tayar *parsed_results_bytes = 0; 6632c965db44STomer Tayar *num_errors = 0; 6633c965db44STomer Tayar *num_warnings = 0; 66347b6859fbSMintz, Yuval 66352d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr || 66362d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr) 6637c965db44STomer Tayar return DBG_STATUS_DBG_ARRAY_NOT_SET; 6638c965db44STomer Tayar 6639c965db44STomer Tayar /* Read global_params section */ 6640c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6641c965db44STomer Tayar §ion_name, &num_section_params); 6642c965db44STomer Tayar if (strcmp(section_name, "global_params")) 6643c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6644c965db44STomer Tayar 6645c965db44STomer Tayar /* Print global params */ 6646c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 6647c965db44STomer Tayar num_section_params, 6648c965db44STomer Tayar results_buf, &results_offset); 6649c965db44STomer Tayar 6650*6c95dd8fSPrabhakar Kushwaha /* Read idle_chk section 6651*6c95dd8fSPrabhakar Kushwaha * There may be 1 or 2 idle_chk section parameters: 6652*6c95dd8fSPrabhakar Kushwaha * - 1st is "num_rules" 6653*6c95dd8fSPrabhakar Kushwaha * - 2nd is "num_rules_not_dumped" (optional) 6654*6c95dd8fSPrabhakar Kushwaha */ 6655*6c95dd8fSPrabhakar Kushwaha 6656c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6657c965db44STomer Tayar §ion_name, &num_section_params); 6658*6c95dd8fSPrabhakar Kushwaha if (strcmp(section_name, "idle_chk") || 6659*6c95dd8fSPrabhakar Kushwaha (num_section_params != 2 && num_section_params != 1)) 6660c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6661c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 6662c965db44STomer Tayar ¶m_name, ¶m_str_val, &num_rules); 66637b6859fbSMintz, Yuval if (strcmp(param_name, "num_rules")) 6664c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6665*6c95dd8fSPrabhakar Kushwaha if (num_section_params > 1) { 6666*6c95dd8fSPrabhakar Kushwaha dump_buf += qed_read_param(dump_buf, 6667*6c95dd8fSPrabhakar Kushwaha ¶m_name, 6668*6c95dd8fSPrabhakar Kushwaha ¶m_str_val, 6669*6c95dd8fSPrabhakar Kushwaha &num_rules_not_dumped); 6670*6c95dd8fSPrabhakar Kushwaha if (strcmp(param_name, "num_rules_not_dumped")) 6671*6c95dd8fSPrabhakar Kushwaha return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6672*6c95dd8fSPrabhakar Kushwaha } else { 6673*6c95dd8fSPrabhakar Kushwaha num_rules_not_dumped = 0; 6674*6c95dd8fSPrabhakar Kushwaha } 6675c965db44STomer Tayar 6676c965db44STomer Tayar if (num_rules) { 6677c965db44STomer Tayar u32 rules_print_size; 6678c965db44STomer Tayar 6679c965db44STomer Tayar /* Print FW output */ 6680c965db44STomer Tayar results_offset += 6681c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6682c965db44STomer Tayar results_offset), 6683c965db44STomer Tayar "FW_IDLE_CHECK:\n"); 6684c965db44STomer Tayar rules_print_size = 66852d22bc83SMichal Kalderon qed_parse_idle_chk_dump_rules(p_hwfn, 66862d22bc83SMichal Kalderon dump_buf, 6687da090917STomer Tayar dump_buf_end, 6688da090917STomer Tayar num_rules, 6689c965db44STomer Tayar true, 6690c965db44STomer Tayar results_buf ? 6691c965db44STomer Tayar results_buf + 6692da090917STomer Tayar results_offset : 6693da090917STomer Tayar NULL, 6694da090917STomer Tayar num_errors, 6695da090917STomer Tayar num_warnings); 6696c965db44STomer Tayar results_offset += rules_print_size; 66977b6859fbSMintz, Yuval if (!rules_print_size) 6698c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6699c965db44STomer Tayar 6700c965db44STomer Tayar /* Print LSI output */ 6701c965db44STomer Tayar results_offset += 6702c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6703c965db44STomer Tayar results_offset), 6704c965db44STomer Tayar "\nLSI_IDLE_CHECK:\n"); 6705c965db44STomer Tayar rules_print_size = 67062d22bc83SMichal Kalderon qed_parse_idle_chk_dump_rules(p_hwfn, 67072d22bc83SMichal Kalderon dump_buf, 6708da090917STomer Tayar dump_buf_end, 6709da090917STomer Tayar num_rules, 6710c965db44STomer Tayar false, 6711c965db44STomer Tayar results_buf ? 6712c965db44STomer Tayar results_buf + 6713da090917STomer Tayar results_offset : 6714da090917STomer Tayar NULL, 6715da090917STomer Tayar num_errors, 6716da090917STomer Tayar num_warnings); 6717c965db44STomer Tayar results_offset += rules_print_size; 67187b6859fbSMintz, Yuval if (!rules_print_size) 6719c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6720c965db44STomer Tayar } 6721c965db44STomer Tayar 6722c965db44STomer Tayar /* Print errors/warnings count */ 67237b6859fbSMintz, Yuval if (*num_errors) 6724c965db44STomer Tayar results_offset += 6725c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6726c965db44STomer Tayar results_offset), 6727c965db44STomer Tayar "\nIdle Check failed!!! (with %d errors and %d warnings)\n", 6728c965db44STomer Tayar *num_errors, *num_warnings); 67297b6859fbSMintz, Yuval else if (*num_warnings) 6730c965db44STomer Tayar results_offset += 6731c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6732c965db44STomer Tayar results_offset), 67337b6859fbSMintz, Yuval "\nIdle Check completed successfully (with %d warnings)\n", 6734c965db44STomer Tayar *num_warnings); 67357b6859fbSMintz, Yuval else 6736c965db44STomer Tayar results_offset += 6737c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6738c965db44STomer Tayar results_offset), 67397b6859fbSMintz, Yuval "\nIdle Check completed successfully\n"); 6740c965db44STomer Tayar 6741*6c95dd8fSPrabhakar Kushwaha if (num_rules_not_dumped) 6742*6c95dd8fSPrabhakar Kushwaha results_offset += 6743*6c95dd8fSPrabhakar Kushwaha sprintf(qed_get_buf_ptr(results_buf, 6744*6c95dd8fSPrabhakar Kushwaha results_offset), 6745*6c95dd8fSPrabhakar Kushwaha "\nIdle Check Partially dumped : num_rules_not_dumped = %d\n", 6746*6c95dd8fSPrabhakar Kushwaha num_rules_not_dumped); 6747*6c95dd8fSPrabhakar Kushwaha 6748c965db44STomer Tayar /* Add 1 for string NULL termination */ 6749c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 67507b6859fbSMintz, Yuval 6751c965db44STomer Tayar return DBG_STATUS_OK; 6752c965db44STomer Tayar } 6753c965db44STomer Tayar 6754c965db44STomer Tayar /* Allocates and fills MCP Trace meta data based on the specified meta data 6755c965db44STomer Tayar * dump buffer. 6756c965db44STomer Tayar * Returns debug status code. 6757c965db44STomer Tayar */ 6758a3f72307SDenis Bolotin static enum dbg_status 6759a3f72307SDenis Bolotin qed_mcp_trace_alloc_meta_data(struct qed_hwfn *p_hwfn, 6760a3f72307SDenis Bolotin const u32 *meta_buf) 6761c965db44STomer Tayar { 6762a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data; 6763c965db44STomer Tayar u32 offset = 0, signature, i; 6764a3f72307SDenis Bolotin struct mcp_trace_meta *meta; 6765a3f72307SDenis Bolotin u8 *meta_buf_bytes; 6766a3f72307SDenis Bolotin 6767a3f72307SDenis Bolotin dev_user_data = qed_dbg_get_user_data(p_hwfn); 6768a3f72307SDenis Bolotin meta = &dev_user_data->mcp_trace_meta; 6769a3f72307SDenis Bolotin meta_buf_bytes = (u8 *)meta_buf; 6770c965db44STomer Tayar 677150bc60cbSMichal Kalderon /* Free the previous meta before loading a new one. */ 6772a3f72307SDenis Bolotin if (meta->is_allocated) 6773a3f72307SDenis Bolotin qed_mcp_trace_free_meta_data(p_hwfn); 677450bc60cbSMichal Kalderon 6775c965db44STomer Tayar memset(meta, 0, sizeof(*meta)); 6776c965db44STomer Tayar 6777c965db44STomer Tayar /* Read first signature */ 6778c965db44STomer Tayar signature = qed_read_dword_from_buf(meta_buf_bytes, &offset); 67797b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 6780c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 6781c965db44STomer Tayar 67827b6859fbSMintz, Yuval /* Read no. of modules and allocate memory for their pointers */ 6783c965db44STomer Tayar meta->modules_num = qed_read_byte_from_buf(meta_buf_bytes, &offset); 67846396bb22SKees Cook meta->modules = kcalloc(meta->modules_num, sizeof(char *), 67856396bb22SKees Cook GFP_KERNEL); 6786c965db44STomer Tayar if (!meta->modules) 6787c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6788c965db44STomer Tayar 6789c965db44STomer Tayar /* Allocate and read all module strings */ 6790c965db44STomer Tayar for (i = 0; i < meta->modules_num; i++) { 6791c965db44STomer Tayar u8 module_len = qed_read_byte_from_buf(meta_buf_bytes, &offset); 6792c965db44STomer Tayar 6793c965db44STomer Tayar *(meta->modules + i) = kzalloc(module_len, GFP_KERNEL); 6794c965db44STomer Tayar if (!(*(meta->modules + i))) { 6795c965db44STomer Tayar /* Update number of modules to be released */ 6796c965db44STomer Tayar meta->modules_num = i ? i - 1 : 0; 6797c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6798c965db44STomer Tayar } 6799c965db44STomer Tayar 6800c965db44STomer Tayar qed_read_str_from_buf(meta_buf_bytes, &offset, module_len, 6801c965db44STomer Tayar *(meta->modules + i)); 6802c965db44STomer Tayar if (module_len > MCP_TRACE_MAX_MODULE_LEN) 6803c965db44STomer Tayar (*(meta->modules + i))[MCP_TRACE_MAX_MODULE_LEN] = '\0'; 6804c965db44STomer Tayar } 6805c965db44STomer Tayar 6806c965db44STomer Tayar /* Read second signature */ 6807c965db44STomer Tayar signature = qed_read_dword_from_buf(meta_buf_bytes, &offset); 68087b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 6809c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 6810c965db44STomer Tayar 6811c965db44STomer Tayar /* Read number of formats and allocate memory for all formats */ 6812c965db44STomer Tayar meta->formats_num = qed_read_dword_from_buf(meta_buf_bytes, &offset); 68136396bb22SKees Cook meta->formats = kcalloc(meta->formats_num, 6814c965db44STomer Tayar sizeof(struct mcp_trace_format), 6815c965db44STomer Tayar GFP_KERNEL); 6816c965db44STomer Tayar if (!meta->formats) 6817c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6818c965db44STomer Tayar 6819c965db44STomer Tayar /* Allocate and read all strings */ 6820c965db44STomer Tayar for (i = 0; i < meta->formats_num; i++) { 6821c965db44STomer Tayar struct mcp_trace_format *format_ptr = &meta->formats[i]; 6822c965db44STomer Tayar u8 format_len; 6823c965db44STomer Tayar 6824c965db44STomer Tayar format_ptr->data = qed_read_dword_from_buf(meta_buf_bytes, 6825c965db44STomer Tayar &offset); 68262d22bc83SMichal Kalderon format_len = GET_MFW_FIELD(format_ptr->data, 68272d22bc83SMichal Kalderon MCP_TRACE_FORMAT_LEN); 6828c965db44STomer Tayar format_ptr->format_str = kzalloc(format_len, GFP_KERNEL); 6829c965db44STomer Tayar if (!format_ptr->format_str) { 6830c965db44STomer Tayar /* Update number of modules to be released */ 6831c965db44STomer Tayar meta->formats_num = i ? i - 1 : 0; 6832c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6833c965db44STomer Tayar } 6834c965db44STomer Tayar 6835c965db44STomer Tayar qed_read_str_from_buf(meta_buf_bytes, 6836c965db44STomer Tayar &offset, 6837c965db44STomer Tayar format_len, format_ptr->format_str); 6838c965db44STomer Tayar } 6839c965db44STomer Tayar 6840a3f72307SDenis Bolotin meta->is_allocated = true; 6841c965db44STomer Tayar return DBG_STATUS_OK; 6842c965db44STomer Tayar } 6843c965db44STomer Tayar 684450bc60cbSMichal Kalderon /* Parses an MCP trace buffer. If result_buf is not NULL, the MCP Trace results 684550bc60cbSMichal Kalderon * are printed to it. The parsing status is returned. 684650bc60cbSMichal Kalderon * Arguments: 684750bc60cbSMichal Kalderon * trace_buf - MCP trace cyclic buffer 684850bc60cbSMichal Kalderon * trace_buf_size - MCP trace cyclic buffer size in bytes 684950bc60cbSMichal Kalderon * data_offset - offset in bytes of the data to parse in the MCP trace cyclic 685050bc60cbSMichal Kalderon * buffer. 685150bc60cbSMichal Kalderon * data_size - size in bytes of data to parse. 685250bc60cbSMichal Kalderon * parsed_buf - destination buffer for parsed data. 6853a3f72307SDenis Bolotin * parsed_results_bytes - size of parsed data in bytes. 685450bc60cbSMichal Kalderon */ 6855a3f72307SDenis Bolotin static enum dbg_status qed_parse_mcp_trace_buf(struct qed_hwfn *p_hwfn, 6856a3f72307SDenis Bolotin u8 *trace_buf, 685750bc60cbSMichal Kalderon u32 trace_buf_size, 685850bc60cbSMichal Kalderon u32 data_offset, 685950bc60cbSMichal Kalderon u32 data_size, 686050bc60cbSMichal Kalderon char *parsed_buf, 6861a3f72307SDenis Bolotin u32 *parsed_results_bytes) 686250bc60cbSMichal Kalderon { 6863a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data; 6864a3f72307SDenis Bolotin struct mcp_trace_meta *meta; 686550bc60cbSMichal Kalderon u32 param_mask, param_shift; 686650bc60cbSMichal Kalderon enum dbg_status status; 686750bc60cbSMichal Kalderon 6868a3f72307SDenis Bolotin dev_user_data = qed_dbg_get_user_data(p_hwfn); 6869a3f72307SDenis Bolotin meta = &dev_user_data->mcp_trace_meta; 6870a3f72307SDenis Bolotin *parsed_results_bytes = 0; 687150bc60cbSMichal Kalderon 6872a3f72307SDenis Bolotin if (!meta->is_allocated) 687350bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 687450bc60cbSMichal Kalderon 687550bc60cbSMichal Kalderon status = DBG_STATUS_OK; 687650bc60cbSMichal Kalderon 687750bc60cbSMichal Kalderon while (data_size) { 687850bc60cbSMichal Kalderon struct mcp_trace_format *format_ptr; 687950bc60cbSMichal Kalderon u8 format_level, format_module; 688050bc60cbSMichal Kalderon u32 params[3] = { 0, 0, 0 }; 688150bc60cbSMichal Kalderon u32 header, format_idx, i; 688250bc60cbSMichal Kalderon 688350bc60cbSMichal Kalderon if (data_size < MFW_TRACE_ENTRY_SIZE) 688450bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 688550bc60cbSMichal Kalderon 688650bc60cbSMichal Kalderon header = qed_read_from_cyclic_buf(trace_buf, 688750bc60cbSMichal Kalderon &data_offset, 688850bc60cbSMichal Kalderon trace_buf_size, 688950bc60cbSMichal Kalderon MFW_TRACE_ENTRY_SIZE); 689050bc60cbSMichal Kalderon data_size -= MFW_TRACE_ENTRY_SIZE; 689150bc60cbSMichal Kalderon format_idx = header & MFW_TRACE_EVENTID_MASK; 689250bc60cbSMichal Kalderon 689350bc60cbSMichal Kalderon /* Skip message if its index doesn't exist in the meta data */ 6894a3f72307SDenis Bolotin if (format_idx >= meta->formats_num) { 68952d22bc83SMichal Kalderon u8 format_size = (u8)GET_MFW_FIELD(header, 68962d22bc83SMichal Kalderon MFW_TRACE_PRM_SIZE); 689750bc60cbSMichal Kalderon 689850bc60cbSMichal Kalderon if (data_size < format_size) 689950bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 690050bc60cbSMichal Kalderon 690150bc60cbSMichal Kalderon data_offset = qed_cyclic_add(data_offset, 690250bc60cbSMichal Kalderon format_size, 690350bc60cbSMichal Kalderon trace_buf_size); 690450bc60cbSMichal Kalderon data_size -= format_size; 690550bc60cbSMichal Kalderon continue; 690650bc60cbSMichal Kalderon } 690750bc60cbSMichal Kalderon 6908a3f72307SDenis Bolotin format_ptr = &meta->formats[format_idx]; 690950bc60cbSMichal Kalderon 691050bc60cbSMichal Kalderon for (i = 0, 69112d22bc83SMichal Kalderon param_mask = MCP_TRACE_FORMAT_P1_SIZE_MASK, param_shift = 69122d22bc83SMichal Kalderon MCP_TRACE_FORMAT_P1_SIZE_OFFSET; 691350bc60cbSMichal Kalderon i < MCP_TRACE_FORMAT_MAX_PARAMS; 69142d22bc83SMichal Kalderon i++, param_mask <<= MCP_TRACE_FORMAT_PARAM_WIDTH, 691550bc60cbSMichal Kalderon param_shift += MCP_TRACE_FORMAT_PARAM_WIDTH) { 691650bc60cbSMichal Kalderon /* Extract param size (0..3) */ 691750bc60cbSMichal Kalderon u8 param_size = (u8)((format_ptr->data & param_mask) >> 691850bc60cbSMichal Kalderon param_shift); 691950bc60cbSMichal Kalderon 692050bc60cbSMichal Kalderon /* If the param size is zero, there are no other 692150bc60cbSMichal Kalderon * parameters. 692250bc60cbSMichal Kalderon */ 692350bc60cbSMichal Kalderon if (!param_size) 692450bc60cbSMichal Kalderon break; 692550bc60cbSMichal Kalderon 692650bc60cbSMichal Kalderon /* Size is encoded using 2 bits, where 3 is used to 692750bc60cbSMichal Kalderon * encode 4. 692850bc60cbSMichal Kalderon */ 692950bc60cbSMichal Kalderon if (param_size == 3) 693050bc60cbSMichal Kalderon param_size = 4; 693150bc60cbSMichal Kalderon 693250bc60cbSMichal Kalderon if (data_size < param_size) 693350bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 693450bc60cbSMichal Kalderon 693550bc60cbSMichal Kalderon params[i] = qed_read_from_cyclic_buf(trace_buf, 693650bc60cbSMichal Kalderon &data_offset, 693750bc60cbSMichal Kalderon trace_buf_size, 693850bc60cbSMichal Kalderon param_size); 693950bc60cbSMichal Kalderon data_size -= param_size; 694050bc60cbSMichal Kalderon } 694150bc60cbSMichal Kalderon 69422d22bc83SMichal Kalderon format_level = (u8)GET_MFW_FIELD(format_ptr->data, 69432d22bc83SMichal Kalderon MCP_TRACE_FORMAT_LEVEL); 69442d22bc83SMichal Kalderon format_module = (u8)GET_MFW_FIELD(format_ptr->data, 69452d22bc83SMichal Kalderon MCP_TRACE_FORMAT_MODULE); 694650bc60cbSMichal Kalderon if (format_level >= ARRAY_SIZE(s_mcp_trace_level_str)) 694750bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 694850bc60cbSMichal Kalderon 694950bc60cbSMichal Kalderon /* Print current message to results buffer */ 6950a3f72307SDenis Bolotin *parsed_results_bytes += 6951a3f72307SDenis Bolotin sprintf(qed_get_buf_ptr(parsed_buf, 6952a3f72307SDenis Bolotin *parsed_results_bytes), 695350bc60cbSMichal Kalderon "%s %-8s: ", 695450bc60cbSMichal Kalderon s_mcp_trace_level_str[format_level], 6955a3f72307SDenis Bolotin meta->modules[format_module]); 6956a3f72307SDenis Bolotin *parsed_results_bytes += 6957a3f72307SDenis Bolotin sprintf(qed_get_buf_ptr(parsed_buf, *parsed_results_bytes), 695850bc60cbSMichal Kalderon format_ptr->format_str, 695950bc60cbSMichal Kalderon params[0], params[1], params[2]); 696050bc60cbSMichal Kalderon } 696150bc60cbSMichal Kalderon 696250bc60cbSMichal Kalderon /* Add string NULL terminator */ 6963a3f72307SDenis Bolotin (*parsed_results_bytes)++; 696450bc60cbSMichal Kalderon 696550bc60cbSMichal Kalderon return status; 696650bc60cbSMichal Kalderon } 696750bc60cbSMichal Kalderon 6968c965db44STomer Tayar /* Parses an MCP Trace dump buffer. 6969c965db44STomer Tayar * If result_buf is not NULL, the MCP Trace results are printed to it. 6970c965db44STomer Tayar * In any case, the required results buffer size is assigned to 6971a3f72307SDenis Bolotin * parsed_results_bytes. 6972c965db44STomer Tayar * The parsing status is returned. 6973c965db44STomer Tayar */ 6974c965db44STomer Tayar static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn, 6975c965db44STomer Tayar u32 *dump_buf, 6976a3f72307SDenis Bolotin char *results_buf, 6977a3f72307SDenis Bolotin u32 *parsed_results_bytes, 6978a3f72307SDenis Bolotin bool free_meta_data) 6979c965db44STomer Tayar { 6980c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 698150bc60cbSMichal Kalderon u32 data_size, trace_data_dwords, trace_meta_dwords; 6982a3f72307SDenis Bolotin u32 offset, results_offset, results_buf_bytes; 698350bc60cbSMichal Kalderon u32 param_num_val, num_section_params; 6984c965db44STomer Tayar struct mcp_trace *trace; 6985c965db44STomer Tayar enum dbg_status status; 6986c965db44STomer Tayar const u32 *meta_buf; 6987c965db44STomer Tayar u8 *trace_buf; 6988c965db44STomer Tayar 6989a3f72307SDenis Bolotin *parsed_results_bytes = 0; 6990c965db44STomer Tayar 6991c965db44STomer Tayar /* Read global_params section */ 6992c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6993c965db44STomer Tayar §ion_name, &num_section_params); 6994c965db44STomer Tayar if (strcmp(section_name, "global_params")) 6995c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 6996c965db44STomer Tayar 6997c965db44STomer Tayar /* Print global params */ 6998c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 6999c965db44STomer Tayar num_section_params, 7000a3f72307SDenis Bolotin results_buf, &results_offset); 7001c965db44STomer Tayar 7002c965db44STomer Tayar /* Read trace_data section */ 7003c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7004c965db44STomer Tayar §ion_name, &num_section_params); 7005c965db44STomer Tayar if (strcmp(section_name, "mcp_trace_data") || num_section_params != 1) 7006c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 7007c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 7008c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 7009c965db44STomer Tayar if (strcmp(param_name, "size")) 7010c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 7011c965db44STomer Tayar trace_data_dwords = param_num_val; 7012c965db44STomer Tayar 7013c965db44STomer Tayar /* Prepare trace info */ 7014c965db44STomer Tayar trace = (struct mcp_trace *)dump_buf; 7015a3f72307SDenis Bolotin if (trace->signature != MFW_TRACE_SIGNATURE || !trace->size) 7016a3f72307SDenis Bolotin return DBG_STATUS_MCP_TRACE_BAD_DATA; 7017a3f72307SDenis Bolotin 70187b6859fbSMintz, Yuval trace_buf = (u8 *)dump_buf + sizeof(*trace); 7019c965db44STomer Tayar offset = trace->trace_oldest; 702050bc60cbSMichal Kalderon data_size = qed_cyclic_sub(trace->trace_prod, offset, trace->size); 7021c965db44STomer Tayar dump_buf += trace_data_dwords; 7022c965db44STomer Tayar 7023c965db44STomer Tayar /* Read meta_data section */ 7024c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7025c965db44STomer Tayar §ion_name, &num_section_params); 7026c965db44STomer Tayar if (strcmp(section_name, "mcp_trace_meta")) 7027c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 7028c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 7029c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 70307b6859fbSMintz, Yuval if (strcmp(param_name, "size")) 7031c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 7032c965db44STomer Tayar trace_meta_dwords = param_num_val; 7033c965db44STomer Tayar 7034c965db44STomer Tayar /* Choose meta data buffer */ 7035c965db44STomer Tayar if (!trace_meta_dwords) { 7036c965db44STomer Tayar /* Dump doesn't include meta data */ 7037a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data = 7038a3f72307SDenis Bolotin qed_dbg_get_user_data(p_hwfn); 7039a3f72307SDenis Bolotin 7040a3f72307SDenis Bolotin if (!dev_user_data->mcp_trace_user_meta_buf) 7041c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_NO_META; 7042a3f72307SDenis Bolotin 7043a3f72307SDenis Bolotin meta_buf = dev_user_data->mcp_trace_user_meta_buf; 7044c965db44STomer Tayar } else { 7045c965db44STomer Tayar /* Dump includes meta data */ 7046c965db44STomer Tayar meta_buf = dump_buf; 7047c965db44STomer Tayar } 7048c965db44STomer Tayar 7049c965db44STomer Tayar /* Allocate meta data memory */ 7050a3f72307SDenis Bolotin status = qed_mcp_trace_alloc_meta_data(p_hwfn, meta_buf); 7051c965db44STomer Tayar if (status != DBG_STATUS_OK) 7052c965db44STomer Tayar return status; 705350bc60cbSMichal Kalderon 7054a3f72307SDenis Bolotin status = qed_parse_mcp_trace_buf(p_hwfn, 7055a3f72307SDenis Bolotin trace_buf, 705650bc60cbSMichal Kalderon trace->size, 705750bc60cbSMichal Kalderon offset, 705850bc60cbSMichal Kalderon data_size, 7059a3f72307SDenis Bolotin results_buf ? 7060a3f72307SDenis Bolotin results_buf + results_offset : 706150bc60cbSMichal Kalderon NULL, 7062a3f72307SDenis Bolotin &results_buf_bytes); 706350bc60cbSMichal Kalderon if (status != DBG_STATUS_OK) 706450bc60cbSMichal Kalderon return status; 706550bc60cbSMichal Kalderon 7066a3f72307SDenis Bolotin if (free_meta_data) 7067a3f72307SDenis Bolotin qed_mcp_trace_free_meta_data(p_hwfn); 7068a3f72307SDenis Bolotin 7069a3f72307SDenis Bolotin *parsed_results_bytes = results_offset + results_buf_bytes; 707050bc60cbSMichal Kalderon 707150bc60cbSMichal Kalderon return DBG_STATUS_OK; 7072c965db44STomer Tayar } 7073c965db44STomer Tayar 7074c965db44STomer Tayar /* Parses a Reg FIFO dump buffer. 7075c965db44STomer Tayar * If result_buf is not NULL, the Reg FIFO results are printed to it. 7076c965db44STomer Tayar * In any case, the required results buffer size is assigned to 7077c965db44STomer Tayar * parsed_results_bytes. 7078c965db44STomer Tayar * The parsing status is returned. 7079c965db44STomer Tayar */ 7080da090917STomer Tayar static enum dbg_status qed_parse_reg_fifo_dump(u32 *dump_buf, 7081c965db44STomer Tayar char *results_buf, 7082c965db44STomer Tayar u32 *parsed_results_bytes) 7083c965db44STomer Tayar { 7084c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 70857b6859fbSMintz, Yuval u32 param_num_val, num_section_params, num_elements; 7086c965db44STomer Tayar struct reg_fifo_element *elements; 70872d22bc83SMichal Kalderon u8 i, j, err_code, vf_val; 70887b6859fbSMintz, Yuval u32 results_offset = 0; 7089c965db44STomer Tayar char vf_str[4]; 7090c965db44STomer Tayar 7091c965db44STomer Tayar /* Read global_params section */ 7092c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7093c965db44STomer Tayar §ion_name, &num_section_params); 7094c965db44STomer Tayar if (strcmp(section_name, "global_params")) 7095c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 7096c965db44STomer Tayar 7097c965db44STomer Tayar /* Print global params */ 7098c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 7099c965db44STomer Tayar num_section_params, 7100c965db44STomer Tayar results_buf, &results_offset); 7101c965db44STomer Tayar 7102c965db44STomer Tayar /* Read reg_fifo_data section */ 7103c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7104c965db44STomer Tayar §ion_name, &num_section_params); 7105c965db44STomer Tayar if (strcmp(section_name, "reg_fifo_data")) 7106c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 7107c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 7108c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 7109c965db44STomer Tayar if (strcmp(param_name, "size")) 7110c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 7111c965db44STomer Tayar if (param_num_val % REG_FIFO_ELEMENT_DWORDS) 7112c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 7113c965db44STomer Tayar num_elements = param_num_val / REG_FIFO_ELEMENT_DWORDS; 7114c965db44STomer Tayar elements = (struct reg_fifo_element *)dump_buf; 7115c965db44STomer Tayar 7116c965db44STomer Tayar /* Decode elements */ 7117c965db44STomer Tayar for (i = 0; i < num_elements; i++) { 71182d22bc83SMichal Kalderon const char *err_msg = NULL; 7119c965db44STomer Tayar 7120c965db44STomer Tayar /* Discover if element belongs to a VF or a PF */ 7121c965db44STomer Tayar vf_val = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_VF); 7122c965db44STomer Tayar if (vf_val == REG_FIFO_ELEMENT_IS_PF_VF_VAL) 7123c965db44STomer Tayar sprintf(vf_str, "%s", "N/A"); 7124c965db44STomer Tayar else 7125c965db44STomer Tayar sprintf(vf_str, "%d", vf_val); 7126c965db44STomer Tayar 71272d22bc83SMichal Kalderon /* Find error message */ 71282d22bc83SMichal Kalderon err_code = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_ERROR); 71292d22bc83SMichal Kalderon for (j = 0; j < ARRAY_SIZE(s_reg_fifo_errors) && !err_msg; j++) 71302d22bc83SMichal Kalderon if (err_code == s_reg_fifo_errors[j].err_code) 71312d22bc83SMichal Kalderon err_msg = s_reg_fifo_errors[j].err_msg; 71322d22bc83SMichal Kalderon 7133c965db44STomer Tayar /* Add parsed element to parsed buffer */ 7134c965db44STomer Tayar results_offset += 7135c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 7136c965db44STomer Tayar results_offset), 71372d22bc83SMichal Kalderon "raw: 0x%016llx, address: 0x%07x, access: %-5s, pf: %2d, vf: %s, port: %d, privilege: %-3s, protection: %-12s, master: %-4s, error: %s\n", 7138c965db44STomer Tayar elements[i].data, 7139be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 7140c965db44STomer Tayar REG_FIFO_ELEMENT_ADDRESS) * 7141c965db44STomer Tayar REG_FIFO_ELEMENT_ADDR_FACTOR, 7142c965db44STomer Tayar s_access_strs[GET_FIELD(elements[i].data, 7143c965db44STomer Tayar REG_FIFO_ELEMENT_ACCESS)], 7144be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 71457b6859fbSMintz, Yuval REG_FIFO_ELEMENT_PF), 71467b6859fbSMintz, Yuval vf_str, 7147be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 7148c965db44STomer Tayar REG_FIFO_ELEMENT_PORT), 71497b6859fbSMintz, Yuval s_privilege_strs[GET_FIELD(elements[i].data, 7150c965db44STomer Tayar REG_FIFO_ELEMENT_PRIVILEGE)], 7151c965db44STomer Tayar s_protection_strs[GET_FIELD(elements[i].data, 7152c965db44STomer Tayar REG_FIFO_ELEMENT_PROTECTION)], 7153c965db44STomer Tayar s_master_strs[GET_FIELD(elements[i].data, 71542d22bc83SMichal Kalderon REG_FIFO_ELEMENT_MASTER)], 71552d22bc83SMichal Kalderon err_msg ? err_msg : "unknown error code"); 7156c965db44STomer Tayar } 7157c965db44STomer Tayar 7158c965db44STomer Tayar results_offset += sprintf(qed_get_buf_ptr(results_buf, 7159c965db44STomer Tayar results_offset), 7160c965db44STomer Tayar "fifo contained %d elements", num_elements); 7161c965db44STomer Tayar 7162c965db44STomer Tayar /* Add 1 for string NULL termination */ 7163c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 71647b6859fbSMintz, Yuval 7165c965db44STomer Tayar return DBG_STATUS_OK; 7166c965db44STomer Tayar } 7167c965db44STomer Tayar 71687b6859fbSMintz, Yuval static enum dbg_status qed_parse_igu_fifo_element(struct igu_fifo_element 71697b6859fbSMintz, Yuval *element, char 71707b6859fbSMintz, Yuval *results_buf, 7171da090917STomer Tayar u32 *results_offset) 7172c965db44STomer Tayar { 71737b6859fbSMintz, Yuval const struct igu_fifo_addr_data *found_addr = NULL; 71747b6859fbSMintz, Yuval u8 source, err_type, i, is_cleanup; 71757b6859fbSMintz, Yuval char parsed_addr_data[32]; 71767b6859fbSMintz, Yuval char parsed_wr_data[256]; 71777b6859fbSMintz, Yuval u32 wr_data, prod_cons; 71787b6859fbSMintz, Yuval bool is_wr_cmd, is_pf; 71797b6859fbSMintz, Yuval u16 cmd_addr; 71807b6859fbSMintz, Yuval u64 dword12; 71817b6859fbSMintz, Yuval 71827b6859fbSMintz, Yuval /* Dword12 (dword index 1 and 2) contains bits 32..95 of the 71837b6859fbSMintz, Yuval * FIFO element. 71847b6859fbSMintz, Yuval */ 71857b6859fbSMintz, Yuval dword12 = ((u64)element->dword2 << 32) | element->dword1; 71867b6859fbSMintz, Yuval is_wr_cmd = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD); 71877b6859fbSMintz, Yuval is_pf = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_IS_PF); 71887b6859fbSMintz, Yuval cmd_addr = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR); 71897b6859fbSMintz, Yuval source = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_SOURCE); 71907b6859fbSMintz, Yuval err_type = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE); 71917b6859fbSMintz, Yuval 71927b6859fbSMintz, Yuval if (source >= ARRAY_SIZE(s_igu_fifo_source_strs)) 71937b6859fbSMintz, Yuval return DBG_STATUS_IGU_FIFO_BAD_DATA; 71947b6859fbSMintz, Yuval if (err_type >= ARRAY_SIZE(s_igu_fifo_error_strs)) 71957b6859fbSMintz, Yuval return DBG_STATUS_IGU_FIFO_BAD_DATA; 71967b6859fbSMintz, Yuval 71977b6859fbSMintz, Yuval /* Find address data */ 71987b6859fbSMintz, Yuval for (i = 0; i < ARRAY_SIZE(s_igu_fifo_addr_data) && !found_addr; i++) { 71997b6859fbSMintz, Yuval const struct igu_fifo_addr_data *curr_addr = 72007b6859fbSMintz, Yuval &s_igu_fifo_addr_data[i]; 72017b6859fbSMintz, Yuval 72027b6859fbSMintz, Yuval if (cmd_addr >= curr_addr->start_addr && cmd_addr <= 72037b6859fbSMintz, Yuval curr_addr->end_addr) 72047b6859fbSMintz, Yuval found_addr = curr_addr; 7205c965db44STomer Tayar } 7206c965db44STomer Tayar 72077b6859fbSMintz, Yuval if (!found_addr) 72087b6859fbSMintz, Yuval return DBG_STATUS_IGU_FIFO_BAD_DATA; 7209c965db44STomer Tayar 72107b6859fbSMintz, Yuval /* Prepare parsed address data */ 72117b6859fbSMintz, Yuval switch (found_addr->type) { 72127b6859fbSMintz, Yuval case IGU_ADDR_TYPE_MSIX_MEM: 72137b6859fbSMintz, Yuval sprintf(parsed_addr_data, " vector_num = 0x%x", cmd_addr / 2); 72147b6859fbSMintz, Yuval break; 72157b6859fbSMintz, Yuval case IGU_ADDR_TYPE_WRITE_INT_ACK: 72167b6859fbSMintz, Yuval case IGU_ADDR_TYPE_WRITE_PROD_UPDATE: 72177b6859fbSMintz, Yuval sprintf(parsed_addr_data, 72187b6859fbSMintz, Yuval " SB = 0x%x", cmd_addr - found_addr->start_addr); 72197b6859fbSMintz, Yuval break; 72207b6859fbSMintz, Yuval default: 72217b6859fbSMintz, Yuval parsed_addr_data[0] = '\0'; 72227b6859fbSMintz, Yuval } 72237b6859fbSMintz, Yuval 72247b6859fbSMintz, Yuval if (!is_wr_cmd) { 72257b6859fbSMintz, Yuval parsed_wr_data[0] = '\0'; 72267b6859fbSMintz, Yuval goto out; 72277b6859fbSMintz, Yuval } 72287b6859fbSMintz, Yuval 72297b6859fbSMintz, Yuval /* Prepare parsed write data */ 72307b6859fbSMintz, Yuval wr_data = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_WR_DATA); 72317b6859fbSMintz, Yuval prod_cons = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_PROD_CONS); 72327b6859fbSMintz, Yuval is_cleanup = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_CMD_TYPE); 72337b6859fbSMintz, Yuval 72347b6859fbSMintz, Yuval if (source == IGU_SRC_ATTN) { 72357b6859fbSMintz, Yuval sprintf(parsed_wr_data, "prod: 0x%x, ", prod_cons); 72367b6859fbSMintz, Yuval } else { 72377b6859fbSMintz, Yuval if (is_cleanup) { 72387b6859fbSMintz, Yuval u8 cleanup_val, cleanup_type; 72397b6859fbSMintz, Yuval 72407b6859fbSMintz, Yuval cleanup_val = 72417b6859fbSMintz, Yuval GET_FIELD(wr_data, 72427b6859fbSMintz, Yuval IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL); 72437b6859fbSMintz, Yuval cleanup_type = 72447b6859fbSMintz, Yuval GET_FIELD(wr_data, 72457b6859fbSMintz, Yuval IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE); 72467b6859fbSMintz, Yuval 72477b6859fbSMintz, Yuval sprintf(parsed_wr_data, 72487b6859fbSMintz, Yuval "cmd_type: cleanup, cleanup_val: %s, cleanup_type : %d, ", 72497b6859fbSMintz, Yuval cleanup_val ? "set" : "clear", 72507b6859fbSMintz, Yuval cleanup_type); 72517b6859fbSMintz, Yuval } else { 72527b6859fbSMintz, Yuval u8 update_flag, en_dis_int_for_sb, segment; 72537b6859fbSMintz, Yuval u8 timer_mask; 72547b6859fbSMintz, Yuval 72557b6859fbSMintz, Yuval update_flag = GET_FIELD(wr_data, 72567b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_UPDATE_FLAG); 72577b6859fbSMintz, Yuval en_dis_int_for_sb = 72587b6859fbSMintz, Yuval GET_FIELD(wr_data, 72597b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB); 72607b6859fbSMintz, Yuval segment = GET_FIELD(wr_data, 72617b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_SEGMENT); 72627b6859fbSMintz, Yuval timer_mask = GET_FIELD(wr_data, 72637b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_TIMER_MASK); 72647b6859fbSMintz, Yuval 72657b6859fbSMintz, Yuval sprintf(parsed_wr_data, 72667b6859fbSMintz, Yuval "cmd_type: prod/cons update, prod/cons: 0x%x, update_flag: %s, en_dis_int_for_sb : %s, segment : %s, timer_mask = %d, ", 72677b6859fbSMintz, Yuval prod_cons, 72687b6859fbSMintz, Yuval update_flag ? "update" : "nop", 7269da090917STomer Tayar en_dis_int_for_sb ? 7270da090917STomer Tayar (en_dis_int_for_sb == 1 ? "disable" : "nop") : 7271da090917STomer Tayar "enable", 72727b6859fbSMintz, Yuval segment ? "attn" : "regular", 72737b6859fbSMintz, Yuval timer_mask); 72747b6859fbSMintz, Yuval } 72757b6859fbSMintz, Yuval } 72767b6859fbSMintz, Yuval out: 72777b6859fbSMintz, Yuval /* Add parsed element to parsed buffer */ 72787b6859fbSMintz, Yuval *results_offset += sprintf(qed_get_buf_ptr(results_buf, 72797b6859fbSMintz, Yuval *results_offset), 72807b6859fbSMintz, Yuval "raw: 0x%01x%08x%08x, %s: %d, source : %s, type : %s, cmd_addr : 0x%x(%s%s), %serror: %s\n", 72817b6859fbSMintz, Yuval element->dword2, element->dword1, 72827b6859fbSMintz, Yuval element->dword0, 72837b6859fbSMintz, Yuval is_pf ? "pf" : "vf", 72847b6859fbSMintz, Yuval GET_FIELD(element->dword0, 72857b6859fbSMintz, Yuval IGU_FIFO_ELEMENT_DWORD0_FID), 72867b6859fbSMintz, Yuval s_igu_fifo_source_strs[source], 72877b6859fbSMintz, Yuval is_wr_cmd ? "wr" : "rd", 72887b6859fbSMintz, Yuval cmd_addr, 72897b6859fbSMintz, Yuval (!is_pf && found_addr->vf_desc) 72907b6859fbSMintz, Yuval ? found_addr->vf_desc 72917b6859fbSMintz, Yuval : found_addr->desc, 72927b6859fbSMintz, Yuval parsed_addr_data, 72937b6859fbSMintz, Yuval parsed_wr_data, 72947b6859fbSMintz, Yuval s_igu_fifo_error_strs[err_type]); 72957b6859fbSMintz, Yuval 72967b6859fbSMintz, Yuval return DBG_STATUS_OK; 7297c965db44STomer Tayar } 7298c965db44STomer Tayar 7299c965db44STomer Tayar /* Parses an IGU FIFO dump buffer. 7300c965db44STomer Tayar * If result_buf is not NULL, the IGU FIFO results are printed to it. 7301c965db44STomer Tayar * In any case, the required results buffer size is assigned to 7302c965db44STomer Tayar * parsed_results_bytes. 7303c965db44STomer Tayar * The parsing status is returned. 7304c965db44STomer Tayar */ 7305da090917STomer Tayar static enum dbg_status qed_parse_igu_fifo_dump(u32 *dump_buf, 7306c965db44STomer Tayar char *results_buf, 7307c965db44STomer Tayar u32 *parsed_results_bytes) 7308c965db44STomer Tayar { 7309c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 73107b6859fbSMintz, Yuval u32 param_num_val, num_section_params, num_elements; 7311c965db44STomer Tayar struct igu_fifo_element *elements; 73127b6859fbSMintz, Yuval enum dbg_status status; 73137b6859fbSMintz, Yuval u32 results_offset = 0; 73147b6859fbSMintz, Yuval u8 i; 7315c965db44STomer Tayar 7316c965db44STomer Tayar /* Read global_params section */ 7317c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7318c965db44STomer Tayar §ion_name, &num_section_params); 7319c965db44STomer Tayar if (strcmp(section_name, "global_params")) 7320c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 7321c965db44STomer Tayar 7322c965db44STomer Tayar /* Print global params */ 7323c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 7324c965db44STomer Tayar num_section_params, 7325c965db44STomer Tayar results_buf, &results_offset); 7326c965db44STomer Tayar 7327c965db44STomer Tayar /* Read igu_fifo_data section */ 7328c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7329c965db44STomer Tayar §ion_name, &num_section_params); 7330c965db44STomer Tayar if (strcmp(section_name, "igu_fifo_data")) 7331c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 7332c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 7333c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 7334c965db44STomer Tayar if (strcmp(param_name, "size")) 7335c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 7336c965db44STomer Tayar if (param_num_val % IGU_FIFO_ELEMENT_DWORDS) 7337c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 7338c965db44STomer Tayar num_elements = param_num_val / IGU_FIFO_ELEMENT_DWORDS; 7339c965db44STomer Tayar elements = (struct igu_fifo_element *)dump_buf; 7340c965db44STomer Tayar 7341c965db44STomer Tayar /* Decode elements */ 7342c965db44STomer Tayar for (i = 0; i < num_elements; i++) { 73437b6859fbSMintz, Yuval status = qed_parse_igu_fifo_element(&elements[i], 73447b6859fbSMintz, Yuval results_buf, 7345da090917STomer Tayar &results_offset); 73467b6859fbSMintz, Yuval if (status != DBG_STATUS_OK) 73477b6859fbSMintz, Yuval return status; 7348c965db44STomer Tayar } 7349c965db44STomer Tayar 7350c965db44STomer Tayar results_offset += sprintf(qed_get_buf_ptr(results_buf, 7351c965db44STomer Tayar results_offset), 7352c965db44STomer Tayar "fifo contained %d elements", num_elements); 7353c965db44STomer Tayar 7354c965db44STomer Tayar /* Add 1 for string NULL termination */ 7355c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 73567b6859fbSMintz, Yuval 7357c965db44STomer Tayar return DBG_STATUS_OK; 7358c965db44STomer Tayar } 7359c965db44STomer Tayar 7360c965db44STomer Tayar static enum dbg_status 7361da090917STomer Tayar qed_parse_protection_override_dump(u32 *dump_buf, 7362c965db44STomer Tayar char *results_buf, 7363c965db44STomer Tayar u32 *parsed_results_bytes) 7364c965db44STomer Tayar { 7365c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 73667b6859fbSMintz, Yuval u32 param_num_val, num_section_params, num_elements; 7367c965db44STomer Tayar struct protection_override_element *elements; 73687b6859fbSMintz, Yuval u32 results_offset = 0; 7369c965db44STomer Tayar u8 i; 7370c965db44STomer Tayar 7371c965db44STomer Tayar /* Read global_params section */ 7372c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7373c965db44STomer Tayar §ion_name, &num_section_params); 7374c965db44STomer Tayar if (strcmp(section_name, "global_params")) 7375c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 7376c965db44STomer Tayar 7377c965db44STomer Tayar /* Print global params */ 7378c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 7379c965db44STomer Tayar num_section_params, 7380c965db44STomer Tayar results_buf, &results_offset); 7381c965db44STomer Tayar 7382c965db44STomer Tayar /* Read protection_override_data section */ 7383c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 7384c965db44STomer Tayar §ion_name, &num_section_params); 7385c965db44STomer Tayar if (strcmp(section_name, "protection_override_data")) 7386c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 7387c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 7388c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 7389c965db44STomer Tayar if (strcmp(param_name, "size")) 7390c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 73917b6859fbSMintz, Yuval if (param_num_val % PROTECTION_OVERRIDE_ELEMENT_DWORDS) 7392c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 7393c965db44STomer Tayar num_elements = param_num_val / PROTECTION_OVERRIDE_ELEMENT_DWORDS; 7394c965db44STomer Tayar elements = (struct protection_override_element *)dump_buf; 7395c965db44STomer Tayar 7396c965db44STomer Tayar /* Decode elements */ 7397c965db44STomer Tayar for (i = 0; i < num_elements; i++) { 7398c965db44STomer Tayar u32 address = GET_FIELD(elements[i].data, 7399c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_ADDRESS) * 7400c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR; 7401c965db44STomer Tayar 7402c965db44STomer Tayar results_offset += 7403c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 7404c965db44STomer Tayar results_offset), 7405be086e7cSMintz, Yuval "window %2d, address: 0x%07x, size: %7d regs, read: %d, write: %d, read protection: %-12s, write protection: %-12s\n", 7406c965db44STomer Tayar i, address, 7407be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 7408c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE), 7409be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 7410c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_READ), 7411be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 7412c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_WRITE), 7413c965db44STomer Tayar s_protection_strs[GET_FIELD(elements[i].data, 7414c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION)], 7415c965db44STomer Tayar s_protection_strs[GET_FIELD(elements[i].data, 7416c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION)]); 7417c965db44STomer Tayar } 7418c965db44STomer Tayar 7419c965db44STomer Tayar results_offset += sprintf(qed_get_buf_ptr(results_buf, 7420c965db44STomer Tayar results_offset), 7421c965db44STomer Tayar "protection override contained %d elements", 7422c965db44STomer Tayar num_elements); 7423c965db44STomer Tayar 7424c965db44STomer Tayar /* Add 1 for string NULL termination */ 7425c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 74267b6859fbSMintz, Yuval 7427c965db44STomer Tayar return DBG_STATUS_OK; 7428c965db44STomer Tayar } 7429c965db44STomer Tayar 74307b6859fbSMintz, Yuval /* Parses a FW Asserts dump buffer. 74317b6859fbSMintz, Yuval * If result_buf is not NULL, the FW Asserts results are printed to it. 74327b6859fbSMintz, Yuval * In any case, the required results buffer size is assigned to 74337b6859fbSMintz, Yuval * parsed_results_bytes. 74347b6859fbSMintz, Yuval * The parsing status is returned. 74357b6859fbSMintz, Yuval */ 7436da090917STomer Tayar static enum dbg_status qed_parse_fw_asserts_dump(u32 *dump_buf, 74377b6859fbSMintz, Yuval char *results_buf, 74387b6859fbSMintz, Yuval u32 *parsed_results_bytes) 74397b6859fbSMintz, Yuval { 74407b6859fbSMintz, Yuval u32 num_section_params, param_num_val, i, results_offset = 0; 74417b6859fbSMintz, Yuval const char *param_name, *param_str_val, *section_name; 74427b6859fbSMintz, Yuval bool last_section_found = false; 74437b6859fbSMintz, Yuval 74447b6859fbSMintz, Yuval *parsed_results_bytes = 0; 74457b6859fbSMintz, Yuval 74467b6859fbSMintz, Yuval /* Read global_params section */ 74477b6859fbSMintz, Yuval dump_buf += qed_read_section_hdr(dump_buf, 74487b6859fbSMintz, Yuval §ion_name, &num_section_params); 74497b6859fbSMintz, Yuval if (strcmp(section_name, "global_params")) 74507b6859fbSMintz, Yuval return DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 74517b6859fbSMintz, Yuval 74527b6859fbSMintz, Yuval /* Print global params */ 74537b6859fbSMintz, Yuval dump_buf += qed_print_section_params(dump_buf, 74547b6859fbSMintz, Yuval num_section_params, 74557b6859fbSMintz, Yuval results_buf, &results_offset); 74567b6859fbSMintz, Yuval 74577b6859fbSMintz, Yuval while (!last_section_found) { 74587b6859fbSMintz, Yuval dump_buf += qed_read_section_hdr(dump_buf, 74597b6859fbSMintz, Yuval §ion_name, 74607b6859fbSMintz, Yuval &num_section_params); 74617b6859fbSMintz, Yuval if (!strcmp(section_name, "fw_asserts")) { 74627b6859fbSMintz, Yuval /* Extract params */ 74637b6859fbSMintz, Yuval const char *storm_letter = NULL; 74647b6859fbSMintz, Yuval u32 storm_dump_size = 0; 74657b6859fbSMintz, Yuval 74667b6859fbSMintz, Yuval for (i = 0; i < num_section_params; i++) { 74677b6859fbSMintz, Yuval dump_buf += qed_read_param(dump_buf, 74687b6859fbSMintz, Yuval ¶m_name, 74697b6859fbSMintz, Yuval ¶m_str_val, 74707b6859fbSMintz, Yuval ¶m_num_val); 74717b6859fbSMintz, Yuval if (!strcmp(param_name, "storm")) 74727b6859fbSMintz, Yuval storm_letter = param_str_val; 74737b6859fbSMintz, Yuval else if (!strcmp(param_name, "size")) 74747b6859fbSMintz, Yuval storm_dump_size = param_num_val; 74757b6859fbSMintz, Yuval else 74767b6859fbSMintz, Yuval return 74777b6859fbSMintz, Yuval DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 74787b6859fbSMintz, Yuval } 74797b6859fbSMintz, Yuval 74807b6859fbSMintz, Yuval if (!storm_letter || !storm_dump_size) 74817b6859fbSMintz, Yuval return DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 74827b6859fbSMintz, Yuval 74837b6859fbSMintz, Yuval /* Print data */ 74847b6859fbSMintz, Yuval results_offset += 74857b6859fbSMintz, Yuval sprintf(qed_get_buf_ptr(results_buf, 74867b6859fbSMintz, Yuval results_offset), 74877b6859fbSMintz, Yuval "\n%sSTORM_ASSERT: size=%d\n", 74887b6859fbSMintz, Yuval storm_letter, storm_dump_size); 74897b6859fbSMintz, Yuval for (i = 0; i < storm_dump_size; i++, dump_buf++) 74907b6859fbSMintz, Yuval results_offset += 74917b6859fbSMintz, Yuval sprintf(qed_get_buf_ptr(results_buf, 74927b6859fbSMintz, Yuval results_offset), 74937b6859fbSMintz, Yuval "%08x\n", *dump_buf); 74947b6859fbSMintz, Yuval } else if (!strcmp(section_name, "last")) { 74957b6859fbSMintz, Yuval last_section_found = true; 74967b6859fbSMintz, Yuval } else { 74977b6859fbSMintz, Yuval return DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 74987b6859fbSMintz, Yuval } 74997b6859fbSMintz, Yuval } 75007b6859fbSMintz, Yuval 75017b6859fbSMintz, Yuval /* Add 1 for string NULL termination */ 75027b6859fbSMintz, Yuval *parsed_results_bytes = results_offset + 1; 75037b6859fbSMintz, Yuval 75047b6859fbSMintz, Yuval return DBG_STATUS_OK; 75057b6859fbSMintz, Yuval } 75067b6859fbSMintz, Yuval 75077b6859fbSMintz, Yuval /***************************** Public Functions *******************************/ 75087b6859fbSMintz, Yuval 75092d22bc83SMichal Kalderon enum dbg_status qed_dbg_user_set_bin_ptr(struct qed_hwfn *p_hwfn, 75102d22bc83SMichal Kalderon const u8 * const bin_ptr) 75117b6859fbSMintz, Yuval { 75122d22bc83SMichal Kalderon struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr; 75137b6859fbSMintz, Yuval u8 buf_id; 75147b6859fbSMintz, Yuval 75157b6859fbSMintz, Yuval /* Convert binary data to debug arrays */ 75162d22bc83SMichal Kalderon for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) 75172d22bc83SMichal Kalderon qed_set_dbg_bin_buf(p_hwfn, 75182d22bc83SMichal Kalderon (enum bin_dbg_buffer_type)buf_id, 75192d22bc83SMichal Kalderon (u32 *)(bin_ptr + buf_hdrs[buf_id].offset), 75202d22bc83SMichal Kalderon buf_hdrs[buf_id].length); 75217b6859fbSMintz, Yuval 75227b6859fbSMintz, Yuval return DBG_STATUS_OK; 75237b6859fbSMintz, Yuval } 75247b6859fbSMintz, Yuval 75252d22bc83SMichal Kalderon enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn, 75262d22bc83SMichal Kalderon void **user_data_ptr) 7527a3f72307SDenis Bolotin { 75282d22bc83SMichal Kalderon *user_data_ptr = kzalloc(sizeof(struct dbg_tools_user_data), 7529a3f72307SDenis Bolotin GFP_KERNEL); 75302d22bc83SMichal Kalderon if (!(*user_data_ptr)) 7531a3f72307SDenis Bolotin return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 7532a3f72307SDenis Bolotin 7533a3f72307SDenis Bolotin return DBG_STATUS_OK; 7534a3f72307SDenis Bolotin } 7535a3f72307SDenis Bolotin 75367b6859fbSMintz, Yuval const char *qed_dbg_get_status_str(enum dbg_status status) 75377b6859fbSMintz, Yuval { 75387b6859fbSMintz, Yuval return (status < 75397b6859fbSMintz, Yuval MAX_DBG_STATUS) ? s_status_str[status] : "Invalid debug status"; 75407b6859fbSMintz, Yuval } 75417b6859fbSMintz, Yuval 75427b6859fbSMintz, Yuval enum dbg_status qed_get_idle_chk_results_buf_size(struct qed_hwfn *p_hwfn, 75437b6859fbSMintz, Yuval u32 *dump_buf, 75447b6859fbSMintz, Yuval u32 num_dumped_dwords, 75457b6859fbSMintz, Yuval u32 *results_buf_size) 75467b6859fbSMintz, Yuval { 75477b6859fbSMintz, Yuval u32 num_errors, num_warnings; 75487b6859fbSMintz, Yuval 75492d22bc83SMichal Kalderon return qed_parse_idle_chk_dump(p_hwfn, 75502d22bc83SMichal Kalderon dump_buf, 75517b6859fbSMintz, Yuval num_dumped_dwords, 75527b6859fbSMintz, Yuval NULL, 75537b6859fbSMintz, Yuval results_buf_size, 75547b6859fbSMintz, Yuval &num_errors, &num_warnings); 75557b6859fbSMintz, Yuval } 75567b6859fbSMintz, Yuval 75577b6859fbSMintz, Yuval enum dbg_status qed_print_idle_chk_results(struct qed_hwfn *p_hwfn, 75587b6859fbSMintz, Yuval u32 *dump_buf, 75597b6859fbSMintz, Yuval u32 num_dumped_dwords, 75607b6859fbSMintz, Yuval char *results_buf, 7561da090917STomer Tayar u32 *num_errors, 7562da090917STomer Tayar u32 *num_warnings) 75637b6859fbSMintz, Yuval { 75647b6859fbSMintz, Yuval u32 parsed_buf_size; 75657b6859fbSMintz, Yuval 75662d22bc83SMichal Kalderon return qed_parse_idle_chk_dump(p_hwfn, 75672d22bc83SMichal Kalderon dump_buf, 75687b6859fbSMintz, Yuval num_dumped_dwords, 75697b6859fbSMintz, Yuval results_buf, 75707b6859fbSMintz, Yuval &parsed_buf_size, 75717b6859fbSMintz, Yuval num_errors, num_warnings); 75727b6859fbSMintz, Yuval } 75737b6859fbSMintz, Yuval 7574a3f72307SDenis Bolotin void qed_dbg_mcp_trace_set_meta_data(struct qed_hwfn *p_hwfn, 7575a3f72307SDenis Bolotin const u32 *meta_buf) 75767b6859fbSMintz, Yuval { 7577a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data = 7578a3f72307SDenis Bolotin qed_dbg_get_user_data(p_hwfn); 7579a3f72307SDenis Bolotin 7580a3f72307SDenis Bolotin dev_user_data->mcp_trace_user_meta_buf = meta_buf; 75817b6859fbSMintz, Yuval } 75827b6859fbSMintz, Yuval 75837b6859fbSMintz, Yuval enum dbg_status qed_get_mcp_trace_results_buf_size(struct qed_hwfn *p_hwfn, 75847b6859fbSMintz, Yuval u32 *dump_buf, 75857b6859fbSMintz, Yuval u32 num_dumped_dwords, 75867b6859fbSMintz, Yuval u32 *results_buf_size) 75877b6859fbSMintz, Yuval { 75887b6859fbSMintz, Yuval return qed_parse_mcp_trace_dump(p_hwfn, 7589a3f72307SDenis Bolotin dump_buf, NULL, results_buf_size, true); 75907b6859fbSMintz, Yuval } 75917b6859fbSMintz, Yuval 75927b6859fbSMintz, Yuval enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn, 75937b6859fbSMintz, Yuval u32 *dump_buf, 75947b6859fbSMintz, Yuval u32 num_dumped_dwords, 75957b6859fbSMintz, Yuval char *results_buf) 75967b6859fbSMintz, Yuval { 75977b6859fbSMintz, Yuval u32 parsed_buf_size; 75987b6859fbSMintz, Yuval 7599*6c95dd8fSPrabhakar Kushwaha /* Doesn't do anything, needed for compile time asserts */ 7600*6c95dd8fSPrabhakar Kushwaha qed_user_static_asserts(); 7601*6c95dd8fSPrabhakar Kushwaha 76027b6859fbSMintz, Yuval return qed_parse_mcp_trace_dump(p_hwfn, 76037b6859fbSMintz, Yuval dump_buf, 7604a3f72307SDenis Bolotin results_buf, &parsed_buf_size, true); 76057b6859fbSMintz, Yuval } 76067b6859fbSMintz, Yuval 7607a3f72307SDenis Bolotin enum dbg_status qed_print_mcp_trace_results_cont(struct qed_hwfn *p_hwfn, 7608a3f72307SDenis Bolotin u32 *dump_buf, 7609a3f72307SDenis Bolotin char *results_buf) 7610a3f72307SDenis Bolotin { 7611a3f72307SDenis Bolotin u32 parsed_buf_size; 7612a3f72307SDenis Bolotin 7613a3f72307SDenis Bolotin return qed_parse_mcp_trace_dump(p_hwfn, dump_buf, results_buf, 7614a3f72307SDenis Bolotin &parsed_buf_size, false); 7615a3f72307SDenis Bolotin } 7616a3f72307SDenis Bolotin 7617a3f72307SDenis Bolotin enum dbg_status qed_print_mcp_trace_line(struct qed_hwfn *p_hwfn, 7618a3f72307SDenis Bolotin u8 *dump_buf, 761950bc60cbSMichal Kalderon u32 num_dumped_bytes, 762050bc60cbSMichal Kalderon char *results_buf) 762150bc60cbSMichal Kalderon { 7622a3f72307SDenis Bolotin u32 parsed_results_bytes; 762350bc60cbSMichal Kalderon 7624a3f72307SDenis Bolotin return qed_parse_mcp_trace_buf(p_hwfn, 7625a3f72307SDenis Bolotin dump_buf, 762650bc60cbSMichal Kalderon num_dumped_bytes, 762750bc60cbSMichal Kalderon 0, 762850bc60cbSMichal Kalderon num_dumped_bytes, 7629a3f72307SDenis Bolotin results_buf, &parsed_results_bytes); 7630a3f72307SDenis Bolotin } 7631a3f72307SDenis Bolotin 7632a3f72307SDenis Bolotin /* Frees the specified MCP Trace meta data */ 7633a3f72307SDenis Bolotin void qed_mcp_trace_free_meta_data(struct qed_hwfn *p_hwfn) 7634a3f72307SDenis Bolotin { 7635a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data; 7636a3f72307SDenis Bolotin struct mcp_trace_meta *meta; 7637a3f72307SDenis Bolotin u32 i; 7638a3f72307SDenis Bolotin 7639a3f72307SDenis Bolotin dev_user_data = qed_dbg_get_user_data(p_hwfn); 7640a3f72307SDenis Bolotin meta = &dev_user_data->mcp_trace_meta; 7641a3f72307SDenis Bolotin if (!meta->is_allocated) 7642a3f72307SDenis Bolotin return; 7643a3f72307SDenis Bolotin 7644a3f72307SDenis Bolotin /* Release modules */ 7645a3f72307SDenis Bolotin if (meta->modules) { 7646a3f72307SDenis Bolotin for (i = 0; i < meta->modules_num; i++) 7647a3f72307SDenis Bolotin kfree(meta->modules[i]); 7648a3f72307SDenis Bolotin kfree(meta->modules); 7649a3f72307SDenis Bolotin } 7650a3f72307SDenis Bolotin 7651a3f72307SDenis Bolotin /* Release formats */ 7652a3f72307SDenis Bolotin if (meta->formats) { 7653a3f72307SDenis Bolotin for (i = 0; i < meta->formats_num; i++) 7654a3f72307SDenis Bolotin kfree(meta->formats[i].format_str); 7655a3f72307SDenis Bolotin kfree(meta->formats); 7656a3f72307SDenis Bolotin } 7657a3f72307SDenis Bolotin 7658a3f72307SDenis Bolotin meta->is_allocated = false; 765950bc60cbSMichal Kalderon } 766050bc60cbSMichal Kalderon 76617b6859fbSMintz, Yuval enum dbg_status qed_get_reg_fifo_results_buf_size(struct qed_hwfn *p_hwfn, 76627b6859fbSMintz, Yuval u32 *dump_buf, 76637b6859fbSMintz, Yuval u32 num_dumped_dwords, 76647b6859fbSMintz, Yuval u32 *results_buf_size) 76657b6859fbSMintz, Yuval { 7666da090917STomer Tayar return qed_parse_reg_fifo_dump(dump_buf, NULL, results_buf_size); 76677b6859fbSMintz, Yuval } 76687b6859fbSMintz, Yuval 76697b6859fbSMintz, Yuval enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn, 76707b6859fbSMintz, Yuval u32 *dump_buf, 76717b6859fbSMintz, Yuval u32 num_dumped_dwords, 76727b6859fbSMintz, Yuval char *results_buf) 76737b6859fbSMintz, Yuval { 76747b6859fbSMintz, Yuval u32 parsed_buf_size; 76757b6859fbSMintz, Yuval 7676da090917STomer Tayar return qed_parse_reg_fifo_dump(dump_buf, results_buf, &parsed_buf_size); 76777b6859fbSMintz, Yuval } 76787b6859fbSMintz, Yuval 76797b6859fbSMintz, Yuval enum dbg_status qed_get_igu_fifo_results_buf_size(struct qed_hwfn *p_hwfn, 76807b6859fbSMintz, Yuval u32 *dump_buf, 76817b6859fbSMintz, Yuval u32 num_dumped_dwords, 76827b6859fbSMintz, Yuval u32 *results_buf_size) 76837b6859fbSMintz, Yuval { 7684da090917STomer Tayar return qed_parse_igu_fifo_dump(dump_buf, NULL, results_buf_size); 76857b6859fbSMintz, Yuval } 76867b6859fbSMintz, Yuval 76877b6859fbSMintz, Yuval enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn, 76887b6859fbSMintz, Yuval u32 *dump_buf, 76897b6859fbSMintz, Yuval u32 num_dumped_dwords, 76907b6859fbSMintz, Yuval char *results_buf) 76917b6859fbSMintz, Yuval { 76927b6859fbSMintz, Yuval u32 parsed_buf_size; 76937b6859fbSMintz, Yuval 7694da090917STomer Tayar return qed_parse_igu_fifo_dump(dump_buf, results_buf, &parsed_buf_size); 76957b6859fbSMintz, Yuval } 76967b6859fbSMintz, Yuval 7697c965db44STomer Tayar enum dbg_status 7698c965db44STomer Tayar qed_get_protection_override_results_buf_size(struct qed_hwfn *p_hwfn, 7699c965db44STomer Tayar u32 *dump_buf, 7700c965db44STomer Tayar u32 num_dumped_dwords, 7701c965db44STomer Tayar u32 *results_buf_size) 7702c965db44STomer Tayar { 7703da090917STomer Tayar return qed_parse_protection_override_dump(dump_buf, 7704c965db44STomer Tayar NULL, results_buf_size); 7705c965db44STomer Tayar } 7706c965db44STomer Tayar 7707c965db44STomer Tayar enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn, 7708c965db44STomer Tayar u32 *dump_buf, 7709c965db44STomer Tayar u32 num_dumped_dwords, 7710c965db44STomer Tayar char *results_buf) 7711c965db44STomer Tayar { 7712c965db44STomer Tayar u32 parsed_buf_size; 7713c965db44STomer Tayar 7714da090917STomer Tayar return qed_parse_protection_override_dump(dump_buf, 7715c965db44STomer Tayar results_buf, 7716c965db44STomer Tayar &parsed_buf_size); 7717c965db44STomer Tayar } 7718c965db44STomer Tayar 7719c965db44STomer Tayar enum dbg_status qed_get_fw_asserts_results_buf_size(struct qed_hwfn *p_hwfn, 7720c965db44STomer Tayar u32 *dump_buf, 7721c965db44STomer Tayar u32 num_dumped_dwords, 7722c965db44STomer Tayar u32 *results_buf_size) 7723c965db44STomer Tayar { 7724da090917STomer Tayar return qed_parse_fw_asserts_dump(dump_buf, NULL, results_buf_size); 7725c965db44STomer Tayar } 7726c965db44STomer Tayar 7727c965db44STomer Tayar enum dbg_status qed_print_fw_asserts_results(struct qed_hwfn *p_hwfn, 7728c965db44STomer Tayar u32 *dump_buf, 7729c965db44STomer Tayar u32 num_dumped_dwords, 7730c965db44STomer Tayar char *results_buf) 7731c965db44STomer Tayar { 7732c965db44STomer Tayar u32 parsed_buf_size; 7733c965db44STomer Tayar 7734da090917STomer Tayar return qed_parse_fw_asserts_dump(dump_buf, 7735c965db44STomer Tayar results_buf, &parsed_buf_size); 7736c965db44STomer Tayar } 7737c965db44STomer Tayar 77380ebbd1c8SMintz, Yuval enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn, 77390ebbd1c8SMintz, Yuval struct dbg_attn_block_result *results) 77400ebbd1c8SMintz, Yuval { 77410ebbd1c8SMintz, Yuval const u32 *block_attn_name_offsets; 77422d22bc83SMichal Kalderon const char *attn_name_base; 77430ebbd1c8SMintz, Yuval const char *block_name; 77442d22bc83SMichal Kalderon enum dbg_attn_type attn_type; 77450ebbd1c8SMintz, Yuval u8 num_regs, i, j; 77460ebbd1c8SMintz, Yuval 77470ebbd1c8SMintz, Yuval num_regs = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_NUM_REGS); 77482d22bc83SMichal Kalderon attn_type = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE); 77492d22bc83SMichal Kalderon block_name = qed_dbg_get_block_name(p_hwfn, results->block_id); 77502d22bc83SMichal Kalderon if (!block_name) 77512d22bc83SMichal Kalderon return DBG_STATUS_INVALID_ARGS; 77520ebbd1c8SMintz, Yuval 77532d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr || 77542d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr || 77552d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr) 77560ebbd1c8SMintz, Yuval return DBG_STATUS_DBG_ARRAY_NOT_SET; 77570ebbd1c8SMintz, Yuval 77582d22bc83SMichal Kalderon block_attn_name_offsets = 77592d22bc83SMichal Kalderon (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr + 77602d22bc83SMichal Kalderon results->names_offset; 77612d22bc83SMichal Kalderon 77622d22bc83SMichal Kalderon attn_name_base = p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr; 77630ebbd1c8SMintz, Yuval 77640ebbd1c8SMintz, Yuval /* Go over registers with a non-zero attention status */ 77650ebbd1c8SMintz, Yuval for (i = 0; i < num_regs; i++) { 7766da090917STomer Tayar struct dbg_attn_bit_mapping *bit_mapping; 77670ebbd1c8SMintz, Yuval struct dbg_attn_reg_result *reg_result; 77680ebbd1c8SMintz, Yuval u8 num_reg_attn, bit_idx = 0; 77690ebbd1c8SMintz, Yuval 77700ebbd1c8SMintz, Yuval reg_result = &results->reg_results[i]; 77710ebbd1c8SMintz, Yuval num_reg_attn = GET_FIELD(reg_result->data, 77720ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_NUM_REG_ATTN); 77732d22bc83SMichal Kalderon bit_mapping = (struct dbg_attn_bit_mapping *) 77742d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr + 77752d22bc83SMichal Kalderon reg_result->block_attn_offset; 77760ebbd1c8SMintz, Yuval 77770ebbd1c8SMintz, Yuval /* Go over attention status bits */ 7778*6c95dd8fSPrabhakar Kushwaha for (j = 0; j < num_reg_attn; j++) { 7779da090917STomer Tayar u16 attn_idx_val = GET_FIELD(bit_mapping[j].data, 77800ebbd1c8SMintz, Yuval DBG_ATTN_BIT_MAPPING_VAL); 77810ebbd1c8SMintz, Yuval const char *attn_name, *attn_type_str, *masked_str; 77822d22bc83SMichal Kalderon u32 attn_name_offset; 77832d22bc83SMichal Kalderon u32 sts_addr; 77840ebbd1c8SMintz, Yuval 77850ebbd1c8SMintz, Yuval /* Check if bit mask should be advanced (due to unused 77860ebbd1c8SMintz, Yuval * bits). 77870ebbd1c8SMintz, Yuval */ 7788da090917STomer Tayar if (GET_FIELD(bit_mapping[j].data, 77890ebbd1c8SMintz, Yuval DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT)) { 77900ebbd1c8SMintz, Yuval bit_idx += (u8)attn_idx_val; 77910ebbd1c8SMintz, Yuval continue; 77920ebbd1c8SMintz, Yuval } 77930ebbd1c8SMintz, Yuval 77940ebbd1c8SMintz, Yuval /* Check current bit index */ 7795*6c95dd8fSPrabhakar Kushwaha if (reg_result->sts_val & BIT(bit_idx)) { 77962d22bc83SMichal Kalderon /* An attention bit with value=1 was found 77972d22bc83SMichal Kalderon * Find attention name 77982d22bc83SMichal Kalderon */ 7799da090917STomer Tayar attn_name_offset = 7800da090917STomer Tayar block_attn_name_offsets[attn_idx_val]; 78012d22bc83SMichal Kalderon attn_name = attn_name_base + attn_name_offset; 78022d22bc83SMichal Kalderon attn_type_str = 78032d22bc83SMichal Kalderon (attn_type == 78042d22bc83SMichal Kalderon ATTN_TYPE_INTERRUPT ? "Interrupt" : 78052d22bc83SMichal Kalderon "Parity"); 7806*6c95dd8fSPrabhakar Kushwaha masked_str = reg_result->mask_val & 7807*6c95dd8fSPrabhakar Kushwaha BIT(bit_idx) ? 78080ebbd1c8SMintz, Yuval " [masked]" : ""; 7809*6c95dd8fSPrabhakar Kushwaha sts_addr = 7810*6c95dd8fSPrabhakar Kushwaha GET_FIELD(reg_result->data, 78110ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_STS_ADDRESS); 78120ebbd1c8SMintz, Yuval DP_NOTICE(p_hwfn, 78130ebbd1c8SMintz, Yuval "%s (%s) : %s [address 0x%08x, bit %d]%s\n", 78140ebbd1c8SMintz, Yuval block_name, attn_type_str, attn_name, 78152d22bc83SMichal Kalderon sts_addr * 4, bit_idx, masked_str); 78160ebbd1c8SMintz, Yuval } 7817*6c95dd8fSPrabhakar Kushwaha 7818*6c95dd8fSPrabhakar Kushwaha bit_idx++; 7819*6c95dd8fSPrabhakar Kushwaha } 78200ebbd1c8SMintz, Yuval } 78210ebbd1c8SMintz, Yuval 78220ebbd1c8SMintz, Yuval return DBG_STATUS_OK; 78230ebbd1c8SMintz, Yuval } 78240ebbd1c8SMintz, Yuval 7825c965db44STomer Tayar /* Wrapper for unifying the idle_chk and mcp_trace api */ 78268c93beafSYuval Mintz static enum dbg_status 78278c93beafSYuval Mintz qed_print_idle_chk_results_wrapper(struct qed_hwfn *p_hwfn, 7828c965db44STomer Tayar u32 *dump_buf, 7829c965db44STomer Tayar u32 num_dumped_dwords, 7830c965db44STomer Tayar char *results_buf) 7831c965db44STomer Tayar { 7832c965db44STomer Tayar u32 num_errors, num_warnnings; 7833c965db44STomer Tayar 7834c965db44STomer Tayar return qed_print_idle_chk_results(p_hwfn, dump_buf, num_dumped_dwords, 7835c965db44STomer Tayar results_buf, &num_errors, 7836c965db44STomer Tayar &num_warnnings); 7837c965db44STomer Tayar } 7838c965db44STomer Tayar 7839*6c95dd8fSPrabhakar Kushwaha static DEFINE_MUTEX(qed_dbg_lock); 7840*6c95dd8fSPrabhakar Kushwaha 7841*6c95dd8fSPrabhakar Kushwaha #define MAX_PHY_RESULT_BUFFER 9000 7842*6c95dd8fSPrabhakar Kushwaha 7843*6c95dd8fSPrabhakar Kushwaha /******************************** Feature Meta data section ******************/ 7844*6c95dd8fSPrabhakar Kushwaha 7845*6c95dd8fSPrabhakar Kushwaha #define GRC_NUM_STR_FUNCS 2 7846*6c95dd8fSPrabhakar Kushwaha #define IDLE_CHK_NUM_STR_FUNCS 1 7847*6c95dd8fSPrabhakar Kushwaha #define MCP_TRACE_NUM_STR_FUNCS 1 7848*6c95dd8fSPrabhakar Kushwaha #define REG_FIFO_NUM_STR_FUNCS 1 7849*6c95dd8fSPrabhakar Kushwaha #define IGU_FIFO_NUM_STR_FUNCS 1 7850*6c95dd8fSPrabhakar Kushwaha #define PROTECTION_OVERRIDE_NUM_STR_FUNCS 1 7851*6c95dd8fSPrabhakar Kushwaha #define FW_ASSERTS_NUM_STR_FUNCS 1 7852*6c95dd8fSPrabhakar Kushwaha #define ILT_NUM_STR_FUNCS 1 7853*6c95dd8fSPrabhakar Kushwaha #define PHY_NUM_STR_FUNCS 20 7854*6c95dd8fSPrabhakar Kushwaha 7855c965db44STomer Tayar /* Feature meta data lookup table */ 7856c965db44STomer Tayar static struct { 7857c965db44STomer Tayar char *name; 7858*6c95dd8fSPrabhakar Kushwaha u32 num_funcs; 7859c965db44STomer Tayar enum dbg_status (*get_size)(struct qed_hwfn *p_hwfn, 7860c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *size); 7861c965db44STomer Tayar enum dbg_status (*perform_dump)(struct qed_hwfn *p_hwfn, 7862c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, 7863c965db44STomer Tayar u32 buf_size, u32 *dumped_dwords); 7864c965db44STomer Tayar enum dbg_status (*print_results)(struct qed_hwfn *p_hwfn, 7865c965db44STomer Tayar u32 *dump_buf, u32 num_dumped_dwords, 7866c965db44STomer Tayar char *results_buf); 7867c965db44STomer Tayar enum dbg_status (*results_buf_size)(struct qed_hwfn *p_hwfn, 7868c965db44STomer Tayar u32 *dump_buf, 7869c965db44STomer Tayar u32 num_dumped_dwords, 7870c965db44STomer Tayar u32 *results_buf_size); 7871*6c95dd8fSPrabhakar Kushwaha const struct qed_func_lookup *hsi_func_lookup; 7872c965db44STomer Tayar } qed_features_lookup[] = { 7873c965db44STomer Tayar { 7874*6c95dd8fSPrabhakar Kushwaha "grc", GRC_NUM_STR_FUNCS, qed_dbg_grc_get_dump_buf_size, 7875*6c95dd8fSPrabhakar Kushwaha qed_dbg_grc_dump, NULL, NULL, NULL}, { 7876*6c95dd8fSPrabhakar Kushwaha "idle_chk", IDLE_CHK_NUM_STR_FUNCS, 7877c965db44STomer Tayar qed_dbg_idle_chk_get_dump_buf_size, 7878c965db44STomer Tayar qed_dbg_idle_chk_dump, 7879c965db44STomer Tayar qed_print_idle_chk_results_wrapper, 7880*6c95dd8fSPrabhakar Kushwaha qed_get_idle_chk_results_buf_size, 7881*6c95dd8fSPrabhakar Kushwaha NULL}, { 7882*6c95dd8fSPrabhakar Kushwaha "mcp_trace", MCP_TRACE_NUM_STR_FUNCS, 7883c965db44STomer Tayar qed_dbg_mcp_trace_get_dump_buf_size, 7884c965db44STomer Tayar qed_dbg_mcp_trace_dump, qed_print_mcp_trace_results, 7885*6c95dd8fSPrabhakar Kushwaha qed_get_mcp_trace_results_buf_size, 7886*6c95dd8fSPrabhakar Kushwaha NULL}, { 7887*6c95dd8fSPrabhakar Kushwaha "reg_fifo", REG_FIFO_NUM_STR_FUNCS, 7888c965db44STomer Tayar qed_dbg_reg_fifo_get_dump_buf_size, 7889c965db44STomer Tayar qed_dbg_reg_fifo_dump, qed_print_reg_fifo_results, 7890*6c95dd8fSPrabhakar Kushwaha qed_get_reg_fifo_results_buf_size, 7891*6c95dd8fSPrabhakar Kushwaha NULL}, { 7892*6c95dd8fSPrabhakar Kushwaha "igu_fifo", IGU_FIFO_NUM_STR_FUNCS, 7893c965db44STomer Tayar qed_dbg_igu_fifo_get_dump_buf_size, 7894c965db44STomer Tayar qed_dbg_igu_fifo_dump, qed_print_igu_fifo_results, 7895*6c95dd8fSPrabhakar Kushwaha qed_get_igu_fifo_results_buf_size, 7896*6c95dd8fSPrabhakar Kushwaha NULL}, { 7897*6c95dd8fSPrabhakar Kushwaha "protection_override", PROTECTION_OVERRIDE_NUM_STR_FUNCS, 7898c965db44STomer Tayar qed_dbg_protection_override_get_dump_buf_size, 7899c965db44STomer Tayar qed_dbg_protection_override_dump, 7900c965db44STomer Tayar qed_print_protection_override_results, 7901*6c95dd8fSPrabhakar Kushwaha qed_get_protection_override_results_buf_size, 7902*6c95dd8fSPrabhakar Kushwaha NULL}, { 7903*6c95dd8fSPrabhakar Kushwaha "fw_asserts", FW_ASSERTS_NUM_STR_FUNCS, 7904c965db44STomer Tayar qed_dbg_fw_asserts_get_dump_buf_size, 7905c965db44STomer Tayar qed_dbg_fw_asserts_dump, 7906c965db44STomer Tayar qed_print_fw_asserts_results, 7907*6c95dd8fSPrabhakar Kushwaha qed_get_fw_asserts_results_buf_size, 7908*6c95dd8fSPrabhakar Kushwaha NULL}, { 7909*6c95dd8fSPrabhakar Kushwaha "ilt", ILT_NUM_STR_FUNCS, qed_dbg_ilt_get_dump_buf_size, 7910*6c95dd8fSPrabhakar Kushwaha qed_dbg_ilt_dump, NULL, NULL, NULL},}; 7911c965db44STomer Tayar 7912c965db44STomer Tayar static void qed_dbg_print_feature(u8 *p_text_buf, u32 text_size) 7913c965db44STomer Tayar { 7914c965db44STomer Tayar u32 i, precision = 80; 7915c965db44STomer Tayar 7916c965db44STomer Tayar if (!p_text_buf) 7917c965db44STomer Tayar return; 7918c965db44STomer Tayar 7919c965db44STomer Tayar pr_notice("\n%.*s", precision, p_text_buf); 7920c965db44STomer Tayar for (i = precision; i < text_size; i += precision) 7921c965db44STomer Tayar pr_cont("%.*s", precision, p_text_buf + i); 7922c965db44STomer Tayar pr_cont("\n"); 7923c965db44STomer Tayar } 7924c965db44STomer Tayar 7925c965db44STomer Tayar #define QED_RESULTS_BUF_MIN_SIZE 16 7926c965db44STomer Tayar /* Generic function for decoding debug feature info */ 79278c93beafSYuval Mintz static enum dbg_status format_feature(struct qed_hwfn *p_hwfn, 7928c965db44STomer Tayar enum qed_dbg_features feature_idx) 7929c965db44STomer Tayar { 7930c965db44STomer Tayar struct qed_dbg_feature *feature = 7931ca352f00SIgor Russkikh &p_hwfn->cdev->dbg_features[feature_idx]; 7932*6c95dd8fSPrabhakar Kushwaha u32 txt_size_bytes, null_char_pos, i; 7933*6c95dd8fSPrabhakar Kushwaha u32 *dbuf, dwords; 7934c965db44STomer Tayar enum dbg_status rc; 7935c965db44STomer Tayar char *text_buf; 7936c965db44STomer Tayar 7937c965db44STomer Tayar /* Check if feature supports formatting capability */ 7938c965db44STomer Tayar if (!qed_features_lookup[feature_idx].results_buf_size) 7939c965db44STomer Tayar return DBG_STATUS_OK; 7940c965db44STomer Tayar 7941*6c95dd8fSPrabhakar Kushwaha dbuf = (u32 *)feature->dump_buf; 7942*6c95dd8fSPrabhakar Kushwaha dwords = feature->dumped_dwords; 7943*6c95dd8fSPrabhakar Kushwaha 7944c965db44STomer Tayar /* Obtain size of formatted output */ 7945*6c95dd8fSPrabhakar Kushwaha rc = qed_features_lookup[feature_idx].results_buf_size(p_hwfn, 7946*6c95dd8fSPrabhakar Kushwaha dbuf, 7947*6c95dd8fSPrabhakar Kushwaha dwords, 7948*6c95dd8fSPrabhakar Kushwaha &txt_size_bytes); 7949c965db44STomer Tayar if (rc != DBG_STATUS_OK) 7950c965db44STomer Tayar return rc; 7951c965db44STomer Tayar 7952*6c95dd8fSPrabhakar Kushwaha /* Make sure that the allocated size is a multiple of dword 7953*6c95dd8fSPrabhakar Kushwaha * (4 bytes). 7954*6c95dd8fSPrabhakar Kushwaha */ 7955*6c95dd8fSPrabhakar Kushwaha null_char_pos = txt_size_bytes - 1; 7956*6c95dd8fSPrabhakar Kushwaha txt_size_bytes = (txt_size_bytes + 3) & ~0x3; 7957c965db44STomer Tayar 7958*6c95dd8fSPrabhakar Kushwaha if (txt_size_bytes < QED_RESULTS_BUF_MIN_SIZE) { 7959c965db44STomer Tayar DP_NOTICE(p_hwfn->cdev, 7960c965db44STomer Tayar "formatted size of feature was too small %d. Aborting\n", 7961*6c95dd8fSPrabhakar Kushwaha txt_size_bytes); 7962c965db44STomer Tayar return DBG_STATUS_INVALID_ARGS; 7963c965db44STomer Tayar } 7964c965db44STomer Tayar 7965*6c95dd8fSPrabhakar Kushwaha /* allocate temp text buf */ 7966*6c95dd8fSPrabhakar Kushwaha text_buf = vzalloc(txt_size_bytes); 7967*6c95dd8fSPrabhakar Kushwaha if (!text_buf) { 7968*6c95dd8fSPrabhakar Kushwaha DP_NOTICE(p_hwfn->cdev, 7969*6c95dd8fSPrabhakar Kushwaha "failed to allocate text buffer. Aborting\n"); 7970c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 7971*6c95dd8fSPrabhakar Kushwaha } 7972c965db44STomer Tayar 7973c965db44STomer Tayar /* Decode feature opcodes to string on temp buf */ 7974*6c95dd8fSPrabhakar Kushwaha rc = qed_features_lookup[feature_idx].print_results(p_hwfn, 7975*6c95dd8fSPrabhakar Kushwaha dbuf, 7976*6c95dd8fSPrabhakar Kushwaha dwords, 7977*6c95dd8fSPrabhakar Kushwaha text_buf); 7978c965db44STomer Tayar if (rc != DBG_STATUS_OK) { 7979c965db44STomer Tayar vfree(text_buf); 7980c965db44STomer Tayar return rc; 7981c965db44STomer Tayar } 7982c965db44STomer Tayar 7983c965db44STomer Tayar /* Replace the original null character with a '\n' character. 7984c965db44STomer Tayar * The bytes that were added as a result of the dword alignment are also 7985c965db44STomer Tayar * padded with '\n' characters. 7986c965db44STomer Tayar */ 7987*6c95dd8fSPrabhakar Kushwaha for (i = null_char_pos; i < txt_size_bytes; i++) 7988c965db44STomer Tayar text_buf[i] = '\n'; 7989c965db44STomer Tayar 7990c965db44STomer Tayar /* Dump printable feature to log */ 7991ca352f00SIgor Russkikh if (p_hwfn->cdev->print_dbg_data) 7992*6c95dd8fSPrabhakar Kushwaha qed_dbg_print_feature(text_buf, txt_size_bytes); 7993c965db44STomer Tayar 7994*6c95dd8fSPrabhakar Kushwaha /* Dump binary data as is to the output file */ 7995da328711SAlexander Lobakin if (p_hwfn->cdev->dbg_bin_dump) { 7996da328711SAlexander Lobakin vfree(text_buf); 7997*6c95dd8fSPrabhakar Kushwaha return rc; 7998da328711SAlexander Lobakin } 7999da328711SAlexander Lobakin 8000*6c95dd8fSPrabhakar Kushwaha /* Free the old dump_buf and point the dump_buf to the newly allocated 8001c965db44STomer Tayar * and formatted text buffer. 8002c965db44STomer Tayar */ 8003c965db44STomer Tayar vfree(feature->dump_buf); 8004c965db44STomer Tayar feature->dump_buf = text_buf; 8005*6c95dd8fSPrabhakar Kushwaha feature->buf_size = txt_size_bytes; 8006*6c95dd8fSPrabhakar Kushwaha feature->dumped_dwords = txt_size_bytes / 4; 8007*6c95dd8fSPrabhakar Kushwaha 8008c965db44STomer Tayar return rc; 8009c965db44STomer Tayar } 8010c965db44STomer Tayar 80118a52bbabSMichal Kalderon #define MAX_DBG_FEATURE_SIZE_DWORDS 0x3FFFFFFF 80128a52bbabSMichal Kalderon 8013c965db44STomer Tayar /* Generic function for performing the dump of a debug feature. */ 80148c93beafSYuval Mintz static enum dbg_status qed_dbg_dump(struct qed_hwfn *p_hwfn, 80158c93beafSYuval Mintz struct qed_ptt *p_ptt, 8016c965db44STomer Tayar enum qed_dbg_features feature_idx) 8017c965db44STomer Tayar { 8018c965db44STomer Tayar struct qed_dbg_feature *feature = 8019ca352f00SIgor Russkikh &p_hwfn->cdev->dbg_features[feature_idx]; 8020*6c95dd8fSPrabhakar Kushwaha u32 buf_size_dwords, *dbuf, *dwords; 8021c965db44STomer Tayar enum dbg_status rc; 8022c965db44STomer Tayar 8023c965db44STomer Tayar DP_NOTICE(p_hwfn->cdev, "Collecting a debug feature [\"%s\"]\n", 8024c965db44STomer Tayar qed_features_lookup[feature_idx].name); 8025c965db44STomer Tayar 8026c965db44STomer Tayar /* Dump_buf was already allocated need to free (this can happen if dump 8027c965db44STomer Tayar * was called but file was never read). 8028c965db44STomer Tayar * We can't use the buffer as is since size may have changed. 8029c965db44STomer Tayar */ 8030c965db44STomer Tayar if (feature->dump_buf) { 8031c965db44STomer Tayar vfree(feature->dump_buf); 8032c965db44STomer Tayar feature->dump_buf = NULL; 8033c965db44STomer Tayar } 8034c965db44STomer Tayar 8035c965db44STomer Tayar /* Get buffer size from hsi, allocate accordingly, and perform the 8036c965db44STomer Tayar * dump. 8037c965db44STomer Tayar */ 8038c965db44STomer Tayar rc = qed_features_lookup[feature_idx].get_size(p_hwfn, p_ptt, 8039c965db44STomer Tayar &buf_size_dwords); 8040be086e7cSMintz, Yuval if (rc != DBG_STATUS_OK && rc != DBG_STATUS_NVRAM_GET_IMAGE_FAILED) 8041c965db44STomer Tayar return rc; 80422d22bc83SMichal Kalderon 80432d22bc83SMichal Kalderon if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS) { 80442d22bc83SMichal Kalderon feature->buf_size = 0; 80452d22bc83SMichal Kalderon DP_NOTICE(p_hwfn->cdev, 80462d22bc83SMichal Kalderon "Debug feature [\"%s\"] size (0x%x dwords) exceeds maximum size (0x%x dwords)\n", 80472d22bc83SMichal Kalderon qed_features_lookup[feature_idx].name, 80482d22bc83SMichal Kalderon buf_size_dwords, MAX_DBG_FEATURE_SIZE_DWORDS); 80492d22bc83SMichal Kalderon 80502d22bc83SMichal Kalderon return DBG_STATUS_OK; 80512d22bc83SMichal Kalderon } 80522d22bc83SMichal Kalderon 8053c965db44STomer Tayar feature->buf_size = buf_size_dwords * sizeof(u32); 8054c965db44STomer Tayar feature->dump_buf = vmalloc(feature->buf_size); 8055c965db44STomer Tayar if (!feature->dump_buf) 8056c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 8057c965db44STomer Tayar 8058*6c95dd8fSPrabhakar Kushwaha dbuf = (u32 *)feature->dump_buf; 8059*6c95dd8fSPrabhakar Kushwaha dwords = &feature->dumped_dwords; 8060*6c95dd8fSPrabhakar Kushwaha rc = qed_features_lookup[feature_idx].perform_dump(p_hwfn, p_ptt, 8061*6c95dd8fSPrabhakar Kushwaha dbuf, 8062*6c95dd8fSPrabhakar Kushwaha feature->buf_size / 8063*6c95dd8fSPrabhakar Kushwaha sizeof(u32), 8064*6c95dd8fSPrabhakar Kushwaha dwords); 8065c965db44STomer Tayar 8066c965db44STomer Tayar /* If mcp is stuck we get DBG_STATUS_NVRAM_GET_IMAGE_FAILED error. 8067*6c95dd8fSPrabhakar Kushwaha * In this case the buffer holds valid binary data, but we won't able 8068c965db44STomer Tayar * to parse it (since parsing relies on data in NVRAM which is only 8069c965db44STomer Tayar * accessible when MFW is responsive). skip the formatting but return 8070c965db44STomer Tayar * success so that binary data is provided. 8071c965db44STomer Tayar */ 8072c965db44STomer Tayar if (rc == DBG_STATUS_NVRAM_GET_IMAGE_FAILED) 8073c965db44STomer Tayar return DBG_STATUS_OK; 8074c965db44STomer Tayar 8075c965db44STomer Tayar if (rc != DBG_STATUS_OK) 8076c965db44STomer Tayar return rc; 8077c965db44STomer Tayar 8078c965db44STomer Tayar /* Format output */ 8079c965db44STomer Tayar rc = format_feature(p_hwfn, feature_idx); 8080c965db44STomer Tayar return rc; 8081c965db44STomer Tayar } 8082c965db44STomer Tayar 8083c965db44STomer Tayar int qed_dbg_grc(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 8084c965db44STomer Tayar { 8085c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_GRC, num_dumped_bytes); 8086c965db44STomer Tayar } 8087c965db44STomer Tayar 8088c965db44STomer Tayar int qed_dbg_grc_size(struct qed_dev *cdev) 8089c965db44STomer Tayar { 8090c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_GRC); 8091c965db44STomer Tayar } 8092c965db44STomer Tayar 8093c965db44STomer Tayar int qed_dbg_idle_chk(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 8094c965db44STomer Tayar { 8095c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IDLE_CHK, 8096c965db44STomer Tayar num_dumped_bytes); 8097c965db44STomer Tayar } 8098c965db44STomer Tayar 8099c965db44STomer Tayar int qed_dbg_idle_chk_size(struct qed_dev *cdev) 8100c965db44STomer Tayar { 8101c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_IDLE_CHK); 8102c965db44STomer Tayar } 8103c965db44STomer Tayar 8104c965db44STomer Tayar int qed_dbg_reg_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 8105c965db44STomer Tayar { 8106c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_REG_FIFO, 8107c965db44STomer Tayar num_dumped_bytes); 8108c965db44STomer Tayar } 8109c965db44STomer Tayar 8110c965db44STomer Tayar int qed_dbg_reg_fifo_size(struct qed_dev *cdev) 8111c965db44STomer Tayar { 8112c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_REG_FIFO); 8113c965db44STomer Tayar } 8114c965db44STomer Tayar 8115c965db44STomer Tayar int qed_dbg_igu_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 8116c965db44STomer Tayar { 8117c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IGU_FIFO, 8118c965db44STomer Tayar num_dumped_bytes); 8119c965db44STomer Tayar } 8120c965db44STomer Tayar 8121c965db44STomer Tayar int qed_dbg_igu_fifo_size(struct qed_dev *cdev) 8122c965db44STomer Tayar { 8123c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_IGU_FIFO); 8124c965db44STomer Tayar } 8125c965db44STomer Tayar 8126bf774d14SYueHaibing static int qed_dbg_nvm_image_length(struct qed_hwfn *p_hwfn, 81271ac4329aSDenis Bolotin enum qed_nvm_images image_id, u32 *length) 81281ac4329aSDenis Bolotin { 81291ac4329aSDenis Bolotin struct qed_nvm_image_att image_att; 81301ac4329aSDenis Bolotin int rc; 81311ac4329aSDenis Bolotin 81321ac4329aSDenis Bolotin *length = 0; 81331ac4329aSDenis Bolotin rc = qed_mcp_get_nvm_image_att(p_hwfn, image_id, &image_att); 81341ac4329aSDenis Bolotin if (rc) 81351ac4329aSDenis Bolotin return rc; 81361ac4329aSDenis Bolotin 81371ac4329aSDenis Bolotin *length = image_att.length; 81381ac4329aSDenis Bolotin 81391ac4329aSDenis Bolotin return rc; 81401ac4329aSDenis Bolotin } 81411ac4329aSDenis Bolotin 8142bf774d14SYueHaibing static int qed_dbg_nvm_image(struct qed_dev *cdev, void *buffer, 8143bf774d14SYueHaibing u32 *num_dumped_bytes, 8144bf774d14SYueHaibing enum qed_nvm_images image_id) 81451ac4329aSDenis Bolotin { 81461ac4329aSDenis Bolotin struct qed_hwfn *p_hwfn = 8147ca352f00SIgor Russkikh &cdev->hwfns[cdev->engine_for_debug]; 81485ab90341SAlexander Lobakin u32 len_rounded; 81491ac4329aSDenis Bolotin int rc; 81501ac4329aSDenis Bolotin 81511ac4329aSDenis Bolotin *num_dumped_bytes = 0; 81521ac4329aSDenis Bolotin rc = qed_dbg_nvm_image_length(p_hwfn, image_id, &len_rounded); 81531ac4329aSDenis Bolotin if (rc) 81541ac4329aSDenis Bolotin return rc; 81551ac4329aSDenis Bolotin 81561ac4329aSDenis Bolotin DP_NOTICE(p_hwfn->cdev, 81571ac4329aSDenis Bolotin "Collecting a debug feature [\"nvram image %d\"]\n", 81581ac4329aSDenis Bolotin image_id); 81591ac4329aSDenis Bolotin 81601ac4329aSDenis Bolotin len_rounded = roundup(len_rounded, sizeof(u32)); 81611ac4329aSDenis Bolotin rc = qed_mcp_get_nvm_image(p_hwfn, image_id, buffer, len_rounded); 81621ac4329aSDenis Bolotin if (rc) 81631ac4329aSDenis Bolotin return rc; 81641ac4329aSDenis Bolotin 81651ac4329aSDenis Bolotin /* QED_NVM_IMAGE_NVM_META image is not swapped like other images */ 81661ac4329aSDenis Bolotin if (image_id != QED_NVM_IMAGE_NVM_META) 81675ab90341SAlexander Lobakin cpu_to_be32_array((__force __be32 *)buffer, 81685ab90341SAlexander Lobakin (const u32 *)buffer, 81695ab90341SAlexander Lobakin len_rounded / sizeof(u32)); 81701ac4329aSDenis Bolotin 81711ac4329aSDenis Bolotin *num_dumped_bytes = len_rounded; 81721ac4329aSDenis Bolotin 81731ac4329aSDenis Bolotin return rc; 81741ac4329aSDenis Bolotin } 81751ac4329aSDenis Bolotin 8176c965db44STomer Tayar int qed_dbg_protection_override(struct qed_dev *cdev, void *buffer, 8177c965db44STomer Tayar u32 *num_dumped_bytes) 8178c965db44STomer Tayar { 8179c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_PROTECTION_OVERRIDE, 8180c965db44STomer Tayar num_dumped_bytes); 8181c965db44STomer Tayar } 8182c965db44STomer Tayar 8183c965db44STomer Tayar int qed_dbg_protection_override_size(struct qed_dev *cdev) 8184c965db44STomer Tayar { 8185c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_PROTECTION_OVERRIDE); 8186c965db44STomer Tayar } 8187c965db44STomer Tayar 8188c965db44STomer Tayar int qed_dbg_fw_asserts(struct qed_dev *cdev, void *buffer, 8189c965db44STomer Tayar u32 *num_dumped_bytes) 8190c965db44STomer Tayar { 8191c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_FW_ASSERTS, 8192c965db44STomer Tayar num_dumped_bytes); 8193c965db44STomer Tayar } 8194c965db44STomer Tayar 8195c965db44STomer Tayar int qed_dbg_fw_asserts_size(struct qed_dev *cdev) 8196c965db44STomer Tayar { 8197c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_FW_ASSERTS); 8198c965db44STomer Tayar } 8199c965db44STomer Tayar 82008a52bbabSMichal Kalderon int qed_dbg_ilt(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 82018a52bbabSMichal Kalderon { 82028a52bbabSMichal Kalderon return qed_dbg_feature(cdev, buffer, DBG_FEATURE_ILT, num_dumped_bytes); 82038a52bbabSMichal Kalderon } 82048a52bbabSMichal Kalderon 82058a52bbabSMichal Kalderon int qed_dbg_ilt_size(struct qed_dev *cdev) 82068a52bbabSMichal Kalderon { 82078a52bbabSMichal Kalderon return qed_dbg_feature_size(cdev, DBG_FEATURE_ILT); 82088a52bbabSMichal Kalderon } 82098a52bbabSMichal Kalderon 8210c965db44STomer Tayar int qed_dbg_mcp_trace(struct qed_dev *cdev, void *buffer, 8211c965db44STomer Tayar u32 *num_dumped_bytes) 8212c965db44STomer Tayar { 8213c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_MCP_TRACE, 8214c965db44STomer Tayar num_dumped_bytes); 8215c965db44STomer Tayar } 8216c965db44STomer Tayar 8217c965db44STomer Tayar int qed_dbg_mcp_trace_size(struct qed_dev *cdev) 8218c965db44STomer Tayar { 8219c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_MCP_TRACE); 8220c965db44STomer Tayar } 8221c965db44STomer Tayar 8222c965db44STomer Tayar /* Defines the amount of bytes allocated for recording the length of debugfs 8223c965db44STomer Tayar * feature buffer. 8224c965db44STomer Tayar */ 8225c965db44STomer Tayar #define REGDUMP_HEADER_SIZE sizeof(u32) 82268a52bbabSMichal Kalderon #define REGDUMP_HEADER_SIZE_SHIFT 0 82278a52bbabSMichal Kalderon #define REGDUMP_HEADER_SIZE_MASK 0xffffff 8228c965db44STomer Tayar #define REGDUMP_HEADER_FEATURE_SHIFT 24 8229da328711SAlexander Lobakin #define REGDUMP_HEADER_FEATURE_MASK 0x1f 8230da328711SAlexander Lobakin #define REGDUMP_HEADER_BIN_DUMP_SHIFT 29 8231da328711SAlexander Lobakin #define REGDUMP_HEADER_BIN_DUMP_MASK 0x1 8232c965db44STomer Tayar #define REGDUMP_HEADER_OMIT_ENGINE_SHIFT 30 82338a52bbabSMichal Kalderon #define REGDUMP_HEADER_OMIT_ENGINE_MASK 0x1 82348a52bbabSMichal Kalderon #define REGDUMP_HEADER_ENGINE_SHIFT 31 82358a52bbabSMichal Kalderon #define REGDUMP_HEADER_ENGINE_MASK 0x1 82368a52bbabSMichal Kalderon #define REGDUMP_MAX_SIZE 0x1000000 82378a52bbabSMichal Kalderon #define ILT_DUMP_MAX_SIZE (1024 * 1024 * 15) 82388a52bbabSMichal Kalderon 8239c965db44STomer Tayar enum debug_print_features { 8240c965db44STomer Tayar OLD_MODE = 0, 8241c965db44STomer Tayar IDLE_CHK = 1, 8242c965db44STomer Tayar GRC_DUMP = 2, 8243c965db44STomer Tayar MCP_TRACE = 3, 8244c965db44STomer Tayar REG_FIFO = 4, 8245c965db44STomer Tayar PROTECTION_OVERRIDE = 5, 8246c965db44STomer Tayar IGU_FIFO = 6, 8247c965db44STomer Tayar PHY = 7, 8248c965db44STomer Tayar FW_ASSERTS = 8, 82491ac4329aSDenis Bolotin NVM_CFG1 = 9, 82501ac4329aSDenis Bolotin DEFAULT_CFG = 10, 82511ac4329aSDenis Bolotin NVM_META = 11, 82528a52bbabSMichal Kalderon MDUMP = 12, 82538a52bbabSMichal Kalderon ILT_DUMP = 13, 8254c965db44STomer Tayar }; 8255c965db44STomer Tayar 82562d22bc83SMichal Kalderon static u32 qed_calc_regdump_header(struct qed_dev *cdev, 82572d22bc83SMichal Kalderon enum debug_print_features feature, 8258*6c95dd8fSPrabhakar Kushwaha int engine, u32 feature_size, 8259*6c95dd8fSPrabhakar Kushwaha u8 omit_engine, u8 dbg_bin_dump) 8260c965db44STomer Tayar { 82612d22bc83SMichal Kalderon u32 res = 0; 82622d22bc83SMichal Kalderon 82632d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_SIZE, feature_size); 82642d22bc83SMichal Kalderon if (res != feature_size) 82652d22bc83SMichal Kalderon DP_NOTICE(cdev, 82662d22bc83SMichal Kalderon "Feature %d is too large (size 0x%x) and will corrupt the dump\n", 82672d22bc83SMichal Kalderon feature, feature_size); 82682d22bc83SMichal Kalderon 82692d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_FEATURE, feature); 8270*6c95dd8fSPrabhakar Kushwaha SET_FIELD(res, REGDUMP_HEADER_BIN_DUMP, dbg_bin_dump); 82712d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_OMIT_ENGINE, omit_engine); 82722d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_ENGINE, engine); 82732d22bc83SMichal Kalderon 82742d22bc83SMichal Kalderon return res; 8275c965db44STomer Tayar } 8276c965db44STomer Tayar 8277c965db44STomer Tayar int qed_dbg_all_data(struct qed_dev *cdev, void *buffer) 8278c965db44STomer Tayar { 8279c965db44STomer Tayar u8 cur_engine, omit_engine = 0, org_engine; 8280*6c95dd8fSPrabhakar Kushwaha struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug]; 82813b86bd07SSudarsana Reddy Kalluru struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 8282*6c95dd8fSPrabhakar Kushwaha int grc_params[MAX_DBG_GRC_PARAMS], rc, i; 8283c965db44STomer Tayar u32 offset = 0, feature_size; 8284c965db44STomer Tayar 82853b86bd07SSudarsana Reddy Kalluru for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) 82863b86bd07SSudarsana Reddy Kalluru grc_params[i] = dev_data->grc.param_val[i]; 82873b86bd07SSudarsana Reddy Kalluru 82882d22bc83SMichal Kalderon if (!QED_IS_CMT(cdev)) 8289c965db44STomer Tayar omit_engine = 1; 8290c965db44STomer Tayar 8291*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump = 1; 82922d22bc83SMichal Kalderon mutex_lock(&qed_dbg_lock); 82932d22bc83SMichal Kalderon 8294c965db44STomer Tayar org_engine = qed_get_debug_engine(cdev); 8295c965db44STomer Tayar for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) { 8296c965db44STomer Tayar /* Collect idle_chks and grcDump for each hw function */ 8297c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, 8298c965db44STomer Tayar "obtaining idle_chk and grcdump for current engine\n"); 8299c965db44STomer Tayar qed_set_debug_engine(cdev, cur_engine); 8300c965db44STomer Tayar 8301c965db44STomer Tayar /* First idle_chk */ 8302c965db44STomer Tayar rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset + 8303c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8304c965db44STomer Tayar if (!rc) { 8305c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 8306*6c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, IDLE_CHK, 8307*6c95dd8fSPrabhakar Kushwaha cur_engine, 8308*6c95dd8fSPrabhakar Kushwaha feature_size, 8309*6c95dd8fSPrabhakar Kushwaha omit_engine, 8310*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8311c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8312c965db44STomer Tayar } else { 8313c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc); 8314c965db44STomer Tayar } 8315c965db44STomer Tayar 8316c965db44STomer Tayar /* Second idle_chk */ 8317c965db44STomer Tayar rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset + 8318c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8319c965db44STomer Tayar if (!rc) { 8320c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 8321*6c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, IDLE_CHK, 8322*6c95dd8fSPrabhakar Kushwaha cur_engine, 8323*6c95dd8fSPrabhakar Kushwaha feature_size, 8324*6c95dd8fSPrabhakar Kushwaha omit_engine, 8325*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8326c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8327c965db44STomer Tayar } else { 8328c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc); 8329c965db44STomer Tayar } 8330c965db44STomer Tayar 8331c965db44STomer Tayar /* reg_fifo dump */ 8332c965db44STomer Tayar rc = qed_dbg_reg_fifo(cdev, (u8 *)buffer + offset + 8333c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8334c965db44STomer Tayar if (!rc) { 8335c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 8336*6c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, REG_FIFO, 8337*6c95dd8fSPrabhakar Kushwaha cur_engine, 8338*6c95dd8fSPrabhakar Kushwaha feature_size, 8339*6c95dd8fSPrabhakar Kushwaha omit_engine, 8340*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8341c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8342c965db44STomer Tayar } else { 8343c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_reg_fifo failed. rc = %d\n", rc); 8344c965db44STomer Tayar } 8345c965db44STomer Tayar 8346c965db44STomer Tayar /* igu_fifo dump */ 8347c965db44STomer Tayar rc = qed_dbg_igu_fifo(cdev, (u8 *)buffer + offset + 8348c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8349c965db44STomer Tayar if (!rc) { 8350c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 8351*6c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, IGU_FIFO, 8352*6c95dd8fSPrabhakar Kushwaha cur_engine, 8353*6c95dd8fSPrabhakar Kushwaha feature_size, 8354*6c95dd8fSPrabhakar Kushwaha omit_engine, 8355*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8356c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8357c965db44STomer Tayar } else { 8358c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_igu_fifo failed. rc = %d", rc); 8359c965db44STomer Tayar } 8360c965db44STomer Tayar 8361c965db44STomer Tayar /* protection_override dump */ 8362c965db44STomer Tayar rc = qed_dbg_protection_override(cdev, (u8 *)buffer + offset + 8363c965db44STomer Tayar REGDUMP_HEADER_SIZE, 8364c965db44STomer Tayar &feature_size); 8365c965db44STomer Tayar if (!rc) { 8366c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 8367*6c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, 8368*6c95dd8fSPrabhakar Kushwaha PROTECTION_OVERRIDE, 8369c965db44STomer Tayar cur_engine, 8370*6c95dd8fSPrabhakar Kushwaha feature_size, 8371*6c95dd8fSPrabhakar Kushwaha omit_engine, 8372*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8373c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8374c965db44STomer Tayar } else { 8375c965db44STomer Tayar DP_ERR(cdev, 8376c965db44STomer Tayar "qed_dbg_protection_override failed. rc = %d\n", 8377c965db44STomer Tayar rc); 8378c965db44STomer Tayar } 8379c965db44STomer Tayar 8380c965db44STomer Tayar /* fw_asserts dump */ 8381c965db44STomer Tayar rc = qed_dbg_fw_asserts(cdev, (u8 *)buffer + offset + 8382c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8383c965db44STomer Tayar if (!rc) { 8384c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 83852d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, FW_ASSERTS, 8386*6c95dd8fSPrabhakar Kushwaha cur_engine, 8387*6c95dd8fSPrabhakar Kushwaha feature_size, 8388*6c95dd8fSPrabhakar Kushwaha omit_engine, 8389*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8390c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8391c965db44STomer Tayar } else { 8392c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_fw_asserts failed. rc = %d\n", 8393c965db44STomer Tayar rc); 8394c965db44STomer Tayar } 8395c965db44STomer Tayar 83968a52bbabSMichal Kalderon feature_size = qed_dbg_ilt_size(cdev); 8397*6c95dd8fSPrabhakar Kushwaha if (!cdev->disable_ilt_dump && feature_size < 8398*6c95dd8fSPrabhakar Kushwaha ILT_DUMP_MAX_SIZE) { 83998a52bbabSMichal Kalderon rc = qed_dbg_ilt(cdev, (u8 *)buffer + offset + 84008a52bbabSMichal Kalderon REGDUMP_HEADER_SIZE, &feature_size); 84018a52bbabSMichal Kalderon if (!rc) { 84028a52bbabSMichal Kalderon *(u32 *)((u8 *)buffer + offset) = 84032d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, ILT_DUMP, 84048a52bbabSMichal Kalderon cur_engine, 84058a52bbabSMichal Kalderon feature_size, 8406*6c95dd8fSPrabhakar Kushwaha omit_engine, 8407*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8408*6c95dd8fSPrabhakar Kushwaha offset += (feature_size + REGDUMP_HEADER_SIZE); 84098a52bbabSMichal Kalderon } else { 84108a52bbabSMichal Kalderon DP_ERR(cdev, "qed_dbg_ilt failed. rc = %d\n", 84118a52bbabSMichal Kalderon rc); 84128a52bbabSMichal Kalderon } 84138a52bbabSMichal Kalderon } 84143b86bd07SSudarsana Reddy Kalluru 8415*6c95dd8fSPrabhakar Kushwaha /* Grc dump - must be last because when mcp stuck it will 8416c965db44STomer Tayar * clutter idle_chk, reg_fifo, ... 8417c965db44STomer Tayar */ 84182d22bc83SMichal Kalderon for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) 84192d22bc83SMichal Kalderon dev_data->grc.param_val[i] = grc_params[i]; 84202d22bc83SMichal Kalderon 8421c965db44STomer Tayar rc = qed_dbg_grc(cdev, (u8 *)buffer + offset + 8422c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8423c965db44STomer Tayar if (!rc) { 8424c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 84252d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, GRC_DUMP, 84262d22bc83SMichal Kalderon cur_engine, 8427*6c95dd8fSPrabhakar Kushwaha feature_size, 8428*6c95dd8fSPrabhakar Kushwaha omit_engine, 8429*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8430c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8431c965db44STomer Tayar } else { 8432c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_grc failed. rc = %d", rc); 8433c965db44STomer Tayar } 8434c965db44STomer Tayar } 8435c965db44STomer Tayar 843650bc60cbSMichal Kalderon qed_set_debug_engine(cdev, org_engine); 84372d22bc83SMichal Kalderon 8438c965db44STomer Tayar /* mcp_trace */ 8439c965db44STomer Tayar rc = qed_dbg_mcp_trace(cdev, (u8 *)buffer + offset + 8440c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 8441c965db44STomer Tayar if (!rc) { 8442c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 84432d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, MCP_TRACE, cur_engine, 8444*6c95dd8fSPrabhakar Kushwaha feature_size, omit_engine, 8445*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 8446c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 8447c965db44STomer Tayar } else { 8448c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_mcp_trace failed. rc = %d\n", rc); 8449c965db44STomer Tayar } 8450c965db44STomer Tayar 84511ac4329aSDenis Bolotin /* nvm cfg1 */ 84521ac4329aSDenis Bolotin rc = qed_dbg_nvm_image(cdev, 84532d22bc83SMichal Kalderon (u8 *)buffer + offset + 84542d22bc83SMichal Kalderon REGDUMP_HEADER_SIZE, &feature_size, 84552d22bc83SMichal Kalderon QED_NVM_IMAGE_NVM_CFG1); 84561ac4329aSDenis Bolotin if (!rc) { 84571ac4329aSDenis Bolotin *(u32 *)((u8 *)buffer + offset) = 84582d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, NVM_CFG1, cur_engine, 8459*6c95dd8fSPrabhakar Kushwaha feature_size, omit_engine, 8460*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 84611ac4329aSDenis Bolotin offset += (feature_size + REGDUMP_HEADER_SIZE); 84621ac4329aSDenis Bolotin } else if (rc != -ENOENT) { 84631ac4329aSDenis Bolotin DP_ERR(cdev, 84641ac4329aSDenis Bolotin "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 8465*6c95dd8fSPrabhakar Kushwaha QED_NVM_IMAGE_NVM_CFG1, "QED_NVM_IMAGE_NVM_CFG1", 8466*6c95dd8fSPrabhakar Kushwaha rc); 84671ac4329aSDenis Bolotin } 84681ac4329aSDenis Bolotin 84691ac4329aSDenis Bolotin /* nvm default */ 84701ac4329aSDenis Bolotin rc = qed_dbg_nvm_image(cdev, 8471*6c95dd8fSPrabhakar Kushwaha (u8 *)buffer + offset + 8472*6c95dd8fSPrabhakar Kushwaha REGDUMP_HEADER_SIZE, &feature_size, 8473*6c95dd8fSPrabhakar Kushwaha QED_NVM_IMAGE_DEFAULT_CFG); 84741ac4329aSDenis Bolotin if (!rc) { 84751ac4329aSDenis Bolotin *(u32 *)((u8 *)buffer + offset) = 8476*6c95dd8fSPrabhakar Kushwaha qed_calc_regdump_header(cdev, DEFAULT_CFG, 8477*6c95dd8fSPrabhakar Kushwaha cur_engine, feature_size, 8478*6c95dd8fSPrabhakar Kushwaha omit_engine, 8479*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 84801ac4329aSDenis Bolotin offset += (feature_size + REGDUMP_HEADER_SIZE); 84811ac4329aSDenis Bolotin } else if (rc != -ENOENT) { 84821ac4329aSDenis Bolotin DP_ERR(cdev, 84831ac4329aSDenis Bolotin "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 8484*6c95dd8fSPrabhakar Kushwaha QED_NVM_IMAGE_DEFAULT_CFG, 8485*6c95dd8fSPrabhakar Kushwaha "QED_NVM_IMAGE_DEFAULT_CFG", rc); 84861ac4329aSDenis Bolotin } 84871ac4329aSDenis Bolotin 84881ac4329aSDenis Bolotin /* nvm meta */ 84891ac4329aSDenis Bolotin rc = qed_dbg_nvm_image(cdev, 8490*6c95dd8fSPrabhakar Kushwaha (u8 *)buffer + offset + 8491*6c95dd8fSPrabhakar Kushwaha REGDUMP_HEADER_SIZE, &feature_size, 8492*6c95dd8fSPrabhakar Kushwaha QED_NVM_IMAGE_NVM_META); 84931ac4329aSDenis Bolotin if (!rc) { 84941ac4329aSDenis Bolotin *(u32 *)((u8 *)buffer + offset) = 84952d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, NVM_META, cur_engine, 8496*6c95dd8fSPrabhakar Kushwaha feature_size, omit_engine, 8497*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 84981ac4329aSDenis Bolotin offset += (feature_size + REGDUMP_HEADER_SIZE); 84991ac4329aSDenis Bolotin } else if (rc != -ENOENT) { 85001ac4329aSDenis Bolotin DP_ERR(cdev, 85011ac4329aSDenis Bolotin "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 8502*6c95dd8fSPrabhakar Kushwaha QED_NVM_IMAGE_NVM_META, "QED_NVM_IMAGE_NVM_META", 8503*6c95dd8fSPrabhakar Kushwaha rc); 85041ac4329aSDenis Bolotin } 85051ac4329aSDenis Bolotin 85068a52bbabSMichal Kalderon /* nvm mdump */ 85078a52bbabSMichal Kalderon rc = qed_dbg_nvm_image(cdev, (u8 *)buffer + offset + 85088a52bbabSMichal Kalderon REGDUMP_HEADER_SIZE, &feature_size, 85098a52bbabSMichal Kalderon QED_NVM_IMAGE_MDUMP); 85108a52bbabSMichal Kalderon if (!rc) { 85118a52bbabSMichal Kalderon *(u32 *)((u8 *)buffer + offset) = 85122d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, MDUMP, cur_engine, 8513*6c95dd8fSPrabhakar Kushwaha feature_size, omit_engine, 8514*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump); 85158a52bbabSMichal Kalderon offset += (feature_size + REGDUMP_HEADER_SIZE); 85168a52bbabSMichal Kalderon } else if (rc != -ENOENT) { 85178a52bbabSMichal Kalderon DP_ERR(cdev, 85188a52bbabSMichal Kalderon "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 85198a52bbabSMichal Kalderon QED_NVM_IMAGE_MDUMP, "QED_NVM_IMAGE_MDUMP", rc); 85208a52bbabSMichal Kalderon } 85218a52bbabSMichal Kalderon 85222d22bc83SMichal Kalderon mutex_unlock(&qed_dbg_lock); 8523*6c95dd8fSPrabhakar Kushwaha cdev->dbg_bin_dump = 0; 85242d22bc83SMichal Kalderon 8525c965db44STomer Tayar return 0; 8526c965db44STomer Tayar } 8527c965db44STomer Tayar 8528c965db44STomer Tayar int qed_dbg_all_data_size(struct qed_dev *cdev) 8529c965db44STomer Tayar { 85308a52bbabSMichal Kalderon u32 regs_len = 0, image_len = 0, ilt_len = 0, total_ilt_len = 0; 8531*6c95dd8fSPrabhakar Kushwaha struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug]; 8532c965db44STomer Tayar u8 cur_engine, org_engine; 8533c965db44STomer Tayar 85342d22bc83SMichal Kalderon cdev->disable_ilt_dump = false; 8535c965db44STomer Tayar org_engine = qed_get_debug_engine(cdev); 8536c965db44STomer Tayar for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) { 8537c965db44STomer Tayar /* Engine specific */ 8538c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, 8539c965db44STomer Tayar "calculating idle_chk and grcdump register length for current engine\n"); 8540c965db44STomer Tayar qed_set_debug_engine(cdev, cur_engine); 8541c965db44STomer Tayar regs_len += REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) + 8542c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) + 8543c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_grc_size(cdev) + 8544c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_reg_fifo_size(cdev) + 8545c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_igu_fifo_size(cdev) + 8546c965db44STomer Tayar REGDUMP_HEADER_SIZE + 8547c965db44STomer Tayar qed_dbg_protection_override_size(cdev) + 8548c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_fw_asserts_size(cdev); 85498a52bbabSMichal Kalderon ilt_len = REGDUMP_HEADER_SIZE + qed_dbg_ilt_size(cdev); 85508a52bbabSMichal Kalderon if (ilt_len < ILT_DUMP_MAX_SIZE) { 85518a52bbabSMichal Kalderon total_ilt_len += ilt_len; 85528a52bbabSMichal Kalderon regs_len += ilt_len; 85538a52bbabSMichal Kalderon } 8554c965db44STomer Tayar } 8555c965db44STomer Tayar 855650bc60cbSMichal Kalderon qed_set_debug_engine(cdev, org_engine); 855750bc60cbSMichal Kalderon 8558c965db44STomer Tayar /* Engine common */ 8559*6c95dd8fSPrabhakar Kushwaha regs_len += REGDUMP_HEADER_SIZE + qed_dbg_mcp_trace_size(cdev) + 8560*6c95dd8fSPrabhakar Kushwaha REGDUMP_HEADER_SIZE + qed_dbg_phy_size(cdev); 85611ac4329aSDenis Bolotin qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_CFG1, &image_len); 85621ac4329aSDenis Bolotin if (image_len) 85631ac4329aSDenis Bolotin regs_len += REGDUMP_HEADER_SIZE + image_len; 85641ac4329aSDenis Bolotin qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_DEFAULT_CFG, &image_len); 85651ac4329aSDenis Bolotin if (image_len) 85661ac4329aSDenis Bolotin regs_len += REGDUMP_HEADER_SIZE + image_len; 85671ac4329aSDenis Bolotin qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_META, &image_len); 85681ac4329aSDenis Bolotin if (image_len) 85691ac4329aSDenis Bolotin regs_len += REGDUMP_HEADER_SIZE + image_len; 85708a52bbabSMichal Kalderon qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_MDUMP, &image_len); 85718a52bbabSMichal Kalderon if (image_len) 85728a52bbabSMichal Kalderon regs_len += REGDUMP_HEADER_SIZE + image_len; 85738a52bbabSMichal Kalderon 85748a52bbabSMichal Kalderon if (regs_len > REGDUMP_MAX_SIZE) { 85758a52bbabSMichal Kalderon DP_VERBOSE(cdev, QED_MSG_DEBUG, 85768a52bbabSMichal Kalderon "Dump exceeds max size 0x%x, disable ILT dump\n", 85778a52bbabSMichal Kalderon REGDUMP_MAX_SIZE); 85788a52bbabSMichal Kalderon cdev->disable_ilt_dump = true; 85798a52bbabSMichal Kalderon regs_len -= total_ilt_len; 85808a52bbabSMichal Kalderon } 8581c965db44STomer Tayar 8582c965db44STomer Tayar return regs_len; 8583c965db44STomer Tayar } 8584c965db44STomer Tayar 8585c965db44STomer Tayar int qed_dbg_feature(struct qed_dev *cdev, void *buffer, 8586c965db44STomer Tayar enum qed_dbg_features feature, u32 *num_dumped_bytes) 8587c965db44STomer Tayar { 8588*6c95dd8fSPrabhakar Kushwaha struct qed_dbg_feature *qed_feature = &cdev->dbg_features[feature]; 8589*6c95dd8fSPrabhakar Kushwaha struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug]; 8590c965db44STomer Tayar enum dbg_status dbg_rc; 8591c965db44STomer Tayar struct qed_ptt *p_ptt; 8592c965db44STomer Tayar int rc = 0; 8593c965db44STomer Tayar 8594c965db44STomer Tayar /* Acquire ptt */ 8595c965db44STomer Tayar p_ptt = qed_ptt_acquire(p_hwfn); 8596c965db44STomer Tayar if (!p_ptt) 8597c965db44STomer Tayar return -EINVAL; 8598c965db44STomer Tayar 8599c965db44STomer Tayar /* Get dump */ 8600c965db44STomer Tayar dbg_rc = qed_dbg_dump(p_hwfn, p_ptt, feature); 8601c965db44STomer Tayar if (dbg_rc != DBG_STATUS_OK) { 8602c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, "%s\n", 8603c965db44STomer Tayar qed_dbg_get_status_str(dbg_rc)); 8604c965db44STomer Tayar *num_dumped_bytes = 0; 8605c965db44STomer Tayar rc = -EINVAL; 8606c965db44STomer Tayar goto out; 8607c965db44STomer Tayar } 8608c965db44STomer Tayar 8609c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, 8610c965db44STomer Tayar "copying debugfs feature to external buffer\n"); 8611c965db44STomer Tayar memcpy(buffer, qed_feature->dump_buf, qed_feature->buf_size); 8612ca352f00SIgor Russkikh *num_dumped_bytes = cdev->dbg_features[feature].dumped_dwords * 8613c965db44STomer Tayar 4; 8614c965db44STomer Tayar 8615c965db44STomer Tayar out: 8616c965db44STomer Tayar qed_ptt_release(p_hwfn, p_ptt); 8617c965db44STomer Tayar return rc; 8618c965db44STomer Tayar } 8619c965db44STomer Tayar 8620c965db44STomer Tayar int qed_dbg_feature_size(struct qed_dev *cdev, enum qed_dbg_features feature) 8621c965db44STomer Tayar { 86222d22bc83SMichal Kalderon struct qed_dbg_feature *qed_feature = &cdev->dbg_features[feature]; 8623*6c95dd8fSPrabhakar Kushwaha struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug]; 8624c965db44STomer Tayar struct qed_ptt *p_ptt = qed_ptt_acquire(p_hwfn); 8625c965db44STomer Tayar u32 buf_size_dwords; 8626c965db44STomer Tayar enum dbg_status rc; 8627c965db44STomer Tayar 8628c965db44STomer Tayar if (!p_ptt) 8629c965db44STomer Tayar return -EINVAL; 8630c965db44STomer Tayar 8631c965db44STomer Tayar rc = qed_features_lookup[feature].get_size(p_hwfn, p_ptt, 8632c965db44STomer Tayar &buf_size_dwords); 8633c965db44STomer Tayar if (rc != DBG_STATUS_OK) 8634c965db44STomer Tayar buf_size_dwords = 0; 8635c965db44STomer Tayar 86368a52bbabSMichal Kalderon /* Feature will not be dumped if it exceeds maximum size */ 86378a52bbabSMichal Kalderon if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS) 86388a52bbabSMichal Kalderon buf_size_dwords = 0; 86398a52bbabSMichal Kalderon 8640c965db44STomer Tayar qed_ptt_release(p_hwfn, p_ptt); 8641c965db44STomer Tayar qed_feature->buf_size = buf_size_dwords * sizeof(u32); 8642c965db44STomer Tayar return qed_feature->buf_size; 8643c965db44STomer Tayar } 8644c965db44STomer Tayar 8645*6c95dd8fSPrabhakar Kushwaha int qed_dbg_phy_size(struct qed_dev *cdev) 8646*6c95dd8fSPrabhakar Kushwaha { 8647*6c95dd8fSPrabhakar Kushwaha /* return max size of phy info and 8648*6c95dd8fSPrabhakar Kushwaha * phy mac_stat multiplied by the number of ports 8649*6c95dd8fSPrabhakar Kushwaha */ 8650*6c95dd8fSPrabhakar Kushwaha return MAX_PHY_RESULT_BUFFER * (1 + qed_device_num_ports(cdev)); 8651*6c95dd8fSPrabhakar Kushwaha } 8652*6c95dd8fSPrabhakar Kushwaha 8653c965db44STomer Tayar u8 qed_get_debug_engine(struct qed_dev *cdev) 8654c965db44STomer Tayar { 8655ca352f00SIgor Russkikh return cdev->engine_for_debug; 8656c965db44STomer Tayar } 8657c965db44STomer Tayar 8658c965db44STomer Tayar void qed_set_debug_engine(struct qed_dev *cdev, int engine_number) 8659c965db44STomer Tayar { 8660c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, "set debug engine to %d\n", 8661c965db44STomer Tayar engine_number); 8662ca352f00SIgor Russkikh cdev->engine_for_debug = engine_number; 8663c965db44STomer Tayar } 8664c965db44STomer Tayar 8665c965db44STomer Tayar void qed_dbg_pf_init(struct qed_dev *cdev) 8666c965db44STomer Tayar { 86672d22bc83SMichal Kalderon const u8 *dbg_values = NULL; 86682d22bc83SMichal Kalderon int i; 8669c965db44STomer Tayar 8670*6c95dd8fSPrabhakar Kushwaha /* Sync ver with debugbus qed code */ 8671*6c95dd8fSPrabhakar Kushwaha qed_dbg_set_app_ver(TOOLS_VERSION); 8672*6c95dd8fSPrabhakar Kushwaha 8673c965db44STomer Tayar /* Debug values are after init values. 8674c965db44STomer Tayar * The offset is the first dword of the file. 8675c965db44STomer Tayar */ 8676c965db44STomer Tayar dbg_values = cdev->firmware->data + *(u32 *)cdev->firmware->data; 86772d22bc83SMichal Kalderon 86782d22bc83SMichal Kalderon for_each_hwfn(cdev, i) { 86792d22bc83SMichal Kalderon qed_dbg_set_bin_ptr(&cdev->hwfns[i], dbg_values); 86802d22bc83SMichal Kalderon qed_dbg_user_set_bin_ptr(&cdev->hwfns[i], dbg_values); 86812d22bc83SMichal Kalderon } 86822d22bc83SMichal Kalderon 86832d22bc83SMichal Kalderon /* Set the hwfn to be 0 as default */ 8684ca352f00SIgor Russkikh cdev->engine_for_debug = 0; 8685c965db44STomer Tayar } 8686c965db44STomer Tayar 8687c965db44STomer Tayar void qed_dbg_pf_exit(struct qed_dev *cdev) 8688c965db44STomer Tayar { 8689c965db44STomer Tayar struct qed_dbg_feature *feature = NULL; 8690c965db44STomer Tayar enum qed_dbg_features feature_idx; 8691c965db44STomer Tayar 86922d22bc83SMichal Kalderon /* debug features' buffers may be allocated if debug feature was used 86932d22bc83SMichal Kalderon * but dump wasn't called 8694c965db44STomer Tayar */ 8695c965db44STomer Tayar for (feature_idx = 0; feature_idx < DBG_FEATURE_NUM; feature_idx++) { 86962d22bc83SMichal Kalderon feature = &cdev->dbg_features[feature_idx]; 8697c965db44STomer Tayar if (feature->dump_buf) { 8698c965db44STomer Tayar vfree(feature->dump_buf); 8699c965db44STomer Tayar feature->dump_buf = NULL; 8700c965db44STomer Tayar } 8701c965db44STomer Tayar } 8702c965db44STomer Tayar } 8703