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 4663eacd8SAlexander Lobakin * Copyright (c) 2019-2020 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" 13c965db44STomer Tayar #include "qed_hw.h" 14c965db44STomer Tayar #include "qed_mcp.h" 15c965db44STomer Tayar #include "qed_reg_addr.h" 16c965db44STomer Tayar 17c965db44STomer Tayar /* Memory groups enum */ 18c965db44STomer Tayar enum mem_groups { 19c965db44STomer Tayar MEM_GROUP_PXP_MEM, 20c965db44STomer Tayar MEM_GROUP_DMAE_MEM, 21c965db44STomer Tayar MEM_GROUP_CM_MEM, 22c965db44STomer Tayar MEM_GROUP_QM_MEM, 23da090917STomer Tayar MEM_GROUP_DORQ_MEM, 24c965db44STomer Tayar MEM_GROUP_BRB_RAM, 25c965db44STomer Tayar MEM_GROUP_BRB_MEM, 26c965db44STomer Tayar MEM_GROUP_PRS_MEM, 27da090917STomer Tayar MEM_GROUP_SDM_MEM, 287b6859fbSMintz, Yuval MEM_GROUP_PBUF, 292d22bc83SMichal Kalderon MEM_GROUP_IOR, 30da090917STomer Tayar MEM_GROUP_RAM, 312d22bc83SMichal Kalderon MEM_GROUP_BTB_RAM, 32da090917STomer Tayar MEM_GROUP_RDIF_CTX, 33da090917STomer Tayar MEM_GROUP_TDIF_CTX, 34da090917STomer Tayar MEM_GROUP_CFC_MEM, 352d22bc83SMichal Kalderon MEM_GROUP_CONN_CFC_MEM, 362d22bc83SMichal Kalderon MEM_GROUP_CAU_PI, 372d22bc83SMichal Kalderon MEM_GROUP_CAU_MEM, 382d22bc83SMichal Kalderon MEM_GROUP_CAU_MEM_EXT, 392d22bc83SMichal Kalderon MEM_GROUP_PXP_ILT, 402d22bc83SMichal Kalderon MEM_GROUP_MULD_MEM, 412d22bc83SMichal Kalderon MEM_GROUP_BTB_MEM, 42c965db44STomer Tayar MEM_GROUP_IGU_MEM, 43c965db44STomer Tayar MEM_GROUP_IGU_MSIX, 44c965db44STomer Tayar MEM_GROUP_CAU_SB, 45c965db44STomer Tayar MEM_GROUP_BMB_RAM, 46c965db44STomer Tayar MEM_GROUP_BMB_MEM, 472d22bc83SMichal Kalderon MEM_GROUP_TM_MEM, 482d22bc83SMichal Kalderon MEM_GROUP_TASK_CFC_MEM, 49c965db44STomer Tayar MEM_GROUPS_NUM 50c965db44STomer Tayar }; 51c965db44STomer Tayar 52c965db44STomer Tayar /* Memory groups names */ 53c965db44STomer Tayar static const char * const s_mem_group_names[] = { 54c965db44STomer Tayar "PXP_MEM", 55c965db44STomer Tayar "DMAE_MEM", 56c965db44STomer Tayar "CM_MEM", 57c965db44STomer Tayar "QM_MEM", 58da090917STomer Tayar "DORQ_MEM", 59c965db44STomer Tayar "BRB_RAM", 60c965db44STomer Tayar "BRB_MEM", 61c965db44STomer Tayar "PRS_MEM", 62da090917STomer Tayar "SDM_MEM", 637b6859fbSMintz, Yuval "PBUF", 642d22bc83SMichal Kalderon "IOR", 65da090917STomer Tayar "RAM", 662d22bc83SMichal Kalderon "BTB_RAM", 67da090917STomer Tayar "RDIF_CTX", 68da090917STomer Tayar "TDIF_CTX", 69da090917STomer Tayar "CFC_MEM", 702d22bc83SMichal Kalderon "CONN_CFC_MEM", 712d22bc83SMichal Kalderon "CAU_PI", 722d22bc83SMichal Kalderon "CAU_MEM", 732d22bc83SMichal Kalderon "CAU_MEM_EXT", 742d22bc83SMichal Kalderon "PXP_ILT", 752d22bc83SMichal Kalderon "MULD_MEM", 762d22bc83SMichal Kalderon "BTB_MEM", 77c965db44STomer Tayar "IGU_MEM", 78c965db44STomer Tayar "IGU_MSIX", 79c965db44STomer Tayar "CAU_SB", 80c965db44STomer Tayar "BMB_RAM", 81c965db44STomer Tayar "BMB_MEM", 822d22bc83SMichal Kalderon "TM_MEM", 832d22bc83SMichal Kalderon "TASK_CFC_MEM", 84c965db44STomer Tayar }; 85c965db44STomer Tayar 86c965db44STomer Tayar /* Idle check conditions */ 877b6859fbSMintz, Yuval 887b6859fbSMintz, Yuval static u32 cond5(const u32 *r, const u32 *imm) 89c965db44STomer Tayar { 90c965db44STomer Tayar return ((r[0] & imm[0]) != imm[1]) && ((r[1] & imm[2]) != imm[3]); 91c965db44STomer Tayar } 92c965db44STomer Tayar 937b6859fbSMintz, Yuval static u32 cond7(const u32 *r, const u32 *imm) 94c965db44STomer Tayar { 95c965db44STomer Tayar return ((r[0] >> imm[0]) & imm[1]) != imm[2]; 96c965db44STomer Tayar } 97c965db44STomer Tayar 987b6859fbSMintz, Yuval static u32 cond6(const u32 *r, const u32 *imm) 99c965db44STomer Tayar { 100c965db44STomer Tayar return (r[0] & imm[0]) != imm[1]; 101c965db44STomer Tayar } 102c965db44STomer Tayar 1037b6859fbSMintz, Yuval static u32 cond9(const u32 *r, const u32 *imm) 104c965db44STomer Tayar { 105c965db44STomer Tayar return ((r[0] & imm[0]) >> imm[1]) != 106c965db44STomer Tayar (((r[0] & imm[2]) >> imm[3]) | ((r[1] & imm[4]) << imm[5])); 107c965db44STomer Tayar } 108c965db44STomer Tayar 1097b6859fbSMintz, Yuval static u32 cond10(const u32 *r, const u32 *imm) 110c965db44STomer Tayar { 111c965db44STomer Tayar return ((r[0] & imm[0]) >> imm[1]) != (r[0] & imm[2]); 112c965db44STomer Tayar } 113c965db44STomer Tayar 1147b6859fbSMintz, Yuval static u32 cond4(const u32 *r, const u32 *imm) 115c965db44STomer Tayar { 116c965db44STomer Tayar return (r[0] & ~imm[0]) != imm[1]; 117c965db44STomer Tayar } 118c965db44STomer Tayar 119c965db44STomer Tayar static u32 cond0(const u32 *r, const u32 *imm) 120c965db44STomer Tayar { 1217b6859fbSMintz, Yuval return (r[0] & ~r[1]) != imm[0]; 1227b6859fbSMintz, Yuval } 1237b6859fbSMintz, Yuval 1247b6859fbSMintz, Yuval static u32 cond1(const u32 *r, const u32 *imm) 1257b6859fbSMintz, Yuval { 126c965db44STomer Tayar return r[0] != imm[0]; 127c965db44STomer Tayar } 128c965db44STomer Tayar 1297b6859fbSMintz, Yuval static u32 cond11(const u32 *r, const u32 *imm) 130c965db44STomer Tayar { 131c965db44STomer Tayar return r[0] != r[1] && r[2] == imm[0]; 132c965db44STomer Tayar } 133c965db44STomer Tayar 1347b6859fbSMintz, Yuval static u32 cond12(const u32 *r, const u32 *imm) 135c965db44STomer Tayar { 136c965db44STomer Tayar return r[0] != r[1] && r[2] > imm[0]; 137c965db44STomer Tayar } 138c965db44STomer Tayar 139c965db44STomer Tayar static u32 cond3(const u32 *r, const u32 *imm) 140c965db44STomer Tayar { 141c965db44STomer Tayar return r[0] != r[1]; 142c965db44STomer Tayar } 143c965db44STomer Tayar 1447b6859fbSMintz, Yuval static u32 cond13(const u32 *r, const u32 *imm) 145c965db44STomer Tayar { 146c965db44STomer Tayar return r[0] & imm[0]; 147c965db44STomer Tayar } 148c965db44STomer Tayar 1497b6859fbSMintz, Yuval static u32 cond8(const u32 *r, const u32 *imm) 150c965db44STomer Tayar { 151c965db44STomer Tayar return r[0] < (r[1] - imm[0]); 152c965db44STomer Tayar } 153c965db44STomer Tayar 154c965db44STomer Tayar static u32 cond2(const u32 *r, const u32 *imm) 155c965db44STomer Tayar { 156c965db44STomer Tayar return r[0] > imm[0]; 157c965db44STomer Tayar } 158c965db44STomer Tayar 159c965db44STomer Tayar /* Array of Idle Check conditions */ 160c965db44STomer Tayar static u32(*cond_arr[]) (const u32 *r, const u32 *imm) = { 161c965db44STomer Tayar cond0, 162c965db44STomer Tayar cond1, 163c965db44STomer Tayar cond2, 164c965db44STomer Tayar cond3, 165c965db44STomer Tayar cond4, 166c965db44STomer Tayar cond5, 167c965db44STomer Tayar cond6, 168c965db44STomer Tayar cond7, 169c965db44STomer Tayar cond8, 170c965db44STomer Tayar cond9, 171c965db44STomer Tayar cond10, 172c965db44STomer Tayar cond11, 173c965db44STomer Tayar cond12, 1747b6859fbSMintz, Yuval cond13, 175c965db44STomer Tayar }; 176c965db44STomer Tayar 1772d22bc83SMichal Kalderon #define NUM_PHYS_BLOCKS 84 1782d22bc83SMichal Kalderon 1792d22bc83SMichal Kalderon #define NUM_DBG_RESET_REGS 8 1802d22bc83SMichal Kalderon 181c965db44STomer Tayar /******************************* Data Types **********************************/ 182c965db44STomer Tayar 1832d22bc83SMichal Kalderon enum hw_types { 1842d22bc83SMichal Kalderon HW_TYPE_ASIC, 185c965db44STomer Tayar PLATFORM_RESERVED, 186c965db44STomer Tayar PLATFORM_RESERVED2, 187c965db44STomer Tayar PLATFORM_RESERVED3, 1882d22bc83SMichal Kalderon PLATFORM_RESERVED4, 1892d22bc83SMichal Kalderon MAX_HW_TYPES 1902d22bc83SMichal Kalderon }; 1912d22bc83SMichal Kalderon 1922d22bc83SMichal Kalderon /* CM context types */ 1932d22bc83SMichal Kalderon enum cm_ctx_types { 1942d22bc83SMichal Kalderon CM_CTX_CONN_AG, 1952d22bc83SMichal Kalderon CM_CTX_CONN_ST, 1962d22bc83SMichal Kalderon CM_CTX_TASK_AG, 1972d22bc83SMichal Kalderon CM_CTX_TASK_ST, 1982d22bc83SMichal Kalderon NUM_CM_CTX_TYPES 1992d22bc83SMichal Kalderon }; 2002d22bc83SMichal Kalderon 2012d22bc83SMichal Kalderon /* Debug bus frame modes */ 2022d22bc83SMichal Kalderon enum dbg_bus_frame_modes { 2032d22bc83SMichal Kalderon DBG_BUS_FRAME_MODE_4ST = 0, /* 4 Storm dwords (no HW) */ 2042d22bc83SMichal Kalderon DBG_BUS_FRAME_MODE_2ST_2HW = 1, /* 2 Storm dwords, 2 HW dwords */ 2052d22bc83SMichal Kalderon DBG_BUS_FRAME_MODE_1ST_3HW = 2, /* 1 Storm dwords, 3 HW dwords */ 2062d22bc83SMichal Kalderon DBG_BUS_FRAME_MODE_4HW = 3, /* 4 HW dwords (no Storms) */ 2072d22bc83SMichal Kalderon DBG_BUS_FRAME_MODE_8HW = 4, /* 8 HW dwords (no Storms) */ 2082d22bc83SMichal Kalderon DBG_BUS_NUM_FRAME_MODES 209c965db44STomer Tayar }; 210c965db44STomer Tayar 211c965db44STomer Tayar /* Chip constant definitions */ 212c965db44STomer Tayar struct chip_defs { 213c965db44STomer Tayar const char *name; 2148a52bbabSMichal Kalderon u32 num_ilt_pages; 215c965db44STomer Tayar }; 216c965db44STomer Tayar 2172d22bc83SMichal Kalderon /* HW type constant definitions */ 2182d22bc83SMichal Kalderon struct hw_type_defs { 219c965db44STomer Tayar const char *name; 220c965db44STomer Tayar u32 delay_factor; 221da090917STomer Tayar u32 dmae_thresh; 222da090917STomer Tayar u32 log_thresh; 223c965db44STomer Tayar }; 224c965db44STomer Tayar 2252d22bc83SMichal Kalderon /* RBC reset definitions */ 2262d22bc83SMichal Kalderon struct rbc_reset_defs { 2272d22bc83SMichal Kalderon u32 reset_reg_addr; 2282d22bc83SMichal Kalderon u32 reset_val[MAX_CHIP_IDS]; 2292d22bc83SMichal Kalderon }; 2302d22bc83SMichal Kalderon 2317b6859fbSMintz, Yuval /* Storm constant definitions. 2327b6859fbSMintz, Yuval * Addresses are in bytes, sizes are in quad-regs. 2337b6859fbSMintz, Yuval */ 234c965db44STomer Tayar struct storm_defs { 235c965db44STomer Tayar char letter; 2362d22bc83SMichal Kalderon enum block_id sem_block_id; 237c965db44STomer Tayar enum dbg_bus_clients dbg_client_id[MAX_CHIP_IDS]; 238c965db44STomer Tayar bool has_vfc; 239c965db44STomer Tayar u32 sem_fast_mem_addr; 240c965db44STomer Tayar u32 sem_frame_mode_addr; 241c965db44STomer Tayar u32 sem_slow_enable_addr; 242c965db44STomer Tayar u32 sem_slow_mode_addr; 243c965db44STomer Tayar u32 sem_slow_mode1_conf_addr; 244c965db44STomer Tayar u32 sem_sync_dbg_empty_addr; 2452d22bc83SMichal Kalderon u32 sem_gpre_vect_addr; 246c965db44STomer Tayar u32 cm_ctx_wr_addr; 2472d22bc83SMichal Kalderon u32 cm_ctx_rd_addr[NUM_CM_CTX_TYPES]; 2482d22bc83SMichal Kalderon u32 cm_ctx_lid_sizes[MAX_CHIP_IDS][NUM_CM_CTX_TYPES]; 249c965db44STomer Tayar }; 250c965db44STomer Tayar 2512d22bc83SMichal Kalderon /* Debug Bus Constraint operation constant definitions */ 2522d22bc83SMichal Kalderon struct dbg_bus_constraint_op_defs { 2532d22bc83SMichal Kalderon u8 hw_op_val; 2542d22bc83SMichal Kalderon bool is_cyclic; 2552d22bc83SMichal Kalderon }; 2562d22bc83SMichal Kalderon 2572d22bc83SMichal Kalderon /* Storm Mode definitions */ 2582d22bc83SMichal Kalderon struct storm_mode_defs { 259c965db44STomer Tayar const char *name; 2602d22bc83SMichal Kalderon bool is_fast_dbg; 2612d22bc83SMichal Kalderon u8 id_in_hw; 2622d22bc83SMichal Kalderon u32 src_disable_reg_addr; 2632d22bc83SMichal Kalderon u32 src_enable_val; 264da090917STomer Tayar bool exists[MAX_CHIP_IDS]; 265c965db44STomer Tayar }; 266c965db44STomer Tayar 267c965db44STomer Tayar struct grc_param_defs { 268c965db44STomer Tayar u32 default_val[MAX_CHIP_IDS]; 269c965db44STomer Tayar u32 min; 270c965db44STomer Tayar u32 max; 271c965db44STomer Tayar bool is_preset; 27250bc60cbSMichal Kalderon bool is_persistent; 273c965db44STomer Tayar u32 exclude_all_preset_val; 2742d22bc83SMichal Kalderon u32 crash_preset_val[MAX_CHIP_IDS]; 275c965db44STomer Tayar }; 276c965db44STomer Tayar 2777b6859fbSMintz, Yuval /* Address is in 128b units. Width is in bits. */ 278c965db44STomer Tayar struct rss_mem_defs { 279c965db44STomer Tayar const char *mem_name; 280c965db44STomer Tayar const char *type_name; 2817b6859fbSMintz, Yuval u32 addr; 282da090917STomer Tayar u32 entry_width; 283c965db44STomer Tayar u32 num_entries[MAX_CHIP_IDS]; 284c965db44STomer Tayar }; 285c965db44STomer Tayar 286c965db44STomer Tayar struct vfc_ram_defs { 287c965db44STomer Tayar const char *mem_name; 288c965db44STomer Tayar const char *type_name; 289c965db44STomer Tayar u32 base_row; 290c965db44STomer Tayar u32 num_rows; 291c965db44STomer Tayar }; 292c965db44STomer Tayar 293c965db44STomer Tayar struct big_ram_defs { 294c965db44STomer Tayar const char *instance_name; 295c965db44STomer Tayar enum mem_groups mem_group_id; 296c965db44STomer Tayar enum mem_groups ram_mem_group_id; 297c965db44STomer Tayar enum dbg_grc_params grc_param; 298c965db44STomer Tayar u32 addr_reg_addr; 299c965db44STomer Tayar u32 data_reg_addr; 300da090917STomer Tayar u32 is_256b_reg_addr; 301da090917STomer Tayar u32 is_256b_bit_offset[MAX_CHIP_IDS]; 302da090917STomer Tayar u32 ram_size[MAX_CHIP_IDS]; /* In dwords */ 303c965db44STomer Tayar }; 304c965db44STomer Tayar 305c965db44STomer Tayar struct phy_defs { 306c965db44STomer Tayar const char *phy_name; 3077b6859fbSMintz, Yuval 3087b6859fbSMintz, Yuval /* PHY base GRC address */ 309c965db44STomer Tayar u32 base_addr; 3107b6859fbSMintz, Yuval 3117b6859fbSMintz, Yuval /* Relative address of indirect TBUS address register (bits 0..7) */ 312c965db44STomer Tayar u32 tbus_addr_lo_addr; 3137b6859fbSMintz, Yuval 3147b6859fbSMintz, Yuval /* Relative address of indirect TBUS address register (bits 8..10) */ 315c965db44STomer Tayar u32 tbus_addr_hi_addr; 3167b6859fbSMintz, Yuval 3177b6859fbSMintz, Yuval /* Relative address of indirect TBUS data register (bits 0..7) */ 318c965db44STomer Tayar u32 tbus_data_lo_addr; 3197b6859fbSMintz, Yuval 3207b6859fbSMintz, Yuval /* Relative address of indirect TBUS data register (bits 8..11) */ 321c965db44STomer Tayar u32 tbus_data_hi_addr; 322c965db44STomer Tayar }; 323c965db44STomer Tayar 324d52c89f1SMichal Kalderon /* Split type definitions */ 325d52c89f1SMichal Kalderon struct split_type_defs { 326d52c89f1SMichal Kalderon const char *name; 327d52c89f1SMichal Kalderon }; 328d52c89f1SMichal Kalderon 329c965db44STomer Tayar /******************************** Constants **********************************/ 330c965db44STomer Tayar 331c965db44STomer Tayar #define BYTES_IN_DWORD sizeof(u32) 332c965db44STomer Tayar /* In the macros below, size and offset are specified in bits */ 333c965db44STomer Tayar #define CEIL_DWORDS(size) DIV_ROUND_UP(size, 32) 334c965db44STomer Tayar #define FIELD_BIT_OFFSET(type, field) type ## _ ## field ## _ ## OFFSET 335c965db44STomer Tayar #define FIELD_BIT_SIZE(type, field) type ## _ ## field ## _ ## SIZE 336c965db44STomer Tayar #define FIELD_DWORD_OFFSET(type, field) \ 337c965db44STomer Tayar (int)(FIELD_BIT_OFFSET(type, field) / 32) 338c965db44STomer Tayar #define FIELD_DWORD_SHIFT(type, field) (FIELD_BIT_OFFSET(type, field) % 32) 339c965db44STomer Tayar #define FIELD_BIT_MASK(type, field) \ 340c965db44STomer Tayar (((1 << FIELD_BIT_SIZE(type, field)) - 1) << \ 341c965db44STomer Tayar FIELD_DWORD_SHIFT(type, field)) 3427b6859fbSMintz, Yuval 343c965db44STomer Tayar #define SET_VAR_FIELD(var, type, field, val) \ 344c965db44STomer Tayar do { \ 345c965db44STomer Tayar var[FIELD_DWORD_OFFSET(type, field)] &= \ 346c965db44STomer Tayar (~FIELD_BIT_MASK(type, field)); \ 347c965db44STomer Tayar var[FIELD_DWORD_OFFSET(type, field)] |= \ 348c965db44STomer Tayar (val) << FIELD_DWORD_SHIFT(type, field); \ 349c965db44STomer Tayar } while (0) 3507b6859fbSMintz, Yuval 351c965db44STomer Tayar #define ARR_REG_WR(dev, ptt, addr, arr, arr_size) \ 352c965db44STomer Tayar do { \ 353c965db44STomer Tayar for (i = 0; i < (arr_size); i++) \ 354c965db44STomer Tayar qed_wr(dev, ptt, addr, (arr)[i]); \ 355c965db44STomer Tayar } while (0) 3567b6859fbSMintz, Yuval 357c965db44STomer Tayar #define DWORDS_TO_BYTES(dwords) ((dwords) * BYTES_IN_DWORD) 358c965db44STomer Tayar #define BYTES_TO_DWORDS(bytes) ((bytes) / BYTES_IN_DWORD) 3597b6859fbSMintz, Yuval 3602d22bc83SMichal Kalderon /* extra lines include a signature line + optional latency events line */ 3612d22bc83SMichal Kalderon #define NUM_EXTRA_DBG_LINES(block) \ 3622d22bc83SMichal Kalderon (GET_FIELD((block)->flags, DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS) ? 2 : 1) 3632d22bc83SMichal Kalderon #define NUM_DBG_LINES(block) \ 3642d22bc83SMichal Kalderon ((block)->num_of_dbg_bus_lines + NUM_EXTRA_DBG_LINES(block)) 3652d22bc83SMichal Kalderon 3662d22bc83SMichal Kalderon #define USE_DMAE true 3672d22bc83SMichal Kalderon #define PROTECT_WIDE_BUS true 3687b6859fbSMintz, Yuval 369c965db44STomer Tayar #define RAM_LINES_TO_DWORDS(lines) ((lines) * 2) 370c965db44STomer Tayar #define RAM_LINES_TO_BYTES(lines) \ 371c965db44STomer Tayar DWORDS_TO_BYTES(RAM_LINES_TO_DWORDS(lines)) 3727b6859fbSMintz, Yuval 373c965db44STomer Tayar #define REG_DUMP_LEN_SHIFT 24 374c965db44STomer Tayar #define MEM_DUMP_ENTRY_SIZE_DWORDS \ 375c965db44STomer Tayar BYTES_TO_DWORDS(sizeof(struct dbg_dump_mem)) 3767b6859fbSMintz, Yuval 377c965db44STomer Tayar #define IDLE_CHK_RULE_SIZE_DWORDS \ 378c965db44STomer Tayar BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_rule)) 3797b6859fbSMintz, Yuval 380c965db44STomer Tayar #define IDLE_CHK_RESULT_HDR_DWORDS \ 381c965db44STomer Tayar BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_hdr)) 3827b6859fbSMintz, Yuval 383c965db44STomer Tayar #define IDLE_CHK_RESULT_REG_HDR_DWORDS \ 384c965db44STomer Tayar BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_reg_hdr)) 3857b6859fbSMintz, Yuval 3868a52bbabSMichal Kalderon #define PAGE_MEM_DESC_SIZE_DWORDS \ 3878a52bbabSMichal Kalderon BYTES_TO_DWORDS(sizeof(struct phys_mem_desc)) 3888a52bbabSMichal Kalderon 389c965db44STomer Tayar #define IDLE_CHK_MAX_ENTRIES_SIZE 32 390c965db44STomer Tayar 391c965db44STomer Tayar /* The sizes and offsets below are specified in bits */ 392c965db44STomer Tayar #define VFC_CAM_CMD_STRUCT_SIZE 64 393c965db44STomer Tayar #define VFC_CAM_CMD_ROW_OFFSET 48 394c965db44STomer Tayar #define VFC_CAM_CMD_ROW_SIZE 9 395c965db44STomer Tayar #define VFC_CAM_ADDR_STRUCT_SIZE 16 396c965db44STomer Tayar #define VFC_CAM_ADDR_OP_OFFSET 0 397c965db44STomer Tayar #define VFC_CAM_ADDR_OP_SIZE 4 398c965db44STomer Tayar #define VFC_CAM_RESP_STRUCT_SIZE 256 399c965db44STomer Tayar #define VFC_RAM_ADDR_STRUCT_SIZE 16 400c965db44STomer Tayar #define VFC_RAM_ADDR_OP_OFFSET 0 401c965db44STomer Tayar #define VFC_RAM_ADDR_OP_SIZE 2 402c965db44STomer Tayar #define VFC_RAM_ADDR_ROW_OFFSET 2 403c965db44STomer Tayar #define VFC_RAM_ADDR_ROW_SIZE 10 404c965db44STomer Tayar #define VFC_RAM_RESP_STRUCT_SIZE 256 4057b6859fbSMintz, Yuval 406c965db44STomer Tayar #define VFC_CAM_CMD_DWORDS CEIL_DWORDS(VFC_CAM_CMD_STRUCT_SIZE) 407c965db44STomer Tayar #define VFC_CAM_ADDR_DWORDS CEIL_DWORDS(VFC_CAM_ADDR_STRUCT_SIZE) 408c965db44STomer Tayar #define VFC_CAM_RESP_DWORDS CEIL_DWORDS(VFC_CAM_RESP_STRUCT_SIZE) 409c965db44STomer Tayar #define VFC_RAM_CMD_DWORDS VFC_CAM_CMD_DWORDS 410c965db44STomer Tayar #define VFC_RAM_ADDR_DWORDS CEIL_DWORDS(VFC_RAM_ADDR_STRUCT_SIZE) 411c965db44STomer Tayar #define VFC_RAM_RESP_DWORDS CEIL_DWORDS(VFC_RAM_RESP_STRUCT_SIZE) 4127b6859fbSMintz, Yuval 413c965db44STomer Tayar #define NUM_VFC_RAM_TYPES 4 4147b6859fbSMintz, Yuval 415c965db44STomer Tayar #define VFC_CAM_NUM_ROWS 512 4167b6859fbSMintz, Yuval 417c965db44STomer Tayar #define VFC_OPCODE_CAM_RD 14 418c965db44STomer Tayar #define VFC_OPCODE_RAM_RD 0 4197b6859fbSMintz, Yuval 420c965db44STomer Tayar #define NUM_RSS_MEM_TYPES 5 4217b6859fbSMintz, Yuval 422c965db44STomer Tayar #define NUM_BIG_RAM_TYPES 3 423c7d852e3SDenis Bolotin #define BIG_RAM_NAME_LEN 3 4247b6859fbSMintz, Yuval 425c965db44STomer Tayar #define NUM_PHY_TBUS_ADDRESSES 2048 426c965db44STomer Tayar #define PHY_DUMP_SIZE_DWORDS (NUM_PHY_TBUS_ADDRESSES / 2) 4277b6859fbSMintz, Yuval 428c965db44STomer Tayar #define RESET_REG_UNRESET_OFFSET 4 4297b6859fbSMintz, Yuval 430c965db44STomer Tayar #define STALL_DELAY_MS 500 4317b6859fbSMintz, Yuval 432c965db44STomer Tayar #define STATIC_DEBUG_LINE_DWORDS 9 4337b6859fbSMintz, Yuval 4342d22bc83SMichal Kalderon #define NUM_COMMON_GLOBAL_PARAMS 9 4352d22bc83SMichal Kalderon 4362d22bc83SMichal Kalderon #define MAX_RECURSION_DEPTH 10 4377b6859fbSMintz, Yuval 438c965db44STomer Tayar #define FW_IMG_MAIN 1 4397b6859fbSMintz, Yuval 440c965db44STomer Tayar #define REG_FIFO_ELEMENT_DWORDS 2 4417b6859fbSMintz, Yuval #define REG_FIFO_DEPTH_ELEMENTS 32 442c965db44STomer Tayar #define REG_FIFO_DEPTH_DWORDS \ 443c965db44STomer Tayar (REG_FIFO_ELEMENT_DWORDS * REG_FIFO_DEPTH_ELEMENTS) 4447b6859fbSMintz, Yuval 445c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORDS 4 4467b6859fbSMintz, Yuval #define IGU_FIFO_DEPTH_ELEMENTS 64 447c965db44STomer Tayar #define IGU_FIFO_DEPTH_DWORDS \ 448c965db44STomer Tayar (IGU_FIFO_ELEMENT_DWORDS * IGU_FIFO_DEPTH_ELEMENTS) 4497b6859fbSMintz, Yuval 450c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_DWORDS 2 4517b6859fbSMintz, Yuval #define PROTECTION_OVERRIDE_DEPTH_ELEMENTS 20 452c965db44STomer Tayar #define PROTECTION_OVERRIDE_DEPTH_DWORDS \ 453c965db44STomer Tayar (PROTECTION_OVERRIDE_DEPTH_ELEMENTS * \ 454c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_DWORDS) 4557b6859fbSMintz, Yuval 456c965db44STomer Tayar #define MCP_SPAD_TRACE_OFFSIZE_ADDR \ 457c965db44STomer Tayar (MCP_REG_SCRATCH + \ 458c965db44STomer Tayar offsetof(struct static_init, sections[SPAD_SECTION_TRACE])) 4597b6859fbSMintz, Yuval 4602d22bc83SMichal Kalderon #define MAX_SW_PLTAFORM_STR_SIZE 64 4612d22bc83SMichal Kalderon 462c965db44STomer Tayar #define EMPTY_FW_VERSION_STR "???_???_???_???" 463c965db44STomer Tayar #define EMPTY_FW_IMAGE_STR "???????????????" 464c965db44STomer Tayar 465c965db44STomer Tayar /***************************** Constant Arrays *******************************/ 466c965db44STomer Tayar 467c965db44STomer Tayar /* Chip constant definitions array */ 468c965db44STomer Tayar static struct chip_defs s_chip_defs[MAX_CHIP_IDS] = { 4698a52bbabSMichal Kalderon {"bb", PSWRQ2_REG_ILT_MEMORY_SIZE_BB / 2}, 4708a52bbabSMichal Kalderon {"ah", PSWRQ2_REG_ILT_MEMORY_SIZE_K2 / 2} 471c965db44STomer Tayar }; 472c965db44STomer Tayar 473c965db44STomer Tayar /* Storm constant definitions array */ 474c965db44STomer Tayar static struct storm_defs s_storm_defs[] = { 475c965db44STomer Tayar /* Tstorm */ 476c965db44STomer Tayar {'T', BLOCK_TSEM, 4772d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT}, 4782d22bc83SMichal Kalderon true, 479c965db44STomer Tayar TSEM_REG_FAST_MEMORY, 4807b6859fbSMintz, Yuval TSEM_REG_DBG_FRAME_MODE_BB_K2, TSEM_REG_SLOW_DBG_ACTIVE_BB_K2, 4817b6859fbSMintz, Yuval TSEM_REG_SLOW_DBG_MODE_BB_K2, TSEM_REG_DBG_MODE1_CFG_BB_K2, 4822d22bc83SMichal Kalderon TSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_DBG_GPRE_VECT, 483c965db44STomer Tayar TCM_REG_CTX_RBC_ACCS, 4842d22bc83SMichal Kalderon {TCM_REG_AGG_CON_CTX, TCM_REG_SM_CON_CTX, TCM_REG_AGG_TASK_CTX, 4852d22bc83SMichal Kalderon TCM_REG_SM_TASK_CTX}, 4862d22bc83SMichal Kalderon {{4, 16, 2, 4}, {4, 16, 2, 4}} /* {bb} {k2} */ 4872d22bc83SMichal Kalderon }, 4887b6859fbSMintz, Yuval 489c965db44STomer Tayar /* Mstorm */ 490c965db44STomer Tayar {'M', BLOCK_MSEM, 4912d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM}, 4922d22bc83SMichal Kalderon false, 493c965db44STomer Tayar MSEM_REG_FAST_MEMORY, 4942d22bc83SMichal Kalderon MSEM_REG_DBG_FRAME_MODE_BB_K2, 4952d22bc83SMichal Kalderon MSEM_REG_SLOW_DBG_ACTIVE_BB_K2, 4962d22bc83SMichal Kalderon MSEM_REG_SLOW_DBG_MODE_BB_K2, 4972d22bc83SMichal Kalderon MSEM_REG_DBG_MODE1_CFG_BB_K2, 4982d22bc83SMichal Kalderon MSEM_REG_SYNC_DBG_EMPTY, 4992d22bc83SMichal Kalderon MSEM_REG_DBG_GPRE_VECT, 500c965db44STomer Tayar MCM_REG_CTX_RBC_ACCS, 5012d22bc83SMichal Kalderon {MCM_REG_AGG_CON_CTX, MCM_REG_SM_CON_CTX, MCM_REG_AGG_TASK_CTX, 5022d22bc83SMichal Kalderon MCM_REG_SM_TASK_CTX }, 5032d22bc83SMichal Kalderon {{1, 10, 2, 7}, {1, 10, 2, 7}} /* {bb} {k2}*/ 5042d22bc83SMichal Kalderon }, 5057b6859fbSMintz, Yuval 506c965db44STomer Tayar /* Ustorm */ 507c965db44STomer Tayar {'U', BLOCK_USEM, 5082d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU}, 5092d22bc83SMichal Kalderon false, 510c965db44STomer Tayar USEM_REG_FAST_MEMORY, 5112d22bc83SMichal Kalderon USEM_REG_DBG_FRAME_MODE_BB_K2, 5122d22bc83SMichal Kalderon USEM_REG_SLOW_DBG_ACTIVE_BB_K2, 5132d22bc83SMichal Kalderon USEM_REG_SLOW_DBG_MODE_BB_K2, 5142d22bc83SMichal Kalderon USEM_REG_DBG_MODE1_CFG_BB_K2, 5152d22bc83SMichal Kalderon USEM_REG_SYNC_DBG_EMPTY, 5162d22bc83SMichal Kalderon USEM_REG_DBG_GPRE_VECT, 517c965db44STomer Tayar UCM_REG_CTX_RBC_ACCS, 5182d22bc83SMichal Kalderon {UCM_REG_AGG_CON_CTX, UCM_REG_SM_CON_CTX, UCM_REG_AGG_TASK_CTX, 5192d22bc83SMichal Kalderon UCM_REG_SM_TASK_CTX}, 5202d22bc83SMichal Kalderon {{2, 13, 3, 3}, {2, 13, 3, 3}} /* {bb} {k2} */ 5212d22bc83SMichal Kalderon }, 5227b6859fbSMintz, Yuval 523c965db44STomer Tayar /* Xstorm */ 524c965db44STomer Tayar {'X', BLOCK_XSEM, 5252d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX}, 5262d22bc83SMichal Kalderon false, 527c965db44STomer Tayar XSEM_REG_FAST_MEMORY, 5282d22bc83SMichal Kalderon XSEM_REG_DBG_FRAME_MODE_BB_K2, 5292d22bc83SMichal Kalderon XSEM_REG_SLOW_DBG_ACTIVE_BB_K2, 5302d22bc83SMichal Kalderon XSEM_REG_SLOW_DBG_MODE_BB_K2, 5312d22bc83SMichal Kalderon XSEM_REG_DBG_MODE1_CFG_BB_K2, 5322d22bc83SMichal Kalderon XSEM_REG_SYNC_DBG_EMPTY, 5332d22bc83SMichal Kalderon XSEM_REG_DBG_GPRE_VECT, 534c965db44STomer Tayar XCM_REG_CTX_RBC_ACCS, 5352d22bc83SMichal Kalderon {XCM_REG_AGG_CON_CTX, XCM_REG_SM_CON_CTX, 0, 0}, 5362d22bc83SMichal Kalderon {{9, 15, 0, 0}, {9, 15, 0, 0}} /* {bb} {k2} */ 5372d22bc83SMichal Kalderon }, 5387b6859fbSMintz, Yuval 539c965db44STomer Tayar /* Ystorm */ 540c965db44STomer Tayar {'Y', BLOCK_YSEM, 5412d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY}, 5422d22bc83SMichal Kalderon false, 543c965db44STomer Tayar YSEM_REG_FAST_MEMORY, 5442d22bc83SMichal Kalderon YSEM_REG_DBG_FRAME_MODE_BB_K2, 5452d22bc83SMichal Kalderon YSEM_REG_SLOW_DBG_ACTIVE_BB_K2, 5462d22bc83SMichal Kalderon YSEM_REG_SLOW_DBG_MODE_BB_K2, 5472d22bc83SMichal Kalderon YSEM_REG_DBG_MODE1_CFG_BB_K2, 5482d22bc83SMichal Kalderon YSEM_REG_SYNC_DBG_EMPTY, 5492d22bc83SMichal Kalderon YSEM_REG_DBG_GPRE_VECT, 550c965db44STomer Tayar YCM_REG_CTX_RBC_ACCS, 5512d22bc83SMichal Kalderon {YCM_REG_AGG_CON_CTX, YCM_REG_SM_CON_CTX, YCM_REG_AGG_TASK_CTX, 5522d22bc83SMichal Kalderon YCM_REG_SM_TASK_CTX}, 5532d22bc83SMichal Kalderon {{2, 3, 2, 12}, {2, 3, 2, 12}} /* {bb} {k2} */ 5542d22bc83SMichal Kalderon }, 5557b6859fbSMintz, Yuval 556c965db44STomer Tayar /* Pstorm */ 557c965db44STomer Tayar {'P', BLOCK_PSEM, 5582d22bc83SMichal Kalderon {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS}, 5592d22bc83SMichal Kalderon true, 560c965db44STomer Tayar PSEM_REG_FAST_MEMORY, 5612d22bc83SMichal Kalderon PSEM_REG_DBG_FRAME_MODE_BB_K2, 5622d22bc83SMichal Kalderon PSEM_REG_SLOW_DBG_ACTIVE_BB_K2, 5632d22bc83SMichal Kalderon PSEM_REG_SLOW_DBG_MODE_BB_K2, 5642d22bc83SMichal Kalderon PSEM_REG_DBG_MODE1_CFG_BB_K2, 5652d22bc83SMichal Kalderon PSEM_REG_SYNC_DBG_EMPTY, 5662d22bc83SMichal Kalderon PSEM_REG_DBG_GPRE_VECT, 567c965db44STomer Tayar PCM_REG_CTX_RBC_ACCS, 5682d22bc83SMichal Kalderon {0, PCM_REG_SM_CON_CTX, 0, 0}, 5692d22bc83SMichal Kalderon {{0, 10, 0, 0}, {0, 10, 0, 0}} /* {bb} {k2} */ 5702d22bc83SMichal Kalderon }, 571c965db44STomer Tayar }; 572c965db44STomer Tayar 5732d22bc83SMichal Kalderon static struct hw_type_defs s_hw_type_defs[] = { 5742d22bc83SMichal Kalderon /* HW_TYPE_ASIC */ 575da090917STomer Tayar {"asic", 1, 256, 32768}, 576da090917STomer Tayar {"reserved", 0, 0, 0}, 577da090917STomer Tayar {"reserved2", 0, 0, 0}, 578da090917STomer Tayar {"reserved3", 0, 0, 0} 579c965db44STomer Tayar }; 580c965db44STomer Tayar 581c965db44STomer Tayar static struct grc_param_defs s_grc_param_defs[] = { 5827b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_TSTORM */ 5832d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 5847b6859fbSMintz, Yuval 5857b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_MSTORM */ 5862d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 5877b6859fbSMintz, Yuval 5887b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_USTORM */ 5892d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 5907b6859fbSMintz, Yuval 5917b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_XSTORM */ 5922d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 5937b6859fbSMintz, Yuval 5947b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_YSTORM */ 5952d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 5967b6859fbSMintz, Yuval 5977b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_PSTORM */ 5982d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 1, {1, 1}}, 5997b6859fbSMintz, Yuval 6007b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_REGS */ 6012d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6027b6859fbSMintz, Yuval 6037b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_RAM */ 6042d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6057b6859fbSMintz, Yuval 6067b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_PBUF */ 6072d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6087b6859fbSMintz, Yuval 6097b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_IOR */ 6102d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {1, 1}}, 6117b6859fbSMintz, Yuval 6127b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_VFC */ 6132d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {1, 1}}, 6147b6859fbSMintz, Yuval 6157b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_CM_CTX */ 6162d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6177b6859fbSMintz, Yuval 6187b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_ILT */ 6192d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6207b6859fbSMintz, Yuval 6217b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_RSS */ 6222d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6237b6859fbSMintz, Yuval 6247b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_CAU */ 6252d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6267b6859fbSMintz, Yuval 6277b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_QM */ 6282d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6297b6859fbSMintz, Yuval 6307b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_MCP */ 6312d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6327b6859fbSMintz, Yuval 6332d22bc83SMichal Kalderon /* DBG_GRC_PARAM_DUMP_DORQ */ 6342d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6357b6859fbSMintz, Yuval 6367b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_CFC */ 6372d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6387b6859fbSMintz, Yuval 6397b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_IGU */ 6402d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6417b6859fbSMintz, Yuval 6427b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_BRB */ 6432d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {1, 1}}, 6447b6859fbSMintz, Yuval 6457b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_BTB */ 6462d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {1, 1}}, 6477b6859fbSMintz, Yuval 6487b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_BMB */ 6492d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 6507b6859fbSMintz, Yuval 6512d22bc83SMichal Kalderon /* DBG_GRC_PARAM_RESERVED1 */ 6522d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 6537b6859fbSMintz, Yuval 6547b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_MULD */ 6552d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6567b6859fbSMintz, Yuval 6577b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_PRS */ 6582d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6597b6859fbSMintz, Yuval 6607b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_DMAE */ 6612d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6627b6859fbSMintz, Yuval 6637b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_TM */ 6642d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6657b6859fbSMintz, Yuval 6667b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_SDM */ 6672d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6687b6859fbSMintz, Yuval 6697b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_DIF */ 6702d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6717b6859fbSMintz, Yuval 6727b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_STATIC */ 6732d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6747b6859fbSMintz, Yuval 6757b6859fbSMintz, Yuval /* DBG_GRC_PARAM_UNSTALL */ 6762d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 6777b6859fbSMintz, Yuval 6782d22bc83SMichal Kalderon /* DBG_GRC_PARAM_RESERVED2 */ 6792d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 6807b6859fbSMintz, Yuval 6812d22bc83SMichal Kalderon /* DBG_GRC_PARAM_MCP_TRACE_META_SIZE */ 6822d22bc83SMichal Kalderon {{0, 0}, 1, 0xffffffff, false, true, 0, {0, 0}}, 6837b6859fbSMintz, Yuval 6847b6859fbSMintz, Yuval /* DBG_GRC_PARAM_EXCLUDE_ALL */ 6852d22bc83SMichal Kalderon {{0, 0}, 0, 1, true, false, 0, {0, 0}}, 6867b6859fbSMintz, Yuval 6877b6859fbSMintz, Yuval /* DBG_GRC_PARAM_CRASH */ 6882d22bc83SMichal Kalderon {{0, 0}, 0, 1, true, false, 0, {0, 0}}, 6897b6859fbSMintz, Yuval 6907b6859fbSMintz, Yuval /* DBG_GRC_PARAM_PARITY_SAFE */ 6912d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 6927b6859fbSMintz, Yuval 6937b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_CM */ 6942d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {1, 1}}, 6957b6859fbSMintz, Yuval 6967b6859fbSMintz, Yuval /* DBG_GRC_PARAM_DUMP_PHY */ 6972d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 6987b6859fbSMintz, Yuval 6997b6859fbSMintz, Yuval /* DBG_GRC_PARAM_NO_MCP */ 7002d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7017b6859fbSMintz, Yuval 7027b6859fbSMintz, Yuval /* DBG_GRC_PARAM_NO_FW_VER */ 7032d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7048a52bbabSMichal Kalderon 7058a52bbabSMichal Kalderon /* DBG_GRC_PARAM_RESERVED3 */ 7062d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {0, 0}}, 7078a52bbabSMichal Kalderon 7088a52bbabSMichal Kalderon /* DBG_GRC_PARAM_DUMP_MCP_HW_DUMP */ 7092d22bc83SMichal Kalderon {{0, 1}, 0, 1, false, false, 0, {0, 1}}, 7108a52bbabSMichal Kalderon 7118a52bbabSMichal Kalderon /* DBG_GRC_PARAM_DUMP_ILT_CDUC */ 7122d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {0, 0}}, 7138a52bbabSMichal Kalderon 7148a52bbabSMichal Kalderon /* DBG_GRC_PARAM_DUMP_ILT_CDUT */ 7152d22bc83SMichal Kalderon {{1, 1}, 0, 1, false, false, 0, {0, 0}}, 7168a52bbabSMichal Kalderon 7178a52bbabSMichal Kalderon /* DBG_GRC_PARAM_DUMP_CAU_EXT */ 7182d22bc83SMichal Kalderon {{0, 0}, 0, 1, false, false, 0, {1, 1}} 719c965db44STomer Tayar }; 720c965db44STomer Tayar 721c965db44STomer Tayar static struct rss_mem_defs s_rss_mem_defs[] = { 722da090917STomer Tayar {"rss_mem_cid", "rss_cid", 0, 32, 7232d22bc83SMichal Kalderon {256, 320}}, 7247b6859fbSMintz, Yuval 725da090917STomer Tayar {"rss_mem_key_msb", "rss_key", 1024, 256, 7262d22bc83SMichal Kalderon {128, 208}}, 7277b6859fbSMintz, Yuval 728da090917STomer Tayar {"rss_mem_key_lsb", "rss_key", 2048, 64, 7292d22bc83SMichal Kalderon {128, 208}}, 7307b6859fbSMintz, Yuval 731da090917STomer Tayar {"rss_mem_info", "rss_info", 3072, 16, 7322d22bc83SMichal Kalderon {128, 208}}, 7337b6859fbSMintz, Yuval 734da090917STomer Tayar {"rss_mem_ind", "rss_ind", 4096, 16, 7352d22bc83SMichal Kalderon {16384, 26624}} 736c965db44STomer Tayar }; 737c965db44STomer Tayar 738c965db44STomer Tayar static struct vfc_ram_defs s_vfc_ram_defs[] = { 739c965db44STomer Tayar {"vfc_ram_tt1", "vfc_ram", 0, 512}, 740c965db44STomer Tayar {"vfc_ram_mtt2", "vfc_ram", 512, 128}, 741c965db44STomer Tayar {"vfc_ram_stt2", "vfc_ram", 640, 32}, 742c965db44STomer Tayar {"vfc_ram_ro_vect", "vfc_ram", 672, 32} 743c965db44STomer Tayar }; 744c965db44STomer Tayar 745c965db44STomer Tayar static struct big_ram_defs s_big_ram_defs[] = { 746c965db44STomer Tayar {"BRB", MEM_GROUP_BRB_MEM, MEM_GROUP_BRB_RAM, DBG_GRC_PARAM_DUMP_BRB, 747c965db44STomer Tayar BRB_REG_BIG_RAM_ADDRESS, BRB_REG_BIG_RAM_DATA, 7482d22bc83SMichal Kalderon MISC_REG_BLOCK_256B_EN, {0, 0}, 7492d22bc83SMichal Kalderon {153600, 180224}}, 7507b6859fbSMintz, Yuval 751c965db44STomer Tayar {"BTB", MEM_GROUP_BTB_MEM, MEM_GROUP_BTB_RAM, DBG_GRC_PARAM_DUMP_BTB, 752c965db44STomer Tayar BTB_REG_BIG_RAM_ADDRESS, BTB_REG_BIG_RAM_DATA, 7532d22bc83SMichal Kalderon MISC_REG_BLOCK_256B_EN, {0, 1}, 7542d22bc83SMichal Kalderon {92160, 117760}}, 7557b6859fbSMintz, Yuval 756c965db44STomer Tayar {"BMB", MEM_GROUP_BMB_MEM, MEM_GROUP_BMB_RAM, DBG_GRC_PARAM_DUMP_BMB, 757c965db44STomer Tayar BMB_REG_BIG_RAM_ADDRESS, BMB_REG_BIG_RAM_DATA, 7582d22bc83SMichal Kalderon MISCS_REG_BLOCK_256B_EN, {0, 0}, 7592d22bc83SMichal Kalderon {36864, 36864}} 760c965db44STomer Tayar }; 761c965db44STomer Tayar 7622d22bc83SMichal Kalderon static struct rbc_reset_defs s_rbc_reset_defs[] = { 763da090917STomer Tayar {MISCS_REG_RESET_PL_HV, 7642d22bc83SMichal Kalderon {0x0, 0x400}}, 765da090917STomer Tayar {MISC_REG_RESET_PL_PDA_VMAIN_1, 7662d22bc83SMichal Kalderon {0x4404040, 0x4404040}}, 767da090917STomer Tayar {MISC_REG_RESET_PL_PDA_VMAIN_2, 7682d22bc83SMichal Kalderon {0x7, 0x7c00007}}, 769da090917STomer Tayar {MISC_REG_RESET_PL_PDA_VAUX, 7702d22bc83SMichal Kalderon {0x2, 0x2}}, 771c965db44STomer Tayar }; 772c965db44STomer Tayar 773c965db44STomer Tayar static struct phy_defs s_phy_defs[] = { 7747b6859fbSMintz, Yuval {"nw_phy", NWS_REG_NWS_CMU_K2, 77521dd79e8STomer Tayar PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_7_0_K2_E5, 77621dd79e8STomer Tayar PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_15_8_K2_E5, 77721dd79e8STomer Tayar PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_7_0_K2_E5, 77821dd79e8STomer Tayar PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_11_8_K2_E5}, 77921dd79e8STomer Tayar {"sgmii_phy", MS_REG_MS_CMU_K2_E5, 78021dd79e8STomer Tayar PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X132_K2_E5, 78121dd79e8STomer Tayar PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X133_K2_E5, 78221dd79e8STomer Tayar PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X130_K2_E5, 78321dd79e8STomer Tayar PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X131_K2_E5}, 78421dd79e8STomer Tayar {"pcie_phy0", PHY_PCIE_REG_PHY0_K2_E5, 78521dd79e8STomer Tayar PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2_E5, 78621dd79e8STomer Tayar PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2_E5, 78721dd79e8STomer Tayar PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2_E5, 78821dd79e8STomer Tayar PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2_E5}, 78921dd79e8STomer Tayar {"pcie_phy1", PHY_PCIE_REG_PHY1_K2_E5, 79021dd79e8STomer Tayar PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2_E5, 79121dd79e8STomer Tayar PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2_E5, 79221dd79e8STomer Tayar PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2_E5, 79321dd79e8STomer Tayar PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2_E5}, 794c965db44STomer Tayar }; 795c965db44STomer Tayar 796d52c89f1SMichal Kalderon static struct split_type_defs s_split_type_defs[] = { 797d52c89f1SMichal Kalderon /* SPLIT_TYPE_NONE */ 798d52c89f1SMichal Kalderon {"eng"}, 799d52c89f1SMichal Kalderon 800d52c89f1SMichal Kalderon /* SPLIT_TYPE_PORT */ 801d52c89f1SMichal Kalderon {"port"}, 802d52c89f1SMichal Kalderon 803d52c89f1SMichal Kalderon /* SPLIT_TYPE_PF */ 804d52c89f1SMichal Kalderon {"pf"}, 805d52c89f1SMichal Kalderon 806d52c89f1SMichal Kalderon /* SPLIT_TYPE_PORT_PF */ 807d52c89f1SMichal Kalderon {"port"}, 808d52c89f1SMichal Kalderon 809d52c89f1SMichal Kalderon /* SPLIT_TYPE_VF */ 810d52c89f1SMichal Kalderon {"vf"} 811d52c89f1SMichal Kalderon }; 812d52c89f1SMichal Kalderon 813c965db44STomer Tayar /**************************** Private Functions ******************************/ 814c965db44STomer Tayar 815c965db44STomer Tayar /* Reads and returns a single dword from the specified unaligned buffer */ 816c965db44STomer Tayar static u32 qed_read_unaligned_dword(u8 *buf) 817c965db44STomer Tayar { 818c965db44STomer Tayar u32 dword; 819c965db44STomer Tayar 820c965db44STomer Tayar memcpy((u8 *)&dword, buf, sizeof(dword)); 821c965db44STomer Tayar return dword; 822c965db44STomer Tayar } 823c965db44STomer Tayar 8243b86bd07SSudarsana Reddy Kalluru /* Sets the value of the specified GRC param */ 8253b86bd07SSudarsana Reddy Kalluru static void qed_grc_set_param(struct qed_hwfn *p_hwfn, 8263b86bd07SSudarsana Reddy Kalluru enum dbg_grc_params grc_param, u32 val) 8273b86bd07SSudarsana Reddy Kalluru { 8283b86bd07SSudarsana Reddy Kalluru struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 8293b86bd07SSudarsana Reddy Kalluru 8303b86bd07SSudarsana Reddy Kalluru dev_data->grc.param_val[grc_param] = val; 8313b86bd07SSudarsana Reddy Kalluru } 8323b86bd07SSudarsana Reddy Kalluru 833be086e7cSMintz, Yuval /* Returns the value of the specified GRC param */ 834be086e7cSMintz, Yuval static u32 qed_grc_get_param(struct qed_hwfn *p_hwfn, 835be086e7cSMintz, Yuval enum dbg_grc_params grc_param) 836be086e7cSMintz, Yuval { 837be086e7cSMintz, Yuval struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 838be086e7cSMintz, Yuval 839be086e7cSMintz, Yuval return dev_data->grc.param_val[grc_param]; 840be086e7cSMintz, Yuval } 841be086e7cSMintz, Yuval 842be086e7cSMintz, Yuval /* Initializes the GRC parameters */ 843be086e7cSMintz, Yuval static void qed_dbg_grc_init_params(struct qed_hwfn *p_hwfn) 844be086e7cSMintz, Yuval { 845be086e7cSMintz, Yuval struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 846be086e7cSMintz, Yuval 847be086e7cSMintz, Yuval if (!dev_data->grc.params_initialized) { 848be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 849be086e7cSMintz, Yuval dev_data->grc.params_initialized = 1; 850be086e7cSMintz, Yuval } 851be086e7cSMintz, Yuval } 852be086e7cSMintz, Yuval 8532d22bc83SMichal Kalderon /* Sets pointer and size for the specified binary buffer type */ 8542d22bc83SMichal Kalderon static void qed_set_dbg_bin_buf(struct qed_hwfn *p_hwfn, 8552d22bc83SMichal Kalderon enum bin_dbg_buffer_type buf_type, 8562d22bc83SMichal Kalderon const u32 *ptr, u32 size) 8572d22bc83SMichal Kalderon { 8582d22bc83SMichal Kalderon struct virt_mem_desc *buf = &p_hwfn->dbg_arrays[buf_type]; 8592d22bc83SMichal Kalderon 8602d22bc83SMichal Kalderon buf->ptr = (void *)ptr; 8612d22bc83SMichal Kalderon buf->size = size; 8622d22bc83SMichal Kalderon } 8632d22bc83SMichal Kalderon 864c965db44STomer Tayar /* Initializes debug data for the specified device */ 8652d22bc83SMichal Kalderon static enum dbg_status qed_dbg_dev_init(struct qed_hwfn *p_hwfn) 866c965db44STomer Tayar { 867c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 868d52c89f1SMichal Kalderon u8 num_pfs = 0, max_pfs_per_port = 0; 869c965db44STomer Tayar 870c965db44STomer Tayar if (dev_data->initialized) 871c965db44STomer Tayar return DBG_STATUS_OK; 872c965db44STomer Tayar 873d52c89f1SMichal Kalderon /* Set chip */ 874c965db44STomer Tayar if (QED_IS_K2(p_hwfn->cdev)) { 875c965db44STomer Tayar dev_data->chip_id = CHIP_K2; 876c965db44STomer Tayar dev_data->mode_enable[MODE_K2] = 1; 877d52c89f1SMichal Kalderon dev_data->num_vfs = MAX_NUM_VFS_K2; 878d52c89f1SMichal Kalderon num_pfs = MAX_NUM_PFS_K2; 879d52c89f1SMichal Kalderon max_pfs_per_port = MAX_NUM_PFS_K2 / 2; 880c965db44STomer Tayar } else if (QED_IS_BB_B0(p_hwfn->cdev)) { 8817b6859fbSMintz, Yuval dev_data->chip_id = CHIP_BB; 8829c79ddaaSMintz, Yuval dev_data->mode_enable[MODE_BB] = 1; 883d52c89f1SMichal Kalderon dev_data->num_vfs = MAX_NUM_VFS_BB; 884d52c89f1SMichal Kalderon num_pfs = MAX_NUM_PFS_BB; 885d52c89f1SMichal Kalderon max_pfs_per_port = MAX_NUM_PFS_BB; 886c965db44STomer Tayar } else { 887c965db44STomer Tayar return DBG_STATUS_UNKNOWN_CHIP; 888c965db44STomer Tayar } 889c965db44STomer Tayar 8902d22bc83SMichal Kalderon /* Set HW type */ 8912d22bc83SMichal Kalderon dev_data->hw_type = HW_TYPE_ASIC; 892c965db44STomer Tayar dev_data->mode_enable[MODE_ASIC] = 1; 893be086e7cSMintz, Yuval 894d52c89f1SMichal Kalderon /* Set port mode */ 8952d22bc83SMichal Kalderon switch (p_hwfn->cdev->num_ports_in_engine) { 8962d22bc83SMichal Kalderon case 1: 897d52c89f1SMichal Kalderon dev_data->mode_enable[MODE_PORTS_PER_ENG_1] = 1; 898d52c89f1SMichal Kalderon break; 8992d22bc83SMichal Kalderon case 2: 900d52c89f1SMichal Kalderon dev_data->mode_enable[MODE_PORTS_PER_ENG_2] = 1; 901d52c89f1SMichal Kalderon break; 9022d22bc83SMichal Kalderon case 4: 903d52c89f1SMichal Kalderon dev_data->mode_enable[MODE_PORTS_PER_ENG_4] = 1; 904d52c89f1SMichal Kalderon break; 905d52c89f1SMichal Kalderon } 906d52c89f1SMichal Kalderon 907d52c89f1SMichal Kalderon /* Set 100G mode */ 9082d22bc83SMichal Kalderon if (QED_IS_CMT(p_hwfn->cdev)) 909d52c89f1SMichal Kalderon dev_data->mode_enable[MODE_100G] = 1; 910d52c89f1SMichal Kalderon 911d52c89f1SMichal Kalderon /* Set number of ports */ 912d52c89f1SMichal Kalderon if (dev_data->mode_enable[MODE_PORTS_PER_ENG_1] || 913d52c89f1SMichal Kalderon dev_data->mode_enable[MODE_100G]) 914d52c89f1SMichal Kalderon dev_data->num_ports = 1; 915d52c89f1SMichal Kalderon else if (dev_data->mode_enable[MODE_PORTS_PER_ENG_2]) 916d52c89f1SMichal Kalderon dev_data->num_ports = 2; 917d52c89f1SMichal Kalderon else if (dev_data->mode_enable[MODE_PORTS_PER_ENG_4]) 918d52c89f1SMichal Kalderon dev_data->num_ports = 4; 919d52c89f1SMichal Kalderon 920d52c89f1SMichal Kalderon /* Set number of PFs per port */ 921d52c89f1SMichal Kalderon dev_data->num_pfs_per_port = min_t(u32, 922d52c89f1SMichal Kalderon num_pfs / dev_data->num_ports, 923d52c89f1SMichal Kalderon max_pfs_per_port); 924d52c89f1SMichal Kalderon 925be086e7cSMintz, Yuval /* Initializes the GRC parameters */ 926be086e7cSMintz, Yuval qed_dbg_grc_init_params(p_hwfn); 927be086e7cSMintz, Yuval 928da090917STomer Tayar dev_data->use_dmae = true; 929da090917STomer Tayar dev_data->initialized = 1; 9307b6859fbSMintz, Yuval 931c965db44STomer Tayar return DBG_STATUS_OK; 932c965db44STomer Tayar } 933c965db44STomer Tayar 9342d22bc83SMichal Kalderon static const struct dbg_block *get_dbg_block(struct qed_hwfn *p_hwfn, 9357b6859fbSMintz, Yuval enum block_id block_id) 9367b6859fbSMintz, Yuval { 9372d22bc83SMichal Kalderon const struct dbg_block *dbg_block; 9382d22bc83SMichal Kalderon 9392d22bc83SMichal Kalderon dbg_block = p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS].ptr; 9402d22bc83SMichal Kalderon return dbg_block + block_id; 9412d22bc83SMichal Kalderon } 9422d22bc83SMichal Kalderon 9432d22bc83SMichal Kalderon static const struct dbg_block_chip *qed_get_dbg_block_per_chip(struct qed_hwfn 9442d22bc83SMichal Kalderon *p_hwfn, 9452d22bc83SMichal Kalderon enum block_id 9462d22bc83SMichal Kalderon block_id) 9472d22bc83SMichal Kalderon { 9487b6859fbSMintz, Yuval struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 9497b6859fbSMintz, Yuval 9502d22bc83SMichal Kalderon return (const struct dbg_block_chip *) 9512d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_CHIP_DATA].ptr + 9522d22bc83SMichal Kalderon block_id * MAX_CHIP_IDS + dev_data->chip_id; 9532d22bc83SMichal Kalderon } 9542d22bc83SMichal Kalderon 9552d22bc83SMichal Kalderon static const struct dbg_reset_reg *qed_get_dbg_reset_reg(struct qed_hwfn 9562d22bc83SMichal Kalderon *p_hwfn, 9572d22bc83SMichal Kalderon u8 reset_reg_id) 9582d22bc83SMichal Kalderon { 9592d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 9602d22bc83SMichal Kalderon 9612d22bc83SMichal Kalderon return (const struct dbg_reset_reg *) 9622d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_RESET_REGS].ptr + 9632d22bc83SMichal Kalderon reset_reg_id * MAX_CHIP_IDS + dev_data->chip_id; 9647b6859fbSMintz, Yuval } 9657b6859fbSMintz, Yuval 966c965db44STomer Tayar /* Reads the FW info structure for the specified Storm from the chip, 967c965db44STomer Tayar * and writes it to the specified fw_info pointer. 968c965db44STomer Tayar */ 969d52c89f1SMichal Kalderon static void qed_read_storm_fw_info(struct qed_hwfn *p_hwfn, 970c965db44STomer Tayar struct qed_ptt *p_ptt, 971c965db44STomer Tayar u8 storm_id, struct fw_info *fw_info) 972c965db44STomer Tayar { 9737b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 974c965db44STomer Tayar struct fw_info_location fw_info_location; 9755ab90341SAlexander Lobakin u32 addr, i, size, *dest; 976c965db44STomer Tayar 977c965db44STomer Tayar memset(&fw_info_location, 0, sizeof(fw_info_location)); 978c965db44STomer Tayar memset(fw_info, 0, sizeof(*fw_info)); 9797b6859fbSMintz, Yuval 9807b6859fbSMintz, Yuval /* Read first the address that points to fw_info location. 9817b6859fbSMintz, Yuval * The address is located in the last line of the Storm RAM. 9827b6859fbSMintz, Yuval */ 9837b6859fbSMintz, Yuval addr = storm->sem_fast_mem_addr + SEM_FAST_REG_INT_RAM + 9842d22bc83SMichal Kalderon DWORDS_TO_BYTES(SEM_FAST_REG_INT_RAM_SIZE) - 9857b6859fbSMintz, Yuval sizeof(fw_info_location); 9862d22bc83SMichal Kalderon 9877b6859fbSMintz, Yuval dest = (u32 *)&fw_info_location; 9885ab90341SAlexander Lobakin size = BYTES_TO_DWORDS(sizeof(fw_info_location)); 9897b6859fbSMintz, Yuval 9905ab90341SAlexander Lobakin for (i = 0; i < size; i++, addr += BYTES_IN_DWORD) 991c965db44STomer Tayar dest[i] = qed_rd(p_hwfn, p_ptt, addr); 9927b6859fbSMintz, Yuval 9935ab90341SAlexander Lobakin /* qed_rq() fetches data in CPU byteorder. Swap it back to 9945ab90341SAlexander Lobakin * the device's to get right structure layout. 9955ab90341SAlexander Lobakin */ 9965ab90341SAlexander Lobakin cpu_to_le32_array(dest, size); 9975ab90341SAlexander Lobakin 9987b6859fbSMintz, Yuval /* Read FW version info from Storm RAM */ 9995ab90341SAlexander Lobakin size = le32_to_cpu(fw_info_location.size); 10005ab90341SAlexander Lobakin if (!size || size > sizeof(*fw_info)) 10015ab90341SAlexander Lobakin return; 10025ab90341SAlexander Lobakin 10035ab90341SAlexander Lobakin addr = le32_to_cpu(fw_info_location.grc_addr); 1004c965db44STomer Tayar dest = (u32 *)fw_info; 10055ab90341SAlexander Lobakin size = BYTES_TO_DWORDS(size); 10065ab90341SAlexander Lobakin 10075ab90341SAlexander Lobakin for (i = 0; i < size; i++, addr += BYTES_IN_DWORD) 1008c965db44STomer Tayar dest[i] = qed_rd(p_hwfn, p_ptt, addr); 10095ab90341SAlexander Lobakin 10105ab90341SAlexander Lobakin cpu_to_le32_array(dest, size); 1011c965db44STomer Tayar } 1012c965db44STomer Tayar 10137b6859fbSMintz, Yuval /* Dumps the specified string to the specified buffer. 10147b6859fbSMintz, Yuval * Returns the dumped size in bytes. 1015c965db44STomer Tayar */ 1016c965db44STomer Tayar static u32 qed_dump_str(char *dump_buf, bool dump, const char *str) 1017c965db44STomer Tayar { 1018c965db44STomer Tayar if (dump) 1019c965db44STomer Tayar strcpy(dump_buf, str); 10207b6859fbSMintz, Yuval 1021c965db44STomer Tayar return (u32)strlen(str) + 1; 1022c965db44STomer Tayar } 1023c965db44STomer Tayar 10247b6859fbSMintz, Yuval /* Dumps zeros to align the specified buffer to dwords. 10257b6859fbSMintz, Yuval * Returns the dumped size in bytes. 1026c965db44STomer Tayar */ 1027c965db44STomer Tayar static u32 qed_dump_align(char *dump_buf, bool dump, u32 byte_offset) 1028c965db44STomer Tayar { 10297b6859fbSMintz, Yuval u8 offset_in_dword, align_size; 1030c965db44STomer Tayar 10317b6859fbSMintz, Yuval offset_in_dword = (u8)(byte_offset & 0x3); 1032c965db44STomer Tayar align_size = offset_in_dword ? BYTES_IN_DWORD - offset_in_dword : 0; 1033c965db44STomer Tayar 1034c965db44STomer Tayar if (dump && align_size) 1035c965db44STomer Tayar memset(dump_buf, 0, align_size); 10367b6859fbSMintz, Yuval 1037c965db44STomer Tayar return align_size; 1038c965db44STomer Tayar } 1039c965db44STomer Tayar 1040c965db44STomer Tayar /* Writes the specified string param to the specified buffer. 1041c965db44STomer Tayar * Returns the dumped size in dwords. 1042c965db44STomer Tayar */ 1043c965db44STomer Tayar static u32 qed_dump_str_param(u32 *dump_buf, 1044c965db44STomer Tayar bool dump, 1045c965db44STomer Tayar const char *param_name, const char *param_val) 1046c965db44STomer Tayar { 1047c965db44STomer Tayar char *char_buf = (char *)dump_buf; 1048c965db44STomer Tayar u32 offset = 0; 1049c965db44STomer Tayar 1050c965db44STomer Tayar /* Dump param name */ 1051c965db44STomer Tayar offset += qed_dump_str(char_buf + offset, dump, param_name); 1052c965db44STomer Tayar 1053c965db44STomer Tayar /* Indicate a string param value */ 1054c965db44STomer Tayar if (dump) 1055c965db44STomer Tayar *(char_buf + offset) = 1; 1056c965db44STomer Tayar offset++; 1057c965db44STomer Tayar 1058c965db44STomer Tayar /* Dump param value */ 1059c965db44STomer Tayar offset += qed_dump_str(char_buf + offset, dump, param_val); 1060c965db44STomer Tayar 1061c965db44STomer Tayar /* Align buffer to next dword */ 1062c965db44STomer Tayar offset += qed_dump_align(char_buf + offset, dump, offset); 10637b6859fbSMintz, Yuval 1064c965db44STomer Tayar return BYTES_TO_DWORDS(offset); 1065c965db44STomer Tayar } 1066c965db44STomer Tayar 1067c965db44STomer Tayar /* Writes the specified numeric param to the specified buffer. 1068c965db44STomer Tayar * Returns the dumped size in dwords. 1069c965db44STomer Tayar */ 1070c965db44STomer Tayar static u32 qed_dump_num_param(u32 *dump_buf, 1071c965db44STomer Tayar bool dump, const char *param_name, u32 param_val) 1072c965db44STomer Tayar { 1073c965db44STomer Tayar char *char_buf = (char *)dump_buf; 1074c965db44STomer Tayar u32 offset = 0; 1075c965db44STomer Tayar 1076c965db44STomer Tayar /* Dump param name */ 1077c965db44STomer Tayar offset += qed_dump_str(char_buf + offset, dump, param_name); 1078c965db44STomer Tayar 1079c965db44STomer Tayar /* Indicate a numeric param value */ 1080c965db44STomer Tayar if (dump) 1081c965db44STomer Tayar *(char_buf + offset) = 0; 1082c965db44STomer Tayar offset++; 1083c965db44STomer Tayar 1084c965db44STomer Tayar /* Align buffer to next dword */ 1085c965db44STomer Tayar offset += qed_dump_align(char_buf + offset, dump, offset); 1086c965db44STomer Tayar 1087c965db44STomer Tayar /* Dump param value (and change offset from bytes to dwords) */ 1088c965db44STomer Tayar offset = BYTES_TO_DWORDS(offset); 1089c965db44STomer Tayar if (dump) 1090c965db44STomer Tayar *(dump_buf + offset) = param_val; 1091c965db44STomer Tayar offset++; 10927b6859fbSMintz, Yuval 1093c965db44STomer Tayar return offset; 1094c965db44STomer Tayar } 1095c965db44STomer Tayar 1096c965db44STomer Tayar /* Reads the FW version and writes it as a param to the specified buffer. 1097c965db44STomer Tayar * Returns the dumped size in dwords. 1098c965db44STomer Tayar */ 1099c965db44STomer Tayar static u32 qed_dump_fw_ver_param(struct qed_hwfn *p_hwfn, 1100c965db44STomer Tayar struct qed_ptt *p_ptt, 1101c965db44STomer Tayar u32 *dump_buf, bool dump) 1102c965db44STomer Tayar { 1103c965db44STomer Tayar char fw_ver_str[16] = EMPTY_FW_VERSION_STR; 1104c965db44STomer Tayar char fw_img_str[16] = EMPTY_FW_IMAGE_STR; 1105c965db44STomer Tayar struct fw_info fw_info = { {0}, {0} }; 1106c965db44STomer Tayar u32 offset = 0; 1107c965db44STomer Tayar 1108be086e7cSMintz, Yuval if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) { 1109d52c89f1SMichal Kalderon /* Read FW info from chip */ 1110d52c89f1SMichal Kalderon qed_read_fw_info(p_hwfn, p_ptt, &fw_info); 1111c965db44STomer Tayar 1112c965db44STomer Tayar /* Create FW version/image strings */ 11137b6859fbSMintz, Yuval if (snprintf(fw_ver_str, sizeof(fw_ver_str), 11147b6859fbSMintz, Yuval "%d_%d_%d_%d", fw_info.ver.num.major, 11157b6859fbSMintz, Yuval fw_info.ver.num.minor, fw_info.ver.num.rev, 11167b6859fbSMintz, Yuval fw_info.ver.num.eng) < 0) 1117c965db44STomer Tayar DP_NOTICE(p_hwfn, 1118c965db44STomer Tayar "Unexpected debug error: invalid FW version string\n"); 1119c965db44STomer Tayar switch (fw_info.ver.image_id) { 1120c965db44STomer Tayar case FW_IMG_MAIN: 1121c965db44STomer Tayar strcpy(fw_img_str, "main"); 1122c965db44STomer Tayar break; 1123c965db44STomer Tayar default: 1124c965db44STomer Tayar strcpy(fw_img_str, "unknown"); 1125c965db44STomer Tayar break; 1126c965db44STomer Tayar } 1127c965db44STomer Tayar } 1128c965db44STomer Tayar 1129c965db44STomer Tayar /* Dump FW version, image and timestamp */ 1130c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1131c965db44STomer Tayar dump, "fw-version", fw_ver_str); 1132c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1133c965db44STomer Tayar dump, "fw-image", fw_img_str); 11341451e467SAlexander Lobakin offset += qed_dump_num_param(dump_buf + offset, dump, "fw-timestamp", 11355ab90341SAlexander Lobakin le32_to_cpu(fw_info.ver.timestamp)); 11367b6859fbSMintz, Yuval 1137c965db44STomer Tayar return offset; 1138c965db44STomer Tayar } 1139c965db44STomer Tayar 1140c965db44STomer Tayar /* Reads the MFW version and writes it as a param to the specified buffer. 1141c965db44STomer Tayar * Returns the dumped size in dwords. 1142c965db44STomer Tayar */ 1143c965db44STomer Tayar static u32 qed_dump_mfw_ver_param(struct qed_hwfn *p_hwfn, 1144c965db44STomer Tayar struct qed_ptt *p_ptt, 1145c965db44STomer Tayar u32 *dump_buf, bool dump) 1146c965db44STomer Tayar { 1147c965db44STomer Tayar char mfw_ver_str[16] = EMPTY_FW_VERSION_STR; 1148c965db44STomer Tayar 11497b6859fbSMintz, Yuval if (dump && 11507b6859fbSMintz, Yuval !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) { 1151c965db44STomer Tayar u32 global_section_offsize, global_section_addr, mfw_ver; 1152c965db44STomer Tayar u32 public_data_addr, global_section_offsize_addr; 1153c965db44STomer Tayar 11547b6859fbSMintz, Yuval /* Find MCP public data GRC address. Needs to be ORed with 11557b6859fbSMintz, Yuval * MCP_REG_SCRATCH due to a HW bug. 1156c965db44STomer Tayar */ 11577b6859fbSMintz, Yuval public_data_addr = qed_rd(p_hwfn, 11587b6859fbSMintz, Yuval p_ptt, 1159c965db44STomer Tayar MISC_REG_SHARED_MEM_ADDR) | 1160c965db44STomer Tayar MCP_REG_SCRATCH; 1161c965db44STomer Tayar 1162c965db44STomer Tayar /* Find MCP public global section offset */ 1163c965db44STomer Tayar global_section_offsize_addr = public_data_addr + 1164c965db44STomer Tayar offsetof(struct mcp_public_data, 1165c965db44STomer Tayar sections) + 1166c965db44STomer Tayar sizeof(offsize_t) * PUBLIC_GLOBAL; 1167c965db44STomer Tayar global_section_offsize = qed_rd(p_hwfn, p_ptt, 1168c965db44STomer Tayar global_section_offsize_addr); 11697b6859fbSMintz, Yuval global_section_addr = 11707b6859fbSMintz, Yuval MCP_REG_SCRATCH + 11717b6859fbSMintz, Yuval (global_section_offsize & OFFSIZE_OFFSET_MASK) * 4; 1172c965db44STomer Tayar 1173c965db44STomer Tayar /* Read MFW version from MCP public global section */ 1174c965db44STomer Tayar mfw_ver = qed_rd(p_hwfn, p_ptt, 1175c965db44STomer Tayar global_section_addr + 1176c965db44STomer Tayar offsetof(struct public_global, mfw_ver)); 1177c965db44STomer Tayar 1178c965db44STomer Tayar /* Dump MFW version param */ 11797b6859fbSMintz, Yuval if (snprintf(mfw_ver_str, sizeof(mfw_ver_str), "%d_%d_%d_%d", 11807b6859fbSMintz, Yuval (u8)(mfw_ver >> 24), (u8)(mfw_ver >> 16), 11817b6859fbSMintz, Yuval (u8)(mfw_ver >> 8), (u8)mfw_ver) < 0) 1182c965db44STomer Tayar DP_NOTICE(p_hwfn, 1183c965db44STomer Tayar "Unexpected debug error: invalid MFW version string\n"); 1184c965db44STomer Tayar } 1185c965db44STomer Tayar 1186c965db44STomer Tayar return qed_dump_str_param(dump_buf, dump, "mfw-version", mfw_ver_str); 1187c965db44STomer Tayar } 1188c965db44STomer Tayar 11892d22bc83SMichal Kalderon /* Reads the chip revision from the chip and writes it as a param to the 11902d22bc83SMichal Kalderon * specified buffer. Returns the dumped size in dwords. 11912d22bc83SMichal Kalderon */ 11922d22bc83SMichal Kalderon static u32 qed_dump_chip_revision_param(struct qed_hwfn *p_hwfn, 11932d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 11942d22bc83SMichal Kalderon u32 *dump_buf, bool dump) 11952d22bc83SMichal Kalderon { 11962d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 11972d22bc83SMichal Kalderon char param_str[3] = "??"; 11982d22bc83SMichal Kalderon 11992d22bc83SMichal Kalderon if (dev_data->hw_type == HW_TYPE_ASIC) { 12002d22bc83SMichal Kalderon u32 chip_rev, chip_metal; 12012d22bc83SMichal Kalderon 12022d22bc83SMichal Kalderon chip_rev = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_REV); 12032d22bc83SMichal Kalderon chip_metal = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_METAL); 12042d22bc83SMichal Kalderon 12052d22bc83SMichal Kalderon param_str[0] = 'a' + (u8)chip_rev; 12062d22bc83SMichal Kalderon param_str[1] = '0' + (u8)chip_metal; 12072d22bc83SMichal Kalderon } 12082d22bc83SMichal Kalderon 12092d22bc83SMichal Kalderon return qed_dump_str_param(dump_buf, dump, "chip-revision", param_str); 12102d22bc83SMichal Kalderon } 12112d22bc83SMichal Kalderon 1212c965db44STomer Tayar /* Writes a section header to the specified buffer. 1213c965db44STomer Tayar * Returns the dumped size in dwords. 1214c965db44STomer Tayar */ 1215c965db44STomer Tayar static u32 qed_dump_section_hdr(u32 *dump_buf, 1216c965db44STomer Tayar bool dump, const char *name, u32 num_params) 1217c965db44STomer Tayar { 1218c965db44STomer Tayar return qed_dump_num_param(dump_buf, dump, name, num_params); 1219c965db44STomer Tayar } 1220c965db44STomer Tayar 1221c965db44STomer Tayar /* Writes the common global params to the specified buffer. 1222c965db44STomer Tayar * Returns the dumped size in dwords. 1223c965db44STomer Tayar */ 1224c965db44STomer Tayar static u32 qed_dump_common_global_params(struct qed_hwfn *p_hwfn, 1225c965db44STomer Tayar struct qed_ptt *p_ptt, 1226c965db44STomer Tayar u32 *dump_buf, 1227c965db44STomer Tayar bool dump, 1228c965db44STomer Tayar u8 num_specific_global_params) 1229c965db44STomer Tayar { 1230c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 1231c965db44STomer Tayar u32 offset = 0; 12327b6859fbSMintz, Yuval u8 num_params; 1233c965db44STomer Tayar 12347b6859fbSMintz, Yuval /* Dump global params section header */ 12352d22bc83SMichal Kalderon num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params + 12362d22bc83SMichal Kalderon (dev_data->chip_id == CHIP_BB ? 1 : 0); 1237c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 1238be086e7cSMintz, Yuval dump, "global_params", num_params); 1239c965db44STomer Tayar 1240c965db44STomer Tayar /* Store params */ 1241c965db44STomer Tayar offset += qed_dump_fw_ver_param(p_hwfn, p_ptt, dump_buf + offset, dump); 1242c965db44STomer Tayar offset += qed_dump_mfw_ver_param(p_hwfn, 1243c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 12442d22bc83SMichal Kalderon offset += qed_dump_chip_revision_param(p_hwfn, 12452d22bc83SMichal Kalderon p_ptt, dump_buf + offset, dump); 1246c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 1247c965db44STomer Tayar dump, "tools-version", TOOLS_VERSION); 1248c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1249c965db44STomer Tayar dump, 1250c965db44STomer Tayar "chip", 1251c965db44STomer Tayar s_chip_defs[dev_data->chip_id].name); 1252c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1253c965db44STomer Tayar dump, 1254c965db44STomer Tayar "platform", 12552d22bc83SMichal Kalderon s_hw_type_defs[dev_data->hw_type].name); 12562d22bc83SMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 12572d22bc83SMichal Kalderon dump, "pci-func", p_hwfn->abs_pf_id); 12582d22bc83SMichal Kalderon if (dev_data->chip_id == CHIP_BB) 12592d22bc83SMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 12602d22bc83SMichal Kalderon dump, "path", QED_PATH_ID(p_hwfn)); 12617b6859fbSMintz, Yuval 1262c965db44STomer Tayar return offset; 1263c965db44STomer Tayar } 1264c965db44STomer Tayar 12657b6859fbSMintz, Yuval /* Writes the "last" section (including CRC) to the specified buffer at the 12667b6859fbSMintz, Yuval * given offset. Returns the dumped size in dwords. 1267c965db44STomer Tayar */ 1268da090917STomer Tayar static u32 qed_dump_last_section(u32 *dump_buf, u32 offset, bool dump) 1269c965db44STomer Tayar { 12707b6859fbSMintz, Yuval u32 start_offset = offset; 1271c965db44STomer Tayar 1272c965db44STomer Tayar /* Dump CRC section header */ 1273c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, dump, "last", 0); 1274c965db44STomer Tayar 12757b6859fbSMintz, Yuval /* Calculate CRC32 and add it to the dword after the "last" section */ 1276c965db44STomer Tayar if (dump) 12777b6859fbSMintz, Yuval *(dump_buf + offset) = ~crc32(0xffffffff, 12787b6859fbSMintz, Yuval (u8 *)dump_buf, 1279c965db44STomer Tayar DWORDS_TO_BYTES(offset)); 12807b6859fbSMintz, Yuval 1281c965db44STomer Tayar offset++; 12827b6859fbSMintz, Yuval 1283c965db44STomer Tayar return offset - start_offset; 1284c965db44STomer Tayar } 1285c965db44STomer Tayar 1286c965db44STomer Tayar /* Update blocks reset state */ 1287c965db44STomer Tayar static void qed_update_blocks_reset_state(struct qed_hwfn *p_hwfn, 1288c965db44STomer Tayar struct qed_ptt *p_ptt) 1289c965db44STomer Tayar { 1290c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 12912d22bc83SMichal Kalderon u32 reg_val[NUM_DBG_RESET_REGS] = { 0 }; 12922d22bc83SMichal Kalderon u8 rst_reg_id; 12932d22bc83SMichal Kalderon u32 blk_id; 1294c965db44STomer Tayar 1295c965db44STomer Tayar /* Read reset registers */ 12962d22bc83SMichal Kalderon for (rst_reg_id = 0; rst_reg_id < NUM_DBG_RESET_REGS; rst_reg_id++) { 12972d22bc83SMichal Kalderon const struct dbg_reset_reg *rst_reg; 12982d22bc83SMichal Kalderon bool rst_reg_removed; 12992d22bc83SMichal Kalderon u32 rst_reg_addr; 13002d22bc83SMichal Kalderon 13012d22bc83SMichal Kalderon rst_reg = qed_get_dbg_reset_reg(p_hwfn, rst_reg_id); 13022d22bc83SMichal Kalderon rst_reg_removed = GET_FIELD(rst_reg->data, 13032d22bc83SMichal Kalderon DBG_RESET_REG_IS_REMOVED); 13042d22bc83SMichal Kalderon rst_reg_addr = DWORDS_TO_BYTES(GET_FIELD(rst_reg->data, 13052d22bc83SMichal Kalderon DBG_RESET_REG_ADDR)); 13062d22bc83SMichal Kalderon 13072d22bc83SMichal Kalderon if (!rst_reg_removed) 13082d22bc83SMichal Kalderon reg_val[rst_reg_id] = qed_rd(p_hwfn, p_ptt, 13092d22bc83SMichal Kalderon rst_reg_addr); 13102d22bc83SMichal Kalderon } 1311c965db44STomer Tayar 1312c965db44STomer Tayar /* Check if blocks are in reset */ 13132d22bc83SMichal Kalderon for (blk_id = 0; blk_id < NUM_PHYS_BLOCKS; blk_id++) { 13142d22bc83SMichal Kalderon const struct dbg_block_chip *blk; 13152d22bc83SMichal Kalderon bool has_rst_reg; 13162d22bc83SMichal Kalderon bool is_removed; 13177b6859fbSMintz, Yuval 13182d22bc83SMichal Kalderon blk = qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)blk_id); 13192d22bc83SMichal Kalderon is_removed = GET_FIELD(blk->flags, DBG_BLOCK_CHIP_IS_REMOVED); 13202d22bc83SMichal Kalderon has_rst_reg = GET_FIELD(blk->flags, 13212d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_RESET_REG); 13222d22bc83SMichal Kalderon 13232d22bc83SMichal Kalderon if (!is_removed && has_rst_reg) 13242d22bc83SMichal Kalderon dev_data->block_in_reset[blk_id] = 13252d22bc83SMichal Kalderon !(reg_val[blk->reset_reg_id] & 13262d22bc83SMichal Kalderon BIT(blk->reset_reg_bit_offset)); 13277b6859fbSMintz, Yuval } 1328c965db44STomer Tayar } 1329c965db44STomer Tayar 13302d22bc83SMichal Kalderon /* is_mode_match recursive function */ 13312d22bc83SMichal Kalderon static bool qed_is_mode_match_rec(struct qed_hwfn *p_hwfn, 13322d22bc83SMichal Kalderon u16 *modes_buf_offset, u8 rec_depth) 13332d22bc83SMichal Kalderon { 13342d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 13352d22bc83SMichal Kalderon u8 *dbg_array; 13362d22bc83SMichal Kalderon bool arg1, arg2; 13372d22bc83SMichal Kalderon u8 tree_val; 13382d22bc83SMichal Kalderon 13392d22bc83SMichal Kalderon if (rec_depth > MAX_RECURSION_DEPTH) { 13402d22bc83SMichal Kalderon DP_NOTICE(p_hwfn, 13412d22bc83SMichal Kalderon "Unexpected error: is_mode_match_rec exceeded the max recursion depth. This is probably due to a corrupt init/debug buffer.\n"); 13422d22bc83SMichal Kalderon return false; 13432d22bc83SMichal Kalderon } 13442d22bc83SMichal Kalderon 13452d22bc83SMichal Kalderon /* Get next element from modes tree buffer */ 13462d22bc83SMichal Kalderon dbg_array = p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr; 13472d22bc83SMichal Kalderon tree_val = dbg_array[(*modes_buf_offset)++]; 13482d22bc83SMichal Kalderon 13492d22bc83SMichal Kalderon switch (tree_val) { 13502d22bc83SMichal Kalderon case INIT_MODE_OP_NOT: 13512d22bc83SMichal Kalderon return !qed_is_mode_match_rec(p_hwfn, 13522d22bc83SMichal Kalderon modes_buf_offset, rec_depth + 1); 13532d22bc83SMichal Kalderon case INIT_MODE_OP_OR: 13542d22bc83SMichal Kalderon case INIT_MODE_OP_AND: 13552d22bc83SMichal Kalderon arg1 = qed_is_mode_match_rec(p_hwfn, 13562d22bc83SMichal Kalderon modes_buf_offset, rec_depth + 1); 13572d22bc83SMichal Kalderon arg2 = qed_is_mode_match_rec(p_hwfn, 13582d22bc83SMichal Kalderon modes_buf_offset, rec_depth + 1); 13592d22bc83SMichal Kalderon return (tree_val == INIT_MODE_OP_OR) ? (arg1 || 13602d22bc83SMichal Kalderon arg2) : (arg1 && arg2); 13612d22bc83SMichal Kalderon default: 13622d22bc83SMichal Kalderon return dev_data->mode_enable[tree_val - MAX_INIT_MODE_OPS] > 0; 13632d22bc83SMichal Kalderon } 13642d22bc83SMichal Kalderon } 13652d22bc83SMichal Kalderon 13662d22bc83SMichal Kalderon /* Returns true if the mode (specified using modes_buf_offset) is enabled */ 13672d22bc83SMichal Kalderon static bool qed_is_mode_match(struct qed_hwfn *p_hwfn, u16 *modes_buf_offset) 13682d22bc83SMichal Kalderon { 13692d22bc83SMichal Kalderon return qed_is_mode_match_rec(p_hwfn, modes_buf_offset, 0); 13702d22bc83SMichal Kalderon } 13712d22bc83SMichal Kalderon 1372c965db44STomer Tayar /* Enable / disable the Debug block */ 1373c965db44STomer Tayar static void qed_bus_enable_dbg_block(struct qed_hwfn *p_hwfn, 1374c965db44STomer Tayar struct qed_ptt *p_ptt, bool enable) 1375c965db44STomer Tayar { 1376c965db44STomer Tayar qed_wr(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON, enable ? 1 : 0); 1377c965db44STomer Tayar } 1378c965db44STomer Tayar 1379c965db44STomer Tayar /* Resets the Debug block */ 1380c965db44STomer Tayar static void qed_bus_reset_dbg_block(struct qed_hwfn *p_hwfn, 1381c965db44STomer Tayar struct qed_ptt *p_ptt) 1382c965db44STomer Tayar { 13832d22bc83SMichal Kalderon u32 reset_reg_addr, old_reset_reg_val, new_reset_reg_val; 13842d22bc83SMichal Kalderon const struct dbg_reset_reg *reset_reg; 13852d22bc83SMichal Kalderon const struct dbg_block_chip *block; 1386c965db44STomer Tayar 13872d22bc83SMichal Kalderon block = qed_get_dbg_block_per_chip(p_hwfn, BLOCK_DBG); 13882d22bc83SMichal Kalderon reset_reg = qed_get_dbg_reset_reg(p_hwfn, block->reset_reg_id); 13892d22bc83SMichal Kalderon reset_reg_addr = 13902d22bc83SMichal Kalderon DWORDS_TO_BYTES(GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR)); 13912d22bc83SMichal Kalderon 13922d22bc83SMichal Kalderon old_reset_reg_val = qed_rd(p_hwfn, p_ptt, reset_reg_addr); 13937b6859fbSMintz, Yuval new_reset_reg_val = 13942d22bc83SMichal Kalderon old_reset_reg_val & ~BIT(block->reset_reg_bit_offset); 1395c965db44STomer Tayar 13962d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, reset_reg_addr, new_reset_reg_val); 13972d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, reset_reg_addr, old_reset_reg_val); 1398c965db44STomer Tayar } 1399c965db44STomer Tayar 14007b6859fbSMintz, Yuval /* Enable / disable Debug Bus clients according to the specified mask 14017b6859fbSMintz, Yuval * (1 = enable, 0 = disable). 1402c965db44STomer Tayar */ 1403c965db44STomer Tayar static void qed_bus_enable_clients(struct qed_hwfn *p_hwfn, 1404c965db44STomer Tayar struct qed_ptt *p_ptt, u32 client_mask) 1405c965db44STomer Tayar { 1406c965db44STomer Tayar qed_wr(p_hwfn, p_ptt, DBG_REG_CLIENT_ENABLE, client_mask); 1407c965db44STomer Tayar } 1408c965db44STomer Tayar 14092d22bc83SMichal Kalderon static void qed_bus_config_dbg_line(struct qed_hwfn *p_hwfn, 14102d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 14112d22bc83SMichal Kalderon enum block_id block_id, 14122d22bc83SMichal Kalderon u8 line_id, 14132d22bc83SMichal Kalderon u8 enable_mask, 14142d22bc83SMichal Kalderon u8 right_shift, 14152d22bc83SMichal Kalderon u8 force_valid_mask, u8 force_frame_mask) 14162d22bc83SMichal Kalderon { 14172d22bc83SMichal Kalderon const struct dbg_block_chip *block = 14182d22bc83SMichal Kalderon qed_get_dbg_block_per_chip(p_hwfn, block_id); 14192d22bc83SMichal Kalderon 14202d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_select_reg_addr), 14212d22bc83SMichal Kalderon line_id); 14222d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_dword_enable_reg_addr), 14232d22bc83SMichal Kalderon enable_mask); 14242d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_shift_reg_addr), 14252d22bc83SMichal Kalderon right_shift); 14262d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_valid_reg_addr), 14272d22bc83SMichal Kalderon force_valid_mask); 14282d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_frame_reg_addr), 14292d22bc83SMichal Kalderon force_frame_mask); 14302d22bc83SMichal Kalderon } 14312d22bc83SMichal Kalderon 14322d22bc83SMichal Kalderon /* Disable debug bus in all blocks */ 14332d22bc83SMichal Kalderon static void qed_bus_disable_blocks(struct qed_hwfn *p_hwfn, 14342d22bc83SMichal Kalderon struct qed_ptt *p_ptt) 1435c965db44STomer Tayar { 1436c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 14372d22bc83SMichal Kalderon u32 block_id; 14387b6859fbSMintz, Yuval 14392d22bc83SMichal Kalderon /* Disable all blocks */ 14402d22bc83SMichal Kalderon for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) { 14412d22bc83SMichal Kalderon const struct dbg_block_chip *block_per_chip = 14422d22bc83SMichal Kalderon qed_get_dbg_block_per_chip(p_hwfn, 14432d22bc83SMichal Kalderon (enum block_id)block_id); 1444c965db44STomer Tayar 14452d22bc83SMichal Kalderon if (GET_FIELD(block_per_chip->flags, 14462d22bc83SMichal Kalderon DBG_BLOCK_CHIP_IS_REMOVED) || 14472d22bc83SMichal Kalderon dev_data->block_in_reset[block_id]) 14482d22bc83SMichal Kalderon continue; 14492d22bc83SMichal Kalderon 14502d22bc83SMichal Kalderon /* Disable debug bus */ 14512d22bc83SMichal Kalderon if (GET_FIELD(block_per_chip->flags, 14522d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_DBG_BUS)) { 14532d22bc83SMichal Kalderon u32 dbg_en_addr = 14542d22bc83SMichal Kalderon block_per_chip->dbg_dword_enable_reg_addr; 14552d22bc83SMichal Kalderon u16 modes_buf_offset = 14562d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 14572d22bc83SMichal Kalderon DBG_MODE_HDR_MODES_BUF_OFFSET); 14582d22bc83SMichal Kalderon bool eval_mode = 14592d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 14602d22bc83SMichal Kalderon DBG_MODE_HDR_EVAL_MODE) > 0; 14612d22bc83SMichal Kalderon 14622d22bc83SMichal Kalderon if (!eval_mode || 14632d22bc83SMichal Kalderon qed_is_mode_match(p_hwfn, &modes_buf_offset)) 14642d22bc83SMichal Kalderon qed_wr(p_hwfn, p_ptt, 14652d22bc83SMichal Kalderon DWORDS_TO_BYTES(dbg_en_addr), 14662d22bc83SMichal Kalderon 0); 14672d22bc83SMichal Kalderon } 1468c965db44STomer Tayar } 1469c965db44STomer Tayar } 1470c965db44STomer Tayar 1471c965db44STomer Tayar /* Returns true if the specified entity (indicated by GRC param) should be 1472c965db44STomer Tayar * included in the dump, false otherwise. 1473c965db44STomer Tayar */ 1474c965db44STomer Tayar static bool qed_grc_is_included(struct qed_hwfn *p_hwfn, 1475c965db44STomer Tayar enum dbg_grc_params grc_param) 1476c965db44STomer Tayar { 1477c965db44STomer Tayar return qed_grc_get_param(p_hwfn, grc_param) > 0; 1478c965db44STomer Tayar } 1479c965db44STomer Tayar 14802d22bc83SMichal Kalderon /* Returns the storm_id that matches the specified Storm letter, 14812d22bc83SMichal Kalderon * or MAX_DBG_STORMS if invalid storm letter. 14822d22bc83SMichal Kalderon */ 14832d22bc83SMichal Kalderon static enum dbg_storms qed_get_id_from_letter(char storm_letter) 14842d22bc83SMichal Kalderon { 14852d22bc83SMichal Kalderon u8 storm_id; 14862d22bc83SMichal Kalderon 14872d22bc83SMichal Kalderon for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) 14882d22bc83SMichal Kalderon if (s_storm_defs[storm_id].letter == storm_letter) 14892d22bc83SMichal Kalderon return (enum dbg_storms)storm_id; 14902d22bc83SMichal Kalderon 14912d22bc83SMichal Kalderon return MAX_DBG_STORMS; 14922d22bc83SMichal Kalderon } 14932d22bc83SMichal Kalderon 1494c965db44STomer Tayar /* Returns true of the specified Storm should be included in the dump, false 1495c965db44STomer Tayar * otherwise. 1496c965db44STomer Tayar */ 1497c965db44STomer Tayar static bool qed_grc_is_storm_included(struct qed_hwfn *p_hwfn, 1498c965db44STomer Tayar enum dbg_storms storm) 1499c965db44STomer Tayar { 1500c965db44STomer Tayar return qed_grc_get_param(p_hwfn, (enum dbg_grc_params)storm) > 0; 1501c965db44STomer Tayar } 1502c965db44STomer Tayar 1503c965db44STomer Tayar /* Returns true if the specified memory should be included in the dump, false 1504c965db44STomer Tayar * otherwise. 1505c965db44STomer Tayar */ 1506c965db44STomer Tayar static bool qed_grc_is_mem_included(struct qed_hwfn *p_hwfn, 1507c965db44STomer Tayar enum block_id block_id, u8 mem_group_id) 1508c965db44STomer Tayar { 15092d22bc83SMichal Kalderon const struct dbg_block *block; 1510c965db44STomer Tayar u8 i; 1511c965db44STomer Tayar 15122d22bc83SMichal Kalderon block = get_dbg_block(p_hwfn, block_id); 15132d22bc83SMichal Kalderon 15142d22bc83SMichal Kalderon /* If the block is associated with a Storm, check Storm match */ 15152d22bc83SMichal Kalderon if (block->associated_storm_letter) { 15162d22bc83SMichal Kalderon enum dbg_storms associated_storm_id = 15172d22bc83SMichal Kalderon qed_get_id_from_letter(block->associated_storm_letter); 15182d22bc83SMichal Kalderon 15192d22bc83SMichal Kalderon if (associated_storm_id == MAX_DBG_STORMS || 15202d22bc83SMichal Kalderon !qed_grc_is_storm_included(p_hwfn, associated_storm_id)) 1521c965db44STomer Tayar return false; 15222d22bc83SMichal Kalderon } 1523c965db44STomer Tayar 15247b6859fbSMintz, Yuval for (i = 0; i < NUM_BIG_RAM_TYPES; i++) { 15257b6859fbSMintz, Yuval struct big_ram_defs *big_ram = &s_big_ram_defs[i]; 1526c965db44STomer Tayar 15277b6859fbSMintz, Yuval if (mem_group_id == big_ram->mem_group_id || 15287b6859fbSMintz, Yuval mem_group_id == big_ram->ram_mem_group_id) 15297b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, big_ram->grc_param); 15307b6859fbSMintz, Yuval } 15317b6859fbSMintz, Yuval 15327b6859fbSMintz, Yuval switch (mem_group_id) { 15337b6859fbSMintz, Yuval case MEM_GROUP_PXP_ILT: 15347b6859fbSMintz, Yuval case MEM_GROUP_PXP_MEM: 15357b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PXP); 15367b6859fbSMintz, Yuval case MEM_GROUP_RAM: 15377b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RAM); 15387b6859fbSMintz, Yuval case MEM_GROUP_PBUF: 15397b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PBUF); 15407b6859fbSMintz, Yuval case MEM_GROUP_CAU_MEM: 15417b6859fbSMintz, Yuval case MEM_GROUP_CAU_SB: 15427b6859fbSMintz, Yuval case MEM_GROUP_CAU_PI: 15437b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU); 15442d22bc83SMichal Kalderon case MEM_GROUP_CAU_MEM_EXT: 15452d22bc83SMichal Kalderon return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU_EXT); 15467b6859fbSMintz, Yuval case MEM_GROUP_QM_MEM: 15477b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_QM); 15487b6859fbSMintz, Yuval case MEM_GROUP_CFC_MEM: 15497b6859fbSMintz, Yuval case MEM_GROUP_CONN_CFC_MEM: 15507b6859fbSMintz, Yuval case MEM_GROUP_TASK_CFC_MEM: 1551da090917STomer Tayar return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CFC) || 1552da090917STomer Tayar qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX); 15532d22bc83SMichal Kalderon case MEM_GROUP_DORQ_MEM: 15542d22bc83SMichal Kalderon return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DORQ); 15557b6859fbSMintz, Yuval case MEM_GROUP_IGU_MEM: 15567b6859fbSMintz, Yuval case MEM_GROUP_IGU_MSIX: 15577b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IGU); 15587b6859fbSMintz, Yuval case MEM_GROUP_MULD_MEM: 15597b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MULD); 15607b6859fbSMintz, Yuval case MEM_GROUP_PRS_MEM: 15617b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PRS); 15627b6859fbSMintz, Yuval case MEM_GROUP_DMAE_MEM: 15637b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DMAE); 15647b6859fbSMintz, Yuval case MEM_GROUP_TM_MEM: 15657b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_TM); 15667b6859fbSMintz, Yuval case MEM_GROUP_SDM_MEM: 15677b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_SDM); 15687b6859fbSMintz, Yuval case MEM_GROUP_TDIF_CTX: 15697b6859fbSMintz, Yuval case MEM_GROUP_RDIF_CTX: 15707b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DIF); 15717b6859fbSMintz, Yuval case MEM_GROUP_CM_MEM: 15727b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM); 15737b6859fbSMintz, Yuval case MEM_GROUP_IOR: 15747b6859fbSMintz, Yuval return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR); 15757b6859fbSMintz, Yuval default: 1576c965db44STomer Tayar return true; 1577c965db44STomer Tayar } 15787b6859fbSMintz, Yuval } 1579c965db44STomer Tayar 1580c965db44STomer Tayar /* Stalls all Storms */ 1581c965db44STomer Tayar static void qed_grc_stall_storms(struct qed_hwfn *p_hwfn, 1582c965db44STomer Tayar struct qed_ptt *p_ptt, bool stall) 1583c965db44STomer Tayar { 15847b6859fbSMintz, Yuval u32 reg_addr; 1585c965db44STomer Tayar u8 storm_id; 1586c965db44STomer Tayar 1587c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 15887b6859fbSMintz, Yuval if (!qed_grc_is_storm_included(p_hwfn, 15897b6859fbSMintz, Yuval (enum dbg_storms)storm_id)) 15907b6859fbSMintz, Yuval continue; 1591c965db44STomer Tayar 15927b6859fbSMintz, Yuval reg_addr = s_storm_defs[storm_id].sem_fast_mem_addr + 15937b6859fbSMintz, Yuval SEM_FAST_REG_STALL_0_BB_K2; 15947b6859fbSMintz, Yuval qed_wr(p_hwfn, p_ptt, reg_addr, stall ? 1 : 0); 1595c965db44STomer Tayar } 1596c965db44STomer Tayar 1597c965db44STomer Tayar msleep(STALL_DELAY_MS); 1598c965db44STomer Tayar } 1599c965db44STomer Tayar 16002d22bc83SMichal Kalderon /* Takes all blocks out of reset. If rbc_only is true, only RBC clients are 16012d22bc83SMichal Kalderon * taken out of reset. 16022d22bc83SMichal Kalderon */ 1603c965db44STomer Tayar static void qed_grc_unreset_blocks(struct qed_hwfn *p_hwfn, 16042d22bc83SMichal Kalderon struct qed_ptt *p_ptt, bool rbc_only) 1605c965db44STomer Tayar { 1606c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 16072d22bc83SMichal Kalderon u8 chip_id = dev_data->chip_id; 16082d22bc83SMichal Kalderon u32 i; 16092d22bc83SMichal Kalderon 16102d22bc83SMichal Kalderon /* Take RBCs out of reset */ 16112d22bc83SMichal Kalderon for (i = 0; i < ARRAY_SIZE(s_rbc_reset_defs); i++) 16122d22bc83SMichal Kalderon if (s_rbc_reset_defs[i].reset_val[dev_data->chip_id]) 16132d22bc83SMichal Kalderon qed_wr(p_hwfn, 16142d22bc83SMichal Kalderon p_ptt, 16152d22bc83SMichal Kalderon s_rbc_reset_defs[i].reset_reg_addr + 16162d22bc83SMichal Kalderon RESET_REG_UNRESET_OFFSET, 16172d22bc83SMichal Kalderon s_rbc_reset_defs[i].reset_val[chip_id]); 16182d22bc83SMichal Kalderon 16192d22bc83SMichal Kalderon if (!rbc_only) { 16202d22bc83SMichal Kalderon u32 reg_val[NUM_DBG_RESET_REGS] = { 0 }; 16212d22bc83SMichal Kalderon u8 reset_reg_id; 16222d22bc83SMichal Kalderon u32 block_id; 1623c965db44STomer Tayar 1624c965db44STomer Tayar /* Fill reset regs values */ 16252d22bc83SMichal Kalderon for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) { 16262d22bc83SMichal Kalderon bool is_removed, has_reset_reg, unreset_before_dump; 16272d22bc83SMichal Kalderon const struct dbg_block_chip *block; 16287b6859fbSMintz, Yuval 16292d22bc83SMichal Kalderon block = qed_get_dbg_block_per_chip(p_hwfn, 16302d22bc83SMichal Kalderon (enum block_id) 16312d22bc83SMichal Kalderon block_id); 16322d22bc83SMichal Kalderon is_removed = 16332d22bc83SMichal Kalderon GET_FIELD(block->flags, DBG_BLOCK_CHIP_IS_REMOVED); 16342d22bc83SMichal Kalderon has_reset_reg = 16352d22bc83SMichal Kalderon GET_FIELD(block->flags, 16362d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_RESET_REG); 16372d22bc83SMichal Kalderon unreset_before_dump = 16382d22bc83SMichal Kalderon GET_FIELD(block->flags, 16392d22bc83SMichal Kalderon DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP); 16402d22bc83SMichal Kalderon 16412d22bc83SMichal Kalderon if (!is_removed && has_reset_reg && unreset_before_dump) 16422d22bc83SMichal Kalderon reg_val[block->reset_reg_id] |= 16432d22bc83SMichal Kalderon BIT(block->reset_reg_bit_offset); 16447b6859fbSMintz, Yuval } 1645c965db44STomer Tayar 1646c965db44STomer Tayar /* Write reset registers */ 16472d22bc83SMichal Kalderon for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS; 16482d22bc83SMichal Kalderon reset_reg_id++) { 16492d22bc83SMichal Kalderon const struct dbg_reset_reg *reset_reg; 16502d22bc83SMichal Kalderon u32 reset_reg_addr; 16512d22bc83SMichal Kalderon 16522d22bc83SMichal Kalderon reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id); 16532d22bc83SMichal Kalderon 16542d22bc83SMichal Kalderon if (GET_FIELD 16552d22bc83SMichal Kalderon (reset_reg->data, DBG_RESET_REG_IS_REMOVED)) 16567b6859fbSMintz, Yuval continue; 16577b6859fbSMintz, Yuval 16582d22bc83SMichal Kalderon if (reg_val[reset_reg_id]) { 16592d22bc83SMichal Kalderon reset_reg_addr = 16602d22bc83SMichal Kalderon GET_FIELD(reset_reg->data, 16612d22bc83SMichal Kalderon DBG_RESET_REG_ADDR); 1662c965db44STomer Tayar qed_wr(p_hwfn, 1663c965db44STomer Tayar p_ptt, 16642d22bc83SMichal Kalderon DWORDS_TO_BYTES(reset_reg_addr) + 16652d22bc83SMichal Kalderon RESET_REG_UNRESET_OFFSET, 16662d22bc83SMichal Kalderon reg_val[reset_reg_id]); 16672d22bc83SMichal Kalderon } 16682d22bc83SMichal Kalderon } 1669c965db44STomer Tayar } 1670c965db44STomer Tayar } 1671c965db44STomer Tayar 1672be086e7cSMintz, Yuval /* Returns the attention block data of the specified block */ 1673c965db44STomer Tayar static const struct dbg_attn_block_type_data * 16742d22bc83SMichal Kalderon qed_get_block_attn_data(struct qed_hwfn *p_hwfn, 16752d22bc83SMichal Kalderon enum block_id block_id, enum dbg_attn_type attn_type) 1676c965db44STomer Tayar { 1677c965db44STomer Tayar const struct dbg_attn_block *base_attn_block_arr = 1678c965db44STomer Tayar (const struct dbg_attn_block *) 16792d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr; 1680c965db44STomer Tayar 1681c965db44STomer Tayar return &base_attn_block_arr[block_id].per_type_data[attn_type]; 1682c965db44STomer Tayar } 1683c965db44STomer Tayar 1684c965db44STomer Tayar /* Returns the attention registers of the specified block */ 1685c965db44STomer Tayar static const struct dbg_attn_reg * 16862d22bc83SMichal Kalderon qed_get_block_attn_regs(struct qed_hwfn *p_hwfn, 16872d22bc83SMichal Kalderon enum block_id block_id, enum dbg_attn_type attn_type, 1688c965db44STomer Tayar u8 *num_attn_regs) 1689c965db44STomer Tayar { 1690c965db44STomer Tayar const struct dbg_attn_block_type_data *block_type_data = 16912d22bc83SMichal Kalderon qed_get_block_attn_data(p_hwfn, block_id, attn_type); 1692c965db44STomer Tayar 1693c965db44STomer Tayar *num_attn_regs = block_type_data->num_regs; 16947b6859fbSMintz, Yuval 16952d22bc83SMichal Kalderon return (const struct dbg_attn_reg *) 16962d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr + 16972d22bc83SMichal Kalderon block_type_data->regs_offset; 1698c965db44STomer Tayar } 1699c965db44STomer Tayar 1700c965db44STomer Tayar /* For each block, clear the status of all parities */ 1701c965db44STomer Tayar static void qed_grc_clear_all_prty(struct qed_hwfn *p_hwfn, 1702c965db44STomer Tayar struct qed_ptt *p_ptt) 1703c965db44STomer Tayar { 1704c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 17057b6859fbSMintz, Yuval const struct dbg_attn_reg *attn_reg_arr; 1706c965db44STomer Tayar u8 reg_idx, num_attn_regs; 1707c965db44STomer Tayar u32 block_id; 1708c965db44STomer Tayar 17092d22bc83SMichal Kalderon for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) { 1710c965db44STomer Tayar if (dev_data->block_in_reset[block_id]) 1711c965db44STomer Tayar continue; 1712c965db44STomer Tayar 17132d22bc83SMichal Kalderon attn_reg_arr = qed_get_block_attn_regs(p_hwfn, 17142d22bc83SMichal Kalderon (enum block_id)block_id, 1715c965db44STomer Tayar ATTN_TYPE_PARITY, 1716c965db44STomer Tayar &num_attn_regs); 17177b6859fbSMintz, Yuval 1718c965db44STomer Tayar for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) { 1719c965db44STomer Tayar const struct dbg_attn_reg *reg_data = 1720c965db44STomer Tayar &attn_reg_arr[reg_idx]; 17217b6859fbSMintz, Yuval u16 modes_buf_offset; 17227b6859fbSMintz, Yuval bool eval_mode; 1723c965db44STomer Tayar 1724c965db44STomer Tayar /* Check mode */ 17257b6859fbSMintz, Yuval eval_mode = GET_FIELD(reg_data->mode.data, 1726c965db44STomer Tayar DBG_MODE_HDR_EVAL_MODE) > 0; 17277b6859fbSMintz, Yuval modes_buf_offset = 1728c965db44STomer Tayar GET_FIELD(reg_data->mode.data, 1729c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 1730c965db44STomer Tayar 17317b6859fbSMintz, Yuval /* If Mode match: clear parity status */ 1732c965db44STomer Tayar if (!eval_mode || 1733c965db44STomer Tayar qed_is_mode_match(p_hwfn, &modes_buf_offset)) 1734c965db44STomer Tayar qed_rd(p_hwfn, p_ptt, 1735c965db44STomer Tayar DWORDS_TO_BYTES(reg_data-> 1736c965db44STomer Tayar sts_clr_address)); 1737c965db44STomer Tayar } 1738c965db44STomer Tayar } 1739c965db44STomer Tayar } 1740c965db44STomer Tayar 1741c965db44STomer Tayar /* Dumps GRC registers section header. Returns the dumped size in dwords. 17422d22bc83SMichal Kalderon * the following parameters are dumped: 17437b6859fbSMintz, Yuval * - count: no. of dumped entries 1744d52c89f1SMichal Kalderon * - split_type: split type 1745d52c89f1SMichal Kalderon * - split_id: split ID (dumped only if split_id != SPLIT_TYPE_NONE) 17462d22bc83SMichal Kalderon * - reg_type_name: register type name (dumped only if reg_type_name != NULL) 1747c965db44STomer Tayar */ 1748c965db44STomer Tayar static u32 qed_grc_dump_regs_hdr(u32 *dump_buf, 1749c965db44STomer Tayar bool dump, 1750c965db44STomer Tayar u32 num_reg_entries, 1751d52c89f1SMichal Kalderon enum init_split_types split_type, 17522d22bc83SMichal Kalderon u8 split_id, const char *reg_type_name) 1753c965db44STomer Tayar { 1754d52c89f1SMichal Kalderon u8 num_params = 2 + 17552d22bc83SMichal Kalderon (split_type != SPLIT_TYPE_NONE ? 1 : 0) + (reg_type_name ? 1 : 0); 1756c965db44STomer Tayar u32 offset = 0; 1757c965db44STomer Tayar 1758c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 1759c965db44STomer Tayar dump, "grc_regs", num_params); 1760c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 1761c965db44STomer Tayar dump, "count", num_reg_entries); 1762c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 1763d52c89f1SMichal Kalderon dump, "split", 1764d52c89f1SMichal Kalderon s_split_type_defs[split_type].name); 1765d52c89f1SMichal Kalderon if (split_type != SPLIT_TYPE_NONE) 1766c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 1767c965db44STomer Tayar dump, "id", split_id); 17682d22bc83SMichal Kalderon if (reg_type_name) 1769c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 17702d22bc83SMichal Kalderon dump, "type", reg_type_name); 17717b6859fbSMintz, Yuval 1772c965db44STomer Tayar return offset; 1773c965db44STomer Tayar } 1774c965db44STomer Tayar 1775da090917STomer Tayar /* Reads the specified registers into the specified buffer. 1776da090917STomer Tayar * The addr and len arguments are specified in dwords. 1777da090917STomer Tayar */ 1778da090917STomer Tayar void qed_read_regs(struct qed_hwfn *p_hwfn, 1779da090917STomer Tayar struct qed_ptt *p_ptt, u32 *buf, u32 addr, u32 len) 1780da090917STomer Tayar { 1781da090917STomer Tayar u32 i; 1782da090917STomer Tayar 1783da090917STomer Tayar for (i = 0; i < len; i++) 1784da090917STomer Tayar buf[i] = qed_rd(p_hwfn, p_ptt, DWORDS_TO_BYTES(addr + i)); 1785da090917STomer Tayar } 1786da090917STomer Tayar 1787be086e7cSMintz, Yuval /* Dumps the GRC registers in the specified address range. 1788be086e7cSMintz, Yuval * Returns the dumped size in dwords. 17897b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 1790be086e7cSMintz, Yuval */ 1791be086e7cSMintz, Yuval static u32 qed_grc_dump_addr_range(struct qed_hwfn *p_hwfn, 17927b6859fbSMintz, Yuval struct qed_ptt *p_ptt, 17937b6859fbSMintz, Yuval u32 *dump_buf, 1794d52c89f1SMichal Kalderon bool dump, u32 addr, u32 len, bool wide_bus, 1795d52c89f1SMichal Kalderon enum init_split_types split_type, 1796d52c89f1SMichal Kalderon u8 split_id) 1797be086e7cSMintz, Yuval { 1798da090917STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 1799d52c89f1SMichal Kalderon u8 port_id = 0, pf_id = 0, vf_id = 0, fid = 0; 18002d22bc83SMichal Kalderon bool read_using_dmae = false; 18012d22bc83SMichal Kalderon u32 thresh; 1802be086e7cSMintz, Yuval 18037b6859fbSMintz, Yuval if (!dump) 18047b6859fbSMintz, Yuval return len; 18057b6859fbSMintz, Yuval 1806d52c89f1SMichal Kalderon switch (split_type) { 1807d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT: 1808d52c89f1SMichal Kalderon port_id = split_id; 1809d52c89f1SMichal Kalderon break; 1810d52c89f1SMichal Kalderon case SPLIT_TYPE_PF: 1811d52c89f1SMichal Kalderon pf_id = split_id; 1812d52c89f1SMichal Kalderon break; 1813d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT_PF: 1814d52c89f1SMichal Kalderon port_id = split_id / dev_data->num_pfs_per_port; 1815d52c89f1SMichal Kalderon pf_id = port_id + dev_data->num_ports * 1816d52c89f1SMichal Kalderon (split_id % dev_data->num_pfs_per_port); 1817d52c89f1SMichal Kalderon break; 1818d52c89f1SMichal Kalderon case SPLIT_TYPE_VF: 1819d52c89f1SMichal Kalderon vf_id = split_id; 1820d52c89f1SMichal Kalderon break; 1821d52c89f1SMichal Kalderon default: 1822d52c89f1SMichal Kalderon break; 1823d52c89f1SMichal Kalderon } 1824d52c89f1SMichal Kalderon 1825da090917STomer Tayar /* Try reading using DMAE */ 18262d22bc83SMichal Kalderon if (dev_data->use_dmae && split_type != SPLIT_TYPE_VF && 18272d22bc83SMichal Kalderon (len >= s_hw_type_defs[dev_data->hw_type].dmae_thresh || 18282d22bc83SMichal Kalderon (PROTECT_WIDE_BUS && wide_bus))) { 18292d22bc83SMichal Kalderon struct qed_dmae_params dmae_params; 18302d22bc83SMichal Kalderon 18312d22bc83SMichal Kalderon /* Set DMAE params */ 18322d22bc83SMichal Kalderon memset(&dmae_params, 0, sizeof(dmae_params)); 18332d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_COMPLETION_DST, 1); 18342d22bc83SMichal Kalderon switch (split_type) { 18352d22bc83SMichal Kalderon case SPLIT_TYPE_PORT: 18362d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID, 18372d22bc83SMichal Kalderon 1); 18382d22bc83SMichal Kalderon dmae_params.port_id = port_id; 18392d22bc83SMichal Kalderon break; 18402d22bc83SMichal Kalderon case SPLIT_TYPE_PF: 18412d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, 18422d22bc83SMichal Kalderon QED_DMAE_PARAMS_SRC_PF_VALID, 1); 18432d22bc83SMichal Kalderon dmae_params.src_pfid = pf_id; 18442d22bc83SMichal Kalderon break; 18452d22bc83SMichal Kalderon case SPLIT_TYPE_PORT_PF: 18462d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID, 18472d22bc83SMichal Kalderon 1); 18482d22bc83SMichal Kalderon SET_FIELD(dmae_params.flags, 18492d22bc83SMichal Kalderon QED_DMAE_PARAMS_SRC_PF_VALID, 1); 18502d22bc83SMichal Kalderon dmae_params.port_id = port_id; 18512d22bc83SMichal Kalderon dmae_params.src_pfid = pf_id; 18522d22bc83SMichal Kalderon break; 18532d22bc83SMichal Kalderon default: 18542d22bc83SMichal Kalderon break; 18552d22bc83SMichal Kalderon } 18562d22bc83SMichal Kalderon 18572d22bc83SMichal Kalderon /* Execute DMAE command */ 18582d22bc83SMichal Kalderon read_using_dmae = !qed_dmae_grc2host(p_hwfn, 18592d22bc83SMichal Kalderon p_ptt, 18602d22bc83SMichal Kalderon DWORDS_TO_BYTES(addr), 18612d22bc83SMichal Kalderon (u64)(uintptr_t)(dump_buf), 18622d22bc83SMichal Kalderon len, &dmae_params); 18632d22bc83SMichal Kalderon if (!read_using_dmae) { 1864da090917STomer Tayar dev_data->use_dmae = 0; 1865da090917STomer Tayar DP_VERBOSE(p_hwfn, 1866da090917STomer Tayar QED_MSG_DEBUG, 1867da090917STomer Tayar "Failed reading from chip using DMAE, using GRC instead\n"); 1868da090917STomer Tayar } 18692d22bc83SMichal Kalderon } 18702d22bc83SMichal Kalderon 18712d22bc83SMichal Kalderon if (read_using_dmae) 18722d22bc83SMichal Kalderon goto print_log; 1873da090917STomer Tayar 1874d52c89f1SMichal Kalderon /* If not read using DMAE, read using GRC */ 1875d52c89f1SMichal Kalderon 1876d52c89f1SMichal Kalderon /* Set pretend */ 18772d22bc83SMichal Kalderon if (split_type != dev_data->pretend.split_type || 18782d22bc83SMichal Kalderon split_id != dev_data->pretend.split_id) { 1879d52c89f1SMichal Kalderon switch (split_type) { 1880d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT: 1881d52c89f1SMichal Kalderon qed_port_pretend(p_hwfn, p_ptt, port_id); 1882d52c89f1SMichal Kalderon break; 1883d52c89f1SMichal Kalderon case SPLIT_TYPE_PF: 18842d22bc83SMichal Kalderon fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID, 18852d22bc83SMichal Kalderon pf_id); 1886d52c89f1SMichal Kalderon qed_fid_pretend(p_hwfn, p_ptt, fid); 1887d52c89f1SMichal Kalderon break; 1888d52c89f1SMichal Kalderon case SPLIT_TYPE_PORT_PF: 18892d22bc83SMichal Kalderon fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID, 18902d22bc83SMichal Kalderon pf_id); 1891d52c89f1SMichal Kalderon qed_port_fid_pretend(p_hwfn, p_ptt, port_id, fid); 1892d52c89f1SMichal Kalderon break; 1893d52c89f1SMichal Kalderon case SPLIT_TYPE_VF: 18942d22bc83SMichal Kalderon fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFVALID, 1) 18952d22bc83SMichal Kalderon | FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFID, 18962d22bc83SMichal Kalderon vf_id); 1897d52c89f1SMichal Kalderon qed_fid_pretend(p_hwfn, p_ptt, fid); 1898d52c89f1SMichal Kalderon break; 1899d52c89f1SMichal Kalderon default: 1900d52c89f1SMichal Kalderon break; 1901d52c89f1SMichal Kalderon } 1902d52c89f1SMichal Kalderon 1903d52c89f1SMichal Kalderon dev_data->pretend.split_type = (u8)split_type; 1904d52c89f1SMichal Kalderon dev_data->pretend.split_id = split_id; 1905d52c89f1SMichal Kalderon } 1906d52c89f1SMichal Kalderon 1907d52c89f1SMichal Kalderon /* Read registers using GRC */ 1908da090917STomer Tayar qed_read_regs(p_hwfn, p_ptt, dump_buf, addr, len); 1909da090917STomer Tayar 19102d22bc83SMichal Kalderon print_log: 19112d22bc83SMichal Kalderon /* Print log */ 19122d22bc83SMichal Kalderon dev_data->num_regs_read += len; 19132d22bc83SMichal Kalderon thresh = s_hw_type_defs[dev_data->hw_type].log_thresh; 19142d22bc83SMichal Kalderon if ((dev_data->num_regs_read / thresh) > 19152d22bc83SMichal Kalderon ((dev_data->num_regs_read - len) / thresh)) 19162d22bc83SMichal Kalderon DP_VERBOSE(p_hwfn, 19172d22bc83SMichal Kalderon QED_MSG_DEBUG, 19182d22bc83SMichal Kalderon "Dumped %d registers...\n", dev_data->num_regs_read); 19192d22bc83SMichal Kalderon 1920da090917STomer Tayar return len; 1921be086e7cSMintz, Yuval } 1922be086e7cSMintz, Yuval 19237b6859fbSMintz, Yuval /* Dumps GRC registers sequence header. Returns the dumped size in dwords. 19247b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 19257b6859fbSMintz, Yuval */ 19267b6859fbSMintz, Yuval static u32 qed_grc_dump_reg_entry_hdr(u32 *dump_buf, 19277b6859fbSMintz, Yuval bool dump, u32 addr, u32 len) 1928be086e7cSMintz, Yuval { 1929be086e7cSMintz, Yuval if (dump) 1930be086e7cSMintz, Yuval *dump_buf = addr | (len << REG_DUMP_LEN_SHIFT); 19317b6859fbSMintz, Yuval 1932be086e7cSMintz, Yuval return 1; 1933be086e7cSMintz, Yuval } 1934be086e7cSMintz, Yuval 19357b6859fbSMintz, Yuval /* Dumps GRC registers sequence. Returns the dumped size in dwords. 19367b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 19377b6859fbSMintz, Yuval */ 1938c965db44STomer Tayar static u32 qed_grc_dump_reg_entry(struct qed_hwfn *p_hwfn, 19397b6859fbSMintz, Yuval struct qed_ptt *p_ptt, 19407b6859fbSMintz, Yuval u32 *dump_buf, 1941d52c89f1SMichal Kalderon bool dump, u32 addr, u32 len, bool wide_bus, 1942d52c89f1SMichal Kalderon enum init_split_types split_type, u8 split_id) 1943c965db44STomer Tayar { 1944be086e7cSMintz, Yuval u32 offset = 0; 1945c965db44STomer Tayar 1946be086e7cSMintz, Yuval offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, len); 1947be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 1948c965db44STomer Tayar p_ptt, 19497b6859fbSMintz, Yuval dump_buf + offset, 1950d52c89f1SMichal Kalderon dump, addr, len, wide_bus, 1951d52c89f1SMichal Kalderon split_type, split_id); 19527b6859fbSMintz, Yuval 1953be086e7cSMintz, Yuval return offset; 1954be086e7cSMintz, Yuval } 1955be086e7cSMintz, Yuval 1956be086e7cSMintz, Yuval /* Dumps GRC registers sequence with skip cycle. 1957be086e7cSMintz, Yuval * Returns the dumped size in dwords. 19587b6859fbSMintz, Yuval * - addr: start GRC address in dwords 19597b6859fbSMintz, Yuval * - total_len: total no. of dwords to dump 19607b6859fbSMintz, Yuval * - read_len: no. consecutive dwords to read 19617b6859fbSMintz, Yuval * - skip_len: no. of dwords to skip (and fill with zeros) 1962be086e7cSMintz, Yuval */ 1963be086e7cSMintz, Yuval static u32 qed_grc_dump_reg_entry_skip(struct qed_hwfn *p_hwfn, 19647b6859fbSMintz, Yuval struct qed_ptt *p_ptt, 19657b6859fbSMintz, Yuval u32 *dump_buf, 19667b6859fbSMintz, Yuval bool dump, 19677b6859fbSMintz, Yuval u32 addr, 19687b6859fbSMintz, Yuval u32 total_len, 1969be086e7cSMintz, Yuval u32 read_len, u32 skip_len) 1970be086e7cSMintz, Yuval { 1971be086e7cSMintz, Yuval u32 offset = 0, reg_offset = 0; 1972be086e7cSMintz, Yuval 1973be086e7cSMintz, Yuval offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, total_len); 19747b6859fbSMintz, Yuval 19757b6859fbSMintz, Yuval if (!dump) 19767b6859fbSMintz, Yuval return offset + total_len; 19777b6859fbSMintz, Yuval 1978be086e7cSMintz, Yuval while (reg_offset < total_len) { 19797b6859fbSMintz, Yuval u32 curr_len = min_t(u32, read_len, total_len - reg_offset); 19807b6859fbSMintz, Yuval 1981be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 1982be086e7cSMintz, Yuval p_ptt, 1983be086e7cSMintz, Yuval dump_buf + offset, 1984d52c89f1SMichal Kalderon dump, addr, curr_len, false, 1985d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 1986be086e7cSMintz, Yuval reg_offset += curr_len; 1987be086e7cSMintz, Yuval addr += curr_len; 19887b6859fbSMintz, Yuval 1989be086e7cSMintz, Yuval if (reg_offset < total_len) { 19907b6859fbSMintz, Yuval curr_len = min_t(u32, skip_len, total_len - skip_len); 19917b6859fbSMintz, Yuval memset(dump_buf + offset, 0, DWORDS_TO_BYTES(curr_len)); 1992be086e7cSMintz, Yuval offset += curr_len; 1993be086e7cSMintz, Yuval reg_offset += curr_len; 1994be086e7cSMintz, Yuval addr += curr_len; 1995be086e7cSMintz, Yuval } 1996be086e7cSMintz, Yuval } 1997c965db44STomer Tayar 1998c965db44STomer Tayar return offset; 1999c965db44STomer Tayar } 2000c965db44STomer Tayar 2001c965db44STomer Tayar /* Dumps GRC registers entries. Returns the dumped size in dwords. */ 2002c965db44STomer Tayar static u32 qed_grc_dump_regs_entries(struct qed_hwfn *p_hwfn, 2003c965db44STomer Tayar struct qed_ptt *p_ptt, 20042d22bc83SMichal Kalderon struct virt_mem_desc input_regs_arr, 2005c965db44STomer Tayar u32 *dump_buf, 2006c965db44STomer Tayar bool dump, 2007d52c89f1SMichal Kalderon enum init_split_types split_type, 2008d52c89f1SMichal Kalderon u8 split_id, 2009c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID], 2010c965db44STomer Tayar u32 *num_dumped_reg_entries) 2011c965db44STomer Tayar { 2012c965db44STomer Tayar u32 i, offset = 0, input_offset = 0; 2013c965db44STomer Tayar bool mode_match = true; 2014c965db44STomer Tayar 2015c965db44STomer Tayar *num_dumped_reg_entries = 0; 20167b6859fbSMintz, Yuval 20172d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(input_regs_arr.size)) { 2018c965db44STomer Tayar const struct dbg_dump_cond_hdr *cond_hdr = 2019c965db44STomer Tayar (const struct dbg_dump_cond_hdr *) 20202d22bc83SMichal Kalderon input_regs_arr.ptr + input_offset++; 20217b6859fbSMintz, Yuval u16 modes_buf_offset; 20227b6859fbSMintz, Yuval bool eval_mode; 2023c965db44STomer Tayar 2024c965db44STomer Tayar /* Check mode/block */ 20257b6859fbSMintz, Yuval eval_mode = GET_FIELD(cond_hdr->mode.data, 20267b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 2027c965db44STomer Tayar if (eval_mode) { 20287b6859fbSMintz, Yuval modes_buf_offset = 2029c965db44STomer Tayar GET_FIELD(cond_hdr->mode.data, 2030c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 2031c965db44STomer Tayar mode_match = qed_is_mode_match(p_hwfn, 2032c965db44STomer Tayar &modes_buf_offset); 2033c965db44STomer Tayar } 2034c965db44STomer Tayar 20357b6859fbSMintz, Yuval if (!mode_match || !block_enable[cond_hdr->block_id]) { 20367b6859fbSMintz, Yuval input_offset += cond_hdr->data_size; 20377b6859fbSMintz, Yuval continue; 20387b6859fbSMintz, Yuval } 20397b6859fbSMintz, Yuval 20407b6859fbSMintz, Yuval for (i = 0; i < cond_hdr->data_size; i++, input_offset++) { 2041c965db44STomer Tayar const struct dbg_dump_reg *reg = 2042c965db44STomer Tayar (const struct dbg_dump_reg *) 20432d22bc83SMichal Kalderon input_regs_arr.ptr + input_offset; 2044be086e7cSMintz, Yuval u32 addr, len; 20457b6859fbSMintz, Yuval bool wide_bus; 2046c965db44STomer Tayar 20477b6859fbSMintz, Yuval addr = GET_FIELD(reg->data, DBG_DUMP_REG_ADDRESS); 2048be086e7cSMintz, Yuval len = GET_FIELD(reg->data, DBG_DUMP_REG_LENGTH); 20497b6859fbSMintz, Yuval wide_bus = GET_FIELD(reg->data, DBG_DUMP_REG_WIDE_BUS); 20507b6859fbSMintz, Yuval offset += qed_grc_dump_reg_entry(p_hwfn, 20517b6859fbSMintz, Yuval p_ptt, 2052be086e7cSMintz, Yuval dump_buf + offset, 2053be086e7cSMintz, Yuval dump, 2054be086e7cSMintz, Yuval addr, 20557b6859fbSMintz, Yuval len, 2056d52c89f1SMichal Kalderon wide_bus, 2057d52c89f1SMichal Kalderon split_type, split_id); 2058c965db44STomer Tayar (*num_dumped_reg_entries)++; 2059c965db44STomer Tayar } 2060c965db44STomer Tayar } 2061c965db44STomer Tayar 2062c965db44STomer Tayar return offset; 2063c965db44STomer Tayar } 2064c965db44STomer Tayar 2065c965db44STomer Tayar /* Dumps GRC registers entries. Returns the dumped size in dwords. */ 2066c965db44STomer Tayar static u32 qed_grc_dump_split_data(struct qed_hwfn *p_hwfn, 2067c965db44STomer Tayar struct qed_ptt *p_ptt, 20682d22bc83SMichal Kalderon struct virt_mem_desc input_regs_arr, 2069c965db44STomer Tayar u32 *dump_buf, 2070c965db44STomer Tayar bool dump, 2071c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID], 2072d52c89f1SMichal Kalderon enum init_split_types split_type, 20732d22bc83SMichal Kalderon u8 split_id, const char *reg_type_name) 2074c965db44STomer Tayar { 2075d52c89f1SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 2076d52c89f1SMichal Kalderon enum init_split_types hdr_split_type = split_type; 2077c965db44STomer Tayar u32 num_dumped_reg_entries, offset; 2078d52c89f1SMichal Kalderon u8 hdr_split_id = split_id; 2079d52c89f1SMichal Kalderon 2080d52c89f1SMichal Kalderon /* In PORT_PF split type, print a port split header */ 2081d52c89f1SMichal Kalderon if (split_type == SPLIT_TYPE_PORT_PF) { 2082d52c89f1SMichal Kalderon hdr_split_type = SPLIT_TYPE_PORT; 2083d52c89f1SMichal Kalderon hdr_split_id = split_id / dev_data->num_pfs_per_port; 2084d52c89f1SMichal Kalderon } 2085c965db44STomer Tayar 2086c965db44STomer Tayar /* Calculate register dump header size (and skip it for now) */ 2087c965db44STomer Tayar offset = qed_grc_dump_regs_hdr(dump_buf, 2088c965db44STomer Tayar false, 2089c965db44STomer Tayar 0, 2090d52c89f1SMichal Kalderon hdr_split_type, 20912d22bc83SMichal Kalderon hdr_split_id, reg_type_name); 2092c965db44STomer Tayar 2093c965db44STomer Tayar /* Dump registers */ 2094c965db44STomer Tayar offset += qed_grc_dump_regs_entries(p_hwfn, 2095c965db44STomer Tayar p_ptt, 2096c965db44STomer Tayar input_regs_arr, 2097c965db44STomer Tayar dump_buf + offset, 2098c965db44STomer Tayar dump, 2099d52c89f1SMichal Kalderon split_type, 2100d52c89f1SMichal Kalderon split_id, 2101c965db44STomer Tayar block_enable, 2102c965db44STomer Tayar &num_dumped_reg_entries); 2103c965db44STomer Tayar 2104c965db44STomer Tayar /* Write register dump header */ 2105c965db44STomer Tayar if (dump && num_dumped_reg_entries > 0) 2106c965db44STomer Tayar qed_grc_dump_regs_hdr(dump_buf, 2107c965db44STomer Tayar dump, 2108c965db44STomer Tayar num_dumped_reg_entries, 2109d52c89f1SMichal Kalderon hdr_split_type, 21102d22bc83SMichal Kalderon hdr_split_id, reg_type_name); 2111c965db44STomer Tayar 2112c965db44STomer Tayar return num_dumped_reg_entries > 0 ? offset : 0; 2113c965db44STomer Tayar } 2114c965db44STomer Tayar 21157b6859fbSMintz, Yuval /* Dumps registers according to the input registers array. Returns the dumped 21167b6859fbSMintz, Yuval * size in dwords. 2117c965db44STomer Tayar */ 2118c965db44STomer Tayar static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn, 2119c965db44STomer Tayar struct qed_ptt *p_ptt, 2120c965db44STomer Tayar u32 *dump_buf, 2121c965db44STomer Tayar bool dump, 2122c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID], 21232d22bc83SMichal Kalderon const char *reg_type_name) 2124c965db44STomer Tayar { 21252d22bc83SMichal Kalderon struct virt_mem_desc *dbg_buf = 21262d22bc83SMichal Kalderon &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG]; 2127c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 2128c965db44STomer Tayar u32 offset = 0, input_offset = 0; 21292d22bc83SMichal Kalderon 21302d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) { 21317b6859fbSMintz, Yuval const struct dbg_dump_split_hdr *split_hdr; 21322d22bc83SMichal Kalderon struct virt_mem_desc curr_input_regs_arr; 2133d52c89f1SMichal Kalderon enum init_split_types split_type; 2134d52c89f1SMichal Kalderon u16 split_count = 0; 21357b6859fbSMintz, Yuval u32 split_data_size; 2136d52c89f1SMichal Kalderon u8 split_id; 21377b6859fbSMintz, Yuval 21387b6859fbSMintz, Yuval split_hdr = 2139c965db44STomer Tayar (const struct dbg_dump_split_hdr *) 21402d22bc83SMichal Kalderon dbg_buf->ptr + input_offset++; 2141d52c89f1SMichal Kalderon split_type = 21427b6859fbSMintz, Yuval GET_FIELD(split_hdr->hdr, 2143c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID); 21442d22bc83SMichal Kalderon split_data_size = GET_FIELD(split_hdr->hdr, 2145c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_DATA_SIZE); 21467b6859fbSMintz, Yuval curr_input_regs_arr.ptr = 21472d22bc83SMichal Kalderon (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr + 21482d22bc83SMichal Kalderon input_offset; 21492d22bc83SMichal Kalderon curr_input_regs_arr.size = DWORDS_TO_BYTES(split_data_size); 2150c965db44STomer Tayar 2151d52c89f1SMichal Kalderon switch (split_type) { 2152c965db44STomer Tayar case SPLIT_TYPE_NONE: 2153d52c89f1SMichal Kalderon split_count = 1; 2154c965db44STomer Tayar break; 2155c965db44STomer Tayar case SPLIT_TYPE_PORT: 2156d52c89f1SMichal Kalderon split_count = dev_data->num_ports; 2157c965db44STomer Tayar break; 2158c965db44STomer Tayar case SPLIT_TYPE_PF: 2159c965db44STomer Tayar case SPLIT_TYPE_PORT_PF: 2160d52c89f1SMichal Kalderon split_count = dev_data->num_ports * 2161d52c89f1SMichal Kalderon dev_data->num_pfs_per_port; 2162be086e7cSMintz, Yuval break; 2163be086e7cSMintz, Yuval case SPLIT_TYPE_VF: 2164d52c89f1SMichal Kalderon split_count = dev_data->num_vfs; 2165d52c89f1SMichal Kalderon break; 2166d52c89f1SMichal Kalderon default: 2167d52c89f1SMichal Kalderon return 0; 2168be086e7cSMintz, Yuval } 2169be086e7cSMintz, Yuval 2170d52c89f1SMichal Kalderon for (split_id = 0; split_id < split_count; split_id++) 2171d52c89f1SMichal Kalderon offset += qed_grc_dump_split_data(p_hwfn, p_ptt, 2172be086e7cSMintz, Yuval curr_input_regs_arr, 2173be086e7cSMintz, Yuval dump_buf + offset, 2174be086e7cSMintz, Yuval dump, block_enable, 2175d52c89f1SMichal Kalderon split_type, 2176d52c89f1SMichal Kalderon split_id, 21772d22bc83SMichal Kalderon reg_type_name); 2178c965db44STomer Tayar 2179c965db44STomer Tayar input_offset += split_data_size; 2180c965db44STomer Tayar } 2181c965db44STomer Tayar 2182d52c89f1SMichal Kalderon /* Cancel pretends (pretend to original PF) */ 2183be086e7cSMintz, Yuval if (dump) { 21842d22bc83SMichal Kalderon qed_fid_pretend(p_hwfn, p_ptt, 21852d22bc83SMichal Kalderon FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID, 21862d22bc83SMichal Kalderon p_hwfn->rel_pf_id)); 2187d52c89f1SMichal Kalderon dev_data->pretend.split_type = SPLIT_TYPE_NONE; 2188d52c89f1SMichal Kalderon dev_data->pretend.split_id = 0; 2189be086e7cSMintz, Yuval } 2190be086e7cSMintz, Yuval 2191c965db44STomer Tayar return offset; 2192c965db44STomer Tayar } 2193c965db44STomer Tayar 2194c965db44STomer Tayar /* Dump reset registers. Returns the dumped size in dwords. */ 2195c965db44STomer Tayar static u32 qed_grc_dump_reset_regs(struct qed_hwfn *p_hwfn, 2196c965db44STomer Tayar struct qed_ptt *p_ptt, 2197c965db44STomer Tayar u32 *dump_buf, bool dump) 2198c965db44STomer Tayar { 21992d22bc83SMichal Kalderon u32 offset = 0, num_regs = 0; 22002d22bc83SMichal Kalderon u8 reset_reg_id; 2201c965db44STomer Tayar 2202c965db44STomer Tayar /* Calculate header size */ 2203c965db44STomer Tayar offset += qed_grc_dump_regs_hdr(dump_buf, 22042d22bc83SMichal Kalderon false, 22052d22bc83SMichal Kalderon 0, SPLIT_TYPE_NONE, 0, "RESET_REGS"); 2206c965db44STomer Tayar 2207c965db44STomer Tayar /* Write reset registers */ 22082d22bc83SMichal Kalderon for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS; 22092d22bc83SMichal Kalderon reset_reg_id++) { 22102d22bc83SMichal Kalderon const struct dbg_reset_reg *reset_reg; 22112d22bc83SMichal Kalderon u32 reset_reg_addr; 22122d22bc83SMichal Kalderon 22132d22bc83SMichal Kalderon reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id); 22142d22bc83SMichal Kalderon 22152d22bc83SMichal Kalderon if (GET_FIELD(reset_reg->data, DBG_RESET_REG_IS_REMOVED)) 22167b6859fbSMintz, Yuval continue; 2217be086e7cSMintz, Yuval 22182d22bc83SMichal Kalderon reset_reg_addr = GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR); 2219c965db44STomer Tayar offset += qed_grc_dump_reg_entry(p_hwfn, 2220c965db44STomer Tayar p_ptt, 2221c965db44STomer Tayar dump_buf + offset, 2222c965db44STomer Tayar dump, 22232d22bc83SMichal Kalderon reset_reg_addr, 22242d22bc83SMichal Kalderon 1, false, SPLIT_TYPE_NONE, 0); 2225c965db44STomer Tayar num_regs++; 2226c965db44STomer Tayar } 2227c965db44STomer Tayar 2228c965db44STomer Tayar /* Write header */ 2229c965db44STomer Tayar if (dump) 2230c965db44STomer Tayar qed_grc_dump_regs_hdr(dump_buf, 2231d52c89f1SMichal Kalderon true, num_regs, SPLIT_TYPE_NONE, 22322d22bc83SMichal Kalderon 0, "RESET_REGS"); 22337b6859fbSMintz, Yuval 2234c965db44STomer Tayar return offset; 2235c965db44STomer Tayar } 2236c965db44STomer Tayar 22377b6859fbSMintz, Yuval /* Dump registers that are modified during GRC Dump and therefore must be 22387b6859fbSMintz, Yuval * dumped first. Returns the dumped size in dwords. 2239c965db44STomer Tayar */ 2240c965db44STomer Tayar static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn, 2241c965db44STomer Tayar struct qed_ptt *p_ptt, 2242c965db44STomer Tayar u32 *dump_buf, bool dump) 2243c965db44STomer Tayar { 2244c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 22452d22bc83SMichal Kalderon u32 block_id, offset = 0, stall_regs_offset; 22467b6859fbSMintz, Yuval const struct dbg_attn_reg *attn_reg_arr; 2247c965db44STomer Tayar u8 storm_id, reg_idx, num_attn_regs; 22482d22bc83SMichal Kalderon u32 num_reg_entries = 0; 2249c965db44STomer Tayar 22502d22bc83SMichal Kalderon /* Write empty header for attention registers */ 2251c965db44STomer Tayar offset += qed_grc_dump_regs_hdr(dump_buf, 22522d22bc83SMichal Kalderon false, 22532d22bc83SMichal Kalderon 0, SPLIT_TYPE_NONE, 0, "ATTN_REGS"); 2254c965db44STomer Tayar 2255c965db44STomer Tayar /* Write parity registers */ 22562d22bc83SMichal Kalderon for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) { 2257c965db44STomer Tayar if (dev_data->block_in_reset[block_id] && dump) 2258c965db44STomer Tayar continue; 2259c965db44STomer Tayar 22602d22bc83SMichal Kalderon attn_reg_arr = qed_get_block_attn_regs(p_hwfn, 22612d22bc83SMichal Kalderon (enum block_id)block_id, 2262c965db44STomer Tayar ATTN_TYPE_PARITY, 2263c965db44STomer Tayar &num_attn_regs); 22647b6859fbSMintz, Yuval 2265c965db44STomer Tayar for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) { 2266c965db44STomer Tayar const struct dbg_attn_reg *reg_data = 2267c965db44STomer Tayar &attn_reg_arr[reg_idx]; 2268c965db44STomer Tayar u16 modes_buf_offset; 2269c965db44STomer Tayar bool eval_mode; 2270be086e7cSMintz, Yuval u32 addr; 2271c965db44STomer Tayar 2272c965db44STomer Tayar /* Check mode */ 2273c965db44STomer Tayar eval_mode = GET_FIELD(reg_data->mode.data, 2274c965db44STomer Tayar DBG_MODE_HDR_EVAL_MODE) > 0; 2275c965db44STomer Tayar modes_buf_offset = 2276c965db44STomer Tayar GET_FIELD(reg_data->mode.data, 2277c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 22787b6859fbSMintz, Yuval if (eval_mode && 22797b6859fbSMintz, Yuval !qed_is_mode_match(p_hwfn, &modes_buf_offset)) 22807b6859fbSMintz, Yuval continue; 22817b6859fbSMintz, Yuval 22827b6859fbSMintz, Yuval /* Mode match: read & dump registers */ 2283be086e7cSMintz, Yuval addr = reg_data->mask_address; 22847b6859fbSMintz, Yuval offset += qed_grc_dump_reg_entry(p_hwfn, 2285c965db44STomer Tayar p_ptt, 2286c965db44STomer Tayar dump_buf + offset, 2287c965db44STomer Tayar dump, 2288be086e7cSMintz, Yuval addr, 2289d52c89f1SMichal Kalderon 1, false, 2290d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 2291be086e7cSMintz, Yuval addr = GET_FIELD(reg_data->data, 2292be086e7cSMintz, Yuval DBG_ATTN_REG_STS_ADDRESS); 22937b6859fbSMintz, Yuval offset += qed_grc_dump_reg_entry(p_hwfn, 2294c965db44STomer Tayar p_ptt, 2295c965db44STomer Tayar dump_buf + offset, 2296c965db44STomer Tayar dump, 2297be086e7cSMintz, Yuval addr, 2298d52c89f1SMichal Kalderon 1, false, 2299d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 2300c965db44STomer Tayar num_reg_entries += 2; 2301c965db44STomer Tayar } 2302c965db44STomer Tayar } 2303c965db44STomer Tayar 23042d22bc83SMichal Kalderon /* Overwrite header for attention registers */ 23052d22bc83SMichal Kalderon if (dump) 23062d22bc83SMichal Kalderon qed_grc_dump_regs_hdr(dump_buf, 23072d22bc83SMichal Kalderon true, 23082d22bc83SMichal Kalderon num_reg_entries, 23092d22bc83SMichal Kalderon SPLIT_TYPE_NONE, 0, "ATTN_REGS"); 23102d22bc83SMichal Kalderon 23112d22bc83SMichal Kalderon /* Write empty header for stall registers */ 23122d22bc83SMichal Kalderon stall_regs_offset = offset; 23132d22bc83SMichal Kalderon offset += qed_grc_dump_regs_hdr(dump_buf, 23142d22bc83SMichal Kalderon false, 0, SPLIT_TYPE_NONE, 0, "REGS"); 23152d22bc83SMichal Kalderon 23167b6859fbSMintz, Yuval /* Write Storm stall status registers */ 23172d22bc83SMichal Kalderon for (storm_id = 0, num_reg_entries = 0; storm_id < MAX_DBG_STORMS; 23182d22bc83SMichal Kalderon storm_id++) { 23197b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 2320be086e7cSMintz, Yuval u32 addr; 2321be086e7cSMintz, Yuval 23222d22bc83SMichal Kalderon if (dev_data->block_in_reset[storm->sem_block_id] && dump) 2323c965db44STomer Tayar continue; 2324c965db44STomer Tayar 2325be086e7cSMintz, Yuval addr = 23262d22bc83SMichal Kalderon BYTES_TO_DWORDS(storm->sem_fast_mem_addr + 2327be086e7cSMintz, Yuval SEM_FAST_REG_STALLED); 2328c965db44STomer Tayar offset += qed_grc_dump_reg_entry(p_hwfn, 2329c965db44STomer Tayar p_ptt, 2330c965db44STomer Tayar dump_buf + offset, 2331c965db44STomer Tayar dump, 2332be086e7cSMintz, Yuval addr, 23337b6859fbSMintz, Yuval 1, 2334d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 2335c965db44STomer Tayar num_reg_entries++; 2336c965db44STomer Tayar } 2337c965db44STomer Tayar 23382d22bc83SMichal Kalderon /* Overwrite header for stall registers */ 2339c965db44STomer Tayar if (dump) 23402d22bc83SMichal Kalderon qed_grc_dump_regs_hdr(dump_buf + stall_regs_offset, 2341c965db44STomer Tayar true, 23422d22bc83SMichal Kalderon num_reg_entries, 23432d22bc83SMichal Kalderon SPLIT_TYPE_NONE, 0, "REGS"); 23447b6859fbSMintz, Yuval 2345c965db44STomer Tayar return offset; 2346c965db44STomer Tayar } 2347c965db44STomer Tayar 2348be086e7cSMintz, Yuval /* Dumps registers that can't be represented in the debug arrays */ 2349be086e7cSMintz, Yuval static u32 qed_grc_dump_special_regs(struct qed_hwfn *p_hwfn, 2350be086e7cSMintz, Yuval struct qed_ptt *p_ptt, 2351be086e7cSMintz, Yuval u32 *dump_buf, bool dump) 2352be086e7cSMintz, Yuval { 2353be086e7cSMintz, Yuval u32 offset = 0, addr; 2354be086e7cSMintz, Yuval 2355be086e7cSMintz, Yuval offset += qed_grc_dump_regs_hdr(dump_buf, 23562d22bc83SMichal Kalderon dump, 2, SPLIT_TYPE_NONE, 0, "REGS"); 2357be086e7cSMintz, Yuval 2358be086e7cSMintz, Yuval /* Dump R/TDIF_REG_DEBUG_ERROR_INFO_SIZE (every 8'th register should be 2359be086e7cSMintz, Yuval * skipped). 2360be086e7cSMintz, Yuval */ 2361be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(RDIF_REG_DEBUG_ERROR_INFO); 2362be086e7cSMintz, Yuval offset += qed_grc_dump_reg_entry_skip(p_hwfn, 2363be086e7cSMintz, Yuval p_ptt, 2364be086e7cSMintz, Yuval dump_buf + offset, 2365be086e7cSMintz, Yuval dump, 2366be086e7cSMintz, Yuval addr, 2367be086e7cSMintz, Yuval RDIF_REG_DEBUG_ERROR_INFO_SIZE, 2368be086e7cSMintz, Yuval 7, 2369be086e7cSMintz, Yuval 1); 2370be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(TDIF_REG_DEBUG_ERROR_INFO); 2371be086e7cSMintz, Yuval offset += 2372be086e7cSMintz, Yuval qed_grc_dump_reg_entry_skip(p_hwfn, 2373be086e7cSMintz, Yuval p_ptt, 2374be086e7cSMintz, Yuval dump_buf + offset, 2375be086e7cSMintz, Yuval dump, 2376be086e7cSMintz, Yuval addr, 2377be086e7cSMintz, Yuval TDIF_REG_DEBUG_ERROR_INFO_SIZE, 2378be086e7cSMintz, Yuval 7, 2379be086e7cSMintz, Yuval 1); 2380be086e7cSMintz, Yuval 2381be086e7cSMintz, Yuval return offset; 2382be086e7cSMintz, Yuval } 2383be086e7cSMintz, Yuval 23847b6859fbSMintz, Yuval /* Dumps a GRC memory header (section and params). Returns the dumped size in 23857b6859fbSMintz, Yuval * dwords. The following parameters are dumped: 23867b6859fbSMintz, Yuval * - name: dumped only if it's not NULL. 23877b6859fbSMintz, Yuval * - addr: in dwords, dumped only if name is NULL. 23887b6859fbSMintz, Yuval * - len: in dwords, always dumped. 23897b6859fbSMintz, Yuval * - width: dumped if it's not zero. 23907b6859fbSMintz, Yuval * - packed: dumped only if it's not false. 23917b6859fbSMintz, Yuval * - mem_group: always dumped. 23927b6859fbSMintz, Yuval * - is_storm: true only if the memory is related to a Storm. 23937b6859fbSMintz, Yuval * - storm_letter: valid only if is_storm is true. 23947b6859fbSMintz, Yuval * 2395c965db44STomer Tayar */ 2396c965db44STomer Tayar static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn, 2397c965db44STomer Tayar u32 *dump_buf, 2398c965db44STomer Tayar bool dump, 2399c965db44STomer Tayar const char *name, 2400be086e7cSMintz, Yuval u32 addr, 2401be086e7cSMintz, Yuval u32 len, 2402c965db44STomer Tayar u32 bit_width, 2403c965db44STomer Tayar bool packed, 24042d22bc83SMichal Kalderon const char *mem_group, char storm_letter) 2405c965db44STomer Tayar { 2406c965db44STomer Tayar u8 num_params = 3; 2407c965db44STomer Tayar u32 offset = 0; 2408c965db44STomer Tayar char buf[64]; 2409c965db44STomer Tayar 2410be086e7cSMintz, Yuval if (!len) 2411c965db44STomer Tayar DP_NOTICE(p_hwfn, 2412c965db44STomer Tayar "Unexpected GRC Dump error: dumped memory size must be non-zero\n"); 24137b6859fbSMintz, Yuval 2414c965db44STomer Tayar if (bit_width) 2415c965db44STomer Tayar num_params++; 2416c965db44STomer Tayar if (packed) 2417c965db44STomer Tayar num_params++; 2418c965db44STomer Tayar 2419c965db44STomer Tayar /* Dump section header */ 2420c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 2421c965db44STomer Tayar dump, "grc_mem", num_params); 24227b6859fbSMintz, Yuval 2423c965db44STomer Tayar if (name) { 2424c965db44STomer Tayar /* Dump name */ 24252d22bc83SMichal Kalderon if (storm_letter) { 2426c965db44STomer Tayar strcpy(buf, "?STORM_"); 2427c965db44STomer Tayar buf[0] = storm_letter; 2428c965db44STomer Tayar strcpy(buf + strlen(buf), name); 2429c965db44STomer Tayar } else { 2430c965db44STomer Tayar strcpy(buf, name); 2431c965db44STomer Tayar } 2432c965db44STomer Tayar 2433c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 2434c965db44STomer Tayar dump, "name", buf); 2435c965db44STomer Tayar } else { 2436c965db44STomer Tayar /* Dump address */ 24377b6859fbSMintz, Yuval u32 addr_in_bytes = DWORDS_TO_BYTES(addr); 24387b6859fbSMintz, Yuval 2439c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 24407b6859fbSMintz, Yuval dump, "addr", addr_in_bytes); 2441c965db44STomer Tayar } 2442c965db44STomer Tayar 2443c965db44STomer Tayar /* Dump len */ 2444be086e7cSMintz, Yuval offset += qed_dump_num_param(dump_buf + offset, dump, "len", len); 2445c965db44STomer Tayar 2446c965db44STomer Tayar /* Dump bit width */ 2447c965db44STomer Tayar if (bit_width) 2448c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 2449c965db44STomer Tayar dump, "width", bit_width); 2450c965db44STomer Tayar 2451c965db44STomer Tayar /* Dump packed */ 2452c965db44STomer Tayar if (packed) 2453c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 2454c965db44STomer Tayar dump, "packed", 1); 2455c965db44STomer Tayar 2456c965db44STomer Tayar /* Dump reg type */ 24572d22bc83SMichal Kalderon if (storm_letter) { 2458c965db44STomer Tayar strcpy(buf, "?STORM_"); 2459c965db44STomer Tayar buf[0] = storm_letter; 2460c965db44STomer Tayar strcpy(buf + strlen(buf), mem_group); 2461c965db44STomer Tayar } else { 2462c965db44STomer Tayar strcpy(buf, mem_group); 2463c965db44STomer Tayar } 2464c965db44STomer Tayar 2465c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, dump, "type", buf); 24667b6859fbSMintz, Yuval 2467c965db44STomer Tayar return offset; 2468c965db44STomer Tayar } 2469c965db44STomer Tayar 2470c965db44STomer Tayar /* Dumps a single GRC memory. If name is NULL, the memory is stored by address. 2471c965db44STomer Tayar * Returns the dumped size in dwords. 24727b6859fbSMintz, Yuval * The addr and len arguments are specified in dwords. 2473c965db44STomer Tayar */ 2474c965db44STomer Tayar static u32 qed_grc_dump_mem(struct qed_hwfn *p_hwfn, 2475c965db44STomer Tayar struct qed_ptt *p_ptt, 2476c965db44STomer Tayar u32 *dump_buf, 2477c965db44STomer Tayar bool dump, 2478c965db44STomer Tayar const char *name, 2479be086e7cSMintz, Yuval u32 addr, 2480be086e7cSMintz, Yuval u32 len, 24817b6859fbSMintz, Yuval bool wide_bus, 2482c965db44STomer Tayar u32 bit_width, 2483c965db44STomer Tayar bool packed, 24842d22bc83SMichal Kalderon const char *mem_group, char storm_letter) 2485c965db44STomer Tayar { 2486c965db44STomer Tayar u32 offset = 0; 2487c965db44STomer Tayar 2488c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 2489c965db44STomer Tayar dump_buf + offset, 2490c965db44STomer Tayar dump, 2491c965db44STomer Tayar name, 2492be086e7cSMintz, Yuval addr, 2493be086e7cSMintz, Yuval len, 2494c965db44STomer Tayar bit_width, 24952d22bc83SMichal Kalderon packed, mem_group, storm_letter); 2496be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 2497be086e7cSMintz, Yuval p_ptt, 24987b6859fbSMintz, Yuval dump_buf + offset, 2499d52c89f1SMichal Kalderon dump, addr, len, wide_bus, 2500d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 25017b6859fbSMintz, Yuval 2502c965db44STomer Tayar return offset; 2503c965db44STomer Tayar } 2504c965db44STomer Tayar 2505c965db44STomer Tayar /* Dumps GRC memories entries. Returns the dumped size in dwords. */ 2506c965db44STomer Tayar static u32 qed_grc_dump_mem_entries(struct qed_hwfn *p_hwfn, 2507c965db44STomer Tayar struct qed_ptt *p_ptt, 25082d22bc83SMichal Kalderon struct virt_mem_desc input_mems_arr, 2509c965db44STomer Tayar u32 *dump_buf, bool dump) 2510c965db44STomer Tayar { 2511c965db44STomer Tayar u32 i, offset = 0, input_offset = 0; 2512c965db44STomer Tayar bool mode_match = true; 2513c965db44STomer Tayar 25142d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(input_mems_arr.size)) { 2515c965db44STomer Tayar const struct dbg_dump_cond_hdr *cond_hdr; 25167b6859fbSMintz, Yuval u16 modes_buf_offset; 2517c965db44STomer Tayar u32 num_entries; 2518c965db44STomer Tayar bool eval_mode; 2519c965db44STomer Tayar 25202d22bc83SMichal Kalderon cond_hdr = 25212d22bc83SMichal Kalderon (const struct dbg_dump_cond_hdr *)input_mems_arr.ptr + 25222d22bc83SMichal Kalderon input_offset++; 25237b6859fbSMintz, Yuval num_entries = cond_hdr->data_size / MEM_DUMP_ENTRY_SIZE_DWORDS; 2524c965db44STomer Tayar 2525c965db44STomer Tayar /* Check required mode */ 25267b6859fbSMintz, Yuval eval_mode = GET_FIELD(cond_hdr->mode.data, 25277b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 2528c965db44STomer Tayar if (eval_mode) { 25297b6859fbSMintz, Yuval modes_buf_offset = 2530c965db44STomer Tayar GET_FIELD(cond_hdr->mode.data, 2531c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 2532c965db44STomer Tayar mode_match = qed_is_mode_match(p_hwfn, 2533c965db44STomer Tayar &modes_buf_offset); 2534c965db44STomer Tayar } 2535c965db44STomer Tayar 2536c965db44STomer Tayar if (!mode_match) { 2537c965db44STomer Tayar input_offset += cond_hdr->data_size; 2538c965db44STomer Tayar continue; 2539c965db44STomer Tayar } 2540c965db44STomer Tayar 2541c965db44STomer Tayar for (i = 0; i < num_entries; 2542c965db44STomer Tayar i++, input_offset += MEM_DUMP_ENTRY_SIZE_DWORDS) { 2543c965db44STomer Tayar const struct dbg_dump_mem *mem = 25442d22bc83SMichal Kalderon (const struct dbg_dump_mem *)((u32 *) 25452d22bc83SMichal Kalderon input_mems_arr.ptr 25462d22bc83SMichal Kalderon + input_offset); 25472d22bc83SMichal Kalderon const struct dbg_block *block; 25482d22bc83SMichal Kalderon char storm_letter = 0; 25497b6859fbSMintz, Yuval u32 mem_addr, mem_len; 25502d22bc83SMichal Kalderon bool mem_wide_bus; 25512d22bc83SMichal Kalderon u8 mem_group_id; 25527b6859fbSMintz, Yuval 25532d22bc83SMichal Kalderon mem_group_id = GET_FIELD(mem->dword0, 25542d22bc83SMichal Kalderon DBG_DUMP_MEM_MEM_GROUP_ID); 2555c965db44STomer Tayar if (mem_group_id >= MEM_GROUPS_NUM) { 2556c965db44STomer Tayar DP_NOTICE(p_hwfn, "Invalid mem_group_id\n"); 2557c965db44STomer Tayar return 0; 2558c965db44STomer Tayar } 2559c965db44STomer Tayar 25607b6859fbSMintz, Yuval if (!qed_grc_is_mem_included(p_hwfn, 25612d22bc83SMichal Kalderon (enum block_id) 25622d22bc83SMichal Kalderon cond_hdr->block_id, 25637b6859fbSMintz, Yuval mem_group_id)) 25647b6859fbSMintz, Yuval continue; 25657b6859fbSMintz, Yuval 25667b6859fbSMintz, Yuval mem_addr = GET_FIELD(mem->dword0, DBG_DUMP_MEM_ADDRESS); 25677b6859fbSMintz, Yuval mem_len = GET_FIELD(mem->dword1, DBG_DUMP_MEM_LENGTH); 25687b6859fbSMintz, Yuval mem_wide_bus = GET_FIELD(mem->dword1, 25697b6859fbSMintz, Yuval DBG_DUMP_MEM_WIDE_BUS); 2570c965db44STomer Tayar 25712d22bc83SMichal Kalderon block = get_dbg_block(p_hwfn, 25722d22bc83SMichal Kalderon cond_hdr->block_id); 25732d22bc83SMichal Kalderon 25742d22bc83SMichal Kalderon /* If memory is associated with Storm, 25752d22bc83SMichal Kalderon * update storm details 2576c965db44STomer Tayar */ 25772d22bc83SMichal Kalderon if (block->associated_storm_letter) 25782d22bc83SMichal Kalderon storm_letter = block->associated_storm_letter; 2579c965db44STomer Tayar 2580c965db44STomer Tayar /* Dump memory */ 25817b6859fbSMintz, Yuval offset += qed_grc_dump_mem(p_hwfn, 25827b6859fbSMintz, Yuval p_ptt, 25837b6859fbSMintz, Yuval dump_buf + offset, 25847b6859fbSMintz, Yuval dump, 25857b6859fbSMintz, Yuval NULL, 25867b6859fbSMintz, Yuval mem_addr, 25877b6859fbSMintz, Yuval mem_len, 25887b6859fbSMintz, Yuval mem_wide_bus, 25897b6859fbSMintz, Yuval 0, 2590c965db44STomer Tayar false, 2591c965db44STomer Tayar s_mem_group_names[mem_group_id], 25927b6859fbSMintz, Yuval storm_letter); 2593c965db44STomer Tayar } 2594c965db44STomer Tayar } 2595c965db44STomer Tayar 2596c965db44STomer Tayar return offset; 2597c965db44STomer Tayar } 2598c965db44STomer Tayar 2599c965db44STomer Tayar /* Dumps GRC memories according to the input array dump_mem. 2600c965db44STomer Tayar * Returns the dumped size in dwords. 2601c965db44STomer Tayar */ 2602c965db44STomer Tayar static u32 qed_grc_dump_memories(struct qed_hwfn *p_hwfn, 2603c965db44STomer Tayar struct qed_ptt *p_ptt, 2604c965db44STomer Tayar u32 *dump_buf, bool dump) 2605c965db44STomer Tayar { 26062d22bc83SMichal Kalderon struct virt_mem_desc *dbg_buf = 26072d22bc83SMichal Kalderon &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM]; 2608c965db44STomer Tayar u32 offset = 0, input_offset = 0; 2609c965db44STomer Tayar 26102d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) { 26117b6859fbSMintz, Yuval const struct dbg_dump_split_hdr *split_hdr; 26122d22bc83SMichal Kalderon struct virt_mem_desc curr_input_mems_arr; 2613d52c89f1SMichal Kalderon enum init_split_types split_type; 26147b6859fbSMintz, Yuval u32 split_data_size; 26157b6859fbSMintz, Yuval 26162d22bc83SMichal Kalderon split_hdr = 26172d22bc83SMichal Kalderon (const struct dbg_dump_split_hdr *)dbg_buf->ptr + 26182d22bc83SMichal Kalderon input_offset++; 26192d22bc83SMichal Kalderon split_type = GET_FIELD(split_hdr->hdr, 2620c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID); 26212d22bc83SMichal Kalderon split_data_size = GET_FIELD(split_hdr->hdr, 2622c965db44STomer Tayar DBG_DUMP_SPLIT_HDR_DATA_SIZE); 26232d22bc83SMichal Kalderon curr_input_mems_arr.ptr = (u32 *)dbg_buf->ptr + input_offset; 26242d22bc83SMichal Kalderon curr_input_mems_arr.size = DWORDS_TO_BYTES(split_data_size); 2625c965db44STomer Tayar 2626d52c89f1SMichal Kalderon if (split_type == SPLIT_TYPE_NONE) 2627c965db44STomer Tayar offset += qed_grc_dump_mem_entries(p_hwfn, 2628c965db44STomer Tayar p_ptt, 2629c965db44STomer Tayar curr_input_mems_arr, 2630c965db44STomer Tayar dump_buf + offset, 2631c965db44STomer Tayar dump); 2632d52c89f1SMichal Kalderon else 2633c965db44STomer Tayar DP_NOTICE(p_hwfn, 2634c965db44STomer Tayar "Dumping split memories is currently not supported\n"); 2635c965db44STomer Tayar 2636c965db44STomer Tayar input_offset += split_data_size; 2637c965db44STomer Tayar } 2638c965db44STomer Tayar 2639c965db44STomer Tayar return offset; 2640c965db44STomer Tayar } 2641c965db44STomer Tayar 2642c965db44STomer Tayar /* Dumps GRC context data for the specified Storm. 2643c965db44STomer Tayar * Returns the dumped size in dwords. 26447b6859fbSMintz, Yuval * The lid_size argument is specified in quad-regs. 2645c965db44STomer Tayar */ 2646c965db44STomer Tayar static u32 qed_grc_dump_ctx_data(struct qed_hwfn *p_hwfn, 2647c965db44STomer Tayar struct qed_ptt *p_ptt, 2648c965db44STomer Tayar u32 *dump_buf, 2649c965db44STomer Tayar bool dump, 2650c965db44STomer Tayar const char *name, 2651c965db44STomer Tayar u32 num_lids, 26522d22bc83SMichal Kalderon enum cm_ctx_types ctx_type, u8 storm_id) 2653c965db44STomer Tayar { 26542d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 26557b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 26562d22bc83SMichal Kalderon u32 i, lid, lid_size, total_size; 26572d22bc83SMichal Kalderon u32 rd_reg_addr, offset = 0; 26582d22bc83SMichal Kalderon 26592d22bc83SMichal Kalderon /* Convert quad-regs to dwords */ 26602d22bc83SMichal Kalderon lid_size = storm->cm_ctx_lid_sizes[dev_data->chip_id][ctx_type] * 4; 2661c965db44STomer Tayar 2662c965db44STomer Tayar if (!lid_size) 2663c965db44STomer Tayar return 0; 26647b6859fbSMintz, Yuval 2665c965db44STomer Tayar total_size = num_lids * lid_size; 26667b6859fbSMintz, Yuval 2667c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 2668c965db44STomer Tayar dump_buf + offset, 2669c965db44STomer Tayar dump, 2670c965db44STomer Tayar name, 2671c965db44STomer Tayar 0, 2672c965db44STomer Tayar total_size, 2673c965db44STomer Tayar lid_size * 32, 26742d22bc83SMichal Kalderon false, name, storm->letter); 26757b6859fbSMintz, Yuval 26767b6859fbSMintz, Yuval if (!dump) 26777b6859fbSMintz, Yuval return offset + total_size; 2678c965db44STomer Tayar 26792d22bc83SMichal Kalderon rd_reg_addr = BYTES_TO_DWORDS(storm->cm_ctx_rd_addr[ctx_type]); 26802d22bc83SMichal Kalderon 2681c965db44STomer Tayar /* Dump context data */ 2682c965db44STomer Tayar for (lid = 0; lid < num_lids; lid++) { 26832d22bc83SMichal Kalderon for (i = 0; i < lid_size; i++) { 2684c965db44STomer Tayar qed_wr(p_hwfn, 26857b6859fbSMintz, Yuval p_ptt, storm->cm_ctx_wr_addr, (i << 9) | lid); 26862d22bc83SMichal Kalderon offset += qed_grc_dump_addr_range(p_hwfn, 26872d22bc83SMichal Kalderon p_ptt, 26882d22bc83SMichal Kalderon dump_buf + offset, 26892d22bc83SMichal Kalderon dump, 26902d22bc83SMichal Kalderon rd_reg_addr, 26912d22bc83SMichal Kalderon 1, 26922d22bc83SMichal Kalderon false, 26932d22bc83SMichal Kalderon SPLIT_TYPE_NONE, 0); 2694c965db44STomer Tayar } 2695c965db44STomer Tayar } 2696c965db44STomer Tayar 2697c965db44STomer Tayar return offset; 2698c965db44STomer Tayar } 2699c965db44STomer Tayar 2700c965db44STomer Tayar /* Dumps GRC contexts. Returns the dumped size in dwords. */ 2701c965db44STomer Tayar static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn, 2702c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 2703c965db44STomer Tayar { 2704c965db44STomer Tayar u32 offset = 0; 2705c965db44STomer Tayar u8 storm_id; 2706c965db44STomer Tayar 2707c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 2708c965db44STomer Tayar if (!qed_grc_is_storm_included(p_hwfn, 2709c965db44STomer Tayar (enum dbg_storms)storm_id)) 2710c965db44STomer Tayar continue; 2711c965db44STomer Tayar 2712c965db44STomer Tayar /* Dump Conn AG context size */ 27132d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2714c965db44STomer Tayar p_ptt, 2715c965db44STomer Tayar dump_buf + offset, 2716c965db44STomer Tayar dump, 2717c965db44STomer Tayar "CONN_AG_CTX", 27182d22bc83SMichal Kalderon NUM_OF_LCIDS, 27192d22bc83SMichal Kalderon CM_CTX_CONN_AG, storm_id); 2720c965db44STomer Tayar 2721c965db44STomer Tayar /* Dump Conn ST context size */ 27222d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2723c965db44STomer Tayar p_ptt, 2724c965db44STomer Tayar dump_buf + offset, 2725c965db44STomer Tayar dump, 2726c965db44STomer Tayar "CONN_ST_CTX", 27272d22bc83SMichal Kalderon NUM_OF_LCIDS, 27282d22bc83SMichal Kalderon CM_CTX_CONN_ST, storm_id); 2729c965db44STomer Tayar 2730c965db44STomer Tayar /* Dump Task AG context size */ 27312d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2732c965db44STomer Tayar p_ptt, 2733c965db44STomer Tayar dump_buf + offset, 2734c965db44STomer Tayar dump, 2735c965db44STomer Tayar "TASK_AG_CTX", 27362d22bc83SMichal Kalderon NUM_OF_LTIDS, 27372d22bc83SMichal Kalderon CM_CTX_TASK_AG, storm_id); 2738c965db44STomer Tayar 2739c965db44STomer Tayar /* Dump Task ST context size */ 27402d22bc83SMichal Kalderon offset += qed_grc_dump_ctx_data(p_hwfn, 2741c965db44STomer Tayar p_ptt, 2742c965db44STomer Tayar dump_buf + offset, 2743c965db44STomer Tayar dump, 2744c965db44STomer Tayar "TASK_ST_CTX", 27452d22bc83SMichal Kalderon NUM_OF_LTIDS, 27462d22bc83SMichal Kalderon CM_CTX_TASK_ST, storm_id); 2747c965db44STomer Tayar } 2748c965db44STomer Tayar 2749c965db44STomer Tayar return offset; 2750c965db44STomer Tayar } 2751c965db44STomer Tayar 27522d22bc83SMichal Kalderon #define VFC_STATUS_RESP_READY_BIT 0 27532d22bc83SMichal Kalderon #define VFC_STATUS_BUSY_BIT 1 27542d22bc83SMichal Kalderon #define VFC_STATUS_SENDING_CMD_BIT 2 27552d22bc83SMichal Kalderon 27562d22bc83SMichal Kalderon #define VFC_POLLING_DELAY_MS 1 27572d22bc83SMichal Kalderon #define VFC_POLLING_COUNT 20 27582d22bc83SMichal Kalderon 27592d22bc83SMichal Kalderon /* Reads data from VFC. Returns the number of dwords read (0 on error). 27602d22bc83SMichal Kalderon * Sizes are specified in dwords. 27612d22bc83SMichal Kalderon */ 27622d22bc83SMichal Kalderon static u32 qed_grc_dump_read_from_vfc(struct qed_hwfn *p_hwfn, 27632d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 27642d22bc83SMichal Kalderon struct storm_defs *storm, 27652d22bc83SMichal Kalderon u32 *cmd_data, 27662d22bc83SMichal Kalderon u32 cmd_size, 27672d22bc83SMichal Kalderon u32 *addr_data, 27682d22bc83SMichal Kalderon u32 addr_size, 27692d22bc83SMichal Kalderon u32 resp_size, u32 *dump_buf) 2770c965db44STomer Tayar { 27712d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 27722d22bc83SMichal Kalderon u32 vfc_status, polling_ms, polling_count = 0, i; 27732d22bc83SMichal Kalderon u32 reg_addr, sem_base; 27742d22bc83SMichal Kalderon bool is_ready = false; 2775c965db44STomer Tayar 27762d22bc83SMichal Kalderon sem_base = storm->sem_fast_mem_addr; 27772d22bc83SMichal Kalderon polling_ms = VFC_POLLING_DELAY_MS * 27782d22bc83SMichal Kalderon s_hw_type_defs[dev_data->hw_type].delay_factor; 2779c965db44STomer Tayar 27802d22bc83SMichal Kalderon /* Write VFC command */ 27812d22bc83SMichal Kalderon ARR_REG_WR(p_hwfn, 2782c965db44STomer Tayar p_ptt, 27832d22bc83SMichal Kalderon sem_base + SEM_FAST_REG_VFC_DATA_WR, 27842d22bc83SMichal Kalderon cmd_data, cmd_size); 27852d22bc83SMichal Kalderon 27862d22bc83SMichal Kalderon /* Write VFC address */ 27872d22bc83SMichal Kalderon ARR_REG_WR(p_hwfn, 27882d22bc83SMichal Kalderon p_ptt, 27892d22bc83SMichal Kalderon sem_base + SEM_FAST_REG_VFC_ADDR, 27902d22bc83SMichal Kalderon addr_data, addr_size); 27912d22bc83SMichal Kalderon 27922d22bc83SMichal Kalderon /* Read response */ 27932d22bc83SMichal Kalderon for (i = 0; i < resp_size; i++) { 27942d22bc83SMichal Kalderon /* Poll until ready */ 27952d22bc83SMichal Kalderon do { 27962d22bc83SMichal Kalderon reg_addr = sem_base + SEM_FAST_REG_VFC_STATUS; 27972d22bc83SMichal Kalderon qed_grc_dump_addr_range(p_hwfn, 27982d22bc83SMichal Kalderon p_ptt, 27992d22bc83SMichal Kalderon &vfc_status, 2800c965db44STomer Tayar true, 28012d22bc83SMichal Kalderon BYTES_TO_DWORDS(reg_addr), 28022d22bc83SMichal Kalderon 1, 28032d22bc83SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 28042d22bc83SMichal Kalderon is_ready = vfc_status & BIT(VFC_STATUS_RESP_READY_BIT); 28052d22bc83SMichal Kalderon 28062d22bc83SMichal Kalderon if (!is_ready) { 28072d22bc83SMichal Kalderon if (polling_count++ == VFC_POLLING_COUNT) 28082d22bc83SMichal Kalderon return 0; 28092d22bc83SMichal Kalderon 28102d22bc83SMichal Kalderon msleep(polling_ms); 2811c965db44STomer Tayar } 28122d22bc83SMichal Kalderon } while (!is_ready); 28132d22bc83SMichal Kalderon 28142d22bc83SMichal Kalderon reg_addr = sem_base + SEM_FAST_REG_VFC_DATA_RD; 28152d22bc83SMichal Kalderon qed_grc_dump_addr_range(p_hwfn, 28162d22bc83SMichal Kalderon p_ptt, 28172d22bc83SMichal Kalderon dump_buf + i, 28182d22bc83SMichal Kalderon true, 28192d22bc83SMichal Kalderon BYTES_TO_DWORDS(reg_addr), 28202d22bc83SMichal Kalderon 1, false, SPLIT_TYPE_NONE, 0); 2821c965db44STomer Tayar } 2822c965db44STomer Tayar 28232d22bc83SMichal Kalderon return resp_size; 2824c965db44STomer Tayar } 2825c965db44STomer Tayar 2826c965db44STomer Tayar /* Dump VFC CAM. Returns the dumped size in dwords. */ 2827c965db44STomer Tayar static u32 qed_grc_dump_vfc_cam(struct qed_hwfn *p_hwfn, 2828c965db44STomer Tayar struct qed_ptt *p_ptt, 2829c965db44STomer Tayar u32 *dump_buf, bool dump, u8 storm_id) 2830c965db44STomer Tayar { 2831c965db44STomer Tayar u32 total_size = VFC_CAM_NUM_ROWS * VFC_CAM_RESP_DWORDS; 28327b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 2833c965db44STomer Tayar u32 cam_addr[VFC_CAM_ADDR_DWORDS] = { 0 }; 2834c965db44STomer Tayar u32 cam_cmd[VFC_CAM_CMD_DWORDS] = { 0 }; 28352d22bc83SMichal Kalderon u32 row, offset = 0; 2836c965db44STomer Tayar 2837c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 2838c965db44STomer Tayar dump_buf + offset, 2839c965db44STomer Tayar dump, 2840c965db44STomer Tayar "vfc_cam", 2841c965db44STomer Tayar 0, 2842c965db44STomer Tayar total_size, 2843c965db44STomer Tayar 256, 28442d22bc83SMichal Kalderon false, "vfc_cam", storm->letter); 28457b6859fbSMintz, Yuval 28467b6859fbSMintz, Yuval if (!dump) 28477b6859fbSMintz, Yuval return offset + total_size; 28487b6859fbSMintz, Yuval 2849c965db44STomer Tayar /* Prepare CAM address */ 2850c965db44STomer Tayar SET_VAR_FIELD(cam_addr, VFC_CAM_ADDR, OP, VFC_OPCODE_CAM_RD); 28517b6859fbSMintz, Yuval 28522d22bc83SMichal Kalderon /* Read VFC CAM data */ 28532d22bc83SMichal Kalderon for (row = 0; row < VFC_CAM_NUM_ROWS; row++) { 2854c965db44STomer Tayar SET_VAR_FIELD(cam_cmd, VFC_CAM_CMD, ROW, row); 28552d22bc83SMichal Kalderon offset += qed_grc_dump_read_from_vfc(p_hwfn, 2856c965db44STomer Tayar p_ptt, 28572d22bc83SMichal Kalderon storm, 28582d22bc83SMichal Kalderon cam_cmd, 28592d22bc83SMichal Kalderon VFC_CAM_CMD_DWORDS, 28602d22bc83SMichal Kalderon cam_addr, 28612d22bc83SMichal Kalderon VFC_CAM_ADDR_DWORDS, 28622d22bc83SMichal Kalderon VFC_CAM_RESP_DWORDS, 28632d22bc83SMichal Kalderon dump_buf + offset); 2864c965db44STomer Tayar } 2865c965db44STomer Tayar 2866c965db44STomer Tayar return offset; 2867c965db44STomer Tayar } 2868c965db44STomer Tayar 2869c965db44STomer Tayar /* Dump VFC RAM. Returns the dumped size in dwords. */ 2870c965db44STomer Tayar static u32 qed_grc_dump_vfc_ram(struct qed_hwfn *p_hwfn, 2871c965db44STomer Tayar struct qed_ptt *p_ptt, 2872c965db44STomer Tayar u32 *dump_buf, 2873c965db44STomer Tayar bool dump, 2874c965db44STomer Tayar u8 storm_id, struct vfc_ram_defs *ram_defs) 2875c965db44STomer Tayar { 2876c965db44STomer Tayar u32 total_size = ram_defs->num_rows * VFC_RAM_RESP_DWORDS; 28777b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 2878c965db44STomer Tayar u32 ram_addr[VFC_RAM_ADDR_DWORDS] = { 0 }; 2879c965db44STomer Tayar u32 ram_cmd[VFC_RAM_CMD_DWORDS] = { 0 }; 28802d22bc83SMichal Kalderon u32 row, offset = 0; 2881c965db44STomer Tayar 2882c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 2883c965db44STomer Tayar dump_buf + offset, 2884c965db44STomer Tayar dump, 2885c965db44STomer Tayar ram_defs->mem_name, 2886c965db44STomer Tayar 0, 2887c965db44STomer Tayar total_size, 2888c965db44STomer Tayar 256, 2889c965db44STomer Tayar false, 2890c965db44STomer Tayar ram_defs->type_name, 28912d22bc83SMichal Kalderon storm->letter); 2892c965db44STomer Tayar 2893c965db44STomer Tayar if (!dump) 2894c965db44STomer Tayar return offset + total_size; 2895c965db44STomer Tayar 28962d22bc83SMichal Kalderon /* Prepare RAM address */ 28972d22bc83SMichal Kalderon SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, OP, VFC_OPCODE_RAM_RD); 28982d22bc83SMichal Kalderon 28992d22bc83SMichal Kalderon /* Read VFC RAM data */ 2900c965db44STomer Tayar for (row = ram_defs->base_row; 29012d22bc83SMichal Kalderon row < ram_defs->base_row + ram_defs->num_rows; row++) { 2902c965db44STomer Tayar SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, ROW, row); 29032d22bc83SMichal Kalderon offset += qed_grc_dump_read_from_vfc(p_hwfn, 2904c965db44STomer Tayar p_ptt, 29052d22bc83SMichal Kalderon storm, 29062d22bc83SMichal Kalderon ram_cmd, 29072d22bc83SMichal Kalderon VFC_RAM_CMD_DWORDS, 29082d22bc83SMichal Kalderon ram_addr, 29092d22bc83SMichal Kalderon VFC_RAM_ADDR_DWORDS, 29102d22bc83SMichal Kalderon VFC_RAM_RESP_DWORDS, 29112d22bc83SMichal Kalderon dump_buf + offset); 2912c965db44STomer Tayar } 2913c965db44STomer Tayar 2914c965db44STomer Tayar return offset; 2915c965db44STomer Tayar } 2916c965db44STomer Tayar 2917c965db44STomer Tayar /* Dumps GRC VFC data. Returns the dumped size in dwords. */ 2918c965db44STomer Tayar static u32 qed_grc_dump_vfc(struct qed_hwfn *p_hwfn, 2919c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 2920c965db44STomer Tayar { 2921c965db44STomer Tayar u8 storm_id, i; 2922c965db44STomer Tayar u32 offset = 0; 2923c965db44STomer Tayar 2924c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 29257b6859fbSMintz, Yuval if (!qed_grc_is_storm_included(p_hwfn, 29267b6859fbSMintz, Yuval (enum dbg_storms)storm_id) || 29272d22bc83SMichal Kalderon !s_storm_defs[storm_id].has_vfc) 29287b6859fbSMintz, Yuval continue; 29297b6859fbSMintz, Yuval 2930c965db44STomer Tayar /* Read CAM */ 2931c965db44STomer Tayar offset += qed_grc_dump_vfc_cam(p_hwfn, 2932c965db44STomer Tayar p_ptt, 2933c965db44STomer Tayar dump_buf + offset, 2934c965db44STomer Tayar dump, storm_id); 2935c965db44STomer Tayar 2936c965db44STomer Tayar /* Read RAM */ 2937c965db44STomer Tayar for (i = 0; i < NUM_VFC_RAM_TYPES; i++) 2938c965db44STomer Tayar offset += qed_grc_dump_vfc_ram(p_hwfn, 2939c965db44STomer Tayar p_ptt, 29407b6859fbSMintz, Yuval dump_buf + offset, 2941c965db44STomer Tayar dump, 2942c965db44STomer Tayar storm_id, 29437b6859fbSMintz, Yuval &s_vfc_ram_defs[i]); 2944c965db44STomer Tayar } 2945c965db44STomer Tayar 2946c965db44STomer Tayar return offset; 2947c965db44STomer Tayar } 2948c965db44STomer Tayar 2949c965db44STomer Tayar /* Dumps GRC RSS data. Returns the dumped size in dwords. */ 2950c965db44STomer Tayar static u32 qed_grc_dump_rss(struct qed_hwfn *p_hwfn, 2951c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 2952c965db44STomer Tayar { 2953c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 2954c965db44STomer Tayar u32 offset = 0; 2955c965db44STomer Tayar u8 rss_mem_id; 2956c965db44STomer Tayar 2957c965db44STomer Tayar for (rss_mem_id = 0; rss_mem_id < NUM_RSS_MEM_TYPES; rss_mem_id++) { 2958da090917STomer Tayar u32 rss_addr, num_entries, total_dwords; 29597b6859fbSMintz, Yuval struct rss_mem_defs *rss_defs; 2960da090917STomer Tayar u32 addr, num_dwords_to_read; 29617b6859fbSMintz, Yuval bool packed; 29627b6859fbSMintz, Yuval 29637b6859fbSMintz, Yuval rss_defs = &s_rss_mem_defs[rss_mem_id]; 29647b6859fbSMintz, Yuval rss_addr = rss_defs->addr; 29657b6859fbSMintz, Yuval num_entries = rss_defs->num_entries[dev_data->chip_id]; 2966da090917STomer Tayar total_dwords = (num_entries * rss_defs->entry_width) / 32; 2967da090917STomer Tayar packed = (rss_defs->entry_width == 16); 2968c965db44STomer Tayar 2969c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 2970c965db44STomer Tayar dump_buf + offset, 2971c965db44STomer Tayar dump, 2972c965db44STomer Tayar rss_defs->mem_name, 2973be086e7cSMintz, Yuval 0, 2974be086e7cSMintz, Yuval total_dwords, 2975da090917STomer Tayar rss_defs->entry_width, 2976c965db44STomer Tayar packed, 29772d22bc83SMichal Kalderon rss_defs->type_name, 0); 2978c965db44STomer Tayar 29797b6859fbSMintz, Yuval /* Dump RSS data */ 2980c965db44STomer Tayar if (!dump) { 2981be086e7cSMintz, Yuval offset += total_dwords; 2982c965db44STomer Tayar continue; 2983c965db44STomer Tayar } 2984c965db44STomer Tayar 2985be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(RSS_REG_RSS_RAM_DATA); 2986da090917STomer Tayar while (total_dwords) { 2987da090917STomer Tayar num_dwords_to_read = min_t(u32, 2988da090917STomer Tayar RSS_REG_RSS_RAM_DATA_SIZE, 2989da090917STomer Tayar total_dwords); 2990be086e7cSMintz, Yuval qed_wr(p_hwfn, p_ptt, RSS_REG_RSS_RAM_ADDR, rss_addr); 2991be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 2992be086e7cSMintz, Yuval p_ptt, 29937b6859fbSMintz, Yuval dump_buf + offset, 2994be086e7cSMintz, Yuval dump, 2995be086e7cSMintz, Yuval addr, 2996da090917STomer Tayar num_dwords_to_read, 2997d52c89f1SMichal Kalderon false, 2998d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 2999da090917STomer Tayar total_dwords -= num_dwords_to_read; 3000da090917STomer Tayar rss_addr++; 3001c965db44STomer Tayar } 3002c965db44STomer Tayar } 3003c965db44STomer Tayar 3004c965db44STomer Tayar return offset; 3005c965db44STomer Tayar } 3006c965db44STomer Tayar 3007c965db44STomer Tayar /* Dumps GRC Big RAM. Returns the dumped size in dwords. */ 3008c965db44STomer Tayar static u32 qed_grc_dump_big_ram(struct qed_hwfn *p_hwfn, 3009c965db44STomer Tayar struct qed_ptt *p_ptt, 3010c965db44STomer Tayar u32 *dump_buf, bool dump, u8 big_ram_id) 3011c965db44STomer Tayar { 3012c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 3013da090917STomer Tayar u32 block_size, ram_size, offset = 0, reg_val, i; 3014c965db44STomer Tayar char mem_name[12] = "???_BIG_RAM"; 3015c965db44STomer Tayar char type_name[8] = "???_RAM"; 3016be086e7cSMintz, Yuval struct big_ram_defs *big_ram; 3017c965db44STomer Tayar 3018be086e7cSMintz, Yuval big_ram = &s_big_ram_defs[big_ram_id]; 3019da090917STomer Tayar ram_size = big_ram->ram_size[dev_data->chip_id]; 3020da090917STomer Tayar 3021da090917STomer Tayar reg_val = qed_rd(p_hwfn, p_ptt, big_ram->is_256b_reg_addr); 3022da090917STomer Tayar block_size = reg_val & 3023da090917STomer Tayar BIT(big_ram->is_256b_bit_offset[dev_data->chip_id]) ? 256 3024da090917STomer Tayar : 128; 3025c965db44STomer Tayar 3026c7d852e3SDenis Bolotin strncpy(type_name, big_ram->instance_name, BIG_RAM_NAME_LEN); 3027c7d852e3SDenis Bolotin strncpy(mem_name, big_ram->instance_name, BIG_RAM_NAME_LEN); 3028c965db44STomer Tayar 3029c965db44STomer Tayar /* Dump memory header */ 3030c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3031c965db44STomer Tayar dump_buf + offset, 3032c965db44STomer Tayar dump, 3033c965db44STomer Tayar mem_name, 3034c965db44STomer Tayar 0, 3035c965db44STomer Tayar ram_size, 3036da090917STomer Tayar block_size * 8, 30372d22bc83SMichal Kalderon false, type_name, 0); 3038c965db44STomer Tayar 30397b6859fbSMintz, Yuval /* Read and dump Big RAM data */ 3040c965db44STomer Tayar if (!dump) 3041c965db44STomer Tayar return offset + ram_size; 3042c965db44STomer Tayar 30437b6859fbSMintz, Yuval /* Dump Big RAM */ 3044da090917STomer Tayar for (i = 0; i < DIV_ROUND_UP(ram_size, BRB_REG_BIG_RAM_DATA_SIZE); 3045da090917STomer Tayar i++) { 3046be086e7cSMintz, Yuval u32 addr, len; 3047be086e7cSMintz, Yuval 3048be086e7cSMintz, Yuval qed_wr(p_hwfn, p_ptt, big_ram->addr_reg_addr, i); 3049be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(big_ram->data_reg_addr); 3050da090917STomer Tayar len = BRB_REG_BIG_RAM_DATA_SIZE; 3051be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3052be086e7cSMintz, Yuval p_ptt, 3053be086e7cSMintz, Yuval dump_buf + offset, 3054be086e7cSMintz, Yuval dump, 3055be086e7cSMintz, Yuval addr, 30567b6859fbSMintz, Yuval len, 3057d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 3058c965db44STomer Tayar } 3059c965db44STomer Tayar 3060c965db44STomer Tayar return offset; 3061c965db44STomer Tayar } 3062c965db44STomer Tayar 30632d22bc83SMichal Kalderon /* Dumps MCP scratchpad. Returns the dumped size in dwords. */ 3064c965db44STomer Tayar static u32 qed_grc_dump_mcp(struct qed_hwfn *p_hwfn, 3065c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3066c965db44STomer Tayar { 3067c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID] = { 0 }; 3068be086e7cSMintz, Yuval u32 offset = 0, addr; 3069c965db44STomer Tayar bool halted = false; 3070c965db44STomer Tayar 3071c965db44STomer Tayar /* Halt MCP */ 3072be086e7cSMintz, Yuval if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) { 3073c965db44STomer Tayar halted = !qed_mcp_halt(p_hwfn, p_ptt); 3074c965db44STomer Tayar if (!halted) 3075c965db44STomer Tayar DP_NOTICE(p_hwfn, "MCP halt failed!\n"); 3076c965db44STomer Tayar } 3077c965db44STomer Tayar 3078c965db44STomer Tayar /* Dump MCP scratchpad */ 3079c965db44STomer Tayar offset += qed_grc_dump_mem(p_hwfn, 3080c965db44STomer Tayar p_ptt, 3081c965db44STomer Tayar dump_buf + offset, 3082c965db44STomer Tayar dump, 3083c965db44STomer Tayar NULL, 3084be086e7cSMintz, Yuval BYTES_TO_DWORDS(MCP_REG_SCRATCH), 30852d22bc83SMichal Kalderon MCP_REG_SCRATCH_SIZE, 30862d22bc83SMichal Kalderon false, 0, false, "MCP", 0); 3087c965db44STomer Tayar 3088c965db44STomer Tayar /* Dump MCP cpu_reg_file */ 3089c965db44STomer Tayar offset += qed_grc_dump_mem(p_hwfn, 3090c965db44STomer Tayar p_ptt, 3091c965db44STomer Tayar dump_buf + offset, 3092c965db44STomer Tayar dump, 3093c965db44STomer Tayar NULL, 3094be086e7cSMintz, Yuval BYTES_TO_DWORDS(MCP_REG_CPU_REG_FILE), 3095c965db44STomer Tayar MCP_REG_CPU_REG_FILE_SIZE, 30962d22bc83SMichal Kalderon false, 0, false, "MCP", 0); 3097c965db44STomer Tayar 3098c965db44STomer Tayar /* Dump MCP registers */ 3099c965db44STomer Tayar block_enable[BLOCK_MCP] = true; 3100c965db44STomer Tayar offset += qed_grc_dump_registers(p_hwfn, 3101c965db44STomer Tayar p_ptt, 3102c965db44STomer Tayar dump_buf + offset, 31032d22bc83SMichal Kalderon dump, block_enable, "MCP"); 3104c965db44STomer Tayar 3105c965db44STomer Tayar /* Dump required non-MCP registers */ 3106c965db44STomer Tayar offset += qed_grc_dump_regs_hdr(dump_buf + offset, 3107d52c89f1SMichal Kalderon dump, 1, SPLIT_TYPE_NONE, 0, 31082d22bc83SMichal Kalderon "MCP"); 3109be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(MISC_REG_SHARED_MEM_ADDR); 3110c965db44STomer Tayar offset += qed_grc_dump_reg_entry(p_hwfn, 3111c965db44STomer Tayar p_ptt, 3112c965db44STomer Tayar dump_buf + offset, 3113c965db44STomer Tayar dump, 3114be086e7cSMintz, Yuval addr, 31157b6859fbSMintz, Yuval 1, 3116d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 3117c965db44STomer Tayar 3118c965db44STomer Tayar /* Release MCP */ 3119c965db44STomer Tayar if (halted && qed_mcp_resume(p_hwfn, p_ptt)) 3120c965db44STomer Tayar DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n"); 31217b6859fbSMintz, Yuval 3122c965db44STomer Tayar return offset; 3123c965db44STomer Tayar } 3124c965db44STomer Tayar 31252d22bc83SMichal Kalderon /* Dumps the tbus indirect memory for all PHYs. 31262d22bc83SMichal Kalderon * Returns the dumped size in dwords. 31272d22bc83SMichal Kalderon */ 3128c965db44STomer Tayar static u32 qed_grc_dump_phy(struct qed_hwfn *p_hwfn, 3129c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3130c965db44STomer Tayar { 3131c965db44STomer Tayar u32 offset = 0, tbus_lo_offset, tbus_hi_offset; 3132c965db44STomer Tayar char mem_name[32]; 3133c965db44STomer Tayar u8 phy_id; 3134c965db44STomer Tayar 3135c965db44STomer Tayar for (phy_id = 0; phy_id < ARRAY_SIZE(s_phy_defs); phy_id++) { 31367b6859fbSMintz, Yuval u32 addr_lo_addr, addr_hi_addr, data_lo_addr, data_hi_addr; 31377b6859fbSMintz, Yuval struct phy_defs *phy_defs; 31387b6859fbSMintz, Yuval u8 *bytes_buf; 3139c965db44STomer Tayar 31407b6859fbSMintz, Yuval phy_defs = &s_phy_defs[phy_id]; 31417b6859fbSMintz, Yuval addr_lo_addr = phy_defs->base_addr + 31427b6859fbSMintz, Yuval phy_defs->tbus_addr_lo_addr; 31437b6859fbSMintz, Yuval addr_hi_addr = phy_defs->base_addr + 31447b6859fbSMintz, Yuval phy_defs->tbus_addr_hi_addr; 31457b6859fbSMintz, Yuval data_lo_addr = phy_defs->base_addr + 31467b6859fbSMintz, Yuval phy_defs->tbus_data_lo_addr; 31477b6859fbSMintz, Yuval data_hi_addr = phy_defs->base_addr + 31487b6859fbSMintz, Yuval phy_defs->tbus_data_hi_addr; 31497b6859fbSMintz, Yuval 31507b6859fbSMintz, Yuval if (snprintf(mem_name, sizeof(mem_name), "tbus_%s", 31517b6859fbSMintz, Yuval phy_defs->phy_name) < 0) 3152c965db44STomer Tayar DP_NOTICE(p_hwfn, 3153c965db44STomer Tayar "Unexpected debug error: invalid PHY memory name\n"); 31547b6859fbSMintz, Yuval 3155c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3156c965db44STomer Tayar dump_buf + offset, 3157c965db44STomer Tayar dump, 3158c965db44STomer Tayar mem_name, 3159c965db44STomer Tayar 0, 3160c965db44STomer Tayar PHY_DUMP_SIZE_DWORDS, 31612d22bc83SMichal Kalderon 16, true, mem_name, 0); 31627b6859fbSMintz, Yuval 31637b6859fbSMintz, Yuval if (!dump) { 31647b6859fbSMintz, Yuval offset += PHY_DUMP_SIZE_DWORDS; 31657b6859fbSMintz, Yuval continue; 31667b6859fbSMintz, Yuval } 3167c965db44STomer Tayar 3168da090917STomer Tayar bytes_buf = (u8 *)(dump_buf + offset); 3169c965db44STomer Tayar for (tbus_hi_offset = 0; 3170c965db44STomer Tayar tbus_hi_offset < (NUM_PHY_TBUS_ADDRESSES >> 8); 3171c965db44STomer Tayar tbus_hi_offset++) { 31727b6859fbSMintz, Yuval qed_wr(p_hwfn, p_ptt, addr_hi_addr, tbus_hi_offset); 3173c965db44STomer Tayar for (tbus_lo_offset = 0; tbus_lo_offset < 256; 3174c965db44STomer Tayar tbus_lo_offset++) { 3175c965db44STomer Tayar qed_wr(p_hwfn, 31767b6859fbSMintz, Yuval p_ptt, addr_lo_addr, tbus_lo_offset); 31777b6859fbSMintz, Yuval *(bytes_buf++) = (u8)qed_rd(p_hwfn, 3178c965db44STomer Tayar p_ptt, 3179c965db44STomer Tayar data_lo_addr); 31807b6859fbSMintz, Yuval *(bytes_buf++) = (u8)qed_rd(p_hwfn, 31817b6859fbSMintz, Yuval p_ptt, 3182c965db44STomer Tayar data_hi_addr); 3183c965db44STomer Tayar } 3184c965db44STomer Tayar } 3185c965db44STomer Tayar 3186c965db44STomer Tayar offset += PHY_DUMP_SIZE_DWORDS; 3187c965db44STomer Tayar } 3188c965db44STomer Tayar 3189c965db44STomer Tayar return offset; 3190c965db44STomer Tayar } 3191c965db44STomer Tayar 31922d22bc83SMichal Kalderon static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn, 3193c965db44STomer Tayar struct qed_ptt *p_ptt, 31942d22bc83SMichal Kalderon u32 image_type, 31952d22bc83SMichal Kalderon u32 *nvram_offset_bytes, 31962d22bc83SMichal Kalderon u32 *nvram_size_bytes); 3197c965db44STomer Tayar 31982d22bc83SMichal Kalderon static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn, 31992d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 32002d22bc83SMichal Kalderon u32 nvram_offset_bytes, 32012d22bc83SMichal Kalderon u32 nvram_size_bytes, u32 *ret_buf); 32022d22bc83SMichal Kalderon 32032d22bc83SMichal Kalderon /* Dumps the MCP HW dump from NVRAM. Returns the dumped size in dwords. */ 32042d22bc83SMichal Kalderon static u32 qed_grc_dump_mcp_hw_dump(struct qed_hwfn *p_hwfn, 32052d22bc83SMichal Kalderon struct qed_ptt *p_ptt, 32062d22bc83SMichal Kalderon u32 *dump_buf, bool dump) 32072d22bc83SMichal Kalderon { 32082d22bc83SMichal Kalderon u32 hw_dump_offset_bytes = 0, hw_dump_size_bytes = 0; 32092d22bc83SMichal Kalderon u32 hw_dump_size_dwords = 0, offset = 0; 32102d22bc83SMichal Kalderon enum dbg_status status; 32112d22bc83SMichal Kalderon 32122d22bc83SMichal Kalderon /* Read HW dump image from NVRAM */ 32132d22bc83SMichal Kalderon status = qed_find_nvram_image(p_hwfn, 32142d22bc83SMichal Kalderon p_ptt, 32152d22bc83SMichal Kalderon NVM_TYPE_HW_DUMP_OUT, 32162d22bc83SMichal Kalderon &hw_dump_offset_bytes, 32172d22bc83SMichal Kalderon &hw_dump_size_bytes); 32182d22bc83SMichal Kalderon if (status != DBG_STATUS_OK) 32192d22bc83SMichal Kalderon return 0; 32202d22bc83SMichal Kalderon 32212d22bc83SMichal Kalderon hw_dump_size_dwords = BYTES_TO_DWORDS(hw_dump_size_bytes); 32222d22bc83SMichal Kalderon 32232d22bc83SMichal Kalderon /* Dump HW dump image section */ 32242d22bc83SMichal Kalderon offset += qed_dump_section_hdr(dump_buf + offset, 32252d22bc83SMichal Kalderon dump, "mcp_hw_dump", 1); 32262d22bc83SMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 32272d22bc83SMichal Kalderon dump, "size", hw_dump_size_dwords); 32282d22bc83SMichal Kalderon 32292d22bc83SMichal Kalderon /* Read MCP HW dump image into dump buffer */ 32302d22bc83SMichal Kalderon if (dump && hw_dump_size_dwords) { 32312d22bc83SMichal Kalderon status = qed_nvram_read(p_hwfn, 32322d22bc83SMichal Kalderon p_ptt, 32332d22bc83SMichal Kalderon hw_dump_offset_bytes, 32342d22bc83SMichal Kalderon hw_dump_size_bytes, dump_buf + offset); 32352d22bc83SMichal Kalderon if (status != DBG_STATUS_OK) { 32362d22bc83SMichal Kalderon DP_NOTICE(p_hwfn, 32372d22bc83SMichal Kalderon "Failed to read MCP HW Dump image from NVRAM\n"); 32382d22bc83SMichal Kalderon return 0; 32392d22bc83SMichal Kalderon } 32402d22bc83SMichal Kalderon } 32412d22bc83SMichal Kalderon offset += hw_dump_size_dwords; 32422d22bc83SMichal Kalderon 32432d22bc83SMichal Kalderon return offset; 3244c965db44STomer Tayar } 3245c965db44STomer Tayar 3246c965db44STomer Tayar /* Dumps Static Debug data. Returns the dumped size in dwords. */ 3247c965db44STomer Tayar static u32 qed_grc_dump_static_debug(struct qed_hwfn *p_hwfn, 3248c965db44STomer Tayar struct qed_ptt *p_ptt, 3249c965db44STomer Tayar u32 *dump_buf, bool dump) 3250c965db44STomer Tayar { 3251c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 32522d22bc83SMichal Kalderon u32 block_id, line_id, offset = 0, addr, len; 32537b6859fbSMintz, Yuval 3254da090917STomer Tayar /* Don't dump static debug if a debug bus recording is in progress */ 3255da090917STomer Tayar if (dump && qed_rd(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON)) 32567b6859fbSMintz, Yuval return 0; 3257c965db44STomer Tayar 3258c965db44STomer Tayar if (dump) { 32592d22bc83SMichal Kalderon /* Disable debug bus in all blocks */ 32602d22bc83SMichal Kalderon qed_bus_disable_blocks(p_hwfn, p_ptt); 3261c965db44STomer Tayar 3262c965db44STomer Tayar qed_bus_reset_dbg_block(p_hwfn, p_ptt); 32632d22bc83SMichal Kalderon qed_wr(p_hwfn, 32642d22bc83SMichal Kalderon p_ptt, DBG_REG_FRAMING_MODE, DBG_BUS_FRAME_MODE_8HW); 3265c965db44STomer Tayar qed_wr(p_hwfn, 3266c965db44STomer Tayar p_ptt, DBG_REG_DEBUG_TARGET, DBG_BUS_TARGET_ID_INT_BUF); 3267c965db44STomer Tayar qed_wr(p_hwfn, p_ptt, DBG_REG_FULL_MODE, 1); 3268c965db44STomer Tayar qed_bus_enable_dbg_block(p_hwfn, p_ptt, true); 3269c965db44STomer Tayar } 3270c965db44STomer Tayar 3271c965db44STomer Tayar /* Dump all static debug lines for each relevant block */ 3272c965db44STomer Tayar for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) { 32732d22bc83SMichal Kalderon const struct dbg_block_chip *block_per_chip; 32742d22bc83SMichal Kalderon const struct dbg_block *block; 32752d22bc83SMichal Kalderon bool is_removed, has_dbg_bus; 32762d22bc83SMichal Kalderon u16 modes_buf_offset; 32772d22bc83SMichal Kalderon u32 block_dwords; 3278c965db44STomer Tayar 32792d22bc83SMichal Kalderon block_per_chip = 32802d22bc83SMichal Kalderon qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)block_id); 32812d22bc83SMichal Kalderon is_removed = GET_FIELD(block_per_chip->flags, 32822d22bc83SMichal Kalderon DBG_BLOCK_CHIP_IS_REMOVED); 32832d22bc83SMichal Kalderon has_dbg_bus = GET_FIELD(block_per_chip->flags, 32842d22bc83SMichal Kalderon DBG_BLOCK_CHIP_HAS_DBG_BUS); 32852d22bc83SMichal Kalderon 32862d22bc83SMichal Kalderon /* read+clear for NWS parity is not working, skip NWS block */ 32872d22bc83SMichal Kalderon if (block_id == BLOCK_NWS) 3288c965db44STomer Tayar continue; 3289c965db44STomer Tayar 32902d22bc83SMichal Kalderon if (!is_removed && has_dbg_bus && 32912d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 32922d22bc83SMichal Kalderon DBG_MODE_HDR_EVAL_MODE) > 0) { 32932d22bc83SMichal Kalderon modes_buf_offset = 32942d22bc83SMichal Kalderon GET_FIELD(block_per_chip->dbg_bus_mode.data, 32952d22bc83SMichal Kalderon DBG_MODE_HDR_MODES_BUF_OFFSET); 32962d22bc83SMichal Kalderon if (!qed_is_mode_match(p_hwfn, &modes_buf_offset)) 32972d22bc83SMichal Kalderon has_dbg_bus = false; 32982d22bc83SMichal Kalderon } 32992d22bc83SMichal Kalderon 33002d22bc83SMichal Kalderon if (is_removed || !has_dbg_bus) 33012d22bc83SMichal Kalderon continue; 33022d22bc83SMichal Kalderon 33032d22bc83SMichal Kalderon block_dwords = NUM_DBG_LINES(block_per_chip) * 33047b6859fbSMintz, Yuval STATIC_DEBUG_LINE_DWORDS; 33057b6859fbSMintz, Yuval 3306c965db44STomer Tayar /* Dump static section params */ 33072d22bc83SMichal Kalderon block = get_dbg_block(p_hwfn, (enum block_id)block_id); 3308c965db44STomer Tayar offset += qed_grc_dump_mem_hdr(p_hwfn, 3309c965db44STomer Tayar dump_buf + offset, 3310c965db44STomer Tayar dump, 33117b6859fbSMintz, Yuval block->name, 33127b6859fbSMintz, Yuval 0, 33137b6859fbSMintz, Yuval block_dwords, 33142d22bc83SMichal Kalderon 32, false, "STATIC", 0); 3315c965db44STomer Tayar 33167b6859fbSMintz, Yuval if (!dump) { 33177b6859fbSMintz, Yuval offset += block_dwords; 33187b6859fbSMintz, Yuval continue; 33197b6859fbSMintz, Yuval } 33207b6859fbSMintz, Yuval 33217b6859fbSMintz, Yuval /* If all lines are invalid - dump zeros */ 33227b6859fbSMintz, Yuval if (dev_data->block_in_reset[block_id]) { 33237b6859fbSMintz, Yuval memset(dump_buf + offset, 0, 33247b6859fbSMintz, Yuval DWORDS_TO_BYTES(block_dwords)); 33257b6859fbSMintz, Yuval offset += block_dwords; 33267b6859fbSMintz, Yuval continue; 33277b6859fbSMintz, Yuval } 3328c965db44STomer Tayar 3329c965db44STomer Tayar /* Enable block's client */ 33307b6859fbSMintz, Yuval qed_bus_enable_clients(p_hwfn, 33317b6859fbSMintz, Yuval p_ptt, 33322d22bc83SMichal Kalderon BIT(block_per_chip->dbg_client_id)); 3333c965db44STomer Tayar 33347b6859fbSMintz, Yuval addr = BYTES_TO_DWORDS(DBG_REG_CALENDAR_OUT_DATA); 33357b6859fbSMintz, Yuval len = STATIC_DEBUG_LINE_DWORDS; 33362d22bc83SMichal Kalderon for (line_id = 0; line_id < (u32)NUM_DBG_LINES(block_per_chip); 3337c965db44STomer Tayar line_id++) { 3338c965db44STomer Tayar /* Configure debug line ID */ 33392d22bc83SMichal Kalderon qed_bus_config_dbg_line(p_hwfn, 3340c965db44STomer Tayar p_ptt, 3341c965db44STomer Tayar (enum block_id)block_id, 33427b6859fbSMintz, Yuval (u8)line_id, 0xf, 0, 0, 0); 3343c965db44STomer Tayar 3344c965db44STomer Tayar /* Read debug line info */ 33457b6859fbSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3346be086e7cSMintz, Yuval p_ptt, 3347be086e7cSMintz, Yuval dump_buf + offset, 3348be086e7cSMintz, Yuval dump, 3349be086e7cSMintz, Yuval addr, 33507b6859fbSMintz, Yuval len, 3351d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 3352d52c89f1SMichal Kalderon 0); 3353c965db44STomer Tayar } 3354c965db44STomer Tayar 3355c965db44STomer Tayar /* Disable block's client and debug output */ 3356c965db44STomer Tayar qed_bus_enable_clients(p_hwfn, p_ptt, 0); 33572d22bc83SMichal Kalderon qed_bus_config_dbg_line(p_hwfn, p_ptt, 33582d22bc83SMichal Kalderon (enum block_id)block_id, 0, 0, 0, 0, 0); 3359c965db44STomer Tayar } 3360c965db44STomer Tayar 3361c965db44STomer Tayar if (dump) { 3362c965db44STomer Tayar qed_bus_enable_dbg_block(p_hwfn, p_ptt, false); 3363c965db44STomer Tayar qed_bus_enable_clients(p_hwfn, p_ptt, 0); 3364c965db44STomer Tayar } 3365c965db44STomer Tayar 3366c965db44STomer Tayar return offset; 3367c965db44STomer Tayar } 3368c965db44STomer Tayar 3369c965db44STomer Tayar /* Performs GRC Dump to the specified buffer. 3370c965db44STomer Tayar * Returns the dumped size in dwords. 3371c965db44STomer Tayar */ 3372c965db44STomer Tayar static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn, 3373c965db44STomer Tayar struct qed_ptt *p_ptt, 3374c965db44STomer Tayar u32 *dump_buf, 3375c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 3376c965db44STomer Tayar { 3377c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 33782d22bc83SMichal Kalderon u32 dwords_read, offset = 0; 3379c965db44STomer Tayar bool parities_masked = false; 3380d52c89f1SMichal Kalderon u8 i; 3381c965db44STomer Tayar 3382c965db44STomer Tayar *num_dumped_dwords = 0; 3383d52c89f1SMichal Kalderon dev_data->num_regs_read = 0; 3384c965db44STomer Tayar 3385c965db44STomer Tayar /* Update reset state */ 3386d52c89f1SMichal Kalderon if (dump) 3387c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 3388c965db44STomer Tayar 3389c965db44STomer Tayar /* Dump global params */ 3390c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 3391c965db44STomer Tayar p_ptt, 3392c965db44STomer Tayar dump_buf + offset, dump, 4); 3393c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 3394c965db44STomer Tayar dump, "dump-type", "grc-dump"); 3395c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 3396c965db44STomer Tayar dump, 3397c965db44STomer Tayar "num-lcids", 33982d22bc83SMichal Kalderon NUM_OF_LCIDS); 3399c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 3400c965db44STomer Tayar dump, 3401c965db44STomer Tayar "num-ltids", 34022d22bc83SMichal Kalderon NUM_OF_LTIDS); 3403c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 3404d52c89f1SMichal Kalderon dump, "num-ports", dev_data->num_ports); 3405c965db44STomer Tayar 3406c965db44STomer Tayar /* Dump reset registers (dumped before taking blocks out of reset ) */ 3407c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) 3408c965db44STomer Tayar offset += qed_grc_dump_reset_regs(p_hwfn, 3409c965db44STomer Tayar p_ptt, 3410c965db44STomer Tayar dump_buf + offset, dump); 3411c965db44STomer Tayar 3412c965db44STomer Tayar /* Take all blocks out of reset (using reset registers) */ 3413c965db44STomer Tayar if (dump) { 34142d22bc83SMichal Kalderon qed_grc_unreset_blocks(p_hwfn, p_ptt, false); 3415c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 3416c965db44STomer Tayar } 3417c965db44STomer Tayar 3418c965db44STomer Tayar /* Disable all parities using MFW command */ 34197b6859fbSMintz, Yuval if (dump && 34207b6859fbSMintz, Yuval !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) { 3421c965db44STomer Tayar parities_masked = !qed_mcp_mask_parities(p_hwfn, p_ptt, 1); 3422c965db44STomer Tayar if (!parities_masked) { 3423be086e7cSMintz, Yuval DP_NOTICE(p_hwfn, 3424be086e7cSMintz, Yuval "Failed to mask parities using MFW\n"); 3425c965db44STomer Tayar if (qed_grc_get_param 3426c965db44STomer Tayar (p_hwfn, DBG_GRC_PARAM_PARITY_SAFE)) 3427c965db44STomer Tayar return DBG_STATUS_MCP_COULD_NOT_MASK_PRTY; 3428c965db44STomer Tayar } 3429c965db44STomer Tayar } 3430c965db44STomer Tayar 3431c965db44STomer Tayar /* Dump modified registers (dumped before modifying them) */ 3432c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) 3433c965db44STomer Tayar offset += qed_grc_dump_modified_regs(p_hwfn, 3434c965db44STomer Tayar p_ptt, 3435c965db44STomer Tayar dump_buf + offset, dump); 3436c965db44STomer Tayar 3437c965db44STomer Tayar /* Stall storms */ 3438c965db44STomer Tayar if (dump && 3439c965db44STomer Tayar (qed_grc_is_included(p_hwfn, 3440c965db44STomer Tayar DBG_GRC_PARAM_DUMP_IOR) || 3441c965db44STomer Tayar qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC))) 3442c965db44STomer Tayar qed_grc_stall_storms(p_hwfn, p_ptt, true); 3443c965db44STomer Tayar 3444c965db44STomer Tayar /* Dump all regs */ 3445c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) { 3446c965db44STomer Tayar bool block_enable[MAX_BLOCK_ID]; 3447c965db44STomer Tayar 34487b6859fbSMintz, Yuval /* Dump all blocks except MCP */ 3449c965db44STomer Tayar for (i = 0; i < MAX_BLOCK_ID; i++) 3450c965db44STomer Tayar block_enable[i] = true; 3451c965db44STomer Tayar block_enable[BLOCK_MCP] = false; 3452c965db44STomer Tayar offset += qed_grc_dump_registers(p_hwfn, 3453c965db44STomer Tayar p_ptt, 3454c965db44STomer Tayar dump_buf + 3455c965db44STomer Tayar offset, 3456c965db44STomer Tayar dump, 34572d22bc83SMichal Kalderon block_enable, NULL); 3458be086e7cSMintz, Yuval 3459be086e7cSMintz, Yuval /* Dump special registers */ 3460be086e7cSMintz, Yuval offset += qed_grc_dump_special_regs(p_hwfn, 3461be086e7cSMintz, Yuval p_ptt, 3462be086e7cSMintz, Yuval dump_buf + offset, dump); 3463c965db44STomer Tayar } 3464c965db44STomer Tayar 3465c965db44STomer Tayar /* Dump memories */ 3466c965db44STomer Tayar offset += qed_grc_dump_memories(p_hwfn, p_ptt, dump_buf + offset, dump); 3467c965db44STomer Tayar 3468c965db44STomer Tayar /* Dump MCP */ 3469c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP)) 3470c965db44STomer Tayar offset += qed_grc_dump_mcp(p_hwfn, 3471c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3472c965db44STomer Tayar 3473c965db44STomer Tayar /* Dump context */ 3474c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX)) 3475c965db44STomer Tayar offset += qed_grc_dump_ctx(p_hwfn, 3476c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3477c965db44STomer Tayar 3478c965db44STomer Tayar /* Dump RSS memories */ 3479c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RSS)) 3480c965db44STomer Tayar offset += qed_grc_dump_rss(p_hwfn, 3481c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3482c965db44STomer Tayar 3483c965db44STomer Tayar /* Dump Big RAM */ 3484c965db44STomer Tayar for (i = 0; i < NUM_BIG_RAM_TYPES; i++) 3485c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, s_big_ram_defs[i].grc_param)) 3486c965db44STomer Tayar offset += qed_grc_dump_big_ram(p_hwfn, 3487c965db44STomer Tayar p_ptt, 3488c965db44STomer Tayar dump_buf + offset, 3489c965db44STomer Tayar dump, i); 3490c965db44STomer Tayar 3491c965db44STomer Tayar /* Dump VFC */ 34922d22bc83SMichal Kalderon if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)) { 34932d22bc83SMichal Kalderon dwords_read = qed_grc_dump_vfc(p_hwfn, 3494c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 34952d22bc83SMichal Kalderon offset += dwords_read; 34962d22bc83SMichal Kalderon if (!dwords_read) 34972d22bc83SMichal Kalderon return DBG_STATUS_VFC_READ_ERROR; 34982d22bc83SMichal Kalderon } 3499c965db44STomer Tayar 3500c965db44STomer Tayar /* Dump PHY tbus */ 3501c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, 3502c965db44STomer Tayar DBG_GRC_PARAM_DUMP_PHY) && dev_data->chip_id == 35032d22bc83SMichal Kalderon CHIP_K2 && dev_data->hw_type == HW_TYPE_ASIC) 3504c965db44STomer Tayar offset += qed_grc_dump_phy(p_hwfn, 3505c965db44STomer Tayar p_ptt, dump_buf + offset, dump); 3506c965db44STomer Tayar 35072d22bc83SMichal Kalderon /* Dump MCP HW Dump */ 35082d22bc83SMichal Kalderon if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP_HW_DUMP) && 35092d22bc83SMichal Kalderon !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP) && 1) 35102d22bc83SMichal Kalderon offset += qed_grc_dump_mcp_hw_dump(p_hwfn, 35112d22bc83SMichal Kalderon p_ptt, 35122d22bc83SMichal Kalderon dump_buf + offset, dump); 35132d22bc83SMichal Kalderon 3514d52c89f1SMichal Kalderon /* Dump static debug data (only if not during debug bus recording) */ 3515c965db44STomer Tayar if (qed_grc_is_included(p_hwfn, 3516c965db44STomer Tayar DBG_GRC_PARAM_DUMP_STATIC) && 3517d52c89f1SMichal Kalderon (!dump || dev_data->bus.state == DBG_BUS_STATE_IDLE)) 3518c965db44STomer Tayar offset += qed_grc_dump_static_debug(p_hwfn, 3519c965db44STomer Tayar p_ptt, 3520c965db44STomer Tayar dump_buf + offset, dump); 3521c965db44STomer Tayar 3522c965db44STomer Tayar /* Dump last section */ 3523da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 35247b6859fbSMintz, Yuval 3525c965db44STomer Tayar if (dump) { 3526c965db44STomer Tayar /* Unstall storms */ 3527c965db44STomer Tayar if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_UNSTALL)) 3528c965db44STomer Tayar qed_grc_stall_storms(p_hwfn, p_ptt, false); 3529c965db44STomer Tayar 3530c965db44STomer Tayar /* Clear parity status */ 3531c965db44STomer Tayar qed_grc_clear_all_prty(p_hwfn, p_ptt); 3532c965db44STomer Tayar 3533c965db44STomer Tayar /* Enable all parities using MFW command */ 3534c965db44STomer Tayar if (parities_masked) 3535c965db44STomer Tayar qed_mcp_mask_parities(p_hwfn, p_ptt, 0); 3536c965db44STomer Tayar } 3537c965db44STomer Tayar 3538c965db44STomer Tayar *num_dumped_dwords = offset; 3539c965db44STomer Tayar 3540c965db44STomer Tayar return DBG_STATUS_OK; 3541c965db44STomer Tayar } 3542c965db44STomer Tayar 3543c965db44STomer Tayar /* Writes the specified failing Idle Check rule to the specified buffer. 3544c965db44STomer Tayar * Returns the dumped size in dwords. 3545c965db44STomer Tayar */ 3546c965db44STomer Tayar static u32 qed_idle_chk_dump_failure(struct qed_hwfn *p_hwfn, 3547c965db44STomer Tayar struct qed_ptt *p_ptt, 3548c965db44STomer Tayar u32 * 3549c965db44STomer Tayar dump_buf, 3550c965db44STomer Tayar bool dump, 3551c965db44STomer Tayar u16 rule_id, 3552c965db44STomer Tayar const struct dbg_idle_chk_rule *rule, 3553c965db44STomer Tayar u16 fail_entry_id, u32 *cond_reg_values) 3554c965db44STomer Tayar { 3555c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 35567b6859fbSMintz, Yuval const struct dbg_idle_chk_cond_reg *cond_regs; 35577b6859fbSMintz, Yuval const struct dbg_idle_chk_info_reg *info_regs; 35587b6859fbSMintz, Yuval u32 i, next_reg_offset = 0, offset = 0; 35597b6859fbSMintz, Yuval struct dbg_idle_chk_result_hdr *hdr; 35607b6859fbSMintz, Yuval const union dbg_idle_chk_reg *regs; 3561c965db44STomer Tayar u8 reg_id; 3562c965db44STomer Tayar 35637b6859fbSMintz, Yuval hdr = (struct dbg_idle_chk_result_hdr *)dump_buf; 35642d22bc83SMichal Kalderon regs = (const union dbg_idle_chk_reg *) 35652d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr + 35662d22bc83SMichal Kalderon rule->reg_offset; 35677b6859fbSMintz, Yuval cond_regs = ®s[0].cond_reg; 35687b6859fbSMintz, Yuval info_regs = ®s[rule->num_cond_regs].info_reg; 35697b6859fbSMintz, Yuval 3570c965db44STomer Tayar /* Dump rule data */ 3571c965db44STomer Tayar if (dump) { 3572c965db44STomer Tayar memset(hdr, 0, sizeof(*hdr)); 3573c965db44STomer Tayar hdr->rule_id = rule_id; 3574c965db44STomer Tayar hdr->mem_entry_id = fail_entry_id; 3575c965db44STomer Tayar hdr->severity = rule->severity; 3576c965db44STomer Tayar hdr->num_dumped_cond_regs = rule->num_cond_regs; 3577c965db44STomer Tayar } 3578c965db44STomer Tayar 3579c965db44STomer Tayar offset += IDLE_CHK_RESULT_HDR_DWORDS; 3580c965db44STomer Tayar 3581c965db44STomer Tayar /* Dump condition register values */ 3582c965db44STomer Tayar for (reg_id = 0; reg_id < rule->num_cond_regs; reg_id++) { 3583c965db44STomer Tayar const struct dbg_idle_chk_cond_reg *reg = &cond_regs[reg_id]; 35847b6859fbSMintz, Yuval struct dbg_idle_chk_result_reg_hdr *reg_hdr; 35857b6859fbSMintz, Yuval 35862d22bc83SMichal Kalderon reg_hdr = 35872d22bc83SMichal Kalderon (struct dbg_idle_chk_result_reg_hdr *)(dump_buf + offset); 3588c965db44STomer Tayar 3589c965db44STomer Tayar /* Write register header */ 35907b6859fbSMintz, Yuval if (!dump) { 35917b6859fbSMintz, Yuval offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + 35927b6859fbSMintz, Yuval reg->entry_size; 35937b6859fbSMintz, Yuval continue; 35947b6859fbSMintz, Yuval } 35957b6859fbSMintz, Yuval 3596c965db44STomer Tayar offset += IDLE_CHK_RESULT_REG_HDR_DWORDS; 35977b6859fbSMintz, Yuval memset(reg_hdr, 0, sizeof(*reg_hdr)); 3598c965db44STomer Tayar reg_hdr->start_entry = reg->start_entry; 3599c965db44STomer Tayar reg_hdr->size = reg->entry_size; 3600c965db44STomer Tayar SET_FIELD(reg_hdr->data, 3601c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM, 36027b6859fbSMintz, Yuval reg->num_entries > 1 || reg->start_entry > 0 ? 1 : 0); 3603c965db44STomer Tayar SET_FIELD(reg_hdr->data, 3604c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, reg_id); 3605c965db44STomer Tayar 3606c965db44STomer Tayar /* Write register values */ 36077b6859fbSMintz, Yuval for (i = 0; i < reg_hdr->size; i++, next_reg_offset++, offset++) 36087b6859fbSMintz, Yuval dump_buf[offset] = cond_reg_values[next_reg_offset]; 3609c965db44STomer Tayar } 3610c965db44STomer Tayar 3611c965db44STomer Tayar /* Dump info register values */ 3612c965db44STomer Tayar for (reg_id = 0; reg_id < rule->num_info_regs; reg_id++) { 3613c965db44STomer Tayar const struct dbg_idle_chk_info_reg *reg = &info_regs[reg_id]; 3614c965db44STomer Tayar u32 block_id; 3615c965db44STomer Tayar 36167b6859fbSMintz, Yuval /* Check if register's block is in reset */ 3617c965db44STomer Tayar if (!dump) { 3618c965db44STomer Tayar offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + reg->size; 3619c965db44STomer Tayar continue; 3620c965db44STomer Tayar } 3621c965db44STomer Tayar 3622c965db44STomer Tayar block_id = GET_FIELD(reg->data, DBG_IDLE_CHK_INFO_REG_BLOCK_ID); 3623c965db44STomer Tayar if (block_id >= MAX_BLOCK_ID) { 3624c965db44STomer Tayar DP_NOTICE(p_hwfn, "Invalid block_id\n"); 3625c965db44STomer Tayar return 0; 3626c965db44STomer Tayar } 3627c965db44STomer Tayar 3628c965db44STomer Tayar if (!dev_data->block_in_reset[block_id]) { 36297b6859fbSMintz, Yuval struct dbg_idle_chk_result_reg_hdr *reg_hdr; 36307b6859fbSMintz, Yuval bool wide_bus, eval_mode, mode_match = true; 36317b6859fbSMintz, Yuval u16 modes_buf_offset; 36327b6859fbSMintz, Yuval u32 addr; 36337b6859fbSMintz, Yuval 36347b6859fbSMintz, Yuval reg_hdr = (struct dbg_idle_chk_result_reg_hdr *) 36357b6859fbSMintz, Yuval (dump_buf + offset); 3636c965db44STomer Tayar 3637c965db44STomer Tayar /* Check mode */ 36387b6859fbSMintz, Yuval eval_mode = GET_FIELD(reg->mode.data, 36397b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 3640c965db44STomer Tayar if (eval_mode) { 36417b6859fbSMintz, Yuval modes_buf_offset = 3642c965db44STomer Tayar GET_FIELD(reg->mode.data, 3643c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 3644c965db44STomer Tayar mode_match = 3645c965db44STomer Tayar qed_is_mode_match(p_hwfn, 3646c965db44STomer Tayar &modes_buf_offset); 3647c965db44STomer Tayar } 3648c965db44STomer Tayar 36497b6859fbSMintz, Yuval if (!mode_match) 36507b6859fbSMintz, Yuval continue; 36517b6859fbSMintz, Yuval 36527b6859fbSMintz, Yuval addr = GET_FIELD(reg->data, 3653be086e7cSMintz, Yuval DBG_IDLE_CHK_INFO_REG_ADDRESS); 36547b6859fbSMintz, Yuval wide_bus = GET_FIELD(reg->data, 36557b6859fbSMintz, Yuval DBG_IDLE_CHK_INFO_REG_WIDE_BUS); 3656c965db44STomer Tayar 3657c965db44STomer Tayar /* Write register header */ 3658c965db44STomer Tayar offset += IDLE_CHK_RESULT_REG_HDR_DWORDS; 3659c965db44STomer Tayar hdr->num_dumped_info_regs++; 3660c965db44STomer Tayar memset(reg_hdr, 0, sizeof(*reg_hdr)); 3661c965db44STomer Tayar reg_hdr->size = reg->size; 3662c965db44STomer Tayar SET_FIELD(reg_hdr->data, 3663c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, 3664c965db44STomer Tayar rule->num_cond_regs + reg_id); 3665c965db44STomer Tayar 3666c965db44STomer Tayar /* Write register values */ 36677b6859fbSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 3668be086e7cSMintz, Yuval p_ptt, 3669be086e7cSMintz, Yuval dump_buf + offset, 3670be086e7cSMintz, Yuval dump, 3671be086e7cSMintz, Yuval addr, 3672d52c89f1SMichal Kalderon reg->size, wide_bus, 3673d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 3674c965db44STomer Tayar } 3675c965db44STomer Tayar } 3676c965db44STomer Tayar 3677c965db44STomer Tayar return offset; 3678c965db44STomer Tayar } 3679c965db44STomer Tayar 3680c965db44STomer Tayar /* Dumps idle check rule entries. Returns the dumped size in dwords. */ 3681c965db44STomer Tayar static u32 3682c965db44STomer Tayar qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 3683c965db44STomer Tayar u32 *dump_buf, bool dump, 3684c965db44STomer Tayar const struct dbg_idle_chk_rule *input_rules, 3685c965db44STomer Tayar u32 num_input_rules, u32 *num_failing_rules) 3686c965db44STomer Tayar { 3687c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 3688c965db44STomer Tayar u32 cond_reg_values[IDLE_CHK_MAX_ENTRIES_SIZE]; 3689be086e7cSMintz, Yuval u32 i, offset = 0; 3690c965db44STomer Tayar u16 entry_id; 3691c965db44STomer Tayar u8 reg_id; 3692c965db44STomer Tayar 3693c965db44STomer Tayar *num_failing_rules = 0; 36947b6859fbSMintz, Yuval 3695c965db44STomer Tayar for (i = 0; i < num_input_rules; i++) { 3696c965db44STomer Tayar const struct dbg_idle_chk_cond_reg *cond_regs; 3697c965db44STomer Tayar const struct dbg_idle_chk_rule *rule; 3698c965db44STomer Tayar const union dbg_idle_chk_reg *regs; 3699c965db44STomer Tayar u16 num_reg_entries = 1; 3700c965db44STomer Tayar bool check_rule = true; 3701c965db44STomer Tayar const u32 *imm_values; 3702c965db44STomer Tayar 3703c965db44STomer Tayar rule = &input_rules[i]; 37042d22bc83SMichal Kalderon regs = (const union dbg_idle_chk_reg *) 37052d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr + 37062d22bc83SMichal Kalderon rule->reg_offset; 3707c965db44STomer Tayar cond_regs = ®s[0].cond_reg; 37082d22bc83SMichal Kalderon imm_values = 37092d22bc83SMichal Kalderon (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr + 37102d22bc83SMichal Kalderon rule->imm_offset; 3711c965db44STomer Tayar 3712c965db44STomer Tayar /* Check if all condition register blocks are out of reset, and 3713c965db44STomer Tayar * find maximal number of entries (all condition registers that 3714c965db44STomer Tayar * are memories must have the same size, which is > 1). 3715c965db44STomer Tayar */ 3716c965db44STomer Tayar for (reg_id = 0; reg_id < rule->num_cond_regs && check_rule; 3717c965db44STomer Tayar reg_id++) { 37187b6859fbSMintz, Yuval u32 block_id = 37197b6859fbSMintz, Yuval GET_FIELD(cond_regs[reg_id].data, 3720c965db44STomer Tayar DBG_IDLE_CHK_COND_REG_BLOCK_ID); 3721c965db44STomer Tayar 3722c965db44STomer Tayar if (block_id >= MAX_BLOCK_ID) { 3723c965db44STomer Tayar DP_NOTICE(p_hwfn, "Invalid block_id\n"); 3724c965db44STomer Tayar return 0; 3725c965db44STomer Tayar } 3726c965db44STomer Tayar 3727c965db44STomer Tayar check_rule = !dev_data->block_in_reset[block_id]; 3728c965db44STomer Tayar if (cond_regs[reg_id].num_entries > num_reg_entries) 3729c965db44STomer Tayar num_reg_entries = cond_regs[reg_id].num_entries; 3730c965db44STomer Tayar } 3731c965db44STomer Tayar 3732c965db44STomer Tayar if (!check_rule && dump) 3733c965db44STomer Tayar continue; 3734c965db44STomer Tayar 3735be086e7cSMintz, Yuval if (!dump) { 3736da090917STomer Tayar u32 entry_dump_size = 3737da090917STomer Tayar qed_idle_chk_dump_failure(p_hwfn, 3738be086e7cSMintz, Yuval p_ptt, 3739be086e7cSMintz, Yuval dump_buf + offset, 3740be086e7cSMintz, Yuval false, 3741be086e7cSMintz, Yuval rule->rule_id, 3742be086e7cSMintz, Yuval rule, 3743da090917STomer Tayar 0, 3744be086e7cSMintz, Yuval NULL); 3745da090917STomer Tayar 3746da090917STomer Tayar offset += num_reg_entries * entry_dump_size; 3747da090917STomer Tayar (*num_failing_rules) += num_reg_entries; 3748da090917STomer Tayar continue; 3749be086e7cSMintz, Yuval } 3750be086e7cSMintz, Yuval 3751da090917STomer Tayar /* Go over all register entries (number of entries is the same 3752da090917STomer Tayar * for all condition registers). 3753da090917STomer Tayar */ 3754da090917STomer Tayar for (entry_id = 0; entry_id < num_reg_entries; entry_id++) { 3755da090917STomer Tayar u32 next_reg_offset = 0; 3756da090917STomer Tayar 3757c965db44STomer Tayar /* Read current entry of all condition registers */ 3758be086e7cSMintz, Yuval for (reg_id = 0; reg_id < rule->num_cond_regs; 3759c965db44STomer Tayar reg_id++) { 3760be086e7cSMintz, Yuval const struct dbg_idle_chk_cond_reg *reg = 3761be086e7cSMintz, Yuval &cond_regs[reg_id]; 37627b6859fbSMintz, Yuval u32 padded_entry_size, addr; 37637b6859fbSMintz, Yuval bool wide_bus; 3764c965db44STomer Tayar 3765be086e7cSMintz, Yuval /* Find GRC address (if it's a memory, the 3766be086e7cSMintz, Yuval * address of the specific entry is calculated). 3767c965db44STomer Tayar */ 37687b6859fbSMintz, Yuval addr = GET_FIELD(reg->data, 3769be086e7cSMintz, Yuval DBG_IDLE_CHK_COND_REG_ADDRESS); 37707b6859fbSMintz, Yuval wide_bus = 37717b6859fbSMintz, Yuval GET_FIELD(reg->data, 37727b6859fbSMintz, Yuval DBG_IDLE_CHK_COND_REG_WIDE_BUS); 3773c965db44STomer Tayar if (reg->num_entries > 1 || 3774c965db44STomer Tayar reg->start_entry > 0) { 37757b6859fbSMintz, Yuval padded_entry_size = 3776c965db44STomer Tayar reg->entry_size > 1 ? 3777da090917STomer Tayar roundup_pow_of_two(reg->entry_size) : 3778da090917STomer Tayar 1; 3779be086e7cSMintz, Yuval addr += (reg->start_entry + entry_id) * 3780be086e7cSMintz, Yuval padded_entry_size; 3781c965db44STomer Tayar } 3782c965db44STomer Tayar 3783c965db44STomer Tayar /* Read registers */ 3784c965db44STomer Tayar if (next_reg_offset + reg->entry_size >= 3785c965db44STomer Tayar IDLE_CHK_MAX_ENTRIES_SIZE) { 3786c965db44STomer Tayar DP_NOTICE(p_hwfn, 3787c965db44STomer Tayar "idle check registers entry is too large\n"); 3788c965db44STomer Tayar return 0; 3789c965db44STomer Tayar } 3790c965db44STomer Tayar 3791be086e7cSMintz, Yuval next_reg_offset += 37927b6859fbSMintz, Yuval qed_grc_dump_addr_range(p_hwfn, p_ptt, 3793be086e7cSMintz, Yuval cond_reg_values + 3794be086e7cSMintz, Yuval next_reg_offset, 3795be086e7cSMintz, Yuval dump, addr, 37967b6859fbSMintz, Yuval reg->entry_size, 3797d52c89f1SMichal Kalderon wide_bus, 3798d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 3799c965db44STomer Tayar } 3800c965db44STomer Tayar 38017b6859fbSMintz, Yuval /* Call rule condition function. 38027b6859fbSMintz, Yuval * If returns true, it's a failure. 3803c965db44STomer Tayar */ 3804c965db44STomer Tayar if ((*cond_arr[rule->cond_id]) (cond_reg_values, 3805be086e7cSMintz, Yuval imm_values)) { 38067b6859fbSMintz, Yuval offset += qed_idle_chk_dump_failure(p_hwfn, 3807c965db44STomer Tayar p_ptt, 3808c965db44STomer Tayar dump_buf + offset, 3809c965db44STomer Tayar dump, 3810c965db44STomer Tayar rule->rule_id, 3811c965db44STomer Tayar rule, 3812c965db44STomer Tayar entry_id, 3813c965db44STomer Tayar cond_reg_values); 3814c965db44STomer Tayar (*num_failing_rules)++; 3815c965db44STomer Tayar } 3816c965db44STomer Tayar } 3817c965db44STomer Tayar } 3818c965db44STomer Tayar 3819c965db44STomer Tayar return offset; 3820c965db44STomer Tayar } 3821c965db44STomer Tayar 3822c965db44STomer Tayar /* Performs Idle Check Dump to the specified buffer. 3823c965db44STomer Tayar * Returns the dumped size in dwords. 3824c965db44STomer Tayar */ 3825c965db44STomer Tayar static u32 qed_idle_chk_dump(struct qed_hwfn *p_hwfn, 3826c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 3827c965db44STomer Tayar { 38282d22bc83SMichal Kalderon struct virt_mem_desc *dbg_buf = 38292d22bc83SMichal Kalderon &p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES]; 38302d22bc83SMichal Kalderon u32 num_failing_rules_offset, offset = 0, 38312d22bc83SMichal Kalderon input_offset = 0, num_failing_rules = 0; 3832c965db44STomer Tayar 38332d22bc83SMichal Kalderon /* Dump global params - 1 must match below amount of params */ 3834c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 3835c965db44STomer Tayar p_ptt, 3836c965db44STomer Tayar dump_buf + offset, dump, 1); 3837c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 3838c965db44STomer Tayar dump, "dump-type", "idle-chk"); 3839c965db44STomer Tayar 3840c965db44STomer Tayar /* Dump idle check section header with a single parameter */ 3841c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, dump, "idle_chk", 1); 3842c965db44STomer Tayar num_failing_rules_offset = offset; 3843c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "num_rules", 0); 38447b6859fbSMintz, Yuval 38452d22bc83SMichal Kalderon while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) { 3846c965db44STomer Tayar const struct dbg_idle_chk_cond_hdr *cond_hdr = 38472d22bc83SMichal Kalderon (const struct dbg_idle_chk_cond_hdr *)dbg_buf->ptr + 38482d22bc83SMichal Kalderon input_offset++; 38497b6859fbSMintz, Yuval bool eval_mode, mode_match = true; 38507b6859fbSMintz, Yuval u32 curr_failing_rules; 38517b6859fbSMintz, Yuval u16 modes_buf_offset; 3852c965db44STomer Tayar 3853c965db44STomer Tayar /* Check mode */ 38547b6859fbSMintz, Yuval eval_mode = GET_FIELD(cond_hdr->mode.data, 38557b6859fbSMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 3856c965db44STomer Tayar if (eval_mode) { 38577b6859fbSMintz, Yuval modes_buf_offset = 3858c965db44STomer Tayar GET_FIELD(cond_hdr->mode.data, 3859c965db44STomer Tayar DBG_MODE_HDR_MODES_BUF_OFFSET); 3860c965db44STomer Tayar mode_match = qed_is_mode_match(p_hwfn, 3861c965db44STomer Tayar &modes_buf_offset); 3862c965db44STomer Tayar } 3863c965db44STomer Tayar 3864c965db44STomer Tayar if (mode_match) { 38652d22bc83SMichal Kalderon const struct dbg_idle_chk_rule *rule = 38662d22bc83SMichal Kalderon (const struct dbg_idle_chk_rule *)((u32 *) 38672d22bc83SMichal Kalderon dbg_buf->ptr 38682d22bc83SMichal Kalderon + input_offset); 38692d22bc83SMichal Kalderon u32 num_input_rules = 38702d22bc83SMichal Kalderon cond_hdr->data_size / IDLE_CHK_RULE_SIZE_DWORDS; 3871c965db44STomer Tayar offset += 3872c965db44STomer Tayar qed_idle_chk_dump_rule_entries(p_hwfn, 3873c965db44STomer Tayar p_ptt, 38742d22bc83SMichal Kalderon dump_buf + 38752d22bc83SMichal Kalderon offset, 3876c965db44STomer Tayar dump, 38772d22bc83SMichal Kalderon rule, 38782d22bc83SMichal Kalderon num_input_rules, 3879c965db44STomer Tayar &curr_failing_rules); 3880c965db44STomer Tayar num_failing_rules += curr_failing_rules; 3881c965db44STomer Tayar } 3882c965db44STomer Tayar 3883c965db44STomer Tayar input_offset += cond_hdr->data_size; 3884c965db44STomer Tayar } 3885c965db44STomer Tayar 3886c965db44STomer Tayar /* Overwrite num_rules parameter */ 3887c965db44STomer Tayar if (dump) 3888c965db44STomer Tayar qed_dump_num_param(dump_buf + num_failing_rules_offset, 3889c965db44STomer Tayar dump, "num_rules", num_failing_rules); 3890c965db44STomer Tayar 38917b6859fbSMintz, Yuval /* Dump last section */ 3892da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 38937b6859fbSMintz, Yuval 3894c965db44STomer Tayar return offset; 3895c965db44STomer Tayar } 3896c965db44STomer Tayar 38977b6859fbSMintz, Yuval /* Finds the meta data image in NVRAM */ 3898c965db44STomer Tayar static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn, 3899c965db44STomer Tayar struct qed_ptt *p_ptt, 3900c965db44STomer Tayar u32 image_type, 3901c965db44STomer Tayar u32 *nvram_offset_bytes, 3902c965db44STomer Tayar u32 *nvram_size_bytes) 3903c965db44STomer Tayar { 3904c965db44STomer Tayar u32 ret_mcp_resp, ret_mcp_param, ret_txn_size; 3905c965db44STomer Tayar struct mcp_file_att file_att; 39067b6859fbSMintz, Yuval int nvm_result; 3907c965db44STomer Tayar 3908c965db44STomer Tayar /* Call NVRAM get file command */ 39097b6859fbSMintz, Yuval nvm_result = qed_mcp_nvm_rd_cmd(p_hwfn, 3910be086e7cSMintz, Yuval p_ptt, 3911be086e7cSMintz, Yuval DRV_MSG_CODE_NVM_GET_FILE_ATT, 3912be086e7cSMintz, Yuval image_type, 3913be086e7cSMintz, Yuval &ret_mcp_resp, 3914be086e7cSMintz, Yuval &ret_mcp_param, 39157b6859fbSMintz, Yuval &ret_txn_size, (u32 *)&file_att); 3916c965db44STomer Tayar 3917c965db44STomer Tayar /* Check response */ 3918be086e7cSMintz, Yuval if (nvm_result || 3919be086e7cSMintz, Yuval (ret_mcp_resp & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK) 3920c965db44STomer Tayar return DBG_STATUS_NVRAM_GET_IMAGE_FAILED; 3921c965db44STomer Tayar 3922c965db44STomer Tayar /* Update return values */ 3923c965db44STomer Tayar *nvram_offset_bytes = file_att.nvm_start_addr; 3924c965db44STomer Tayar *nvram_size_bytes = file_att.len; 39257b6859fbSMintz, Yuval 3926c965db44STomer Tayar DP_VERBOSE(p_hwfn, 3927c965db44STomer Tayar QED_MSG_DEBUG, 3928c965db44STomer Tayar "find_nvram_image: found NVRAM image of type %d in NVRAM offset %d bytes with size %d bytes\n", 3929c965db44STomer Tayar image_type, *nvram_offset_bytes, *nvram_size_bytes); 3930c965db44STomer Tayar 3931c965db44STomer Tayar /* Check alignment */ 3932c965db44STomer Tayar if (*nvram_size_bytes & 0x3) 3933c965db44STomer Tayar return DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE; 39347b6859fbSMintz, Yuval 3935c965db44STomer Tayar return DBG_STATUS_OK; 3936c965db44STomer Tayar } 3937c965db44STomer Tayar 39387b6859fbSMintz, Yuval /* Reads data from NVRAM */ 3939c965db44STomer Tayar static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn, 3940c965db44STomer Tayar struct qed_ptt *p_ptt, 3941c965db44STomer Tayar u32 nvram_offset_bytes, 3942c965db44STomer Tayar u32 nvram_size_bytes, u32 *ret_buf) 3943c965db44STomer Tayar { 39447b6859fbSMintz, Yuval u32 ret_mcp_resp, ret_mcp_param, ret_read_size, bytes_to_copy; 3945c965db44STomer Tayar s32 bytes_left = nvram_size_bytes; 39462d22bc83SMichal Kalderon u32 read_offset = 0, param = 0; 3947c965db44STomer Tayar 3948c965db44STomer Tayar DP_VERBOSE(p_hwfn, 3949c965db44STomer Tayar QED_MSG_DEBUG, 3950c965db44STomer Tayar "nvram_read: reading image of size %d bytes from NVRAM\n", 3951c965db44STomer Tayar nvram_size_bytes); 39527b6859fbSMintz, Yuval 3953c965db44STomer Tayar do { 3954c965db44STomer Tayar bytes_to_copy = 3955c965db44STomer Tayar (bytes_left > 3956c965db44STomer Tayar MCP_DRV_NVM_BUF_LEN) ? MCP_DRV_NVM_BUF_LEN : bytes_left; 3957c965db44STomer Tayar 3958c965db44STomer Tayar /* Call NVRAM read command */ 39592d22bc83SMichal Kalderon SET_MFW_FIELD(param, 39602d22bc83SMichal Kalderon DRV_MB_PARAM_NVM_OFFSET, 39612d22bc83SMichal Kalderon nvram_offset_bytes + read_offset); 39622d22bc83SMichal Kalderon SET_MFW_FIELD(param, DRV_MB_PARAM_NVM_LEN, bytes_to_copy); 3963c965db44STomer Tayar if (qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt, 39642d22bc83SMichal Kalderon DRV_MSG_CODE_NVM_READ_NVRAM, param, 39652d22bc83SMichal Kalderon &ret_mcp_resp, 39662d22bc83SMichal Kalderon &ret_mcp_param, &ret_read_size, 39677b6859fbSMintz, Yuval (u32 *)((u8 *)ret_buf + read_offset))) 3968c965db44STomer Tayar return DBG_STATUS_NVRAM_READ_FAILED; 3969c965db44STomer Tayar 3970c965db44STomer Tayar /* Check response */ 3971c965db44STomer Tayar if ((ret_mcp_resp & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK) 3972c965db44STomer Tayar return DBG_STATUS_NVRAM_READ_FAILED; 3973c965db44STomer Tayar 3974c965db44STomer Tayar /* Update read offset */ 3975c965db44STomer Tayar read_offset += ret_read_size; 3976c965db44STomer Tayar bytes_left -= ret_read_size; 3977c965db44STomer Tayar } while (bytes_left > 0); 3978c965db44STomer Tayar 3979c965db44STomer Tayar return DBG_STATUS_OK; 3980c965db44STomer Tayar } 3981c965db44STomer Tayar 3982c965db44STomer Tayar /* Get info on the MCP Trace data in the scratchpad: 39837b6859fbSMintz, Yuval * - trace_data_grc_addr (OUT): trace data GRC address in bytes 39847b6859fbSMintz, Yuval * - trace_data_size (OUT): trace data size in bytes (without the header) 3985c965db44STomer Tayar */ 3986c965db44STomer Tayar static enum dbg_status qed_mcp_trace_get_data_info(struct qed_hwfn *p_hwfn, 3987c965db44STomer Tayar struct qed_ptt *p_ptt, 3988c965db44STomer Tayar u32 *trace_data_grc_addr, 39897b6859fbSMintz, Yuval u32 *trace_data_size) 3990c965db44STomer Tayar { 39917b6859fbSMintz, Yuval u32 spad_trace_offsize, signature; 3992c965db44STomer Tayar 39937b6859fbSMintz, Yuval /* Read trace section offsize structure from MCP scratchpad */ 39947b6859fbSMintz, Yuval spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR); 39957b6859fbSMintz, Yuval 39967b6859fbSMintz, Yuval /* Extract trace section address from offsize (in scratchpad) */ 3997c965db44STomer Tayar *trace_data_grc_addr = 3998c965db44STomer Tayar MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize); 3999c965db44STomer Tayar 4000c965db44STomer Tayar /* Read signature from MCP trace section */ 4001c965db44STomer Tayar signature = qed_rd(p_hwfn, p_ptt, 4002c965db44STomer Tayar *trace_data_grc_addr + 4003c965db44STomer Tayar offsetof(struct mcp_trace, signature)); 40047b6859fbSMintz, Yuval 4005c965db44STomer Tayar if (signature != MFW_TRACE_SIGNATURE) 4006c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 4007c965db44STomer Tayar 4008c965db44STomer Tayar /* Read trace size from MCP trace section */ 40097b6859fbSMintz, Yuval *trace_data_size = qed_rd(p_hwfn, 4010c965db44STomer Tayar p_ptt, 4011c965db44STomer Tayar *trace_data_grc_addr + 4012c965db44STomer Tayar offsetof(struct mcp_trace, size)); 40137b6859fbSMintz, Yuval 4014c965db44STomer Tayar return DBG_STATUS_OK; 4015c965db44STomer Tayar } 4016c965db44STomer Tayar 40177b6859fbSMintz, Yuval /* Reads MCP trace meta data image from NVRAM 40187b6859fbSMintz, Yuval * - running_bundle_id (OUT): running bundle ID (invalid when loaded from file) 40197b6859fbSMintz, Yuval * - trace_meta_offset (OUT): trace meta offset in NVRAM in bytes (invalid when 40207b6859fbSMintz, Yuval * loaded from file). 40217b6859fbSMintz, Yuval * - trace_meta_size (OUT): size in bytes of the trace meta data. 4022c965db44STomer Tayar */ 4023c965db44STomer Tayar static enum dbg_status qed_mcp_trace_get_meta_info(struct qed_hwfn *p_hwfn, 4024c965db44STomer Tayar struct qed_ptt *p_ptt, 4025c965db44STomer Tayar u32 trace_data_size_bytes, 4026c965db44STomer Tayar u32 *running_bundle_id, 40277b6859fbSMintz, Yuval u32 *trace_meta_offset, 40287b6859fbSMintz, Yuval u32 *trace_meta_size) 4029c965db44STomer Tayar { 40307b6859fbSMintz, Yuval u32 spad_trace_offsize, nvram_image_type, running_mfw_addr; 40317b6859fbSMintz, Yuval 4032c965db44STomer Tayar /* Read MCP trace section offsize structure from MCP scratchpad */ 40337b6859fbSMintz, Yuval spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR); 4034c965db44STomer Tayar 4035c965db44STomer Tayar /* Find running bundle ID */ 40367b6859fbSMintz, Yuval running_mfw_addr = 4037c965db44STomer Tayar MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize) + 4038c965db44STomer Tayar QED_SECTION_SIZE(spad_trace_offsize) + trace_data_size_bytes; 4039c965db44STomer Tayar *running_bundle_id = qed_rd(p_hwfn, p_ptt, running_mfw_addr); 4040c965db44STomer Tayar if (*running_bundle_id > 1) 4041c965db44STomer Tayar return DBG_STATUS_INVALID_NVRAM_BUNDLE; 4042c965db44STomer Tayar 4043c965db44STomer Tayar /* Find image in NVRAM */ 4044c965db44STomer Tayar nvram_image_type = 4045c965db44STomer Tayar (*running_bundle_id == 4046c965db44STomer Tayar DIR_ID_1) ? NVM_TYPE_MFW_TRACE1 : NVM_TYPE_MFW_TRACE2; 4047be086e7cSMintz, Yuval return qed_find_nvram_image(p_hwfn, 4048c965db44STomer Tayar p_ptt, 4049c965db44STomer Tayar nvram_image_type, 40507b6859fbSMintz, Yuval trace_meta_offset, trace_meta_size); 4051c965db44STomer Tayar } 4052c965db44STomer Tayar 40537b6859fbSMintz, Yuval /* Reads the MCP Trace meta data from NVRAM into the specified buffer */ 4054c965db44STomer Tayar static enum dbg_status qed_mcp_trace_read_meta(struct qed_hwfn *p_hwfn, 4055c965db44STomer Tayar struct qed_ptt *p_ptt, 4056c965db44STomer Tayar u32 nvram_offset_in_bytes, 4057c965db44STomer Tayar u32 size_in_bytes, u32 *buf) 4058c965db44STomer Tayar { 40597b6859fbSMintz, Yuval u8 modules_num, module_len, i, *byte_buf = (u8 *)buf; 40607b6859fbSMintz, Yuval enum dbg_status status; 4061c965db44STomer Tayar u32 signature; 4062c965db44STomer Tayar 4063c965db44STomer Tayar /* Read meta data from NVRAM */ 40647b6859fbSMintz, Yuval status = qed_nvram_read(p_hwfn, 4065c965db44STomer Tayar p_ptt, 40667b6859fbSMintz, Yuval nvram_offset_in_bytes, size_in_bytes, buf); 4067c965db44STomer Tayar if (status != DBG_STATUS_OK) 4068c965db44STomer Tayar return status; 4069c965db44STomer Tayar 4070c965db44STomer Tayar /* Extract and check first signature */ 4071c965db44STomer Tayar signature = qed_read_unaligned_dword(byte_buf); 40727b6859fbSMintz, Yuval byte_buf += sizeof(signature); 40737b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 4074c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 4075c965db44STomer Tayar 4076c965db44STomer Tayar /* Extract number of modules */ 4077c965db44STomer Tayar modules_num = *(byte_buf++); 4078c965db44STomer Tayar 4079c965db44STomer Tayar /* Skip all modules */ 4080c965db44STomer Tayar for (i = 0; i < modules_num; i++) { 40817b6859fbSMintz, Yuval module_len = *(byte_buf++); 4082c965db44STomer Tayar byte_buf += module_len; 4083c965db44STomer Tayar } 4084c965db44STomer Tayar 4085c965db44STomer Tayar /* Extract and check second signature */ 4086c965db44STomer Tayar signature = qed_read_unaligned_dword(byte_buf); 40877b6859fbSMintz, Yuval byte_buf += sizeof(signature); 40887b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 4089c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 40907b6859fbSMintz, Yuval 4091c965db44STomer Tayar return DBG_STATUS_OK; 4092c965db44STomer Tayar } 4093c965db44STomer Tayar 4094c965db44STomer Tayar /* Dump MCP Trace */ 40958c93beafSYuval Mintz static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn, 4096c965db44STomer Tayar struct qed_ptt *p_ptt, 4097c965db44STomer Tayar u32 *dump_buf, 4098c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 4099c965db44STomer Tayar { 4100c965db44STomer Tayar u32 trace_data_grc_addr, trace_data_size_bytes, trace_data_size_dwords; 4101be086e7cSMintz, Yuval u32 trace_meta_size_dwords = 0, running_bundle_id, offset = 0; 4102be086e7cSMintz, Yuval u32 trace_meta_offset_bytes = 0, trace_meta_size_bytes = 0; 4103c965db44STomer Tayar enum dbg_status status; 4104c965db44STomer Tayar int halted = 0; 41052d22bc83SMichal Kalderon bool use_mfw; 4106c965db44STomer Tayar 4107c965db44STomer Tayar *num_dumped_dwords = 0; 4108c965db44STomer Tayar 41092d22bc83SMichal Kalderon use_mfw = !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP); 41107b6859fbSMintz, Yuval 4111c965db44STomer Tayar /* Get trace data info */ 4112c965db44STomer Tayar status = qed_mcp_trace_get_data_info(p_hwfn, 4113c965db44STomer Tayar p_ptt, 4114c965db44STomer Tayar &trace_data_grc_addr, 4115c965db44STomer Tayar &trace_data_size_bytes); 4116c965db44STomer Tayar if (status != DBG_STATUS_OK) 4117c965db44STomer Tayar return status; 4118c965db44STomer Tayar 4119c965db44STomer Tayar /* Dump global params */ 4120c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4121c965db44STomer Tayar p_ptt, 4122c965db44STomer Tayar dump_buf + offset, dump, 1); 4123c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4124c965db44STomer Tayar dump, "dump-type", "mcp-trace"); 4125c965db44STomer Tayar 4126c965db44STomer Tayar /* Halt MCP while reading from scratchpad so the read data will be 41277b6859fbSMintz, Yuval * consistent. if halt fails, MCP trace is taken anyway, with a small 4128c965db44STomer Tayar * risk that it may be corrupt. 4129c965db44STomer Tayar */ 41302d22bc83SMichal Kalderon if (dump && use_mfw) { 4131c965db44STomer Tayar halted = !qed_mcp_halt(p_hwfn, p_ptt); 4132c965db44STomer Tayar if (!halted) 4133c965db44STomer Tayar DP_NOTICE(p_hwfn, "MCP halt failed!\n"); 4134c965db44STomer Tayar } 4135c965db44STomer Tayar 4136c965db44STomer Tayar /* Find trace data size */ 4137c965db44STomer Tayar trace_data_size_dwords = 4138c965db44STomer Tayar DIV_ROUND_UP(trace_data_size_bytes + sizeof(struct mcp_trace), 4139c965db44STomer Tayar BYTES_IN_DWORD); 4140c965db44STomer Tayar 4141c965db44STomer Tayar /* Dump trace data section header and param */ 4142c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4143c965db44STomer Tayar dump, "mcp_trace_data", 1); 4144c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, 4145c965db44STomer Tayar dump, "size", trace_data_size_dwords); 4146c965db44STomer Tayar 4147c965db44STomer Tayar /* Read trace data from scratchpad into dump buffer */ 4148be086e7cSMintz, Yuval offset += qed_grc_dump_addr_range(p_hwfn, 4149c965db44STomer Tayar p_ptt, 4150be086e7cSMintz, Yuval dump_buf + offset, 4151be086e7cSMintz, Yuval dump, 4152be086e7cSMintz, Yuval BYTES_TO_DWORDS(trace_data_grc_addr), 4153d52c89f1SMichal Kalderon trace_data_size_dwords, false, 4154d52c89f1SMichal Kalderon SPLIT_TYPE_NONE, 0); 4155c965db44STomer Tayar 4156c965db44STomer Tayar /* Resume MCP (only if halt succeeded) */ 41577b6859fbSMintz, Yuval if (halted && qed_mcp_resume(p_hwfn, p_ptt)) 4158c965db44STomer Tayar DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n"); 4159c965db44STomer Tayar 4160c965db44STomer Tayar /* Dump trace meta section header */ 4161c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4162c965db44STomer Tayar dump, "mcp_trace_meta", 1); 4163c965db44STomer Tayar 416450bc60cbSMichal Kalderon /* If MCP Trace meta size parameter was set, use it. 416550bc60cbSMichal Kalderon * Otherwise, read trace meta. 416650bc60cbSMichal Kalderon * trace_meta_size_bytes is dword-aligned. 416750bc60cbSMichal Kalderon */ 416850bc60cbSMichal Kalderon trace_meta_size_bytes = 416950bc60cbSMichal Kalderon qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_MCP_TRACE_META_SIZE); 41702d22bc83SMichal Kalderon if ((!trace_meta_size_bytes || dump) && use_mfw) 4171c965db44STomer Tayar status = qed_mcp_trace_get_meta_info(p_hwfn, 4172c965db44STomer Tayar p_ptt, 4173c965db44STomer Tayar trace_data_size_bytes, 4174c965db44STomer Tayar &running_bundle_id, 4175c965db44STomer Tayar &trace_meta_offset_bytes, 4176c965db44STomer Tayar &trace_meta_size_bytes); 4177be086e7cSMintz, Yuval if (status == DBG_STATUS_OK) 41782d22bc83SMichal Kalderon trace_meta_size_dwords = BYTES_TO_DWORDS(trace_meta_size_bytes); 4179c965db44STomer Tayar 4180be086e7cSMintz, Yuval /* Dump trace meta size param */ 4181be086e7cSMintz, Yuval offset += qed_dump_num_param(dump_buf + offset, 4182be086e7cSMintz, Yuval dump, "size", trace_meta_size_dwords); 4183c965db44STomer Tayar 4184c965db44STomer Tayar /* Read trace meta image into dump buffer */ 4185be086e7cSMintz, Yuval if (dump && trace_meta_size_dwords) 4186c965db44STomer Tayar status = qed_mcp_trace_read_meta(p_hwfn, 4187c965db44STomer Tayar p_ptt, 4188c965db44STomer Tayar trace_meta_offset_bytes, 4189c965db44STomer Tayar trace_meta_size_bytes, 4190c965db44STomer Tayar dump_buf + offset); 4191be086e7cSMintz, Yuval if (status == DBG_STATUS_OK) 4192c965db44STomer Tayar offset += trace_meta_size_dwords; 4193c965db44STomer Tayar 41947b6859fbSMintz, Yuval /* Dump last section */ 4195da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 41967b6859fbSMintz, Yuval 4197c965db44STomer Tayar *num_dumped_dwords = offset; 4198c965db44STomer Tayar 4199be086e7cSMintz, Yuval /* If no mcp access, indicate that the dump doesn't contain the meta 4200be086e7cSMintz, Yuval * data from NVRAM. 4201be086e7cSMintz, Yuval */ 42022d22bc83SMichal Kalderon return use_mfw ? status : DBG_STATUS_NVRAM_GET_IMAGE_FAILED; 4203c965db44STomer Tayar } 4204c965db44STomer Tayar 4205c965db44STomer Tayar /* Dump GRC FIFO */ 42068c93beafSYuval Mintz static enum dbg_status qed_reg_fifo_dump(struct qed_hwfn *p_hwfn, 4207c965db44STomer Tayar struct qed_ptt *p_ptt, 4208c965db44STomer Tayar u32 *dump_buf, 4209c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 4210c965db44STomer Tayar { 4211da090917STomer Tayar u32 dwords_read, size_param_offset, offset = 0, addr, len; 4212c965db44STomer Tayar bool fifo_has_data; 4213c965db44STomer Tayar 4214c965db44STomer Tayar *num_dumped_dwords = 0; 4215c965db44STomer Tayar 4216c965db44STomer Tayar /* Dump global params */ 4217c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4218c965db44STomer Tayar p_ptt, 4219c965db44STomer Tayar dump_buf + offset, dump, 1); 4220c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4221c965db44STomer Tayar dump, "dump-type", "reg-fifo"); 4222c965db44STomer Tayar 42237b6859fbSMintz, Yuval /* Dump fifo data section header and param. The size param is 0 for 42247b6859fbSMintz, Yuval * now, and is overwritten after reading the FIFO. 4225c965db44STomer Tayar */ 4226c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4227c965db44STomer Tayar dump, "reg_fifo_data", 1); 4228c965db44STomer Tayar size_param_offset = offset; 4229c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0); 4230c965db44STomer Tayar 4231c965db44STomer Tayar if (!dump) { 4232c965db44STomer Tayar /* FIFO max size is REG_FIFO_DEPTH_DWORDS. There is no way to 4233c965db44STomer Tayar * test how much data is available, except for reading it. 4234c965db44STomer Tayar */ 4235c965db44STomer Tayar offset += REG_FIFO_DEPTH_DWORDS; 42367b6859fbSMintz, Yuval goto out; 4237c965db44STomer Tayar } 4238c965db44STomer Tayar 4239c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4240c965db44STomer Tayar GRC_REG_TRACE_FIFO_VALID_DATA) > 0; 4241c965db44STomer Tayar 4242c965db44STomer Tayar /* Pull available data from fifo. Use DMAE since this is widebus memory 4243c965db44STomer Tayar * and must be accessed atomically. Test for dwords_read not passing 4244c965db44STomer Tayar * buffer size since more entries could be added to the buffer as we are 4245c965db44STomer Tayar * emptying it. 4246c965db44STomer Tayar */ 4247da090917STomer Tayar addr = BYTES_TO_DWORDS(GRC_REG_TRACE_FIFO); 4248da090917STomer Tayar len = REG_FIFO_ELEMENT_DWORDS; 4249c965db44STomer Tayar for (dwords_read = 0; 4250c965db44STomer Tayar fifo_has_data && dwords_read < REG_FIFO_DEPTH_DWORDS; 4251da090917STomer Tayar dwords_read += REG_FIFO_ELEMENT_DWORDS) { 4252da090917STomer Tayar offset += qed_grc_dump_addr_range(p_hwfn, 4253da090917STomer Tayar p_ptt, 4254da090917STomer Tayar dump_buf + offset, 4255da090917STomer Tayar true, 4256da090917STomer Tayar addr, 4257da090917STomer Tayar len, 4258d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 4259d52c89f1SMichal Kalderon 0); 4260c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4261c965db44STomer Tayar GRC_REG_TRACE_FIFO_VALID_DATA) > 0; 4262c965db44STomer Tayar } 4263c965db44STomer Tayar 4264c965db44STomer Tayar qed_dump_num_param(dump_buf + size_param_offset, dump, "size", 4265c965db44STomer Tayar dwords_read); 42667b6859fbSMintz, Yuval out: 42677b6859fbSMintz, Yuval /* Dump last section */ 4268da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 4269c965db44STomer Tayar 4270c965db44STomer Tayar *num_dumped_dwords = offset; 42717b6859fbSMintz, Yuval 4272c965db44STomer Tayar return DBG_STATUS_OK; 4273c965db44STomer Tayar } 4274c965db44STomer Tayar 4275c965db44STomer Tayar /* Dump IGU FIFO */ 42768c93beafSYuval Mintz static enum dbg_status qed_igu_fifo_dump(struct qed_hwfn *p_hwfn, 4277c965db44STomer Tayar struct qed_ptt *p_ptt, 4278c965db44STomer Tayar u32 *dump_buf, 4279c965db44STomer Tayar bool dump, u32 *num_dumped_dwords) 4280c965db44STomer Tayar { 4281da090917STomer Tayar u32 dwords_read, size_param_offset, offset = 0, addr, len; 4282c965db44STomer Tayar bool fifo_has_data; 4283c965db44STomer Tayar 4284c965db44STomer Tayar *num_dumped_dwords = 0; 4285c965db44STomer Tayar 4286c965db44STomer Tayar /* Dump global params */ 4287c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4288c965db44STomer Tayar p_ptt, 4289c965db44STomer Tayar dump_buf + offset, dump, 1); 4290c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4291c965db44STomer Tayar dump, "dump-type", "igu-fifo"); 4292c965db44STomer Tayar 42937b6859fbSMintz, Yuval /* Dump fifo data section header and param. The size param is 0 for 42947b6859fbSMintz, Yuval * now, and is overwritten after reading the FIFO. 4295c965db44STomer Tayar */ 4296c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4297c965db44STomer Tayar dump, "igu_fifo_data", 1); 4298c965db44STomer Tayar size_param_offset = offset; 4299c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0); 4300c965db44STomer Tayar 4301c965db44STomer Tayar if (!dump) { 4302c965db44STomer Tayar /* FIFO max size is IGU_FIFO_DEPTH_DWORDS. There is no way to 4303c965db44STomer Tayar * test how much data is available, except for reading it. 4304c965db44STomer Tayar */ 4305c965db44STomer Tayar offset += IGU_FIFO_DEPTH_DWORDS; 43067b6859fbSMintz, Yuval goto out; 4307c965db44STomer Tayar } 4308c965db44STomer Tayar 4309c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4310c965db44STomer Tayar IGU_REG_ERROR_HANDLING_DATA_VALID) > 0; 4311c965db44STomer Tayar 4312c965db44STomer Tayar /* Pull available data from fifo. Use DMAE since this is widebus memory 4313c965db44STomer Tayar * and must be accessed atomically. Test for dwords_read not passing 4314c965db44STomer Tayar * buffer size since more entries could be added to the buffer as we are 4315c965db44STomer Tayar * emptying it. 4316c965db44STomer Tayar */ 4317da090917STomer Tayar addr = BYTES_TO_DWORDS(IGU_REG_ERROR_HANDLING_MEMORY); 4318da090917STomer Tayar len = IGU_FIFO_ELEMENT_DWORDS; 4319c965db44STomer Tayar for (dwords_read = 0; 4320c965db44STomer Tayar fifo_has_data && dwords_read < IGU_FIFO_DEPTH_DWORDS; 4321da090917STomer Tayar dwords_read += IGU_FIFO_ELEMENT_DWORDS) { 4322da090917STomer Tayar offset += qed_grc_dump_addr_range(p_hwfn, 4323da090917STomer Tayar p_ptt, 4324da090917STomer Tayar dump_buf + offset, 4325da090917STomer Tayar true, 4326da090917STomer Tayar addr, 4327da090917STomer Tayar len, 4328d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 4329d52c89f1SMichal Kalderon 0); 4330c965db44STomer Tayar fifo_has_data = qed_rd(p_hwfn, p_ptt, 4331c965db44STomer Tayar IGU_REG_ERROR_HANDLING_DATA_VALID) > 0; 4332c965db44STomer Tayar } 4333c965db44STomer Tayar 4334c965db44STomer Tayar qed_dump_num_param(dump_buf + size_param_offset, dump, "size", 4335c965db44STomer Tayar dwords_read); 43367b6859fbSMintz, Yuval out: 43377b6859fbSMintz, Yuval /* Dump last section */ 4338da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 4339c965db44STomer Tayar 4340c965db44STomer Tayar *num_dumped_dwords = offset; 43417b6859fbSMintz, Yuval 4342c965db44STomer Tayar return DBG_STATUS_OK; 4343c965db44STomer Tayar } 4344c965db44STomer Tayar 4345c965db44STomer Tayar /* Protection Override dump */ 43468c93beafSYuval Mintz static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn, 4347c965db44STomer Tayar struct qed_ptt *p_ptt, 4348c965db44STomer Tayar u32 *dump_buf, 43498c93beafSYuval Mintz bool dump, 43508c93beafSYuval Mintz u32 *num_dumped_dwords) 4351c965db44STomer Tayar { 4352da090917STomer Tayar u32 size_param_offset, override_window_dwords, offset = 0, addr; 4353c965db44STomer Tayar 4354c965db44STomer Tayar *num_dumped_dwords = 0; 4355c965db44STomer Tayar 4356c965db44STomer Tayar /* Dump global params */ 4357c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4358c965db44STomer Tayar p_ptt, 4359c965db44STomer Tayar dump_buf + offset, dump, 1); 4360c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4361c965db44STomer Tayar dump, "dump-type", "protection-override"); 4362c965db44STomer Tayar 43637b6859fbSMintz, Yuval /* Dump data section header and param. The size param is 0 for now, 43647b6859fbSMintz, Yuval * and is overwritten after reading the data. 4365c965db44STomer Tayar */ 4366c965db44STomer Tayar offset += qed_dump_section_hdr(dump_buf + offset, 4367c965db44STomer Tayar dump, "protection_override_data", 1); 4368c965db44STomer Tayar size_param_offset = offset; 4369c965db44STomer Tayar offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0); 4370c965db44STomer Tayar 4371c965db44STomer Tayar if (!dump) { 4372c965db44STomer Tayar offset += PROTECTION_OVERRIDE_DEPTH_DWORDS; 43737b6859fbSMintz, Yuval goto out; 4374c965db44STomer Tayar } 4375c965db44STomer Tayar 4376c965db44STomer Tayar /* Add override window info to buffer */ 4377c965db44STomer Tayar override_window_dwords = 4378da090917STomer Tayar qed_rd(p_hwfn, p_ptt, GRC_REG_NUMBER_VALID_OVERRIDE_WINDOW) * 4379c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_DWORDS; 43808a52bbabSMichal Kalderon if (override_window_dwords) { 4381da090917STomer Tayar addr = BYTES_TO_DWORDS(GRC_REG_PROTECTION_OVERRIDE_WINDOW); 4382da090917STomer Tayar offset += qed_grc_dump_addr_range(p_hwfn, 4383da090917STomer Tayar p_ptt, 4384da090917STomer Tayar dump_buf + offset, 4385da090917STomer Tayar true, 4386da090917STomer Tayar addr, 4387da090917STomer Tayar override_window_dwords, 4388d52c89f1SMichal Kalderon true, SPLIT_TYPE_NONE, 0); 4389c965db44STomer Tayar qed_dump_num_param(dump_buf + size_param_offset, dump, "size", 4390c965db44STomer Tayar override_window_dwords); 43918a52bbabSMichal Kalderon } 43927b6859fbSMintz, Yuval out: 43937b6859fbSMintz, Yuval /* Dump last section */ 4394da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 4395c965db44STomer Tayar 4396c965db44STomer Tayar *num_dumped_dwords = offset; 43977b6859fbSMintz, Yuval 4398c965db44STomer Tayar return DBG_STATUS_OK; 4399c965db44STomer Tayar } 4400c965db44STomer Tayar 4401c965db44STomer Tayar /* Performs FW Asserts Dump to the specified buffer. 4402c965db44STomer Tayar * Returns the dumped size in dwords. 4403c965db44STomer Tayar */ 4404c965db44STomer Tayar static u32 qed_fw_asserts_dump(struct qed_hwfn *p_hwfn, 4405c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 4406c965db44STomer Tayar { 4407c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 4408be086e7cSMintz, Yuval struct fw_asserts_ram_section *asserts; 4409c965db44STomer Tayar char storm_letter_str[2] = "?"; 4410c965db44STomer Tayar struct fw_info fw_info; 4411be086e7cSMintz, Yuval u32 offset = 0; 4412c965db44STomer Tayar u8 storm_id; 4413c965db44STomer Tayar 4414c965db44STomer Tayar /* Dump global params */ 4415c965db44STomer Tayar offset += qed_dump_common_global_params(p_hwfn, 4416c965db44STomer Tayar p_ptt, 4417c965db44STomer Tayar dump_buf + offset, dump, 1); 4418c965db44STomer Tayar offset += qed_dump_str_param(dump_buf + offset, 4419c965db44STomer Tayar dump, "dump-type", "fw-asserts"); 44207b6859fbSMintz, Yuval 44217b6859fbSMintz, Yuval /* Find Storm dump size */ 4422c965db44STomer Tayar for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 4423be086e7cSMintz, Yuval u32 fw_asserts_section_addr, next_list_idx_addr, next_list_idx; 44247b6859fbSMintz, Yuval struct storm_defs *storm = &s_storm_defs[storm_id]; 4425be086e7cSMintz, Yuval u32 last_list_idx, addr; 4426c965db44STomer Tayar 44272d22bc83SMichal Kalderon if (dev_data->block_in_reset[storm->sem_block_id]) 4428c965db44STomer Tayar continue; 4429c965db44STomer Tayar 4430c965db44STomer Tayar /* Read FW info for the current Storm */ 4431d52c89f1SMichal Kalderon qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, &fw_info); 4432c965db44STomer Tayar 4433be086e7cSMintz, Yuval asserts = &fw_info.fw_asserts_section; 4434be086e7cSMintz, Yuval 4435c965db44STomer Tayar /* Dump FW Asserts section header and params */ 44367b6859fbSMintz, Yuval storm_letter_str[0] = storm->letter; 44377b6859fbSMintz, Yuval offset += qed_dump_section_hdr(dump_buf + offset, 44387b6859fbSMintz, Yuval dump, "fw_asserts", 2); 44397b6859fbSMintz, Yuval offset += qed_dump_str_param(dump_buf + offset, 44407b6859fbSMintz, Yuval dump, "storm", storm_letter_str); 44417b6859fbSMintz, Yuval offset += qed_dump_num_param(dump_buf + offset, 44427b6859fbSMintz, Yuval dump, 44437b6859fbSMintz, Yuval "size", 4444be086e7cSMintz, Yuval asserts->list_element_dword_size); 4445c965db44STomer Tayar 44467b6859fbSMintz, Yuval /* Read and dump FW Asserts data */ 4447c965db44STomer Tayar if (!dump) { 4448be086e7cSMintz, Yuval offset += asserts->list_element_dword_size; 4449c965db44STomer Tayar continue; 4450c965db44STomer Tayar } 4451c965db44STomer Tayar 44525ab90341SAlexander Lobakin addr = le16_to_cpu(asserts->section_ram_line_offset); 44537b6859fbSMintz, Yuval fw_asserts_section_addr = storm->sem_fast_mem_addr + 4454c965db44STomer Tayar SEM_FAST_REG_INT_RAM + 44555ab90341SAlexander Lobakin RAM_LINES_TO_BYTES(addr); 44565ab90341SAlexander Lobakin 44577b6859fbSMintz, Yuval next_list_idx_addr = fw_asserts_section_addr + 4458be086e7cSMintz, Yuval DWORDS_TO_BYTES(asserts->list_next_index_dword_offset); 4459c965db44STomer Tayar next_list_idx = qed_rd(p_hwfn, p_ptt, next_list_idx_addr); 4460da090917STomer Tayar last_list_idx = (next_list_idx > 0 ? 4461da090917STomer Tayar next_list_idx : 4462da090917STomer Tayar asserts->list_num_elements) - 1; 4463be086e7cSMintz, Yuval addr = BYTES_TO_DWORDS(fw_asserts_section_addr) + 4464be086e7cSMintz, Yuval asserts->list_dword_offset + 4465be086e7cSMintz, Yuval last_list_idx * asserts->list_element_dword_size; 4466be086e7cSMintz, Yuval offset += 4467be086e7cSMintz, Yuval qed_grc_dump_addr_range(p_hwfn, p_ptt, 4468be086e7cSMintz, Yuval dump_buf + offset, 4469be086e7cSMintz, Yuval dump, addr, 44707b6859fbSMintz, Yuval asserts->list_element_dword_size, 4471d52c89f1SMichal Kalderon false, SPLIT_TYPE_NONE, 0); 4472c965db44STomer Tayar } 4473c965db44STomer Tayar 4474c965db44STomer Tayar /* Dump last section */ 4475da090917STomer Tayar offset += qed_dump_last_section(dump_buf, offset, dump); 44767b6859fbSMintz, Yuval 4477c965db44STomer Tayar return offset; 4478c965db44STomer Tayar } 4479c965db44STomer Tayar 44808a52bbabSMichal Kalderon /* Dumps the specified ILT pages to the specified buffer. 44818a52bbabSMichal Kalderon * Returns the dumped size in dwords. 44828a52bbabSMichal Kalderon */ 44838a52bbabSMichal Kalderon static u32 qed_ilt_dump_pages_range(u32 *dump_buf, 44848a52bbabSMichal Kalderon bool dump, 44858a52bbabSMichal Kalderon u32 start_page_id, 44868a52bbabSMichal Kalderon u32 num_pages, 44878a52bbabSMichal Kalderon struct phys_mem_desc *ilt_pages, 44888a52bbabSMichal Kalderon bool dump_page_ids) 44898a52bbabSMichal Kalderon { 44908a52bbabSMichal Kalderon u32 page_id, end_page_id, offset = 0; 44918a52bbabSMichal Kalderon 44928a52bbabSMichal Kalderon if (num_pages == 0) 44938a52bbabSMichal Kalderon return offset; 44948a52bbabSMichal Kalderon 44958a52bbabSMichal Kalderon end_page_id = start_page_id + num_pages - 1; 44968a52bbabSMichal Kalderon 44978a52bbabSMichal Kalderon for (page_id = start_page_id; page_id <= end_page_id; page_id++) { 44988a52bbabSMichal Kalderon struct phys_mem_desc *mem_desc = &ilt_pages[page_id]; 44998a52bbabSMichal Kalderon 45008a52bbabSMichal Kalderon /** 45018a52bbabSMichal Kalderon * 45028a52bbabSMichal Kalderon * if (page_id >= ->p_cxt_mngr->ilt_shadow_size) 45038a52bbabSMichal Kalderon * break; 45048a52bbabSMichal Kalderon */ 45058a52bbabSMichal Kalderon 45068a52bbabSMichal Kalderon if (!ilt_pages[page_id].virt_addr) 45078a52bbabSMichal Kalderon continue; 45088a52bbabSMichal Kalderon 45098a52bbabSMichal Kalderon if (dump_page_ids) { 45108a52bbabSMichal Kalderon /* Copy page ID to dump buffer */ 45118a52bbabSMichal Kalderon if (dump) 45128a52bbabSMichal Kalderon *(dump_buf + offset) = page_id; 45138a52bbabSMichal Kalderon offset++; 45148a52bbabSMichal Kalderon } else { 45158a52bbabSMichal Kalderon /* Copy page memory to dump buffer */ 45168a52bbabSMichal Kalderon if (dump) 45178a52bbabSMichal Kalderon memcpy(dump_buf + offset, 45188a52bbabSMichal Kalderon mem_desc->virt_addr, mem_desc->size); 45198a52bbabSMichal Kalderon offset += BYTES_TO_DWORDS(mem_desc->size); 45208a52bbabSMichal Kalderon } 45218a52bbabSMichal Kalderon } 45228a52bbabSMichal Kalderon 45238a52bbabSMichal Kalderon return offset; 45248a52bbabSMichal Kalderon } 45258a52bbabSMichal Kalderon 45268a52bbabSMichal Kalderon /* Dumps a section containing the dumped ILT pages. 45278a52bbabSMichal Kalderon * Returns the dumped size in dwords. 45288a52bbabSMichal Kalderon */ 45298a52bbabSMichal Kalderon static u32 qed_ilt_dump_pages_section(struct qed_hwfn *p_hwfn, 45308a52bbabSMichal Kalderon u32 *dump_buf, 45318a52bbabSMichal Kalderon bool dump, 45328a52bbabSMichal Kalderon u32 valid_conn_pf_pages, 45338a52bbabSMichal Kalderon u32 valid_conn_vf_pages, 45348a52bbabSMichal Kalderon struct phys_mem_desc *ilt_pages, 45358a52bbabSMichal Kalderon bool dump_page_ids) 45368a52bbabSMichal Kalderon { 45378a52bbabSMichal Kalderon struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients; 45388a52bbabSMichal Kalderon u32 pf_start_line, start_page_id, offset = 0; 45398a52bbabSMichal Kalderon u32 cdut_pf_init_pages, cdut_vf_init_pages; 45408a52bbabSMichal Kalderon u32 cdut_pf_work_pages, cdut_vf_work_pages; 45418a52bbabSMichal Kalderon u32 base_data_offset, size_param_offset; 45428a52bbabSMichal Kalderon u32 cdut_pf_pages, cdut_vf_pages; 45438a52bbabSMichal Kalderon const char *section_name; 45448a52bbabSMichal Kalderon u8 i; 45458a52bbabSMichal Kalderon 45468a52bbabSMichal Kalderon section_name = dump_page_ids ? "ilt_page_ids" : "ilt_page_mem"; 45478a52bbabSMichal Kalderon cdut_pf_init_pages = qed_get_cdut_num_pf_init_pages(p_hwfn); 45488a52bbabSMichal Kalderon cdut_vf_init_pages = qed_get_cdut_num_vf_init_pages(p_hwfn); 45498a52bbabSMichal Kalderon cdut_pf_work_pages = qed_get_cdut_num_pf_work_pages(p_hwfn); 45508a52bbabSMichal Kalderon cdut_vf_work_pages = qed_get_cdut_num_vf_work_pages(p_hwfn); 45518a52bbabSMichal Kalderon cdut_pf_pages = cdut_pf_init_pages + cdut_pf_work_pages; 45528a52bbabSMichal Kalderon cdut_vf_pages = cdut_vf_init_pages + cdut_vf_work_pages; 45538a52bbabSMichal Kalderon pf_start_line = p_hwfn->p_cxt_mngr->pf_start_line; 45548a52bbabSMichal Kalderon 45558a52bbabSMichal Kalderon offset += 45568a52bbabSMichal Kalderon qed_dump_section_hdr(dump_buf + offset, dump, section_name, 1); 45578a52bbabSMichal Kalderon 45588a52bbabSMichal Kalderon /* Dump size parameter (0 for now, overwritten with real size later) */ 45598a52bbabSMichal Kalderon size_param_offset = offset; 45608a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0); 45618a52bbabSMichal Kalderon base_data_offset = offset; 45628a52bbabSMichal Kalderon 45638a52bbabSMichal Kalderon /* CDUC pages are ordered as follows: 45648a52bbabSMichal Kalderon * - PF pages - valid section (included in PF connection type mapping) 45658a52bbabSMichal Kalderon * - PF pages - invalid section (not dumped) 45668a52bbabSMichal Kalderon * - For each VF in the PF: 45678a52bbabSMichal Kalderon * - VF pages - valid section (included in VF connection type mapping) 45688a52bbabSMichal Kalderon * - VF pages - invalid section (not dumped) 45698a52bbabSMichal Kalderon */ 45708a52bbabSMichal Kalderon if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUC)) { 45718a52bbabSMichal Kalderon /* Dump connection PF pages */ 45728a52bbabSMichal Kalderon start_page_id = clients[ILT_CLI_CDUC].first.val - pf_start_line; 45738a52bbabSMichal Kalderon offset += qed_ilt_dump_pages_range(dump_buf + offset, 45748a52bbabSMichal Kalderon dump, 45758a52bbabSMichal Kalderon start_page_id, 45768a52bbabSMichal Kalderon valid_conn_pf_pages, 45778a52bbabSMichal Kalderon ilt_pages, dump_page_ids); 45788a52bbabSMichal Kalderon 45798a52bbabSMichal Kalderon /* Dump connection VF pages */ 45808a52bbabSMichal Kalderon start_page_id += clients[ILT_CLI_CDUC].pf_total_lines; 45818a52bbabSMichal Kalderon for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count; 45828a52bbabSMichal Kalderon i++, start_page_id += clients[ILT_CLI_CDUC].vf_total_lines) 45838a52bbabSMichal Kalderon offset += qed_ilt_dump_pages_range(dump_buf + offset, 45848a52bbabSMichal Kalderon dump, 45858a52bbabSMichal Kalderon start_page_id, 45868a52bbabSMichal Kalderon valid_conn_vf_pages, 45878a52bbabSMichal Kalderon ilt_pages, 45888a52bbabSMichal Kalderon dump_page_ids); 45898a52bbabSMichal Kalderon } 45908a52bbabSMichal Kalderon 45918a52bbabSMichal Kalderon /* CDUT pages are ordered as follows: 45928a52bbabSMichal Kalderon * - PF init pages (not dumped) 45938a52bbabSMichal Kalderon * - PF work pages 45948a52bbabSMichal Kalderon * - For each VF in the PF: 45958a52bbabSMichal Kalderon * - VF init pages (not dumped) 45968a52bbabSMichal Kalderon * - VF work pages 45978a52bbabSMichal Kalderon */ 45988a52bbabSMichal Kalderon if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUT)) { 45998a52bbabSMichal Kalderon /* Dump task PF pages */ 46008a52bbabSMichal Kalderon start_page_id = clients[ILT_CLI_CDUT].first.val + 46018a52bbabSMichal Kalderon cdut_pf_init_pages - pf_start_line; 46028a52bbabSMichal Kalderon offset += qed_ilt_dump_pages_range(dump_buf + offset, 46038a52bbabSMichal Kalderon dump, 46048a52bbabSMichal Kalderon start_page_id, 46058a52bbabSMichal Kalderon cdut_pf_work_pages, 46068a52bbabSMichal Kalderon ilt_pages, dump_page_ids); 46078a52bbabSMichal Kalderon 46088a52bbabSMichal Kalderon /* Dump task VF pages */ 46098a52bbabSMichal Kalderon start_page_id = clients[ILT_CLI_CDUT].first.val + 46108a52bbabSMichal Kalderon cdut_pf_pages + cdut_vf_init_pages - pf_start_line; 46118a52bbabSMichal Kalderon for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count; 46128a52bbabSMichal Kalderon i++, start_page_id += cdut_vf_pages) 46138a52bbabSMichal Kalderon offset += qed_ilt_dump_pages_range(dump_buf + offset, 46148a52bbabSMichal Kalderon dump, 46158a52bbabSMichal Kalderon start_page_id, 46168a52bbabSMichal Kalderon cdut_vf_work_pages, 46178a52bbabSMichal Kalderon ilt_pages, 46188a52bbabSMichal Kalderon dump_page_ids); 46198a52bbabSMichal Kalderon } 46208a52bbabSMichal Kalderon 46218a52bbabSMichal Kalderon /* Overwrite size param */ 46228a52bbabSMichal Kalderon if (dump) 46238a52bbabSMichal Kalderon qed_dump_num_param(dump_buf + size_param_offset, 46248a52bbabSMichal Kalderon dump, "size", offset - base_data_offset); 46258a52bbabSMichal Kalderon 46268a52bbabSMichal Kalderon return offset; 46278a52bbabSMichal Kalderon } 46288a52bbabSMichal Kalderon 46298a52bbabSMichal Kalderon /* Performs ILT Dump to the specified buffer. 46308a52bbabSMichal Kalderon * Returns the dumped size in dwords. 46318a52bbabSMichal Kalderon */ 46328a52bbabSMichal Kalderon static u32 qed_ilt_dump(struct qed_hwfn *p_hwfn, 46338a52bbabSMichal Kalderon struct qed_ptt *p_ptt, u32 *dump_buf, bool dump) 46348a52bbabSMichal Kalderon { 46358a52bbabSMichal Kalderon struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients; 46368a52bbabSMichal Kalderon u32 valid_conn_vf_cids, valid_conn_vf_pages, offset = 0; 46378a52bbabSMichal Kalderon u32 valid_conn_pf_cids, valid_conn_pf_pages, num_pages; 46388a52bbabSMichal Kalderon u32 num_cids_per_page, conn_ctx_size; 46398a52bbabSMichal Kalderon u32 cduc_page_size, cdut_page_size; 46408a52bbabSMichal Kalderon struct phys_mem_desc *ilt_pages; 46418a52bbabSMichal Kalderon u8 conn_type; 46428a52bbabSMichal Kalderon 46438a52bbabSMichal Kalderon cduc_page_size = 1 << 46448a52bbabSMichal Kalderon (clients[ILT_CLI_CDUC].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN); 46458a52bbabSMichal Kalderon cdut_page_size = 1 << 46468a52bbabSMichal Kalderon (clients[ILT_CLI_CDUT].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN); 46478a52bbabSMichal Kalderon conn_ctx_size = p_hwfn->p_cxt_mngr->conn_ctx_size; 46488a52bbabSMichal Kalderon num_cids_per_page = (int)(cduc_page_size / conn_ctx_size); 46498a52bbabSMichal Kalderon ilt_pages = p_hwfn->p_cxt_mngr->ilt_shadow; 46508a52bbabSMichal Kalderon 46518a52bbabSMichal Kalderon /* Dump global params - 22 must match number of params below */ 46528a52bbabSMichal Kalderon offset += qed_dump_common_global_params(p_hwfn, p_ptt, 46538a52bbabSMichal Kalderon dump_buf + offset, dump, 22); 46548a52bbabSMichal Kalderon offset += qed_dump_str_param(dump_buf + offset, 46558a52bbabSMichal Kalderon dump, "dump-type", "ilt-dump"); 46568a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46578a52bbabSMichal Kalderon dump, 46588a52bbabSMichal Kalderon "cduc-page-size", cduc_page_size); 46598a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46608a52bbabSMichal Kalderon dump, 46618a52bbabSMichal Kalderon "cduc-first-page-id", 46628a52bbabSMichal Kalderon clients[ILT_CLI_CDUC].first.val); 46638a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46648a52bbabSMichal Kalderon dump, 46658a52bbabSMichal Kalderon "cduc-last-page-id", 46668a52bbabSMichal Kalderon clients[ILT_CLI_CDUC].last.val); 46678a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46688a52bbabSMichal Kalderon dump, 46698a52bbabSMichal Kalderon "cduc-num-pf-pages", 46708a52bbabSMichal Kalderon clients 46718a52bbabSMichal Kalderon [ILT_CLI_CDUC].pf_total_lines); 46728a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46738a52bbabSMichal Kalderon dump, 46748a52bbabSMichal Kalderon "cduc-num-vf-pages", 46758a52bbabSMichal Kalderon clients 46768a52bbabSMichal Kalderon [ILT_CLI_CDUC].vf_total_lines); 46778a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46788a52bbabSMichal Kalderon dump, 46798a52bbabSMichal Kalderon "max-conn-ctx-size", 46808a52bbabSMichal Kalderon conn_ctx_size); 46818a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46828a52bbabSMichal Kalderon dump, 46838a52bbabSMichal Kalderon "cdut-page-size", cdut_page_size); 46848a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46858a52bbabSMichal Kalderon dump, 46868a52bbabSMichal Kalderon "cdut-first-page-id", 46878a52bbabSMichal Kalderon clients[ILT_CLI_CDUT].first.val); 46888a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46898a52bbabSMichal Kalderon dump, 46908a52bbabSMichal Kalderon "cdut-last-page-id", 46918a52bbabSMichal Kalderon clients[ILT_CLI_CDUT].last.val); 46928a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46938a52bbabSMichal Kalderon dump, 46948a52bbabSMichal Kalderon "cdut-num-pf-init-pages", 46958a52bbabSMichal Kalderon qed_get_cdut_num_pf_init_pages(p_hwfn)); 46968a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 46978a52bbabSMichal Kalderon dump, 46988a52bbabSMichal Kalderon "cdut-num-vf-init-pages", 46998a52bbabSMichal Kalderon qed_get_cdut_num_vf_init_pages(p_hwfn)); 47008a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47018a52bbabSMichal Kalderon dump, 47028a52bbabSMichal Kalderon "cdut-num-pf-work-pages", 47038a52bbabSMichal Kalderon qed_get_cdut_num_pf_work_pages(p_hwfn)); 47048a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47058a52bbabSMichal Kalderon dump, 47068a52bbabSMichal Kalderon "cdut-num-vf-work-pages", 47078a52bbabSMichal Kalderon qed_get_cdut_num_vf_work_pages(p_hwfn)); 47088a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47098a52bbabSMichal Kalderon dump, 47108a52bbabSMichal Kalderon "max-task-ctx-size", 47118a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->task_ctx_size); 47128a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47138a52bbabSMichal Kalderon dump, 47148a52bbabSMichal Kalderon "task-type-id", 47158a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->task_type_id); 47168a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47178a52bbabSMichal Kalderon dump, 47188a52bbabSMichal Kalderon "first-vf-id-in-pf", 47198a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->first_vf_in_pf); 47208a52bbabSMichal Kalderon offset += /* 18 */ qed_dump_num_param(dump_buf + offset, 47218a52bbabSMichal Kalderon dump, 47228a52bbabSMichal Kalderon "num-vfs-in-pf", 47238a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->vf_count); 47248a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47258a52bbabSMichal Kalderon dump, 47268a52bbabSMichal Kalderon "ptr-size-bytes", sizeof(void *)); 47278a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47288a52bbabSMichal Kalderon dump, 47298a52bbabSMichal Kalderon "pf-start-line", 47308a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->pf_start_line); 47318a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47328a52bbabSMichal Kalderon dump, 47338a52bbabSMichal Kalderon "page-mem-desc-size-dwords", 47348a52bbabSMichal Kalderon PAGE_MEM_DESC_SIZE_DWORDS); 47358a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47368a52bbabSMichal Kalderon dump, 47378a52bbabSMichal Kalderon "ilt-shadow-size", 47388a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->ilt_shadow_size); 47398a52bbabSMichal Kalderon /* Additional/Less parameters require matching of number in call to 47408a52bbabSMichal Kalderon * dump_common_global_params() 47418a52bbabSMichal Kalderon */ 47428a52bbabSMichal Kalderon 47438a52bbabSMichal Kalderon /* Dump section containing number of PF CIDs per connection type */ 47448a52bbabSMichal Kalderon offset += qed_dump_section_hdr(dump_buf + offset, 47458a52bbabSMichal Kalderon dump, "num_pf_cids_per_conn_type", 1); 47468a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47478a52bbabSMichal Kalderon dump, "size", NUM_OF_CONNECTION_TYPES_E4); 47488a52bbabSMichal Kalderon for (conn_type = 0, valid_conn_pf_cids = 0; 47498a52bbabSMichal Kalderon conn_type < NUM_OF_CONNECTION_TYPES_E4; conn_type++, offset++) { 47508a52bbabSMichal Kalderon u32 num_pf_cids = 47518a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cid_count; 47528a52bbabSMichal Kalderon 47538a52bbabSMichal Kalderon if (dump) 47548a52bbabSMichal Kalderon *(dump_buf + offset) = num_pf_cids; 47558a52bbabSMichal Kalderon valid_conn_pf_cids += num_pf_cids; 47568a52bbabSMichal Kalderon } 47578a52bbabSMichal Kalderon 47588a52bbabSMichal Kalderon /* Dump section containing number of VF CIDs per connection type */ 47598a52bbabSMichal Kalderon offset += qed_dump_section_hdr(dump_buf + offset, 47608a52bbabSMichal Kalderon dump, "num_vf_cids_per_conn_type", 1); 47618a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47628a52bbabSMichal Kalderon dump, "size", NUM_OF_CONNECTION_TYPES_E4); 47638a52bbabSMichal Kalderon for (conn_type = 0, valid_conn_vf_cids = 0; 47648a52bbabSMichal Kalderon conn_type < NUM_OF_CONNECTION_TYPES_E4; conn_type++, offset++) { 47658a52bbabSMichal Kalderon u32 num_vf_cids = 47668a52bbabSMichal Kalderon p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cids_per_vf; 47678a52bbabSMichal Kalderon 47688a52bbabSMichal Kalderon if (dump) 47698a52bbabSMichal Kalderon *(dump_buf + offset) = num_vf_cids; 47708a52bbabSMichal Kalderon valid_conn_vf_cids += num_vf_cids; 47718a52bbabSMichal Kalderon } 47728a52bbabSMichal Kalderon 47738a52bbabSMichal Kalderon /* Dump section containing physical memory descs for each ILT page */ 47748a52bbabSMichal Kalderon num_pages = p_hwfn->p_cxt_mngr->ilt_shadow_size; 47758a52bbabSMichal Kalderon offset += qed_dump_section_hdr(dump_buf + offset, 47768a52bbabSMichal Kalderon dump, "ilt_page_desc", 1); 47778a52bbabSMichal Kalderon offset += qed_dump_num_param(dump_buf + offset, 47788a52bbabSMichal Kalderon dump, 47798a52bbabSMichal Kalderon "size", 47808a52bbabSMichal Kalderon num_pages * PAGE_MEM_DESC_SIZE_DWORDS); 47818a52bbabSMichal Kalderon 47828a52bbabSMichal Kalderon /* Copy memory descriptors to dump buffer */ 47838a52bbabSMichal Kalderon if (dump) { 47848a52bbabSMichal Kalderon u32 page_id; 47858a52bbabSMichal Kalderon 47868a52bbabSMichal Kalderon for (page_id = 0; page_id < num_pages; 47878a52bbabSMichal Kalderon page_id++, offset += PAGE_MEM_DESC_SIZE_DWORDS) 47888a52bbabSMichal Kalderon memcpy(dump_buf + offset, 47898a52bbabSMichal Kalderon &ilt_pages[page_id], 47908a52bbabSMichal Kalderon DWORDS_TO_BYTES(PAGE_MEM_DESC_SIZE_DWORDS)); 47918a52bbabSMichal Kalderon } else { 47928a52bbabSMichal Kalderon offset += num_pages * PAGE_MEM_DESC_SIZE_DWORDS; 47938a52bbabSMichal Kalderon } 47948a52bbabSMichal Kalderon 47958a52bbabSMichal Kalderon valid_conn_pf_pages = DIV_ROUND_UP(valid_conn_pf_cids, 47968a52bbabSMichal Kalderon num_cids_per_page); 47978a52bbabSMichal Kalderon valid_conn_vf_pages = DIV_ROUND_UP(valid_conn_vf_cids, 47988a52bbabSMichal Kalderon num_cids_per_page); 47998a52bbabSMichal Kalderon 48008a52bbabSMichal Kalderon /* Dump ILT pages IDs */ 48018a52bbabSMichal Kalderon offset += qed_ilt_dump_pages_section(p_hwfn, 48028a52bbabSMichal Kalderon dump_buf + offset, 48038a52bbabSMichal Kalderon dump, 48048a52bbabSMichal Kalderon valid_conn_pf_pages, 48058a52bbabSMichal Kalderon valid_conn_vf_pages, 48068a52bbabSMichal Kalderon ilt_pages, true); 48078a52bbabSMichal Kalderon 48088a52bbabSMichal Kalderon /* Dump ILT pages memory */ 48098a52bbabSMichal Kalderon offset += qed_ilt_dump_pages_section(p_hwfn, 48108a52bbabSMichal Kalderon dump_buf + offset, 48118a52bbabSMichal Kalderon dump, 48128a52bbabSMichal Kalderon valid_conn_pf_pages, 48138a52bbabSMichal Kalderon valid_conn_vf_pages, 48148a52bbabSMichal Kalderon ilt_pages, false); 48158a52bbabSMichal Kalderon 48168a52bbabSMichal Kalderon /* Dump last section */ 48178a52bbabSMichal Kalderon offset += qed_dump_last_section(dump_buf, offset, dump); 48188a52bbabSMichal Kalderon 48198a52bbabSMichal Kalderon return offset; 48208a52bbabSMichal Kalderon } 48218a52bbabSMichal Kalderon 4822c965db44STomer Tayar /***************************** Public Functions *******************************/ 4823c965db44STomer Tayar 48242d22bc83SMichal Kalderon enum dbg_status qed_dbg_set_bin_ptr(struct qed_hwfn *p_hwfn, 48252d22bc83SMichal Kalderon const u8 * const bin_ptr) 4826c965db44STomer Tayar { 48272d22bc83SMichal Kalderon struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr; 4828c965db44STomer Tayar u8 buf_id; 4829c965db44STomer Tayar 48302d22bc83SMichal Kalderon /* Convert binary data to debug arrays */ 48312d22bc83SMichal Kalderon for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) 48322d22bc83SMichal Kalderon qed_set_dbg_bin_buf(p_hwfn, 48332d22bc83SMichal Kalderon buf_id, 48342d22bc83SMichal Kalderon (u32 *)(bin_ptr + buf_hdrs[buf_id].offset), 48352d22bc83SMichal Kalderon buf_hdrs[buf_id].length); 4836c965db44STomer Tayar 4837c965db44STomer Tayar return DBG_STATUS_OK; 4838c965db44STomer Tayar } 4839c965db44STomer Tayar 4840d52c89f1SMichal Kalderon bool qed_read_fw_info(struct qed_hwfn *p_hwfn, 4841d52c89f1SMichal Kalderon struct qed_ptt *p_ptt, struct fw_info *fw_info) 4842d52c89f1SMichal Kalderon { 4843d52c89f1SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 4844d52c89f1SMichal Kalderon u8 storm_id; 4845d52c89f1SMichal Kalderon 4846d52c89f1SMichal Kalderon for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) { 4847d52c89f1SMichal Kalderon struct storm_defs *storm = &s_storm_defs[storm_id]; 4848d52c89f1SMichal Kalderon 4849d52c89f1SMichal Kalderon /* Skip Storm if it's in reset */ 48502d22bc83SMichal Kalderon if (dev_data->block_in_reset[storm->sem_block_id]) 4851d52c89f1SMichal Kalderon continue; 4852d52c89f1SMichal Kalderon 4853d52c89f1SMichal Kalderon /* Read FW info for the current Storm */ 4854d52c89f1SMichal Kalderon qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, fw_info); 4855d52c89f1SMichal Kalderon 4856d52c89f1SMichal Kalderon return true; 4857d52c89f1SMichal Kalderon } 4858d52c89f1SMichal Kalderon 4859d52c89f1SMichal Kalderon return false; 4860d52c89f1SMichal Kalderon } 4861d52c89f1SMichal Kalderon 48623b86bd07SSudarsana Reddy Kalluru enum dbg_status qed_dbg_grc_config(struct qed_hwfn *p_hwfn, 48633b86bd07SSudarsana Reddy Kalluru enum dbg_grc_params grc_param, u32 val) 48643b86bd07SSudarsana Reddy Kalluru { 48652d22bc83SMichal Kalderon struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 48663b86bd07SSudarsana Reddy Kalluru enum dbg_status status; 48673b86bd07SSudarsana Reddy Kalluru int i; 48683b86bd07SSudarsana Reddy Kalluru 48692d22bc83SMichal Kalderon DP_VERBOSE(p_hwfn, 48702d22bc83SMichal Kalderon QED_MSG_DEBUG, 48713b86bd07SSudarsana Reddy Kalluru "dbg_grc_config: paramId = %d, val = %d\n", grc_param, val); 48723b86bd07SSudarsana Reddy Kalluru 48732d22bc83SMichal Kalderon status = qed_dbg_dev_init(p_hwfn); 48743b86bd07SSudarsana Reddy Kalluru if (status != DBG_STATUS_OK) 48753b86bd07SSudarsana Reddy Kalluru return status; 48763b86bd07SSudarsana Reddy Kalluru 48773b86bd07SSudarsana Reddy Kalluru /* Initializes the GRC parameters (if not initialized). Needed in order 48783b86bd07SSudarsana Reddy Kalluru * to set the default parameter values for the first time. 48793b86bd07SSudarsana Reddy Kalluru */ 48803b86bd07SSudarsana Reddy Kalluru qed_dbg_grc_init_params(p_hwfn); 48813b86bd07SSudarsana Reddy Kalluru 48823b86bd07SSudarsana Reddy Kalluru if (grc_param >= MAX_DBG_GRC_PARAMS) 48833b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 48843b86bd07SSudarsana Reddy Kalluru if (val < s_grc_param_defs[grc_param].min || 48853b86bd07SSudarsana Reddy Kalluru val > s_grc_param_defs[grc_param].max) 48863b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 48873b86bd07SSudarsana Reddy Kalluru 48883b86bd07SSudarsana Reddy Kalluru if (s_grc_param_defs[grc_param].is_preset) { 48893b86bd07SSudarsana Reddy Kalluru /* Preset param */ 48903b86bd07SSudarsana Reddy Kalluru 48913b86bd07SSudarsana Reddy Kalluru /* Disabling a preset is not allowed. Call 48923b86bd07SSudarsana Reddy Kalluru * dbg_grc_set_params_default instead. 48933b86bd07SSudarsana Reddy Kalluru */ 48943b86bd07SSudarsana Reddy Kalluru if (!val) 48953b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 48963b86bd07SSudarsana Reddy Kalluru 48973b86bd07SSudarsana Reddy Kalluru /* Update all params with the preset values */ 48983b86bd07SSudarsana Reddy Kalluru for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) { 48992d22bc83SMichal Kalderon struct grc_param_defs *defs = &s_grc_param_defs[i]; 49003b86bd07SSudarsana Reddy Kalluru u32 preset_val; 49013b86bd07SSudarsana Reddy Kalluru /* Skip persistent params */ 49022d22bc83SMichal Kalderon if (defs->is_persistent) 49033b86bd07SSudarsana Reddy Kalluru continue; 49043b86bd07SSudarsana Reddy Kalluru 49053b86bd07SSudarsana Reddy Kalluru /* Find preset value */ 49063b86bd07SSudarsana Reddy Kalluru if (grc_param == DBG_GRC_PARAM_EXCLUDE_ALL) 49073b86bd07SSudarsana Reddy Kalluru preset_val = 49082d22bc83SMichal Kalderon defs->exclude_all_preset_val; 49093b86bd07SSudarsana Reddy Kalluru else if (grc_param == DBG_GRC_PARAM_CRASH) 49103b86bd07SSudarsana Reddy Kalluru preset_val = 49112d22bc83SMichal Kalderon defs->crash_preset_val[dev_data->chip_id]; 49123b86bd07SSudarsana Reddy Kalluru else 49133b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_INVALID_ARGS; 49143b86bd07SSudarsana Reddy Kalluru 49152d22bc83SMichal Kalderon qed_grc_set_param(p_hwfn, i, preset_val); 49163b86bd07SSudarsana Reddy Kalluru } 49173b86bd07SSudarsana Reddy Kalluru } else { 49183b86bd07SSudarsana Reddy Kalluru /* Regular param - set its value */ 49193b86bd07SSudarsana Reddy Kalluru qed_grc_set_param(p_hwfn, grc_param, val); 49203b86bd07SSudarsana Reddy Kalluru } 49213b86bd07SSudarsana Reddy Kalluru 49223b86bd07SSudarsana Reddy Kalluru return DBG_STATUS_OK; 49233b86bd07SSudarsana Reddy Kalluru } 49243b86bd07SSudarsana Reddy Kalluru 4925be086e7cSMintz, Yuval /* Assign default GRC param values */ 4926be086e7cSMintz, Yuval void qed_dbg_grc_set_params_default(struct qed_hwfn *p_hwfn) 4927be086e7cSMintz, Yuval { 4928be086e7cSMintz, Yuval struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 4929be086e7cSMintz, Yuval u32 i; 4930be086e7cSMintz, Yuval 4931be086e7cSMintz, Yuval for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) 493250bc60cbSMichal Kalderon if (!s_grc_param_defs[i].is_persistent) 4933be086e7cSMintz, Yuval dev_data->grc.param_val[i] = 4934be086e7cSMintz, Yuval s_grc_param_defs[i].default_val[dev_data->chip_id]; 4935be086e7cSMintz, Yuval } 4936be086e7cSMintz, Yuval 4937c965db44STomer Tayar enum dbg_status qed_dbg_grc_get_dump_buf_size(struct qed_hwfn *p_hwfn, 4938c965db44STomer Tayar struct qed_ptt *p_ptt, 4939c965db44STomer Tayar u32 *buf_size) 4940c965db44STomer Tayar { 49412d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 4942c965db44STomer Tayar 4943c965db44STomer Tayar *buf_size = 0; 49447b6859fbSMintz, Yuval 4945c965db44STomer Tayar if (status != DBG_STATUS_OK) 4946c965db44STomer Tayar return status; 49477b6859fbSMintz, Yuval 49482d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr || 49492d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr || 49502d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr || 49512d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr || 49522d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr) 4953c965db44STomer Tayar return DBG_STATUS_DBG_ARRAY_NOT_SET; 49547b6859fbSMintz, Yuval 4955c965db44STomer Tayar return qed_grc_dump(p_hwfn, p_ptt, NULL, false, buf_size); 4956c965db44STomer Tayar } 4957c965db44STomer Tayar 4958c965db44STomer Tayar enum dbg_status qed_dbg_grc_dump(struct qed_hwfn *p_hwfn, 4959c965db44STomer Tayar struct qed_ptt *p_ptt, 4960c965db44STomer Tayar u32 *dump_buf, 4961c965db44STomer Tayar u32 buf_size_in_dwords, 4962c965db44STomer Tayar u32 *num_dumped_dwords) 4963c965db44STomer Tayar { 4964c965db44STomer Tayar u32 needed_buf_size_in_dwords; 4965c965db44STomer Tayar enum dbg_status status; 4966c965db44STomer Tayar 4967c965db44STomer Tayar *num_dumped_dwords = 0; 49687b6859fbSMintz, Yuval 49697b6859fbSMintz, Yuval status = qed_dbg_grc_get_dump_buf_size(p_hwfn, 49707b6859fbSMintz, Yuval p_ptt, 49717b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 4972c965db44STomer Tayar if (status != DBG_STATUS_OK) 4973c965db44STomer Tayar return status; 49747b6859fbSMintz, Yuval 4975c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 4976c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 4977c965db44STomer Tayar 4978c965db44STomer Tayar /* GRC Dump */ 4979c965db44STomer Tayar status = qed_grc_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords); 4980c965db44STomer Tayar 4981be086e7cSMintz, Yuval /* Revert GRC params to their default */ 4982be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 4983be086e7cSMintz, Yuval 4984c965db44STomer Tayar return status; 4985c965db44STomer Tayar } 4986c965db44STomer Tayar 4987c965db44STomer Tayar enum dbg_status qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn *p_hwfn, 4988c965db44STomer Tayar struct qed_ptt *p_ptt, 4989c965db44STomer Tayar u32 *buf_size) 4990c965db44STomer Tayar { 4991c965db44STomer Tayar struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 49922d22bc83SMichal Kalderon struct idle_chk_data *idle_chk = &dev_data->idle_chk; 49937b6859fbSMintz, Yuval enum dbg_status status; 4994c965db44STomer Tayar 4995c965db44STomer Tayar *buf_size = 0; 49967b6859fbSMintz, Yuval 49972d22bc83SMichal Kalderon status = qed_dbg_dev_init(p_hwfn); 4998c965db44STomer Tayar if (status != DBG_STATUS_OK) 4999c965db44STomer Tayar return status; 50007b6859fbSMintz, Yuval 50012d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr || 50022d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr || 50032d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr || 50042d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr) 5005c965db44STomer Tayar return DBG_STATUS_DBG_ARRAY_NOT_SET; 50067b6859fbSMintz, Yuval 50077b6859fbSMintz, Yuval if (!idle_chk->buf_size_set) { 50087b6859fbSMintz, Yuval idle_chk->buf_size = qed_idle_chk_dump(p_hwfn, 50097b6859fbSMintz, Yuval p_ptt, NULL, false); 50107b6859fbSMintz, Yuval idle_chk->buf_size_set = true; 5011c965db44STomer Tayar } 5012c965db44STomer Tayar 50137b6859fbSMintz, Yuval *buf_size = idle_chk->buf_size; 50147b6859fbSMintz, Yuval 5015c965db44STomer Tayar return DBG_STATUS_OK; 5016c965db44STomer Tayar } 5017c965db44STomer Tayar 5018c965db44STomer Tayar enum dbg_status qed_dbg_idle_chk_dump(struct qed_hwfn *p_hwfn, 5019c965db44STomer Tayar struct qed_ptt *p_ptt, 5020c965db44STomer Tayar u32 *dump_buf, 5021c965db44STomer Tayar u32 buf_size_in_dwords, 5022c965db44STomer Tayar u32 *num_dumped_dwords) 5023c965db44STomer Tayar { 5024c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5025c965db44STomer Tayar enum dbg_status status; 5026c965db44STomer Tayar 5027c965db44STomer Tayar *num_dumped_dwords = 0; 50287b6859fbSMintz, Yuval 50297b6859fbSMintz, Yuval status = qed_dbg_idle_chk_get_dump_buf_size(p_hwfn, 50307b6859fbSMintz, Yuval p_ptt, 50317b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5032c965db44STomer Tayar if (status != DBG_STATUS_OK) 5033c965db44STomer Tayar return status; 50347b6859fbSMintz, Yuval 5035c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5036c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5037c965db44STomer Tayar 5038c965db44STomer Tayar /* Update reset state */ 50392d22bc83SMichal Kalderon qed_grc_unreset_blocks(p_hwfn, p_ptt, true); 5040c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5041c965db44STomer Tayar 5042c965db44STomer Tayar /* Idle Check Dump */ 5043c965db44STomer Tayar *num_dumped_dwords = qed_idle_chk_dump(p_hwfn, p_ptt, dump_buf, true); 5044be086e7cSMintz, Yuval 5045be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5046be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5047be086e7cSMintz, Yuval 5048c965db44STomer Tayar return DBG_STATUS_OK; 5049c965db44STomer Tayar } 5050c965db44STomer Tayar 5051c965db44STomer Tayar enum dbg_status qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5052c965db44STomer Tayar struct qed_ptt *p_ptt, 5053c965db44STomer Tayar u32 *buf_size) 5054c965db44STomer Tayar { 50552d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5056c965db44STomer Tayar 5057c965db44STomer Tayar *buf_size = 0; 50587b6859fbSMintz, Yuval 5059c965db44STomer Tayar if (status != DBG_STATUS_OK) 5060c965db44STomer Tayar return status; 50617b6859fbSMintz, Yuval 5062c965db44STomer Tayar return qed_mcp_trace_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5063c965db44STomer Tayar } 5064c965db44STomer Tayar 5065c965db44STomer Tayar enum dbg_status qed_dbg_mcp_trace_dump(struct qed_hwfn *p_hwfn, 5066c965db44STomer Tayar struct qed_ptt *p_ptt, 5067c965db44STomer Tayar u32 *dump_buf, 5068c965db44STomer Tayar u32 buf_size_in_dwords, 5069c965db44STomer Tayar u32 *num_dumped_dwords) 5070c965db44STomer Tayar { 5071c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5072c965db44STomer Tayar enum dbg_status status; 5073c965db44STomer Tayar 5074be086e7cSMintz, Yuval status = 50757b6859fbSMintz, Yuval qed_dbg_mcp_trace_get_dump_buf_size(p_hwfn, 50767b6859fbSMintz, Yuval p_ptt, 5077c965db44STomer Tayar &needed_buf_size_in_dwords); 50787b6859fbSMintz, Yuval if (status != DBG_STATUS_OK && status != 50797b6859fbSMintz, Yuval DBG_STATUS_NVRAM_GET_IMAGE_FAILED) 5080c965db44STomer Tayar return status; 5081be086e7cSMintz, Yuval 5082c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5083c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5084c965db44STomer Tayar 5085c965db44STomer Tayar /* Update reset state */ 5086c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5087c965db44STomer Tayar 5088c965db44STomer Tayar /* Perform dump */ 5089be086e7cSMintz, Yuval status = qed_mcp_trace_dump(p_hwfn, 5090c965db44STomer Tayar p_ptt, dump_buf, true, num_dumped_dwords); 5091be086e7cSMintz, Yuval 5092be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5093be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5094be086e7cSMintz, Yuval 5095be086e7cSMintz, Yuval return status; 5096c965db44STomer Tayar } 5097c965db44STomer Tayar 5098c965db44STomer Tayar enum dbg_status qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5099c965db44STomer Tayar struct qed_ptt *p_ptt, 5100c965db44STomer Tayar u32 *buf_size) 5101c965db44STomer Tayar { 51022d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5103c965db44STomer Tayar 5104c965db44STomer Tayar *buf_size = 0; 51057b6859fbSMintz, Yuval 5106c965db44STomer Tayar if (status != DBG_STATUS_OK) 5107c965db44STomer Tayar return status; 51087b6859fbSMintz, Yuval 5109c965db44STomer Tayar return qed_reg_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5110c965db44STomer Tayar } 5111c965db44STomer Tayar 5112c965db44STomer Tayar enum dbg_status qed_dbg_reg_fifo_dump(struct qed_hwfn *p_hwfn, 5113c965db44STomer Tayar struct qed_ptt *p_ptt, 5114c965db44STomer Tayar u32 *dump_buf, 5115c965db44STomer Tayar u32 buf_size_in_dwords, 5116c965db44STomer Tayar u32 *num_dumped_dwords) 5117c965db44STomer Tayar { 5118c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5119c965db44STomer Tayar enum dbg_status status; 5120c965db44STomer Tayar 5121c965db44STomer Tayar *num_dumped_dwords = 0; 51227b6859fbSMintz, Yuval 51237b6859fbSMintz, Yuval status = qed_dbg_reg_fifo_get_dump_buf_size(p_hwfn, 51247b6859fbSMintz, Yuval p_ptt, 51257b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5126c965db44STomer Tayar if (status != DBG_STATUS_OK) 5127c965db44STomer Tayar return status; 51287b6859fbSMintz, Yuval 5129c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5130c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5131c965db44STomer Tayar 5132c965db44STomer Tayar /* Update reset state */ 5133c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5134be086e7cSMintz, Yuval 5135be086e7cSMintz, Yuval status = qed_reg_fifo_dump(p_hwfn, 5136c965db44STomer Tayar p_ptt, dump_buf, true, num_dumped_dwords); 5137be086e7cSMintz, Yuval 5138be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5139be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5140be086e7cSMintz, Yuval 5141be086e7cSMintz, Yuval return status; 5142c965db44STomer Tayar } 5143c965db44STomer Tayar 5144c965db44STomer Tayar enum dbg_status qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5145c965db44STomer Tayar struct qed_ptt *p_ptt, 5146c965db44STomer Tayar u32 *buf_size) 5147c965db44STomer Tayar { 51482d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5149c965db44STomer Tayar 5150c965db44STomer Tayar *buf_size = 0; 51517b6859fbSMintz, Yuval 5152c965db44STomer Tayar if (status != DBG_STATUS_OK) 5153c965db44STomer Tayar return status; 51547b6859fbSMintz, Yuval 5155c965db44STomer Tayar return qed_igu_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size); 5156c965db44STomer Tayar } 5157c965db44STomer Tayar 5158c965db44STomer Tayar enum dbg_status qed_dbg_igu_fifo_dump(struct qed_hwfn *p_hwfn, 5159c965db44STomer Tayar struct qed_ptt *p_ptt, 5160c965db44STomer Tayar u32 *dump_buf, 5161c965db44STomer Tayar u32 buf_size_in_dwords, 5162c965db44STomer Tayar u32 *num_dumped_dwords) 5163c965db44STomer Tayar { 5164c965db44STomer Tayar u32 needed_buf_size_in_dwords; 5165c965db44STomer Tayar enum dbg_status status; 5166c965db44STomer Tayar 5167c965db44STomer Tayar *num_dumped_dwords = 0; 51687b6859fbSMintz, Yuval 51697b6859fbSMintz, Yuval status = qed_dbg_igu_fifo_get_dump_buf_size(p_hwfn, 51707b6859fbSMintz, Yuval p_ptt, 51717b6859fbSMintz, Yuval &needed_buf_size_in_dwords); 5172c965db44STomer Tayar if (status != DBG_STATUS_OK) 5173c965db44STomer Tayar return status; 51747b6859fbSMintz, Yuval 5175c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5176c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5177c965db44STomer Tayar 5178c965db44STomer Tayar /* Update reset state */ 5179c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5180be086e7cSMintz, Yuval 5181be086e7cSMintz, Yuval status = qed_igu_fifo_dump(p_hwfn, 5182c965db44STomer Tayar p_ptt, dump_buf, true, num_dumped_dwords); 5183be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5184be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5185be086e7cSMintz, Yuval 5186be086e7cSMintz, Yuval return status; 5187c965db44STomer Tayar } 5188c965db44STomer Tayar 5189c965db44STomer Tayar enum dbg_status 5190c965db44STomer Tayar qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5191c965db44STomer Tayar struct qed_ptt *p_ptt, 5192c965db44STomer Tayar u32 *buf_size) 5193c965db44STomer Tayar { 51942d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5195c965db44STomer Tayar 5196c965db44STomer Tayar *buf_size = 0; 51977b6859fbSMintz, Yuval 5198c965db44STomer Tayar if (status != DBG_STATUS_OK) 5199c965db44STomer Tayar return status; 52007b6859fbSMintz, Yuval 5201c965db44STomer Tayar return qed_protection_override_dump(p_hwfn, 5202c965db44STomer Tayar p_ptt, NULL, false, buf_size); 5203c965db44STomer Tayar } 5204c965db44STomer Tayar 5205c965db44STomer Tayar enum dbg_status qed_dbg_protection_override_dump(struct qed_hwfn *p_hwfn, 5206c965db44STomer Tayar struct qed_ptt *p_ptt, 5207c965db44STomer Tayar u32 *dump_buf, 5208c965db44STomer Tayar u32 buf_size_in_dwords, 5209c965db44STomer Tayar u32 *num_dumped_dwords) 5210c965db44STomer Tayar { 52117b6859fbSMintz, Yuval u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords; 5212c965db44STomer Tayar enum dbg_status status; 5213c965db44STomer Tayar 5214c965db44STomer Tayar *num_dumped_dwords = 0; 52157b6859fbSMintz, Yuval 52167b6859fbSMintz, Yuval status = 52177b6859fbSMintz, Yuval qed_dbg_protection_override_get_dump_buf_size(p_hwfn, 52187b6859fbSMintz, Yuval p_ptt, 52197b6859fbSMintz, Yuval p_size); 5220c965db44STomer Tayar if (status != DBG_STATUS_OK) 5221c965db44STomer Tayar return status; 52227b6859fbSMintz, Yuval 5223c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5224c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5225c965db44STomer Tayar 5226c965db44STomer Tayar /* Update reset state */ 5227c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 5228be086e7cSMintz, Yuval 5229be086e7cSMintz, Yuval status = qed_protection_override_dump(p_hwfn, 5230c965db44STomer Tayar p_ptt, 5231be086e7cSMintz, Yuval dump_buf, 5232be086e7cSMintz, Yuval true, num_dumped_dwords); 5233be086e7cSMintz, Yuval 5234be086e7cSMintz, Yuval /* Revert GRC params to their default */ 5235be086e7cSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 5236be086e7cSMintz, Yuval 5237be086e7cSMintz, Yuval return status; 5238c965db44STomer Tayar } 5239c965db44STomer Tayar 5240c965db44STomer Tayar enum dbg_status qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn *p_hwfn, 5241c965db44STomer Tayar struct qed_ptt *p_ptt, 5242c965db44STomer Tayar u32 *buf_size) 5243c965db44STomer Tayar { 52442d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 5245c965db44STomer Tayar 5246c965db44STomer Tayar *buf_size = 0; 52477b6859fbSMintz, Yuval 5248c965db44STomer Tayar if (status != DBG_STATUS_OK) 5249c965db44STomer Tayar return status; 5250c965db44STomer Tayar 5251c965db44STomer Tayar /* Update reset state */ 5252c965db44STomer Tayar qed_update_blocks_reset_state(p_hwfn, p_ptt); 52537b6859fbSMintz, Yuval 5254c965db44STomer Tayar *buf_size = qed_fw_asserts_dump(p_hwfn, p_ptt, NULL, false); 52557b6859fbSMintz, Yuval 5256c965db44STomer Tayar return DBG_STATUS_OK; 5257c965db44STomer Tayar } 5258c965db44STomer Tayar 5259c965db44STomer Tayar enum dbg_status qed_dbg_fw_asserts_dump(struct qed_hwfn *p_hwfn, 5260c965db44STomer Tayar struct qed_ptt *p_ptt, 5261c965db44STomer Tayar u32 *dump_buf, 5262c965db44STomer Tayar u32 buf_size_in_dwords, 5263c965db44STomer Tayar u32 *num_dumped_dwords) 5264c965db44STomer Tayar { 52657b6859fbSMintz, Yuval u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords; 5266c965db44STomer Tayar enum dbg_status status; 5267c965db44STomer Tayar 5268c965db44STomer Tayar *num_dumped_dwords = 0; 52697b6859fbSMintz, Yuval 52707b6859fbSMintz, Yuval status = 52717b6859fbSMintz, Yuval qed_dbg_fw_asserts_get_dump_buf_size(p_hwfn, 52727b6859fbSMintz, Yuval p_ptt, 52737b6859fbSMintz, Yuval p_size); 5274c965db44STomer Tayar if (status != DBG_STATUS_OK) 5275c965db44STomer Tayar return status; 52767b6859fbSMintz, Yuval 5277c965db44STomer Tayar if (buf_size_in_dwords < needed_buf_size_in_dwords) 5278c965db44STomer Tayar return DBG_STATUS_DUMP_BUF_TOO_SMALL; 5279c965db44STomer Tayar 5280c965db44STomer Tayar *num_dumped_dwords = qed_fw_asserts_dump(p_hwfn, p_ptt, dump_buf, true); 52817b6859fbSMintz, Yuval 52827b6859fbSMintz, Yuval /* Revert GRC params to their default */ 52837b6859fbSMintz, Yuval qed_dbg_grc_set_params_default(p_hwfn); 52847b6859fbSMintz, Yuval 5285c965db44STomer Tayar return DBG_STATUS_OK; 5286c965db44STomer Tayar } 5287c965db44STomer Tayar 52888a52bbabSMichal Kalderon static enum dbg_status qed_dbg_ilt_get_dump_buf_size(struct qed_hwfn *p_hwfn, 52898a52bbabSMichal Kalderon struct qed_ptt *p_ptt, 52908a52bbabSMichal Kalderon u32 *buf_size) 52918a52bbabSMichal Kalderon { 52922d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 52938a52bbabSMichal Kalderon 52948a52bbabSMichal Kalderon *buf_size = 0; 52958a52bbabSMichal Kalderon 52968a52bbabSMichal Kalderon if (status != DBG_STATUS_OK) 52978a52bbabSMichal Kalderon return status; 52988a52bbabSMichal Kalderon 52998a52bbabSMichal Kalderon *buf_size = qed_ilt_dump(p_hwfn, p_ptt, NULL, false); 53008a52bbabSMichal Kalderon 53018a52bbabSMichal Kalderon return DBG_STATUS_OK; 53028a52bbabSMichal Kalderon } 53038a52bbabSMichal Kalderon 53048a52bbabSMichal Kalderon static enum dbg_status qed_dbg_ilt_dump(struct qed_hwfn *p_hwfn, 53058a52bbabSMichal Kalderon struct qed_ptt *p_ptt, 53068a52bbabSMichal Kalderon u32 *dump_buf, 53078a52bbabSMichal Kalderon u32 buf_size_in_dwords, 53088a52bbabSMichal Kalderon u32 *num_dumped_dwords) 53098a52bbabSMichal Kalderon { 53108a52bbabSMichal Kalderon u32 needed_buf_size_in_dwords; 53118a52bbabSMichal Kalderon enum dbg_status status; 53128a52bbabSMichal Kalderon 53138a52bbabSMichal Kalderon *num_dumped_dwords = 0; 53148a52bbabSMichal Kalderon 53158a52bbabSMichal Kalderon status = qed_dbg_ilt_get_dump_buf_size(p_hwfn, 53168a52bbabSMichal Kalderon p_ptt, 53178a52bbabSMichal Kalderon &needed_buf_size_in_dwords); 53188a52bbabSMichal Kalderon if (status != DBG_STATUS_OK) 53198a52bbabSMichal Kalderon return status; 53208a52bbabSMichal Kalderon 53218a52bbabSMichal Kalderon if (buf_size_in_dwords < needed_buf_size_in_dwords) 53228a52bbabSMichal Kalderon return DBG_STATUS_DUMP_BUF_TOO_SMALL; 53238a52bbabSMichal Kalderon 53248a52bbabSMichal Kalderon *num_dumped_dwords = qed_ilt_dump(p_hwfn, p_ptt, dump_buf, true); 53258a52bbabSMichal Kalderon 53268a52bbabSMichal Kalderon /* Reveret GRC params to their default */ 53278a52bbabSMichal Kalderon qed_dbg_grc_set_params_default(p_hwfn); 53288a52bbabSMichal Kalderon 53298a52bbabSMichal Kalderon return DBG_STATUS_OK; 53308a52bbabSMichal Kalderon } 53318a52bbabSMichal Kalderon 53320ebbd1c8SMintz, Yuval enum dbg_status qed_dbg_read_attn(struct qed_hwfn *p_hwfn, 53330ebbd1c8SMintz, Yuval struct qed_ptt *p_ptt, 53340ebbd1c8SMintz, Yuval enum block_id block_id, 53350ebbd1c8SMintz, Yuval enum dbg_attn_type attn_type, 53360ebbd1c8SMintz, Yuval bool clear_status, 53370ebbd1c8SMintz, Yuval struct dbg_attn_block_result *results) 53380ebbd1c8SMintz, Yuval { 53392d22bc83SMichal Kalderon enum dbg_status status = qed_dbg_dev_init(p_hwfn); 53400ebbd1c8SMintz, Yuval u8 reg_idx, num_attn_regs, num_result_regs = 0; 53410ebbd1c8SMintz, Yuval const struct dbg_attn_reg *attn_reg_arr; 53420ebbd1c8SMintz, Yuval 53430ebbd1c8SMintz, Yuval if (status != DBG_STATUS_OK) 53440ebbd1c8SMintz, Yuval return status; 53450ebbd1c8SMintz, Yuval 53462d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr || 53472d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr || 53482d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr) 53490ebbd1c8SMintz, Yuval return DBG_STATUS_DBG_ARRAY_NOT_SET; 53500ebbd1c8SMintz, Yuval 53512d22bc83SMichal Kalderon attn_reg_arr = qed_get_block_attn_regs(p_hwfn, 53522d22bc83SMichal Kalderon block_id, 53530ebbd1c8SMintz, Yuval attn_type, &num_attn_regs); 53540ebbd1c8SMintz, Yuval 53550ebbd1c8SMintz, Yuval for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) { 53560ebbd1c8SMintz, Yuval const struct dbg_attn_reg *reg_data = &attn_reg_arr[reg_idx]; 53570ebbd1c8SMintz, Yuval struct dbg_attn_reg_result *reg_result; 53580ebbd1c8SMintz, Yuval u32 sts_addr, sts_val; 53590ebbd1c8SMintz, Yuval u16 modes_buf_offset; 53600ebbd1c8SMintz, Yuval bool eval_mode; 53610ebbd1c8SMintz, Yuval 53620ebbd1c8SMintz, Yuval /* Check mode */ 53630ebbd1c8SMintz, Yuval eval_mode = GET_FIELD(reg_data->mode.data, 53640ebbd1c8SMintz, Yuval DBG_MODE_HDR_EVAL_MODE) > 0; 53650ebbd1c8SMintz, Yuval modes_buf_offset = GET_FIELD(reg_data->mode.data, 53660ebbd1c8SMintz, Yuval DBG_MODE_HDR_MODES_BUF_OFFSET); 53670ebbd1c8SMintz, Yuval if (eval_mode && !qed_is_mode_match(p_hwfn, &modes_buf_offset)) 53680ebbd1c8SMintz, Yuval continue; 53690ebbd1c8SMintz, Yuval 53700ebbd1c8SMintz, Yuval /* Mode match - read attention status register */ 53710ebbd1c8SMintz, Yuval sts_addr = DWORDS_TO_BYTES(clear_status ? 53720ebbd1c8SMintz, Yuval reg_data->sts_clr_address : 53730ebbd1c8SMintz, Yuval GET_FIELD(reg_data->data, 53740ebbd1c8SMintz, Yuval DBG_ATTN_REG_STS_ADDRESS)); 53750ebbd1c8SMintz, Yuval sts_val = qed_rd(p_hwfn, p_ptt, sts_addr); 53760ebbd1c8SMintz, Yuval if (!sts_val) 53770ebbd1c8SMintz, Yuval continue; 53780ebbd1c8SMintz, Yuval 53790ebbd1c8SMintz, Yuval /* Non-zero attention status - add to results */ 53800ebbd1c8SMintz, Yuval reg_result = &results->reg_results[num_result_regs]; 53810ebbd1c8SMintz, Yuval SET_FIELD(reg_result->data, 53820ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_STS_ADDRESS, sts_addr); 53830ebbd1c8SMintz, Yuval SET_FIELD(reg_result->data, 53840ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_NUM_REG_ATTN, 53850ebbd1c8SMintz, Yuval GET_FIELD(reg_data->data, DBG_ATTN_REG_NUM_REG_ATTN)); 53860ebbd1c8SMintz, Yuval reg_result->block_attn_offset = reg_data->block_attn_offset; 53870ebbd1c8SMintz, Yuval reg_result->sts_val = sts_val; 53880ebbd1c8SMintz, Yuval reg_result->mask_val = qed_rd(p_hwfn, 53890ebbd1c8SMintz, Yuval p_ptt, 53900ebbd1c8SMintz, Yuval DWORDS_TO_BYTES 53910ebbd1c8SMintz, Yuval (reg_data->mask_address)); 53920ebbd1c8SMintz, Yuval num_result_regs++; 53930ebbd1c8SMintz, Yuval } 53940ebbd1c8SMintz, Yuval 53950ebbd1c8SMintz, Yuval results->block_id = (u8)block_id; 53960ebbd1c8SMintz, Yuval results->names_offset = 53972d22bc83SMichal Kalderon qed_get_block_attn_data(p_hwfn, block_id, attn_type)->names_offset; 53980ebbd1c8SMintz, Yuval SET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE, attn_type); 53990ebbd1c8SMintz, Yuval SET_FIELD(results->data, 54000ebbd1c8SMintz, Yuval DBG_ATTN_BLOCK_RESULT_NUM_REGS, num_result_regs); 54010ebbd1c8SMintz, Yuval 54020ebbd1c8SMintz, Yuval return DBG_STATUS_OK; 54030ebbd1c8SMintz, Yuval } 54040ebbd1c8SMintz, Yuval 5405c965db44STomer Tayar /******************************* Data Types **********************************/ 5406c965db44STomer Tayar 54077b6859fbSMintz, Yuval /* REG fifo element */ 5408c965db44STomer Tayar struct reg_fifo_element { 5409c965db44STomer Tayar u64 data; 5410c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDRESS_SHIFT 0 5411c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDRESS_MASK 0x7fffff 5412c965db44STomer Tayar #define REG_FIFO_ELEMENT_ACCESS_SHIFT 23 5413c965db44STomer Tayar #define REG_FIFO_ELEMENT_ACCESS_MASK 0x1 5414c965db44STomer Tayar #define REG_FIFO_ELEMENT_PF_SHIFT 24 5415c965db44STomer Tayar #define REG_FIFO_ELEMENT_PF_MASK 0xf 5416c965db44STomer Tayar #define REG_FIFO_ELEMENT_VF_SHIFT 28 5417c965db44STomer Tayar #define REG_FIFO_ELEMENT_VF_MASK 0xff 5418c965db44STomer Tayar #define REG_FIFO_ELEMENT_PORT_SHIFT 36 5419c965db44STomer Tayar #define REG_FIFO_ELEMENT_PORT_MASK 0x3 5420c965db44STomer Tayar #define REG_FIFO_ELEMENT_PRIVILEGE_SHIFT 38 5421c965db44STomer Tayar #define REG_FIFO_ELEMENT_PRIVILEGE_MASK 0x3 5422c965db44STomer Tayar #define REG_FIFO_ELEMENT_PROTECTION_SHIFT 40 5423c965db44STomer Tayar #define REG_FIFO_ELEMENT_PROTECTION_MASK 0x7 5424c965db44STomer Tayar #define REG_FIFO_ELEMENT_MASTER_SHIFT 43 5425c965db44STomer Tayar #define REG_FIFO_ELEMENT_MASTER_MASK 0xf 5426c965db44STomer Tayar #define REG_FIFO_ELEMENT_ERROR_SHIFT 47 5427c965db44STomer Tayar #define REG_FIFO_ELEMENT_ERROR_MASK 0x1f 5428c965db44STomer Tayar }; 5429c965db44STomer Tayar 54302d22bc83SMichal Kalderon /* REG fifo error element */ 54312d22bc83SMichal Kalderon struct reg_fifo_err { 54322d22bc83SMichal Kalderon u32 err_code; 54332d22bc83SMichal Kalderon const char *err_msg; 54342d22bc83SMichal Kalderon }; 54352d22bc83SMichal Kalderon 5436c965db44STomer Tayar /* IGU fifo element */ 5437c965db44STomer Tayar struct igu_fifo_element { 5438c965db44STomer Tayar u32 dword0; 5439c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_FID_SHIFT 0 5440c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_FID_MASK 0xff 5441c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_SHIFT 8 5442c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_MASK 0x1 5443c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_SHIFT 9 5444c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_MASK 0xf 5445c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_SHIFT 13 5446c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_MASK 0xf 5447c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_SHIFT 17 5448c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_MASK 0x7fff 5449c965db44STomer Tayar u32 dword1; 5450c965db44STomer Tayar u32 dword2; 5451c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_SHIFT 0 5452c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_MASK 0x1 5453c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_SHIFT 1 5454c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_MASK 0xffffffff 5455c965db44STomer Tayar u32 reserved; 5456c965db44STomer Tayar }; 5457c965db44STomer Tayar 5458c965db44STomer Tayar struct igu_fifo_wr_data { 5459c965db44STomer Tayar u32 data; 5460c965db44STomer Tayar #define IGU_FIFO_WR_DATA_PROD_CONS_SHIFT 0 5461c965db44STomer Tayar #define IGU_FIFO_WR_DATA_PROD_CONS_MASK 0xffffff 5462c965db44STomer Tayar #define IGU_FIFO_WR_DATA_UPDATE_FLAG_SHIFT 24 5463c965db44STomer Tayar #define IGU_FIFO_WR_DATA_UPDATE_FLAG_MASK 0x1 5464c965db44STomer Tayar #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_SHIFT 25 5465c965db44STomer Tayar #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_MASK 0x3 5466c965db44STomer Tayar #define IGU_FIFO_WR_DATA_SEGMENT_SHIFT 27 5467c965db44STomer Tayar #define IGU_FIFO_WR_DATA_SEGMENT_MASK 0x1 5468c965db44STomer Tayar #define IGU_FIFO_WR_DATA_TIMER_MASK_SHIFT 28 5469c965db44STomer Tayar #define IGU_FIFO_WR_DATA_TIMER_MASK_MASK 0x1 5470c965db44STomer Tayar #define IGU_FIFO_WR_DATA_CMD_TYPE_SHIFT 31 5471c965db44STomer Tayar #define IGU_FIFO_WR_DATA_CMD_TYPE_MASK 0x1 5472c965db44STomer Tayar }; 5473c965db44STomer Tayar 5474c965db44STomer Tayar struct igu_fifo_cleanup_wr_data { 5475c965db44STomer Tayar u32 data; 5476c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_SHIFT 0 5477c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_MASK 0x7ffffff 5478c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_SHIFT 27 5479c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_MASK 0x1 5480c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_SHIFT 28 5481c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_MASK 0x7 5482c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_SHIFT 31 5483c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_MASK 0x1 5484c965db44STomer Tayar }; 5485c965db44STomer Tayar 5486c965db44STomer Tayar /* Protection override element */ 5487c965db44STomer Tayar struct protection_override_element { 5488c965db44STomer Tayar u64 data; 5489c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_SHIFT 0 5490c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_MASK 0x7fffff 5491c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_SHIFT 23 5492c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_MASK 0xffffff 5493c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_SHIFT 47 5494c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_MASK 0x1 5495c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_SHIFT 48 5496c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_MASK 0x1 5497c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_SHIFT 49 5498c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_MASK 0x7 5499c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_SHIFT 52 5500c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_MASK 0x7 5501c965db44STomer Tayar }; 5502c965db44STomer Tayar 5503c965db44STomer Tayar enum igu_fifo_sources { 5504c965db44STomer Tayar IGU_SRC_PXP0, 5505c965db44STomer Tayar IGU_SRC_PXP1, 5506c965db44STomer Tayar IGU_SRC_PXP2, 5507c965db44STomer Tayar IGU_SRC_PXP3, 5508c965db44STomer Tayar IGU_SRC_PXP4, 5509c965db44STomer Tayar IGU_SRC_PXP5, 5510c965db44STomer Tayar IGU_SRC_PXP6, 5511c965db44STomer Tayar IGU_SRC_PXP7, 5512c965db44STomer Tayar IGU_SRC_CAU, 5513c965db44STomer Tayar IGU_SRC_ATTN, 5514c965db44STomer Tayar IGU_SRC_GRC 5515c965db44STomer Tayar }; 5516c965db44STomer Tayar 5517c965db44STomer Tayar enum igu_fifo_addr_types { 5518c965db44STomer Tayar IGU_ADDR_TYPE_MSIX_MEM, 5519c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_PBA, 5520c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_INT_ACK, 5521c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS, 5522c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT, 5523c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_PROD_UPDATE, 5524c965db44STomer Tayar IGU_ADDR_TYPE_RESERVED 5525c965db44STomer Tayar }; 5526c965db44STomer Tayar 5527c965db44STomer Tayar struct igu_fifo_addr_data { 5528c965db44STomer Tayar u16 start_addr; 5529c965db44STomer Tayar u16 end_addr; 5530c965db44STomer Tayar char *desc; 5531c965db44STomer Tayar char *vf_desc; 5532c965db44STomer Tayar enum igu_fifo_addr_types type; 5533c965db44STomer Tayar }; 5534c965db44STomer Tayar 5535c965db44STomer Tayar /******************************** Constants **********************************/ 5536c965db44STomer Tayar 5537c965db44STomer Tayar #define MAX_MSG_LEN 1024 55387b6859fbSMintz, Yuval 5539c965db44STomer Tayar #define MCP_TRACE_MAX_MODULE_LEN 8 5540c965db44STomer Tayar #define MCP_TRACE_FORMAT_MAX_PARAMS 3 5541c965db44STomer Tayar #define MCP_TRACE_FORMAT_PARAM_WIDTH \ 55422d22bc83SMichal Kalderon (MCP_TRACE_FORMAT_P2_SIZE_OFFSET - MCP_TRACE_FORMAT_P1_SIZE_OFFSET) 55437b6859fbSMintz, Yuval 5544c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDR_FACTOR 4 5545c965db44STomer Tayar #define REG_FIFO_ELEMENT_IS_PF_VF_VAL 127 55467b6859fbSMintz, Yuval 5547c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR 4 5548c965db44STomer Tayar 5549c965db44STomer Tayar /***************************** Constant Arrays *******************************/ 5550c965db44STomer Tayar 5551c965db44STomer Tayar /* Status string array */ 5552c965db44STomer Tayar static const char * const s_status_str[] = { 55537b6859fbSMintz, Yuval /* DBG_STATUS_OK */ 5554c965db44STomer Tayar "Operation completed successfully", 55557b6859fbSMintz, Yuval 55567b6859fbSMintz, Yuval /* DBG_STATUS_APP_VERSION_NOT_SET */ 5557c965db44STomer Tayar "Debug application version wasn't set", 55587b6859fbSMintz, Yuval 55597b6859fbSMintz, Yuval /* DBG_STATUS_UNSUPPORTED_APP_VERSION */ 5560c965db44STomer Tayar "Unsupported debug application version", 55617b6859fbSMintz, Yuval 55627b6859fbSMintz, Yuval /* DBG_STATUS_DBG_BLOCK_NOT_RESET */ 5563c965db44STomer Tayar "The debug block wasn't reset since the last recording", 55647b6859fbSMintz, Yuval 55657b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_ARGS */ 5566c965db44STomer Tayar "Invalid arguments", 55677b6859fbSMintz, Yuval 55687b6859fbSMintz, Yuval /* DBG_STATUS_OUTPUT_ALREADY_SET */ 5569c965db44STomer Tayar "The debug output was already set", 55707b6859fbSMintz, Yuval 55717b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_PCI_BUF_SIZE */ 5572c965db44STomer Tayar "Invalid PCI buffer size", 55737b6859fbSMintz, Yuval 55747b6859fbSMintz, Yuval /* DBG_STATUS_PCI_BUF_ALLOC_FAILED */ 5575c965db44STomer Tayar "PCI buffer allocation failed", 55767b6859fbSMintz, Yuval 55777b6859fbSMintz, Yuval /* DBG_STATUS_PCI_BUF_NOT_ALLOCATED */ 5578c965db44STomer Tayar "A PCI buffer wasn't allocated", 55797b6859fbSMintz, Yuval 55802d22bc83SMichal Kalderon /* DBG_STATUS_INVALID_FILTER_TRIGGER_DWORDS */ 55812d22bc83SMichal Kalderon "The filter/trigger constraint dword offsets are not enabled for recording", 5582a5124386SColin Ian King /* DBG_STATUS_NO_MATCHING_FRAMING_MODE */ 5583a5124386SColin Ian King "No matching framing mode", 55847b6859fbSMintz, Yuval 55852d22bc83SMichal Kalderon /* DBG_STATUS_VFC_READ_ERROR */ 55862d22bc83SMichal Kalderon "Error reading from VFC", 55877b6859fbSMintz, Yuval 55887b6859fbSMintz, Yuval /* DBG_STATUS_STORM_ALREADY_ENABLED */ 5589c965db44STomer Tayar "The Storm was already enabled", 55907b6859fbSMintz, Yuval 55917b6859fbSMintz, Yuval /* DBG_STATUS_STORM_NOT_ENABLED */ 5592c965db44STomer Tayar "The specified Storm wasn't enabled", 55937b6859fbSMintz, Yuval 55947b6859fbSMintz, Yuval /* DBG_STATUS_BLOCK_ALREADY_ENABLED */ 5595c965db44STomer Tayar "The block was already enabled", 55967b6859fbSMintz, Yuval 55977b6859fbSMintz, Yuval /* DBG_STATUS_BLOCK_NOT_ENABLED */ 5598c965db44STomer Tayar "The specified block wasn't enabled", 55997b6859fbSMintz, Yuval 56007b6859fbSMintz, Yuval /* DBG_STATUS_NO_INPUT_ENABLED */ 5601c965db44STomer Tayar "No input was enabled for recording", 56027b6859fbSMintz, Yuval 56032d22bc83SMichal Kalderon /* DBG_STATUS_NO_FILTER_TRIGGER_256B */ 56042d22bc83SMichal Kalderon "Filters and triggers are not allowed in E4 256-bit mode", 56057b6859fbSMintz, Yuval 56067b6859fbSMintz, Yuval /* DBG_STATUS_FILTER_ALREADY_ENABLED */ 5607c965db44STomer Tayar "The filter was already enabled", 56087b6859fbSMintz, Yuval 56097b6859fbSMintz, Yuval /* DBG_STATUS_TRIGGER_ALREADY_ENABLED */ 5610c965db44STomer Tayar "The trigger was already enabled", 56117b6859fbSMintz, Yuval 56127b6859fbSMintz, Yuval /* DBG_STATUS_TRIGGER_NOT_ENABLED */ 5613c965db44STomer Tayar "The trigger wasn't enabled", 56147b6859fbSMintz, Yuval 56157b6859fbSMintz, Yuval /* DBG_STATUS_CANT_ADD_CONSTRAINT */ 5616c965db44STomer Tayar "A constraint can be added only after a filter was enabled or a trigger state was added", 56177b6859fbSMintz, Yuval 56187b6859fbSMintz, Yuval /* DBG_STATUS_TOO_MANY_TRIGGER_STATES */ 5619c965db44STomer Tayar "Cannot add more than 3 trigger states", 56207b6859fbSMintz, Yuval 56217b6859fbSMintz, Yuval /* DBG_STATUS_TOO_MANY_CONSTRAINTS */ 5622c965db44STomer Tayar "Cannot add more than 4 constraints per filter or trigger state", 56237b6859fbSMintz, Yuval 56247b6859fbSMintz, Yuval /* DBG_STATUS_RECORDING_NOT_STARTED */ 5625c965db44STomer Tayar "The recording wasn't started", 56267b6859fbSMintz, Yuval 56277b6859fbSMintz, Yuval /* DBG_STATUS_DATA_DIDNT_TRIGGER */ 5628c965db44STomer Tayar "A trigger was configured, but it didn't trigger", 56297b6859fbSMintz, Yuval 56307b6859fbSMintz, Yuval /* DBG_STATUS_NO_DATA_RECORDED */ 5631c965db44STomer Tayar "No data was recorded", 56327b6859fbSMintz, Yuval 56337b6859fbSMintz, Yuval /* DBG_STATUS_DUMP_BUF_TOO_SMALL */ 5634c965db44STomer Tayar "Dump buffer is too small", 56357b6859fbSMintz, Yuval 56367b6859fbSMintz, Yuval /* DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED */ 5637c965db44STomer Tayar "Dumped data is not aligned to chunks", 56387b6859fbSMintz, Yuval 56397b6859fbSMintz, Yuval /* DBG_STATUS_UNKNOWN_CHIP */ 5640c965db44STomer Tayar "Unknown chip", 56417b6859fbSMintz, Yuval 56427b6859fbSMintz, Yuval /* DBG_STATUS_VIRT_MEM_ALLOC_FAILED */ 5643c965db44STomer Tayar "Failed allocating virtual memory", 56447b6859fbSMintz, Yuval 56457b6859fbSMintz, Yuval /* DBG_STATUS_BLOCK_IN_RESET */ 5646c965db44STomer Tayar "The input block is in reset", 56477b6859fbSMintz, Yuval 56487b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_TRACE_SIGNATURE */ 5649c965db44STomer Tayar "Invalid MCP trace signature found in NVRAM", 56507b6859fbSMintz, Yuval 56517b6859fbSMintz, Yuval /* DBG_STATUS_INVALID_NVRAM_BUNDLE */ 5652c965db44STomer Tayar "Invalid bundle ID found in NVRAM", 56537b6859fbSMintz, Yuval 56547b6859fbSMintz, Yuval /* DBG_STATUS_NVRAM_GET_IMAGE_FAILED */ 5655c965db44STomer Tayar "Failed getting NVRAM image", 56567b6859fbSMintz, Yuval 56577b6859fbSMintz, Yuval /* DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE */ 5658c965db44STomer Tayar "NVRAM image is not dword-aligned", 56597b6859fbSMintz, Yuval 56607b6859fbSMintz, Yuval /* DBG_STATUS_NVRAM_READ_FAILED */ 5661c965db44STomer Tayar "Failed reading from NVRAM", 56627b6859fbSMintz, Yuval 56637b6859fbSMintz, Yuval /* DBG_STATUS_IDLE_CHK_PARSE_FAILED */ 5664c965db44STomer Tayar "Idle check parsing failed", 56657b6859fbSMintz, Yuval 56667b6859fbSMintz, Yuval /* DBG_STATUS_MCP_TRACE_BAD_DATA */ 5667c965db44STomer Tayar "MCP Trace data is corrupt", 56687b6859fbSMintz, Yuval 56697b6859fbSMintz, Yuval /* DBG_STATUS_MCP_TRACE_NO_META */ 56707b6859fbSMintz, Yuval "Dump doesn't contain meta data - it must be provided in image file", 56717b6859fbSMintz, Yuval 56727b6859fbSMintz, Yuval /* DBG_STATUS_MCP_COULD_NOT_HALT */ 5673c965db44STomer Tayar "Failed to halt MCP", 56747b6859fbSMintz, Yuval 56757b6859fbSMintz, Yuval /* DBG_STATUS_MCP_COULD_NOT_RESUME */ 5676c965db44STomer Tayar "Failed to resume MCP after halt", 56777b6859fbSMintz, Yuval 56782d22bc83SMichal Kalderon /* DBG_STATUS_RESERVED0 */ 56792d22bc83SMichal Kalderon "", 56807b6859fbSMintz, Yuval 56817b6859fbSMintz, Yuval /* DBG_STATUS_SEMI_FIFO_NOT_EMPTY */ 5682c965db44STomer Tayar "Failed to empty SEMI sync FIFO", 56837b6859fbSMintz, Yuval 56847b6859fbSMintz, Yuval /* DBG_STATUS_IGU_FIFO_BAD_DATA */ 5685c965db44STomer Tayar "IGU FIFO data is corrupt", 56867b6859fbSMintz, Yuval 56877b6859fbSMintz, Yuval /* DBG_STATUS_MCP_COULD_NOT_MASK_PRTY */ 5688c965db44STomer Tayar "MCP failed to mask parities", 56897b6859fbSMintz, Yuval 56907b6859fbSMintz, Yuval /* DBG_STATUS_FW_ASSERTS_PARSE_FAILED */ 5691c965db44STomer Tayar "FW Asserts parsing failed", 56927b6859fbSMintz, Yuval 56937b6859fbSMintz, Yuval /* DBG_STATUS_REG_FIFO_BAD_DATA */ 5694c965db44STomer Tayar "GRC FIFO data is corrupt", 56957b6859fbSMintz, Yuval 56967b6859fbSMintz, Yuval /* DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA */ 5697c965db44STomer Tayar "Protection Override data is corrupt", 56987b6859fbSMintz, Yuval 56997b6859fbSMintz, Yuval /* DBG_STATUS_DBG_ARRAY_NOT_SET */ 5700c965db44STomer Tayar "Debug arrays were not set (when using binary files, dbg_set_bin_ptr must be called)", 57017b6859fbSMintz, Yuval 57022d22bc83SMichal Kalderon /* DBG_STATUS_RESERVED1 */ 57032d22bc83SMichal Kalderon "", 57047b6859fbSMintz, Yuval 57057b6859fbSMintz, Yuval /* DBG_STATUS_NON_MATCHING_LINES */ 57062d22bc83SMichal Kalderon "Non-matching debug lines - in E4, all lines must be of the same type (either 128b or 256b)", 57077b6859fbSMintz, Yuval 57082d22bc83SMichal Kalderon /* DBG_STATUS_INSUFFICIENT_HW_IDS */ 57092d22bc83SMichal Kalderon "Insufficient HW IDs. Try to record less Storms/blocks", 57107b6859fbSMintz, Yuval 57117b6859fbSMintz, Yuval /* DBG_STATUS_DBG_BUS_IN_USE */ 57122d22bc83SMichal Kalderon "The debug bus is in use", 57132d22bc83SMichal Kalderon 57142d22bc83SMichal Kalderon /* DBG_STATUS_INVALID_STORM_DBG_MODE */ 57152d22bc83SMichal Kalderon "The storm debug mode is not supported in the current chip", 57162d22bc83SMichal Kalderon 57172d22bc83SMichal Kalderon /* DBG_STATUS_OTHER_ENGINE_BB_ONLY */ 57182d22bc83SMichal Kalderon "Other engine is supported only in BB", 57192d22bc83SMichal Kalderon 57202d22bc83SMichal Kalderon /* DBG_STATUS_FILTER_SINGLE_HW_ID */ 57212d22bc83SMichal Kalderon "The configured filter mode requires a single Storm/block input", 57222d22bc83SMichal Kalderon 57232d22bc83SMichal Kalderon /* DBG_STATUS_TRIGGER_SINGLE_HW_ID */ 57242d22bc83SMichal Kalderon "The configured filter mode requires that all the constraints of a single trigger state will be defined on a single Storm/block input", 57252d22bc83SMichal Kalderon 57262d22bc83SMichal Kalderon /* DBG_STATUS_MISSING_TRIGGER_STATE_STORM */ 57272d22bc83SMichal Kalderon "When triggering on Storm data, the Storm to trigger on must be specified" 5728c965db44STomer Tayar }; 5729c965db44STomer Tayar 5730c965db44STomer Tayar /* Idle check severity names array */ 5731c965db44STomer Tayar static const char * const s_idle_chk_severity_str[] = { 5732c965db44STomer Tayar "Error", 5733c965db44STomer Tayar "Error if no traffic", 5734c965db44STomer Tayar "Warning" 5735c965db44STomer Tayar }; 5736c965db44STomer Tayar 5737c965db44STomer Tayar /* MCP Trace level names array */ 5738c965db44STomer Tayar static const char * const s_mcp_trace_level_str[] = { 5739c965db44STomer Tayar "ERROR", 5740c965db44STomer Tayar "TRACE", 5741c965db44STomer Tayar "DEBUG" 5742c965db44STomer Tayar }; 5743c965db44STomer Tayar 57447b6859fbSMintz, Yuval /* Access type names array */ 5745c965db44STomer Tayar static const char * const s_access_strs[] = { 5746c965db44STomer Tayar "read", 5747c965db44STomer Tayar "write" 5748c965db44STomer Tayar }; 5749c965db44STomer Tayar 57507b6859fbSMintz, Yuval /* Privilege type names array */ 5751c965db44STomer Tayar static const char * const s_privilege_strs[] = { 5752c965db44STomer Tayar "VF", 5753c965db44STomer Tayar "PDA", 5754c965db44STomer Tayar "HV", 5755c965db44STomer Tayar "UA" 5756c965db44STomer Tayar }; 5757c965db44STomer Tayar 57587b6859fbSMintz, Yuval /* Protection type names array */ 5759c965db44STomer Tayar static const char * const s_protection_strs[] = { 5760c965db44STomer Tayar "(default)", 5761c965db44STomer Tayar "(default)", 5762c965db44STomer Tayar "(default)", 5763c965db44STomer Tayar "(default)", 5764c965db44STomer Tayar "override VF", 5765c965db44STomer Tayar "override PDA", 5766c965db44STomer Tayar "override HV", 5767c965db44STomer Tayar "override UA" 5768c965db44STomer Tayar }; 5769c965db44STomer Tayar 57707b6859fbSMintz, Yuval /* Master type names array */ 5771c965db44STomer Tayar static const char * const s_master_strs[] = { 5772c965db44STomer Tayar "???", 5773c965db44STomer Tayar "pxp", 5774c965db44STomer Tayar "mcp", 5775c965db44STomer Tayar "msdm", 5776c965db44STomer Tayar "psdm", 5777c965db44STomer Tayar "ysdm", 5778c965db44STomer Tayar "usdm", 5779c965db44STomer Tayar "tsdm", 5780c965db44STomer Tayar "xsdm", 5781c965db44STomer Tayar "dbu", 5782c965db44STomer Tayar "dmae", 57832d22bc83SMichal Kalderon "jdap", 5784c965db44STomer Tayar "???", 5785c965db44STomer Tayar "???", 5786c965db44STomer Tayar "???", 5787c965db44STomer Tayar "???" 5788c965db44STomer Tayar }; 5789c965db44STomer Tayar 57907b6859fbSMintz, Yuval /* REG FIFO error messages array */ 57912d22bc83SMichal Kalderon static struct reg_fifo_err s_reg_fifo_errors[] = { 57922d22bc83SMichal Kalderon {1, "grc timeout"}, 57932d22bc83SMichal Kalderon {2, "address doesn't belong to any block"}, 57942d22bc83SMichal Kalderon {4, "reserved address in block or write to read-only address"}, 57952d22bc83SMichal Kalderon {8, "privilege/protection mismatch"}, 57962d22bc83SMichal Kalderon {16, "path isolation error"}, 57972d22bc83SMichal Kalderon {17, "RSL error"} 5798c965db44STomer Tayar }; 5799c965db44STomer Tayar 58007b6859fbSMintz, Yuval /* IGU FIFO sources array */ 5801c965db44STomer Tayar static const char * const s_igu_fifo_source_strs[] = { 5802c965db44STomer Tayar "TSTORM", 5803c965db44STomer Tayar "MSTORM", 5804c965db44STomer Tayar "USTORM", 5805c965db44STomer Tayar "XSTORM", 5806c965db44STomer Tayar "YSTORM", 5807c965db44STomer Tayar "PSTORM", 5808c965db44STomer Tayar "PCIE", 5809c965db44STomer Tayar "NIG_QM_PBF", 5810c965db44STomer Tayar "CAU", 5811c965db44STomer Tayar "ATTN", 5812c965db44STomer Tayar "GRC", 5813c965db44STomer Tayar }; 5814c965db44STomer Tayar 58157b6859fbSMintz, Yuval /* IGU FIFO error messages */ 5816c965db44STomer Tayar static const char * const s_igu_fifo_error_strs[] = { 5817c965db44STomer Tayar "no error", 5818c965db44STomer Tayar "length error", 5819c965db44STomer Tayar "function disabled", 58201d510657SColin Ian King "VF sent command to attention address", 5821c965db44STomer Tayar "host sent prod update command", 5822c965db44STomer Tayar "read of during interrupt register while in MIMD mode", 5823c965db44STomer Tayar "access to PXP BAR reserved address", 5824c965db44STomer Tayar "producer update command to attention index", 5825c965db44STomer Tayar "unknown error", 5826c965db44STomer Tayar "SB index not valid", 5827c965db44STomer Tayar "SB relative index and FID not found", 5828c965db44STomer Tayar "FID not match", 5829c965db44STomer Tayar "command with error flag asserted (PCI error or CAU discard)", 5830c965db44STomer Tayar "VF sent cleanup and RF cleanup is disabled", 5831c965db44STomer Tayar "cleanup command on type bigger than 4" 5832c965db44STomer Tayar }; 5833c965db44STomer Tayar 5834c965db44STomer Tayar /* IGU FIFO address data */ 5835c965db44STomer Tayar static const struct igu_fifo_addr_data s_igu_fifo_addr_data[] = { 58367b6859fbSMintz, Yuval {0x0, 0x101, "MSI-X Memory", NULL, 58377b6859fbSMintz, Yuval IGU_ADDR_TYPE_MSIX_MEM}, 58387b6859fbSMintz, Yuval {0x102, 0x1ff, "reserved", NULL, 58397b6859fbSMintz, Yuval IGU_ADDR_TYPE_RESERVED}, 58407b6859fbSMintz, Yuval {0x200, 0x200, "Write PBA[0:63]", NULL, 58417b6859fbSMintz, Yuval IGU_ADDR_TYPE_WRITE_PBA}, 5842c965db44STomer Tayar {0x201, 0x201, "Write PBA[64:127]", "reserved", 5843c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_PBA}, 58447b6859fbSMintz, Yuval {0x202, 0x202, "Write PBA[128]", "reserved", 58457b6859fbSMintz, Yuval IGU_ADDR_TYPE_WRITE_PBA}, 58467b6859fbSMintz, Yuval {0x203, 0x3ff, "reserved", NULL, 58477b6859fbSMintz, Yuval IGU_ADDR_TYPE_RESERVED}, 5848c965db44STomer Tayar {0x400, 0x5ef, "Write interrupt acknowledgment", NULL, 5849c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_INT_ACK}, 5850c965db44STomer Tayar {0x5f0, 0x5f0, "Attention bits update", NULL, 5851c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS}, 5852c965db44STomer Tayar {0x5f1, 0x5f1, "Attention bits set", NULL, 5853c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS}, 5854c965db44STomer Tayar {0x5f2, 0x5f2, "Attention bits clear", NULL, 5855c965db44STomer Tayar IGU_ADDR_TYPE_WRITE_ATTN_BITS}, 5856c965db44STomer Tayar {0x5f3, 0x5f3, "Read interrupt 0:63 with mask", NULL, 5857c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 5858c965db44STomer Tayar {0x5f4, 0x5f4, "Read interrupt 0:31 with mask", NULL, 5859c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 5860c965db44STomer Tayar {0x5f5, 0x5f5, "Read interrupt 32:63 with mask", NULL, 5861c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 5862c965db44STomer Tayar {0x5f6, 0x5f6, "Read interrupt 0:63 without mask", NULL, 5863c965db44STomer Tayar IGU_ADDR_TYPE_READ_INT}, 58647b6859fbSMintz, Yuval {0x5f7, 0x5ff, "reserved", NULL, 58657b6859fbSMintz, Yuval IGU_ADDR_TYPE_RESERVED}, 58667b6859fbSMintz, Yuval {0x600, 0x7ff, "Producer update", NULL, 58677b6859fbSMintz, Yuval IGU_ADDR_TYPE_WRITE_PROD_UPDATE} 5868c965db44STomer Tayar }; 5869c965db44STomer Tayar 5870c965db44STomer Tayar /******************************** Variables **********************************/ 5871c965db44STomer Tayar 5872c965db44STomer Tayar /* Temporary buffer, used for print size calculations */ 5873c965db44STomer Tayar static char s_temp_buf[MAX_MSG_LEN]; 5874c965db44STomer Tayar 58757b6859fbSMintz, Yuval /**************************** Private Functions ******************************/ 5876c965db44STomer Tayar 5877c965db44STomer Tayar static u32 qed_cyclic_add(u32 a, u32 b, u32 size) 5878c965db44STomer Tayar { 5879c965db44STomer Tayar return (a + b) % size; 5880c965db44STomer Tayar } 5881c965db44STomer Tayar 5882c965db44STomer Tayar static u32 qed_cyclic_sub(u32 a, u32 b, u32 size) 5883c965db44STomer Tayar { 5884c965db44STomer Tayar return (size + a - b) % size; 5885c965db44STomer Tayar } 5886c965db44STomer Tayar 5887c965db44STomer Tayar /* Reads the specified number of bytes from the specified cyclic buffer (up to 4 5888c965db44STomer Tayar * bytes) and returns them as a dword value. the specified buffer offset is 5889c965db44STomer Tayar * updated. 5890c965db44STomer Tayar */ 5891c965db44STomer Tayar static u32 qed_read_from_cyclic_buf(void *buf, 5892c965db44STomer Tayar u32 *offset, 5893c965db44STomer Tayar u32 buf_size, u8 num_bytes_to_read) 5894c965db44STomer Tayar { 58957b6859fbSMintz, Yuval u8 i, *val_ptr, *bytes_buf = (u8 *)buf; 5896c965db44STomer Tayar u32 val = 0; 5897c965db44STomer Tayar 5898c965db44STomer Tayar val_ptr = (u8 *)&val; 5899c965db44STomer Tayar 590050bc60cbSMichal Kalderon /* Assume running on a LITTLE ENDIAN and the buffer is network order 590150bc60cbSMichal Kalderon * (BIG ENDIAN), as high order bytes are placed in lower memory address. 590250bc60cbSMichal Kalderon */ 5903c965db44STomer Tayar for (i = 0; i < num_bytes_to_read; i++) { 5904c965db44STomer Tayar val_ptr[i] = bytes_buf[*offset]; 5905c965db44STomer Tayar *offset = qed_cyclic_add(*offset, 1, buf_size); 5906c965db44STomer Tayar } 5907c965db44STomer Tayar 5908c965db44STomer Tayar return val; 5909c965db44STomer Tayar } 5910c965db44STomer Tayar 5911c965db44STomer Tayar /* Reads and returns the next byte from the specified buffer. 5912c965db44STomer Tayar * The specified buffer offset is updated. 5913c965db44STomer Tayar */ 5914c965db44STomer Tayar static u8 qed_read_byte_from_buf(void *buf, u32 *offset) 5915c965db44STomer Tayar { 5916c965db44STomer Tayar return ((u8 *)buf)[(*offset)++]; 5917c965db44STomer Tayar } 5918c965db44STomer Tayar 5919c965db44STomer Tayar /* Reads and returns the next dword from the specified buffer. 5920c965db44STomer Tayar * The specified buffer offset is updated. 5921c965db44STomer Tayar */ 5922c965db44STomer Tayar static u32 qed_read_dword_from_buf(void *buf, u32 *offset) 5923c965db44STomer Tayar { 5924c965db44STomer Tayar u32 dword_val = *(u32 *)&((u8 *)buf)[*offset]; 5925c965db44STomer Tayar 5926c965db44STomer Tayar *offset += 4; 59277b6859fbSMintz, Yuval 5928c965db44STomer Tayar return dword_val; 5929c965db44STomer Tayar } 5930c965db44STomer Tayar 5931c965db44STomer Tayar /* Reads the next string from the specified buffer, and copies it to the 5932c965db44STomer Tayar * specified pointer. The specified buffer offset is updated. 5933c965db44STomer Tayar */ 5934c965db44STomer Tayar static void qed_read_str_from_buf(void *buf, u32 *offset, u32 size, char *dest) 5935c965db44STomer Tayar { 5936c965db44STomer Tayar const char *source_str = &((const char *)buf)[*offset]; 5937c965db44STomer Tayar 5938c965db44STomer Tayar strncpy(dest, source_str, size); 5939c965db44STomer Tayar dest[size - 1] = '\0'; 5940c965db44STomer Tayar *offset += size; 5941c965db44STomer Tayar } 5942c965db44STomer Tayar 5943c965db44STomer Tayar /* Returns a pointer to the specified offset (in bytes) of the specified buffer. 5944c965db44STomer Tayar * If the specified buffer in NULL, a temporary buffer pointer is returned. 5945c965db44STomer Tayar */ 5946c965db44STomer Tayar static char *qed_get_buf_ptr(void *buf, u32 offset) 5947c965db44STomer Tayar { 5948c965db44STomer Tayar return buf ? (char *)buf + offset : s_temp_buf; 5949c965db44STomer Tayar } 5950c965db44STomer Tayar 5951c965db44STomer Tayar /* Reads a param from the specified buffer. Returns the number of dwords read. 5952c965db44STomer Tayar * If the returned str_param is NULL, the param is numeric and its value is 5953c965db44STomer Tayar * returned in num_param. 5954c965db44STomer Tayar * Otheriwise, the param is a string and its pointer is returned in str_param. 5955c965db44STomer Tayar */ 5956c965db44STomer Tayar static u32 qed_read_param(u32 *dump_buf, 5957c965db44STomer Tayar const char **param_name, 5958c965db44STomer Tayar const char **param_str_val, u32 *param_num_val) 5959c965db44STomer Tayar { 5960c965db44STomer Tayar char *char_buf = (char *)dump_buf; 59617b6859fbSMintz, Yuval size_t offset = 0; 5962c965db44STomer Tayar 5963c965db44STomer Tayar /* Extract param name */ 5964c965db44STomer Tayar *param_name = char_buf; 5965c965db44STomer Tayar offset += strlen(*param_name) + 1; 5966c965db44STomer Tayar 5967c965db44STomer Tayar /* Check param type */ 5968c965db44STomer Tayar if (*(char_buf + offset++)) { 5969c965db44STomer Tayar /* String param */ 5970c965db44STomer Tayar *param_str_val = char_buf + offset; 5971da090917STomer Tayar *param_num_val = 0; 5972c965db44STomer Tayar offset += strlen(*param_str_val) + 1; 5973c965db44STomer Tayar if (offset & 0x3) 5974c965db44STomer Tayar offset += (4 - (offset & 0x3)); 5975c965db44STomer Tayar } else { 5976c965db44STomer Tayar /* Numeric param */ 5977c965db44STomer Tayar *param_str_val = NULL; 5978c965db44STomer Tayar if (offset & 0x3) 5979c965db44STomer Tayar offset += (4 - (offset & 0x3)); 5980c965db44STomer Tayar *param_num_val = *(u32 *)(char_buf + offset); 5981c965db44STomer Tayar offset += 4; 5982c965db44STomer Tayar } 5983c965db44STomer Tayar 598450bc60cbSMichal Kalderon return (u32)offset / 4; 5985c965db44STomer Tayar } 5986c965db44STomer Tayar 5987c965db44STomer Tayar /* Reads a section header from the specified buffer. 5988c965db44STomer Tayar * Returns the number of dwords read. 5989c965db44STomer Tayar */ 5990c965db44STomer Tayar static u32 qed_read_section_hdr(u32 *dump_buf, 5991c965db44STomer Tayar const char **section_name, 5992c965db44STomer Tayar u32 *num_section_params) 5993c965db44STomer Tayar { 5994c965db44STomer Tayar const char *param_str_val; 5995c965db44STomer Tayar 5996c965db44STomer Tayar return qed_read_param(dump_buf, 5997c965db44STomer Tayar section_name, ¶m_str_val, num_section_params); 5998c965db44STomer Tayar } 5999c965db44STomer Tayar 6000c965db44STomer Tayar /* Reads section params from the specified buffer and prints them to the results 6001c965db44STomer Tayar * buffer. Returns the number of dwords read. 6002c965db44STomer Tayar */ 6003c965db44STomer Tayar static u32 qed_print_section_params(u32 *dump_buf, 6004c965db44STomer Tayar u32 num_section_params, 6005c965db44STomer Tayar char *results_buf, u32 *num_chars_printed) 6006c965db44STomer Tayar { 6007c965db44STomer Tayar u32 i, dump_offset = 0, results_offset = 0; 6008c965db44STomer Tayar 6009c965db44STomer Tayar for (i = 0; i < num_section_params; i++) { 60107b6859fbSMintz, Yuval const char *param_name, *param_str_val; 6011c965db44STomer Tayar u32 param_num_val = 0; 6012c965db44STomer Tayar 6013c965db44STomer Tayar dump_offset += qed_read_param(dump_buf + dump_offset, 6014c965db44STomer Tayar ¶m_name, 6015c965db44STomer Tayar ¶m_str_val, ¶m_num_val); 60167b6859fbSMintz, Yuval 6017c965db44STomer Tayar if (param_str_val) 6018c965db44STomer Tayar results_offset += 6019c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6020c965db44STomer Tayar results_offset), 6021c965db44STomer Tayar "%s: %s\n", param_name, param_str_val); 6022c965db44STomer Tayar else if (strcmp(param_name, "fw-timestamp")) 6023c965db44STomer Tayar results_offset += 6024c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6025c965db44STomer Tayar results_offset), 6026c965db44STomer Tayar "%s: %d\n", param_name, param_num_val); 6027c965db44STomer Tayar } 6028c965db44STomer Tayar 60297b6859fbSMintz, Yuval results_offset += sprintf(qed_get_buf_ptr(results_buf, results_offset), 60307b6859fbSMintz, Yuval "\n"); 6031c965db44STomer Tayar 60327b6859fbSMintz, Yuval *num_chars_printed = results_offset; 60337b6859fbSMintz, Yuval 60347b6859fbSMintz, Yuval return dump_offset; 6035c965db44STomer Tayar } 6036c965db44STomer Tayar 60372d22bc83SMichal Kalderon /* Returns the block name that matches the specified block ID, 60382d22bc83SMichal Kalderon * or NULL if not found. 60392d22bc83SMichal Kalderon */ 60402d22bc83SMichal Kalderon static const char *qed_dbg_get_block_name(struct qed_hwfn *p_hwfn, 60412d22bc83SMichal Kalderon enum block_id block_id) 60422d22bc83SMichal Kalderon { 60432d22bc83SMichal Kalderon const struct dbg_block_user *block = 60442d22bc83SMichal Kalderon (const struct dbg_block_user *) 60452d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_USER_DATA].ptr + block_id; 60462d22bc83SMichal Kalderon 60472d22bc83SMichal Kalderon return (const char *)block->name; 60482d22bc83SMichal Kalderon } 60492d22bc83SMichal Kalderon 60502d22bc83SMichal Kalderon static struct dbg_tools_user_data *qed_dbg_get_user_data(struct qed_hwfn 60512d22bc83SMichal Kalderon *p_hwfn) 6052a3f72307SDenis Bolotin { 6053a3f72307SDenis Bolotin return (struct dbg_tools_user_data *)p_hwfn->dbg_user_info; 6054a3f72307SDenis Bolotin } 6055a3f72307SDenis Bolotin 6056c965db44STomer Tayar /* Parses the idle check rules and returns the number of characters printed. 6057c965db44STomer Tayar * In case of parsing error, returns 0. 6058c965db44STomer Tayar */ 60592d22bc83SMichal Kalderon static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn, 60602d22bc83SMichal Kalderon u32 *dump_buf, 6061c965db44STomer Tayar u32 *dump_buf_end, 6062c965db44STomer Tayar u32 num_rules, 6063c965db44STomer Tayar bool print_fw_idle_chk, 6064c965db44STomer Tayar char *results_buf, 6065c965db44STomer Tayar u32 *num_errors, u32 *num_warnings) 6066c965db44STomer Tayar { 60677b6859fbSMintz, Yuval /* Offset in results_buf in bytes */ 60687b6859fbSMintz, Yuval u32 results_offset = 0; 60697b6859fbSMintz, Yuval 60707b6859fbSMintz, Yuval u32 rule_idx; 6071c965db44STomer Tayar u16 i, j; 6072c965db44STomer Tayar 6073c965db44STomer Tayar *num_errors = 0; 6074c965db44STomer Tayar *num_warnings = 0; 6075c965db44STomer Tayar 6076c965db44STomer Tayar /* Go over dumped results */ 6077c965db44STomer Tayar for (rule_idx = 0; rule_idx < num_rules && dump_buf < dump_buf_end; 6078c965db44STomer Tayar rule_idx++) { 6079c965db44STomer Tayar const struct dbg_idle_chk_rule_parsing_data *rule_parsing_data; 6080c965db44STomer Tayar struct dbg_idle_chk_result_hdr *hdr; 60817b6859fbSMintz, Yuval const char *parsing_str, *lsi_msg; 6082c965db44STomer Tayar u32 parsing_str_offset; 6083c965db44STomer Tayar bool has_fw_msg; 60847b6859fbSMintz, Yuval u8 curr_reg_id; 6085c965db44STomer Tayar 6086c965db44STomer Tayar hdr = (struct dbg_idle_chk_result_hdr *)dump_buf; 6087c965db44STomer Tayar rule_parsing_data = 6088c965db44STomer Tayar (const struct dbg_idle_chk_rule_parsing_data *) 60892d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr + 60902d22bc83SMichal Kalderon hdr->rule_id; 6091c965db44STomer Tayar parsing_str_offset = 6092c965db44STomer Tayar GET_FIELD(rule_parsing_data->data, 6093c965db44STomer Tayar DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET); 6094c965db44STomer Tayar has_fw_msg = 6095c965db44STomer Tayar GET_FIELD(rule_parsing_data->data, 6096c965db44STomer Tayar DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG) > 0; 60972d22bc83SMichal Kalderon parsing_str = (const char *) 60982d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr + 60992d22bc83SMichal Kalderon parsing_str_offset; 6100c965db44STomer Tayar lsi_msg = parsing_str; 61017b6859fbSMintz, Yuval curr_reg_id = 0; 6102c965db44STomer Tayar 6103c965db44STomer Tayar if (hdr->severity >= MAX_DBG_IDLE_CHK_SEVERITY_TYPES) 6104c965db44STomer Tayar return 0; 6105c965db44STomer Tayar 6106c965db44STomer Tayar /* Skip rule header */ 61077b6859fbSMintz, Yuval dump_buf += BYTES_TO_DWORDS(sizeof(*hdr)); 6108c965db44STomer Tayar 6109c965db44STomer Tayar /* Update errors/warnings count */ 6110c965db44STomer Tayar if (hdr->severity == IDLE_CHK_SEVERITY_ERROR || 6111c965db44STomer Tayar hdr->severity == IDLE_CHK_SEVERITY_ERROR_NO_TRAFFIC) 6112c965db44STomer Tayar (*num_errors)++; 6113c965db44STomer Tayar else 6114c965db44STomer Tayar (*num_warnings)++; 6115c965db44STomer Tayar 6116c965db44STomer Tayar /* Print rule severity */ 6117c965db44STomer Tayar results_offset += 6118c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6119c965db44STomer Tayar results_offset), "%s: ", 6120c965db44STomer Tayar s_idle_chk_severity_str[hdr->severity]); 6121c965db44STomer Tayar 6122c965db44STomer Tayar /* Print rule message */ 6123c965db44STomer Tayar if (has_fw_msg) 6124c965db44STomer Tayar parsing_str += strlen(parsing_str) + 1; 6125c965db44STomer Tayar results_offset += 6126c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6127c965db44STomer Tayar results_offset), "%s.", 6128c965db44STomer Tayar has_fw_msg && 6129c965db44STomer Tayar print_fw_idle_chk ? parsing_str : lsi_msg); 6130c965db44STomer Tayar parsing_str += strlen(parsing_str) + 1; 6131c965db44STomer Tayar 6132c965db44STomer Tayar /* Print register values */ 6133c965db44STomer Tayar results_offset += 6134c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6135c965db44STomer Tayar results_offset), " Registers:"); 6136c965db44STomer Tayar for (i = 0; 6137c965db44STomer Tayar i < hdr->num_dumped_cond_regs + hdr->num_dumped_info_regs; 6138c965db44STomer Tayar i++) { 61397b6859fbSMintz, Yuval struct dbg_idle_chk_result_reg_hdr *reg_hdr; 61407b6859fbSMintz, Yuval bool is_mem; 61417b6859fbSMintz, Yuval u8 reg_id; 61427b6859fbSMintz, Yuval 61437b6859fbSMintz, Yuval reg_hdr = 61447b6859fbSMintz, Yuval (struct dbg_idle_chk_result_reg_hdr *)dump_buf; 61457b6859fbSMintz, Yuval is_mem = GET_FIELD(reg_hdr->data, 6146c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM); 61477b6859fbSMintz, Yuval reg_id = GET_FIELD(reg_hdr->data, 6148c965db44STomer Tayar DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID); 6149c965db44STomer Tayar 6150c965db44STomer Tayar /* Skip reg header */ 61517b6859fbSMintz, Yuval dump_buf += BYTES_TO_DWORDS(sizeof(*reg_hdr)); 6152c965db44STomer Tayar 6153c965db44STomer Tayar /* Skip register names until the required reg_id is 6154c965db44STomer Tayar * reached. 6155c965db44STomer Tayar */ 6156c965db44STomer Tayar for (; reg_id > curr_reg_id; 6157c965db44STomer Tayar curr_reg_id++, 6158c965db44STomer Tayar parsing_str += strlen(parsing_str) + 1); 6159c965db44STomer Tayar 6160c965db44STomer Tayar results_offset += 6161c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6162c965db44STomer Tayar results_offset), " %s", 6163c965db44STomer Tayar parsing_str); 6164c965db44STomer Tayar if (i < hdr->num_dumped_cond_regs && is_mem) 6165c965db44STomer Tayar results_offset += 6166c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6167c965db44STomer Tayar results_offset), 6168c965db44STomer Tayar "[%d]", hdr->mem_entry_id + 6169c965db44STomer Tayar reg_hdr->start_entry); 6170c965db44STomer Tayar results_offset += 6171c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6172c965db44STomer Tayar results_offset), "="); 6173c965db44STomer Tayar for (j = 0; j < reg_hdr->size; j++, dump_buf++) { 6174c965db44STomer Tayar results_offset += 6175c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6176c965db44STomer Tayar results_offset), 6177c965db44STomer Tayar "0x%x", *dump_buf); 6178c965db44STomer Tayar if (j < reg_hdr->size - 1) 6179c965db44STomer Tayar results_offset += 6180c965db44STomer Tayar sprintf(qed_get_buf_ptr 6181c965db44STomer Tayar (results_buf, 6182c965db44STomer Tayar results_offset), ","); 6183c965db44STomer Tayar } 6184c965db44STomer Tayar } 6185c965db44STomer Tayar 6186c965db44STomer Tayar results_offset += 6187c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, results_offset), "\n"); 6188c965db44STomer Tayar } 6189c965db44STomer Tayar 6190c965db44STomer Tayar /* Check if end of dump buffer was exceeded */ 6191c965db44STomer Tayar if (dump_buf > dump_buf_end) 6192c965db44STomer Tayar return 0; 61937b6859fbSMintz, Yuval 6194c965db44STomer Tayar return results_offset; 6195c965db44STomer Tayar } 6196c965db44STomer Tayar 6197c965db44STomer Tayar /* Parses an idle check dump buffer. 6198c965db44STomer Tayar * If result_buf is not NULL, the idle check results are printed to it. 6199c965db44STomer Tayar * In any case, the required results buffer size is assigned to 6200c965db44STomer Tayar * parsed_results_bytes. 6201c965db44STomer Tayar * The parsing status is returned. 6202c965db44STomer Tayar */ 62032d22bc83SMichal Kalderon static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn, 62042d22bc83SMichal Kalderon u32 *dump_buf, 6205c965db44STomer Tayar u32 num_dumped_dwords, 6206c965db44STomer Tayar char *results_buf, 6207c965db44STomer Tayar u32 *parsed_results_bytes, 6208c965db44STomer Tayar u32 *num_errors, 6209c965db44STomer Tayar u32 *num_warnings) 6210c965db44STomer Tayar { 6211c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 6212c965db44STomer Tayar u32 *dump_buf_end = dump_buf + num_dumped_dwords; 6213c965db44STomer Tayar u32 num_section_params = 0, num_rules; 62147b6859fbSMintz, Yuval 62157b6859fbSMintz, Yuval /* Offset in results_buf in bytes */ 62167b6859fbSMintz, Yuval u32 results_offset = 0; 6217c965db44STomer Tayar 6218c965db44STomer Tayar *parsed_results_bytes = 0; 6219c965db44STomer Tayar *num_errors = 0; 6220c965db44STomer Tayar *num_warnings = 0; 62217b6859fbSMintz, Yuval 62222d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr || 62232d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr) 6224c965db44STomer Tayar return DBG_STATUS_DBG_ARRAY_NOT_SET; 6225c965db44STomer Tayar 6226c965db44STomer Tayar /* Read global_params section */ 6227c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6228c965db44STomer Tayar §ion_name, &num_section_params); 6229c965db44STomer Tayar if (strcmp(section_name, "global_params")) 6230c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6231c965db44STomer Tayar 6232c965db44STomer Tayar /* Print global params */ 6233c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 6234c965db44STomer Tayar num_section_params, 6235c965db44STomer Tayar results_buf, &results_offset); 6236c965db44STomer Tayar 6237c965db44STomer Tayar /* Read idle_chk section */ 6238c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6239c965db44STomer Tayar §ion_name, &num_section_params); 6240c965db44STomer Tayar if (strcmp(section_name, "idle_chk") || num_section_params != 1) 6241c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6242c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 6243c965db44STomer Tayar ¶m_name, ¶m_str_val, &num_rules); 62447b6859fbSMintz, Yuval if (strcmp(param_name, "num_rules")) 6245c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6246c965db44STomer Tayar 6247c965db44STomer Tayar if (num_rules) { 6248c965db44STomer Tayar u32 rules_print_size; 6249c965db44STomer Tayar 6250c965db44STomer Tayar /* Print FW output */ 6251c965db44STomer Tayar results_offset += 6252c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6253c965db44STomer Tayar results_offset), 6254c965db44STomer Tayar "FW_IDLE_CHECK:\n"); 6255c965db44STomer Tayar rules_print_size = 62562d22bc83SMichal Kalderon qed_parse_idle_chk_dump_rules(p_hwfn, 62572d22bc83SMichal Kalderon dump_buf, 6258da090917STomer Tayar dump_buf_end, 6259da090917STomer Tayar num_rules, 6260c965db44STomer Tayar true, 6261c965db44STomer Tayar results_buf ? 6262c965db44STomer Tayar results_buf + 6263da090917STomer Tayar results_offset : 6264da090917STomer Tayar NULL, 6265da090917STomer Tayar num_errors, 6266da090917STomer Tayar num_warnings); 6267c965db44STomer Tayar results_offset += rules_print_size; 62687b6859fbSMintz, Yuval if (!rules_print_size) 6269c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6270c965db44STomer Tayar 6271c965db44STomer Tayar /* Print LSI output */ 6272c965db44STomer Tayar results_offset += 6273c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6274c965db44STomer Tayar results_offset), 6275c965db44STomer Tayar "\nLSI_IDLE_CHECK:\n"); 6276c965db44STomer Tayar rules_print_size = 62772d22bc83SMichal Kalderon qed_parse_idle_chk_dump_rules(p_hwfn, 62782d22bc83SMichal Kalderon dump_buf, 6279da090917STomer Tayar dump_buf_end, 6280da090917STomer Tayar num_rules, 6281c965db44STomer Tayar false, 6282c965db44STomer Tayar results_buf ? 6283c965db44STomer Tayar results_buf + 6284da090917STomer Tayar results_offset : 6285da090917STomer Tayar NULL, 6286da090917STomer Tayar num_errors, 6287da090917STomer Tayar num_warnings); 6288c965db44STomer Tayar results_offset += rules_print_size; 62897b6859fbSMintz, Yuval if (!rules_print_size) 6290c965db44STomer Tayar return DBG_STATUS_IDLE_CHK_PARSE_FAILED; 6291c965db44STomer Tayar } 6292c965db44STomer Tayar 6293c965db44STomer Tayar /* Print errors/warnings count */ 62947b6859fbSMintz, Yuval if (*num_errors) 6295c965db44STomer Tayar results_offset += 6296c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6297c965db44STomer Tayar results_offset), 6298c965db44STomer Tayar "\nIdle Check failed!!! (with %d errors and %d warnings)\n", 6299c965db44STomer Tayar *num_errors, *num_warnings); 63007b6859fbSMintz, Yuval else if (*num_warnings) 6301c965db44STomer Tayar results_offset += 6302c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6303c965db44STomer Tayar results_offset), 63047b6859fbSMintz, Yuval "\nIdle Check completed successfully (with %d warnings)\n", 6305c965db44STomer Tayar *num_warnings); 63067b6859fbSMintz, Yuval else 6307c965db44STomer Tayar results_offset += 6308c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6309c965db44STomer Tayar results_offset), 63107b6859fbSMintz, Yuval "\nIdle Check completed successfully\n"); 6311c965db44STomer Tayar 6312c965db44STomer Tayar /* Add 1 for string NULL termination */ 6313c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 63147b6859fbSMintz, Yuval 6315c965db44STomer Tayar return DBG_STATUS_OK; 6316c965db44STomer Tayar } 6317c965db44STomer Tayar 6318c965db44STomer Tayar /* Allocates and fills MCP Trace meta data based on the specified meta data 6319c965db44STomer Tayar * dump buffer. 6320c965db44STomer Tayar * Returns debug status code. 6321c965db44STomer Tayar */ 6322a3f72307SDenis Bolotin static enum dbg_status 6323a3f72307SDenis Bolotin qed_mcp_trace_alloc_meta_data(struct qed_hwfn *p_hwfn, 6324a3f72307SDenis Bolotin const u32 *meta_buf) 6325c965db44STomer Tayar { 6326a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data; 6327c965db44STomer Tayar u32 offset = 0, signature, i; 6328a3f72307SDenis Bolotin struct mcp_trace_meta *meta; 6329a3f72307SDenis Bolotin u8 *meta_buf_bytes; 6330a3f72307SDenis Bolotin 6331a3f72307SDenis Bolotin dev_user_data = qed_dbg_get_user_data(p_hwfn); 6332a3f72307SDenis Bolotin meta = &dev_user_data->mcp_trace_meta; 6333a3f72307SDenis Bolotin meta_buf_bytes = (u8 *)meta_buf; 6334c965db44STomer Tayar 633550bc60cbSMichal Kalderon /* Free the previous meta before loading a new one. */ 6336a3f72307SDenis Bolotin if (meta->is_allocated) 6337a3f72307SDenis Bolotin qed_mcp_trace_free_meta_data(p_hwfn); 633850bc60cbSMichal Kalderon 6339c965db44STomer Tayar memset(meta, 0, sizeof(*meta)); 6340c965db44STomer Tayar 6341c965db44STomer Tayar /* Read first signature */ 6342c965db44STomer Tayar signature = qed_read_dword_from_buf(meta_buf_bytes, &offset); 63437b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 6344c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 6345c965db44STomer Tayar 63467b6859fbSMintz, Yuval /* Read no. of modules and allocate memory for their pointers */ 6347c965db44STomer Tayar meta->modules_num = qed_read_byte_from_buf(meta_buf_bytes, &offset); 63486396bb22SKees Cook meta->modules = kcalloc(meta->modules_num, sizeof(char *), 63496396bb22SKees Cook GFP_KERNEL); 6350c965db44STomer Tayar if (!meta->modules) 6351c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6352c965db44STomer Tayar 6353c965db44STomer Tayar /* Allocate and read all module strings */ 6354c965db44STomer Tayar for (i = 0; i < meta->modules_num; i++) { 6355c965db44STomer Tayar u8 module_len = qed_read_byte_from_buf(meta_buf_bytes, &offset); 6356c965db44STomer Tayar 6357c965db44STomer Tayar *(meta->modules + i) = kzalloc(module_len, GFP_KERNEL); 6358c965db44STomer Tayar if (!(*(meta->modules + i))) { 6359c965db44STomer Tayar /* Update number of modules to be released */ 6360c965db44STomer Tayar meta->modules_num = i ? i - 1 : 0; 6361c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6362c965db44STomer Tayar } 6363c965db44STomer Tayar 6364c965db44STomer Tayar qed_read_str_from_buf(meta_buf_bytes, &offset, module_len, 6365c965db44STomer Tayar *(meta->modules + i)); 6366c965db44STomer Tayar if (module_len > MCP_TRACE_MAX_MODULE_LEN) 6367c965db44STomer Tayar (*(meta->modules + i))[MCP_TRACE_MAX_MODULE_LEN] = '\0'; 6368c965db44STomer Tayar } 6369c965db44STomer Tayar 6370c965db44STomer Tayar /* Read second signature */ 6371c965db44STomer Tayar signature = qed_read_dword_from_buf(meta_buf_bytes, &offset); 63727b6859fbSMintz, Yuval if (signature != NVM_MAGIC_VALUE) 6373c965db44STomer Tayar return DBG_STATUS_INVALID_TRACE_SIGNATURE; 6374c965db44STomer Tayar 6375c965db44STomer Tayar /* Read number of formats and allocate memory for all formats */ 6376c965db44STomer Tayar meta->formats_num = qed_read_dword_from_buf(meta_buf_bytes, &offset); 63776396bb22SKees Cook meta->formats = kcalloc(meta->formats_num, 6378c965db44STomer Tayar sizeof(struct mcp_trace_format), 6379c965db44STomer Tayar GFP_KERNEL); 6380c965db44STomer Tayar if (!meta->formats) 6381c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6382c965db44STomer Tayar 6383c965db44STomer Tayar /* Allocate and read all strings */ 6384c965db44STomer Tayar for (i = 0; i < meta->formats_num; i++) { 6385c965db44STomer Tayar struct mcp_trace_format *format_ptr = &meta->formats[i]; 6386c965db44STomer Tayar u8 format_len; 6387c965db44STomer Tayar 6388c965db44STomer Tayar format_ptr->data = qed_read_dword_from_buf(meta_buf_bytes, 6389c965db44STomer Tayar &offset); 63902d22bc83SMichal Kalderon format_len = GET_MFW_FIELD(format_ptr->data, 63912d22bc83SMichal Kalderon MCP_TRACE_FORMAT_LEN); 6392c965db44STomer Tayar format_ptr->format_str = kzalloc(format_len, GFP_KERNEL); 6393c965db44STomer Tayar if (!format_ptr->format_str) { 6394c965db44STomer Tayar /* Update number of modules to be released */ 6395c965db44STomer Tayar meta->formats_num = i ? i - 1 : 0; 6396c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 6397c965db44STomer Tayar } 6398c965db44STomer Tayar 6399c965db44STomer Tayar qed_read_str_from_buf(meta_buf_bytes, 6400c965db44STomer Tayar &offset, 6401c965db44STomer Tayar format_len, format_ptr->format_str); 6402c965db44STomer Tayar } 6403c965db44STomer Tayar 6404a3f72307SDenis Bolotin meta->is_allocated = true; 6405c965db44STomer Tayar return DBG_STATUS_OK; 6406c965db44STomer Tayar } 6407c965db44STomer Tayar 640850bc60cbSMichal Kalderon /* Parses an MCP trace buffer. If result_buf is not NULL, the MCP Trace results 640950bc60cbSMichal Kalderon * are printed to it. The parsing status is returned. 641050bc60cbSMichal Kalderon * Arguments: 641150bc60cbSMichal Kalderon * trace_buf - MCP trace cyclic buffer 641250bc60cbSMichal Kalderon * trace_buf_size - MCP trace cyclic buffer size in bytes 641350bc60cbSMichal Kalderon * data_offset - offset in bytes of the data to parse in the MCP trace cyclic 641450bc60cbSMichal Kalderon * buffer. 641550bc60cbSMichal Kalderon * data_size - size in bytes of data to parse. 641650bc60cbSMichal Kalderon * parsed_buf - destination buffer for parsed data. 6417a3f72307SDenis Bolotin * parsed_results_bytes - size of parsed data in bytes. 641850bc60cbSMichal Kalderon */ 6419a3f72307SDenis Bolotin static enum dbg_status qed_parse_mcp_trace_buf(struct qed_hwfn *p_hwfn, 6420a3f72307SDenis Bolotin u8 *trace_buf, 642150bc60cbSMichal Kalderon u32 trace_buf_size, 642250bc60cbSMichal Kalderon u32 data_offset, 642350bc60cbSMichal Kalderon u32 data_size, 642450bc60cbSMichal Kalderon char *parsed_buf, 6425a3f72307SDenis Bolotin u32 *parsed_results_bytes) 642650bc60cbSMichal Kalderon { 6427a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data; 6428a3f72307SDenis Bolotin struct mcp_trace_meta *meta; 642950bc60cbSMichal Kalderon u32 param_mask, param_shift; 643050bc60cbSMichal Kalderon enum dbg_status status; 643150bc60cbSMichal Kalderon 6432a3f72307SDenis Bolotin dev_user_data = qed_dbg_get_user_data(p_hwfn); 6433a3f72307SDenis Bolotin meta = &dev_user_data->mcp_trace_meta; 6434a3f72307SDenis Bolotin *parsed_results_bytes = 0; 643550bc60cbSMichal Kalderon 6436a3f72307SDenis Bolotin if (!meta->is_allocated) 643750bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 643850bc60cbSMichal Kalderon 643950bc60cbSMichal Kalderon status = DBG_STATUS_OK; 644050bc60cbSMichal Kalderon 644150bc60cbSMichal Kalderon while (data_size) { 644250bc60cbSMichal Kalderon struct mcp_trace_format *format_ptr; 644350bc60cbSMichal Kalderon u8 format_level, format_module; 644450bc60cbSMichal Kalderon u32 params[3] = { 0, 0, 0 }; 644550bc60cbSMichal Kalderon u32 header, format_idx, i; 644650bc60cbSMichal Kalderon 644750bc60cbSMichal Kalderon if (data_size < MFW_TRACE_ENTRY_SIZE) 644850bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 644950bc60cbSMichal Kalderon 645050bc60cbSMichal Kalderon header = qed_read_from_cyclic_buf(trace_buf, 645150bc60cbSMichal Kalderon &data_offset, 645250bc60cbSMichal Kalderon trace_buf_size, 645350bc60cbSMichal Kalderon MFW_TRACE_ENTRY_SIZE); 645450bc60cbSMichal Kalderon data_size -= MFW_TRACE_ENTRY_SIZE; 645550bc60cbSMichal Kalderon format_idx = header & MFW_TRACE_EVENTID_MASK; 645650bc60cbSMichal Kalderon 645750bc60cbSMichal Kalderon /* Skip message if its index doesn't exist in the meta data */ 6458a3f72307SDenis Bolotin if (format_idx >= meta->formats_num) { 64592d22bc83SMichal Kalderon u8 format_size = (u8)GET_MFW_FIELD(header, 64602d22bc83SMichal Kalderon MFW_TRACE_PRM_SIZE); 646150bc60cbSMichal Kalderon 646250bc60cbSMichal Kalderon if (data_size < format_size) 646350bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 646450bc60cbSMichal Kalderon 646550bc60cbSMichal Kalderon data_offset = qed_cyclic_add(data_offset, 646650bc60cbSMichal Kalderon format_size, 646750bc60cbSMichal Kalderon trace_buf_size); 646850bc60cbSMichal Kalderon data_size -= format_size; 646950bc60cbSMichal Kalderon continue; 647050bc60cbSMichal Kalderon } 647150bc60cbSMichal Kalderon 6472a3f72307SDenis Bolotin format_ptr = &meta->formats[format_idx]; 647350bc60cbSMichal Kalderon 647450bc60cbSMichal Kalderon for (i = 0, 64752d22bc83SMichal Kalderon param_mask = MCP_TRACE_FORMAT_P1_SIZE_MASK, param_shift = 64762d22bc83SMichal Kalderon MCP_TRACE_FORMAT_P1_SIZE_OFFSET; 647750bc60cbSMichal Kalderon i < MCP_TRACE_FORMAT_MAX_PARAMS; 64782d22bc83SMichal Kalderon i++, param_mask <<= MCP_TRACE_FORMAT_PARAM_WIDTH, 647950bc60cbSMichal Kalderon param_shift += MCP_TRACE_FORMAT_PARAM_WIDTH) { 648050bc60cbSMichal Kalderon /* Extract param size (0..3) */ 648150bc60cbSMichal Kalderon u8 param_size = (u8)((format_ptr->data & param_mask) >> 648250bc60cbSMichal Kalderon param_shift); 648350bc60cbSMichal Kalderon 648450bc60cbSMichal Kalderon /* If the param size is zero, there are no other 648550bc60cbSMichal Kalderon * parameters. 648650bc60cbSMichal Kalderon */ 648750bc60cbSMichal Kalderon if (!param_size) 648850bc60cbSMichal Kalderon break; 648950bc60cbSMichal Kalderon 649050bc60cbSMichal Kalderon /* Size is encoded using 2 bits, where 3 is used to 649150bc60cbSMichal Kalderon * encode 4. 649250bc60cbSMichal Kalderon */ 649350bc60cbSMichal Kalderon if (param_size == 3) 649450bc60cbSMichal Kalderon param_size = 4; 649550bc60cbSMichal Kalderon 649650bc60cbSMichal Kalderon if (data_size < param_size) 649750bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 649850bc60cbSMichal Kalderon 649950bc60cbSMichal Kalderon params[i] = qed_read_from_cyclic_buf(trace_buf, 650050bc60cbSMichal Kalderon &data_offset, 650150bc60cbSMichal Kalderon trace_buf_size, 650250bc60cbSMichal Kalderon param_size); 650350bc60cbSMichal Kalderon data_size -= param_size; 650450bc60cbSMichal Kalderon } 650550bc60cbSMichal Kalderon 65062d22bc83SMichal Kalderon format_level = (u8)GET_MFW_FIELD(format_ptr->data, 65072d22bc83SMichal Kalderon MCP_TRACE_FORMAT_LEVEL); 65082d22bc83SMichal Kalderon format_module = (u8)GET_MFW_FIELD(format_ptr->data, 65092d22bc83SMichal Kalderon MCP_TRACE_FORMAT_MODULE); 651050bc60cbSMichal Kalderon if (format_level >= ARRAY_SIZE(s_mcp_trace_level_str)) 651150bc60cbSMichal Kalderon return DBG_STATUS_MCP_TRACE_BAD_DATA; 651250bc60cbSMichal Kalderon 651350bc60cbSMichal Kalderon /* Print current message to results buffer */ 6514a3f72307SDenis Bolotin *parsed_results_bytes += 6515a3f72307SDenis Bolotin sprintf(qed_get_buf_ptr(parsed_buf, 6516a3f72307SDenis Bolotin *parsed_results_bytes), 651750bc60cbSMichal Kalderon "%s %-8s: ", 651850bc60cbSMichal Kalderon s_mcp_trace_level_str[format_level], 6519a3f72307SDenis Bolotin meta->modules[format_module]); 6520a3f72307SDenis Bolotin *parsed_results_bytes += 6521a3f72307SDenis Bolotin sprintf(qed_get_buf_ptr(parsed_buf, *parsed_results_bytes), 652250bc60cbSMichal Kalderon format_ptr->format_str, 652350bc60cbSMichal Kalderon params[0], params[1], params[2]); 652450bc60cbSMichal Kalderon } 652550bc60cbSMichal Kalderon 652650bc60cbSMichal Kalderon /* Add string NULL terminator */ 6527a3f72307SDenis Bolotin (*parsed_results_bytes)++; 652850bc60cbSMichal Kalderon 652950bc60cbSMichal Kalderon return status; 653050bc60cbSMichal Kalderon } 653150bc60cbSMichal Kalderon 6532c965db44STomer Tayar /* Parses an MCP Trace dump buffer. 6533c965db44STomer Tayar * If result_buf is not NULL, the MCP Trace results are printed to it. 6534c965db44STomer Tayar * In any case, the required results buffer size is assigned to 6535a3f72307SDenis Bolotin * parsed_results_bytes. 6536c965db44STomer Tayar * The parsing status is returned. 6537c965db44STomer Tayar */ 6538c965db44STomer Tayar static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn, 6539c965db44STomer Tayar u32 *dump_buf, 6540a3f72307SDenis Bolotin char *results_buf, 6541a3f72307SDenis Bolotin u32 *parsed_results_bytes, 6542a3f72307SDenis Bolotin bool free_meta_data) 6543c965db44STomer Tayar { 6544c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 654550bc60cbSMichal Kalderon u32 data_size, trace_data_dwords, trace_meta_dwords; 6546a3f72307SDenis Bolotin u32 offset, results_offset, results_buf_bytes; 654750bc60cbSMichal Kalderon u32 param_num_val, num_section_params; 6548c965db44STomer Tayar struct mcp_trace *trace; 6549c965db44STomer Tayar enum dbg_status status; 6550c965db44STomer Tayar const u32 *meta_buf; 6551c965db44STomer Tayar u8 *trace_buf; 6552c965db44STomer Tayar 6553a3f72307SDenis Bolotin *parsed_results_bytes = 0; 6554c965db44STomer Tayar 6555c965db44STomer Tayar /* Read global_params section */ 6556c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6557c965db44STomer Tayar §ion_name, &num_section_params); 6558c965db44STomer Tayar if (strcmp(section_name, "global_params")) 6559c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 6560c965db44STomer Tayar 6561c965db44STomer Tayar /* Print global params */ 6562c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 6563c965db44STomer Tayar num_section_params, 6564a3f72307SDenis Bolotin results_buf, &results_offset); 6565c965db44STomer Tayar 6566c965db44STomer Tayar /* Read trace_data section */ 6567c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6568c965db44STomer Tayar §ion_name, &num_section_params); 6569c965db44STomer Tayar if (strcmp(section_name, "mcp_trace_data") || num_section_params != 1) 6570c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 6571c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 6572c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 6573c965db44STomer Tayar if (strcmp(param_name, "size")) 6574c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 6575c965db44STomer Tayar trace_data_dwords = param_num_val; 6576c965db44STomer Tayar 6577c965db44STomer Tayar /* Prepare trace info */ 6578c965db44STomer Tayar trace = (struct mcp_trace *)dump_buf; 6579a3f72307SDenis Bolotin if (trace->signature != MFW_TRACE_SIGNATURE || !trace->size) 6580a3f72307SDenis Bolotin return DBG_STATUS_MCP_TRACE_BAD_DATA; 6581a3f72307SDenis Bolotin 65827b6859fbSMintz, Yuval trace_buf = (u8 *)dump_buf + sizeof(*trace); 6583c965db44STomer Tayar offset = trace->trace_oldest; 658450bc60cbSMichal Kalderon data_size = qed_cyclic_sub(trace->trace_prod, offset, trace->size); 6585c965db44STomer Tayar dump_buf += trace_data_dwords; 6586c965db44STomer Tayar 6587c965db44STomer Tayar /* Read meta_data section */ 6588c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6589c965db44STomer Tayar §ion_name, &num_section_params); 6590c965db44STomer Tayar if (strcmp(section_name, "mcp_trace_meta")) 6591c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 6592c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 6593c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 65947b6859fbSMintz, Yuval if (strcmp(param_name, "size")) 6595c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_BAD_DATA; 6596c965db44STomer Tayar trace_meta_dwords = param_num_val; 6597c965db44STomer Tayar 6598c965db44STomer Tayar /* Choose meta data buffer */ 6599c965db44STomer Tayar if (!trace_meta_dwords) { 6600c965db44STomer Tayar /* Dump doesn't include meta data */ 6601a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data = 6602a3f72307SDenis Bolotin qed_dbg_get_user_data(p_hwfn); 6603a3f72307SDenis Bolotin 6604a3f72307SDenis Bolotin if (!dev_user_data->mcp_trace_user_meta_buf) 6605c965db44STomer Tayar return DBG_STATUS_MCP_TRACE_NO_META; 6606a3f72307SDenis Bolotin 6607a3f72307SDenis Bolotin meta_buf = dev_user_data->mcp_trace_user_meta_buf; 6608c965db44STomer Tayar } else { 6609c965db44STomer Tayar /* Dump includes meta data */ 6610c965db44STomer Tayar meta_buf = dump_buf; 6611c965db44STomer Tayar } 6612c965db44STomer Tayar 6613c965db44STomer Tayar /* Allocate meta data memory */ 6614a3f72307SDenis Bolotin status = qed_mcp_trace_alloc_meta_data(p_hwfn, meta_buf); 6615c965db44STomer Tayar if (status != DBG_STATUS_OK) 6616c965db44STomer Tayar return status; 661750bc60cbSMichal Kalderon 6618a3f72307SDenis Bolotin status = qed_parse_mcp_trace_buf(p_hwfn, 6619a3f72307SDenis Bolotin trace_buf, 662050bc60cbSMichal Kalderon trace->size, 662150bc60cbSMichal Kalderon offset, 662250bc60cbSMichal Kalderon data_size, 6623a3f72307SDenis Bolotin results_buf ? 6624a3f72307SDenis Bolotin results_buf + results_offset : 662550bc60cbSMichal Kalderon NULL, 6626a3f72307SDenis Bolotin &results_buf_bytes); 662750bc60cbSMichal Kalderon if (status != DBG_STATUS_OK) 662850bc60cbSMichal Kalderon return status; 662950bc60cbSMichal Kalderon 6630a3f72307SDenis Bolotin if (free_meta_data) 6631a3f72307SDenis Bolotin qed_mcp_trace_free_meta_data(p_hwfn); 6632a3f72307SDenis Bolotin 6633a3f72307SDenis Bolotin *parsed_results_bytes = results_offset + results_buf_bytes; 663450bc60cbSMichal Kalderon 663550bc60cbSMichal Kalderon return DBG_STATUS_OK; 6636c965db44STomer Tayar } 6637c965db44STomer Tayar 6638c965db44STomer Tayar /* Parses a Reg FIFO dump buffer. 6639c965db44STomer Tayar * If result_buf is not NULL, the Reg FIFO results are printed to it. 6640c965db44STomer Tayar * In any case, the required results buffer size is assigned to 6641c965db44STomer Tayar * parsed_results_bytes. 6642c965db44STomer Tayar * The parsing status is returned. 6643c965db44STomer Tayar */ 6644da090917STomer Tayar static enum dbg_status qed_parse_reg_fifo_dump(u32 *dump_buf, 6645c965db44STomer Tayar char *results_buf, 6646c965db44STomer Tayar u32 *parsed_results_bytes) 6647c965db44STomer Tayar { 6648c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 66497b6859fbSMintz, Yuval u32 param_num_val, num_section_params, num_elements; 6650c965db44STomer Tayar struct reg_fifo_element *elements; 66512d22bc83SMichal Kalderon u8 i, j, err_code, vf_val; 66527b6859fbSMintz, Yuval u32 results_offset = 0; 6653c965db44STomer Tayar char vf_str[4]; 6654c965db44STomer Tayar 6655c965db44STomer Tayar /* Read global_params section */ 6656c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6657c965db44STomer Tayar §ion_name, &num_section_params); 6658c965db44STomer Tayar if (strcmp(section_name, "global_params")) 6659c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 6660c965db44STomer Tayar 6661c965db44STomer Tayar /* Print global params */ 6662c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 6663c965db44STomer Tayar num_section_params, 6664c965db44STomer Tayar results_buf, &results_offset); 6665c965db44STomer Tayar 6666c965db44STomer Tayar /* Read reg_fifo_data section */ 6667c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6668c965db44STomer Tayar §ion_name, &num_section_params); 6669c965db44STomer Tayar if (strcmp(section_name, "reg_fifo_data")) 6670c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 6671c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 6672c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 6673c965db44STomer Tayar if (strcmp(param_name, "size")) 6674c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 6675c965db44STomer Tayar if (param_num_val % REG_FIFO_ELEMENT_DWORDS) 6676c965db44STomer Tayar return DBG_STATUS_REG_FIFO_BAD_DATA; 6677c965db44STomer Tayar num_elements = param_num_val / REG_FIFO_ELEMENT_DWORDS; 6678c965db44STomer Tayar elements = (struct reg_fifo_element *)dump_buf; 6679c965db44STomer Tayar 6680c965db44STomer Tayar /* Decode elements */ 6681c965db44STomer Tayar for (i = 0; i < num_elements; i++) { 66822d22bc83SMichal Kalderon const char *err_msg = NULL; 6683c965db44STomer Tayar 6684c965db44STomer Tayar /* Discover if element belongs to a VF or a PF */ 6685c965db44STomer Tayar vf_val = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_VF); 6686c965db44STomer Tayar if (vf_val == REG_FIFO_ELEMENT_IS_PF_VF_VAL) 6687c965db44STomer Tayar sprintf(vf_str, "%s", "N/A"); 6688c965db44STomer Tayar else 6689c965db44STomer Tayar sprintf(vf_str, "%d", vf_val); 6690c965db44STomer Tayar 66912d22bc83SMichal Kalderon /* Find error message */ 66922d22bc83SMichal Kalderon err_code = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_ERROR); 66932d22bc83SMichal Kalderon for (j = 0; j < ARRAY_SIZE(s_reg_fifo_errors) && !err_msg; j++) 66942d22bc83SMichal Kalderon if (err_code == s_reg_fifo_errors[j].err_code) 66952d22bc83SMichal Kalderon err_msg = s_reg_fifo_errors[j].err_msg; 66962d22bc83SMichal Kalderon 6697c965db44STomer Tayar /* Add parsed element to parsed buffer */ 6698c965db44STomer Tayar results_offset += 6699c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6700c965db44STomer Tayar results_offset), 67012d22bc83SMichal Kalderon "raw: 0x%016llx, address: 0x%07x, access: %-5s, pf: %2d, vf: %s, port: %d, privilege: %-3s, protection: %-12s, master: %-4s, error: %s\n", 6702c965db44STomer Tayar elements[i].data, 6703be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 6704c965db44STomer Tayar REG_FIFO_ELEMENT_ADDRESS) * 6705c965db44STomer Tayar REG_FIFO_ELEMENT_ADDR_FACTOR, 6706c965db44STomer Tayar s_access_strs[GET_FIELD(elements[i].data, 6707c965db44STomer Tayar REG_FIFO_ELEMENT_ACCESS)], 6708be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 67097b6859fbSMintz, Yuval REG_FIFO_ELEMENT_PF), 67107b6859fbSMintz, Yuval vf_str, 6711be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 6712c965db44STomer Tayar REG_FIFO_ELEMENT_PORT), 67137b6859fbSMintz, Yuval s_privilege_strs[GET_FIELD(elements[i].data, 6714c965db44STomer Tayar REG_FIFO_ELEMENT_PRIVILEGE)], 6715c965db44STomer Tayar s_protection_strs[GET_FIELD(elements[i].data, 6716c965db44STomer Tayar REG_FIFO_ELEMENT_PROTECTION)], 6717c965db44STomer Tayar s_master_strs[GET_FIELD(elements[i].data, 67182d22bc83SMichal Kalderon REG_FIFO_ELEMENT_MASTER)], 67192d22bc83SMichal Kalderon err_msg ? err_msg : "unknown error code"); 6720c965db44STomer Tayar } 6721c965db44STomer Tayar 6722c965db44STomer Tayar results_offset += sprintf(qed_get_buf_ptr(results_buf, 6723c965db44STomer Tayar results_offset), 6724c965db44STomer Tayar "fifo contained %d elements", num_elements); 6725c965db44STomer Tayar 6726c965db44STomer Tayar /* Add 1 for string NULL termination */ 6727c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 67287b6859fbSMintz, Yuval 6729c965db44STomer Tayar return DBG_STATUS_OK; 6730c965db44STomer Tayar } 6731c965db44STomer Tayar 67327b6859fbSMintz, Yuval static enum dbg_status qed_parse_igu_fifo_element(struct igu_fifo_element 67337b6859fbSMintz, Yuval *element, char 67347b6859fbSMintz, Yuval *results_buf, 6735da090917STomer Tayar u32 *results_offset) 6736c965db44STomer Tayar { 67377b6859fbSMintz, Yuval const struct igu_fifo_addr_data *found_addr = NULL; 67387b6859fbSMintz, Yuval u8 source, err_type, i, is_cleanup; 67397b6859fbSMintz, Yuval char parsed_addr_data[32]; 67407b6859fbSMintz, Yuval char parsed_wr_data[256]; 67417b6859fbSMintz, Yuval u32 wr_data, prod_cons; 67427b6859fbSMintz, Yuval bool is_wr_cmd, is_pf; 67437b6859fbSMintz, Yuval u16 cmd_addr; 67447b6859fbSMintz, Yuval u64 dword12; 67457b6859fbSMintz, Yuval 67467b6859fbSMintz, Yuval /* Dword12 (dword index 1 and 2) contains bits 32..95 of the 67477b6859fbSMintz, Yuval * FIFO element. 67487b6859fbSMintz, Yuval */ 67497b6859fbSMintz, Yuval dword12 = ((u64)element->dword2 << 32) | element->dword1; 67507b6859fbSMintz, Yuval is_wr_cmd = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD); 67517b6859fbSMintz, Yuval is_pf = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_IS_PF); 67527b6859fbSMintz, Yuval cmd_addr = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR); 67537b6859fbSMintz, Yuval source = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_SOURCE); 67547b6859fbSMintz, Yuval err_type = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE); 67557b6859fbSMintz, Yuval 67567b6859fbSMintz, Yuval if (source >= ARRAY_SIZE(s_igu_fifo_source_strs)) 67577b6859fbSMintz, Yuval return DBG_STATUS_IGU_FIFO_BAD_DATA; 67587b6859fbSMintz, Yuval if (err_type >= ARRAY_SIZE(s_igu_fifo_error_strs)) 67597b6859fbSMintz, Yuval return DBG_STATUS_IGU_FIFO_BAD_DATA; 67607b6859fbSMintz, Yuval 67617b6859fbSMintz, Yuval /* Find address data */ 67627b6859fbSMintz, Yuval for (i = 0; i < ARRAY_SIZE(s_igu_fifo_addr_data) && !found_addr; i++) { 67637b6859fbSMintz, Yuval const struct igu_fifo_addr_data *curr_addr = 67647b6859fbSMintz, Yuval &s_igu_fifo_addr_data[i]; 67657b6859fbSMintz, Yuval 67667b6859fbSMintz, Yuval if (cmd_addr >= curr_addr->start_addr && cmd_addr <= 67677b6859fbSMintz, Yuval curr_addr->end_addr) 67687b6859fbSMintz, Yuval found_addr = curr_addr; 6769c965db44STomer Tayar } 6770c965db44STomer Tayar 67717b6859fbSMintz, Yuval if (!found_addr) 67727b6859fbSMintz, Yuval return DBG_STATUS_IGU_FIFO_BAD_DATA; 6773c965db44STomer Tayar 67747b6859fbSMintz, Yuval /* Prepare parsed address data */ 67757b6859fbSMintz, Yuval switch (found_addr->type) { 67767b6859fbSMintz, Yuval case IGU_ADDR_TYPE_MSIX_MEM: 67777b6859fbSMintz, Yuval sprintf(parsed_addr_data, " vector_num = 0x%x", cmd_addr / 2); 67787b6859fbSMintz, Yuval break; 67797b6859fbSMintz, Yuval case IGU_ADDR_TYPE_WRITE_INT_ACK: 67807b6859fbSMintz, Yuval case IGU_ADDR_TYPE_WRITE_PROD_UPDATE: 67817b6859fbSMintz, Yuval sprintf(parsed_addr_data, 67827b6859fbSMintz, Yuval " SB = 0x%x", cmd_addr - found_addr->start_addr); 67837b6859fbSMintz, Yuval break; 67847b6859fbSMintz, Yuval default: 67857b6859fbSMintz, Yuval parsed_addr_data[0] = '\0'; 67867b6859fbSMintz, Yuval } 67877b6859fbSMintz, Yuval 67887b6859fbSMintz, Yuval if (!is_wr_cmd) { 67897b6859fbSMintz, Yuval parsed_wr_data[0] = '\0'; 67907b6859fbSMintz, Yuval goto out; 67917b6859fbSMintz, Yuval } 67927b6859fbSMintz, Yuval 67937b6859fbSMintz, Yuval /* Prepare parsed write data */ 67947b6859fbSMintz, Yuval wr_data = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_WR_DATA); 67957b6859fbSMintz, Yuval prod_cons = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_PROD_CONS); 67967b6859fbSMintz, Yuval is_cleanup = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_CMD_TYPE); 67977b6859fbSMintz, Yuval 67987b6859fbSMintz, Yuval if (source == IGU_SRC_ATTN) { 67997b6859fbSMintz, Yuval sprintf(parsed_wr_data, "prod: 0x%x, ", prod_cons); 68007b6859fbSMintz, Yuval } else { 68017b6859fbSMintz, Yuval if (is_cleanup) { 68027b6859fbSMintz, Yuval u8 cleanup_val, cleanup_type; 68037b6859fbSMintz, Yuval 68047b6859fbSMintz, Yuval cleanup_val = 68057b6859fbSMintz, Yuval GET_FIELD(wr_data, 68067b6859fbSMintz, Yuval IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL); 68077b6859fbSMintz, Yuval cleanup_type = 68087b6859fbSMintz, Yuval GET_FIELD(wr_data, 68097b6859fbSMintz, Yuval IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE); 68107b6859fbSMintz, Yuval 68117b6859fbSMintz, Yuval sprintf(parsed_wr_data, 68127b6859fbSMintz, Yuval "cmd_type: cleanup, cleanup_val: %s, cleanup_type : %d, ", 68137b6859fbSMintz, Yuval cleanup_val ? "set" : "clear", 68147b6859fbSMintz, Yuval cleanup_type); 68157b6859fbSMintz, Yuval } else { 68167b6859fbSMintz, Yuval u8 update_flag, en_dis_int_for_sb, segment; 68177b6859fbSMintz, Yuval u8 timer_mask; 68187b6859fbSMintz, Yuval 68197b6859fbSMintz, Yuval update_flag = GET_FIELD(wr_data, 68207b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_UPDATE_FLAG); 68217b6859fbSMintz, Yuval en_dis_int_for_sb = 68227b6859fbSMintz, Yuval GET_FIELD(wr_data, 68237b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB); 68247b6859fbSMintz, Yuval segment = GET_FIELD(wr_data, 68257b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_SEGMENT); 68267b6859fbSMintz, Yuval timer_mask = GET_FIELD(wr_data, 68277b6859fbSMintz, Yuval IGU_FIFO_WR_DATA_TIMER_MASK); 68287b6859fbSMintz, Yuval 68297b6859fbSMintz, Yuval sprintf(parsed_wr_data, 68307b6859fbSMintz, Yuval "cmd_type: prod/cons update, prod/cons: 0x%x, update_flag: %s, en_dis_int_for_sb : %s, segment : %s, timer_mask = %d, ", 68317b6859fbSMintz, Yuval prod_cons, 68327b6859fbSMintz, Yuval update_flag ? "update" : "nop", 6833da090917STomer Tayar en_dis_int_for_sb ? 6834da090917STomer Tayar (en_dis_int_for_sb == 1 ? "disable" : "nop") : 6835da090917STomer Tayar "enable", 68367b6859fbSMintz, Yuval segment ? "attn" : "regular", 68377b6859fbSMintz, Yuval timer_mask); 68387b6859fbSMintz, Yuval } 68397b6859fbSMintz, Yuval } 68407b6859fbSMintz, Yuval out: 68417b6859fbSMintz, Yuval /* Add parsed element to parsed buffer */ 68427b6859fbSMintz, Yuval *results_offset += sprintf(qed_get_buf_ptr(results_buf, 68437b6859fbSMintz, Yuval *results_offset), 68447b6859fbSMintz, Yuval "raw: 0x%01x%08x%08x, %s: %d, source : %s, type : %s, cmd_addr : 0x%x(%s%s), %serror: %s\n", 68457b6859fbSMintz, Yuval element->dword2, element->dword1, 68467b6859fbSMintz, Yuval element->dword0, 68477b6859fbSMintz, Yuval is_pf ? "pf" : "vf", 68487b6859fbSMintz, Yuval GET_FIELD(element->dword0, 68497b6859fbSMintz, Yuval IGU_FIFO_ELEMENT_DWORD0_FID), 68507b6859fbSMintz, Yuval s_igu_fifo_source_strs[source], 68517b6859fbSMintz, Yuval is_wr_cmd ? "wr" : "rd", 68527b6859fbSMintz, Yuval cmd_addr, 68537b6859fbSMintz, Yuval (!is_pf && found_addr->vf_desc) 68547b6859fbSMintz, Yuval ? found_addr->vf_desc 68557b6859fbSMintz, Yuval : found_addr->desc, 68567b6859fbSMintz, Yuval parsed_addr_data, 68577b6859fbSMintz, Yuval parsed_wr_data, 68587b6859fbSMintz, Yuval s_igu_fifo_error_strs[err_type]); 68597b6859fbSMintz, Yuval 68607b6859fbSMintz, Yuval return DBG_STATUS_OK; 6861c965db44STomer Tayar } 6862c965db44STomer Tayar 6863c965db44STomer Tayar /* Parses an IGU FIFO dump buffer. 6864c965db44STomer Tayar * If result_buf is not NULL, the IGU FIFO results are printed to it. 6865c965db44STomer Tayar * In any case, the required results buffer size is assigned to 6866c965db44STomer Tayar * parsed_results_bytes. 6867c965db44STomer Tayar * The parsing status is returned. 6868c965db44STomer Tayar */ 6869da090917STomer Tayar static enum dbg_status qed_parse_igu_fifo_dump(u32 *dump_buf, 6870c965db44STomer Tayar char *results_buf, 6871c965db44STomer Tayar u32 *parsed_results_bytes) 6872c965db44STomer Tayar { 6873c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 68747b6859fbSMintz, Yuval u32 param_num_val, num_section_params, num_elements; 6875c965db44STomer Tayar struct igu_fifo_element *elements; 68767b6859fbSMintz, Yuval enum dbg_status status; 68777b6859fbSMintz, Yuval u32 results_offset = 0; 68787b6859fbSMintz, Yuval u8 i; 6879c965db44STomer Tayar 6880c965db44STomer Tayar /* Read global_params section */ 6881c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6882c965db44STomer Tayar §ion_name, &num_section_params); 6883c965db44STomer Tayar if (strcmp(section_name, "global_params")) 6884c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 6885c965db44STomer Tayar 6886c965db44STomer Tayar /* Print global params */ 6887c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 6888c965db44STomer Tayar num_section_params, 6889c965db44STomer Tayar results_buf, &results_offset); 6890c965db44STomer Tayar 6891c965db44STomer Tayar /* Read igu_fifo_data section */ 6892c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6893c965db44STomer Tayar §ion_name, &num_section_params); 6894c965db44STomer Tayar if (strcmp(section_name, "igu_fifo_data")) 6895c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 6896c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 6897c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 6898c965db44STomer Tayar if (strcmp(param_name, "size")) 6899c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 6900c965db44STomer Tayar if (param_num_val % IGU_FIFO_ELEMENT_DWORDS) 6901c965db44STomer Tayar return DBG_STATUS_IGU_FIFO_BAD_DATA; 6902c965db44STomer Tayar num_elements = param_num_val / IGU_FIFO_ELEMENT_DWORDS; 6903c965db44STomer Tayar elements = (struct igu_fifo_element *)dump_buf; 6904c965db44STomer Tayar 6905c965db44STomer Tayar /* Decode elements */ 6906c965db44STomer Tayar for (i = 0; i < num_elements; i++) { 69077b6859fbSMintz, Yuval status = qed_parse_igu_fifo_element(&elements[i], 69087b6859fbSMintz, Yuval results_buf, 6909da090917STomer Tayar &results_offset); 69107b6859fbSMintz, Yuval if (status != DBG_STATUS_OK) 69117b6859fbSMintz, Yuval return status; 6912c965db44STomer Tayar } 6913c965db44STomer Tayar 6914c965db44STomer Tayar results_offset += sprintf(qed_get_buf_ptr(results_buf, 6915c965db44STomer Tayar results_offset), 6916c965db44STomer Tayar "fifo contained %d elements", num_elements); 6917c965db44STomer Tayar 6918c965db44STomer Tayar /* Add 1 for string NULL termination */ 6919c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 69207b6859fbSMintz, Yuval 6921c965db44STomer Tayar return DBG_STATUS_OK; 6922c965db44STomer Tayar } 6923c965db44STomer Tayar 6924c965db44STomer Tayar static enum dbg_status 6925da090917STomer Tayar qed_parse_protection_override_dump(u32 *dump_buf, 6926c965db44STomer Tayar char *results_buf, 6927c965db44STomer Tayar u32 *parsed_results_bytes) 6928c965db44STomer Tayar { 6929c965db44STomer Tayar const char *section_name, *param_name, *param_str_val; 69307b6859fbSMintz, Yuval u32 param_num_val, num_section_params, num_elements; 6931c965db44STomer Tayar struct protection_override_element *elements; 69327b6859fbSMintz, Yuval u32 results_offset = 0; 6933c965db44STomer Tayar u8 i; 6934c965db44STomer Tayar 6935c965db44STomer Tayar /* Read global_params section */ 6936c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6937c965db44STomer Tayar §ion_name, &num_section_params); 6938c965db44STomer Tayar if (strcmp(section_name, "global_params")) 6939c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 6940c965db44STomer Tayar 6941c965db44STomer Tayar /* Print global params */ 6942c965db44STomer Tayar dump_buf += qed_print_section_params(dump_buf, 6943c965db44STomer Tayar num_section_params, 6944c965db44STomer Tayar results_buf, &results_offset); 6945c965db44STomer Tayar 6946c965db44STomer Tayar /* Read protection_override_data section */ 6947c965db44STomer Tayar dump_buf += qed_read_section_hdr(dump_buf, 6948c965db44STomer Tayar §ion_name, &num_section_params); 6949c965db44STomer Tayar if (strcmp(section_name, "protection_override_data")) 6950c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 6951c965db44STomer Tayar dump_buf += qed_read_param(dump_buf, 6952c965db44STomer Tayar ¶m_name, ¶m_str_val, ¶m_num_val); 6953c965db44STomer Tayar if (strcmp(param_name, "size")) 6954c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 69557b6859fbSMintz, Yuval if (param_num_val % PROTECTION_OVERRIDE_ELEMENT_DWORDS) 6956c965db44STomer Tayar return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA; 6957c965db44STomer Tayar num_elements = param_num_val / PROTECTION_OVERRIDE_ELEMENT_DWORDS; 6958c965db44STomer Tayar elements = (struct protection_override_element *)dump_buf; 6959c965db44STomer Tayar 6960c965db44STomer Tayar /* Decode elements */ 6961c965db44STomer Tayar for (i = 0; i < num_elements; i++) { 6962c965db44STomer Tayar u32 address = GET_FIELD(elements[i].data, 6963c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_ADDRESS) * 6964c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR; 6965c965db44STomer Tayar 6966c965db44STomer Tayar results_offset += 6967c965db44STomer Tayar sprintf(qed_get_buf_ptr(results_buf, 6968c965db44STomer Tayar results_offset), 6969be086e7cSMintz, Yuval "window %2d, address: 0x%07x, size: %7d regs, read: %d, write: %d, read protection: %-12s, write protection: %-12s\n", 6970c965db44STomer Tayar i, address, 6971be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 6972c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE), 6973be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 6974c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_READ), 6975be086e7cSMintz, Yuval (u32)GET_FIELD(elements[i].data, 6976c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_WRITE), 6977c965db44STomer Tayar s_protection_strs[GET_FIELD(elements[i].data, 6978c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION)], 6979c965db44STomer Tayar s_protection_strs[GET_FIELD(elements[i].data, 6980c965db44STomer Tayar PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION)]); 6981c965db44STomer Tayar } 6982c965db44STomer Tayar 6983c965db44STomer Tayar results_offset += sprintf(qed_get_buf_ptr(results_buf, 6984c965db44STomer Tayar results_offset), 6985c965db44STomer Tayar "protection override contained %d elements", 6986c965db44STomer Tayar num_elements); 6987c965db44STomer Tayar 6988c965db44STomer Tayar /* Add 1 for string NULL termination */ 6989c965db44STomer Tayar *parsed_results_bytes = results_offset + 1; 69907b6859fbSMintz, Yuval 6991c965db44STomer Tayar return DBG_STATUS_OK; 6992c965db44STomer Tayar } 6993c965db44STomer Tayar 69947b6859fbSMintz, Yuval /* Parses a FW Asserts dump buffer. 69957b6859fbSMintz, Yuval * If result_buf is not NULL, the FW Asserts results are printed to it. 69967b6859fbSMintz, Yuval * In any case, the required results buffer size is assigned to 69977b6859fbSMintz, Yuval * parsed_results_bytes. 69987b6859fbSMintz, Yuval * The parsing status is returned. 69997b6859fbSMintz, Yuval */ 7000da090917STomer Tayar static enum dbg_status qed_parse_fw_asserts_dump(u32 *dump_buf, 70017b6859fbSMintz, Yuval char *results_buf, 70027b6859fbSMintz, Yuval u32 *parsed_results_bytes) 70037b6859fbSMintz, Yuval { 70047b6859fbSMintz, Yuval u32 num_section_params, param_num_val, i, results_offset = 0; 70057b6859fbSMintz, Yuval const char *param_name, *param_str_val, *section_name; 70067b6859fbSMintz, Yuval bool last_section_found = false; 70077b6859fbSMintz, Yuval 70087b6859fbSMintz, Yuval *parsed_results_bytes = 0; 70097b6859fbSMintz, Yuval 70107b6859fbSMintz, Yuval /* Read global_params section */ 70117b6859fbSMintz, Yuval dump_buf += qed_read_section_hdr(dump_buf, 70127b6859fbSMintz, Yuval §ion_name, &num_section_params); 70137b6859fbSMintz, Yuval if (strcmp(section_name, "global_params")) 70147b6859fbSMintz, Yuval return DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 70157b6859fbSMintz, Yuval 70167b6859fbSMintz, Yuval /* Print global params */ 70177b6859fbSMintz, Yuval dump_buf += qed_print_section_params(dump_buf, 70187b6859fbSMintz, Yuval num_section_params, 70197b6859fbSMintz, Yuval results_buf, &results_offset); 70207b6859fbSMintz, Yuval 70217b6859fbSMintz, Yuval while (!last_section_found) { 70227b6859fbSMintz, Yuval dump_buf += qed_read_section_hdr(dump_buf, 70237b6859fbSMintz, Yuval §ion_name, 70247b6859fbSMintz, Yuval &num_section_params); 70257b6859fbSMintz, Yuval if (!strcmp(section_name, "fw_asserts")) { 70267b6859fbSMintz, Yuval /* Extract params */ 70277b6859fbSMintz, Yuval const char *storm_letter = NULL; 70287b6859fbSMintz, Yuval u32 storm_dump_size = 0; 70297b6859fbSMintz, Yuval 70307b6859fbSMintz, Yuval for (i = 0; i < num_section_params; i++) { 70317b6859fbSMintz, Yuval dump_buf += qed_read_param(dump_buf, 70327b6859fbSMintz, Yuval ¶m_name, 70337b6859fbSMintz, Yuval ¶m_str_val, 70347b6859fbSMintz, Yuval ¶m_num_val); 70357b6859fbSMintz, Yuval if (!strcmp(param_name, "storm")) 70367b6859fbSMintz, Yuval storm_letter = param_str_val; 70377b6859fbSMintz, Yuval else if (!strcmp(param_name, "size")) 70387b6859fbSMintz, Yuval storm_dump_size = param_num_val; 70397b6859fbSMintz, Yuval else 70407b6859fbSMintz, Yuval return 70417b6859fbSMintz, Yuval DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 70427b6859fbSMintz, Yuval } 70437b6859fbSMintz, Yuval 70447b6859fbSMintz, Yuval if (!storm_letter || !storm_dump_size) 70457b6859fbSMintz, Yuval return DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 70467b6859fbSMintz, Yuval 70477b6859fbSMintz, Yuval /* Print data */ 70487b6859fbSMintz, Yuval results_offset += 70497b6859fbSMintz, Yuval sprintf(qed_get_buf_ptr(results_buf, 70507b6859fbSMintz, Yuval results_offset), 70517b6859fbSMintz, Yuval "\n%sSTORM_ASSERT: size=%d\n", 70527b6859fbSMintz, Yuval storm_letter, storm_dump_size); 70537b6859fbSMintz, Yuval for (i = 0; i < storm_dump_size; i++, dump_buf++) 70547b6859fbSMintz, Yuval results_offset += 70557b6859fbSMintz, Yuval sprintf(qed_get_buf_ptr(results_buf, 70567b6859fbSMintz, Yuval results_offset), 70577b6859fbSMintz, Yuval "%08x\n", *dump_buf); 70587b6859fbSMintz, Yuval } else if (!strcmp(section_name, "last")) { 70597b6859fbSMintz, Yuval last_section_found = true; 70607b6859fbSMintz, Yuval } else { 70617b6859fbSMintz, Yuval return DBG_STATUS_FW_ASSERTS_PARSE_FAILED; 70627b6859fbSMintz, Yuval } 70637b6859fbSMintz, Yuval } 70647b6859fbSMintz, Yuval 70657b6859fbSMintz, Yuval /* Add 1 for string NULL termination */ 70667b6859fbSMintz, Yuval *parsed_results_bytes = results_offset + 1; 70677b6859fbSMintz, Yuval 70687b6859fbSMintz, Yuval return DBG_STATUS_OK; 70697b6859fbSMintz, Yuval } 70707b6859fbSMintz, Yuval 70717b6859fbSMintz, Yuval /***************************** Public Functions *******************************/ 70727b6859fbSMintz, Yuval 70732d22bc83SMichal Kalderon enum dbg_status qed_dbg_user_set_bin_ptr(struct qed_hwfn *p_hwfn, 70742d22bc83SMichal Kalderon const u8 * const bin_ptr) 70757b6859fbSMintz, Yuval { 70762d22bc83SMichal Kalderon struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr; 70777b6859fbSMintz, Yuval u8 buf_id; 70787b6859fbSMintz, Yuval 70797b6859fbSMintz, Yuval /* Convert binary data to debug arrays */ 70802d22bc83SMichal Kalderon for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) 70812d22bc83SMichal Kalderon qed_set_dbg_bin_buf(p_hwfn, 70822d22bc83SMichal Kalderon (enum bin_dbg_buffer_type)buf_id, 70832d22bc83SMichal Kalderon (u32 *)(bin_ptr + buf_hdrs[buf_id].offset), 70842d22bc83SMichal Kalderon buf_hdrs[buf_id].length); 70857b6859fbSMintz, Yuval 70867b6859fbSMintz, Yuval return DBG_STATUS_OK; 70877b6859fbSMintz, Yuval } 70887b6859fbSMintz, Yuval 70892d22bc83SMichal Kalderon enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn, 70902d22bc83SMichal Kalderon void **user_data_ptr) 7091a3f72307SDenis Bolotin { 70922d22bc83SMichal Kalderon *user_data_ptr = kzalloc(sizeof(struct dbg_tools_user_data), 7093a3f72307SDenis Bolotin GFP_KERNEL); 70942d22bc83SMichal Kalderon if (!(*user_data_ptr)) 7095a3f72307SDenis Bolotin return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 7096a3f72307SDenis Bolotin 7097a3f72307SDenis Bolotin return DBG_STATUS_OK; 7098a3f72307SDenis Bolotin } 7099a3f72307SDenis Bolotin 71007b6859fbSMintz, Yuval const char *qed_dbg_get_status_str(enum dbg_status status) 71017b6859fbSMintz, Yuval { 71027b6859fbSMintz, Yuval return (status < 71037b6859fbSMintz, Yuval MAX_DBG_STATUS) ? s_status_str[status] : "Invalid debug status"; 71047b6859fbSMintz, Yuval } 71057b6859fbSMintz, Yuval 71067b6859fbSMintz, Yuval enum dbg_status qed_get_idle_chk_results_buf_size(struct qed_hwfn *p_hwfn, 71077b6859fbSMintz, Yuval u32 *dump_buf, 71087b6859fbSMintz, Yuval u32 num_dumped_dwords, 71097b6859fbSMintz, Yuval u32 *results_buf_size) 71107b6859fbSMintz, Yuval { 71117b6859fbSMintz, Yuval u32 num_errors, num_warnings; 71127b6859fbSMintz, Yuval 71132d22bc83SMichal Kalderon return qed_parse_idle_chk_dump(p_hwfn, 71142d22bc83SMichal Kalderon dump_buf, 71157b6859fbSMintz, Yuval num_dumped_dwords, 71167b6859fbSMintz, Yuval NULL, 71177b6859fbSMintz, Yuval results_buf_size, 71187b6859fbSMintz, Yuval &num_errors, &num_warnings); 71197b6859fbSMintz, Yuval } 71207b6859fbSMintz, Yuval 71217b6859fbSMintz, Yuval enum dbg_status qed_print_idle_chk_results(struct qed_hwfn *p_hwfn, 71227b6859fbSMintz, Yuval u32 *dump_buf, 71237b6859fbSMintz, Yuval u32 num_dumped_dwords, 71247b6859fbSMintz, Yuval char *results_buf, 7125da090917STomer Tayar u32 *num_errors, 7126da090917STomer Tayar u32 *num_warnings) 71277b6859fbSMintz, Yuval { 71287b6859fbSMintz, Yuval u32 parsed_buf_size; 71297b6859fbSMintz, Yuval 71302d22bc83SMichal Kalderon return qed_parse_idle_chk_dump(p_hwfn, 71312d22bc83SMichal Kalderon dump_buf, 71327b6859fbSMintz, Yuval num_dumped_dwords, 71337b6859fbSMintz, Yuval results_buf, 71347b6859fbSMintz, Yuval &parsed_buf_size, 71357b6859fbSMintz, Yuval num_errors, num_warnings); 71367b6859fbSMintz, Yuval } 71377b6859fbSMintz, Yuval 7138a3f72307SDenis Bolotin void qed_dbg_mcp_trace_set_meta_data(struct qed_hwfn *p_hwfn, 7139a3f72307SDenis Bolotin const u32 *meta_buf) 71407b6859fbSMintz, Yuval { 7141a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data = 7142a3f72307SDenis Bolotin qed_dbg_get_user_data(p_hwfn); 7143a3f72307SDenis Bolotin 7144a3f72307SDenis Bolotin dev_user_data->mcp_trace_user_meta_buf = meta_buf; 71457b6859fbSMintz, Yuval } 71467b6859fbSMintz, Yuval 71477b6859fbSMintz, Yuval enum dbg_status qed_get_mcp_trace_results_buf_size(struct qed_hwfn *p_hwfn, 71487b6859fbSMintz, Yuval u32 *dump_buf, 71497b6859fbSMintz, Yuval u32 num_dumped_dwords, 71507b6859fbSMintz, Yuval u32 *results_buf_size) 71517b6859fbSMintz, Yuval { 71527b6859fbSMintz, Yuval return qed_parse_mcp_trace_dump(p_hwfn, 7153a3f72307SDenis Bolotin dump_buf, NULL, results_buf_size, true); 71547b6859fbSMintz, Yuval } 71557b6859fbSMintz, Yuval 71567b6859fbSMintz, Yuval enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn, 71577b6859fbSMintz, Yuval u32 *dump_buf, 71587b6859fbSMintz, Yuval u32 num_dumped_dwords, 71597b6859fbSMintz, Yuval char *results_buf) 71607b6859fbSMintz, Yuval { 71617b6859fbSMintz, Yuval u32 parsed_buf_size; 71627b6859fbSMintz, Yuval 71637b6859fbSMintz, Yuval return qed_parse_mcp_trace_dump(p_hwfn, 71647b6859fbSMintz, Yuval dump_buf, 7165a3f72307SDenis Bolotin results_buf, &parsed_buf_size, true); 71667b6859fbSMintz, Yuval } 71677b6859fbSMintz, Yuval 7168a3f72307SDenis Bolotin enum dbg_status qed_print_mcp_trace_results_cont(struct qed_hwfn *p_hwfn, 7169a3f72307SDenis Bolotin u32 *dump_buf, 7170a3f72307SDenis Bolotin char *results_buf) 7171a3f72307SDenis Bolotin { 7172a3f72307SDenis Bolotin u32 parsed_buf_size; 7173a3f72307SDenis Bolotin 7174a3f72307SDenis Bolotin return qed_parse_mcp_trace_dump(p_hwfn, dump_buf, results_buf, 7175a3f72307SDenis Bolotin &parsed_buf_size, false); 7176a3f72307SDenis Bolotin } 7177a3f72307SDenis Bolotin 7178a3f72307SDenis Bolotin enum dbg_status qed_print_mcp_trace_line(struct qed_hwfn *p_hwfn, 7179a3f72307SDenis Bolotin u8 *dump_buf, 718050bc60cbSMichal Kalderon u32 num_dumped_bytes, 718150bc60cbSMichal Kalderon char *results_buf) 718250bc60cbSMichal Kalderon { 7183a3f72307SDenis Bolotin u32 parsed_results_bytes; 718450bc60cbSMichal Kalderon 7185a3f72307SDenis Bolotin return qed_parse_mcp_trace_buf(p_hwfn, 7186a3f72307SDenis Bolotin dump_buf, 718750bc60cbSMichal Kalderon num_dumped_bytes, 718850bc60cbSMichal Kalderon 0, 718950bc60cbSMichal Kalderon num_dumped_bytes, 7190a3f72307SDenis Bolotin results_buf, &parsed_results_bytes); 7191a3f72307SDenis Bolotin } 7192a3f72307SDenis Bolotin 7193a3f72307SDenis Bolotin /* Frees the specified MCP Trace meta data */ 7194a3f72307SDenis Bolotin void qed_mcp_trace_free_meta_data(struct qed_hwfn *p_hwfn) 7195a3f72307SDenis Bolotin { 7196a3f72307SDenis Bolotin struct dbg_tools_user_data *dev_user_data; 7197a3f72307SDenis Bolotin struct mcp_trace_meta *meta; 7198a3f72307SDenis Bolotin u32 i; 7199a3f72307SDenis Bolotin 7200a3f72307SDenis Bolotin dev_user_data = qed_dbg_get_user_data(p_hwfn); 7201a3f72307SDenis Bolotin meta = &dev_user_data->mcp_trace_meta; 7202a3f72307SDenis Bolotin if (!meta->is_allocated) 7203a3f72307SDenis Bolotin return; 7204a3f72307SDenis Bolotin 7205a3f72307SDenis Bolotin /* Release modules */ 7206a3f72307SDenis Bolotin if (meta->modules) { 7207a3f72307SDenis Bolotin for (i = 0; i < meta->modules_num; i++) 7208a3f72307SDenis Bolotin kfree(meta->modules[i]); 7209a3f72307SDenis Bolotin kfree(meta->modules); 7210a3f72307SDenis Bolotin } 7211a3f72307SDenis Bolotin 7212a3f72307SDenis Bolotin /* Release formats */ 7213a3f72307SDenis Bolotin if (meta->formats) { 7214a3f72307SDenis Bolotin for (i = 0; i < meta->formats_num; i++) 7215a3f72307SDenis Bolotin kfree(meta->formats[i].format_str); 7216a3f72307SDenis Bolotin kfree(meta->formats); 7217a3f72307SDenis Bolotin } 7218a3f72307SDenis Bolotin 7219a3f72307SDenis Bolotin meta->is_allocated = false; 722050bc60cbSMichal Kalderon } 722150bc60cbSMichal Kalderon 72227b6859fbSMintz, Yuval enum dbg_status qed_get_reg_fifo_results_buf_size(struct qed_hwfn *p_hwfn, 72237b6859fbSMintz, Yuval u32 *dump_buf, 72247b6859fbSMintz, Yuval u32 num_dumped_dwords, 72257b6859fbSMintz, Yuval u32 *results_buf_size) 72267b6859fbSMintz, Yuval { 7227da090917STomer Tayar return qed_parse_reg_fifo_dump(dump_buf, NULL, results_buf_size); 72287b6859fbSMintz, Yuval } 72297b6859fbSMintz, Yuval 72307b6859fbSMintz, Yuval enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn, 72317b6859fbSMintz, Yuval u32 *dump_buf, 72327b6859fbSMintz, Yuval u32 num_dumped_dwords, 72337b6859fbSMintz, Yuval char *results_buf) 72347b6859fbSMintz, Yuval { 72357b6859fbSMintz, Yuval u32 parsed_buf_size; 72367b6859fbSMintz, Yuval 7237da090917STomer Tayar return qed_parse_reg_fifo_dump(dump_buf, results_buf, &parsed_buf_size); 72387b6859fbSMintz, Yuval } 72397b6859fbSMintz, Yuval 72407b6859fbSMintz, Yuval enum dbg_status qed_get_igu_fifo_results_buf_size(struct qed_hwfn *p_hwfn, 72417b6859fbSMintz, Yuval u32 *dump_buf, 72427b6859fbSMintz, Yuval u32 num_dumped_dwords, 72437b6859fbSMintz, Yuval u32 *results_buf_size) 72447b6859fbSMintz, Yuval { 7245da090917STomer Tayar return qed_parse_igu_fifo_dump(dump_buf, NULL, results_buf_size); 72467b6859fbSMintz, Yuval } 72477b6859fbSMintz, Yuval 72487b6859fbSMintz, Yuval enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn, 72497b6859fbSMintz, Yuval u32 *dump_buf, 72507b6859fbSMintz, Yuval u32 num_dumped_dwords, 72517b6859fbSMintz, Yuval char *results_buf) 72527b6859fbSMintz, Yuval { 72537b6859fbSMintz, Yuval u32 parsed_buf_size; 72547b6859fbSMintz, Yuval 7255da090917STomer Tayar return qed_parse_igu_fifo_dump(dump_buf, results_buf, &parsed_buf_size); 72567b6859fbSMintz, Yuval } 72577b6859fbSMintz, Yuval 7258c965db44STomer Tayar enum dbg_status 7259c965db44STomer Tayar qed_get_protection_override_results_buf_size(struct qed_hwfn *p_hwfn, 7260c965db44STomer Tayar u32 *dump_buf, 7261c965db44STomer Tayar u32 num_dumped_dwords, 7262c965db44STomer Tayar u32 *results_buf_size) 7263c965db44STomer Tayar { 7264da090917STomer Tayar return qed_parse_protection_override_dump(dump_buf, 7265c965db44STomer Tayar NULL, results_buf_size); 7266c965db44STomer Tayar } 7267c965db44STomer Tayar 7268c965db44STomer Tayar enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn, 7269c965db44STomer Tayar u32 *dump_buf, 7270c965db44STomer Tayar u32 num_dumped_dwords, 7271c965db44STomer Tayar char *results_buf) 7272c965db44STomer Tayar { 7273c965db44STomer Tayar u32 parsed_buf_size; 7274c965db44STomer Tayar 7275da090917STomer Tayar return qed_parse_protection_override_dump(dump_buf, 7276c965db44STomer Tayar results_buf, 7277c965db44STomer Tayar &parsed_buf_size); 7278c965db44STomer Tayar } 7279c965db44STomer Tayar 7280c965db44STomer Tayar enum dbg_status qed_get_fw_asserts_results_buf_size(struct qed_hwfn *p_hwfn, 7281c965db44STomer Tayar u32 *dump_buf, 7282c965db44STomer Tayar u32 num_dumped_dwords, 7283c965db44STomer Tayar u32 *results_buf_size) 7284c965db44STomer Tayar { 7285da090917STomer Tayar return qed_parse_fw_asserts_dump(dump_buf, NULL, results_buf_size); 7286c965db44STomer Tayar } 7287c965db44STomer Tayar 7288c965db44STomer Tayar enum dbg_status qed_print_fw_asserts_results(struct qed_hwfn *p_hwfn, 7289c965db44STomer Tayar u32 *dump_buf, 7290c965db44STomer Tayar u32 num_dumped_dwords, 7291c965db44STomer Tayar char *results_buf) 7292c965db44STomer Tayar { 7293c965db44STomer Tayar u32 parsed_buf_size; 7294c965db44STomer Tayar 7295da090917STomer Tayar return qed_parse_fw_asserts_dump(dump_buf, 7296c965db44STomer Tayar results_buf, &parsed_buf_size); 7297c965db44STomer Tayar } 7298c965db44STomer Tayar 72990ebbd1c8SMintz, Yuval enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn, 73000ebbd1c8SMintz, Yuval struct dbg_attn_block_result *results) 73010ebbd1c8SMintz, Yuval { 73020ebbd1c8SMintz, Yuval const u32 *block_attn_name_offsets; 73032d22bc83SMichal Kalderon const char *attn_name_base; 73040ebbd1c8SMintz, Yuval const char *block_name; 73052d22bc83SMichal Kalderon enum dbg_attn_type attn_type; 73060ebbd1c8SMintz, Yuval u8 num_regs, i, j; 73070ebbd1c8SMintz, Yuval 73080ebbd1c8SMintz, Yuval num_regs = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_NUM_REGS); 73092d22bc83SMichal Kalderon attn_type = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE); 73102d22bc83SMichal Kalderon block_name = qed_dbg_get_block_name(p_hwfn, results->block_id); 73112d22bc83SMichal Kalderon if (!block_name) 73122d22bc83SMichal Kalderon return DBG_STATUS_INVALID_ARGS; 73130ebbd1c8SMintz, Yuval 73142d22bc83SMichal Kalderon if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr || 73152d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr || 73162d22bc83SMichal Kalderon !p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr) 73170ebbd1c8SMintz, Yuval return DBG_STATUS_DBG_ARRAY_NOT_SET; 73180ebbd1c8SMintz, Yuval 73192d22bc83SMichal Kalderon block_attn_name_offsets = 73202d22bc83SMichal Kalderon (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr + 73212d22bc83SMichal Kalderon results->names_offset; 73222d22bc83SMichal Kalderon 73232d22bc83SMichal Kalderon attn_name_base = p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr; 73240ebbd1c8SMintz, Yuval 73250ebbd1c8SMintz, Yuval /* Go over registers with a non-zero attention status */ 73260ebbd1c8SMintz, Yuval for (i = 0; i < num_regs; i++) { 7327da090917STomer Tayar struct dbg_attn_bit_mapping *bit_mapping; 73280ebbd1c8SMintz, Yuval struct dbg_attn_reg_result *reg_result; 73290ebbd1c8SMintz, Yuval u8 num_reg_attn, bit_idx = 0; 73300ebbd1c8SMintz, Yuval 73310ebbd1c8SMintz, Yuval reg_result = &results->reg_results[i]; 73320ebbd1c8SMintz, Yuval num_reg_attn = GET_FIELD(reg_result->data, 73330ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_NUM_REG_ATTN); 73342d22bc83SMichal Kalderon bit_mapping = (struct dbg_attn_bit_mapping *) 73352d22bc83SMichal Kalderon p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr + 73362d22bc83SMichal Kalderon reg_result->block_attn_offset; 73370ebbd1c8SMintz, Yuval 73380ebbd1c8SMintz, Yuval /* Go over attention status bits */ 73392d22bc83SMichal Kalderon for (j = 0; j < num_reg_attn; j++, bit_idx++) { 7340da090917STomer Tayar u16 attn_idx_val = GET_FIELD(bit_mapping[j].data, 73410ebbd1c8SMintz, Yuval DBG_ATTN_BIT_MAPPING_VAL); 73420ebbd1c8SMintz, Yuval const char *attn_name, *attn_type_str, *masked_str; 73432d22bc83SMichal Kalderon u32 attn_name_offset; 73442d22bc83SMichal Kalderon u32 sts_addr; 73450ebbd1c8SMintz, Yuval 73460ebbd1c8SMintz, Yuval /* Check if bit mask should be advanced (due to unused 73470ebbd1c8SMintz, Yuval * bits). 73480ebbd1c8SMintz, Yuval */ 7349da090917STomer Tayar if (GET_FIELD(bit_mapping[j].data, 73500ebbd1c8SMintz, Yuval DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT)) { 73510ebbd1c8SMintz, Yuval bit_idx += (u8)attn_idx_val; 73520ebbd1c8SMintz, Yuval continue; 73530ebbd1c8SMintz, Yuval } 73540ebbd1c8SMintz, Yuval 73550ebbd1c8SMintz, Yuval /* Check current bit index */ 73562d22bc83SMichal Kalderon if (!(reg_result->sts_val & BIT(bit_idx))) 73570ebbd1c8SMintz, Yuval continue; 73580ebbd1c8SMintz, Yuval 73592d22bc83SMichal Kalderon /* An attention bit with value=1 was found 73602d22bc83SMichal Kalderon * Find attention name 73612d22bc83SMichal Kalderon */ 7362da090917STomer Tayar attn_name_offset = 7363da090917STomer Tayar block_attn_name_offsets[attn_idx_val]; 73642d22bc83SMichal Kalderon attn_name = attn_name_base + attn_name_offset; 73652d22bc83SMichal Kalderon attn_type_str = 73662d22bc83SMichal Kalderon (attn_type == 73672d22bc83SMichal Kalderon ATTN_TYPE_INTERRUPT ? "Interrupt" : 73682d22bc83SMichal Kalderon "Parity"); 73690ebbd1c8SMintz, Yuval masked_str = reg_result->mask_val & BIT(bit_idx) ? 73700ebbd1c8SMintz, Yuval " [masked]" : ""; 73710ebbd1c8SMintz, Yuval sts_addr = GET_FIELD(reg_result->data, 73720ebbd1c8SMintz, Yuval DBG_ATTN_REG_RESULT_STS_ADDRESS); 73730ebbd1c8SMintz, Yuval DP_NOTICE(p_hwfn, 73740ebbd1c8SMintz, Yuval "%s (%s) : %s [address 0x%08x, bit %d]%s\n", 73750ebbd1c8SMintz, Yuval block_name, attn_type_str, attn_name, 73762d22bc83SMichal Kalderon sts_addr * 4, bit_idx, masked_str); 73770ebbd1c8SMintz, Yuval } 73780ebbd1c8SMintz, Yuval } 73790ebbd1c8SMintz, Yuval 73800ebbd1c8SMintz, Yuval return DBG_STATUS_OK; 73810ebbd1c8SMintz, Yuval } 73820ebbd1c8SMintz, Yuval 73832d22bc83SMichal Kalderon static DEFINE_MUTEX(qed_dbg_lock); 73842d22bc83SMichal Kalderon 7385c965db44STomer Tayar /* Wrapper for unifying the idle_chk and mcp_trace api */ 73868c93beafSYuval Mintz static enum dbg_status 73878c93beafSYuval Mintz qed_print_idle_chk_results_wrapper(struct qed_hwfn *p_hwfn, 7388c965db44STomer Tayar u32 *dump_buf, 7389c965db44STomer Tayar u32 num_dumped_dwords, 7390c965db44STomer Tayar char *results_buf) 7391c965db44STomer Tayar { 7392c965db44STomer Tayar u32 num_errors, num_warnnings; 7393c965db44STomer Tayar 7394c965db44STomer Tayar return qed_print_idle_chk_results(p_hwfn, dump_buf, num_dumped_dwords, 7395c965db44STomer Tayar results_buf, &num_errors, 7396c965db44STomer Tayar &num_warnnings); 7397c965db44STomer Tayar } 7398c965db44STomer Tayar 7399c965db44STomer Tayar /* Feature meta data lookup table */ 7400c965db44STomer Tayar static struct { 7401c965db44STomer Tayar char *name; 7402c965db44STomer Tayar enum dbg_status (*get_size)(struct qed_hwfn *p_hwfn, 7403c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *size); 7404c965db44STomer Tayar enum dbg_status (*perform_dump)(struct qed_hwfn *p_hwfn, 7405c965db44STomer Tayar struct qed_ptt *p_ptt, u32 *dump_buf, 7406c965db44STomer Tayar u32 buf_size, u32 *dumped_dwords); 7407c965db44STomer Tayar enum dbg_status (*print_results)(struct qed_hwfn *p_hwfn, 7408c965db44STomer Tayar u32 *dump_buf, u32 num_dumped_dwords, 7409c965db44STomer Tayar char *results_buf); 7410c965db44STomer Tayar enum dbg_status (*results_buf_size)(struct qed_hwfn *p_hwfn, 7411c965db44STomer Tayar u32 *dump_buf, 7412c965db44STomer Tayar u32 num_dumped_dwords, 7413c965db44STomer Tayar u32 *results_buf_size); 7414c965db44STomer Tayar } qed_features_lookup[] = { 7415c965db44STomer Tayar { 7416c965db44STomer Tayar "grc", qed_dbg_grc_get_dump_buf_size, 7417c965db44STomer Tayar qed_dbg_grc_dump, NULL, NULL}, { 7418c965db44STomer Tayar "idle_chk", 7419c965db44STomer Tayar qed_dbg_idle_chk_get_dump_buf_size, 7420c965db44STomer Tayar qed_dbg_idle_chk_dump, 7421c965db44STomer Tayar qed_print_idle_chk_results_wrapper, 7422c965db44STomer Tayar qed_get_idle_chk_results_buf_size}, { 7423c965db44STomer Tayar "mcp_trace", 7424c965db44STomer Tayar qed_dbg_mcp_trace_get_dump_buf_size, 7425c965db44STomer Tayar qed_dbg_mcp_trace_dump, qed_print_mcp_trace_results, 7426c965db44STomer Tayar qed_get_mcp_trace_results_buf_size}, { 7427c965db44STomer Tayar "reg_fifo", 7428c965db44STomer Tayar qed_dbg_reg_fifo_get_dump_buf_size, 7429c965db44STomer Tayar qed_dbg_reg_fifo_dump, qed_print_reg_fifo_results, 7430c965db44STomer Tayar qed_get_reg_fifo_results_buf_size}, { 7431c965db44STomer Tayar "igu_fifo", 7432c965db44STomer Tayar qed_dbg_igu_fifo_get_dump_buf_size, 7433c965db44STomer Tayar qed_dbg_igu_fifo_dump, qed_print_igu_fifo_results, 7434c965db44STomer Tayar qed_get_igu_fifo_results_buf_size}, { 7435c965db44STomer Tayar "protection_override", 7436c965db44STomer Tayar qed_dbg_protection_override_get_dump_buf_size, 7437c965db44STomer Tayar qed_dbg_protection_override_dump, 7438c965db44STomer Tayar qed_print_protection_override_results, 7439c965db44STomer Tayar qed_get_protection_override_results_buf_size}, { 7440c965db44STomer Tayar "fw_asserts", 7441c965db44STomer Tayar qed_dbg_fw_asserts_get_dump_buf_size, 7442c965db44STomer Tayar qed_dbg_fw_asserts_dump, 7443c965db44STomer Tayar qed_print_fw_asserts_results, 74448a52bbabSMichal Kalderon qed_get_fw_asserts_results_buf_size}, { 74458a52bbabSMichal Kalderon "ilt", 74468a52bbabSMichal Kalderon qed_dbg_ilt_get_dump_buf_size, 74478a52bbabSMichal Kalderon qed_dbg_ilt_dump, NULL, NULL},}; 7448c965db44STomer Tayar 7449c965db44STomer Tayar static void qed_dbg_print_feature(u8 *p_text_buf, u32 text_size) 7450c965db44STomer Tayar { 7451c965db44STomer Tayar u32 i, precision = 80; 7452c965db44STomer Tayar 7453c965db44STomer Tayar if (!p_text_buf) 7454c965db44STomer Tayar return; 7455c965db44STomer Tayar 7456c965db44STomer Tayar pr_notice("\n%.*s", precision, p_text_buf); 7457c965db44STomer Tayar for (i = precision; i < text_size; i += precision) 7458c965db44STomer Tayar pr_cont("%.*s", precision, p_text_buf + i); 7459c965db44STomer Tayar pr_cont("\n"); 7460c965db44STomer Tayar } 7461c965db44STomer Tayar 7462c965db44STomer Tayar #define QED_RESULTS_BUF_MIN_SIZE 16 7463c965db44STomer Tayar /* Generic function for decoding debug feature info */ 74648c93beafSYuval Mintz static enum dbg_status format_feature(struct qed_hwfn *p_hwfn, 7465c965db44STomer Tayar enum qed_dbg_features feature_idx) 7466c965db44STomer Tayar { 7467c965db44STomer Tayar struct qed_dbg_feature *feature = 7468ca352f00SIgor Russkikh &p_hwfn->cdev->dbg_features[feature_idx]; 7469c965db44STomer Tayar u32 text_size_bytes, null_char_pos, i; 7470c965db44STomer Tayar enum dbg_status rc; 7471c965db44STomer Tayar char *text_buf; 7472c965db44STomer Tayar 7473c965db44STomer Tayar /* Check if feature supports formatting capability */ 7474c965db44STomer Tayar if (!qed_features_lookup[feature_idx].results_buf_size) 7475c965db44STomer Tayar return DBG_STATUS_OK; 7476c965db44STomer Tayar 7477c965db44STomer Tayar /* Obtain size of formatted output */ 7478c965db44STomer Tayar rc = qed_features_lookup[feature_idx]. 7479c965db44STomer Tayar results_buf_size(p_hwfn, (u32 *)feature->dump_buf, 7480c965db44STomer Tayar feature->dumped_dwords, &text_size_bytes); 7481c965db44STomer Tayar if (rc != DBG_STATUS_OK) 7482c965db44STomer Tayar return rc; 7483c965db44STomer Tayar 7484c965db44STomer Tayar /* Make sure that the allocated size is a multiple of dword (4 bytes) */ 7485c965db44STomer Tayar null_char_pos = text_size_bytes - 1; 7486c965db44STomer Tayar text_size_bytes = (text_size_bytes + 3) & ~0x3; 7487c965db44STomer Tayar 7488c965db44STomer Tayar if (text_size_bytes < QED_RESULTS_BUF_MIN_SIZE) { 7489c965db44STomer Tayar DP_NOTICE(p_hwfn->cdev, 7490c965db44STomer Tayar "formatted size of feature was too small %d. Aborting\n", 7491c965db44STomer Tayar text_size_bytes); 7492c965db44STomer Tayar return DBG_STATUS_INVALID_ARGS; 7493c965db44STomer Tayar } 7494c965db44STomer Tayar 7495c965db44STomer Tayar /* Allocate temp text buf */ 7496c965db44STomer Tayar text_buf = vzalloc(text_size_bytes); 7497c965db44STomer Tayar if (!text_buf) 7498c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 7499c965db44STomer Tayar 7500c965db44STomer Tayar /* Decode feature opcodes to string on temp buf */ 7501c965db44STomer Tayar rc = qed_features_lookup[feature_idx]. 7502c965db44STomer Tayar print_results(p_hwfn, (u32 *)feature->dump_buf, 7503c965db44STomer Tayar feature->dumped_dwords, text_buf); 7504c965db44STomer Tayar if (rc != DBG_STATUS_OK) { 7505c965db44STomer Tayar vfree(text_buf); 7506c965db44STomer Tayar return rc; 7507c965db44STomer Tayar } 7508c965db44STomer Tayar 7509c965db44STomer Tayar /* Replace the original null character with a '\n' character. 7510c965db44STomer Tayar * The bytes that were added as a result of the dword alignment are also 7511c965db44STomer Tayar * padded with '\n' characters. 7512c965db44STomer Tayar */ 7513c965db44STomer Tayar for (i = null_char_pos; i < text_size_bytes; i++) 7514c965db44STomer Tayar text_buf[i] = '\n'; 7515c965db44STomer Tayar 7516c965db44STomer Tayar /* Dump printable feature to log */ 7517ca352f00SIgor Russkikh if (p_hwfn->cdev->print_dbg_data) 7518c965db44STomer Tayar qed_dbg_print_feature(text_buf, text_size_bytes); 7519c965db44STomer Tayar 7520c965db44STomer Tayar /* Free the old dump_buf and point the dump_buf to the newly allocagted 7521c965db44STomer Tayar * and formatted text buffer. 7522c965db44STomer Tayar */ 7523c965db44STomer Tayar vfree(feature->dump_buf); 7524c965db44STomer Tayar feature->dump_buf = text_buf; 7525c965db44STomer Tayar feature->buf_size = text_size_bytes; 7526c965db44STomer Tayar feature->dumped_dwords = text_size_bytes / 4; 7527c965db44STomer Tayar return rc; 7528c965db44STomer Tayar } 7529c965db44STomer Tayar 75308a52bbabSMichal Kalderon #define MAX_DBG_FEATURE_SIZE_DWORDS 0x3FFFFFFF 75318a52bbabSMichal Kalderon 7532c965db44STomer Tayar /* Generic function for performing the dump of a debug feature. */ 75338c93beafSYuval Mintz static enum dbg_status qed_dbg_dump(struct qed_hwfn *p_hwfn, 75348c93beafSYuval Mintz struct qed_ptt *p_ptt, 7535c965db44STomer Tayar enum qed_dbg_features feature_idx) 7536c965db44STomer Tayar { 7537c965db44STomer Tayar struct qed_dbg_feature *feature = 7538ca352f00SIgor Russkikh &p_hwfn->cdev->dbg_features[feature_idx]; 7539c965db44STomer Tayar u32 buf_size_dwords; 7540c965db44STomer Tayar enum dbg_status rc; 7541c965db44STomer Tayar 7542c965db44STomer Tayar DP_NOTICE(p_hwfn->cdev, "Collecting a debug feature [\"%s\"]\n", 7543c965db44STomer Tayar qed_features_lookup[feature_idx].name); 7544c965db44STomer Tayar 7545c965db44STomer Tayar /* Dump_buf was already allocated need to free (this can happen if dump 7546c965db44STomer Tayar * was called but file was never read). 7547c965db44STomer Tayar * We can't use the buffer as is since size may have changed. 7548c965db44STomer Tayar */ 7549c965db44STomer Tayar if (feature->dump_buf) { 7550c965db44STomer Tayar vfree(feature->dump_buf); 7551c965db44STomer Tayar feature->dump_buf = NULL; 7552c965db44STomer Tayar } 7553c965db44STomer Tayar 7554c965db44STomer Tayar /* Get buffer size from hsi, allocate accordingly, and perform the 7555c965db44STomer Tayar * dump. 7556c965db44STomer Tayar */ 7557c965db44STomer Tayar rc = qed_features_lookup[feature_idx].get_size(p_hwfn, p_ptt, 7558c965db44STomer Tayar &buf_size_dwords); 7559be086e7cSMintz, Yuval if (rc != DBG_STATUS_OK && rc != DBG_STATUS_NVRAM_GET_IMAGE_FAILED) 7560c965db44STomer Tayar return rc; 75612d22bc83SMichal Kalderon 75622d22bc83SMichal Kalderon if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS) { 75632d22bc83SMichal Kalderon feature->buf_size = 0; 75642d22bc83SMichal Kalderon DP_NOTICE(p_hwfn->cdev, 75652d22bc83SMichal Kalderon "Debug feature [\"%s\"] size (0x%x dwords) exceeds maximum size (0x%x dwords)\n", 75662d22bc83SMichal Kalderon qed_features_lookup[feature_idx].name, 75672d22bc83SMichal Kalderon buf_size_dwords, MAX_DBG_FEATURE_SIZE_DWORDS); 75682d22bc83SMichal Kalderon 75692d22bc83SMichal Kalderon return DBG_STATUS_OK; 75702d22bc83SMichal Kalderon } 75712d22bc83SMichal Kalderon 7572c965db44STomer Tayar feature->buf_size = buf_size_dwords * sizeof(u32); 7573c965db44STomer Tayar feature->dump_buf = vmalloc(feature->buf_size); 7574c965db44STomer Tayar if (!feature->dump_buf) 7575c965db44STomer Tayar return DBG_STATUS_VIRT_MEM_ALLOC_FAILED; 7576c965db44STomer Tayar 7577c965db44STomer Tayar rc = qed_features_lookup[feature_idx]. 7578c965db44STomer Tayar perform_dump(p_hwfn, p_ptt, (u32 *)feature->dump_buf, 7579c965db44STomer Tayar feature->buf_size / sizeof(u32), 7580c965db44STomer Tayar &feature->dumped_dwords); 7581c965db44STomer Tayar 7582c965db44STomer Tayar /* If mcp is stuck we get DBG_STATUS_NVRAM_GET_IMAGE_FAILED error. 7583c965db44STomer Tayar * In this case the buffer holds valid binary data, but we wont able 7584c965db44STomer Tayar * to parse it (since parsing relies on data in NVRAM which is only 7585c965db44STomer Tayar * accessible when MFW is responsive). skip the formatting but return 7586c965db44STomer Tayar * success so that binary data is provided. 7587c965db44STomer Tayar */ 7588c965db44STomer Tayar if (rc == DBG_STATUS_NVRAM_GET_IMAGE_FAILED) 7589c965db44STomer Tayar return DBG_STATUS_OK; 7590c965db44STomer Tayar 7591c965db44STomer Tayar if (rc != DBG_STATUS_OK) 7592c965db44STomer Tayar return rc; 7593c965db44STomer Tayar 7594c965db44STomer Tayar /* Format output */ 7595c965db44STomer Tayar rc = format_feature(p_hwfn, feature_idx); 7596c965db44STomer Tayar return rc; 7597c965db44STomer Tayar } 7598c965db44STomer Tayar 7599c965db44STomer Tayar int qed_dbg_grc(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 7600c965db44STomer Tayar { 7601c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_GRC, num_dumped_bytes); 7602c965db44STomer Tayar } 7603c965db44STomer Tayar 7604c965db44STomer Tayar int qed_dbg_grc_size(struct qed_dev *cdev) 7605c965db44STomer Tayar { 7606c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_GRC); 7607c965db44STomer Tayar } 7608c965db44STomer Tayar 7609c965db44STomer Tayar int qed_dbg_idle_chk(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 7610c965db44STomer Tayar { 7611c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IDLE_CHK, 7612c965db44STomer Tayar num_dumped_bytes); 7613c965db44STomer Tayar } 7614c965db44STomer Tayar 7615c965db44STomer Tayar int qed_dbg_idle_chk_size(struct qed_dev *cdev) 7616c965db44STomer Tayar { 7617c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_IDLE_CHK); 7618c965db44STomer Tayar } 7619c965db44STomer Tayar 7620c965db44STomer Tayar int qed_dbg_reg_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 7621c965db44STomer Tayar { 7622c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_REG_FIFO, 7623c965db44STomer Tayar num_dumped_bytes); 7624c965db44STomer Tayar } 7625c965db44STomer Tayar 7626c965db44STomer Tayar int qed_dbg_reg_fifo_size(struct qed_dev *cdev) 7627c965db44STomer Tayar { 7628c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_REG_FIFO); 7629c965db44STomer Tayar } 7630c965db44STomer Tayar 7631c965db44STomer Tayar int qed_dbg_igu_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 7632c965db44STomer Tayar { 7633c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IGU_FIFO, 7634c965db44STomer Tayar num_dumped_bytes); 7635c965db44STomer Tayar } 7636c965db44STomer Tayar 7637c965db44STomer Tayar int qed_dbg_igu_fifo_size(struct qed_dev *cdev) 7638c965db44STomer Tayar { 7639c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_IGU_FIFO); 7640c965db44STomer Tayar } 7641c965db44STomer Tayar 7642bf774d14SYueHaibing static int qed_dbg_nvm_image_length(struct qed_hwfn *p_hwfn, 76431ac4329aSDenis Bolotin enum qed_nvm_images image_id, u32 *length) 76441ac4329aSDenis Bolotin { 76451ac4329aSDenis Bolotin struct qed_nvm_image_att image_att; 76461ac4329aSDenis Bolotin int rc; 76471ac4329aSDenis Bolotin 76481ac4329aSDenis Bolotin *length = 0; 76491ac4329aSDenis Bolotin rc = qed_mcp_get_nvm_image_att(p_hwfn, image_id, &image_att); 76501ac4329aSDenis Bolotin if (rc) 76511ac4329aSDenis Bolotin return rc; 76521ac4329aSDenis Bolotin 76531ac4329aSDenis Bolotin *length = image_att.length; 76541ac4329aSDenis Bolotin 76551ac4329aSDenis Bolotin return rc; 76561ac4329aSDenis Bolotin } 76571ac4329aSDenis Bolotin 7658bf774d14SYueHaibing static int qed_dbg_nvm_image(struct qed_dev *cdev, void *buffer, 7659bf774d14SYueHaibing u32 *num_dumped_bytes, 7660bf774d14SYueHaibing enum qed_nvm_images image_id) 76611ac4329aSDenis Bolotin { 76621ac4329aSDenis Bolotin struct qed_hwfn *p_hwfn = 7663ca352f00SIgor Russkikh &cdev->hwfns[cdev->engine_for_debug]; 76645ab90341SAlexander Lobakin u32 len_rounded; 76651ac4329aSDenis Bolotin int rc; 76661ac4329aSDenis Bolotin 76671ac4329aSDenis Bolotin *num_dumped_bytes = 0; 76681ac4329aSDenis Bolotin rc = qed_dbg_nvm_image_length(p_hwfn, image_id, &len_rounded); 76691ac4329aSDenis Bolotin if (rc) 76701ac4329aSDenis Bolotin return rc; 76711ac4329aSDenis Bolotin 76721ac4329aSDenis Bolotin DP_NOTICE(p_hwfn->cdev, 76731ac4329aSDenis Bolotin "Collecting a debug feature [\"nvram image %d\"]\n", 76741ac4329aSDenis Bolotin image_id); 76751ac4329aSDenis Bolotin 76761ac4329aSDenis Bolotin len_rounded = roundup(len_rounded, sizeof(u32)); 76771ac4329aSDenis Bolotin rc = qed_mcp_get_nvm_image(p_hwfn, image_id, buffer, len_rounded); 76781ac4329aSDenis Bolotin if (rc) 76791ac4329aSDenis Bolotin return rc; 76801ac4329aSDenis Bolotin 76811ac4329aSDenis Bolotin /* QED_NVM_IMAGE_NVM_META image is not swapped like other images */ 76821ac4329aSDenis Bolotin if (image_id != QED_NVM_IMAGE_NVM_META) 76835ab90341SAlexander Lobakin cpu_to_be32_array((__force __be32 *)buffer, 76845ab90341SAlexander Lobakin (const u32 *)buffer, 76855ab90341SAlexander Lobakin len_rounded / sizeof(u32)); 76861ac4329aSDenis Bolotin 76871ac4329aSDenis Bolotin *num_dumped_bytes = len_rounded; 76881ac4329aSDenis Bolotin 76891ac4329aSDenis Bolotin return rc; 76901ac4329aSDenis Bolotin } 76911ac4329aSDenis Bolotin 7692c965db44STomer Tayar int qed_dbg_protection_override(struct qed_dev *cdev, void *buffer, 7693c965db44STomer Tayar u32 *num_dumped_bytes) 7694c965db44STomer Tayar { 7695c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_PROTECTION_OVERRIDE, 7696c965db44STomer Tayar num_dumped_bytes); 7697c965db44STomer Tayar } 7698c965db44STomer Tayar 7699c965db44STomer Tayar int qed_dbg_protection_override_size(struct qed_dev *cdev) 7700c965db44STomer Tayar { 7701c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_PROTECTION_OVERRIDE); 7702c965db44STomer Tayar } 7703c965db44STomer Tayar 7704c965db44STomer Tayar int qed_dbg_fw_asserts(struct qed_dev *cdev, void *buffer, 7705c965db44STomer Tayar u32 *num_dumped_bytes) 7706c965db44STomer Tayar { 7707c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_FW_ASSERTS, 7708c965db44STomer Tayar num_dumped_bytes); 7709c965db44STomer Tayar } 7710c965db44STomer Tayar 7711c965db44STomer Tayar int qed_dbg_fw_asserts_size(struct qed_dev *cdev) 7712c965db44STomer Tayar { 7713c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_FW_ASSERTS); 7714c965db44STomer Tayar } 7715c965db44STomer Tayar 77168a52bbabSMichal Kalderon int qed_dbg_ilt(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes) 77178a52bbabSMichal Kalderon { 77188a52bbabSMichal Kalderon return qed_dbg_feature(cdev, buffer, DBG_FEATURE_ILT, num_dumped_bytes); 77198a52bbabSMichal Kalderon } 77208a52bbabSMichal Kalderon 77218a52bbabSMichal Kalderon int qed_dbg_ilt_size(struct qed_dev *cdev) 77228a52bbabSMichal Kalderon { 77238a52bbabSMichal Kalderon return qed_dbg_feature_size(cdev, DBG_FEATURE_ILT); 77248a52bbabSMichal Kalderon } 77258a52bbabSMichal Kalderon 7726c965db44STomer Tayar int qed_dbg_mcp_trace(struct qed_dev *cdev, void *buffer, 7727c965db44STomer Tayar u32 *num_dumped_bytes) 7728c965db44STomer Tayar { 7729c965db44STomer Tayar return qed_dbg_feature(cdev, buffer, DBG_FEATURE_MCP_TRACE, 7730c965db44STomer Tayar num_dumped_bytes); 7731c965db44STomer Tayar } 7732c965db44STomer Tayar 7733c965db44STomer Tayar int qed_dbg_mcp_trace_size(struct qed_dev *cdev) 7734c965db44STomer Tayar { 7735c965db44STomer Tayar return qed_dbg_feature_size(cdev, DBG_FEATURE_MCP_TRACE); 7736c965db44STomer Tayar } 7737c965db44STomer Tayar 7738c965db44STomer Tayar /* Defines the amount of bytes allocated for recording the length of debugfs 7739c965db44STomer Tayar * feature buffer. 7740c965db44STomer Tayar */ 7741c965db44STomer Tayar #define REGDUMP_HEADER_SIZE sizeof(u32) 77428a52bbabSMichal Kalderon #define REGDUMP_HEADER_SIZE_SHIFT 0 77438a52bbabSMichal Kalderon #define REGDUMP_HEADER_SIZE_MASK 0xffffff 7744c965db44STomer Tayar #define REGDUMP_HEADER_FEATURE_SHIFT 24 77458a52bbabSMichal Kalderon #define REGDUMP_HEADER_FEATURE_MASK 0x3f 7746c965db44STomer Tayar #define REGDUMP_HEADER_OMIT_ENGINE_SHIFT 30 77478a52bbabSMichal Kalderon #define REGDUMP_HEADER_OMIT_ENGINE_MASK 0x1 77488a52bbabSMichal Kalderon #define REGDUMP_HEADER_ENGINE_SHIFT 31 77498a52bbabSMichal Kalderon #define REGDUMP_HEADER_ENGINE_MASK 0x1 77508a52bbabSMichal Kalderon #define REGDUMP_MAX_SIZE 0x1000000 77518a52bbabSMichal Kalderon #define ILT_DUMP_MAX_SIZE (1024 * 1024 * 15) 77528a52bbabSMichal Kalderon 7753c965db44STomer Tayar enum debug_print_features { 7754c965db44STomer Tayar OLD_MODE = 0, 7755c965db44STomer Tayar IDLE_CHK = 1, 7756c965db44STomer Tayar GRC_DUMP = 2, 7757c965db44STomer Tayar MCP_TRACE = 3, 7758c965db44STomer Tayar REG_FIFO = 4, 7759c965db44STomer Tayar PROTECTION_OVERRIDE = 5, 7760c965db44STomer Tayar IGU_FIFO = 6, 7761c965db44STomer Tayar PHY = 7, 7762c965db44STomer Tayar FW_ASSERTS = 8, 77631ac4329aSDenis Bolotin NVM_CFG1 = 9, 77641ac4329aSDenis Bolotin DEFAULT_CFG = 10, 77651ac4329aSDenis Bolotin NVM_META = 11, 77668a52bbabSMichal Kalderon MDUMP = 12, 77678a52bbabSMichal Kalderon ILT_DUMP = 13, 7768c965db44STomer Tayar }; 7769c965db44STomer Tayar 77702d22bc83SMichal Kalderon static u32 qed_calc_regdump_header(struct qed_dev *cdev, 77712d22bc83SMichal Kalderon enum debug_print_features feature, 7772c965db44STomer Tayar int engine, u32 feature_size, u8 omit_engine) 7773c965db44STomer Tayar { 77742d22bc83SMichal Kalderon u32 res = 0; 77752d22bc83SMichal Kalderon 77762d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_SIZE, feature_size); 77772d22bc83SMichal Kalderon if (res != feature_size) 77782d22bc83SMichal Kalderon DP_NOTICE(cdev, 77792d22bc83SMichal Kalderon "Feature %d is too large (size 0x%x) and will corrupt the dump\n", 77802d22bc83SMichal Kalderon feature, feature_size); 77812d22bc83SMichal Kalderon 77822d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_FEATURE, feature); 77832d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_OMIT_ENGINE, omit_engine); 77842d22bc83SMichal Kalderon SET_FIELD(res, REGDUMP_HEADER_ENGINE, engine); 77852d22bc83SMichal Kalderon 77862d22bc83SMichal Kalderon return res; 7787c965db44STomer Tayar } 7788c965db44STomer Tayar 7789c965db44STomer Tayar int qed_dbg_all_data(struct qed_dev *cdev, void *buffer) 7790c965db44STomer Tayar { 7791c965db44STomer Tayar u8 cur_engine, omit_engine = 0, org_engine; 77923b86bd07SSudarsana Reddy Kalluru struct qed_hwfn *p_hwfn = 7793ca352f00SIgor Russkikh &cdev->hwfns[cdev->engine_for_debug]; 77943b86bd07SSudarsana Reddy Kalluru struct dbg_tools_data *dev_data = &p_hwfn->dbg_info; 77953b86bd07SSudarsana Reddy Kalluru int grc_params[MAX_DBG_GRC_PARAMS], i; 7796c965db44STomer Tayar u32 offset = 0, feature_size; 7797c965db44STomer Tayar int rc; 7798c965db44STomer Tayar 77993b86bd07SSudarsana Reddy Kalluru for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) 78003b86bd07SSudarsana Reddy Kalluru grc_params[i] = dev_data->grc.param_val[i]; 78013b86bd07SSudarsana Reddy Kalluru 78022d22bc83SMichal Kalderon if (!QED_IS_CMT(cdev)) 7803c965db44STomer Tayar omit_engine = 1; 7804c965db44STomer Tayar 78052d22bc83SMichal Kalderon mutex_lock(&qed_dbg_lock); 78062d22bc83SMichal Kalderon 7807c965db44STomer Tayar org_engine = qed_get_debug_engine(cdev); 7808c965db44STomer Tayar for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) { 7809c965db44STomer Tayar /* Collect idle_chks and grcDump for each hw function */ 7810c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, 7811c965db44STomer Tayar "obtaining idle_chk and grcdump for current engine\n"); 7812c965db44STomer Tayar qed_set_debug_engine(cdev, cur_engine); 7813c965db44STomer Tayar 7814c965db44STomer Tayar /* First idle_chk */ 7815c965db44STomer Tayar rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset + 7816c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 7817c965db44STomer Tayar if (!rc) { 7818c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 78192d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, IDLE_CHK, cur_engine, 7820c965db44STomer Tayar feature_size, omit_engine); 7821c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 7822c965db44STomer Tayar } else { 7823c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc); 7824c965db44STomer Tayar } 7825c965db44STomer Tayar 7826c965db44STomer Tayar /* Second idle_chk */ 7827c965db44STomer Tayar rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset + 7828c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 7829c965db44STomer Tayar if (!rc) { 7830c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 78312d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, IDLE_CHK, cur_engine, 7832c965db44STomer Tayar feature_size, omit_engine); 7833c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 7834c965db44STomer Tayar } else { 7835c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc); 7836c965db44STomer Tayar } 7837c965db44STomer Tayar 7838c965db44STomer Tayar /* reg_fifo dump */ 7839c965db44STomer Tayar rc = qed_dbg_reg_fifo(cdev, (u8 *)buffer + offset + 7840c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 7841c965db44STomer Tayar if (!rc) { 7842c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 78432d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, REG_FIFO, cur_engine, 7844c965db44STomer Tayar feature_size, omit_engine); 7845c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 7846c965db44STomer Tayar } else { 7847c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_reg_fifo failed. rc = %d\n", rc); 7848c965db44STomer Tayar } 7849c965db44STomer Tayar 7850c965db44STomer Tayar /* igu_fifo dump */ 7851c965db44STomer Tayar rc = qed_dbg_igu_fifo(cdev, (u8 *)buffer + offset + 7852c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 7853c965db44STomer Tayar if (!rc) { 7854c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 78552d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, IGU_FIFO, cur_engine, 7856c965db44STomer Tayar feature_size, omit_engine); 7857c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 7858c965db44STomer Tayar } else { 7859c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_igu_fifo failed. rc = %d", rc); 7860c965db44STomer Tayar } 7861c965db44STomer Tayar 7862c965db44STomer Tayar /* protection_override dump */ 7863c965db44STomer Tayar rc = qed_dbg_protection_override(cdev, (u8 *)buffer + offset + 7864c965db44STomer Tayar REGDUMP_HEADER_SIZE, 7865c965db44STomer Tayar &feature_size); 7866c965db44STomer Tayar if (!rc) { 7867c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 78682d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, PROTECTION_OVERRIDE, 7869c965db44STomer Tayar cur_engine, 7870c965db44STomer Tayar feature_size, omit_engine); 7871c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 7872c965db44STomer Tayar } else { 7873c965db44STomer Tayar DP_ERR(cdev, 7874c965db44STomer Tayar "qed_dbg_protection_override failed. rc = %d\n", 7875c965db44STomer Tayar rc); 7876c965db44STomer Tayar } 7877c965db44STomer Tayar 7878c965db44STomer Tayar /* fw_asserts dump */ 7879c965db44STomer Tayar rc = qed_dbg_fw_asserts(cdev, (u8 *)buffer + offset + 7880c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 7881c965db44STomer Tayar if (!rc) { 7882c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 78832d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, FW_ASSERTS, 78842d22bc83SMichal Kalderon cur_engine, feature_size, 78852d22bc83SMichal Kalderon omit_engine); 7886c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 7887c965db44STomer Tayar } else { 7888c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_fw_asserts failed. rc = %d\n", 7889c965db44STomer Tayar rc); 7890c965db44STomer Tayar } 7891c965db44STomer Tayar 78928a52bbabSMichal Kalderon feature_size = qed_dbg_ilt_size(cdev); 78938a52bbabSMichal Kalderon if (!cdev->disable_ilt_dump && 78948a52bbabSMichal Kalderon feature_size < ILT_DUMP_MAX_SIZE) { 78958a52bbabSMichal Kalderon rc = qed_dbg_ilt(cdev, (u8 *)buffer + offset + 78968a52bbabSMichal Kalderon REGDUMP_HEADER_SIZE, &feature_size); 78978a52bbabSMichal Kalderon if (!rc) { 78988a52bbabSMichal Kalderon *(u32 *)((u8 *)buffer + offset) = 78992d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, ILT_DUMP, 79008a52bbabSMichal Kalderon cur_engine, 79018a52bbabSMichal Kalderon feature_size, 79028a52bbabSMichal Kalderon omit_engine); 79038a52bbabSMichal Kalderon offset += feature_size + REGDUMP_HEADER_SIZE; 79048a52bbabSMichal Kalderon } else { 79058a52bbabSMichal Kalderon DP_ERR(cdev, "qed_dbg_ilt failed. rc = %d\n", 79068a52bbabSMichal Kalderon rc); 79078a52bbabSMichal Kalderon } 79088a52bbabSMichal Kalderon } 79093b86bd07SSudarsana Reddy Kalluru 7910c965db44STomer Tayar /* GRC dump - must be last because when mcp stuck it will 7911c965db44STomer Tayar * clutter idle_chk, reg_fifo, ... 7912c965db44STomer Tayar */ 79132d22bc83SMichal Kalderon for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) 79142d22bc83SMichal Kalderon dev_data->grc.param_val[i] = grc_params[i]; 79152d22bc83SMichal Kalderon 7916c965db44STomer Tayar rc = qed_dbg_grc(cdev, (u8 *)buffer + offset + 7917c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 7918c965db44STomer Tayar if (!rc) { 7919c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 79202d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, GRC_DUMP, 79212d22bc83SMichal Kalderon cur_engine, 7922c965db44STomer Tayar feature_size, omit_engine); 7923c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 7924c965db44STomer Tayar } else { 7925c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_grc failed. rc = %d", rc); 7926c965db44STomer Tayar } 7927c965db44STomer Tayar } 7928c965db44STomer Tayar 792950bc60cbSMichal Kalderon qed_set_debug_engine(cdev, org_engine); 79302d22bc83SMichal Kalderon 7931c965db44STomer Tayar /* mcp_trace */ 7932c965db44STomer Tayar rc = qed_dbg_mcp_trace(cdev, (u8 *)buffer + offset + 7933c965db44STomer Tayar REGDUMP_HEADER_SIZE, &feature_size); 7934c965db44STomer Tayar if (!rc) { 7935c965db44STomer Tayar *(u32 *)((u8 *)buffer + offset) = 79362d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, MCP_TRACE, cur_engine, 7937c965db44STomer Tayar feature_size, omit_engine); 7938c965db44STomer Tayar offset += (feature_size + REGDUMP_HEADER_SIZE); 7939c965db44STomer Tayar } else { 7940c965db44STomer Tayar DP_ERR(cdev, "qed_dbg_mcp_trace failed. rc = %d\n", rc); 7941c965db44STomer Tayar } 7942c965db44STomer Tayar 79431ac4329aSDenis Bolotin /* nvm cfg1 */ 79441ac4329aSDenis Bolotin rc = qed_dbg_nvm_image(cdev, 79452d22bc83SMichal Kalderon (u8 *)buffer + offset + 79462d22bc83SMichal Kalderon REGDUMP_HEADER_SIZE, &feature_size, 79472d22bc83SMichal Kalderon QED_NVM_IMAGE_NVM_CFG1); 79481ac4329aSDenis Bolotin if (!rc) { 79491ac4329aSDenis Bolotin *(u32 *)((u8 *)buffer + offset) = 79502d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, NVM_CFG1, cur_engine, 79511ac4329aSDenis Bolotin feature_size, omit_engine); 79521ac4329aSDenis Bolotin offset += (feature_size + REGDUMP_HEADER_SIZE); 79531ac4329aSDenis Bolotin } else if (rc != -ENOENT) { 79541ac4329aSDenis Bolotin DP_ERR(cdev, 79551ac4329aSDenis Bolotin "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 79561ac4329aSDenis Bolotin QED_NVM_IMAGE_NVM_CFG1, "QED_NVM_IMAGE_NVM_CFG1", rc); 79571ac4329aSDenis Bolotin } 79581ac4329aSDenis Bolotin 79591ac4329aSDenis Bolotin /* nvm default */ 79601ac4329aSDenis Bolotin rc = qed_dbg_nvm_image(cdev, 79611ac4329aSDenis Bolotin (u8 *)buffer + offset + REGDUMP_HEADER_SIZE, 79621ac4329aSDenis Bolotin &feature_size, QED_NVM_IMAGE_DEFAULT_CFG); 79631ac4329aSDenis Bolotin if (!rc) { 79641ac4329aSDenis Bolotin *(u32 *)((u8 *)buffer + offset) = 79652d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, DEFAULT_CFG, cur_engine, 79661ac4329aSDenis Bolotin feature_size, omit_engine); 79671ac4329aSDenis Bolotin offset += (feature_size + REGDUMP_HEADER_SIZE); 79681ac4329aSDenis Bolotin } else if (rc != -ENOENT) { 79691ac4329aSDenis Bolotin DP_ERR(cdev, 79701ac4329aSDenis Bolotin "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 79711ac4329aSDenis Bolotin QED_NVM_IMAGE_DEFAULT_CFG, "QED_NVM_IMAGE_DEFAULT_CFG", 79721ac4329aSDenis Bolotin rc); 79731ac4329aSDenis Bolotin } 79741ac4329aSDenis Bolotin 79751ac4329aSDenis Bolotin /* nvm meta */ 79761ac4329aSDenis Bolotin rc = qed_dbg_nvm_image(cdev, 79771ac4329aSDenis Bolotin (u8 *)buffer + offset + REGDUMP_HEADER_SIZE, 79781ac4329aSDenis Bolotin &feature_size, QED_NVM_IMAGE_NVM_META); 79791ac4329aSDenis Bolotin if (!rc) { 79801ac4329aSDenis Bolotin *(u32 *)((u8 *)buffer + offset) = 79812d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, NVM_META, cur_engine, 79821ac4329aSDenis Bolotin feature_size, omit_engine); 79831ac4329aSDenis Bolotin offset += (feature_size + REGDUMP_HEADER_SIZE); 79841ac4329aSDenis Bolotin } else if (rc != -ENOENT) { 79851ac4329aSDenis Bolotin DP_ERR(cdev, 79861ac4329aSDenis Bolotin "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 79871ac4329aSDenis Bolotin QED_NVM_IMAGE_NVM_META, "QED_NVM_IMAGE_NVM_META", rc); 79881ac4329aSDenis Bolotin } 79891ac4329aSDenis Bolotin 79908a52bbabSMichal Kalderon /* nvm mdump */ 79918a52bbabSMichal Kalderon rc = qed_dbg_nvm_image(cdev, (u8 *)buffer + offset + 79928a52bbabSMichal Kalderon REGDUMP_HEADER_SIZE, &feature_size, 79938a52bbabSMichal Kalderon QED_NVM_IMAGE_MDUMP); 79948a52bbabSMichal Kalderon if (!rc) { 79958a52bbabSMichal Kalderon *(u32 *)((u8 *)buffer + offset) = 79962d22bc83SMichal Kalderon qed_calc_regdump_header(cdev, MDUMP, cur_engine, 79978a52bbabSMichal Kalderon feature_size, omit_engine); 79988a52bbabSMichal Kalderon offset += (feature_size + REGDUMP_HEADER_SIZE); 79998a52bbabSMichal Kalderon } else if (rc != -ENOENT) { 80008a52bbabSMichal Kalderon DP_ERR(cdev, 80018a52bbabSMichal Kalderon "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n", 80028a52bbabSMichal Kalderon QED_NVM_IMAGE_MDUMP, "QED_NVM_IMAGE_MDUMP", rc); 80038a52bbabSMichal Kalderon } 80048a52bbabSMichal Kalderon 80052d22bc83SMichal Kalderon mutex_unlock(&qed_dbg_lock); 80062d22bc83SMichal Kalderon 8007c965db44STomer Tayar return 0; 8008c965db44STomer Tayar } 8009c965db44STomer Tayar 8010c965db44STomer Tayar int qed_dbg_all_data_size(struct qed_dev *cdev) 8011c965db44STomer Tayar { 80121ac4329aSDenis Bolotin struct qed_hwfn *p_hwfn = 8013ca352f00SIgor Russkikh &cdev->hwfns[cdev->engine_for_debug]; 80148a52bbabSMichal Kalderon u32 regs_len = 0, image_len = 0, ilt_len = 0, total_ilt_len = 0; 8015c965db44STomer Tayar u8 cur_engine, org_engine; 8016c965db44STomer Tayar 80172d22bc83SMichal Kalderon cdev->disable_ilt_dump = false; 8018c965db44STomer Tayar org_engine = qed_get_debug_engine(cdev); 8019c965db44STomer Tayar for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) { 8020c965db44STomer Tayar /* Engine specific */ 8021c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, 8022c965db44STomer Tayar "calculating idle_chk and grcdump register length for current engine\n"); 8023c965db44STomer Tayar qed_set_debug_engine(cdev, cur_engine); 8024c965db44STomer Tayar regs_len += REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) + 8025c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) + 8026c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_grc_size(cdev) + 8027c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_reg_fifo_size(cdev) + 8028c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_igu_fifo_size(cdev) + 8029c965db44STomer Tayar REGDUMP_HEADER_SIZE + 8030c965db44STomer Tayar qed_dbg_protection_override_size(cdev) + 8031c965db44STomer Tayar REGDUMP_HEADER_SIZE + qed_dbg_fw_asserts_size(cdev); 80328a52bbabSMichal Kalderon 80338a52bbabSMichal Kalderon ilt_len = REGDUMP_HEADER_SIZE + qed_dbg_ilt_size(cdev); 80348a52bbabSMichal Kalderon if (ilt_len < ILT_DUMP_MAX_SIZE) { 80358a52bbabSMichal Kalderon total_ilt_len += ilt_len; 80368a52bbabSMichal Kalderon regs_len += ilt_len; 80378a52bbabSMichal Kalderon } 8038c965db44STomer Tayar } 8039c965db44STomer Tayar 804050bc60cbSMichal Kalderon qed_set_debug_engine(cdev, org_engine); 804150bc60cbSMichal Kalderon 8042c965db44STomer Tayar /* Engine common */ 8043c965db44STomer Tayar regs_len += REGDUMP_HEADER_SIZE + qed_dbg_mcp_trace_size(cdev); 80441ac4329aSDenis Bolotin qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_CFG1, &image_len); 80451ac4329aSDenis Bolotin if (image_len) 80461ac4329aSDenis Bolotin regs_len += REGDUMP_HEADER_SIZE + image_len; 80471ac4329aSDenis Bolotin qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_DEFAULT_CFG, &image_len); 80481ac4329aSDenis Bolotin if (image_len) 80491ac4329aSDenis Bolotin regs_len += REGDUMP_HEADER_SIZE + image_len; 80501ac4329aSDenis Bolotin qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_META, &image_len); 80511ac4329aSDenis Bolotin if (image_len) 80521ac4329aSDenis Bolotin regs_len += REGDUMP_HEADER_SIZE + image_len; 80538a52bbabSMichal Kalderon qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_MDUMP, &image_len); 80548a52bbabSMichal Kalderon if (image_len) 80558a52bbabSMichal Kalderon regs_len += REGDUMP_HEADER_SIZE + image_len; 80568a52bbabSMichal Kalderon 80578a52bbabSMichal Kalderon if (regs_len > REGDUMP_MAX_SIZE) { 80588a52bbabSMichal Kalderon DP_VERBOSE(cdev, QED_MSG_DEBUG, 80598a52bbabSMichal Kalderon "Dump exceeds max size 0x%x, disable ILT dump\n", 80608a52bbabSMichal Kalderon REGDUMP_MAX_SIZE); 80618a52bbabSMichal Kalderon cdev->disable_ilt_dump = true; 80628a52bbabSMichal Kalderon regs_len -= total_ilt_len; 80638a52bbabSMichal Kalderon } 8064c965db44STomer Tayar 8065c965db44STomer Tayar return regs_len; 8066c965db44STomer Tayar } 8067c965db44STomer Tayar 8068c965db44STomer Tayar int qed_dbg_feature(struct qed_dev *cdev, void *buffer, 8069c965db44STomer Tayar enum qed_dbg_features feature, u32 *num_dumped_bytes) 8070c965db44STomer Tayar { 8071c965db44STomer Tayar struct qed_hwfn *p_hwfn = 8072ca352f00SIgor Russkikh &cdev->hwfns[cdev->engine_for_debug]; 8073c965db44STomer Tayar struct qed_dbg_feature *qed_feature = 8074ca352f00SIgor Russkikh &cdev->dbg_features[feature]; 8075c965db44STomer Tayar enum dbg_status dbg_rc; 8076c965db44STomer Tayar struct qed_ptt *p_ptt; 8077c965db44STomer Tayar int rc = 0; 8078c965db44STomer Tayar 8079c965db44STomer Tayar /* Acquire ptt */ 8080c965db44STomer Tayar p_ptt = qed_ptt_acquire(p_hwfn); 8081c965db44STomer Tayar if (!p_ptt) 8082c965db44STomer Tayar return -EINVAL; 8083c965db44STomer Tayar 8084c965db44STomer Tayar /* Get dump */ 8085c965db44STomer Tayar dbg_rc = qed_dbg_dump(p_hwfn, p_ptt, feature); 8086c965db44STomer Tayar if (dbg_rc != DBG_STATUS_OK) { 8087c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, "%s\n", 8088c965db44STomer Tayar qed_dbg_get_status_str(dbg_rc)); 8089c965db44STomer Tayar *num_dumped_bytes = 0; 8090c965db44STomer Tayar rc = -EINVAL; 8091c965db44STomer Tayar goto out; 8092c965db44STomer Tayar } 8093c965db44STomer Tayar 8094c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, 8095c965db44STomer Tayar "copying debugfs feature to external buffer\n"); 8096c965db44STomer Tayar memcpy(buffer, qed_feature->dump_buf, qed_feature->buf_size); 8097ca352f00SIgor Russkikh *num_dumped_bytes = cdev->dbg_features[feature].dumped_dwords * 8098c965db44STomer Tayar 4; 8099c965db44STomer Tayar 8100c965db44STomer Tayar out: 8101c965db44STomer Tayar qed_ptt_release(p_hwfn, p_ptt); 8102c965db44STomer Tayar return rc; 8103c965db44STomer Tayar } 8104c965db44STomer Tayar 8105c965db44STomer Tayar int qed_dbg_feature_size(struct qed_dev *cdev, enum qed_dbg_features feature) 8106c965db44STomer Tayar { 8107c965db44STomer Tayar struct qed_hwfn *p_hwfn = 8108ca352f00SIgor Russkikh &cdev->hwfns[cdev->engine_for_debug]; 81092d22bc83SMichal Kalderon struct qed_dbg_feature *qed_feature = &cdev->dbg_features[feature]; 8110c965db44STomer Tayar struct qed_ptt *p_ptt = qed_ptt_acquire(p_hwfn); 8111c965db44STomer Tayar u32 buf_size_dwords; 8112c965db44STomer Tayar enum dbg_status rc; 8113c965db44STomer Tayar 8114c965db44STomer Tayar if (!p_ptt) 8115c965db44STomer Tayar return -EINVAL; 8116c965db44STomer Tayar 8117c965db44STomer Tayar rc = qed_features_lookup[feature].get_size(p_hwfn, p_ptt, 8118c965db44STomer Tayar &buf_size_dwords); 8119c965db44STomer Tayar if (rc != DBG_STATUS_OK) 8120c965db44STomer Tayar buf_size_dwords = 0; 8121c965db44STomer Tayar 81228a52bbabSMichal Kalderon /* Feature will not be dumped if it exceeds maximum size */ 81238a52bbabSMichal Kalderon if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS) 81248a52bbabSMichal Kalderon buf_size_dwords = 0; 81258a52bbabSMichal Kalderon 8126c965db44STomer Tayar qed_ptt_release(p_hwfn, p_ptt); 8127c965db44STomer Tayar qed_feature->buf_size = buf_size_dwords * sizeof(u32); 8128c965db44STomer Tayar return qed_feature->buf_size; 8129c965db44STomer Tayar } 8130c965db44STomer Tayar 8131c965db44STomer Tayar u8 qed_get_debug_engine(struct qed_dev *cdev) 8132c965db44STomer Tayar { 8133ca352f00SIgor Russkikh return cdev->engine_for_debug; 8134c965db44STomer Tayar } 8135c965db44STomer Tayar 8136c965db44STomer Tayar void qed_set_debug_engine(struct qed_dev *cdev, int engine_number) 8137c965db44STomer Tayar { 8138c965db44STomer Tayar DP_VERBOSE(cdev, QED_MSG_DEBUG, "set debug engine to %d\n", 8139c965db44STomer Tayar engine_number); 8140ca352f00SIgor Russkikh cdev->engine_for_debug = engine_number; 8141c965db44STomer Tayar } 8142c965db44STomer Tayar 8143c965db44STomer Tayar void qed_dbg_pf_init(struct qed_dev *cdev) 8144c965db44STomer Tayar { 81452d22bc83SMichal Kalderon const u8 *dbg_values = NULL; 81462d22bc83SMichal Kalderon int i; 8147c965db44STomer Tayar 8148c965db44STomer Tayar /* Debug values are after init values. 8149c965db44STomer Tayar * The offset is the first dword of the file. 8150c965db44STomer Tayar */ 8151c965db44STomer Tayar dbg_values = cdev->firmware->data + *(u32 *)cdev->firmware->data; 81522d22bc83SMichal Kalderon 81532d22bc83SMichal Kalderon for_each_hwfn(cdev, i) { 81542d22bc83SMichal Kalderon qed_dbg_set_bin_ptr(&cdev->hwfns[i], dbg_values); 81552d22bc83SMichal Kalderon qed_dbg_user_set_bin_ptr(&cdev->hwfns[i], dbg_values); 81562d22bc83SMichal Kalderon } 81572d22bc83SMichal Kalderon 81582d22bc83SMichal Kalderon /* Set the hwfn to be 0 as default */ 8159ca352f00SIgor Russkikh cdev->engine_for_debug = 0; 8160c965db44STomer Tayar } 8161c965db44STomer Tayar 8162c965db44STomer Tayar void qed_dbg_pf_exit(struct qed_dev *cdev) 8163c965db44STomer Tayar { 8164c965db44STomer Tayar struct qed_dbg_feature *feature = NULL; 8165c965db44STomer Tayar enum qed_dbg_features feature_idx; 8166c965db44STomer Tayar 81672d22bc83SMichal Kalderon /* debug features' buffers may be allocated if debug feature was used 81682d22bc83SMichal Kalderon * but dump wasn't called 8169c965db44STomer Tayar */ 8170c965db44STomer Tayar for (feature_idx = 0; feature_idx < DBG_FEATURE_NUM; feature_idx++) { 81712d22bc83SMichal Kalderon feature = &cdev->dbg_features[feature_idx]; 8172c965db44STomer Tayar if (feature->dump_buf) { 8173c965db44STomer Tayar vfree(feature->dump_buf); 8174c965db44STomer Tayar feature->dump_buf = NULL; 8175c965db44STomer Tayar } 8176c965db44STomer Tayar } 8177c965db44STomer Tayar } 8178