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