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