1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2 /* QLogic qed NIC Driver
3  * Copyright (c) 2015 QLogic Corporation
4  * Copyright (c) 2019-2020 Marvell International Ltd.
5  */
6 
7 #include <linux/module.h>
8 #include <linux/vmalloc.h>
9 #include <linux/crc32.h>
10 #include "qed.h"
11 #include "qed_cxt.h"
12 #include "qed_hsi.h"
13 #include "qed_dbg_hsi.h"
14 #include "qed_hw.h"
15 #include "qed_mcp.h"
16 #include "qed_reg_addr.h"
17 
18 /* Memory groups enum */
19 enum mem_groups {
20 	MEM_GROUP_PXP_MEM,
21 	MEM_GROUP_DMAE_MEM,
22 	MEM_GROUP_CM_MEM,
23 	MEM_GROUP_QM_MEM,
24 	MEM_GROUP_DORQ_MEM,
25 	MEM_GROUP_BRB_RAM,
26 	MEM_GROUP_BRB_MEM,
27 	MEM_GROUP_PRS_MEM,
28 	MEM_GROUP_SDM_MEM,
29 	MEM_GROUP_PBUF,
30 	MEM_GROUP_IOR,
31 	MEM_GROUP_RAM,
32 	MEM_GROUP_BTB_RAM,
33 	MEM_GROUP_RDIF_CTX,
34 	MEM_GROUP_TDIF_CTX,
35 	MEM_GROUP_CFC_MEM,
36 	MEM_GROUP_CONN_CFC_MEM,
37 	MEM_GROUP_CAU_PI,
38 	MEM_GROUP_CAU_MEM,
39 	MEM_GROUP_CAU_MEM_EXT,
40 	MEM_GROUP_PXP_ILT,
41 	MEM_GROUP_MULD_MEM,
42 	MEM_GROUP_BTB_MEM,
43 	MEM_GROUP_IGU_MEM,
44 	MEM_GROUP_IGU_MSIX,
45 	MEM_GROUP_CAU_SB,
46 	MEM_GROUP_BMB_RAM,
47 	MEM_GROUP_BMB_MEM,
48 	MEM_GROUP_TM_MEM,
49 	MEM_GROUP_TASK_CFC_MEM,
50 	MEM_GROUPS_NUM
51 };
52 
53 /* Memory groups names */
54 static const char * const s_mem_group_names[] = {
55 	"PXP_MEM",
56 	"DMAE_MEM",
57 	"CM_MEM",
58 	"QM_MEM",
59 	"DORQ_MEM",
60 	"BRB_RAM",
61 	"BRB_MEM",
62 	"PRS_MEM",
63 	"SDM_MEM",
64 	"PBUF",
65 	"IOR",
66 	"RAM",
67 	"BTB_RAM",
68 	"RDIF_CTX",
69 	"TDIF_CTX",
70 	"CFC_MEM",
71 	"CONN_CFC_MEM",
72 	"CAU_PI",
73 	"CAU_MEM",
74 	"CAU_MEM_EXT",
75 	"PXP_ILT",
76 	"MULD_MEM",
77 	"BTB_MEM",
78 	"IGU_MEM",
79 	"IGU_MSIX",
80 	"CAU_SB",
81 	"BMB_RAM",
82 	"BMB_MEM",
83 	"TM_MEM",
84 	"TASK_CFC_MEM",
85 };
86 
87 /* Idle check conditions */
88 
89 static u32 cond5(const u32 *r, const u32 *imm)
90 {
91 	return ((r[0] & imm[0]) != imm[1]) && ((r[1] & imm[2]) != imm[3]);
92 }
93 
94 static u32 cond7(const u32 *r, const u32 *imm)
95 {
96 	return ((r[0] >> imm[0]) & imm[1]) != imm[2];
97 }
98 
99 static u32 cond6(const u32 *r, const u32 *imm)
100 {
101 	return (r[0] & imm[0]) != imm[1];
102 }
103 
104 static u32 cond9(const u32 *r, const u32 *imm)
105 {
106 	return ((r[0] & imm[0]) >> imm[1]) !=
107 	    (((r[0] & imm[2]) >> imm[3]) | ((r[1] & imm[4]) << imm[5]));
108 }
109 
110 static u32 cond10(const u32 *r, const u32 *imm)
111 {
112 	return ((r[0] & imm[0]) >> imm[1]) != (r[0] & imm[2]);
113 }
114 
115 static u32 cond4(const u32 *r, const u32 *imm)
116 {
117 	return (r[0] & ~imm[0]) != imm[1];
118 }
119 
120 static u32 cond0(const u32 *r, const u32 *imm)
121 {
122 	return (r[0] & ~r[1]) != imm[0];
123 }
124 
125 static u32 cond1(const u32 *r, const u32 *imm)
126 {
127 	return r[0] != imm[0];
128 }
129 
130 static u32 cond11(const u32 *r, const u32 *imm)
131 {
132 	return r[0] != r[1] && r[2] == imm[0];
133 }
134 
135 static u32 cond12(const u32 *r, const u32 *imm)
136 {
137 	return r[0] != r[1] && r[2] > imm[0];
138 }
139 
140 static u32 cond3(const u32 *r, const u32 *imm)
141 {
142 	return r[0] != r[1];
143 }
144 
145 static u32 cond13(const u32 *r, const u32 *imm)
146 {
147 	return r[0] & imm[0];
148 }
149 
150 static u32 cond8(const u32 *r, const u32 *imm)
151 {
152 	return r[0] < (r[1] - imm[0]);
153 }
154 
155 static u32 cond2(const u32 *r, const u32 *imm)
156 {
157 	return r[0] > imm[0];
158 }
159 
160 /* Array of Idle Check conditions */
161 static u32(*cond_arr[]) (const u32 *r, const u32 *imm) = {
162 	cond0,
163 	cond1,
164 	cond2,
165 	cond3,
166 	cond4,
167 	cond5,
168 	cond6,
169 	cond7,
170 	cond8,
171 	cond9,
172 	cond10,
173 	cond11,
174 	cond12,
175 	cond13,
176 };
177 
178 #define NUM_PHYS_BLOCKS 84
179 
180 #define NUM_DBG_RESET_REGS 8
181 
182 /******************************* Data Types **********************************/
183 
184 enum hw_types {
185 	HW_TYPE_ASIC,
186 	PLATFORM_RESERVED,
187 	PLATFORM_RESERVED2,
188 	PLATFORM_RESERVED3,
189 	PLATFORM_RESERVED4,
190 	MAX_HW_TYPES
191 };
192 
193 /* CM context types */
194 enum cm_ctx_types {
195 	CM_CTX_CONN_AG,
196 	CM_CTX_CONN_ST,
197 	CM_CTX_TASK_AG,
198 	CM_CTX_TASK_ST,
199 	NUM_CM_CTX_TYPES
200 };
201 
202 /* Debug bus frame modes */
203 enum dbg_bus_frame_modes {
204 	DBG_BUS_FRAME_MODE_4ST = 0,	/* 4 Storm dwords (no HW) */
205 	DBG_BUS_FRAME_MODE_2ST_2HW = 1,	/* 2 Storm dwords, 2 HW dwords */
206 	DBG_BUS_FRAME_MODE_1ST_3HW = 2,	/* 1 Storm dwords, 3 HW dwords */
207 	DBG_BUS_FRAME_MODE_4HW = 3,	/* 4 HW dwords (no Storms) */
208 	DBG_BUS_FRAME_MODE_8HW = 4,	/* 8 HW dwords (no Storms) */
209 	DBG_BUS_NUM_FRAME_MODES
210 };
211 
212 /* Chip constant definitions */
213 struct chip_defs {
214 	const char *name;
215 	u32 num_ilt_pages;
216 };
217 
218 /* HW type constant definitions */
219 struct hw_type_defs {
220 	const char *name;
221 	u32 delay_factor;
222 	u32 dmae_thresh;
223 	u32 log_thresh;
224 };
225 
226 /* RBC reset definitions */
227 struct rbc_reset_defs {
228 	u32 reset_reg_addr;
229 	u32 reset_val[MAX_CHIP_IDS];
230 };
231 
232 /* Storm constant definitions.
233  * Addresses are in bytes, sizes are in quad-regs.
234  */
235 struct storm_defs {
236 	char letter;
237 	enum block_id sem_block_id;
238 	enum dbg_bus_clients dbg_client_id[MAX_CHIP_IDS];
239 	bool has_vfc;
240 	u32 sem_fast_mem_addr;
241 	u32 sem_frame_mode_addr;
242 	u32 sem_slow_enable_addr;
243 	u32 sem_slow_mode_addr;
244 	u32 sem_slow_mode1_conf_addr;
245 	u32 sem_sync_dbg_empty_addr;
246 	u32 sem_gpre_vect_addr;
247 	u32 cm_ctx_wr_addr;
248 	u32 cm_ctx_rd_addr[NUM_CM_CTX_TYPES];
249 	u32 cm_ctx_lid_sizes[MAX_CHIP_IDS][NUM_CM_CTX_TYPES];
250 };
251 
252 /* Debug Bus Constraint operation constant definitions */
253 struct dbg_bus_constraint_op_defs {
254 	u8 hw_op_val;
255 	bool is_cyclic;
256 };
257 
258 /* Storm Mode definitions */
259 struct storm_mode_defs {
260 	const char *name;
261 	bool is_fast_dbg;
262 	u8 id_in_hw;
263 	u32 src_disable_reg_addr;
264 	u32 src_enable_val;
265 	bool exists[MAX_CHIP_IDS];
266 };
267 
268 struct grc_param_defs {
269 	u32 default_val[MAX_CHIP_IDS];
270 	u32 min;
271 	u32 max;
272 	bool is_preset;
273 	bool is_persistent;
274 	u32 exclude_all_preset_val;
275 	u32 crash_preset_val[MAX_CHIP_IDS];
276 };
277 
278 /* Address is in 128b units. Width is in bits. */
279 struct rss_mem_defs {
280 	const char *mem_name;
281 	const char *type_name;
282 	u32 addr;
283 	u32 entry_width;
284 	u32 num_entries[MAX_CHIP_IDS];
285 };
286 
287 struct vfc_ram_defs {
288 	const char *mem_name;
289 	const char *type_name;
290 	u32 base_row;
291 	u32 num_rows;
292 };
293 
294 struct big_ram_defs {
295 	const char *instance_name;
296 	enum mem_groups mem_group_id;
297 	enum mem_groups ram_mem_group_id;
298 	enum dbg_grc_params grc_param;
299 	u32 addr_reg_addr;
300 	u32 data_reg_addr;
301 	u32 is_256b_reg_addr;
302 	u32 is_256b_bit_offset[MAX_CHIP_IDS];
303 	u32 ram_size[MAX_CHIP_IDS]; /* In dwords */
304 };
305 
306 struct phy_defs {
307 	const char *phy_name;
308 
309 	/* PHY base GRC address */
310 	u32 base_addr;
311 
312 	/* Relative address of indirect TBUS address register (bits 0..7) */
313 	u32 tbus_addr_lo_addr;
314 
315 	/* Relative address of indirect TBUS address register (bits 8..10) */
316 	u32 tbus_addr_hi_addr;
317 
318 	/* Relative address of indirect TBUS data register (bits 0..7) */
319 	u32 tbus_data_lo_addr;
320 
321 	/* Relative address of indirect TBUS data register (bits 8..11) */
322 	u32 tbus_data_hi_addr;
323 };
324 
325 /* Split type definitions */
326 struct split_type_defs {
327 	const char *name;
328 };
329 
330 /******************************** Constants **********************************/
331 
332 #define BYTES_IN_DWORD			sizeof(u32)
333 /* In the macros below, size and offset are specified in bits */
334 #define CEIL_DWORDS(size)		DIV_ROUND_UP(size, 32)
335 #define FIELD_BIT_OFFSET(type, field)	type ## _ ## field ## _ ## OFFSET
336 #define FIELD_BIT_SIZE(type, field)	type ## _ ## field ## _ ## SIZE
337 #define FIELD_DWORD_OFFSET(type, field) \
338 	 (int)(FIELD_BIT_OFFSET(type, field) / 32)
339 #define FIELD_DWORD_SHIFT(type, field)	(FIELD_BIT_OFFSET(type, field) % 32)
340 #define FIELD_BIT_MASK(type, field) \
341 	(((1 << FIELD_BIT_SIZE(type, field)) - 1) << \
342 	 FIELD_DWORD_SHIFT(type, field))
343 
344 #define SET_VAR_FIELD(var, type, field, val) \
345 	do { \
346 		var[FIELD_DWORD_OFFSET(type, field)] &=	\
347 		(~FIELD_BIT_MASK(type, field));	\
348 		var[FIELD_DWORD_OFFSET(type, field)] |= \
349 		(val) << FIELD_DWORD_SHIFT(type, field); \
350 	} while (0)
351 
352 #define ARR_REG_WR(dev, ptt, addr, arr, arr_size) \
353 	do { \
354 		for (i = 0; i < (arr_size); i++) \
355 			qed_wr(dev, ptt, addr,	(arr)[i]); \
356 	} while (0)
357 
358 #define DWORDS_TO_BYTES(dwords)		((dwords) * BYTES_IN_DWORD)
359 #define BYTES_TO_DWORDS(bytes)		((bytes) / BYTES_IN_DWORD)
360 
361 /* extra lines include a signature line + optional latency events line */
362 #define NUM_EXTRA_DBG_LINES(block) \
363 	(GET_FIELD((block)->flags, DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS) ? 2 : 1)
364 #define NUM_DBG_LINES(block) \
365 	((block)->num_of_dbg_bus_lines + NUM_EXTRA_DBG_LINES(block))
366 
367 #define USE_DMAE			true
368 #define PROTECT_WIDE_BUS		true
369 
370 #define RAM_LINES_TO_DWORDS(lines)	((lines) * 2)
371 #define RAM_LINES_TO_BYTES(lines) \
372 	DWORDS_TO_BYTES(RAM_LINES_TO_DWORDS(lines))
373 
374 #define REG_DUMP_LEN_SHIFT		24
375 #define MEM_DUMP_ENTRY_SIZE_DWORDS \
376 	BYTES_TO_DWORDS(sizeof(struct dbg_dump_mem))
377 
378 #define IDLE_CHK_RULE_SIZE_DWORDS \
379 	BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_rule))
380 
381 #define IDLE_CHK_RESULT_HDR_DWORDS \
382 	BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_hdr))
383 
384 #define IDLE_CHK_RESULT_REG_HDR_DWORDS \
385 	BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_reg_hdr))
386 
387 #define PAGE_MEM_DESC_SIZE_DWORDS \
388 	BYTES_TO_DWORDS(sizeof(struct phys_mem_desc))
389 
390 #define IDLE_CHK_MAX_ENTRIES_SIZE	32
391 
392 /* The sizes and offsets below are specified in bits */
393 #define VFC_CAM_CMD_STRUCT_SIZE		64
394 #define VFC_CAM_CMD_ROW_OFFSET		48
395 #define VFC_CAM_CMD_ROW_SIZE		9
396 #define VFC_CAM_ADDR_STRUCT_SIZE	16
397 #define VFC_CAM_ADDR_OP_OFFSET		0
398 #define VFC_CAM_ADDR_OP_SIZE		4
399 #define VFC_CAM_RESP_STRUCT_SIZE	256
400 #define VFC_RAM_ADDR_STRUCT_SIZE	16
401 #define VFC_RAM_ADDR_OP_OFFSET		0
402 #define VFC_RAM_ADDR_OP_SIZE		2
403 #define VFC_RAM_ADDR_ROW_OFFSET		2
404 #define VFC_RAM_ADDR_ROW_SIZE		10
405 #define VFC_RAM_RESP_STRUCT_SIZE	256
406 
407 #define VFC_CAM_CMD_DWORDS		CEIL_DWORDS(VFC_CAM_CMD_STRUCT_SIZE)
408 #define VFC_CAM_ADDR_DWORDS		CEIL_DWORDS(VFC_CAM_ADDR_STRUCT_SIZE)
409 #define VFC_CAM_RESP_DWORDS		CEIL_DWORDS(VFC_CAM_RESP_STRUCT_SIZE)
410 #define VFC_RAM_CMD_DWORDS		VFC_CAM_CMD_DWORDS
411 #define VFC_RAM_ADDR_DWORDS		CEIL_DWORDS(VFC_RAM_ADDR_STRUCT_SIZE)
412 #define VFC_RAM_RESP_DWORDS		CEIL_DWORDS(VFC_RAM_RESP_STRUCT_SIZE)
413 
414 #define NUM_VFC_RAM_TYPES		4
415 
416 #define VFC_CAM_NUM_ROWS		512
417 
418 #define VFC_OPCODE_CAM_RD		14
419 #define VFC_OPCODE_RAM_RD		0
420 
421 #define NUM_RSS_MEM_TYPES		5
422 
423 #define NUM_BIG_RAM_TYPES		3
424 #define BIG_RAM_NAME_LEN		3
425 
426 #define NUM_PHY_TBUS_ADDRESSES		2048
427 #define PHY_DUMP_SIZE_DWORDS		(NUM_PHY_TBUS_ADDRESSES / 2)
428 
429 #define RESET_REG_UNRESET_OFFSET	4
430 
431 #define STALL_DELAY_MS			500
432 
433 #define STATIC_DEBUG_LINE_DWORDS	9
434 
435 #define NUM_COMMON_GLOBAL_PARAMS	9
436 
437 #define MAX_RECURSION_DEPTH		10
438 
439 #define FW_IMG_MAIN			1
440 
441 #define REG_FIFO_ELEMENT_DWORDS		2
442 #define REG_FIFO_DEPTH_ELEMENTS		32
443 #define REG_FIFO_DEPTH_DWORDS \
444 	(REG_FIFO_ELEMENT_DWORDS * REG_FIFO_DEPTH_ELEMENTS)
445 
446 #define IGU_FIFO_ELEMENT_DWORDS		4
447 #define IGU_FIFO_DEPTH_ELEMENTS		64
448 #define IGU_FIFO_DEPTH_DWORDS \
449 	(IGU_FIFO_ELEMENT_DWORDS * IGU_FIFO_DEPTH_ELEMENTS)
450 
451 #define PROTECTION_OVERRIDE_ELEMENT_DWORDS	2
452 #define PROTECTION_OVERRIDE_DEPTH_ELEMENTS	20
453 #define PROTECTION_OVERRIDE_DEPTH_DWORDS \
454 	(PROTECTION_OVERRIDE_DEPTH_ELEMENTS * \
455 	 PROTECTION_OVERRIDE_ELEMENT_DWORDS)
456 
457 #define MCP_SPAD_TRACE_OFFSIZE_ADDR \
458 	(MCP_REG_SCRATCH + \
459 	 offsetof(struct static_init, sections[SPAD_SECTION_TRACE]))
460 
461 #define MAX_SW_PLTAFORM_STR_SIZE	64
462 
463 #define EMPTY_FW_VERSION_STR		"???_???_???_???"
464 #define EMPTY_FW_IMAGE_STR		"???????????????"
465 
466 /***************************** Constant Arrays *******************************/
467 
468 /* Chip constant definitions array */
469 static struct chip_defs s_chip_defs[MAX_CHIP_IDS] = {
470 	{"bb", PSWRQ2_REG_ILT_MEMORY_SIZE_BB / 2},
471 	{"ah", PSWRQ2_REG_ILT_MEMORY_SIZE_K2 / 2}
472 };
473 
474 /* Storm constant definitions array */
475 static struct storm_defs s_storm_defs[] = {
476 	/* Tstorm */
477 	{'T', BLOCK_TSEM,
478 		{DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT},
479 		true,
480 		TSEM_REG_FAST_MEMORY,
481 		TSEM_REG_DBG_FRAME_MODE_BB_K2, TSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
482 		TSEM_REG_SLOW_DBG_MODE_BB_K2, TSEM_REG_DBG_MODE1_CFG_BB_K2,
483 		TSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_DBG_GPRE_VECT,
484 		TCM_REG_CTX_RBC_ACCS,
485 		{TCM_REG_AGG_CON_CTX, TCM_REG_SM_CON_CTX, TCM_REG_AGG_TASK_CTX,
486 		 TCM_REG_SM_TASK_CTX},
487 		{{4, 16, 2, 4}, {4, 16, 2, 4}} /* {bb} {k2} */
488 	},
489 
490 	/* Mstorm */
491 	{'M', BLOCK_MSEM,
492 		{DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM},
493 		false,
494 		MSEM_REG_FAST_MEMORY,
495 		MSEM_REG_DBG_FRAME_MODE_BB_K2,
496 		MSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
497 		MSEM_REG_SLOW_DBG_MODE_BB_K2,
498 		MSEM_REG_DBG_MODE1_CFG_BB_K2,
499 		MSEM_REG_SYNC_DBG_EMPTY,
500 		MSEM_REG_DBG_GPRE_VECT,
501 		MCM_REG_CTX_RBC_ACCS,
502 		{MCM_REG_AGG_CON_CTX, MCM_REG_SM_CON_CTX, MCM_REG_AGG_TASK_CTX,
503 		 MCM_REG_SM_TASK_CTX },
504 		{{1, 10, 2, 7}, {1, 10, 2, 7}} /* {bb} {k2}*/
505 	},
506 
507 	/* Ustorm */
508 	{'U', BLOCK_USEM,
509 		{DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU},
510 		false,
511 		USEM_REG_FAST_MEMORY,
512 		USEM_REG_DBG_FRAME_MODE_BB_K2,
513 		USEM_REG_SLOW_DBG_ACTIVE_BB_K2,
514 		USEM_REG_SLOW_DBG_MODE_BB_K2,
515 		USEM_REG_DBG_MODE1_CFG_BB_K2,
516 		USEM_REG_SYNC_DBG_EMPTY,
517 		USEM_REG_DBG_GPRE_VECT,
518 		UCM_REG_CTX_RBC_ACCS,
519 		{UCM_REG_AGG_CON_CTX, UCM_REG_SM_CON_CTX, UCM_REG_AGG_TASK_CTX,
520 		 UCM_REG_SM_TASK_CTX},
521 		{{2, 13, 3, 3}, {2, 13, 3, 3}} /* {bb} {k2} */
522 	},
523 
524 	/* Xstorm */
525 	{'X', BLOCK_XSEM,
526 		{DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX},
527 		false,
528 		XSEM_REG_FAST_MEMORY,
529 		XSEM_REG_DBG_FRAME_MODE_BB_K2,
530 		XSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
531 		XSEM_REG_SLOW_DBG_MODE_BB_K2,
532 		XSEM_REG_DBG_MODE1_CFG_BB_K2,
533 		XSEM_REG_SYNC_DBG_EMPTY,
534 		XSEM_REG_DBG_GPRE_VECT,
535 		XCM_REG_CTX_RBC_ACCS,
536 		{XCM_REG_AGG_CON_CTX, XCM_REG_SM_CON_CTX, 0, 0},
537 		{{9, 15, 0, 0}, {9, 15,	0, 0}} /* {bb} {k2} */
538 	},
539 
540 	/* Ystorm */
541 	{'Y', BLOCK_YSEM,
542 		{DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY},
543 		false,
544 		YSEM_REG_FAST_MEMORY,
545 		YSEM_REG_DBG_FRAME_MODE_BB_K2,
546 		YSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
547 		YSEM_REG_SLOW_DBG_MODE_BB_K2,
548 		YSEM_REG_DBG_MODE1_CFG_BB_K2,
549 		YSEM_REG_SYNC_DBG_EMPTY,
550 		YSEM_REG_DBG_GPRE_VECT,
551 		YCM_REG_CTX_RBC_ACCS,
552 		{YCM_REG_AGG_CON_CTX, YCM_REG_SM_CON_CTX, YCM_REG_AGG_TASK_CTX,
553 		 YCM_REG_SM_TASK_CTX},
554 		{{2, 3, 2, 12}, {2, 3, 2, 12}} /* {bb} {k2} */
555 	},
556 
557 	/* Pstorm */
558 	{'P', BLOCK_PSEM,
559 		{DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS},
560 		true,
561 		PSEM_REG_FAST_MEMORY,
562 		PSEM_REG_DBG_FRAME_MODE_BB_K2,
563 		PSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
564 		PSEM_REG_SLOW_DBG_MODE_BB_K2,
565 		PSEM_REG_DBG_MODE1_CFG_BB_K2,
566 		PSEM_REG_SYNC_DBG_EMPTY,
567 		PSEM_REG_DBG_GPRE_VECT,
568 		PCM_REG_CTX_RBC_ACCS,
569 		{0, PCM_REG_SM_CON_CTX, 0, 0},
570 		{{0, 10, 0, 0}, {0, 10, 0, 0}} /* {bb} {k2} */
571 	},
572 };
573 
574 static struct hw_type_defs s_hw_type_defs[] = {
575 	/* HW_TYPE_ASIC */
576 	{"asic", 1, 256, 32768},
577 	{"reserved", 0, 0, 0},
578 	{"reserved2", 0, 0, 0},
579 	{"reserved3", 0, 0, 0}
580 };
581 
582 static struct grc_param_defs s_grc_param_defs[] = {
583 	/* DBG_GRC_PARAM_DUMP_TSTORM */
584 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
585 
586 	/* DBG_GRC_PARAM_DUMP_MSTORM */
587 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
588 
589 	/* DBG_GRC_PARAM_DUMP_USTORM */
590 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
591 
592 	/* DBG_GRC_PARAM_DUMP_XSTORM */
593 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
594 
595 	/* DBG_GRC_PARAM_DUMP_YSTORM */
596 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
597 
598 	/* DBG_GRC_PARAM_DUMP_PSTORM */
599 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
600 
601 	/* DBG_GRC_PARAM_DUMP_REGS */
602 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
603 
604 	/* DBG_GRC_PARAM_DUMP_RAM */
605 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
606 
607 	/* DBG_GRC_PARAM_DUMP_PBUF */
608 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
609 
610 	/* DBG_GRC_PARAM_DUMP_IOR */
611 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
612 
613 	/* DBG_GRC_PARAM_DUMP_VFC */
614 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
615 
616 	/* DBG_GRC_PARAM_DUMP_CM_CTX */
617 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
618 
619 	/* DBG_GRC_PARAM_DUMP_ILT */
620 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
621 
622 	/* DBG_GRC_PARAM_DUMP_RSS */
623 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
624 
625 	/* DBG_GRC_PARAM_DUMP_CAU */
626 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
627 
628 	/* DBG_GRC_PARAM_DUMP_QM */
629 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
630 
631 	/* DBG_GRC_PARAM_DUMP_MCP */
632 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
633 
634 	/* DBG_GRC_PARAM_DUMP_DORQ */
635 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
636 
637 	/* DBG_GRC_PARAM_DUMP_CFC */
638 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
639 
640 	/* DBG_GRC_PARAM_DUMP_IGU */
641 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
642 
643 	/* DBG_GRC_PARAM_DUMP_BRB */
644 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
645 
646 	/* DBG_GRC_PARAM_DUMP_BTB */
647 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
648 
649 	/* DBG_GRC_PARAM_DUMP_BMB */
650 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
651 
652 	/* DBG_GRC_PARAM_RESERVED1 */
653 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
654 
655 	/* DBG_GRC_PARAM_DUMP_MULD */
656 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
657 
658 	/* DBG_GRC_PARAM_DUMP_PRS */
659 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
660 
661 	/* DBG_GRC_PARAM_DUMP_DMAE */
662 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
663 
664 	/* DBG_GRC_PARAM_DUMP_TM */
665 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
666 
667 	/* DBG_GRC_PARAM_DUMP_SDM */
668 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
669 
670 	/* DBG_GRC_PARAM_DUMP_DIF */
671 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
672 
673 	/* DBG_GRC_PARAM_DUMP_STATIC */
674 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
675 
676 	/* DBG_GRC_PARAM_UNSTALL */
677 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
678 
679 	/* DBG_GRC_PARAM_RESERVED2 */
680 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
681 
682 	/* DBG_GRC_PARAM_MCP_TRACE_META_SIZE */
683 	{{0, 0}, 1, 0xffffffff, false, true, 0, {0, 0}},
684 
685 	/* DBG_GRC_PARAM_EXCLUDE_ALL */
686 	{{0, 0}, 0, 1, true, false, 0, {0, 0}},
687 
688 	/* DBG_GRC_PARAM_CRASH */
689 	{{0, 0}, 0, 1, true, false, 0, {0, 0}},
690 
691 	/* DBG_GRC_PARAM_PARITY_SAFE */
692 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
693 
694 	/* DBG_GRC_PARAM_DUMP_CM */
695 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
696 
697 	/* DBG_GRC_PARAM_DUMP_PHY */
698 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
699 
700 	/* DBG_GRC_PARAM_NO_MCP */
701 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
702 
703 	/* DBG_GRC_PARAM_NO_FW_VER */
704 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
705 
706 	/* DBG_GRC_PARAM_RESERVED3 */
707 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
708 
709 	/* DBG_GRC_PARAM_DUMP_MCP_HW_DUMP */
710 	{{0, 1}, 0, 1, false, false, 0, {0, 1}},
711 
712 	/* DBG_GRC_PARAM_DUMP_ILT_CDUC */
713 	{{1, 1}, 0, 1, false, false, 0, {0, 0}},
714 
715 	/* DBG_GRC_PARAM_DUMP_ILT_CDUT */
716 	{{1, 1}, 0, 1, false, false, 0, {0, 0}},
717 
718 	/* DBG_GRC_PARAM_DUMP_CAU_EXT */
719 	{{0, 0}, 0, 1, false, false, 0, {1, 1}}
720 };
721 
722 static struct rss_mem_defs s_rss_mem_defs[] = {
723 	{"rss_mem_cid", "rss_cid", 0, 32,
724 	 {256, 320}},
725 
726 	{"rss_mem_key_msb", "rss_key", 1024, 256,
727 	 {128, 208}},
728 
729 	{"rss_mem_key_lsb", "rss_key", 2048, 64,
730 	 {128, 208}},
731 
732 	{"rss_mem_info", "rss_info", 3072, 16,
733 	 {128, 208}},
734 
735 	{"rss_mem_ind", "rss_ind", 4096, 16,
736 	 {16384, 26624}}
737 };
738 
739 static struct vfc_ram_defs s_vfc_ram_defs[] = {
740 	{"vfc_ram_tt1", "vfc_ram", 0, 512},
741 	{"vfc_ram_mtt2", "vfc_ram", 512, 128},
742 	{"vfc_ram_stt2", "vfc_ram", 640, 32},
743 	{"vfc_ram_ro_vect", "vfc_ram", 672, 32}
744 };
745 
746 static struct big_ram_defs s_big_ram_defs[] = {
747 	{"BRB", MEM_GROUP_BRB_MEM, MEM_GROUP_BRB_RAM, DBG_GRC_PARAM_DUMP_BRB,
748 	 BRB_REG_BIG_RAM_ADDRESS, BRB_REG_BIG_RAM_DATA,
749 	 MISC_REG_BLOCK_256B_EN, {0, 0},
750 	 {153600, 180224}},
751 
752 	{"BTB", MEM_GROUP_BTB_MEM, MEM_GROUP_BTB_RAM, DBG_GRC_PARAM_DUMP_BTB,
753 	 BTB_REG_BIG_RAM_ADDRESS, BTB_REG_BIG_RAM_DATA,
754 	 MISC_REG_BLOCK_256B_EN, {0, 1},
755 	 {92160, 117760}},
756 
757 	{"BMB", MEM_GROUP_BMB_MEM, MEM_GROUP_BMB_RAM, DBG_GRC_PARAM_DUMP_BMB,
758 	 BMB_REG_BIG_RAM_ADDRESS, BMB_REG_BIG_RAM_DATA,
759 	 MISCS_REG_BLOCK_256B_EN, {0, 0},
760 	 {36864, 36864}}
761 };
762 
763 static struct rbc_reset_defs s_rbc_reset_defs[] = {
764 	{MISCS_REG_RESET_PL_HV,
765 	 {0x0, 0x400}},
766 	{MISC_REG_RESET_PL_PDA_VMAIN_1,
767 	 {0x4404040, 0x4404040}},
768 	{MISC_REG_RESET_PL_PDA_VMAIN_2,
769 	 {0x7, 0x7c00007}},
770 	{MISC_REG_RESET_PL_PDA_VAUX,
771 	 {0x2, 0x2}},
772 };
773 
774 static struct phy_defs s_phy_defs[] = {
775 	{"nw_phy", NWS_REG_NWS_CMU_K2,
776 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_7_0_K2_E5,
777 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_15_8_K2_E5,
778 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_7_0_K2_E5,
779 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_11_8_K2_E5},
780 	{"sgmii_phy", MS_REG_MS_CMU_K2_E5,
781 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X132_K2_E5,
782 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X133_K2_E5,
783 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X130_K2_E5,
784 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X131_K2_E5},
785 	{"pcie_phy0", PHY_PCIE_REG_PHY0_K2_E5,
786 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2_E5,
787 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2_E5,
788 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2_E5,
789 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2_E5},
790 	{"pcie_phy1", PHY_PCIE_REG_PHY1_K2_E5,
791 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2_E5,
792 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2_E5,
793 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2_E5,
794 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2_E5},
795 };
796 
797 static struct split_type_defs s_split_type_defs[] = {
798 	/* SPLIT_TYPE_NONE */
799 	{"eng"},
800 
801 	/* SPLIT_TYPE_PORT */
802 	{"port"},
803 
804 	/* SPLIT_TYPE_PF */
805 	{"pf"},
806 
807 	/* SPLIT_TYPE_PORT_PF */
808 	{"port"},
809 
810 	/* SPLIT_TYPE_VF */
811 	{"vf"}
812 };
813 
814 /**************************** Private Functions ******************************/
815 
816 /* Reads and returns a single dword from the specified unaligned buffer */
817 static u32 qed_read_unaligned_dword(u8 *buf)
818 {
819 	u32 dword;
820 
821 	memcpy((u8 *)&dword, buf, sizeof(dword));
822 	return dword;
823 }
824 
825 /* Sets the value of the specified GRC param */
826 static void qed_grc_set_param(struct qed_hwfn *p_hwfn,
827 			      enum dbg_grc_params grc_param, u32 val)
828 {
829 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
830 
831 	dev_data->grc.param_val[grc_param] = val;
832 }
833 
834 /* Returns the value of the specified GRC param */
835 static u32 qed_grc_get_param(struct qed_hwfn *p_hwfn,
836 			     enum dbg_grc_params grc_param)
837 {
838 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
839 
840 	return dev_data->grc.param_val[grc_param];
841 }
842 
843 /* Initializes the GRC parameters */
844 static void qed_dbg_grc_init_params(struct qed_hwfn *p_hwfn)
845 {
846 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
847 
848 	if (!dev_data->grc.params_initialized) {
849 		qed_dbg_grc_set_params_default(p_hwfn);
850 		dev_data->grc.params_initialized = 1;
851 	}
852 }
853 
854 /* Sets pointer and size for the specified binary buffer type */
855 static void qed_set_dbg_bin_buf(struct qed_hwfn *p_hwfn,
856 				enum bin_dbg_buffer_type buf_type,
857 				const u32 *ptr, u32 size)
858 {
859 	struct virt_mem_desc *buf = &p_hwfn->dbg_arrays[buf_type];
860 
861 	buf->ptr = (void *)ptr;
862 	buf->size = size;
863 }
864 
865 /* Initializes debug data for the specified device */
866 static enum dbg_status qed_dbg_dev_init(struct qed_hwfn *p_hwfn)
867 {
868 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
869 	u8 num_pfs = 0, max_pfs_per_port = 0;
870 
871 	if (dev_data->initialized)
872 		return DBG_STATUS_OK;
873 
874 	/* Set chip */
875 	if (QED_IS_K2(p_hwfn->cdev)) {
876 		dev_data->chip_id = CHIP_K2;
877 		dev_data->mode_enable[MODE_K2] = 1;
878 		dev_data->num_vfs = MAX_NUM_VFS_K2;
879 		num_pfs = MAX_NUM_PFS_K2;
880 		max_pfs_per_port = MAX_NUM_PFS_K2 / 2;
881 	} else if (QED_IS_BB_B0(p_hwfn->cdev)) {
882 		dev_data->chip_id = CHIP_BB;
883 		dev_data->mode_enable[MODE_BB] = 1;
884 		dev_data->num_vfs = MAX_NUM_VFS_BB;
885 		num_pfs = MAX_NUM_PFS_BB;
886 		max_pfs_per_port = MAX_NUM_PFS_BB;
887 	} else {
888 		return DBG_STATUS_UNKNOWN_CHIP;
889 	}
890 
891 	/* Set HW type */
892 	dev_data->hw_type = HW_TYPE_ASIC;
893 	dev_data->mode_enable[MODE_ASIC] = 1;
894 
895 	/* Set port mode */
896 	switch (p_hwfn->cdev->num_ports_in_engine) {
897 	case 1:
898 		dev_data->mode_enable[MODE_PORTS_PER_ENG_1] = 1;
899 		break;
900 	case 2:
901 		dev_data->mode_enable[MODE_PORTS_PER_ENG_2] = 1;
902 		break;
903 	case 4:
904 		dev_data->mode_enable[MODE_PORTS_PER_ENG_4] = 1;
905 		break;
906 	}
907 
908 	/* Set 100G mode */
909 	if (QED_IS_CMT(p_hwfn->cdev))
910 		dev_data->mode_enable[MODE_100G] = 1;
911 
912 	/* Set number of ports */
913 	if (dev_data->mode_enable[MODE_PORTS_PER_ENG_1] ||
914 	    dev_data->mode_enable[MODE_100G])
915 		dev_data->num_ports = 1;
916 	else if (dev_data->mode_enable[MODE_PORTS_PER_ENG_2])
917 		dev_data->num_ports = 2;
918 	else if (dev_data->mode_enable[MODE_PORTS_PER_ENG_4])
919 		dev_data->num_ports = 4;
920 
921 	/* Set number of PFs per port */
922 	dev_data->num_pfs_per_port = min_t(u32,
923 					   num_pfs / dev_data->num_ports,
924 					   max_pfs_per_port);
925 
926 	/* Initializes the GRC parameters */
927 	qed_dbg_grc_init_params(p_hwfn);
928 
929 	dev_data->use_dmae = true;
930 	dev_data->initialized = 1;
931 
932 	return DBG_STATUS_OK;
933 }
934 
935 static const struct dbg_block *get_dbg_block(struct qed_hwfn *p_hwfn,
936 					     enum block_id block_id)
937 {
938 	const struct dbg_block *dbg_block;
939 
940 	dbg_block = p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS].ptr;
941 	return dbg_block + block_id;
942 }
943 
944 static const struct dbg_block_chip *qed_get_dbg_block_per_chip(struct qed_hwfn
945 							       *p_hwfn,
946 							       enum block_id
947 							       block_id)
948 {
949 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
950 
951 	return (const struct dbg_block_chip *)
952 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_CHIP_DATA].ptr +
953 	    block_id * MAX_CHIP_IDS + dev_data->chip_id;
954 }
955 
956 static const struct dbg_reset_reg *qed_get_dbg_reset_reg(struct qed_hwfn
957 							 *p_hwfn,
958 							 u8 reset_reg_id)
959 {
960 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
961 
962 	return (const struct dbg_reset_reg *)
963 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_RESET_REGS].ptr +
964 	    reset_reg_id * MAX_CHIP_IDS + dev_data->chip_id;
965 }
966 
967 /* Reads the FW info structure for the specified Storm from the chip,
968  * and writes it to the specified fw_info pointer.
969  */
970 static void qed_read_storm_fw_info(struct qed_hwfn *p_hwfn,
971 				   struct qed_ptt *p_ptt,
972 				   u8 storm_id, struct fw_info *fw_info)
973 {
974 	struct storm_defs *storm = &s_storm_defs[storm_id];
975 	struct fw_info_location fw_info_location;
976 	u32 addr, i, size, *dest;
977 
978 	memset(&fw_info_location, 0, sizeof(fw_info_location));
979 	memset(fw_info, 0, sizeof(*fw_info));
980 
981 	/* Read first the address that points to fw_info location.
982 	 * The address is located in the last line of the Storm RAM.
983 	 */
984 	addr = storm->sem_fast_mem_addr + SEM_FAST_REG_INT_RAM +
985 	    DWORDS_TO_BYTES(SEM_FAST_REG_INT_RAM_SIZE) -
986 	    sizeof(fw_info_location);
987 
988 	dest = (u32 *)&fw_info_location;
989 	size = BYTES_TO_DWORDS(sizeof(fw_info_location));
990 
991 	for (i = 0; i < size; i++, addr += BYTES_IN_DWORD)
992 		dest[i] = qed_rd(p_hwfn, p_ptt, addr);
993 
994 	/* qed_rq() fetches data in CPU byteorder. Swap it back to
995 	 * the device's to get right structure layout.
996 	 */
997 	cpu_to_le32_array(dest, size);
998 
999 	/* Read FW version info from Storm RAM */
1000 	size = le32_to_cpu(fw_info_location.size);
1001 	if (!size || size > sizeof(*fw_info))
1002 		return;
1003 
1004 	addr = le32_to_cpu(fw_info_location.grc_addr);
1005 	dest = (u32 *)fw_info;
1006 	size = BYTES_TO_DWORDS(size);
1007 
1008 	for (i = 0; i < size; i++, addr += BYTES_IN_DWORD)
1009 		dest[i] = qed_rd(p_hwfn, p_ptt, addr);
1010 
1011 	cpu_to_le32_array(dest, size);
1012 }
1013 
1014 /* Dumps the specified string to the specified buffer.
1015  * Returns the dumped size in bytes.
1016  */
1017 static u32 qed_dump_str(char *dump_buf, bool dump, const char *str)
1018 {
1019 	if (dump)
1020 		strcpy(dump_buf, str);
1021 
1022 	return (u32)strlen(str) + 1;
1023 }
1024 
1025 /* Dumps zeros to align the specified buffer to dwords.
1026  * Returns the dumped size in bytes.
1027  */
1028 static u32 qed_dump_align(char *dump_buf, bool dump, u32 byte_offset)
1029 {
1030 	u8 offset_in_dword, align_size;
1031 
1032 	offset_in_dword = (u8)(byte_offset & 0x3);
1033 	align_size = offset_in_dword ? BYTES_IN_DWORD - offset_in_dword : 0;
1034 
1035 	if (dump && align_size)
1036 		memset(dump_buf, 0, align_size);
1037 
1038 	return align_size;
1039 }
1040 
1041 /* Writes the specified string param to the specified buffer.
1042  * Returns the dumped size in dwords.
1043  */
1044 static u32 qed_dump_str_param(u32 *dump_buf,
1045 			      bool dump,
1046 			      const char *param_name, const char *param_val)
1047 {
1048 	char *char_buf = (char *)dump_buf;
1049 	u32 offset = 0;
1050 
1051 	/* Dump param name */
1052 	offset += qed_dump_str(char_buf + offset, dump, param_name);
1053 
1054 	/* Indicate a string param value */
1055 	if (dump)
1056 		*(char_buf + offset) = 1;
1057 	offset++;
1058 
1059 	/* Dump param value */
1060 	offset += qed_dump_str(char_buf + offset, dump, param_val);
1061 
1062 	/* Align buffer to next dword */
1063 	offset += qed_dump_align(char_buf + offset, dump, offset);
1064 
1065 	return BYTES_TO_DWORDS(offset);
1066 }
1067 
1068 /* Writes the specified numeric param to the specified buffer.
1069  * Returns the dumped size in dwords.
1070  */
1071 static u32 qed_dump_num_param(u32 *dump_buf,
1072 			      bool dump, const char *param_name, u32 param_val)
1073 {
1074 	char *char_buf = (char *)dump_buf;
1075 	u32 offset = 0;
1076 
1077 	/* Dump param name */
1078 	offset += qed_dump_str(char_buf + offset, dump, param_name);
1079 
1080 	/* Indicate a numeric param value */
1081 	if (dump)
1082 		*(char_buf + offset) = 0;
1083 	offset++;
1084 
1085 	/* Align buffer to next dword */
1086 	offset += qed_dump_align(char_buf + offset, dump, offset);
1087 
1088 	/* Dump param value (and change offset from bytes to dwords) */
1089 	offset = BYTES_TO_DWORDS(offset);
1090 	if (dump)
1091 		*(dump_buf + offset) = param_val;
1092 	offset++;
1093 
1094 	return offset;
1095 }
1096 
1097 /* Reads the FW version and writes it as a param to the specified buffer.
1098  * Returns the dumped size in dwords.
1099  */
1100 static u32 qed_dump_fw_ver_param(struct qed_hwfn *p_hwfn,
1101 				 struct qed_ptt *p_ptt,
1102 				 u32 *dump_buf, bool dump)
1103 {
1104 	char fw_ver_str[16] = EMPTY_FW_VERSION_STR;
1105 	char fw_img_str[16] = EMPTY_FW_IMAGE_STR;
1106 	struct fw_info fw_info = { {0}, {0} };
1107 	u32 offset = 0;
1108 
1109 	if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
1110 		/* Read FW info from chip */
1111 		qed_read_fw_info(p_hwfn, p_ptt, &fw_info);
1112 
1113 		/* Create FW version/image strings */
1114 		if (snprintf(fw_ver_str, sizeof(fw_ver_str),
1115 			     "%d_%d_%d_%d", fw_info.ver.num.major,
1116 			     fw_info.ver.num.minor, fw_info.ver.num.rev,
1117 			     fw_info.ver.num.eng) < 0)
1118 			DP_NOTICE(p_hwfn,
1119 				  "Unexpected debug error: invalid FW version string\n");
1120 		switch (fw_info.ver.image_id) {
1121 		case FW_IMG_MAIN:
1122 			strcpy(fw_img_str, "main");
1123 			break;
1124 		default:
1125 			strcpy(fw_img_str, "unknown");
1126 			break;
1127 		}
1128 	}
1129 
1130 	/* Dump FW version, image and timestamp */
1131 	offset += qed_dump_str_param(dump_buf + offset,
1132 				     dump, "fw-version", fw_ver_str);
1133 	offset += qed_dump_str_param(dump_buf + offset,
1134 				     dump, "fw-image", fw_img_str);
1135 	offset += qed_dump_num_param(dump_buf + offset, dump, "fw-timestamp",
1136 				     le32_to_cpu(fw_info.ver.timestamp));
1137 
1138 	return offset;
1139 }
1140 
1141 /* Reads the MFW version and writes it as a param to the specified buffer.
1142  * Returns the dumped size in dwords.
1143  */
1144 static u32 qed_dump_mfw_ver_param(struct qed_hwfn *p_hwfn,
1145 				  struct qed_ptt *p_ptt,
1146 				  u32 *dump_buf, bool dump)
1147 {
1148 	char mfw_ver_str[16] = EMPTY_FW_VERSION_STR;
1149 
1150 	if (dump &&
1151 	    !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
1152 		u32 global_section_offsize, global_section_addr, mfw_ver;
1153 		u32 public_data_addr, global_section_offsize_addr;
1154 
1155 		/* Find MCP public data GRC address. Needs to be ORed with
1156 		 * MCP_REG_SCRATCH due to a HW bug.
1157 		 */
1158 		public_data_addr = qed_rd(p_hwfn,
1159 					  p_ptt,
1160 					  MISC_REG_SHARED_MEM_ADDR) |
1161 				   MCP_REG_SCRATCH;
1162 
1163 		/* Find MCP public global section offset */
1164 		global_section_offsize_addr = public_data_addr +
1165 					      offsetof(struct mcp_public_data,
1166 						       sections) +
1167 					      sizeof(offsize_t) * PUBLIC_GLOBAL;
1168 		global_section_offsize = qed_rd(p_hwfn, p_ptt,
1169 						global_section_offsize_addr);
1170 		global_section_addr =
1171 			MCP_REG_SCRATCH +
1172 			(global_section_offsize & OFFSIZE_OFFSET_MASK) * 4;
1173 
1174 		/* Read MFW version from MCP public global section */
1175 		mfw_ver = qed_rd(p_hwfn, p_ptt,
1176 				 global_section_addr +
1177 				 offsetof(struct public_global, mfw_ver));
1178 
1179 		/* Dump MFW version param */
1180 		if (snprintf(mfw_ver_str, sizeof(mfw_ver_str), "%d_%d_%d_%d",
1181 			     (u8)(mfw_ver >> 24), (u8)(mfw_ver >> 16),
1182 			     (u8)(mfw_ver >> 8), (u8)mfw_ver) < 0)
1183 			DP_NOTICE(p_hwfn,
1184 				  "Unexpected debug error: invalid MFW version string\n");
1185 	}
1186 
1187 	return qed_dump_str_param(dump_buf, dump, "mfw-version", mfw_ver_str);
1188 }
1189 
1190 /* Reads the chip revision from the chip and writes it as a param to the
1191  * specified buffer. Returns the dumped size in dwords.
1192  */
1193 static u32 qed_dump_chip_revision_param(struct qed_hwfn *p_hwfn,
1194 					struct qed_ptt *p_ptt,
1195 					u32 *dump_buf, bool dump)
1196 {
1197 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1198 	char param_str[3] = "??";
1199 
1200 	if (dev_data->hw_type == HW_TYPE_ASIC) {
1201 		u32 chip_rev, chip_metal;
1202 
1203 		chip_rev = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_REV);
1204 		chip_metal = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_METAL);
1205 
1206 		param_str[0] = 'a' + (u8)chip_rev;
1207 		param_str[1] = '0' + (u8)chip_metal;
1208 	}
1209 
1210 	return qed_dump_str_param(dump_buf, dump, "chip-revision", param_str);
1211 }
1212 
1213 /* Writes a section header to the specified buffer.
1214  * Returns the dumped size in dwords.
1215  */
1216 static u32 qed_dump_section_hdr(u32 *dump_buf,
1217 				bool dump, const char *name, u32 num_params)
1218 {
1219 	return qed_dump_num_param(dump_buf, dump, name, num_params);
1220 }
1221 
1222 /* Writes the common global params to the specified buffer.
1223  * Returns the dumped size in dwords.
1224  */
1225 static u32 qed_dump_common_global_params(struct qed_hwfn *p_hwfn,
1226 					 struct qed_ptt *p_ptt,
1227 					 u32 *dump_buf,
1228 					 bool dump,
1229 					 u8 num_specific_global_params)
1230 {
1231 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1232 	u32 offset = 0;
1233 	u8 num_params;
1234 
1235 	/* Dump global params section header */
1236 	num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params +
1237 		(dev_data->chip_id == CHIP_BB ? 1 : 0);
1238 	offset += qed_dump_section_hdr(dump_buf + offset,
1239 				       dump, "global_params", num_params);
1240 
1241 	/* Store params */
1242 	offset += qed_dump_fw_ver_param(p_hwfn, p_ptt, dump_buf + offset, dump);
1243 	offset += qed_dump_mfw_ver_param(p_hwfn,
1244 					 p_ptt, dump_buf + offset, dump);
1245 	offset += qed_dump_chip_revision_param(p_hwfn,
1246 					       p_ptt, dump_buf + offset, dump);
1247 	offset += qed_dump_num_param(dump_buf + offset,
1248 				     dump, "tools-version", TOOLS_VERSION);
1249 	offset += qed_dump_str_param(dump_buf + offset,
1250 				     dump,
1251 				     "chip",
1252 				     s_chip_defs[dev_data->chip_id].name);
1253 	offset += qed_dump_str_param(dump_buf + offset,
1254 				     dump,
1255 				     "platform",
1256 				     s_hw_type_defs[dev_data->hw_type].name);
1257 	offset += qed_dump_num_param(dump_buf + offset,
1258 				     dump, "pci-func", p_hwfn->abs_pf_id);
1259 	if (dev_data->chip_id == CHIP_BB)
1260 		offset += qed_dump_num_param(dump_buf + offset,
1261 					     dump, "path", QED_PATH_ID(p_hwfn));
1262 
1263 	return offset;
1264 }
1265 
1266 /* Writes the "last" section (including CRC) to the specified buffer at the
1267  * given offset. Returns the dumped size in dwords.
1268  */
1269 static u32 qed_dump_last_section(u32 *dump_buf, u32 offset, bool dump)
1270 {
1271 	u32 start_offset = offset;
1272 
1273 	/* Dump CRC section header */
1274 	offset += qed_dump_section_hdr(dump_buf + offset, dump, "last", 0);
1275 
1276 	/* Calculate CRC32 and add it to the dword after the "last" section */
1277 	if (dump)
1278 		*(dump_buf + offset) = ~crc32(0xffffffff,
1279 					      (u8 *)dump_buf,
1280 					      DWORDS_TO_BYTES(offset));
1281 
1282 	offset++;
1283 
1284 	return offset - start_offset;
1285 }
1286 
1287 /* Update blocks reset state  */
1288 static void qed_update_blocks_reset_state(struct qed_hwfn *p_hwfn,
1289 					  struct qed_ptt *p_ptt)
1290 {
1291 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1292 	u32 reg_val[NUM_DBG_RESET_REGS] = { 0 };
1293 	u8 rst_reg_id;
1294 	u32 blk_id;
1295 
1296 	/* Read reset registers */
1297 	for (rst_reg_id = 0; rst_reg_id < NUM_DBG_RESET_REGS; rst_reg_id++) {
1298 		const struct dbg_reset_reg *rst_reg;
1299 		bool rst_reg_removed;
1300 		u32 rst_reg_addr;
1301 
1302 		rst_reg = qed_get_dbg_reset_reg(p_hwfn, rst_reg_id);
1303 		rst_reg_removed = GET_FIELD(rst_reg->data,
1304 					    DBG_RESET_REG_IS_REMOVED);
1305 		rst_reg_addr = DWORDS_TO_BYTES(GET_FIELD(rst_reg->data,
1306 							 DBG_RESET_REG_ADDR));
1307 
1308 		if (!rst_reg_removed)
1309 			reg_val[rst_reg_id] = qed_rd(p_hwfn, p_ptt,
1310 						     rst_reg_addr);
1311 	}
1312 
1313 	/* Check if blocks are in reset */
1314 	for (blk_id = 0; blk_id < NUM_PHYS_BLOCKS; blk_id++) {
1315 		const struct dbg_block_chip *blk;
1316 		bool has_rst_reg;
1317 		bool is_removed;
1318 
1319 		blk = qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)blk_id);
1320 		is_removed = GET_FIELD(blk->flags, DBG_BLOCK_CHIP_IS_REMOVED);
1321 		has_rst_reg = GET_FIELD(blk->flags,
1322 					DBG_BLOCK_CHIP_HAS_RESET_REG);
1323 
1324 		if (!is_removed && has_rst_reg)
1325 			dev_data->block_in_reset[blk_id] =
1326 			    !(reg_val[blk->reset_reg_id] &
1327 			      BIT(blk->reset_reg_bit_offset));
1328 	}
1329 }
1330 
1331 /* is_mode_match recursive function */
1332 static bool qed_is_mode_match_rec(struct qed_hwfn *p_hwfn,
1333 				  u16 *modes_buf_offset, u8 rec_depth)
1334 {
1335 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1336 	u8 *dbg_array;
1337 	bool arg1, arg2;
1338 	u8 tree_val;
1339 
1340 	if (rec_depth > MAX_RECURSION_DEPTH) {
1341 		DP_NOTICE(p_hwfn,
1342 			  "Unexpected error: is_mode_match_rec exceeded the max recursion depth. This is probably due to a corrupt init/debug buffer.\n");
1343 		return false;
1344 	}
1345 
1346 	/* Get next element from modes tree buffer */
1347 	dbg_array = p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr;
1348 	tree_val = dbg_array[(*modes_buf_offset)++];
1349 
1350 	switch (tree_val) {
1351 	case INIT_MODE_OP_NOT:
1352 		return !qed_is_mode_match_rec(p_hwfn,
1353 					      modes_buf_offset, rec_depth + 1);
1354 	case INIT_MODE_OP_OR:
1355 	case INIT_MODE_OP_AND:
1356 		arg1 = qed_is_mode_match_rec(p_hwfn,
1357 					     modes_buf_offset, rec_depth + 1);
1358 		arg2 = qed_is_mode_match_rec(p_hwfn,
1359 					     modes_buf_offset, rec_depth + 1);
1360 		return (tree_val == INIT_MODE_OP_OR) ? (arg1 ||
1361 							arg2) : (arg1 && arg2);
1362 	default:
1363 		return dev_data->mode_enable[tree_val - MAX_INIT_MODE_OPS] > 0;
1364 	}
1365 }
1366 
1367 /* Returns true if the mode (specified using modes_buf_offset) is enabled */
1368 static bool qed_is_mode_match(struct qed_hwfn *p_hwfn, u16 *modes_buf_offset)
1369 {
1370 	return qed_is_mode_match_rec(p_hwfn, modes_buf_offset, 0);
1371 }
1372 
1373 /* Enable / disable the Debug block */
1374 static void qed_bus_enable_dbg_block(struct qed_hwfn *p_hwfn,
1375 				     struct qed_ptt *p_ptt, bool enable)
1376 {
1377 	qed_wr(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON, enable ? 1 : 0);
1378 }
1379 
1380 /* Resets the Debug block */
1381 static void qed_bus_reset_dbg_block(struct qed_hwfn *p_hwfn,
1382 				    struct qed_ptt *p_ptt)
1383 {
1384 	u32 reset_reg_addr, old_reset_reg_val, new_reset_reg_val;
1385 	const struct dbg_reset_reg *reset_reg;
1386 	const struct dbg_block_chip *block;
1387 
1388 	block = qed_get_dbg_block_per_chip(p_hwfn, BLOCK_DBG);
1389 	reset_reg = qed_get_dbg_reset_reg(p_hwfn, block->reset_reg_id);
1390 	reset_reg_addr =
1391 	    DWORDS_TO_BYTES(GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR));
1392 
1393 	old_reset_reg_val = qed_rd(p_hwfn, p_ptt, reset_reg_addr);
1394 	new_reset_reg_val =
1395 	    old_reset_reg_val & ~BIT(block->reset_reg_bit_offset);
1396 
1397 	qed_wr(p_hwfn, p_ptt, reset_reg_addr, new_reset_reg_val);
1398 	qed_wr(p_hwfn, p_ptt, reset_reg_addr, old_reset_reg_val);
1399 }
1400 
1401 /* Enable / disable Debug Bus clients according to the specified mask
1402  * (1 = enable, 0 = disable).
1403  */
1404 static void qed_bus_enable_clients(struct qed_hwfn *p_hwfn,
1405 				   struct qed_ptt *p_ptt, u32 client_mask)
1406 {
1407 	qed_wr(p_hwfn, p_ptt, DBG_REG_CLIENT_ENABLE, client_mask);
1408 }
1409 
1410 static void qed_bus_config_dbg_line(struct qed_hwfn *p_hwfn,
1411 				    struct qed_ptt *p_ptt,
1412 				    enum block_id block_id,
1413 				    u8 line_id,
1414 				    u8 enable_mask,
1415 				    u8 right_shift,
1416 				    u8 force_valid_mask, u8 force_frame_mask)
1417 {
1418 	const struct dbg_block_chip *block =
1419 		qed_get_dbg_block_per_chip(p_hwfn, block_id);
1420 
1421 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_select_reg_addr),
1422 	       line_id);
1423 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_dword_enable_reg_addr),
1424 	       enable_mask);
1425 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_shift_reg_addr),
1426 	       right_shift);
1427 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_valid_reg_addr),
1428 	       force_valid_mask);
1429 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_frame_reg_addr),
1430 	       force_frame_mask);
1431 }
1432 
1433 /* Disable debug bus in all blocks */
1434 static void qed_bus_disable_blocks(struct qed_hwfn *p_hwfn,
1435 				   struct qed_ptt *p_ptt)
1436 {
1437 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1438 	u32 block_id;
1439 
1440 	/* Disable all blocks */
1441 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
1442 		const struct dbg_block_chip *block_per_chip =
1443 		    qed_get_dbg_block_per_chip(p_hwfn,
1444 					       (enum block_id)block_id);
1445 
1446 		if (GET_FIELD(block_per_chip->flags,
1447 			      DBG_BLOCK_CHIP_IS_REMOVED) ||
1448 		    dev_data->block_in_reset[block_id])
1449 			continue;
1450 
1451 		/* Disable debug bus */
1452 		if (GET_FIELD(block_per_chip->flags,
1453 			      DBG_BLOCK_CHIP_HAS_DBG_BUS)) {
1454 			u32 dbg_en_addr =
1455 				block_per_chip->dbg_dword_enable_reg_addr;
1456 			u16 modes_buf_offset =
1457 			    GET_FIELD(block_per_chip->dbg_bus_mode.data,
1458 				      DBG_MODE_HDR_MODES_BUF_OFFSET);
1459 			bool eval_mode =
1460 			    GET_FIELD(block_per_chip->dbg_bus_mode.data,
1461 				      DBG_MODE_HDR_EVAL_MODE) > 0;
1462 
1463 			if (!eval_mode ||
1464 			    qed_is_mode_match(p_hwfn, &modes_buf_offset))
1465 				qed_wr(p_hwfn, p_ptt,
1466 				       DWORDS_TO_BYTES(dbg_en_addr),
1467 				       0);
1468 		}
1469 	}
1470 }
1471 
1472 /* Returns true if the specified entity (indicated by GRC param) should be
1473  * included in the dump, false otherwise.
1474  */
1475 static bool qed_grc_is_included(struct qed_hwfn *p_hwfn,
1476 				enum dbg_grc_params grc_param)
1477 {
1478 	return qed_grc_get_param(p_hwfn, grc_param) > 0;
1479 }
1480 
1481 /* Returns the storm_id that matches the specified Storm letter,
1482  * or MAX_DBG_STORMS if invalid storm letter.
1483  */
1484 static enum dbg_storms qed_get_id_from_letter(char storm_letter)
1485 {
1486 	u8 storm_id;
1487 
1488 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++)
1489 		if (s_storm_defs[storm_id].letter == storm_letter)
1490 			return (enum dbg_storms)storm_id;
1491 
1492 	return MAX_DBG_STORMS;
1493 }
1494 
1495 /* Returns true of the specified Storm should be included in the dump, false
1496  * otherwise.
1497  */
1498 static bool qed_grc_is_storm_included(struct qed_hwfn *p_hwfn,
1499 				      enum dbg_storms storm)
1500 {
1501 	return qed_grc_get_param(p_hwfn, (enum dbg_grc_params)storm) > 0;
1502 }
1503 
1504 /* Returns true if the specified memory should be included in the dump, false
1505  * otherwise.
1506  */
1507 static bool qed_grc_is_mem_included(struct qed_hwfn *p_hwfn,
1508 				    enum block_id block_id, u8 mem_group_id)
1509 {
1510 	const struct dbg_block *block;
1511 	u8 i;
1512 
1513 	block = get_dbg_block(p_hwfn, block_id);
1514 
1515 	/* If the block is associated with a Storm, check Storm match */
1516 	if (block->associated_storm_letter) {
1517 		enum dbg_storms associated_storm_id =
1518 		    qed_get_id_from_letter(block->associated_storm_letter);
1519 
1520 		if (associated_storm_id == MAX_DBG_STORMS ||
1521 		    !qed_grc_is_storm_included(p_hwfn, associated_storm_id))
1522 			return false;
1523 	}
1524 
1525 	for (i = 0; i < NUM_BIG_RAM_TYPES; i++) {
1526 		struct big_ram_defs *big_ram = &s_big_ram_defs[i];
1527 
1528 		if (mem_group_id == big_ram->mem_group_id ||
1529 		    mem_group_id == big_ram->ram_mem_group_id)
1530 			return qed_grc_is_included(p_hwfn, big_ram->grc_param);
1531 	}
1532 
1533 	switch (mem_group_id) {
1534 	case MEM_GROUP_PXP_ILT:
1535 	case MEM_GROUP_PXP_MEM:
1536 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PXP);
1537 	case MEM_GROUP_RAM:
1538 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RAM);
1539 	case MEM_GROUP_PBUF:
1540 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PBUF);
1541 	case MEM_GROUP_CAU_MEM:
1542 	case MEM_GROUP_CAU_SB:
1543 	case MEM_GROUP_CAU_PI:
1544 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU);
1545 	case MEM_GROUP_CAU_MEM_EXT:
1546 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU_EXT);
1547 	case MEM_GROUP_QM_MEM:
1548 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_QM);
1549 	case MEM_GROUP_CFC_MEM:
1550 	case MEM_GROUP_CONN_CFC_MEM:
1551 	case MEM_GROUP_TASK_CFC_MEM:
1552 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CFC) ||
1553 		       qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX);
1554 	case MEM_GROUP_DORQ_MEM:
1555 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DORQ);
1556 	case MEM_GROUP_IGU_MEM:
1557 	case MEM_GROUP_IGU_MSIX:
1558 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IGU);
1559 	case MEM_GROUP_MULD_MEM:
1560 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MULD);
1561 	case MEM_GROUP_PRS_MEM:
1562 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PRS);
1563 	case MEM_GROUP_DMAE_MEM:
1564 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DMAE);
1565 	case MEM_GROUP_TM_MEM:
1566 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_TM);
1567 	case MEM_GROUP_SDM_MEM:
1568 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_SDM);
1569 	case MEM_GROUP_TDIF_CTX:
1570 	case MEM_GROUP_RDIF_CTX:
1571 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DIF);
1572 	case MEM_GROUP_CM_MEM:
1573 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM);
1574 	case MEM_GROUP_IOR:
1575 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR);
1576 	default:
1577 		return true;
1578 	}
1579 }
1580 
1581 /* Stalls all Storms */
1582 static void qed_grc_stall_storms(struct qed_hwfn *p_hwfn,
1583 				 struct qed_ptt *p_ptt, bool stall)
1584 {
1585 	u32 reg_addr;
1586 	u8 storm_id;
1587 
1588 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
1589 		if (!qed_grc_is_storm_included(p_hwfn,
1590 					       (enum dbg_storms)storm_id))
1591 			continue;
1592 
1593 		reg_addr = s_storm_defs[storm_id].sem_fast_mem_addr +
1594 		    SEM_FAST_REG_STALL_0_BB_K2;
1595 		qed_wr(p_hwfn, p_ptt, reg_addr, stall ? 1 : 0);
1596 	}
1597 
1598 	msleep(STALL_DELAY_MS);
1599 }
1600 
1601 /* Takes all blocks out of reset. If rbc_only is true, only RBC clients are
1602  * taken out of reset.
1603  */
1604 static void qed_grc_unreset_blocks(struct qed_hwfn *p_hwfn,
1605 				   struct qed_ptt *p_ptt, bool rbc_only)
1606 {
1607 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1608 	u8 chip_id = dev_data->chip_id;
1609 	u32 i;
1610 
1611 	/* Take RBCs out of reset */
1612 	for (i = 0; i < ARRAY_SIZE(s_rbc_reset_defs); i++)
1613 		if (s_rbc_reset_defs[i].reset_val[dev_data->chip_id])
1614 			qed_wr(p_hwfn,
1615 			       p_ptt,
1616 			       s_rbc_reset_defs[i].reset_reg_addr +
1617 			       RESET_REG_UNRESET_OFFSET,
1618 			       s_rbc_reset_defs[i].reset_val[chip_id]);
1619 
1620 	if (!rbc_only) {
1621 		u32 reg_val[NUM_DBG_RESET_REGS] = { 0 };
1622 		u8 reset_reg_id;
1623 		u32 block_id;
1624 
1625 		/* Fill reset regs values */
1626 		for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
1627 			bool is_removed, has_reset_reg, unreset_before_dump;
1628 			const struct dbg_block_chip *block;
1629 
1630 			block = qed_get_dbg_block_per_chip(p_hwfn,
1631 							   (enum block_id)
1632 							   block_id);
1633 			is_removed =
1634 			    GET_FIELD(block->flags, DBG_BLOCK_CHIP_IS_REMOVED);
1635 			has_reset_reg =
1636 			    GET_FIELD(block->flags,
1637 				      DBG_BLOCK_CHIP_HAS_RESET_REG);
1638 			unreset_before_dump =
1639 			    GET_FIELD(block->flags,
1640 				      DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP);
1641 
1642 			if (!is_removed && has_reset_reg && unreset_before_dump)
1643 				reg_val[block->reset_reg_id] |=
1644 				    BIT(block->reset_reg_bit_offset);
1645 		}
1646 
1647 		/* Write reset registers */
1648 		for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS;
1649 		     reset_reg_id++) {
1650 			const struct dbg_reset_reg *reset_reg;
1651 			u32 reset_reg_addr;
1652 
1653 			reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id);
1654 
1655 			if (GET_FIELD
1656 			    (reset_reg->data, DBG_RESET_REG_IS_REMOVED))
1657 				continue;
1658 
1659 			if (reg_val[reset_reg_id]) {
1660 				reset_reg_addr =
1661 				    GET_FIELD(reset_reg->data,
1662 					      DBG_RESET_REG_ADDR);
1663 				qed_wr(p_hwfn,
1664 				       p_ptt,
1665 				       DWORDS_TO_BYTES(reset_reg_addr) +
1666 				       RESET_REG_UNRESET_OFFSET,
1667 				       reg_val[reset_reg_id]);
1668 			}
1669 		}
1670 	}
1671 }
1672 
1673 /* Returns the attention block data of the specified block */
1674 static const struct dbg_attn_block_type_data *
1675 qed_get_block_attn_data(struct qed_hwfn *p_hwfn,
1676 			enum block_id block_id, enum dbg_attn_type attn_type)
1677 {
1678 	const struct dbg_attn_block *base_attn_block_arr =
1679 	    (const struct dbg_attn_block *)
1680 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr;
1681 
1682 	return &base_attn_block_arr[block_id].per_type_data[attn_type];
1683 }
1684 
1685 /* Returns the attention registers of the specified block */
1686 static const struct dbg_attn_reg *
1687 qed_get_block_attn_regs(struct qed_hwfn *p_hwfn,
1688 			enum block_id block_id, enum dbg_attn_type attn_type,
1689 			u8 *num_attn_regs)
1690 {
1691 	const struct dbg_attn_block_type_data *block_type_data =
1692 	    qed_get_block_attn_data(p_hwfn, block_id, attn_type);
1693 
1694 	*num_attn_regs = block_type_data->num_regs;
1695 
1696 	return (const struct dbg_attn_reg *)
1697 		p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr +
1698 		block_type_data->regs_offset;
1699 }
1700 
1701 /* For each block, clear the status of all parities */
1702 static void qed_grc_clear_all_prty(struct qed_hwfn *p_hwfn,
1703 				   struct qed_ptt *p_ptt)
1704 {
1705 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1706 	const struct dbg_attn_reg *attn_reg_arr;
1707 	u8 reg_idx, num_attn_regs;
1708 	u32 block_id;
1709 
1710 	for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
1711 		if (dev_data->block_in_reset[block_id])
1712 			continue;
1713 
1714 		attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
1715 						       (enum block_id)block_id,
1716 						       ATTN_TYPE_PARITY,
1717 						       &num_attn_regs);
1718 
1719 		for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
1720 			const struct dbg_attn_reg *reg_data =
1721 				&attn_reg_arr[reg_idx];
1722 			u16 modes_buf_offset;
1723 			bool eval_mode;
1724 
1725 			/* Check mode */
1726 			eval_mode = GET_FIELD(reg_data->mode.data,
1727 					      DBG_MODE_HDR_EVAL_MODE) > 0;
1728 			modes_buf_offset =
1729 				GET_FIELD(reg_data->mode.data,
1730 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
1731 
1732 			/* If Mode match: clear parity status */
1733 			if (!eval_mode ||
1734 			    qed_is_mode_match(p_hwfn, &modes_buf_offset))
1735 				qed_rd(p_hwfn, p_ptt,
1736 				       DWORDS_TO_BYTES(reg_data->
1737 						       sts_clr_address));
1738 		}
1739 	}
1740 }
1741 
1742 /* Dumps GRC registers section header. Returns the dumped size in dwords.
1743  * the following parameters are dumped:
1744  * - count: no. of dumped entries
1745  * - split_type: split type
1746  * - split_id: split ID (dumped only if split_id != SPLIT_TYPE_NONE)
1747  * - reg_type_name: register type name (dumped only if reg_type_name != NULL)
1748  */
1749 static u32 qed_grc_dump_regs_hdr(u32 *dump_buf,
1750 				 bool dump,
1751 				 u32 num_reg_entries,
1752 				 enum init_split_types split_type,
1753 				 u8 split_id, const char *reg_type_name)
1754 {
1755 	u8 num_params = 2 +
1756 	    (split_type != SPLIT_TYPE_NONE ? 1 : 0) + (reg_type_name ? 1 : 0);
1757 	u32 offset = 0;
1758 
1759 	offset += qed_dump_section_hdr(dump_buf + offset,
1760 				       dump, "grc_regs", num_params);
1761 	offset += qed_dump_num_param(dump_buf + offset,
1762 				     dump, "count", num_reg_entries);
1763 	offset += qed_dump_str_param(dump_buf + offset,
1764 				     dump, "split",
1765 				     s_split_type_defs[split_type].name);
1766 	if (split_type != SPLIT_TYPE_NONE)
1767 		offset += qed_dump_num_param(dump_buf + offset,
1768 					     dump, "id", split_id);
1769 	if (reg_type_name)
1770 		offset += qed_dump_str_param(dump_buf + offset,
1771 					     dump, "type", reg_type_name);
1772 
1773 	return offset;
1774 }
1775 
1776 /* Reads the specified registers into the specified buffer.
1777  * The addr and len arguments are specified in dwords.
1778  */
1779 void qed_read_regs(struct qed_hwfn *p_hwfn,
1780 		   struct qed_ptt *p_ptt, u32 *buf, u32 addr, u32 len)
1781 {
1782 	u32 i;
1783 
1784 	for (i = 0; i < len; i++)
1785 		buf[i] = qed_rd(p_hwfn, p_ptt, DWORDS_TO_BYTES(addr + i));
1786 }
1787 
1788 /* Dumps the GRC registers in the specified address range.
1789  * Returns the dumped size in dwords.
1790  * The addr and len arguments are specified in dwords.
1791  */
1792 static u32 qed_grc_dump_addr_range(struct qed_hwfn *p_hwfn,
1793 				   struct qed_ptt *p_ptt,
1794 				   u32 *dump_buf,
1795 				   bool dump, u32 addr, u32 len, bool wide_bus,
1796 				   enum init_split_types split_type,
1797 				   u8 split_id)
1798 {
1799 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1800 	u8 port_id = 0, pf_id = 0, vf_id = 0, fid = 0;
1801 	bool read_using_dmae = false;
1802 	u32 thresh;
1803 
1804 	if (!dump)
1805 		return len;
1806 
1807 	switch (split_type) {
1808 	case SPLIT_TYPE_PORT:
1809 		port_id = split_id;
1810 		break;
1811 	case SPLIT_TYPE_PF:
1812 		pf_id = split_id;
1813 		break;
1814 	case SPLIT_TYPE_PORT_PF:
1815 		port_id = split_id / dev_data->num_pfs_per_port;
1816 		pf_id = port_id + dev_data->num_ports *
1817 		    (split_id % dev_data->num_pfs_per_port);
1818 		break;
1819 	case SPLIT_TYPE_VF:
1820 		vf_id = split_id;
1821 		break;
1822 	default:
1823 		break;
1824 	}
1825 
1826 	/* Try reading using DMAE */
1827 	if (dev_data->use_dmae && split_type != SPLIT_TYPE_VF &&
1828 	    (len >= s_hw_type_defs[dev_data->hw_type].dmae_thresh ||
1829 	     (PROTECT_WIDE_BUS && wide_bus))) {
1830 		struct qed_dmae_params dmae_params;
1831 
1832 		/* Set DMAE params */
1833 		memset(&dmae_params, 0, sizeof(dmae_params));
1834 		SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_COMPLETION_DST, 1);
1835 		switch (split_type) {
1836 		case SPLIT_TYPE_PORT:
1837 			SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID,
1838 				  1);
1839 			dmae_params.port_id = port_id;
1840 			break;
1841 		case SPLIT_TYPE_PF:
1842 			SET_FIELD(dmae_params.flags,
1843 				  QED_DMAE_PARAMS_SRC_PF_VALID, 1);
1844 			dmae_params.src_pfid = pf_id;
1845 			break;
1846 		case SPLIT_TYPE_PORT_PF:
1847 			SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID,
1848 				  1);
1849 			SET_FIELD(dmae_params.flags,
1850 				  QED_DMAE_PARAMS_SRC_PF_VALID, 1);
1851 			dmae_params.port_id = port_id;
1852 			dmae_params.src_pfid = pf_id;
1853 			break;
1854 		default:
1855 			break;
1856 		}
1857 
1858 		/* Execute DMAE command */
1859 		read_using_dmae = !qed_dmae_grc2host(p_hwfn,
1860 						     p_ptt,
1861 						     DWORDS_TO_BYTES(addr),
1862 						     (u64)(uintptr_t)(dump_buf),
1863 						     len, &dmae_params);
1864 		if (!read_using_dmae) {
1865 			dev_data->use_dmae = 0;
1866 			DP_VERBOSE(p_hwfn,
1867 				   QED_MSG_DEBUG,
1868 				   "Failed reading from chip using DMAE, using GRC instead\n");
1869 		}
1870 	}
1871 
1872 	if (read_using_dmae)
1873 		goto print_log;
1874 
1875 	/* If not read using DMAE, read using GRC */
1876 
1877 	/* Set pretend */
1878 	if (split_type != dev_data->pretend.split_type ||
1879 	    split_id != dev_data->pretend.split_id) {
1880 		switch (split_type) {
1881 		case SPLIT_TYPE_PORT:
1882 			qed_port_pretend(p_hwfn, p_ptt, port_id);
1883 			break;
1884 		case SPLIT_TYPE_PF:
1885 			fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
1886 					  pf_id);
1887 			qed_fid_pretend(p_hwfn, p_ptt, fid);
1888 			break;
1889 		case SPLIT_TYPE_PORT_PF:
1890 			fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
1891 					  pf_id);
1892 			qed_port_fid_pretend(p_hwfn, p_ptt, port_id, fid);
1893 			break;
1894 		case SPLIT_TYPE_VF:
1895 			fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFVALID, 1)
1896 			      | FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFID,
1897 					  vf_id);
1898 			qed_fid_pretend(p_hwfn, p_ptt, fid);
1899 			break;
1900 		default:
1901 			break;
1902 		}
1903 
1904 		dev_data->pretend.split_type = (u8)split_type;
1905 		dev_data->pretend.split_id = split_id;
1906 	}
1907 
1908 	/* Read registers using GRC */
1909 	qed_read_regs(p_hwfn, p_ptt, dump_buf, addr, len);
1910 
1911 print_log:
1912 	/* Print log */
1913 	dev_data->num_regs_read += len;
1914 	thresh = s_hw_type_defs[dev_data->hw_type].log_thresh;
1915 	if ((dev_data->num_regs_read / thresh) >
1916 	    ((dev_data->num_regs_read - len) / thresh))
1917 		DP_VERBOSE(p_hwfn,
1918 			   QED_MSG_DEBUG,
1919 			   "Dumped %d registers...\n", dev_data->num_regs_read);
1920 
1921 	return len;
1922 }
1923 
1924 /* Dumps GRC registers sequence header. Returns the dumped size in dwords.
1925  * The addr and len arguments are specified in dwords.
1926  */
1927 static u32 qed_grc_dump_reg_entry_hdr(u32 *dump_buf,
1928 				      bool dump, u32 addr, u32 len)
1929 {
1930 	if (dump)
1931 		*dump_buf = addr | (len << REG_DUMP_LEN_SHIFT);
1932 
1933 	return 1;
1934 }
1935 
1936 /* Dumps GRC registers sequence. Returns the dumped size in dwords.
1937  * The addr and len arguments are specified in dwords.
1938  */
1939 static u32 qed_grc_dump_reg_entry(struct qed_hwfn *p_hwfn,
1940 				  struct qed_ptt *p_ptt,
1941 				  u32 *dump_buf,
1942 				  bool dump, u32 addr, u32 len, bool wide_bus,
1943 				  enum init_split_types split_type, u8 split_id)
1944 {
1945 	u32 offset = 0;
1946 
1947 	offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, len);
1948 	offset += qed_grc_dump_addr_range(p_hwfn,
1949 					  p_ptt,
1950 					  dump_buf + offset,
1951 					  dump, addr, len, wide_bus,
1952 					  split_type, split_id);
1953 
1954 	return offset;
1955 }
1956 
1957 /* Dumps GRC registers sequence with skip cycle.
1958  * Returns the dumped size in dwords.
1959  * - addr:	start GRC address in dwords
1960  * - total_len:	total no. of dwords to dump
1961  * - read_len:	no. consecutive dwords to read
1962  * - skip_len:	no. of dwords to skip (and fill with zeros)
1963  */
1964 static u32 qed_grc_dump_reg_entry_skip(struct qed_hwfn *p_hwfn,
1965 				       struct qed_ptt *p_ptt,
1966 				       u32 *dump_buf,
1967 				       bool dump,
1968 				       u32 addr,
1969 				       u32 total_len,
1970 				       u32 read_len, u32 skip_len)
1971 {
1972 	u32 offset = 0, reg_offset = 0;
1973 
1974 	offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, total_len);
1975 
1976 	if (!dump)
1977 		return offset + total_len;
1978 
1979 	while (reg_offset < total_len) {
1980 		u32 curr_len = min_t(u32, read_len, total_len - reg_offset);
1981 
1982 		offset += qed_grc_dump_addr_range(p_hwfn,
1983 						  p_ptt,
1984 						  dump_buf + offset,
1985 						  dump,  addr, curr_len, false,
1986 						  SPLIT_TYPE_NONE, 0);
1987 		reg_offset += curr_len;
1988 		addr += curr_len;
1989 
1990 		if (reg_offset < total_len) {
1991 			curr_len = min_t(u32, skip_len, total_len - skip_len);
1992 			memset(dump_buf + offset, 0, DWORDS_TO_BYTES(curr_len));
1993 			offset += curr_len;
1994 			reg_offset += curr_len;
1995 			addr += curr_len;
1996 		}
1997 	}
1998 
1999 	return offset;
2000 }
2001 
2002 /* Dumps GRC registers entries. Returns the dumped size in dwords. */
2003 static u32 qed_grc_dump_regs_entries(struct qed_hwfn *p_hwfn,
2004 				     struct qed_ptt *p_ptt,
2005 				     struct virt_mem_desc input_regs_arr,
2006 				     u32 *dump_buf,
2007 				     bool dump,
2008 				     enum init_split_types split_type,
2009 				     u8 split_id,
2010 				     bool block_enable[MAX_BLOCK_ID],
2011 				     u32 *num_dumped_reg_entries)
2012 {
2013 	u32 i, offset = 0, input_offset = 0;
2014 	bool mode_match = true;
2015 
2016 	*num_dumped_reg_entries = 0;
2017 
2018 	while (input_offset < BYTES_TO_DWORDS(input_regs_arr.size)) {
2019 		const struct dbg_dump_cond_hdr *cond_hdr =
2020 		    (const struct dbg_dump_cond_hdr *)
2021 		    input_regs_arr.ptr + input_offset++;
2022 		u16 modes_buf_offset;
2023 		bool eval_mode;
2024 
2025 		/* Check mode/block */
2026 		eval_mode = GET_FIELD(cond_hdr->mode.data,
2027 				      DBG_MODE_HDR_EVAL_MODE) > 0;
2028 		if (eval_mode) {
2029 			modes_buf_offset =
2030 				GET_FIELD(cond_hdr->mode.data,
2031 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
2032 			mode_match = qed_is_mode_match(p_hwfn,
2033 						       &modes_buf_offset);
2034 		}
2035 
2036 		if (!mode_match || !block_enable[cond_hdr->block_id]) {
2037 			input_offset += cond_hdr->data_size;
2038 			continue;
2039 		}
2040 
2041 		for (i = 0; i < cond_hdr->data_size; i++, input_offset++) {
2042 			const struct dbg_dump_reg *reg =
2043 			    (const struct dbg_dump_reg *)
2044 			    input_regs_arr.ptr + input_offset;
2045 			u32 addr, len;
2046 			bool wide_bus;
2047 
2048 			addr = GET_FIELD(reg->data, DBG_DUMP_REG_ADDRESS);
2049 			len = GET_FIELD(reg->data, DBG_DUMP_REG_LENGTH);
2050 			wide_bus = GET_FIELD(reg->data, DBG_DUMP_REG_WIDE_BUS);
2051 			offset += qed_grc_dump_reg_entry(p_hwfn,
2052 							 p_ptt,
2053 							 dump_buf + offset,
2054 							 dump,
2055 							 addr,
2056 							 len,
2057 							 wide_bus,
2058 							 split_type, split_id);
2059 			(*num_dumped_reg_entries)++;
2060 		}
2061 	}
2062 
2063 	return offset;
2064 }
2065 
2066 /* Dumps GRC registers entries. Returns the dumped size in dwords. */
2067 static u32 qed_grc_dump_split_data(struct qed_hwfn *p_hwfn,
2068 				   struct qed_ptt *p_ptt,
2069 				   struct virt_mem_desc input_regs_arr,
2070 				   u32 *dump_buf,
2071 				   bool dump,
2072 				   bool block_enable[MAX_BLOCK_ID],
2073 				   enum init_split_types split_type,
2074 				   u8 split_id, const char *reg_type_name)
2075 {
2076 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2077 	enum init_split_types hdr_split_type = split_type;
2078 	u32 num_dumped_reg_entries, offset;
2079 	u8 hdr_split_id = split_id;
2080 
2081 	/* In PORT_PF split type, print a port split header */
2082 	if (split_type == SPLIT_TYPE_PORT_PF) {
2083 		hdr_split_type = SPLIT_TYPE_PORT;
2084 		hdr_split_id = split_id / dev_data->num_pfs_per_port;
2085 	}
2086 
2087 	/* Calculate register dump header size (and skip it for now) */
2088 	offset = qed_grc_dump_regs_hdr(dump_buf,
2089 				       false,
2090 				       0,
2091 				       hdr_split_type,
2092 				       hdr_split_id, reg_type_name);
2093 
2094 	/* Dump registers */
2095 	offset += qed_grc_dump_regs_entries(p_hwfn,
2096 					    p_ptt,
2097 					    input_regs_arr,
2098 					    dump_buf + offset,
2099 					    dump,
2100 					    split_type,
2101 					    split_id,
2102 					    block_enable,
2103 					    &num_dumped_reg_entries);
2104 
2105 	/* Write register dump header */
2106 	if (dump && num_dumped_reg_entries > 0)
2107 		qed_grc_dump_regs_hdr(dump_buf,
2108 				      dump,
2109 				      num_dumped_reg_entries,
2110 				      hdr_split_type,
2111 				      hdr_split_id, reg_type_name);
2112 
2113 	return num_dumped_reg_entries > 0 ? offset : 0;
2114 }
2115 
2116 /* Dumps registers according to the input registers array. Returns the dumped
2117  * size in dwords.
2118  */
2119 static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn,
2120 				  struct qed_ptt *p_ptt,
2121 				  u32 *dump_buf,
2122 				  bool dump,
2123 				  bool block_enable[MAX_BLOCK_ID],
2124 				  const char *reg_type_name)
2125 {
2126 	struct virt_mem_desc *dbg_buf =
2127 	    &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG];
2128 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2129 	u32 offset = 0, input_offset = 0;
2130 
2131 	while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
2132 		const struct dbg_dump_split_hdr *split_hdr;
2133 		struct virt_mem_desc curr_input_regs_arr;
2134 		enum init_split_types split_type;
2135 		u16 split_count = 0;
2136 		u32 split_data_size;
2137 		u8 split_id;
2138 
2139 		split_hdr =
2140 		    (const struct dbg_dump_split_hdr *)
2141 		    dbg_buf->ptr + input_offset++;
2142 		split_type =
2143 		    GET_FIELD(split_hdr->hdr,
2144 			      DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
2145 		split_data_size = GET_FIELD(split_hdr->hdr,
2146 					    DBG_DUMP_SPLIT_HDR_DATA_SIZE);
2147 		curr_input_regs_arr.ptr =
2148 		    (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr +
2149 		    input_offset;
2150 		curr_input_regs_arr.size = DWORDS_TO_BYTES(split_data_size);
2151 
2152 		switch (split_type) {
2153 		case SPLIT_TYPE_NONE:
2154 			split_count = 1;
2155 			break;
2156 		case SPLIT_TYPE_PORT:
2157 			split_count = dev_data->num_ports;
2158 			break;
2159 		case SPLIT_TYPE_PF:
2160 		case SPLIT_TYPE_PORT_PF:
2161 			split_count = dev_data->num_ports *
2162 			    dev_data->num_pfs_per_port;
2163 			break;
2164 		case SPLIT_TYPE_VF:
2165 			split_count = dev_data->num_vfs;
2166 			break;
2167 		default:
2168 			return 0;
2169 		}
2170 
2171 		for (split_id = 0; split_id < split_count; split_id++)
2172 			offset += qed_grc_dump_split_data(p_hwfn, p_ptt,
2173 							  curr_input_regs_arr,
2174 							  dump_buf + offset,
2175 							  dump, block_enable,
2176 							  split_type,
2177 							  split_id,
2178 							  reg_type_name);
2179 
2180 		input_offset += split_data_size;
2181 	}
2182 
2183 	/* Cancel pretends (pretend to original PF) */
2184 	if (dump) {
2185 		qed_fid_pretend(p_hwfn, p_ptt,
2186 				FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
2187 					    p_hwfn->rel_pf_id));
2188 		dev_data->pretend.split_type = SPLIT_TYPE_NONE;
2189 		dev_data->pretend.split_id = 0;
2190 	}
2191 
2192 	return offset;
2193 }
2194 
2195 /* Dump reset registers. Returns the dumped size in dwords. */
2196 static u32 qed_grc_dump_reset_regs(struct qed_hwfn *p_hwfn,
2197 				   struct qed_ptt *p_ptt,
2198 				   u32 *dump_buf, bool dump)
2199 {
2200 	u32 offset = 0, num_regs = 0;
2201 	u8 reset_reg_id;
2202 
2203 	/* Calculate header size */
2204 	offset += qed_grc_dump_regs_hdr(dump_buf,
2205 					false,
2206 					0, SPLIT_TYPE_NONE, 0, "RESET_REGS");
2207 
2208 	/* Write reset registers */
2209 	for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS;
2210 	     reset_reg_id++) {
2211 		const struct dbg_reset_reg *reset_reg;
2212 		u32 reset_reg_addr;
2213 
2214 		reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id);
2215 
2216 		if (GET_FIELD(reset_reg->data, DBG_RESET_REG_IS_REMOVED))
2217 			continue;
2218 
2219 		reset_reg_addr = GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR);
2220 		offset += qed_grc_dump_reg_entry(p_hwfn,
2221 						 p_ptt,
2222 						 dump_buf + offset,
2223 						 dump,
2224 						 reset_reg_addr,
2225 						 1, false, SPLIT_TYPE_NONE, 0);
2226 		num_regs++;
2227 	}
2228 
2229 	/* Write header */
2230 	if (dump)
2231 		qed_grc_dump_regs_hdr(dump_buf,
2232 				      true, num_regs, SPLIT_TYPE_NONE,
2233 				      0, "RESET_REGS");
2234 
2235 	return offset;
2236 }
2237 
2238 /* Dump registers that are modified during GRC Dump and therefore must be
2239  * dumped first. Returns the dumped size in dwords.
2240  */
2241 static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn,
2242 				      struct qed_ptt *p_ptt,
2243 				      u32 *dump_buf, bool dump)
2244 {
2245 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2246 	u32 block_id, offset = 0, stall_regs_offset;
2247 	const struct dbg_attn_reg *attn_reg_arr;
2248 	u8 storm_id, reg_idx, num_attn_regs;
2249 	u32 num_reg_entries = 0;
2250 
2251 	/* Write empty header for attention registers */
2252 	offset += qed_grc_dump_regs_hdr(dump_buf,
2253 					false,
2254 					0, SPLIT_TYPE_NONE, 0, "ATTN_REGS");
2255 
2256 	/* Write parity registers */
2257 	for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
2258 		if (dev_data->block_in_reset[block_id] && dump)
2259 			continue;
2260 
2261 		attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
2262 						       (enum block_id)block_id,
2263 						       ATTN_TYPE_PARITY,
2264 						       &num_attn_regs);
2265 
2266 		for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
2267 			const struct dbg_attn_reg *reg_data =
2268 				&attn_reg_arr[reg_idx];
2269 			u16 modes_buf_offset;
2270 			bool eval_mode;
2271 			u32 addr;
2272 
2273 			/* Check mode */
2274 			eval_mode = GET_FIELD(reg_data->mode.data,
2275 					      DBG_MODE_HDR_EVAL_MODE) > 0;
2276 			modes_buf_offset =
2277 				GET_FIELD(reg_data->mode.data,
2278 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
2279 			if (eval_mode &&
2280 			    !qed_is_mode_match(p_hwfn, &modes_buf_offset))
2281 				continue;
2282 
2283 			/* Mode match: read & dump registers */
2284 			addr = reg_data->mask_address;
2285 			offset += qed_grc_dump_reg_entry(p_hwfn,
2286 							 p_ptt,
2287 							 dump_buf + offset,
2288 							 dump,
2289 							 addr,
2290 							 1, false,
2291 							 SPLIT_TYPE_NONE, 0);
2292 			addr = GET_FIELD(reg_data->data,
2293 					 DBG_ATTN_REG_STS_ADDRESS);
2294 			offset += qed_grc_dump_reg_entry(p_hwfn,
2295 							 p_ptt,
2296 							 dump_buf + offset,
2297 							 dump,
2298 							 addr,
2299 							 1, false,
2300 							 SPLIT_TYPE_NONE, 0);
2301 			num_reg_entries += 2;
2302 		}
2303 	}
2304 
2305 	/* Overwrite header for attention registers */
2306 	if (dump)
2307 		qed_grc_dump_regs_hdr(dump_buf,
2308 				      true,
2309 				      num_reg_entries,
2310 				      SPLIT_TYPE_NONE, 0, "ATTN_REGS");
2311 
2312 	/* Write empty header for stall registers */
2313 	stall_regs_offset = offset;
2314 	offset += qed_grc_dump_regs_hdr(dump_buf,
2315 					false, 0, SPLIT_TYPE_NONE, 0, "REGS");
2316 
2317 	/* Write Storm stall status registers */
2318 	for (storm_id = 0, num_reg_entries = 0; storm_id < MAX_DBG_STORMS;
2319 	     storm_id++) {
2320 		struct storm_defs *storm = &s_storm_defs[storm_id];
2321 		u32 addr;
2322 
2323 		if (dev_data->block_in_reset[storm->sem_block_id] && dump)
2324 			continue;
2325 
2326 		addr =
2327 		    BYTES_TO_DWORDS(storm->sem_fast_mem_addr +
2328 				    SEM_FAST_REG_STALLED);
2329 		offset += qed_grc_dump_reg_entry(p_hwfn,
2330 						 p_ptt,
2331 						 dump_buf + offset,
2332 						 dump,
2333 						 addr,
2334 						 1,
2335 						 false, SPLIT_TYPE_NONE, 0);
2336 		num_reg_entries++;
2337 	}
2338 
2339 	/* Overwrite header for stall registers */
2340 	if (dump)
2341 		qed_grc_dump_regs_hdr(dump_buf + stall_regs_offset,
2342 				      true,
2343 				      num_reg_entries,
2344 				      SPLIT_TYPE_NONE, 0, "REGS");
2345 
2346 	return offset;
2347 }
2348 
2349 /* Dumps registers that can't be represented in the debug arrays */
2350 static u32 qed_grc_dump_special_regs(struct qed_hwfn *p_hwfn,
2351 				     struct qed_ptt *p_ptt,
2352 				     u32 *dump_buf, bool dump)
2353 {
2354 	u32 offset = 0, addr;
2355 
2356 	offset += qed_grc_dump_regs_hdr(dump_buf,
2357 					dump, 2, SPLIT_TYPE_NONE, 0, "REGS");
2358 
2359 	/* Dump R/TDIF_REG_DEBUG_ERROR_INFO_SIZE (every 8'th register should be
2360 	 * skipped).
2361 	 */
2362 	addr = BYTES_TO_DWORDS(RDIF_REG_DEBUG_ERROR_INFO);
2363 	offset += qed_grc_dump_reg_entry_skip(p_hwfn,
2364 					      p_ptt,
2365 					      dump_buf + offset,
2366 					      dump,
2367 					      addr,
2368 					      RDIF_REG_DEBUG_ERROR_INFO_SIZE,
2369 					      7,
2370 					      1);
2371 	addr = BYTES_TO_DWORDS(TDIF_REG_DEBUG_ERROR_INFO);
2372 	offset +=
2373 	    qed_grc_dump_reg_entry_skip(p_hwfn,
2374 					p_ptt,
2375 					dump_buf + offset,
2376 					dump,
2377 					addr,
2378 					TDIF_REG_DEBUG_ERROR_INFO_SIZE,
2379 					7,
2380 					1);
2381 
2382 	return offset;
2383 }
2384 
2385 /* Dumps a GRC memory header (section and params). Returns the dumped size in
2386  * dwords. The following parameters are dumped:
2387  * - name:	   dumped only if it's not NULL.
2388  * - addr:	   in dwords, dumped only if name is NULL.
2389  * - len:	   in dwords, always dumped.
2390  * - width:	   dumped if it's not zero.
2391  * - packed:	   dumped only if it's not false.
2392  * - mem_group:	   always dumped.
2393  * - is_storm:	   true only if the memory is related to a Storm.
2394  * - storm_letter: valid only if is_storm is true.
2395  *
2396  */
2397 static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn,
2398 				u32 *dump_buf,
2399 				bool dump,
2400 				const char *name,
2401 				u32 addr,
2402 				u32 len,
2403 				u32 bit_width,
2404 				bool packed,
2405 				const char *mem_group, char storm_letter)
2406 {
2407 	u8 num_params = 3;
2408 	u32 offset = 0;
2409 	char buf[64];
2410 
2411 	if (!len)
2412 		DP_NOTICE(p_hwfn,
2413 			  "Unexpected GRC Dump error: dumped memory size must be non-zero\n");
2414 
2415 	if (bit_width)
2416 		num_params++;
2417 	if (packed)
2418 		num_params++;
2419 
2420 	/* Dump section header */
2421 	offset += qed_dump_section_hdr(dump_buf + offset,
2422 				       dump, "grc_mem", num_params);
2423 
2424 	if (name) {
2425 		/* Dump name */
2426 		if (storm_letter) {
2427 			strcpy(buf, "?STORM_");
2428 			buf[0] = storm_letter;
2429 			strcpy(buf + strlen(buf), name);
2430 		} else {
2431 			strcpy(buf, name);
2432 		}
2433 
2434 		offset += qed_dump_str_param(dump_buf + offset,
2435 					     dump, "name", buf);
2436 	} else {
2437 		/* Dump address */
2438 		u32 addr_in_bytes = DWORDS_TO_BYTES(addr);
2439 
2440 		offset += qed_dump_num_param(dump_buf + offset,
2441 					     dump, "addr", addr_in_bytes);
2442 	}
2443 
2444 	/* Dump len */
2445 	offset += qed_dump_num_param(dump_buf + offset, dump, "len", len);
2446 
2447 	/* Dump bit width */
2448 	if (bit_width)
2449 		offset += qed_dump_num_param(dump_buf + offset,
2450 					     dump, "width", bit_width);
2451 
2452 	/* Dump packed */
2453 	if (packed)
2454 		offset += qed_dump_num_param(dump_buf + offset,
2455 					     dump, "packed", 1);
2456 
2457 	/* Dump reg type */
2458 	if (storm_letter) {
2459 		strcpy(buf, "?STORM_");
2460 		buf[0] = storm_letter;
2461 		strcpy(buf + strlen(buf), mem_group);
2462 	} else {
2463 		strcpy(buf, mem_group);
2464 	}
2465 
2466 	offset += qed_dump_str_param(dump_buf + offset, dump, "type", buf);
2467 
2468 	return offset;
2469 }
2470 
2471 /* Dumps a single GRC memory. If name is NULL, the memory is stored by address.
2472  * Returns the dumped size in dwords.
2473  * The addr and len arguments are specified in dwords.
2474  */
2475 static u32 qed_grc_dump_mem(struct qed_hwfn *p_hwfn,
2476 			    struct qed_ptt *p_ptt,
2477 			    u32 *dump_buf,
2478 			    bool dump,
2479 			    const char *name,
2480 			    u32 addr,
2481 			    u32 len,
2482 			    bool wide_bus,
2483 			    u32 bit_width,
2484 			    bool packed,
2485 			    const char *mem_group, char storm_letter)
2486 {
2487 	u32 offset = 0;
2488 
2489 	offset += qed_grc_dump_mem_hdr(p_hwfn,
2490 				       dump_buf + offset,
2491 				       dump,
2492 				       name,
2493 				       addr,
2494 				       len,
2495 				       bit_width,
2496 				       packed, mem_group, storm_letter);
2497 	offset += qed_grc_dump_addr_range(p_hwfn,
2498 					  p_ptt,
2499 					  dump_buf + offset,
2500 					  dump, addr, len, wide_bus,
2501 					  SPLIT_TYPE_NONE, 0);
2502 
2503 	return offset;
2504 }
2505 
2506 /* Dumps GRC memories entries. Returns the dumped size in dwords. */
2507 static u32 qed_grc_dump_mem_entries(struct qed_hwfn *p_hwfn,
2508 				    struct qed_ptt *p_ptt,
2509 				    struct virt_mem_desc input_mems_arr,
2510 				    u32 *dump_buf, bool dump)
2511 {
2512 	u32 i, offset = 0, input_offset = 0;
2513 	bool mode_match = true;
2514 
2515 	while (input_offset < BYTES_TO_DWORDS(input_mems_arr.size)) {
2516 		const struct dbg_dump_cond_hdr *cond_hdr;
2517 		u16 modes_buf_offset;
2518 		u32 num_entries;
2519 		bool eval_mode;
2520 
2521 		cond_hdr =
2522 		    (const struct dbg_dump_cond_hdr *)input_mems_arr.ptr +
2523 		    input_offset++;
2524 		num_entries = cond_hdr->data_size / MEM_DUMP_ENTRY_SIZE_DWORDS;
2525 
2526 		/* Check required mode */
2527 		eval_mode = GET_FIELD(cond_hdr->mode.data,
2528 				      DBG_MODE_HDR_EVAL_MODE) > 0;
2529 		if (eval_mode) {
2530 			modes_buf_offset =
2531 				GET_FIELD(cond_hdr->mode.data,
2532 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
2533 			mode_match = qed_is_mode_match(p_hwfn,
2534 						       &modes_buf_offset);
2535 		}
2536 
2537 		if (!mode_match) {
2538 			input_offset += cond_hdr->data_size;
2539 			continue;
2540 		}
2541 
2542 		for (i = 0; i < num_entries;
2543 		     i++, input_offset += MEM_DUMP_ENTRY_SIZE_DWORDS) {
2544 			const struct dbg_dump_mem *mem =
2545 			    (const struct dbg_dump_mem *)((u32 *)
2546 							  input_mems_arr.ptr
2547 							  + input_offset);
2548 			const struct dbg_block *block;
2549 			char storm_letter = 0;
2550 			u32 mem_addr, mem_len;
2551 			bool mem_wide_bus;
2552 			u8 mem_group_id;
2553 
2554 			mem_group_id = GET_FIELD(mem->dword0,
2555 						 DBG_DUMP_MEM_MEM_GROUP_ID);
2556 			if (mem_group_id >= MEM_GROUPS_NUM) {
2557 				DP_NOTICE(p_hwfn, "Invalid mem_group_id\n");
2558 				return 0;
2559 			}
2560 
2561 			if (!qed_grc_is_mem_included(p_hwfn,
2562 						     (enum block_id)
2563 						     cond_hdr->block_id,
2564 						     mem_group_id))
2565 				continue;
2566 
2567 			mem_addr = GET_FIELD(mem->dword0, DBG_DUMP_MEM_ADDRESS);
2568 			mem_len = GET_FIELD(mem->dword1, DBG_DUMP_MEM_LENGTH);
2569 			mem_wide_bus = GET_FIELD(mem->dword1,
2570 						 DBG_DUMP_MEM_WIDE_BUS);
2571 
2572 			block = get_dbg_block(p_hwfn,
2573 					      cond_hdr->block_id);
2574 
2575 			/* If memory is associated with Storm,
2576 			 * update storm details
2577 			 */
2578 			if (block->associated_storm_letter)
2579 				storm_letter = block->associated_storm_letter;
2580 
2581 			/* Dump memory */
2582 			offset += qed_grc_dump_mem(p_hwfn,
2583 						p_ptt,
2584 						dump_buf + offset,
2585 						dump,
2586 						NULL,
2587 						mem_addr,
2588 						mem_len,
2589 						mem_wide_bus,
2590 						0,
2591 						false,
2592 						s_mem_group_names[mem_group_id],
2593 						storm_letter);
2594 		}
2595 	}
2596 
2597 	return offset;
2598 }
2599 
2600 /* Dumps GRC memories according to the input array dump_mem.
2601  * Returns the dumped size in dwords.
2602  */
2603 static u32 qed_grc_dump_memories(struct qed_hwfn *p_hwfn,
2604 				 struct qed_ptt *p_ptt,
2605 				 u32 *dump_buf, bool dump)
2606 {
2607 	struct virt_mem_desc *dbg_buf =
2608 	    &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM];
2609 	u32 offset = 0, input_offset = 0;
2610 
2611 	while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
2612 		const struct dbg_dump_split_hdr *split_hdr;
2613 		struct virt_mem_desc curr_input_mems_arr;
2614 		enum init_split_types split_type;
2615 		u32 split_data_size;
2616 
2617 		split_hdr =
2618 		    (const struct dbg_dump_split_hdr *)dbg_buf->ptr +
2619 		    input_offset++;
2620 		split_type = GET_FIELD(split_hdr->hdr,
2621 				       DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
2622 		split_data_size = GET_FIELD(split_hdr->hdr,
2623 					    DBG_DUMP_SPLIT_HDR_DATA_SIZE);
2624 		curr_input_mems_arr.ptr = (u32 *)dbg_buf->ptr + input_offset;
2625 		curr_input_mems_arr.size = DWORDS_TO_BYTES(split_data_size);
2626 
2627 		if (split_type == SPLIT_TYPE_NONE)
2628 			offset += qed_grc_dump_mem_entries(p_hwfn,
2629 							   p_ptt,
2630 							   curr_input_mems_arr,
2631 							   dump_buf + offset,
2632 							   dump);
2633 		else
2634 			DP_NOTICE(p_hwfn,
2635 				  "Dumping split memories is currently not supported\n");
2636 
2637 		input_offset += split_data_size;
2638 	}
2639 
2640 	return offset;
2641 }
2642 
2643 /* Dumps GRC context data for the specified Storm.
2644  * Returns the dumped size in dwords.
2645  * The lid_size argument is specified in quad-regs.
2646  */
2647 static u32 qed_grc_dump_ctx_data(struct qed_hwfn *p_hwfn,
2648 				 struct qed_ptt *p_ptt,
2649 				 u32 *dump_buf,
2650 				 bool dump,
2651 				 const char *name,
2652 				 u32 num_lids,
2653 				 enum cm_ctx_types ctx_type, u8 storm_id)
2654 {
2655 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2656 	struct storm_defs *storm = &s_storm_defs[storm_id];
2657 	u32 i, lid, lid_size, total_size;
2658 	u32 rd_reg_addr, offset = 0;
2659 
2660 	/* Convert quad-regs to dwords */
2661 	lid_size = storm->cm_ctx_lid_sizes[dev_data->chip_id][ctx_type] * 4;
2662 
2663 	if (!lid_size)
2664 		return 0;
2665 
2666 	total_size = num_lids * lid_size;
2667 
2668 	offset += qed_grc_dump_mem_hdr(p_hwfn,
2669 				       dump_buf + offset,
2670 				       dump,
2671 				       name,
2672 				       0,
2673 				       total_size,
2674 				       lid_size * 32,
2675 				       false, name, storm->letter);
2676 
2677 	if (!dump)
2678 		return offset + total_size;
2679 
2680 	rd_reg_addr = BYTES_TO_DWORDS(storm->cm_ctx_rd_addr[ctx_type]);
2681 
2682 	/* Dump context data */
2683 	for (lid = 0; lid < num_lids; lid++) {
2684 		for (i = 0; i < lid_size; i++) {
2685 			qed_wr(p_hwfn,
2686 			       p_ptt, storm->cm_ctx_wr_addr, (i << 9) | lid);
2687 			offset += qed_grc_dump_addr_range(p_hwfn,
2688 							  p_ptt,
2689 							  dump_buf + offset,
2690 							  dump,
2691 							  rd_reg_addr,
2692 							  1,
2693 							  false,
2694 							  SPLIT_TYPE_NONE, 0);
2695 		}
2696 	}
2697 
2698 	return offset;
2699 }
2700 
2701 /* Dumps GRC contexts. Returns the dumped size in dwords. */
2702 static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn,
2703 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
2704 {
2705 	u32 offset = 0;
2706 	u8 storm_id;
2707 
2708 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
2709 		if (!qed_grc_is_storm_included(p_hwfn,
2710 					       (enum dbg_storms)storm_id))
2711 			continue;
2712 
2713 		/* Dump Conn AG context size */
2714 		offset += qed_grc_dump_ctx_data(p_hwfn,
2715 						p_ptt,
2716 						dump_buf + offset,
2717 						dump,
2718 						"CONN_AG_CTX",
2719 						NUM_OF_LCIDS,
2720 						CM_CTX_CONN_AG, storm_id);
2721 
2722 		/* Dump Conn ST context size */
2723 		offset += qed_grc_dump_ctx_data(p_hwfn,
2724 						p_ptt,
2725 						dump_buf + offset,
2726 						dump,
2727 						"CONN_ST_CTX",
2728 						NUM_OF_LCIDS,
2729 						CM_CTX_CONN_ST, storm_id);
2730 
2731 		/* Dump Task AG context size */
2732 		offset += qed_grc_dump_ctx_data(p_hwfn,
2733 						p_ptt,
2734 						dump_buf + offset,
2735 						dump,
2736 						"TASK_AG_CTX",
2737 						NUM_OF_LTIDS,
2738 						CM_CTX_TASK_AG, storm_id);
2739 
2740 		/* Dump Task ST context size */
2741 		offset += qed_grc_dump_ctx_data(p_hwfn,
2742 						p_ptt,
2743 						dump_buf + offset,
2744 						dump,
2745 						"TASK_ST_CTX",
2746 						NUM_OF_LTIDS,
2747 						CM_CTX_TASK_ST, storm_id);
2748 	}
2749 
2750 	return offset;
2751 }
2752 
2753 #define VFC_STATUS_RESP_READY_BIT	0
2754 #define VFC_STATUS_BUSY_BIT		1
2755 #define VFC_STATUS_SENDING_CMD_BIT	2
2756 
2757 #define VFC_POLLING_DELAY_MS	1
2758 #define VFC_POLLING_COUNT		20
2759 
2760 /* Reads data from VFC. Returns the number of dwords read (0 on error).
2761  * Sizes are specified in dwords.
2762  */
2763 static u32 qed_grc_dump_read_from_vfc(struct qed_hwfn *p_hwfn,
2764 				      struct qed_ptt *p_ptt,
2765 				      struct storm_defs *storm,
2766 				      u32 *cmd_data,
2767 				      u32 cmd_size,
2768 				      u32 *addr_data,
2769 				      u32 addr_size,
2770 				      u32 resp_size, u32 *dump_buf)
2771 {
2772 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2773 	u32 vfc_status, polling_ms, polling_count = 0, i;
2774 	u32 reg_addr, sem_base;
2775 	bool is_ready = false;
2776 
2777 	sem_base = storm->sem_fast_mem_addr;
2778 	polling_ms = VFC_POLLING_DELAY_MS *
2779 	    s_hw_type_defs[dev_data->hw_type].delay_factor;
2780 
2781 	/* Write VFC command */
2782 	ARR_REG_WR(p_hwfn,
2783 		   p_ptt,
2784 		   sem_base + SEM_FAST_REG_VFC_DATA_WR,
2785 		   cmd_data, cmd_size);
2786 
2787 	/* Write VFC address */
2788 	ARR_REG_WR(p_hwfn,
2789 		   p_ptt,
2790 		   sem_base + SEM_FAST_REG_VFC_ADDR,
2791 		   addr_data, addr_size);
2792 
2793 	/* Read response */
2794 	for (i = 0; i < resp_size; i++) {
2795 		/* Poll until ready */
2796 		do {
2797 			reg_addr = sem_base + SEM_FAST_REG_VFC_STATUS;
2798 			qed_grc_dump_addr_range(p_hwfn,
2799 						p_ptt,
2800 						&vfc_status,
2801 						true,
2802 						BYTES_TO_DWORDS(reg_addr),
2803 						1,
2804 						false, SPLIT_TYPE_NONE, 0);
2805 			is_ready = vfc_status & BIT(VFC_STATUS_RESP_READY_BIT);
2806 
2807 			if (!is_ready) {
2808 				if (polling_count++ == VFC_POLLING_COUNT)
2809 					return 0;
2810 
2811 				msleep(polling_ms);
2812 			}
2813 		} while (!is_ready);
2814 
2815 		reg_addr = sem_base + SEM_FAST_REG_VFC_DATA_RD;
2816 		qed_grc_dump_addr_range(p_hwfn,
2817 					p_ptt,
2818 					dump_buf + i,
2819 					true,
2820 					BYTES_TO_DWORDS(reg_addr),
2821 					1, false, SPLIT_TYPE_NONE, 0);
2822 	}
2823 
2824 	return resp_size;
2825 }
2826 
2827 /* Dump VFC CAM. Returns the dumped size in dwords. */
2828 static u32 qed_grc_dump_vfc_cam(struct qed_hwfn *p_hwfn,
2829 				struct qed_ptt *p_ptt,
2830 				u32 *dump_buf, bool dump, u8 storm_id)
2831 {
2832 	u32 total_size = VFC_CAM_NUM_ROWS * VFC_CAM_RESP_DWORDS;
2833 	struct storm_defs *storm = &s_storm_defs[storm_id];
2834 	u32 cam_addr[VFC_CAM_ADDR_DWORDS] = { 0 };
2835 	u32 cam_cmd[VFC_CAM_CMD_DWORDS] = { 0 };
2836 	u32 row, offset = 0;
2837 
2838 	offset += qed_grc_dump_mem_hdr(p_hwfn,
2839 				       dump_buf + offset,
2840 				       dump,
2841 				       "vfc_cam",
2842 				       0,
2843 				       total_size,
2844 				       256,
2845 				       false, "vfc_cam", storm->letter);
2846 
2847 	if (!dump)
2848 		return offset + total_size;
2849 
2850 	/* Prepare CAM address */
2851 	SET_VAR_FIELD(cam_addr, VFC_CAM_ADDR, OP, VFC_OPCODE_CAM_RD);
2852 
2853 	/* Read VFC CAM data */
2854 	for (row = 0; row < VFC_CAM_NUM_ROWS; row++) {
2855 		SET_VAR_FIELD(cam_cmd, VFC_CAM_CMD, ROW, row);
2856 		offset += qed_grc_dump_read_from_vfc(p_hwfn,
2857 						     p_ptt,
2858 						     storm,
2859 						     cam_cmd,
2860 						     VFC_CAM_CMD_DWORDS,
2861 						     cam_addr,
2862 						     VFC_CAM_ADDR_DWORDS,
2863 						     VFC_CAM_RESP_DWORDS,
2864 						     dump_buf + offset);
2865 	}
2866 
2867 	return offset;
2868 }
2869 
2870 /* Dump VFC RAM. Returns the dumped size in dwords. */
2871 static u32 qed_grc_dump_vfc_ram(struct qed_hwfn *p_hwfn,
2872 				struct qed_ptt *p_ptt,
2873 				u32 *dump_buf,
2874 				bool dump,
2875 				u8 storm_id, struct vfc_ram_defs *ram_defs)
2876 {
2877 	u32 total_size = ram_defs->num_rows * VFC_RAM_RESP_DWORDS;
2878 	struct storm_defs *storm = &s_storm_defs[storm_id];
2879 	u32 ram_addr[VFC_RAM_ADDR_DWORDS] = { 0 };
2880 	u32 ram_cmd[VFC_RAM_CMD_DWORDS] = { 0 };
2881 	u32 row, offset = 0;
2882 
2883 	offset += qed_grc_dump_mem_hdr(p_hwfn,
2884 				       dump_buf + offset,
2885 				       dump,
2886 				       ram_defs->mem_name,
2887 				       0,
2888 				       total_size,
2889 				       256,
2890 				       false,
2891 				       ram_defs->type_name,
2892 				       storm->letter);
2893 
2894 	if (!dump)
2895 		return offset + total_size;
2896 
2897 	/* Prepare RAM address */
2898 	SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, OP, VFC_OPCODE_RAM_RD);
2899 
2900 	/* Read VFC RAM data */
2901 	for (row = ram_defs->base_row;
2902 	     row < ram_defs->base_row + ram_defs->num_rows; row++) {
2903 		SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, ROW, row);
2904 		offset += qed_grc_dump_read_from_vfc(p_hwfn,
2905 						     p_ptt,
2906 						     storm,
2907 						     ram_cmd,
2908 						     VFC_RAM_CMD_DWORDS,
2909 						     ram_addr,
2910 						     VFC_RAM_ADDR_DWORDS,
2911 						     VFC_RAM_RESP_DWORDS,
2912 						     dump_buf + offset);
2913 	}
2914 
2915 	return offset;
2916 }
2917 
2918 /* Dumps GRC VFC data. Returns the dumped size in dwords. */
2919 static u32 qed_grc_dump_vfc(struct qed_hwfn *p_hwfn,
2920 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
2921 {
2922 	u8 storm_id, i;
2923 	u32 offset = 0;
2924 
2925 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
2926 		if (!qed_grc_is_storm_included(p_hwfn,
2927 					       (enum dbg_storms)storm_id) ||
2928 		    !s_storm_defs[storm_id].has_vfc)
2929 			continue;
2930 
2931 		/* Read CAM */
2932 		offset += qed_grc_dump_vfc_cam(p_hwfn,
2933 					       p_ptt,
2934 					       dump_buf + offset,
2935 					       dump, storm_id);
2936 
2937 		/* Read RAM */
2938 		for (i = 0; i < NUM_VFC_RAM_TYPES; i++)
2939 			offset += qed_grc_dump_vfc_ram(p_hwfn,
2940 						       p_ptt,
2941 						       dump_buf + offset,
2942 						       dump,
2943 						       storm_id,
2944 						       &s_vfc_ram_defs[i]);
2945 	}
2946 
2947 	return offset;
2948 }
2949 
2950 /* Dumps GRC RSS data. Returns the dumped size in dwords. */
2951 static u32 qed_grc_dump_rss(struct qed_hwfn *p_hwfn,
2952 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
2953 {
2954 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2955 	u32 offset = 0;
2956 	u8 rss_mem_id;
2957 
2958 	for (rss_mem_id = 0; rss_mem_id < NUM_RSS_MEM_TYPES; rss_mem_id++) {
2959 		u32 rss_addr, num_entries, total_dwords;
2960 		struct rss_mem_defs *rss_defs;
2961 		u32 addr, num_dwords_to_read;
2962 		bool packed;
2963 
2964 		rss_defs = &s_rss_mem_defs[rss_mem_id];
2965 		rss_addr = rss_defs->addr;
2966 		num_entries = rss_defs->num_entries[dev_data->chip_id];
2967 		total_dwords = (num_entries * rss_defs->entry_width) / 32;
2968 		packed = (rss_defs->entry_width == 16);
2969 
2970 		offset += qed_grc_dump_mem_hdr(p_hwfn,
2971 					       dump_buf + offset,
2972 					       dump,
2973 					       rss_defs->mem_name,
2974 					       0,
2975 					       total_dwords,
2976 					       rss_defs->entry_width,
2977 					       packed,
2978 					       rss_defs->type_name, 0);
2979 
2980 		/* Dump RSS data */
2981 		if (!dump) {
2982 			offset += total_dwords;
2983 			continue;
2984 		}
2985 
2986 		addr = BYTES_TO_DWORDS(RSS_REG_RSS_RAM_DATA);
2987 		while (total_dwords) {
2988 			num_dwords_to_read = min_t(u32,
2989 						   RSS_REG_RSS_RAM_DATA_SIZE,
2990 						   total_dwords);
2991 			qed_wr(p_hwfn, p_ptt, RSS_REG_RSS_RAM_ADDR, rss_addr);
2992 			offset += qed_grc_dump_addr_range(p_hwfn,
2993 							  p_ptt,
2994 							  dump_buf + offset,
2995 							  dump,
2996 							  addr,
2997 							  num_dwords_to_read,
2998 							  false,
2999 							  SPLIT_TYPE_NONE, 0);
3000 			total_dwords -= num_dwords_to_read;
3001 			rss_addr++;
3002 		}
3003 	}
3004 
3005 	return offset;
3006 }
3007 
3008 /* Dumps GRC Big RAM. Returns the dumped size in dwords. */
3009 static u32 qed_grc_dump_big_ram(struct qed_hwfn *p_hwfn,
3010 				struct qed_ptt *p_ptt,
3011 				u32 *dump_buf, bool dump, u8 big_ram_id)
3012 {
3013 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3014 	u32 block_size, ram_size, offset = 0, reg_val, i;
3015 	char mem_name[12] = "???_BIG_RAM";
3016 	char type_name[8] = "???_RAM";
3017 	struct big_ram_defs *big_ram;
3018 
3019 	big_ram = &s_big_ram_defs[big_ram_id];
3020 	ram_size = big_ram->ram_size[dev_data->chip_id];
3021 
3022 	reg_val = qed_rd(p_hwfn, p_ptt, big_ram->is_256b_reg_addr);
3023 	block_size = reg_val &
3024 		     BIT(big_ram->is_256b_bit_offset[dev_data->chip_id]) ? 256
3025 									 : 128;
3026 
3027 	strncpy(type_name, big_ram->instance_name, BIG_RAM_NAME_LEN);
3028 	strncpy(mem_name, big_ram->instance_name, BIG_RAM_NAME_LEN);
3029 
3030 	/* Dump memory header */
3031 	offset += qed_grc_dump_mem_hdr(p_hwfn,
3032 				       dump_buf + offset,
3033 				       dump,
3034 				       mem_name,
3035 				       0,
3036 				       ram_size,
3037 				       block_size * 8,
3038 				       false, type_name, 0);
3039 
3040 	/* Read and dump Big RAM data */
3041 	if (!dump)
3042 		return offset + ram_size;
3043 
3044 	/* Dump Big RAM */
3045 	for (i = 0; i < DIV_ROUND_UP(ram_size, BRB_REG_BIG_RAM_DATA_SIZE);
3046 	     i++) {
3047 		u32 addr, len;
3048 
3049 		qed_wr(p_hwfn, p_ptt, big_ram->addr_reg_addr, i);
3050 		addr = BYTES_TO_DWORDS(big_ram->data_reg_addr);
3051 		len = BRB_REG_BIG_RAM_DATA_SIZE;
3052 		offset += qed_grc_dump_addr_range(p_hwfn,
3053 						  p_ptt,
3054 						  dump_buf + offset,
3055 						  dump,
3056 						  addr,
3057 						  len,
3058 						  false, SPLIT_TYPE_NONE, 0);
3059 	}
3060 
3061 	return offset;
3062 }
3063 
3064 /* Dumps MCP scratchpad. Returns the dumped size in dwords. */
3065 static u32 qed_grc_dump_mcp(struct qed_hwfn *p_hwfn,
3066 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3067 {
3068 	bool block_enable[MAX_BLOCK_ID] = { 0 };
3069 	u32 offset = 0, addr;
3070 	bool halted = false;
3071 
3072 	/* Halt MCP */
3073 	if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) {
3074 		halted = !qed_mcp_halt(p_hwfn, p_ptt);
3075 		if (!halted)
3076 			DP_NOTICE(p_hwfn, "MCP halt failed!\n");
3077 	}
3078 
3079 	/* Dump MCP scratchpad */
3080 	offset += qed_grc_dump_mem(p_hwfn,
3081 				   p_ptt,
3082 				   dump_buf + offset,
3083 				   dump,
3084 				   NULL,
3085 				   BYTES_TO_DWORDS(MCP_REG_SCRATCH),
3086 				   MCP_REG_SCRATCH_SIZE,
3087 				   false, 0, false, "MCP", 0);
3088 
3089 	/* Dump MCP cpu_reg_file */
3090 	offset += qed_grc_dump_mem(p_hwfn,
3091 				   p_ptt,
3092 				   dump_buf + offset,
3093 				   dump,
3094 				   NULL,
3095 				   BYTES_TO_DWORDS(MCP_REG_CPU_REG_FILE),
3096 				   MCP_REG_CPU_REG_FILE_SIZE,
3097 				   false, 0, false, "MCP", 0);
3098 
3099 	/* Dump MCP registers */
3100 	block_enable[BLOCK_MCP] = true;
3101 	offset += qed_grc_dump_registers(p_hwfn,
3102 					 p_ptt,
3103 					 dump_buf + offset,
3104 					 dump, block_enable, "MCP");
3105 
3106 	/* Dump required non-MCP registers */
3107 	offset += qed_grc_dump_regs_hdr(dump_buf + offset,
3108 					dump, 1, SPLIT_TYPE_NONE, 0,
3109 					"MCP");
3110 	addr = BYTES_TO_DWORDS(MISC_REG_SHARED_MEM_ADDR);
3111 	offset += qed_grc_dump_reg_entry(p_hwfn,
3112 					 p_ptt,
3113 					 dump_buf + offset,
3114 					 dump,
3115 					 addr,
3116 					 1,
3117 					 false, SPLIT_TYPE_NONE, 0);
3118 
3119 	/* Release MCP */
3120 	if (halted && qed_mcp_resume(p_hwfn, p_ptt))
3121 		DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n");
3122 
3123 	return offset;
3124 }
3125 
3126 /* Dumps the tbus indirect memory for all PHYs.
3127  * Returns the dumped size in dwords.
3128  */
3129 static u32 qed_grc_dump_phy(struct qed_hwfn *p_hwfn,
3130 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3131 {
3132 	u32 offset = 0, tbus_lo_offset, tbus_hi_offset;
3133 	char mem_name[32];
3134 	u8 phy_id;
3135 
3136 	for (phy_id = 0; phy_id < ARRAY_SIZE(s_phy_defs); phy_id++) {
3137 		u32 addr_lo_addr, addr_hi_addr, data_lo_addr, data_hi_addr;
3138 		struct phy_defs *phy_defs;
3139 		u8 *bytes_buf;
3140 
3141 		phy_defs = &s_phy_defs[phy_id];
3142 		addr_lo_addr = phy_defs->base_addr +
3143 			       phy_defs->tbus_addr_lo_addr;
3144 		addr_hi_addr = phy_defs->base_addr +
3145 			       phy_defs->tbus_addr_hi_addr;
3146 		data_lo_addr = phy_defs->base_addr +
3147 			       phy_defs->tbus_data_lo_addr;
3148 		data_hi_addr = phy_defs->base_addr +
3149 			       phy_defs->tbus_data_hi_addr;
3150 
3151 		if (snprintf(mem_name, sizeof(mem_name), "tbus_%s",
3152 			     phy_defs->phy_name) < 0)
3153 			DP_NOTICE(p_hwfn,
3154 				  "Unexpected debug error: invalid PHY memory name\n");
3155 
3156 		offset += qed_grc_dump_mem_hdr(p_hwfn,
3157 					       dump_buf + offset,
3158 					       dump,
3159 					       mem_name,
3160 					       0,
3161 					       PHY_DUMP_SIZE_DWORDS,
3162 					       16, true, mem_name, 0);
3163 
3164 		if (!dump) {
3165 			offset += PHY_DUMP_SIZE_DWORDS;
3166 			continue;
3167 		}
3168 
3169 		bytes_buf = (u8 *)(dump_buf + offset);
3170 		for (tbus_hi_offset = 0;
3171 		     tbus_hi_offset < (NUM_PHY_TBUS_ADDRESSES >> 8);
3172 		     tbus_hi_offset++) {
3173 			qed_wr(p_hwfn, p_ptt, addr_hi_addr, tbus_hi_offset);
3174 			for (tbus_lo_offset = 0; tbus_lo_offset < 256;
3175 			     tbus_lo_offset++) {
3176 				qed_wr(p_hwfn,
3177 				       p_ptt, addr_lo_addr, tbus_lo_offset);
3178 				*(bytes_buf++) = (u8)qed_rd(p_hwfn,
3179 							    p_ptt,
3180 							    data_lo_addr);
3181 				*(bytes_buf++) = (u8)qed_rd(p_hwfn,
3182 							    p_ptt,
3183 							    data_hi_addr);
3184 			}
3185 		}
3186 
3187 		offset += PHY_DUMP_SIZE_DWORDS;
3188 	}
3189 
3190 	return offset;
3191 }
3192 
3193 static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn,
3194 					    struct qed_ptt *p_ptt,
3195 					    u32 image_type,
3196 					    u32 *nvram_offset_bytes,
3197 					    u32 *nvram_size_bytes);
3198 
3199 static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn,
3200 				      struct qed_ptt *p_ptt,
3201 				      u32 nvram_offset_bytes,
3202 				      u32 nvram_size_bytes, u32 *ret_buf);
3203 
3204 /* Dumps the MCP HW dump from NVRAM. Returns the dumped size in dwords. */
3205 static u32 qed_grc_dump_mcp_hw_dump(struct qed_hwfn *p_hwfn,
3206 				    struct qed_ptt *p_ptt,
3207 				    u32 *dump_buf, bool dump)
3208 {
3209 	u32 hw_dump_offset_bytes = 0, hw_dump_size_bytes = 0;
3210 	u32 hw_dump_size_dwords = 0, offset = 0;
3211 	enum dbg_status status;
3212 
3213 	/* Read HW dump image from NVRAM */
3214 	status = qed_find_nvram_image(p_hwfn,
3215 				      p_ptt,
3216 				      NVM_TYPE_HW_DUMP_OUT,
3217 				      &hw_dump_offset_bytes,
3218 				      &hw_dump_size_bytes);
3219 	if (status != DBG_STATUS_OK)
3220 		return 0;
3221 
3222 	hw_dump_size_dwords = BYTES_TO_DWORDS(hw_dump_size_bytes);
3223 
3224 	/* Dump HW dump image section */
3225 	offset += qed_dump_section_hdr(dump_buf + offset,
3226 				       dump, "mcp_hw_dump", 1);
3227 	offset += qed_dump_num_param(dump_buf + offset,
3228 				     dump, "size", hw_dump_size_dwords);
3229 
3230 	/* Read MCP HW dump image into dump buffer */
3231 	if (dump && hw_dump_size_dwords) {
3232 		status = qed_nvram_read(p_hwfn,
3233 					p_ptt,
3234 					hw_dump_offset_bytes,
3235 					hw_dump_size_bytes, dump_buf + offset);
3236 		if (status != DBG_STATUS_OK) {
3237 			DP_NOTICE(p_hwfn,
3238 				  "Failed to read MCP HW Dump image from NVRAM\n");
3239 			return 0;
3240 		}
3241 	}
3242 	offset += hw_dump_size_dwords;
3243 
3244 	return offset;
3245 }
3246 
3247 /* Dumps Static Debug data. Returns the dumped size in dwords. */
3248 static u32 qed_grc_dump_static_debug(struct qed_hwfn *p_hwfn,
3249 				     struct qed_ptt *p_ptt,
3250 				     u32 *dump_buf, bool dump)
3251 {
3252 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3253 	u32 block_id, line_id, offset = 0, addr, len;
3254 
3255 	/* Don't dump static debug if a debug bus recording is in progress */
3256 	if (dump && qed_rd(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON))
3257 		return 0;
3258 
3259 	if (dump) {
3260 		/* Disable debug bus in all blocks */
3261 		qed_bus_disable_blocks(p_hwfn, p_ptt);
3262 
3263 		qed_bus_reset_dbg_block(p_hwfn, p_ptt);
3264 		qed_wr(p_hwfn,
3265 		       p_ptt, DBG_REG_FRAMING_MODE, DBG_BUS_FRAME_MODE_8HW);
3266 		qed_wr(p_hwfn,
3267 		       p_ptt, DBG_REG_DEBUG_TARGET, DBG_BUS_TARGET_ID_INT_BUF);
3268 		qed_wr(p_hwfn, p_ptt, DBG_REG_FULL_MODE, 1);
3269 		qed_bus_enable_dbg_block(p_hwfn, p_ptt, true);
3270 	}
3271 
3272 	/* Dump all static debug lines for each relevant block */
3273 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
3274 		const struct dbg_block_chip *block_per_chip;
3275 		const struct dbg_block *block;
3276 		bool is_removed, has_dbg_bus;
3277 		u16 modes_buf_offset;
3278 		u32 block_dwords;
3279 
3280 		block_per_chip =
3281 		    qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)block_id);
3282 		is_removed = GET_FIELD(block_per_chip->flags,
3283 				       DBG_BLOCK_CHIP_IS_REMOVED);
3284 		has_dbg_bus = GET_FIELD(block_per_chip->flags,
3285 					DBG_BLOCK_CHIP_HAS_DBG_BUS);
3286 
3287 		/* read+clear for NWS parity is not working, skip NWS block */
3288 		if (block_id == BLOCK_NWS)
3289 			continue;
3290 
3291 		if (!is_removed && has_dbg_bus &&
3292 		    GET_FIELD(block_per_chip->dbg_bus_mode.data,
3293 			      DBG_MODE_HDR_EVAL_MODE) > 0) {
3294 			modes_buf_offset =
3295 			    GET_FIELD(block_per_chip->dbg_bus_mode.data,
3296 				      DBG_MODE_HDR_MODES_BUF_OFFSET);
3297 			if (!qed_is_mode_match(p_hwfn, &modes_buf_offset))
3298 				has_dbg_bus = false;
3299 		}
3300 
3301 		if (is_removed || !has_dbg_bus)
3302 			continue;
3303 
3304 		block_dwords = NUM_DBG_LINES(block_per_chip) *
3305 			       STATIC_DEBUG_LINE_DWORDS;
3306 
3307 		/* Dump static section params */
3308 		block = get_dbg_block(p_hwfn, (enum block_id)block_id);
3309 		offset += qed_grc_dump_mem_hdr(p_hwfn,
3310 					       dump_buf + offset,
3311 					       dump,
3312 					       block->name,
3313 					       0,
3314 					       block_dwords,
3315 					       32, false, "STATIC", 0);
3316 
3317 		if (!dump) {
3318 			offset += block_dwords;
3319 			continue;
3320 		}
3321 
3322 		/* If all lines are invalid - dump zeros */
3323 		if (dev_data->block_in_reset[block_id]) {
3324 			memset(dump_buf + offset, 0,
3325 			       DWORDS_TO_BYTES(block_dwords));
3326 			offset += block_dwords;
3327 			continue;
3328 		}
3329 
3330 		/* Enable block's client */
3331 		qed_bus_enable_clients(p_hwfn,
3332 				       p_ptt,
3333 				       BIT(block_per_chip->dbg_client_id));
3334 
3335 		addr = BYTES_TO_DWORDS(DBG_REG_CALENDAR_OUT_DATA);
3336 		len = STATIC_DEBUG_LINE_DWORDS;
3337 		for (line_id = 0; line_id < (u32)NUM_DBG_LINES(block_per_chip);
3338 		     line_id++) {
3339 			/* Configure debug line ID */
3340 			qed_bus_config_dbg_line(p_hwfn,
3341 						p_ptt,
3342 						(enum block_id)block_id,
3343 						(u8)line_id, 0xf, 0, 0, 0);
3344 
3345 			/* Read debug line info */
3346 			offset += qed_grc_dump_addr_range(p_hwfn,
3347 							  p_ptt,
3348 							  dump_buf + offset,
3349 							  dump,
3350 							  addr,
3351 							  len,
3352 							  true, SPLIT_TYPE_NONE,
3353 							  0);
3354 		}
3355 
3356 		/* Disable block's client and debug output */
3357 		qed_bus_enable_clients(p_hwfn, p_ptt, 0);
3358 		qed_bus_config_dbg_line(p_hwfn, p_ptt,
3359 					(enum block_id)block_id, 0, 0, 0, 0, 0);
3360 	}
3361 
3362 	if (dump) {
3363 		qed_bus_enable_dbg_block(p_hwfn, p_ptt, false);
3364 		qed_bus_enable_clients(p_hwfn, p_ptt, 0);
3365 	}
3366 
3367 	return offset;
3368 }
3369 
3370 /* Performs GRC Dump to the specified buffer.
3371  * Returns the dumped size in dwords.
3372  */
3373 static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn,
3374 				    struct qed_ptt *p_ptt,
3375 				    u32 *dump_buf,
3376 				    bool dump, u32 *num_dumped_dwords)
3377 {
3378 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3379 	u32 dwords_read, offset = 0;
3380 	bool parities_masked = false;
3381 	u8 i;
3382 
3383 	*num_dumped_dwords = 0;
3384 	dev_data->num_regs_read = 0;
3385 
3386 	/* Update reset state */
3387 	if (dump)
3388 		qed_update_blocks_reset_state(p_hwfn, p_ptt);
3389 
3390 	/* Dump global params */
3391 	offset += qed_dump_common_global_params(p_hwfn,
3392 						p_ptt,
3393 						dump_buf + offset, dump, 4);
3394 	offset += qed_dump_str_param(dump_buf + offset,
3395 				     dump, "dump-type", "grc-dump");
3396 	offset += qed_dump_num_param(dump_buf + offset,
3397 				     dump,
3398 				     "num-lcids",
3399 				     NUM_OF_LCIDS);
3400 	offset += qed_dump_num_param(dump_buf + offset,
3401 				     dump,
3402 				     "num-ltids",
3403 				     NUM_OF_LTIDS);
3404 	offset += qed_dump_num_param(dump_buf + offset,
3405 				     dump, "num-ports", dev_data->num_ports);
3406 
3407 	/* Dump reset registers (dumped before taking blocks out of reset ) */
3408 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS))
3409 		offset += qed_grc_dump_reset_regs(p_hwfn,
3410 						  p_ptt,
3411 						  dump_buf + offset, dump);
3412 
3413 	/* Take all blocks out of reset (using reset registers) */
3414 	if (dump) {
3415 		qed_grc_unreset_blocks(p_hwfn, p_ptt, false);
3416 		qed_update_blocks_reset_state(p_hwfn, p_ptt);
3417 	}
3418 
3419 	/* Disable all parities using MFW command */
3420 	if (dump &&
3421 	    !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) {
3422 		parities_masked = !qed_mcp_mask_parities(p_hwfn, p_ptt, 1);
3423 		if (!parities_masked) {
3424 			DP_NOTICE(p_hwfn,
3425 				  "Failed to mask parities using MFW\n");
3426 			if (qed_grc_get_param
3427 			    (p_hwfn, DBG_GRC_PARAM_PARITY_SAFE))
3428 				return DBG_STATUS_MCP_COULD_NOT_MASK_PRTY;
3429 		}
3430 	}
3431 
3432 	/* Dump modified registers (dumped before modifying them) */
3433 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS))
3434 		offset += qed_grc_dump_modified_regs(p_hwfn,
3435 						     p_ptt,
3436 						     dump_buf + offset, dump);
3437 
3438 	/* Stall storms */
3439 	if (dump &&
3440 	    (qed_grc_is_included(p_hwfn,
3441 				 DBG_GRC_PARAM_DUMP_IOR) ||
3442 	     qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)))
3443 		qed_grc_stall_storms(p_hwfn, p_ptt, true);
3444 
3445 	/* Dump all regs  */
3446 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) {
3447 		bool block_enable[MAX_BLOCK_ID];
3448 
3449 		/* Dump all blocks except MCP */
3450 		for (i = 0; i < MAX_BLOCK_ID; i++)
3451 			block_enable[i] = true;
3452 		block_enable[BLOCK_MCP] = false;
3453 		offset += qed_grc_dump_registers(p_hwfn,
3454 						 p_ptt,
3455 						 dump_buf +
3456 						 offset,
3457 						 dump,
3458 						 block_enable, NULL);
3459 
3460 		/* Dump special registers */
3461 		offset += qed_grc_dump_special_regs(p_hwfn,
3462 						    p_ptt,
3463 						    dump_buf + offset, dump);
3464 	}
3465 
3466 	/* Dump memories */
3467 	offset += qed_grc_dump_memories(p_hwfn, p_ptt, dump_buf + offset, dump);
3468 
3469 	/* Dump MCP */
3470 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP))
3471 		offset += qed_grc_dump_mcp(p_hwfn,
3472 					   p_ptt, dump_buf + offset, dump);
3473 
3474 	/* Dump context */
3475 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX))
3476 		offset += qed_grc_dump_ctx(p_hwfn,
3477 					   p_ptt, dump_buf + offset, dump);
3478 
3479 	/* Dump RSS memories */
3480 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RSS))
3481 		offset += qed_grc_dump_rss(p_hwfn,
3482 					   p_ptt, dump_buf + offset, dump);
3483 
3484 	/* Dump Big RAM */
3485 	for (i = 0; i < NUM_BIG_RAM_TYPES; i++)
3486 		if (qed_grc_is_included(p_hwfn, s_big_ram_defs[i].grc_param))
3487 			offset += qed_grc_dump_big_ram(p_hwfn,
3488 						       p_ptt,
3489 						       dump_buf + offset,
3490 						       dump, i);
3491 
3492 	/* Dump VFC */
3493 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)) {
3494 		dwords_read = qed_grc_dump_vfc(p_hwfn,
3495 					       p_ptt, dump_buf + offset, dump);
3496 		offset += dwords_read;
3497 		if (!dwords_read)
3498 			return DBG_STATUS_VFC_READ_ERROR;
3499 	}
3500 
3501 	/* Dump PHY tbus */
3502 	if (qed_grc_is_included(p_hwfn,
3503 				DBG_GRC_PARAM_DUMP_PHY) && dev_data->chip_id ==
3504 	    CHIP_K2 && dev_data->hw_type == HW_TYPE_ASIC)
3505 		offset += qed_grc_dump_phy(p_hwfn,
3506 					   p_ptt, dump_buf + offset, dump);
3507 
3508 	/* Dump MCP HW Dump */
3509 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP_HW_DUMP) &&
3510 	    !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP) && 1)
3511 		offset += qed_grc_dump_mcp_hw_dump(p_hwfn,
3512 						   p_ptt,
3513 						   dump_buf + offset, dump);
3514 
3515 	/* Dump static debug data (only if not during debug bus recording) */
3516 	if (qed_grc_is_included(p_hwfn,
3517 				DBG_GRC_PARAM_DUMP_STATIC) &&
3518 	    (!dump || dev_data->bus.state == DBG_BUS_STATE_IDLE))
3519 		offset += qed_grc_dump_static_debug(p_hwfn,
3520 						    p_ptt,
3521 						    dump_buf + offset, dump);
3522 
3523 	/* Dump last section */
3524 	offset += qed_dump_last_section(dump_buf, offset, dump);
3525 
3526 	if (dump) {
3527 		/* Unstall storms */
3528 		if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_UNSTALL))
3529 			qed_grc_stall_storms(p_hwfn, p_ptt, false);
3530 
3531 		/* Clear parity status */
3532 		qed_grc_clear_all_prty(p_hwfn, p_ptt);
3533 
3534 		/* Enable all parities using MFW command */
3535 		if (parities_masked)
3536 			qed_mcp_mask_parities(p_hwfn, p_ptt, 0);
3537 	}
3538 
3539 	*num_dumped_dwords = offset;
3540 
3541 	return DBG_STATUS_OK;
3542 }
3543 
3544 /* Writes the specified failing Idle Check rule to the specified buffer.
3545  * Returns the dumped size in dwords.
3546  */
3547 static u32 qed_idle_chk_dump_failure(struct qed_hwfn *p_hwfn,
3548 				     struct qed_ptt *p_ptt,
3549 				     u32 *
3550 				     dump_buf,
3551 				     bool dump,
3552 				     u16 rule_id,
3553 				     const struct dbg_idle_chk_rule *rule,
3554 				     u16 fail_entry_id, u32 *cond_reg_values)
3555 {
3556 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3557 	const struct dbg_idle_chk_cond_reg *cond_regs;
3558 	const struct dbg_idle_chk_info_reg *info_regs;
3559 	u32 i, next_reg_offset = 0, offset = 0;
3560 	struct dbg_idle_chk_result_hdr *hdr;
3561 	const union dbg_idle_chk_reg *regs;
3562 	u8 reg_id;
3563 
3564 	hdr = (struct dbg_idle_chk_result_hdr *)dump_buf;
3565 	regs = (const union dbg_idle_chk_reg *)
3566 		p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr +
3567 		rule->reg_offset;
3568 	cond_regs = &regs[0].cond_reg;
3569 	info_regs = &regs[rule->num_cond_regs].info_reg;
3570 
3571 	/* Dump rule data */
3572 	if (dump) {
3573 		memset(hdr, 0, sizeof(*hdr));
3574 		hdr->rule_id = rule_id;
3575 		hdr->mem_entry_id = fail_entry_id;
3576 		hdr->severity = rule->severity;
3577 		hdr->num_dumped_cond_regs = rule->num_cond_regs;
3578 	}
3579 
3580 	offset += IDLE_CHK_RESULT_HDR_DWORDS;
3581 
3582 	/* Dump condition register values */
3583 	for (reg_id = 0; reg_id < rule->num_cond_regs; reg_id++) {
3584 		const struct dbg_idle_chk_cond_reg *reg = &cond_regs[reg_id];
3585 		struct dbg_idle_chk_result_reg_hdr *reg_hdr;
3586 
3587 		reg_hdr =
3588 		    (struct dbg_idle_chk_result_reg_hdr *)(dump_buf + offset);
3589 
3590 		/* Write register header */
3591 		if (!dump) {
3592 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS +
3593 			    reg->entry_size;
3594 			continue;
3595 		}
3596 
3597 		offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
3598 		memset(reg_hdr, 0, sizeof(*reg_hdr));
3599 		reg_hdr->start_entry = reg->start_entry;
3600 		reg_hdr->size = reg->entry_size;
3601 		SET_FIELD(reg_hdr->data,
3602 			  DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM,
3603 			  reg->num_entries > 1 || reg->start_entry > 0 ? 1 : 0);
3604 		SET_FIELD(reg_hdr->data,
3605 			  DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, reg_id);
3606 
3607 		/* Write register values */
3608 		for (i = 0; i < reg_hdr->size; i++, next_reg_offset++, offset++)
3609 			dump_buf[offset] = cond_reg_values[next_reg_offset];
3610 	}
3611 
3612 	/* Dump info register values */
3613 	for (reg_id = 0; reg_id < rule->num_info_regs; reg_id++) {
3614 		const struct dbg_idle_chk_info_reg *reg = &info_regs[reg_id];
3615 		u32 block_id;
3616 
3617 		/* Check if register's block is in reset */
3618 		if (!dump) {
3619 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + reg->size;
3620 			continue;
3621 		}
3622 
3623 		block_id = GET_FIELD(reg->data, DBG_IDLE_CHK_INFO_REG_BLOCK_ID);
3624 		if (block_id >= MAX_BLOCK_ID) {
3625 			DP_NOTICE(p_hwfn, "Invalid block_id\n");
3626 			return 0;
3627 		}
3628 
3629 		if (!dev_data->block_in_reset[block_id]) {
3630 			struct dbg_idle_chk_result_reg_hdr *reg_hdr;
3631 			bool wide_bus, eval_mode, mode_match = true;
3632 			u16 modes_buf_offset;
3633 			u32 addr;
3634 
3635 			reg_hdr = (struct dbg_idle_chk_result_reg_hdr *)
3636 				  (dump_buf + offset);
3637 
3638 			/* Check mode */
3639 			eval_mode = GET_FIELD(reg->mode.data,
3640 					      DBG_MODE_HDR_EVAL_MODE) > 0;
3641 			if (eval_mode) {
3642 				modes_buf_offset =
3643 				    GET_FIELD(reg->mode.data,
3644 					      DBG_MODE_HDR_MODES_BUF_OFFSET);
3645 				mode_match =
3646 					qed_is_mode_match(p_hwfn,
3647 							  &modes_buf_offset);
3648 			}
3649 
3650 			if (!mode_match)
3651 				continue;
3652 
3653 			addr = GET_FIELD(reg->data,
3654 					 DBG_IDLE_CHK_INFO_REG_ADDRESS);
3655 			wide_bus = GET_FIELD(reg->data,
3656 					     DBG_IDLE_CHK_INFO_REG_WIDE_BUS);
3657 
3658 			/* Write register header */
3659 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
3660 			hdr->num_dumped_info_regs++;
3661 			memset(reg_hdr, 0, sizeof(*reg_hdr));
3662 			reg_hdr->size = reg->size;
3663 			SET_FIELD(reg_hdr->data,
3664 				  DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID,
3665 				  rule->num_cond_regs + reg_id);
3666 
3667 			/* Write register values */
3668 			offset += qed_grc_dump_addr_range(p_hwfn,
3669 							  p_ptt,
3670 							  dump_buf + offset,
3671 							  dump,
3672 							  addr,
3673 							  reg->size, wide_bus,
3674 							  SPLIT_TYPE_NONE, 0);
3675 		}
3676 	}
3677 
3678 	return offset;
3679 }
3680 
3681 /* Dumps idle check rule entries. Returns the dumped size in dwords. */
3682 static u32
3683 qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
3684 			       u32 *dump_buf, bool dump,
3685 			       const struct dbg_idle_chk_rule *input_rules,
3686 			       u32 num_input_rules, u32 *num_failing_rules)
3687 {
3688 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3689 	u32 cond_reg_values[IDLE_CHK_MAX_ENTRIES_SIZE];
3690 	u32 i, offset = 0;
3691 	u16 entry_id;
3692 	u8 reg_id;
3693 
3694 	*num_failing_rules = 0;
3695 
3696 	for (i = 0; i < num_input_rules; i++) {
3697 		const struct dbg_idle_chk_cond_reg *cond_regs;
3698 		const struct dbg_idle_chk_rule *rule;
3699 		const union dbg_idle_chk_reg *regs;
3700 		u16 num_reg_entries = 1;
3701 		bool check_rule = true;
3702 		const u32 *imm_values;
3703 
3704 		rule = &input_rules[i];
3705 		regs = (const union dbg_idle_chk_reg *)
3706 			p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr +
3707 			rule->reg_offset;
3708 		cond_regs = &regs[0].cond_reg;
3709 		imm_values =
3710 		    (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr +
3711 		    rule->imm_offset;
3712 
3713 		/* Check if all condition register blocks are out of reset, and
3714 		 * find maximal number of entries (all condition registers that
3715 		 * are memories must have the same size, which is > 1).
3716 		 */
3717 		for (reg_id = 0; reg_id < rule->num_cond_regs && check_rule;
3718 		     reg_id++) {
3719 			u32 block_id =
3720 				GET_FIELD(cond_regs[reg_id].data,
3721 					  DBG_IDLE_CHK_COND_REG_BLOCK_ID);
3722 
3723 			if (block_id >= MAX_BLOCK_ID) {
3724 				DP_NOTICE(p_hwfn, "Invalid block_id\n");
3725 				return 0;
3726 			}
3727 
3728 			check_rule = !dev_data->block_in_reset[block_id];
3729 			if (cond_regs[reg_id].num_entries > num_reg_entries)
3730 				num_reg_entries = cond_regs[reg_id].num_entries;
3731 		}
3732 
3733 		if (!check_rule && dump)
3734 			continue;
3735 
3736 		if (!dump) {
3737 			u32 entry_dump_size =
3738 				qed_idle_chk_dump_failure(p_hwfn,
3739 							  p_ptt,
3740 							  dump_buf + offset,
3741 							  false,
3742 							  rule->rule_id,
3743 							  rule,
3744 							  0,
3745 							  NULL);
3746 
3747 			offset += num_reg_entries * entry_dump_size;
3748 			(*num_failing_rules) += num_reg_entries;
3749 			continue;
3750 		}
3751 
3752 		/* Go over all register entries (number of entries is the same
3753 		 * for all condition registers).
3754 		 */
3755 		for (entry_id = 0; entry_id < num_reg_entries; entry_id++) {
3756 			u32 next_reg_offset = 0;
3757 
3758 			/* Read current entry of all condition registers */
3759 			for (reg_id = 0; reg_id < rule->num_cond_regs;
3760 			     reg_id++) {
3761 				const struct dbg_idle_chk_cond_reg *reg =
3762 					&cond_regs[reg_id];
3763 				u32 padded_entry_size, addr;
3764 				bool wide_bus;
3765 
3766 				/* Find GRC address (if it's a memory, the
3767 				 * address of the specific entry is calculated).
3768 				 */
3769 				addr = GET_FIELD(reg->data,
3770 						 DBG_IDLE_CHK_COND_REG_ADDRESS);
3771 				wide_bus =
3772 				    GET_FIELD(reg->data,
3773 					      DBG_IDLE_CHK_COND_REG_WIDE_BUS);
3774 				if (reg->num_entries > 1 ||
3775 				    reg->start_entry > 0) {
3776 					padded_entry_size =
3777 					   reg->entry_size > 1 ?
3778 					   roundup_pow_of_two(reg->entry_size) :
3779 					   1;
3780 					addr += (reg->start_entry + entry_id) *
3781 						padded_entry_size;
3782 				}
3783 
3784 				/* Read registers */
3785 				if (next_reg_offset + reg->entry_size >=
3786 				    IDLE_CHK_MAX_ENTRIES_SIZE) {
3787 					DP_NOTICE(p_hwfn,
3788 						  "idle check registers entry is too large\n");
3789 					return 0;
3790 				}
3791 
3792 				next_reg_offset +=
3793 				    qed_grc_dump_addr_range(p_hwfn, p_ptt,
3794 							    cond_reg_values +
3795 							    next_reg_offset,
3796 							    dump, addr,
3797 							    reg->entry_size,
3798 							    wide_bus,
3799 							    SPLIT_TYPE_NONE, 0);
3800 			}
3801 
3802 			/* Call rule condition function.
3803 			 * If returns true, it's a failure.
3804 			 */
3805 			if ((*cond_arr[rule->cond_id]) (cond_reg_values,
3806 							imm_values)) {
3807 				offset += qed_idle_chk_dump_failure(p_hwfn,
3808 							p_ptt,
3809 							dump_buf + offset,
3810 							dump,
3811 							rule->rule_id,
3812 							rule,
3813 							entry_id,
3814 							cond_reg_values);
3815 				(*num_failing_rules)++;
3816 			}
3817 		}
3818 	}
3819 
3820 	return offset;
3821 }
3822 
3823 /* Performs Idle Check Dump to the specified buffer.
3824  * Returns the dumped size in dwords.
3825  */
3826 static u32 qed_idle_chk_dump(struct qed_hwfn *p_hwfn,
3827 			     struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3828 {
3829 	struct virt_mem_desc *dbg_buf =
3830 	    &p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES];
3831 	u32 num_failing_rules_offset, offset = 0,
3832 	    input_offset = 0, num_failing_rules = 0;
3833 
3834 	/* Dump global params  - 1 must match below amount of params */
3835 	offset += qed_dump_common_global_params(p_hwfn,
3836 						p_ptt,
3837 						dump_buf + offset, dump, 1);
3838 	offset += qed_dump_str_param(dump_buf + offset,
3839 				     dump, "dump-type", "idle-chk");
3840 
3841 	/* Dump idle check section header with a single parameter */
3842 	offset += qed_dump_section_hdr(dump_buf + offset, dump, "idle_chk", 1);
3843 	num_failing_rules_offset = offset;
3844 	offset += qed_dump_num_param(dump_buf + offset, dump, "num_rules", 0);
3845 
3846 	while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
3847 		const struct dbg_idle_chk_cond_hdr *cond_hdr =
3848 		    (const struct dbg_idle_chk_cond_hdr *)dbg_buf->ptr +
3849 		    input_offset++;
3850 		bool eval_mode, mode_match = true;
3851 		u32 curr_failing_rules;
3852 		u16 modes_buf_offset;
3853 
3854 		/* Check mode */
3855 		eval_mode = GET_FIELD(cond_hdr->mode.data,
3856 				      DBG_MODE_HDR_EVAL_MODE) > 0;
3857 		if (eval_mode) {
3858 			modes_buf_offset =
3859 				GET_FIELD(cond_hdr->mode.data,
3860 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
3861 			mode_match = qed_is_mode_match(p_hwfn,
3862 						       &modes_buf_offset);
3863 		}
3864 
3865 		if (mode_match) {
3866 			const struct dbg_idle_chk_rule *rule =
3867 			    (const struct dbg_idle_chk_rule *)((u32 *)
3868 							       dbg_buf->ptr
3869 							       + input_offset);
3870 			u32 num_input_rules =
3871 				cond_hdr->data_size / IDLE_CHK_RULE_SIZE_DWORDS;
3872 			offset +=
3873 			    qed_idle_chk_dump_rule_entries(p_hwfn,
3874 							   p_ptt,
3875 							   dump_buf +
3876 							   offset,
3877 							   dump,
3878 							   rule,
3879 							   num_input_rules,
3880 							   &curr_failing_rules);
3881 			num_failing_rules += curr_failing_rules;
3882 		}
3883 
3884 		input_offset += cond_hdr->data_size;
3885 	}
3886 
3887 	/* Overwrite num_rules parameter */
3888 	if (dump)
3889 		qed_dump_num_param(dump_buf + num_failing_rules_offset,
3890 				   dump, "num_rules", num_failing_rules);
3891 
3892 	/* Dump last section */
3893 	offset += qed_dump_last_section(dump_buf, offset, dump);
3894 
3895 	return offset;
3896 }
3897 
3898 /* Finds the meta data image in NVRAM */
3899 static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn,
3900 					    struct qed_ptt *p_ptt,
3901 					    u32 image_type,
3902 					    u32 *nvram_offset_bytes,
3903 					    u32 *nvram_size_bytes)
3904 {
3905 	u32 ret_mcp_resp, ret_mcp_param, ret_txn_size;
3906 	struct mcp_file_att file_att;
3907 	int nvm_result;
3908 
3909 	/* Call NVRAM get file command */
3910 	nvm_result = qed_mcp_nvm_rd_cmd(p_hwfn,
3911 					p_ptt,
3912 					DRV_MSG_CODE_NVM_GET_FILE_ATT,
3913 					image_type,
3914 					&ret_mcp_resp,
3915 					&ret_mcp_param,
3916 					&ret_txn_size, (u32 *)&file_att);
3917 
3918 	/* Check response */
3919 	if (nvm_result ||
3920 	    (ret_mcp_resp & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK)
3921 		return DBG_STATUS_NVRAM_GET_IMAGE_FAILED;
3922 
3923 	/* Update return values */
3924 	*nvram_offset_bytes = file_att.nvm_start_addr;
3925 	*nvram_size_bytes = file_att.len;
3926 
3927 	DP_VERBOSE(p_hwfn,
3928 		   QED_MSG_DEBUG,
3929 		   "find_nvram_image: found NVRAM image of type %d in NVRAM offset %d bytes with size %d bytes\n",
3930 		   image_type, *nvram_offset_bytes, *nvram_size_bytes);
3931 
3932 	/* Check alignment */
3933 	if (*nvram_size_bytes & 0x3)
3934 		return DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE;
3935 
3936 	return DBG_STATUS_OK;
3937 }
3938 
3939 /* Reads data from NVRAM */
3940 static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn,
3941 				      struct qed_ptt *p_ptt,
3942 				      u32 nvram_offset_bytes,
3943 				      u32 nvram_size_bytes, u32 *ret_buf)
3944 {
3945 	u32 ret_mcp_resp, ret_mcp_param, ret_read_size, bytes_to_copy;
3946 	s32 bytes_left = nvram_size_bytes;
3947 	u32 read_offset = 0, param = 0;
3948 
3949 	DP_VERBOSE(p_hwfn,
3950 		   QED_MSG_DEBUG,
3951 		   "nvram_read: reading image of size %d bytes from NVRAM\n",
3952 		   nvram_size_bytes);
3953 
3954 	do {
3955 		bytes_to_copy =
3956 		    (bytes_left >
3957 		     MCP_DRV_NVM_BUF_LEN) ? MCP_DRV_NVM_BUF_LEN : bytes_left;
3958 
3959 		/* Call NVRAM read command */
3960 		SET_MFW_FIELD(param,
3961 			      DRV_MB_PARAM_NVM_OFFSET,
3962 			      nvram_offset_bytes + read_offset);
3963 		SET_MFW_FIELD(param, DRV_MB_PARAM_NVM_LEN, bytes_to_copy);
3964 		if (qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt,
3965 				       DRV_MSG_CODE_NVM_READ_NVRAM, param,
3966 				       &ret_mcp_resp,
3967 				       &ret_mcp_param, &ret_read_size,
3968 				       (u32 *)((u8 *)ret_buf + read_offset)))
3969 			return DBG_STATUS_NVRAM_READ_FAILED;
3970 
3971 		/* Check response */
3972 		if ((ret_mcp_resp & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK)
3973 			return DBG_STATUS_NVRAM_READ_FAILED;
3974 
3975 		/* Update read offset */
3976 		read_offset += ret_read_size;
3977 		bytes_left -= ret_read_size;
3978 	} while (bytes_left > 0);
3979 
3980 	return DBG_STATUS_OK;
3981 }
3982 
3983 /* Get info on the MCP Trace data in the scratchpad:
3984  * - trace_data_grc_addr (OUT): trace data GRC address in bytes
3985  * - trace_data_size (OUT): trace data size in bytes (without the header)
3986  */
3987 static enum dbg_status qed_mcp_trace_get_data_info(struct qed_hwfn *p_hwfn,
3988 						   struct qed_ptt *p_ptt,
3989 						   u32 *trace_data_grc_addr,
3990 						   u32 *trace_data_size)
3991 {
3992 	u32 spad_trace_offsize, signature;
3993 
3994 	/* Read trace section offsize structure from MCP scratchpad */
3995 	spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR);
3996 
3997 	/* Extract trace section address from offsize (in scratchpad) */
3998 	*trace_data_grc_addr =
3999 		MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize);
4000 
4001 	/* Read signature from MCP trace section */
4002 	signature = qed_rd(p_hwfn, p_ptt,
4003 			   *trace_data_grc_addr +
4004 			   offsetof(struct mcp_trace, signature));
4005 
4006 	if (signature != MFW_TRACE_SIGNATURE)
4007 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
4008 
4009 	/* Read trace size from MCP trace section */
4010 	*trace_data_size = qed_rd(p_hwfn,
4011 				  p_ptt,
4012 				  *trace_data_grc_addr +
4013 				  offsetof(struct mcp_trace, size));
4014 
4015 	return DBG_STATUS_OK;
4016 }
4017 
4018 /* Reads MCP trace meta data image from NVRAM
4019  * - running_bundle_id (OUT): running bundle ID (invalid when loaded from file)
4020  * - trace_meta_offset (OUT): trace meta offset in NVRAM in bytes (invalid when
4021  *			      loaded from file).
4022  * - trace_meta_size (OUT):   size in bytes of the trace meta data.
4023  */
4024 static enum dbg_status qed_mcp_trace_get_meta_info(struct qed_hwfn *p_hwfn,
4025 						   struct qed_ptt *p_ptt,
4026 						   u32 trace_data_size_bytes,
4027 						   u32 *running_bundle_id,
4028 						   u32 *trace_meta_offset,
4029 						   u32 *trace_meta_size)
4030 {
4031 	u32 spad_trace_offsize, nvram_image_type, running_mfw_addr;
4032 
4033 	/* Read MCP trace section offsize structure from MCP scratchpad */
4034 	spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR);
4035 
4036 	/* Find running bundle ID */
4037 	running_mfw_addr =
4038 		MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize) +
4039 		QED_SECTION_SIZE(spad_trace_offsize) + trace_data_size_bytes;
4040 	*running_bundle_id = qed_rd(p_hwfn, p_ptt, running_mfw_addr);
4041 	if (*running_bundle_id > 1)
4042 		return DBG_STATUS_INVALID_NVRAM_BUNDLE;
4043 
4044 	/* Find image in NVRAM */
4045 	nvram_image_type =
4046 	    (*running_bundle_id ==
4047 	     DIR_ID_1) ? NVM_TYPE_MFW_TRACE1 : NVM_TYPE_MFW_TRACE2;
4048 	return qed_find_nvram_image(p_hwfn,
4049 				    p_ptt,
4050 				    nvram_image_type,
4051 				    trace_meta_offset, trace_meta_size);
4052 }
4053 
4054 /* Reads the MCP Trace meta data from NVRAM into the specified buffer */
4055 static enum dbg_status qed_mcp_trace_read_meta(struct qed_hwfn *p_hwfn,
4056 					       struct qed_ptt *p_ptt,
4057 					       u32 nvram_offset_in_bytes,
4058 					       u32 size_in_bytes, u32 *buf)
4059 {
4060 	u8 modules_num, module_len, i, *byte_buf = (u8 *)buf;
4061 	enum dbg_status status;
4062 	u32 signature;
4063 
4064 	/* Read meta data from NVRAM */
4065 	status = qed_nvram_read(p_hwfn,
4066 				p_ptt,
4067 				nvram_offset_in_bytes, size_in_bytes, buf);
4068 	if (status != DBG_STATUS_OK)
4069 		return status;
4070 
4071 	/* Extract and check first signature */
4072 	signature = qed_read_unaligned_dword(byte_buf);
4073 	byte_buf += sizeof(signature);
4074 	if (signature != NVM_MAGIC_VALUE)
4075 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
4076 
4077 	/* Extract number of modules */
4078 	modules_num = *(byte_buf++);
4079 
4080 	/* Skip all modules */
4081 	for (i = 0; i < modules_num; i++) {
4082 		module_len = *(byte_buf++);
4083 		byte_buf += module_len;
4084 	}
4085 
4086 	/* Extract and check second signature */
4087 	signature = qed_read_unaligned_dword(byte_buf);
4088 	byte_buf += sizeof(signature);
4089 	if (signature != NVM_MAGIC_VALUE)
4090 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
4091 
4092 	return DBG_STATUS_OK;
4093 }
4094 
4095 /* Dump MCP Trace */
4096 static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn,
4097 					  struct qed_ptt *p_ptt,
4098 					  u32 *dump_buf,
4099 					  bool dump, u32 *num_dumped_dwords)
4100 {
4101 	u32 trace_data_grc_addr, trace_data_size_bytes, trace_data_size_dwords;
4102 	u32 trace_meta_size_dwords = 0, running_bundle_id, offset = 0;
4103 	u32 trace_meta_offset_bytes = 0, trace_meta_size_bytes = 0;
4104 	enum dbg_status status;
4105 	int halted = 0;
4106 	bool use_mfw;
4107 
4108 	*num_dumped_dwords = 0;
4109 
4110 	use_mfw = !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP);
4111 
4112 	/* Get trace data info */
4113 	status = qed_mcp_trace_get_data_info(p_hwfn,
4114 					     p_ptt,
4115 					     &trace_data_grc_addr,
4116 					     &trace_data_size_bytes);
4117 	if (status != DBG_STATUS_OK)
4118 		return status;
4119 
4120 	/* Dump global params */
4121 	offset += qed_dump_common_global_params(p_hwfn,
4122 						p_ptt,
4123 						dump_buf + offset, dump, 1);
4124 	offset += qed_dump_str_param(dump_buf + offset,
4125 				     dump, "dump-type", "mcp-trace");
4126 
4127 	/* Halt MCP while reading from scratchpad so the read data will be
4128 	 * consistent. if halt fails, MCP trace is taken anyway, with a small
4129 	 * risk that it may be corrupt.
4130 	 */
4131 	if (dump && use_mfw) {
4132 		halted = !qed_mcp_halt(p_hwfn, p_ptt);
4133 		if (!halted)
4134 			DP_NOTICE(p_hwfn, "MCP halt failed!\n");
4135 	}
4136 
4137 	/* Find trace data size */
4138 	trace_data_size_dwords =
4139 	    DIV_ROUND_UP(trace_data_size_bytes + sizeof(struct mcp_trace),
4140 			 BYTES_IN_DWORD);
4141 
4142 	/* Dump trace data section header and param */
4143 	offset += qed_dump_section_hdr(dump_buf + offset,
4144 				       dump, "mcp_trace_data", 1);
4145 	offset += qed_dump_num_param(dump_buf + offset,
4146 				     dump, "size", trace_data_size_dwords);
4147 
4148 	/* Read trace data from scratchpad into dump buffer */
4149 	offset += qed_grc_dump_addr_range(p_hwfn,
4150 					  p_ptt,
4151 					  dump_buf + offset,
4152 					  dump,
4153 					  BYTES_TO_DWORDS(trace_data_grc_addr),
4154 					  trace_data_size_dwords, false,
4155 					  SPLIT_TYPE_NONE, 0);
4156 
4157 	/* Resume MCP (only if halt succeeded) */
4158 	if (halted && qed_mcp_resume(p_hwfn, p_ptt))
4159 		DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n");
4160 
4161 	/* Dump trace meta section header */
4162 	offset += qed_dump_section_hdr(dump_buf + offset,
4163 				       dump, "mcp_trace_meta", 1);
4164 
4165 	/* If MCP Trace meta size parameter was set, use it.
4166 	 * Otherwise, read trace meta.
4167 	 * trace_meta_size_bytes is dword-aligned.
4168 	 */
4169 	trace_meta_size_bytes =
4170 		qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_MCP_TRACE_META_SIZE);
4171 	if ((!trace_meta_size_bytes || dump) && use_mfw)
4172 		status = qed_mcp_trace_get_meta_info(p_hwfn,
4173 						     p_ptt,
4174 						     trace_data_size_bytes,
4175 						     &running_bundle_id,
4176 						     &trace_meta_offset_bytes,
4177 						     &trace_meta_size_bytes);
4178 	if (status == DBG_STATUS_OK)
4179 		trace_meta_size_dwords = BYTES_TO_DWORDS(trace_meta_size_bytes);
4180 
4181 	/* Dump trace meta size param */
4182 	offset += qed_dump_num_param(dump_buf + offset,
4183 				     dump, "size", trace_meta_size_dwords);
4184 
4185 	/* Read trace meta image into dump buffer */
4186 	if (dump && trace_meta_size_dwords)
4187 		status = qed_mcp_trace_read_meta(p_hwfn,
4188 						 p_ptt,
4189 						 trace_meta_offset_bytes,
4190 						 trace_meta_size_bytes,
4191 						 dump_buf + offset);
4192 	if (status == DBG_STATUS_OK)
4193 		offset += trace_meta_size_dwords;
4194 
4195 	/* Dump last section */
4196 	offset += qed_dump_last_section(dump_buf, offset, dump);
4197 
4198 	*num_dumped_dwords = offset;
4199 
4200 	/* If no mcp access, indicate that the dump doesn't contain the meta
4201 	 * data from NVRAM.
4202 	 */
4203 	return use_mfw ? status : DBG_STATUS_NVRAM_GET_IMAGE_FAILED;
4204 }
4205 
4206 /* Dump GRC FIFO */
4207 static enum dbg_status qed_reg_fifo_dump(struct qed_hwfn *p_hwfn,
4208 					 struct qed_ptt *p_ptt,
4209 					 u32 *dump_buf,
4210 					 bool dump, u32 *num_dumped_dwords)
4211 {
4212 	u32 dwords_read, size_param_offset, offset = 0, addr, len;
4213 	bool fifo_has_data;
4214 
4215 	*num_dumped_dwords = 0;
4216 
4217 	/* Dump global params */
4218 	offset += qed_dump_common_global_params(p_hwfn,
4219 						p_ptt,
4220 						dump_buf + offset, dump, 1);
4221 	offset += qed_dump_str_param(dump_buf + offset,
4222 				     dump, "dump-type", "reg-fifo");
4223 
4224 	/* Dump fifo data section header and param. The size param is 0 for
4225 	 * now, and is overwritten after reading the FIFO.
4226 	 */
4227 	offset += qed_dump_section_hdr(dump_buf + offset,
4228 				       dump, "reg_fifo_data", 1);
4229 	size_param_offset = offset;
4230 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
4231 
4232 	if (!dump) {
4233 		/* FIFO max size is REG_FIFO_DEPTH_DWORDS. There is no way to
4234 		 * test how much data is available, except for reading it.
4235 		 */
4236 		offset += REG_FIFO_DEPTH_DWORDS;
4237 		goto out;
4238 	}
4239 
4240 	fifo_has_data = qed_rd(p_hwfn, p_ptt,
4241 			       GRC_REG_TRACE_FIFO_VALID_DATA) > 0;
4242 
4243 	/* Pull available data from fifo. Use DMAE since this is widebus memory
4244 	 * and must be accessed atomically. Test for dwords_read not passing
4245 	 * buffer size since more entries could be added to the buffer as we are
4246 	 * emptying it.
4247 	 */
4248 	addr = BYTES_TO_DWORDS(GRC_REG_TRACE_FIFO);
4249 	len = REG_FIFO_ELEMENT_DWORDS;
4250 	for (dwords_read = 0;
4251 	     fifo_has_data && dwords_read < REG_FIFO_DEPTH_DWORDS;
4252 	     dwords_read += REG_FIFO_ELEMENT_DWORDS) {
4253 		offset += qed_grc_dump_addr_range(p_hwfn,
4254 						  p_ptt,
4255 						  dump_buf + offset,
4256 						  true,
4257 						  addr,
4258 						  len,
4259 						  true, SPLIT_TYPE_NONE,
4260 						  0);
4261 		fifo_has_data = qed_rd(p_hwfn, p_ptt,
4262 				       GRC_REG_TRACE_FIFO_VALID_DATA) > 0;
4263 	}
4264 
4265 	qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
4266 			   dwords_read);
4267 out:
4268 	/* Dump last section */
4269 	offset += qed_dump_last_section(dump_buf, offset, dump);
4270 
4271 	*num_dumped_dwords = offset;
4272 
4273 	return DBG_STATUS_OK;
4274 }
4275 
4276 /* Dump IGU FIFO */
4277 static enum dbg_status qed_igu_fifo_dump(struct qed_hwfn *p_hwfn,
4278 					 struct qed_ptt *p_ptt,
4279 					 u32 *dump_buf,
4280 					 bool dump, u32 *num_dumped_dwords)
4281 {
4282 	u32 dwords_read, size_param_offset, offset = 0, addr, len;
4283 	bool fifo_has_data;
4284 
4285 	*num_dumped_dwords = 0;
4286 
4287 	/* Dump global params */
4288 	offset += qed_dump_common_global_params(p_hwfn,
4289 						p_ptt,
4290 						dump_buf + offset, dump, 1);
4291 	offset += qed_dump_str_param(dump_buf + offset,
4292 				     dump, "dump-type", "igu-fifo");
4293 
4294 	/* Dump fifo data section header and param. The size param is 0 for
4295 	 * now, and is overwritten after reading the FIFO.
4296 	 */
4297 	offset += qed_dump_section_hdr(dump_buf + offset,
4298 				       dump, "igu_fifo_data", 1);
4299 	size_param_offset = offset;
4300 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
4301 
4302 	if (!dump) {
4303 		/* FIFO max size is IGU_FIFO_DEPTH_DWORDS. There is no way to
4304 		 * test how much data is available, except for reading it.
4305 		 */
4306 		offset += IGU_FIFO_DEPTH_DWORDS;
4307 		goto out;
4308 	}
4309 
4310 	fifo_has_data = qed_rd(p_hwfn, p_ptt,
4311 			       IGU_REG_ERROR_HANDLING_DATA_VALID) > 0;
4312 
4313 	/* Pull available data from fifo. Use DMAE since this is widebus memory
4314 	 * and must be accessed atomically. Test for dwords_read not passing
4315 	 * buffer size since more entries could be added to the buffer as we are
4316 	 * emptying it.
4317 	 */
4318 	addr = BYTES_TO_DWORDS(IGU_REG_ERROR_HANDLING_MEMORY);
4319 	len = IGU_FIFO_ELEMENT_DWORDS;
4320 	for (dwords_read = 0;
4321 	     fifo_has_data && dwords_read < IGU_FIFO_DEPTH_DWORDS;
4322 	     dwords_read += IGU_FIFO_ELEMENT_DWORDS) {
4323 		offset += qed_grc_dump_addr_range(p_hwfn,
4324 						  p_ptt,
4325 						  dump_buf + offset,
4326 						  true,
4327 						  addr,
4328 						  len,
4329 						  true, SPLIT_TYPE_NONE,
4330 						  0);
4331 		fifo_has_data = qed_rd(p_hwfn, p_ptt,
4332 				       IGU_REG_ERROR_HANDLING_DATA_VALID) > 0;
4333 	}
4334 
4335 	qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
4336 			   dwords_read);
4337 out:
4338 	/* Dump last section */
4339 	offset += qed_dump_last_section(dump_buf, offset, dump);
4340 
4341 	*num_dumped_dwords = offset;
4342 
4343 	return DBG_STATUS_OK;
4344 }
4345 
4346 /* Protection Override dump */
4347 static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn,
4348 						    struct qed_ptt *p_ptt,
4349 						    u32 *dump_buf,
4350 						    bool dump,
4351 						    u32 *num_dumped_dwords)
4352 {
4353 	u32 size_param_offset, override_window_dwords, offset = 0, addr;
4354 
4355 	*num_dumped_dwords = 0;
4356 
4357 	/* Dump global params */
4358 	offset += qed_dump_common_global_params(p_hwfn,
4359 						p_ptt,
4360 						dump_buf + offset, dump, 1);
4361 	offset += qed_dump_str_param(dump_buf + offset,
4362 				     dump, "dump-type", "protection-override");
4363 
4364 	/* Dump data section header and param. The size param is 0 for now,
4365 	 * and is overwritten after reading the data.
4366 	 */
4367 	offset += qed_dump_section_hdr(dump_buf + offset,
4368 				       dump, "protection_override_data", 1);
4369 	size_param_offset = offset;
4370 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
4371 
4372 	if (!dump) {
4373 		offset += PROTECTION_OVERRIDE_DEPTH_DWORDS;
4374 		goto out;
4375 	}
4376 
4377 	/* Add override window info to buffer */
4378 	override_window_dwords =
4379 		qed_rd(p_hwfn, p_ptt, GRC_REG_NUMBER_VALID_OVERRIDE_WINDOW) *
4380 		PROTECTION_OVERRIDE_ELEMENT_DWORDS;
4381 	if (override_window_dwords) {
4382 		addr = BYTES_TO_DWORDS(GRC_REG_PROTECTION_OVERRIDE_WINDOW);
4383 		offset += qed_grc_dump_addr_range(p_hwfn,
4384 						  p_ptt,
4385 						  dump_buf + offset,
4386 						  true,
4387 						  addr,
4388 						  override_window_dwords,
4389 						  true, SPLIT_TYPE_NONE, 0);
4390 		qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
4391 				   override_window_dwords);
4392 	}
4393 out:
4394 	/* Dump last section */
4395 	offset += qed_dump_last_section(dump_buf, offset, dump);
4396 
4397 	*num_dumped_dwords = offset;
4398 
4399 	return DBG_STATUS_OK;
4400 }
4401 
4402 /* Performs FW Asserts Dump to the specified buffer.
4403  * Returns the dumped size in dwords.
4404  */
4405 static u32 qed_fw_asserts_dump(struct qed_hwfn *p_hwfn,
4406 			       struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
4407 {
4408 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
4409 	struct fw_asserts_ram_section *asserts;
4410 	char storm_letter_str[2] = "?";
4411 	struct fw_info fw_info;
4412 	u32 offset = 0;
4413 	u8 storm_id;
4414 
4415 	/* Dump global params */
4416 	offset += qed_dump_common_global_params(p_hwfn,
4417 						p_ptt,
4418 						dump_buf + offset, dump, 1);
4419 	offset += qed_dump_str_param(dump_buf + offset,
4420 				     dump, "dump-type", "fw-asserts");
4421 
4422 	/* Find Storm dump size */
4423 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
4424 		u32 fw_asserts_section_addr, next_list_idx_addr, next_list_idx;
4425 		struct storm_defs *storm = &s_storm_defs[storm_id];
4426 		u32 last_list_idx, addr;
4427 
4428 		if (dev_data->block_in_reset[storm->sem_block_id])
4429 			continue;
4430 
4431 		/* Read FW info for the current Storm */
4432 		qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, &fw_info);
4433 
4434 		asserts = &fw_info.fw_asserts_section;
4435 
4436 		/* Dump FW Asserts section header and params */
4437 		storm_letter_str[0] = storm->letter;
4438 		offset += qed_dump_section_hdr(dump_buf + offset,
4439 					       dump, "fw_asserts", 2);
4440 		offset += qed_dump_str_param(dump_buf + offset,
4441 					     dump, "storm", storm_letter_str);
4442 		offset += qed_dump_num_param(dump_buf + offset,
4443 					     dump,
4444 					     "size",
4445 					     asserts->list_element_dword_size);
4446 
4447 		/* Read and dump FW Asserts data */
4448 		if (!dump) {
4449 			offset += asserts->list_element_dword_size;
4450 			continue;
4451 		}
4452 
4453 		addr = le16_to_cpu(asserts->section_ram_line_offset);
4454 		fw_asserts_section_addr = storm->sem_fast_mem_addr +
4455 					  SEM_FAST_REG_INT_RAM +
4456 					  RAM_LINES_TO_BYTES(addr);
4457 
4458 		next_list_idx_addr = fw_asserts_section_addr +
4459 			DWORDS_TO_BYTES(asserts->list_next_index_dword_offset);
4460 		next_list_idx = qed_rd(p_hwfn, p_ptt, next_list_idx_addr);
4461 		last_list_idx = (next_list_idx > 0 ?
4462 				 next_list_idx :
4463 				 asserts->list_num_elements) - 1;
4464 		addr = BYTES_TO_DWORDS(fw_asserts_section_addr) +
4465 		       asserts->list_dword_offset +
4466 		       last_list_idx * asserts->list_element_dword_size;
4467 		offset +=
4468 		    qed_grc_dump_addr_range(p_hwfn, p_ptt,
4469 					    dump_buf + offset,
4470 					    dump, addr,
4471 					    asserts->list_element_dword_size,
4472 						  false, SPLIT_TYPE_NONE, 0);
4473 	}
4474 
4475 	/* Dump last section */
4476 	offset += qed_dump_last_section(dump_buf, offset, dump);
4477 
4478 	return offset;
4479 }
4480 
4481 /* Dumps the specified ILT pages to the specified buffer.
4482  * Returns the dumped size in dwords.
4483  */
4484 static u32 qed_ilt_dump_pages_range(u32 *dump_buf,
4485 				    bool dump,
4486 				    u32 start_page_id,
4487 				    u32 num_pages,
4488 				    struct phys_mem_desc *ilt_pages,
4489 				    bool dump_page_ids)
4490 {
4491 	u32 page_id, end_page_id, offset = 0;
4492 
4493 	if (num_pages == 0)
4494 		return offset;
4495 
4496 	end_page_id = start_page_id + num_pages - 1;
4497 
4498 	for (page_id = start_page_id; page_id <= end_page_id; page_id++) {
4499 		struct phys_mem_desc *mem_desc = &ilt_pages[page_id];
4500 
4501 		/**
4502 		 *
4503 		 * if (page_id >= ->p_cxt_mngr->ilt_shadow_size)
4504 		 *     break;
4505 		 */
4506 
4507 		if (!ilt_pages[page_id].virt_addr)
4508 			continue;
4509 
4510 		if (dump_page_ids) {
4511 			/* Copy page ID to dump buffer */
4512 			if (dump)
4513 				*(dump_buf + offset) = page_id;
4514 			offset++;
4515 		} else {
4516 			/* Copy page memory to dump buffer */
4517 			if (dump)
4518 				memcpy(dump_buf + offset,
4519 				       mem_desc->virt_addr, mem_desc->size);
4520 			offset += BYTES_TO_DWORDS(mem_desc->size);
4521 		}
4522 	}
4523 
4524 	return offset;
4525 }
4526 
4527 /* Dumps a section containing the dumped ILT pages.
4528  * Returns the dumped size in dwords.
4529  */
4530 static u32 qed_ilt_dump_pages_section(struct qed_hwfn *p_hwfn,
4531 				      u32 *dump_buf,
4532 				      bool dump,
4533 				      u32 valid_conn_pf_pages,
4534 				      u32 valid_conn_vf_pages,
4535 				      struct phys_mem_desc *ilt_pages,
4536 				      bool dump_page_ids)
4537 {
4538 	struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients;
4539 	u32 pf_start_line, start_page_id, offset = 0;
4540 	u32 cdut_pf_init_pages, cdut_vf_init_pages;
4541 	u32 cdut_pf_work_pages, cdut_vf_work_pages;
4542 	u32 base_data_offset, size_param_offset;
4543 	u32 cdut_pf_pages, cdut_vf_pages;
4544 	const char *section_name;
4545 	u8 i;
4546 
4547 	section_name = dump_page_ids ? "ilt_page_ids" : "ilt_page_mem";
4548 	cdut_pf_init_pages = qed_get_cdut_num_pf_init_pages(p_hwfn);
4549 	cdut_vf_init_pages = qed_get_cdut_num_vf_init_pages(p_hwfn);
4550 	cdut_pf_work_pages = qed_get_cdut_num_pf_work_pages(p_hwfn);
4551 	cdut_vf_work_pages = qed_get_cdut_num_vf_work_pages(p_hwfn);
4552 	cdut_pf_pages = cdut_pf_init_pages + cdut_pf_work_pages;
4553 	cdut_vf_pages = cdut_vf_init_pages + cdut_vf_work_pages;
4554 	pf_start_line = p_hwfn->p_cxt_mngr->pf_start_line;
4555 
4556 	offset +=
4557 	    qed_dump_section_hdr(dump_buf + offset, dump, section_name, 1);
4558 
4559 	/* Dump size parameter (0 for now, overwritten with real size later) */
4560 	size_param_offset = offset;
4561 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
4562 	base_data_offset = offset;
4563 
4564 	/* CDUC pages are ordered as follows:
4565 	 * - PF pages - valid section (included in PF connection type mapping)
4566 	 * - PF pages - invalid section (not dumped)
4567 	 * - For each VF in the PF:
4568 	 *   - VF pages - valid section (included in VF connection type mapping)
4569 	 *   - VF pages - invalid section (not dumped)
4570 	 */
4571 	if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUC)) {
4572 		/* Dump connection PF pages */
4573 		start_page_id = clients[ILT_CLI_CDUC].first.val - pf_start_line;
4574 		offset += qed_ilt_dump_pages_range(dump_buf + offset,
4575 						   dump,
4576 						   start_page_id,
4577 						   valid_conn_pf_pages,
4578 						   ilt_pages, dump_page_ids);
4579 
4580 		/* Dump connection VF pages */
4581 		start_page_id += clients[ILT_CLI_CDUC].pf_total_lines;
4582 		for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count;
4583 		     i++, start_page_id += clients[ILT_CLI_CDUC].vf_total_lines)
4584 			offset += qed_ilt_dump_pages_range(dump_buf + offset,
4585 							   dump,
4586 							   start_page_id,
4587 							   valid_conn_vf_pages,
4588 							   ilt_pages,
4589 							   dump_page_ids);
4590 	}
4591 
4592 	/* CDUT pages are ordered as follows:
4593 	 * - PF init pages (not dumped)
4594 	 * - PF work pages
4595 	 * - For each VF in the PF:
4596 	 *   - VF init pages (not dumped)
4597 	 *   - VF work pages
4598 	 */
4599 	if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUT)) {
4600 		/* Dump task PF pages */
4601 		start_page_id = clients[ILT_CLI_CDUT].first.val +
4602 		    cdut_pf_init_pages - pf_start_line;
4603 		offset += qed_ilt_dump_pages_range(dump_buf + offset,
4604 						   dump,
4605 						   start_page_id,
4606 						   cdut_pf_work_pages,
4607 						   ilt_pages, dump_page_ids);
4608 
4609 		/* Dump task VF pages */
4610 		start_page_id = clients[ILT_CLI_CDUT].first.val +
4611 		    cdut_pf_pages + cdut_vf_init_pages - pf_start_line;
4612 		for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count;
4613 		     i++, start_page_id += cdut_vf_pages)
4614 			offset += qed_ilt_dump_pages_range(dump_buf + offset,
4615 							   dump,
4616 							   start_page_id,
4617 							   cdut_vf_work_pages,
4618 							   ilt_pages,
4619 							   dump_page_ids);
4620 	}
4621 
4622 	/* Overwrite size param */
4623 	if (dump)
4624 		qed_dump_num_param(dump_buf + size_param_offset,
4625 				   dump, "size", offset - base_data_offset);
4626 
4627 	return offset;
4628 }
4629 
4630 /* Performs ILT Dump to the specified buffer.
4631  * Returns the dumped size in dwords.
4632  */
4633 static u32 qed_ilt_dump(struct qed_hwfn *p_hwfn,
4634 			struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
4635 {
4636 	struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients;
4637 	u32 valid_conn_vf_cids, valid_conn_vf_pages, offset = 0;
4638 	u32 valid_conn_pf_cids, valid_conn_pf_pages, num_pages;
4639 	u32 num_cids_per_page, conn_ctx_size;
4640 	u32 cduc_page_size, cdut_page_size;
4641 	struct phys_mem_desc *ilt_pages;
4642 	u8 conn_type;
4643 
4644 	cduc_page_size = 1 <<
4645 	    (clients[ILT_CLI_CDUC].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN);
4646 	cdut_page_size = 1 <<
4647 	    (clients[ILT_CLI_CDUT].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN);
4648 	conn_ctx_size = p_hwfn->p_cxt_mngr->conn_ctx_size;
4649 	num_cids_per_page = (int)(cduc_page_size / conn_ctx_size);
4650 	ilt_pages = p_hwfn->p_cxt_mngr->ilt_shadow;
4651 
4652 	/* Dump global params - 22 must match number of params below */
4653 	offset += qed_dump_common_global_params(p_hwfn, p_ptt,
4654 						dump_buf + offset, dump, 22);
4655 	offset += qed_dump_str_param(dump_buf + offset,
4656 				     dump, "dump-type", "ilt-dump");
4657 	offset += qed_dump_num_param(dump_buf + offset,
4658 				     dump,
4659 				     "cduc-page-size", cduc_page_size);
4660 	offset += qed_dump_num_param(dump_buf + offset,
4661 				     dump,
4662 				     "cduc-first-page-id",
4663 				     clients[ILT_CLI_CDUC].first.val);
4664 	offset += qed_dump_num_param(dump_buf + offset,
4665 				     dump,
4666 				     "cduc-last-page-id",
4667 				     clients[ILT_CLI_CDUC].last.val);
4668 	offset += qed_dump_num_param(dump_buf + offset,
4669 				     dump,
4670 				     "cduc-num-pf-pages",
4671 				     clients
4672 				     [ILT_CLI_CDUC].pf_total_lines);
4673 	offset += qed_dump_num_param(dump_buf + offset,
4674 				     dump,
4675 				     "cduc-num-vf-pages",
4676 				     clients
4677 				     [ILT_CLI_CDUC].vf_total_lines);
4678 	offset += qed_dump_num_param(dump_buf + offset,
4679 				     dump,
4680 				     "max-conn-ctx-size",
4681 				     conn_ctx_size);
4682 	offset += qed_dump_num_param(dump_buf + offset,
4683 				     dump,
4684 				     "cdut-page-size", cdut_page_size);
4685 	offset += qed_dump_num_param(dump_buf + offset,
4686 				     dump,
4687 				     "cdut-first-page-id",
4688 				     clients[ILT_CLI_CDUT].first.val);
4689 	offset += qed_dump_num_param(dump_buf + offset,
4690 				     dump,
4691 				     "cdut-last-page-id",
4692 				     clients[ILT_CLI_CDUT].last.val);
4693 	offset += qed_dump_num_param(dump_buf + offset,
4694 				     dump,
4695 				     "cdut-num-pf-init-pages",
4696 				     qed_get_cdut_num_pf_init_pages(p_hwfn));
4697 	offset += qed_dump_num_param(dump_buf + offset,
4698 				     dump,
4699 				     "cdut-num-vf-init-pages",
4700 				     qed_get_cdut_num_vf_init_pages(p_hwfn));
4701 	offset += qed_dump_num_param(dump_buf + offset,
4702 				     dump,
4703 				     "cdut-num-pf-work-pages",
4704 				     qed_get_cdut_num_pf_work_pages(p_hwfn));
4705 	offset += qed_dump_num_param(dump_buf + offset,
4706 				     dump,
4707 				     "cdut-num-vf-work-pages",
4708 				     qed_get_cdut_num_vf_work_pages(p_hwfn));
4709 	offset += qed_dump_num_param(dump_buf + offset,
4710 				     dump,
4711 				     "max-task-ctx-size",
4712 				     p_hwfn->p_cxt_mngr->task_ctx_size);
4713 	offset += qed_dump_num_param(dump_buf + offset,
4714 				     dump,
4715 				     "task-type-id",
4716 				     p_hwfn->p_cxt_mngr->task_type_id);
4717 	offset += qed_dump_num_param(dump_buf + offset,
4718 				     dump,
4719 				     "first-vf-id-in-pf",
4720 				     p_hwfn->p_cxt_mngr->first_vf_in_pf);
4721 	offset += /* 18 */ qed_dump_num_param(dump_buf + offset,
4722 					      dump,
4723 					      "num-vfs-in-pf",
4724 					      p_hwfn->p_cxt_mngr->vf_count);
4725 	offset += qed_dump_num_param(dump_buf + offset,
4726 				     dump,
4727 				     "ptr-size-bytes", sizeof(void *));
4728 	offset += qed_dump_num_param(dump_buf + offset,
4729 				     dump,
4730 				     "pf-start-line",
4731 				     p_hwfn->p_cxt_mngr->pf_start_line);
4732 	offset += qed_dump_num_param(dump_buf + offset,
4733 				     dump,
4734 				     "page-mem-desc-size-dwords",
4735 				     PAGE_MEM_DESC_SIZE_DWORDS);
4736 	offset += qed_dump_num_param(dump_buf + offset,
4737 				     dump,
4738 				     "ilt-shadow-size",
4739 				     p_hwfn->p_cxt_mngr->ilt_shadow_size);
4740 	/* Additional/Less parameters require matching of number in call to
4741 	 * dump_common_global_params()
4742 	 */
4743 
4744 	/* Dump section containing number of PF CIDs per connection type */
4745 	offset += qed_dump_section_hdr(dump_buf + offset,
4746 				       dump, "num_pf_cids_per_conn_type", 1);
4747 	offset += qed_dump_num_param(dump_buf + offset,
4748 				     dump, "size", NUM_OF_CONNECTION_TYPES);
4749 	for (conn_type = 0, valid_conn_pf_cids = 0;
4750 	     conn_type < NUM_OF_CONNECTION_TYPES; conn_type++, offset++) {
4751 		u32 num_pf_cids =
4752 		    p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cid_count;
4753 
4754 		if (dump)
4755 			*(dump_buf + offset) = num_pf_cids;
4756 		valid_conn_pf_cids += num_pf_cids;
4757 	}
4758 
4759 	/* Dump section containing number of VF CIDs per connection type */
4760 	offset += qed_dump_section_hdr(dump_buf + offset,
4761 				       dump, "num_vf_cids_per_conn_type", 1);
4762 	offset += qed_dump_num_param(dump_buf + offset,
4763 				     dump, "size", NUM_OF_CONNECTION_TYPES);
4764 	for (conn_type = 0, valid_conn_vf_cids = 0;
4765 	     conn_type < NUM_OF_CONNECTION_TYPES; conn_type++, offset++) {
4766 		u32 num_vf_cids =
4767 		    p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cids_per_vf;
4768 
4769 		if (dump)
4770 			*(dump_buf + offset) = num_vf_cids;
4771 		valid_conn_vf_cids += num_vf_cids;
4772 	}
4773 
4774 	/* Dump section containing physical memory descs for each ILT page */
4775 	num_pages = p_hwfn->p_cxt_mngr->ilt_shadow_size;
4776 	offset += qed_dump_section_hdr(dump_buf + offset,
4777 				       dump, "ilt_page_desc", 1);
4778 	offset += qed_dump_num_param(dump_buf + offset,
4779 				     dump,
4780 				     "size",
4781 				     num_pages * PAGE_MEM_DESC_SIZE_DWORDS);
4782 
4783 	/* Copy memory descriptors to dump buffer */
4784 	if (dump) {
4785 		u32 page_id;
4786 
4787 		for (page_id = 0; page_id < num_pages;
4788 		     page_id++, offset += PAGE_MEM_DESC_SIZE_DWORDS)
4789 			memcpy(dump_buf + offset,
4790 			       &ilt_pages[page_id],
4791 			       DWORDS_TO_BYTES(PAGE_MEM_DESC_SIZE_DWORDS));
4792 	} else {
4793 		offset += num_pages * PAGE_MEM_DESC_SIZE_DWORDS;
4794 	}
4795 
4796 	valid_conn_pf_pages = DIV_ROUND_UP(valid_conn_pf_cids,
4797 					   num_cids_per_page);
4798 	valid_conn_vf_pages = DIV_ROUND_UP(valid_conn_vf_cids,
4799 					   num_cids_per_page);
4800 
4801 	/* Dump ILT pages IDs */
4802 	offset += qed_ilt_dump_pages_section(p_hwfn,
4803 					     dump_buf + offset,
4804 					     dump,
4805 					     valid_conn_pf_pages,
4806 					     valid_conn_vf_pages,
4807 					     ilt_pages, true);
4808 
4809 	/* Dump ILT pages memory */
4810 	offset += qed_ilt_dump_pages_section(p_hwfn,
4811 					     dump_buf + offset,
4812 					     dump,
4813 					     valid_conn_pf_pages,
4814 					     valid_conn_vf_pages,
4815 					     ilt_pages, false);
4816 
4817 	/* Dump last section */
4818 	offset += qed_dump_last_section(dump_buf, offset, dump);
4819 
4820 	return offset;
4821 }
4822 
4823 /***************************** Public Functions *******************************/
4824 
4825 enum dbg_status qed_dbg_set_bin_ptr(struct qed_hwfn *p_hwfn,
4826 				    const u8 * const bin_ptr)
4827 {
4828 	struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr;
4829 	u8 buf_id;
4830 
4831 	/* Convert binary data to debug arrays */
4832 	for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++)
4833 		qed_set_dbg_bin_buf(p_hwfn,
4834 				    buf_id,
4835 				    (u32 *)(bin_ptr + buf_hdrs[buf_id].offset),
4836 				    buf_hdrs[buf_id].length);
4837 
4838 	return DBG_STATUS_OK;
4839 }
4840 
4841 bool qed_read_fw_info(struct qed_hwfn *p_hwfn,
4842 		      struct qed_ptt *p_ptt, struct fw_info *fw_info)
4843 {
4844 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
4845 	u8 storm_id;
4846 
4847 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
4848 		struct storm_defs *storm = &s_storm_defs[storm_id];
4849 
4850 		/* Skip Storm if it's in reset */
4851 		if (dev_data->block_in_reset[storm->sem_block_id])
4852 			continue;
4853 
4854 		/* Read FW info for the current Storm */
4855 		qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, fw_info);
4856 
4857 		return true;
4858 	}
4859 
4860 	return false;
4861 }
4862 
4863 enum dbg_status qed_dbg_grc_config(struct qed_hwfn *p_hwfn,
4864 				   enum dbg_grc_params grc_param, u32 val)
4865 {
4866 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
4867 	enum dbg_status status;
4868 	int i;
4869 
4870 	DP_VERBOSE(p_hwfn,
4871 		   QED_MSG_DEBUG,
4872 		   "dbg_grc_config: paramId = %d, val = %d\n", grc_param, val);
4873 
4874 	status = qed_dbg_dev_init(p_hwfn);
4875 	if (status != DBG_STATUS_OK)
4876 		return status;
4877 
4878 	/* Initializes the GRC parameters (if not initialized). Needed in order
4879 	 * to set the default parameter values for the first time.
4880 	 */
4881 	qed_dbg_grc_init_params(p_hwfn);
4882 
4883 	if (grc_param >= MAX_DBG_GRC_PARAMS)
4884 		return DBG_STATUS_INVALID_ARGS;
4885 	if (val < s_grc_param_defs[grc_param].min ||
4886 	    val > s_grc_param_defs[grc_param].max)
4887 		return DBG_STATUS_INVALID_ARGS;
4888 
4889 	if (s_grc_param_defs[grc_param].is_preset) {
4890 		/* Preset param */
4891 
4892 		/* Disabling a preset is not allowed. Call
4893 		 * dbg_grc_set_params_default instead.
4894 		 */
4895 		if (!val)
4896 			return DBG_STATUS_INVALID_ARGS;
4897 
4898 		/* Update all params with the preset values */
4899 		for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) {
4900 			struct grc_param_defs *defs = &s_grc_param_defs[i];
4901 			u32 preset_val;
4902 			/* Skip persistent params */
4903 			if (defs->is_persistent)
4904 				continue;
4905 
4906 			/* Find preset value */
4907 			if (grc_param == DBG_GRC_PARAM_EXCLUDE_ALL)
4908 				preset_val =
4909 				    defs->exclude_all_preset_val;
4910 			else if (grc_param == DBG_GRC_PARAM_CRASH)
4911 				preset_val =
4912 				    defs->crash_preset_val[dev_data->chip_id];
4913 			else
4914 				return DBG_STATUS_INVALID_ARGS;
4915 
4916 			qed_grc_set_param(p_hwfn, i, preset_val);
4917 		}
4918 	} else {
4919 		/* Regular param - set its value */
4920 		qed_grc_set_param(p_hwfn, grc_param, val);
4921 	}
4922 
4923 	return DBG_STATUS_OK;
4924 }
4925 
4926 /* Assign default GRC param values */
4927 void qed_dbg_grc_set_params_default(struct qed_hwfn *p_hwfn)
4928 {
4929 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
4930 	u32 i;
4931 
4932 	for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
4933 		if (!s_grc_param_defs[i].is_persistent)
4934 			dev_data->grc.param_val[i] =
4935 			    s_grc_param_defs[i].default_val[dev_data->chip_id];
4936 }
4937 
4938 enum dbg_status qed_dbg_grc_get_dump_buf_size(struct qed_hwfn *p_hwfn,
4939 					      struct qed_ptt *p_ptt,
4940 					      u32 *buf_size)
4941 {
4942 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
4943 
4944 	*buf_size = 0;
4945 
4946 	if (status != DBG_STATUS_OK)
4947 		return status;
4948 
4949 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
4950 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr ||
4951 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr ||
4952 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
4953 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
4954 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
4955 
4956 	return qed_grc_dump(p_hwfn, p_ptt, NULL, false, buf_size);
4957 }
4958 
4959 enum dbg_status qed_dbg_grc_dump(struct qed_hwfn *p_hwfn,
4960 				 struct qed_ptt *p_ptt,
4961 				 u32 *dump_buf,
4962 				 u32 buf_size_in_dwords,
4963 				 u32 *num_dumped_dwords)
4964 {
4965 	u32 needed_buf_size_in_dwords;
4966 	enum dbg_status status;
4967 
4968 	*num_dumped_dwords = 0;
4969 
4970 	status = qed_dbg_grc_get_dump_buf_size(p_hwfn,
4971 					       p_ptt,
4972 					       &needed_buf_size_in_dwords);
4973 	if (status != DBG_STATUS_OK)
4974 		return status;
4975 
4976 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
4977 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
4978 
4979 	/* GRC Dump */
4980 	status = qed_grc_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords);
4981 
4982 	/* Revert GRC params to their default */
4983 	qed_dbg_grc_set_params_default(p_hwfn);
4984 
4985 	return status;
4986 }
4987 
4988 enum dbg_status qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn *p_hwfn,
4989 						   struct qed_ptt *p_ptt,
4990 						   u32 *buf_size)
4991 {
4992 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
4993 	struct idle_chk_data *idle_chk = &dev_data->idle_chk;
4994 	enum dbg_status status;
4995 
4996 	*buf_size = 0;
4997 
4998 	status = qed_dbg_dev_init(p_hwfn);
4999 	if (status != DBG_STATUS_OK)
5000 		return status;
5001 
5002 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
5003 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr ||
5004 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr ||
5005 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr)
5006 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
5007 
5008 	if (!idle_chk->buf_size_set) {
5009 		idle_chk->buf_size = qed_idle_chk_dump(p_hwfn,
5010 						       p_ptt, NULL, false);
5011 		idle_chk->buf_size_set = true;
5012 	}
5013 
5014 	*buf_size = idle_chk->buf_size;
5015 
5016 	return DBG_STATUS_OK;
5017 }
5018 
5019 enum dbg_status qed_dbg_idle_chk_dump(struct qed_hwfn *p_hwfn,
5020 				      struct qed_ptt *p_ptt,
5021 				      u32 *dump_buf,
5022 				      u32 buf_size_in_dwords,
5023 				      u32 *num_dumped_dwords)
5024 {
5025 	u32 needed_buf_size_in_dwords;
5026 	enum dbg_status status;
5027 
5028 	*num_dumped_dwords = 0;
5029 
5030 	status = qed_dbg_idle_chk_get_dump_buf_size(p_hwfn,
5031 						    p_ptt,
5032 						    &needed_buf_size_in_dwords);
5033 	if (status != DBG_STATUS_OK)
5034 		return status;
5035 
5036 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5037 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5038 
5039 	/* Update reset state */
5040 	qed_grc_unreset_blocks(p_hwfn, p_ptt, true);
5041 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5042 
5043 	/* Idle Check Dump */
5044 	*num_dumped_dwords = qed_idle_chk_dump(p_hwfn, p_ptt, dump_buf, true);
5045 
5046 	/* Revert GRC params to their default */
5047 	qed_dbg_grc_set_params_default(p_hwfn);
5048 
5049 	return DBG_STATUS_OK;
5050 }
5051 
5052 enum dbg_status qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5053 						    struct qed_ptt *p_ptt,
5054 						    u32 *buf_size)
5055 {
5056 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5057 
5058 	*buf_size = 0;
5059 
5060 	if (status != DBG_STATUS_OK)
5061 		return status;
5062 
5063 	return qed_mcp_trace_dump(p_hwfn, p_ptt, NULL, false, buf_size);
5064 }
5065 
5066 enum dbg_status qed_dbg_mcp_trace_dump(struct qed_hwfn *p_hwfn,
5067 				       struct qed_ptt *p_ptt,
5068 				       u32 *dump_buf,
5069 				       u32 buf_size_in_dwords,
5070 				       u32 *num_dumped_dwords)
5071 {
5072 	u32 needed_buf_size_in_dwords;
5073 	enum dbg_status status;
5074 
5075 	status =
5076 		qed_dbg_mcp_trace_get_dump_buf_size(p_hwfn,
5077 						    p_ptt,
5078 						    &needed_buf_size_in_dwords);
5079 	if (status != DBG_STATUS_OK && status !=
5080 	    DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
5081 		return status;
5082 
5083 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5084 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5085 
5086 	/* Update reset state */
5087 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5088 
5089 	/* Perform dump */
5090 	status = qed_mcp_trace_dump(p_hwfn,
5091 				    p_ptt, dump_buf, true, num_dumped_dwords);
5092 
5093 	/* Revert GRC params to their default */
5094 	qed_dbg_grc_set_params_default(p_hwfn);
5095 
5096 	return status;
5097 }
5098 
5099 enum dbg_status qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5100 						   struct qed_ptt *p_ptt,
5101 						   u32 *buf_size)
5102 {
5103 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5104 
5105 	*buf_size = 0;
5106 
5107 	if (status != DBG_STATUS_OK)
5108 		return status;
5109 
5110 	return qed_reg_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size);
5111 }
5112 
5113 enum dbg_status qed_dbg_reg_fifo_dump(struct qed_hwfn *p_hwfn,
5114 				      struct qed_ptt *p_ptt,
5115 				      u32 *dump_buf,
5116 				      u32 buf_size_in_dwords,
5117 				      u32 *num_dumped_dwords)
5118 {
5119 	u32 needed_buf_size_in_dwords;
5120 	enum dbg_status status;
5121 
5122 	*num_dumped_dwords = 0;
5123 
5124 	status = qed_dbg_reg_fifo_get_dump_buf_size(p_hwfn,
5125 						    p_ptt,
5126 						    &needed_buf_size_in_dwords);
5127 	if (status != DBG_STATUS_OK)
5128 		return status;
5129 
5130 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5131 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5132 
5133 	/* Update reset state */
5134 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5135 
5136 	status = qed_reg_fifo_dump(p_hwfn,
5137 				   p_ptt, dump_buf, true, num_dumped_dwords);
5138 
5139 	/* Revert GRC params to their default */
5140 	qed_dbg_grc_set_params_default(p_hwfn);
5141 
5142 	return status;
5143 }
5144 
5145 enum dbg_status qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5146 						   struct qed_ptt *p_ptt,
5147 						   u32 *buf_size)
5148 {
5149 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5150 
5151 	*buf_size = 0;
5152 
5153 	if (status != DBG_STATUS_OK)
5154 		return status;
5155 
5156 	return qed_igu_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size);
5157 }
5158 
5159 enum dbg_status qed_dbg_igu_fifo_dump(struct qed_hwfn *p_hwfn,
5160 				      struct qed_ptt *p_ptt,
5161 				      u32 *dump_buf,
5162 				      u32 buf_size_in_dwords,
5163 				      u32 *num_dumped_dwords)
5164 {
5165 	u32 needed_buf_size_in_dwords;
5166 	enum dbg_status status;
5167 
5168 	*num_dumped_dwords = 0;
5169 
5170 	status = qed_dbg_igu_fifo_get_dump_buf_size(p_hwfn,
5171 						    p_ptt,
5172 						    &needed_buf_size_in_dwords);
5173 	if (status != DBG_STATUS_OK)
5174 		return status;
5175 
5176 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5177 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5178 
5179 	/* Update reset state */
5180 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5181 
5182 	status = qed_igu_fifo_dump(p_hwfn,
5183 				   p_ptt, dump_buf, true, num_dumped_dwords);
5184 	/* Revert GRC params to their default */
5185 	qed_dbg_grc_set_params_default(p_hwfn);
5186 
5187 	return status;
5188 }
5189 
5190 enum dbg_status
5191 qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5192 					      struct qed_ptt *p_ptt,
5193 					      u32 *buf_size)
5194 {
5195 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5196 
5197 	*buf_size = 0;
5198 
5199 	if (status != DBG_STATUS_OK)
5200 		return status;
5201 
5202 	return qed_protection_override_dump(p_hwfn,
5203 					    p_ptt, NULL, false, buf_size);
5204 }
5205 
5206 enum dbg_status qed_dbg_protection_override_dump(struct qed_hwfn *p_hwfn,
5207 						 struct qed_ptt *p_ptt,
5208 						 u32 *dump_buf,
5209 						 u32 buf_size_in_dwords,
5210 						 u32 *num_dumped_dwords)
5211 {
5212 	u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords;
5213 	enum dbg_status status;
5214 
5215 	*num_dumped_dwords = 0;
5216 
5217 	status =
5218 		qed_dbg_protection_override_get_dump_buf_size(p_hwfn,
5219 							      p_ptt,
5220 							      p_size);
5221 	if (status != DBG_STATUS_OK)
5222 		return status;
5223 
5224 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5225 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5226 
5227 	/* Update reset state */
5228 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5229 
5230 	status = qed_protection_override_dump(p_hwfn,
5231 					      p_ptt,
5232 					      dump_buf,
5233 					      true, num_dumped_dwords);
5234 
5235 	/* Revert GRC params to their default */
5236 	qed_dbg_grc_set_params_default(p_hwfn);
5237 
5238 	return status;
5239 }
5240 
5241 enum dbg_status qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5242 						     struct qed_ptt *p_ptt,
5243 						     u32 *buf_size)
5244 {
5245 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5246 
5247 	*buf_size = 0;
5248 
5249 	if (status != DBG_STATUS_OK)
5250 		return status;
5251 
5252 	/* Update reset state */
5253 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5254 
5255 	*buf_size = qed_fw_asserts_dump(p_hwfn, p_ptt, NULL, false);
5256 
5257 	return DBG_STATUS_OK;
5258 }
5259 
5260 enum dbg_status qed_dbg_fw_asserts_dump(struct qed_hwfn *p_hwfn,
5261 					struct qed_ptt *p_ptt,
5262 					u32 *dump_buf,
5263 					u32 buf_size_in_dwords,
5264 					u32 *num_dumped_dwords)
5265 {
5266 	u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords;
5267 	enum dbg_status status;
5268 
5269 	*num_dumped_dwords = 0;
5270 
5271 	status =
5272 		qed_dbg_fw_asserts_get_dump_buf_size(p_hwfn,
5273 						     p_ptt,
5274 						     p_size);
5275 	if (status != DBG_STATUS_OK)
5276 		return status;
5277 
5278 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5279 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5280 
5281 	*num_dumped_dwords = qed_fw_asserts_dump(p_hwfn, p_ptt, dump_buf, true);
5282 
5283 	/* Revert GRC params to their default */
5284 	qed_dbg_grc_set_params_default(p_hwfn);
5285 
5286 	return DBG_STATUS_OK;
5287 }
5288 
5289 static enum dbg_status qed_dbg_ilt_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5290 						     struct qed_ptt *p_ptt,
5291 						     u32 *buf_size)
5292 {
5293 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5294 
5295 	*buf_size = 0;
5296 
5297 	if (status != DBG_STATUS_OK)
5298 		return status;
5299 
5300 	*buf_size = qed_ilt_dump(p_hwfn, p_ptt, NULL, false);
5301 
5302 	return DBG_STATUS_OK;
5303 }
5304 
5305 static enum dbg_status qed_dbg_ilt_dump(struct qed_hwfn *p_hwfn,
5306 					struct qed_ptt *p_ptt,
5307 					u32 *dump_buf,
5308 					u32 buf_size_in_dwords,
5309 					u32 *num_dumped_dwords)
5310 {
5311 	u32 needed_buf_size_in_dwords;
5312 	enum dbg_status status;
5313 
5314 	*num_dumped_dwords = 0;
5315 
5316 	status = qed_dbg_ilt_get_dump_buf_size(p_hwfn,
5317 					       p_ptt,
5318 					       &needed_buf_size_in_dwords);
5319 	if (status != DBG_STATUS_OK)
5320 		return status;
5321 
5322 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5323 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5324 
5325 	*num_dumped_dwords = qed_ilt_dump(p_hwfn, p_ptt, dump_buf, true);
5326 
5327 	/* Reveret GRC params to their default */
5328 	qed_dbg_grc_set_params_default(p_hwfn);
5329 
5330 	return DBG_STATUS_OK;
5331 }
5332 
5333 enum dbg_status qed_dbg_read_attn(struct qed_hwfn *p_hwfn,
5334 				  struct qed_ptt *p_ptt,
5335 				  enum block_id block_id,
5336 				  enum dbg_attn_type attn_type,
5337 				  bool clear_status,
5338 				  struct dbg_attn_block_result *results)
5339 {
5340 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5341 	u8 reg_idx, num_attn_regs, num_result_regs = 0;
5342 	const struct dbg_attn_reg *attn_reg_arr;
5343 
5344 	if (status != DBG_STATUS_OK)
5345 		return status;
5346 
5347 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
5348 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
5349 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
5350 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
5351 
5352 	attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
5353 					       block_id,
5354 					       attn_type, &num_attn_regs);
5355 
5356 	for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
5357 		const struct dbg_attn_reg *reg_data = &attn_reg_arr[reg_idx];
5358 		struct dbg_attn_reg_result *reg_result;
5359 		u32 sts_addr, sts_val;
5360 		u16 modes_buf_offset;
5361 		bool eval_mode;
5362 
5363 		/* Check mode */
5364 		eval_mode = GET_FIELD(reg_data->mode.data,
5365 				      DBG_MODE_HDR_EVAL_MODE) > 0;
5366 		modes_buf_offset = GET_FIELD(reg_data->mode.data,
5367 					     DBG_MODE_HDR_MODES_BUF_OFFSET);
5368 		if (eval_mode && !qed_is_mode_match(p_hwfn, &modes_buf_offset))
5369 			continue;
5370 
5371 		/* Mode match - read attention status register */
5372 		sts_addr = DWORDS_TO_BYTES(clear_status ?
5373 					   reg_data->sts_clr_address :
5374 					   GET_FIELD(reg_data->data,
5375 						     DBG_ATTN_REG_STS_ADDRESS));
5376 		sts_val = qed_rd(p_hwfn, p_ptt, sts_addr);
5377 		if (!sts_val)
5378 			continue;
5379 
5380 		/* Non-zero attention status - add to results */
5381 		reg_result = &results->reg_results[num_result_regs];
5382 		SET_FIELD(reg_result->data,
5383 			  DBG_ATTN_REG_RESULT_STS_ADDRESS, sts_addr);
5384 		SET_FIELD(reg_result->data,
5385 			  DBG_ATTN_REG_RESULT_NUM_REG_ATTN,
5386 			  GET_FIELD(reg_data->data, DBG_ATTN_REG_NUM_REG_ATTN));
5387 		reg_result->block_attn_offset = reg_data->block_attn_offset;
5388 		reg_result->sts_val = sts_val;
5389 		reg_result->mask_val = qed_rd(p_hwfn,
5390 					      p_ptt,
5391 					      DWORDS_TO_BYTES
5392 					      (reg_data->mask_address));
5393 		num_result_regs++;
5394 	}
5395 
5396 	results->block_id = (u8)block_id;
5397 	results->names_offset =
5398 	    qed_get_block_attn_data(p_hwfn, block_id, attn_type)->names_offset;
5399 	SET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE, attn_type);
5400 	SET_FIELD(results->data,
5401 		  DBG_ATTN_BLOCK_RESULT_NUM_REGS, num_result_regs);
5402 
5403 	return DBG_STATUS_OK;
5404 }
5405 
5406 /******************************* Data Types **********************************/
5407 
5408 /* REG fifo element */
5409 struct reg_fifo_element {
5410 	u64 data;
5411 #define REG_FIFO_ELEMENT_ADDRESS_SHIFT		0
5412 #define REG_FIFO_ELEMENT_ADDRESS_MASK		0x7fffff
5413 #define REG_FIFO_ELEMENT_ACCESS_SHIFT		23
5414 #define REG_FIFO_ELEMENT_ACCESS_MASK		0x1
5415 #define REG_FIFO_ELEMENT_PF_SHIFT		24
5416 #define REG_FIFO_ELEMENT_PF_MASK		0xf
5417 #define REG_FIFO_ELEMENT_VF_SHIFT		28
5418 #define REG_FIFO_ELEMENT_VF_MASK		0xff
5419 #define REG_FIFO_ELEMENT_PORT_SHIFT		36
5420 #define REG_FIFO_ELEMENT_PORT_MASK		0x3
5421 #define REG_FIFO_ELEMENT_PRIVILEGE_SHIFT	38
5422 #define REG_FIFO_ELEMENT_PRIVILEGE_MASK		0x3
5423 #define REG_FIFO_ELEMENT_PROTECTION_SHIFT	40
5424 #define REG_FIFO_ELEMENT_PROTECTION_MASK	0x7
5425 #define REG_FIFO_ELEMENT_MASTER_SHIFT		43
5426 #define REG_FIFO_ELEMENT_MASTER_MASK		0xf
5427 #define REG_FIFO_ELEMENT_ERROR_SHIFT		47
5428 #define REG_FIFO_ELEMENT_ERROR_MASK		0x1f
5429 };
5430 
5431 /* REG fifo error element */
5432 struct reg_fifo_err {
5433 	u32 err_code;
5434 	const char *err_msg;
5435 };
5436 
5437 /* IGU fifo element */
5438 struct igu_fifo_element {
5439 	u32 dword0;
5440 #define IGU_FIFO_ELEMENT_DWORD0_FID_SHIFT		0
5441 #define IGU_FIFO_ELEMENT_DWORD0_FID_MASK		0xff
5442 #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_SHIFT		8
5443 #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_MASK		0x1
5444 #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_SHIFT		9
5445 #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_MASK		0xf
5446 #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_SHIFT		13
5447 #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_MASK		0xf
5448 #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_SHIFT		17
5449 #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_MASK		0x7fff
5450 	u32 dword1;
5451 	u32 dword2;
5452 #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_SHIFT	0
5453 #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_MASK		0x1
5454 #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_SHIFT		1
5455 #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_MASK		0xffffffff
5456 	u32 reserved;
5457 };
5458 
5459 struct igu_fifo_wr_data {
5460 	u32 data;
5461 #define IGU_FIFO_WR_DATA_PROD_CONS_SHIFT		0
5462 #define IGU_FIFO_WR_DATA_PROD_CONS_MASK			0xffffff
5463 #define IGU_FIFO_WR_DATA_UPDATE_FLAG_SHIFT		24
5464 #define IGU_FIFO_WR_DATA_UPDATE_FLAG_MASK		0x1
5465 #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_SHIFT	25
5466 #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_MASK		0x3
5467 #define IGU_FIFO_WR_DATA_SEGMENT_SHIFT			27
5468 #define IGU_FIFO_WR_DATA_SEGMENT_MASK			0x1
5469 #define IGU_FIFO_WR_DATA_TIMER_MASK_SHIFT		28
5470 #define IGU_FIFO_WR_DATA_TIMER_MASK_MASK		0x1
5471 #define IGU_FIFO_WR_DATA_CMD_TYPE_SHIFT			31
5472 #define IGU_FIFO_WR_DATA_CMD_TYPE_MASK			0x1
5473 };
5474 
5475 struct igu_fifo_cleanup_wr_data {
5476 	u32 data;
5477 #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_SHIFT		0
5478 #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_MASK		0x7ffffff
5479 #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_SHIFT	27
5480 #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_MASK	0x1
5481 #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_SHIFT	28
5482 #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_MASK	0x7
5483 #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_SHIFT		31
5484 #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_MASK		0x1
5485 };
5486 
5487 /* Protection override element */
5488 struct protection_override_element {
5489 	u64 data;
5490 #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_SHIFT		0
5491 #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_MASK		0x7fffff
5492 #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_SHIFT		23
5493 #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_MASK		0xffffff
5494 #define PROTECTION_OVERRIDE_ELEMENT_READ_SHIFT			47
5495 #define PROTECTION_OVERRIDE_ELEMENT_READ_MASK			0x1
5496 #define PROTECTION_OVERRIDE_ELEMENT_WRITE_SHIFT			48
5497 #define PROTECTION_OVERRIDE_ELEMENT_WRITE_MASK			0x1
5498 #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_SHIFT	49
5499 #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_MASK	0x7
5500 #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_SHIFT	52
5501 #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_MASK	0x7
5502 };
5503 
5504 enum igu_fifo_sources {
5505 	IGU_SRC_PXP0,
5506 	IGU_SRC_PXP1,
5507 	IGU_SRC_PXP2,
5508 	IGU_SRC_PXP3,
5509 	IGU_SRC_PXP4,
5510 	IGU_SRC_PXP5,
5511 	IGU_SRC_PXP6,
5512 	IGU_SRC_PXP7,
5513 	IGU_SRC_CAU,
5514 	IGU_SRC_ATTN,
5515 	IGU_SRC_GRC
5516 };
5517 
5518 enum igu_fifo_addr_types {
5519 	IGU_ADDR_TYPE_MSIX_MEM,
5520 	IGU_ADDR_TYPE_WRITE_PBA,
5521 	IGU_ADDR_TYPE_WRITE_INT_ACK,
5522 	IGU_ADDR_TYPE_WRITE_ATTN_BITS,
5523 	IGU_ADDR_TYPE_READ_INT,
5524 	IGU_ADDR_TYPE_WRITE_PROD_UPDATE,
5525 	IGU_ADDR_TYPE_RESERVED
5526 };
5527 
5528 struct igu_fifo_addr_data {
5529 	u16 start_addr;
5530 	u16 end_addr;
5531 	char *desc;
5532 	char *vf_desc;
5533 	enum igu_fifo_addr_types type;
5534 };
5535 
5536 /******************************** Constants **********************************/
5537 
5538 #define MAX_MSG_LEN				1024
5539 
5540 #define MCP_TRACE_MAX_MODULE_LEN		8
5541 #define MCP_TRACE_FORMAT_MAX_PARAMS		3
5542 #define MCP_TRACE_FORMAT_PARAM_WIDTH \
5543 	(MCP_TRACE_FORMAT_P2_SIZE_OFFSET - MCP_TRACE_FORMAT_P1_SIZE_OFFSET)
5544 
5545 #define REG_FIFO_ELEMENT_ADDR_FACTOR		4
5546 #define REG_FIFO_ELEMENT_IS_PF_VF_VAL		127
5547 
5548 #define PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR	4
5549 
5550 /***************************** Constant Arrays *******************************/
5551 
5552 /* Status string array */
5553 static const char * const s_status_str[] = {
5554 	/* DBG_STATUS_OK */
5555 	"Operation completed successfully",
5556 
5557 	/* DBG_STATUS_APP_VERSION_NOT_SET */
5558 	"Debug application version wasn't set",
5559 
5560 	/* DBG_STATUS_UNSUPPORTED_APP_VERSION */
5561 	"Unsupported debug application version",
5562 
5563 	/* DBG_STATUS_DBG_BLOCK_NOT_RESET */
5564 	"The debug block wasn't reset since the last recording",
5565 
5566 	/* DBG_STATUS_INVALID_ARGS */
5567 	"Invalid arguments",
5568 
5569 	/* DBG_STATUS_OUTPUT_ALREADY_SET */
5570 	"The debug output was already set",
5571 
5572 	/* DBG_STATUS_INVALID_PCI_BUF_SIZE */
5573 	"Invalid PCI buffer size",
5574 
5575 	/* DBG_STATUS_PCI_BUF_ALLOC_FAILED */
5576 	"PCI buffer allocation failed",
5577 
5578 	/* DBG_STATUS_PCI_BUF_NOT_ALLOCATED */
5579 	"A PCI buffer wasn't allocated",
5580 
5581 	/* DBG_STATUS_INVALID_FILTER_TRIGGER_DWORDS */
5582 	"The filter/trigger constraint dword offsets are not enabled for recording",
5583 	/* DBG_STATUS_NO_MATCHING_FRAMING_MODE */
5584 	"No matching framing mode",
5585 
5586 	/* DBG_STATUS_VFC_READ_ERROR */
5587 	"Error reading from VFC",
5588 
5589 	/* DBG_STATUS_STORM_ALREADY_ENABLED */
5590 	"The Storm was already enabled",
5591 
5592 	/* DBG_STATUS_STORM_NOT_ENABLED */
5593 	"The specified Storm wasn't enabled",
5594 
5595 	/* DBG_STATUS_BLOCK_ALREADY_ENABLED */
5596 	"The block was already enabled",
5597 
5598 	/* DBG_STATUS_BLOCK_NOT_ENABLED */
5599 	"The specified block wasn't enabled",
5600 
5601 	/* DBG_STATUS_NO_INPUT_ENABLED */
5602 	"No input was enabled for recording",
5603 
5604 	/* DBG_STATUS_NO_FILTER_TRIGGER_256B */
5605 	"Filters and triggers are not allowed in E4 256-bit mode",
5606 
5607 	/* DBG_STATUS_FILTER_ALREADY_ENABLED */
5608 	"The filter was already enabled",
5609 
5610 	/* DBG_STATUS_TRIGGER_ALREADY_ENABLED */
5611 	"The trigger was already enabled",
5612 
5613 	/* DBG_STATUS_TRIGGER_NOT_ENABLED */
5614 	"The trigger wasn't enabled",
5615 
5616 	/* DBG_STATUS_CANT_ADD_CONSTRAINT */
5617 	"A constraint can be added only after a filter was enabled or a trigger state was added",
5618 
5619 	/* DBG_STATUS_TOO_MANY_TRIGGER_STATES */
5620 	"Cannot add more than 3 trigger states",
5621 
5622 	/* DBG_STATUS_TOO_MANY_CONSTRAINTS */
5623 	"Cannot add more than 4 constraints per filter or trigger state",
5624 
5625 	/* DBG_STATUS_RECORDING_NOT_STARTED */
5626 	"The recording wasn't started",
5627 
5628 	/* DBG_STATUS_DATA_DIDNT_TRIGGER */
5629 	"A trigger was configured, but it didn't trigger",
5630 
5631 	/* DBG_STATUS_NO_DATA_RECORDED */
5632 	"No data was recorded",
5633 
5634 	/* DBG_STATUS_DUMP_BUF_TOO_SMALL */
5635 	"Dump buffer is too small",
5636 
5637 	/* DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED */
5638 	"Dumped data is not aligned to chunks",
5639 
5640 	/* DBG_STATUS_UNKNOWN_CHIP */
5641 	"Unknown chip",
5642 
5643 	/* DBG_STATUS_VIRT_MEM_ALLOC_FAILED */
5644 	"Failed allocating virtual memory",
5645 
5646 	/* DBG_STATUS_BLOCK_IN_RESET */
5647 	"The input block is in reset",
5648 
5649 	/* DBG_STATUS_INVALID_TRACE_SIGNATURE */
5650 	"Invalid MCP trace signature found in NVRAM",
5651 
5652 	/* DBG_STATUS_INVALID_NVRAM_BUNDLE */
5653 	"Invalid bundle ID found in NVRAM",
5654 
5655 	/* DBG_STATUS_NVRAM_GET_IMAGE_FAILED */
5656 	"Failed getting NVRAM image",
5657 
5658 	/* DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE */
5659 	"NVRAM image is not dword-aligned",
5660 
5661 	/* DBG_STATUS_NVRAM_READ_FAILED */
5662 	"Failed reading from NVRAM",
5663 
5664 	/* DBG_STATUS_IDLE_CHK_PARSE_FAILED */
5665 	"Idle check parsing failed",
5666 
5667 	/* DBG_STATUS_MCP_TRACE_BAD_DATA */
5668 	"MCP Trace data is corrupt",
5669 
5670 	/* DBG_STATUS_MCP_TRACE_NO_META */
5671 	"Dump doesn't contain meta data - it must be provided in image file",
5672 
5673 	/* DBG_STATUS_MCP_COULD_NOT_HALT */
5674 	"Failed to halt MCP",
5675 
5676 	/* DBG_STATUS_MCP_COULD_NOT_RESUME */
5677 	"Failed to resume MCP after halt",
5678 
5679 	/* DBG_STATUS_RESERVED0 */
5680 	"",
5681 
5682 	/* DBG_STATUS_SEMI_FIFO_NOT_EMPTY */
5683 	"Failed to empty SEMI sync FIFO",
5684 
5685 	/* DBG_STATUS_IGU_FIFO_BAD_DATA */
5686 	"IGU FIFO data is corrupt",
5687 
5688 	/* DBG_STATUS_MCP_COULD_NOT_MASK_PRTY */
5689 	"MCP failed to mask parities",
5690 
5691 	/* DBG_STATUS_FW_ASSERTS_PARSE_FAILED */
5692 	"FW Asserts parsing failed",
5693 
5694 	/* DBG_STATUS_REG_FIFO_BAD_DATA */
5695 	"GRC FIFO data is corrupt",
5696 
5697 	/* DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA */
5698 	"Protection Override data is corrupt",
5699 
5700 	/* DBG_STATUS_DBG_ARRAY_NOT_SET */
5701 	"Debug arrays were not set (when using binary files, dbg_set_bin_ptr must be called)",
5702 
5703 	/* DBG_STATUS_RESERVED1 */
5704 	"",
5705 
5706 	/* DBG_STATUS_NON_MATCHING_LINES */
5707 	"Non-matching debug lines - in E4, all lines must be of the same type (either 128b or 256b)",
5708 
5709 	/* DBG_STATUS_INSUFFICIENT_HW_IDS */
5710 	"Insufficient HW IDs. Try to record less Storms/blocks",
5711 
5712 	/* DBG_STATUS_DBG_BUS_IN_USE */
5713 	"The debug bus is in use",
5714 
5715 	/* DBG_STATUS_INVALID_STORM_DBG_MODE */
5716 	"The storm debug mode is not supported in the current chip",
5717 
5718 	/* DBG_STATUS_OTHER_ENGINE_BB_ONLY */
5719 	"Other engine is supported only in BB",
5720 
5721 	/* DBG_STATUS_FILTER_SINGLE_HW_ID */
5722 	"The configured filter mode requires a single Storm/block input",
5723 
5724 	/* DBG_STATUS_TRIGGER_SINGLE_HW_ID */
5725 	"The configured filter mode requires that all the constraints of a single trigger state will be defined on a single Storm/block input",
5726 
5727 	/* DBG_STATUS_MISSING_TRIGGER_STATE_STORM */
5728 	"When triggering on Storm data, the Storm to trigger on must be specified"
5729 };
5730 
5731 /* Idle check severity names array */
5732 static const char * const s_idle_chk_severity_str[] = {
5733 	"Error",
5734 	"Error if no traffic",
5735 	"Warning"
5736 };
5737 
5738 /* MCP Trace level names array */
5739 static const char * const s_mcp_trace_level_str[] = {
5740 	"ERROR",
5741 	"TRACE",
5742 	"DEBUG"
5743 };
5744 
5745 /* Access type names array */
5746 static const char * const s_access_strs[] = {
5747 	"read",
5748 	"write"
5749 };
5750 
5751 /* Privilege type names array */
5752 static const char * const s_privilege_strs[] = {
5753 	"VF",
5754 	"PDA",
5755 	"HV",
5756 	"UA"
5757 };
5758 
5759 /* Protection type names array */
5760 static const char * const s_protection_strs[] = {
5761 	"(default)",
5762 	"(default)",
5763 	"(default)",
5764 	"(default)",
5765 	"override VF",
5766 	"override PDA",
5767 	"override HV",
5768 	"override UA"
5769 };
5770 
5771 /* Master type names array */
5772 static const char * const s_master_strs[] = {
5773 	"???",
5774 	"pxp",
5775 	"mcp",
5776 	"msdm",
5777 	"psdm",
5778 	"ysdm",
5779 	"usdm",
5780 	"tsdm",
5781 	"xsdm",
5782 	"dbu",
5783 	"dmae",
5784 	"jdap",
5785 	"???",
5786 	"???",
5787 	"???",
5788 	"???"
5789 };
5790 
5791 /* REG FIFO error messages array */
5792 static struct reg_fifo_err s_reg_fifo_errors[] = {
5793 	{1, "grc timeout"},
5794 	{2, "address doesn't belong to any block"},
5795 	{4, "reserved address in block or write to read-only address"},
5796 	{8, "privilege/protection mismatch"},
5797 	{16, "path isolation error"},
5798 	{17, "RSL error"}
5799 };
5800 
5801 /* IGU FIFO sources array */
5802 static const char * const s_igu_fifo_source_strs[] = {
5803 	"TSTORM",
5804 	"MSTORM",
5805 	"USTORM",
5806 	"XSTORM",
5807 	"YSTORM",
5808 	"PSTORM",
5809 	"PCIE",
5810 	"NIG_QM_PBF",
5811 	"CAU",
5812 	"ATTN",
5813 	"GRC",
5814 };
5815 
5816 /* IGU FIFO error messages */
5817 static const char * const s_igu_fifo_error_strs[] = {
5818 	"no error",
5819 	"length error",
5820 	"function disabled",
5821 	"VF sent command to attention address",
5822 	"host sent prod update command",
5823 	"read of during interrupt register while in MIMD mode",
5824 	"access to PXP BAR reserved address",
5825 	"producer update command to attention index",
5826 	"unknown error",
5827 	"SB index not valid",
5828 	"SB relative index and FID not found",
5829 	"FID not match",
5830 	"command with error flag asserted (PCI error or CAU discard)",
5831 	"VF sent cleanup and RF cleanup is disabled",
5832 	"cleanup command on type bigger than 4"
5833 };
5834 
5835 /* IGU FIFO address data */
5836 static const struct igu_fifo_addr_data s_igu_fifo_addr_data[] = {
5837 	{0x0, 0x101, "MSI-X Memory", NULL,
5838 	 IGU_ADDR_TYPE_MSIX_MEM},
5839 	{0x102, 0x1ff, "reserved", NULL,
5840 	 IGU_ADDR_TYPE_RESERVED},
5841 	{0x200, 0x200, "Write PBA[0:63]", NULL,
5842 	 IGU_ADDR_TYPE_WRITE_PBA},
5843 	{0x201, 0x201, "Write PBA[64:127]", "reserved",
5844 	 IGU_ADDR_TYPE_WRITE_PBA},
5845 	{0x202, 0x202, "Write PBA[128]", "reserved",
5846 	 IGU_ADDR_TYPE_WRITE_PBA},
5847 	{0x203, 0x3ff, "reserved", NULL,
5848 	 IGU_ADDR_TYPE_RESERVED},
5849 	{0x400, 0x5ef, "Write interrupt acknowledgment", NULL,
5850 	 IGU_ADDR_TYPE_WRITE_INT_ACK},
5851 	{0x5f0, 0x5f0, "Attention bits update", NULL,
5852 	 IGU_ADDR_TYPE_WRITE_ATTN_BITS},
5853 	{0x5f1, 0x5f1, "Attention bits set", NULL,
5854 	 IGU_ADDR_TYPE_WRITE_ATTN_BITS},
5855 	{0x5f2, 0x5f2, "Attention bits clear", NULL,
5856 	 IGU_ADDR_TYPE_WRITE_ATTN_BITS},
5857 	{0x5f3, 0x5f3, "Read interrupt 0:63 with mask", NULL,
5858 	 IGU_ADDR_TYPE_READ_INT},
5859 	{0x5f4, 0x5f4, "Read interrupt 0:31 with mask", NULL,
5860 	 IGU_ADDR_TYPE_READ_INT},
5861 	{0x5f5, 0x5f5, "Read interrupt 32:63 with mask", NULL,
5862 	 IGU_ADDR_TYPE_READ_INT},
5863 	{0x5f6, 0x5f6, "Read interrupt 0:63 without mask", NULL,
5864 	 IGU_ADDR_TYPE_READ_INT},
5865 	{0x5f7, 0x5ff, "reserved", NULL,
5866 	 IGU_ADDR_TYPE_RESERVED},
5867 	{0x600, 0x7ff, "Producer update", NULL,
5868 	 IGU_ADDR_TYPE_WRITE_PROD_UPDATE}
5869 };
5870 
5871 /******************************** Variables **********************************/
5872 
5873 /* Temporary buffer, used for print size calculations */
5874 static char s_temp_buf[MAX_MSG_LEN];
5875 
5876 /**************************** Private Functions ******************************/
5877 
5878 static u32 qed_cyclic_add(u32 a, u32 b, u32 size)
5879 {
5880 	return (a + b) % size;
5881 }
5882 
5883 static u32 qed_cyclic_sub(u32 a, u32 b, u32 size)
5884 {
5885 	return (size + a - b) % size;
5886 }
5887 
5888 /* Reads the specified number of bytes from the specified cyclic buffer (up to 4
5889  * bytes) and returns them as a dword value. the specified buffer offset is
5890  * updated.
5891  */
5892 static u32 qed_read_from_cyclic_buf(void *buf,
5893 				    u32 *offset,
5894 				    u32 buf_size, u8 num_bytes_to_read)
5895 {
5896 	u8 i, *val_ptr, *bytes_buf = (u8 *)buf;
5897 	u32 val = 0;
5898 
5899 	val_ptr = (u8 *)&val;
5900 
5901 	/* Assume running on a LITTLE ENDIAN and the buffer is network order
5902 	 * (BIG ENDIAN), as high order bytes are placed in lower memory address.
5903 	 */
5904 	for (i = 0; i < num_bytes_to_read; i++) {
5905 		val_ptr[i] = bytes_buf[*offset];
5906 		*offset = qed_cyclic_add(*offset, 1, buf_size);
5907 	}
5908 
5909 	return val;
5910 }
5911 
5912 /* Reads and returns the next byte from the specified buffer.
5913  * The specified buffer offset is updated.
5914  */
5915 static u8 qed_read_byte_from_buf(void *buf, u32 *offset)
5916 {
5917 	return ((u8 *)buf)[(*offset)++];
5918 }
5919 
5920 /* Reads and returns the next dword from the specified buffer.
5921  * The specified buffer offset is updated.
5922  */
5923 static u32 qed_read_dword_from_buf(void *buf, u32 *offset)
5924 {
5925 	u32 dword_val = *(u32 *)&((u8 *)buf)[*offset];
5926 
5927 	*offset += 4;
5928 
5929 	return dword_val;
5930 }
5931 
5932 /* Reads the next string from the specified buffer, and copies it to the
5933  * specified pointer. The specified buffer offset is updated.
5934  */
5935 static void qed_read_str_from_buf(void *buf, u32 *offset, u32 size, char *dest)
5936 {
5937 	const char *source_str = &((const char *)buf)[*offset];
5938 
5939 	strncpy(dest, source_str, size);
5940 	dest[size - 1] = '\0';
5941 	*offset += size;
5942 }
5943 
5944 /* Returns a pointer to the specified offset (in bytes) of the specified buffer.
5945  * If the specified buffer in NULL, a temporary buffer pointer is returned.
5946  */
5947 static char *qed_get_buf_ptr(void *buf, u32 offset)
5948 {
5949 	return buf ? (char *)buf + offset : s_temp_buf;
5950 }
5951 
5952 /* Reads a param from the specified buffer. Returns the number of dwords read.
5953  * If the returned str_param is NULL, the param is numeric and its value is
5954  * returned in num_param.
5955  * Otheriwise, the param is a string and its pointer is returned in str_param.
5956  */
5957 static u32 qed_read_param(u32 *dump_buf,
5958 			  const char **param_name,
5959 			  const char **param_str_val, u32 *param_num_val)
5960 {
5961 	char *char_buf = (char *)dump_buf;
5962 	size_t offset = 0;
5963 
5964 	/* Extract param name */
5965 	*param_name = char_buf;
5966 	offset += strlen(*param_name) + 1;
5967 
5968 	/* Check param type */
5969 	if (*(char_buf + offset++)) {
5970 		/* String param */
5971 		*param_str_val = char_buf + offset;
5972 		*param_num_val = 0;
5973 		offset += strlen(*param_str_val) + 1;
5974 		if (offset & 0x3)
5975 			offset += (4 - (offset & 0x3));
5976 	} else {
5977 		/* Numeric param */
5978 		*param_str_val = NULL;
5979 		if (offset & 0x3)
5980 			offset += (4 - (offset & 0x3));
5981 		*param_num_val = *(u32 *)(char_buf + offset);
5982 		offset += 4;
5983 	}
5984 
5985 	return (u32)offset / 4;
5986 }
5987 
5988 /* Reads a section header from the specified buffer.
5989  * Returns the number of dwords read.
5990  */
5991 static u32 qed_read_section_hdr(u32 *dump_buf,
5992 				const char **section_name,
5993 				u32 *num_section_params)
5994 {
5995 	const char *param_str_val;
5996 
5997 	return qed_read_param(dump_buf,
5998 			      section_name, &param_str_val, num_section_params);
5999 }
6000 
6001 /* Reads section params from the specified buffer and prints them to the results
6002  * buffer. Returns the number of dwords read.
6003  */
6004 static u32 qed_print_section_params(u32 *dump_buf,
6005 				    u32 num_section_params,
6006 				    char *results_buf, u32 *num_chars_printed)
6007 {
6008 	u32 i, dump_offset = 0, results_offset = 0;
6009 
6010 	for (i = 0; i < num_section_params; i++) {
6011 		const char *param_name, *param_str_val;
6012 		u32 param_num_val = 0;
6013 
6014 		dump_offset += qed_read_param(dump_buf + dump_offset,
6015 					      &param_name,
6016 					      &param_str_val, &param_num_val);
6017 
6018 		if (param_str_val)
6019 			results_offset +=
6020 				sprintf(qed_get_buf_ptr(results_buf,
6021 							results_offset),
6022 					"%s: %s\n", param_name, param_str_val);
6023 		else if (strcmp(param_name, "fw-timestamp"))
6024 			results_offset +=
6025 				sprintf(qed_get_buf_ptr(results_buf,
6026 							results_offset),
6027 					"%s: %d\n", param_name, param_num_val);
6028 	}
6029 
6030 	results_offset += sprintf(qed_get_buf_ptr(results_buf, results_offset),
6031 				  "\n");
6032 
6033 	*num_chars_printed = results_offset;
6034 
6035 	return dump_offset;
6036 }
6037 
6038 /* Returns the block name that matches the specified block ID,
6039  * or NULL if not found.
6040  */
6041 static const char *qed_dbg_get_block_name(struct qed_hwfn *p_hwfn,
6042 					  enum block_id block_id)
6043 {
6044 	const struct dbg_block_user *block =
6045 	    (const struct dbg_block_user *)
6046 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_USER_DATA].ptr + block_id;
6047 
6048 	return (const char *)block->name;
6049 }
6050 
6051 static struct dbg_tools_user_data *qed_dbg_get_user_data(struct qed_hwfn
6052 							 *p_hwfn)
6053 {
6054 	return (struct dbg_tools_user_data *)p_hwfn->dbg_user_info;
6055 }
6056 
6057 /* Parses the idle check rules and returns the number of characters printed.
6058  * In case of parsing error, returns 0.
6059  */
6060 static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn,
6061 					 u32 *dump_buf,
6062 					 u32 *dump_buf_end,
6063 					 u32 num_rules,
6064 					 bool print_fw_idle_chk,
6065 					 char *results_buf,
6066 					 u32 *num_errors, u32 *num_warnings)
6067 {
6068 	/* Offset in results_buf in bytes */
6069 	u32 results_offset = 0;
6070 
6071 	u32 rule_idx;
6072 	u16 i, j;
6073 
6074 	*num_errors = 0;
6075 	*num_warnings = 0;
6076 
6077 	/* Go over dumped results */
6078 	for (rule_idx = 0; rule_idx < num_rules && dump_buf < dump_buf_end;
6079 	     rule_idx++) {
6080 		const struct dbg_idle_chk_rule_parsing_data *rule_parsing_data;
6081 		struct dbg_idle_chk_result_hdr *hdr;
6082 		const char *parsing_str, *lsi_msg;
6083 		u32 parsing_str_offset;
6084 		bool has_fw_msg;
6085 		u8 curr_reg_id;
6086 
6087 		hdr = (struct dbg_idle_chk_result_hdr *)dump_buf;
6088 		rule_parsing_data =
6089 		    (const struct dbg_idle_chk_rule_parsing_data *)
6090 		    p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr +
6091 		    hdr->rule_id;
6092 		parsing_str_offset =
6093 		    GET_FIELD(rule_parsing_data->data,
6094 			      DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET);
6095 		has_fw_msg =
6096 		    GET_FIELD(rule_parsing_data->data,
6097 			      DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG) > 0;
6098 		parsing_str = (const char *)
6099 		    p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr +
6100 		    parsing_str_offset;
6101 		lsi_msg = parsing_str;
6102 		curr_reg_id = 0;
6103 
6104 		if (hdr->severity >= MAX_DBG_IDLE_CHK_SEVERITY_TYPES)
6105 			return 0;
6106 
6107 		/* Skip rule header */
6108 		dump_buf += BYTES_TO_DWORDS(sizeof(*hdr));
6109 
6110 		/* Update errors/warnings count */
6111 		if (hdr->severity == IDLE_CHK_SEVERITY_ERROR ||
6112 		    hdr->severity == IDLE_CHK_SEVERITY_ERROR_NO_TRAFFIC)
6113 			(*num_errors)++;
6114 		else
6115 			(*num_warnings)++;
6116 
6117 		/* Print rule severity */
6118 		results_offset +=
6119 		    sprintf(qed_get_buf_ptr(results_buf,
6120 					    results_offset), "%s: ",
6121 			    s_idle_chk_severity_str[hdr->severity]);
6122 
6123 		/* Print rule message */
6124 		if (has_fw_msg)
6125 			parsing_str += strlen(parsing_str) + 1;
6126 		results_offset +=
6127 		    sprintf(qed_get_buf_ptr(results_buf,
6128 					    results_offset), "%s.",
6129 			    has_fw_msg &&
6130 			    print_fw_idle_chk ? parsing_str : lsi_msg);
6131 		parsing_str += strlen(parsing_str) + 1;
6132 
6133 		/* Print register values */
6134 		results_offset +=
6135 		    sprintf(qed_get_buf_ptr(results_buf,
6136 					    results_offset), " Registers:");
6137 		for (i = 0;
6138 		     i < hdr->num_dumped_cond_regs + hdr->num_dumped_info_regs;
6139 		     i++) {
6140 			struct dbg_idle_chk_result_reg_hdr *reg_hdr;
6141 			bool is_mem;
6142 			u8 reg_id;
6143 
6144 			reg_hdr =
6145 				(struct dbg_idle_chk_result_reg_hdr *)dump_buf;
6146 			is_mem = GET_FIELD(reg_hdr->data,
6147 					   DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM);
6148 			reg_id = GET_FIELD(reg_hdr->data,
6149 					   DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID);
6150 
6151 			/* Skip reg header */
6152 			dump_buf += BYTES_TO_DWORDS(sizeof(*reg_hdr));
6153 
6154 			/* Skip register names until the required reg_id is
6155 			 * reached.
6156 			 */
6157 			for (; reg_id > curr_reg_id;
6158 			     curr_reg_id++,
6159 			     parsing_str += strlen(parsing_str) + 1);
6160 
6161 			results_offset +=
6162 			    sprintf(qed_get_buf_ptr(results_buf,
6163 						    results_offset), " %s",
6164 				    parsing_str);
6165 			if (i < hdr->num_dumped_cond_regs && is_mem)
6166 				results_offset +=
6167 				    sprintf(qed_get_buf_ptr(results_buf,
6168 							    results_offset),
6169 					    "[%d]", hdr->mem_entry_id +
6170 					    reg_hdr->start_entry);
6171 			results_offset +=
6172 			    sprintf(qed_get_buf_ptr(results_buf,
6173 						    results_offset), "=");
6174 			for (j = 0; j < reg_hdr->size; j++, dump_buf++) {
6175 				results_offset +=
6176 				    sprintf(qed_get_buf_ptr(results_buf,
6177 							    results_offset),
6178 					    "0x%x", *dump_buf);
6179 				if (j < reg_hdr->size - 1)
6180 					results_offset +=
6181 					    sprintf(qed_get_buf_ptr
6182 						    (results_buf,
6183 						     results_offset), ",");
6184 			}
6185 		}
6186 
6187 		results_offset +=
6188 		    sprintf(qed_get_buf_ptr(results_buf, results_offset), "\n");
6189 	}
6190 
6191 	/* Check if end of dump buffer was exceeded */
6192 	if (dump_buf > dump_buf_end)
6193 		return 0;
6194 
6195 	return results_offset;
6196 }
6197 
6198 /* Parses an idle check dump buffer.
6199  * If result_buf is not NULL, the idle check results are printed to it.
6200  * In any case, the required results buffer size is assigned to
6201  * parsed_results_bytes.
6202  * The parsing status is returned.
6203  */
6204 static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn,
6205 					       u32 *dump_buf,
6206 					       u32 num_dumped_dwords,
6207 					       char *results_buf,
6208 					       u32 *parsed_results_bytes,
6209 					       u32 *num_errors,
6210 					       u32 *num_warnings)
6211 {
6212 	const char *section_name, *param_name, *param_str_val;
6213 	u32 *dump_buf_end = dump_buf + num_dumped_dwords;
6214 	u32 num_section_params = 0, num_rules;
6215 
6216 	/* Offset in results_buf in bytes */
6217 	u32 results_offset = 0;
6218 
6219 	*parsed_results_bytes = 0;
6220 	*num_errors = 0;
6221 	*num_warnings = 0;
6222 
6223 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr ||
6224 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr)
6225 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
6226 
6227 	/* Read global_params section */
6228 	dump_buf += qed_read_section_hdr(dump_buf,
6229 					 &section_name, &num_section_params);
6230 	if (strcmp(section_name, "global_params"))
6231 		return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6232 
6233 	/* Print global params */
6234 	dump_buf += qed_print_section_params(dump_buf,
6235 					     num_section_params,
6236 					     results_buf, &results_offset);
6237 
6238 	/* Read idle_chk section */
6239 	dump_buf += qed_read_section_hdr(dump_buf,
6240 					 &section_name, &num_section_params);
6241 	if (strcmp(section_name, "idle_chk") || num_section_params != 1)
6242 		return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6243 	dump_buf += qed_read_param(dump_buf,
6244 				   &param_name, &param_str_val, &num_rules);
6245 	if (strcmp(param_name, "num_rules"))
6246 		return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6247 
6248 	if (num_rules) {
6249 		u32 rules_print_size;
6250 
6251 		/* Print FW output */
6252 		results_offset +=
6253 		    sprintf(qed_get_buf_ptr(results_buf,
6254 					    results_offset),
6255 			    "FW_IDLE_CHECK:\n");
6256 		rules_print_size =
6257 			qed_parse_idle_chk_dump_rules(p_hwfn,
6258 						      dump_buf,
6259 						      dump_buf_end,
6260 						      num_rules,
6261 						      true,
6262 						      results_buf ?
6263 						      results_buf +
6264 						      results_offset :
6265 						      NULL,
6266 						      num_errors,
6267 						      num_warnings);
6268 		results_offset += rules_print_size;
6269 		if (!rules_print_size)
6270 			return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6271 
6272 		/* Print LSI output */
6273 		results_offset +=
6274 		    sprintf(qed_get_buf_ptr(results_buf,
6275 					    results_offset),
6276 			    "\nLSI_IDLE_CHECK:\n");
6277 		rules_print_size =
6278 			qed_parse_idle_chk_dump_rules(p_hwfn,
6279 						      dump_buf,
6280 						      dump_buf_end,
6281 						      num_rules,
6282 						      false,
6283 						      results_buf ?
6284 						      results_buf +
6285 						      results_offset :
6286 						      NULL,
6287 						      num_errors,
6288 						      num_warnings);
6289 		results_offset += rules_print_size;
6290 		if (!rules_print_size)
6291 			return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6292 	}
6293 
6294 	/* Print errors/warnings count */
6295 	if (*num_errors)
6296 		results_offset +=
6297 		    sprintf(qed_get_buf_ptr(results_buf,
6298 					    results_offset),
6299 			    "\nIdle Check failed!!! (with %d errors and %d warnings)\n",
6300 			    *num_errors, *num_warnings);
6301 	else if (*num_warnings)
6302 		results_offset +=
6303 		    sprintf(qed_get_buf_ptr(results_buf,
6304 					    results_offset),
6305 			    "\nIdle Check completed successfully (with %d warnings)\n",
6306 			    *num_warnings);
6307 	else
6308 		results_offset +=
6309 		    sprintf(qed_get_buf_ptr(results_buf,
6310 					    results_offset),
6311 			    "\nIdle Check completed successfully\n");
6312 
6313 	/* Add 1 for string NULL termination */
6314 	*parsed_results_bytes = results_offset + 1;
6315 
6316 	return DBG_STATUS_OK;
6317 }
6318 
6319 /* Allocates and fills MCP Trace meta data based on the specified meta data
6320  * dump buffer.
6321  * Returns debug status code.
6322  */
6323 static enum dbg_status
6324 qed_mcp_trace_alloc_meta_data(struct qed_hwfn *p_hwfn,
6325 			      const u32 *meta_buf)
6326 {
6327 	struct dbg_tools_user_data *dev_user_data;
6328 	u32 offset = 0, signature, i;
6329 	struct mcp_trace_meta *meta;
6330 	u8 *meta_buf_bytes;
6331 
6332 	dev_user_data = qed_dbg_get_user_data(p_hwfn);
6333 	meta = &dev_user_data->mcp_trace_meta;
6334 	meta_buf_bytes = (u8 *)meta_buf;
6335 
6336 	/* Free the previous meta before loading a new one. */
6337 	if (meta->is_allocated)
6338 		qed_mcp_trace_free_meta_data(p_hwfn);
6339 
6340 	memset(meta, 0, sizeof(*meta));
6341 
6342 	/* Read first signature */
6343 	signature = qed_read_dword_from_buf(meta_buf_bytes, &offset);
6344 	if (signature != NVM_MAGIC_VALUE)
6345 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
6346 
6347 	/* Read no. of modules and allocate memory for their pointers */
6348 	meta->modules_num = qed_read_byte_from_buf(meta_buf_bytes, &offset);
6349 	meta->modules = kcalloc(meta->modules_num, sizeof(char *),
6350 				GFP_KERNEL);
6351 	if (!meta->modules)
6352 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6353 
6354 	/* Allocate and read all module strings */
6355 	for (i = 0; i < meta->modules_num; i++) {
6356 		u8 module_len = qed_read_byte_from_buf(meta_buf_bytes, &offset);
6357 
6358 		*(meta->modules + i) = kzalloc(module_len, GFP_KERNEL);
6359 		if (!(*(meta->modules + i))) {
6360 			/* Update number of modules to be released */
6361 			meta->modules_num = i ? i - 1 : 0;
6362 			return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6363 		}
6364 
6365 		qed_read_str_from_buf(meta_buf_bytes, &offset, module_len,
6366 				      *(meta->modules + i));
6367 		if (module_len > MCP_TRACE_MAX_MODULE_LEN)
6368 			(*(meta->modules + i))[MCP_TRACE_MAX_MODULE_LEN] = '\0';
6369 	}
6370 
6371 	/* Read second signature */
6372 	signature = qed_read_dword_from_buf(meta_buf_bytes, &offset);
6373 	if (signature != NVM_MAGIC_VALUE)
6374 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
6375 
6376 	/* Read number of formats and allocate memory for all formats */
6377 	meta->formats_num = qed_read_dword_from_buf(meta_buf_bytes, &offset);
6378 	meta->formats = kcalloc(meta->formats_num,
6379 				sizeof(struct mcp_trace_format),
6380 				GFP_KERNEL);
6381 	if (!meta->formats)
6382 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6383 
6384 	/* Allocate and read all strings */
6385 	for (i = 0; i < meta->formats_num; i++) {
6386 		struct mcp_trace_format *format_ptr = &meta->formats[i];
6387 		u8 format_len;
6388 
6389 		format_ptr->data = qed_read_dword_from_buf(meta_buf_bytes,
6390 							   &offset);
6391 		format_len = GET_MFW_FIELD(format_ptr->data,
6392 					   MCP_TRACE_FORMAT_LEN);
6393 		format_ptr->format_str = kzalloc(format_len, GFP_KERNEL);
6394 		if (!format_ptr->format_str) {
6395 			/* Update number of modules to be released */
6396 			meta->formats_num = i ? i - 1 : 0;
6397 			return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6398 		}
6399 
6400 		qed_read_str_from_buf(meta_buf_bytes,
6401 				      &offset,
6402 				      format_len, format_ptr->format_str);
6403 	}
6404 
6405 	meta->is_allocated = true;
6406 	return DBG_STATUS_OK;
6407 }
6408 
6409 /* Parses an MCP trace buffer. If result_buf is not NULL, the MCP Trace results
6410  * are printed to it. The parsing status is returned.
6411  * Arguments:
6412  * trace_buf - MCP trace cyclic buffer
6413  * trace_buf_size - MCP trace cyclic buffer size in bytes
6414  * data_offset - offset in bytes of the data to parse in the MCP trace cyclic
6415  *		 buffer.
6416  * data_size - size in bytes of data to parse.
6417  * parsed_buf - destination buffer for parsed data.
6418  * parsed_results_bytes - size of parsed data in bytes.
6419  */
6420 static enum dbg_status qed_parse_mcp_trace_buf(struct qed_hwfn *p_hwfn,
6421 					       u8 *trace_buf,
6422 					       u32 trace_buf_size,
6423 					       u32 data_offset,
6424 					       u32 data_size,
6425 					       char *parsed_buf,
6426 					       u32 *parsed_results_bytes)
6427 {
6428 	struct dbg_tools_user_data *dev_user_data;
6429 	struct mcp_trace_meta *meta;
6430 	u32 param_mask, param_shift;
6431 	enum dbg_status status;
6432 
6433 	dev_user_data = qed_dbg_get_user_data(p_hwfn);
6434 	meta = &dev_user_data->mcp_trace_meta;
6435 	*parsed_results_bytes = 0;
6436 
6437 	if (!meta->is_allocated)
6438 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6439 
6440 	status = DBG_STATUS_OK;
6441 
6442 	while (data_size) {
6443 		struct mcp_trace_format *format_ptr;
6444 		u8 format_level, format_module;
6445 		u32 params[3] = { 0, 0, 0 };
6446 		u32 header, format_idx, i;
6447 
6448 		if (data_size < MFW_TRACE_ENTRY_SIZE)
6449 			return DBG_STATUS_MCP_TRACE_BAD_DATA;
6450 
6451 		header = qed_read_from_cyclic_buf(trace_buf,
6452 						  &data_offset,
6453 						  trace_buf_size,
6454 						  MFW_TRACE_ENTRY_SIZE);
6455 		data_size -= MFW_TRACE_ENTRY_SIZE;
6456 		format_idx = header & MFW_TRACE_EVENTID_MASK;
6457 
6458 		/* Skip message if its index doesn't exist in the meta data */
6459 		if (format_idx >= meta->formats_num) {
6460 			u8 format_size = (u8)GET_MFW_FIELD(header,
6461 							   MFW_TRACE_PRM_SIZE);
6462 
6463 			if (data_size < format_size)
6464 				return DBG_STATUS_MCP_TRACE_BAD_DATA;
6465 
6466 			data_offset = qed_cyclic_add(data_offset,
6467 						     format_size,
6468 						     trace_buf_size);
6469 			data_size -= format_size;
6470 			continue;
6471 		}
6472 
6473 		format_ptr = &meta->formats[format_idx];
6474 
6475 		for (i = 0,
6476 		     param_mask = MCP_TRACE_FORMAT_P1_SIZE_MASK, param_shift =
6477 		     MCP_TRACE_FORMAT_P1_SIZE_OFFSET;
6478 		     i < MCP_TRACE_FORMAT_MAX_PARAMS;
6479 		     i++, param_mask <<= MCP_TRACE_FORMAT_PARAM_WIDTH,
6480 		     param_shift += MCP_TRACE_FORMAT_PARAM_WIDTH) {
6481 			/* Extract param size (0..3) */
6482 			u8 param_size = (u8)((format_ptr->data & param_mask) >>
6483 					     param_shift);
6484 
6485 			/* If the param size is zero, there are no other
6486 			 * parameters.
6487 			 */
6488 			if (!param_size)
6489 				break;
6490 
6491 			/* Size is encoded using 2 bits, where 3 is used to
6492 			 * encode 4.
6493 			 */
6494 			if (param_size == 3)
6495 				param_size = 4;
6496 
6497 			if (data_size < param_size)
6498 				return DBG_STATUS_MCP_TRACE_BAD_DATA;
6499 
6500 			params[i] = qed_read_from_cyclic_buf(trace_buf,
6501 							     &data_offset,
6502 							     trace_buf_size,
6503 							     param_size);
6504 			data_size -= param_size;
6505 		}
6506 
6507 		format_level = (u8)GET_MFW_FIELD(format_ptr->data,
6508 						 MCP_TRACE_FORMAT_LEVEL);
6509 		format_module = (u8)GET_MFW_FIELD(format_ptr->data,
6510 						  MCP_TRACE_FORMAT_MODULE);
6511 		if (format_level >= ARRAY_SIZE(s_mcp_trace_level_str))
6512 			return DBG_STATUS_MCP_TRACE_BAD_DATA;
6513 
6514 		/* Print current message to results buffer */
6515 		*parsed_results_bytes +=
6516 			sprintf(qed_get_buf_ptr(parsed_buf,
6517 						*parsed_results_bytes),
6518 				"%s %-8s: ",
6519 				s_mcp_trace_level_str[format_level],
6520 				meta->modules[format_module]);
6521 		*parsed_results_bytes +=
6522 		    sprintf(qed_get_buf_ptr(parsed_buf, *parsed_results_bytes),
6523 			    format_ptr->format_str,
6524 			    params[0], params[1], params[2]);
6525 	}
6526 
6527 	/* Add string NULL terminator */
6528 	(*parsed_results_bytes)++;
6529 
6530 	return status;
6531 }
6532 
6533 /* Parses an MCP Trace dump buffer.
6534  * If result_buf is not NULL, the MCP Trace results are printed to it.
6535  * In any case, the required results buffer size is assigned to
6536  * parsed_results_bytes.
6537  * The parsing status is returned.
6538  */
6539 static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn,
6540 						u32 *dump_buf,
6541 						char *results_buf,
6542 						u32 *parsed_results_bytes,
6543 						bool free_meta_data)
6544 {
6545 	const char *section_name, *param_name, *param_str_val;
6546 	u32 data_size, trace_data_dwords, trace_meta_dwords;
6547 	u32 offset, results_offset, results_buf_bytes;
6548 	u32 param_num_val, num_section_params;
6549 	struct mcp_trace *trace;
6550 	enum dbg_status status;
6551 	const u32 *meta_buf;
6552 	u8 *trace_buf;
6553 
6554 	*parsed_results_bytes = 0;
6555 
6556 	/* Read global_params section */
6557 	dump_buf += qed_read_section_hdr(dump_buf,
6558 					 &section_name, &num_section_params);
6559 	if (strcmp(section_name, "global_params"))
6560 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6561 
6562 	/* Print global params */
6563 	dump_buf += qed_print_section_params(dump_buf,
6564 					     num_section_params,
6565 					     results_buf, &results_offset);
6566 
6567 	/* Read trace_data section */
6568 	dump_buf += qed_read_section_hdr(dump_buf,
6569 					 &section_name, &num_section_params);
6570 	if (strcmp(section_name, "mcp_trace_data") || num_section_params != 1)
6571 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6572 	dump_buf += qed_read_param(dump_buf,
6573 				   &param_name, &param_str_val, &param_num_val);
6574 	if (strcmp(param_name, "size"))
6575 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6576 	trace_data_dwords = param_num_val;
6577 
6578 	/* Prepare trace info */
6579 	trace = (struct mcp_trace *)dump_buf;
6580 	if (trace->signature != MFW_TRACE_SIGNATURE || !trace->size)
6581 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6582 
6583 	trace_buf = (u8 *)dump_buf + sizeof(*trace);
6584 	offset = trace->trace_oldest;
6585 	data_size = qed_cyclic_sub(trace->trace_prod, offset, trace->size);
6586 	dump_buf += trace_data_dwords;
6587 
6588 	/* Read meta_data section */
6589 	dump_buf += qed_read_section_hdr(dump_buf,
6590 					 &section_name, &num_section_params);
6591 	if (strcmp(section_name, "mcp_trace_meta"))
6592 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6593 	dump_buf += qed_read_param(dump_buf,
6594 				   &param_name, &param_str_val, &param_num_val);
6595 	if (strcmp(param_name, "size"))
6596 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6597 	trace_meta_dwords = param_num_val;
6598 
6599 	/* Choose meta data buffer */
6600 	if (!trace_meta_dwords) {
6601 		/* Dump doesn't include meta data */
6602 		struct dbg_tools_user_data *dev_user_data =
6603 			qed_dbg_get_user_data(p_hwfn);
6604 
6605 		if (!dev_user_data->mcp_trace_user_meta_buf)
6606 			return DBG_STATUS_MCP_TRACE_NO_META;
6607 
6608 		meta_buf = dev_user_data->mcp_trace_user_meta_buf;
6609 	} else {
6610 		/* Dump includes meta data */
6611 		meta_buf = dump_buf;
6612 	}
6613 
6614 	/* Allocate meta data memory */
6615 	status = qed_mcp_trace_alloc_meta_data(p_hwfn, meta_buf);
6616 	if (status != DBG_STATUS_OK)
6617 		return status;
6618 
6619 	status = qed_parse_mcp_trace_buf(p_hwfn,
6620 					 trace_buf,
6621 					 trace->size,
6622 					 offset,
6623 					 data_size,
6624 					 results_buf ?
6625 					 results_buf + results_offset :
6626 					 NULL,
6627 					 &results_buf_bytes);
6628 	if (status != DBG_STATUS_OK)
6629 		return status;
6630 
6631 	if (free_meta_data)
6632 		qed_mcp_trace_free_meta_data(p_hwfn);
6633 
6634 	*parsed_results_bytes = results_offset + results_buf_bytes;
6635 
6636 	return DBG_STATUS_OK;
6637 }
6638 
6639 /* Parses a Reg FIFO dump buffer.
6640  * If result_buf is not NULL, the Reg FIFO results are printed to it.
6641  * In any case, the required results buffer size is assigned to
6642  * parsed_results_bytes.
6643  * The parsing status is returned.
6644  */
6645 static enum dbg_status qed_parse_reg_fifo_dump(u32 *dump_buf,
6646 					       char *results_buf,
6647 					       u32 *parsed_results_bytes)
6648 {
6649 	const char *section_name, *param_name, *param_str_val;
6650 	u32 param_num_val, num_section_params, num_elements;
6651 	struct reg_fifo_element *elements;
6652 	u8 i, j, err_code, vf_val;
6653 	u32 results_offset = 0;
6654 	char vf_str[4];
6655 
6656 	/* Read global_params section */
6657 	dump_buf += qed_read_section_hdr(dump_buf,
6658 					 &section_name, &num_section_params);
6659 	if (strcmp(section_name, "global_params"))
6660 		return DBG_STATUS_REG_FIFO_BAD_DATA;
6661 
6662 	/* Print global params */
6663 	dump_buf += qed_print_section_params(dump_buf,
6664 					     num_section_params,
6665 					     results_buf, &results_offset);
6666 
6667 	/* Read reg_fifo_data section */
6668 	dump_buf += qed_read_section_hdr(dump_buf,
6669 					 &section_name, &num_section_params);
6670 	if (strcmp(section_name, "reg_fifo_data"))
6671 		return DBG_STATUS_REG_FIFO_BAD_DATA;
6672 	dump_buf += qed_read_param(dump_buf,
6673 				   &param_name, &param_str_val, &param_num_val);
6674 	if (strcmp(param_name, "size"))
6675 		return DBG_STATUS_REG_FIFO_BAD_DATA;
6676 	if (param_num_val % REG_FIFO_ELEMENT_DWORDS)
6677 		return DBG_STATUS_REG_FIFO_BAD_DATA;
6678 	num_elements = param_num_val / REG_FIFO_ELEMENT_DWORDS;
6679 	elements = (struct reg_fifo_element *)dump_buf;
6680 
6681 	/* Decode elements */
6682 	for (i = 0; i < num_elements; i++) {
6683 		const char *err_msg = NULL;
6684 
6685 		/* Discover if element belongs to a VF or a PF */
6686 		vf_val = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_VF);
6687 		if (vf_val == REG_FIFO_ELEMENT_IS_PF_VF_VAL)
6688 			sprintf(vf_str, "%s", "N/A");
6689 		else
6690 			sprintf(vf_str, "%d", vf_val);
6691 
6692 		/* Find error message */
6693 		err_code = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_ERROR);
6694 		for (j = 0; j < ARRAY_SIZE(s_reg_fifo_errors) && !err_msg; j++)
6695 			if (err_code == s_reg_fifo_errors[j].err_code)
6696 				err_msg = s_reg_fifo_errors[j].err_msg;
6697 
6698 		/* Add parsed element to parsed buffer */
6699 		results_offset +=
6700 		    sprintf(qed_get_buf_ptr(results_buf,
6701 					    results_offset),
6702 			    "raw: 0x%016llx, address: 0x%07x, access: %-5s, pf: %2d, vf: %s, port: %d, privilege: %-3s, protection: %-12s, master: %-4s, error: %s\n",
6703 			    elements[i].data,
6704 			    (u32)GET_FIELD(elements[i].data,
6705 					   REG_FIFO_ELEMENT_ADDRESS) *
6706 			    REG_FIFO_ELEMENT_ADDR_FACTOR,
6707 			    s_access_strs[GET_FIELD(elements[i].data,
6708 						    REG_FIFO_ELEMENT_ACCESS)],
6709 			    (u32)GET_FIELD(elements[i].data,
6710 					   REG_FIFO_ELEMENT_PF),
6711 			    vf_str,
6712 			    (u32)GET_FIELD(elements[i].data,
6713 					   REG_FIFO_ELEMENT_PORT),
6714 			    s_privilege_strs[GET_FIELD(elements[i].data,
6715 						REG_FIFO_ELEMENT_PRIVILEGE)],
6716 			    s_protection_strs[GET_FIELD(elements[i].data,
6717 						REG_FIFO_ELEMENT_PROTECTION)],
6718 			    s_master_strs[GET_FIELD(elements[i].data,
6719 						    REG_FIFO_ELEMENT_MASTER)],
6720 			    err_msg ? err_msg : "unknown error code");
6721 	}
6722 
6723 	results_offset += sprintf(qed_get_buf_ptr(results_buf,
6724 						  results_offset),
6725 				  "fifo contained %d elements", num_elements);
6726 
6727 	/* Add 1 for string NULL termination */
6728 	*parsed_results_bytes = results_offset + 1;
6729 
6730 	return DBG_STATUS_OK;
6731 }
6732 
6733 static enum dbg_status qed_parse_igu_fifo_element(struct igu_fifo_element
6734 						  *element, char
6735 						  *results_buf,
6736 						  u32 *results_offset)
6737 {
6738 	const struct igu_fifo_addr_data *found_addr = NULL;
6739 	u8 source, err_type, i, is_cleanup;
6740 	char parsed_addr_data[32];
6741 	char parsed_wr_data[256];
6742 	u32 wr_data, prod_cons;
6743 	bool is_wr_cmd, is_pf;
6744 	u16 cmd_addr;
6745 	u64 dword12;
6746 
6747 	/* Dword12 (dword index 1 and 2) contains bits 32..95 of the
6748 	 * FIFO element.
6749 	 */
6750 	dword12 = ((u64)element->dword2 << 32) | element->dword1;
6751 	is_wr_cmd = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD);
6752 	is_pf = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_IS_PF);
6753 	cmd_addr = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR);
6754 	source = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_SOURCE);
6755 	err_type = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE);
6756 
6757 	if (source >= ARRAY_SIZE(s_igu_fifo_source_strs))
6758 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6759 	if (err_type >= ARRAY_SIZE(s_igu_fifo_error_strs))
6760 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6761 
6762 	/* Find address data */
6763 	for (i = 0; i < ARRAY_SIZE(s_igu_fifo_addr_data) && !found_addr; i++) {
6764 		const struct igu_fifo_addr_data *curr_addr =
6765 			&s_igu_fifo_addr_data[i];
6766 
6767 		if (cmd_addr >= curr_addr->start_addr && cmd_addr <=
6768 		    curr_addr->end_addr)
6769 			found_addr = curr_addr;
6770 	}
6771 
6772 	if (!found_addr)
6773 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6774 
6775 	/* Prepare parsed address data */
6776 	switch (found_addr->type) {
6777 	case IGU_ADDR_TYPE_MSIX_MEM:
6778 		sprintf(parsed_addr_data, " vector_num = 0x%x", cmd_addr / 2);
6779 		break;
6780 	case IGU_ADDR_TYPE_WRITE_INT_ACK:
6781 	case IGU_ADDR_TYPE_WRITE_PROD_UPDATE:
6782 		sprintf(parsed_addr_data,
6783 			" SB = 0x%x", cmd_addr - found_addr->start_addr);
6784 		break;
6785 	default:
6786 		parsed_addr_data[0] = '\0';
6787 	}
6788 
6789 	if (!is_wr_cmd) {
6790 		parsed_wr_data[0] = '\0';
6791 		goto out;
6792 	}
6793 
6794 	/* Prepare parsed write data */
6795 	wr_data = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_WR_DATA);
6796 	prod_cons = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_PROD_CONS);
6797 	is_cleanup = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_CMD_TYPE);
6798 
6799 	if (source == IGU_SRC_ATTN) {
6800 		sprintf(parsed_wr_data, "prod: 0x%x, ", prod_cons);
6801 	} else {
6802 		if (is_cleanup) {
6803 			u8 cleanup_val, cleanup_type;
6804 
6805 			cleanup_val =
6806 				GET_FIELD(wr_data,
6807 					  IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL);
6808 			cleanup_type =
6809 			    GET_FIELD(wr_data,
6810 				      IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE);
6811 
6812 			sprintf(parsed_wr_data,
6813 				"cmd_type: cleanup, cleanup_val: %s, cleanup_type : %d, ",
6814 				cleanup_val ? "set" : "clear",
6815 				cleanup_type);
6816 		} else {
6817 			u8 update_flag, en_dis_int_for_sb, segment;
6818 			u8 timer_mask;
6819 
6820 			update_flag = GET_FIELD(wr_data,
6821 						IGU_FIFO_WR_DATA_UPDATE_FLAG);
6822 			en_dis_int_for_sb =
6823 				GET_FIELD(wr_data,
6824 					  IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB);
6825 			segment = GET_FIELD(wr_data,
6826 					    IGU_FIFO_WR_DATA_SEGMENT);
6827 			timer_mask = GET_FIELD(wr_data,
6828 					       IGU_FIFO_WR_DATA_TIMER_MASK);
6829 
6830 			sprintf(parsed_wr_data,
6831 				"cmd_type: prod/cons update, prod/cons: 0x%x, update_flag: %s, en_dis_int_for_sb : %s, segment : %s, timer_mask = %d, ",
6832 				prod_cons,
6833 				update_flag ? "update" : "nop",
6834 				en_dis_int_for_sb ?
6835 				(en_dis_int_for_sb == 1 ? "disable" : "nop") :
6836 				"enable",
6837 				segment ? "attn" : "regular",
6838 				timer_mask);
6839 		}
6840 	}
6841 out:
6842 	/* Add parsed element to parsed buffer */
6843 	*results_offset += sprintf(qed_get_buf_ptr(results_buf,
6844 						   *results_offset),
6845 				   "raw: 0x%01x%08x%08x, %s: %d, source : %s, type : %s, cmd_addr : 0x%x(%s%s), %serror: %s\n",
6846 				   element->dword2, element->dword1,
6847 				   element->dword0,
6848 				   is_pf ? "pf" : "vf",
6849 				   GET_FIELD(element->dword0,
6850 					     IGU_FIFO_ELEMENT_DWORD0_FID),
6851 				   s_igu_fifo_source_strs[source],
6852 				   is_wr_cmd ? "wr" : "rd",
6853 				   cmd_addr,
6854 				   (!is_pf && found_addr->vf_desc)
6855 				   ? found_addr->vf_desc
6856 				   : found_addr->desc,
6857 				   parsed_addr_data,
6858 				   parsed_wr_data,
6859 				   s_igu_fifo_error_strs[err_type]);
6860 
6861 	return DBG_STATUS_OK;
6862 }
6863 
6864 /* Parses an IGU FIFO dump buffer.
6865  * If result_buf is not NULL, the IGU FIFO results are printed to it.
6866  * In any case, the required results buffer size is assigned to
6867  * parsed_results_bytes.
6868  * The parsing status is returned.
6869  */
6870 static enum dbg_status qed_parse_igu_fifo_dump(u32 *dump_buf,
6871 					       char *results_buf,
6872 					       u32 *parsed_results_bytes)
6873 {
6874 	const char *section_name, *param_name, *param_str_val;
6875 	u32 param_num_val, num_section_params, num_elements;
6876 	struct igu_fifo_element *elements;
6877 	enum dbg_status status;
6878 	u32 results_offset = 0;
6879 	u8 i;
6880 
6881 	/* Read global_params section */
6882 	dump_buf += qed_read_section_hdr(dump_buf,
6883 					 &section_name, &num_section_params);
6884 	if (strcmp(section_name, "global_params"))
6885 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6886 
6887 	/* Print global params */
6888 	dump_buf += qed_print_section_params(dump_buf,
6889 					     num_section_params,
6890 					     results_buf, &results_offset);
6891 
6892 	/* Read igu_fifo_data section */
6893 	dump_buf += qed_read_section_hdr(dump_buf,
6894 					 &section_name, &num_section_params);
6895 	if (strcmp(section_name, "igu_fifo_data"))
6896 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6897 	dump_buf += qed_read_param(dump_buf,
6898 				   &param_name, &param_str_val, &param_num_val);
6899 	if (strcmp(param_name, "size"))
6900 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6901 	if (param_num_val % IGU_FIFO_ELEMENT_DWORDS)
6902 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6903 	num_elements = param_num_val / IGU_FIFO_ELEMENT_DWORDS;
6904 	elements = (struct igu_fifo_element *)dump_buf;
6905 
6906 	/* Decode elements */
6907 	for (i = 0; i < num_elements; i++) {
6908 		status = qed_parse_igu_fifo_element(&elements[i],
6909 						    results_buf,
6910 						    &results_offset);
6911 		if (status != DBG_STATUS_OK)
6912 			return status;
6913 	}
6914 
6915 	results_offset += sprintf(qed_get_buf_ptr(results_buf,
6916 						  results_offset),
6917 				  "fifo contained %d elements", num_elements);
6918 
6919 	/* Add 1 for string NULL termination */
6920 	*parsed_results_bytes = results_offset + 1;
6921 
6922 	return DBG_STATUS_OK;
6923 }
6924 
6925 static enum dbg_status
6926 qed_parse_protection_override_dump(u32 *dump_buf,
6927 				   char *results_buf,
6928 				   u32 *parsed_results_bytes)
6929 {
6930 	const char *section_name, *param_name, *param_str_val;
6931 	u32 param_num_val, num_section_params, num_elements;
6932 	struct protection_override_element *elements;
6933 	u32 results_offset = 0;
6934 	u8 i;
6935 
6936 	/* Read global_params section */
6937 	dump_buf += qed_read_section_hdr(dump_buf,
6938 					 &section_name, &num_section_params);
6939 	if (strcmp(section_name, "global_params"))
6940 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
6941 
6942 	/* Print global params */
6943 	dump_buf += qed_print_section_params(dump_buf,
6944 					     num_section_params,
6945 					     results_buf, &results_offset);
6946 
6947 	/* Read protection_override_data section */
6948 	dump_buf += qed_read_section_hdr(dump_buf,
6949 					 &section_name, &num_section_params);
6950 	if (strcmp(section_name, "protection_override_data"))
6951 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
6952 	dump_buf += qed_read_param(dump_buf,
6953 				   &param_name, &param_str_val, &param_num_val);
6954 	if (strcmp(param_name, "size"))
6955 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
6956 	if (param_num_val % PROTECTION_OVERRIDE_ELEMENT_DWORDS)
6957 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
6958 	num_elements = param_num_val / PROTECTION_OVERRIDE_ELEMENT_DWORDS;
6959 	elements = (struct protection_override_element *)dump_buf;
6960 
6961 	/* Decode elements */
6962 	for (i = 0; i < num_elements; i++) {
6963 		u32 address = GET_FIELD(elements[i].data,
6964 					PROTECTION_OVERRIDE_ELEMENT_ADDRESS) *
6965 			      PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR;
6966 
6967 		results_offset +=
6968 		    sprintf(qed_get_buf_ptr(results_buf,
6969 					    results_offset),
6970 			    "window %2d, address: 0x%07x, size: %7d regs, read: %d, write: %d, read protection: %-12s, write protection: %-12s\n",
6971 			    i, address,
6972 			    (u32)GET_FIELD(elements[i].data,
6973 				      PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE),
6974 			    (u32)GET_FIELD(elements[i].data,
6975 				      PROTECTION_OVERRIDE_ELEMENT_READ),
6976 			    (u32)GET_FIELD(elements[i].data,
6977 				      PROTECTION_OVERRIDE_ELEMENT_WRITE),
6978 			    s_protection_strs[GET_FIELD(elements[i].data,
6979 				PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION)],
6980 			    s_protection_strs[GET_FIELD(elements[i].data,
6981 				PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION)]);
6982 	}
6983 
6984 	results_offset += sprintf(qed_get_buf_ptr(results_buf,
6985 						  results_offset),
6986 				  "protection override contained %d elements",
6987 				  num_elements);
6988 
6989 	/* Add 1 for string NULL termination */
6990 	*parsed_results_bytes = results_offset + 1;
6991 
6992 	return DBG_STATUS_OK;
6993 }
6994 
6995 /* Parses a FW Asserts dump buffer.
6996  * If result_buf is not NULL, the FW Asserts results are printed to it.
6997  * In any case, the required results buffer size is assigned to
6998  * parsed_results_bytes.
6999  * The parsing status is returned.
7000  */
7001 static enum dbg_status qed_parse_fw_asserts_dump(u32 *dump_buf,
7002 						 char *results_buf,
7003 						 u32 *parsed_results_bytes)
7004 {
7005 	u32 num_section_params, param_num_val, i, results_offset = 0;
7006 	const char *param_name, *param_str_val, *section_name;
7007 	bool last_section_found = false;
7008 
7009 	*parsed_results_bytes = 0;
7010 
7011 	/* Read global_params section */
7012 	dump_buf += qed_read_section_hdr(dump_buf,
7013 					 &section_name, &num_section_params);
7014 	if (strcmp(section_name, "global_params"))
7015 		return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
7016 
7017 	/* Print global params */
7018 	dump_buf += qed_print_section_params(dump_buf,
7019 					     num_section_params,
7020 					     results_buf, &results_offset);
7021 
7022 	while (!last_section_found) {
7023 		dump_buf += qed_read_section_hdr(dump_buf,
7024 						 &section_name,
7025 						 &num_section_params);
7026 		if (!strcmp(section_name, "fw_asserts")) {
7027 			/* Extract params */
7028 			const char *storm_letter = NULL;
7029 			u32 storm_dump_size = 0;
7030 
7031 			for (i = 0; i < num_section_params; i++) {
7032 				dump_buf += qed_read_param(dump_buf,
7033 							   &param_name,
7034 							   &param_str_val,
7035 							   &param_num_val);
7036 				if (!strcmp(param_name, "storm"))
7037 					storm_letter = param_str_val;
7038 				else if (!strcmp(param_name, "size"))
7039 					storm_dump_size = param_num_val;
7040 				else
7041 					return
7042 					    DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
7043 			}
7044 
7045 			if (!storm_letter || !storm_dump_size)
7046 				return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
7047 
7048 			/* Print data */
7049 			results_offset +=
7050 			    sprintf(qed_get_buf_ptr(results_buf,
7051 						    results_offset),
7052 				    "\n%sSTORM_ASSERT: size=%d\n",
7053 				    storm_letter, storm_dump_size);
7054 			for (i = 0; i < storm_dump_size; i++, dump_buf++)
7055 				results_offset +=
7056 				    sprintf(qed_get_buf_ptr(results_buf,
7057 							    results_offset),
7058 					    "%08x\n", *dump_buf);
7059 		} else if (!strcmp(section_name, "last")) {
7060 			last_section_found = true;
7061 		} else {
7062 			return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
7063 		}
7064 	}
7065 
7066 	/* Add 1 for string NULL termination */
7067 	*parsed_results_bytes = results_offset + 1;
7068 
7069 	return DBG_STATUS_OK;
7070 }
7071 
7072 /***************************** Public Functions *******************************/
7073 
7074 enum dbg_status qed_dbg_user_set_bin_ptr(struct qed_hwfn *p_hwfn,
7075 					 const u8 * const bin_ptr)
7076 {
7077 	struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr;
7078 	u8 buf_id;
7079 
7080 	/* Convert binary data to debug arrays */
7081 	for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++)
7082 		qed_set_dbg_bin_buf(p_hwfn,
7083 				    (enum bin_dbg_buffer_type)buf_id,
7084 				    (u32 *)(bin_ptr + buf_hdrs[buf_id].offset),
7085 				    buf_hdrs[buf_id].length);
7086 
7087 	return DBG_STATUS_OK;
7088 }
7089 
7090 enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn,
7091 					void **user_data_ptr)
7092 {
7093 	*user_data_ptr = kzalloc(sizeof(struct dbg_tools_user_data),
7094 				 GFP_KERNEL);
7095 	if (!(*user_data_ptr))
7096 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
7097 
7098 	return DBG_STATUS_OK;
7099 }
7100 
7101 const char *qed_dbg_get_status_str(enum dbg_status status)
7102 {
7103 	return (status <
7104 		MAX_DBG_STATUS) ? s_status_str[status] : "Invalid debug status";
7105 }
7106 
7107 enum dbg_status qed_get_idle_chk_results_buf_size(struct qed_hwfn *p_hwfn,
7108 						  u32 *dump_buf,
7109 						  u32 num_dumped_dwords,
7110 						  u32 *results_buf_size)
7111 {
7112 	u32 num_errors, num_warnings;
7113 
7114 	return qed_parse_idle_chk_dump(p_hwfn,
7115 				       dump_buf,
7116 				       num_dumped_dwords,
7117 				       NULL,
7118 				       results_buf_size,
7119 				       &num_errors, &num_warnings);
7120 }
7121 
7122 enum dbg_status qed_print_idle_chk_results(struct qed_hwfn *p_hwfn,
7123 					   u32 *dump_buf,
7124 					   u32 num_dumped_dwords,
7125 					   char *results_buf,
7126 					   u32 *num_errors,
7127 					   u32 *num_warnings)
7128 {
7129 	u32 parsed_buf_size;
7130 
7131 	return qed_parse_idle_chk_dump(p_hwfn,
7132 				       dump_buf,
7133 				       num_dumped_dwords,
7134 				       results_buf,
7135 				       &parsed_buf_size,
7136 				       num_errors, num_warnings);
7137 }
7138 
7139 void qed_dbg_mcp_trace_set_meta_data(struct qed_hwfn *p_hwfn,
7140 				     const u32 *meta_buf)
7141 {
7142 	struct dbg_tools_user_data *dev_user_data =
7143 		qed_dbg_get_user_data(p_hwfn);
7144 
7145 	dev_user_data->mcp_trace_user_meta_buf = meta_buf;
7146 }
7147 
7148 enum dbg_status qed_get_mcp_trace_results_buf_size(struct qed_hwfn *p_hwfn,
7149 						   u32 *dump_buf,
7150 						   u32 num_dumped_dwords,
7151 						   u32 *results_buf_size)
7152 {
7153 	return qed_parse_mcp_trace_dump(p_hwfn,
7154 					dump_buf, NULL, results_buf_size, true);
7155 }
7156 
7157 enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn,
7158 					    u32 *dump_buf,
7159 					    u32 num_dumped_dwords,
7160 					    char *results_buf)
7161 {
7162 	u32 parsed_buf_size;
7163 
7164 	return qed_parse_mcp_trace_dump(p_hwfn,
7165 					dump_buf,
7166 					results_buf, &parsed_buf_size, true);
7167 }
7168 
7169 enum dbg_status qed_print_mcp_trace_results_cont(struct qed_hwfn *p_hwfn,
7170 						 u32 *dump_buf,
7171 						 char *results_buf)
7172 {
7173 	u32 parsed_buf_size;
7174 
7175 	return qed_parse_mcp_trace_dump(p_hwfn, dump_buf, results_buf,
7176 					&parsed_buf_size, false);
7177 }
7178 
7179 enum dbg_status qed_print_mcp_trace_line(struct qed_hwfn *p_hwfn,
7180 					 u8 *dump_buf,
7181 					 u32 num_dumped_bytes,
7182 					 char *results_buf)
7183 {
7184 	u32 parsed_results_bytes;
7185 
7186 	return qed_parse_mcp_trace_buf(p_hwfn,
7187 				       dump_buf,
7188 				       num_dumped_bytes,
7189 				       0,
7190 				       num_dumped_bytes,
7191 				       results_buf, &parsed_results_bytes);
7192 }
7193 
7194 /* Frees the specified MCP Trace meta data */
7195 void qed_mcp_trace_free_meta_data(struct qed_hwfn *p_hwfn)
7196 {
7197 	struct dbg_tools_user_data *dev_user_data;
7198 	struct mcp_trace_meta *meta;
7199 	u32 i;
7200 
7201 	dev_user_data = qed_dbg_get_user_data(p_hwfn);
7202 	meta = &dev_user_data->mcp_trace_meta;
7203 	if (!meta->is_allocated)
7204 		return;
7205 
7206 	/* Release modules */
7207 	if (meta->modules) {
7208 		for (i = 0; i < meta->modules_num; i++)
7209 			kfree(meta->modules[i]);
7210 		kfree(meta->modules);
7211 	}
7212 
7213 	/* Release formats */
7214 	if (meta->formats) {
7215 		for (i = 0; i < meta->formats_num; i++)
7216 			kfree(meta->formats[i].format_str);
7217 		kfree(meta->formats);
7218 	}
7219 
7220 	meta->is_allocated = false;
7221 }
7222 
7223 enum dbg_status qed_get_reg_fifo_results_buf_size(struct qed_hwfn *p_hwfn,
7224 						  u32 *dump_buf,
7225 						  u32 num_dumped_dwords,
7226 						  u32 *results_buf_size)
7227 {
7228 	return qed_parse_reg_fifo_dump(dump_buf, NULL, results_buf_size);
7229 }
7230 
7231 enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn,
7232 					   u32 *dump_buf,
7233 					   u32 num_dumped_dwords,
7234 					   char *results_buf)
7235 {
7236 	u32 parsed_buf_size;
7237 
7238 	return qed_parse_reg_fifo_dump(dump_buf, results_buf, &parsed_buf_size);
7239 }
7240 
7241 enum dbg_status qed_get_igu_fifo_results_buf_size(struct qed_hwfn *p_hwfn,
7242 						  u32 *dump_buf,
7243 						  u32 num_dumped_dwords,
7244 						  u32 *results_buf_size)
7245 {
7246 	return qed_parse_igu_fifo_dump(dump_buf, NULL, results_buf_size);
7247 }
7248 
7249 enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn,
7250 					   u32 *dump_buf,
7251 					   u32 num_dumped_dwords,
7252 					   char *results_buf)
7253 {
7254 	u32 parsed_buf_size;
7255 
7256 	return qed_parse_igu_fifo_dump(dump_buf, results_buf, &parsed_buf_size);
7257 }
7258 
7259 enum dbg_status
7260 qed_get_protection_override_results_buf_size(struct qed_hwfn *p_hwfn,
7261 					     u32 *dump_buf,
7262 					     u32 num_dumped_dwords,
7263 					     u32 *results_buf_size)
7264 {
7265 	return qed_parse_protection_override_dump(dump_buf,
7266 						  NULL, results_buf_size);
7267 }
7268 
7269 enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn,
7270 						      u32 *dump_buf,
7271 						      u32 num_dumped_dwords,
7272 						      char *results_buf)
7273 {
7274 	u32 parsed_buf_size;
7275 
7276 	return qed_parse_protection_override_dump(dump_buf,
7277 						  results_buf,
7278 						  &parsed_buf_size);
7279 }
7280 
7281 enum dbg_status qed_get_fw_asserts_results_buf_size(struct qed_hwfn *p_hwfn,
7282 						    u32 *dump_buf,
7283 						    u32 num_dumped_dwords,
7284 						    u32 *results_buf_size)
7285 {
7286 	return qed_parse_fw_asserts_dump(dump_buf, NULL, results_buf_size);
7287 }
7288 
7289 enum dbg_status qed_print_fw_asserts_results(struct qed_hwfn *p_hwfn,
7290 					     u32 *dump_buf,
7291 					     u32 num_dumped_dwords,
7292 					     char *results_buf)
7293 {
7294 	u32 parsed_buf_size;
7295 
7296 	return qed_parse_fw_asserts_dump(dump_buf,
7297 					 results_buf, &parsed_buf_size);
7298 }
7299 
7300 enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn,
7301 				   struct dbg_attn_block_result *results)
7302 {
7303 	const u32 *block_attn_name_offsets;
7304 	const char *attn_name_base;
7305 	const char *block_name;
7306 	enum dbg_attn_type attn_type;
7307 	u8 num_regs, i, j;
7308 
7309 	num_regs = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_NUM_REGS);
7310 	attn_type = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE);
7311 	block_name = qed_dbg_get_block_name(p_hwfn, results->block_id);
7312 	if (!block_name)
7313 		return DBG_STATUS_INVALID_ARGS;
7314 
7315 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr ||
7316 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr ||
7317 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr)
7318 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
7319 
7320 	block_attn_name_offsets =
7321 	    (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr +
7322 	    results->names_offset;
7323 
7324 	attn_name_base = p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr;
7325 
7326 	/* Go over registers with a non-zero attention status */
7327 	for (i = 0; i < num_regs; i++) {
7328 		struct dbg_attn_bit_mapping *bit_mapping;
7329 		struct dbg_attn_reg_result *reg_result;
7330 		u8 num_reg_attn, bit_idx = 0;
7331 
7332 		reg_result = &results->reg_results[i];
7333 		num_reg_attn = GET_FIELD(reg_result->data,
7334 					 DBG_ATTN_REG_RESULT_NUM_REG_ATTN);
7335 		bit_mapping = (struct dbg_attn_bit_mapping *)
7336 		    p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr +
7337 		    reg_result->block_attn_offset;
7338 
7339 		/* Go over attention status bits */
7340 		for (j = 0; j < num_reg_attn; j++, bit_idx++) {
7341 			u16 attn_idx_val = GET_FIELD(bit_mapping[j].data,
7342 						     DBG_ATTN_BIT_MAPPING_VAL);
7343 			const char *attn_name, *attn_type_str, *masked_str;
7344 			u32 attn_name_offset;
7345 			u32 sts_addr;
7346 
7347 			/* Check if bit mask should be advanced (due to unused
7348 			 * bits).
7349 			 */
7350 			if (GET_FIELD(bit_mapping[j].data,
7351 				      DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT)) {
7352 				bit_idx += (u8)attn_idx_val;
7353 				continue;
7354 			}
7355 
7356 			/* Check current bit index */
7357 			if (!(reg_result->sts_val & BIT(bit_idx)))
7358 				continue;
7359 
7360 			/* An attention bit with value=1 was found
7361 			 * Find attention name
7362 			 */
7363 			attn_name_offset =
7364 				block_attn_name_offsets[attn_idx_val];
7365 			attn_name = attn_name_base + attn_name_offset;
7366 			attn_type_str =
7367 				(attn_type ==
7368 				 ATTN_TYPE_INTERRUPT ? "Interrupt" :
7369 				 "Parity");
7370 			masked_str = reg_result->mask_val & BIT(bit_idx) ?
7371 				     " [masked]" : "";
7372 			sts_addr = GET_FIELD(reg_result->data,
7373 					     DBG_ATTN_REG_RESULT_STS_ADDRESS);
7374 			DP_NOTICE(p_hwfn,
7375 				  "%s (%s) : %s [address 0x%08x, bit %d]%s\n",
7376 				  block_name, attn_type_str, attn_name,
7377 				  sts_addr * 4, bit_idx, masked_str);
7378 		}
7379 	}
7380 
7381 	return DBG_STATUS_OK;
7382 }
7383 
7384 static DEFINE_MUTEX(qed_dbg_lock);
7385 
7386 /* Wrapper for unifying the idle_chk and mcp_trace api */
7387 static enum dbg_status
7388 qed_print_idle_chk_results_wrapper(struct qed_hwfn *p_hwfn,
7389 				   u32 *dump_buf,
7390 				   u32 num_dumped_dwords,
7391 				   char *results_buf)
7392 {
7393 	u32 num_errors, num_warnnings;
7394 
7395 	return qed_print_idle_chk_results(p_hwfn, dump_buf, num_dumped_dwords,
7396 					  results_buf, &num_errors,
7397 					  &num_warnnings);
7398 }
7399 
7400 /* Feature meta data lookup table */
7401 static struct {
7402 	char *name;
7403 	enum dbg_status (*get_size)(struct qed_hwfn *p_hwfn,
7404 				    struct qed_ptt *p_ptt, u32 *size);
7405 	enum dbg_status (*perform_dump)(struct qed_hwfn *p_hwfn,
7406 					struct qed_ptt *p_ptt, u32 *dump_buf,
7407 					u32 buf_size, u32 *dumped_dwords);
7408 	enum dbg_status (*print_results)(struct qed_hwfn *p_hwfn,
7409 					 u32 *dump_buf, u32 num_dumped_dwords,
7410 					 char *results_buf);
7411 	enum dbg_status (*results_buf_size)(struct qed_hwfn *p_hwfn,
7412 					    u32 *dump_buf,
7413 					    u32 num_dumped_dwords,
7414 					    u32 *results_buf_size);
7415 } qed_features_lookup[] = {
7416 	{
7417 	"grc", qed_dbg_grc_get_dump_buf_size,
7418 		    qed_dbg_grc_dump, NULL, NULL}, {
7419 	"idle_chk",
7420 		    qed_dbg_idle_chk_get_dump_buf_size,
7421 		    qed_dbg_idle_chk_dump,
7422 		    qed_print_idle_chk_results_wrapper,
7423 		    qed_get_idle_chk_results_buf_size}, {
7424 	"mcp_trace",
7425 		    qed_dbg_mcp_trace_get_dump_buf_size,
7426 		    qed_dbg_mcp_trace_dump, qed_print_mcp_trace_results,
7427 		    qed_get_mcp_trace_results_buf_size}, {
7428 	"reg_fifo",
7429 		    qed_dbg_reg_fifo_get_dump_buf_size,
7430 		    qed_dbg_reg_fifo_dump, qed_print_reg_fifo_results,
7431 		    qed_get_reg_fifo_results_buf_size}, {
7432 	"igu_fifo",
7433 		    qed_dbg_igu_fifo_get_dump_buf_size,
7434 		    qed_dbg_igu_fifo_dump, qed_print_igu_fifo_results,
7435 		    qed_get_igu_fifo_results_buf_size}, {
7436 	"protection_override",
7437 		    qed_dbg_protection_override_get_dump_buf_size,
7438 		    qed_dbg_protection_override_dump,
7439 		    qed_print_protection_override_results,
7440 		    qed_get_protection_override_results_buf_size}, {
7441 	"fw_asserts",
7442 		    qed_dbg_fw_asserts_get_dump_buf_size,
7443 		    qed_dbg_fw_asserts_dump,
7444 		    qed_print_fw_asserts_results,
7445 		    qed_get_fw_asserts_results_buf_size}, {
7446 	"ilt",
7447 		    qed_dbg_ilt_get_dump_buf_size,
7448 		    qed_dbg_ilt_dump, NULL, NULL},};
7449 
7450 static void qed_dbg_print_feature(u8 *p_text_buf, u32 text_size)
7451 {
7452 	u32 i, precision = 80;
7453 
7454 	if (!p_text_buf)
7455 		return;
7456 
7457 	pr_notice("\n%.*s", precision, p_text_buf);
7458 	for (i = precision; i < text_size; i += precision)
7459 		pr_cont("%.*s", precision, p_text_buf + i);
7460 	pr_cont("\n");
7461 }
7462 
7463 #define QED_RESULTS_BUF_MIN_SIZE 16
7464 /* Generic function for decoding debug feature info */
7465 static enum dbg_status format_feature(struct qed_hwfn *p_hwfn,
7466 				      enum qed_dbg_features feature_idx)
7467 {
7468 	struct qed_dbg_feature *feature =
7469 	    &p_hwfn->cdev->dbg_features[feature_idx];
7470 	u32 text_size_bytes, null_char_pos, i;
7471 	enum dbg_status rc;
7472 	char *text_buf;
7473 
7474 	/* Check if feature supports formatting capability */
7475 	if (!qed_features_lookup[feature_idx].results_buf_size)
7476 		return DBG_STATUS_OK;
7477 
7478 	/* Obtain size of formatted output */
7479 	rc = qed_features_lookup[feature_idx].
7480 		results_buf_size(p_hwfn, (u32 *)feature->dump_buf,
7481 				 feature->dumped_dwords, &text_size_bytes);
7482 	if (rc != DBG_STATUS_OK)
7483 		return rc;
7484 
7485 	/* Make sure that the allocated size is a multiple of dword (4 bytes) */
7486 	null_char_pos = text_size_bytes - 1;
7487 	text_size_bytes = (text_size_bytes + 3) & ~0x3;
7488 
7489 	if (text_size_bytes < QED_RESULTS_BUF_MIN_SIZE) {
7490 		DP_NOTICE(p_hwfn->cdev,
7491 			  "formatted size of feature was too small %d. Aborting\n",
7492 			  text_size_bytes);
7493 		return DBG_STATUS_INVALID_ARGS;
7494 	}
7495 
7496 	/* Allocate temp text buf */
7497 	text_buf = vzalloc(text_size_bytes);
7498 	if (!text_buf)
7499 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
7500 
7501 	/* Decode feature opcodes to string on temp buf */
7502 	rc = qed_features_lookup[feature_idx].
7503 		print_results(p_hwfn, (u32 *)feature->dump_buf,
7504 			      feature->dumped_dwords, text_buf);
7505 	if (rc != DBG_STATUS_OK) {
7506 		vfree(text_buf);
7507 		return rc;
7508 	}
7509 
7510 	/* Replace the original null character with a '\n' character.
7511 	 * The bytes that were added as a result of the dword alignment are also
7512 	 * padded with '\n' characters.
7513 	 */
7514 	for (i = null_char_pos; i < text_size_bytes; i++)
7515 		text_buf[i] = '\n';
7516 
7517 	/* Dump printable feature to log */
7518 	if (p_hwfn->cdev->print_dbg_data)
7519 		qed_dbg_print_feature(text_buf, text_size_bytes);
7520 
7521 	/* Just return the original binary buffer if requested */
7522 	if (p_hwfn->cdev->dbg_bin_dump) {
7523 		vfree(text_buf);
7524 		return DBG_STATUS_OK;
7525 	}
7526 
7527 	/* Free the old dump_buf and point the dump_buf to the newly allocagted
7528 	 * and formatted text buffer.
7529 	 */
7530 	vfree(feature->dump_buf);
7531 	feature->dump_buf = text_buf;
7532 	feature->buf_size = text_size_bytes;
7533 	feature->dumped_dwords = text_size_bytes / 4;
7534 	return rc;
7535 }
7536 
7537 #define MAX_DBG_FEATURE_SIZE_DWORDS	0x3FFFFFFF
7538 
7539 /* Generic function for performing the dump of a debug feature. */
7540 static enum dbg_status qed_dbg_dump(struct qed_hwfn *p_hwfn,
7541 				    struct qed_ptt *p_ptt,
7542 				    enum qed_dbg_features feature_idx)
7543 {
7544 	struct qed_dbg_feature *feature =
7545 	    &p_hwfn->cdev->dbg_features[feature_idx];
7546 	u32 buf_size_dwords;
7547 	enum dbg_status rc;
7548 
7549 	DP_NOTICE(p_hwfn->cdev, "Collecting a debug feature [\"%s\"]\n",
7550 		  qed_features_lookup[feature_idx].name);
7551 
7552 	/* Dump_buf was already allocated need to free (this can happen if dump
7553 	 * was called but file was never read).
7554 	 * We can't use the buffer as is since size may have changed.
7555 	 */
7556 	if (feature->dump_buf) {
7557 		vfree(feature->dump_buf);
7558 		feature->dump_buf = NULL;
7559 	}
7560 
7561 	/* Get buffer size from hsi, allocate accordingly, and perform the
7562 	 * dump.
7563 	 */
7564 	rc = qed_features_lookup[feature_idx].get_size(p_hwfn, p_ptt,
7565 						       &buf_size_dwords);
7566 	if (rc != DBG_STATUS_OK && rc != DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
7567 		return rc;
7568 
7569 	if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS) {
7570 		feature->buf_size = 0;
7571 		DP_NOTICE(p_hwfn->cdev,
7572 			  "Debug feature [\"%s\"] size (0x%x dwords) exceeds maximum size (0x%x dwords)\n",
7573 			  qed_features_lookup[feature_idx].name,
7574 			  buf_size_dwords, MAX_DBG_FEATURE_SIZE_DWORDS);
7575 
7576 		return DBG_STATUS_OK;
7577 	}
7578 
7579 	feature->buf_size = buf_size_dwords * sizeof(u32);
7580 	feature->dump_buf = vmalloc(feature->buf_size);
7581 	if (!feature->dump_buf)
7582 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
7583 
7584 	rc = qed_features_lookup[feature_idx].
7585 		perform_dump(p_hwfn, p_ptt, (u32 *)feature->dump_buf,
7586 			     feature->buf_size / sizeof(u32),
7587 			     &feature->dumped_dwords);
7588 
7589 	/* If mcp is stuck we get DBG_STATUS_NVRAM_GET_IMAGE_FAILED error.
7590 	 * In this case the buffer holds valid binary data, but we wont able
7591 	 * to parse it (since parsing relies on data in NVRAM which is only
7592 	 * accessible when MFW is responsive). skip the formatting but return
7593 	 * success so that binary data is provided.
7594 	 */
7595 	if (rc == DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
7596 		return DBG_STATUS_OK;
7597 
7598 	if (rc != DBG_STATUS_OK)
7599 		return rc;
7600 
7601 	/* Format output */
7602 	rc = format_feature(p_hwfn, feature_idx);
7603 	return rc;
7604 }
7605 
7606 int qed_dbg_grc(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
7607 {
7608 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_GRC, num_dumped_bytes);
7609 }
7610 
7611 int qed_dbg_grc_size(struct qed_dev *cdev)
7612 {
7613 	return qed_dbg_feature_size(cdev, DBG_FEATURE_GRC);
7614 }
7615 
7616 int qed_dbg_idle_chk(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
7617 {
7618 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IDLE_CHK,
7619 			       num_dumped_bytes);
7620 }
7621 
7622 int qed_dbg_idle_chk_size(struct qed_dev *cdev)
7623 {
7624 	return qed_dbg_feature_size(cdev, DBG_FEATURE_IDLE_CHK);
7625 }
7626 
7627 int qed_dbg_reg_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
7628 {
7629 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_REG_FIFO,
7630 			       num_dumped_bytes);
7631 }
7632 
7633 int qed_dbg_reg_fifo_size(struct qed_dev *cdev)
7634 {
7635 	return qed_dbg_feature_size(cdev, DBG_FEATURE_REG_FIFO);
7636 }
7637 
7638 int qed_dbg_igu_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
7639 {
7640 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IGU_FIFO,
7641 			       num_dumped_bytes);
7642 }
7643 
7644 int qed_dbg_igu_fifo_size(struct qed_dev *cdev)
7645 {
7646 	return qed_dbg_feature_size(cdev, DBG_FEATURE_IGU_FIFO);
7647 }
7648 
7649 static int qed_dbg_nvm_image_length(struct qed_hwfn *p_hwfn,
7650 				    enum qed_nvm_images image_id, u32 *length)
7651 {
7652 	struct qed_nvm_image_att image_att;
7653 	int rc;
7654 
7655 	*length = 0;
7656 	rc = qed_mcp_get_nvm_image_att(p_hwfn, image_id, &image_att);
7657 	if (rc)
7658 		return rc;
7659 
7660 	*length = image_att.length;
7661 
7662 	return rc;
7663 }
7664 
7665 static int qed_dbg_nvm_image(struct qed_dev *cdev, void *buffer,
7666 			     u32 *num_dumped_bytes,
7667 			     enum qed_nvm_images image_id)
7668 {
7669 	struct qed_hwfn *p_hwfn =
7670 		&cdev->hwfns[cdev->engine_for_debug];
7671 	u32 len_rounded;
7672 	int rc;
7673 
7674 	*num_dumped_bytes = 0;
7675 	rc = qed_dbg_nvm_image_length(p_hwfn, image_id, &len_rounded);
7676 	if (rc)
7677 		return rc;
7678 
7679 	DP_NOTICE(p_hwfn->cdev,
7680 		  "Collecting a debug feature [\"nvram image %d\"]\n",
7681 		  image_id);
7682 
7683 	len_rounded = roundup(len_rounded, sizeof(u32));
7684 	rc = qed_mcp_get_nvm_image(p_hwfn, image_id, buffer, len_rounded);
7685 	if (rc)
7686 		return rc;
7687 
7688 	/* QED_NVM_IMAGE_NVM_META image is not swapped like other images */
7689 	if (image_id != QED_NVM_IMAGE_NVM_META)
7690 		cpu_to_be32_array((__force __be32 *)buffer,
7691 				  (const u32 *)buffer,
7692 				  len_rounded / sizeof(u32));
7693 
7694 	*num_dumped_bytes = len_rounded;
7695 
7696 	return rc;
7697 }
7698 
7699 int qed_dbg_protection_override(struct qed_dev *cdev, void *buffer,
7700 				u32 *num_dumped_bytes)
7701 {
7702 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_PROTECTION_OVERRIDE,
7703 			       num_dumped_bytes);
7704 }
7705 
7706 int qed_dbg_protection_override_size(struct qed_dev *cdev)
7707 {
7708 	return qed_dbg_feature_size(cdev, DBG_FEATURE_PROTECTION_OVERRIDE);
7709 }
7710 
7711 int qed_dbg_fw_asserts(struct qed_dev *cdev, void *buffer,
7712 		       u32 *num_dumped_bytes)
7713 {
7714 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_FW_ASSERTS,
7715 			       num_dumped_bytes);
7716 }
7717 
7718 int qed_dbg_fw_asserts_size(struct qed_dev *cdev)
7719 {
7720 	return qed_dbg_feature_size(cdev, DBG_FEATURE_FW_ASSERTS);
7721 }
7722 
7723 int qed_dbg_ilt(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
7724 {
7725 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_ILT, num_dumped_bytes);
7726 }
7727 
7728 int qed_dbg_ilt_size(struct qed_dev *cdev)
7729 {
7730 	return qed_dbg_feature_size(cdev, DBG_FEATURE_ILT);
7731 }
7732 
7733 int qed_dbg_mcp_trace(struct qed_dev *cdev, void *buffer,
7734 		      u32 *num_dumped_bytes)
7735 {
7736 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_MCP_TRACE,
7737 			       num_dumped_bytes);
7738 }
7739 
7740 int qed_dbg_mcp_trace_size(struct qed_dev *cdev)
7741 {
7742 	return qed_dbg_feature_size(cdev, DBG_FEATURE_MCP_TRACE);
7743 }
7744 
7745 /* Defines the amount of bytes allocated for recording the length of debugfs
7746  * feature buffer.
7747  */
7748 #define REGDUMP_HEADER_SIZE			sizeof(u32)
7749 #define REGDUMP_HEADER_SIZE_SHIFT		0
7750 #define REGDUMP_HEADER_SIZE_MASK		0xffffff
7751 #define REGDUMP_HEADER_FEATURE_SHIFT		24
7752 #define REGDUMP_HEADER_FEATURE_MASK		0x1f
7753 #define REGDUMP_HEADER_BIN_DUMP_SHIFT		29
7754 #define REGDUMP_HEADER_BIN_DUMP_MASK		0x1
7755 #define REGDUMP_HEADER_OMIT_ENGINE_SHIFT	30
7756 #define REGDUMP_HEADER_OMIT_ENGINE_MASK		0x1
7757 #define REGDUMP_HEADER_ENGINE_SHIFT		31
7758 #define REGDUMP_HEADER_ENGINE_MASK		0x1
7759 #define REGDUMP_MAX_SIZE			0x1000000
7760 #define ILT_DUMP_MAX_SIZE			(1024 * 1024 * 15)
7761 
7762 enum debug_print_features {
7763 	OLD_MODE = 0,
7764 	IDLE_CHK = 1,
7765 	GRC_DUMP = 2,
7766 	MCP_TRACE = 3,
7767 	REG_FIFO = 4,
7768 	PROTECTION_OVERRIDE = 5,
7769 	IGU_FIFO = 6,
7770 	PHY = 7,
7771 	FW_ASSERTS = 8,
7772 	NVM_CFG1 = 9,
7773 	DEFAULT_CFG = 10,
7774 	NVM_META = 11,
7775 	MDUMP = 12,
7776 	ILT_DUMP = 13,
7777 };
7778 
7779 static u32 qed_calc_regdump_header(struct qed_dev *cdev,
7780 				   enum debug_print_features feature,
7781 				   int engine, u32 feature_size, u8 omit_engine)
7782 {
7783 	u32 res = 0;
7784 
7785 	SET_FIELD(res, REGDUMP_HEADER_SIZE, feature_size);
7786 	if (res != feature_size)
7787 		DP_NOTICE(cdev,
7788 			  "Feature %d is too large (size 0x%x) and will corrupt the dump\n",
7789 			  feature, feature_size);
7790 
7791 	SET_FIELD(res, REGDUMP_HEADER_FEATURE, feature);
7792 	SET_FIELD(res, REGDUMP_HEADER_BIN_DUMP, 1);
7793 	SET_FIELD(res, REGDUMP_HEADER_OMIT_ENGINE, omit_engine);
7794 	SET_FIELD(res, REGDUMP_HEADER_ENGINE, engine);
7795 
7796 	return res;
7797 }
7798 
7799 int qed_dbg_all_data(struct qed_dev *cdev, void *buffer)
7800 {
7801 	u8 cur_engine, omit_engine = 0, org_engine;
7802 	struct qed_hwfn *p_hwfn =
7803 		&cdev->hwfns[cdev->engine_for_debug];
7804 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
7805 	int grc_params[MAX_DBG_GRC_PARAMS], i;
7806 	u32 offset = 0, feature_size;
7807 	int rc;
7808 
7809 	for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
7810 		grc_params[i] = dev_data->grc.param_val[i];
7811 
7812 	if (!QED_IS_CMT(cdev))
7813 		omit_engine = 1;
7814 
7815 	mutex_lock(&qed_dbg_lock);
7816 	cdev->dbg_bin_dump = true;
7817 
7818 	org_engine = qed_get_debug_engine(cdev);
7819 	for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) {
7820 		/* Collect idle_chks and grcDump for each hw function */
7821 		DP_VERBOSE(cdev, QED_MSG_DEBUG,
7822 			   "obtaining idle_chk and grcdump for current engine\n");
7823 		qed_set_debug_engine(cdev, cur_engine);
7824 
7825 		/* First idle_chk */
7826 		rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset +
7827 				      REGDUMP_HEADER_SIZE, &feature_size);
7828 		if (!rc) {
7829 			*(u32 *)((u8 *)buffer + offset) =
7830 			    qed_calc_regdump_header(cdev, IDLE_CHK, cur_engine,
7831 						    feature_size, omit_engine);
7832 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7833 		} else {
7834 			DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc);
7835 		}
7836 
7837 		/* Second idle_chk */
7838 		rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset +
7839 				      REGDUMP_HEADER_SIZE, &feature_size);
7840 		if (!rc) {
7841 			*(u32 *)((u8 *)buffer + offset) =
7842 			    qed_calc_regdump_header(cdev, IDLE_CHK, cur_engine,
7843 						    feature_size, omit_engine);
7844 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7845 		} else {
7846 			DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc);
7847 		}
7848 
7849 		/* reg_fifo dump */
7850 		rc = qed_dbg_reg_fifo(cdev, (u8 *)buffer + offset +
7851 				      REGDUMP_HEADER_SIZE, &feature_size);
7852 		if (!rc) {
7853 			*(u32 *)((u8 *)buffer + offset) =
7854 			    qed_calc_regdump_header(cdev, REG_FIFO, cur_engine,
7855 						    feature_size, omit_engine);
7856 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7857 		} else {
7858 			DP_ERR(cdev, "qed_dbg_reg_fifo failed. rc = %d\n", rc);
7859 		}
7860 
7861 		/* igu_fifo dump */
7862 		rc = qed_dbg_igu_fifo(cdev, (u8 *)buffer + offset +
7863 				      REGDUMP_HEADER_SIZE, &feature_size);
7864 		if (!rc) {
7865 			*(u32 *)((u8 *)buffer + offset) =
7866 			    qed_calc_regdump_header(cdev, IGU_FIFO, cur_engine,
7867 						    feature_size, omit_engine);
7868 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7869 		} else {
7870 			DP_ERR(cdev, "qed_dbg_igu_fifo failed. rc = %d", rc);
7871 		}
7872 
7873 		/* protection_override dump */
7874 		rc = qed_dbg_protection_override(cdev, (u8 *)buffer + offset +
7875 						 REGDUMP_HEADER_SIZE,
7876 						 &feature_size);
7877 		if (!rc) {
7878 			*(u32 *)((u8 *)buffer + offset) =
7879 			    qed_calc_regdump_header(cdev, PROTECTION_OVERRIDE,
7880 						    cur_engine,
7881 						    feature_size, omit_engine);
7882 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7883 		} else {
7884 			DP_ERR(cdev,
7885 			       "qed_dbg_protection_override failed. rc = %d\n",
7886 			       rc);
7887 		}
7888 
7889 		/* fw_asserts dump */
7890 		rc = qed_dbg_fw_asserts(cdev, (u8 *)buffer + offset +
7891 					REGDUMP_HEADER_SIZE, &feature_size);
7892 		if (!rc) {
7893 			*(u32 *)((u8 *)buffer + offset) =
7894 			    qed_calc_regdump_header(cdev, FW_ASSERTS,
7895 						    cur_engine, feature_size,
7896 						    omit_engine);
7897 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7898 		} else {
7899 			DP_ERR(cdev, "qed_dbg_fw_asserts failed. rc = %d\n",
7900 			       rc);
7901 		}
7902 
7903 		feature_size = qed_dbg_ilt_size(cdev);
7904 		if (!cdev->disable_ilt_dump &&
7905 		    feature_size < ILT_DUMP_MAX_SIZE) {
7906 			rc = qed_dbg_ilt(cdev, (u8 *)buffer + offset +
7907 					 REGDUMP_HEADER_SIZE, &feature_size);
7908 			if (!rc) {
7909 				*(u32 *)((u8 *)buffer + offset) =
7910 				    qed_calc_regdump_header(cdev, ILT_DUMP,
7911 							    cur_engine,
7912 							    feature_size,
7913 							    omit_engine);
7914 				offset += feature_size + REGDUMP_HEADER_SIZE;
7915 			} else {
7916 				DP_ERR(cdev, "qed_dbg_ilt failed. rc = %d\n",
7917 				       rc);
7918 			}
7919 		}
7920 
7921 		/* GRC dump - must be last because when mcp stuck it will
7922 		 * clutter idle_chk, reg_fifo, ...
7923 		 */
7924 		for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
7925 			dev_data->grc.param_val[i] = grc_params[i];
7926 
7927 		rc = qed_dbg_grc(cdev, (u8 *)buffer + offset +
7928 				 REGDUMP_HEADER_SIZE, &feature_size);
7929 		if (!rc) {
7930 			*(u32 *)((u8 *)buffer + offset) =
7931 			    qed_calc_regdump_header(cdev, GRC_DUMP,
7932 						    cur_engine,
7933 						    feature_size, omit_engine);
7934 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7935 		} else {
7936 			DP_ERR(cdev, "qed_dbg_grc failed. rc = %d", rc);
7937 		}
7938 	}
7939 
7940 	qed_set_debug_engine(cdev, org_engine);
7941 
7942 	/* mcp_trace */
7943 	rc = qed_dbg_mcp_trace(cdev, (u8 *)buffer + offset +
7944 			       REGDUMP_HEADER_SIZE, &feature_size);
7945 	if (!rc) {
7946 		*(u32 *)((u8 *)buffer + offset) =
7947 		    qed_calc_regdump_header(cdev, MCP_TRACE, cur_engine,
7948 					    feature_size, omit_engine);
7949 		offset += (feature_size + REGDUMP_HEADER_SIZE);
7950 	} else {
7951 		DP_ERR(cdev, "qed_dbg_mcp_trace failed. rc = %d\n", rc);
7952 	}
7953 
7954 	/* Re-populate nvm attribute info */
7955 	qed_mcp_nvm_info_free(p_hwfn);
7956 	qed_mcp_nvm_info_populate(p_hwfn);
7957 
7958 	/* nvm cfg1 */
7959 	rc = qed_dbg_nvm_image(cdev,
7960 			       (u8 *)buffer + offset +
7961 			       REGDUMP_HEADER_SIZE, &feature_size,
7962 			       QED_NVM_IMAGE_NVM_CFG1);
7963 	if (!rc) {
7964 		*(u32 *)((u8 *)buffer + offset) =
7965 		    qed_calc_regdump_header(cdev, NVM_CFG1, cur_engine,
7966 					    feature_size, omit_engine);
7967 		offset += (feature_size + REGDUMP_HEADER_SIZE);
7968 	} else if (rc != -ENOENT) {
7969 		DP_ERR(cdev,
7970 		       "qed_dbg_nvm_image failed for image  %d (%s), rc = %d\n",
7971 		       QED_NVM_IMAGE_NVM_CFG1, "QED_NVM_IMAGE_NVM_CFG1", rc);
7972 	}
7973 
7974 	/* nvm default */
7975 	rc = qed_dbg_nvm_image(cdev,
7976 			       (u8 *)buffer + offset + REGDUMP_HEADER_SIZE,
7977 			       &feature_size, QED_NVM_IMAGE_DEFAULT_CFG);
7978 	if (!rc) {
7979 		*(u32 *)((u8 *)buffer + offset) =
7980 		    qed_calc_regdump_header(cdev, DEFAULT_CFG, cur_engine,
7981 					    feature_size, omit_engine);
7982 		offset += (feature_size + REGDUMP_HEADER_SIZE);
7983 	} else if (rc != -ENOENT) {
7984 		DP_ERR(cdev,
7985 		       "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
7986 		       QED_NVM_IMAGE_DEFAULT_CFG, "QED_NVM_IMAGE_DEFAULT_CFG",
7987 		       rc);
7988 	}
7989 
7990 	/* nvm meta */
7991 	rc = qed_dbg_nvm_image(cdev,
7992 			       (u8 *)buffer + offset + REGDUMP_HEADER_SIZE,
7993 			       &feature_size, QED_NVM_IMAGE_NVM_META);
7994 	if (!rc) {
7995 		*(u32 *)((u8 *)buffer + offset) =
7996 			qed_calc_regdump_header(cdev, NVM_META, cur_engine,
7997 						feature_size, omit_engine);
7998 		offset += (feature_size + REGDUMP_HEADER_SIZE);
7999 	} else if (rc != -ENOENT) {
8000 		DP_ERR(cdev,
8001 		       "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
8002 		       QED_NVM_IMAGE_NVM_META, "QED_NVM_IMAGE_NVM_META", rc);
8003 	}
8004 
8005 	/* nvm mdump */
8006 	rc = qed_dbg_nvm_image(cdev, (u8 *)buffer + offset +
8007 			       REGDUMP_HEADER_SIZE, &feature_size,
8008 			       QED_NVM_IMAGE_MDUMP);
8009 	if (!rc) {
8010 		*(u32 *)((u8 *)buffer + offset) =
8011 			qed_calc_regdump_header(cdev, MDUMP, cur_engine,
8012 						feature_size, omit_engine);
8013 		offset += (feature_size + REGDUMP_HEADER_SIZE);
8014 	} else if (rc != -ENOENT) {
8015 		DP_ERR(cdev,
8016 		       "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
8017 		       QED_NVM_IMAGE_MDUMP, "QED_NVM_IMAGE_MDUMP", rc);
8018 	}
8019 
8020 	cdev->dbg_bin_dump = false;
8021 	mutex_unlock(&qed_dbg_lock);
8022 
8023 	return 0;
8024 }
8025 
8026 int qed_dbg_all_data_size(struct qed_dev *cdev)
8027 {
8028 	struct qed_hwfn *p_hwfn =
8029 		&cdev->hwfns[cdev->engine_for_debug];
8030 	u32 regs_len = 0, image_len = 0, ilt_len = 0, total_ilt_len = 0;
8031 	u8 cur_engine, org_engine;
8032 
8033 	cdev->disable_ilt_dump = false;
8034 	org_engine = qed_get_debug_engine(cdev);
8035 	for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) {
8036 		/* Engine specific */
8037 		DP_VERBOSE(cdev, QED_MSG_DEBUG,
8038 			   "calculating idle_chk and grcdump register length for current engine\n");
8039 		qed_set_debug_engine(cdev, cur_engine);
8040 		regs_len += REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) +
8041 			    REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) +
8042 			    REGDUMP_HEADER_SIZE + qed_dbg_grc_size(cdev) +
8043 			    REGDUMP_HEADER_SIZE + qed_dbg_reg_fifo_size(cdev) +
8044 			    REGDUMP_HEADER_SIZE + qed_dbg_igu_fifo_size(cdev) +
8045 			    REGDUMP_HEADER_SIZE +
8046 			    qed_dbg_protection_override_size(cdev) +
8047 			    REGDUMP_HEADER_SIZE + qed_dbg_fw_asserts_size(cdev);
8048 
8049 		ilt_len = REGDUMP_HEADER_SIZE + qed_dbg_ilt_size(cdev);
8050 		if (ilt_len < ILT_DUMP_MAX_SIZE) {
8051 			total_ilt_len += ilt_len;
8052 			regs_len += ilt_len;
8053 		}
8054 	}
8055 
8056 	qed_set_debug_engine(cdev, org_engine);
8057 
8058 	/* Engine common */
8059 	regs_len += REGDUMP_HEADER_SIZE + qed_dbg_mcp_trace_size(cdev);
8060 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_CFG1, &image_len);
8061 	if (image_len)
8062 		regs_len += REGDUMP_HEADER_SIZE + image_len;
8063 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_DEFAULT_CFG, &image_len);
8064 	if (image_len)
8065 		regs_len += REGDUMP_HEADER_SIZE + image_len;
8066 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_META, &image_len);
8067 	if (image_len)
8068 		regs_len += REGDUMP_HEADER_SIZE + image_len;
8069 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_MDUMP, &image_len);
8070 	if (image_len)
8071 		regs_len += REGDUMP_HEADER_SIZE + image_len;
8072 
8073 	if (regs_len > REGDUMP_MAX_SIZE) {
8074 		DP_VERBOSE(cdev, QED_MSG_DEBUG,
8075 			   "Dump exceeds max size 0x%x, disable ILT dump\n",
8076 			   REGDUMP_MAX_SIZE);
8077 		cdev->disable_ilt_dump = true;
8078 		regs_len -= total_ilt_len;
8079 	}
8080 
8081 	return regs_len;
8082 }
8083 
8084 int qed_dbg_feature(struct qed_dev *cdev, void *buffer,
8085 		    enum qed_dbg_features feature, u32 *num_dumped_bytes)
8086 {
8087 	struct qed_hwfn *p_hwfn =
8088 		&cdev->hwfns[cdev->engine_for_debug];
8089 	struct qed_dbg_feature *qed_feature =
8090 		&cdev->dbg_features[feature];
8091 	enum dbg_status dbg_rc;
8092 	struct qed_ptt *p_ptt;
8093 	int rc = 0;
8094 
8095 	/* Acquire ptt */
8096 	p_ptt = qed_ptt_acquire(p_hwfn);
8097 	if (!p_ptt)
8098 		return -EINVAL;
8099 
8100 	/* Get dump */
8101 	dbg_rc = qed_dbg_dump(p_hwfn, p_ptt, feature);
8102 	if (dbg_rc != DBG_STATUS_OK) {
8103 		DP_VERBOSE(cdev, QED_MSG_DEBUG, "%s\n",
8104 			   qed_dbg_get_status_str(dbg_rc));
8105 		*num_dumped_bytes = 0;
8106 		rc = -EINVAL;
8107 		goto out;
8108 	}
8109 
8110 	DP_VERBOSE(cdev, QED_MSG_DEBUG,
8111 		   "copying debugfs feature to external buffer\n");
8112 	memcpy(buffer, qed_feature->dump_buf, qed_feature->buf_size);
8113 	*num_dumped_bytes = cdev->dbg_features[feature].dumped_dwords *
8114 			    4;
8115 
8116 out:
8117 	qed_ptt_release(p_hwfn, p_ptt);
8118 	return rc;
8119 }
8120 
8121 int qed_dbg_feature_size(struct qed_dev *cdev, enum qed_dbg_features feature)
8122 {
8123 	struct qed_hwfn *p_hwfn =
8124 		&cdev->hwfns[cdev->engine_for_debug];
8125 	struct qed_dbg_feature *qed_feature = &cdev->dbg_features[feature];
8126 	struct qed_ptt *p_ptt = qed_ptt_acquire(p_hwfn);
8127 	u32 buf_size_dwords;
8128 	enum dbg_status rc;
8129 
8130 	if (!p_ptt)
8131 		return -EINVAL;
8132 
8133 	rc = qed_features_lookup[feature].get_size(p_hwfn, p_ptt,
8134 						   &buf_size_dwords);
8135 	if (rc != DBG_STATUS_OK)
8136 		buf_size_dwords = 0;
8137 
8138 	/* Feature will not be dumped if it exceeds maximum size */
8139 	if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS)
8140 		buf_size_dwords = 0;
8141 
8142 	qed_ptt_release(p_hwfn, p_ptt);
8143 	qed_feature->buf_size = buf_size_dwords * sizeof(u32);
8144 	return qed_feature->buf_size;
8145 }
8146 
8147 u8 qed_get_debug_engine(struct qed_dev *cdev)
8148 {
8149 	return cdev->engine_for_debug;
8150 }
8151 
8152 void qed_set_debug_engine(struct qed_dev *cdev, int engine_number)
8153 {
8154 	DP_VERBOSE(cdev, QED_MSG_DEBUG, "set debug engine to %d\n",
8155 		   engine_number);
8156 	cdev->engine_for_debug = engine_number;
8157 }
8158 
8159 void qed_dbg_pf_init(struct qed_dev *cdev)
8160 {
8161 	const u8 *dbg_values = NULL;
8162 	int i;
8163 
8164 	/* Debug values are after init values.
8165 	 * The offset is the first dword of the file.
8166 	 */
8167 	dbg_values = cdev->firmware->data + *(u32 *)cdev->firmware->data;
8168 
8169 	for_each_hwfn(cdev, i) {
8170 		qed_dbg_set_bin_ptr(&cdev->hwfns[i], dbg_values);
8171 		qed_dbg_user_set_bin_ptr(&cdev->hwfns[i], dbg_values);
8172 	}
8173 
8174 	/* Set the hwfn to be 0 as default */
8175 	cdev->engine_for_debug = 0;
8176 }
8177 
8178 void qed_dbg_pf_exit(struct qed_dev *cdev)
8179 {
8180 	struct qed_dbg_feature *feature = NULL;
8181 	enum qed_dbg_features feature_idx;
8182 
8183 	/* debug features' buffers may be allocated if debug feature was used
8184 	 * but dump wasn't called
8185 	 */
8186 	for (feature_idx = 0; feature_idx < DBG_FEATURE_NUM; feature_idx++) {
8187 		feature = &cdev->dbg_features[feature_idx];
8188 		if (feature->dump_buf) {
8189 			vfree(feature->dump_buf);
8190 			feature->dump_buf = NULL;
8191 		}
8192 	}
8193 }
8194