1ab81e23cSAlexander Lobakin // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2c965db44STomer Tayar /* QLogic qed NIC Driver
3c965db44STomer Tayar  * Copyright (c) 2015 QLogic Corporation
4663eacd8SAlexander Lobakin  * Copyright (c) 2019-2020 Marvell International Ltd.
5c965db44STomer Tayar  */
6c965db44STomer Tayar 
7c965db44STomer Tayar #include <linux/module.h>
8c965db44STomer Tayar #include <linux/vmalloc.h>
9c965db44STomer Tayar #include <linux/crc32.h>
10c965db44STomer Tayar #include "qed.h"
118a52bbabSMichal Kalderon #include "qed_cxt.h"
12c965db44STomer Tayar #include "qed_hsi.h"
13*ee824f4bSOmkar Kulkarni #include "qed_dbg_hsi.h"
14c965db44STomer Tayar #include "qed_hw.h"
15c965db44STomer Tayar #include "qed_mcp.h"
16c965db44STomer Tayar #include "qed_reg_addr.h"
17c965db44STomer Tayar 
18c965db44STomer Tayar /* Memory groups enum */
19c965db44STomer Tayar enum mem_groups {
20c965db44STomer Tayar 	MEM_GROUP_PXP_MEM,
21c965db44STomer Tayar 	MEM_GROUP_DMAE_MEM,
22c965db44STomer Tayar 	MEM_GROUP_CM_MEM,
23c965db44STomer Tayar 	MEM_GROUP_QM_MEM,
24da090917STomer Tayar 	MEM_GROUP_DORQ_MEM,
25c965db44STomer Tayar 	MEM_GROUP_BRB_RAM,
26c965db44STomer Tayar 	MEM_GROUP_BRB_MEM,
27c965db44STomer Tayar 	MEM_GROUP_PRS_MEM,
28da090917STomer Tayar 	MEM_GROUP_SDM_MEM,
297b6859fbSMintz, Yuval 	MEM_GROUP_PBUF,
302d22bc83SMichal Kalderon 	MEM_GROUP_IOR,
31da090917STomer Tayar 	MEM_GROUP_RAM,
322d22bc83SMichal Kalderon 	MEM_GROUP_BTB_RAM,
33da090917STomer Tayar 	MEM_GROUP_RDIF_CTX,
34da090917STomer Tayar 	MEM_GROUP_TDIF_CTX,
35da090917STomer Tayar 	MEM_GROUP_CFC_MEM,
362d22bc83SMichal Kalderon 	MEM_GROUP_CONN_CFC_MEM,
372d22bc83SMichal Kalderon 	MEM_GROUP_CAU_PI,
382d22bc83SMichal Kalderon 	MEM_GROUP_CAU_MEM,
392d22bc83SMichal Kalderon 	MEM_GROUP_CAU_MEM_EXT,
402d22bc83SMichal Kalderon 	MEM_GROUP_PXP_ILT,
412d22bc83SMichal Kalderon 	MEM_GROUP_MULD_MEM,
422d22bc83SMichal Kalderon 	MEM_GROUP_BTB_MEM,
43c965db44STomer Tayar 	MEM_GROUP_IGU_MEM,
44c965db44STomer Tayar 	MEM_GROUP_IGU_MSIX,
45c965db44STomer Tayar 	MEM_GROUP_CAU_SB,
46c965db44STomer Tayar 	MEM_GROUP_BMB_RAM,
47c965db44STomer Tayar 	MEM_GROUP_BMB_MEM,
482d22bc83SMichal Kalderon 	MEM_GROUP_TM_MEM,
492d22bc83SMichal Kalderon 	MEM_GROUP_TASK_CFC_MEM,
50c965db44STomer Tayar 	MEM_GROUPS_NUM
51c965db44STomer Tayar };
52c965db44STomer Tayar 
53c965db44STomer Tayar /* Memory groups names */
54c965db44STomer Tayar static const char * const s_mem_group_names[] = {
55c965db44STomer Tayar 	"PXP_MEM",
56c965db44STomer Tayar 	"DMAE_MEM",
57c965db44STomer Tayar 	"CM_MEM",
58c965db44STomer Tayar 	"QM_MEM",
59da090917STomer Tayar 	"DORQ_MEM",
60c965db44STomer Tayar 	"BRB_RAM",
61c965db44STomer Tayar 	"BRB_MEM",
62c965db44STomer Tayar 	"PRS_MEM",
63da090917STomer Tayar 	"SDM_MEM",
647b6859fbSMintz, Yuval 	"PBUF",
652d22bc83SMichal Kalderon 	"IOR",
66da090917STomer Tayar 	"RAM",
672d22bc83SMichal Kalderon 	"BTB_RAM",
68da090917STomer Tayar 	"RDIF_CTX",
69da090917STomer Tayar 	"TDIF_CTX",
70da090917STomer Tayar 	"CFC_MEM",
712d22bc83SMichal Kalderon 	"CONN_CFC_MEM",
722d22bc83SMichal Kalderon 	"CAU_PI",
732d22bc83SMichal Kalderon 	"CAU_MEM",
742d22bc83SMichal Kalderon 	"CAU_MEM_EXT",
752d22bc83SMichal Kalderon 	"PXP_ILT",
762d22bc83SMichal Kalderon 	"MULD_MEM",
772d22bc83SMichal Kalderon 	"BTB_MEM",
78c965db44STomer Tayar 	"IGU_MEM",
79c965db44STomer Tayar 	"IGU_MSIX",
80c965db44STomer Tayar 	"CAU_SB",
81c965db44STomer Tayar 	"BMB_RAM",
82c965db44STomer Tayar 	"BMB_MEM",
832d22bc83SMichal Kalderon 	"TM_MEM",
842d22bc83SMichal Kalderon 	"TASK_CFC_MEM",
85c965db44STomer Tayar };
86c965db44STomer Tayar 
87c965db44STomer Tayar /* Idle check conditions */
887b6859fbSMintz, Yuval 
897b6859fbSMintz, Yuval static u32 cond5(const u32 *r, const u32 *imm)
90c965db44STomer Tayar {
91c965db44STomer Tayar 	return ((r[0] & imm[0]) != imm[1]) && ((r[1] & imm[2]) != imm[3]);
92c965db44STomer Tayar }
93c965db44STomer Tayar 
947b6859fbSMintz, Yuval static u32 cond7(const u32 *r, const u32 *imm)
95c965db44STomer Tayar {
96c965db44STomer Tayar 	return ((r[0] >> imm[0]) & imm[1]) != imm[2];
97c965db44STomer Tayar }
98c965db44STomer Tayar 
997b6859fbSMintz, Yuval static u32 cond6(const u32 *r, const u32 *imm)
100c965db44STomer Tayar {
101c965db44STomer Tayar 	return (r[0] & imm[0]) != imm[1];
102c965db44STomer Tayar }
103c965db44STomer Tayar 
1047b6859fbSMintz, Yuval static u32 cond9(const u32 *r, const u32 *imm)
105c965db44STomer Tayar {
106c965db44STomer Tayar 	return ((r[0] & imm[0]) >> imm[1]) !=
107c965db44STomer Tayar 	    (((r[0] & imm[2]) >> imm[3]) | ((r[1] & imm[4]) << imm[5]));
108c965db44STomer Tayar }
109c965db44STomer Tayar 
1107b6859fbSMintz, Yuval static u32 cond10(const u32 *r, const u32 *imm)
111c965db44STomer Tayar {
112c965db44STomer Tayar 	return ((r[0] & imm[0]) >> imm[1]) != (r[0] & imm[2]);
113c965db44STomer Tayar }
114c965db44STomer Tayar 
1157b6859fbSMintz, Yuval static u32 cond4(const u32 *r, const u32 *imm)
116c965db44STomer Tayar {
117c965db44STomer Tayar 	return (r[0] & ~imm[0]) != imm[1];
118c965db44STomer Tayar }
119c965db44STomer Tayar 
120c965db44STomer Tayar static u32 cond0(const u32 *r, const u32 *imm)
121c965db44STomer Tayar {
1227b6859fbSMintz, Yuval 	return (r[0] & ~r[1]) != imm[0];
1237b6859fbSMintz, Yuval }
1247b6859fbSMintz, Yuval 
1257b6859fbSMintz, Yuval static u32 cond1(const u32 *r, const u32 *imm)
1267b6859fbSMintz, Yuval {
127c965db44STomer Tayar 	return r[0] != imm[0];
128c965db44STomer Tayar }
129c965db44STomer Tayar 
1307b6859fbSMintz, Yuval static u32 cond11(const u32 *r, const u32 *imm)
131c965db44STomer Tayar {
132c965db44STomer Tayar 	return r[0] != r[1] && r[2] == imm[0];
133c965db44STomer Tayar }
134c965db44STomer Tayar 
1357b6859fbSMintz, Yuval static u32 cond12(const u32 *r, const u32 *imm)
136c965db44STomer Tayar {
137c965db44STomer Tayar 	return r[0] != r[1] && r[2] > imm[0];
138c965db44STomer Tayar }
139c965db44STomer Tayar 
140c965db44STomer Tayar static u32 cond3(const u32 *r, const u32 *imm)
141c965db44STomer Tayar {
142c965db44STomer Tayar 	return r[0] != r[1];
143c965db44STomer Tayar }
144c965db44STomer Tayar 
1457b6859fbSMintz, Yuval static u32 cond13(const u32 *r, const u32 *imm)
146c965db44STomer Tayar {
147c965db44STomer Tayar 	return r[0] & imm[0];
148c965db44STomer Tayar }
149c965db44STomer Tayar 
1507b6859fbSMintz, Yuval static u32 cond8(const u32 *r, const u32 *imm)
151c965db44STomer Tayar {
152c965db44STomer Tayar 	return r[0] < (r[1] - imm[0]);
153c965db44STomer Tayar }
154c965db44STomer Tayar 
155c965db44STomer Tayar static u32 cond2(const u32 *r, const u32 *imm)
156c965db44STomer Tayar {
157c965db44STomer Tayar 	return r[0] > imm[0];
158c965db44STomer Tayar }
159c965db44STomer Tayar 
160c965db44STomer Tayar /* Array of Idle Check conditions */
161c965db44STomer Tayar static u32(*cond_arr[]) (const u32 *r, const u32 *imm) = {
162c965db44STomer Tayar 	cond0,
163c965db44STomer Tayar 	cond1,
164c965db44STomer Tayar 	cond2,
165c965db44STomer Tayar 	cond3,
166c965db44STomer Tayar 	cond4,
167c965db44STomer Tayar 	cond5,
168c965db44STomer Tayar 	cond6,
169c965db44STomer Tayar 	cond7,
170c965db44STomer Tayar 	cond8,
171c965db44STomer Tayar 	cond9,
172c965db44STomer Tayar 	cond10,
173c965db44STomer Tayar 	cond11,
174c965db44STomer Tayar 	cond12,
1757b6859fbSMintz, Yuval 	cond13,
176c965db44STomer Tayar };
177c965db44STomer Tayar 
1782d22bc83SMichal Kalderon #define NUM_PHYS_BLOCKS 84
1792d22bc83SMichal Kalderon 
1802d22bc83SMichal Kalderon #define NUM_DBG_RESET_REGS 8
1812d22bc83SMichal Kalderon 
182c965db44STomer Tayar /******************************* Data Types **********************************/
183c965db44STomer Tayar 
1842d22bc83SMichal Kalderon enum hw_types {
1852d22bc83SMichal Kalderon 	HW_TYPE_ASIC,
186c965db44STomer Tayar 	PLATFORM_RESERVED,
187c965db44STomer Tayar 	PLATFORM_RESERVED2,
188c965db44STomer Tayar 	PLATFORM_RESERVED3,
1892d22bc83SMichal Kalderon 	PLATFORM_RESERVED4,
1902d22bc83SMichal Kalderon 	MAX_HW_TYPES
1912d22bc83SMichal Kalderon };
1922d22bc83SMichal Kalderon 
1932d22bc83SMichal Kalderon /* CM context types */
1942d22bc83SMichal Kalderon enum cm_ctx_types {
1952d22bc83SMichal Kalderon 	CM_CTX_CONN_AG,
1962d22bc83SMichal Kalderon 	CM_CTX_CONN_ST,
1972d22bc83SMichal Kalderon 	CM_CTX_TASK_AG,
1982d22bc83SMichal Kalderon 	CM_CTX_TASK_ST,
1992d22bc83SMichal Kalderon 	NUM_CM_CTX_TYPES
2002d22bc83SMichal Kalderon };
2012d22bc83SMichal Kalderon 
2022d22bc83SMichal Kalderon /* Debug bus frame modes */
2032d22bc83SMichal Kalderon enum dbg_bus_frame_modes {
2042d22bc83SMichal Kalderon 	DBG_BUS_FRAME_MODE_4ST = 0,	/* 4 Storm dwords (no HW) */
2052d22bc83SMichal Kalderon 	DBG_BUS_FRAME_MODE_2ST_2HW = 1,	/* 2 Storm dwords, 2 HW dwords */
2062d22bc83SMichal Kalderon 	DBG_BUS_FRAME_MODE_1ST_3HW = 2,	/* 1 Storm dwords, 3 HW dwords */
2072d22bc83SMichal Kalderon 	DBG_BUS_FRAME_MODE_4HW = 3,	/* 4 HW dwords (no Storms) */
2082d22bc83SMichal Kalderon 	DBG_BUS_FRAME_MODE_8HW = 4,	/* 8 HW dwords (no Storms) */
2092d22bc83SMichal Kalderon 	DBG_BUS_NUM_FRAME_MODES
210c965db44STomer Tayar };
211c965db44STomer Tayar 
212c965db44STomer Tayar /* Chip constant definitions */
213c965db44STomer Tayar struct chip_defs {
214c965db44STomer Tayar 	const char *name;
2158a52bbabSMichal Kalderon 	u32 num_ilt_pages;
216c965db44STomer Tayar };
217c965db44STomer Tayar 
2182d22bc83SMichal Kalderon /* HW type constant definitions */
2192d22bc83SMichal Kalderon struct hw_type_defs {
220c965db44STomer Tayar 	const char *name;
221c965db44STomer Tayar 	u32 delay_factor;
222da090917STomer Tayar 	u32 dmae_thresh;
223da090917STomer Tayar 	u32 log_thresh;
224c965db44STomer Tayar };
225c965db44STomer Tayar 
2262d22bc83SMichal Kalderon /* RBC reset definitions */
2272d22bc83SMichal Kalderon struct rbc_reset_defs {
2282d22bc83SMichal Kalderon 	u32 reset_reg_addr;
2292d22bc83SMichal Kalderon 	u32 reset_val[MAX_CHIP_IDS];
2302d22bc83SMichal Kalderon };
2312d22bc83SMichal Kalderon 
2327b6859fbSMintz, Yuval /* Storm constant definitions.
2337b6859fbSMintz, Yuval  * Addresses are in bytes, sizes are in quad-regs.
2347b6859fbSMintz, Yuval  */
235c965db44STomer Tayar struct storm_defs {
236c965db44STomer Tayar 	char letter;
2372d22bc83SMichal Kalderon 	enum block_id sem_block_id;
238c965db44STomer Tayar 	enum dbg_bus_clients dbg_client_id[MAX_CHIP_IDS];
239c965db44STomer Tayar 	bool has_vfc;
240c965db44STomer Tayar 	u32 sem_fast_mem_addr;
241c965db44STomer Tayar 	u32 sem_frame_mode_addr;
242c965db44STomer Tayar 	u32 sem_slow_enable_addr;
243c965db44STomer Tayar 	u32 sem_slow_mode_addr;
244c965db44STomer Tayar 	u32 sem_slow_mode1_conf_addr;
245c965db44STomer Tayar 	u32 sem_sync_dbg_empty_addr;
2462d22bc83SMichal Kalderon 	u32 sem_gpre_vect_addr;
247c965db44STomer Tayar 	u32 cm_ctx_wr_addr;
2482d22bc83SMichal Kalderon 	u32 cm_ctx_rd_addr[NUM_CM_CTX_TYPES];
2492d22bc83SMichal Kalderon 	u32 cm_ctx_lid_sizes[MAX_CHIP_IDS][NUM_CM_CTX_TYPES];
250c965db44STomer Tayar };
251c965db44STomer Tayar 
2522d22bc83SMichal Kalderon /* Debug Bus Constraint operation constant definitions */
2532d22bc83SMichal Kalderon struct dbg_bus_constraint_op_defs {
2542d22bc83SMichal Kalderon 	u8 hw_op_val;
2552d22bc83SMichal Kalderon 	bool is_cyclic;
2562d22bc83SMichal Kalderon };
2572d22bc83SMichal Kalderon 
2582d22bc83SMichal Kalderon /* Storm Mode definitions */
2592d22bc83SMichal Kalderon struct storm_mode_defs {
260c965db44STomer Tayar 	const char *name;
2612d22bc83SMichal Kalderon 	bool is_fast_dbg;
2622d22bc83SMichal Kalderon 	u8 id_in_hw;
2632d22bc83SMichal Kalderon 	u32 src_disable_reg_addr;
2642d22bc83SMichal Kalderon 	u32 src_enable_val;
265da090917STomer Tayar 	bool exists[MAX_CHIP_IDS];
266c965db44STomer Tayar };
267c965db44STomer Tayar 
268c965db44STomer Tayar struct grc_param_defs {
269c965db44STomer Tayar 	u32 default_val[MAX_CHIP_IDS];
270c965db44STomer Tayar 	u32 min;
271c965db44STomer Tayar 	u32 max;
272c965db44STomer Tayar 	bool is_preset;
27350bc60cbSMichal Kalderon 	bool is_persistent;
274c965db44STomer Tayar 	u32 exclude_all_preset_val;
2752d22bc83SMichal Kalderon 	u32 crash_preset_val[MAX_CHIP_IDS];
276c965db44STomer Tayar };
277c965db44STomer Tayar 
2787b6859fbSMintz, Yuval /* Address is in 128b units. Width is in bits. */
279c965db44STomer Tayar struct rss_mem_defs {
280c965db44STomer Tayar 	const char *mem_name;
281c965db44STomer Tayar 	const char *type_name;
2827b6859fbSMintz, Yuval 	u32 addr;
283da090917STomer Tayar 	u32 entry_width;
284c965db44STomer Tayar 	u32 num_entries[MAX_CHIP_IDS];
285c965db44STomer Tayar };
286c965db44STomer Tayar 
287c965db44STomer Tayar struct vfc_ram_defs {
288c965db44STomer Tayar 	const char *mem_name;
289c965db44STomer Tayar 	const char *type_name;
290c965db44STomer Tayar 	u32 base_row;
291c965db44STomer Tayar 	u32 num_rows;
292c965db44STomer Tayar };
293c965db44STomer Tayar 
294c965db44STomer Tayar struct big_ram_defs {
295c965db44STomer Tayar 	const char *instance_name;
296c965db44STomer Tayar 	enum mem_groups mem_group_id;
297c965db44STomer Tayar 	enum mem_groups ram_mem_group_id;
298c965db44STomer Tayar 	enum dbg_grc_params grc_param;
299c965db44STomer Tayar 	u32 addr_reg_addr;
300c965db44STomer Tayar 	u32 data_reg_addr;
301da090917STomer Tayar 	u32 is_256b_reg_addr;
302da090917STomer Tayar 	u32 is_256b_bit_offset[MAX_CHIP_IDS];
303da090917STomer Tayar 	u32 ram_size[MAX_CHIP_IDS]; /* In dwords */
304c965db44STomer Tayar };
305c965db44STomer Tayar 
306c965db44STomer Tayar struct phy_defs {
307c965db44STomer Tayar 	const char *phy_name;
3087b6859fbSMintz, Yuval 
3097b6859fbSMintz, Yuval 	/* PHY base GRC address */
310c965db44STomer Tayar 	u32 base_addr;
3117b6859fbSMintz, Yuval 
3127b6859fbSMintz, Yuval 	/* Relative address of indirect TBUS address register (bits 0..7) */
313c965db44STomer Tayar 	u32 tbus_addr_lo_addr;
3147b6859fbSMintz, Yuval 
3157b6859fbSMintz, Yuval 	/* Relative address of indirect TBUS address register (bits 8..10) */
316c965db44STomer Tayar 	u32 tbus_addr_hi_addr;
3177b6859fbSMintz, Yuval 
3187b6859fbSMintz, Yuval 	/* Relative address of indirect TBUS data register (bits 0..7) */
319c965db44STomer Tayar 	u32 tbus_data_lo_addr;
3207b6859fbSMintz, Yuval 
3217b6859fbSMintz, Yuval 	/* Relative address of indirect TBUS data register (bits 8..11) */
322c965db44STomer Tayar 	u32 tbus_data_hi_addr;
323c965db44STomer Tayar };
324c965db44STomer Tayar 
325d52c89f1SMichal Kalderon /* Split type definitions */
326d52c89f1SMichal Kalderon struct split_type_defs {
327d52c89f1SMichal Kalderon 	const char *name;
328d52c89f1SMichal Kalderon };
329d52c89f1SMichal Kalderon 
330c965db44STomer Tayar /******************************** Constants **********************************/
331c965db44STomer Tayar 
332c965db44STomer Tayar #define BYTES_IN_DWORD			sizeof(u32)
333c965db44STomer Tayar /* In the macros below, size and offset are specified in bits */
334c965db44STomer Tayar #define CEIL_DWORDS(size)		DIV_ROUND_UP(size, 32)
335c965db44STomer Tayar #define FIELD_BIT_OFFSET(type, field)	type ## _ ## field ## _ ## OFFSET
336c965db44STomer Tayar #define FIELD_BIT_SIZE(type, field)	type ## _ ## field ## _ ## SIZE
337c965db44STomer Tayar #define FIELD_DWORD_OFFSET(type, field) \
338c965db44STomer Tayar 	 (int)(FIELD_BIT_OFFSET(type, field) / 32)
339c965db44STomer Tayar #define FIELD_DWORD_SHIFT(type, field)	(FIELD_BIT_OFFSET(type, field) % 32)
340c965db44STomer Tayar #define FIELD_BIT_MASK(type, field) \
341c965db44STomer Tayar 	(((1 << FIELD_BIT_SIZE(type, field)) - 1) << \
342c965db44STomer Tayar 	 FIELD_DWORD_SHIFT(type, field))
3437b6859fbSMintz, Yuval 
344c965db44STomer Tayar #define SET_VAR_FIELD(var, type, field, val) \
345c965db44STomer Tayar 	do { \
346c965db44STomer Tayar 		var[FIELD_DWORD_OFFSET(type, field)] &=	\
347c965db44STomer Tayar 		(~FIELD_BIT_MASK(type, field));	\
348c965db44STomer Tayar 		var[FIELD_DWORD_OFFSET(type, field)] |= \
349c965db44STomer Tayar 		(val) << FIELD_DWORD_SHIFT(type, field); \
350c965db44STomer Tayar 	} while (0)
3517b6859fbSMintz, Yuval 
352c965db44STomer Tayar #define ARR_REG_WR(dev, ptt, addr, arr, arr_size) \
353c965db44STomer Tayar 	do { \
354c965db44STomer Tayar 		for (i = 0; i < (arr_size); i++) \
355c965db44STomer Tayar 			qed_wr(dev, ptt, addr,	(arr)[i]); \
356c965db44STomer Tayar 	} while (0)
3577b6859fbSMintz, Yuval 
358c965db44STomer Tayar #define DWORDS_TO_BYTES(dwords)		((dwords) * BYTES_IN_DWORD)
359c965db44STomer Tayar #define BYTES_TO_DWORDS(bytes)		((bytes) / BYTES_IN_DWORD)
3607b6859fbSMintz, Yuval 
3612d22bc83SMichal Kalderon /* extra lines include a signature line + optional latency events line */
3622d22bc83SMichal Kalderon #define NUM_EXTRA_DBG_LINES(block) \
3632d22bc83SMichal Kalderon 	(GET_FIELD((block)->flags, DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS) ? 2 : 1)
3642d22bc83SMichal Kalderon #define NUM_DBG_LINES(block) \
3652d22bc83SMichal Kalderon 	((block)->num_of_dbg_bus_lines + NUM_EXTRA_DBG_LINES(block))
3662d22bc83SMichal Kalderon 
3672d22bc83SMichal Kalderon #define USE_DMAE			true
3682d22bc83SMichal Kalderon #define PROTECT_WIDE_BUS		true
3697b6859fbSMintz, Yuval 
370c965db44STomer Tayar #define RAM_LINES_TO_DWORDS(lines)	((lines) * 2)
371c965db44STomer Tayar #define RAM_LINES_TO_BYTES(lines) \
372c965db44STomer Tayar 	DWORDS_TO_BYTES(RAM_LINES_TO_DWORDS(lines))
3737b6859fbSMintz, Yuval 
374c965db44STomer Tayar #define REG_DUMP_LEN_SHIFT		24
375c965db44STomer Tayar #define MEM_DUMP_ENTRY_SIZE_DWORDS \
376c965db44STomer Tayar 	BYTES_TO_DWORDS(sizeof(struct dbg_dump_mem))
3777b6859fbSMintz, Yuval 
378c965db44STomer Tayar #define IDLE_CHK_RULE_SIZE_DWORDS \
379c965db44STomer Tayar 	BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_rule))
3807b6859fbSMintz, Yuval 
381c965db44STomer Tayar #define IDLE_CHK_RESULT_HDR_DWORDS \
382c965db44STomer Tayar 	BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_hdr))
3837b6859fbSMintz, Yuval 
384c965db44STomer Tayar #define IDLE_CHK_RESULT_REG_HDR_DWORDS \
385c965db44STomer Tayar 	BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_reg_hdr))
3867b6859fbSMintz, Yuval 
3878a52bbabSMichal Kalderon #define PAGE_MEM_DESC_SIZE_DWORDS \
3888a52bbabSMichal Kalderon 	BYTES_TO_DWORDS(sizeof(struct phys_mem_desc))
3898a52bbabSMichal Kalderon 
390c965db44STomer Tayar #define IDLE_CHK_MAX_ENTRIES_SIZE	32
391c965db44STomer Tayar 
392c965db44STomer Tayar /* The sizes and offsets below are specified in bits */
393c965db44STomer Tayar #define VFC_CAM_CMD_STRUCT_SIZE		64
394c965db44STomer Tayar #define VFC_CAM_CMD_ROW_OFFSET		48
395c965db44STomer Tayar #define VFC_CAM_CMD_ROW_SIZE		9
396c965db44STomer Tayar #define VFC_CAM_ADDR_STRUCT_SIZE	16
397c965db44STomer Tayar #define VFC_CAM_ADDR_OP_OFFSET		0
398c965db44STomer Tayar #define VFC_CAM_ADDR_OP_SIZE		4
399c965db44STomer Tayar #define VFC_CAM_RESP_STRUCT_SIZE	256
400c965db44STomer Tayar #define VFC_RAM_ADDR_STRUCT_SIZE	16
401c965db44STomer Tayar #define VFC_RAM_ADDR_OP_OFFSET		0
402c965db44STomer Tayar #define VFC_RAM_ADDR_OP_SIZE		2
403c965db44STomer Tayar #define VFC_RAM_ADDR_ROW_OFFSET		2
404c965db44STomer Tayar #define VFC_RAM_ADDR_ROW_SIZE		10
405c965db44STomer Tayar #define VFC_RAM_RESP_STRUCT_SIZE	256
4067b6859fbSMintz, Yuval 
407c965db44STomer Tayar #define VFC_CAM_CMD_DWORDS		CEIL_DWORDS(VFC_CAM_CMD_STRUCT_SIZE)
408c965db44STomer Tayar #define VFC_CAM_ADDR_DWORDS		CEIL_DWORDS(VFC_CAM_ADDR_STRUCT_SIZE)
409c965db44STomer Tayar #define VFC_CAM_RESP_DWORDS		CEIL_DWORDS(VFC_CAM_RESP_STRUCT_SIZE)
410c965db44STomer Tayar #define VFC_RAM_CMD_DWORDS		VFC_CAM_CMD_DWORDS
411c965db44STomer Tayar #define VFC_RAM_ADDR_DWORDS		CEIL_DWORDS(VFC_RAM_ADDR_STRUCT_SIZE)
412c965db44STomer Tayar #define VFC_RAM_RESP_DWORDS		CEIL_DWORDS(VFC_RAM_RESP_STRUCT_SIZE)
4137b6859fbSMintz, Yuval 
414c965db44STomer Tayar #define NUM_VFC_RAM_TYPES		4
4157b6859fbSMintz, Yuval 
416c965db44STomer Tayar #define VFC_CAM_NUM_ROWS		512
4177b6859fbSMintz, Yuval 
418c965db44STomer Tayar #define VFC_OPCODE_CAM_RD		14
419c965db44STomer Tayar #define VFC_OPCODE_RAM_RD		0
4207b6859fbSMintz, Yuval 
421c965db44STomer Tayar #define NUM_RSS_MEM_TYPES		5
4227b6859fbSMintz, Yuval 
423c965db44STomer Tayar #define NUM_BIG_RAM_TYPES		3
424c7d852e3SDenis Bolotin #define BIG_RAM_NAME_LEN		3
4257b6859fbSMintz, Yuval 
426c965db44STomer Tayar #define NUM_PHY_TBUS_ADDRESSES		2048
427c965db44STomer Tayar #define PHY_DUMP_SIZE_DWORDS		(NUM_PHY_TBUS_ADDRESSES / 2)
4287b6859fbSMintz, Yuval 
429c965db44STomer Tayar #define RESET_REG_UNRESET_OFFSET	4
4307b6859fbSMintz, Yuval 
431c965db44STomer Tayar #define STALL_DELAY_MS			500
4327b6859fbSMintz, Yuval 
433c965db44STomer Tayar #define STATIC_DEBUG_LINE_DWORDS	9
4347b6859fbSMintz, Yuval 
4352d22bc83SMichal Kalderon #define NUM_COMMON_GLOBAL_PARAMS	9
4362d22bc83SMichal Kalderon 
4372d22bc83SMichal Kalderon #define MAX_RECURSION_DEPTH		10
4387b6859fbSMintz, Yuval 
439c965db44STomer Tayar #define FW_IMG_MAIN			1
4407b6859fbSMintz, Yuval 
441c965db44STomer Tayar #define REG_FIFO_ELEMENT_DWORDS		2
4427b6859fbSMintz, Yuval #define REG_FIFO_DEPTH_ELEMENTS		32
443c965db44STomer Tayar #define REG_FIFO_DEPTH_DWORDS \
444c965db44STomer Tayar 	(REG_FIFO_ELEMENT_DWORDS * REG_FIFO_DEPTH_ELEMENTS)
4457b6859fbSMintz, Yuval 
446c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORDS		4
4477b6859fbSMintz, Yuval #define IGU_FIFO_DEPTH_ELEMENTS		64
448c965db44STomer Tayar #define IGU_FIFO_DEPTH_DWORDS \
449c965db44STomer Tayar 	(IGU_FIFO_ELEMENT_DWORDS * IGU_FIFO_DEPTH_ELEMENTS)
4507b6859fbSMintz, Yuval 
451c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_DWORDS	2
4527b6859fbSMintz, Yuval #define PROTECTION_OVERRIDE_DEPTH_ELEMENTS	20
453c965db44STomer Tayar #define PROTECTION_OVERRIDE_DEPTH_DWORDS \
454c965db44STomer Tayar 	(PROTECTION_OVERRIDE_DEPTH_ELEMENTS * \
455c965db44STomer Tayar 	 PROTECTION_OVERRIDE_ELEMENT_DWORDS)
4567b6859fbSMintz, Yuval 
457c965db44STomer Tayar #define MCP_SPAD_TRACE_OFFSIZE_ADDR \
458c965db44STomer Tayar 	(MCP_REG_SCRATCH + \
459c965db44STomer Tayar 	 offsetof(struct static_init, sections[SPAD_SECTION_TRACE]))
4607b6859fbSMintz, Yuval 
4612d22bc83SMichal Kalderon #define MAX_SW_PLTAFORM_STR_SIZE	64
4622d22bc83SMichal Kalderon 
463c965db44STomer Tayar #define EMPTY_FW_VERSION_STR		"???_???_???_???"
464c965db44STomer Tayar #define EMPTY_FW_IMAGE_STR		"???????????????"
465c965db44STomer Tayar 
466c965db44STomer Tayar /***************************** Constant Arrays *******************************/
467c965db44STomer Tayar 
468c965db44STomer Tayar /* Chip constant definitions array */
469c965db44STomer Tayar static struct chip_defs s_chip_defs[MAX_CHIP_IDS] = {
4708a52bbabSMichal Kalderon 	{"bb", PSWRQ2_REG_ILT_MEMORY_SIZE_BB / 2},
4718a52bbabSMichal Kalderon 	{"ah", PSWRQ2_REG_ILT_MEMORY_SIZE_K2 / 2}
472c965db44STomer Tayar };
473c965db44STomer Tayar 
474c965db44STomer Tayar /* Storm constant definitions array */
475c965db44STomer Tayar static struct storm_defs s_storm_defs[] = {
476c965db44STomer Tayar 	/* Tstorm */
477c965db44STomer Tayar 	{'T', BLOCK_TSEM,
4782d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT},
4792d22bc83SMichal Kalderon 		true,
480c965db44STomer Tayar 		TSEM_REG_FAST_MEMORY,
4817b6859fbSMintz, Yuval 		TSEM_REG_DBG_FRAME_MODE_BB_K2, TSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
4827b6859fbSMintz, Yuval 		TSEM_REG_SLOW_DBG_MODE_BB_K2, TSEM_REG_DBG_MODE1_CFG_BB_K2,
4832d22bc83SMichal Kalderon 		TSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_DBG_GPRE_VECT,
484c965db44STomer Tayar 		TCM_REG_CTX_RBC_ACCS,
4852d22bc83SMichal Kalderon 		{TCM_REG_AGG_CON_CTX, TCM_REG_SM_CON_CTX, TCM_REG_AGG_TASK_CTX,
4862d22bc83SMichal Kalderon 		 TCM_REG_SM_TASK_CTX},
4872d22bc83SMichal Kalderon 		{{4, 16, 2, 4}, {4, 16, 2, 4}} /* {bb} {k2} */
4882d22bc83SMichal Kalderon 	},
4897b6859fbSMintz, Yuval 
490c965db44STomer Tayar 	/* Mstorm */
491c965db44STomer Tayar 	{'M', BLOCK_MSEM,
4922d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM},
4932d22bc83SMichal Kalderon 		false,
494c965db44STomer Tayar 		MSEM_REG_FAST_MEMORY,
4952d22bc83SMichal Kalderon 		MSEM_REG_DBG_FRAME_MODE_BB_K2,
4962d22bc83SMichal Kalderon 		MSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
4972d22bc83SMichal Kalderon 		MSEM_REG_SLOW_DBG_MODE_BB_K2,
4982d22bc83SMichal Kalderon 		MSEM_REG_DBG_MODE1_CFG_BB_K2,
4992d22bc83SMichal Kalderon 		MSEM_REG_SYNC_DBG_EMPTY,
5002d22bc83SMichal Kalderon 		MSEM_REG_DBG_GPRE_VECT,
501c965db44STomer Tayar 		MCM_REG_CTX_RBC_ACCS,
5022d22bc83SMichal Kalderon 		{MCM_REG_AGG_CON_CTX, MCM_REG_SM_CON_CTX, MCM_REG_AGG_TASK_CTX,
5032d22bc83SMichal Kalderon 		 MCM_REG_SM_TASK_CTX },
5042d22bc83SMichal Kalderon 		{{1, 10, 2, 7}, {1, 10, 2, 7}} /* {bb} {k2}*/
5052d22bc83SMichal Kalderon 	},
5067b6859fbSMintz, Yuval 
507c965db44STomer Tayar 	/* Ustorm */
508c965db44STomer Tayar 	{'U', BLOCK_USEM,
5092d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU},
5102d22bc83SMichal Kalderon 		false,
511c965db44STomer Tayar 		USEM_REG_FAST_MEMORY,
5122d22bc83SMichal Kalderon 		USEM_REG_DBG_FRAME_MODE_BB_K2,
5132d22bc83SMichal Kalderon 		USEM_REG_SLOW_DBG_ACTIVE_BB_K2,
5142d22bc83SMichal Kalderon 		USEM_REG_SLOW_DBG_MODE_BB_K2,
5152d22bc83SMichal Kalderon 		USEM_REG_DBG_MODE1_CFG_BB_K2,
5162d22bc83SMichal Kalderon 		USEM_REG_SYNC_DBG_EMPTY,
5172d22bc83SMichal Kalderon 		USEM_REG_DBG_GPRE_VECT,
518c965db44STomer Tayar 		UCM_REG_CTX_RBC_ACCS,
5192d22bc83SMichal Kalderon 		{UCM_REG_AGG_CON_CTX, UCM_REG_SM_CON_CTX, UCM_REG_AGG_TASK_CTX,
5202d22bc83SMichal Kalderon 		 UCM_REG_SM_TASK_CTX},
5212d22bc83SMichal Kalderon 		{{2, 13, 3, 3}, {2, 13, 3, 3}} /* {bb} {k2} */
5222d22bc83SMichal Kalderon 	},
5237b6859fbSMintz, Yuval 
524c965db44STomer Tayar 	/* Xstorm */
525c965db44STomer Tayar 	{'X', BLOCK_XSEM,
5262d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX},
5272d22bc83SMichal Kalderon 		false,
528c965db44STomer Tayar 		XSEM_REG_FAST_MEMORY,
5292d22bc83SMichal Kalderon 		XSEM_REG_DBG_FRAME_MODE_BB_K2,
5302d22bc83SMichal Kalderon 		XSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
5312d22bc83SMichal Kalderon 		XSEM_REG_SLOW_DBG_MODE_BB_K2,
5322d22bc83SMichal Kalderon 		XSEM_REG_DBG_MODE1_CFG_BB_K2,
5332d22bc83SMichal Kalderon 		XSEM_REG_SYNC_DBG_EMPTY,
5342d22bc83SMichal Kalderon 		XSEM_REG_DBG_GPRE_VECT,
535c965db44STomer Tayar 		XCM_REG_CTX_RBC_ACCS,
5362d22bc83SMichal Kalderon 		{XCM_REG_AGG_CON_CTX, XCM_REG_SM_CON_CTX, 0, 0},
5372d22bc83SMichal Kalderon 		{{9, 15, 0, 0}, {9, 15,	0, 0}} /* {bb} {k2} */
5382d22bc83SMichal Kalderon 	},
5397b6859fbSMintz, Yuval 
540c965db44STomer Tayar 	/* Ystorm */
541c965db44STomer Tayar 	{'Y', BLOCK_YSEM,
5422d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY},
5432d22bc83SMichal Kalderon 		false,
544c965db44STomer Tayar 		YSEM_REG_FAST_MEMORY,
5452d22bc83SMichal Kalderon 		YSEM_REG_DBG_FRAME_MODE_BB_K2,
5462d22bc83SMichal Kalderon 		YSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
5472d22bc83SMichal Kalderon 		YSEM_REG_SLOW_DBG_MODE_BB_K2,
5482d22bc83SMichal Kalderon 		YSEM_REG_DBG_MODE1_CFG_BB_K2,
5492d22bc83SMichal Kalderon 		YSEM_REG_SYNC_DBG_EMPTY,
5502d22bc83SMichal Kalderon 		YSEM_REG_DBG_GPRE_VECT,
551c965db44STomer Tayar 		YCM_REG_CTX_RBC_ACCS,
5522d22bc83SMichal Kalderon 		{YCM_REG_AGG_CON_CTX, YCM_REG_SM_CON_CTX, YCM_REG_AGG_TASK_CTX,
5532d22bc83SMichal Kalderon 		 YCM_REG_SM_TASK_CTX},
5542d22bc83SMichal Kalderon 		{{2, 3, 2, 12}, {2, 3, 2, 12}} /* {bb} {k2} */
5552d22bc83SMichal Kalderon 	},
5567b6859fbSMintz, Yuval 
557c965db44STomer Tayar 	/* Pstorm */
558c965db44STomer Tayar 	{'P', BLOCK_PSEM,
5592d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS},
5602d22bc83SMichal Kalderon 		true,
561c965db44STomer Tayar 		PSEM_REG_FAST_MEMORY,
5622d22bc83SMichal Kalderon 		PSEM_REG_DBG_FRAME_MODE_BB_K2,
5632d22bc83SMichal Kalderon 		PSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
5642d22bc83SMichal Kalderon 		PSEM_REG_SLOW_DBG_MODE_BB_K2,
5652d22bc83SMichal Kalderon 		PSEM_REG_DBG_MODE1_CFG_BB_K2,
5662d22bc83SMichal Kalderon 		PSEM_REG_SYNC_DBG_EMPTY,
5672d22bc83SMichal Kalderon 		PSEM_REG_DBG_GPRE_VECT,
568c965db44STomer Tayar 		PCM_REG_CTX_RBC_ACCS,
5692d22bc83SMichal Kalderon 		{0, PCM_REG_SM_CON_CTX, 0, 0},
5702d22bc83SMichal Kalderon 		{{0, 10, 0, 0}, {0, 10, 0, 0}} /* {bb} {k2} */
5712d22bc83SMichal Kalderon 	},
572c965db44STomer Tayar };
573c965db44STomer Tayar 
5742d22bc83SMichal Kalderon static struct hw_type_defs s_hw_type_defs[] = {
5752d22bc83SMichal Kalderon 	/* HW_TYPE_ASIC */
576da090917STomer Tayar 	{"asic", 1, 256, 32768},
577da090917STomer Tayar 	{"reserved", 0, 0, 0},
578da090917STomer Tayar 	{"reserved2", 0, 0, 0},
579da090917STomer Tayar 	{"reserved3", 0, 0, 0}
580c965db44STomer Tayar };
581c965db44STomer Tayar 
582c965db44STomer Tayar static struct grc_param_defs s_grc_param_defs[] = {
5837b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_TSTORM */
5842d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
5857b6859fbSMintz, Yuval 
5867b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_MSTORM */
5872d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
5887b6859fbSMintz, Yuval 
5897b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_USTORM */
5902d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
5917b6859fbSMintz, Yuval 
5927b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_XSTORM */
5932d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
5947b6859fbSMintz, Yuval 
5957b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_YSTORM */
5962d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
5977b6859fbSMintz, Yuval 
5987b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_PSTORM */
5992d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
6007b6859fbSMintz, Yuval 
6017b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_REGS */
6022d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6037b6859fbSMintz, Yuval 
6047b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_RAM */
6052d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6067b6859fbSMintz, Yuval 
6077b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_PBUF */
6082d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6097b6859fbSMintz, Yuval 
6107b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_IOR */
6112d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
6127b6859fbSMintz, Yuval 
6137b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_VFC */
6142d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
6157b6859fbSMintz, Yuval 
6167b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_CM_CTX */
6172d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6187b6859fbSMintz, Yuval 
6197b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_ILT */
6202d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6217b6859fbSMintz, Yuval 
6227b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_RSS */
6232d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6247b6859fbSMintz, Yuval 
6257b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_CAU */
6262d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6277b6859fbSMintz, Yuval 
6287b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_QM */
6292d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6307b6859fbSMintz, Yuval 
6317b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_MCP */
6322d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6337b6859fbSMintz, Yuval 
6342d22bc83SMichal Kalderon 	/* DBG_GRC_PARAM_DUMP_DORQ */
6352d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6367b6859fbSMintz, Yuval 
6377b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_CFC */
6382d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6397b6859fbSMintz, Yuval 
6407b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_IGU */
6412d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6427b6859fbSMintz, Yuval 
6437b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_BRB */
6442d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
6457b6859fbSMintz, Yuval 
6467b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_BTB */
6472d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
6487b6859fbSMintz, Yuval 
6497b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_BMB */
6502d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
6517b6859fbSMintz, Yuval 
6522d22bc83SMichal Kalderon 	/* DBG_GRC_PARAM_RESERVED1 */
6532d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
6547b6859fbSMintz, Yuval 
6557b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_MULD */
6562d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6577b6859fbSMintz, Yuval 
6587b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_PRS */
6592d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6607b6859fbSMintz, Yuval 
6617b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_DMAE */
6622d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6637b6859fbSMintz, Yuval 
6647b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_TM */
6652d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6667b6859fbSMintz, Yuval 
6677b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_SDM */
6682d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6697b6859fbSMintz, Yuval 
6707b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_DIF */
6712d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6727b6859fbSMintz, Yuval 
6737b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_STATIC */
6742d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6757b6859fbSMintz, Yuval 
6767b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_UNSTALL */
6772d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
6787b6859fbSMintz, Yuval 
6792d22bc83SMichal Kalderon 	/* DBG_GRC_PARAM_RESERVED2 */
6802d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
6817b6859fbSMintz, Yuval 
6822d22bc83SMichal Kalderon 	/* DBG_GRC_PARAM_MCP_TRACE_META_SIZE */
6832d22bc83SMichal Kalderon 	{{0, 0}, 1, 0xffffffff, false, true, 0, {0, 0}},
6847b6859fbSMintz, Yuval 
6857b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_EXCLUDE_ALL */
6862d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, true, false, 0, {0, 0}},
6877b6859fbSMintz, Yuval 
6887b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_CRASH */
6892d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, true, false, 0, {0, 0}},
6907b6859fbSMintz, Yuval 
6917b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_PARITY_SAFE */
6922d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
6937b6859fbSMintz, Yuval 
6947b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_CM */
6952d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6967b6859fbSMintz, Yuval 
6977b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_PHY */
6982d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
6997b6859fbSMintz, Yuval 
7007b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_NO_MCP */
7012d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7027b6859fbSMintz, Yuval 
7037b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_NO_FW_VER */
7042d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7058a52bbabSMichal Kalderon 
7068a52bbabSMichal Kalderon 	/* DBG_GRC_PARAM_RESERVED3 */
7072d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7088a52bbabSMichal Kalderon 
7098a52bbabSMichal Kalderon 	/* DBG_GRC_PARAM_DUMP_MCP_HW_DUMP */
7102d22bc83SMichal Kalderon 	{{0, 1}, 0, 1, false, false, 0, {0, 1}},
7118a52bbabSMichal Kalderon 
7128a52bbabSMichal Kalderon 	/* DBG_GRC_PARAM_DUMP_ILT_CDUC */
7132d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {0, 0}},
7148a52bbabSMichal Kalderon 
7158a52bbabSMichal Kalderon 	/* DBG_GRC_PARAM_DUMP_ILT_CDUT */
7162d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {0, 0}},
7178a52bbabSMichal Kalderon 
7188a52bbabSMichal Kalderon 	/* DBG_GRC_PARAM_DUMP_CAU_EXT */
7192d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {1, 1}}
720c965db44STomer Tayar };
721c965db44STomer Tayar 
722c965db44STomer Tayar static struct rss_mem_defs s_rss_mem_defs[] = {
723da090917STomer Tayar 	{"rss_mem_cid", "rss_cid", 0, 32,
7242d22bc83SMichal Kalderon 	 {256, 320}},
7257b6859fbSMintz, Yuval 
726da090917STomer Tayar 	{"rss_mem_key_msb", "rss_key", 1024, 256,
7272d22bc83SMichal Kalderon 	 {128, 208}},
7287b6859fbSMintz, Yuval 
729da090917STomer Tayar 	{"rss_mem_key_lsb", "rss_key", 2048, 64,
7302d22bc83SMichal Kalderon 	 {128, 208}},
7317b6859fbSMintz, Yuval 
732da090917STomer Tayar 	{"rss_mem_info", "rss_info", 3072, 16,
7332d22bc83SMichal Kalderon 	 {128, 208}},
7347b6859fbSMintz, Yuval 
735da090917STomer Tayar 	{"rss_mem_ind", "rss_ind", 4096, 16,
7362d22bc83SMichal Kalderon 	 {16384, 26624}}
737c965db44STomer Tayar };
738c965db44STomer Tayar 
739c965db44STomer Tayar static struct vfc_ram_defs s_vfc_ram_defs[] = {
740c965db44STomer Tayar 	{"vfc_ram_tt1", "vfc_ram", 0, 512},
741c965db44STomer Tayar 	{"vfc_ram_mtt2", "vfc_ram", 512, 128},
742c965db44STomer Tayar 	{"vfc_ram_stt2", "vfc_ram", 640, 32},
743c965db44STomer Tayar 	{"vfc_ram_ro_vect", "vfc_ram", 672, 32}
744c965db44STomer Tayar };
745c965db44STomer Tayar 
746c965db44STomer Tayar static struct big_ram_defs s_big_ram_defs[] = {
747c965db44STomer Tayar 	{"BRB", MEM_GROUP_BRB_MEM, MEM_GROUP_BRB_RAM, DBG_GRC_PARAM_DUMP_BRB,
748c965db44STomer Tayar 	 BRB_REG_BIG_RAM_ADDRESS, BRB_REG_BIG_RAM_DATA,
7492d22bc83SMichal Kalderon 	 MISC_REG_BLOCK_256B_EN, {0, 0},
7502d22bc83SMichal Kalderon 	 {153600, 180224}},
7517b6859fbSMintz, Yuval 
752c965db44STomer Tayar 	{"BTB", MEM_GROUP_BTB_MEM, MEM_GROUP_BTB_RAM, DBG_GRC_PARAM_DUMP_BTB,
753c965db44STomer Tayar 	 BTB_REG_BIG_RAM_ADDRESS, BTB_REG_BIG_RAM_DATA,
7542d22bc83SMichal Kalderon 	 MISC_REG_BLOCK_256B_EN, {0, 1},
7552d22bc83SMichal Kalderon 	 {92160, 117760}},
7567b6859fbSMintz, Yuval 
757c965db44STomer Tayar 	{"BMB", MEM_GROUP_BMB_MEM, MEM_GROUP_BMB_RAM, DBG_GRC_PARAM_DUMP_BMB,
758c965db44STomer Tayar 	 BMB_REG_BIG_RAM_ADDRESS, BMB_REG_BIG_RAM_DATA,
7592d22bc83SMichal Kalderon 	 MISCS_REG_BLOCK_256B_EN, {0, 0},
7602d22bc83SMichal Kalderon 	 {36864, 36864}}
761c965db44STomer Tayar };
762c965db44STomer Tayar 
7632d22bc83SMichal Kalderon static struct rbc_reset_defs s_rbc_reset_defs[] = {
764da090917STomer Tayar 	{MISCS_REG_RESET_PL_HV,
7652d22bc83SMichal Kalderon 	 {0x0, 0x400}},
766da090917STomer Tayar 	{MISC_REG_RESET_PL_PDA_VMAIN_1,
7672d22bc83SMichal Kalderon 	 {0x4404040, 0x4404040}},
768da090917STomer Tayar 	{MISC_REG_RESET_PL_PDA_VMAIN_2,
7692d22bc83SMichal Kalderon 	 {0x7, 0x7c00007}},
770da090917STomer Tayar 	{MISC_REG_RESET_PL_PDA_VAUX,
7712d22bc83SMichal Kalderon 	 {0x2, 0x2}},
772c965db44STomer Tayar };
773c965db44STomer Tayar 
774c965db44STomer Tayar static struct phy_defs s_phy_defs[] = {
7757b6859fbSMintz, Yuval 	{"nw_phy", NWS_REG_NWS_CMU_K2,
77621dd79e8STomer Tayar 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_7_0_K2_E5,
77721dd79e8STomer Tayar 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_15_8_K2_E5,
77821dd79e8STomer Tayar 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_7_0_K2_E5,
77921dd79e8STomer Tayar 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_11_8_K2_E5},
78021dd79e8STomer Tayar 	{"sgmii_phy", MS_REG_MS_CMU_K2_E5,
78121dd79e8STomer Tayar 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X132_K2_E5,
78221dd79e8STomer Tayar 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X133_K2_E5,
78321dd79e8STomer Tayar 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X130_K2_E5,
78421dd79e8STomer Tayar 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X131_K2_E5},
78521dd79e8STomer Tayar 	{"pcie_phy0", PHY_PCIE_REG_PHY0_K2_E5,
78621dd79e8STomer Tayar 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2_E5,
78721dd79e8STomer Tayar 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2_E5,
78821dd79e8STomer Tayar 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2_E5,
78921dd79e8STomer Tayar 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2_E5},
79021dd79e8STomer Tayar 	{"pcie_phy1", PHY_PCIE_REG_PHY1_K2_E5,
79121dd79e8STomer Tayar 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2_E5,
79221dd79e8STomer Tayar 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2_E5,
79321dd79e8STomer Tayar 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2_E5,
79421dd79e8STomer Tayar 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2_E5},
795c965db44STomer Tayar };
796c965db44STomer Tayar 
797d52c89f1SMichal Kalderon static struct split_type_defs s_split_type_defs[] = {
798d52c89f1SMichal Kalderon 	/* SPLIT_TYPE_NONE */
799d52c89f1SMichal Kalderon 	{"eng"},
800d52c89f1SMichal Kalderon 
801d52c89f1SMichal Kalderon 	/* SPLIT_TYPE_PORT */
802d52c89f1SMichal Kalderon 	{"port"},
803d52c89f1SMichal Kalderon 
804d52c89f1SMichal Kalderon 	/* SPLIT_TYPE_PF */
805d52c89f1SMichal Kalderon 	{"pf"},
806d52c89f1SMichal Kalderon 
807d52c89f1SMichal Kalderon 	/* SPLIT_TYPE_PORT_PF */
808d52c89f1SMichal Kalderon 	{"port"},
809d52c89f1SMichal Kalderon 
810d52c89f1SMichal Kalderon 	/* SPLIT_TYPE_VF */
811d52c89f1SMichal Kalderon 	{"vf"}
812d52c89f1SMichal Kalderon };
813d52c89f1SMichal Kalderon 
814c965db44STomer Tayar /**************************** Private Functions ******************************/
815c965db44STomer Tayar 
816c965db44STomer Tayar /* Reads and returns a single dword from the specified unaligned buffer */
817c965db44STomer Tayar static u32 qed_read_unaligned_dword(u8 *buf)
818c965db44STomer Tayar {
819c965db44STomer Tayar 	u32 dword;
820c965db44STomer Tayar 
821c965db44STomer Tayar 	memcpy((u8 *)&dword, buf, sizeof(dword));
822c965db44STomer Tayar 	return dword;
823c965db44STomer Tayar }
824c965db44STomer Tayar 
8253b86bd07SSudarsana Reddy Kalluru /* Sets the value of the specified GRC param */
8263b86bd07SSudarsana Reddy Kalluru static void qed_grc_set_param(struct qed_hwfn *p_hwfn,
8273b86bd07SSudarsana Reddy Kalluru 			      enum dbg_grc_params grc_param, u32 val)
8283b86bd07SSudarsana Reddy Kalluru {
8293b86bd07SSudarsana Reddy Kalluru 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
8303b86bd07SSudarsana Reddy Kalluru 
8313b86bd07SSudarsana Reddy Kalluru 	dev_data->grc.param_val[grc_param] = val;
8323b86bd07SSudarsana Reddy Kalluru }
8333b86bd07SSudarsana Reddy Kalluru 
834be086e7cSMintz, Yuval /* Returns the value of the specified GRC param */
835be086e7cSMintz, Yuval static u32 qed_grc_get_param(struct qed_hwfn *p_hwfn,
836be086e7cSMintz, Yuval 			     enum dbg_grc_params grc_param)
837be086e7cSMintz, Yuval {
838be086e7cSMintz, Yuval 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
839be086e7cSMintz, Yuval 
840be086e7cSMintz, Yuval 	return dev_data->grc.param_val[grc_param];
841be086e7cSMintz, Yuval }
842be086e7cSMintz, Yuval 
843be086e7cSMintz, Yuval /* Initializes the GRC parameters */
844be086e7cSMintz, Yuval static void qed_dbg_grc_init_params(struct qed_hwfn *p_hwfn)
845be086e7cSMintz, Yuval {
846be086e7cSMintz, Yuval 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
847be086e7cSMintz, Yuval 
848be086e7cSMintz, Yuval 	if (!dev_data->grc.params_initialized) {
849be086e7cSMintz, Yuval 		qed_dbg_grc_set_params_default(p_hwfn);
850be086e7cSMintz, Yuval 		dev_data->grc.params_initialized = 1;
851be086e7cSMintz, Yuval 	}
852be086e7cSMintz, Yuval }
853be086e7cSMintz, Yuval 
8542d22bc83SMichal Kalderon /* Sets pointer and size for the specified binary buffer type */
8552d22bc83SMichal Kalderon static void qed_set_dbg_bin_buf(struct qed_hwfn *p_hwfn,
8562d22bc83SMichal Kalderon 				enum bin_dbg_buffer_type buf_type,
8572d22bc83SMichal Kalderon 				const u32 *ptr, u32 size)
8582d22bc83SMichal Kalderon {
8592d22bc83SMichal Kalderon 	struct virt_mem_desc *buf = &p_hwfn->dbg_arrays[buf_type];
8602d22bc83SMichal Kalderon 
8612d22bc83SMichal Kalderon 	buf->ptr = (void *)ptr;
8622d22bc83SMichal Kalderon 	buf->size = size;
8632d22bc83SMichal Kalderon }
8642d22bc83SMichal Kalderon 
865c965db44STomer Tayar /* Initializes debug data for the specified device */
8662d22bc83SMichal Kalderon static enum dbg_status qed_dbg_dev_init(struct qed_hwfn *p_hwfn)
867c965db44STomer Tayar {
868c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
869d52c89f1SMichal Kalderon 	u8 num_pfs = 0, max_pfs_per_port = 0;
870c965db44STomer Tayar 
871c965db44STomer Tayar 	if (dev_data->initialized)
872c965db44STomer Tayar 		return DBG_STATUS_OK;
873c965db44STomer Tayar 
874d52c89f1SMichal Kalderon 	/* Set chip */
875c965db44STomer Tayar 	if (QED_IS_K2(p_hwfn->cdev)) {
876c965db44STomer Tayar 		dev_data->chip_id = CHIP_K2;
877c965db44STomer Tayar 		dev_data->mode_enable[MODE_K2] = 1;
878d52c89f1SMichal Kalderon 		dev_data->num_vfs = MAX_NUM_VFS_K2;
879d52c89f1SMichal Kalderon 		num_pfs = MAX_NUM_PFS_K2;
880d52c89f1SMichal Kalderon 		max_pfs_per_port = MAX_NUM_PFS_K2 / 2;
881c965db44STomer Tayar 	} else if (QED_IS_BB_B0(p_hwfn->cdev)) {
8827b6859fbSMintz, Yuval 		dev_data->chip_id = CHIP_BB;
8839c79ddaaSMintz, Yuval 		dev_data->mode_enable[MODE_BB] = 1;
884d52c89f1SMichal Kalderon 		dev_data->num_vfs = MAX_NUM_VFS_BB;
885d52c89f1SMichal Kalderon 		num_pfs = MAX_NUM_PFS_BB;
886d52c89f1SMichal Kalderon 		max_pfs_per_port = MAX_NUM_PFS_BB;
887c965db44STomer Tayar 	} else {
888c965db44STomer Tayar 		return DBG_STATUS_UNKNOWN_CHIP;
889c965db44STomer Tayar 	}
890c965db44STomer Tayar 
8912d22bc83SMichal Kalderon 	/* Set HW type */
8922d22bc83SMichal Kalderon 	dev_data->hw_type = HW_TYPE_ASIC;
893c965db44STomer Tayar 	dev_data->mode_enable[MODE_ASIC] = 1;
894be086e7cSMintz, Yuval 
895d52c89f1SMichal Kalderon 	/* Set port mode */
8962d22bc83SMichal Kalderon 	switch (p_hwfn->cdev->num_ports_in_engine) {
8972d22bc83SMichal Kalderon 	case 1:
898d52c89f1SMichal Kalderon 		dev_data->mode_enable[MODE_PORTS_PER_ENG_1] = 1;
899d52c89f1SMichal Kalderon 		break;
9002d22bc83SMichal Kalderon 	case 2:
901d52c89f1SMichal Kalderon 		dev_data->mode_enable[MODE_PORTS_PER_ENG_2] = 1;
902d52c89f1SMichal Kalderon 		break;
9032d22bc83SMichal Kalderon 	case 4:
904d52c89f1SMichal Kalderon 		dev_data->mode_enable[MODE_PORTS_PER_ENG_4] = 1;
905d52c89f1SMichal Kalderon 		break;
906d52c89f1SMichal Kalderon 	}
907d52c89f1SMichal Kalderon 
908d52c89f1SMichal Kalderon 	/* Set 100G mode */
9092d22bc83SMichal Kalderon 	if (QED_IS_CMT(p_hwfn->cdev))
910d52c89f1SMichal Kalderon 		dev_data->mode_enable[MODE_100G] = 1;
911d52c89f1SMichal Kalderon 
912d52c89f1SMichal Kalderon 	/* Set number of ports */
913d52c89f1SMichal Kalderon 	if (dev_data->mode_enable[MODE_PORTS_PER_ENG_1] ||
914d52c89f1SMichal Kalderon 	    dev_data->mode_enable[MODE_100G])
915d52c89f1SMichal Kalderon 		dev_data->num_ports = 1;
916d52c89f1SMichal Kalderon 	else if (dev_data->mode_enable[MODE_PORTS_PER_ENG_2])
917d52c89f1SMichal Kalderon 		dev_data->num_ports = 2;
918d52c89f1SMichal Kalderon 	else if (dev_data->mode_enable[MODE_PORTS_PER_ENG_4])
919d52c89f1SMichal Kalderon 		dev_data->num_ports = 4;
920d52c89f1SMichal Kalderon 
921d52c89f1SMichal Kalderon 	/* Set number of PFs per port */
922d52c89f1SMichal Kalderon 	dev_data->num_pfs_per_port = min_t(u32,
923d52c89f1SMichal Kalderon 					   num_pfs / dev_data->num_ports,
924d52c89f1SMichal Kalderon 					   max_pfs_per_port);
925d52c89f1SMichal Kalderon 
926be086e7cSMintz, Yuval 	/* Initializes the GRC parameters */
927be086e7cSMintz, Yuval 	qed_dbg_grc_init_params(p_hwfn);
928be086e7cSMintz, Yuval 
929da090917STomer Tayar 	dev_data->use_dmae = true;
930da090917STomer Tayar 	dev_data->initialized = 1;
9317b6859fbSMintz, Yuval 
932c965db44STomer Tayar 	return DBG_STATUS_OK;
933c965db44STomer Tayar }
934c965db44STomer Tayar 
9352d22bc83SMichal Kalderon static const struct dbg_block *get_dbg_block(struct qed_hwfn *p_hwfn,
9367b6859fbSMintz, Yuval 					     enum block_id block_id)
9377b6859fbSMintz, Yuval {
9382d22bc83SMichal Kalderon 	const struct dbg_block *dbg_block;
9392d22bc83SMichal Kalderon 
9402d22bc83SMichal Kalderon 	dbg_block = p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS].ptr;
9412d22bc83SMichal Kalderon 	return dbg_block + block_id;
9422d22bc83SMichal Kalderon }
9432d22bc83SMichal Kalderon 
9442d22bc83SMichal Kalderon static const struct dbg_block_chip *qed_get_dbg_block_per_chip(struct qed_hwfn
9452d22bc83SMichal Kalderon 							       *p_hwfn,
9462d22bc83SMichal Kalderon 							       enum block_id
9472d22bc83SMichal Kalderon 							       block_id)
9482d22bc83SMichal Kalderon {
9497b6859fbSMintz, Yuval 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
9507b6859fbSMintz, Yuval 
9512d22bc83SMichal Kalderon 	return (const struct dbg_block_chip *)
9522d22bc83SMichal Kalderon 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_CHIP_DATA].ptr +
9532d22bc83SMichal Kalderon 	    block_id * MAX_CHIP_IDS + dev_data->chip_id;
9542d22bc83SMichal Kalderon }
9552d22bc83SMichal Kalderon 
9562d22bc83SMichal Kalderon static const struct dbg_reset_reg *qed_get_dbg_reset_reg(struct qed_hwfn
9572d22bc83SMichal Kalderon 							 *p_hwfn,
9582d22bc83SMichal Kalderon 							 u8 reset_reg_id)
9592d22bc83SMichal Kalderon {
9602d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
9612d22bc83SMichal Kalderon 
9622d22bc83SMichal Kalderon 	return (const struct dbg_reset_reg *)
9632d22bc83SMichal Kalderon 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_RESET_REGS].ptr +
9642d22bc83SMichal Kalderon 	    reset_reg_id * MAX_CHIP_IDS + dev_data->chip_id;
9657b6859fbSMintz, Yuval }
9667b6859fbSMintz, Yuval 
967c965db44STomer Tayar /* Reads the FW info structure for the specified Storm from the chip,
968c965db44STomer Tayar  * and writes it to the specified fw_info pointer.
969c965db44STomer Tayar  */
970d52c89f1SMichal Kalderon static void qed_read_storm_fw_info(struct qed_hwfn *p_hwfn,
971c965db44STomer Tayar 				   struct qed_ptt *p_ptt,
972c965db44STomer Tayar 				   u8 storm_id, struct fw_info *fw_info)
973c965db44STomer Tayar {
9747b6859fbSMintz, Yuval 	struct storm_defs *storm = &s_storm_defs[storm_id];
975c965db44STomer Tayar 	struct fw_info_location fw_info_location;
9765ab90341SAlexander Lobakin 	u32 addr, i, size, *dest;
977c965db44STomer Tayar 
978c965db44STomer Tayar 	memset(&fw_info_location, 0, sizeof(fw_info_location));
979c965db44STomer Tayar 	memset(fw_info, 0, sizeof(*fw_info));
9807b6859fbSMintz, Yuval 
9817b6859fbSMintz, Yuval 	/* Read first the address that points to fw_info location.
9827b6859fbSMintz, Yuval 	 * The address is located in the last line of the Storm RAM.
9837b6859fbSMintz, Yuval 	 */
9847b6859fbSMintz, Yuval 	addr = storm->sem_fast_mem_addr + SEM_FAST_REG_INT_RAM +
9852d22bc83SMichal Kalderon 	    DWORDS_TO_BYTES(SEM_FAST_REG_INT_RAM_SIZE) -
9867b6859fbSMintz, Yuval 	    sizeof(fw_info_location);
9872d22bc83SMichal Kalderon 
9887b6859fbSMintz, Yuval 	dest = (u32 *)&fw_info_location;
9895ab90341SAlexander Lobakin 	size = BYTES_TO_DWORDS(sizeof(fw_info_location));
9907b6859fbSMintz, Yuval 
9915ab90341SAlexander Lobakin 	for (i = 0; i < size; i++, addr += BYTES_IN_DWORD)
992c965db44STomer Tayar 		dest[i] = qed_rd(p_hwfn, p_ptt, addr);
9937b6859fbSMintz, Yuval 
9945ab90341SAlexander Lobakin 	/* qed_rq() fetches data in CPU byteorder. Swap it back to
9955ab90341SAlexander Lobakin 	 * the device's to get right structure layout.
9965ab90341SAlexander Lobakin 	 */
9975ab90341SAlexander Lobakin 	cpu_to_le32_array(dest, size);
9985ab90341SAlexander Lobakin 
9997b6859fbSMintz, Yuval 	/* Read FW version info from Storm RAM */
10005ab90341SAlexander Lobakin 	size = le32_to_cpu(fw_info_location.size);
10015ab90341SAlexander Lobakin 	if (!size || size > sizeof(*fw_info))
10025ab90341SAlexander Lobakin 		return;
10035ab90341SAlexander Lobakin 
10045ab90341SAlexander Lobakin 	addr = le32_to_cpu(fw_info_location.grc_addr);
1005c965db44STomer Tayar 	dest = (u32 *)fw_info;
10065ab90341SAlexander Lobakin 	size = BYTES_TO_DWORDS(size);
10075ab90341SAlexander Lobakin 
10085ab90341SAlexander Lobakin 	for (i = 0; i < size; i++, addr += BYTES_IN_DWORD)
1009c965db44STomer Tayar 		dest[i] = qed_rd(p_hwfn, p_ptt, addr);
10105ab90341SAlexander Lobakin 
10115ab90341SAlexander Lobakin 	cpu_to_le32_array(dest, size);
1012c965db44STomer Tayar }
1013c965db44STomer Tayar 
10147b6859fbSMintz, Yuval /* Dumps the specified string to the specified buffer.
10157b6859fbSMintz, Yuval  * Returns the dumped size in bytes.
1016c965db44STomer Tayar  */
1017c965db44STomer Tayar static u32 qed_dump_str(char *dump_buf, bool dump, const char *str)
1018c965db44STomer Tayar {
1019c965db44STomer Tayar 	if (dump)
1020c965db44STomer Tayar 		strcpy(dump_buf, str);
10217b6859fbSMintz, Yuval 
1022c965db44STomer Tayar 	return (u32)strlen(str) + 1;
1023c965db44STomer Tayar }
1024c965db44STomer Tayar 
10257b6859fbSMintz, Yuval /* Dumps zeros to align the specified buffer to dwords.
10267b6859fbSMintz, Yuval  * Returns the dumped size in bytes.
1027c965db44STomer Tayar  */
1028c965db44STomer Tayar static u32 qed_dump_align(char *dump_buf, bool dump, u32 byte_offset)
1029c965db44STomer Tayar {
10307b6859fbSMintz, Yuval 	u8 offset_in_dword, align_size;
1031c965db44STomer Tayar 
10327b6859fbSMintz, Yuval 	offset_in_dword = (u8)(byte_offset & 0x3);
1033c965db44STomer Tayar 	align_size = offset_in_dword ? BYTES_IN_DWORD - offset_in_dword : 0;
1034c965db44STomer Tayar 
1035c965db44STomer Tayar 	if (dump && align_size)
1036c965db44STomer Tayar 		memset(dump_buf, 0, align_size);
10377b6859fbSMintz, Yuval 
1038c965db44STomer Tayar 	return align_size;
1039c965db44STomer Tayar }
1040c965db44STomer Tayar 
1041c965db44STomer Tayar /* Writes the specified string param to the specified buffer.
1042c965db44STomer Tayar  * Returns the dumped size in dwords.
1043c965db44STomer Tayar  */
1044c965db44STomer Tayar static u32 qed_dump_str_param(u32 *dump_buf,
1045c965db44STomer Tayar 			      bool dump,
1046c965db44STomer Tayar 			      const char *param_name, const char *param_val)
1047c965db44STomer Tayar {
1048c965db44STomer Tayar 	char *char_buf = (char *)dump_buf;
1049c965db44STomer Tayar 	u32 offset = 0;
1050c965db44STomer Tayar 
1051c965db44STomer Tayar 	/* Dump param name */
1052c965db44STomer Tayar 	offset += qed_dump_str(char_buf + offset, dump, param_name);
1053c965db44STomer Tayar 
1054c965db44STomer Tayar 	/* Indicate a string param value */
1055c965db44STomer Tayar 	if (dump)
1056c965db44STomer Tayar 		*(char_buf + offset) = 1;
1057c965db44STomer Tayar 	offset++;
1058c965db44STomer Tayar 
1059c965db44STomer Tayar 	/* Dump param value */
1060c965db44STomer Tayar 	offset += qed_dump_str(char_buf + offset, dump, param_val);
1061c965db44STomer Tayar 
1062c965db44STomer Tayar 	/* Align buffer to next dword */
1063c965db44STomer Tayar 	offset += qed_dump_align(char_buf + offset, dump, offset);
10647b6859fbSMintz, Yuval 
1065c965db44STomer Tayar 	return BYTES_TO_DWORDS(offset);
1066c965db44STomer Tayar }
1067c965db44STomer Tayar 
1068c965db44STomer Tayar /* Writes the specified numeric param to the specified buffer.
1069c965db44STomer Tayar  * Returns the dumped size in dwords.
1070c965db44STomer Tayar  */
1071c965db44STomer Tayar static u32 qed_dump_num_param(u32 *dump_buf,
1072c965db44STomer Tayar 			      bool dump, const char *param_name, u32 param_val)
1073c965db44STomer Tayar {
1074c965db44STomer Tayar 	char *char_buf = (char *)dump_buf;
1075c965db44STomer Tayar 	u32 offset = 0;
1076c965db44STomer Tayar 
1077c965db44STomer Tayar 	/* Dump param name */
1078c965db44STomer Tayar 	offset += qed_dump_str(char_buf + offset, dump, param_name);
1079c965db44STomer Tayar 
1080c965db44STomer Tayar 	/* Indicate a numeric param value */
1081c965db44STomer Tayar 	if (dump)
1082c965db44STomer Tayar 		*(char_buf + offset) = 0;
1083c965db44STomer Tayar 	offset++;
1084c965db44STomer Tayar 
1085c965db44STomer Tayar 	/* Align buffer to next dword */
1086c965db44STomer Tayar 	offset += qed_dump_align(char_buf + offset, dump, offset);
1087c965db44STomer Tayar 
1088c965db44STomer Tayar 	/* Dump param value (and change offset from bytes to dwords) */
1089c965db44STomer Tayar 	offset = BYTES_TO_DWORDS(offset);
1090c965db44STomer Tayar 	if (dump)
1091c965db44STomer Tayar 		*(dump_buf + offset) = param_val;
1092c965db44STomer Tayar 	offset++;
10937b6859fbSMintz, Yuval 
1094c965db44STomer Tayar 	return offset;
1095c965db44STomer Tayar }
1096c965db44STomer Tayar 
1097c965db44STomer Tayar /* Reads the FW version and writes it as a param to the specified buffer.
1098c965db44STomer Tayar  * Returns the dumped size in dwords.
1099c965db44STomer Tayar  */
1100c965db44STomer Tayar static u32 qed_dump_fw_ver_param(struct qed_hwfn *p_hwfn,
1101c965db44STomer Tayar 				 struct qed_ptt *p_ptt,
1102c965db44STomer Tayar 				 u32 *dump_buf, bool dump)
1103c965db44STomer Tayar {
1104c965db44STomer Tayar 	char fw_ver_str[16] = EMPTY_FW_VERSION_STR;
1105c965db44STomer Tayar 	char fw_img_str[16] = EMPTY_FW_IMAGE_STR;
1106c965db44STomer Tayar 	struct fw_info fw_info = { {0}, {0} };
1107c965db44STomer Tayar 	u32 offset = 0;
1108c965db44STomer Tayar 
1109be086e7cSMintz, Yuval 	if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
1110d52c89f1SMichal Kalderon 		/* Read FW info from chip */
1111d52c89f1SMichal Kalderon 		qed_read_fw_info(p_hwfn, p_ptt, &fw_info);
1112c965db44STomer Tayar 
1113c965db44STomer Tayar 		/* Create FW version/image strings */
11147b6859fbSMintz, Yuval 		if (snprintf(fw_ver_str, sizeof(fw_ver_str),
11157b6859fbSMintz, Yuval 			     "%d_%d_%d_%d", fw_info.ver.num.major,
11167b6859fbSMintz, Yuval 			     fw_info.ver.num.minor, fw_info.ver.num.rev,
11177b6859fbSMintz, Yuval 			     fw_info.ver.num.eng) < 0)
1118c965db44STomer Tayar 			DP_NOTICE(p_hwfn,
1119c965db44STomer Tayar 				  "Unexpected debug error: invalid FW version string\n");
1120c965db44STomer Tayar 		switch (fw_info.ver.image_id) {
1121c965db44STomer Tayar 		case FW_IMG_MAIN:
1122c965db44STomer Tayar 			strcpy(fw_img_str, "main");
1123c965db44STomer Tayar 			break;
1124c965db44STomer Tayar 		default:
1125c965db44STomer Tayar 			strcpy(fw_img_str, "unknown");
1126c965db44STomer Tayar 			break;
1127c965db44STomer Tayar 		}
1128c965db44STomer Tayar 	}
1129c965db44STomer Tayar 
1130c965db44STomer Tayar 	/* Dump FW version, image and timestamp */
1131c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
1132c965db44STomer Tayar 				     dump, "fw-version", fw_ver_str);
1133c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
1134c965db44STomer Tayar 				     dump, "fw-image", fw_img_str);
11351451e467SAlexander Lobakin 	offset += qed_dump_num_param(dump_buf + offset, dump, "fw-timestamp",
11365ab90341SAlexander Lobakin 				     le32_to_cpu(fw_info.ver.timestamp));
11377b6859fbSMintz, Yuval 
1138c965db44STomer Tayar 	return offset;
1139c965db44STomer Tayar }
1140c965db44STomer Tayar 
1141c965db44STomer Tayar /* Reads the MFW version and writes it as a param to the specified buffer.
1142c965db44STomer Tayar  * Returns the dumped size in dwords.
1143c965db44STomer Tayar  */
1144c965db44STomer Tayar static u32 qed_dump_mfw_ver_param(struct qed_hwfn *p_hwfn,
1145c965db44STomer Tayar 				  struct qed_ptt *p_ptt,
1146c965db44STomer Tayar 				  u32 *dump_buf, bool dump)
1147c965db44STomer Tayar {
1148c965db44STomer Tayar 	char mfw_ver_str[16] = EMPTY_FW_VERSION_STR;
1149c965db44STomer Tayar 
11507b6859fbSMintz, Yuval 	if (dump &&
11517b6859fbSMintz, Yuval 	    !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
1152c965db44STomer Tayar 		u32 global_section_offsize, global_section_addr, mfw_ver;
1153c965db44STomer Tayar 		u32 public_data_addr, global_section_offsize_addr;
1154c965db44STomer Tayar 
11557b6859fbSMintz, Yuval 		/* Find MCP public data GRC address. Needs to be ORed with
11567b6859fbSMintz, Yuval 		 * MCP_REG_SCRATCH due to a HW bug.
1157c965db44STomer Tayar 		 */
11587b6859fbSMintz, Yuval 		public_data_addr = qed_rd(p_hwfn,
11597b6859fbSMintz, Yuval 					  p_ptt,
1160c965db44STomer Tayar 					  MISC_REG_SHARED_MEM_ADDR) |
1161c965db44STomer Tayar 				   MCP_REG_SCRATCH;
1162c965db44STomer Tayar 
1163c965db44STomer Tayar 		/* Find MCP public global section offset */
1164c965db44STomer Tayar 		global_section_offsize_addr = public_data_addr +
1165c965db44STomer Tayar 					      offsetof(struct mcp_public_data,
1166c965db44STomer Tayar 						       sections) +
1167c965db44STomer Tayar 					      sizeof(offsize_t) * PUBLIC_GLOBAL;
1168c965db44STomer Tayar 		global_section_offsize = qed_rd(p_hwfn, p_ptt,
1169c965db44STomer Tayar 						global_section_offsize_addr);
11707b6859fbSMintz, Yuval 		global_section_addr =
11717b6859fbSMintz, Yuval 			MCP_REG_SCRATCH +
11727b6859fbSMintz, Yuval 			(global_section_offsize & OFFSIZE_OFFSET_MASK) * 4;
1173c965db44STomer Tayar 
1174c965db44STomer Tayar 		/* Read MFW version from MCP public global section */
1175c965db44STomer Tayar 		mfw_ver = qed_rd(p_hwfn, p_ptt,
1176c965db44STomer Tayar 				 global_section_addr +
1177c965db44STomer Tayar 				 offsetof(struct public_global, mfw_ver));
1178c965db44STomer Tayar 
1179c965db44STomer Tayar 		/* Dump MFW version param */
11807b6859fbSMintz, Yuval 		if (snprintf(mfw_ver_str, sizeof(mfw_ver_str), "%d_%d_%d_%d",
11817b6859fbSMintz, Yuval 			     (u8)(mfw_ver >> 24), (u8)(mfw_ver >> 16),
11827b6859fbSMintz, Yuval 			     (u8)(mfw_ver >> 8), (u8)mfw_ver) < 0)
1183c965db44STomer Tayar 			DP_NOTICE(p_hwfn,
1184c965db44STomer Tayar 				  "Unexpected debug error: invalid MFW version string\n");
1185c965db44STomer Tayar 	}
1186c965db44STomer Tayar 
1187c965db44STomer Tayar 	return qed_dump_str_param(dump_buf, dump, "mfw-version", mfw_ver_str);
1188c965db44STomer Tayar }
1189c965db44STomer Tayar 
11902d22bc83SMichal Kalderon /* Reads the chip revision from the chip and writes it as a param to the
11912d22bc83SMichal Kalderon  * specified buffer. Returns the dumped size in dwords.
11922d22bc83SMichal Kalderon  */
11932d22bc83SMichal Kalderon static u32 qed_dump_chip_revision_param(struct qed_hwfn *p_hwfn,
11942d22bc83SMichal Kalderon 					struct qed_ptt *p_ptt,
11952d22bc83SMichal Kalderon 					u32 *dump_buf, bool dump)
11962d22bc83SMichal Kalderon {
11972d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
11982d22bc83SMichal Kalderon 	char param_str[3] = "??";
11992d22bc83SMichal Kalderon 
12002d22bc83SMichal Kalderon 	if (dev_data->hw_type == HW_TYPE_ASIC) {
12012d22bc83SMichal Kalderon 		u32 chip_rev, chip_metal;
12022d22bc83SMichal Kalderon 
12032d22bc83SMichal Kalderon 		chip_rev = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_REV);
12042d22bc83SMichal Kalderon 		chip_metal = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_METAL);
12052d22bc83SMichal Kalderon 
12062d22bc83SMichal Kalderon 		param_str[0] = 'a' + (u8)chip_rev;
12072d22bc83SMichal Kalderon 		param_str[1] = '0' + (u8)chip_metal;
12082d22bc83SMichal Kalderon 	}
12092d22bc83SMichal Kalderon 
12102d22bc83SMichal Kalderon 	return qed_dump_str_param(dump_buf, dump, "chip-revision", param_str);
12112d22bc83SMichal Kalderon }
12122d22bc83SMichal Kalderon 
1213c965db44STomer Tayar /* Writes a section header to the specified buffer.
1214c965db44STomer Tayar  * Returns the dumped size in dwords.
1215c965db44STomer Tayar  */
1216c965db44STomer Tayar static u32 qed_dump_section_hdr(u32 *dump_buf,
1217c965db44STomer Tayar 				bool dump, const char *name, u32 num_params)
1218c965db44STomer Tayar {
1219c965db44STomer Tayar 	return qed_dump_num_param(dump_buf, dump, name, num_params);
1220c965db44STomer Tayar }
1221c965db44STomer Tayar 
1222c965db44STomer Tayar /* Writes the common global params to the specified buffer.
1223c965db44STomer Tayar  * Returns the dumped size in dwords.
1224c965db44STomer Tayar  */
1225c965db44STomer Tayar static u32 qed_dump_common_global_params(struct qed_hwfn *p_hwfn,
1226c965db44STomer Tayar 					 struct qed_ptt *p_ptt,
1227c965db44STomer Tayar 					 u32 *dump_buf,
1228c965db44STomer Tayar 					 bool dump,
1229c965db44STomer Tayar 					 u8 num_specific_global_params)
1230c965db44STomer Tayar {
1231c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1232c965db44STomer Tayar 	u32 offset = 0;
12337b6859fbSMintz, Yuval 	u8 num_params;
1234c965db44STomer Tayar 
12357b6859fbSMintz, Yuval 	/* Dump global params section header */
12362d22bc83SMichal Kalderon 	num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params +
12372d22bc83SMichal Kalderon 		(dev_data->chip_id == CHIP_BB ? 1 : 0);
1238c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
1239be086e7cSMintz, Yuval 				       dump, "global_params", num_params);
1240c965db44STomer Tayar 
1241c965db44STomer Tayar 	/* Store params */
1242c965db44STomer Tayar 	offset += qed_dump_fw_ver_param(p_hwfn, p_ptt, dump_buf + offset, dump);
1243c965db44STomer Tayar 	offset += qed_dump_mfw_ver_param(p_hwfn,
1244c965db44STomer Tayar 					 p_ptt, dump_buf + offset, dump);
12452d22bc83SMichal Kalderon 	offset += qed_dump_chip_revision_param(p_hwfn,
12462d22bc83SMichal Kalderon 					       p_ptt, dump_buf + offset, dump);
1247c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
1248c965db44STomer Tayar 				     dump, "tools-version", TOOLS_VERSION);
1249c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
1250c965db44STomer Tayar 				     dump,
1251c965db44STomer Tayar 				     "chip",
1252c965db44STomer Tayar 				     s_chip_defs[dev_data->chip_id].name);
1253c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
1254c965db44STomer Tayar 				     dump,
1255c965db44STomer Tayar 				     "platform",
12562d22bc83SMichal Kalderon 				     s_hw_type_defs[dev_data->hw_type].name);
12572d22bc83SMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
12582d22bc83SMichal Kalderon 				     dump, "pci-func", p_hwfn->abs_pf_id);
12592d22bc83SMichal Kalderon 	if (dev_data->chip_id == CHIP_BB)
12602d22bc83SMichal Kalderon 		offset += qed_dump_num_param(dump_buf + offset,
12612d22bc83SMichal Kalderon 					     dump, "path", QED_PATH_ID(p_hwfn));
12627b6859fbSMintz, Yuval 
1263c965db44STomer Tayar 	return offset;
1264c965db44STomer Tayar }
1265c965db44STomer Tayar 
12667b6859fbSMintz, Yuval /* Writes the "last" section (including CRC) to the specified buffer at the
12677b6859fbSMintz, Yuval  * given offset. Returns the dumped size in dwords.
1268c965db44STomer Tayar  */
1269da090917STomer Tayar static u32 qed_dump_last_section(u32 *dump_buf, u32 offset, bool dump)
1270c965db44STomer Tayar {
12717b6859fbSMintz, Yuval 	u32 start_offset = offset;
1272c965db44STomer Tayar 
1273c965db44STomer Tayar 	/* Dump CRC section header */
1274c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset, dump, "last", 0);
1275c965db44STomer Tayar 
12767b6859fbSMintz, Yuval 	/* Calculate CRC32 and add it to the dword after the "last" section */
1277c965db44STomer Tayar 	if (dump)
12787b6859fbSMintz, Yuval 		*(dump_buf + offset) = ~crc32(0xffffffff,
12797b6859fbSMintz, Yuval 					      (u8 *)dump_buf,
1280c965db44STomer Tayar 					      DWORDS_TO_BYTES(offset));
12817b6859fbSMintz, Yuval 
1282c965db44STomer Tayar 	offset++;
12837b6859fbSMintz, Yuval 
1284c965db44STomer Tayar 	return offset - start_offset;
1285c965db44STomer Tayar }
1286c965db44STomer Tayar 
1287c965db44STomer Tayar /* Update blocks reset state  */
1288c965db44STomer Tayar static void qed_update_blocks_reset_state(struct qed_hwfn *p_hwfn,
1289c965db44STomer Tayar 					  struct qed_ptt *p_ptt)
1290c965db44STomer Tayar {
1291c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
12922d22bc83SMichal Kalderon 	u32 reg_val[NUM_DBG_RESET_REGS] = { 0 };
12932d22bc83SMichal Kalderon 	u8 rst_reg_id;
12942d22bc83SMichal Kalderon 	u32 blk_id;
1295c965db44STomer Tayar 
1296c965db44STomer Tayar 	/* Read reset registers */
12972d22bc83SMichal Kalderon 	for (rst_reg_id = 0; rst_reg_id < NUM_DBG_RESET_REGS; rst_reg_id++) {
12982d22bc83SMichal Kalderon 		const struct dbg_reset_reg *rst_reg;
12992d22bc83SMichal Kalderon 		bool rst_reg_removed;
13002d22bc83SMichal Kalderon 		u32 rst_reg_addr;
13012d22bc83SMichal Kalderon 
13022d22bc83SMichal Kalderon 		rst_reg = qed_get_dbg_reset_reg(p_hwfn, rst_reg_id);
13032d22bc83SMichal Kalderon 		rst_reg_removed = GET_FIELD(rst_reg->data,
13042d22bc83SMichal Kalderon 					    DBG_RESET_REG_IS_REMOVED);
13052d22bc83SMichal Kalderon 		rst_reg_addr = DWORDS_TO_BYTES(GET_FIELD(rst_reg->data,
13062d22bc83SMichal Kalderon 							 DBG_RESET_REG_ADDR));
13072d22bc83SMichal Kalderon 
13082d22bc83SMichal Kalderon 		if (!rst_reg_removed)
13092d22bc83SMichal Kalderon 			reg_val[rst_reg_id] = qed_rd(p_hwfn, p_ptt,
13102d22bc83SMichal Kalderon 						     rst_reg_addr);
13112d22bc83SMichal Kalderon 	}
1312c965db44STomer Tayar 
1313c965db44STomer Tayar 	/* Check if blocks are in reset */
13142d22bc83SMichal Kalderon 	for (blk_id = 0; blk_id < NUM_PHYS_BLOCKS; blk_id++) {
13152d22bc83SMichal Kalderon 		const struct dbg_block_chip *blk;
13162d22bc83SMichal Kalderon 		bool has_rst_reg;
13172d22bc83SMichal Kalderon 		bool is_removed;
13187b6859fbSMintz, Yuval 
13192d22bc83SMichal Kalderon 		blk = qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)blk_id);
13202d22bc83SMichal Kalderon 		is_removed = GET_FIELD(blk->flags, DBG_BLOCK_CHIP_IS_REMOVED);
13212d22bc83SMichal Kalderon 		has_rst_reg = GET_FIELD(blk->flags,
13222d22bc83SMichal Kalderon 					DBG_BLOCK_CHIP_HAS_RESET_REG);
13232d22bc83SMichal Kalderon 
13242d22bc83SMichal Kalderon 		if (!is_removed && has_rst_reg)
13252d22bc83SMichal Kalderon 			dev_data->block_in_reset[blk_id] =
13262d22bc83SMichal Kalderon 			    !(reg_val[blk->reset_reg_id] &
13272d22bc83SMichal Kalderon 			      BIT(blk->reset_reg_bit_offset));
13287b6859fbSMintz, Yuval 	}
1329c965db44STomer Tayar }
1330c965db44STomer Tayar 
13312d22bc83SMichal Kalderon /* is_mode_match recursive function */
13322d22bc83SMichal Kalderon static bool qed_is_mode_match_rec(struct qed_hwfn *p_hwfn,
13332d22bc83SMichal Kalderon 				  u16 *modes_buf_offset, u8 rec_depth)
13342d22bc83SMichal Kalderon {
13352d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
13362d22bc83SMichal Kalderon 	u8 *dbg_array;
13372d22bc83SMichal Kalderon 	bool arg1, arg2;
13382d22bc83SMichal Kalderon 	u8 tree_val;
13392d22bc83SMichal Kalderon 
13402d22bc83SMichal Kalderon 	if (rec_depth > MAX_RECURSION_DEPTH) {
13412d22bc83SMichal Kalderon 		DP_NOTICE(p_hwfn,
13422d22bc83SMichal Kalderon 			  "Unexpected error: is_mode_match_rec exceeded the max recursion depth. This is probably due to a corrupt init/debug buffer.\n");
13432d22bc83SMichal Kalderon 		return false;
13442d22bc83SMichal Kalderon 	}
13452d22bc83SMichal Kalderon 
13462d22bc83SMichal Kalderon 	/* Get next element from modes tree buffer */
13472d22bc83SMichal Kalderon 	dbg_array = p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr;
13482d22bc83SMichal Kalderon 	tree_val = dbg_array[(*modes_buf_offset)++];
13492d22bc83SMichal Kalderon 
13502d22bc83SMichal Kalderon 	switch (tree_val) {
13512d22bc83SMichal Kalderon 	case INIT_MODE_OP_NOT:
13522d22bc83SMichal Kalderon 		return !qed_is_mode_match_rec(p_hwfn,
13532d22bc83SMichal Kalderon 					      modes_buf_offset, rec_depth + 1);
13542d22bc83SMichal Kalderon 	case INIT_MODE_OP_OR:
13552d22bc83SMichal Kalderon 	case INIT_MODE_OP_AND:
13562d22bc83SMichal Kalderon 		arg1 = qed_is_mode_match_rec(p_hwfn,
13572d22bc83SMichal Kalderon 					     modes_buf_offset, rec_depth + 1);
13582d22bc83SMichal Kalderon 		arg2 = qed_is_mode_match_rec(p_hwfn,
13592d22bc83SMichal Kalderon 					     modes_buf_offset, rec_depth + 1);
13602d22bc83SMichal Kalderon 		return (tree_val == INIT_MODE_OP_OR) ? (arg1 ||
13612d22bc83SMichal Kalderon 							arg2) : (arg1 && arg2);
13622d22bc83SMichal Kalderon 	default:
13632d22bc83SMichal Kalderon 		return dev_data->mode_enable[tree_val - MAX_INIT_MODE_OPS] > 0;
13642d22bc83SMichal Kalderon 	}
13652d22bc83SMichal Kalderon }
13662d22bc83SMichal Kalderon 
13672d22bc83SMichal Kalderon /* Returns true if the mode (specified using modes_buf_offset) is enabled */
13682d22bc83SMichal Kalderon static bool qed_is_mode_match(struct qed_hwfn *p_hwfn, u16 *modes_buf_offset)
13692d22bc83SMichal Kalderon {
13702d22bc83SMichal Kalderon 	return qed_is_mode_match_rec(p_hwfn, modes_buf_offset, 0);
13712d22bc83SMichal Kalderon }
13722d22bc83SMichal Kalderon 
1373c965db44STomer Tayar /* Enable / disable the Debug block */
1374c965db44STomer Tayar static void qed_bus_enable_dbg_block(struct qed_hwfn *p_hwfn,
1375c965db44STomer Tayar 				     struct qed_ptt *p_ptt, bool enable)
1376c965db44STomer Tayar {
1377c965db44STomer Tayar 	qed_wr(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON, enable ? 1 : 0);
1378c965db44STomer Tayar }
1379c965db44STomer Tayar 
1380c965db44STomer Tayar /* Resets the Debug block */
1381c965db44STomer Tayar static void qed_bus_reset_dbg_block(struct qed_hwfn *p_hwfn,
1382c965db44STomer Tayar 				    struct qed_ptt *p_ptt)
1383c965db44STomer Tayar {
13842d22bc83SMichal Kalderon 	u32 reset_reg_addr, old_reset_reg_val, new_reset_reg_val;
13852d22bc83SMichal Kalderon 	const struct dbg_reset_reg *reset_reg;
13862d22bc83SMichal Kalderon 	const struct dbg_block_chip *block;
1387c965db44STomer Tayar 
13882d22bc83SMichal Kalderon 	block = qed_get_dbg_block_per_chip(p_hwfn, BLOCK_DBG);
13892d22bc83SMichal Kalderon 	reset_reg = qed_get_dbg_reset_reg(p_hwfn, block->reset_reg_id);
13902d22bc83SMichal Kalderon 	reset_reg_addr =
13912d22bc83SMichal Kalderon 	    DWORDS_TO_BYTES(GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR));
13922d22bc83SMichal Kalderon 
13932d22bc83SMichal Kalderon 	old_reset_reg_val = qed_rd(p_hwfn, p_ptt, reset_reg_addr);
13947b6859fbSMintz, Yuval 	new_reset_reg_val =
13952d22bc83SMichal Kalderon 	    old_reset_reg_val & ~BIT(block->reset_reg_bit_offset);
1396c965db44STomer Tayar 
13972d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, reset_reg_addr, new_reset_reg_val);
13982d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, reset_reg_addr, old_reset_reg_val);
1399c965db44STomer Tayar }
1400c965db44STomer Tayar 
14017b6859fbSMintz, Yuval /* Enable / disable Debug Bus clients according to the specified mask
14027b6859fbSMintz, Yuval  * (1 = enable, 0 = disable).
1403c965db44STomer Tayar  */
1404c965db44STomer Tayar static void qed_bus_enable_clients(struct qed_hwfn *p_hwfn,
1405c965db44STomer Tayar 				   struct qed_ptt *p_ptt, u32 client_mask)
1406c965db44STomer Tayar {
1407c965db44STomer Tayar 	qed_wr(p_hwfn, p_ptt, DBG_REG_CLIENT_ENABLE, client_mask);
1408c965db44STomer Tayar }
1409c965db44STomer Tayar 
14102d22bc83SMichal Kalderon static void qed_bus_config_dbg_line(struct qed_hwfn *p_hwfn,
14112d22bc83SMichal Kalderon 				    struct qed_ptt *p_ptt,
14122d22bc83SMichal Kalderon 				    enum block_id block_id,
14132d22bc83SMichal Kalderon 				    u8 line_id,
14142d22bc83SMichal Kalderon 				    u8 enable_mask,
14152d22bc83SMichal Kalderon 				    u8 right_shift,
14162d22bc83SMichal Kalderon 				    u8 force_valid_mask, u8 force_frame_mask)
14172d22bc83SMichal Kalderon {
14182d22bc83SMichal Kalderon 	const struct dbg_block_chip *block =
14192d22bc83SMichal Kalderon 		qed_get_dbg_block_per_chip(p_hwfn, block_id);
14202d22bc83SMichal Kalderon 
14212d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_select_reg_addr),
14222d22bc83SMichal Kalderon 	       line_id);
14232d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_dword_enable_reg_addr),
14242d22bc83SMichal Kalderon 	       enable_mask);
14252d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_shift_reg_addr),
14262d22bc83SMichal Kalderon 	       right_shift);
14272d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_valid_reg_addr),
14282d22bc83SMichal Kalderon 	       force_valid_mask);
14292d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_frame_reg_addr),
14302d22bc83SMichal Kalderon 	       force_frame_mask);
14312d22bc83SMichal Kalderon }
14322d22bc83SMichal Kalderon 
14332d22bc83SMichal Kalderon /* Disable debug bus in all blocks */
14342d22bc83SMichal Kalderon static void qed_bus_disable_blocks(struct qed_hwfn *p_hwfn,
14352d22bc83SMichal Kalderon 				   struct qed_ptt *p_ptt)
1436c965db44STomer Tayar {
1437c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
14382d22bc83SMichal Kalderon 	u32 block_id;
14397b6859fbSMintz, Yuval 
14402d22bc83SMichal Kalderon 	/* Disable all blocks */
14412d22bc83SMichal Kalderon 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
14422d22bc83SMichal Kalderon 		const struct dbg_block_chip *block_per_chip =
14432d22bc83SMichal Kalderon 		    qed_get_dbg_block_per_chip(p_hwfn,
14442d22bc83SMichal Kalderon 					       (enum block_id)block_id);
1445c965db44STomer Tayar 
14462d22bc83SMichal Kalderon 		if (GET_FIELD(block_per_chip->flags,
14472d22bc83SMichal Kalderon 			      DBG_BLOCK_CHIP_IS_REMOVED) ||
14482d22bc83SMichal Kalderon 		    dev_data->block_in_reset[block_id])
14492d22bc83SMichal Kalderon 			continue;
14502d22bc83SMichal Kalderon 
14512d22bc83SMichal Kalderon 		/* Disable debug bus */
14522d22bc83SMichal Kalderon 		if (GET_FIELD(block_per_chip->flags,
14532d22bc83SMichal Kalderon 			      DBG_BLOCK_CHIP_HAS_DBG_BUS)) {
14542d22bc83SMichal Kalderon 			u32 dbg_en_addr =
14552d22bc83SMichal Kalderon 				block_per_chip->dbg_dword_enable_reg_addr;
14562d22bc83SMichal Kalderon 			u16 modes_buf_offset =
14572d22bc83SMichal Kalderon 			    GET_FIELD(block_per_chip->dbg_bus_mode.data,
14582d22bc83SMichal Kalderon 				      DBG_MODE_HDR_MODES_BUF_OFFSET);
14592d22bc83SMichal Kalderon 			bool eval_mode =
14602d22bc83SMichal Kalderon 			    GET_FIELD(block_per_chip->dbg_bus_mode.data,
14612d22bc83SMichal Kalderon 				      DBG_MODE_HDR_EVAL_MODE) > 0;
14622d22bc83SMichal Kalderon 
14632d22bc83SMichal Kalderon 			if (!eval_mode ||
14642d22bc83SMichal Kalderon 			    qed_is_mode_match(p_hwfn, &modes_buf_offset))
14652d22bc83SMichal Kalderon 				qed_wr(p_hwfn, p_ptt,
14662d22bc83SMichal Kalderon 				       DWORDS_TO_BYTES(dbg_en_addr),
14672d22bc83SMichal Kalderon 				       0);
14682d22bc83SMichal Kalderon 		}
1469c965db44STomer Tayar 	}
1470c965db44STomer Tayar }
1471c965db44STomer Tayar 
1472c965db44STomer Tayar /* Returns true if the specified entity (indicated by GRC param) should be
1473c965db44STomer Tayar  * included in the dump, false otherwise.
1474c965db44STomer Tayar  */
1475c965db44STomer Tayar static bool qed_grc_is_included(struct qed_hwfn *p_hwfn,
1476c965db44STomer Tayar 				enum dbg_grc_params grc_param)
1477c965db44STomer Tayar {
1478c965db44STomer Tayar 	return qed_grc_get_param(p_hwfn, grc_param) > 0;
1479c965db44STomer Tayar }
1480c965db44STomer Tayar 
14812d22bc83SMichal Kalderon /* Returns the storm_id that matches the specified Storm letter,
14822d22bc83SMichal Kalderon  * or MAX_DBG_STORMS if invalid storm letter.
14832d22bc83SMichal Kalderon  */
14842d22bc83SMichal Kalderon static enum dbg_storms qed_get_id_from_letter(char storm_letter)
14852d22bc83SMichal Kalderon {
14862d22bc83SMichal Kalderon 	u8 storm_id;
14872d22bc83SMichal Kalderon 
14882d22bc83SMichal Kalderon 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++)
14892d22bc83SMichal Kalderon 		if (s_storm_defs[storm_id].letter == storm_letter)
14902d22bc83SMichal Kalderon 			return (enum dbg_storms)storm_id;
14912d22bc83SMichal Kalderon 
14922d22bc83SMichal Kalderon 	return MAX_DBG_STORMS;
14932d22bc83SMichal Kalderon }
14942d22bc83SMichal Kalderon 
1495c965db44STomer Tayar /* Returns true of the specified Storm should be included in the dump, false
1496c965db44STomer Tayar  * otherwise.
1497c965db44STomer Tayar  */
1498c965db44STomer Tayar static bool qed_grc_is_storm_included(struct qed_hwfn *p_hwfn,
1499c965db44STomer Tayar 				      enum dbg_storms storm)
1500c965db44STomer Tayar {
1501c965db44STomer Tayar 	return qed_grc_get_param(p_hwfn, (enum dbg_grc_params)storm) > 0;
1502c965db44STomer Tayar }
1503c965db44STomer Tayar 
1504c965db44STomer Tayar /* Returns true if the specified memory should be included in the dump, false
1505c965db44STomer Tayar  * otherwise.
1506c965db44STomer Tayar  */
1507c965db44STomer Tayar static bool qed_grc_is_mem_included(struct qed_hwfn *p_hwfn,
1508c965db44STomer Tayar 				    enum block_id block_id, u8 mem_group_id)
1509c965db44STomer Tayar {
15102d22bc83SMichal Kalderon 	const struct dbg_block *block;
1511c965db44STomer Tayar 	u8 i;
1512c965db44STomer Tayar 
15132d22bc83SMichal Kalderon 	block = get_dbg_block(p_hwfn, block_id);
15142d22bc83SMichal Kalderon 
15152d22bc83SMichal Kalderon 	/* If the block is associated with a Storm, check Storm match */
15162d22bc83SMichal Kalderon 	if (block->associated_storm_letter) {
15172d22bc83SMichal Kalderon 		enum dbg_storms associated_storm_id =
15182d22bc83SMichal Kalderon 		    qed_get_id_from_letter(block->associated_storm_letter);
15192d22bc83SMichal Kalderon 
15202d22bc83SMichal Kalderon 		if (associated_storm_id == MAX_DBG_STORMS ||
15212d22bc83SMichal Kalderon 		    !qed_grc_is_storm_included(p_hwfn, associated_storm_id))
1522c965db44STomer Tayar 			return false;
15232d22bc83SMichal Kalderon 	}
1524c965db44STomer Tayar 
15257b6859fbSMintz, Yuval 	for (i = 0; i < NUM_BIG_RAM_TYPES; i++) {
15267b6859fbSMintz, Yuval 		struct big_ram_defs *big_ram = &s_big_ram_defs[i];
1527c965db44STomer Tayar 
15287b6859fbSMintz, Yuval 		if (mem_group_id == big_ram->mem_group_id ||
15297b6859fbSMintz, Yuval 		    mem_group_id == big_ram->ram_mem_group_id)
15307b6859fbSMintz, Yuval 			return qed_grc_is_included(p_hwfn, big_ram->grc_param);
15317b6859fbSMintz, Yuval 	}
15327b6859fbSMintz, Yuval 
15337b6859fbSMintz, Yuval 	switch (mem_group_id) {
15347b6859fbSMintz, Yuval 	case MEM_GROUP_PXP_ILT:
15357b6859fbSMintz, Yuval 	case MEM_GROUP_PXP_MEM:
15367b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PXP);
15377b6859fbSMintz, Yuval 	case MEM_GROUP_RAM:
15387b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RAM);
15397b6859fbSMintz, Yuval 	case MEM_GROUP_PBUF:
15407b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PBUF);
15417b6859fbSMintz, Yuval 	case MEM_GROUP_CAU_MEM:
15427b6859fbSMintz, Yuval 	case MEM_GROUP_CAU_SB:
15437b6859fbSMintz, Yuval 	case MEM_GROUP_CAU_PI:
15447b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU);
15452d22bc83SMichal Kalderon 	case MEM_GROUP_CAU_MEM_EXT:
15462d22bc83SMichal Kalderon 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU_EXT);
15477b6859fbSMintz, Yuval 	case MEM_GROUP_QM_MEM:
15487b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_QM);
15497b6859fbSMintz, Yuval 	case MEM_GROUP_CFC_MEM:
15507b6859fbSMintz, Yuval 	case MEM_GROUP_CONN_CFC_MEM:
15517b6859fbSMintz, Yuval 	case MEM_GROUP_TASK_CFC_MEM:
1552da090917STomer Tayar 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CFC) ||
1553da090917STomer Tayar 		       qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX);
15542d22bc83SMichal Kalderon 	case MEM_GROUP_DORQ_MEM:
15552d22bc83SMichal Kalderon 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DORQ);
15567b6859fbSMintz, Yuval 	case MEM_GROUP_IGU_MEM:
15577b6859fbSMintz, Yuval 	case MEM_GROUP_IGU_MSIX:
15587b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IGU);
15597b6859fbSMintz, Yuval 	case MEM_GROUP_MULD_MEM:
15607b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MULD);
15617b6859fbSMintz, Yuval 	case MEM_GROUP_PRS_MEM:
15627b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PRS);
15637b6859fbSMintz, Yuval 	case MEM_GROUP_DMAE_MEM:
15647b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DMAE);
15657b6859fbSMintz, Yuval 	case MEM_GROUP_TM_MEM:
15667b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_TM);
15677b6859fbSMintz, Yuval 	case MEM_GROUP_SDM_MEM:
15687b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_SDM);
15697b6859fbSMintz, Yuval 	case MEM_GROUP_TDIF_CTX:
15707b6859fbSMintz, Yuval 	case MEM_GROUP_RDIF_CTX:
15717b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DIF);
15727b6859fbSMintz, Yuval 	case MEM_GROUP_CM_MEM:
15737b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM);
15747b6859fbSMintz, Yuval 	case MEM_GROUP_IOR:
15757b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR);
15767b6859fbSMintz, Yuval 	default:
1577c965db44STomer Tayar 		return true;
1578c965db44STomer Tayar 	}
15797b6859fbSMintz, Yuval }
1580c965db44STomer Tayar 
1581c965db44STomer Tayar /* Stalls all Storms */
1582c965db44STomer Tayar static void qed_grc_stall_storms(struct qed_hwfn *p_hwfn,
1583c965db44STomer Tayar 				 struct qed_ptt *p_ptt, bool stall)
1584c965db44STomer Tayar {
15857b6859fbSMintz, Yuval 	u32 reg_addr;
1586c965db44STomer Tayar 	u8 storm_id;
1587c965db44STomer Tayar 
1588c965db44STomer Tayar 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
15897b6859fbSMintz, Yuval 		if (!qed_grc_is_storm_included(p_hwfn,
15907b6859fbSMintz, Yuval 					       (enum dbg_storms)storm_id))
15917b6859fbSMintz, Yuval 			continue;
1592c965db44STomer Tayar 
15937b6859fbSMintz, Yuval 		reg_addr = s_storm_defs[storm_id].sem_fast_mem_addr +
15947b6859fbSMintz, Yuval 		    SEM_FAST_REG_STALL_0_BB_K2;
15957b6859fbSMintz, Yuval 		qed_wr(p_hwfn, p_ptt, reg_addr, stall ? 1 : 0);
1596c965db44STomer Tayar 	}
1597c965db44STomer Tayar 
1598c965db44STomer Tayar 	msleep(STALL_DELAY_MS);
1599c965db44STomer Tayar }
1600c965db44STomer Tayar 
16012d22bc83SMichal Kalderon /* Takes all blocks out of reset. If rbc_only is true, only RBC clients are
16022d22bc83SMichal Kalderon  * taken out of reset.
16032d22bc83SMichal Kalderon  */
1604c965db44STomer Tayar static void qed_grc_unreset_blocks(struct qed_hwfn *p_hwfn,
16052d22bc83SMichal Kalderon 				   struct qed_ptt *p_ptt, bool rbc_only)
1606c965db44STomer Tayar {
1607c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
16082d22bc83SMichal Kalderon 	u8 chip_id = dev_data->chip_id;
16092d22bc83SMichal Kalderon 	u32 i;
16102d22bc83SMichal Kalderon 
16112d22bc83SMichal Kalderon 	/* Take RBCs out of reset */
16122d22bc83SMichal Kalderon 	for (i = 0; i < ARRAY_SIZE(s_rbc_reset_defs); i++)
16132d22bc83SMichal Kalderon 		if (s_rbc_reset_defs[i].reset_val[dev_data->chip_id])
16142d22bc83SMichal Kalderon 			qed_wr(p_hwfn,
16152d22bc83SMichal Kalderon 			       p_ptt,
16162d22bc83SMichal Kalderon 			       s_rbc_reset_defs[i].reset_reg_addr +
16172d22bc83SMichal Kalderon 			       RESET_REG_UNRESET_OFFSET,
16182d22bc83SMichal Kalderon 			       s_rbc_reset_defs[i].reset_val[chip_id]);
16192d22bc83SMichal Kalderon 
16202d22bc83SMichal Kalderon 	if (!rbc_only) {
16212d22bc83SMichal Kalderon 		u32 reg_val[NUM_DBG_RESET_REGS] = { 0 };
16222d22bc83SMichal Kalderon 		u8 reset_reg_id;
16232d22bc83SMichal Kalderon 		u32 block_id;
1624c965db44STomer Tayar 
1625c965db44STomer Tayar 		/* Fill reset regs values */
16262d22bc83SMichal Kalderon 		for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
16272d22bc83SMichal Kalderon 			bool is_removed, has_reset_reg, unreset_before_dump;
16282d22bc83SMichal Kalderon 			const struct dbg_block_chip *block;
16297b6859fbSMintz, Yuval 
16302d22bc83SMichal Kalderon 			block = qed_get_dbg_block_per_chip(p_hwfn,
16312d22bc83SMichal Kalderon 							   (enum block_id)
16322d22bc83SMichal Kalderon 							   block_id);
16332d22bc83SMichal Kalderon 			is_removed =
16342d22bc83SMichal Kalderon 			    GET_FIELD(block->flags, DBG_BLOCK_CHIP_IS_REMOVED);
16352d22bc83SMichal Kalderon 			has_reset_reg =
16362d22bc83SMichal Kalderon 			    GET_FIELD(block->flags,
16372d22bc83SMichal Kalderon 				      DBG_BLOCK_CHIP_HAS_RESET_REG);
16382d22bc83SMichal Kalderon 			unreset_before_dump =
16392d22bc83SMichal Kalderon 			    GET_FIELD(block->flags,
16402d22bc83SMichal Kalderon 				      DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP);
16412d22bc83SMichal Kalderon 
16422d22bc83SMichal Kalderon 			if (!is_removed && has_reset_reg && unreset_before_dump)
16432d22bc83SMichal Kalderon 				reg_val[block->reset_reg_id] |=
16442d22bc83SMichal Kalderon 				    BIT(block->reset_reg_bit_offset);
16457b6859fbSMintz, Yuval 		}
1646c965db44STomer Tayar 
1647c965db44STomer Tayar 		/* Write reset registers */
16482d22bc83SMichal Kalderon 		for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS;
16492d22bc83SMichal Kalderon 		     reset_reg_id++) {
16502d22bc83SMichal Kalderon 			const struct dbg_reset_reg *reset_reg;
16512d22bc83SMichal Kalderon 			u32 reset_reg_addr;
16522d22bc83SMichal Kalderon 
16532d22bc83SMichal Kalderon 			reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id);
16542d22bc83SMichal Kalderon 
16552d22bc83SMichal Kalderon 			if (GET_FIELD
16562d22bc83SMichal Kalderon 			    (reset_reg->data, DBG_RESET_REG_IS_REMOVED))
16577b6859fbSMintz, Yuval 				continue;
16587b6859fbSMintz, Yuval 
16592d22bc83SMichal Kalderon 			if (reg_val[reset_reg_id]) {
16602d22bc83SMichal Kalderon 				reset_reg_addr =
16612d22bc83SMichal Kalderon 				    GET_FIELD(reset_reg->data,
16622d22bc83SMichal Kalderon 					      DBG_RESET_REG_ADDR);
1663c965db44STomer Tayar 				qed_wr(p_hwfn,
1664c965db44STomer Tayar 				       p_ptt,
16652d22bc83SMichal Kalderon 				       DWORDS_TO_BYTES(reset_reg_addr) +
16662d22bc83SMichal Kalderon 				       RESET_REG_UNRESET_OFFSET,
16672d22bc83SMichal Kalderon 				       reg_val[reset_reg_id]);
16682d22bc83SMichal Kalderon 			}
16692d22bc83SMichal Kalderon 		}
1670c965db44STomer Tayar 	}
1671c965db44STomer Tayar }
1672c965db44STomer Tayar 
1673be086e7cSMintz, Yuval /* Returns the attention block data of the specified block */
1674c965db44STomer Tayar static const struct dbg_attn_block_type_data *
16752d22bc83SMichal Kalderon qed_get_block_attn_data(struct qed_hwfn *p_hwfn,
16762d22bc83SMichal Kalderon 			enum block_id block_id, enum dbg_attn_type attn_type)
1677c965db44STomer Tayar {
1678c965db44STomer Tayar 	const struct dbg_attn_block *base_attn_block_arr =
1679c965db44STomer Tayar 	    (const struct dbg_attn_block *)
16802d22bc83SMichal Kalderon 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr;
1681c965db44STomer Tayar 
1682c965db44STomer Tayar 	return &base_attn_block_arr[block_id].per_type_data[attn_type];
1683c965db44STomer Tayar }
1684c965db44STomer Tayar 
1685c965db44STomer Tayar /* Returns the attention registers of the specified block */
1686c965db44STomer Tayar static const struct dbg_attn_reg *
16872d22bc83SMichal Kalderon qed_get_block_attn_regs(struct qed_hwfn *p_hwfn,
16882d22bc83SMichal Kalderon 			enum block_id block_id, enum dbg_attn_type attn_type,
1689c965db44STomer Tayar 			u8 *num_attn_regs)
1690c965db44STomer Tayar {
1691c965db44STomer Tayar 	const struct dbg_attn_block_type_data *block_type_data =
16922d22bc83SMichal Kalderon 	    qed_get_block_attn_data(p_hwfn, block_id, attn_type);
1693c965db44STomer Tayar 
1694c965db44STomer Tayar 	*num_attn_regs = block_type_data->num_regs;
16957b6859fbSMintz, Yuval 
16962d22bc83SMichal Kalderon 	return (const struct dbg_attn_reg *)
16972d22bc83SMichal Kalderon 		p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr +
16982d22bc83SMichal Kalderon 		block_type_data->regs_offset;
1699c965db44STomer Tayar }
1700c965db44STomer Tayar 
1701c965db44STomer Tayar /* For each block, clear the status of all parities */
1702c965db44STomer Tayar static void qed_grc_clear_all_prty(struct qed_hwfn *p_hwfn,
1703c965db44STomer Tayar 				   struct qed_ptt *p_ptt)
1704c965db44STomer Tayar {
1705c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
17067b6859fbSMintz, Yuval 	const struct dbg_attn_reg *attn_reg_arr;
1707c965db44STomer Tayar 	u8 reg_idx, num_attn_regs;
1708c965db44STomer Tayar 	u32 block_id;
1709c965db44STomer Tayar 
17102d22bc83SMichal Kalderon 	for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
1711c965db44STomer Tayar 		if (dev_data->block_in_reset[block_id])
1712c965db44STomer Tayar 			continue;
1713c965db44STomer Tayar 
17142d22bc83SMichal Kalderon 		attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
17152d22bc83SMichal Kalderon 						       (enum block_id)block_id,
1716c965db44STomer Tayar 						       ATTN_TYPE_PARITY,
1717c965db44STomer Tayar 						       &num_attn_regs);
17187b6859fbSMintz, Yuval 
1719c965db44STomer Tayar 		for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
1720c965db44STomer Tayar 			const struct dbg_attn_reg *reg_data =
1721c965db44STomer Tayar 				&attn_reg_arr[reg_idx];
17227b6859fbSMintz, Yuval 			u16 modes_buf_offset;
17237b6859fbSMintz, Yuval 			bool eval_mode;
1724c965db44STomer Tayar 
1725c965db44STomer Tayar 			/* Check mode */
17267b6859fbSMintz, Yuval 			eval_mode = GET_FIELD(reg_data->mode.data,
1727c965db44STomer Tayar 					      DBG_MODE_HDR_EVAL_MODE) > 0;
17287b6859fbSMintz, Yuval 			modes_buf_offset =
1729c965db44STomer Tayar 				GET_FIELD(reg_data->mode.data,
1730c965db44STomer Tayar 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
1731c965db44STomer Tayar 
17327b6859fbSMintz, Yuval 			/* If Mode match: clear parity status */
1733c965db44STomer Tayar 			if (!eval_mode ||
1734c965db44STomer Tayar 			    qed_is_mode_match(p_hwfn, &modes_buf_offset))
1735c965db44STomer Tayar 				qed_rd(p_hwfn, p_ptt,
1736c965db44STomer Tayar 				       DWORDS_TO_BYTES(reg_data->
1737c965db44STomer Tayar 						       sts_clr_address));
1738c965db44STomer Tayar 		}
1739c965db44STomer Tayar 	}
1740c965db44STomer Tayar }
1741c965db44STomer Tayar 
1742c965db44STomer Tayar /* Dumps GRC registers section header. Returns the dumped size in dwords.
17432d22bc83SMichal Kalderon  * the following parameters are dumped:
17447b6859fbSMintz, Yuval  * - count: no. of dumped entries
1745d52c89f1SMichal Kalderon  * - split_type: split type
1746d52c89f1SMichal Kalderon  * - split_id: split ID (dumped only if split_id != SPLIT_TYPE_NONE)
17472d22bc83SMichal Kalderon  * - reg_type_name: register type name (dumped only if reg_type_name != NULL)
1748c965db44STomer Tayar  */
1749c965db44STomer Tayar static u32 qed_grc_dump_regs_hdr(u32 *dump_buf,
1750c965db44STomer Tayar 				 bool dump,
1751c965db44STomer Tayar 				 u32 num_reg_entries,
1752d52c89f1SMichal Kalderon 				 enum init_split_types split_type,
17532d22bc83SMichal Kalderon 				 u8 split_id, const char *reg_type_name)
1754c965db44STomer Tayar {
1755d52c89f1SMichal Kalderon 	u8 num_params = 2 +
17562d22bc83SMichal Kalderon 	    (split_type != SPLIT_TYPE_NONE ? 1 : 0) + (reg_type_name ? 1 : 0);
1757c965db44STomer Tayar 	u32 offset = 0;
1758c965db44STomer Tayar 
1759c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
1760c965db44STomer Tayar 				       dump, "grc_regs", num_params);
1761c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
1762c965db44STomer Tayar 				     dump, "count", num_reg_entries);
1763c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
1764d52c89f1SMichal Kalderon 				     dump, "split",
1765d52c89f1SMichal Kalderon 				     s_split_type_defs[split_type].name);
1766d52c89f1SMichal Kalderon 	if (split_type != SPLIT_TYPE_NONE)
1767c965db44STomer Tayar 		offset += qed_dump_num_param(dump_buf + offset,
1768c965db44STomer Tayar 					     dump, "id", split_id);
17692d22bc83SMichal Kalderon 	if (reg_type_name)
1770c965db44STomer Tayar 		offset += qed_dump_str_param(dump_buf + offset,
17712d22bc83SMichal Kalderon 					     dump, "type", reg_type_name);
17727b6859fbSMintz, Yuval 
1773c965db44STomer Tayar 	return offset;
1774c965db44STomer Tayar }
1775c965db44STomer Tayar 
1776da090917STomer Tayar /* Reads the specified registers into the specified buffer.
1777da090917STomer Tayar  * The addr and len arguments are specified in dwords.
1778da090917STomer Tayar  */
1779da090917STomer Tayar void qed_read_regs(struct qed_hwfn *p_hwfn,
1780da090917STomer Tayar 		   struct qed_ptt *p_ptt, u32 *buf, u32 addr, u32 len)
1781da090917STomer Tayar {
1782da090917STomer Tayar 	u32 i;
1783da090917STomer Tayar 
1784da090917STomer Tayar 	for (i = 0; i < len; i++)
1785da090917STomer Tayar 		buf[i] = qed_rd(p_hwfn, p_ptt, DWORDS_TO_BYTES(addr + i));
1786da090917STomer Tayar }
1787da090917STomer Tayar 
1788be086e7cSMintz, Yuval /* Dumps the GRC registers in the specified address range.
1789be086e7cSMintz, Yuval  * Returns the dumped size in dwords.
17907b6859fbSMintz, Yuval  * The addr and len arguments are specified in dwords.
1791be086e7cSMintz, Yuval  */
1792be086e7cSMintz, Yuval static u32 qed_grc_dump_addr_range(struct qed_hwfn *p_hwfn,
17937b6859fbSMintz, Yuval 				   struct qed_ptt *p_ptt,
17947b6859fbSMintz, Yuval 				   u32 *dump_buf,
1795d52c89f1SMichal Kalderon 				   bool dump, u32 addr, u32 len, bool wide_bus,
1796d52c89f1SMichal Kalderon 				   enum init_split_types split_type,
1797d52c89f1SMichal Kalderon 				   u8 split_id)
1798be086e7cSMintz, Yuval {
1799da090917STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1800d52c89f1SMichal Kalderon 	u8 port_id = 0, pf_id = 0, vf_id = 0, fid = 0;
18012d22bc83SMichal Kalderon 	bool read_using_dmae = false;
18022d22bc83SMichal Kalderon 	u32 thresh;
1803be086e7cSMintz, Yuval 
18047b6859fbSMintz, Yuval 	if (!dump)
18057b6859fbSMintz, Yuval 		return len;
18067b6859fbSMintz, Yuval 
1807d52c89f1SMichal Kalderon 	switch (split_type) {
1808d52c89f1SMichal Kalderon 	case SPLIT_TYPE_PORT:
1809d52c89f1SMichal Kalderon 		port_id = split_id;
1810d52c89f1SMichal Kalderon 		break;
1811d52c89f1SMichal Kalderon 	case SPLIT_TYPE_PF:
1812d52c89f1SMichal Kalderon 		pf_id = split_id;
1813d52c89f1SMichal Kalderon 		break;
1814d52c89f1SMichal Kalderon 	case SPLIT_TYPE_PORT_PF:
1815d52c89f1SMichal Kalderon 		port_id = split_id / dev_data->num_pfs_per_port;
1816d52c89f1SMichal Kalderon 		pf_id = port_id + dev_data->num_ports *
1817d52c89f1SMichal Kalderon 		    (split_id % dev_data->num_pfs_per_port);
1818d52c89f1SMichal Kalderon 		break;
1819d52c89f1SMichal Kalderon 	case SPLIT_TYPE_VF:
1820d52c89f1SMichal Kalderon 		vf_id = split_id;
1821d52c89f1SMichal Kalderon 		break;
1822d52c89f1SMichal Kalderon 	default:
1823d52c89f1SMichal Kalderon 		break;
1824d52c89f1SMichal Kalderon 	}
1825d52c89f1SMichal Kalderon 
1826da090917STomer Tayar 	/* Try reading using DMAE */
18272d22bc83SMichal Kalderon 	if (dev_data->use_dmae && split_type != SPLIT_TYPE_VF &&
18282d22bc83SMichal Kalderon 	    (len >= s_hw_type_defs[dev_data->hw_type].dmae_thresh ||
18292d22bc83SMichal Kalderon 	     (PROTECT_WIDE_BUS && wide_bus))) {
18302d22bc83SMichal Kalderon 		struct qed_dmae_params dmae_params;
18312d22bc83SMichal Kalderon 
18322d22bc83SMichal Kalderon 		/* Set DMAE params */
18332d22bc83SMichal Kalderon 		memset(&dmae_params, 0, sizeof(dmae_params));
18342d22bc83SMichal Kalderon 		SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_COMPLETION_DST, 1);
18352d22bc83SMichal Kalderon 		switch (split_type) {
18362d22bc83SMichal Kalderon 		case SPLIT_TYPE_PORT:
18372d22bc83SMichal Kalderon 			SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID,
18382d22bc83SMichal Kalderon 				  1);
18392d22bc83SMichal Kalderon 			dmae_params.port_id = port_id;
18402d22bc83SMichal Kalderon 			break;
18412d22bc83SMichal Kalderon 		case SPLIT_TYPE_PF:
18422d22bc83SMichal Kalderon 			SET_FIELD(dmae_params.flags,
18432d22bc83SMichal Kalderon 				  QED_DMAE_PARAMS_SRC_PF_VALID, 1);
18442d22bc83SMichal Kalderon 			dmae_params.src_pfid = pf_id;
18452d22bc83SMichal Kalderon 			break;
18462d22bc83SMichal Kalderon 		case SPLIT_TYPE_PORT_PF:
18472d22bc83SMichal Kalderon 			SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID,
18482d22bc83SMichal Kalderon 				  1);
18492d22bc83SMichal Kalderon 			SET_FIELD(dmae_params.flags,
18502d22bc83SMichal Kalderon 				  QED_DMAE_PARAMS_SRC_PF_VALID, 1);
18512d22bc83SMichal Kalderon 			dmae_params.port_id = port_id;
18522d22bc83SMichal Kalderon 			dmae_params.src_pfid = pf_id;
18532d22bc83SMichal Kalderon 			break;
18542d22bc83SMichal Kalderon 		default:
18552d22bc83SMichal Kalderon 			break;
18562d22bc83SMichal Kalderon 		}
18572d22bc83SMichal Kalderon 
18582d22bc83SMichal Kalderon 		/* Execute DMAE command */
18592d22bc83SMichal Kalderon 		read_using_dmae = !qed_dmae_grc2host(p_hwfn,
18602d22bc83SMichal Kalderon 						     p_ptt,
18612d22bc83SMichal Kalderon 						     DWORDS_TO_BYTES(addr),
18622d22bc83SMichal Kalderon 						     (u64)(uintptr_t)(dump_buf),
18632d22bc83SMichal Kalderon 						     len, &dmae_params);
18642d22bc83SMichal Kalderon 		if (!read_using_dmae) {
1865da090917STomer Tayar 			dev_data->use_dmae = 0;
1866da090917STomer Tayar 			DP_VERBOSE(p_hwfn,
1867da090917STomer Tayar 				   QED_MSG_DEBUG,
1868da090917STomer Tayar 				   "Failed reading from chip using DMAE, using GRC instead\n");
1869da090917STomer Tayar 		}
18702d22bc83SMichal Kalderon 	}
18712d22bc83SMichal Kalderon 
18722d22bc83SMichal Kalderon 	if (read_using_dmae)
18732d22bc83SMichal Kalderon 		goto print_log;
1874da090917STomer Tayar 
1875d52c89f1SMichal Kalderon 	/* If not read using DMAE, read using GRC */
1876d52c89f1SMichal Kalderon 
1877d52c89f1SMichal Kalderon 	/* Set pretend */
18782d22bc83SMichal Kalderon 	if (split_type != dev_data->pretend.split_type ||
18792d22bc83SMichal Kalderon 	    split_id != dev_data->pretend.split_id) {
1880d52c89f1SMichal Kalderon 		switch (split_type) {
1881d52c89f1SMichal Kalderon 		case SPLIT_TYPE_PORT:
1882d52c89f1SMichal Kalderon 			qed_port_pretend(p_hwfn, p_ptt, port_id);
1883d52c89f1SMichal Kalderon 			break;
1884d52c89f1SMichal Kalderon 		case SPLIT_TYPE_PF:
18852d22bc83SMichal Kalderon 			fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
18862d22bc83SMichal Kalderon 					  pf_id);
1887d52c89f1SMichal Kalderon 			qed_fid_pretend(p_hwfn, p_ptt, fid);
1888d52c89f1SMichal Kalderon 			break;
1889d52c89f1SMichal Kalderon 		case SPLIT_TYPE_PORT_PF:
18902d22bc83SMichal Kalderon 			fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
18912d22bc83SMichal Kalderon 					  pf_id);
1892d52c89f1SMichal Kalderon 			qed_port_fid_pretend(p_hwfn, p_ptt, port_id, fid);
1893d52c89f1SMichal Kalderon 			break;
1894d52c89f1SMichal Kalderon 		case SPLIT_TYPE_VF:
18952d22bc83SMichal Kalderon 			fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFVALID, 1)
18962d22bc83SMichal Kalderon 			      | FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFID,
18972d22bc83SMichal Kalderon 					  vf_id);
1898d52c89f1SMichal Kalderon 			qed_fid_pretend(p_hwfn, p_ptt, fid);
1899d52c89f1SMichal Kalderon 			break;
1900d52c89f1SMichal Kalderon 		default:
1901d52c89f1SMichal Kalderon 			break;
1902d52c89f1SMichal Kalderon 		}
1903d52c89f1SMichal Kalderon 
1904d52c89f1SMichal Kalderon 		dev_data->pretend.split_type = (u8)split_type;
1905d52c89f1SMichal Kalderon 		dev_data->pretend.split_id = split_id;
1906d52c89f1SMichal Kalderon 	}
1907d52c89f1SMichal Kalderon 
1908d52c89f1SMichal Kalderon 	/* Read registers using GRC */
1909da090917STomer Tayar 	qed_read_regs(p_hwfn, p_ptt, dump_buf, addr, len);
1910da090917STomer Tayar 
19112d22bc83SMichal Kalderon print_log:
19122d22bc83SMichal Kalderon 	/* Print log */
19132d22bc83SMichal Kalderon 	dev_data->num_regs_read += len;
19142d22bc83SMichal Kalderon 	thresh = s_hw_type_defs[dev_data->hw_type].log_thresh;
19152d22bc83SMichal Kalderon 	if ((dev_data->num_regs_read / thresh) >
19162d22bc83SMichal Kalderon 	    ((dev_data->num_regs_read - len) / thresh))
19172d22bc83SMichal Kalderon 		DP_VERBOSE(p_hwfn,
19182d22bc83SMichal Kalderon 			   QED_MSG_DEBUG,
19192d22bc83SMichal Kalderon 			   "Dumped %d registers...\n", dev_data->num_regs_read);
19202d22bc83SMichal Kalderon 
1921da090917STomer Tayar 	return len;
1922be086e7cSMintz, Yuval }
1923be086e7cSMintz, Yuval 
19247b6859fbSMintz, Yuval /* Dumps GRC registers sequence header. Returns the dumped size in dwords.
19257b6859fbSMintz, Yuval  * The addr and len arguments are specified in dwords.
19267b6859fbSMintz, Yuval  */
19277b6859fbSMintz, Yuval static u32 qed_grc_dump_reg_entry_hdr(u32 *dump_buf,
19287b6859fbSMintz, Yuval 				      bool dump, u32 addr, u32 len)
1929be086e7cSMintz, Yuval {
1930be086e7cSMintz, Yuval 	if (dump)
1931be086e7cSMintz, Yuval 		*dump_buf = addr | (len << REG_DUMP_LEN_SHIFT);
19327b6859fbSMintz, Yuval 
1933be086e7cSMintz, Yuval 	return 1;
1934be086e7cSMintz, Yuval }
1935be086e7cSMintz, Yuval 
19367b6859fbSMintz, Yuval /* Dumps GRC registers sequence. Returns the dumped size in dwords.
19377b6859fbSMintz, Yuval  * The addr and len arguments are specified in dwords.
19387b6859fbSMintz, Yuval  */
1939c965db44STomer Tayar static u32 qed_grc_dump_reg_entry(struct qed_hwfn *p_hwfn,
19407b6859fbSMintz, Yuval 				  struct qed_ptt *p_ptt,
19417b6859fbSMintz, Yuval 				  u32 *dump_buf,
1942d52c89f1SMichal Kalderon 				  bool dump, u32 addr, u32 len, bool wide_bus,
1943d52c89f1SMichal Kalderon 				  enum init_split_types split_type, u8 split_id)
1944c965db44STomer Tayar {
1945be086e7cSMintz, Yuval 	u32 offset = 0;
1946c965db44STomer Tayar 
1947be086e7cSMintz, Yuval 	offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, len);
1948be086e7cSMintz, Yuval 	offset += qed_grc_dump_addr_range(p_hwfn,
1949c965db44STomer Tayar 					  p_ptt,
19507b6859fbSMintz, Yuval 					  dump_buf + offset,
1951d52c89f1SMichal Kalderon 					  dump, addr, len, wide_bus,
1952d52c89f1SMichal Kalderon 					  split_type, split_id);
19537b6859fbSMintz, Yuval 
1954be086e7cSMintz, Yuval 	return offset;
1955be086e7cSMintz, Yuval }
1956be086e7cSMintz, Yuval 
1957be086e7cSMintz, Yuval /* Dumps GRC registers sequence with skip cycle.
1958be086e7cSMintz, Yuval  * Returns the dumped size in dwords.
19597b6859fbSMintz, Yuval  * - addr:	start GRC address in dwords
19607b6859fbSMintz, Yuval  * - total_len:	total no. of dwords to dump
19617b6859fbSMintz, Yuval  * - read_len:	no. consecutive dwords to read
19627b6859fbSMintz, Yuval  * - skip_len:	no. of dwords to skip (and fill with zeros)
1963be086e7cSMintz, Yuval  */
1964be086e7cSMintz, Yuval static u32 qed_grc_dump_reg_entry_skip(struct qed_hwfn *p_hwfn,
19657b6859fbSMintz, Yuval 				       struct qed_ptt *p_ptt,
19667b6859fbSMintz, Yuval 				       u32 *dump_buf,
19677b6859fbSMintz, Yuval 				       bool dump,
19687b6859fbSMintz, Yuval 				       u32 addr,
19697b6859fbSMintz, Yuval 				       u32 total_len,
1970be086e7cSMintz, Yuval 				       u32 read_len, u32 skip_len)
1971be086e7cSMintz, Yuval {
1972be086e7cSMintz, Yuval 	u32 offset = 0, reg_offset = 0;
1973be086e7cSMintz, Yuval 
1974be086e7cSMintz, Yuval 	offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, total_len);
19757b6859fbSMintz, Yuval 
19767b6859fbSMintz, Yuval 	if (!dump)
19777b6859fbSMintz, Yuval 		return offset + total_len;
19787b6859fbSMintz, Yuval 
1979be086e7cSMintz, Yuval 	while (reg_offset < total_len) {
19807b6859fbSMintz, Yuval 		u32 curr_len = min_t(u32, read_len, total_len - reg_offset);
19817b6859fbSMintz, Yuval 
1982be086e7cSMintz, Yuval 		offset += qed_grc_dump_addr_range(p_hwfn,
1983be086e7cSMintz, Yuval 						  p_ptt,
1984be086e7cSMintz, Yuval 						  dump_buf + offset,
1985d52c89f1SMichal Kalderon 						  dump,  addr, curr_len, false,
1986d52c89f1SMichal Kalderon 						  SPLIT_TYPE_NONE, 0);
1987be086e7cSMintz, Yuval 		reg_offset += curr_len;
1988be086e7cSMintz, Yuval 		addr += curr_len;
19897b6859fbSMintz, Yuval 
1990be086e7cSMintz, Yuval 		if (reg_offset < total_len) {
19917b6859fbSMintz, Yuval 			curr_len = min_t(u32, skip_len, total_len - skip_len);
19927b6859fbSMintz, Yuval 			memset(dump_buf + offset, 0, DWORDS_TO_BYTES(curr_len));
1993be086e7cSMintz, Yuval 			offset += curr_len;
1994be086e7cSMintz, Yuval 			reg_offset += curr_len;
1995be086e7cSMintz, Yuval 			addr += curr_len;
1996be086e7cSMintz, Yuval 		}
1997be086e7cSMintz, Yuval 	}
1998c965db44STomer Tayar 
1999c965db44STomer Tayar 	return offset;
2000c965db44STomer Tayar }
2001c965db44STomer Tayar 
2002c965db44STomer Tayar /* Dumps GRC registers entries. Returns the dumped size in dwords. */
2003c965db44STomer Tayar static u32 qed_grc_dump_regs_entries(struct qed_hwfn *p_hwfn,
2004c965db44STomer Tayar 				     struct qed_ptt *p_ptt,
20052d22bc83SMichal Kalderon 				     struct virt_mem_desc input_regs_arr,
2006c965db44STomer Tayar 				     u32 *dump_buf,
2007c965db44STomer Tayar 				     bool dump,
2008d52c89f1SMichal Kalderon 				     enum init_split_types split_type,
2009d52c89f1SMichal Kalderon 				     u8 split_id,
2010c965db44STomer Tayar 				     bool block_enable[MAX_BLOCK_ID],
2011c965db44STomer Tayar 				     u32 *num_dumped_reg_entries)
2012c965db44STomer Tayar {
2013c965db44STomer Tayar 	u32 i, offset = 0, input_offset = 0;
2014c965db44STomer Tayar 	bool mode_match = true;
2015c965db44STomer Tayar 
2016c965db44STomer Tayar 	*num_dumped_reg_entries = 0;
20177b6859fbSMintz, Yuval 
20182d22bc83SMichal Kalderon 	while (input_offset < BYTES_TO_DWORDS(input_regs_arr.size)) {
2019c965db44STomer Tayar 		const struct dbg_dump_cond_hdr *cond_hdr =
2020c965db44STomer Tayar 		    (const struct dbg_dump_cond_hdr *)
20212d22bc83SMichal Kalderon 		    input_regs_arr.ptr + input_offset++;
20227b6859fbSMintz, Yuval 		u16 modes_buf_offset;
20237b6859fbSMintz, Yuval 		bool eval_mode;
2024c965db44STomer Tayar 
2025c965db44STomer Tayar 		/* Check mode/block */
20267b6859fbSMintz, Yuval 		eval_mode = GET_FIELD(cond_hdr->mode.data,
20277b6859fbSMintz, Yuval 				      DBG_MODE_HDR_EVAL_MODE) > 0;
2028c965db44STomer Tayar 		if (eval_mode) {
20297b6859fbSMintz, Yuval 			modes_buf_offset =
2030c965db44STomer Tayar 				GET_FIELD(cond_hdr->mode.data,
2031c965db44STomer Tayar 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
2032c965db44STomer Tayar 			mode_match = qed_is_mode_match(p_hwfn,
2033c965db44STomer Tayar 						       &modes_buf_offset);
2034c965db44STomer Tayar 		}
2035c965db44STomer Tayar 
20367b6859fbSMintz, Yuval 		if (!mode_match || !block_enable[cond_hdr->block_id]) {
20377b6859fbSMintz, Yuval 			input_offset += cond_hdr->data_size;
20387b6859fbSMintz, Yuval 			continue;
20397b6859fbSMintz, Yuval 		}
20407b6859fbSMintz, Yuval 
20417b6859fbSMintz, Yuval 		for (i = 0; i < cond_hdr->data_size; i++, input_offset++) {
2042c965db44STomer Tayar 			const struct dbg_dump_reg *reg =
2043c965db44STomer Tayar 			    (const struct dbg_dump_reg *)
20442d22bc83SMichal Kalderon 			    input_regs_arr.ptr + input_offset;
2045be086e7cSMintz, Yuval 			u32 addr, len;
20467b6859fbSMintz, Yuval 			bool wide_bus;
2047c965db44STomer Tayar 
20487b6859fbSMintz, Yuval 			addr = GET_FIELD(reg->data, DBG_DUMP_REG_ADDRESS);
2049be086e7cSMintz, Yuval 			len = GET_FIELD(reg->data, DBG_DUMP_REG_LENGTH);
20507b6859fbSMintz, Yuval 			wide_bus = GET_FIELD(reg->data, DBG_DUMP_REG_WIDE_BUS);
20517b6859fbSMintz, Yuval 			offset += qed_grc_dump_reg_entry(p_hwfn,
20527b6859fbSMintz, Yuval 							 p_ptt,
2053be086e7cSMintz, Yuval 							 dump_buf + offset,
2054be086e7cSMintz, Yuval 							 dump,
2055be086e7cSMintz, Yuval 							 addr,
20567b6859fbSMintz, Yuval 							 len,
2057d52c89f1SMichal Kalderon 							 wide_bus,
2058d52c89f1SMichal Kalderon 							 split_type, split_id);
2059c965db44STomer Tayar 			(*num_dumped_reg_entries)++;
2060c965db44STomer Tayar 		}
2061c965db44STomer Tayar 	}
2062c965db44STomer Tayar 
2063c965db44STomer Tayar 	return offset;
2064c965db44STomer Tayar }
2065c965db44STomer Tayar 
2066c965db44STomer Tayar /* Dumps GRC registers entries. Returns the dumped size in dwords. */
2067c965db44STomer Tayar static u32 qed_grc_dump_split_data(struct qed_hwfn *p_hwfn,
2068c965db44STomer Tayar 				   struct qed_ptt *p_ptt,
20692d22bc83SMichal Kalderon 				   struct virt_mem_desc input_regs_arr,
2070c965db44STomer Tayar 				   u32 *dump_buf,
2071c965db44STomer Tayar 				   bool dump,
2072c965db44STomer Tayar 				   bool block_enable[MAX_BLOCK_ID],
2073d52c89f1SMichal Kalderon 				   enum init_split_types split_type,
20742d22bc83SMichal Kalderon 				   u8 split_id, const char *reg_type_name)
2075c965db44STomer Tayar {
2076d52c89f1SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2077d52c89f1SMichal Kalderon 	enum init_split_types hdr_split_type = split_type;
2078c965db44STomer Tayar 	u32 num_dumped_reg_entries, offset;
2079d52c89f1SMichal Kalderon 	u8 hdr_split_id = split_id;
2080d52c89f1SMichal Kalderon 
2081d52c89f1SMichal Kalderon 	/* In PORT_PF split type, print a port split header */
2082d52c89f1SMichal Kalderon 	if (split_type == SPLIT_TYPE_PORT_PF) {
2083d52c89f1SMichal Kalderon 		hdr_split_type = SPLIT_TYPE_PORT;
2084d52c89f1SMichal Kalderon 		hdr_split_id = split_id / dev_data->num_pfs_per_port;
2085d52c89f1SMichal Kalderon 	}
2086c965db44STomer Tayar 
2087c965db44STomer Tayar 	/* Calculate register dump header size (and skip it for now) */
2088c965db44STomer Tayar 	offset = qed_grc_dump_regs_hdr(dump_buf,
2089c965db44STomer Tayar 				       false,
2090c965db44STomer Tayar 				       0,
2091d52c89f1SMichal Kalderon 				       hdr_split_type,
20922d22bc83SMichal Kalderon 				       hdr_split_id, reg_type_name);
2093c965db44STomer Tayar 
2094c965db44STomer Tayar 	/* Dump registers */
2095c965db44STomer Tayar 	offset += qed_grc_dump_regs_entries(p_hwfn,
2096c965db44STomer Tayar 					    p_ptt,
2097c965db44STomer Tayar 					    input_regs_arr,
2098c965db44STomer Tayar 					    dump_buf + offset,
2099c965db44STomer Tayar 					    dump,
2100d52c89f1SMichal Kalderon 					    split_type,
2101d52c89f1SMichal Kalderon 					    split_id,
2102c965db44STomer Tayar 					    block_enable,
2103c965db44STomer Tayar 					    &num_dumped_reg_entries);
2104c965db44STomer Tayar 
2105c965db44STomer Tayar 	/* Write register dump header */
2106c965db44STomer Tayar 	if (dump && num_dumped_reg_entries > 0)
2107c965db44STomer Tayar 		qed_grc_dump_regs_hdr(dump_buf,
2108c965db44STomer Tayar 				      dump,
2109c965db44STomer Tayar 				      num_dumped_reg_entries,
2110d52c89f1SMichal Kalderon 				      hdr_split_type,
21112d22bc83SMichal Kalderon 				      hdr_split_id, reg_type_name);
2112c965db44STomer Tayar 
2113c965db44STomer Tayar 	return num_dumped_reg_entries > 0 ? offset : 0;
2114c965db44STomer Tayar }
2115c965db44STomer Tayar 
21167b6859fbSMintz, Yuval /* Dumps registers according to the input registers array. Returns the dumped
21177b6859fbSMintz, Yuval  * size in dwords.
2118c965db44STomer Tayar  */
2119c965db44STomer Tayar static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn,
2120c965db44STomer Tayar 				  struct qed_ptt *p_ptt,
2121c965db44STomer Tayar 				  u32 *dump_buf,
2122c965db44STomer Tayar 				  bool dump,
2123c965db44STomer Tayar 				  bool block_enable[MAX_BLOCK_ID],
21242d22bc83SMichal Kalderon 				  const char *reg_type_name)
2125c965db44STomer Tayar {
21262d22bc83SMichal Kalderon 	struct virt_mem_desc *dbg_buf =
21272d22bc83SMichal Kalderon 	    &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG];
2128c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2129c965db44STomer Tayar 	u32 offset = 0, input_offset = 0;
21302d22bc83SMichal Kalderon 
21312d22bc83SMichal Kalderon 	while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
21327b6859fbSMintz, Yuval 		const struct dbg_dump_split_hdr *split_hdr;
21332d22bc83SMichal Kalderon 		struct virt_mem_desc curr_input_regs_arr;
2134d52c89f1SMichal Kalderon 		enum init_split_types split_type;
2135d52c89f1SMichal Kalderon 		u16 split_count = 0;
21367b6859fbSMintz, Yuval 		u32 split_data_size;
2137d52c89f1SMichal Kalderon 		u8 split_id;
21387b6859fbSMintz, Yuval 
21397b6859fbSMintz, Yuval 		split_hdr =
2140c965db44STomer Tayar 		    (const struct dbg_dump_split_hdr *)
21412d22bc83SMichal Kalderon 		    dbg_buf->ptr + input_offset++;
2142d52c89f1SMichal Kalderon 		split_type =
21437b6859fbSMintz, Yuval 		    GET_FIELD(split_hdr->hdr,
2144c965db44STomer Tayar 			      DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
21452d22bc83SMichal Kalderon 		split_data_size = GET_FIELD(split_hdr->hdr,
2146c965db44STomer Tayar 					    DBG_DUMP_SPLIT_HDR_DATA_SIZE);
21477b6859fbSMintz, Yuval 		curr_input_regs_arr.ptr =
21482d22bc83SMichal Kalderon 		    (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr +
21492d22bc83SMichal Kalderon 		    input_offset;
21502d22bc83SMichal Kalderon 		curr_input_regs_arr.size = DWORDS_TO_BYTES(split_data_size);
2151c965db44STomer Tayar 
2152d52c89f1SMichal Kalderon 		switch (split_type) {
2153c965db44STomer Tayar 		case SPLIT_TYPE_NONE:
2154d52c89f1SMichal Kalderon 			split_count = 1;
2155c965db44STomer Tayar 			break;
2156c965db44STomer Tayar 		case SPLIT_TYPE_PORT:
2157d52c89f1SMichal Kalderon 			split_count = dev_data->num_ports;
2158c965db44STomer Tayar 			break;
2159c965db44STomer Tayar 		case SPLIT_TYPE_PF:
2160c965db44STomer Tayar 		case SPLIT_TYPE_PORT_PF:
2161d52c89f1SMichal Kalderon 			split_count = dev_data->num_ports *
2162d52c89f1SMichal Kalderon 			    dev_data->num_pfs_per_port;
2163be086e7cSMintz, Yuval 			break;
2164be086e7cSMintz, Yuval 		case SPLIT_TYPE_VF:
2165d52c89f1SMichal Kalderon 			split_count = dev_data->num_vfs;
2166d52c89f1SMichal Kalderon 			break;
2167d52c89f1SMichal Kalderon 		default:
2168d52c89f1SMichal Kalderon 			return 0;
2169be086e7cSMintz, Yuval 		}
2170be086e7cSMintz, Yuval 
2171d52c89f1SMichal Kalderon 		for (split_id = 0; split_id < split_count; split_id++)
2172d52c89f1SMichal Kalderon 			offset += qed_grc_dump_split_data(p_hwfn, p_ptt,
2173be086e7cSMintz, Yuval 							  curr_input_regs_arr,
2174be086e7cSMintz, Yuval 							  dump_buf + offset,
2175be086e7cSMintz, Yuval 							  dump, block_enable,
2176d52c89f1SMichal Kalderon 							  split_type,
2177d52c89f1SMichal Kalderon 							  split_id,
21782d22bc83SMichal Kalderon 							  reg_type_name);
2179c965db44STomer Tayar 
2180c965db44STomer Tayar 		input_offset += split_data_size;
2181c965db44STomer Tayar 	}
2182c965db44STomer Tayar 
2183d52c89f1SMichal Kalderon 	/* Cancel pretends (pretend to original PF) */
2184be086e7cSMintz, Yuval 	if (dump) {
21852d22bc83SMichal Kalderon 		qed_fid_pretend(p_hwfn, p_ptt,
21862d22bc83SMichal Kalderon 				FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
21872d22bc83SMichal Kalderon 					    p_hwfn->rel_pf_id));
2188d52c89f1SMichal Kalderon 		dev_data->pretend.split_type = SPLIT_TYPE_NONE;
2189d52c89f1SMichal Kalderon 		dev_data->pretend.split_id = 0;
2190be086e7cSMintz, Yuval 	}
2191be086e7cSMintz, Yuval 
2192c965db44STomer Tayar 	return offset;
2193c965db44STomer Tayar }
2194c965db44STomer Tayar 
2195c965db44STomer Tayar /* Dump reset registers. Returns the dumped size in dwords. */
2196c965db44STomer Tayar static u32 qed_grc_dump_reset_regs(struct qed_hwfn *p_hwfn,
2197c965db44STomer Tayar 				   struct qed_ptt *p_ptt,
2198c965db44STomer Tayar 				   u32 *dump_buf, bool dump)
2199c965db44STomer Tayar {
22002d22bc83SMichal Kalderon 	u32 offset = 0, num_regs = 0;
22012d22bc83SMichal Kalderon 	u8 reset_reg_id;
2202c965db44STomer Tayar 
2203c965db44STomer Tayar 	/* Calculate header size */
2204c965db44STomer Tayar 	offset += qed_grc_dump_regs_hdr(dump_buf,
22052d22bc83SMichal Kalderon 					false,
22062d22bc83SMichal Kalderon 					0, SPLIT_TYPE_NONE, 0, "RESET_REGS");
2207c965db44STomer Tayar 
2208c965db44STomer Tayar 	/* Write reset registers */
22092d22bc83SMichal Kalderon 	for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS;
22102d22bc83SMichal Kalderon 	     reset_reg_id++) {
22112d22bc83SMichal Kalderon 		const struct dbg_reset_reg *reset_reg;
22122d22bc83SMichal Kalderon 		u32 reset_reg_addr;
22132d22bc83SMichal Kalderon 
22142d22bc83SMichal Kalderon 		reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id);
22152d22bc83SMichal Kalderon 
22162d22bc83SMichal Kalderon 		if (GET_FIELD(reset_reg->data, DBG_RESET_REG_IS_REMOVED))
22177b6859fbSMintz, Yuval 			continue;
2218be086e7cSMintz, Yuval 
22192d22bc83SMichal Kalderon 		reset_reg_addr = GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR);
2220c965db44STomer Tayar 		offset += qed_grc_dump_reg_entry(p_hwfn,
2221c965db44STomer Tayar 						 p_ptt,
2222c965db44STomer Tayar 						 dump_buf + offset,
2223c965db44STomer Tayar 						 dump,
22242d22bc83SMichal Kalderon 						 reset_reg_addr,
22252d22bc83SMichal Kalderon 						 1, false, SPLIT_TYPE_NONE, 0);
2226c965db44STomer Tayar 		num_regs++;
2227c965db44STomer Tayar 	}
2228c965db44STomer Tayar 
2229c965db44STomer Tayar 	/* Write header */
2230c965db44STomer Tayar 	if (dump)
2231c965db44STomer Tayar 		qed_grc_dump_regs_hdr(dump_buf,
2232d52c89f1SMichal Kalderon 				      true, num_regs, SPLIT_TYPE_NONE,
22332d22bc83SMichal Kalderon 				      0, "RESET_REGS");
22347b6859fbSMintz, Yuval 
2235c965db44STomer Tayar 	return offset;
2236c965db44STomer Tayar }
2237c965db44STomer Tayar 
22387b6859fbSMintz, Yuval /* Dump registers that are modified during GRC Dump and therefore must be
22397b6859fbSMintz, Yuval  * dumped first. Returns the dumped size in dwords.
2240c965db44STomer Tayar  */
2241c965db44STomer Tayar static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn,
2242c965db44STomer Tayar 				      struct qed_ptt *p_ptt,
2243c965db44STomer Tayar 				      u32 *dump_buf, bool dump)
2244c965db44STomer Tayar {
2245c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
22462d22bc83SMichal Kalderon 	u32 block_id, offset = 0, stall_regs_offset;
22477b6859fbSMintz, Yuval 	const struct dbg_attn_reg *attn_reg_arr;
2248c965db44STomer Tayar 	u8 storm_id, reg_idx, num_attn_regs;
22492d22bc83SMichal Kalderon 	u32 num_reg_entries = 0;
2250c965db44STomer Tayar 
22512d22bc83SMichal Kalderon 	/* Write empty header for attention registers */
2252c965db44STomer Tayar 	offset += qed_grc_dump_regs_hdr(dump_buf,
22532d22bc83SMichal Kalderon 					false,
22542d22bc83SMichal Kalderon 					0, SPLIT_TYPE_NONE, 0, "ATTN_REGS");
2255c965db44STomer Tayar 
2256c965db44STomer Tayar 	/* Write parity registers */
22572d22bc83SMichal Kalderon 	for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
2258c965db44STomer Tayar 		if (dev_data->block_in_reset[block_id] && dump)
2259c965db44STomer Tayar 			continue;
2260c965db44STomer Tayar 
22612d22bc83SMichal Kalderon 		attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
22622d22bc83SMichal Kalderon 						       (enum block_id)block_id,
2263c965db44STomer Tayar 						       ATTN_TYPE_PARITY,
2264c965db44STomer Tayar 						       &num_attn_regs);
22657b6859fbSMintz, Yuval 
2266c965db44STomer Tayar 		for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
2267c965db44STomer Tayar 			const struct dbg_attn_reg *reg_data =
2268c965db44STomer Tayar 				&attn_reg_arr[reg_idx];
2269c965db44STomer Tayar 			u16 modes_buf_offset;
2270c965db44STomer Tayar 			bool eval_mode;
2271be086e7cSMintz, Yuval 			u32 addr;
2272c965db44STomer Tayar 
2273c965db44STomer Tayar 			/* Check mode */
2274c965db44STomer Tayar 			eval_mode = GET_FIELD(reg_data->mode.data,
2275c965db44STomer Tayar 					      DBG_MODE_HDR_EVAL_MODE) > 0;
2276c965db44STomer Tayar 			modes_buf_offset =
2277c965db44STomer Tayar 				GET_FIELD(reg_data->mode.data,
2278c965db44STomer Tayar 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
22797b6859fbSMintz, Yuval 			if (eval_mode &&
22807b6859fbSMintz, Yuval 			    !qed_is_mode_match(p_hwfn, &modes_buf_offset))
22817b6859fbSMintz, Yuval 				continue;
22827b6859fbSMintz, Yuval 
22837b6859fbSMintz, Yuval 			/* Mode match: read & dump registers */
2284be086e7cSMintz, Yuval 			addr = reg_data->mask_address;
22857b6859fbSMintz, Yuval 			offset += qed_grc_dump_reg_entry(p_hwfn,
2286c965db44STomer Tayar 							 p_ptt,
2287c965db44STomer Tayar 							 dump_buf + offset,
2288c965db44STomer Tayar 							 dump,
2289be086e7cSMintz, Yuval 							 addr,
2290d52c89f1SMichal Kalderon 							 1, false,
2291d52c89f1SMichal Kalderon 							 SPLIT_TYPE_NONE, 0);
2292be086e7cSMintz, Yuval 			addr = GET_FIELD(reg_data->data,
2293be086e7cSMintz, Yuval 					 DBG_ATTN_REG_STS_ADDRESS);
22947b6859fbSMintz, Yuval 			offset += qed_grc_dump_reg_entry(p_hwfn,
2295c965db44STomer Tayar 							 p_ptt,
2296c965db44STomer Tayar 							 dump_buf + offset,
2297c965db44STomer Tayar 							 dump,
2298be086e7cSMintz, Yuval 							 addr,
2299d52c89f1SMichal Kalderon 							 1, false,
2300d52c89f1SMichal Kalderon 							 SPLIT_TYPE_NONE, 0);
2301c965db44STomer Tayar 			num_reg_entries += 2;
2302c965db44STomer Tayar 		}
2303c965db44STomer Tayar 	}
2304c965db44STomer Tayar 
23052d22bc83SMichal Kalderon 	/* Overwrite header for attention registers */
23062d22bc83SMichal Kalderon 	if (dump)
23072d22bc83SMichal Kalderon 		qed_grc_dump_regs_hdr(dump_buf,
23082d22bc83SMichal Kalderon 				      true,
23092d22bc83SMichal Kalderon 				      num_reg_entries,
23102d22bc83SMichal Kalderon 				      SPLIT_TYPE_NONE, 0, "ATTN_REGS");
23112d22bc83SMichal Kalderon 
23122d22bc83SMichal Kalderon 	/* Write empty header for stall registers */
23132d22bc83SMichal Kalderon 	stall_regs_offset = offset;
23142d22bc83SMichal Kalderon 	offset += qed_grc_dump_regs_hdr(dump_buf,
23152d22bc83SMichal Kalderon 					false, 0, SPLIT_TYPE_NONE, 0, "REGS");
23162d22bc83SMichal Kalderon 
23177b6859fbSMintz, Yuval 	/* Write Storm stall status registers */
23182d22bc83SMichal Kalderon 	for (storm_id = 0, num_reg_entries = 0; storm_id < MAX_DBG_STORMS;
23192d22bc83SMichal Kalderon 	     storm_id++) {
23207b6859fbSMintz, Yuval 		struct storm_defs *storm = &s_storm_defs[storm_id];
2321be086e7cSMintz, Yuval 		u32 addr;
2322be086e7cSMintz, Yuval 
23232d22bc83SMichal Kalderon 		if (dev_data->block_in_reset[storm->sem_block_id] && dump)
2324c965db44STomer Tayar 			continue;
2325c965db44STomer Tayar 
2326be086e7cSMintz, Yuval 		addr =
23272d22bc83SMichal Kalderon 		    BYTES_TO_DWORDS(storm->sem_fast_mem_addr +
2328be086e7cSMintz, Yuval 				    SEM_FAST_REG_STALLED);
2329c965db44STomer Tayar 		offset += qed_grc_dump_reg_entry(p_hwfn,
2330c965db44STomer Tayar 						 p_ptt,
2331c965db44STomer Tayar 						 dump_buf + offset,
2332c965db44STomer Tayar 						 dump,
2333be086e7cSMintz, Yuval 						 addr,
23347b6859fbSMintz, Yuval 						 1,
2335d52c89f1SMichal Kalderon 						 false, SPLIT_TYPE_NONE, 0);
2336c965db44STomer Tayar 		num_reg_entries++;
2337c965db44STomer Tayar 	}
2338c965db44STomer Tayar 
23392d22bc83SMichal Kalderon 	/* Overwrite header for stall registers */
2340c965db44STomer Tayar 	if (dump)
23412d22bc83SMichal Kalderon 		qed_grc_dump_regs_hdr(dump_buf + stall_regs_offset,
2342c965db44STomer Tayar 				      true,
23432d22bc83SMichal Kalderon 				      num_reg_entries,
23442d22bc83SMichal Kalderon 				      SPLIT_TYPE_NONE, 0, "REGS");
23457b6859fbSMintz, Yuval 
2346c965db44STomer Tayar 	return offset;
2347c965db44STomer Tayar }
2348c965db44STomer Tayar 
2349be086e7cSMintz, Yuval /* Dumps registers that can't be represented in the debug arrays */
2350be086e7cSMintz, Yuval static u32 qed_grc_dump_special_regs(struct qed_hwfn *p_hwfn,
2351be086e7cSMintz, Yuval 				     struct qed_ptt *p_ptt,
2352be086e7cSMintz, Yuval 				     u32 *dump_buf, bool dump)
2353be086e7cSMintz, Yuval {
2354be086e7cSMintz, Yuval 	u32 offset = 0, addr;
2355be086e7cSMintz, Yuval 
2356be086e7cSMintz, Yuval 	offset += qed_grc_dump_regs_hdr(dump_buf,
23572d22bc83SMichal Kalderon 					dump, 2, SPLIT_TYPE_NONE, 0, "REGS");
2358be086e7cSMintz, Yuval 
2359be086e7cSMintz, Yuval 	/* Dump R/TDIF_REG_DEBUG_ERROR_INFO_SIZE (every 8'th register should be
2360be086e7cSMintz, Yuval 	 * skipped).
2361be086e7cSMintz, Yuval 	 */
2362be086e7cSMintz, Yuval 	addr = BYTES_TO_DWORDS(RDIF_REG_DEBUG_ERROR_INFO);
2363be086e7cSMintz, Yuval 	offset += qed_grc_dump_reg_entry_skip(p_hwfn,
2364be086e7cSMintz, Yuval 					      p_ptt,
2365be086e7cSMintz, Yuval 					      dump_buf + offset,
2366be086e7cSMintz, Yuval 					      dump,
2367be086e7cSMintz, Yuval 					      addr,
2368be086e7cSMintz, Yuval 					      RDIF_REG_DEBUG_ERROR_INFO_SIZE,
2369be086e7cSMintz, Yuval 					      7,
2370be086e7cSMintz, Yuval 					      1);
2371be086e7cSMintz, Yuval 	addr = BYTES_TO_DWORDS(TDIF_REG_DEBUG_ERROR_INFO);
2372be086e7cSMintz, Yuval 	offset +=
2373be086e7cSMintz, Yuval 	    qed_grc_dump_reg_entry_skip(p_hwfn,
2374be086e7cSMintz, Yuval 					p_ptt,
2375be086e7cSMintz, Yuval 					dump_buf + offset,
2376be086e7cSMintz, Yuval 					dump,
2377be086e7cSMintz, Yuval 					addr,
2378be086e7cSMintz, Yuval 					TDIF_REG_DEBUG_ERROR_INFO_SIZE,
2379be086e7cSMintz, Yuval 					7,
2380be086e7cSMintz, Yuval 					1);
2381be086e7cSMintz, Yuval 
2382be086e7cSMintz, Yuval 	return offset;
2383be086e7cSMintz, Yuval }
2384be086e7cSMintz, Yuval 
23857b6859fbSMintz, Yuval /* Dumps a GRC memory header (section and params). Returns the dumped size in
23867b6859fbSMintz, Yuval  * dwords. The following parameters are dumped:
23877b6859fbSMintz, Yuval  * - name:	   dumped only if it's not NULL.
23887b6859fbSMintz, Yuval  * - addr:	   in dwords, dumped only if name is NULL.
23897b6859fbSMintz, Yuval  * - len:	   in dwords, always dumped.
23907b6859fbSMintz, Yuval  * - width:	   dumped if it's not zero.
23917b6859fbSMintz, Yuval  * - packed:	   dumped only if it's not false.
23927b6859fbSMintz, Yuval  * - mem_group:	   always dumped.
23937b6859fbSMintz, Yuval  * - is_storm:	   true only if the memory is related to a Storm.
23947b6859fbSMintz, Yuval  * - storm_letter: valid only if is_storm is true.
23957b6859fbSMintz, Yuval  *
2396c965db44STomer Tayar  */
2397c965db44STomer Tayar static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn,
2398c965db44STomer Tayar 				u32 *dump_buf,
2399c965db44STomer Tayar 				bool dump,
2400c965db44STomer Tayar 				const char *name,
2401be086e7cSMintz, Yuval 				u32 addr,
2402be086e7cSMintz, Yuval 				u32 len,
2403c965db44STomer Tayar 				u32 bit_width,
2404c965db44STomer Tayar 				bool packed,
24052d22bc83SMichal Kalderon 				const char *mem_group, char storm_letter)
2406c965db44STomer Tayar {
2407c965db44STomer Tayar 	u8 num_params = 3;
2408c965db44STomer Tayar 	u32 offset = 0;
2409c965db44STomer Tayar 	char buf[64];
2410c965db44STomer Tayar 
2411be086e7cSMintz, Yuval 	if (!len)
2412c965db44STomer Tayar 		DP_NOTICE(p_hwfn,
2413c965db44STomer Tayar 			  "Unexpected GRC Dump error: dumped memory size must be non-zero\n");
24147b6859fbSMintz, Yuval 
2415c965db44STomer Tayar 	if (bit_width)
2416c965db44STomer Tayar 		num_params++;
2417c965db44STomer Tayar 	if (packed)
2418c965db44STomer Tayar 		num_params++;
2419c965db44STomer Tayar 
2420c965db44STomer Tayar 	/* Dump section header */
2421c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
2422c965db44STomer Tayar 				       dump, "grc_mem", num_params);
24237b6859fbSMintz, Yuval 
2424c965db44STomer Tayar 	if (name) {
2425c965db44STomer Tayar 		/* Dump name */
24262d22bc83SMichal Kalderon 		if (storm_letter) {
2427c965db44STomer Tayar 			strcpy(buf, "?STORM_");
2428c965db44STomer Tayar 			buf[0] = storm_letter;
2429c965db44STomer Tayar 			strcpy(buf + strlen(buf), name);
2430c965db44STomer Tayar 		} else {
2431c965db44STomer Tayar 			strcpy(buf, name);
2432c965db44STomer Tayar 		}
2433c965db44STomer Tayar 
2434c965db44STomer Tayar 		offset += qed_dump_str_param(dump_buf + offset,
2435c965db44STomer Tayar 					     dump, "name", buf);
2436c965db44STomer Tayar 	} else {
2437c965db44STomer Tayar 		/* Dump address */
24387b6859fbSMintz, Yuval 		u32 addr_in_bytes = DWORDS_TO_BYTES(addr);
24397b6859fbSMintz, Yuval 
2440c965db44STomer Tayar 		offset += qed_dump_num_param(dump_buf + offset,
24417b6859fbSMintz, Yuval 					     dump, "addr", addr_in_bytes);
2442c965db44STomer Tayar 	}
2443c965db44STomer Tayar 
2444c965db44STomer Tayar 	/* Dump len */
2445be086e7cSMintz, Yuval 	offset += qed_dump_num_param(dump_buf + offset, dump, "len", len);
2446c965db44STomer Tayar 
2447c965db44STomer Tayar 	/* Dump bit width */
2448c965db44STomer Tayar 	if (bit_width)
2449c965db44STomer Tayar 		offset += qed_dump_num_param(dump_buf + offset,
2450c965db44STomer Tayar 					     dump, "width", bit_width);
2451c965db44STomer Tayar 
2452c965db44STomer Tayar 	/* Dump packed */
2453c965db44STomer Tayar 	if (packed)
2454c965db44STomer Tayar 		offset += qed_dump_num_param(dump_buf + offset,
2455c965db44STomer Tayar 					     dump, "packed", 1);
2456c965db44STomer Tayar 
2457c965db44STomer Tayar 	/* Dump reg type */
24582d22bc83SMichal Kalderon 	if (storm_letter) {
2459c965db44STomer Tayar 		strcpy(buf, "?STORM_");
2460c965db44STomer Tayar 		buf[0] = storm_letter;
2461c965db44STomer Tayar 		strcpy(buf + strlen(buf), mem_group);
2462c965db44STomer Tayar 	} else {
2463c965db44STomer Tayar 		strcpy(buf, mem_group);
2464c965db44STomer Tayar 	}
2465c965db44STomer Tayar 
2466c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset, dump, "type", buf);
24677b6859fbSMintz, Yuval 
2468c965db44STomer Tayar 	return offset;
2469c965db44STomer Tayar }
2470c965db44STomer Tayar 
2471c965db44STomer Tayar /* Dumps a single GRC memory. If name is NULL, the memory is stored by address.
2472c965db44STomer Tayar  * Returns the dumped size in dwords.
24737b6859fbSMintz, Yuval  * The addr and len arguments are specified in dwords.
2474c965db44STomer Tayar  */
2475c965db44STomer Tayar static u32 qed_grc_dump_mem(struct qed_hwfn *p_hwfn,
2476c965db44STomer Tayar 			    struct qed_ptt *p_ptt,
2477c965db44STomer Tayar 			    u32 *dump_buf,
2478c965db44STomer Tayar 			    bool dump,
2479c965db44STomer Tayar 			    const char *name,
2480be086e7cSMintz, Yuval 			    u32 addr,
2481be086e7cSMintz, Yuval 			    u32 len,
24827b6859fbSMintz, Yuval 			    bool wide_bus,
2483c965db44STomer Tayar 			    u32 bit_width,
2484c965db44STomer Tayar 			    bool packed,
24852d22bc83SMichal Kalderon 			    const char *mem_group, char storm_letter)
2486c965db44STomer Tayar {
2487c965db44STomer Tayar 	u32 offset = 0;
2488c965db44STomer Tayar 
2489c965db44STomer Tayar 	offset += qed_grc_dump_mem_hdr(p_hwfn,
2490c965db44STomer Tayar 				       dump_buf + offset,
2491c965db44STomer Tayar 				       dump,
2492c965db44STomer Tayar 				       name,
2493be086e7cSMintz, Yuval 				       addr,
2494be086e7cSMintz, Yuval 				       len,
2495c965db44STomer Tayar 				       bit_width,
24962d22bc83SMichal Kalderon 				       packed, mem_group, storm_letter);
2497be086e7cSMintz, Yuval 	offset += qed_grc_dump_addr_range(p_hwfn,
2498be086e7cSMintz, Yuval 					  p_ptt,
24997b6859fbSMintz, Yuval 					  dump_buf + offset,
2500d52c89f1SMichal Kalderon 					  dump, addr, len, wide_bus,
2501d52c89f1SMichal Kalderon 					  SPLIT_TYPE_NONE, 0);
25027b6859fbSMintz, Yuval 
2503c965db44STomer Tayar 	return offset;
2504c965db44STomer Tayar }
2505c965db44STomer Tayar 
2506c965db44STomer Tayar /* Dumps GRC memories entries. Returns the dumped size in dwords. */
2507c965db44STomer Tayar static u32 qed_grc_dump_mem_entries(struct qed_hwfn *p_hwfn,
2508c965db44STomer Tayar 				    struct qed_ptt *p_ptt,
25092d22bc83SMichal Kalderon 				    struct virt_mem_desc input_mems_arr,
2510c965db44STomer Tayar 				    u32 *dump_buf, bool dump)
2511c965db44STomer Tayar {
2512c965db44STomer Tayar 	u32 i, offset = 0, input_offset = 0;
2513c965db44STomer Tayar 	bool mode_match = true;
2514c965db44STomer Tayar 
25152d22bc83SMichal Kalderon 	while (input_offset < BYTES_TO_DWORDS(input_mems_arr.size)) {
2516c965db44STomer Tayar 		const struct dbg_dump_cond_hdr *cond_hdr;
25177b6859fbSMintz, Yuval 		u16 modes_buf_offset;
2518c965db44STomer Tayar 		u32 num_entries;
2519c965db44STomer Tayar 		bool eval_mode;
2520c965db44STomer Tayar 
25212d22bc83SMichal Kalderon 		cond_hdr =
25222d22bc83SMichal Kalderon 		    (const struct dbg_dump_cond_hdr *)input_mems_arr.ptr +
25232d22bc83SMichal Kalderon 		    input_offset++;
25247b6859fbSMintz, Yuval 		num_entries = cond_hdr->data_size / MEM_DUMP_ENTRY_SIZE_DWORDS;
2525c965db44STomer Tayar 
2526c965db44STomer Tayar 		/* Check required mode */
25277b6859fbSMintz, Yuval 		eval_mode = GET_FIELD(cond_hdr->mode.data,
25287b6859fbSMintz, Yuval 				      DBG_MODE_HDR_EVAL_MODE) > 0;
2529c965db44STomer Tayar 		if (eval_mode) {
25307b6859fbSMintz, Yuval 			modes_buf_offset =
2531c965db44STomer Tayar 				GET_FIELD(cond_hdr->mode.data,
2532c965db44STomer Tayar 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
2533c965db44STomer Tayar 			mode_match = qed_is_mode_match(p_hwfn,
2534c965db44STomer Tayar 						       &modes_buf_offset);
2535c965db44STomer Tayar 		}
2536c965db44STomer Tayar 
2537c965db44STomer Tayar 		if (!mode_match) {
2538c965db44STomer Tayar 			input_offset += cond_hdr->data_size;
2539c965db44STomer Tayar 			continue;
2540c965db44STomer Tayar 		}
2541c965db44STomer Tayar 
2542c965db44STomer Tayar 		for (i = 0; i < num_entries;
2543c965db44STomer Tayar 		     i++, input_offset += MEM_DUMP_ENTRY_SIZE_DWORDS) {
2544c965db44STomer Tayar 			const struct dbg_dump_mem *mem =
25452d22bc83SMichal Kalderon 			    (const struct dbg_dump_mem *)((u32 *)
25462d22bc83SMichal Kalderon 							  input_mems_arr.ptr
25472d22bc83SMichal Kalderon 							  + input_offset);
25482d22bc83SMichal Kalderon 			const struct dbg_block *block;
25492d22bc83SMichal Kalderon 			char storm_letter = 0;
25507b6859fbSMintz, Yuval 			u32 mem_addr, mem_len;
25512d22bc83SMichal Kalderon 			bool mem_wide_bus;
25522d22bc83SMichal Kalderon 			u8 mem_group_id;
25537b6859fbSMintz, Yuval 
25542d22bc83SMichal Kalderon 			mem_group_id = GET_FIELD(mem->dword0,
25552d22bc83SMichal Kalderon 						 DBG_DUMP_MEM_MEM_GROUP_ID);
2556c965db44STomer Tayar 			if (mem_group_id >= MEM_GROUPS_NUM) {
2557c965db44STomer Tayar 				DP_NOTICE(p_hwfn, "Invalid mem_group_id\n");
2558c965db44STomer Tayar 				return 0;
2559c965db44STomer Tayar 			}
2560c965db44STomer Tayar 
25617b6859fbSMintz, Yuval 			if (!qed_grc_is_mem_included(p_hwfn,
25622d22bc83SMichal Kalderon 						     (enum block_id)
25632d22bc83SMichal Kalderon 						     cond_hdr->block_id,
25647b6859fbSMintz, Yuval 						     mem_group_id))
25657b6859fbSMintz, Yuval 				continue;
25667b6859fbSMintz, Yuval 
25677b6859fbSMintz, Yuval 			mem_addr = GET_FIELD(mem->dword0, DBG_DUMP_MEM_ADDRESS);
25687b6859fbSMintz, Yuval 			mem_len = GET_FIELD(mem->dword1, DBG_DUMP_MEM_LENGTH);
25697b6859fbSMintz, Yuval 			mem_wide_bus = GET_FIELD(mem->dword1,
25707b6859fbSMintz, Yuval 						 DBG_DUMP_MEM_WIDE_BUS);
2571c965db44STomer Tayar 
25722d22bc83SMichal Kalderon 			block = get_dbg_block(p_hwfn,
25732d22bc83SMichal Kalderon 					      cond_hdr->block_id);
25742d22bc83SMichal Kalderon 
25752d22bc83SMichal Kalderon 			/* If memory is associated with Storm,
25762d22bc83SMichal Kalderon 			 * update storm details
2577c965db44STomer Tayar 			 */
25782d22bc83SMichal Kalderon 			if (block->associated_storm_letter)
25792d22bc83SMichal Kalderon 				storm_letter = block->associated_storm_letter;
2580c965db44STomer Tayar 
2581c965db44STomer Tayar 			/* Dump memory */
25827b6859fbSMintz, Yuval 			offset += qed_grc_dump_mem(p_hwfn,
25837b6859fbSMintz, Yuval 						p_ptt,
25847b6859fbSMintz, Yuval 						dump_buf + offset,
25857b6859fbSMintz, Yuval 						dump,
25867b6859fbSMintz, Yuval 						NULL,
25877b6859fbSMintz, Yuval 						mem_addr,
25887b6859fbSMintz, Yuval 						mem_len,
25897b6859fbSMintz, Yuval 						mem_wide_bus,
25907b6859fbSMintz, Yuval 						0,
2591c965db44STomer Tayar 						false,
2592c965db44STomer Tayar 						s_mem_group_names[mem_group_id],
25937b6859fbSMintz, Yuval 						storm_letter);
2594c965db44STomer Tayar 		}
2595c965db44STomer Tayar 	}
2596c965db44STomer Tayar 
2597c965db44STomer Tayar 	return offset;
2598c965db44STomer Tayar }
2599c965db44STomer Tayar 
2600c965db44STomer Tayar /* Dumps GRC memories according to the input array dump_mem.
2601c965db44STomer Tayar  * Returns the dumped size in dwords.
2602c965db44STomer Tayar  */
2603c965db44STomer Tayar static u32 qed_grc_dump_memories(struct qed_hwfn *p_hwfn,
2604c965db44STomer Tayar 				 struct qed_ptt *p_ptt,
2605c965db44STomer Tayar 				 u32 *dump_buf, bool dump)
2606c965db44STomer Tayar {
26072d22bc83SMichal Kalderon 	struct virt_mem_desc *dbg_buf =
26082d22bc83SMichal Kalderon 	    &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM];
2609c965db44STomer Tayar 	u32 offset = 0, input_offset = 0;
2610c965db44STomer Tayar 
26112d22bc83SMichal Kalderon 	while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
26127b6859fbSMintz, Yuval 		const struct dbg_dump_split_hdr *split_hdr;
26132d22bc83SMichal Kalderon 		struct virt_mem_desc curr_input_mems_arr;
2614d52c89f1SMichal Kalderon 		enum init_split_types split_type;
26157b6859fbSMintz, Yuval 		u32 split_data_size;
26167b6859fbSMintz, Yuval 
26172d22bc83SMichal Kalderon 		split_hdr =
26182d22bc83SMichal Kalderon 		    (const struct dbg_dump_split_hdr *)dbg_buf->ptr +
26192d22bc83SMichal Kalderon 		    input_offset++;
26202d22bc83SMichal Kalderon 		split_type = GET_FIELD(split_hdr->hdr,
2621c965db44STomer Tayar 				       DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
26222d22bc83SMichal Kalderon 		split_data_size = GET_FIELD(split_hdr->hdr,
2623c965db44STomer Tayar 					    DBG_DUMP_SPLIT_HDR_DATA_SIZE);
26242d22bc83SMichal Kalderon 		curr_input_mems_arr.ptr = (u32 *)dbg_buf->ptr + input_offset;
26252d22bc83SMichal Kalderon 		curr_input_mems_arr.size = DWORDS_TO_BYTES(split_data_size);
2626c965db44STomer Tayar 
2627d52c89f1SMichal Kalderon 		if (split_type == SPLIT_TYPE_NONE)
2628c965db44STomer Tayar 			offset += qed_grc_dump_mem_entries(p_hwfn,
2629c965db44STomer Tayar 							   p_ptt,
2630c965db44STomer Tayar 							   curr_input_mems_arr,
2631c965db44STomer Tayar 							   dump_buf + offset,
2632c965db44STomer Tayar 							   dump);
2633d52c89f1SMichal Kalderon 		else
2634c965db44STomer Tayar 			DP_NOTICE(p_hwfn,
2635c965db44STomer Tayar 				  "Dumping split memories is currently not supported\n");
2636c965db44STomer Tayar 
2637c965db44STomer Tayar 		input_offset += split_data_size;
2638c965db44STomer Tayar 	}
2639c965db44STomer Tayar 
2640c965db44STomer Tayar 	return offset;
2641c965db44STomer Tayar }
2642c965db44STomer Tayar 
2643c965db44STomer Tayar /* Dumps GRC context data for the specified Storm.
2644c965db44STomer Tayar  * Returns the dumped size in dwords.
26457b6859fbSMintz, Yuval  * The lid_size argument is specified in quad-regs.
2646c965db44STomer Tayar  */
2647c965db44STomer Tayar static u32 qed_grc_dump_ctx_data(struct qed_hwfn *p_hwfn,
2648c965db44STomer Tayar 				 struct qed_ptt *p_ptt,
2649c965db44STomer Tayar 				 u32 *dump_buf,
2650c965db44STomer Tayar 				 bool dump,
2651c965db44STomer Tayar 				 const char *name,
2652c965db44STomer Tayar 				 u32 num_lids,
26532d22bc83SMichal Kalderon 				 enum cm_ctx_types ctx_type, u8 storm_id)
2654c965db44STomer Tayar {
26552d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
26567b6859fbSMintz, Yuval 	struct storm_defs *storm = &s_storm_defs[storm_id];
26572d22bc83SMichal Kalderon 	u32 i, lid, lid_size, total_size;
26582d22bc83SMichal Kalderon 	u32 rd_reg_addr, offset = 0;
26592d22bc83SMichal Kalderon 
26602d22bc83SMichal Kalderon 	/* Convert quad-regs to dwords */
26612d22bc83SMichal Kalderon 	lid_size = storm->cm_ctx_lid_sizes[dev_data->chip_id][ctx_type] * 4;
2662c965db44STomer Tayar 
2663c965db44STomer Tayar 	if (!lid_size)
2664c965db44STomer Tayar 		return 0;
26657b6859fbSMintz, Yuval 
2666c965db44STomer Tayar 	total_size = num_lids * lid_size;
26677b6859fbSMintz, Yuval 
2668c965db44STomer Tayar 	offset += qed_grc_dump_mem_hdr(p_hwfn,
2669c965db44STomer Tayar 				       dump_buf + offset,
2670c965db44STomer Tayar 				       dump,
2671c965db44STomer Tayar 				       name,
2672c965db44STomer Tayar 				       0,
2673c965db44STomer Tayar 				       total_size,
2674c965db44STomer Tayar 				       lid_size * 32,
26752d22bc83SMichal Kalderon 				       false, name, storm->letter);
26767b6859fbSMintz, Yuval 
26777b6859fbSMintz, Yuval 	if (!dump)
26787b6859fbSMintz, Yuval 		return offset + total_size;
2679c965db44STomer Tayar 
26802d22bc83SMichal Kalderon 	rd_reg_addr = BYTES_TO_DWORDS(storm->cm_ctx_rd_addr[ctx_type]);
26812d22bc83SMichal Kalderon 
2682c965db44STomer Tayar 	/* Dump context data */
2683c965db44STomer Tayar 	for (lid = 0; lid < num_lids; lid++) {
26842d22bc83SMichal Kalderon 		for (i = 0; i < lid_size; i++) {
2685c965db44STomer Tayar 			qed_wr(p_hwfn,
26867b6859fbSMintz, Yuval 			       p_ptt, storm->cm_ctx_wr_addr, (i << 9) | lid);
26872d22bc83SMichal Kalderon 			offset += qed_grc_dump_addr_range(p_hwfn,
26882d22bc83SMichal Kalderon 							  p_ptt,
26892d22bc83SMichal Kalderon 							  dump_buf + offset,
26902d22bc83SMichal Kalderon 							  dump,
26912d22bc83SMichal Kalderon 							  rd_reg_addr,
26922d22bc83SMichal Kalderon 							  1,
26932d22bc83SMichal Kalderon 							  false,
26942d22bc83SMichal Kalderon 							  SPLIT_TYPE_NONE, 0);
2695c965db44STomer Tayar 		}
2696c965db44STomer Tayar 	}
2697c965db44STomer Tayar 
2698c965db44STomer Tayar 	return offset;
2699c965db44STomer Tayar }
2700c965db44STomer Tayar 
2701c965db44STomer Tayar /* Dumps GRC contexts. Returns the dumped size in dwords. */
2702c965db44STomer Tayar static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn,
2703c965db44STomer Tayar 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
2704c965db44STomer Tayar {
2705c965db44STomer Tayar 	u32 offset = 0;
2706c965db44STomer Tayar 	u8 storm_id;
2707c965db44STomer Tayar 
2708c965db44STomer Tayar 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
2709c965db44STomer Tayar 		if (!qed_grc_is_storm_included(p_hwfn,
2710c965db44STomer Tayar 					       (enum dbg_storms)storm_id))
2711c965db44STomer Tayar 			continue;
2712c965db44STomer Tayar 
2713c965db44STomer Tayar 		/* Dump Conn AG context size */
27142d22bc83SMichal Kalderon 		offset += qed_grc_dump_ctx_data(p_hwfn,
2715c965db44STomer Tayar 						p_ptt,
2716c965db44STomer Tayar 						dump_buf + offset,
2717c965db44STomer Tayar 						dump,
2718c965db44STomer Tayar 						"CONN_AG_CTX",
27192d22bc83SMichal Kalderon 						NUM_OF_LCIDS,
27202d22bc83SMichal Kalderon 						CM_CTX_CONN_AG, storm_id);
2721c965db44STomer Tayar 
2722c965db44STomer Tayar 		/* Dump Conn ST context size */
27232d22bc83SMichal Kalderon 		offset += qed_grc_dump_ctx_data(p_hwfn,
2724c965db44STomer Tayar 						p_ptt,
2725c965db44STomer Tayar 						dump_buf + offset,
2726c965db44STomer Tayar 						dump,
2727c965db44STomer Tayar 						"CONN_ST_CTX",
27282d22bc83SMichal Kalderon 						NUM_OF_LCIDS,
27292d22bc83SMichal Kalderon 						CM_CTX_CONN_ST, storm_id);
2730c965db44STomer Tayar 
2731c965db44STomer Tayar 		/* Dump Task AG context size */
27322d22bc83SMichal Kalderon 		offset += qed_grc_dump_ctx_data(p_hwfn,
2733c965db44STomer Tayar 						p_ptt,
2734c965db44STomer Tayar 						dump_buf + offset,
2735c965db44STomer Tayar 						dump,
2736c965db44STomer Tayar 						"TASK_AG_CTX",
27372d22bc83SMichal Kalderon 						NUM_OF_LTIDS,
27382d22bc83SMichal Kalderon 						CM_CTX_TASK_AG, storm_id);
2739c965db44STomer Tayar 
2740c965db44STomer Tayar 		/* Dump Task ST context size */
27412d22bc83SMichal Kalderon 		offset += qed_grc_dump_ctx_data(p_hwfn,
2742c965db44STomer Tayar 						p_ptt,
2743c965db44STomer Tayar 						dump_buf + offset,
2744c965db44STomer Tayar 						dump,
2745c965db44STomer Tayar 						"TASK_ST_CTX",
27462d22bc83SMichal Kalderon 						NUM_OF_LTIDS,
27472d22bc83SMichal Kalderon 						CM_CTX_TASK_ST, storm_id);
2748c965db44STomer Tayar 	}
2749c965db44STomer Tayar 
2750c965db44STomer Tayar 	return offset;
2751c965db44STomer Tayar }
2752c965db44STomer Tayar 
27532d22bc83SMichal Kalderon #define VFC_STATUS_RESP_READY_BIT	0
27542d22bc83SMichal Kalderon #define VFC_STATUS_BUSY_BIT		1
27552d22bc83SMichal Kalderon #define VFC_STATUS_SENDING_CMD_BIT	2
27562d22bc83SMichal Kalderon 
27572d22bc83SMichal Kalderon #define VFC_POLLING_DELAY_MS	1
27582d22bc83SMichal Kalderon #define VFC_POLLING_COUNT		20
27592d22bc83SMichal Kalderon 
27602d22bc83SMichal Kalderon /* Reads data from VFC. Returns the number of dwords read (0 on error).
27612d22bc83SMichal Kalderon  * Sizes are specified in dwords.
27622d22bc83SMichal Kalderon  */
27632d22bc83SMichal Kalderon static u32 qed_grc_dump_read_from_vfc(struct qed_hwfn *p_hwfn,
27642d22bc83SMichal Kalderon 				      struct qed_ptt *p_ptt,
27652d22bc83SMichal Kalderon 				      struct storm_defs *storm,
27662d22bc83SMichal Kalderon 				      u32 *cmd_data,
27672d22bc83SMichal Kalderon 				      u32 cmd_size,
27682d22bc83SMichal Kalderon 				      u32 *addr_data,
27692d22bc83SMichal Kalderon 				      u32 addr_size,
27702d22bc83SMichal Kalderon 				      u32 resp_size, u32 *dump_buf)
2771c965db44STomer Tayar {
27722d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
27732d22bc83SMichal Kalderon 	u32 vfc_status, polling_ms, polling_count = 0, i;
27742d22bc83SMichal Kalderon 	u32 reg_addr, sem_base;
27752d22bc83SMichal Kalderon 	bool is_ready = false;
2776c965db44STomer Tayar 
27772d22bc83SMichal Kalderon 	sem_base = storm->sem_fast_mem_addr;
27782d22bc83SMichal Kalderon 	polling_ms = VFC_POLLING_DELAY_MS *
27792d22bc83SMichal Kalderon 	    s_hw_type_defs[dev_data->hw_type].delay_factor;
2780c965db44STomer Tayar 
27812d22bc83SMichal Kalderon 	/* Write VFC command */
27822d22bc83SMichal Kalderon 	ARR_REG_WR(p_hwfn,
2783c965db44STomer Tayar 		   p_ptt,
27842d22bc83SMichal Kalderon 		   sem_base + SEM_FAST_REG_VFC_DATA_WR,
27852d22bc83SMichal Kalderon 		   cmd_data, cmd_size);
27862d22bc83SMichal Kalderon 
27872d22bc83SMichal Kalderon 	/* Write VFC address */
27882d22bc83SMichal Kalderon 	ARR_REG_WR(p_hwfn,
27892d22bc83SMichal Kalderon 		   p_ptt,
27902d22bc83SMichal Kalderon 		   sem_base + SEM_FAST_REG_VFC_ADDR,
27912d22bc83SMichal Kalderon 		   addr_data, addr_size);
27922d22bc83SMichal Kalderon 
27932d22bc83SMichal Kalderon 	/* Read response */
27942d22bc83SMichal Kalderon 	for (i = 0; i < resp_size; i++) {
27952d22bc83SMichal Kalderon 		/* Poll until ready */
27962d22bc83SMichal Kalderon 		do {
27972d22bc83SMichal Kalderon 			reg_addr = sem_base + SEM_FAST_REG_VFC_STATUS;
27982d22bc83SMichal Kalderon 			qed_grc_dump_addr_range(p_hwfn,
27992d22bc83SMichal Kalderon 						p_ptt,
28002d22bc83SMichal Kalderon 						&vfc_status,
2801c965db44STomer Tayar 						true,
28022d22bc83SMichal Kalderon 						BYTES_TO_DWORDS(reg_addr),
28032d22bc83SMichal Kalderon 						1,
28042d22bc83SMichal Kalderon 						false, SPLIT_TYPE_NONE, 0);
28052d22bc83SMichal Kalderon 			is_ready = vfc_status & BIT(VFC_STATUS_RESP_READY_BIT);
28062d22bc83SMichal Kalderon 
28072d22bc83SMichal Kalderon 			if (!is_ready) {
28082d22bc83SMichal Kalderon 				if (polling_count++ == VFC_POLLING_COUNT)
28092d22bc83SMichal Kalderon 					return 0;
28102d22bc83SMichal Kalderon 
28112d22bc83SMichal Kalderon 				msleep(polling_ms);
2812c965db44STomer Tayar 			}
28132d22bc83SMichal Kalderon 		} while (!is_ready);
28142d22bc83SMichal Kalderon 
28152d22bc83SMichal Kalderon 		reg_addr = sem_base + SEM_FAST_REG_VFC_DATA_RD;
28162d22bc83SMichal Kalderon 		qed_grc_dump_addr_range(p_hwfn,
28172d22bc83SMichal Kalderon 					p_ptt,
28182d22bc83SMichal Kalderon 					dump_buf + i,
28192d22bc83SMichal Kalderon 					true,
28202d22bc83SMichal Kalderon 					BYTES_TO_DWORDS(reg_addr),
28212d22bc83SMichal Kalderon 					1, false, SPLIT_TYPE_NONE, 0);
2822c965db44STomer Tayar 	}
2823c965db44STomer Tayar 
28242d22bc83SMichal Kalderon 	return resp_size;
2825c965db44STomer Tayar }
2826c965db44STomer Tayar 
2827c965db44STomer Tayar /* Dump VFC CAM. Returns the dumped size in dwords. */
2828c965db44STomer Tayar static u32 qed_grc_dump_vfc_cam(struct qed_hwfn *p_hwfn,
2829c965db44STomer Tayar 				struct qed_ptt *p_ptt,
2830c965db44STomer Tayar 				u32 *dump_buf, bool dump, u8 storm_id)
2831c965db44STomer Tayar {
2832c965db44STomer Tayar 	u32 total_size = VFC_CAM_NUM_ROWS * VFC_CAM_RESP_DWORDS;
28337b6859fbSMintz, Yuval 	struct storm_defs *storm = &s_storm_defs[storm_id];
2834c965db44STomer Tayar 	u32 cam_addr[VFC_CAM_ADDR_DWORDS] = { 0 };
2835c965db44STomer Tayar 	u32 cam_cmd[VFC_CAM_CMD_DWORDS] = { 0 };
28362d22bc83SMichal Kalderon 	u32 row, offset = 0;
2837c965db44STomer Tayar 
2838c965db44STomer Tayar 	offset += qed_grc_dump_mem_hdr(p_hwfn,
2839c965db44STomer Tayar 				       dump_buf + offset,
2840c965db44STomer Tayar 				       dump,
2841c965db44STomer Tayar 				       "vfc_cam",
2842c965db44STomer Tayar 				       0,
2843c965db44STomer Tayar 				       total_size,
2844c965db44STomer Tayar 				       256,
28452d22bc83SMichal Kalderon 				       false, "vfc_cam", storm->letter);
28467b6859fbSMintz, Yuval 
28477b6859fbSMintz, Yuval 	if (!dump)
28487b6859fbSMintz, Yuval 		return offset + total_size;
28497b6859fbSMintz, Yuval 
2850c965db44STomer Tayar 	/* Prepare CAM address */
2851c965db44STomer Tayar 	SET_VAR_FIELD(cam_addr, VFC_CAM_ADDR, OP, VFC_OPCODE_CAM_RD);
28527b6859fbSMintz, Yuval 
28532d22bc83SMichal Kalderon 	/* Read VFC CAM data */
28542d22bc83SMichal Kalderon 	for (row = 0; row < VFC_CAM_NUM_ROWS; row++) {
2855c965db44STomer Tayar 		SET_VAR_FIELD(cam_cmd, VFC_CAM_CMD, ROW, row);
28562d22bc83SMichal Kalderon 		offset += qed_grc_dump_read_from_vfc(p_hwfn,
2857c965db44STomer Tayar 						     p_ptt,
28582d22bc83SMichal Kalderon 						     storm,
28592d22bc83SMichal Kalderon 						     cam_cmd,
28602d22bc83SMichal Kalderon 						     VFC_CAM_CMD_DWORDS,
28612d22bc83SMichal Kalderon 						     cam_addr,
28622d22bc83SMichal Kalderon 						     VFC_CAM_ADDR_DWORDS,
28632d22bc83SMichal Kalderon 						     VFC_CAM_RESP_DWORDS,
28642d22bc83SMichal Kalderon 						     dump_buf + offset);
2865c965db44STomer Tayar 	}
2866c965db44STomer Tayar 
2867c965db44STomer Tayar 	return offset;
2868c965db44STomer Tayar }
2869c965db44STomer Tayar 
2870c965db44STomer Tayar /* Dump VFC RAM. Returns the dumped size in dwords. */
2871c965db44STomer Tayar static u32 qed_grc_dump_vfc_ram(struct qed_hwfn *p_hwfn,
2872c965db44STomer Tayar 				struct qed_ptt *p_ptt,
2873c965db44STomer Tayar 				u32 *dump_buf,
2874c965db44STomer Tayar 				bool dump,
2875c965db44STomer Tayar 				u8 storm_id, struct vfc_ram_defs *ram_defs)
2876c965db44STomer Tayar {
2877c965db44STomer Tayar 	u32 total_size = ram_defs->num_rows * VFC_RAM_RESP_DWORDS;
28787b6859fbSMintz, Yuval 	struct storm_defs *storm = &s_storm_defs[storm_id];
2879c965db44STomer Tayar 	u32 ram_addr[VFC_RAM_ADDR_DWORDS] = { 0 };
2880c965db44STomer Tayar 	u32 ram_cmd[VFC_RAM_CMD_DWORDS] = { 0 };
28812d22bc83SMichal Kalderon 	u32 row, offset = 0;
2882c965db44STomer Tayar 
2883c965db44STomer Tayar 	offset += qed_grc_dump_mem_hdr(p_hwfn,
2884c965db44STomer Tayar 				       dump_buf + offset,
2885c965db44STomer Tayar 				       dump,
2886c965db44STomer Tayar 				       ram_defs->mem_name,
2887c965db44STomer Tayar 				       0,
2888c965db44STomer Tayar 				       total_size,
2889c965db44STomer Tayar 				       256,
2890c965db44STomer Tayar 				       false,
2891c965db44STomer Tayar 				       ram_defs->type_name,
28922d22bc83SMichal Kalderon 				       storm->letter);
2893c965db44STomer Tayar 
2894c965db44STomer Tayar 	if (!dump)
2895c965db44STomer Tayar 		return offset + total_size;
2896c965db44STomer Tayar 
28972d22bc83SMichal Kalderon 	/* Prepare RAM address */
28982d22bc83SMichal Kalderon 	SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, OP, VFC_OPCODE_RAM_RD);
28992d22bc83SMichal Kalderon 
29002d22bc83SMichal Kalderon 	/* Read VFC RAM data */
2901c965db44STomer Tayar 	for (row = ram_defs->base_row;
29022d22bc83SMichal Kalderon 	     row < ram_defs->base_row + ram_defs->num_rows; row++) {
2903c965db44STomer Tayar 		SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, ROW, row);
29042d22bc83SMichal Kalderon 		offset += qed_grc_dump_read_from_vfc(p_hwfn,
2905c965db44STomer Tayar 						     p_ptt,
29062d22bc83SMichal Kalderon 						     storm,
29072d22bc83SMichal Kalderon 						     ram_cmd,
29082d22bc83SMichal Kalderon 						     VFC_RAM_CMD_DWORDS,
29092d22bc83SMichal Kalderon 						     ram_addr,
29102d22bc83SMichal Kalderon 						     VFC_RAM_ADDR_DWORDS,
29112d22bc83SMichal Kalderon 						     VFC_RAM_RESP_DWORDS,
29122d22bc83SMichal Kalderon 						     dump_buf + offset);
2913c965db44STomer Tayar 	}
2914c965db44STomer Tayar 
2915c965db44STomer Tayar 	return offset;
2916c965db44STomer Tayar }
2917c965db44STomer Tayar 
2918c965db44STomer Tayar /* Dumps GRC VFC data. Returns the dumped size in dwords. */
2919c965db44STomer Tayar static u32 qed_grc_dump_vfc(struct qed_hwfn *p_hwfn,
2920c965db44STomer Tayar 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
2921c965db44STomer Tayar {
2922c965db44STomer Tayar 	u8 storm_id, i;
2923c965db44STomer Tayar 	u32 offset = 0;
2924c965db44STomer Tayar 
2925c965db44STomer Tayar 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
29267b6859fbSMintz, Yuval 		if (!qed_grc_is_storm_included(p_hwfn,
29277b6859fbSMintz, Yuval 					       (enum dbg_storms)storm_id) ||
29282d22bc83SMichal Kalderon 		    !s_storm_defs[storm_id].has_vfc)
29297b6859fbSMintz, Yuval 			continue;
29307b6859fbSMintz, Yuval 
2931c965db44STomer Tayar 		/* Read CAM */
2932c965db44STomer Tayar 		offset += qed_grc_dump_vfc_cam(p_hwfn,
2933c965db44STomer Tayar 					       p_ptt,
2934c965db44STomer Tayar 					       dump_buf + offset,
2935c965db44STomer Tayar 					       dump, storm_id);
2936c965db44STomer Tayar 
2937c965db44STomer Tayar 		/* Read RAM */
2938c965db44STomer Tayar 		for (i = 0; i < NUM_VFC_RAM_TYPES; i++)
2939c965db44STomer Tayar 			offset += qed_grc_dump_vfc_ram(p_hwfn,
2940c965db44STomer Tayar 						       p_ptt,
29417b6859fbSMintz, Yuval 						       dump_buf + offset,
2942c965db44STomer Tayar 						       dump,
2943c965db44STomer Tayar 						       storm_id,
29447b6859fbSMintz, Yuval 						       &s_vfc_ram_defs[i]);
2945c965db44STomer Tayar 	}
2946c965db44STomer Tayar 
2947c965db44STomer Tayar 	return offset;
2948c965db44STomer Tayar }
2949c965db44STomer Tayar 
2950c965db44STomer Tayar /* Dumps GRC RSS data. Returns the dumped size in dwords. */
2951c965db44STomer Tayar static u32 qed_grc_dump_rss(struct qed_hwfn *p_hwfn,
2952c965db44STomer Tayar 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
2953c965db44STomer Tayar {
2954c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2955c965db44STomer Tayar 	u32 offset = 0;
2956c965db44STomer Tayar 	u8 rss_mem_id;
2957c965db44STomer Tayar 
2958c965db44STomer Tayar 	for (rss_mem_id = 0; rss_mem_id < NUM_RSS_MEM_TYPES; rss_mem_id++) {
2959da090917STomer Tayar 		u32 rss_addr, num_entries, total_dwords;
29607b6859fbSMintz, Yuval 		struct rss_mem_defs *rss_defs;
2961da090917STomer Tayar 		u32 addr, num_dwords_to_read;
29627b6859fbSMintz, Yuval 		bool packed;
29637b6859fbSMintz, Yuval 
29647b6859fbSMintz, Yuval 		rss_defs = &s_rss_mem_defs[rss_mem_id];
29657b6859fbSMintz, Yuval 		rss_addr = rss_defs->addr;
29667b6859fbSMintz, Yuval 		num_entries = rss_defs->num_entries[dev_data->chip_id];
2967da090917STomer Tayar 		total_dwords = (num_entries * rss_defs->entry_width) / 32;
2968da090917STomer Tayar 		packed = (rss_defs->entry_width == 16);
2969c965db44STomer Tayar 
2970c965db44STomer Tayar 		offset += qed_grc_dump_mem_hdr(p_hwfn,
2971c965db44STomer Tayar 					       dump_buf + offset,
2972c965db44STomer Tayar 					       dump,
2973c965db44STomer Tayar 					       rss_defs->mem_name,
2974be086e7cSMintz, Yuval 					       0,
2975be086e7cSMintz, Yuval 					       total_dwords,
2976da090917STomer Tayar 					       rss_defs->entry_width,
2977c965db44STomer Tayar 					       packed,
29782d22bc83SMichal Kalderon 					       rss_defs->type_name, 0);
2979c965db44STomer Tayar 
29807b6859fbSMintz, Yuval 		/* Dump RSS data */
2981c965db44STomer Tayar 		if (!dump) {
2982be086e7cSMintz, Yuval 			offset += total_dwords;
2983c965db44STomer Tayar 			continue;
2984c965db44STomer Tayar 		}
2985c965db44STomer Tayar 
2986be086e7cSMintz, Yuval 		addr = BYTES_TO_DWORDS(RSS_REG_RSS_RAM_DATA);
2987da090917STomer Tayar 		while (total_dwords) {
2988da090917STomer Tayar 			num_dwords_to_read = min_t(u32,
2989da090917STomer Tayar 						   RSS_REG_RSS_RAM_DATA_SIZE,
2990da090917STomer Tayar 						   total_dwords);
2991be086e7cSMintz, Yuval 			qed_wr(p_hwfn, p_ptt, RSS_REG_RSS_RAM_ADDR, rss_addr);
2992be086e7cSMintz, Yuval 			offset += qed_grc_dump_addr_range(p_hwfn,
2993be086e7cSMintz, Yuval 							  p_ptt,
29947b6859fbSMintz, Yuval 							  dump_buf + offset,
2995be086e7cSMintz, Yuval 							  dump,
2996be086e7cSMintz, Yuval 							  addr,
2997da090917STomer Tayar 							  num_dwords_to_read,
2998d52c89f1SMichal Kalderon 							  false,
2999d52c89f1SMichal Kalderon 							  SPLIT_TYPE_NONE, 0);
3000da090917STomer Tayar 			total_dwords -= num_dwords_to_read;
3001da090917STomer Tayar 			rss_addr++;
3002c965db44STomer Tayar 		}
3003c965db44STomer Tayar 	}
3004c965db44STomer Tayar 
3005c965db44STomer Tayar 	return offset;
3006c965db44STomer Tayar }
3007c965db44STomer Tayar 
3008c965db44STomer Tayar /* Dumps GRC Big RAM. Returns the dumped size in dwords. */
3009c965db44STomer Tayar static u32 qed_grc_dump_big_ram(struct qed_hwfn *p_hwfn,
3010c965db44STomer Tayar 				struct qed_ptt *p_ptt,
3011c965db44STomer Tayar 				u32 *dump_buf, bool dump, u8 big_ram_id)
3012c965db44STomer Tayar {
3013c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3014da090917STomer Tayar 	u32 block_size, ram_size, offset = 0, reg_val, i;
3015c965db44STomer Tayar 	char mem_name[12] = "???_BIG_RAM";
3016c965db44STomer Tayar 	char type_name[8] = "???_RAM";
3017be086e7cSMintz, Yuval 	struct big_ram_defs *big_ram;
3018c965db44STomer Tayar 
3019be086e7cSMintz, Yuval 	big_ram = &s_big_ram_defs[big_ram_id];
3020da090917STomer Tayar 	ram_size = big_ram->ram_size[dev_data->chip_id];
3021da090917STomer Tayar 
3022da090917STomer Tayar 	reg_val = qed_rd(p_hwfn, p_ptt, big_ram->is_256b_reg_addr);
3023da090917STomer Tayar 	block_size = reg_val &
3024da090917STomer Tayar 		     BIT(big_ram->is_256b_bit_offset[dev_data->chip_id]) ? 256
3025da090917STomer Tayar 									 : 128;
3026c965db44STomer Tayar 
3027c7d852e3SDenis Bolotin 	strncpy(type_name, big_ram->instance_name, BIG_RAM_NAME_LEN);
3028c7d852e3SDenis Bolotin 	strncpy(mem_name, big_ram->instance_name, BIG_RAM_NAME_LEN);
3029c965db44STomer Tayar 
3030c965db44STomer Tayar 	/* Dump memory header */
3031c965db44STomer Tayar 	offset += qed_grc_dump_mem_hdr(p_hwfn,
3032c965db44STomer Tayar 				       dump_buf + offset,
3033c965db44STomer Tayar 				       dump,
3034c965db44STomer Tayar 				       mem_name,
3035c965db44STomer Tayar 				       0,
3036c965db44STomer Tayar 				       ram_size,
3037da090917STomer Tayar 				       block_size * 8,
30382d22bc83SMichal Kalderon 				       false, type_name, 0);
3039c965db44STomer Tayar 
30407b6859fbSMintz, Yuval 	/* Read and dump Big RAM data */
3041c965db44STomer Tayar 	if (!dump)
3042c965db44STomer Tayar 		return offset + ram_size;
3043c965db44STomer Tayar 
30447b6859fbSMintz, Yuval 	/* Dump Big RAM */
3045da090917STomer Tayar 	for (i = 0; i < DIV_ROUND_UP(ram_size, BRB_REG_BIG_RAM_DATA_SIZE);
3046da090917STomer Tayar 	     i++) {
3047be086e7cSMintz, Yuval 		u32 addr, len;
3048be086e7cSMintz, Yuval 
3049be086e7cSMintz, Yuval 		qed_wr(p_hwfn, p_ptt, big_ram->addr_reg_addr, i);
3050be086e7cSMintz, Yuval 		addr = BYTES_TO_DWORDS(big_ram->data_reg_addr);
3051da090917STomer Tayar 		len = BRB_REG_BIG_RAM_DATA_SIZE;
3052be086e7cSMintz, Yuval 		offset += qed_grc_dump_addr_range(p_hwfn,
3053be086e7cSMintz, Yuval 						  p_ptt,
3054be086e7cSMintz, Yuval 						  dump_buf + offset,
3055be086e7cSMintz, Yuval 						  dump,
3056be086e7cSMintz, Yuval 						  addr,
30577b6859fbSMintz, Yuval 						  len,
3058d52c89f1SMichal Kalderon 						  false, SPLIT_TYPE_NONE, 0);
3059c965db44STomer Tayar 	}
3060c965db44STomer Tayar 
3061c965db44STomer Tayar 	return offset;
3062c965db44STomer Tayar }
3063c965db44STomer Tayar 
30642d22bc83SMichal Kalderon /* Dumps MCP scratchpad. Returns the dumped size in dwords. */
3065c965db44STomer Tayar static u32 qed_grc_dump_mcp(struct qed_hwfn *p_hwfn,
3066c965db44STomer Tayar 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3067c965db44STomer Tayar {
3068c965db44STomer Tayar 	bool block_enable[MAX_BLOCK_ID] = { 0 };
3069be086e7cSMintz, Yuval 	u32 offset = 0, addr;
3070c965db44STomer Tayar 	bool halted = false;
3071c965db44STomer Tayar 
3072c965db44STomer Tayar 	/* Halt MCP */
3073be086e7cSMintz, Yuval 	if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) {
3074c965db44STomer Tayar 		halted = !qed_mcp_halt(p_hwfn, p_ptt);
3075c965db44STomer Tayar 		if (!halted)
3076c965db44STomer Tayar 			DP_NOTICE(p_hwfn, "MCP halt failed!\n");
3077c965db44STomer Tayar 	}
3078c965db44STomer Tayar 
3079c965db44STomer Tayar 	/* Dump MCP scratchpad */
3080c965db44STomer Tayar 	offset += qed_grc_dump_mem(p_hwfn,
3081c965db44STomer Tayar 				   p_ptt,
3082c965db44STomer Tayar 				   dump_buf + offset,
3083c965db44STomer Tayar 				   dump,
3084c965db44STomer Tayar 				   NULL,
3085be086e7cSMintz, Yuval 				   BYTES_TO_DWORDS(MCP_REG_SCRATCH),
30862d22bc83SMichal Kalderon 				   MCP_REG_SCRATCH_SIZE,
30872d22bc83SMichal Kalderon 				   false, 0, false, "MCP", 0);
3088c965db44STomer Tayar 
3089c965db44STomer Tayar 	/* Dump MCP cpu_reg_file */
3090c965db44STomer Tayar 	offset += qed_grc_dump_mem(p_hwfn,
3091c965db44STomer Tayar 				   p_ptt,
3092c965db44STomer Tayar 				   dump_buf + offset,
3093c965db44STomer Tayar 				   dump,
3094c965db44STomer Tayar 				   NULL,
3095be086e7cSMintz, Yuval 				   BYTES_TO_DWORDS(MCP_REG_CPU_REG_FILE),
3096c965db44STomer Tayar 				   MCP_REG_CPU_REG_FILE_SIZE,
30972d22bc83SMichal Kalderon 				   false, 0, false, "MCP", 0);
3098c965db44STomer Tayar 
3099c965db44STomer Tayar 	/* Dump MCP registers */
3100c965db44STomer Tayar 	block_enable[BLOCK_MCP] = true;
3101c965db44STomer Tayar 	offset += qed_grc_dump_registers(p_hwfn,
3102c965db44STomer Tayar 					 p_ptt,
3103c965db44STomer Tayar 					 dump_buf + offset,
31042d22bc83SMichal Kalderon 					 dump, block_enable, "MCP");
3105c965db44STomer Tayar 
3106c965db44STomer Tayar 	/* Dump required non-MCP registers */
3107c965db44STomer Tayar 	offset += qed_grc_dump_regs_hdr(dump_buf + offset,
3108d52c89f1SMichal Kalderon 					dump, 1, SPLIT_TYPE_NONE, 0,
31092d22bc83SMichal Kalderon 					"MCP");
3110be086e7cSMintz, Yuval 	addr = BYTES_TO_DWORDS(MISC_REG_SHARED_MEM_ADDR);
3111c965db44STomer Tayar 	offset += qed_grc_dump_reg_entry(p_hwfn,
3112c965db44STomer Tayar 					 p_ptt,
3113c965db44STomer Tayar 					 dump_buf + offset,
3114c965db44STomer Tayar 					 dump,
3115be086e7cSMintz, Yuval 					 addr,
31167b6859fbSMintz, Yuval 					 1,
3117d52c89f1SMichal Kalderon 					 false, SPLIT_TYPE_NONE, 0);
3118c965db44STomer Tayar 
3119c965db44STomer Tayar 	/* Release MCP */
3120c965db44STomer Tayar 	if (halted && qed_mcp_resume(p_hwfn, p_ptt))
3121c965db44STomer Tayar 		DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n");
31227b6859fbSMintz, Yuval 
3123c965db44STomer Tayar 	return offset;
3124c965db44STomer Tayar }
3125c965db44STomer Tayar 
31262d22bc83SMichal Kalderon /* Dumps the tbus indirect memory for all PHYs.
31272d22bc83SMichal Kalderon  * Returns the dumped size in dwords.
31282d22bc83SMichal Kalderon  */
3129c965db44STomer Tayar static u32 qed_grc_dump_phy(struct qed_hwfn *p_hwfn,
3130c965db44STomer Tayar 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3131c965db44STomer Tayar {
3132c965db44STomer Tayar 	u32 offset = 0, tbus_lo_offset, tbus_hi_offset;
3133c965db44STomer Tayar 	char mem_name[32];
3134c965db44STomer Tayar 	u8 phy_id;
3135c965db44STomer Tayar 
3136c965db44STomer Tayar 	for (phy_id = 0; phy_id < ARRAY_SIZE(s_phy_defs); phy_id++) {
31377b6859fbSMintz, Yuval 		u32 addr_lo_addr, addr_hi_addr, data_lo_addr, data_hi_addr;
31387b6859fbSMintz, Yuval 		struct phy_defs *phy_defs;
31397b6859fbSMintz, Yuval 		u8 *bytes_buf;
3140c965db44STomer Tayar 
31417b6859fbSMintz, Yuval 		phy_defs = &s_phy_defs[phy_id];
31427b6859fbSMintz, Yuval 		addr_lo_addr = phy_defs->base_addr +
31437b6859fbSMintz, Yuval 			       phy_defs->tbus_addr_lo_addr;
31447b6859fbSMintz, Yuval 		addr_hi_addr = phy_defs->base_addr +
31457b6859fbSMintz, Yuval 			       phy_defs->tbus_addr_hi_addr;
31467b6859fbSMintz, Yuval 		data_lo_addr = phy_defs->base_addr +
31477b6859fbSMintz, Yuval 			       phy_defs->tbus_data_lo_addr;
31487b6859fbSMintz, Yuval 		data_hi_addr = phy_defs->base_addr +
31497b6859fbSMintz, Yuval 			       phy_defs->tbus_data_hi_addr;
31507b6859fbSMintz, Yuval 
31517b6859fbSMintz, Yuval 		if (snprintf(mem_name, sizeof(mem_name), "tbus_%s",
31527b6859fbSMintz, Yuval 			     phy_defs->phy_name) < 0)
3153c965db44STomer Tayar 			DP_NOTICE(p_hwfn,
3154c965db44STomer Tayar 				  "Unexpected debug error: invalid PHY memory name\n");
31557b6859fbSMintz, Yuval 
3156c965db44STomer Tayar 		offset += qed_grc_dump_mem_hdr(p_hwfn,
3157c965db44STomer Tayar 					       dump_buf + offset,
3158c965db44STomer Tayar 					       dump,
3159c965db44STomer Tayar 					       mem_name,
3160c965db44STomer Tayar 					       0,
3161c965db44STomer Tayar 					       PHY_DUMP_SIZE_DWORDS,
31622d22bc83SMichal Kalderon 					       16, true, mem_name, 0);
31637b6859fbSMintz, Yuval 
31647b6859fbSMintz, Yuval 		if (!dump) {
31657b6859fbSMintz, Yuval 			offset += PHY_DUMP_SIZE_DWORDS;
31667b6859fbSMintz, Yuval 			continue;
31677b6859fbSMintz, Yuval 		}
3168c965db44STomer Tayar 
3169da090917STomer Tayar 		bytes_buf = (u8 *)(dump_buf + offset);
3170c965db44STomer Tayar 		for (tbus_hi_offset = 0;
3171c965db44STomer Tayar 		     tbus_hi_offset < (NUM_PHY_TBUS_ADDRESSES >> 8);
3172c965db44STomer Tayar 		     tbus_hi_offset++) {
31737b6859fbSMintz, Yuval 			qed_wr(p_hwfn, p_ptt, addr_hi_addr, tbus_hi_offset);
3174c965db44STomer Tayar 			for (tbus_lo_offset = 0; tbus_lo_offset < 256;
3175c965db44STomer Tayar 			     tbus_lo_offset++) {
3176c965db44STomer Tayar 				qed_wr(p_hwfn,
31777b6859fbSMintz, Yuval 				       p_ptt, addr_lo_addr, tbus_lo_offset);
31787b6859fbSMintz, Yuval 				*(bytes_buf++) = (u8)qed_rd(p_hwfn,
3179c965db44STomer Tayar 							    p_ptt,
3180c965db44STomer Tayar 							    data_lo_addr);
31817b6859fbSMintz, Yuval 				*(bytes_buf++) = (u8)qed_rd(p_hwfn,
31827b6859fbSMintz, Yuval 							    p_ptt,
3183c965db44STomer Tayar 							    data_hi_addr);
3184c965db44STomer Tayar 			}
3185c965db44STomer Tayar 		}
3186c965db44STomer Tayar 
3187c965db44STomer Tayar 		offset += PHY_DUMP_SIZE_DWORDS;
3188c965db44STomer Tayar 	}
3189c965db44STomer Tayar 
3190c965db44STomer Tayar 	return offset;
3191c965db44STomer Tayar }
3192c965db44STomer Tayar 
31932d22bc83SMichal Kalderon static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn,
3194c965db44STomer Tayar 					    struct qed_ptt *p_ptt,
31952d22bc83SMichal Kalderon 					    u32 image_type,
31962d22bc83SMichal Kalderon 					    u32 *nvram_offset_bytes,
31972d22bc83SMichal Kalderon 					    u32 *nvram_size_bytes);
3198c965db44STomer Tayar 
31992d22bc83SMichal Kalderon static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn,
32002d22bc83SMichal Kalderon 				      struct qed_ptt *p_ptt,
32012d22bc83SMichal Kalderon 				      u32 nvram_offset_bytes,
32022d22bc83SMichal Kalderon 				      u32 nvram_size_bytes, u32 *ret_buf);
32032d22bc83SMichal Kalderon 
32042d22bc83SMichal Kalderon /* Dumps the MCP HW dump from NVRAM. Returns the dumped size in dwords. */
32052d22bc83SMichal Kalderon static u32 qed_grc_dump_mcp_hw_dump(struct qed_hwfn *p_hwfn,
32062d22bc83SMichal Kalderon 				    struct qed_ptt *p_ptt,
32072d22bc83SMichal Kalderon 				    u32 *dump_buf, bool dump)
32082d22bc83SMichal Kalderon {
32092d22bc83SMichal Kalderon 	u32 hw_dump_offset_bytes = 0, hw_dump_size_bytes = 0;
32102d22bc83SMichal Kalderon 	u32 hw_dump_size_dwords = 0, offset = 0;
32112d22bc83SMichal Kalderon 	enum dbg_status status;
32122d22bc83SMichal Kalderon 
32132d22bc83SMichal Kalderon 	/* Read HW dump image from NVRAM */
32142d22bc83SMichal Kalderon 	status = qed_find_nvram_image(p_hwfn,
32152d22bc83SMichal Kalderon 				      p_ptt,
32162d22bc83SMichal Kalderon 				      NVM_TYPE_HW_DUMP_OUT,
32172d22bc83SMichal Kalderon 				      &hw_dump_offset_bytes,
32182d22bc83SMichal Kalderon 				      &hw_dump_size_bytes);
32192d22bc83SMichal Kalderon 	if (status != DBG_STATUS_OK)
32202d22bc83SMichal Kalderon 		return 0;
32212d22bc83SMichal Kalderon 
32222d22bc83SMichal Kalderon 	hw_dump_size_dwords = BYTES_TO_DWORDS(hw_dump_size_bytes);
32232d22bc83SMichal Kalderon 
32242d22bc83SMichal Kalderon 	/* Dump HW dump image section */
32252d22bc83SMichal Kalderon 	offset += qed_dump_section_hdr(dump_buf + offset,
32262d22bc83SMichal Kalderon 				       dump, "mcp_hw_dump", 1);
32272d22bc83SMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
32282d22bc83SMichal Kalderon 				     dump, "size", hw_dump_size_dwords);
32292d22bc83SMichal Kalderon 
32302d22bc83SMichal Kalderon 	/* Read MCP HW dump image into dump buffer */
32312d22bc83SMichal Kalderon 	if (dump && hw_dump_size_dwords) {
32322d22bc83SMichal Kalderon 		status = qed_nvram_read(p_hwfn,
32332d22bc83SMichal Kalderon 					p_ptt,
32342d22bc83SMichal Kalderon 					hw_dump_offset_bytes,
32352d22bc83SMichal Kalderon 					hw_dump_size_bytes, dump_buf + offset);
32362d22bc83SMichal Kalderon 		if (status != DBG_STATUS_OK) {
32372d22bc83SMichal Kalderon 			DP_NOTICE(p_hwfn,
32382d22bc83SMichal Kalderon 				  "Failed to read MCP HW Dump image from NVRAM\n");
32392d22bc83SMichal Kalderon 			return 0;
32402d22bc83SMichal Kalderon 		}
32412d22bc83SMichal Kalderon 	}
32422d22bc83SMichal Kalderon 	offset += hw_dump_size_dwords;
32432d22bc83SMichal Kalderon 
32442d22bc83SMichal Kalderon 	return offset;
3245c965db44STomer Tayar }
3246c965db44STomer Tayar 
3247c965db44STomer Tayar /* Dumps Static Debug data. Returns the dumped size in dwords. */
3248c965db44STomer Tayar static u32 qed_grc_dump_static_debug(struct qed_hwfn *p_hwfn,
3249c965db44STomer Tayar 				     struct qed_ptt *p_ptt,
3250c965db44STomer Tayar 				     u32 *dump_buf, bool dump)
3251c965db44STomer Tayar {
3252c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
32532d22bc83SMichal Kalderon 	u32 block_id, line_id, offset = 0, addr, len;
32547b6859fbSMintz, Yuval 
3255da090917STomer Tayar 	/* Don't dump static debug if a debug bus recording is in progress */
3256da090917STomer Tayar 	if (dump && qed_rd(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON))
32577b6859fbSMintz, Yuval 		return 0;
3258c965db44STomer Tayar 
3259c965db44STomer Tayar 	if (dump) {
32602d22bc83SMichal Kalderon 		/* Disable debug bus in all blocks */
32612d22bc83SMichal Kalderon 		qed_bus_disable_blocks(p_hwfn, p_ptt);
3262c965db44STomer Tayar 
3263c965db44STomer Tayar 		qed_bus_reset_dbg_block(p_hwfn, p_ptt);
32642d22bc83SMichal Kalderon 		qed_wr(p_hwfn,
32652d22bc83SMichal Kalderon 		       p_ptt, DBG_REG_FRAMING_MODE, DBG_BUS_FRAME_MODE_8HW);
3266c965db44STomer Tayar 		qed_wr(p_hwfn,
3267c965db44STomer Tayar 		       p_ptt, DBG_REG_DEBUG_TARGET, DBG_BUS_TARGET_ID_INT_BUF);
3268c965db44STomer Tayar 		qed_wr(p_hwfn, p_ptt, DBG_REG_FULL_MODE, 1);
3269c965db44STomer Tayar 		qed_bus_enable_dbg_block(p_hwfn, p_ptt, true);
3270c965db44STomer Tayar 	}
3271c965db44STomer Tayar 
3272c965db44STomer Tayar 	/* Dump all static debug lines for each relevant block */
3273c965db44STomer Tayar 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
32742d22bc83SMichal Kalderon 		const struct dbg_block_chip *block_per_chip;
32752d22bc83SMichal Kalderon 		const struct dbg_block *block;
32762d22bc83SMichal Kalderon 		bool is_removed, has_dbg_bus;
32772d22bc83SMichal Kalderon 		u16 modes_buf_offset;
32782d22bc83SMichal Kalderon 		u32 block_dwords;
3279c965db44STomer Tayar 
32802d22bc83SMichal Kalderon 		block_per_chip =
32812d22bc83SMichal Kalderon 		    qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)block_id);
32822d22bc83SMichal Kalderon 		is_removed = GET_FIELD(block_per_chip->flags,
32832d22bc83SMichal Kalderon 				       DBG_BLOCK_CHIP_IS_REMOVED);
32842d22bc83SMichal Kalderon 		has_dbg_bus = GET_FIELD(block_per_chip->flags,
32852d22bc83SMichal Kalderon 					DBG_BLOCK_CHIP_HAS_DBG_BUS);
32862d22bc83SMichal Kalderon 
32872d22bc83SMichal Kalderon 		/* read+clear for NWS parity is not working, skip NWS block */
32882d22bc83SMichal Kalderon 		if (block_id == BLOCK_NWS)
3289c965db44STomer Tayar 			continue;
3290c965db44STomer Tayar 
32912d22bc83SMichal Kalderon 		if (!is_removed && has_dbg_bus &&
32922d22bc83SMichal Kalderon 		    GET_FIELD(block_per_chip->dbg_bus_mode.data,
32932d22bc83SMichal Kalderon 			      DBG_MODE_HDR_EVAL_MODE) > 0) {
32942d22bc83SMichal Kalderon 			modes_buf_offset =
32952d22bc83SMichal Kalderon 			    GET_FIELD(block_per_chip->dbg_bus_mode.data,
32962d22bc83SMichal Kalderon 				      DBG_MODE_HDR_MODES_BUF_OFFSET);
32972d22bc83SMichal Kalderon 			if (!qed_is_mode_match(p_hwfn, &modes_buf_offset))
32982d22bc83SMichal Kalderon 				has_dbg_bus = false;
32992d22bc83SMichal Kalderon 		}
33002d22bc83SMichal Kalderon 
33012d22bc83SMichal Kalderon 		if (is_removed || !has_dbg_bus)
33022d22bc83SMichal Kalderon 			continue;
33032d22bc83SMichal Kalderon 
33042d22bc83SMichal Kalderon 		block_dwords = NUM_DBG_LINES(block_per_chip) *
33057b6859fbSMintz, Yuval 			       STATIC_DEBUG_LINE_DWORDS;
33067b6859fbSMintz, Yuval 
3307c965db44STomer Tayar 		/* Dump static section params */
33082d22bc83SMichal Kalderon 		block = get_dbg_block(p_hwfn, (enum block_id)block_id);
3309c965db44STomer Tayar 		offset += qed_grc_dump_mem_hdr(p_hwfn,
3310c965db44STomer Tayar 					       dump_buf + offset,
3311c965db44STomer Tayar 					       dump,
33127b6859fbSMintz, Yuval 					       block->name,
33137b6859fbSMintz, Yuval 					       0,
33147b6859fbSMintz, Yuval 					       block_dwords,
33152d22bc83SMichal Kalderon 					       32, false, "STATIC", 0);
3316c965db44STomer Tayar 
33177b6859fbSMintz, Yuval 		if (!dump) {
33187b6859fbSMintz, Yuval 			offset += block_dwords;
33197b6859fbSMintz, Yuval 			continue;
33207b6859fbSMintz, Yuval 		}
33217b6859fbSMintz, Yuval 
33227b6859fbSMintz, Yuval 		/* If all lines are invalid - dump zeros */
33237b6859fbSMintz, Yuval 		if (dev_data->block_in_reset[block_id]) {
33247b6859fbSMintz, Yuval 			memset(dump_buf + offset, 0,
33257b6859fbSMintz, Yuval 			       DWORDS_TO_BYTES(block_dwords));
33267b6859fbSMintz, Yuval 			offset += block_dwords;
33277b6859fbSMintz, Yuval 			continue;
33287b6859fbSMintz, Yuval 		}
3329c965db44STomer Tayar 
3330c965db44STomer Tayar 		/* Enable block's client */
33317b6859fbSMintz, Yuval 		qed_bus_enable_clients(p_hwfn,
33327b6859fbSMintz, Yuval 				       p_ptt,
33332d22bc83SMichal Kalderon 				       BIT(block_per_chip->dbg_client_id));
3334c965db44STomer Tayar 
33357b6859fbSMintz, Yuval 		addr = BYTES_TO_DWORDS(DBG_REG_CALENDAR_OUT_DATA);
33367b6859fbSMintz, Yuval 		len = STATIC_DEBUG_LINE_DWORDS;
33372d22bc83SMichal Kalderon 		for (line_id = 0; line_id < (u32)NUM_DBG_LINES(block_per_chip);
3338c965db44STomer Tayar 		     line_id++) {
3339c965db44STomer Tayar 			/* Configure debug line ID */
33402d22bc83SMichal Kalderon 			qed_bus_config_dbg_line(p_hwfn,
3341c965db44STomer Tayar 						p_ptt,
3342c965db44STomer Tayar 						(enum block_id)block_id,
33437b6859fbSMintz, Yuval 						(u8)line_id, 0xf, 0, 0, 0);
3344c965db44STomer Tayar 
3345c965db44STomer Tayar 			/* Read debug line info */
33467b6859fbSMintz, Yuval 			offset += qed_grc_dump_addr_range(p_hwfn,
3347be086e7cSMintz, Yuval 							  p_ptt,
3348be086e7cSMintz, Yuval 							  dump_buf + offset,
3349be086e7cSMintz, Yuval 							  dump,
3350be086e7cSMintz, Yuval 							  addr,
33517b6859fbSMintz, Yuval 							  len,
3352d52c89f1SMichal Kalderon 							  true, SPLIT_TYPE_NONE,
3353d52c89f1SMichal Kalderon 							  0);
3354c965db44STomer Tayar 		}
3355c965db44STomer Tayar 
3356c965db44STomer Tayar 		/* Disable block's client and debug output */
3357c965db44STomer Tayar 		qed_bus_enable_clients(p_hwfn, p_ptt, 0);
33582d22bc83SMichal Kalderon 		qed_bus_config_dbg_line(p_hwfn, p_ptt,
33592d22bc83SMichal Kalderon 					(enum block_id)block_id, 0, 0, 0, 0, 0);
3360c965db44STomer Tayar 	}
3361c965db44STomer Tayar 
3362c965db44STomer Tayar 	if (dump) {
3363c965db44STomer Tayar 		qed_bus_enable_dbg_block(p_hwfn, p_ptt, false);
3364c965db44STomer Tayar 		qed_bus_enable_clients(p_hwfn, p_ptt, 0);
3365c965db44STomer Tayar 	}
3366c965db44STomer Tayar 
3367c965db44STomer Tayar 	return offset;
3368c965db44STomer Tayar }
3369c965db44STomer Tayar 
3370c965db44STomer Tayar /* Performs GRC Dump to the specified buffer.
3371c965db44STomer Tayar  * Returns the dumped size in dwords.
3372c965db44STomer Tayar  */
3373c965db44STomer Tayar static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn,
3374c965db44STomer Tayar 				    struct qed_ptt *p_ptt,
3375c965db44STomer Tayar 				    u32 *dump_buf,
3376c965db44STomer Tayar 				    bool dump, u32 *num_dumped_dwords)
3377c965db44STomer Tayar {
3378c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
33792d22bc83SMichal Kalderon 	u32 dwords_read, offset = 0;
3380c965db44STomer Tayar 	bool parities_masked = false;
3381d52c89f1SMichal Kalderon 	u8 i;
3382c965db44STomer Tayar 
3383c965db44STomer Tayar 	*num_dumped_dwords = 0;
3384d52c89f1SMichal Kalderon 	dev_data->num_regs_read = 0;
3385c965db44STomer Tayar 
3386c965db44STomer Tayar 	/* Update reset state */
3387d52c89f1SMichal Kalderon 	if (dump)
3388c965db44STomer Tayar 		qed_update_blocks_reset_state(p_hwfn, p_ptt);
3389c965db44STomer Tayar 
3390c965db44STomer Tayar 	/* Dump global params */
3391c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
3392c965db44STomer Tayar 						p_ptt,
3393c965db44STomer Tayar 						dump_buf + offset, dump, 4);
3394c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
3395c965db44STomer Tayar 				     dump, "dump-type", "grc-dump");
3396c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
3397c965db44STomer Tayar 				     dump,
3398c965db44STomer Tayar 				     "num-lcids",
33992d22bc83SMichal Kalderon 				     NUM_OF_LCIDS);
3400c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
3401c965db44STomer Tayar 				     dump,
3402c965db44STomer Tayar 				     "num-ltids",
34032d22bc83SMichal Kalderon 				     NUM_OF_LTIDS);
3404c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
3405d52c89f1SMichal Kalderon 				     dump, "num-ports", dev_data->num_ports);
3406c965db44STomer Tayar 
3407c965db44STomer Tayar 	/* Dump reset registers (dumped before taking blocks out of reset ) */
3408c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS))
3409c965db44STomer Tayar 		offset += qed_grc_dump_reset_regs(p_hwfn,
3410c965db44STomer Tayar 						  p_ptt,
3411c965db44STomer Tayar 						  dump_buf + offset, dump);
3412c965db44STomer Tayar 
3413c965db44STomer Tayar 	/* Take all blocks out of reset (using reset registers) */
3414c965db44STomer Tayar 	if (dump) {
34152d22bc83SMichal Kalderon 		qed_grc_unreset_blocks(p_hwfn, p_ptt, false);
3416c965db44STomer Tayar 		qed_update_blocks_reset_state(p_hwfn, p_ptt);
3417c965db44STomer Tayar 	}
3418c965db44STomer Tayar 
3419c965db44STomer Tayar 	/* Disable all parities using MFW command */
34207b6859fbSMintz, Yuval 	if (dump &&
34217b6859fbSMintz, Yuval 	    !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) {
3422c965db44STomer Tayar 		parities_masked = !qed_mcp_mask_parities(p_hwfn, p_ptt, 1);
3423c965db44STomer Tayar 		if (!parities_masked) {
3424be086e7cSMintz, Yuval 			DP_NOTICE(p_hwfn,
3425be086e7cSMintz, Yuval 				  "Failed to mask parities using MFW\n");
3426c965db44STomer Tayar 			if (qed_grc_get_param
3427c965db44STomer Tayar 			    (p_hwfn, DBG_GRC_PARAM_PARITY_SAFE))
3428c965db44STomer Tayar 				return DBG_STATUS_MCP_COULD_NOT_MASK_PRTY;
3429c965db44STomer Tayar 		}
3430c965db44STomer Tayar 	}
3431c965db44STomer Tayar 
3432c965db44STomer Tayar 	/* Dump modified registers (dumped before modifying them) */
3433c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS))
3434c965db44STomer Tayar 		offset += qed_grc_dump_modified_regs(p_hwfn,
3435c965db44STomer Tayar 						     p_ptt,
3436c965db44STomer Tayar 						     dump_buf + offset, dump);
3437c965db44STomer Tayar 
3438c965db44STomer Tayar 	/* Stall storms */
3439c965db44STomer Tayar 	if (dump &&
3440c965db44STomer Tayar 	    (qed_grc_is_included(p_hwfn,
3441c965db44STomer Tayar 				 DBG_GRC_PARAM_DUMP_IOR) ||
3442c965db44STomer Tayar 	     qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)))
3443c965db44STomer Tayar 		qed_grc_stall_storms(p_hwfn, p_ptt, true);
3444c965db44STomer Tayar 
3445c965db44STomer Tayar 	/* Dump all regs  */
3446c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) {
3447c965db44STomer Tayar 		bool block_enable[MAX_BLOCK_ID];
3448c965db44STomer Tayar 
34497b6859fbSMintz, Yuval 		/* Dump all blocks except MCP */
3450c965db44STomer Tayar 		for (i = 0; i < MAX_BLOCK_ID; i++)
3451c965db44STomer Tayar 			block_enable[i] = true;
3452c965db44STomer Tayar 		block_enable[BLOCK_MCP] = false;
3453c965db44STomer Tayar 		offset += qed_grc_dump_registers(p_hwfn,
3454c965db44STomer Tayar 						 p_ptt,
3455c965db44STomer Tayar 						 dump_buf +
3456c965db44STomer Tayar 						 offset,
3457c965db44STomer Tayar 						 dump,
34582d22bc83SMichal Kalderon 						 block_enable, NULL);
3459be086e7cSMintz, Yuval 
3460be086e7cSMintz, Yuval 		/* Dump special registers */
3461be086e7cSMintz, Yuval 		offset += qed_grc_dump_special_regs(p_hwfn,
3462be086e7cSMintz, Yuval 						    p_ptt,
3463be086e7cSMintz, Yuval 						    dump_buf + offset, dump);
3464c965db44STomer Tayar 	}
3465c965db44STomer Tayar 
3466c965db44STomer Tayar 	/* Dump memories */
3467c965db44STomer Tayar 	offset += qed_grc_dump_memories(p_hwfn, p_ptt, dump_buf + offset, dump);
3468c965db44STomer Tayar 
3469c965db44STomer Tayar 	/* Dump MCP */
3470c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP))
3471c965db44STomer Tayar 		offset += qed_grc_dump_mcp(p_hwfn,
3472c965db44STomer Tayar 					   p_ptt, dump_buf + offset, dump);
3473c965db44STomer Tayar 
3474c965db44STomer Tayar 	/* Dump context */
3475c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX))
3476c965db44STomer Tayar 		offset += qed_grc_dump_ctx(p_hwfn,
3477c965db44STomer Tayar 					   p_ptt, dump_buf + offset, dump);
3478c965db44STomer Tayar 
3479c965db44STomer Tayar 	/* Dump RSS memories */
3480c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RSS))
3481c965db44STomer Tayar 		offset += qed_grc_dump_rss(p_hwfn,
3482c965db44STomer Tayar 					   p_ptt, dump_buf + offset, dump);
3483c965db44STomer Tayar 
3484c965db44STomer Tayar 	/* Dump Big RAM */
3485c965db44STomer Tayar 	for (i = 0; i < NUM_BIG_RAM_TYPES; i++)
3486c965db44STomer Tayar 		if (qed_grc_is_included(p_hwfn, s_big_ram_defs[i].grc_param))
3487c965db44STomer Tayar 			offset += qed_grc_dump_big_ram(p_hwfn,
3488c965db44STomer Tayar 						       p_ptt,
3489c965db44STomer Tayar 						       dump_buf + offset,
3490c965db44STomer Tayar 						       dump, i);
3491c965db44STomer Tayar 
3492c965db44STomer Tayar 	/* Dump VFC */
34932d22bc83SMichal Kalderon 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)) {
34942d22bc83SMichal Kalderon 		dwords_read = qed_grc_dump_vfc(p_hwfn,
3495c965db44STomer Tayar 					       p_ptt, dump_buf + offset, dump);
34962d22bc83SMichal Kalderon 		offset += dwords_read;
34972d22bc83SMichal Kalderon 		if (!dwords_read)
34982d22bc83SMichal Kalderon 			return DBG_STATUS_VFC_READ_ERROR;
34992d22bc83SMichal Kalderon 	}
3500c965db44STomer Tayar 
3501c965db44STomer Tayar 	/* Dump PHY tbus */
3502c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn,
3503c965db44STomer Tayar 				DBG_GRC_PARAM_DUMP_PHY) && dev_data->chip_id ==
35042d22bc83SMichal Kalderon 	    CHIP_K2 && dev_data->hw_type == HW_TYPE_ASIC)
3505c965db44STomer Tayar 		offset += qed_grc_dump_phy(p_hwfn,
3506c965db44STomer Tayar 					   p_ptt, dump_buf + offset, dump);
3507c965db44STomer Tayar 
35082d22bc83SMichal Kalderon 	/* Dump MCP HW Dump */
35092d22bc83SMichal Kalderon 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP_HW_DUMP) &&
35102d22bc83SMichal Kalderon 	    !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP) && 1)
35112d22bc83SMichal Kalderon 		offset += qed_grc_dump_mcp_hw_dump(p_hwfn,
35122d22bc83SMichal Kalderon 						   p_ptt,
35132d22bc83SMichal Kalderon 						   dump_buf + offset, dump);
35142d22bc83SMichal Kalderon 
3515d52c89f1SMichal Kalderon 	/* Dump static debug data (only if not during debug bus recording) */
3516c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn,
3517c965db44STomer Tayar 				DBG_GRC_PARAM_DUMP_STATIC) &&
3518d52c89f1SMichal Kalderon 	    (!dump || dev_data->bus.state == DBG_BUS_STATE_IDLE))
3519c965db44STomer Tayar 		offset += qed_grc_dump_static_debug(p_hwfn,
3520c965db44STomer Tayar 						    p_ptt,
3521c965db44STomer Tayar 						    dump_buf + offset, dump);
3522c965db44STomer Tayar 
3523c965db44STomer Tayar 	/* Dump last section */
3524da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
35257b6859fbSMintz, Yuval 
3526c965db44STomer Tayar 	if (dump) {
3527c965db44STomer Tayar 		/* Unstall storms */
3528c965db44STomer Tayar 		if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_UNSTALL))
3529c965db44STomer Tayar 			qed_grc_stall_storms(p_hwfn, p_ptt, false);
3530c965db44STomer Tayar 
3531c965db44STomer Tayar 		/* Clear parity status */
3532c965db44STomer Tayar 		qed_grc_clear_all_prty(p_hwfn, p_ptt);
3533c965db44STomer Tayar 
3534c965db44STomer Tayar 		/* Enable all parities using MFW command */
3535c965db44STomer Tayar 		if (parities_masked)
3536c965db44STomer Tayar 			qed_mcp_mask_parities(p_hwfn, p_ptt, 0);
3537c965db44STomer Tayar 	}
3538c965db44STomer Tayar 
3539c965db44STomer Tayar 	*num_dumped_dwords = offset;
3540c965db44STomer Tayar 
3541c965db44STomer Tayar 	return DBG_STATUS_OK;
3542c965db44STomer Tayar }
3543c965db44STomer Tayar 
3544c965db44STomer Tayar /* Writes the specified failing Idle Check rule to the specified buffer.
3545c965db44STomer Tayar  * Returns the dumped size in dwords.
3546c965db44STomer Tayar  */
3547c965db44STomer Tayar static u32 qed_idle_chk_dump_failure(struct qed_hwfn *p_hwfn,
3548c965db44STomer Tayar 				     struct qed_ptt *p_ptt,
3549c965db44STomer Tayar 				     u32 *
3550c965db44STomer Tayar 				     dump_buf,
3551c965db44STomer Tayar 				     bool dump,
3552c965db44STomer Tayar 				     u16 rule_id,
3553c965db44STomer Tayar 				     const struct dbg_idle_chk_rule *rule,
3554c965db44STomer Tayar 				     u16 fail_entry_id, u32 *cond_reg_values)
3555c965db44STomer Tayar {
3556c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
35577b6859fbSMintz, Yuval 	const struct dbg_idle_chk_cond_reg *cond_regs;
35587b6859fbSMintz, Yuval 	const struct dbg_idle_chk_info_reg *info_regs;
35597b6859fbSMintz, Yuval 	u32 i, next_reg_offset = 0, offset = 0;
35607b6859fbSMintz, Yuval 	struct dbg_idle_chk_result_hdr *hdr;
35617b6859fbSMintz, Yuval 	const union dbg_idle_chk_reg *regs;
3562c965db44STomer Tayar 	u8 reg_id;
3563c965db44STomer Tayar 
35647b6859fbSMintz, Yuval 	hdr = (struct dbg_idle_chk_result_hdr *)dump_buf;
35652d22bc83SMichal Kalderon 	regs = (const union dbg_idle_chk_reg *)
35662d22bc83SMichal Kalderon 		p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr +
35672d22bc83SMichal Kalderon 		rule->reg_offset;
35687b6859fbSMintz, Yuval 	cond_regs = &regs[0].cond_reg;
35697b6859fbSMintz, Yuval 	info_regs = &regs[rule->num_cond_regs].info_reg;
35707b6859fbSMintz, Yuval 
3571c965db44STomer Tayar 	/* Dump rule data */
3572c965db44STomer Tayar 	if (dump) {
3573c965db44STomer Tayar 		memset(hdr, 0, sizeof(*hdr));
3574c965db44STomer Tayar 		hdr->rule_id = rule_id;
3575c965db44STomer Tayar 		hdr->mem_entry_id = fail_entry_id;
3576c965db44STomer Tayar 		hdr->severity = rule->severity;
3577c965db44STomer Tayar 		hdr->num_dumped_cond_regs = rule->num_cond_regs;
3578c965db44STomer Tayar 	}
3579c965db44STomer Tayar 
3580c965db44STomer Tayar 	offset += IDLE_CHK_RESULT_HDR_DWORDS;
3581c965db44STomer Tayar 
3582c965db44STomer Tayar 	/* Dump condition register values */
3583c965db44STomer Tayar 	for (reg_id = 0; reg_id < rule->num_cond_regs; reg_id++) {
3584c965db44STomer Tayar 		const struct dbg_idle_chk_cond_reg *reg = &cond_regs[reg_id];
35857b6859fbSMintz, Yuval 		struct dbg_idle_chk_result_reg_hdr *reg_hdr;
35867b6859fbSMintz, Yuval 
35872d22bc83SMichal Kalderon 		reg_hdr =
35882d22bc83SMichal Kalderon 		    (struct dbg_idle_chk_result_reg_hdr *)(dump_buf + offset);
3589c965db44STomer Tayar 
3590c965db44STomer Tayar 		/* Write register header */
35917b6859fbSMintz, Yuval 		if (!dump) {
35927b6859fbSMintz, Yuval 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS +
35937b6859fbSMintz, Yuval 			    reg->entry_size;
35947b6859fbSMintz, Yuval 			continue;
35957b6859fbSMintz, Yuval 		}
35967b6859fbSMintz, Yuval 
3597c965db44STomer Tayar 		offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
35987b6859fbSMintz, Yuval 		memset(reg_hdr, 0, sizeof(*reg_hdr));
3599c965db44STomer Tayar 		reg_hdr->start_entry = reg->start_entry;
3600c965db44STomer Tayar 		reg_hdr->size = reg->entry_size;
3601c965db44STomer Tayar 		SET_FIELD(reg_hdr->data,
3602c965db44STomer Tayar 			  DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM,
36037b6859fbSMintz, Yuval 			  reg->num_entries > 1 || reg->start_entry > 0 ? 1 : 0);
3604c965db44STomer Tayar 		SET_FIELD(reg_hdr->data,
3605c965db44STomer Tayar 			  DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, reg_id);
3606c965db44STomer Tayar 
3607c965db44STomer Tayar 		/* Write register values */
36087b6859fbSMintz, Yuval 		for (i = 0; i < reg_hdr->size; i++, next_reg_offset++, offset++)
36097b6859fbSMintz, Yuval 			dump_buf[offset] = cond_reg_values[next_reg_offset];
3610c965db44STomer Tayar 	}
3611c965db44STomer Tayar 
3612c965db44STomer Tayar 	/* Dump info register values */
3613c965db44STomer Tayar 	for (reg_id = 0; reg_id < rule->num_info_regs; reg_id++) {
3614c965db44STomer Tayar 		const struct dbg_idle_chk_info_reg *reg = &info_regs[reg_id];
3615c965db44STomer Tayar 		u32 block_id;
3616c965db44STomer Tayar 
36177b6859fbSMintz, Yuval 		/* Check if register's block is in reset */
3618c965db44STomer Tayar 		if (!dump) {
3619c965db44STomer Tayar 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + reg->size;
3620c965db44STomer Tayar 			continue;
3621c965db44STomer Tayar 		}
3622c965db44STomer Tayar 
3623c965db44STomer Tayar 		block_id = GET_FIELD(reg->data, DBG_IDLE_CHK_INFO_REG_BLOCK_ID);
3624c965db44STomer Tayar 		if (block_id >= MAX_BLOCK_ID) {
3625c965db44STomer Tayar 			DP_NOTICE(p_hwfn, "Invalid block_id\n");
3626c965db44STomer Tayar 			return 0;
3627c965db44STomer Tayar 		}
3628c965db44STomer Tayar 
3629c965db44STomer Tayar 		if (!dev_data->block_in_reset[block_id]) {
36307b6859fbSMintz, Yuval 			struct dbg_idle_chk_result_reg_hdr *reg_hdr;
36317b6859fbSMintz, Yuval 			bool wide_bus, eval_mode, mode_match = true;
36327b6859fbSMintz, Yuval 			u16 modes_buf_offset;
36337b6859fbSMintz, Yuval 			u32 addr;
36347b6859fbSMintz, Yuval 
36357b6859fbSMintz, Yuval 			reg_hdr = (struct dbg_idle_chk_result_reg_hdr *)
36367b6859fbSMintz, Yuval 				  (dump_buf + offset);
3637c965db44STomer Tayar 
3638c965db44STomer Tayar 			/* Check mode */
36397b6859fbSMintz, Yuval 			eval_mode = GET_FIELD(reg->mode.data,
36407b6859fbSMintz, Yuval 					      DBG_MODE_HDR_EVAL_MODE) > 0;
3641c965db44STomer Tayar 			if (eval_mode) {
36427b6859fbSMintz, Yuval 				modes_buf_offset =
3643c965db44STomer Tayar 				    GET_FIELD(reg->mode.data,
3644c965db44STomer Tayar 					      DBG_MODE_HDR_MODES_BUF_OFFSET);
3645c965db44STomer Tayar 				mode_match =
3646c965db44STomer Tayar 					qed_is_mode_match(p_hwfn,
3647c965db44STomer Tayar 							  &modes_buf_offset);
3648c965db44STomer Tayar 			}
3649c965db44STomer Tayar 
36507b6859fbSMintz, Yuval 			if (!mode_match)
36517b6859fbSMintz, Yuval 				continue;
36527b6859fbSMintz, Yuval 
36537b6859fbSMintz, Yuval 			addr = GET_FIELD(reg->data,
3654be086e7cSMintz, Yuval 					 DBG_IDLE_CHK_INFO_REG_ADDRESS);
36557b6859fbSMintz, Yuval 			wide_bus = GET_FIELD(reg->data,
36567b6859fbSMintz, Yuval 					     DBG_IDLE_CHK_INFO_REG_WIDE_BUS);
3657c965db44STomer Tayar 
3658c965db44STomer Tayar 			/* Write register header */
3659c965db44STomer Tayar 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
3660c965db44STomer Tayar 			hdr->num_dumped_info_regs++;
3661c965db44STomer Tayar 			memset(reg_hdr, 0, sizeof(*reg_hdr));
3662c965db44STomer Tayar 			reg_hdr->size = reg->size;
3663c965db44STomer Tayar 			SET_FIELD(reg_hdr->data,
3664c965db44STomer Tayar 				  DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID,
3665c965db44STomer Tayar 				  rule->num_cond_regs + reg_id);
3666c965db44STomer Tayar 
3667c965db44STomer Tayar 			/* Write register values */
36687b6859fbSMintz, Yuval 			offset += qed_grc_dump_addr_range(p_hwfn,
3669be086e7cSMintz, Yuval 							  p_ptt,
3670be086e7cSMintz, Yuval 							  dump_buf + offset,
3671be086e7cSMintz, Yuval 							  dump,
3672be086e7cSMintz, Yuval 							  addr,
3673d52c89f1SMichal Kalderon 							  reg->size, wide_bus,
3674d52c89f1SMichal Kalderon 							  SPLIT_TYPE_NONE, 0);
3675c965db44STomer Tayar 		}
3676c965db44STomer Tayar 	}
3677c965db44STomer Tayar 
3678c965db44STomer Tayar 	return offset;
3679c965db44STomer Tayar }
3680c965db44STomer Tayar 
3681c965db44STomer Tayar /* Dumps idle check rule entries. Returns the dumped size in dwords. */
3682c965db44STomer Tayar static u32
3683c965db44STomer Tayar qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
3684c965db44STomer Tayar 			       u32 *dump_buf, bool dump,
3685c965db44STomer Tayar 			       const struct dbg_idle_chk_rule *input_rules,
3686c965db44STomer Tayar 			       u32 num_input_rules, u32 *num_failing_rules)
3687c965db44STomer Tayar {
3688c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3689c965db44STomer Tayar 	u32 cond_reg_values[IDLE_CHK_MAX_ENTRIES_SIZE];
3690be086e7cSMintz, Yuval 	u32 i, offset = 0;
3691c965db44STomer Tayar 	u16 entry_id;
3692c965db44STomer Tayar 	u8 reg_id;
3693c965db44STomer Tayar 
3694c965db44STomer Tayar 	*num_failing_rules = 0;
36957b6859fbSMintz, Yuval 
3696c965db44STomer Tayar 	for (i = 0; i < num_input_rules; i++) {
3697c965db44STomer Tayar 		const struct dbg_idle_chk_cond_reg *cond_regs;
3698c965db44STomer Tayar 		const struct dbg_idle_chk_rule *rule;
3699c965db44STomer Tayar 		const union dbg_idle_chk_reg *regs;
3700c965db44STomer Tayar 		u16 num_reg_entries = 1;
3701c965db44STomer Tayar 		bool check_rule = true;
3702c965db44STomer Tayar 		const u32 *imm_values;
3703c965db44STomer Tayar 
3704c965db44STomer Tayar 		rule = &input_rules[i];
37052d22bc83SMichal Kalderon 		regs = (const union dbg_idle_chk_reg *)
37062d22bc83SMichal Kalderon 			p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr +
37072d22bc83SMichal Kalderon 			rule->reg_offset;
3708c965db44STomer Tayar 		cond_regs = &regs[0].cond_reg;
37092d22bc83SMichal Kalderon 		imm_values =
37102d22bc83SMichal Kalderon 		    (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr +
37112d22bc83SMichal Kalderon 		    rule->imm_offset;
3712c965db44STomer Tayar 
3713c965db44STomer Tayar 		/* Check if all condition register blocks are out of reset, and
3714c965db44STomer Tayar 		 * find maximal number of entries (all condition registers that
3715c965db44STomer Tayar 		 * are memories must have the same size, which is > 1).
3716c965db44STomer Tayar 		 */
3717c965db44STomer Tayar 		for (reg_id = 0; reg_id < rule->num_cond_regs && check_rule;
3718c965db44STomer Tayar 		     reg_id++) {
37197b6859fbSMintz, Yuval 			u32 block_id =
37207b6859fbSMintz, Yuval 				GET_FIELD(cond_regs[reg_id].data,
3721c965db44STomer Tayar 					  DBG_IDLE_CHK_COND_REG_BLOCK_ID);
3722c965db44STomer Tayar 
3723c965db44STomer Tayar 			if (block_id >= MAX_BLOCK_ID) {
3724c965db44STomer Tayar 				DP_NOTICE(p_hwfn, "Invalid block_id\n");
3725c965db44STomer Tayar 				return 0;
3726c965db44STomer Tayar 			}
3727c965db44STomer Tayar 
3728c965db44STomer Tayar 			check_rule = !dev_data->block_in_reset[block_id];
3729c965db44STomer Tayar 			if (cond_regs[reg_id].num_entries > num_reg_entries)
3730c965db44STomer Tayar 				num_reg_entries = cond_regs[reg_id].num_entries;
3731c965db44STomer Tayar 		}
3732c965db44STomer Tayar 
3733c965db44STomer Tayar 		if (!check_rule && dump)
3734c965db44STomer Tayar 			continue;
3735c965db44STomer Tayar 
3736be086e7cSMintz, Yuval 		if (!dump) {
3737da090917STomer Tayar 			u32 entry_dump_size =
3738da090917STomer Tayar 				qed_idle_chk_dump_failure(p_hwfn,
3739be086e7cSMintz, Yuval 							  p_ptt,
3740be086e7cSMintz, Yuval 							  dump_buf + offset,
3741be086e7cSMintz, Yuval 							  false,
3742be086e7cSMintz, Yuval 							  rule->rule_id,
3743be086e7cSMintz, Yuval 							  rule,
3744da090917STomer Tayar 							  0,
3745be086e7cSMintz, Yuval 							  NULL);
3746da090917STomer Tayar 
3747da090917STomer Tayar 			offset += num_reg_entries * entry_dump_size;
3748da090917STomer Tayar 			(*num_failing_rules) += num_reg_entries;
3749da090917STomer Tayar 			continue;
3750be086e7cSMintz, Yuval 		}
3751be086e7cSMintz, Yuval 
3752da090917STomer Tayar 		/* Go over all register entries (number of entries is the same
3753da090917STomer Tayar 		 * for all condition registers).
3754da090917STomer Tayar 		 */
3755da090917STomer Tayar 		for (entry_id = 0; entry_id < num_reg_entries; entry_id++) {
3756da090917STomer Tayar 			u32 next_reg_offset = 0;
3757da090917STomer Tayar 
3758c965db44STomer Tayar 			/* Read current entry of all condition registers */
3759be086e7cSMintz, Yuval 			for (reg_id = 0; reg_id < rule->num_cond_regs;
3760c965db44STomer Tayar 			     reg_id++) {
3761be086e7cSMintz, Yuval 				const struct dbg_idle_chk_cond_reg *reg =
3762be086e7cSMintz, Yuval 					&cond_regs[reg_id];
37637b6859fbSMintz, Yuval 				u32 padded_entry_size, addr;
37647b6859fbSMintz, Yuval 				bool wide_bus;
3765c965db44STomer Tayar 
3766be086e7cSMintz, Yuval 				/* Find GRC address (if it's a memory, the
3767be086e7cSMintz, Yuval 				 * address of the specific entry is calculated).
3768c965db44STomer Tayar 				 */
37697b6859fbSMintz, Yuval 				addr = GET_FIELD(reg->data,
3770be086e7cSMintz, Yuval 						 DBG_IDLE_CHK_COND_REG_ADDRESS);
37717b6859fbSMintz, Yuval 				wide_bus =
37727b6859fbSMintz, Yuval 				    GET_FIELD(reg->data,
37737b6859fbSMintz, Yuval 					      DBG_IDLE_CHK_COND_REG_WIDE_BUS);
3774c965db44STomer Tayar 				if (reg->num_entries > 1 ||
3775c965db44STomer Tayar 				    reg->start_entry > 0) {
37767b6859fbSMintz, Yuval 					padded_entry_size =
3777c965db44STomer Tayar 					   reg->entry_size > 1 ?
3778da090917STomer Tayar 					   roundup_pow_of_two(reg->entry_size) :
3779da090917STomer Tayar 					   1;
3780be086e7cSMintz, Yuval 					addr += (reg->start_entry + entry_id) *
3781be086e7cSMintz, Yuval 						padded_entry_size;
3782c965db44STomer Tayar 				}
3783c965db44STomer Tayar 
3784c965db44STomer Tayar 				/* Read registers */
3785c965db44STomer Tayar 				if (next_reg_offset + reg->entry_size >=
3786c965db44STomer Tayar 				    IDLE_CHK_MAX_ENTRIES_SIZE) {
3787c965db44STomer Tayar 					DP_NOTICE(p_hwfn,
3788c965db44STomer Tayar 						  "idle check registers entry is too large\n");
3789c965db44STomer Tayar 					return 0;
3790c965db44STomer Tayar 				}
3791c965db44STomer Tayar 
3792be086e7cSMintz, Yuval 				next_reg_offset +=
37937b6859fbSMintz, Yuval 				    qed_grc_dump_addr_range(p_hwfn, p_ptt,
3794be086e7cSMintz, Yuval 							    cond_reg_values +
3795be086e7cSMintz, Yuval 							    next_reg_offset,
3796be086e7cSMintz, Yuval 							    dump, addr,
37977b6859fbSMintz, Yuval 							    reg->entry_size,
3798d52c89f1SMichal Kalderon 							    wide_bus,
3799d52c89f1SMichal Kalderon 							    SPLIT_TYPE_NONE, 0);
3800c965db44STomer Tayar 			}
3801c965db44STomer Tayar 
38027b6859fbSMintz, Yuval 			/* Call rule condition function.
38037b6859fbSMintz, Yuval 			 * If returns true, it's a failure.
3804c965db44STomer Tayar 			 */
3805c965db44STomer Tayar 			if ((*cond_arr[rule->cond_id]) (cond_reg_values,
3806be086e7cSMintz, Yuval 							imm_values)) {
38077b6859fbSMintz, Yuval 				offset += qed_idle_chk_dump_failure(p_hwfn,
3808c965db44STomer Tayar 							p_ptt,
3809c965db44STomer Tayar 							dump_buf + offset,
3810c965db44STomer Tayar 							dump,
3811c965db44STomer Tayar 							rule->rule_id,
3812c965db44STomer Tayar 							rule,
3813c965db44STomer Tayar 							entry_id,
3814c965db44STomer Tayar 							cond_reg_values);
3815c965db44STomer Tayar 				(*num_failing_rules)++;
3816c965db44STomer Tayar 			}
3817c965db44STomer Tayar 		}
3818c965db44STomer Tayar 	}
3819c965db44STomer Tayar 
3820c965db44STomer Tayar 	return offset;
3821c965db44STomer Tayar }
3822c965db44STomer Tayar 
3823c965db44STomer Tayar /* Performs Idle Check Dump to the specified buffer.
3824c965db44STomer Tayar  * Returns the dumped size in dwords.
3825c965db44STomer Tayar  */
3826c965db44STomer Tayar static u32 qed_idle_chk_dump(struct qed_hwfn *p_hwfn,
3827c965db44STomer Tayar 			     struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3828c965db44STomer Tayar {
38292d22bc83SMichal Kalderon 	struct virt_mem_desc *dbg_buf =
38302d22bc83SMichal Kalderon 	    &p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES];
38312d22bc83SMichal Kalderon 	u32 num_failing_rules_offset, offset = 0,
38322d22bc83SMichal Kalderon 	    input_offset = 0, num_failing_rules = 0;
3833c965db44STomer Tayar 
38342d22bc83SMichal Kalderon 	/* Dump global params  - 1 must match below amount of params */
3835c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
3836c965db44STomer Tayar 						p_ptt,
3837c965db44STomer Tayar 						dump_buf + offset, dump, 1);
3838c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
3839c965db44STomer Tayar 				     dump, "dump-type", "idle-chk");
3840c965db44STomer Tayar 
3841c965db44STomer Tayar 	/* Dump idle check section header with a single parameter */
3842c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset, dump, "idle_chk", 1);
3843c965db44STomer Tayar 	num_failing_rules_offset = offset;
3844c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset, dump, "num_rules", 0);
38457b6859fbSMintz, Yuval 
38462d22bc83SMichal Kalderon 	while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
3847c965db44STomer Tayar 		const struct dbg_idle_chk_cond_hdr *cond_hdr =
38482d22bc83SMichal Kalderon 		    (const struct dbg_idle_chk_cond_hdr *)dbg_buf->ptr +
38492d22bc83SMichal Kalderon 		    input_offset++;
38507b6859fbSMintz, Yuval 		bool eval_mode, mode_match = true;
38517b6859fbSMintz, Yuval 		u32 curr_failing_rules;
38527b6859fbSMintz, Yuval 		u16 modes_buf_offset;
3853c965db44STomer Tayar 
3854c965db44STomer Tayar 		/* Check mode */
38557b6859fbSMintz, Yuval 		eval_mode = GET_FIELD(cond_hdr->mode.data,
38567b6859fbSMintz, Yuval 				      DBG_MODE_HDR_EVAL_MODE) > 0;
3857c965db44STomer Tayar 		if (eval_mode) {
38587b6859fbSMintz, Yuval 			modes_buf_offset =
3859c965db44STomer Tayar 				GET_FIELD(cond_hdr->mode.data,
3860c965db44STomer Tayar 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
3861c965db44STomer Tayar 			mode_match = qed_is_mode_match(p_hwfn,
3862c965db44STomer Tayar 						       &modes_buf_offset);
3863c965db44STomer Tayar 		}
3864c965db44STomer Tayar 
3865c965db44STomer Tayar 		if (mode_match) {
38662d22bc83SMichal Kalderon 			const struct dbg_idle_chk_rule *rule =
38672d22bc83SMichal Kalderon 			    (const struct dbg_idle_chk_rule *)((u32 *)
38682d22bc83SMichal Kalderon 							       dbg_buf->ptr
38692d22bc83SMichal Kalderon 							       + input_offset);
38702d22bc83SMichal Kalderon 			u32 num_input_rules =
38712d22bc83SMichal Kalderon 				cond_hdr->data_size / IDLE_CHK_RULE_SIZE_DWORDS;
3872c965db44STomer Tayar 			offset +=
3873c965db44STomer Tayar 			    qed_idle_chk_dump_rule_entries(p_hwfn,
3874c965db44STomer Tayar 							   p_ptt,
38752d22bc83SMichal Kalderon 							   dump_buf +
38762d22bc83SMichal Kalderon 							   offset,
3877c965db44STomer Tayar 							   dump,
38782d22bc83SMichal Kalderon 							   rule,
38792d22bc83SMichal Kalderon 							   num_input_rules,
3880c965db44STomer Tayar 							   &curr_failing_rules);
3881c965db44STomer Tayar 			num_failing_rules += curr_failing_rules;
3882c965db44STomer Tayar 		}
3883c965db44STomer Tayar 
3884c965db44STomer Tayar 		input_offset += cond_hdr->data_size;
3885c965db44STomer Tayar 	}
3886c965db44STomer Tayar 
3887c965db44STomer Tayar 	/* Overwrite num_rules parameter */
3888c965db44STomer Tayar 	if (dump)
3889c965db44STomer Tayar 		qed_dump_num_param(dump_buf + num_failing_rules_offset,
3890c965db44STomer Tayar 				   dump, "num_rules", num_failing_rules);
3891c965db44STomer Tayar 
38927b6859fbSMintz, Yuval 	/* Dump last section */
3893da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
38947b6859fbSMintz, Yuval 
3895c965db44STomer Tayar 	return offset;
3896c965db44STomer Tayar }
3897c965db44STomer Tayar 
38987b6859fbSMintz, Yuval /* Finds the meta data image in NVRAM */
3899c965db44STomer Tayar static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn,
3900c965db44STomer Tayar 					    struct qed_ptt *p_ptt,
3901c965db44STomer Tayar 					    u32 image_type,
3902c965db44STomer Tayar 					    u32 *nvram_offset_bytes,
3903c965db44STomer Tayar 					    u32 *nvram_size_bytes)
3904c965db44STomer Tayar {
3905c965db44STomer Tayar 	u32 ret_mcp_resp, ret_mcp_param, ret_txn_size;
3906c965db44STomer Tayar 	struct mcp_file_att file_att;
39077b6859fbSMintz, Yuval 	int nvm_result;
3908c965db44STomer Tayar 
3909c965db44STomer Tayar 	/* Call NVRAM get file command */
39107b6859fbSMintz, Yuval 	nvm_result = qed_mcp_nvm_rd_cmd(p_hwfn,
3911be086e7cSMintz, Yuval 					p_ptt,
3912be086e7cSMintz, Yuval 					DRV_MSG_CODE_NVM_GET_FILE_ATT,
3913be086e7cSMintz, Yuval 					image_type,
3914be086e7cSMintz, Yuval 					&ret_mcp_resp,
3915be086e7cSMintz, Yuval 					&ret_mcp_param,
39167b6859fbSMintz, Yuval 					&ret_txn_size, (u32 *)&file_att);
3917c965db44STomer Tayar 
3918c965db44STomer Tayar 	/* Check response */
3919be086e7cSMintz, Yuval 	if (nvm_result ||
3920be086e7cSMintz, Yuval 	    (ret_mcp_resp & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK)
3921c965db44STomer Tayar 		return DBG_STATUS_NVRAM_GET_IMAGE_FAILED;
3922c965db44STomer Tayar 
3923c965db44STomer Tayar 	/* Update return values */
3924c965db44STomer Tayar 	*nvram_offset_bytes = file_att.nvm_start_addr;
3925c965db44STomer Tayar 	*nvram_size_bytes = file_att.len;
39267b6859fbSMintz, Yuval 
3927c965db44STomer Tayar 	DP_VERBOSE(p_hwfn,
3928c965db44STomer Tayar 		   QED_MSG_DEBUG,
3929c965db44STomer Tayar 		   "find_nvram_image: found NVRAM image of type %d in NVRAM offset %d bytes with size %d bytes\n",
3930c965db44STomer Tayar 		   image_type, *nvram_offset_bytes, *nvram_size_bytes);
3931c965db44STomer Tayar 
3932c965db44STomer Tayar 	/* Check alignment */
3933c965db44STomer Tayar 	if (*nvram_size_bytes & 0x3)
3934c965db44STomer Tayar 		return DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE;
39357b6859fbSMintz, Yuval 
3936c965db44STomer Tayar 	return DBG_STATUS_OK;
3937c965db44STomer Tayar }
3938c965db44STomer Tayar 
39397b6859fbSMintz, Yuval /* Reads data from NVRAM */
3940c965db44STomer Tayar static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn,
3941c965db44STomer Tayar 				      struct qed_ptt *p_ptt,
3942c965db44STomer Tayar 				      u32 nvram_offset_bytes,
3943c965db44STomer Tayar 				      u32 nvram_size_bytes, u32 *ret_buf)
3944c965db44STomer Tayar {
39457b6859fbSMintz, Yuval 	u32 ret_mcp_resp, ret_mcp_param, ret_read_size, bytes_to_copy;
3946c965db44STomer Tayar 	s32 bytes_left = nvram_size_bytes;
39472d22bc83SMichal Kalderon 	u32 read_offset = 0, param = 0;
3948c965db44STomer Tayar 
3949c965db44STomer Tayar 	DP_VERBOSE(p_hwfn,
3950c965db44STomer Tayar 		   QED_MSG_DEBUG,
3951c965db44STomer Tayar 		   "nvram_read: reading image of size %d bytes from NVRAM\n",
3952c965db44STomer Tayar 		   nvram_size_bytes);
39537b6859fbSMintz, Yuval 
3954c965db44STomer Tayar 	do {
3955c965db44STomer Tayar 		bytes_to_copy =
3956c965db44STomer Tayar 		    (bytes_left >
3957c965db44STomer Tayar 		     MCP_DRV_NVM_BUF_LEN) ? MCP_DRV_NVM_BUF_LEN : bytes_left;
3958c965db44STomer Tayar 
3959c965db44STomer Tayar 		/* Call NVRAM read command */
39602d22bc83SMichal Kalderon 		SET_MFW_FIELD(param,
39612d22bc83SMichal Kalderon 			      DRV_MB_PARAM_NVM_OFFSET,
39622d22bc83SMichal Kalderon 			      nvram_offset_bytes + read_offset);
39632d22bc83SMichal Kalderon 		SET_MFW_FIELD(param, DRV_MB_PARAM_NVM_LEN, bytes_to_copy);
3964c965db44STomer Tayar 		if (qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt,
39652d22bc83SMichal Kalderon 				       DRV_MSG_CODE_NVM_READ_NVRAM, param,
39662d22bc83SMichal Kalderon 				       &ret_mcp_resp,
39672d22bc83SMichal Kalderon 				       &ret_mcp_param, &ret_read_size,
39687b6859fbSMintz, Yuval 				       (u32 *)((u8 *)ret_buf + read_offset)))
3969c965db44STomer Tayar 			return DBG_STATUS_NVRAM_READ_FAILED;
3970c965db44STomer Tayar 
3971c965db44STomer Tayar 		/* Check response */
3972c965db44STomer Tayar 		if ((ret_mcp_resp & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK)
3973c965db44STomer Tayar 			return DBG_STATUS_NVRAM_READ_FAILED;
3974c965db44STomer Tayar 
3975c965db44STomer Tayar 		/* Update read offset */
3976c965db44STomer Tayar 		read_offset += ret_read_size;
3977c965db44STomer Tayar 		bytes_left -= ret_read_size;
3978c965db44STomer Tayar 	} while (bytes_left > 0);
3979c965db44STomer Tayar 
3980c965db44STomer Tayar 	return DBG_STATUS_OK;
3981c965db44STomer Tayar }
3982c965db44STomer Tayar 
3983c965db44STomer Tayar /* Get info on the MCP Trace data in the scratchpad:
39847b6859fbSMintz, Yuval  * - trace_data_grc_addr (OUT): trace data GRC address in bytes
39857b6859fbSMintz, Yuval  * - trace_data_size (OUT): trace data size in bytes (without the header)
3986c965db44STomer Tayar  */
3987c965db44STomer Tayar static enum dbg_status qed_mcp_trace_get_data_info(struct qed_hwfn *p_hwfn,
3988c965db44STomer Tayar 						   struct qed_ptt *p_ptt,
3989c965db44STomer Tayar 						   u32 *trace_data_grc_addr,
39907b6859fbSMintz, Yuval 						   u32 *trace_data_size)
3991c965db44STomer Tayar {
39927b6859fbSMintz, Yuval 	u32 spad_trace_offsize, signature;
3993c965db44STomer Tayar 
39947b6859fbSMintz, Yuval 	/* Read trace section offsize structure from MCP scratchpad */
39957b6859fbSMintz, Yuval 	spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR);
39967b6859fbSMintz, Yuval 
39977b6859fbSMintz, Yuval 	/* Extract trace section address from offsize (in scratchpad) */
3998c965db44STomer Tayar 	*trace_data_grc_addr =
3999c965db44STomer Tayar 		MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize);
4000c965db44STomer Tayar 
4001c965db44STomer Tayar 	/* Read signature from MCP trace section */
4002c965db44STomer Tayar 	signature = qed_rd(p_hwfn, p_ptt,
4003c965db44STomer Tayar 			   *trace_data_grc_addr +
4004c965db44STomer Tayar 			   offsetof(struct mcp_trace, signature));
40057b6859fbSMintz, Yuval 
4006c965db44STomer Tayar 	if (signature != MFW_TRACE_SIGNATURE)
4007c965db44STomer Tayar 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
4008c965db44STomer Tayar 
4009c965db44STomer Tayar 	/* Read trace size from MCP trace section */
40107b6859fbSMintz, Yuval 	*trace_data_size = qed_rd(p_hwfn,
4011c965db44STomer Tayar 				  p_ptt,
4012c965db44STomer Tayar 				  *trace_data_grc_addr +
4013c965db44STomer Tayar 				  offsetof(struct mcp_trace, size));
40147b6859fbSMintz, Yuval 
4015c965db44STomer Tayar 	return DBG_STATUS_OK;
4016c965db44STomer Tayar }
4017c965db44STomer Tayar 
40187b6859fbSMintz, Yuval /* Reads MCP trace meta data image from NVRAM
40197b6859fbSMintz, Yuval  * - running_bundle_id (OUT): running bundle ID (invalid when loaded from file)
40207b6859fbSMintz, Yuval  * - trace_meta_offset (OUT): trace meta offset in NVRAM in bytes (invalid when
40217b6859fbSMintz, Yuval  *			      loaded from file).
40227b6859fbSMintz, Yuval  * - trace_meta_size (OUT):   size in bytes of the trace meta data.
4023c965db44STomer Tayar  */
4024c965db44STomer Tayar static enum dbg_status qed_mcp_trace_get_meta_info(struct qed_hwfn *p_hwfn,
4025c965db44STomer Tayar 						   struct qed_ptt *p_ptt,
4026c965db44STomer Tayar 						   u32 trace_data_size_bytes,
4027c965db44STomer Tayar 						   u32 *running_bundle_id,
40287b6859fbSMintz, Yuval 						   u32 *trace_meta_offset,
40297b6859fbSMintz, Yuval 						   u32 *trace_meta_size)
4030c965db44STomer Tayar {
40317b6859fbSMintz, Yuval 	u32 spad_trace_offsize, nvram_image_type, running_mfw_addr;
40327b6859fbSMintz, Yuval 
4033c965db44STomer Tayar 	/* Read MCP trace section offsize structure from MCP scratchpad */
40347b6859fbSMintz, Yuval 	spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR);
4035c965db44STomer Tayar 
4036c965db44STomer Tayar 	/* Find running bundle ID */
40377b6859fbSMintz, Yuval 	running_mfw_addr =
4038c965db44STomer Tayar 		MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize) +
4039c965db44STomer Tayar 		QED_SECTION_SIZE(spad_trace_offsize) + trace_data_size_bytes;
4040c965db44STomer Tayar 	*running_bundle_id = qed_rd(p_hwfn, p_ptt, running_mfw_addr);
4041c965db44STomer Tayar 	if (*running_bundle_id > 1)
4042c965db44STomer Tayar 		return DBG_STATUS_INVALID_NVRAM_BUNDLE;
4043c965db44STomer Tayar 
4044c965db44STomer Tayar 	/* Find image in NVRAM */
4045c965db44STomer Tayar 	nvram_image_type =
4046c965db44STomer Tayar 	    (*running_bundle_id ==
4047c965db44STomer Tayar 	     DIR_ID_1) ? NVM_TYPE_MFW_TRACE1 : NVM_TYPE_MFW_TRACE2;
4048be086e7cSMintz, Yuval 	return qed_find_nvram_image(p_hwfn,
4049c965db44STomer Tayar 				    p_ptt,
4050c965db44STomer Tayar 				    nvram_image_type,
40517b6859fbSMintz, Yuval 				    trace_meta_offset, trace_meta_size);
4052c965db44STomer Tayar }
4053c965db44STomer Tayar 
40547b6859fbSMintz, Yuval /* Reads the MCP Trace meta data from NVRAM into the specified buffer */
4055c965db44STomer Tayar static enum dbg_status qed_mcp_trace_read_meta(struct qed_hwfn *p_hwfn,
4056c965db44STomer Tayar 					       struct qed_ptt *p_ptt,
4057c965db44STomer Tayar 					       u32 nvram_offset_in_bytes,
4058c965db44STomer Tayar 					       u32 size_in_bytes, u32 *buf)
4059c965db44STomer Tayar {
40607b6859fbSMintz, Yuval 	u8 modules_num, module_len, i, *byte_buf = (u8 *)buf;
40617b6859fbSMintz, Yuval 	enum dbg_status status;
4062c965db44STomer Tayar 	u32 signature;
4063c965db44STomer Tayar 
4064c965db44STomer Tayar 	/* Read meta data from NVRAM */
40657b6859fbSMintz, Yuval 	status = qed_nvram_read(p_hwfn,
4066c965db44STomer Tayar 				p_ptt,
40677b6859fbSMintz, Yuval 				nvram_offset_in_bytes, size_in_bytes, buf);
4068c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
4069c965db44STomer Tayar 		return status;
4070c965db44STomer Tayar 
4071c965db44STomer Tayar 	/* Extract and check first signature */
4072c965db44STomer Tayar 	signature = qed_read_unaligned_dword(byte_buf);
40737b6859fbSMintz, Yuval 	byte_buf += sizeof(signature);
40747b6859fbSMintz, Yuval 	if (signature != NVM_MAGIC_VALUE)
4075c965db44STomer Tayar 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
4076c965db44STomer Tayar 
4077c965db44STomer Tayar 	/* Extract number of modules */
4078c965db44STomer Tayar 	modules_num = *(byte_buf++);
4079c965db44STomer Tayar 
4080c965db44STomer Tayar 	/* Skip all modules */
4081c965db44STomer Tayar 	for (i = 0; i < modules_num; i++) {
40827b6859fbSMintz, Yuval 		module_len = *(byte_buf++);
4083c965db44STomer Tayar 		byte_buf += module_len;
4084c965db44STomer Tayar 	}
4085c965db44STomer Tayar 
4086c965db44STomer Tayar 	/* Extract and check second signature */
4087c965db44STomer Tayar 	signature = qed_read_unaligned_dword(byte_buf);
40887b6859fbSMintz, Yuval 	byte_buf += sizeof(signature);
40897b6859fbSMintz, Yuval 	if (signature != NVM_MAGIC_VALUE)
4090c965db44STomer Tayar 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
40917b6859fbSMintz, Yuval 
4092c965db44STomer Tayar 	return DBG_STATUS_OK;
4093c965db44STomer Tayar }
4094c965db44STomer Tayar 
4095c965db44STomer Tayar /* Dump MCP Trace */
40968c93beafSYuval Mintz static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn,
4097c965db44STomer Tayar 					  struct qed_ptt *p_ptt,
4098c965db44STomer Tayar 					  u32 *dump_buf,
4099c965db44STomer Tayar 					  bool dump, u32 *num_dumped_dwords)
4100c965db44STomer Tayar {
4101c965db44STomer Tayar 	u32 trace_data_grc_addr, trace_data_size_bytes, trace_data_size_dwords;
4102be086e7cSMintz, Yuval 	u32 trace_meta_size_dwords = 0, running_bundle_id, offset = 0;
4103be086e7cSMintz, Yuval 	u32 trace_meta_offset_bytes = 0, trace_meta_size_bytes = 0;
4104c965db44STomer Tayar 	enum dbg_status status;
4105c965db44STomer Tayar 	int halted = 0;
41062d22bc83SMichal Kalderon 	bool use_mfw;
4107c965db44STomer Tayar 
4108c965db44STomer Tayar 	*num_dumped_dwords = 0;
4109c965db44STomer Tayar 
41102d22bc83SMichal Kalderon 	use_mfw = !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP);
41117b6859fbSMintz, Yuval 
4112c965db44STomer Tayar 	/* Get trace data info */
4113c965db44STomer Tayar 	status = qed_mcp_trace_get_data_info(p_hwfn,
4114c965db44STomer Tayar 					     p_ptt,
4115c965db44STomer Tayar 					     &trace_data_grc_addr,
4116c965db44STomer Tayar 					     &trace_data_size_bytes);
4117c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
4118c965db44STomer Tayar 		return status;
4119c965db44STomer Tayar 
4120c965db44STomer Tayar 	/* Dump global params */
4121c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4122c965db44STomer Tayar 						p_ptt,
4123c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4124c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4125c965db44STomer Tayar 				     dump, "dump-type", "mcp-trace");
4126c965db44STomer Tayar 
4127c965db44STomer Tayar 	/* Halt MCP while reading from scratchpad so the read data will be
41287b6859fbSMintz, Yuval 	 * consistent. if halt fails, MCP trace is taken anyway, with a small
4129c965db44STomer Tayar 	 * risk that it may be corrupt.
4130c965db44STomer Tayar 	 */
41312d22bc83SMichal Kalderon 	if (dump && use_mfw) {
4132c965db44STomer Tayar 		halted = !qed_mcp_halt(p_hwfn, p_ptt);
4133c965db44STomer Tayar 		if (!halted)
4134c965db44STomer Tayar 			DP_NOTICE(p_hwfn, "MCP halt failed!\n");
4135c965db44STomer Tayar 	}
4136c965db44STomer Tayar 
4137c965db44STomer Tayar 	/* Find trace data size */
4138c965db44STomer Tayar 	trace_data_size_dwords =
4139c965db44STomer Tayar 	    DIV_ROUND_UP(trace_data_size_bytes + sizeof(struct mcp_trace),
4140c965db44STomer Tayar 			 BYTES_IN_DWORD);
4141c965db44STomer Tayar 
4142c965db44STomer Tayar 	/* Dump trace data section header and param */
4143c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
4144c965db44STomer Tayar 				       dump, "mcp_trace_data", 1);
4145c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
4146c965db44STomer Tayar 				     dump, "size", trace_data_size_dwords);
4147c965db44STomer Tayar 
4148c965db44STomer Tayar 	/* Read trace data from scratchpad into dump buffer */
4149be086e7cSMintz, Yuval 	offset += qed_grc_dump_addr_range(p_hwfn,
4150c965db44STomer Tayar 					  p_ptt,
4151be086e7cSMintz, Yuval 					  dump_buf + offset,
4152be086e7cSMintz, Yuval 					  dump,
4153be086e7cSMintz, Yuval 					  BYTES_TO_DWORDS(trace_data_grc_addr),
4154d52c89f1SMichal Kalderon 					  trace_data_size_dwords, false,
4155d52c89f1SMichal Kalderon 					  SPLIT_TYPE_NONE, 0);
4156c965db44STomer Tayar 
4157c965db44STomer Tayar 	/* Resume MCP (only if halt succeeded) */
41587b6859fbSMintz, Yuval 	if (halted && qed_mcp_resume(p_hwfn, p_ptt))
4159c965db44STomer Tayar 		DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n");
4160c965db44STomer Tayar 
4161c965db44STomer Tayar 	/* Dump trace meta section header */
4162c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
4163c965db44STomer Tayar 				       dump, "mcp_trace_meta", 1);
4164c965db44STomer Tayar 
416550bc60cbSMichal Kalderon 	/* If MCP Trace meta size parameter was set, use it.
416650bc60cbSMichal Kalderon 	 * Otherwise, read trace meta.
416750bc60cbSMichal Kalderon 	 * trace_meta_size_bytes is dword-aligned.
416850bc60cbSMichal Kalderon 	 */
416950bc60cbSMichal Kalderon 	trace_meta_size_bytes =
417050bc60cbSMichal Kalderon 		qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_MCP_TRACE_META_SIZE);
41712d22bc83SMichal Kalderon 	if ((!trace_meta_size_bytes || dump) && use_mfw)
4172c965db44STomer Tayar 		status = qed_mcp_trace_get_meta_info(p_hwfn,
4173c965db44STomer Tayar 						     p_ptt,
4174c965db44STomer Tayar 						     trace_data_size_bytes,
4175c965db44STomer Tayar 						     &running_bundle_id,
4176c965db44STomer Tayar 						     &trace_meta_offset_bytes,
4177c965db44STomer Tayar 						     &trace_meta_size_bytes);
4178be086e7cSMintz, Yuval 	if (status == DBG_STATUS_OK)
41792d22bc83SMichal Kalderon 		trace_meta_size_dwords = BYTES_TO_DWORDS(trace_meta_size_bytes);
4180c965db44STomer Tayar 
4181be086e7cSMintz, Yuval 	/* Dump trace meta size param */
4182be086e7cSMintz, Yuval 	offset += qed_dump_num_param(dump_buf + offset,
4183be086e7cSMintz, Yuval 				     dump, "size", trace_meta_size_dwords);
4184c965db44STomer Tayar 
4185c965db44STomer Tayar 	/* Read trace meta image into dump buffer */
4186be086e7cSMintz, Yuval 	if (dump && trace_meta_size_dwords)
4187c965db44STomer Tayar 		status = qed_mcp_trace_read_meta(p_hwfn,
4188c965db44STomer Tayar 						 p_ptt,
4189c965db44STomer Tayar 						 trace_meta_offset_bytes,
4190c965db44STomer Tayar 						 trace_meta_size_bytes,
4191c965db44STomer Tayar 						 dump_buf + offset);
4192be086e7cSMintz, Yuval 	if (status == DBG_STATUS_OK)
4193c965db44STomer Tayar 		offset += trace_meta_size_dwords;
4194c965db44STomer Tayar 
41957b6859fbSMintz, Yuval 	/* Dump last section */
4196da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
41977b6859fbSMintz, Yuval 
4198c965db44STomer Tayar 	*num_dumped_dwords = offset;
4199c965db44STomer Tayar 
4200be086e7cSMintz, Yuval 	/* If no mcp access, indicate that the dump doesn't contain the meta
4201be086e7cSMintz, Yuval 	 * data from NVRAM.
4202be086e7cSMintz, Yuval 	 */
42032d22bc83SMichal Kalderon 	return use_mfw ? status : DBG_STATUS_NVRAM_GET_IMAGE_FAILED;
4204c965db44STomer Tayar }
4205c965db44STomer Tayar 
4206c965db44STomer Tayar /* Dump GRC FIFO */
42078c93beafSYuval Mintz static enum dbg_status qed_reg_fifo_dump(struct qed_hwfn *p_hwfn,
4208c965db44STomer Tayar 					 struct qed_ptt *p_ptt,
4209c965db44STomer Tayar 					 u32 *dump_buf,
4210c965db44STomer Tayar 					 bool dump, u32 *num_dumped_dwords)
4211c965db44STomer Tayar {
4212da090917STomer Tayar 	u32 dwords_read, size_param_offset, offset = 0, addr, len;
4213c965db44STomer Tayar 	bool fifo_has_data;
4214c965db44STomer Tayar 
4215c965db44STomer Tayar 	*num_dumped_dwords = 0;
4216c965db44STomer Tayar 
4217c965db44STomer Tayar 	/* Dump global params */
4218c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4219c965db44STomer Tayar 						p_ptt,
4220c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4221c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4222c965db44STomer Tayar 				     dump, "dump-type", "reg-fifo");
4223c965db44STomer Tayar 
42247b6859fbSMintz, Yuval 	/* Dump fifo data section header and param. The size param is 0 for
42257b6859fbSMintz, Yuval 	 * now, and is overwritten after reading the FIFO.
4226c965db44STomer Tayar 	 */
4227c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
4228c965db44STomer Tayar 				       dump, "reg_fifo_data", 1);
4229c965db44STomer Tayar 	size_param_offset = offset;
4230c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
4231c965db44STomer Tayar 
4232c965db44STomer Tayar 	if (!dump) {
4233c965db44STomer Tayar 		/* FIFO max size is REG_FIFO_DEPTH_DWORDS. There is no way to
4234c965db44STomer Tayar 		 * test how much data is available, except for reading it.
4235c965db44STomer Tayar 		 */
4236c965db44STomer Tayar 		offset += REG_FIFO_DEPTH_DWORDS;
42377b6859fbSMintz, Yuval 		goto out;
4238c965db44STomer Tayar 	}
4239c965db44STomer Tayar 
4240c965db44STomer Tayar 	fifo_has_data = qed_rd(p_hwfn, p_ptt,
4241c965db44STomer Tayar 			       GRC_REG_TRACE_FIFO_VALID_DATA) > 0;
4242c965db44STomer Tayar 
4243c965db44STomer Tayar 	/* Pull available data from fifo. Use DMAE since this is widebus memory
4244c965db44STomer Tayar 	 * and must be accessed atomically. Test for dwords_read not passing
4245c965db44STomer Tayar 	 * buffer size since more entries could be added to the buffer as we are
4246c965db44STomer Tayar 	 * emptying it.
4247c965db44STomer Tayar 	 */
4248da090917STomer Tayar 	addr = BYTES_TO_DWORDS(GRC_REG_TRACE_FIFO);
4249da090917STomer Tayar 	len = REG_FIFO_ELEMENT_DWORDS;
4250c965db44STomer Tayar 	for (dwords_read = 0;
4251c965db44STomer Tayar 	     fifo_has_data && dwords_read < REG_FIFO_DEPTH_DWORDS;
4252da090917STomer Tayar 	     dwords_read += REG_FIFO_ELEMENT_DWORDS) {
4253da090917STomer Tayar 		offset += qed_grc_dump_addr_range(p_hwfn,
4254da090917STomer Tayar 						  p_ptt,
4255da090917STomer Tayar 						  dump_buf + offset,
4256da090917STomer Tayar 						  true,
4257da090917STomer Tayar 						  addr,
4258da090917STomer Tayar 						  len,
4259d52c89f1SMichal Kalderon 						  true, SPLIT_TYPE_NONE,
4260d52c89f1SMichal Kalderon 						  0);
4261c965db44STomer Tayar 		fifo_has_data = qed_rd(p_hwfn, p_ptt,
4262c965db44STomer Tayar 				       GRC_REG_TRACE_FIFO_VALID_DATA) > 0;
4263c965db44STomer Tayar 	}
4264c965db44STomer Tayar 
4265c965db44STomer Tayar 	qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
4266c965db44STomer Tayar 			   dwords_read);
42677b6859fbSMintz, Yuval out:
42687b6859fbSMintz, Yuval 	/* Dump last section */
4269da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
4270c965db44STomer Tayar 
4271c965db44STomer Tayar 	*num_dumped_dwords = offset;
42727b6859fbSMintz, Yuval 
4273c965db44STomer Tayar 	return DBG_STATUS_OK;
4274c965db44STomer Tayar }
4275c965db44STomer Tayar 
4276c965db44STomer Tayar /* Dump IGU FIFO */
42778c93beafSYuval Mintz static enum dbg_status qed_igu_fifo_dump(struct qed_hwfn *p_hwfn,
4278c965db44STomer Tayar 					 struct qed_ptt *p_ptt,
4279c965db44STomer Tayar 					 u32 *dump_buf,
4280c965db44STomer Tayar 					 bool dump, u32 *num_dumped_dwords)
4281c965db44STomer Tayar {
4282da090917STomer Tayar 	u32 dwords_read, size_param_offset, offset = 0, addr, len;
4283c965db44STomer Tayar 	bool fifo_has_data;
4284c965db44STomer Tayar 
4285c965db44STomer Tayar 	*num_dumped_dwords = 0;
4286c965db44STomer Tayar 
4287c965db44STomer Tayar 	/* Dump global params */
4288c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4289c965db44STomer Tayar 						p_ptt,
4290c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4291c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4292c965db44STomer Tayar 				     dump, "dump-type", "igu-fifo");
4293c965db44STomer Tayar 
42947b6859fbSMintz, Yuval 	/* Dump fifo data section header and param. The size param is 0 for
42957b6859fbSMintz, Yuval 	 * now, and is overwritten after reading the FIFO.
4296c965db44STomer Tayar 	 */
4297c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
4298c965db44STomer Tayar 				       dump, "igu_fifo_data", 1);
4299c965db44STomer Tayar 	size_param_offset = offset;
4300c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
4301c965db44STomer Tayar 
4302c965db44STomer Tayar 	if (!dump) {
4303c965db44STomer Tayar 		/* FIFO max size is IGU_FIFO_DEPTH_DWORDS. There is no way to
4304c965db44STomer Tayar 		 * test how much data is available, except for reading it.
4305c965db44STomer Tayar 		 */
4306c965db44STomer Tayar 		offset += IGU_FIFO_DEPTH_DWORDS;
43077b6859fbSMintz, Yuval 		goto out;
4308c965db44STomer Tayar 	}
4309c965db44STomer Tayar 
4310c965db44STomer Tayar 	fifo_has_data = qed_rd(p_hwfn, p_ptt,
4311c965db44STomer Tayar 			       IGU_REG_ERROR_HANDLING_DATA_VALID) > 0;
4312c965db44STomer Tayar 
4313c965db44STomer Tayar 	/* Pull available data from fifo. Use DMAE since this is widebus memory
4314c965db44STomer Tayar 	 * and must be accessed atomically. Test for dwords_read not passing
4315c965db44STomer Tayar 	 * buffer size since more entries could be added to the buffer as we are
4316c965db44STomer Tayar 	 * emptying it.
4317c965db44STomer Tayar 	 */
4318da090917STomer Tayar 	addr = BYTES_TO_DWORDS(IGU_REG_ERROR_HANDLING_MEMORY);
4319da090917STomer Tayar 	len = IGU_FIFO_ELEMENT_DWORDS;
4320c965db44STomer Tayar 	for (dwords_read = 0;
4321c965db44STomer Tayar 	     fifo_has_data && dwords_read < IGU_FIFO_DEPTH_DWORDS;
4322da090917STomer Tayar 	     dwords_read += IGU_FIFO_ELEMENT_DWORDS) {
4323da090917STomer Tayar 		offset += qed_grc_dump_addr_range(p_hwfn,
4324da090917STomer Tayar 						  p_ptt,
4325da090917STomer Tayar 						  dump_buf + offset,
4326da090917STomer Tayar 						  true,
4327da090917STomer Tayar 						  addr,
4328da090917STomer Tayar 						  len,
4329d52c89f1SMichal Kalderon 						  true, SPLIT_TYPE_NONE,
4330d52c89f1SMichal Kalderon 						  0);
4331c965db44STomer Tayar 		fifo_has_data = qed_rd(p_hwfn, p_ptt,
4332c965db44STomer Tayar 				       IGU_REG_ERROR_HANDLING_DATA_VALID) > 0;
4333c965db44STomer Tayar 	}
4334c965db44STomer Tayar 
4335c965db44STomer Tayar 	qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
4336c965db44STomer Tayar 			   dwords_read);
43377b6859fbSMintz, Yuval out:
43387b6859fbSMintz, Yuval 	/* Dump last section */
4339da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
4340c965db44STomer Tayar 
4341c965db44STomer Tayar 	*num_dumped_dwords = offset;
43427b6859fbSMintz, Yuval 
4343c965db44STomer Tayar 	return DBG_STATUS_OK;
4344c965db44STomer Tayar }
4345c965db44STomer Tayar 
4346c965db44STomer Tayar /* Protection Override dump */
43478c93beafSYuval Mintz static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn,
4348c965db44STomer Tayar 						    struct qed_ptt *p_ptt,
4349c965db44STomer Tayar 						    u32 *dump_buf,
43508c93beafSYuval Mintz 						    bool dump,
43518c93beafSYuval Mintz 						    u32 *num_dumped_dwords)
4352c965db44STomer Tayar {
4353da090917STomer Tayar 	u32 size_param_offset, override_window_dwords, offset = 0, addr;
4354c965db44STomer Tayar 
4355c965db44STomer Tayar 	*num_dumped_dwords = 0;
4356c965db44STomer Tayar 
4357c965db44STomer Tayar 	/* Dump global params */
4358c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4359c965db44STomer Tayar 						p_ptt,
4360c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4361c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4362c965db44STomer Tayar 				     dump, "dump-type", "protection-override");
4363c965db44STomer Tayar 
43647b6859fbSMintz, Yuval 	/* Dump data section header and param. The size param is 0 for now,
43657b6859fbSMintz, Yuval 	 * and is overwritten after reading the data.
4366c965db44STomer Tayar 	 */
4367c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
4368c965db44STomer Tayar 				       dump, "protection_override_data", 1);
4369c965db44STomer Tayar 	size_param_offset = offset;
4370c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
4371c965db44STomer Tayar 
4372c965db44STomer Tayar 	if (!dump) {
4373c965db44STomer Tayar 		offset += PROTECTION_OVERRIDE_DEPTH_DWORDS;
43747b6859fbSMintz, Yuval 		goto out;
4375c965db44STomer Tayar 	}
4376c965db44STomer Tayar 
4377c965db44STomer Tayar 	/* Add override window info to buffer */
4378c965db44STomer Tayar 	override_window_dwords =
4379da090917STomer Tayar 		qed_rd(p_hwfn, p_ptt, GRC_REG_NUMBER_VALID_OVERRIDE_WINDOW) *
4380c965db44STomer Tayar 		PROTECTION_OVERRIDE_ELEMENT_DWORDS;
43818a52bbabSMichal Kalderon 	if (override_window_dwords) {
4382da090917STomer Tayar 		addr = BYTES_TO_DWORDS(GRC_REG_PROTECTION_OVERRIDE_WINDOW);
4383da090917STomer Tayar 		offset += qed_grc_dump_addr_range(p_hwfn,
4384da090917STomer Tayar 						  p_ptt,
4385da090917STomer Tayar 						  dump_buf + offset,
4386da090917STomer Tayar 						  true,
4387da090917STomer Tayar 						  addr,
4388da090917STomer Tayar 						  override_window_dwords,
4389d52c89f1SMichal Kalderon 						  true, SPLIT_TYPE_NONE, 0);
4390c965db44STomer Tayar 		qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
4391c965db44STomer Tayar 				   override_window_dwords);
43928a52bbabSMichal Kalderon 	}
43937b6859fbSMintz, Yuval out:
43947b6859fbSMintz, Yuval 	/* Dump last section */
4395da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
4396c965db44STomer Tayar 
4397c965db44STomer Tayar 	*num_dumped_dwords = offset;
43987b6859fbSMintz, Yuval 
4399c965db44STomer Tayar 	return DBG_STATUS_OK;
4400c965db44STomer Tayar }
4401c965db44STomer Tayar 
4402c965db44STomer Tayar /* Performs FW Asserts Dump to the specified buffer.
4403c965db44STomer Tayar  * Returns the dumped size in dwords.
4404c965db44STomer Tayar  */
4405c965db44STomer Tayar static u32 qed_fw_asserts_dump(struct qed_hwfn *p_hwfn,
4406c965db44STomer Tayar 			       struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
4407c965db44STomer Tayar {
4408c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
4409be086e7cSMintz, Yuval 	struct fw_asserts_ram_section *asserts;
4410c965db44STomer Tayar 	char storm_letter_str[2] = "?";
4411c965db44STomer Tayar 	struct fw_info fw_info;
4412be086e7cSMintz, Yuval 	u32 offset = 0;
4413c965db44STomer Tayar 	u8 storm_id;
4414c965db44STomer Tayar 
4415c965db44STomer Tayar 	/* Dump global params */
4416c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4417c965db44STomer Tayar 						p_ptt,
4418c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4419c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4420c965db44STomer Tayar 				     dump, "dump-type", "fw-asserts");
44217b6859fbSMintz, Yuval 
44227b6859fbSMintz, Yuval 	/* Find Storm dump size */
4423c965db44STomer Tayar 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
4424be086e7cSMintz, Yuval 		u32 fw_asserts_section_addr, next_list_idx_addr, next_list_idx;
44257b6859fbSMintz, Yuval 		struct storm_defs *storm = &s_storm_defs[storm_id];
4426be086e7cSMintz, Yuval 		u32 last_list_idx, addr;
4427c965db44STomer Tayar 
44282d22bc83SMichal Kalderon 		if (dev_data->block_in_reset[storm->sem_block_id])
4429c965db44STomer Tayar 			continue;
4430c965db44STomer Tayar 
4431c965db44STomer Tayar 		/* Read FW info for the current Storm */
4432d52c89f1SMichal Kalderon 		qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, &fw_info);
4433c965db44STomer Tayar 
4434be086e7cSMintz, Yuval 		asserts = &fw_info.fw_asserts_section;
4435be086e7cSMintz, Yuval 
4436c965db44STomer Tayar 		/* Dump FW Asserts section header and params */
44377b6859fbSMintz, Yuval 		storm_letter_str[0] = storm->letter;
44387b6859fbSMintz, Yuval 		offset += qed_dump_section_hdr(dump_buf + offset,
44397b6859fbSMintz, Yuval 					       dump, "fw_asserts", 2);
44407b6859fbSMintz, Yuval 		offset += qed_dump_str_param(dump_buf + offset,
44417b6859fbSMintz, Yuval 					     dump, "storm", storm_letter_str);
44427b6859fbSMintz, Yuval 		offset += qed_dump_num_param(dump_buf + offset,
44437b6859fbSMintz, Yuval 					     dump,
44447b6859fbSMintz, Yuval 					     "size",
4445be086e7cSMintz, Yuval 					     asserts->list_element_dword_size);
4446c965db44STomer Tayar 
44477b6859fbSMintz, Yuval 		/* Read and dump FW Asserts data */
4448c965db44STomer Tayar 		if (!dump) {
4449be086e7cSMintz, Yuval 			offset += asserts->list_element_dword_size;
4450c965db44STomer Tayar 			continue;
4451c965db44STomer Tayar 		}
4452c965db44STomer Tayar 
44535ab90341SAlexander Lobakin 		addr = le16_to_cpu(asserts->section_ram_line_offset);
44547b6859fbSMintz, Yuval 		fw_asserts_section_addr = storm->sem_fast_mem_addr +
4455c965db44STomer Tayar 					  SEM_FAST_REG_INT_RAM +
44565ab90341SAlexander Lobakin 					  RAM_LINES_TO_BYTES(addr);
44575ab90341SAlexander Lobakin 
44587b6859fbSMintz, Yuval 		next_list_idx_addr = fw_asserts_section_addr +
4459be086e7cSMintz, Yuval 			DWORDS_TO_BYTES(asserts->list_next_index_dword_offset);
4460c965db44STomer Tayar 		next_list_idx = qed_rd(p_hwfn, p_ptt, next_list_idx_addr);
4461da090917STomer Tayar 		last_list_idx = (next_list_idx > 0 ?
4462da090917STomer Tayar 				 next_list_idx :
4463da090917STomer Tayar 				 asserts->list_num_elements) - 1;
4464be086e7cSMintz, Yuval 		addr = BYTES_TO_DWORDS(fw_asserts_section_addr) +
4465be086e7cSMintz, Yuval 		       asserts->list_dword_offset +
4466be086e7cSMintz, Yuval 		       last_list_idx * asserts->list_element_dword_size;
4467be086e7cSMintz, Yuval 		offset +=
4468be086e7cSMintz, Yuval 		    qed_grc_dump_addr_range(p_hwfn, p_ptt,
4469be086e7cSMintz, Yuval 					    dump_buf + offset,
4470be086e7cSMintz, Yuval 					    dump, addr,
44717b6859fbSMintz, Yuval 					    asserts->list_element_dword_size,
4472d52c89f1SMichal Kalderon 						  false, SPLIT_TYPE_NONE, 0);
4473c965db44STomer Tayar 	}
4474c965db44STomer Tayar 
4475c965db44STomer Tayar 	/* Dump last section */
4476da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
44777b6859fbSMintz, Yuval 
4478c965db44STomer Tayar 	return offset;
4479c965db44STomer Tayar }
4480c965db44STomer Tayar 
44818a52bbabSMichal Kalderon /* Dumps the specified ILT pages to the specified buffer.
44828a52bbabSMichal Kalderon  * Returns the dumped size in dwords.
44838a52bbabSMichal Kalderon  */
44848a52bbabSMichal Kalderon static u32 qed_ilt_dump_pages_range(u32 *dump_buf,
44858a52bbabSMichal Kalderon 				    bool dump,
44868a52bbabSMichal Kalderon 				    u32 start_page_id,
44878a52bbabSMichal Kalderon 				    u32 num_pages,
44888a52bbabSMichal Kalderon 				    struct phys_mem_desc *ilt_pages,
44898a52bbabSMichal Kalderon 				    bool dump_page_ids)
44908a52bbabSMichal Kalderon {
44918a52bbabSMichal Kalderon 	u32 page_id, end_page_id, offset = 0;
44928a52bbabSMichal Kalderon 
44938a52bbabSMichal Kalderon 	if (num_pages == 0)
44948a52bbabSMichal Kalderon 		return offset;
44958a52bbabSMichal Kalderon 
44968a52bbabSMichal Kalderon 	end_page_id = start_page_id + num_pages - 1;
44978a52bbabSMichal Kalderon 
44988a52bbabSMichal Kalderon 	for (page_id = start_page_id; page_id <= end_page_id; page_id++) {
44998a52bbabSMichal Kalderon 		struct phys_mem_desc *mem_desc = &ilt_pages[page_id];
45008a52bbabSMichal Kalderon 
45018a52bbabSMichal Kalderon 		/**
45028a52bbabSMichal Kalderon 		 *
45038a52bbabSMichal Kalderon 		 * if (page_id >= ->p_cxt_mngr->ilt_shadow_size)
45048a52bbabSMichal Kalderon 		 *     break;
45058a52bbabSMichal Kalderon 		 */
45068a52bbabSMichal Kalderon 
45078a52bbabSMichal Kalderon 		if (!ilt_pages[page_id].virt_addr)
45088a52bbabSMichal Kalderon 			continue;
45098a52bbabSMichal Kalderon 
45108a52bbabSMichal Kalderon 		if (dump_page_ids) {
45118a52bbabSMichal Kalderon 			/* Copy page ID to dump buffer */
45128a52bbabSMichal Kalderon 			if (dump)
45138a52bbabSMichal Kalderon 				*(dump_buf + offset) = page_id;
45148a52bbabSMichal Kalderon 			offset++;
45158a52bbabSMichal Kalderon 		} else {
45168a52bbabSMichal Kalderon 			/* Copy page memory to dump buffer */
45178a52bbabSMichal Kalderon 			if (dump)
45188a52bbabSMichal Kalderon 				memcpy(dump_buf + offset,
45198a52bbabSMichal Kalderon 				       mem_desc->virt_addr, mem_desc->size);
45208a52bbabSMichal Kalderon 			offset += BYTES_TO_DWORDS(mem_desc->size);
45218a52bbabSMichal Kalderon 		}
45228a52bbabSMichal Kalderon 	}
45238a52bbabSMichal Kalderon 
45248a52bbabSMichal Kalderon 	return offset;
45258a52bbabSMichal Kalderon }
45268a52bbabSMichal Kalderon 
45278a52bbabSMichal Kalderon /* Dumps a section containing the dumped ILT pages.
45288a52bbabSMichal Kalderon  * Returns the dumped size in dwords.
45298a52bbabSMichal Kalderon  */
45308a52bbabSMichal Kalderon static u32 qed_ilt_dump_pages_section(struct qed_hwfn *p_hwfn,
45318a52bbabSMichal Kalderon 				      u32 *dump_buf,
45328a52bbabSMichal Kalderon 				      bool dump,
45338a52bbabSMichal Kalderon 				      u32 valid_conn_pf_pages,
45348a52bbabSMichal Kalderon 				      u32 valid_conn_vf_pages,
45358a52bbabSMichal Kalderon 				      struct phys_mem_desc *ilt_pages,
45368a52bbabSMichal Kalderon 				      bool dump_page_ids)
45378a52bbabSMichal Kalderon {
45388a52bbabSMichal Kalderon 	struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients;
45398a52bbabSMichal Kalderon 	u32 pf_start_line, start_page_id, offset = 0;
45408a52bbabSMichal Kalderon 	u32 cdut_pf_init_pages, cdut_vf_init_pages;
45418a52bbabSMichal Kalderon 	u32 cdut_pf_work_pages, cdut_vf_work_pages;
45428a52bbabSMichal Kalderon 	u32 base_data_offset, size_param_offset;
45438a52bbabSMichal Kalderon 	u32 cdut_pf_pages, cdut_vf_pages;
45448a52bbabSMichal Kalderon 	const char *section_name;
45458a52bbabSMichal Kalderon 	u8 i;
45468a52bbabSMichal Kalderon 
45478a52bbabSMichal Kalderon 	section_name = dump_page_ids ? "ilt_page_ids" : "ilt_page_mem";
45488a52bbabSMichal Kalderon 	cdut_pf_init_pages = qed_get_cdut_num_pf_init_pages(p_hwfn);
45498a52bbabSMichal Kalderon 	cdut_vf_init_pages = qed_get_cdut_num_vf_init_pages(p_hwfn);
45508a52bbabSMichal Kalderon 	cdut_pf_work_pages = qed_get_cdut_num_pf_work_pages(p_hwfn);
45518a52bbabSMichal Kalderon 	cdut_vf_work_pages = qed_get_cdut_num_vf_work_pages(p_hwfn);
45528a52bbabSMichal Kalderon 	cdut_pf_pages = cdut_pf_init_pages + cdut_pf_work_pages;
45538a52bbabSMichal Kalderon 	cdut_vf_pages = cdut_vf_init_pages + cdut_vf_work_pages;
45548a52bbabSMichal Kalderon 	pf_start_line = p_hwfn->p_cxt_mngr->pf_start_line;
45558a52bbabSMichal Kalderon 
45568a52bbabSMichal Kalderon 	offset +=
45578a52bbabSMichal Kalderon 	    qed_dump_section_hdr(dump_buf + offset, dump, section_name, 1);
45588a52bbabSMichal Kalderon 
45598a52bbabSMichal Kalderon 	/* Dump size parameter (0 for now, overwritten with real size later) */
45608a52bbabSMichal Kalderon 	size_param_offset = offset;
45618a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
45628a52bbabSMichal Kalderon 	base_data_offset = offset;
45638a52bbabSMichal Kalderon 
45648a52bbabSMichal Kalderon 	/* CDUC pages are ordered as follows:
45658a52bbabSMichal Kalderon 	 * - PF pages - valid section (included in PF connection type mapping)
45668a52bbabSMichal Kalderon 	 * - PF pages - invalid section (not dumped)
45678a52bbabSMichal Kalderon 	 * - For each VF in the PF:
45688a52bbabSMichal Kalderon 	 *   - VF pages - valid section (included in VF connection type mapping)
45698a52bbabSMichal Kalderon 	 *   - VF pages - invalid section (not dumped)
45708a52bbabSMichal Kalderon 	 */
45718a52bbabSMichal Kalderon 	if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUC)) {
45728a52bbabSMichal Kalderon 		/* Dump connection PF pages */
45738a52bbabSMichal Kalderon 		start_page_id = clients[ILT_CLI_CDUC].first.val - pf_start_line;
45748a52bbabSMichal Kalderon 		offset += qed_ilt_dump_pages_range(dump_buf + offset,
45758a52bbabSMichal Kalderon 						   dump,
45768a52bbabSMichal Kalderon 						   start_page_id,
45778a52bbabSMichal Kalderon 						   valid_conn_pf_pages,
45788a52bbabSMichal Kalderon 						   ilt_pages, dump_page_ids);
45798a52bbabSMichal Kalderon 
45808a52bbabSMichal Kalderon 		/* Dump connection VF pages */
45818a52bbabSMichal Kalderon 		start_page_id += clients[ILT_CLI_CDUC].pf_total_lines;
45828a52bbabSMichal Kalderon 		for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count;
45838a52bbabSMichal Kalderon 		     i++, start_page_id += clients[ILT_CLI_CDUC].vf_total_lines)
45848a52bbabSMichal Kalderon 			offset += qed_ilt_dump_pages_range(dump_buf + offset,
45858a52bbabSMichal Kalderon 							   dump,
45868a52bbabSMichal Kalderon 							   start_page_id,
45878a52bbabSMichal Kalderon 							   valid_conn_vf_pages,
45888a52bbabSMichal Kalderon 							   ilt_pages,
45898a52bbabSMichal Kalderon 							   dump_page_ids);
45908a52bbabSMichal Kalderon 	}
45918a52bbabSMichal Kalderon 
45928a52bbabSMichal Kalderon 	/* CDUT pages are ordered as follows:
45938a52bbabSMichal Kalderon 	 * - PF init pages (not dumped)
45948a52bbabSMichal Kalderon 	 * - PF work pages
45958a52bbabSMichal Kalderon 	 * - For each VF in the PF:
45968a52bbabSMichal Kalderon 	 *   - VF init pages (not dumped)
45978a52bbabSMichal Kalderon 	 *   - VF work pages
45988a52bbabSMichal Kalderon 	 */
45998a52bbabSMichal Kalderon 	if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUT)) {
46008a52bbabSMichal Kalderon 		/* Dump task PF pages */
46018a52bbabSMichal Kalderon 		start_page_id = clients[ILT_CLI_CDUT].first.val +
46028a52bbabSMichal Kalderon 		    cdut_pf_init_pages - pf_start_line;
46038a52bbabSMichal Kalderon 		offset += qed_ilt_dump_pages_range(dump_buf + offset,
46048a52bbabSMichal Kalderon 						   dump,
46058a52bbabSMichal Kalderon 						   start_page_id,
46068a52bbabSMichal Kalderon 						   cdut_pf_work_pages,
46078a52bbabSMichal Kalderon 						   ilt_pages, dump_page_ids);
46088a52bbabSMichal Kalderon 
46098a52bbabSMichal Kalderon 		/* Dump task VF pages */
46108a52bbabSMichal Kalderon 		start_page_id = clients[ILT_CLI_CDUT].first.val +
46118a52bbabSMichal Kalderon 		    cdut_pf_pages + cdut_vf_init_pages - pf_start_line;
46128a52bbabSMichal Kalderon 		for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count;
46138a52bbabSMichal Kalderon 		     i++, start_page_id += cdut_vf_pages)
46148a52bbabSMichal Kalderon 			offset += qed_ilt_dump_pages_range(dump_buf + offset,
46158a52bbabSMichal Kalderon 							   dump,
46168a52bbabSMichal Kalderon 							   start_page_id,
46178a52bbabSMichal Kalderon 							   cdut_vf_work_pages,
46188a52bbabSMichal Kalderon 							   ilt_pages,
46198a52bbabSMichal Kalderon 							   dump_page_ids);
46208a52bbabSMichal Kalderon 	}
46218a52bbabSMichal Kalderon 
46228a52bbabSMichal Kalderon 	/* Overwrite size param */
46238a52bbabSMichal Kalderon 	if (dump)
46248a52bbabSMichal Kalderon 		qed_dump_num_param(dump_buf + size_param_offset,
46258a52bbabSMichal Kalderon 				   dump, "size", offset - base_data_offset);
46268a52bbabSMichal Kalderon 
46278a52bbabSMichal Kalderon 	return offset;
46288a52bbabSMichal Kalderon }
46298a52bbabSMichal Kalderon 
46308a52bbabSMichal Kalderon /* Performs ILT Dump to the specified buffer.
46318a52bbabSMichal Kalderon  * Returns the dumped size in dwords.
46328a52bbabSMichal Kalderon  */
46338a52bbabSMichal Kalderon static u32 qed_ilt_dump(struct qed_hwfn *p_hwfn,
46348a52bbabSMichal Kalderon 			struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
46358a52bbabSMichal Kalderon {
46368a52bbabSMichal Kalderon 	struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients;
46378a52bbabSMichal Kalderon 	u32 valid_conn_vf_cids, valid_conn_vf_pages, offset = 0;
46388a52bbabSMichal Kalderon 	u32 valid_conn_pf_cids, valid_conn_pf_pages, num_pages;
46398a52bbabSMichal Kalderon 	u32 num_cids_per_page, conn_ctx_size;
46408a52bbabSMichal Kalderon 	u32 cduc_page_size, cdut_page_size;
46418a52bbabSMichal Kalderon 	struct phys_mem_desc *ilt_pages;
46428a52bbabSMichal Kalderon 	u8 conn_type;
46438a52bbabSMichal Kalderon 
46448a52bbabSMichal Kalderon 	cduc_page_size = 1 <<
46458a52bbabSMichal Kalderon 	    (clients[ILT_CLI_CDUC].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN);
46468a52bbabSMichal Kalderon 	cdut_page_size = 1 <<
46478a52bbabSMichal Kalderon 	    (clients[ILT_CLI_CDUT].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN);
46488a52bbabSMichal Kalderon 	conn_ctx_size = p_hwfn->p_cxt_mngr->conn_ctx_size;
46498a52bbabSMichal Kalderon 	num_cids_per_page = (int)(cduc_page_size / conn_ctx_size);
46508a52bbabSMichal Kalderon 	ilt_pages = p_hwfn->p_cxt_mngr->ilt_shadow;
46518a52bbabSMichal Kalderon 
46528a52bbabSMichal Kalderon 	/* Dump global params - 22 must match number of params below */
46538a52bbabSMichal Kalderon 	offset += qed_dump_common_global_params(p_hwfn, p_ptt,
46548a52bbabSMichal Kalderon 						dump_buf + offset, dump, 22);
46558a52bbabSMichal Kalderon 	offset += qed_dump_str_param(dump_buf + offset,
46568a52bbabSMichal Kalderon 				     dump, "dump-type", "ilt-dump");
46578a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46588a52bbabSMichal Kalderon 				     dump,
46598a52bbabSMichal Kalderon 				     "cduc-page-size", cduc_page_size);
46608a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46618a52bbabSMichal Kalderon 				     dump,
46628a52bbabSMichal Kalderon 				     "cduc-first-page-id",
46638a52bbabSMichal Kalderon 				     clients[ILT_CLI_CDUC].first.val);
46648a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46658a52bbabSMichal Kalderon 				     dump,
46668a52bbabSMichal Kalderon 				     "cduc-last-page-id",
46678a52bbabSMichal Kalderon 				     clients[ILT_CLI_CDUC].last.val);
46688a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46698a52bbabSMichal Kalderon 				     dump,
46708a52bbabSMichal Kalderon 				     "cduc-num-pf-pages",
46718a52bbabSMichal Kalderon 				     clients
46728a52bbabSMichal Kalderon 				     [ILT_CLI_CDUC].pf_total_lines);
46738a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46748a52bbabSMichal Kalderon 				     dump,
46758a52bbabSMichal Kalderon 				     "cduc-num-vf-pages",
46768a52bbabSMichal Kalderon 				     clients
46778a52bbabSMichal Kalderon 				     [ILT_CLI_CDUC].vf_total_lines);
46788a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46798a52bbabSMichal Kalderon 				     dump,
46808a52bbabSMichal Kalderon 				     "max-conn-ctx-size",
46818a52bbabSMichal Kalderon 				     conn_ctx_size);
46828a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46838a52bbabSMichal Kalderon 				     dump,
46848a52bbabSMichal Kalderon 				     "cdut-page-size", cdut_page_size);
46858a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46868a52bbabSMichal Kalderon 				     dump,
46878a52bbabSMichal Kalderon 				     "cdut-first-page-id",
46888a52bbabSMichal Kalderon 				     clients[ILT_CLI_CDUT].first.val);
46898a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46908a52bbabSMichal Kalderon 				     dump,
46918a52bbabSMichal Kalderon 				     "cdut-last-page-id",
46928a52bbabSMichal Kalderon 				     clients[ILT_CLI_CDUT].last.val);
46938a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46948a52bbabSMichal Kalderon 				     dump,
46958a52bbabSMichal Kalderon 				     "cdut-num-pf-init-pages",
46968a52bbabSMichal Kalderon 				     qed_get_cdut_num_pf_init_pages(p_hwfn));
46978a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
46988a52bbabSMichal Kalderon 				     dump,
46998a52bbabSMichal Kalderon 				     "cdut-num-vf-init-pages",
47008a52bbabSMichal Kalderon 				     qed_get_cdut_num_vf_init_pages(p_hwfn));
47018a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
47028a52bbabSMichal Kalderon 				     dump,
47038a52bbabSMichal Kalderon 				     "cdut-num-pf-work-pages",
47048a52bbabSMichal Kalderon 				     qed_get_cdut_num_pf_work_pages(p_hwfn));
47058a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
47068a52bbabSMichal Kalderon 				     dump,
47078a52bbabSMichal Kalderon 				     "cdut-num-vf-work-pages",
47088a52bbabSMichal Kalderon 				     qed_get_cdut_num_vf_work_pages(p_hwfn));
47098a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
47108a52bbabSMichal Kalderon 				     dump,
47118a52bbabSMichal Kalderon 				     "max-task-ctx-size",
47128a52bbabSMichal Kalderon 				     p_hwfn->p_cxt_mngr->task_ctx_size);
47138a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
47148a52bbabSMichal Kalderon 				     dump,
47158a52bbabSMichal Kalderon 				     "task-type-id",
47168a52bbabSMichal Kalderon 				     p_hwfn->p_cxt_mngr->task_type_id);
47178a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
47188a52bbabSMichal Kalderon 				     dump,
47198a52bbabSMichal Kalderon 				     "first-vf-id-in-pf",
47208a52bbabSMichal Kalderon 				     p_hwfn->p_cxt_mngr->first_vf_in_pf);
47218a52bbabSMichal Kalderon 	offset += /* 18 */ qed_dump_num_param(dump_buf + offset,
47228a52bbabSMichal Kalderon 					      dump,
47238a52bbabSMichal Kalderon 					      "num-vfs-in-pf",
47248a52bbabSMichal Kalderon 					      p_hwfn->p_cxt_mngr->vf_count);
47258a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
47268a52bbabSMichal Kalderon 				     dump,
47278a52bbabSMichal Kalderon 				     "ptr-size-bytes", sizeof(void *));
47288a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
47298a52bbabSMichal Kalderon 				     dump,
47308a52bbabSMichal Kalderon 				     "pf-start-line",
47318a52bbabSMichal Kalderon 				     p_hwfn->p_cxt_mngr->pf_start_line);
47328a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
47338a52bbabSMichal Kalderon 				     dump,
47348a52bbabSMichal Kalderon 				     "page-mem-desc-size-dwords",
47358a52bbabSMichal Kalderon 				     PAGE_MEM_DESC_SIZE_DWORDS);
47368a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
47378a52bbabSMichal Kalderon 				     dump,
47388a52bbabSMichal Kalderon 				     "ilt-shadow-size",
47398a52bbabSMichal Kalderon 				     p_hwfn->p_cxt_mngr->ilt_shadow_size);
47408a52bbabSMichal Kalderon 	/* Additional/Less parameters require matching of number in call to
47418a52bbabSMichal Kalderon 	 * dump_common_global_params()
47428a52bbabSMichal Kalderon 	 */
47438a52bbabSMichal Kalderon 
47448a52bbabSMichal Kalderon 	/* Dump section containing number of PF CIDs per connection type */
47458a52bbabSMichal Kalderon 	offset += qed_dump_section_hdr(dump_buf + offset,
47468a52bbabSMichal Kalderon 				       dump, "num_pf_cids_per_conn_type", 1);
47478a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
4748fb09a1edSShai Malin 				     dump, "size", NUM_OF_CONNECTION_TYPES);
47498a52bbabSMichal Kalderon 	for (conn_type = 0, valid_conn_pf_cids = 0;
4750fb09a1edSShai Malin 	     conn_type < NUM_OF_CONNECTION_TYPES; conn_type++, offset++) {
47518a52bbabSMichal Kalderon 		u32 num_pf_cids =
47528a52bbabSMichal Kalderon 		    p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cid_count;
47538a52bbabSMichal Kalderon 
47548a52bbabSMichal Kalderon 		if (dump)
47558a52bbabSMichal Kalderon 			*(dump_buf + offset) = num_pf_cids;
47568a52bbabSMichal Kalderon 		valid_conn_pf_cids += num_pf_cids;
47578a52bbabSMichal Kalderon 	}
47588a52bbabSMichal Kalderon 
47598a52bbabSMichal Kalderon 	/* Dump section containing number of VF CIDs per connection type */
47608a52bbabSMichal Kalderon 	offset += qed_dump_section_hdr(dump_buf + offset,
47618a52bbabSMichal Kalderon 				       dump, "num_vf_cids_per_conn_type", 1);
47628a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
4763fb09a1edSShai Malin 				     dump, "size", NUM_OF_CONNECTION_TYPES);
47648a52bbabSMichal Kalderon 	for (conn_type = 0, valid_conn_vf_cids = 0;
4765fb09a1edSShai Malin 	     conn_type < NUM_OF_CONNECTION_TYPES; conn_type++, offset++) {
47668a52bbabSMichal Kalderon 		u32 num_vf_cids =
47678a52bbabSMichal Kalderon 		    p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cids_per_vf;
47688a52bbabSMichal Kalderon 
47698a52bbabSMichal Kalderon 		if (dump)
47708a52bbabSMichal Kalderon 			*(dump_buf + offset) = num_vf_cids;
47718a52bbabSMichal Kalderon 		valid_conn_vf_cids += num_vf_cids;
47728a52bbabSMichal Kalderon 	}
47738a52bbabSMichal Kalderon 
47748a52bbabSMichal Kalderon 	/* Dump section containing physical memory descs for each ILT page */
47758a52bbabSMichal Kalderon 	num_pages = p_hwfn->p_cxt_mngr->ilt_shadow_size;
47768a52bbabSMichal Kalderon 	offset += qed_dump_section_hdr(dump_buf + offset,
47778a52bbabSMichal Kalderon 				       dump, "ilt_page_desc", 1);
47788a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
47798a52bbabSMichal Kalderon 				     dump,
47808a52bbabSMichal Kalderon 				     "size",
47818a52bbabSMichal Kalderon 				     num_pages * PAGE_MEM_DESC_SIZE_DWORDS);
47828a52bbabSMichal Kalderon 
47838a52bbabSMichal Kalderon 	/* Copy memory descriptors to dump buffer */
47848a52bbabSMichal Kalderon 	if (dump) {
47858a52bbabSMichal Kalderon 		u32 page_id;
47868a52bbabSMichal Kalderon 
47878a52bbabSMichal Kalderon 		for (page_id = 0; page_id < num_pages;
47888a52bbabSMichal Kalderon 		     page_id++, offset += PAGE_MEM_DESC_SIZE_DWORDS)
47898a52bbabSMichal Kalderon 			memcpy(dump_buf + offset,
47908a52bbabSMichal Kalderon 			       &ilt_pages[page_id],
47918a52bbabSMichal Kalderon 			       DWORDS_TO_BYTES(PAGE_MEM_DESC_SIZE_DWORDS));
47928a52bbabSMichal Kalderon 	} else {
47938a52bbabSMichal Kalderon 		offset += num_pages * PAGE_MEM_DESC_SIZE_DWORDS;
47948a52bbabSMichal Kalderon 	}
47958a52bbabSMichal Kalderon 
47968a52bbabSMichal Kalderon 	valid_conn_pf_pages = DIV_ROUND_UP(valid_conn_pf_cids,
47978a52bbabSMichal Kalderon 					   num_cids_per_page);
47988a52bbabSMichal Kalderon 	valid_conn_vf_pages = DIV_ROUND_UP(valid_conn_vf_cids,
47998a52bbabSMichal Kalderon 					   num_cids_per_page);
48008a52bbabSMichal Kalderon 
48018a52bbabSMichal Kalderon 	/* Dump ILT pages IDs */
48028a52bbabSMichal Kalderon 	offset += qed_ilt_dump_pages_section(p_hwfn,
48038a52bbabSMichal Kalderon 					     dump_buf + offset,
48048a52bbabSMichal Kalderon 					     dump,
48058a52bbabSMichal Kalderon 					     valid_conn_pf_pages,
48068a52bbabSMichal Kalderon 					     valid_conn_vf_pages,
48078a52bbabSMichal Kalderon 					     ilt_pages, true);
48088a52bbabSMichal Kalderon 
48098a52bbabSMichal Kalderon 	/* Dump ILT pages memory */
48108a52bbabSMichal Kalderon 	offset += qed_ilt_dump_pages_section(p_hwfn,
48118a52bbabSMichal Kalderon 					     dump_buf + offset,
48128a52bbabSMichal Kalderon 					     dump,
48138a52bbabSMichal Kalderon 					     valid_conn_pf_pages,
48148a52bbabSMichal Kalderon 					     valid_conn_vf_pages,
48158a52bbabSMichal Kalderon 					     ilt_pages, false);
48168a52bbabSMichal Kalderon 
48178a52bbabSMichal Kalderon 	/* Dump last section */
48188a52bbabSMichal Kalderon 	offset += qed_dump_last_section(dump_buf, offset, dump);
48198a52bbabSMichal Kalderon 
48208a52bbabSMichal Kalderon 	return offset;
48218a52bbabSMichal Kalderon }
48228a52bbabSMichal Kalderon 
4823c965db44STomer Tayar /***************************** Public Functions *******************************/
4824c965db44STomer Tayar 
48252d22bc83SMichal Kalderon enum dbg_status qed_dbg_set_bin_ptr(struct qed_hwfn *p_hwfn,
48262d22bc83SMichal Kalderon 				    const u8 * const bin_ptr)
4827c965db44STomer Tayar {
48282d22bc83SMichal Kalderon 	struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr;
4829c965db44STomer Tayar 	u8 buf_id;
4830c965db44STomer Tayar 
48312d22bc83SMichal Kalderon 	/* Convert binary data to debug arrays */
48322d22bc83SMichal Kalderon 	for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++)
48332d22bc83SMichal Kalderon 		qed_set_dbg_bin_buf(p_hwfn,
48342d22bc83SMichal Kalderon 				    buf_id,
48352d22bc83SMichal Kalderon 				    (u32 *)(bin_ptr + buf_hdrs[buf_id].offset),
48362d22bc83SMichal Kalderon 				    buf_hdrs[buf_id].length);
4837c965db44STomer Tayar 
4838c965db44STomer Tayar 	return DBG_STATUS_OK;
4839c965db44STomer Tayar }
4840c965db44STomer Tayar 
4841d52c89f1SMichal Kalderon bool qed_read_fw_info(struct qed_hwfn *p_hwfn,
4842d52c89f1SMichal Kalderon 		      struct qed_ptt *p_ptt, struct fw_info *fw_info)
4843d52c89f1SMichal Kalderon {
4844d52c89f1SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
4845d52c89f1SMichal Kalderon 	u8 storm_id;
4846d52c89f1SMichal Kalderon 
4847d52c89f1SMichal Kalderon 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
4848d52c89f1SMichal Kalderon 		struct storm_defs *storm = &s_storm_defs[storm_id];
4849d52c89f1SMichal Kalderon 
4850d52c89f1SMichal Kalderon 		/* Skip Storm if it's in reset */
48512d22bc83SMichal Kalderon 		if (dev_data->block_in_reset[storm->sem_block_id])
4852d52c89f1SMichal Kalderon 			continue;
4853d52c89f1SMichal Kalderon 
4854d52c89f1SMichal Kalderon 		/* Read FW info for the current Storm */
4855d52c89f1SMichal Kalderon 		qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, fw_info);
4856d52c89f1SMichal Kalderon 
4857d52c89f1SMichal Kalderon 		return true;
4858d52c89f1SMichal Kalderon 	}
4859d52c89f1SMichal Kalderon 
4860d52c89f1SMichal Kalderon 	return false;
4861d52c89f1SMichal Kalderon }
4862d52c89f1SMichal Kalderon 
48633b86bd07SSudarsana Reddy Kalluru enum dbg_status qed_dbg_grc_config(struct qed_hwfn *p_hwfn,
48643b86bd07SSudarsana Reddy Kalluru 				   enum dbg_grc_params grc_param, u32 val)
48653b86bd07SSudarsana Reddy Kalluru {
48662d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
48673b86bd07SSudarsana Reddy Kalluru 	enum dbg_status status;
48683b86bd07SSudarsana Reddy Kalluru 	int i;
48693b86bd07SSudarsana Reddy Kalluru 
48702d22bc83SMichal Kalderon 	DP_VERBOSE(p_hwfn,
48712d22bc83SMichal Kalderon 		   QED_MSG_DEBUG,
48723b86bd07SSudarsana Reddy Kalluru 		   "dbg_grc_config: paramId = %d, val = %d\n", grc_param, val);
48733b86bd07SSudarsana Reddy Kalluru 
48742d22bc83SMichal Kalderon 	status = qed_dbg_dev_init(p_hwfn);
48753b86bd07SSudarsana Reddy Kalluru 	if (status != DBG_STATUS_OK)
48763b86bd07SSudarsana Reddy Kalluru 		return status;
48773b86bd07SSudarsana Reddy Kalluru 
48783b86bd07SSudarsana Reddy Kalluru 	/* Initializes the GRC parameters (if not initialized). Needed in order
48793b86bd07SSudarsana Reddy Kalluru 	 * to set the default parameter values for the first time.
48803b86bd07SSudarsana Reddy Kalluru 	 */
48813b86bd07SSudarsana Reddy Kalluru 	qed_dbg_grc_init_params(p_hwfn);
48823b86bd07SSudarsana Reddy Kalluru 
48833b86bd07SSudarsana Reddy Kalluru 	if (grc_param >= MAX_DBG_GRC_PARAMS)
48843b86bd07SSudarsana Reddy Kalluru 		return DBG_STATUS_INVALID_ARGS;
48853b86bd07SSudarsana Reddy Kalluru 	if (val < s_grc_param_defs[grc_param].min ||
48863b86bd07SSudarsana Reddy Kalluru 	    val > s_grc_param_defs[grc_param].max)
48873b86bd07SSudarsana Reddy Kalluru 		return DBG_STATUS_INVALID_ARGS;
48883b86bd07SSudarsana Reddy Kalluru 
48893b86bd07SSudarsana Reddy Kalluru 	if (s_grc_param_defs[grc_param].is_preset) {
48903b86bd07SSudarsana Reddy Kalluru 		/* Preset param */
48913b86bd07SSudarsana Reddy Kalluru 
48923b86bd07SSudarsana Reddy Kalluru 		/* Disabling a preset is not allowed. Call
48933b86bd07SSudarsana Reddy Kalluru 		 * dbg_grc_set_params_default instead.
48943b86bd07SSudarsana Reddy Kalluru 		 */
48953b86bd07SSudarsana Reddy Kalluru 		if (!val)
48963b86bd07SSudarsana Reddy Kalluru 			return DBG_STATUS_INVALID_ARGS;
48973b86bd07SSudarsana Reddy Kalluru 
48983b86bd07SSudarsana Reddy Kalluru 		/* Update all params with the preset values */
48993b86bd07SSudarsana Reddy Kalluru 		for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) {
49002d22bc83SMichal Kalderon 			struct grc_param_defs *defs = &s_grc_param_defs[i];
49013b86bd07SSudarsana Reddy Kalluru 			u32 preset_val;
49023b86bd07SSudarsana Reddy Kalluru 			/* Skip persistent params */
49032d22bc83SMichal Kalderon 			if (defs->is_persistent)
49043b86bd07SSudarsana Reddy Kalluru 				continue;
49053b86bd07SSudarsana Reddy Kalluru 
49063b86bd07SSudarsana Reddy Kalluru 			/* Find preset value */
49073b86bd07SSudarsana Reddy Kalluru 			if (grc_param == DBG_GRC_PARAM_EXCLUDE_ALL)
49083b86bd07SSudarsana Reddy Kalluru 				preset_val =
49092d22bc83SMichal Kalderon 				    defs->exclude_all_preset_val;
49103b86bd07SSudarsana Reddy Kalluru 			else if (grc_param == DBG_GRC_PARAM_CRASH)
49113b86bd07SSudarsana Reddy Kalluru 				preset_val =
49122d22bc83SMichal Kalderon 				    defs->crash_preset_val[dev_data->chip_id];
49133b86bd07SSudarsana Reddy Kalluru 			else
49143b86bd07SSudarsana Reddy Kalluru 				return DBG_STATUS_INVALID_ARGS;
49153b86bd07SSudarsana Reddy Kalluru 
49162d22bc83SMichal Kalderon 			qed_grc_set_param(p_hwfn, i, preset_val);
49173b86bd07SSudarsana Reddy Kalluru 		}
49183b86bd07SSudarsana Reddy Kalluru 	} else {
49193b86bd07SSudarsana Reddy Kalluru 		/* Regular param - set its value */
49203b86bd07SSudarsana Reddy Kalluru 		qed_grc_set_param(p_hwfn, grc_param, val);
49213b86bd07SSudarsana Reddy Kalluru 	}
49223b86bd07SSudarsana Reddy Kalluru 
49233b86bd07SSudarsana Reddy Kalluru 	return DBG_STATUS_OK;
49243b86bd07SSudarsana Reddy Kalluru }
49253b86bd07SSudarsana Reddy Kalluru 
4926be086e7cSMintz, Yuval /* Assign default GRC param values */
4927be086e7cSMintz, Yuval void qed_dbg_grc_set_params_default(struct qed_hwfn *p_hwfn)
4928be086e7cSMintz, Yuval {
4929be086e7cSMintz, Yuval 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
4930be086e7cSMintz, Yuval 	u32 i;
4931be086e7cSMintz, Yuval 
4932be086e7cSMintz, Yuval 	for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
493350bc60cbSMichal Kalderon 		if (!s_grc_param_defs[i].is_persistent)
4934be086e7cSMintz, Yuval 			dev_data->grc.param_val[i] =
4935be086e7cSMintz, Yuval 			    s_grc_param_defs[i].default_val[dev_data->chip_id];
4936be086e7cSMintz, Yuval }
4937be086e7cSMintz, Yuval 
4938c965db44STomer Tayar enum dbg_status qed_dbg_grc_get_dump_buf_size(struct qed_hwfn *p_hwfn,
4939c965db44STomer Tayar 					      struct qed_ptt *p_ptt,
4940c965db44STomer Tayar 					      u32 *buf_size)
4941c965db44STomer Tayar {
49422d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
4943c965db44STomer Tayar 
4944c965db44STomer Tayar 	*buf_size = 0;
49457b6859fbSMintz, Yuval 
4946c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
4947c965db44STomer Tayar 		return status;
49487b6859fbSMintz, Yuval 
49492d22bc83SMichal Kalderon 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
49502d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr ||
49512d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr ||
49522d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
49532d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
4954c965db44STomer Tayar 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
49557b6859fbSMintz, Yuval 
4956c965db44STomer Tayar 	return qed_grc_dump(p_hwfn, p_ptt, NULL, false, buf_size);
4957c965db44STomer Tayar }
4958c965db44STomer Tayar 
4959c965db44STomer Tayar enum dbg_status qed_dbg_grc_dump(struct qed_hwfn *p_hwfn,
4960c965db44STomer Tayar 				 struct qed_ptt *p_ptt,
4961c965db44STomer Tayar 				 u32 *dump_buf,
4962c965db44STomer Tayar 				 u32 buf_size_in_dwords,
4963c965db44STomer Tayar 				 u32 *num_dumped_dwords)
4964c965db44STomer Tayar {
4965c965db44STomer Tayar 	u32 needed_buf_size_in_dwords;
4966c965db44STomer Tayar 	enum dbg_status status;
4967c965db44STomer Tayar 
4968c965db44STomer Tayar 	*num_dumped_dwords = 0;
49697b6859fbSMintz, Yuval 
49707b6859fbSMintz, Yuval 	status = qed_dbg_grc_get_dump_buf_size(p_hwfn,
49717b6859fbSMintz, Yuval 					       p_ptt,
49727b6859fbSMintz, Yuval 					       &needed_buf_size_in_dwords);
4973c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
4974c965db44STomer Tayar 		return status;
49757b6859fbSMintz, Yuval 
4976c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
4977c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
4978c965db44STomer Tayar 
4979c965db44STomer Tayar 	/* GRC Dump */
4980c965db44STomer Tayar 	status = qed_grc_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords);
4981c965db44STomer Tayar 
4982be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
4983be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
4984be086e7cSMintz, Yuval 
4985c965db44STomer Tayar 	return status;
4986c965db44STomer Tayar }
4987c965db44STomer Tayar 
4988c965db44STomer Tayar enum dbg_status qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn *p_hwfn,
4989c965db44STomer Tayar 						   struct qed_ptt *p_ptt,
4990c965db44STomer Tayar 						   u32 *buf_size)
4991c965db44STomer Tayar {
4992c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
49932d22bc83SMichal Kalderon 	struct idle_chk_data *idle_chk = &dev_data->idle_chk;
49947b6859fbSMintz, Yuval 	enum dbg_status status;
4995c965db44STomer Tayar 
4996c965db44STomer Tayar 	*buf_size = 0;
49977b6859fbSMintz, Yuval 
49982d22bc83SMichal Kalderon 	status = qed_dbg_dev_init(p_hwfn);
4999c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5000c965db44STomer Tayar 		return status;
50017b6859fbSMintz, Yuval 
50022d22bc83SMichal Kalderon 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
50032d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr ||
50042d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr ||
50052d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr)
5006c965db44STomer Tayar 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
50077b6859fbSMintz, Yuval 
50087b6859fbSMintz, Yuval 	if (!idle_chk->buf_size_set) {
50097b6859fbSMintz, Yuval 		idle_chk->buf_size = qed_idle_chk_dump(p_hwfn,
50107b6859fbSMintz, Yuval 						       p_ptt, NULL, false);
50117b6859fbSMintz, Yuval 		idle_chk->buf_size_set = true;
5012c965db44STomer Tayar 	}
5013c965db44STomer Tayar 
50147b6859fbSMintz, Yuval 	*buf_size = idle_chk->buf_size;
50157b6859fbSMintz, Yuval 
5016c965db44STomer Tayar 	return DBG_STATUS_OK;
5017c965db44STomer Tayar }
5018c965db44STomer Tayar 
5019c965db44STomer Tayar enum dbg_status qed_dbg_idle_chk_dump(struct qed_hwfn *p_hwfn,
5020c965db44STomer Tayar 				      struct qed_ptt *p_ptt,
5021c965db44STomer Tayar 				      u32 *dump_buf,
5022c965db44STomer Tayar 				      u32 buf_size_in_dwords,
5023c965db44STomer Tayar 				      u32 *num_dumped_dwords)
5024c965db44STomer Tayar {
5025c965db44STomer Tayar 	u32 needed_buf_size_in_dwords;
5026c965db44STomer Tayar 	enum dbg_status status;
5027c965db44STomer Tayar 
5028c965db44STomer Tayar 	*num_dumped_dwords = 0;
50297b6859fbSMintz, Yuval 
50307b6859fbSMintz, Yuval 	status = qed_dbg_idle_chk_get_dump_buf_size(p_hwfn,
50317b6859fbSMintz, Yuval 						    p_ptt,
50327b6859fbSMintz, Yuval 						    &needed_buf_size_in_dwords);
5033c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5034c965db44STomer Tayar 		return status;
50357b6859fbSMintz, Yuval 
5036c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5037c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5038c965db44STomer Tayar 
5039c965db44STomer Tayar 	/* Update reset state */
50402d22bc83SMichal Kalderon 	qed_grc_unreset_blocks(p_hwfn, p_ptt, true);
5041c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5042c965db44STomer Tayar 
5043c965db44STomer Tayar 	/* Idle Check Dump */
5044c965db44STomer Tayar 	*num_dumped_dwords = qed_idle_chk_dump(p_hwfn, p_ptt, dump_buf, true);
5045be086e7cSMintz, Yuval 
5046be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5047be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5048be086e7cSMintz, Yuval 
5049c965db44STomer Tayar 	return DBG_STATUS_OK;
5050c965db44STomer Tayar }
5051c965db44STomer Tayar 
5052c965db44STomer Tayar enum dbg_status qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5053c965db44STomer Tayar 						    struct qed_ptt *p_ptt,
5054c965db44STomer Tayar 						    u32 *buf_size)
5055c965db44STomer Tayar {
50562d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5057c965db44STomer Tayar 
5058c965db44STomer Tayar 	*buf_size = 0;
50597b6859fbSMintz, Yuval 
5060c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5061c965db44STomer Tayar 		return status;
50627b6859fbSMintz, Yuval 
5063c965db44STomer Tayar 	return qed_mcp_trace_dump(p_hwfn, p_ptt, NULL, false, buf_size);
5064c965db44STomer Tayar }
5065c965db44STomer Tayar 
5066c965db44STomer Tayar enum dbg_status qed_dbg_mcp_trace_dump(struct qed_hwfn *p_hwfn,
5067c965db44STomer Tayar 				       struct qed_ptt *p_ptt,
5068c965db44STomer Tayar 				       u32 *dump_buf,
5069c965db44STomer Tayar 				       u32 buf_size_in_dwords,
5070c965db44STomer Tayar 				       u32 *num_dumped_dwords)
5071c965db44STomer Tayar {
5072c965db44STomer Tayar 	u32 needed_buf_size_in_dwords;
5073c965db44STomer Tayar 	enum dbg_status status;
5074c965db44STomer Tayar 
5075be086e7cSMintz, Yuval 	status =
50767b6859fbSMintz, Yuval 		qed_dbg_mcp_trace_get_dump_buf_size(p_hwfn,
50777b6859fbSMintz, Yuval 						    p_ptt,
5078c965db44STomer Tayar 						    &needed_buf_size_in_dwords);
50797b6859fbSMintz, Yuval 	if (status != DBG_STATUS_OK && status !=
50807b6859fbSMintz, Yuval 	    DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
5081c965db44STomer Tayar 		return status;
5082be086e7cSMintz, Yuval 
5083c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5084c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5085c965db44STomer Tayar 
5086c965db44STomer Tayar 	/* Update reset state */
5087c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5088c965db44STomer Tayar 
5089c965db44STomer Tayar 	/* Perform dump */
5090be086e7cSMintz, Yuval 	status = qed_mcp_trace_dump(p_hwfn,
5091c965db44STomer Tayar 				    p_ptt, dump_buf, true, num_dumped_dwords);
5092be086e7cSMintz, Yuval 
5093be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5094be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5095be086e7cSMintz, Yuval 
5096be086e7cSMintz, Yuval 	return status;
5097c965db44STomer Tayar }
5098c965db44STomer Tayar 
5099c965db44STomer Tayar enum dbg_status qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5100c965db44STomer Tayar 						   struct qed_ptt *p_ptt,
5101c965db44STomer Tayar 						   u32 *buf_size)
5102c965db44STomer Tayar {
51032d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5104c965db44STomer Tayar 
5105c965db44STomer Tayar 	*buf_size = 0;
51067b6859fbSMintz, Yuval 
5107c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5108c965db44STomer Tayar 		return status;
51097b6859fbSMintz, Yuval 
5110c965db44STomer Tayar 	return qed_reg_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size);
5111c965db44STomer Tayar }
5112c965db44STomer Tayar 
5113c965db44STomer Tayar enum dbg_status qed_dbg_reg_fifo_dump(struct qed_hwfn *p_hwfn,
5114c965db44STomer Tayar 				      struct qed_ptt *p_ptt,
5115c965db44STomer Tayar 				      u32 *dump_buf,
5116c965db44STomer Tayar 				      u32 buf_size_in_dwords,
5117c965db44STomer Tayar 				      u32 *num_dumped_dwords)
5118c965db44STomer Tayar {
5119c965db44STomer Tayar 	u32 needed_buf_size_in_dwords;
5120c965db44STomer Tayar 	enum dbg_status status;
5121c965db44STomer Tayar 
5122c965db44STomer Tayar 	*num_dumped_dwords = 0;
51237b6859fbSMintz, Yuval 
51247b6859fbSMintz, Yuval 	status = qed_dbg_reg_fifo_get_dump_buf_size(p_hwfn,
51257b6859fbSMintz, Yuval 						    p_ptt,
51267b6859fbSMintz, Yuval 						    &needed_buf_size_in_dwords);
5127c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5128c965db44STomer Tayar 		return status;
51297b6859fbSMintz, Yuval 
5130c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5131c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5132c965db44STomer Tayar 
5133c965db44STomer Tayar 	/* Update reset state */
5134c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5135be086e7cSMintz, Yuval 
5136be086e7cSMintz, Yuval 	status = qed_reg_fifo_dump(p_hwfn,
5137c965db44STomer Tayar 				   p_ptt, dump_buf, true, num_dumped_dwords);
5138be086e7cSMintz, Yuval 
5139be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5140be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5141be086e7cSMintz, Yuval 
5142be086e7cSMintz, Yuval 	return status;
5143c965db44STomer Tayar }
5144c965db44STomer Tayar 
5145c965db44STomer Tayar enum dbg_status qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5146c965db44STomer Tayar 						   struct qed_ptt *p_ptt,
5147c965db44STomer Tayar 						   u32 *buf_size)
5148c965db44STomer Tayar {
51492d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5150c965db44STomer Tayar 
5151c965db44STomer Tayar 	*buf_size = 0;
51527b6859fbSMintz, Yuval 
5153c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5154c965db44STomer Tayar 		return status;
51557b6859fbSMintz, Yuval 
5156c965db44STomer Tayar 	return qed_igu_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size);
5157c965db44STomer Tayar }
5158c965db44STomer Tayar 
5159c965db44STomer Tayar enum dbg_status qed_dbg_igu_fifo_dump(struct qed_hwfn *p_hwfn,
5160c965db44STomer Tayar 				      struct qed_ptt *p_ptt,
5161c965db44STomer Tayar 				      u32 *dump_buf,
5162c965db44STomer Tayar 				      u32 buf_size_in_dwords,
5163c965db44STomer Tayar 				      u32 *num_dumped_dwords)
5164c965db44STomer Tayar {
5165c965db44STomer Tayar 	u32 needed_buf_size_in_dwords;
5166c965db44STomer Tayar 	enum dbg_status status;
5167c965db44STomer Tayar 
5168c965db44STomer Tayar 	*num_dumped_dwords = 0;
51697b6859fbSMintz, Yuval 
51707b6859fbSMintz, Yuval 	status = qed_dbg_igu_fifo_get_dump_buf_size(p_hwfn,
51717b6859fbSMintz, Yuval 						    p_ptt,
51727b6859fbSMintz, Yuval 						    &needed_buf_size_in_dwords);
5173c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5174c965db44STomer Tayar 		return status;
51757b6859fbSMintz, Yuval 
5176c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5177c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5178c965db44STomer Tayar 
5179c965db44STomer Tayar 	/* Update reset state */
5180c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5181be086e7cSMintz, Yuval 
5182be086e7cSMintz, Yuval 	status = qed_igu_fifo_dump(p_hwfn,
5183c965db44STomer Tayar 				   p_ptt, dump_buf, true, num_dumped_dwords);
5184be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5185be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5186be086e7cSMintz, Yuval 
5187be086e7cSMintz, Yuval 	return status;
5188c965db44STomer Tayar }
5189c965db44STomer Tayar 
5190c965db44STomer Tayar enum dbg_status
5191c965db44STomer Tayar qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5192c965db44STomer Tayar 					      struct qed_ptt *p_ptt,
5193c965db44STomer Tayar 					      u32 *buf_size)
5194c965db44STomer Tayar {
51952d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5196c965db44STomer Tayar 
5197c965db44STomer Tayar 	*buf_size = 0;
51987b6859fbSMintz, Yuval 
5199c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5200c965db44STomer Tayar 		return status;
52017b6859fbSMintz, Yuval 
5202c965db44STomer Tayar 	return qed_protection_override_dump(p_hwfn,
5203c965db44STomer Tayar 					    p_ptt, NULL, false, buf_size);
5204c965db44STomer Tayar }
5205c965db44STomer Tayar 
5206c965db44STomer Tayar enum dbg_status qed_dbg_protection_override_dump(struct qed_hwfn *p_hwfn,
5207c965db44STomer Tayar 						 struct qed_ptt *p_ptt,
5208c965db44STomer Tayar 						 u32 *dump_buf,
5209c965db44STomer Tayar 						 u32 buf_size_in_dwords,
5210c965db44STomer Tayar 						 u32 *num_dumped_dwords)
5211c965db44STomer Tayar {
52127b6859fbSMintz, Yuval 	u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords;
5213c965db44STomer Tayar 	enum dbg_status status;
5214c965db44STomer Tayar 
5215c965db44STomer Tayar 	*num_dumped_dwords = 0;
52167b6859fbSMintz, Yuval 
52177b6859fbSMintz, Yuval 	status =
52187b6859fbSMintz, Yuval 		qed_dbg_protection_override_get_dump_buf_size(p_hwfn,
52197b6859fbSMintz, Yuval 							      p_ptt,
52207b6859fbSMintz, Yuval 							      p_size);
5221c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5222c965db44STomer Tayar 		return status;
52237b6859fbSMintz, Yuval 
5224c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5225c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5226c965db44STomer Tayar 
5227c965db44STomer Tayar 	/* Update reset state */
5228c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5229be086e7cSMintz, Yuval 
5230be086e7cSMintz, Yuval 	status = qed_protection_override_dump(p_hwfn,
5231c965db44STomer Tayar 					      p_ptt,
5232be086e7cSMintz, Yuval 					      dump_buf,
5233be086e7cSMintz, Yuval 					      true, num_dumped_dwords);
5234be086e7cSMintz, Yuval 
5235be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5236be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5237be086e7cSMintz, Yuval 
5238be086e7cSMintz, Yuval 	return status;
5239c965db44STomer Tayar }
5240c965db44STomer Tayar 
5241c965db44STomer Tayar enum dbg_status qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5242c965db44STomer Tayar 						     struct qed_ptt *p_ptt,
5243c965db44STomer Tayar 						     u32 *buf_size)
5244c965db44STomer Tayar {
52452d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5246c965db44STomer Tayar 
5247c965db44STomer Tayar 	*buf_size = 0;
52487b6859fbSMintz, Yuval 
5249c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5250c965db44STomer Tayar 		return status;
5251c965db44STomer Tayar 
5252c965db44STomer Tayar 	/* Update reset state */
5253c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
52547b6859fbSMintz, Yuval 
5255c965db44STomer Tayar 	*buf_size = qed_fw_asserts_dump(p_hwfn, p_ptt, NULL, false);
52567b6859fbSMintz, Yuval 
5257c965db44STomer Tayar 	return DBG_STATUS_OK;
5258c965db44STomer Tayar }
5259c965db44STomer Tayar 
5260c965db44STomer Tayar enum dbg_status qed_dbg_fw_asserts_dump(struct qed_hwfn *p_hwfn,
5261c965db44STomer Tayar 					struct qed_ptt *p_ptt,
5262c965db44STomer Tayar 					u32 *dump_buf,
5263c965db44STomer Tayar 					u32 buf_size_in_dwords,
5264c965db44STomer Tayar 					u32 *num_dumped_dwords)
5265c965db44STomer Tayar {
52667b6859fbSMintz, Yuval 	u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords;
5267c965db44STomer Tayar 	enum dbg_status status;
5268c965db44STomer Tayar 
5269c965db44STomer Tayar 	*num_dumped_dwords = 0;
52707b6859fbSMintz, Yuval 
52717b6859fbSMintz, Yuval 	status =
52727b6859fbSMintz, Yuval 		qed_dbg_fw_asserts_get_dump_buf_size(p_hwfn,
52737b6859fbSMintz, Yuval 						     p_ptt,
52747b6859fbSMintz, Yuval 						     p_size);
5275c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5276c965db44STomer Tayar 		return status;
52777b6859fbSMintz, Yuval 
5278c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5279c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5280c965db44STomer Tayar 
5281c965db44STomer Tayar 	*num_dumped_dwords = qed_fw_asserts_dump(p_hwfn, p_ptt, dump_buf, true);
52827b6859fbSMintz, Yuval 
52837b6859fbSMintz, Yuval 	/* Revert GRC params to their default */
52847b6859fbSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
52857b6859fbSMintz, Yuval 
5286c965db44STomer Tayar 	return DBG_STATUS_OK;
5287c965db44STomer Tayar }
5288c965db44STomer Tayar 
52898a52bbabSMichal Kalderon static enum dbg_status qed_dbg_ilt_get_dump_buf_size(struct qed_hwfn *p_hwfn,
52908a52bbabSMichal Kalderon 						     struct qed_ptt *p_ptt,
52918a52bbabSMichal Kalderon 						     u32 *buf_size)
52928a52bbabSMichal Kalderon {
52932d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
52948a52bbabSMichal Kalderon 
52958a52bbabSMichal Kalderon 	*buf_size = 0;
52968a52bbabSMichal Kalderon 
52978a52bbabSMichal Kalderon 	if (status != DBG_STATUS_OK)
52988a52bbabSMichal Kalderon 		return status;
52998a52bbabSMichal Kalderon 
53008a52bbabSMichal Kalderon 	*buf_size = qed_ilt_dump(p_hwfn, p_ptt, NULL, false);
53018a52bbabSMichal Kalderon 
53028a52bbabSMichal Kalderon 	return DBG_STATUS_OK;
53038a52bbabSMichal Kalderon }
53048a52bbabSMichal Kalderon 
53058a52bbabSMichal Kalderon static enum dbg_status qed_dbg_ilt_dump(struct qed_hwfn *p_hwfn,
53068a52bbabSMichal Kalderon 					struct qed_ptt *p_ptt,
53078a52bbabSMichal Kalderon 					u32 *dump_buf,
53088a52bbabSMichal Kalderon 					u32 buf_size_in_dwords,
53098a52bbabSMichal Kalderon 					u32 *num_dumped_dwords)
53108a52bbabSMichal Kalderon {
53118a52bbabSMichal Kalderon 	u32 needed_buf_size_in_dwords;
53128a52bbabSMichal Kalderon 	enum dbg_status status;
53138a52bbabSMichal Kalderon 
53148a52bbabSMichal Kalderon 	*num_dumped_dwords = 0;
53158a52bbabSMichal Kalderon 
53168a52bbabSMichal Kalderon 	status = qed_dbg_ilt_get_dump_buf_size(p_hwfn,
53178a52bbabSMichal Kalderon 					       p_ptt,
53188a52bbabSMichal Kalderon 					       &needed_buf_size_in_dwords);
53198a52bbabSMichal Kalderon 	if (status != DBG_STATUS_OK)
53208a52bbabSMichal Kalderon 		return status;
53218a52bbabSMichal Kalderon 
53228a52bbabSMichal Kalderon 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
53238a52bbabSMichal Kalderon 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
53248a52bbabSMichal Kalderon 
53258a52bbabSMichal Kalderon 	*num_dumped_dwords = qed_ilt_dump(p_hwfn, p_ptt, dump_buf, true);
53268a52bbabSMichal Kalderon 
53278a52bbabSMichal Kalderon 	/* Reveret GRC params to their default */
53288a52bbabSMichal Kalderon 	qed_dbg_grc_set_params_default(p_hwfn);
53298a52bbabSMichal Kalderon 
53308a52bbabSMichal Kalderon 	return DBG_STATUS_OK;
53318a52bbabSMichal Kalderon }
53328a52bbabSMichal Kalderon 
53330ebbd1c8SMintz, Yuval enum dbg_status qed_dbg_read_attn(struct qed_hwfn *p_hwfn,
53340ebbd1c8SMintz, Yuval 				  struct qed_ptt *p_ptt,
53350ebbd1c8SMintz, Yuval 				  enum block_id block_id,
53360ebbd1c8SMintz, Yuval 				  enum dbg_attn_type attn_type,
53370ebbd1c8SMintz, Yuval 				  bool clear_status,
53380ebbd1c8SMintz, Yuval 				  struct dbg_attn_block_result *results)
53390ebbd1c8SMintz, Yuval {
53402d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
53410ebbd1c8SMintz, Yuval 	u8 reg_idx, num_attn_regs, num_result_regs = 0;
53420ebbd1c8SMintz, Yuval 	const struct dbg_attn_reg *attn_reg_arr;
53430ebbd1c8SMintz, Yuval 
53440ebbd1c8SMintz, Yuval 	if (status != DBG_STATUS_OK)
53450ebbd1c8SMintz, Yuval 		return status;
53460ebbd1c8SMintz, Yuval 
53472d22bc83SMichal Kalderon 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
53482d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
53492d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
53500ebbd1c8SMintz, Yuval 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
53510ebbd1c8SMintz, Yuval 
53522d22bc83SMichal Kalderon 	attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
53532d22bc83SMichal Kalderon 					       block_id,
53540ebbd1c8SMintz, Yuval 					       attn_type, &num_attn_regs);
53550ebbd1c8SMintz, Yuval 
53560ebbd1c8SMintz, Yuval 	for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
53570ebbd1c8SMintz, Yuval 		const struct dbg_attn_reg *reg_data = &attn_reg_arr[reg_idx];
53580ebbd1c8SMintz, Yuval 		struct dbg_attn_reg_result *reg_result;
53590ebbd1c8SMintz, Yuval 		u32 sts_addr, sts_val;
53600ebbd1c8SMintz, Yuval 		u16 modes_buf_offset;
53610ebbd1c8SMintz, Yuval 		bool eval_mode;
53620ebbd1c8SMintz, Yuval 
53630ebbd1c8SMintz, Yuval 		/* Check mode */
53640ebbd1c8SMintz, Yuval 		eval_mode = GET_FIELD(reg_data->mode.data,
53650ebbd1c8SMintz, Yuval 				      DBG_MODE_HDR_EVAL_MODE) > 0;
53660ebbd1c8SMintz, Yuval 		modes_buf_offset = GET_FIELD(reg_data->mode.data,
53670ebbd1c8SMintz, Yuval 					     DBG_MODE_HDR_MODES_BUF_OFFSET);
53680ebbd1c8SMintz, Yuval 		if (eval_mode && !qed_is_mode_match(p_hwfn, &modes_buf_offset))
53690ebbd1c8SMintz, Yuval 			continue;
53700ebbd1c8SMintz, Yuval 
53710ebbd1c8SMintz, Yuval 		/* Mode match - read attention status register */
53720ebbd1c8SMintz, Yuval 		sts_addr = DWORDS_TO_BYTES(clear_status ?
53730ebbd1c8SMintz, Yuval 					   reg_data->sts_clr_address :
53740ebbd1c8SMintz, Yuval 					   GET_FIELD(reg_data->data,
53750ebbd1c8SMintz, Yuval 						     DBG_ATTN_REG_STS_ADDRESS));
53760ebbd1c8SMintz, Yuval 		sts_val = qed_rd(p_hwfn, p_ptt, sts_addr);
53770ebbd1c8SMintz, Yuval 		if (!sts_val)
53780ebbd1c8SMintz, Yuval 			continue;
53790ebbd1c8SMintz, Yuval 
53800ebbd1c8SMintz, Yuval 		/* Non-zero attention status - add to results */
53810ebbd1c8SMintz, Yuval 		reg_result = &results->reg_results[num_result_regs];
53820ebbd1c8SMintz, Yuval 		SET_FIELD(reg_result->data,
53830ebbd1c8SMintz, Yuval 			  DBG_ATTN_REG_RESULT_STS_ADDRESS, sts_addr);
53840ebbd1c8SMintz, Yuval 		SET_FIELD(reg_result->data,
53850ebbd1c8SMintz, Yuval 			  DBG_ATTN_REG_RESULT_NUM_REG_ATTN,
53860ebbd1c8SMintz, Yuval 			  GET_FIELD(reg_data->data, DBG_ATTN_REG_NUM_REG_ATTN));
53870ebbd1c8SMintz, Yuval 		reg_result->block_attn_offset = reg_data->block_attn_offset;
53880ebbd1c8SMintz, Yuval 		reg_result->sts_val = sts_val;
53890ebbd1c8SMintz, Yuval 		reg_result->mask_val = qed_rd(p_hwfn,
53900ebbd1c8SMintz, Yuval 					      p_ptt,
53910ebbd1c8SMintz, Yuval 					      DWORDS_TO_BYTES
53920ebbd1c8SMintz, Yuval 					      (reg_data->mask_address));
53930ebbd1c8SMintz, Yuval 		num_result_regs++;
53940ebbd1c8SMintz, Yuval 	}
53950ebbd1c8SMintz, Yuval 
53960ebbd1c8SMintz, Yuval 	results->block_id = (u8)block_id;
53970ebbd1c8SMintz, Yuval 	results->names_offset =
53982d22bc83SMichal Kalderon 	    qed_get_block_attn_data(p_hwfn, block_id, attn_type)->names_offset;
53990ebbd1c8SMintz, Yuval 	SET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE, attn_type);
54000ebbd1c8SMintz, Yuval 	SET_FIELD(results->data,
54010ebbd1c8SMintz, Yuval 		  DBG_ATTN_BLOCK_RESULT_NUM_REGS, num_result_regs);
54020ebbd1c8SMintz, Yuval 
54030ebbd1c8SMintz, Yuval 	return DBG_STATUS_OK;
54040ebbd1c8SMintz, Yuval }
54050ebbd1c8SMintz, Yuval 
5406c965db44STomer Tayar /******************************* Data Types **********************************/
5407c965db44STomer Tayar 
54087b6859fbSMintz, Yuval /* REG fifo element */
5409c965db44STomer Tayar struct reg_fifo_element {
5410c965db44STomer Tayar 	u64 data;
5411c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDRESS_SHIFT		0
5412c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDRESS_MASK		0x7fffff
5413c965db44STomer Tayar #define REG_FIFO_ELEMENT_ACCESS_SHIFT		23
5414c965db44STomer Tayar #define REG_FIFO_ELEMENT_ACCESS_MASK		0x1
5415c965db44STomer Tayar #define REG_FIFO_ELEMENT_PF_SHIFT		24
5416c965db44STomer Tayar #define REG_FIFO_ELEMENT_PF_MASK		0xf
5417c965db44STomer Tayar #define REG_FIFO_ELEMENT_VF_SHIFT		28
5418c965db44STomer Tayar #define REG_FIFO_ELEMENT_VF_MASK		0xff
5419c965db44STomer Tayar #define REG_FIFO_ELEMENT_PORT_SHIFT		36
5420c965db44STomer Tayar #define REG_FIFO_ELEMENT_PORT_MASK		0x3
5421c965db44STomer Tayar #define REG_FIFO_ELEMENT_PRIVILEGE_SHIFT	38
5422c965db44STomer Tayar #define REG_FIFO_ELEMENT_PRIVILEGE_MASK		0x3
5423c965db44STomer Tayar #define REG_FIFO_ELEMENT_PROTECTION_SHIFT	40
5424c965db44STomer Tayar #define REG_FIFO_ELEMENT_PROTECTION_MASK	0x7
5425c965db44STomer Tayar #define REG_FIFO_ELEMENT_MASTER_SHIFT		43
5426c965db44STomer Tayar #define REG_FIFO_ELEMENT_MASTER_MASK		0xf
5427c965db44STomer Tayar #define REG_FIFO_ELEMENT_ERROR_SHIFT		47
5428c965db44STomer Tayar #define REG_FIFO_ELEMENT_ERROR_MASK		0x1f
5429c965db44STomer Tayar };
5430c965db44STomer Tayar 
54312d22bc83SMichal Kalderon /* REG fifo error element */
54322d22bc83SMichal Kalderon struct reg_fifo_err {
54332d22bc83SMichal Kalderon 	u32 err_code;
54342d22bc83SMichal Kalderon 	const char *err_msg;
54352d22bc83SMichal Kalderon };
54362d22bc83SMichal Kalderon 
5437c965db44STomer Tayar /* IGU fifo element */
5438c965db44STomer Tayar struct igu_fifo_element {
5439c965db44STomer Tayar 	u32 dword0;
5440c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_FID_SHIFT		0
5441c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_FID_MASK		0xff
5442c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_SHIFT		8
5443c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_MASK		0x1
5444c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_SHIFT		9
5445c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_MASK		0xf
5446c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_SHIFT		13
5447c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_MASK		0xf
5448c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_SHIFT		17
5449c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_MASK		0x7fff
5450c965db44STomer Tayar 	u32 dword1;
5451c965db44STomer Tayar 	u32 dword2;
5452c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_SHIFT	0
5453c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_MASK		0x1
5454c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_SHIFT		1
5455c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_MASK		0xffffffff
5456c965db44STomer Tayar 	u32 reserved;
5457c965db44STomer Tayar };
5458c965db44STomer Tayar 
5459c965db44STomer Tayar struct igu_fifo_wr_data {
5460c965db44STomer Tayar 	u32 data;
5461c965db44STomer Tayar #define IGU_FIFO_WR_DATA_PROD_CONS_SHIFT		0
5462c965db44STomer Tayar #define IGU_FIFO_WR_DATA_PROD_CONS_MASK			0xffffff
5463c965db44STomer Tayar #define IGU_FIFO_WR_DATA_UPDATE_FLAG_SHIFT		24
5464c965db44STomer Tayar #define IGU_FIFO_WR_DATA_UPDATE_FLAG_MASK		0x1
5465c965db44STomer Tayar #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_SHIFT	25
5466c965db44STomer Tayar #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_MASK		0x3
5467c965db44STomer Tayar #define IGU_FIFO_WR_DATA_SEGMENT_SHIFT			27
5468c965db44STomer Tayar #define IGU_FIFO_WR_DATA_SEGMENT_MASK			0x1
5469c965db44STomer Tayar #define IGU_FIFO_WR_DATA_TIMER_MASK_SHIFT		28
5470c965db44STomer Tayar #define IGU_FIFO_WR_DATA_TIMER_MASK_MASK		0x1
5471c965db44STomer Tayar #define IGU_FIFO_WR_DATA_CMD_TYPE_SHIFT			31
5472c965db44STomer Tayar #define IGU_FIFO_WR_DATA_CMD_TYPE_MASK			0x1
5473c965db44STomer Tayar };
5474c965db44STomer Tayar 
5475c965db44STomer Tayar struct igu_fifo_cleanup_wr_data {
5476c965db44STomer Tayar 	u32 data;
5477c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_SHIFT		0
5478c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_MASK		0x7ffffff
5479c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_SHIFT	27
5480c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_MASK	0x1
5481c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_SHIFT	28
5482c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_MASK	0x7
5483c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_SHIFT		31
5484c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_MASK		0x1
5485c965db44STomer Tayar };
5486c965db44STomer Tayar 
5487c965db44STomer Tayar /* Protection override element */
5488c965db44STomer Tayar struct protection_override_element {
5489c965db44STomer Tayar 	u64 data;
5490c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_SHIFT		0
5491c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_MASK		0x7fffff
5492c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_SHIFT		23
5493c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_MASK		0xffffff
5494c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_SHIFT			47
5495c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_MASK			0x1
5496c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_SHIFT			48
5497c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_MASK			0x1
5498c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_SHIFT	49
5499c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_MASK	0x7
5500c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_SHIFT	52
5501c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_MASK	0x7
5502c965db44STomer Tayar };
5503c965db44STomer Tayar 
5504c965db44STomer Tayar enum igu_fifo_sources {
5505c965db44STomer Tayar 	IGU_SRC_PXP0,
5506c965db44STomer Tayar 	IGU_SRC_PXP1,
5507c965db44STomer Tayar 	IGU_SRC_PXP2,
5508c965db44STomer Tayar 	IGU_SRC_PXP3,
5509c965db44STomer Tayar 	IGU_SRC_PXP4,
5510c965db44STomer Tayar 	IGU_SRC_PXP5,
5511c965db44STomer Tayar 	IGU_SRC_PXP6,
5512c965db44STomer Tayar 	IGU_SRC_PXP7,
5513c965db44STomer Tayar 	IGU_SRC_CAU,
5514c965db44STomer Tayar 	IGU_SRC_ATTN,
5515c965db44STomer Tayar 	IGU_SRC_GRC
5516c965db44STomer Tayar };
5517c965db44STomer Tayar 
5518c965db44STomer Tayar enum igu_fifo_addr_types {
5519c965db44STomer Tayar 	IGU_ADDR_TYPE_MSIX_MEM,
5520c965db44STomer Tayar 	IGU_ADDR_TYPE_WRITE_PBA,
5521c965db44STomer Tayar 	IGU_ADDR_TYPE_WRITE_INT_ACK,
5522c965db44STomer Tayar 	IGU_ADDR_TYPE_WRITE_ATTN_BITS,
5523c965db44STomer Tayar 	IGU_ADDR_TYPE_READ_INT,
5524c965db44STomer Tayar 	IGU_ADDR_TYPE_WRITE_PROD_UPDATE,
5525c965db44STomer Tayar 	IGU_ADDR_TYPE_RESERVED
5526c965db44STomer Tayar };
5527c965db44STomer Tayar 
5528c965db44STomer Tayar struct igu_fifo_addr_data {
5529c965db44STomer Tayar 	u16 start_addr;
5530c965db44STomer Tayar 	u16 end_addr;
5531c965db44STomer Tayar 	char *desc;
5532c965db44STomer Tayar 	char *vf_desc;
5533c965db44STomer Tayar 	enum igu_fifo_addr_types type;
5534c965db44STomer Tayar };
5535c965db44STomer Tayar 
5536c965db44STomer Tayar /******************************** Constants **********************************/
5537c965db44STomer Tayar 
5538c965db44STomer Tayar #define MAX_MSG_LEN				1024
55397b6859fbSMintz, Yuval 
5540c965db44STomer Tayar #define MCP_TRACE_MAX_MODULE_LEN		8
5541c965db44STomer Tayar #define MCP_TRACE_FORMAT_MAX_PARAMS		3
5542c965db44STomer Tayar #define MCP_TRACE_FORMAT_PARAM_WIDTH \
55432d22bc83SMichal Kalderon 	(MCP_TRACE_FORMAT_P2_SIZE_OFFSET - MCP_TRACE_FORMAT_P1_SIZE_OFFSET)
55447b6859fbSMintz, Yuval 
5545c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDR_FACTOR		4
5546c965db44STomer Tayar #define REG_FIFO_ELEMENT_IS_PF_VF_VAL		127
55477b6859fbSMintz, Yuval 
5548c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR	4
5549c965db44STomer Tayar 
5550c965db44STomer Tayar /***************************** Constant Arrays *******************************/
5551c965db44STomer Tayar 
5552c965db44STomer Tayar /* Status string array */
5553c965db44STomer Tayar static const char * const s_status_str[] = {
55547b6859fbSMintz, Yuval 	/* DBG_STATUS_OK */
5555c965db44STomer Tayar 	"Operation completed successfully",
55567b6859fbSMintz, Yuval 
55577b6859fbSMintz, Yuval 	/* DBG_STATUS_APP_VERSION_NOT_SET */
5558c965db44STomer Tayar 	"Debug application version wasn't set",
55597b6859fbSMintz, Yuval 
55607b6859fbSMintz, Yuval 	/* DBG_STATUS_UNSUPPORTED_APP_VERSION */
5561c965db44STomer Tayar 	"Unsupported debug application version",
55627b6859fbSMintz, Yuval 
55637b6859fbSMintz, Yuval 	/* DBG_STATUS_DBG_BLOCK_NOT_RESET */
5564c965db44STomer Tayar 	"The debug block wasn't reset since the last recording",
55657b6859fbSMintz, Yuval 
55667b6859fbSMintz, Yuval 	/* DBG_STATUS_INVALID_ARGS */
5567c965db44STomer Tayar 	"Invalid arguments",
55687b6859fbSMintz, Yuval 
55697b6859fbSMintz, Yuval 	/* DBG_STATUS_OUTPUT_ALREADY_SET */
5570c965db44STomer Tayar 	"The debug output was already set",
55717b6859fbSMintz, Yuval 
55727b6859fbSMintz, Yuval 	/* DBG_STATUS_INVALID_PCI_BUF_SIZE */
5573c965db44STomer Tayar 	"Invalid PCI buffer size",
55747b6859fbSMintz, Yuval 
55757b6859fbSMintz, Yuval 	/* DBG_STATUS_PCI_BUF_ALLOC_FAILED */
5576c965db44STomer Tayar 	"PCI buffer allocation failed",
55777b6859fbSMintz, Yuval 
55787b6859fbSMintz, Yuval 	/* DBG_STATUS_PCI_BUF_NOT_ALLOCATED */
5579c965db44STomer Tayar 	"A PCI buffer wasn't allocated",
55807b6859fbSMintz, Yuval 
55812d22bc83SMichal Kalderon 	/* DBG_STATUS_INVALID_FILTER_TRIGGER_DWORDS */
55822d22bc83SMichal Kalderon 	"The filter/trigger constraint dword offsets are not enabled for recording",
5583a5124386SColin Ian King 	/* DBG_STATUS_NO_MATCHING_FRAMING_MODE */
5584a5124386SColin Ian King 	"No matching framing mode",
55857b6859fbSMintz, Yuval 
55862d22bc83SMichal Kalderon 	/* DBG_STATUS_VFC_READ_ERROR */
55872d22bc83SMichal Kalderon 	"Error reading from VFC",
55887b6859fbSMintz, Yuval 
55897b6859fbSMintz, Yuval 	/* DBG_STATUS_STORM_ALREADY_ENABLED */
5590c965db44STomer Tayar 	"The Storm was already enabled",
55917b6859fbSMintz, Yuval 
55927b6859fbSMintz, Yuval 	/* DBG_STATUS_STORM_NOT_ENABLED */
5593c965db44STomer Tayar 	"The specified Storm wasn't enabled",
55947b6859fbSMintz, Yuval 
55957b6859fbSMintz, Yuval 	/* DBG_STATUS_BLOCK_ALREADY_ENABLED */
5596c965db44STomer Tayar 	"The block was already enabled",
55977b6859fbSMintz, Yuval 
55987b6859fbSMintz, Yuval 	/* DBG_STATUS_BLOCK_NOT_ENABLED */
5599c965db44STomer Tayar 	"The specified block wasn't enabled",
56007b6859fbSMintz, Yuval 
56017b6859fbSMintz, Yuval 	/* DBG_STATUS_NO_INPUT_ENABLED */
5602c965db44STomer Tayar 	"No input was enabled for recording",
56037b6859fbSMintz, Yuval 
56042d22bc83SMichal Kalderon 	/* DBG_STATUS_NO_FILTER_TRIGGER_256B */
56052d22bc83SMichal Kalderon 	"Filters and triggers are not allowed in E4 256-bit mode",
56067b6859fbSMintz, Yuval 
56077b6859fbSMintz, Yuval 	/* DBG_STATUS_FILTER_ALREADY_ENABLED */
5608c965db44STomer Tayar 	"The filter was already enabled",
56097b6859fbSMintz, Yuval 
56107b6859fbSMintz, Yuval 	/* DBG_STATUS_TRIGGER_ALREADY_ENABLED */
5611c965db44STomer Tayar 	"The trigger was already enabled",
56127b6859fbSMintz, Yuval 
56137b6859fbSMintz, Yuval 	/* DBG_STATUS_TRIGGER_NOT_ENABLED */
5614c965db44STomer Tayar 	"The trigger wasn't enabled",
56157b6859fbSMintz, Yuval 
56167b6859fbSMintz, Yuval 	/* DBG_STATUS_CANT_ADD_CONSTRAINT */
5617c965db44STomer Tayar 	"A constraint can be added only after a filter was enabled or a trigger state was added",
56187b6859fbSMintz, Yuval 
56197b6859fbSMintz, Yuval 	/* DBG_STATUS_TOO_MANY_TRIGGER_STATES */
5620c965db44STomer Tayar 	"Cannot add more than 3 trigger states",
56217b6859fbSMintz, Yuval 
56227b6859fbSMintz, Yuval 	/* DBG_STATUS_TOO_MANY_CONSTRAINTS */
5623c965db44STomer Tayar 	"Cannot add more than 4 constraints per filter or trigger state",
56247b6859fbSMintz, Yuval 
56257b6859fbSMintz, Yuval 	/* DBG_STATUS_RECORDING_NOT_STARTED */
5626c965db44STomer Tayar 	"The recording wasn't started",
56277b6859fbSMintz, Yuval 
56287b6859fbSMintz, Yuval 	/* DBG_STATUS_DATA_DIDNT_TRIGGER */
5629c965db44STomer Tayar 	"A trigger was configured, but it didn't trigger",
56307b6859fbSMintz, Yuval 
56317b6859fbSMintz, Yuval 	/* DBG_STATUS_NO_DATA_RECORDED */
5632c965db44STomer Tayar 	"No data was recorded",
56337b6859fbSMintz, Yuval 
56347b6859fbSMintz, Yuval 	/* DBG_STATUS_DUMP_BUF_TOO_SMALL */
5635c965db44STomer Tayar 	"Dump buffer is too small",
56367b6859fbSMintz, Yuval 
56377b6859fbSMintz, Yuval 	/* DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED */
5638c965db44STomer Tayar 	"Dumped data is not aligned to chunks",
56397b6859fbSMintz, Yuval 
56407b6859fbSMintz, Yuval 	/* DBG_STATUS_UNKNOWN_CHIP */
5641c965db44STomer Tayar 	"Unknown chip",
56427b6859fbSMintz, Yuval 
56437b6859fbSMintz, Yuval 	/* DBG_STATUS_VIRT_MEM_ALLOC_FAILED */
5644c965db44STomer Tayar 	"Failed allocating virtual memory",
56457b6859fbSMintz, Yuval 
56467b6859fbSMintz, Yuval 	/* DBG_STATUS_BLOCK_IN_RESET */
5647c965db44STomer Tayar 	"The input block is in reset",
56487b6859fbSMintz, Yuval 
56497b6859fbSMintz, Yuval 	/* DBG_STATUS_INVALID_TRACE_SIGNATURE */
5650c965db44STomer Tayar 	"Invalid MCP trace signature found in NVRAM",
56517b6859fbSMintz, Yuval 
56527b6859fbSMintz, Yuval 	/* DBG_STATUS_INVALID_NVRAM_BUNDLE */
5653c965db44STomer Tayar 	"Invalid bundle ID found in NVRAM",
56547b6859fbSMintz, Yuval 
56557b6859fbSMintz, Yuval 	/* DBG_STATUS_NVRAM_GET_IMAGE_FAILED */
5656c965db44STomer Tayar 	"Failed getting NVRAM image",
56577b6859fbSMintz, Yuval 
56587b6859fbSMintz, Yuval 	/* DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE */
5659c965db44STomer Tayar 	"NVRAM image is not dword-aligned",
56607b6859fbSMintz, Yuval 
56617b6859fbSMintz, Yuval 	/* DBG_STATUS_NVRAM_READ_FAILED */
5662c965db44STomer Tayar 	"Failed reading from NVRAM",
56637b6859fbSMintz, Yuval 
56647b6859fbSMintz, Yuval 	/* DBG_STATUS_IDLE_CHK_PARSE_FAILED */
5665c965db44STomer Tayar 	"Idle check parsing failed",
56667b6859fbSMintz, Yuval 
56677b6859fbSMintz, Yuval 	/* DBG_STATUS_MCP_TRACE_BAD_DATA */
5668c965db44STomer Tayar 	"MCP Trace data is corrupt",
56697b6859fbSMintz, Yuval 
56707b6859fbSMintz, Yuval 	/* DBG_STATUS_MCP_TRACE_NO_META */
56717b6859fbSMintz, Yuval 	"Dump doesn't contain meta data - it must be provided in image file",
56727b6859fbSMintz, Yuval 
56737b6859fbSMintz, Yuval 	/* DBG_STATUS_MCP_COULD_NOT_HALT */
5674c965db44STomer Tayar 	"Failed to halt MCP",
56757b6859fbSMintz, Yuval 
56767b6859fbSMintz, Yuval 	/* DBG_STATUS_MCP_COULD_NOT_RESUME */
5677c965db44STomer Tayar 	"Failed to resume MCP after halt",
56787b6859fbSMintz, Yuval 
56792d22bc83SMichal Kalderon 	/* DBG_STATUS_RESERVED0 */
56802d22bc83SMichal Kalderon 	"",
56817b6859fbSMintz, Yuval 
56827b6859fbSMintz, Yuval 	/* DBG_STATUS_SEMI_FIFO_NOT_EMPTY */
5683c965db44STomer Tayar 	"Failed to empty SEMI sync FIFO",
56847b6859fbSMintz, Yuval 
56857b6859fbSMintz, Yuval 	/* DBG_STATUS_IGU_FIFO_BAD_DATA */
5686c965db44STomer Tayar 	"IGU FIFO data is corrupt",
56877b6859fbSMintz, Yuval 
56887b6859fbSMintz, Yuval 	/* DBG_STATUS_MCP_COULD_NOT_MASK_PRTY */
5689c965db44STomer Tayar 	"MCP failed to mask parities",
56907b6859fbSMintz, Yuval 
56917b6859fbSMintz, Yuval 	/* DBG_STATUS_FW_ASSERTS_PARSE_FAILED */
5692c965db44STomer Tayar 	"FW Asserts parsing failed",
56937b6859fbSMintz, Yuval 
56947b6859fbSMintz, Yuval 	/* DBG_STATUS_REG_FIFO_BAD_DATA */
5695c965db44STomer Tayar 	"GRC FIFO data is corrupt",
56967b6859fbSMintz, Yuval 
56977b6859fbSMintz, Yuval 	/* DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA */
5698c965db44STomer Tayar 	"Protection Override data is corrupt",
56997b6859fbSMintz, Yuval 
57007b6859fbSMintz, Yuval 	/* DBG_STATUS_DBG_ARRAY_NOT_SET */
5701c965db44STomer Tayar 	"Debug arrays were not set (when using binary files, dbg_set_bin_ptr must be called)",
57027b6859fbSMintz, Yuval 
57032d22bc83SMichal Kalderon 	/* DBG_STATUS_RESERVED1 */
57042d22bc83SMichal Kalderon 	"",
57057b6859fbSMintz, Yuval 
57067b6859fbSMintz, Yuval 	/* DBG_STATUS_NON_MATCHING_LINES */
57072d22bc83SMichal Kalderon 	"Non-matching debug lines - in E4, all lines must be of the same type (either 128b or 256b)",
57087b6859fbSMintz, Yuval 
57092d22bc83SMichal Kalderon 	/* DBG_STATUS_INSUFFICIENT_HW_IDS */
57102d22bc83SMichal Kalderon 	"Insufficient HW IDs. Try to record less Storms/blocks",
57117b6859fbSMintz, Yuval 
57127b6859fbSMintz, Yuval 	/* DBG_STATUS_DBG_BUS_IN_USE */
57132d22bc83SMichal Kalderon 	"The debug bus is in use",
57142d22bc83SMichal Kalderon 
57152d22bc83SMichal Kalderon 	/* DBG_STATUS_INVALID_STORM_DBG_MODE */
57162d22bc83SMichal Kalderon 	"The storm debug mode is not supported in the current chip",
57172d22bc83SMichal Kalderon 
57182d22bc83SMichal Kalderon 	/* DBG_STATUS_OTHER_ENGINE_BB_ONLY */
57192d22bc83SMichal Kalderon 	"Other engine is supported only in BB",
57202d22bc83SMichal Kalderon 
57212d22bc83SMichal Kalderon 	/* DBG_STATUS_FILTER_SINGLE_HW_ID */
57222d22bc83SMichal Kalderon 	"The configured filter mode requires a single Storm/block input",
57232d22bc83SMichal Kalderon 
57242d22bc83SMichal Kalderon 	/* DBG_STATUS_TRIGGER_SINGLE_HW_ID */
57252d22bc83SMichal Kalderon 	"The configured filter mode requires that all the constraints of a single trigger state will be defined on a single Storm/block input",
57262d22bc83SMichal Kalderon 
57272d22bc83SMichal Kalderon 	/* DBG_STATUS_MISSING_TRIGGER_STATE_STORM */
57282d22bc83SMichal Kalderon 	"When triggering on Storm data, the Storm to trigger on must be specified"
5729c965db44STomer Tayar };
5730c965db44STomer Tayar 
5731c965db44STomer Tayar /* Idle check severity names array */
5732c965db44STomer Tayar static const char * const s_idle_chk_severity_str[] = {
5733c965db44STomer Tayar 	"Error",
5734c965db44STomer Tayar 	"Error if no traffic",
5735c965db44STomer Tayar 	"Warning"
5736c965db44STomer Tayar };
5737c965db44STomer Tayar 
5738c965db44STomer Tayar /* MCP Trace level names array */
5739c965db44STomer Tayar static const char * const s_mcp_trace_level_str[] = {
5740c965db44STomer Tayar 	"ERROR",
5741c965db44STomer Tayar 	"TRACE",
5742c965db44STomer Tayar 	"DEBUG"
5743c965db44STomer Tayar };
5744c965db44STomer Tayar 
57457b6859fbSMintz, Yuval /* Access type names array */
5746c965db44STomer Tayar static const char * const s_access_strs[] = {
5747c965db44STomer Tayar 	"read",
5748c965db44STomer Tayar 	"write"
5749c965db44STomer Tayar };
5750c965db44STomer Tayar 
57517b6859fbSMintz, Yuval /* Privilege type names array */
5752c965db44STomer Tayar static const char * const s_privilege_strs[] = {
5753c965db44STomer Tayar 	"VF",
5754c965db44STomer Tayar 	"PDA",
5755c965db44STomer Tayar 	"HV",
5756c965db44STomer Tayar 	"UA"
5757c965db44STomer Tayar };
5758c965db44STomer Tayar 
57597b6859fbSMintz, Yuval /* Protection type names array */
5760c965db44STomer Tayar static const char * const s_protection_strs[] = {
5761c965db44STomer Tayar 	"(default)",
5762c965db44STomer Tayar 	"(default)",
5763c965db44STomer Tayar 	"(default)",
5764c965db44STomer Tayar 	"(default)",
5765c965db44STomer Tayar 	"override VF",
5766c965db44STomer Tayar 	"override PDA",
5767c965db44STomer Tayar 	"override HV",
5768c965db44STomer Tayar 	"override UA"
5769c965db44STomer Tayar };
5770c965db44STomer Tayar 
57717b6859fbSMintz, Yuval /* Master type names array */
5772c965db44STomer Tayar static const char * const s_master_strs[] = {
5773c965db44STomer Tayar 	"???",
5774c965db44STomer Tayar 	"pxp",
5775c965db44STomer Tayar 	"mcp",
5776c965db44STomer Tayar 	"msdm",
5777c965db44STomer Tayar 	"psdm",
5778c965db44STomer Tayar 	"ysdm",
5779c965db44STomer Tayar 	"usdm",
5780c965db44STomer Tayar 	"tsdm",
5781c965db44STomer Tayar 	"xsdm",
5782c965db44STomer Tayar 	"dbu",
5783c965db44STomer Tayar 	"dmae",
57842d22bc83SMichal Kalderon 	"jdap",
5785c965db44STomer Tayar 	"???",
5786c965db44STomer Tayar 	"???",
5787c965db44STomer Tayar 	"???",
5788c965db44STomer Tayar 	"???"
5789c965db44STomer Tayar };
5790c965db44STomer Tayar 
57917b6859fbSMintz, Yuval /* REG FIFO error messages array */
57922d22bc83SMichal Kalderon static struct reg_fifo_err s_reg_fifo_errors[] = {
57932d22bc83SMichal Kalderon 	{1, "grc timeout"},
57942d22bc83SMichal Kalderon 	{2, "address doesn't belong to any block"},
57952d22bc83SMichal Kalderon 	{4, "reserved address in block or write to read-only address"},
57962d22bc83SMichal Kalderon 	{8, "privilege/protection mismatch"},
57972d22bc83SMichal Kalderon 	{16, "path isolation error"},
57982d22bc83SMichal Kalderon 	{17, "RSL error"}
5799c965db44STomer Tayar };
5800c965db44STomer Tayar 
58017b6859fbSMintz, Yuval /* IGU FIFO sources array */
5802c965db44STomer Tayar static const char * const s_igu_fifo_source_strs[] = {
5803c965db44STomer Tayar 	"TSTORM",
5804c965db44STomer Tayar 	"MSTORM",
5805c965db44STomer Tayar 	"USTORM",
5806c965db44STomer Tayar 	"XSTORM",
5807c965db44STomer Tayar 	"YSTORM",
5808c965db44STomer Tayar 	"PSTORM",
5809c965db44STomer Tayar 	"PCIE",
5810c965db44STomer Tayar 	"NIG_QM_PBF",
5811c965db44STomer Tayar 	"CAU",
5812c965db44STomer Tayar 	"ATTN",
5813c965db44STomer Tayar 	"GRC",
5814c965db44STomer Tayar };
5815c965db44STomer Tayar 
58167b6859fbSMintz, Yuval /* IGU FIFO error messages */
5817c965db44STomer Tayar static const char * const s_igu_fifo_error_strs[] = {
5818c965db44STomer Tayar 	"no error",
5819c965db44STomer Tayar 	"length error",
5820c965db44STomer Tayar 	"function disabled",
58211d510657SColin Ian King 	"VF sent command to attention address",
5822c965db44STomer Tayar 	"host sent prod update command",
5823c965db44STomer Tayar 	"read of during interrupt register while in MIMD mode",
5824c965db44STomer Tayar 	"access to PXP BAR reserved address",
5825c965db44STomer Tayar 	"producer update command to attention index",
5826c965db44STomer Tayar 	"unknown error",
5827c965db44STomer Tayar 	"SB index not valid",
5828c965db44STomer Tayar 	"SB relative index and FID not found",
5829c965db44STomer Tayar 	"FID not match",
5830c965db44STomer Tayar 	"command with error flag asserted (PCI error or CAU discard)",
5831c965db44STomer Tayar 	"VF sent cleanup and RF cleanup is disabled",
5832c965db44STomer Tayar 	"cleanup command on type bigger than 4"
5833c965db44STomer Tayar };
5834c965db44STomer Tayar 
5835c965db44STomer Tayar /* IGU FIFO address data */
5836c965db44STomer Tayar static const struct igu_fifo_addr_data s_igu_fifo_addr_data[] = {
58377b6859fbSMintz, Yuval 	{0x0, 0x101, "MSI-X Memory", NULL,
58387b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_MSIX_MEM},
58397b6859fbSMintz, Yuval 	{0x102, 0x1ff, "reserved", NULL,
58407b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_RESERVED},
58417b6859fbSMintz, Yuval 	{0x200, 0x200, "Write PBA[0:63]", NULL,
58427b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_WRITE_PBA},
5843c965db44STomer Tayar 	{0x201, 0x201, "Write PBA[64:127]", "reserved",
5844c965db44STomer Tayar 	 IGU_ADDR_TYPE_WRITE_PBA},
58457b6859fbSMintz, Yuval 	{0x202, 0x202, "Write PBA[128]", "reserved",
58467b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_WRITE_PBA},
58477b6859fbSMintz, Yuval 	{0x203, 0x3ff, "reserved", NULL,
58487b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_RESERVED},
5849c965db44STomer Tayar 	{0x400, 0x5ef, "Write interrupt acknowledgment", NULL,
5850c965db44STomer Tayar 	 IGU_ADDR_TYPE_WRITE_INT_ACK},
5851c965db44STomer Tayar 	{0x5f0, 0x5f0, "Attention bits update", NULL,
5852c965db44STomer Tayar 	 IGU_ADDR_TYPE_WRITE_ATTN_BITS},
5853c965db44STomer Tayar 	{0x5f1, 0x5f1, "Attention bits set", NULL,
5854c965db44STomer Tayar 	 IGU_ADDR_TYPE_WRITE_ATTN_BITS},
5855c965db44STomer Tayar 	{0x5f2, 0x5f2, "Attention bits clear", NULL,
5856c965db44STomer Tayar 	 IGU_ADDR_TYPE_WRITE_ATTN_BITS},
5857c965db44STomer Tayar 	{0x5f3, 0x5f3, "Read interrupt 0:63 with mask", NULL,
5858c965db44STomer Tayar 	 IGU_ADDR_TYPE_READ_INT},
5859c965db44STomer Tayar 	{0x5f4, 0x5f4, "Read interrupt 0:31 with mask", NULL,
5860c965db44STomer Tayar 	 IGU_ADDR_TYPE_READ_INT},
5861c965db44STomer Tayar 	{0x5f5, 0x5f5, "Read interrupt 32:63 with mask", NULL,
5862c965db44STomer Tayar 	 IGU_ADDR_TYPE_READ_INT},
5863c965db44STomer Tayar 	{0x5f6, 0x5f6, "Read interrupt 0:63 without mask", NULL,
5864c965db44STomer Tayar 	 IGU_ADDR_TYPE_READ_INT},
58657b6859fbSMintz, Yuval 	{0x5f7, 0x5ff, "reserved", NULL,
58667b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_RESERVED},
58677b6859fbSMintz, Yuval 	{0x600, 0x7ff, "Producer update", NULL,
58687b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_WRITE_PROD_UPDATE}
5869c965db44STomer Tayar };
5870c965db44STomer Tayar 
5871c965db44STomer Tayar /******************************** Variables **********************************/
5872c965db44STomer Tayar 
5873c965db44STomer Tayar /* Temporary buffer, used for print size calculations */
5874c965db44STomer Tayar static char s_temp_buf[MAX_MSG_LEN];
5875c965db44STomer Tayar 
58767b6859fbSMintz, Yuval /**************************** Private Functions ******************************/
5877c965db44STomer Tayar 
5878c965db44STomer Tayar static u32 qed_cyclic_add(u32 a, u32 b, u32 size)
5879c965db44STomer Tayar {
5880c965db44STomer Tayar 	return (a + b) % size;
5881c965db44STomer Tayar }
5882c965db44STomer Tayar 
5883c965db44STomer Tayar static u32 qed_cyclic_sub(u32 a, u32 b, u32 size)
5884c965db44STomer Tayar {
5885c965db44STomer Tayar 	return (size + a - b) % size;
5886c965db44STomer Tayar }
5887c965db44STomer Tayar 
5888c965db44STomer Tayar /* Reads the specified number of bytes from the specified cyclic buffer (up to 4
5889c965db44STomer Tayar  * bytes) and returns them as a dword value. the specified buffer offset is
5890c965db44STomer Tayar  * updated.
5891c965db44STomer Tayar  */
5892c965db44STomer Tayar static u32 qed_read_from_cyclic_buf(void *buf,
5893c965db44STomer Tayar 				    u32 *offset,
5894c965db44STomer Tayar 				    u32 buf_size, u8 num_bytes_to_read)
5895c965db44STomer Tayar {
58967b6859fbSMintz, Yuval 	u8 i, *val_ptr, *bytes_buf = (u8 *)buf;
5897c965db44STomer Tayar 	u32 val = 0;
5898c965db44STomer Tayar 
5899c965db44STomer Tayar 	val_ptr = (u8 *)&val;
5900c965db44STomer Tayar 
590150bc60cbSMichal Kalderon 	/* Assume running on a LITTLE ENDIAN and the buffer is network order
590250bc60cbSMichal Kalderon 	 * (BIG ENDIAN), as high order bytes are placed in lower memory address.
590350bc60cbSMichal Kalderon 	 */
5904c965db44STomer Tayar 	for (i = 0; i < num_bytes_to_read; i++) {
5905c965db44STomer Tayar 		val_ptr[i] = bytes_buf[*offset];
5906c965db44STomer Tayar 		*offset = qed_cyclic_add(*offset, 1, buf_size);
5907c965db44STomer Tayar 	}
5908c965db44STomer Tayar 
5909c965db44STomer Tayar 	return val;
5910c965db44STomer Tayar }
5911c965db44STomer Tayar 
5912c965db44STomer Tayar /* Reads and returns the next byte from the specified buffer.
5913c965db44STomer Tayar  * The specified buffer offset is updated.
5914c965db44STomer Tayar  */
5915c965db44STomer Tayar static u8 qed_read_byte_from_buf(void *buf, u32 *offset)
5916c965db44STomer Tayar {
5917c965db44STomer Tayar 	return ((u8 *)buf)[(*offset)++];
5918c965db44STomer Tayar }
5919c965db44STomer Tayar 
5920c965db44STomer Tayar /* Reads and returns the next dword from the specified buffer.
5921c965db44STomer Tayar  * The specified buffer offset is updated.
5922c965db44STomer Tayar  */
5923c965db44STomer Tayar static u32 qed_read_dword_from_buf(void *buf, u32 *offset)
5924c965db44STomer Tayar {
5925c965db44STomer Tayar 	u32 dword_val = *(u32 *)&((u8 *)buf)[*offset];
5926c965db44STomer Tayar 
5927c965db44STomer Tayar 	*offset += 4;
59287b6859fbSMintz, Yuval 
5929c965db44STomer Tayar 	return dword_val;
5930c965db44STomer Tayar }
5931c965db44STomer Tayar 
5932c965db44STomer Tayar /* Reads the next string from the specified buffer, and copies it to the
5933c965db44STomer Tayar  * specified pointer. The specified buffer offset is updated.
5934c965db44STomer Tayar  */
5935c965db44STomer Tayar static void qed_read_str_from_buf(void *buf, u32 *offset, u32 size, char *dest)
5936c965db44STomer Tayar {
5937c965db44STomer Tayar 	const char *source_str = &((const char *)buf)[*offset];
5938c965db44STomer Tayar 
5939c965db44STomer Tayar 	strncpy(dest, source_str, size);
5940c965db44STomer Tayar 	dest[size - 1] = '\0';
5941c965db44STomer Tayar 	*offset += size;
5942c965db44STomer Tayar }
5943c965db44STomer Tayar 
5944c965db44STomer Tayar /* Returns a pointer to the specified offset (in bytes) of the specified buffer.
5945c965db44STomer Tayar  * If the specified buffer in NULL, a temporary buffer pointer is returned.
5946c965db44STomer Tayar  */
5947c965db44STomer Tayar static char *qed_get_buf_ptr(void *buf, u32 offset)
5948c965db44STomer Tayar {
5949c965db44STomer Tayar 	return buf ? (char *)buf + offset : s_temp_buf;
5950c965db44STomer Tayar }
5951c965db44STomer Tayar 
5952c965db44STomer Tayar /* Reads a param from the specified buffer. Returns the number of dwords read.
5953c965db44STomer Tayar  * If the returned str_param is NULL, the param is numeric and its value is
5954c965db44STomer Tayar  * returned in num_param.
5955c965db44STomer Tayar  * Otheriwise, the param is a string and its pointer is returned in str_param.
5956c965db44STomer Tayar  */
5957c965db44STomer Tayar static u32 qed_read_param(u32 *dump_buf,
5958c965db44STomer Tayar 			  const char **param_name,
5959c965db44STomer Tayar 			  const char **param_str_val, u32 *param_num_val)
5960c965db44STomer Tayar {
5961c965db44STomer Tayar 	char *char_buf = (char *)dump_buf;
59627b6859fbSMintz, Yuval 	size_t offset = 0;
5963c965db44STomer Tayar 
5964c965db44STomer Tayar 	/* Extract param name */
5965c965db44STomer Tayar 	*param_name = char_buf;
5966c965db44STomer Tayar 	offset += strlen(*param_name) + 1;
5967c965db44STomer Tayar 
5968c965db44STomer Tayar 	/* Check param type */
5969c965db44STomer Tayar 	if (*(char_buf + offset++)) {
5970c965db44STomer Tayar 		/* String param */
5971c965db44STomer Tayar 		*param_str_val = char_buf + offset;
5972da090917STomer Tayar 		*param_num_val = 0;
5973c965db44STomer Tayar 		offset += strlen(*param_str_val) + 1;
5974c965db44STomer Tayar 		if (offset & 0x3)
5975c965db44STomer Tayar 			offset += (4 - (offset & 0x3));
5976c965db44STomer Tayar 	} else {
5977c965db44STomer Tayar 		/* Numeric param */
5978c965db44STomer Tayar 		*param_str_val = NULL;
5979c965db44STomer Tayar 		if (offset & 0x3)
5980c965db44STomer Tayar 			offset += (4 - (offset & 0x3));
5981c965db44STomer Tayar 		*param_num_val = *(u32 *)(char_buf + offset);
5982c965db44STomer Tayar 		offset += 4;
5983c965db44STomer Tayar 	}
5984c965db44STomer Tayar 
598550bc60cbSMichal Kalderon 	return (u32)offset / 4;
5986c965db44STomer Tayar }
5987c965db44STomer Tayar 
5988c965db44STomer Tayar /* Reads a section header from the specified buffer.
5989c965db44STomer Tayar  * Returns the number of dwords read.
5990c965db44STomer Tayar  */
5991c965db44STomer Tayar static u32 qed_read_section_hdr(u32 *dump_buf,
5992c965db44STomer Tayar 				const char **section_name,
5993c965db44STomer Tayar 				u32 *num_section_params)
5994c965db44STomer Tayar {
5995c965db44STomer Tayar 	const char *param_str_val;
5996c965db44STomer Tayar 
5997c965db44STomer Tayar 	return qed_read_param(dump_buf,
5998c965db44STomer Tayar 			      section_name, &param_str_val, num_section_params);
5999c965db44STomer Tayar }
6000c965db44STomer Tayar 
6001c965db44STomer Tayar /* Reads section params from the specified buffer and prints them to the results
6002c965db44STomer Tayar  * buffer. Returns the number of dwords read.
6003c965db44STomer Tayar  */
6004c965db44STomer Tayar static u32 qed_print_section_params(u32 *dump_buf,
6005c965db44STomer Tayar 				    u32 num_section_params,
6006c965db44STomer Tayar 				    char *results_buf, u32 *num_chars_printed)
6007c965db44STomer Tayar {
6008c965db44STomer Tayar 	u32 i, dump_offset = 0, results_offset = 0;
6009c965db44STomer Tayar 
6010c965db44STomer Tayar 	for (i = 0; i < num_section_params; i++) {
60117b6859fbSMintz, Yuval 		const char *param_name, *param_str_val;
6012c965db44STomer Tayar 		u32 param_num_val = 0;
6013c965db44STomer Tayar 
6014c965db44STomer Tayar 		dump_offset += qed_read_param(dump_buf + dump_offset,
6015c965db44STomer Tayar 					      &param_name,
6016c965db44STomer Tayar 					      &param_str_val, &param_num_val);
60177b6859fbSMintz, Yuval 
6018c965db44STomer Tayar 		if (param_str_val)
6019c965db44STomer Tayar 			results_offset +=
6020c965db44STomer Tayar 				sprintf(qed_get_buf_ptr(results_buf,
6021c965db44STomer Tayar 							results_offset),
6022c965db44STomer Tayar 					"%s: %s\n", param_name, param_str_val);
6023c965db44STomer Tayar 		else if (strcmp(param_name, "fw-timestamp"))
6024c965db44STomer Tayar 			results_offset +=
6025c965db44STomer Tayar 				sprintf(qed_get_buf_ptr(results_buf,
6026c965db44STomer Tayar 							results_offset),
6027c965db44STomer Tayar 					"%s: %d\n", param_name, param_num_val);
6028c965db44STomer Tayar 	}
6029c965db44STomer Tayar 
60307b6859fbSMintz, Yuval 	results_offset += sprintf(qed_get_buf_ptr(results_buf, results_offset),
60317b6859fbSMintz, Yuval 				  "\n");
6032c965db44STomer Tayar 
60337b6859fbSMintz, Yuval 	*num_chars_printed = results_offset;
60347b6859fbSMintz, Yuval 
60357b6859fbSMintz, Yuval 	return dump_offset;
6036c965db44STomer Tayar }
6037c965db44STomer Tayar 
60382d22bc83SMichal Kalderon /* Returns the block name that matches the specified block ID,
60392d22bc83SMichal Kalderon  * or NULL if not found.
60402d22bc83SMichal Kalderon  */
60412d22bc83SMichal Kalderon static const char *qed_dbg_get_block_name(struct qed_hwfn *p_hwfn,
60422d22bc83SMichal Kalderon 					  enum block_id block_id)
60432d22bc83SMichal Kalderon {
60442d22bc83SMichal Kalderon 	const struct dbg_block_user *block =
60452d22bc83SMichal Kalderon 	    (const struct dbg_block_user *)
60462d22bc83SMichal Kalderon 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_USER_DATA].ptr + block_id;
60472d22bc83SMichal Kalderon 
60482d22bc83SMichal Kalderon 	return (const char *)block->name;
60492d22bc83SMichal Kalderon }
60502d22bc83SMichal Kalderon 
60512d22bc83SMichal Kalderon static struct dbg_tools_user_data *qed_dbg_get_user_data(struct qed_hwfn
60522d22bc83SMichal Kalderon 							 *p_hwfn)
6053a3f72307SDenis Bolotin {
6054a3f72307SDenis Bolotin 	return (struct dbg_tools_user_data *)p_hwfn->dbg_user_info;
6055a3f72307SDenis Bolotin }
6056a3f72307SDenis Bolotin 
6057c965db44STomer Tayar /* Parses the idle check rules and returns the number of characters printed.
6058c965db44STomer Tayar  * In case of parsing error, returns 0.
6059c965db44STomer Tayar  */
60602d22bc83SMichal Kalderon static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn,
60612d22bc83SMichal Kalderon 					 u32 *dump_buf,
6062c965db44STomer Tayar 					 u32 *dump_buf_end,
6063c965db44STomer Tayar 					 u32 num_rules,
6064c965db44STomer Tayar 					 bool print_fw_idle_chk,
6065c965db44STomer Tayar 					 char *results_buf,
6066c965db44STomer Tayar 					 u32 *num_errors, u32 *num_warnings)
6067c965db44STomer Tayar {
60687b6859fbSMintz, Yuval 	/* Offset in results_buf in bytes */
60697b6859fbSMintz, Yuval 	u32 results_offset = 0;
60707b6859fbSMintz, Yuval 
60717b6859fbSMintz, Yuval 	u32 rule_idx;
6072c965db44STomer Tayar 	u16 i, j;
6073c965db44STomer Tayar 
6074c965db44STomer Tayar 	*num_errors = 0;
6075c965db44STomer Tayar 	*num_warnings = 0;
6076c965db44STomer Tayar 
6077c965db44STomer Tayar 	/* Go over dumped results */
6078c965db44STomer Tayar 	for (rule_idx = 0; rule_idx < num_rules && dump_buf < dump_buf_end;
6079c965db44STomer Tayar 	     rule_idx++) {
6080c965db44STomer Tayar 		const struct dbg_idle_chk_rule_parsing_data *rule_parsing_data;
6081c965db44STomer Tayar 		struct dbg_idle_chk_result_hdr *hdr;
60827b6859fbSMintz, Yuval 		const char *parsing_str, *lsi_msg;
6083c965db44STomer Tayar 		u32 parsing_str_offset;
6084c965db44STomer Tayar 		bool has_fw_msg;
60857b6859fbSMintz, Yuval 		u8 curr_reg_id;
6086c965db44STomer Tayar 
6087c965db44STomer Tayar 		hdr = (struct dbg_idle_chk_result_hdr *)dump_buf;
6088c965db44STomer Tayar 		rule_parsing_data =
6089c965db44STomer Tayar 		    (const struct dbg_idle_chk_rule_parsing_data *)
60902d22bc83SMichal Kalderon 		    p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr +
60912d22bc83SMichal Kalderon 		    hdr->rule_id;
6092c965db44STomer Tayar 		parsing_str_offset =
6093c965db44STomer Tayar 		    GET_FIELD(rule_parsing_data->data,
6094c965db44STomer Tayar 			      DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET);
6095c965db44STomer Tayar 		has_fw_msg =
6096c965db44STomer Tayar 		    GET_FIELD(rule_parsing_data->data,
6097c965db44STomer Tayar 			      DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG) > 0;
60982d22bc83SMichal Kalderon 		parsing_str = (const char *)
60992d22bc83SMichal Kalderon 		    p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr +
61002d22bc83SMichal Kalderon 		    parsing_str_offset;
6101c965db44STomer Tayar 		lsi_msg = parsing_str;
61027b6859fbSMintz, Yuval 		curr_reg_id = 0;
6103c965db44STomer Tayar 
6104c965db44STomer Tayar 		if (hdr->severity >= MAX_DBG_IDLE_CHK_SEVERITY_TYPES)
6105c965db44STomer Tayar 			return 0;
6106c965db44STomer Tayar 
6107c965db44STomer Tayar 		/* Skip rule header */
61087b6859fbSMintz, Yuval 		dump_buf += BYTES_TO_DWORDS(sizeof(*hdr));
6109c965db44STomer Tayar 
6110c965db44STomer Tayar 		/* Update errors/warnings count */
6111c965db44STomer Tayar 		if (hdr->severity == IDLE_CHK_SEVERITY_ERROR ||
6112c965db44STomer Tayar 		    hdr->severity == IDLE_CHK_SEVERITY_ERROR_NO_TRAFFIC)
6113c965db44STomer Tayar 			(*num_errors)++;
6114c965db44STomer Tayar 		else
6115c965db44STomer Tayar 			(*num_warnings)++;
6116c965db44STomer Tayar 
6117c965db44STomer Tayar 		/* Print rule severity */
6118c965db44STomer Tayar 		results_offset +=
6119c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6120c965db44STomer Tayar 					    results_offset), "%s: ",
6121c965db44STomer Tayar 			    s_idle_chk_severity_str[hdr->severity]);
6122c965db44STomer Tayar 
6123c965db44STomer Tayar 		/* Print rule message */
6124c965db44STomer Tayar 		if (has_fw_msg)
6125c965db44STomer Tayar 			parsing_str += strlen(parsing_str) + 1;
6126c965db44STomer Tayar 		results_offset +=
6127c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6128c965db44STomer Tayar 					    results_offset), "%s.",
6129c965db44STomer Tayar 			    has_fw_msg &&
6130c965db44STomer Tayar 			    print_fw_idle_chk ? parsing_str : lsi_msg);
6131c965db44STomer Tayar 		parsing_str += strlen(parsing_str) + 1;
6132c965db44STomer Tayar 
6133c965db44STomer Tayar 		/* Print register values */
6134c965db44STomer Tayar 		results_offset +=
6135c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6136c965db44STomer Tayar 					    results_offset), " Registers:");
6137c965db44STomer Tayar 		for (i = 0;
6138c965db44STomer Tayar 		     i < hdr->num_dumped_cond_regs + hdr->num_dumped_info_regs;
6139c965db44STomer Tayar 		     i++) {
61407b6859fbSMintz, Yuval 			struct dbg_idle_chk_result_reg_hdr *reg_hdr;
61417b6859fbSMintz, Yuval 			bool is_mem;
61427b6859fbSMintz, Yuval 			u8 reg_id;
61437b6859fbSMintz, Yuval 
61447b6859fbSMintz, Yuval 			reg_hdr =
61457b6859fbSMintz, Yuval 				(struct dbg_idle_chk_result_reg_hdr *)dump_buf;
61467b6859fbSMintz, Yuval 			is_mem = GET_FIELD(reg_hdr->data,
6147c965db44STomer Tayar 					   DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM);
61487b6859fbSMintz, Yuval 			reg_id = GET_FIELD(reg_hdr->data,
6149c965db44STomer Tayar 					   DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID);
6150c965db44STomer Tayar 
6151c965db44STomer Tayar 			/* Skip reg header */
61527b6859fbSMintz, Yuval 			dump_buf += BYTES_TO_DWORDS(sizeof(*reg_hdr));
6153c965db44STomer Tayar 
6154c965db44STomer Tayar 			/* Skip register names until the required reg_id is
6155c965db44STomer Tayar 			 * reached.
6156c965db44STomer Tayar 			 */
6157c965db44STomer Tayar 			for (; reg_id > curr_reg_id;
6158c965db44STomer Tayar 			     curr_reg_id++,
6159c965db44STomer Tayar 			     parsing_str += strlen(parsing_str) + 1);
6160c965db44STomer Tayar 
6161c965db44STomer Tayar 			results_offset +=
6162c965db44STomer Tayar 			    sprintf(qed_get_buf_ptr(results_buf,
6163c965db44STomer Tayar 						    results_offset), " %s",
6164c965db44STomer Tayar 				    parsing_str);
6165c965db44STomer Tayar 			if (i < hdr->num_dumped_cond_regs && is_mem)
6166c965db44STomer Tayar 				results_offset +=
6167c965db44STomer Tayar 				    sprintf(qed_get_buf_ptr(results_buf,
6168c965db44STomer Tayar 							    results_offset),
6169c965db44STomer Tayar 					    "[%d]", hdr->mem_entry_id +
6170c965db44STomer Tayar 					    reg_hdr->start_entry);
6171c965db44STomer Tayar 			results_offset +=
6172c965db44STomer Tayar 			    sprintf(qed_get_buf_ptr(results_buf,
6173c965db44STomer Tayar 						    results_offset), "=");
6174c965db44STomer Tayar 			for (j = 0; j < reg_hdr->size; j++, dump_buf++) {
6175c965db44STomer Tayar 				results_offset +=
6176c965db44STomer Tayar 				    sprintf(qed_get_buf_ptr(results_buf,
6177c965db44STomer Tayar 							    results_offset),
6178c965db44STomer Tayar 					    "0x%x", *dump_buf);
6179c965db44STomer Tayar 				if (j < reg_hdr->size - 1)
6180c965db44STomer Tayar 					results_offset +=
6181c965db44STomer Tayar 					    sprintf(qed_get_buf_ptr
6182c965db44STomer Tayar 						    (results_buf,
6183c965db44STomer Tayar 						     results_offset), ",");
6184c965db44STomer Tayar 			}
6185c965db44STomer Tayar 		}
6186c965db44STomer Tayar 
6187c965db44STomer Tayar 		results_offset +=
6188c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf, results_offset), "\n");
6189c965db44STomer Tayar 	}
6190c965db44STomer Tayar 
6191c965db44STomer Tayar 	/* Check if end of dump buffer was exceeded */
6192c965db44STomer Tayar 	if (dump_buf > dump_buf_end)
6193c965db44STomer Tayar 		return 0;
61947b6859fbSMintz, Yuval 
6195c965db44STomer Tayar 	return results_offset;
6196c965db44STomer Tayar }
6197c965db44STomer Tayar 
6198c965db44STomer Tayar /* Parses an idle check dump buffer.
6199c965db44STomer Tayar  * If result_buf is not NULL, the idle check results are printed to it.
6200c965db44STomer Tayar  * In any case, the required results buffer size is assigned to
6201c965db44STomer Tayar  * parsed_results_bytes.
6202c965db44STomer Tayar  * The parsing status is returned.
6203c965db44STomer Tayar  */
62042d22bc83SMichal Kalderon static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn,
62052d22bc83SMichal Kalderon 					       u32 *dump_buf,
6206c965db44STomer Tayar 					       u32 num_dumped_dwords,
6207c965db44STomer Tayar 					       char *results_buf,
6208c965db44STomer Tayar 					       u32 *parsed_results_bytes,
6209c965db44STomer Tayar 					       u32 *num_errors,
6210c965db44STomer Tayar 					       u32 *num_warnings)
6211c965db44STomer Tayar {
6212c965db44STomer Tayar 	const char *section_name, *param_name, *param_str_val;
6213c965db44STomer Tayar 	u32 *dump_buf_end = dump_buf + num_dumped_dwords;
6214c965db44STomer Tayar 	u32 num_section_params = 0, num_rules;
62157b6859fbSMintz, Yuval 
62167b6859fbSMintz, Yuval 	/* Offset in results_buf in bytes */
62177b6859fbSMintz, Yuval 	u32 results_offset = 0;
6218c965db44STomer Tayar 
6219c965db44STomer Tayar 	*parsed_results_bytes = 0;
6220c965db44STomer Tayar 	*num_errors = 0;
6221c965db44STomer Tayar 	*num_warnings = 0;
62227b6859fbSMintz, Yuval 
62232d22bc83SMichal Kalderon 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr ||
62242d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr)
6225c965db44STomer Tayar 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
6226c965db44STomer Tayar 
6227c965db44STomer Tayar 	/* Read global_params section */
6228c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6229c965db44STomer Tayar 					 &section_name, &num_section_params);
6230c965db44STomer Tayar 	if (strcmp(section_name, "global_params"))
6231c965db44STomer Tayar 		return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6232c965db44STomer Tayar 
6233c965db44STomer Tayar 	/* Print global params */
6234c965db44STomer Tayar 	dump_buf += qed_print_section_params(dump_buf,
6235c965db44STomer Tayar 					     num_section_params,
6236c965db44STomer Tayar 					     results_buf, &results_offset);
6237c965db44STomer Tayar 
6238c965db44STomer Tayar 	/* Read idle_chk section */
6239c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6240c965db44STomer Tayar 					 &section_name, &num_section_params);
6241c965db44STomer Tayar 	if (strcmp(section_name, "idle_chk") || num_section_params != 1)
6242c965db44STomer Tayar 		return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6243c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
6244c965db44STomer Tayar 				   &param_name, &param_str_val, &num_rules);
62457b6859fbSMintz, Yuval 	if (strcmp(param_name, "num_rules"))
6246c965db44STomer Tayar 		return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6247c965db44STomer Tayar 
6248c965db44STomer Tayar 	if (num_rules) {
6249c965db44STomer Tayar 		u32 rules_print_size;
6250c965db44STomer Tayar 
6251c965db44STomer Tayar 		/* Print FW output */
6252c965db44STomer Tayar 		results_offset +=
6253c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6254c965db44STomer Tayar 					    results_offset),
6255c965db44STomer Tayar 			    "FW_IDLE_CHECK:\n");
6256c965db44STomer Tayar 		rules_print_size =
62572d22bc83SMichal Kalderon 			qed_parse_idle_chk_dump_rules(p_hwfn,
62582d22bc83SMichal Kalderon 						      dump_buf,
6259da090917STomer Tayar 						      dump_buf_end,
6260da090917STomer Tayar 						      num_rules,
6261c965db44STomer Tayar 						      true,
6262c965db44STomer Tayar 						      results_buf ?
6263c965db44STomer Tayar 						      results_buf +
6264da090917STomer Tayar 						      results_offset :
6265da090917STomer Tayar 						      NULL,
6266da090917STomer Tayar 						      num_errors,
6267da090917STomer Tayar 						      num_warnings);
6268c965db44STomer Tayar 		results_offset += rules_print_size;
62697b6859fbSMintz, Yuval 		if (!rules_print_size)
6270c965db44STomer Tayar 			return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6271c965db44STomer Tayar 
6272c965db44STomer Tayar 		/* Print LSI output */
6273c965db44STomer Tayar 		results_offset +=
6274c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6275c965db44STomer Tayar 					    results_offset),
6276c965db44STomer Tayar 			    "\nLSI_IDLE_CHECK:\n");
6277c965db44STomer Tayar 		rules_print_size =
62782d22bc83SMichal Kalderon 			qed_parse_idle_chk_dump_rules(p_hwfn,
62792d22bc83SMichal Kalderon 						      dump_buf,
6280da090917STomer Tayar 						      dump_buf_end,
6281da090917STomer Tayar 						      num_rules,
6282c965db44STomer Tayar 						      false,
6283c965db44STomer Tayar 						      results_buf ?
6284c965db44STomer Tayar 						      results_buf +
6285da090917STomer Tayar 						      results_offset :
6286da090917STomer Tayar 						      NULL,
6287da090917STomer Tayar 						      num_errors,
6288da090917STomer Tayar 						      num_warnings);
6289c965db44STomer Tayar 		results_offset += rules_print_size;
62907b6859fbSMintz, Yuval 		if (!rules_print_size)
6291c965db44STomer Tayar 			return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6292c965db44STomer Tayar 	}
6293c965db44STomer Tayar 
6294c965db44STomer Tayar 	/* Print errors/warnings count */
62957b6859fbSMintz, Yuval 	if (*num_errors)
6296c965db44STomer Tayar 		results_offset +=
6297c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6298c965db44STomer Tayar 					    results_offset),
6299c965db44STomer Tayar 			    "\nIdle Check failed!!! (with %d errors and %d warnings)\n",
6300c965db44STomer Tayar 			    *num_errors, *num_warnings);
63017b6859fbSMintz, Yuval 	else if (*num_warnings)
6302c965db44STomer Tayar 		results_offset +=
6303c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6304c965db44STomer Tayar 					    results_offset),
63057b6859fbSMintz, Yuval 			    "\nIdle Check completed successfully (with %d warnings)\n",
6306c965db44STomer Tayar 			    *num_warnings);
63077b6859fbSMintz, Yuval 	else
6308c965db44STomer Tayar 		results_offset +=
6309c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6310c965db44STomer Tayar 					    results_offset),
63117b6859fbSMintz, Yuval 			    "\nIdle Check completed successfully\n");
6312c965db44STomer Tayar 
6313c965db44STomer Tayar 	/* Add 1 for string NULL termination */
6314c965db44STomer Tayar 	*parsed_results_bytes = results_offset + 1;
63157b6859fbSMintz, Yuval 
6316c965db44STomer Tayar 	return DBG_STATUS_OK;
6317c965db44STomer Tayar }
6318c965db44STomer Tayar 
6319c965db44STomer Tayar /* Allocates and fills MCP Trace meta data based on the specified meta data
6320c965db44STomer Tayar  * dump buffer.
6321c965db44STomer Tayar  * Returns debug status code.
6322c965db44STomer Tayar  */
6323a3f72307SDenis Bolotin static enum dbg_status
6324a3f72307SDenis Bolotin qed_mcp_trace_alloc_meta_data(struct qed_hwfn *p_hwfn,
6325a3f72307SDenis Bolotin 			      const u32 *meta_buf)
6326c965db44STomer Tayar {
6327a3f72307SDenis Bolotin 	struct dbg_tools_user_data *dev_user_data;
6328c965db44STomer Tayar 	u32 offset = 0, signature, i;
6329a3f72307SDenis Bolotin 	struct mcp_trace_meta *meta;
6330a3f72307SDenis Bolotin 	u8 *meta_buf_bytes;
6331a3f72307SDenis Bolotin 
6332a3f72307SDenis Bolotin 	dev_user_data = qed_dbg_get_user_data(p_hwfn);
6333a3f72307SDenis Bolotin 	meta = &dev_user_data->mcp_trace_meta;
6334a3f72307SDenis Bolotin 	meta_buf_bytes = (u8 *)meta_buf;
6335c965db44STomer Tayar 
633650bc60cbSMichal Kalderon 	/* Free the previous meta before loading a new one. */
6337a3f72307SDenis Bolotin 	if (meta->is_allocated)
6338a3f72307SDenis Bolotin 		qed_mcp_trace_free_meta_data(p_hwfn);
633950bc60cbSMichal Kalderon 
6340c965db44STomer Tayar 	memset(meta, 0, sizeof(*meta));
6341c965db44STomer Tayar 
6342c965db44STomer Tayar 	/* Read first signature */
6343c965db44STomer Tayar 	signature = qed_read_dword_from_buf(meta_buf_bytes, &offset);
63447b6859fbSMintz, Yuval 	if (signature != NVM_MAGIC_VALUE)
6345c965db44STomer Tayar 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
6346c965db44STomer Tayar 
63477b6859fbSMintz, Yuval 	/* Read no. of modules and allocate memory for their pointers */
6348c965db44STomer Tayar 	meta->modules_num = qed_read_byte_from_buf(meta_buf_bytes, &offset);
63496396bb22SKees Cook 	meta->modules = kcalloc(meta->modules_num, sizeof(char *),
63506396bb22SKees Cook 				GFP_KERNEL);
6351c965db44STomer Tayar 	if (!meta->modules)
6352c965db44STomer Tayar 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6353c965db44STomer Tayar 
6354c965db44STomer Tayar 	/* Allocate and read all module strings */
6355c965db44STomer Tayar 	for (i = 0; i < meta->modules_num; i++) {
6356c965db44STomer Tayar 		u8 module_len = qed_read_byte_from_buf(meta_buf_bytes, &offset);
6357c965db44STomer Tayar 
6358c965db44STomer Tayar 		*(meta->modules + i) = kzalloc(module_len, GFP_KERNEL);
6359c965db44STomer Tayar 		if (!(*(meta->modules + i))) {
6360c965db44STomer Tayar 			/* Update number of modules to be released */
6361c965db44STomer Tayar 			meta->modules_num = i ? i - 1 : 0;
6362c965db44STomer Tayar 			return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6363c965db44STomer Tayar 		}
6364c965db44STomer Tayar 
6365c965db44STomer Tayar 		qed_read_str_from_buf(meta_buf_bytes, &offset, module_len,
6366c965db44STomer Tayar 				      *(meta->modules + i));
6367c965db44STomer Tayar 		if (module_len > MCP_TRACE_MAX_MODULE_LEN)
6368c965db44STomer Tayar 			(*(meta->modules + i))[MCP_TRACE_MAX_MODULE_LEN] = '\0';
6369c965db44STomer Tayar 	}
6370c965db44STomer Tayar 
6371c965db44STomer Tayar 	/* Read second signature */
6372c965db44STomer Tayar 	signature = qed_read_dword_from_buf(meta_buf_bytes, &offset);
63737b6859fbSMintz, Yuval 	if (signature != NVM_MAGIC_VALUE)
6374c965db44STomer Tayar 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
6375c965db44STomer Tayar 
6376c965db44STomer Tayar 	/* Read number of formats and allocate memory for all formats */
6377c965db44STomer Tayar 	meta->formats_num = qed_read_dword_from_buf(meta_buf_bytes, &offset);
63786396bb22SKees Cook 	meta->formats = kcalloc(meta->formats_num,
6379c965db44STomer Tayar 				sizeof(struct mcp_trace_format),
6380c965db44STomer Tayar 				GFP_KERNEL);
6381c965db44STomer Tayar 	if (!meta->formats)
6382c965db44STomer Tayar 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6383c965db44STomer Tayar 
6384c965db44STomer Tayar 	/* Allocate and read all strings */
6385c965db44STomer Tayar 	for (i = 0; i < meta->formats_num; i++) {
6386c965db44STomer Tayar 		struct mcp_trace_format *format_ptr = &meta->formats[i];
6387c965db44STomer Tayar 		u8 format_len;
6388c965db44STomer Tayar 
6389c965db44STomer Tayar 		format_ptr->data = qed_read_dword_from_buf(meta_buf_bytes,
6390c965db44STomer Tayar 							   &offset);
63912d22bc83SMichal Kalderon 		format_len = GET_MFW_FIELD(format_ptr->data,
63922d22bc83SMichal Kalderon 					   MCP_TRACE_FORMAT_LEN);
6393c965db44STomer Tayar 		format_ptr->format_str = kzalloc(format_len, GFP_KERNEL);
6394c965db44STomer Tayar 		if (!format_ptr->format_str) {
6395c965db44STomer Tayar 			/* Update number of modules to be released */
6396c965db44STomer Tayar 			meta->formats_num = i ? i - 1 : 0;
6397c965db44STomer Tayar 			return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6398c965db44STomer Tayar 		}
6399c965db44STomer Tayar 
6400c965db44STomer Tayar 		qed_read_str_from_buf(meta_buf_bytes,
6401c965db44STomer Tayar 				      &offset,
6402c965db44STomer Tayar 				      format_len, format_ptr->format_str);
6403c965db44STomer Tayar 	}
6404c965db44STomer Tayar 
6405a3f72307SDenis Bolotin 	meta->is_allocated = true;
6406c965db44STomer Tayar 	return DBG_STATUS_OK;
6407c965db44STomer Tayar }
6408c965db44STomer Tayar 
640950bc60cbSMichal Kalderon /* Parses an MCP trace buffer. If result_buf is not NULL, the MCP Trace results
641050bc60cbSMichal Kalderon  * are printed to it. The parsing status is returned.
641150bc60cbSMichal Kalderon  * Arguments:
641250bc60cbSMichal Kalderon  * trace_buf - MCP trace cyclic buffer
641350bc60cbSMichal Kalderon  * trace_buf_size - MCP trace cyclic buffer size in bytes
641450bc60cbSMichal Kalderon  * data_offset - offset in bytes of the data to parse in the MCP trace cyclic
641550bc60cbSMichal Kalderon  *		 buffer.
641650bc60cbSMichal Kalderon  * data_size - size in bytes of data to parse.
641750bc60cbSMichal Kalderon  * parsed_buf - destination buffer for parsed data.
6418a3f72307SDenis Bolotin  * parsed_results_bytes - size of parsed data in bytes.
641950bc60cbSMichal Kalderon  */
6420a3f72307SDenis Bolotin static enum dbg_status qed_parse_mcp_trace_buf(struct qed_hwfn *p_hwfn,
6421a3f72307SDenis Bolotin 					       u8 *trace_buf,
642250bc60cbSMichal Kalderon 					       u32 trace_buf_size,
642350bc60cbSMichal Kalderon 					       u32 data_offset,
642450bc60cbSMichal Kalderon 					       u32 data_size,
642550bc60cbSMichal Kalderon 					       char *parsed_buf,
6426a3f72307SDenis Bolotin 					       u32 *parsed_results_bytes)
642750bc60cbSMichal Kalderon {
6428a3f72307SDenis Bolotin 	struct dbg_tools_user_data *dev_user_data;
6429a3f72307SDenis Bolotin 	struct mcp_trace_meta *meta;
643050bc60cbSMichal Kalderon 	u32 param_mask, param_shift;
643150bc60cbSMichal Kalderon 	enum dbg_status status;
643250bc60cbSMichal Kalderon 
6433a3f72307SDenis Bolotin 	dev_user_data = qed_dbg_get_user_data(p_hwfn);
6434a3f72307SDenis Bolotin 	meta = &dev_user_data->mcp_trace_meta;
6435a3f72307SDenis Bolotin 	*parsed_results_bytes = 0;
643650bc60cbSMichal Kalderon 
6437a3f72307SDenis Bolotin 	if (!meta->is_allocated)
643850bc60cbSMichal Kalderon 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
643950bc60cbSMichal Kalderon 
644050bc60cbSMichal Kalderon 	status = DBG_STATUS_OK;
644150bc60cbSMichal Kalderon 
644250bc60cbSMichal Kalderon 	while (data_size) {
644350bc60cbSMichal Kalderon 		struct mcp_trace_format *format_ptr;
644450bc60cbSMichal Kalderon 		u8 format_level, format_module;
644550bc60cbSMichal Kalderon 		u32 params[3] = { 0, 0, 0 };
644650bc60cbSMichal Kalderon 		u32 header, format_idx, i;
644750bc60cbSMichal Kalderon 
644850bc60cbSMichal Kalderon 		if (data_size < MFW_TRACE_ENTRY_SIZE)
644950bc60cbSMichal Kalderon 			return DBG_STATUS_MCP_TRACE_BAD_DATA;
645050bc60cbSMichal Kalderon 
645150bc60cbSMichal Kalderon 		header = qed_read_from_cyclic_buf(trace_buf,
645250bc60cbSMichal Kalderon 						  &data_offset,
645350bc60cbSMichal Kalderon 						  trace_buf_size,
645450bc60cbSMichal Kalderon 						  MFW_TRACE_ENTRY_SIZE);
645550bc60cbSMichal Kalderon 		data_size -= MFW_TRACE_ENTRY_SIZE;
645650bc60cbSMichal Kalderon 		format_idx = header & MFW_TRACE_EVENTID_MASK;
645750bc60cbSMichal Kalderon 
645850bc60cbSMichal Kalderon 		/* Skip message if its index doesn't exist in the meta data */
6459a3f72307SDenis Bolotin 		if (format_idx >= meta->formats_num) {
64602d22bc83SMichal Kalderon 			u8 format_size = (u8)GET_MFW_FIELD(header,
64612d22bc83SMichal Kalderon 							   MFW_TRACE_PRM_SIZE);
646250bc60cbSMichal Kalderon 
646350bc60cbSMichal Kalderon 			if (data_size < format_size)
646450bc60cbSMichal Kalderon 				return DBG_STATUS_MCP_TRACE_BAD_DATA;
646550bc60cbSMichal Kalderon 
646650bc60cbSMichal Kalderon 			data_offset = qed_cyclic_add(data_offset,
646750bc60cbSMichal Kalderon 						     format_size,
646850bc60cbSMichal Kalderon 						     trace_buf_size);
646950bc60cbSMichal Kalderon 			data_size -= format_size;
647050bc60cbSMichal Kalderon 			continue;
647150bc60cbSMichal Kalderon 		}
647250bc60cbSMichal Kalderon 
6473a3f72307SDenis Bolotin 		format_ptr = &meta->formats[format_idx];
647450bc60cbSMichal Kalderon 
647550bc60cbSMichal Kalderon 		for (i = 0,
64762d22bc83SMichal Kalderon 		     param_mask = MCP_TRACE_FORMAT_P1_SIZE_MASK, param_shift =
64772d22bc83SMichal Kalderon 		     MCP_TRACE_FORMAT_P1_SIZE_OFFSET;
647850bc60cbSMichal Kalderon 		     i < MCP_TRACE_FORMAT_MAX_PARAMS;
64792d22bc83SMichal Kalderon 		     i++, param_mask <<= MCP_TRACE_FORMAT_PARAM_WIDTH,
648050bc60cbSMichal Kalderon 		     param_shift += MCP_TRACE_FORMAT_PARAM_WIDTH) {
648150bc60cbSMichal Kalderon 			/* Extract param size (0..3) */
648250bc60cbSMichal Kalderon 			u8 param_size = (u8)((format_ptr->data & param_mask) >>
648350bc60cbSMichal Kalderon 					     param_shift);
648450bc60cbSMichal Kalderon 
648550bc60cbSMichal Kalderon 			/* If the param size is zero, there are no other
648650bc60cbSMichal Kalderon 			 * parameters.
648750bc60cbSMichal Kalderon 			 */
648850bc60cbSMichal Kalderon 			if (!param_size)
648950bc60cbSMichal Kalderon 				break;
649050bc60cbSMichal Kalderon 
649150bc60cbSMichal Kalderon 			/* Size is encoded using 2 bits, where 3 is used to
649250bc60cbSMichal Kalderon 			 * encode 4.
649350bc60cbSMichal Kalderon 			 */
649450bc60cbSMichal Kalderon 			if (param_size == 3)
649550bc60cbSMichal Kalderon 				param_size = 4;
649650bc60cbSMichal Kalderon 
649750bc60cbSMichal Kalderon 			if (data_size < param_size)
649850bc60cbSMichal Kalderon 				return DBG_STATUS_MCP_TRACE_BAD_DATA;
649950bc60cbSMichal Kalderon 
650050bc60cbSMichal Kalderon 			params[i] = qed_read_from_cyclic_buf(trace_buf,
650150bc60cbSMichal Kalderon 							     &data_offset,
650250bc60cbSMichal Kalderon 							     trace_buf_size,
650350bc60cbSMichal Kalderon 							     param_size);
650450bc60cbSMichal Kalderon 			data_size -= param_size;
650550bc60cbSMichal Kalderon 		}
650650bc60cbSMichal Kalderon 
65072d22bc83SMichal Kalderon 		format_level = (u8)GET_MFW_FIELD(format_ptr->data,
65082d22bc83SMichal Kalderon 						 MCP_TRACE_FORMAT_LEVEL);
65092d22bc83SMichal Kalderon 		format_module = (u8)GET_MFW_FIELD(format_ptr->data,
65102d22bc83SMichal Kalderon 						  MCP_TRACE_FORMAT_MODULE);
651150bc60cbSMichal Kalderon 		if (format_level >= ARRAY_SIZE(s_mcp_trace_level_str))
651250bc60cbSMichal Kalderon 			return DBG_STATUS_MCP_TRACE_BAD_DATA;
651350bc60cbSMichal Kalderon 
651450bc60cbSMichal Kalderon 		/* Print current message to results buffer */
6515a3f72307SDenis Bolotin 		*parsed_results_bytes +=
6516a3f72307SDenis Bolotin 			sprintf(qed_get_buf_ptr(parsed_buf,
6517a3f72307SDenis Bolotin 						*parsed_results_bytes),
651850bc60cbSMichal Kalderon 				"%s %-8s: ",
651950bc60cbSMichal Kalderon 				s_mcp_trace_level_str[format_level],
6520a3f72307SDenis Bolotin 				meta->modules[format_module]);
6521a3f72307SDenis Bolotin 		*parsed_results_bytes +=
6522a3f72307SDenis Bolotin 		    sprintf(qed_get_buf_ptr(parsed_buf, *parsed_results_bytes),
652350bc60cbSMichal Kalderon 			    format_ptr->format_str,
652450bc60cbSMichal Kalderon 			    params[0], params[1], params[2]);
652550bc60cbSMichal Kalderon 	}
652650bc60cbSMichal Kalderon 
652750bc60cbSMichal Kalderon 	/* Add string NULL terminator */
6528a3f72307SDenis Bolotin 	(*parsed_results_bytes)++;
652950bc60cbSMichal Kalderon 
653050bc60cbSMichal Kalderon 	return status;
653150bc60cbSMichal Kalderon }
653250bc60cbSMichal Kalderon 
6533c965db44STomer Tayar /* Parses an MCP Trace dump buffer.
6534c965db44STomer Tayar  * If result_buf is not NULL, the MCP Trace results are printed to it.
6535c965db44STomer Tayar  * In any case, the required results buffer size is assigned to
6536a3f72307SDenis Bolotin  * parsed_results_bytes.
6537c965db44STomer Tayar  * The parsing status is returned.
6538c965db44STomer Tayar  */
6539c965db44STomer Tayar static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn,
6540c965db44STomer Tayar 						u32 *dump_buf,
6541a3f72307SDenis Bolotin 						char *results_buf,
6542a3f72307SDenis Bolotin 						u32 *parsed_results_bytes,
6543a3f72307SDenis Bolotin 						bool free_meta_data)
6544c965db44STomer Tayar {
6545c965db44STomer Tayar 	const char *section_name, *param_name, *param_str_val;
654650bc60cbSMichal Kalderon 	u32 data_size, trace_data_dwords, trace_meta_dwords;
6547a3f72307SDenis Bolotin 	u32 offset, results_offset, results_buf_bytes;
654850bc60cbSMichal Kalderon 	u32 param_num_val, num_section_params;
6549c965db44STomer Tayar 	struct mcp_trace *trace;
6550c965db44STomer Tayar 	enum dbg_status status;
6551c965db44STomer Tayar 	const u32 *meta_buf;
6552c965db44STomer Tayar 	u8 *trace_buf;
6553c965db44STomer Tayar 
6554a3f72307SDenis Bolotin 	*parsed_results_bytes = 0;
6555c965db44STomer Tayar 
6556c965db44STomer Tayar 	/* Read global_params section */
6557c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6558c965db44STomer Tayar 					 &section_name, &num_section_params);
6559c965db44STomer Tayar 	if (strcmp(section_name, "global_params"))
6560c965db44STomer Tayar 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6561c965db44STomer Tayar 
6562c965db44STomer Tayar 	/* Print global params */
6563c965db44STomer Tayar 	dump_buf += qed_print_section_params(dump_buf,
6564c965db44STomer Tayar 					     num_section_params,
6565a3f72307SDenis Bolotin 					     results_buf, &results_offset);
6566c965db44STomer Tayar 
6567c965db44STomer Tayar 	/* Read trace_data section */
6568c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6569c965db44STomer Tayar 					 &section_name, &num_section_params);
6570c965db44STomer Tayar 	if (strcmp(section_name, "mcp_trace_data") || num_section_params != 1)
6571c965db44STomer Tayar 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6572c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
6573c965db44STomer Tayar 				   &param_name, &param_str_val, &param_num_val);
6574c965db44STomer Tayar 	if (strcmp(param_name, "size"))
6575c965db44STomer Tayar 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6576c965db44STomer Tayar 	trace_data_dwords = param_num_val;
6577c965db44STomer Tayar 
6578c965db44STomer Tayar 	/* Prepare trace info */
6579c965db44STomer Tayar 	trace = (struct mcp_trace *)dump_buf;
6580a3f72307SDenis Bolotin 	if (trace->signature != MFW_TRACE_SIGNATURE || !trace->size)
6581a3f72307SDenis Bolotin 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6582a3f72307SDenis Bolotin 
65837b6859fbSMintz, Yuval 	trace_buf = (u8 *)dump_buf + sizeof(*trace);
6584c965db44STomer Tayar 	offset = trace->trace_oldest;
658550bc60cbSMichal Kalderon 	data_size = qed_cyclic_sub(trace->trace_prod, offset, trace->size);
6586c965db44STomer Tayar 	dump_buf += trace_data_dwords;
6587c965db44STomer Tayar 
6588c965db44STomer Tayar 	/* Read meta_data section */
6589c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6590c965db44STomer Tayar 					 &section_name, &num_section_params);
6591c965db44STomer Tayar 	if (strcmp(section_name, "mcp_trace_meta"))
6592c965db44STomer Tayar 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6593c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
6594c965db44STomer Tayar 				   &param_name, &param_str_val, &param_num_val);
65957b6859fbSMintz, Yuval 	if (strcmp(param_name, "size"))
6596c965db44STomer Tayar 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
6597c965db44STomer Tayar 	trace_meta_dwords = param_num_val;
6598c965db44STomer Tayar 
6599c965db44STomer Tayar 	/* Choose meta data buffer */
6600c965db44STomer Tayar 	if (!trace_meta_dwords) {
6601c965db44STomer Tayar 		/* Dump doesn't include meta data */
6602a3f72307SDenis Bolotin 		struct dbg_tools_user_data *dev_user_data =
6603a3f72307SDenis Bolotin 			qed_dbg_get_user_data(p_hwfn);
6604a3f72307SDenis Bolotin 
6605a3f72307SDenis Bolotin 		if (!dev_user_data->mcp_trace_user_meta_buf)
6606c965db44STomer Tayar 			return DBG_STATUS_MCP_TRACE_NO_META;
6607a3f72307SDenis Bolotin 
6608a3f72307SDenis Bolotin 		meta_buf = dev_user_data->mcp_trace_user_meta_buf;
6609c965db44STomer Tayar 	} else {
6610c965db44STomer Tayar 		/* Dump includes meta data */
6611c965db44STomer Tayar 		meta_buf = dump_buf;
6612c965db44STomer Tayar 	}
6613c965db44STomer Tayar 
6614c965db44STomer Tayar 	/* Allocate meta data memory */
6615a3f72307SDenis Bolotin 	status = qed_mcp_trace_alloc_meta_data(p_hwfn, meta_buf);
6616c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
6617c965db44STomer Tayar 		return status;
661850bc60cbSMichal Kalderon 
6619a3f72307SDenis Bolotin 	status = qed_parse_mcp_trace_buf(p_hwfn,
6620a3f72307SDenis Bolotin 					 trace_buf,
662150bc60cbSMichal Kalderon 					 trace->size,
662250bc60cbSMichal Kalderon 					 offset,
662350bc60cbSMichal Kalderon 					 data_size,
6624a3f72307SDenis Bolotin 					 results_buf ?
6625a3f72307SDenis Bolotin 					 results_buf + results_offset :
662650bc60cbSMichal Kalderon 					 NULL,
6627a3f72307SDenis Bolotin 					 &results_buf_bytes);
662850bc60cbSMichal Kalderon 	if (status != DBG_STATUS_OK)
662950bc60cbSMichal Kalderon 		return status;
663050bc60cbSMichal Kalderon 
6631a3f72307SDenis Bolotin 	if (free_meta_data)
6632a3f72307SDenis Bolotin 		qed_mcp_trace_free_meta_data(p_hwfn);
6633a3f72307SDenis Bolotin 
6634a3f72307SDenis Bolotin 	*parsed_results_bytes = results_offset + results_buf_bytes;
663550bc60cbSMichal Kalderon 
663650bc60cbSMichal Kalderon 	return DBG_STATUS_OK;
6637c965db44STomer Tayar }
6638c965db44STomer Tayar 
6639c965db44STomer Tayar /* Parses a Reg FIFO dump buffer.
6640c965db44STomer Tayar  * If result_buf is not NULL, the Reg FIFO results are printed to it.
6641c965db44STomer Tayar  * In any case, the required results buffer size is assigned to
6642c965db44STomer Tayar  * parsed_results_bytes.
6643c965db44STomer Tayar  * The parsing status is returned.
6644c965db44STomer Tayar  */
6645da090917STomer Tayar static enum dbg_status qed_parse_reg_fifo_dump(u32 *dump_buf,
6646c965db44STomer Tayar 					       char *results_buf,
6647c965db44STomer Tayar 					       u32 *parsed_results_bytes)
6648c965db44STomer Tayar {
6649c965db44STomer Tayar 	const char *section_name, *param_name, *param_str_val;
66507b6859fbSMintz, Yuval 	u32 param_num_val, num_section_params, num_elements;
6651c965db44STomer Tayar 	struct reg_fifo_element *elements;
66522d22bc83SMichal Kalderon 	u8 i, j, err_code, vf_val;
66537b6859fbSMintz, Yuval 	u32 results_offset = 0;
6654c965db44STomer Tayar 	char vf_str[4];
6655c965db44STomer Tayar 
6656c965db44STomer Tayar 	/* Read global_params section */
6657c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6658c965db44STomer Tayar 					 &section_name, &num_section_params);
6659c965db44STomer Tayar 	if (strcmp(section_name, "global_params"))
6660c965db44STomer Tayar 		return DBG_STATUS_REG_FIFO_BAD_DATA;
6661c965db44STomer Tayar 
6662c965db44STomer Tayar 	/* Print global params */
6663c965db44STomer Tayar 	dump_buf += qed_print_section_params(dump_buf,
6664c965db44STomer Tayar 					     num_section_params,
6665c965db44STomer Tayar 					     results_buf, &results_offset);
6666c965db44STomer Tayar 
6667c965db44STomer Tayar 	/* Read reg_fifo_data section */
6668c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6669c965db44STomer Tayar 					 &section_name, &num_section_params);
6670c965db44STomer Tayar 	if (strcmp(section_name, "reg_fifo_data"))
6671c965db44STomer Tayar 		return DBG_STATUS_REG_FIFO_BAD_DATA;
6672c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
6673c965db44STomer Tayar 				   &param_name, &param_str_val, &param_num_val);
6674c965db44STomer Tayar 	if (strcmp(param_name, "size"))
6675c965db44STomer Tayar 		return DBG_STATUS_REG_FIFO_BAD_DATA;
6676c965db44STomer Tayar 	if (param_num_val % REG_FIFO_ELEMENT_DWORDS)
6677c965db44STomer Tayar 		return DBG_STATUS_REG_FIFO_BAD_DATA;
6678c965db44STomer Tayar 	num_elements = param_num_val / REG_FIFO_ELEMENT_DWORDS;
6679c965db44STomer Tayar 	elements = (struct reg_fifo_element *)dump_buf;
6680c965db44STomer Tayar 
6681c965db44STomer Tayar 	/* Decode elements */
6682c965db44STomer Tayar 	for (i = 0; i < num_elements; i++) {
66832d22bc83SMichal Kalderon 		const char *err_msg = NULL;
6684c965db44STomer Tayar 
6685c965db44STomer Tayar 		/* Discover if element belongs to a VF or a PF */
6686c965db44STomer Tayar 		vf_val = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_VF);
6687c965db44STomer Tayar 		if (vf_val == REG_FIFO_ELEMENT_IS_PF_VF_VAL)
6688c965db44STomer Tayar 			sprintf(vf_str, "%s", "N/A");
6689c965db44STomer Tayar 		else
6690c965db44STomer Tayar 			sprintf(vf_str, "%d", vf_val);
6691c965db44STomer Tayar 
66922d22bc83SMichal Kalderon 		/* Find error message */
66932d22bc83SMichal Kalderon 		err_code = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_ERROR);
66942d22bc83SMichal Kalderon 		for (j = 0; j < ARRAY_SIZE(s_reg_fifo_errors) && !err_msg; j++)
66952d22bc83SMichal Kalderon 			if (err_code == s_reg_fifo_errors[j].err_code)
66962d22bc83SMichal Kalderon 				err_msg = s_reg_fifo_errors[j].err_msg;
66972d22bc83SMichal Kalderon 
6698c965db44STomer Tayar 		/* Add parsed element to parsed buffer */
6699c965db44STomer Tayar 		results_offset +=
6700c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6701c965db44STomer Tayar 					    results_offset),
67022d22bc83SMichal Kalderon 			    "raw: 0x%016llx, address: 0x%07x, access: %-5s, pf: %2d, vf: %s, port: %d, privilege: %-3s, protection: %-12s, master: %-4s, error: %s\n",
6703c965db44STomer Tayar 			    elements[i].data,
6704be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
6705c965db44STomer Tayar 					   REG_FIFO_ELEMENT_ADDRESS) *
6706c965db44STomer Tayar 			    REG_FIFO_ELEMENT_ADDR_FACTOR,
6707c965db44STomer Tayar 			    s_access_strs[GET_FIELD(elements[i].data,
6708c965db44STomer Tayar 						    REG_FIFO_ELEMENT_ACCESS)],
6709be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
67107b6859fbSMintz, Yuval 					   REG_FIFO_ELEMENT_PF),
67117b6859fbSMintz, Yuval 			    vf_str,
6712be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
6713c965db44STomer Tayar 					   REG_FIFO_ELEMENT_PORT),
67147b6859fbSMintz, Yuval 			    s_privilege_strs[GET_FIELD(elements[i].data,
6715c965db44STomer Tayar 						REG_FIFO_ELEMENT_PRIVILEGE)],
6716c965db44STomer Tayar 			    s_protection_strs[GET_FIELD(elements[i].data,
6717c965db44STomer Tayar 						REG_FIFO_ELEMENT_PROTECTION)],
6718c965db44STomer Tayar 			    s_master_strs[GET_FIELD(elements[i].data,
67192d22bc83SMichal Kalderon 						    REG_FIFO_ELEMENT_MASTER)],
67202d22bc83SMichal Kalderon 			    err_msg ? err_msg : "unknown error code");
6721c965db44STomer Tayar 	}
6722c965db44STomer Tayar 
6723c965db44STomer Tayar 	results_offset += sprintf(qed_get_buf_ptr(results_buf,
6724c965db44STomer Tayar 						  results_offset),
6725c965db44STomer Tayar 				  "fifo contained %d elements", num_elements);
6726c965db44STomer Tayar 
6727c965db44STomer Tayar 	/* Add 1 for string NULL termination */
6728c965db44STomer Tayar 	*parsed_results_bytes = results_offset + 1;
67297b6859fbSMintz, Yuval 
6730c965db44STomer Tayar 	return DBG_STATUS_OK;
6731c965db44STomer Tayar }
6732c965db44STomer Tayar 
67337b6859fbSMintz, Yuval static enum dbg_status qed_parse_igu_fifo_element(struct igu_fifo_element
67347b6859fbSMintz, Yuval 						  *element, char
67357b6859fbSMintz, Yuval 						  *results_buf,
6736da090917STomer Tayar 						  u32 *results_offset)
6737c965db44STomer Tayar {
67387b6859fbSMintz, Yuval 	const struct igu_fifo_addr_data *found_addr = NULL;
67397b6859fbSMintz, Yuval 	u8 source, err_type, i, is_cleanup;
67407b6859fbSMintz, Yuval 	char parsed_addr_data[32];
67417b6859fbSMintz, Yuval 	char parsed_wr_data[256];
67427b6859fbSMintz, Yuval 	u32 wr_data, prod_cons;
67437b6859fbSMintz, Yuval 	bool is_wr_cmd, is_pf;
67447b6859fbSMintz, Yuval 	u16 cmd_addr;
67457b6859fbSMintz, Yuval 	u64 dword12;
67467b6859fbSMintz, Yuval 
67477b6859fbSMintz, Yuval 	/* Dword12 (dword index 1 and 2) contains bits 32..95 of the
67487b6859fbSMintz, Yuval 	 * FIFO element.
67497b6859fbSMintz, Yuval 	 */
67507b6859fbSMintz, Yuval 	dword12 = ((u64)element->dword2 << 32) | element->dword1;
67517b6859fbSMintz, Yuval 	is_wr_cmd = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD);
67527b6859fbSMintz, Yuval 	is_pf = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_IS_PF);
67537b6859fbSMintz, Yuval 	cmd_addr = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR);
67547b6859fbSMintz, Yuval 	source = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_SOURCE);
67557b6859fbSMintz, Yuval 	err_type = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE);
67567b6859fbSMintz, Yuval 
67577b6859fbSMintz, Yuval 	if (source >= ARRAY_SIZE(s_igu_fifo_source_strs))
67587b6859fbSMintz, Yuval 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
67597b6859fbSMintz, Yuval 	if (err_type >= ARRAY_SIZE(s_igu_fifo_error_strs))
67607b6859fbSMintz, Yuval 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
67617b6859fbSMintz, Yuval 
67627b6859fbSMintz, Yuval 	/* Find address data */
67637b6859fbSMintz, Yuval 	for (i = 0; i < ARRAY_SIZE(s_igu_fifo_addr_data) && !found_addr; i++) {
67647b6859fbSMintz, Yuval 		const struct igu_fifo_addr_data *curr_addr =
67657b6859fbSMintz, Yuval 			&s_igu_fifo_addr_data[i];
67667b6859fbSMintz, Yuval 
67677b6859fbSMintz, Yuval 		if (cmd_addr >= curr_addr->start_addr && cmd_addr <=
67687b6859fbSMintz, Yuval 		    curr_addr->end_addr)
67697b6859fbSMintz, Yuval 			found_addr = curr_addr;
6770c965db44STomer Tayar 	}
6771c965db44STomer Tayar 
67727b6859fbSMintz, Yuval 	if (!found_addr)
67737b6859fbSMintz, Yuval 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6774c965db44STomer Tayar 
67757b6859fbSMintz, Yuval 	/* Prepare parsed address data */
67767b6859fbSMintz, Yuval 	switch (found_addr->type) {
67777b6859fbSMintz, Yuval 	case IGU_ADDR_TYPE_MSIX_MEM:
67787b6859fbSMintz, Yuval 		sprintf(parsed_addr_data, " vector_num = 0x%x", cmd_addr / 2);
67797b6859fbSMintz, Yuval 		break;
67807b6859fbSMintz, Yuval 	case IGU_ADDR_TYPE_WRITE_INT_ACK:
67817b6859fbSMintz, Yuval 	case IGU_ADDR_TYPE_WRITE_PROD_UPDATE:
67827b6859fbSMintz, Yuval 		sprintf(parsed_addr_data,
67837b6859fbSMintz, Yuval 			" SB = 0x%x", cmd_addr - found_addr->start_addr);
67847b6859fbSMintz, Yuval 		break;
67857b6859fbSMintz, Yuval 	default:
67867b6859fbSMintz, Yuval 		parsed_addr_data[0] = '\0';
67877b6859fbSMintz, Yuval 	}
67887b6859fbSMintz, Yuval 
67897b6859fbSMintz, Yuval 	if (!is_wr_cmd) {
67907b6859fbSMintz, Yuval 		parsed_wr_data[0] = '\0';
67917b6859fbSMintz, Yuval 		goto out;
67927b6859fbSMintz, Yuval 	}
67937b6859fbSMintz, Yuval 
67947b6859fbSMintz, Yuval 	/* Prepare parsed write data */
67957b6859fbSMintz, Yuval 	wr_data = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_WR_DATA);
67967b6859fbSMintz, Yuval 	prod_cons = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_PROD_CONS);
67977b6859fbSMintz, Yuval 	is_cleanup = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_CMD_TYPE);
67987b6859fbSMintz, Yuval 
67997b6859fbSMintz, Yuval 	if (source == IGU_SRC_ATTN) {
68007b6859fbSMintz, Yuval 		sprintf(parsed_wr_data, "prod: 0x%x, ", prod_cons);
68017b6859fbSMintz, Yuval 	} else {
68027b6859fbSMintz, Yuval 		if (is_cleanup) {
68037b6859fbSMintz, Yuval 			u8 cleanup_val, cleanup_type;
68047b6859fbSMintz, Yuval 
68057b6859fbSMintz, Yuval 			cleanup_val =
68067b6859fbSMintz, Yuval 				GET_FIELD(wr_data,
68077b6859fbSMintz, Yuval 					  IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL);
68087b6859fbSMintz, Yuval 			cleanup_type =
68097b6859fbSMintz, Yuval 			    GET_FIELD(wr_data,
68107b6859fbSMintz, Yuval 				      IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE);
68117b6859fbSMintz, Yuval 
68127b6859fbSMintz, Yuval 			sprintf(parsed_wr_data,
68137b6859fbSMintz, Yuval 				"cmd_type: cleanup, cleanup_val: %s, cleanup_type : %d, ",
68147b6859fbSMintz, Yuval 				cleanup_val ? "set" : "clear",
68157b6859fbSMintz, Yuval 				cleanup_type);
68167b6859fbSMintz, Yuval 		} else {
68177b6859fbSMintz, Yuval 			u8 update_flag, en_dis_int_for_sb, segment;
68187b6859fbSMintz, Yuval 			u8 timer_mask;
68197b6859fbSMintz, Yuval 
68207b6859fbSMintz, Yuval 			update_flag = GET_FIELD(wr_data,
68217b6859fbSMintz, Yuval 						IGU_FIFO_WR_DATA_UPDATE_FLAG);
68227b6859fbSMintz, Yuval 			en_dis_int_for_sb =
68237b6859fbSMintz, Yuval 				GET_FIELD(wr_data,
68247b6859fbSMintz, Yuval 					  IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB);
68257b6859fbSMintz, Yuval 			segment = GET_FIELD(wr_data,
68267b6859fbSMintz, Yuval 					    IGU_FIFO_WR_DATA_SEGMENT);
68277b6859fbSMintz, Yuval 			timer_mask = GET_FIELD(wr_data,
68287b6859fbSMintz, Yuval 					       IGU_FIFO_WR_DATA_TIMER_MASK);
68297b6859fbSMintz, Yuval 
68307b6859fbSMintz, Yuval 			sprintf(parsed_wr_data,
68317b6859fbSMintz, Yuval 				"cmd_type: prod/cons update, prod/cons: 0x%x, update_flag: %s, en_dis_int_for_sb : %s, segment : %s, timer_mask = %d, ",
68327b6859fbSMintz, Yuval 				prod_cons,
68337b6859fbSMintz, Yuval 				update_flag ? "update" : "nop",
6834da090917STomer Tayar 				en_dis_int_for_sb ?
6835da090917STomer Tayar 				(en_dis_int_for_sb == 1 ? "disable" : "nop") :
6836da090917STomer Tayar 				"enable",
68377b6859fbSMintz, Yuval 				segment ? "attn" : "regular",
68387b6859fbSMintz, Yuval 				timer_mask);
68397b6859fbSMintz, Yuval 		}
68407b6859fbSMintz, Yuval 	}
68417b6859fbSMintz, Yuval out:
68427b6859fbSMintz, Yuval 	/* Add parsed element to parsed buffer */
68437b6859fbSMintz, Yuval 	*results_offset += sprintf(qed_get_buf_ptr(results_buf,
68447b6859fbSMintz, Yuval 						   *results_offset),
68457b6859fbSMintz, Yuval 				   "raw: 0x%01x%08x%08x, %s: %d, source : %s, type : %s, cmd_addr : 0x%x(%s%s), %serror: %s\n",
68467b6859fbSMintz, Yuval 				   element->dword2, element->dword1,
68477b6859fbSMintz, Yuval 				   element->dword0,
68487b6859fbSMintz, Yuval 				   is_pf ? "pf" : "vf",
68497b6859fbSMintz, Yuval 				   GET_FIELD(element->dword0,
68507b6859fbSMintz, Yuval 					     IGU_FIFO_ELEMENT_DWORD0_FID),
68517b6859fbSMintz, Yuval 				   s_igu_fifo_source_strs[source],
68527b6859fbSMintz, Yuval 				   is_wr_cmd ? "wr" : "rd",
68537b6859fbSMintz, Yuval 				   cmd_addr,
68547b6859fbSMintz, Yuval 				   (!is_pf && found_addr->vf_desc)
68557b6859fbSMintz, Yuval 				   ? found_addr->vf_desc
68567b6859fbSMintz, Yuval 				   : found_addr->desc,
68577b6859fbSMintz, Yuval 				   parsed_addr_data,
68587b6859fbSMintz, Yuval 				   parsed_wr_data,
68597b6859fbSMintz, Yuval 				   s_igu_fifo_error_strs[err_type]);
68607b6859fbSMintz, Yuval 
68617b6859fbSMintz, Yuval 	return DBG_STATUS_OK;
6862c965db44STomer Tayar }
6863c965db44STomer Tayar 
6864c965db44STomer Tayar /* Parses an IGU FIFO dump buffer.
6865c965db44STomer Tayar  * If result_buf is not NULL, the IGU FIFO results are printed to it.
6866c965db44STomer Tayar  * In any case, the required results buffer size is assigned to
6867c965db44STomer Tayar  * parsed_results_bytes.
6868c965db44STomer Tayar  * The parsing status is returned.
6869c965db44STomer Tayar  */
6870da090917STomer Tayar static enum dbg_status qed_parse_igu_fifo_dump(u32 *dump_buf,
6871c965db44STomer Tayar 					       char *results_buf,
6872c965db44STomer Tayar 					       u32 *parsed_results_bytes)
6873c965db44STomer Tayar {
6874c965db44STomer Tayar 	const char *section_name, *param_name, *param_str_val;
68757b6859fbSMintz, Yuval 	u32 param_num_val, num_section_params, num_elements;
6876c965db44STomer Tayar 	struct igu_fifo_element *elements;
68777b6859fbSMintz, Yuval 	enum dbg_status status;
68787b6859fbSMintz, Yuval 	u32 results_offset = 0;
68797b6859fbSMintz, Yuval 	u8 i;
6880c965db44STomer Tayar 
6881c965db44STomer Tayar 	/* Read global_params section */
6882c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6883c965db44STomer Tayar 					 &section_name, &num_section_params);
6884c965db44STomer Tayar 	if (strcmp(section_name, "global_params"))
6885c965db44STomer Tayar 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6886c965db44STomer Tayar 
6887c965db44STomer Tayar 	/* Print global params */
6888c965db44STomer Tayar 	dump_buf += qed_print_section_params(dump_buf,
6889c965db44STomer Tayar 					     num_section_params,
6890c965db44STomer Tayar 					     results_buf, &results_offset);
6891c965db44STomer Tayar 
6892c965db44STomer Tayar 	/* Read igu_fifo_data section */
6893c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6894c965db44STomer Tayar 					 &section_name, &num_section_params);
6895c965db44STomer Tayar 	if (strcmp(section_name, "igu_fifo_data"))
6896c965db44STomer Tayar 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6897c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
6898c965db44STomer Tayar 				   &param_name, &param_str_val, &param_num_val);
6899c965db44STomer Tayar 	if (strcmp(param_name, "size"))
6900c965db44STomer Tayar 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6901c965db44STomer Tayar 	if (param_num_val % IGU_FIFO_ELEMENT_DWORDS)
6902c965db44STomer Tayar 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
6903c965db44STomer Tayar 	num_elements = param_num_val / IGU_FIFO_ELEMENT_DWORDS;
6904c965db44STomer Tayar 	elements = (struct igu_fifo_element *)dump_buf;
6905c965db44STomer Tayar 
6906c965db44STomer Tayar 	/* Decode elements */
6907c965db44STomer Tayar 	for (i = 0; i < num_elements; i++) {
69087b6859fbSMintz, Yuval 		status = qed_parse_igu_fifo_element(&elements[i],
69097b6859fbSMintz, Yuval 						    results_buf,
6910da090917STomer Tayar 						    &results_offset);
69117b6859fbSMintz, Yuval 		if (status != DBG_STATUS_OK)
69127b6859fbSMintz, Yuval 			return status;
6913c965db44STomer Tayar 	}
6914c965db44STomer Tayar 
6915c965db44STomer Tayar 	results_offset += sprintf(qed_get_buf_ptr(results_buf,
6916c965db44STomer Tayar 						  results_offset),
6917c965db44STomer Tayar 				  "fifo contained %d elements", num_elements);
6918c965db44STomer Tayar 
6919c965db44STomer Tayar 	/* Add 1 for string NULL termination */
6920c965db44STomer Tayar 	*parsed_results_bytes = results_offset + 1;
69217b6859fbSMintz, Yuval 
6922c965db44STomer Tayar 	return DBG_STATUS_OK;
6923c965db44STomer Tayar }
6924c965db44STomer Tayar 
6925c965db44STomer Tayar static enum dbg_status
6926da090917STomer Tayar qed_parse_protection_override_dump(u32 *dump_buf,
6927c965db44STomer Tayar 				   char *results_buf,
6928c965db44STomer Tayar 				   u32 *parsed_results_bytes)
6929c965db44STomer Tayar {
6930c965db44STomer Tayar 	const char *section_name, *param_name, *param_str_val;
69317b6859fbSMintz, Yuval 	u32 param_num_val, num_section_params, num_elements;
6932c965db44STomer Tayar 	struct protection_override_element *elements;
69337b6859fbSMintz, Yuval 	u32 results_offset = 0;
6934c965db44STomer Tayar 	u8 i;
6935c965db44STomer Tayar 
6936c965db44STomer Tayar 	/* Read global_params section */
6937c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6938c965db44STomer Tayar 					 &section_name, &num_section_params);
6939c965db44STomer Tayar 	if (strcmp(section_name, "global_params"))
6940c965db44STomer Tayar 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
6941c965db44STomer Tayar 
6942c965db44STomer Tayar 	/* Print global params */
6943c965db44STomer Tayar 	dump_buf += qed_print_section_params(dump_buf,
6944c965db44STomer Tayar 					     num_section_params,
6945c965db44STomer Tayar 					     results_buf, &results_offset);
6946c965db44STomer Tayar 
6947c965db44STomer Tayar 	/* Read protection_override_data section */
6948c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6949c965db44STomer Tayar 					 &section_name, &num_section_params);
6950c965db44STomer Tayar 	if (strcmp(section_name, "protection_override_data"))
6951c965db44STomer Tayar 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
6952c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
6953c965db44STomer Tayar 				   &param_name, &param_str_val, &param_num_val);
6954c965db44STomer Tayar 	if (strcmp(param_name, "size"))
6955c965db44STomer Tayar 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
69567b6859fbSMintz, Yuval 	if (param_num_val % PROTECTION_OVERRIDE_ELEMENT_DWORDS)
6957c965db44STomer Tayar 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
6958c965db44STomer Tayar 	num_elements = param_num_val / PROTECTION_OVERRIDE_ELEMENT_DWORDS;
6959c965db44STomer Tayar 	elements = (struct protection_override_element *)dump_buf;
6960c965db44STomer Tayar 
6961c965db44STomer Tayar 	/* Decode elements */
6962c965db44STomer Tayar 	for (i = 0; i < num_elements; i++) {
6963c965db44STomer Tayar 		u32 address = GET_FIELD(elements[i].data,
6964c965db44STomer Tayar 					PROTECTION_OVERRIDE_ELEMENT_ADDRESS) *
6965c965db44STomer Tayar 			      PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR;
6966c965db44STomer Tayar 
6967c965db44STomer Tayar 		results_offset +=
6968c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6969c965db44STomer Tayar 					    results_offset),
6970be086e7cSMintz, Yuval 			    "window %2d, address: 0x%07x, size: %7d regs, read: %d, write: %d, read protection: %-12s, write protection: %-12s\n",
6971c965db44STomer Tayar 			    i, address,
6972be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
6973c965db44STomer Tayar 				      PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE),
6974be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
6975c965db44STomer Tayar 				      PROTECTION_OVERRIDE_ELEMENT_READ),
6976be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
6977c965db44STomer Tayar 				      PROTECTION_OVERRIDE_ELEMENT_WRITE),
6978c965db44STomer Tayar 			    s_protection_strs[GET_FIELD(elements[i].data,
6979c965db44STomer Tayar 				PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION)],
6980c965db44STomer Tayar 			    s_protection_strs[GET_FIELD(elements[i].data,
6981c965db44STomer Tayar 				PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION)]);
6982c965db44STomer Tayar 	}
6983c965db44STomer Tayar 
6984c965db44STomer Tayar 	results_offset += sprintf(qed_get_buf_ptr(results_buf,
6985c965db44STomer Tayar 						  results_offset),
6986c965db44STomer Tayar 				  "protection override contained %d elements",
6987c965db44STomer Tayar 				  num_elements);
6988c965db44STomer Tayar 
6989c965db44STomer Tayar 	/* Add 1 for string NULL termination */
6990c965db44STomer Tayar 	*parsed_results_bytes = results_offset + 1;
69917b6859fbSMintz, Yuval 
6992c965db44STomer Tayar 	return DBG_STATUS_OK;
6993c965db44STomer Tayar }
6994c965db44STomer Tayar 
69957b6859fbSMintz, Yuval /* Parses a FW Asserts dump buffer.
69967b6859fbSMintz, Yuval  * If result_buf is not NULL, the FW Asserts results are printed to it.
69977b6859fbSMintz, Yuval  * In any case, the required results buffer size is assigned to
69987b6859fbSMintz, Yuval  * parsed_results_bytes.
69997b6859fbSMintz, Yuval  * The parsing status is returned.
70007b6859fbSMintz, Yuval  */
7001da090917STomer Tayar static enum dbg_status qed_parse_fw_asserts_dump(u32 *dump_buf,
70027b6859fbSMintz, Yuval 						 char *results_buf,
70037b6859fbSMintz, Yuval 						 u32 *parsed_results_bytes)
70047b6859fbSMintz, Yuval {
70057b6859fbSMintz, Yuval 	u32 num_section_params, param_num_val, i, results_offset = 0;
70067b6859fbSMintz, Yuval 	const char *param_name, *param_str_val, *section_name;
70077b6859fbSMintz, Yuval 	bool last_section_found = false;
70087b6859fbSMintz, Yuval 
70097b6859fbSMintz, Yuval 	*parsed_results_bytes = 0;
70107b6859fbSMintz, Yuval 
70117b6859fbSMintz, Yuval 	/* Read global_params section */
70127b6859fbSMintz, Yuval 	dump_buf += qed_read_section_hdr(dump_buf,
70137b6859fbSMintz, Yuval 					 &section_name, &num_section_params);
70147b6859fbSMintz, Yuval 	if (strcmp(section_name, "global_params"))
70157b6859fbSMintz, Yuval 		return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
70167b6859fbSMintz, Yuval 
70177b6859fbSMintz, Yuval 	/* Print global params */
70187b6859fbSMintz, Yuval 	dump_buf += qed_print_section_params(dump_buf,
70197b6859fbSMintz, Yuval 					     num_section_params,
70207b6859fbSMintz, Yuval 					     results_buf, &results_offset);
70217b6859fbSMintz, Yuval 
70227b6859fbSMintz, Yuval 	while (!last_section_found) {
70237b6859fbSMintz, Yuval 		dump_buf += qed_read_section_hdr(dump_buf,
70247b6859fbSMintz, Yuval 						 &section_name,
70257b6859fbSMintz, Yuval 						 &num_section_params);
70267b6859fbSMintz, Yuval 		if (!strcmp(section_name, "fw_asserts")) {
70277b6859fbSMintz, Yuval 			/* Extract params */
70287b6859fbSMintz, Yuval 			const char *storm_letter = NULL;
70297b6859fbSMintz, Yuval 			u32 storm_dump_size = 0;
70307b6859fbSMintz, Yuval 
70317b6859fbSMintz, Yuval 			for (i = 0; i < num_section_params; i++) {
70327b6859fbSMintz, Yuval 				dump_buf += qed_read_param(dump_buf,
70337b6859fbSMintz, Yuval 							   &param_name,
70347b6859fbSMintz, Yuval 							   &param_str_val,
70357b6859fbSMintz, Yuval 							   &param_num_val);
70367b6859fbSMintz, Yuval 				if (!strcmp(param_name, "storm"))
70377b6859fbSMintz, Yuval 					storm_letter = param_str_val;
70387b6859fbSMintz, Yuval 				else if (!strcmp(param_name, "size"))
70397b6859fbSMintz, Yuval 					storm_dump_size = param_num_val;
70407b6859fbSMintz, Yuval 				else
70417b6859fbSMintz, Yuval 					return
70427b6859fbSMintz, Yuval 					    DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
70437b6859fbSMintz, Yuval 			}
70447b6859fbSMintz, Yuval 
70457b6859fbSMintz, Yuval 			if (!storm_letter || !storm_dump_size)
70467b6859fbSMintz, Yuval 				return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
70477b6859fbSMintz, Yuval 
70487b6859fbSMintz, Yuval 			/* Print data */
70497b6859fbSMintz, Yuval 			results_offset +=
70507b6859fbSMintz, Yuval 			    sprintf(qed_get_buf_ptr(results_buf,
70517b6859fbSMintz, Yuval 						    results_offset),
70527b6859fbSMintz, Yuval 				    "\n%sSTORM_ASSERT: size=%d\n",
70537b6859fbSMintz, Yuval 				    storm_letter, storm_dump_size);
70547b6859fbSMintz, Yuval 			for (i = 0; i < storm_dump_size; i++, dump_buf++)
70557b6859fbSMintz, Yuval 				results_offset +=
70567b6859fbSMintz, Yuval 				    sprintf(qed_get_buf_ptr(results_buf,
70577b6859fbSMintz, Yuval 							    results_offset),
70587b6859fbSMintz, Yuval 					    "%08x\n", *dump_buf);
70597b6859fbSMintz, Yuval 		} else if (!strcmp(section_name, "last")) {
70607b6859fbSMintz, Yuval 			last_section_found = true;
70617b6859fbSMintz, Yuval 		} else {
70627b6859fbSMintz, Yuval 			return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
70637b6859fbSMintz, Yuval 		}
70647b6859fbSMintz, Yuval 	}
70657b6859fbSMintz, Yuval 
70667b6859fbSMintz, Yuval 	/* Add 1 for string NULL termination */
70677b6859fbSMintz, Yuval 	*parsed_results_bytes = results_offset + 1;
70687b6859fbSMintz, Yuval 
70697b6859fbSMintz, Yuval 	return DBG_STATUS_OK;
70707b6859fbSMintz, Yuval }
70717b6859fbSMintz, Yuval 
70727b6859fbSMintz, Yuval /***************************** Public Functions *******************************/
70737b6859fbSMintz, Yuval 
70742d22bc83SMichal Kalderon enum dbg_status qed_dbg_user_set_bin_ptr(struct qed_hwfn *p_hwfn,
70752d22bc83SMichal Kalderon 					 const u8 * const bin_ptr)
70767b6859fbSMintz, Yuval {
70772d22bc83SMichal Kalderon 	struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr;
70787b6859fbSMintz, Yuval 	u8 buf_id;
70797b6859fbSMintz, Yuval 
70807b6859fbSMintz, Yuval 	/* Convert binary data to debug arrays */
70812d22bc83SMichal Kalderon 	for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++)
70822d22bc83SMichal Kalderon 		qed_set_dbg_bin_buf(p_hwfn,
70832d22bc83SMichal Kalderon 				    (enum bin_dbg_buffer_type)buf_id,
70842d22bc83SMichal Kalderon 				    (u32 *)(bin_ptr + buf_hdrs[buf_id].offset),
70852d22bc83SMichal Kalderon 				    buf_hdrs[buf_id].length);
70867b6859fbSMintz, Yuval 
70877b6859fbSMintz, Yuval 	return DBG_STATUS_OK;
70887b6859fbSMintz, Yuval }
70897b6859fbSMintz, Yuval 
70902d22bc83SMichal Kalderon enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn,
70912d22bc83SMichal Kalderon 					void **user_data_ptr)
7092a3f72307SDenis Bolotin {
70932d22bc83SMichal Kalderon 	*user_data_ptr = kzalloc(sizeof(struct dbg_tools_user_data),
7094a3f72307SDenis Bolotin 				 GFP_KERNEL);
70952d22bc83SMichal Kalderon 	if (!(*user_data_ptr))
7096a3f72307SDenis Bolotin 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
7097a3f72307SDenis Bolotin 
7098a3f72307SDenis Bolotin 	return DBG_STATUS_OK;
7099a3f72307SDenis Bolotin }
7100a3f72307SDenis Bolotin 
71017b6859fbSMintz, Yuval const char *qed_dbg_get_status_str(enum dbg_status status)
71027b6859fbSMintz, Yuval {
71037b6859fbSMintz, Yuval 	return (status <
71047b6859fbSMintz, Yuval 		MAX_DBG_STATUS) ? s_status_str[status] : "Invalid debug status";
71057b6859fbSMintz, Yuval }
71067b6859fbSMintz, Yuval 
71077b6859fbSMintz, Yuval enum dbg_status qed_get_idle_chk_results_buf_size(struct qed_hwfn *p_hwfn,
71087b6859fbSMintz, Yuval 						  u32 *dump_buf,
71097b6859fbSMintz, Yuval 						  u32 num_dumped_dwords,
71107b6859fbSMintz, Yuval 						  u32 *results_buf_size)
71117b6859fbSMintz, Yuval {
71127b6859fbSMintz, Yuval 	u32 num_errors, num_warnings;
71137b6859fbSMintz, Yuval 
71142d22bc83SMichal Kalderon 	return qed_parse_idle_chk_dump(p_hwfn,
71152d22bc83SMichal Kalderon 				       dump_buf,
71167b6859fbSMintz, Yuval 				       num_dumped_dwords,
71177b6859fbSMintz, Yuval 				       NULL,
71187b6859fbSMintz, Yuval 				       results_buf_size,
71197b6859fbSMintz, Yuval 				       &num_errors, &num_warnings);
71207b6859fbSMintz, Yuval }
71217b6859fbSMintz, Yuval 
71227b6859fbSMintz, Yuval enum dbg_status qed_print_idle_chk_results(struct qed_hwfn *p_hwfn,
71237b6859fbSMintz, Yuval 					   u32 *dump_buf,
71247b6859fbSMintz, Yuval 					   u32 num_dumped_dwords,
71257b6859fbSMintz, Yuval 					   char *results_buf,
7126da090917STomer Tayar 					   u32 *num_errors,
7127da090917STomer Tayar 					   u32 *num_warnings)
71287b6859fbSMintz, Yuval {
71297b6859fbSMintz, Yuval 	u32 parsed_buf_size;
71307b6859fbSMintz, Yuval 
71312d22bc83SMichal Kalderon 	return qed_parse_idle_chk_dump(p_hwfn,
71322d22bc83SMichal Kalderon 				       dump_buf,
71337b6859fbSMintz, Yuval 				       num_dumped_dwords,
71347b6859fbSMintz, Yuval 				       results_buf,
71357b6859fbSMintz, Yuval 				       &parsed_buf_size,
71367b6859fbSMintz, Yuval 				       num_errors, num_warnings);
71377b6859fbSMintz, Yuval }
71387b6859fbSMintz, Yuval 
7139a3f72307SDenis Bolotin void qed_dbg_mcp_trace_set_meta_data(struct qed_hwfn *p_hwfn,
7140a3f72307SDenis Bolotin 				     const u32 *meta_buf)
71417b6859fbSMintz, Yuval {
7142a3f72307SDenis Bolotin 	struct dbg_tools_user_data *dev_user_data =
7143a3f72307SDenis Bolotin 		qed_dbg_get_user_data(p_hwfn);
7144a3f72307SDenis Bolotin 
7145a3f72307SDenis Bolotin 	dev_user_data->mcp_trace_user_meta_buf = meta_buf;
71467b6859fbSMintz, Yuval }
71477b6859fbSMintz, Yuval 
71487b6859fbSMintz, Yuval enum dbg_status qed_get_mcp_trace_results_buf_size(struct qed_hwfn *p_hwfn,
71497b6859fbSMintz, Yuval 						   u32 *dump_buf,
71507b6859fbSMintz, Yuval 						   u32 num_dumped_dwords,
71517b6859fbSMintz, Yuval 						   u32 *results_buf_size)
71527b6859fbSMintz, Yuval {
71537b6859fbSMintz, Yuval 	return qed_parse_mcp_trace_dump(p_hwfn,
7154a3f72307SDenis Bolotin 					dump_buf, NULL, results_buf_size, true);
71557b6859fbSMintz, Yuval }
71567b6859fbSMintz, Yuval 
71577b6859fbSMintz, Yuval enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn,
71587b6859fbSMintz, Yuval 					    u32 *dump_buf,
71597b6859fbSMintz, Yuval 					    u32 num_dumped_dwords,
71607b6859fbSMintz, Yuval 					    char *results_buf)
71617b6859fbSMintz, Yuval {
71627b6859fbSMintz, Yuval 	u32 parsed_buf_size;
71637b6859fbSMintz, Yuval 
71647b6859fbSMintz, Yuval 	return qed_parse_mcp_trace_dump(p_hwfn,
71657b6859fbSMintz, Yuval 					dump_buf,
7166a3f72307SDenis Bolotin 					results_buf, &parsed_buf_size, true);
71677b6859fbSMintz, Yuval }
71687b6859fbSMintz, Yuval 
7169a3f72307SDenis Bolotin enum dbg_status qed_print_mcp_trace_results_cont(struct qed_hwfn *p_hwfn,
7170a3f72307SDenis Bolotin 						 u32 *dump_buf,
7171a3f72307SDenis Bolotin 						 char *results_buf)
7172a3f72307SDenis Bolotin {
7173a3f72307SDenis Bolotin 	u32 parsed_buf_size;
7174a3f72307SDenis Bolotin 
7175a3f72307SDenis Bolotin 	return qed_parse_mcp_trace_dump(p_hwfn, dump_buf, results_buf,
7176a3f72307SDenis Bolotin 					&parsed_buf_size, false);
7177a3f72307SDenis Bolotin }
7178a3f72307SDenis Bolotin 
7179a3f72307SDenis Bolotin enum dbg_status qed_print_mcp_trace_line(struct qed_hwfn *p_hwfn,
7180a3f72307SDenis Bolotin 					 u8 *dump_buf,
718150bc60cbSMichal Kalderon 					 u32 num_dumped_bytes,
718250bc60cbSMichal Kalderon 					 char *results_buf)
718350bc60cbSMichal Kalderon {
7184a3f72307SDenis Bolotin 	u32 parsed_results_bytes;
718550bc60cbSMichal Kalderon 
7186a3f72307SDenis Bolotin 	return qed_parse_mcp_trace_buf(p_hwfn,
7187a3f72307SDenis Bolotin 				       dump_buf,
718850bc60cbSMichal Kalderon 				       num_dumped_bytes,
718950bc60cbSMichal Kalderon 				       0,
719050bc60cbSMichal Kalderon 				       num_dumped_bytes,
7191a3f72307SDenis Bolotin 				       results_buf, &parsed_results_bytes);
7192a3f72307SDenis Bolotin }
7193a3f72307SDenis Bolotin 
7194a3f72307SDenis Bolotin /* Frees the specified MCP Trace meta data */
7195a3f72307SDenis Bolotin void qed_mcp_trace_free_meta_data(struct qed_hwfn *p_hwfn)
7196a3f72307SDenis Bolotin {
7197a3f72307SDenis Bolotin 	struct dbg_tools_user_data *dev_user_data;
7198a3f72307SDenis Bolotin 	struct mcp_trace_meta *meta;
7199a3f72307SDenis Bolotin 	u32 i;
7200a3f72307SDenis Bolotin 
7201a3f72307SDenis Bolotin 	dev_user_data = qed_dbg_get_user_data(p_hwfn);
7202a3f72307SDenis Bolotin 	meta = &dev_user_data->mcp_trace_meta;
7203a3f72307SDenis Bolotin 	if (!meta->is_allocated)
7204a3f72307SDenis Bolotin 		return;
7205a3f72307SDenis Bolotin 
7206a3f72307SDenis Bolotin 	/* Release modules */
7207a3f72307SDenis Bolotin 	if (meta->modules) {
7208a3f72307SDenis Bolotin 		for (i = 0; i < meta->modules_num; i++)
7209a3f72307SDenis Bolotin 			kfree(meta->modules[i]);
7210a3f72307SDenis Bolotin 		kfree(meta->modules);
7211a3f72307SDenis Bolotin 	}
7212a3f72307SDenis Bolotin 
7213a3f72307SDenis Bolotin 	/* Release formats */
7214a3f72307SDenis Bolotin 	if (meta->formats) {
7215a3f72307SDenis Bolotin 		for (i = 0; i < meta->formats_num; i++)
7216a3f72307SDenis Bolotin 			kfree(meta->formats[i].format_str);
7217a3f72307SDenis Bolotin 		kfree(meta->formats);
7218a3f72307SDenis Bolotin 	}
7219a3f72307SDenis Bolotin 
7220a3f72307SDenis Bolotin 	meta->is_allocated = false;
722150bc60cbSMichal Kalderon }
722250bc60cbSMichal Kalderon 
72237b6859fbSMintz, Yuval enum dbg_status qed_get_reg_fifo_results_buf_size(struct qed_hwfn *p_hwfn,
72247b6859fbSMintz, Yuval 						  u32 *dump_buf,
72257b6859fbSMintz, Yuval 						  u32 num_dumped_dwords,
72267b6859fbSMintz, Yuval 						  u32 *results_buf_size)
72277b6859fbSMintz, Yuval {
7228da090917STomer Tayar 	return qed_parse_reg_fifo_dump(dump_buf, NULL, results_buf_size);
72297b6859fbSMintz, Yuval }
72307b6859fbSMintz, Yuval 
72317b6859fbSMintz, Yuval enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn,
72327b6859fbSMintz, Yuval 					   u32 *dump_buf,
72337b6859fbSMintz, Yuval 					   u32 num_dumped_dwords,
72347b6859fbSMintz, Yuval 					   char *results_buf)
72357b6859fbSMintz, Yuval {
72367b6859fbSMintz, Yuval 	u32 parsed_buf_size;
72377b6859fbSMintz, Yuval 
7238da090917STomer Tayar 	return qed_parse_reg_fifo_dump(dump_buf, results_buf, &parsed_buf_size);
72397b6859fbSMintz, Yuval }
72407b6859fbSMintz, Yuval 
72417b6859fbSMintz, Yuval enum dbg_status qed_get_igu_fifo_results_buf_size(struct qed_hwfn *p_hwfn,
72427b6859fbSMintz, Yuval 						  u32 *dump_buf,
72437b6859fbSMintz, Yuval 						  u32 num_dumped_dwords,
72447b6859fbSMintz, Yuval 						  u32 *results_buf_size)
72457b6859fbSMintz, Yuval {
7246da090917STomer Tayar 	return qed_parse_igu_fifo_dump(dump_buf, NULL, results_buf_size);
72477b6859fbSMintz, Yuval }
72487b6859fbSMintz, Yuval 
72497b6859fbSMintz, Yuval enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn,
72507b6859fbSMintz, Yuval 					   u32 *dump_buf,
72517b6859fbSMintz, Yuval 					   u32 num_dumped_dwords,
72527b6859fbSMintz, Yuval 					   char *results_buf)
72537b6859fbSMintz, Yuval {
72547b6859fbSMintz, Yuval 	u32 parsed_buf_size;
72557b6859fbSMintz, Yuval 
7256da090917STomer Tayar 	return qed_parse_igu_fifo_dump(dump_buf, results_buf, &parsed_buf_size);
72577b6859fbSMintz, Yuval }
72587b6859fbSMintz, Yuval 
7259c965db44STomer Tayar enum dbg_status
7260c965db44STomer Tayar qed_get_protection_override_results_buf_size(struct qed_hwfn *p_hwfn,
7261c965db44STomer Tayar 					     u32 *dump_buf,
7262c965db44STomer Tayar 					     u32 num_dumped_dwords,
7263c965db44STomer Tayar 					     u32 *results_buf_size)
7264c965db44STomer Tayar {
7265da090917STomer Tayar 	return qed_parse_protection_override_dump(dump_buf,
7266c965db44STomer Tayar 						  NULL, results_buf_size);
7267c965db44STomer Tayar }
7268c965db44STomer Tayar 
7269c965db44STomer Tayar enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn,
7270c965db44STomer Tayar 						      u32 *dump_buf,
7271c965db44STomer Tayar 						      u32 num_dumped_dwords,
7272c965db44STomer Tayar 						      char *results_buf)
7273c965db44STomer Tayar {
7274c965db44STomer Tayar 	u32 parsed_buf_size;
7275c965db44STomer Tayar 
7276da090917STomer Tayar 	return qed_parse_protection_override_dump(dump_buf,
7277c965db44STomer Tayar 						  results_buf,
7278c965db44STomer Tayar 						  &parsed_buf_size);
7279c965db44STomer Tayar }
7280c965db44STomer Tayar 
7281c965db44STomer Tayar enum dbg_status qed_get_fw_asserts_results_buf_size(struct qed_hwfn *p_hwfn,
7282c965db44STomer Tayar 						    u32 *dump_buf,
7283c965db44STomer Tayar 						    u32 num_dumped_dwords,
7284c965db44STomer Tayar 						    u32 *results_buf_size)
7285c965db44STomer Tayar {
7286da090917STomer Tayar 	return qed_parse_fw_asserts_dump(dump_buf, NULL, results_buf_size);
7287c965db44STomer Tayar }
7288c965db44STomer Tayar 
7289c965db44STomer Tayar enum dbg_status qed_print_fw_asserts_results(struct qed_hwfn *p_hwfn,
7290c965db44STomer Tayar 					     u32 *dump_buf,
7291c965db44STomer Tayar 					     u32 num_dumped_dwords,
7292c965db44STomer Tayar 					     char *results_buf)
7293c965db44STomer Tayar {
7294c965db44STomer Tayar 	u32 parsed_buf_size;
7295c965db44STomer Tayar 
7296da090917STomer Tayar 	return qed_parse_fw_asserts_dump(dump_buf,
7297c965db44STomer Tayar 					 results_buf, &parsed_buf_size);
7298c965db44STomer Tayar }
7299c965db44STomer Tayar 
73000ebbd1c8SMintz, Yuval enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn,
73010ebbd1c8SMintz, Yuval 				   struct dbg_attn_block_result *results)
73020ebbd1c8SMintz, Yuval {
73030ebbd1c8SMintz, Yuval 	const u32 *block_attn_name_offsets;
73042d22bc83SMichal Kalderon 	const char *attn_name_base;
73050ebbd1c8SMintz, Yuval 	const char *block_name;
73062d22bc83SMichal Kalderon 	enum dbg_attn_type attn_type;
73070ebbd1c8SMintz, Yuval 	u8 num_regs, i, j;
73080ebbd1c8SMintz, Yuval 
73090ebbd1c8SMintz, Yuval 	num_regs = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_NUM_REGS);
73102d22bc83SMichal Kalderon 	attn_type = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE);
73112d22bc83SMichal Kalderon 	block_name = qed_dbg_get_block_name(p_hwfn, results->block_id);
73122d22bc83SMichal Kalderon 	if (!block_name)
73132d22bc83SMichal Kalderon 		return DBG_STATUS_INVALID_ARGS;
73140ebbd1c8SMintz, Yuval 
73152d22bc83SMichal Kalderon 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr ||
73162d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr ||
73172d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr)
73180ebbd1c8SMintz, Yuval 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
73190ebbd1c8SMintz, Yuval 
73202d22bc83SMichal Kalderon 	block_attn_name_offsets =
73212d22bc83SMichal Kalderon 	    (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr +
73222d22bc83SMichal Kalderon 	    results->names_offset;
73232d22bc83SMichal Kalderon 
73242d22bc83SMichal Kalderon 	attn_name_base = p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr;
73250ebbd1c8SMintz, Yuval 
73260ebbd1c8SMintz, Yuval 	/* Go over registers with a non-zero attention status */
73270ebbd1c8SMintz, Yuval 	for (i = 0; i < num_regs; i++) {
7328da090917STomer Tayar 		struct dbg_attn_bit_mapping *bit_mapping;
73290ebbd1c8SMintz, Yuval 		struct dbg_attn_reg_result *reg_result;
73300ebbd1c8SMintz, Yuval 		u8 num_reg_attn, bit_idx = 0;
73310ebbd1c8SMintz, Yuval 
73320ebbd1c8SMintz, Yuval 		reg_result = &results->reg_results[i];
73330ebbd1c8SMintz, Yuval 		num_reg_attn = GET_FIELD(reg_result->data,
73340ebbd1c8SMintz, Yuval 					 DBG_ATTN_REG_RESULT_NUM_REG_ATTN);
73352d22bc83SMichal Kalderon 		bit_mapping = (struct dbg_attn_bit_mapping *)
73362d22bc83SMichal Kalderon 		    p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr +
73372d22bc83SMichal Kalderon 		    reg_result->block_attn_offset;
73380ebbd1c8SMintz, Yuval 
73390ebbd1c8SMintz, Yuval 		/* Go over attention status bits */
73402d22bc83SMichal Kalderon 		for (j = 0; j < num_reg_attn; j++, bit_idx++) {
7341da090917STomer Tayar 			u16 attn_idx_val = GET_FIELD(bit_mapping[j].data,
73420ebbd1c8SMintz, Yuval 						     DBG_ATTN_BIT_MAPPING_VAL);
73430ebbd1c8SMintz, Yuval 			const char *attn_name, *attn_type_str, *masked_str;
73442d22bc83SMichal Kalderon 			u32 attn_name_offset;
73452d22bc83SMichal Kalderon 			u32 sts_addr;
73460ebbd1c8SMintz, Yuval 
73470ebbd1c8SMintz, Yuval 			/* Check if bit mask should be advanced (due to unused
73480ebbd1c8SMintz, Yuval 			 * bits).
73490ebbd1c8SMintz, Yuval 			 */
7350da090917STomer Tayar 			if (GET_FIELD(bit_mapping[j].data,
73510ebbd1c8SMintz, Yuval 				      DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT)) {
73520ebbd1c8SMintz, Yuval 				bit_idx += (u8)attn_idx_val;
73530ebbd1c8SMintz, Yuval 				continue;
73540ebbd1c8SMintz, Yuval 			}
73550ebbd1c8SMintz, Yuval 
73560ebbd1c8SMintz, Yuval 			/* Check current bit index */
73572d22bc83SMichal Kalderon 			if (!(reg_result->sts_val & BIT(bit_idx)))
73580ebbd1c8SMintz, Yuval 				continue;
73590ebbd1c8SMintz, Yuval 
73602d22bc83SMichal Kalderon 			/* An attention bit with value=1 was found
73612d22bc83SMichal Kalderon 			 * Find attention name
73622d22bc83SMichal Kalderon 			 */
7363da090917STomer Tayar 			attn_name_offset =
7364da090917STomer Tayar 				block_attn_name_offsets[attn_idx_val];
73652d22bc83SMichal Kalderon 			attn_name = attn_name_base + attn_name_offset;
73662d22bc83SMichal Kalderon 			attn_type_str =
73672d22bc83SMichal Kalderon 				(attn_type ==
73682d22bc83SMichal Kalderon 				 ATTN_TYPE_INTERRUPT ? "Interrupt" :
73692d22bc83SMichal Kalderon 				 "Parity");
73700ebbd1c8SMintz, Yuval 			masked_str = reg_result->mask_val & BIT(bit_idx) ?
73710ebbd1c8SMintz, Yuval 				     " [masked]" : "";
73720ebbd1c8SMintz, Yuval 			sts_addr = GET_FIELD(reg_result->data,
73730ebbd1c8SMintz, Yuval 					     DBG_ATTN_REG_RESULT_STS_ADDRESS);
73740ebbd1c8SMintz, Yuval 			DP_NOTICE(p_hwfn,
73750ebbd1c8SMintz, Yuval 				  "%s (%s) : %s [address 0x%08x, bit %d]%s\n",
73760ebbd1c8SMintz, Yuval 				  block_name, attn_type_str, attn_name,
73772d22bc83SMichal Kalderon 				  sts_addr * 4, bit_idx, masked_str);
73780ebbd1c8SMintz, Yuval 		}
73790ebbd1c8SMintz, Yuval 	}
73800ebbd1c8SMintz, Yuval 
73810ebbd1c8SMintz, Yuval 	return DBG_STATUS_OK;
73820ebbd1c8SMintz, Yuval }
73830ebbd1c8SMintz, Yuval 
73842d22bc83SMichal Kalderon static DEFINE_MUTEX(qed_dbg_lock);
73852d22bc83SMichal Kalderon 
7386c965db44STomer Tayar /* Wrapper for unifying the idle_chk and mcp_trace api */
73878c93beafSYuval Mintz static enum dbg_status
73888c93beafSYuval Mintz qed_print_idle_chk_results_wrapper(struct qed_hwfn *p_hwfn,
7389c965db44STomer Tayar 				   u32 *dump_buf,
7390c965db44STomer Tayar 				   u32 num_dumped_dwords,
7391c965db44STomer Tayar 				   char *results_buf)
7392c965db44STomer Tayar {
7393c965db44STomer Tayar 	u32 num_errors, num_warnnings;
7394c965db44STomer Tayar 
7395c965db44STomer Tayar 	return qed_print_idle_chk_results(p_hwfn, dump_buf, num_dumped_dwords,
7396c965db44STomer Tayar 					  results_buf, &num_errors,
7397c965db44STomer Tayar 					  &num_warnnings);
7398c965db44STomer Tayar }
7399c965db44STomer Tayar 
7400c965db44STomer Tayar /* Feature meta data lookup table */
7401c965db44STomer Tayar static struct {
7402c965db44STomer Tayar 	char *name;
7403c965db44STomer Tayar 	enum dbg_status (*get_size)(struct qed_hwfn *p_hwfn,
7404c965db44STomer Tayar 				    struct qed_ptt *p_ptt, u32 *size);
7405c965db44STomer Tayar 	enum dbg_status (*perform_dump)(struct qed_hwfn *p_hwfn,
7406c965db44STomer Tayar 					struct qed_ptt *p_ptt, u32 *dump_buf,
7407c965db44STomer Tayar 					u32 buf_size, u32 *dumped_dwords);
7408c965db44STomer Tayar 	enum dbg_status (*print_results)(struct qed_hwfn *p_hwfn,
7409c965db44STomer Tayar 					 u32 *dump_buf, u32 num_dumped_dwords,
7410c965db44STomer Tayar 					 char *results_buf);
7411c965db44STomer Tayar 	enum dbg_status (*results_buf_size)(struct qed_hwfn *p_hwfn,
7412c965db44STomer Tayar 					    u32 *dump_buf,
7413c965db44STomer Tayar 					    u32 num_dumped_dwords,
7414c965db44STomer Tayar 					    u32 *results_buf_size);
7415c965db44STomer Tayar } qed_features_lookup[] = {
7416c965db44STomer Tayar 	{
7417c965db44STomer Tayar 	"grc", qed_dbg_grc_get_dump_buf_size,
7418c965db44STomer Tayar 		    qed_dbg_grc_dump, NULL, NULL}, {
7419c965db44STomer Tayar 	"idle_chk",
7420c965db44STomer Tayar 		    qed_dbg_idle_chk_get_dump_buf_size,
7421c965db44STomer Tayar 		    qed_dbg_idle_chk_dump,
7422c965db44STomer Tayar 		    qed_print_idle_chk_results_wrapper,
7423c965db44STomer Tayar 		    qed_get_idle_chk_results_buf_size}, {
7424c965db44STomer Tayar 	"mcp_trace",
7425c965db44STomer Tayar 		    qed_dbg_mcp_trace_get_dump_buf_size,
7426c965db44STomer Tayar 		    qed_dbg_mcp_trace_dump, qed_print_mcp_trace_results,
7427c965db44STomer Tayar 		    qed_get_mcp_trace_results_buf_size}, {
7428c965db44STomer Tayar 	"reg_fifo",
7429c965db44STomer Tayar 		    qed_dbg_reg_fifo_get_dump_buf_size,
7430c965db44STomer Tayar 		    qed_dbg_reg_fifo_dump, qed_print_reg_fifo_results,
7431c965db44STomer Tayar 		    qed_get_reg_fifo_results_buf_size}, {
7432c965db44STomer Tayar 	"igu_fifo",
7433c965db44STomer Tayar 		    qed_dbg_igu_fifo_get_dump_buf_size,
7434c965db44STomer Tayar 		    qed_dbg_igu_fifo_dump, qed_print_igu_fifo_results,
7435c965db44STomer Tayar 		    qed_get_igu_fifo_results_buf_size}, {
7436c965db44STomer Tayar 	"protection_override",
7437c965db44STomer Tayar 		    qed_dbg_protection_override_get_dump_buf_size,
7438c965db44STomer Tayar 		    qed_dbg_protection_override_dump,
7439c965db44STomer Tayar 		    qed_print_protection_override_results,
7440c965db44STomer Tayar 		    qed_get_protection_override_results_buf_size}, {
7441c965db44STomer Tayar 	"fw_asserts",
7442c965db44STomer Tayar 		    qed_dbg_fw_asserts_get_dump_buf_size,
7443c965db44STomer Tayar 		    qed_dbg_fw_asserts_dump,
7444c965db44STomer Tayar 		    qed_print_fw_asserts_results,
74458a52bbabSMichal Kalderon 		    qed_get_fw_asserts_results_buf_size}, {
74468a52bbabSMichal Kalderon 	"ilt",
74478a52bbabSMichal Kalderon 		    qed_dbg_ilt_get_dump_buf_size,
74488a52bbabSMichal Kalderon 		    qed_dbg_ilt_dump, NULL, NULL},};
7449c965db44STomer Tayar 
7450c965db44STomer Tayar static void qed_dbg_print_feature(u8 *p_text_buf, u32 text_size)
7451c965db44STomer Tayar {
7452c965db44STomer Tayar 	u32 i, precision = 80;
7453c965db44STomer Tayar 
7454c965db44STomer Tayar 	if (!p_text_buf)
7455c965db44STomer Tayar 		return;
7456c965db44STomer Tayar 
7457c965db44STomer Tayar 	pr_notice("\n%.*s", precision, p_text_buf);
7458c965db44STomer Tayar 	for (i = precision; i < text_size; i += precision)
7459c965db44STomer Tayar 		pr_cont("%.*s", precision, p_text_buf + i);
7460c965db44STomer Tayar 	pr_cont("\n");
7461c965db44STomer Tayar }
7462c965db44STomer Tayar 
7463c965db44STomer Tayar #define QED_RESULTS_BUF_MIN_SIZE 16
7464c965db44STomer Tayar /* Generic function for decoding debug feature info */
74658c93beafSYuval Mintz static enum dbg_status format_feature(struct qed_hwfn *p_hwfn,
7466c965db44STomer Tayar 				      enum qed_dbg_features feature_idx)
7467c965db44STomer Tayar {
7468c965db44STomer Tayar 	struct qed_dbg_feature *feature =
7469ca352f00SIgor Russkikh 	    &p_hwfn->cdev->dbg_features[feature_idx];
7470c965db44STomer Tayar 	u32 text_size_bytes, null_char_pos, i;
7471c965db44STomer Tayar 	enum dbg_status rc;
7472c965db44STomer Tayar 	char *text_buf;
7473c965db44STomer Tayar 
7474c965db44STomer Tayar 	/* Check if feature supports formatting capability */
7475c965db44STomer Tayar 	if (!qed_features_lookup[feature_idx].results_buf_size)
7476c965db44STomer Tayar 		return DBG_STATUS_OK;
7477c965db44STomer Tayar 
7478c965db44STomer Tayar 	/* Obtain size of formatted output */
7479c965db44STomer Tayar 	rc = qed_features_lookup[feature_idx].
7480c965db44STomer Tayar 		results_buf_size(p_hwfn, (u32 *)feature->dump_buf,
7481c965db44STomer Tayar 				 feature->dumped_dwords, &text_size_bytes);
7482c965db44STomer Tayar 	if (rc != DBG_STATUS_OK)
7483c965db44STomer Tayar 		return rc;
7484c965db44STomer Tayar 
7485c965db44STomer Tayar 	/* Make sure that the allocated size is a multiple of dword (4 bytes) */
7486c965db44STomer Tayar 	null_char_pos = text_size_bytes - 1;
7487c965db44STomer Tayar 	text_size_bytes = (text_size_bytes + 3) & ~0x3;
7488c965db44STomer Tayar 
7489c965db44STomer Tayar 	if (text_size_bytes < QED_RESULTS_BUF_MIN_SIZE) {
7490c965db44STomer Tayar 		DP_NOTICE(p_hwfn->cdev,
7491c965db44STomer Tayar 			  "formatted size of feature was too small %d. Aborting\n",
7492c965db44STomer Tayar 			  text_size_bytes);
7493c965db44STomer Tayar 		return DBG_STATUS_INVALID_ARGS;
7494c965db44STomer Tayar 	}
7495c965db44STomer Tayar 
7496c965db44STomer Tayar 	/* Allocate temp text buf */
7497c965db44STomer Tayar 	text_buf = vzalloc(text_size_bytes);
7498c965db44STomer Tayar 	if (!text_buf)
7499c965db44STomer Tayar 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
7500c965db44STomer Tayar 
7501c965db44STomer Tayar 	/* Decode feature opcodes to string on temp buf */
7502c965db44STomer Tayar 	rc = qed_features_lookup[feature_idx].
7503c965db44STomer Tayar 		print_results(p_hwfn, (u32 *)feature->dump_buf,
7504c965db44STomer Tayar 			      feature->dumped_dwords, text_buf);
7505c965db44STomer Tayar 	if (rc != DBG_STATUS_OK) {
7506c965db44STomer Tayar 		vfree(text_buf);
7507c965db44STomer Tayar 		return rc;
7508c965db44STomer Tayar 	}
7509c965db44STomer Tayar 
7510c965db44STomer Tayar 	/* Replace the original null character with a '\n' character.
7511c965db44STomer Tayar 	 * The bytes that were added as a result of the dword alignment are also
7512c965db44STomer Tayar 	 * padded with '\n' characters.
7513c965db44STomer Tayar 	 */
7514c965db44STomer Tayar 	for (i = null_char_pos; i < text_size_bytes; i++)
7515c965db44STomer Tayar 		text_buf[i] = '\n';
7516c965db44STomer Tayar 
7517c965db44STomer Tayar 	/* Dump printable feature to log */
7518ca352f00SIgor Russkikh 	if (p_hwfn->cdev->print_dbg_data)
7519c965db44STomer Tayar 		qed_dbg_print_feature(text_buf, text_size_bytes);
7520c965db44STomer Tayar 
7521da328711SAlexander Lobakin 	/* Just return the original binary buffer if requested */
7522da328711SAlexander Lobakin 	if (p_hwfn->cdev->dbg_bin_dump) {
7523da328711SAlexander Lobakin 		vfree(text_buf);
7524da328711SAlexander Lobakin 		return DBG_STATUS_OK;
7525da328711SAlexander Lobakin 	}
7526da328711SAlexander Lobakin 
7527c965db44STomer Tayar 	/* Free the old dump_buf and point the dump_buf to the newly allocagted
7528c965db44STomer Tayar 	 * and formatted text buffer.
7529c965db44STomer Tayar 	 */
7530c965db44STomer Tayar 	vfree(feature->dump_buf);
7531c965db44STomer Tayar 	feature->dump_buf = text_buf;
7532c965db44STomer Tayar 	feature->buf_size = text_size_bytes;
7533c965db44STomer Tayar 	feature->dumped_dwords = text_size_bytes / 4;
7534c965db44STomer Tayar 	return rc;
7535c965db44STomer Tayar }
7536c965db44STomer Tayar 
75378a52bbabSMichal Kalderon #define MAX_DBG_FEATURE_SIZE_DWORDS	0x3FFFFFFF
75388a52bbabSMichal Kalderon 
7539c965db44STomer Tayar /* Generic function for performing the dump of a debug feature. */
75408c93beafSYuval Mintz static enum dbg_status qed_dbg_dump(struct qed_hwfn *p_hwfn,
75418c93beafSYuval Mintz 				    struct qed_ptt *p_ptt,
7542c965db44STomer Tayar 				    enum qed_dbg_features feature_idx)
7543c965db44STomer Tayar {
7544c965db44STomer Tayar 	struct qed_dbg_feature *feature =
7545ca352f00SIgor Russkikh 	    &p_hwfn->cdev->dbg_features[feature_idx];
7546c965db44STomer Tayar 	u32 buf_size_dwords;
7547c965db44STomer Tayar 	enum dbg_status rc;
7548c965db44STomer Tayar 
7549c965db44STomer Tayar 	DP_NOTICE(p_hwfn->cdev, "Collecting a debug feature [\"%s\"]\n",
7550c965db44STomer Tayar 		  qed_features_lookup[feature_idx].name);
7551c965db44STomer Tayar 
7552c965db44STomer Tayar 	/* Dump_buf was already allocated need to free (this can happen if dump
7553c965db44STomer Tayar 	 * was called but file was never read).
7554c965db44STomer Tayar 	 * We can't use the buffer as is since size may have changed.
7555c965db44STomer Tayar 	 */
7556c965db44STomer Tayar 	if (feature->dump_buf) {
7557c965db44STomer Tayar 		vfree(feature->dump_buf);
7558c965db44STomer Tayar 		feature->dump_buf = NULL;
7559c965db44STomer Tayar 	}
7560c965db44STomer Tayar 
7561c965db44STomer Tayar 	/* Get buffer size from hsi, allocate accordingly, and perform the
7562c965db44STomer Tayar 	 * dump.
7563c965db44STomer Tayar 	 */
7564c965db44STomer Tayar 	rc = qed_features_lookup[feature_idx].get_size(p_hwfn, p_ptt,
7565c965db44STomer Tayar 						       &buf_size_dwords);
7566be086e7cSMintz, Yuval 	if (rc != DBG_STATUS_OK && rc != DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
7567c965db44STomer Tayar 		return rc;
75682d22bc83SMichal Kalderon 
75692d22bc83SMichal Kalderon 	if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS) {
75702d22bc83SMichal Kalderon 		feature->buf_size = 0;
75712d22bc83SMichal Kalderon 		DP_NOTICE(p_hwfn->cdev,
75722d22bc83SMichal Kalderon 			  "Debug feature [\"%s\"] size (0x%x dwords) exceeds maximum size (0x%x dwords)\n",
75732d22bc83SMichal Kalderon 			  qed_features_lookup[feature_idx].name,
75742d22bc83SMichal Kalderon 			  buf_size_dwords, MAX_DBG_FEATURE_SIZE_DWORDS);
75752d22bc83SMichal Kalderon 
75762d22bc83SMichal Kalderon 		return DBG_STATUS_OK;
75772d22bc83SMichal Kalderon 	}
75782d22bc83SMichal Kalderon 
7579c965db44STomer Tayar 	feature->buf_size = buf_size_dwords * sizeof(u32);
7580c965db44STomer Tayar 	feature->dump_buf = vmalloc(feature->buf_size);
7581c965db44STomer Tayar 	if (!feature->dump_buf)
7582c965db44STomer Tayar 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
7583c965db44STomer Tayar 
7584c965db44STomer Tayar 	rc = qed_features_lookup[feature_idx].
7585c965db44STomer Tayar 		perform_dump(p_hwfn, p_ptt, (u32 *)feature->dump_buf,
7586c965db44STomer Tayar 			     feature->buf_size / sizeof(u32),
7587c965db44STomer Tayar 			     &feature->dumped_dwords);
7588c965db44STomer Tayar 
7589c965db44STomer Tayar 	/* If mcp is stuck we get DBG_STATUS_NVRAM_GET_IMAGE_FAILED error.
7590c965db44STomer Tayar 	 * In this case the buffer holds valid binary data, but we wont able
7591c965db44STomer Tayar 	 * to parse it (since parsing relies on data in NVRAM which is only
7592c965db44STomer Tayar 	 * accessible when MFW is responsive). skip the formatting but return
7593c965db44STomer Tayar 	 * success so that binary data is provided.
7594c965db44STomer Tayar 	 */
7595c965db44STomer Tayar 	if (rc == DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
7596c965db44STomer Tayar 		return DBG_STATUS_OK;
7597c965db44STomer Tayar 
7598c965db44STomer Tayar 	if (rc != DBG_STATUS_OK)
7599c965db44STomer Tayar 		return rc;
7600c965db44STomer Tayar 
7601c965db44STomer Tayar 	/* Format output */
7602c965db44STomer Tayar 	rc = format_feature(p_hwfn, feature_idx);
7603c965db44STomer Tayar 	return rc;
7604c965db44STomer Tayar }
7605c965db44STomer Tayar 
7606c965db44STomer Tayar int qed_dbg_grc(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
7607c965db44STomer Tayar {
7608c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_GRC, num_dumped_bytes);
7609c965db44STomer Tayar }
7610c965db44STomer Tayar 
7611c965db44STomer Tayar int qed_dbg_grc_size(struct qed_dev *cdev)
7612c965db44STomer Tayar {
7613c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_GRC);
7614c965db44STomer Tayar }
7615c965db44STomer Tayar 
7616c965db44STomer Tayar int qed_dbg_idle_chk(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
7617c965db44STomer Tayar {
7618c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IDLE_CHK,
7619c965db44STomer Tayar 			       num_dumped_bytes);
7620c965db44STomer Tayar }
7621c965db44STomer Tayar 
7622c965db44STomer Tayar int qed_dbg_idle_chk_size(struct qed_dev *cdev)
7623c965db44STomer Tayar {
7624c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_IDLE_CHK);
7625c965db44STomer Tayar }
7626c965db44STomer Tayar 
7627c965db44STomer Tayar int qed_dbg_reg_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
7628c965db44STomer Tayar {
7629c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_REG_FIFO,
7630c965db44STomer Tayar 			       num_dumped_bytes);
7631c965db44STomer Tayar }
7632c965db44STomer Tayar 
7633c965db44STomer Tayar int qed_dbg_reg_fifo_size(struct qed_dev *cdev)
7634c965db44STomer Tayar {
7635c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_REG_FIFO);
7636c965db44STomer Tayar }
7637c965db44STomer Tayar 
7638c965db44STomer Tayar int qed_dbg_igu_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
7639c965db44STomer Tayar {
7640c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IGU_FIFO,
7641c965db44STomer Tayar 			       num_dumped_bytes);
7642c965db44STomer Tayar }
7643c965db44STomer Tayar 
7644c965db44STomer Tayar int qed_dbg_igu_fifo_size(struct qed_dev *cdev)
7645c965db44STomer Tayar {
7646c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_IGU_FIFO);
7647c965db44STomer Tayar }
7648c965db44STomer Tayar 
7649bf774d14SYueHaibing static int qed_dbg_nvm_image_length(struct qed_hwfn *p_hwfn,
76501ac4329aSDenis Bolotin 				    enum qed_nvm_images image_id, u32 *length)
76511ac4329aSDenis Bolotin {
76521ac4329aSDenis Bolotin 	struct qed_nvm_image_att image_att;
76531ac4329aSDenis Bolotin 	int rc;
76541ac4329aSDenis Bolotin 
76551ac4329aSDenis Bolotin 	*length = 0;
76561ac4329aSDenis Bolotin 	rc = qed_mcp_get_nvm_image_att(p_hwfn, image_id, &image_att);
76571ac4329aSDenis Bolotin 	if (rc)
76581ac4329aSDenis Bolotin 		return rc;
76591ac4329aSDenis Bolotin 
76601ac4329aSDenis Bolotin 	*length = image_att.length;
76611ac4329aSDenis Bolotin 
76621ac4329aSDenis Bolotin 	return rc;
76631ac4329aSDenis Bolotin }
76641ac4329aSDenis Bolotin 
7665bf774d14SYueHaibing static int qed_dbg_nvm_image(struct qed_dev *cdev, void *buffer,
7666bf774d14SYueHaibing 			     u32 *num_dumped_bytes,
7667bf774d14SYueHaibing 			     enum qed_nvm_images image_id)
76681ac4329aSDenis Bolotin {
76691ac4329aSDenis Bolotin 	struct qed_hwfn *p_hwfn =
7670ca352f00SIgor Russkikh 		&cdev->hwfns[cdev->engine_for_debug];
76715ab90341SAlexander Lobakin 	u32 len_rounded;
76721ac4329aSDenis Bolotin 	int rc;
76731ac4329aSDenis Bolotin 
76741ac4329aSDenis Bolotin 	*num_dumped_bytes = 0;
76751ac4329aSDenis Bolotin 	rc = qed_dbg_nvm_image_length(p_hwfn, image_id, &len_rounded);
76761ac4329aSDenis Bolotin 	if (rc)
76771ac4329aSDenis Bolotin 		return rc;
76781ac4329aSDenis Bolotin 
76791ac4329aSDenis Bolotin 	DP_NOTICE(p_hwfn->cdev,
76801ac4329aSDenis Bolotin 		  "Collecting a debug feature [\"nvram image %d\"]\n",
76811ac4329aSDenis Bolotin 		  image_id);
76821ac4329aSDenis Bolotin 
76831ac4329aSDenis Bolotin 	len_rounded = roundup(len_rounded, sizeof(u32));
76841ac4329aSDenis Bolotin 	rc = qed_mcp_get_nvm_image(p_hwfn, image_id, buffer, len_rounded);
76851ac4329aSDenis Bolotin 	if (rc)
76861ac4329aSDenis Bolotin 		return rc;
76871ac4329aSDenis Bolotin 
76881ac4329aSDenis Bolotin 	/* QED_NVM_IMAGE_NVM_META image is not swapped like other images */
76891ac4329aSDenis Bolotin 	if (image_id != QED_NVM_IMAGE_NVM_META)
76905ab90341SAlexander Lobakin 		cpu_to_be32_array((__force __be32 *)buffer,
76915ab90341SAlexander Lobakin 				  (const u32 *)buffer,
76925ab90341SAlexander Lobakin 				  len_rounded / sizeof(u32));
76931ac4329aSDenis Bolotin 
76941ac4329aSDenis Bolotin 	*num_dumped_bytes = len_rounded;
76951ac4329aSDenis Bolotin 
76961ac4329aSDenis Bolotin 	return rc;
76971ac4329aSDenis Bolotin }
76981ac4329aSDenis Bolotin 
7699c965db44STomer Tayar int qed_dbg_protection_override(struct qed_dev *cdev, void *buffer,
7700c965db44STomer Tayar 				u32 *num_dumped_bytes)
7701c965db44STomer Tayar {
7702c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_PROTECTION_OVERRIDE,
7703c965db44STomer Tayar 			       num_dumped_bytes);
7704c965db44STomer Tayar }
7705c965db44STomer Tayar 
7706c965db44STomer Tayar int qed_dbg_protection_override_size(struct qed_dev *cdev)
7707c965db44STomer Tayar {
7708c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_PROTECTION_OVERRIDE);
7709c965db44STomer Tayar }
7710c965db44STomer Tayar 
7711c965db44STomer Tayar int qed_dbg_fw_asserts(struct qed_dev *cdev, void *buffer,
7712c965db44STomer Tayar 		       u32 *num_dumped_bytes)
7713c965db44STomer Tayar {
7714c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_FW_ASSERTS,
7715c965db44STomer Tayar 			       num_dumped_bytes);
7716c965db44STomer Tayar }
7717c965db44STomer Tayar 
7718c965db44STomer Tayar int qed_dbg_fw_asserts_size(struct qed_dev *cdev)
7719c965db44STomer Tayar {
7720c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_FW_ASSERTS);
7721c965db44STomer Tayar }
7722c965db44STomer Tayar 
77238a52bbabSMichal Kalderon int qed_dbg_ilt(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
77248a52bbabSMichal Kalderon {
77258a52bbabSMichal Kalderon 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_ILT, num_dumped_bytes);
77268a52bbabSMichal Kalderon }
77278a52bbabSMichal Kalderon 
77288a52bbabSMichal Kalderon int qed_dbg_ilt_size(struct qed_dev *cdev)
77298a52bbabSMichal Kalderon {
77308a52bbabSMichal Kalderon 	return qed_dbg_feature_size(cdev, DBG_FEATURE_ILT);
77318a52bbabSMichal Kalderon }
77328a52bbabSMichal Kalderon 
7733c965db44STomer Tayar int qed_dbg_mcp_trace(struct qed_dev *cdev, void *buffer,
7734c965db44STomer Tayar 		      u32 *num_dumped_bytes)
7735c965db44STomer Tayar {
7736c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_MCP_TRACE,
7737c965db44STomer Tayar 			       num_dumped_bytes);
7738c965db44STomer Tayar }
7739c965db44STomer Tayar 
7740c965db44STomer Tayar int qed_dbg_mcp_trace_size(struct qed_dev *cdev)
7741c965db44STomer Tayar {
7742c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_MCP_TRACE);
7743c965db44STomer Tayar }
7744c965db44STomer Tayar 
7745c965db44STomer Tayar /* Defines the amount of bytes allocated for recording the length of debugfs
7746c965db44STomer Tayar  * feature buffer.
7747c965db44STomer Tayar  */
7748c965db44STomer Tayar #define REGDUMP_HEADER_SIZE			sizeof(u32)
77498a52bbabSMichal Kalderon #define REGDUMP_HEADER_SIZE_SHIFT		0
77508a52bbabSMichal Kalderon #define REGDUMP_HEADER_SIZE_MASK		0xffffff
7751c965db44STomer Tayar #define REGDUMP_HEADER_FEATURE_SHIFT		24
7752da328711SAlexander Lobakin #define REGDUMP_HEADER_FEATURE_MASK		0x1f
7753da328711SAlexander Lobakin #define REGDUMP_HEADER_BIN_DUMP_SHIFT		29
7754da328711SAlexander Lobakin #define REGDUMP_HEADER_BIN_DUMP_MASK		0x1
7755c965db44STomer Tayar #define REGDUMP_HEADER_OMIT_ENGINE_SHIFT	30
77568a52bbabSMichal Kalderon #define REGDUMP_HEADER_OMIT_ENGINE_MASK		0x1
77578a52bbabSMichal Kalderon #define REGDUMP_HEADER_ENGINE_SHIFT		31
77588a52bbabSMichal Kalderon #define REGDUMP_HEADER_ENGINE_MASK		0x1
77598a52bbabSMichal Kalderon #define REGDUMP_MAX_SIZE			0x1000000
77608a52bbabSMichal Kalderon #define ILT_DUMP_MAX_SIZE			(1024 * 1024 * 15)
77618a52bbabSMichal Kalderon 
7762c965db44STomer Tayar enum debug_print_features {
7763c965db44STomer Tayar 	OLD_MODE = 0,
7764c965db44STomer Tayar 	IDLE_CHK = 1,
7765c965db44STomer Tayar 	GRC_DUMP = 2,
7766c965db44STomer Tayar 	MCP_TRACE = 3,
7767c965db44STomer Tayar 	REG_FIFO = 4,
7768c965db44STomer Tayar 	PROTECTION_OVERRIDE = 5,
7769c965db44STomer Tayar 	IGU_FIFO = 6,
7770c965db44STomer Tayar 	PHY = 7,
7771c965db44STomer Tayar 	FW_ASSERTS = 8,
77721ac4329aSDenis Bolotin 	NVM_CFG1 = 9,
77731ac4329aSDenis Bolotin 	DEFAULT_CFG = 10,
77741ac4329aSDenis Bolotin 	NVM_META = 11,
77758a52bbabSMichal Kalderon 	MDUMP = 12,
77768a52bbabSMichal Kalderon 	ILT_DUMP = 13,
7777c965db44STomer Tayar };
7778c965db44STomer Tayar 
77792d22bc83SMichal Kalderon static u32 qed_calc_regdump_header(struct qed_dev *cdev,
77802d22bc83SMichal Kalderon 				   enum debug_print_features feature,
7781c965db44STomer Tayar 				   int engine, u32 feature_size, u8 omit_engine)
7782c965db44STomer Tayar {
77832d22bc83SMichal Kalderon 	u32 res = 0;
77842d22bc83SMichal Kalderon 
77852d22bc83SMichal Kalderon 	SET_FIELD(res, REGDUMP_HEADER_SIZE, feature_size);
77862d22bc83SMichal Kalderon 	if (res != feature_size)
77872d22bc83SMichal Kalderon 		DP_NOTICE(cdev,
77882d22bc83SMichal Kalderon 			  "Feature %d is too large (size 0x%x) and will corrupt the dump\n",
77892d22bc83SMichal Kalderon 			  feature, feature_size);
77902d22bc83SMichal Kalderon 
77912d22bc83SMichal Kalderon 	SET_FIELD(res, REGDUMP_HEADER_FEATURE, feature);
7792da328711SAlexander Lobakin 	SET_FIELD(res, REGDUMP_HEADER_BIN_DUMP, 1);
77932d22bc83SMichal Kalderon 	SET_FIELD(res, REGDUMP_HEADER_OMIT_ENGINE, omit_engine);
77942d22bc83SMichal Kalderon 	SET_FIELD(res, REGDUMP_HEADER_ENGINE, engine);
77952d22bc83SMichal Kalderon 
77962d22bc83SMichal Kalderon 	return res;
7797c965db44STomer Tayar }
7798c965db44STomer Tayar 
7799c965db44STomer Tayar int qed_dbg_all_data(struct qed_dev *cdev, void *buffer)
7800c965db44STomer Tayar {
7801c965db44STomer Tayar 	u8 cur_engine, omit_engine = 0, org_engine;
78023b86bd07SSudarsana Reddy Kalluru 	struct qed_hwfn *p_hwfn =
7803ca352f00SIgor Russkikh 		&cdev->hwfns[cdev->engine_for_debug];
78043b86bd07SSudarsana Reddy Kalluru 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
78053b86bd07SSudarsana Reddy Kalluru 	int grc_params[MAX_DBG_GRC_PARAMS], i;
7806c965db44STomer Tayar 	u32 offset = 0, feature_size;
7807c965db44STomer Tayar 	int rc;
7808c965db44STomer Tayar 
78093b86bd07SSudarsana Reddy Kalluru 	for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
78103b86bd07SSudarsana Reddy Kalluru 		grc_params[i] = dev_data->grc.param_val[i];
78113b86bd07SSudarsana Reddy Kalluru 
78122d22bc83SMichal Kalderon 	if (!QED_IS_CMT(cdev))
7813c965db44STomer Tayar 		omit_engine = 1;
7814c965db44STomer Tayar 
78152d22bc83SMichal Kalderon 	mutex_lock(&qed_dbg_lock);
7816da328711SAlexander Lobakin 	cdev->dbg_bin_dump = true;
78172d22bc83SMichal Kalderon 
7818c965db44STomer Tayar 	org_engine = qed_get_debug_engine(cdev);
7819c965db44STomer Tayar 	for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) {
7820c965db44STomer Tayar 		/* Collect idle_chks and grcDump for each hw function */
7821c965db44STomer Tayar 		DP_VERBOSE(cdev, QED_MSG_DEBUG,
7822c965db44STomer Tayar 			   "obtaining idle_chk and grcdump for current engine\n");
7823c965db44STomer Tayar 		qed_set_debug_engine(cdev, cur_engine);
7824c965db44STomer Tayar 
7825c965db44STomer Tayar 		/* First idle_chk */
7826c965db44STomer Tayar 		rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset +
7827c965db44STomer Tayar 				      REGDUMP_HEADER_SIZE, &feature_size);
7828c965db44STomer Tayar 		if (!rc) {
7829c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
78302d22bc83SMichal Kalderon 			    qed_calc_regdump_header(cdev, IDLE_CHK, cur_engine,
7831c965db44STomer Tayar 						    feature_size, omit_engine);
7832c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7833c965db44STomer Tayar 		} else {
7834c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc);
7835c965db44STomer Tayar 		}
7836c965db44STomer Tayar 
7837c965db44STomer Tayar 		/* Second idle_chk */
7838c965db44STomer Tayar 		rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset +
7839c965db44STomer Tayar 				      REGDUMP_HEADER_SIZE, &feature_size);
7840c965db44STomer Tayar 		if (!rc) {
7841c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
78422d22bc83SMichal Kalderon 			    qed_calc_regdump_header(cdev, IDLE_CHK, cur_engine,
7843c965db44STomer Tayar 						    feature_size, omit_engine);
7844c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7845c965db44STomer Tayar 		} else {
7846c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc);
7847c965db44STomer Tayar 		}
7848c965db44STomer Tayar 
7849c965db44STomer Tayar 		/* reg_fifo dump */
7850c965db44STomer Tayar 		rc = qed_dbg_reg_fifo(cdev, (u8 *)buffer + offset +
7851c965db44STomer Tayar 				      REGDUMP_HEADER_SIZE, &feature_size);
7852c965db44STomer Tayar 		if (!rc) {
7853c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
78542d22bc83SMichal Kalderon 			    qed_calc_regdump_header(cdev, REG_FIFO, cur_engine,
7855c965db44STomer Tayar 						    feature_size, omit_engine);
7856c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7857c965db44STomer Tayar 		} else {
7858c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_reg_fifo failed. rc = %d\n", rc);
7859c965db44STomer Tayar 		}
7860c965db44STomer Tayar 
7861c965db44STomer Tayar 		/* igu_fifo dump */
7862c965db44STomer Tayar 		rc = qed_dbg_igu_fifo(cdev, (u8 *)buffer + offset +
7863c965db44STomer Tayar 				      REGDUMP_HEADER_SIZE, &feature_size);
7864c965db44STomer Tayar 		if (!rc) {
7865c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
78662d22bc83SMichal Kalderon 			    qed_calc_regdump_header(cdev, IGU_FIFO, cur_engine,
7867c965db44STomer Tayar 						    feature_size, omit_engine);
7868c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7869c965db44STomer Tayar 		} else {
7870c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_igu_fifo failed. rc = %d", rc);
7871c965db44STomer Tayar 		}
7872c965db44STomer Tayar 
7873c965db44STomer Tayar 		/* protection_override dump */
7874c965db44STomer Tayar 		rc = qed_dbg_protection_override(cdev, (u8 *)buffer + offset +
7875c965db44STomer Tayar 						 REGDUMP_HEADER_SIZE,
7876c965db44STomer Tayar 						 &feature_size);
7877c965db44STomer Tayar 		if (!rc) {
7878c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
78792d22bc83SMichal Kalderon 			    qed_calc_regdump_header(cdev, PROTECTION_OVERRIDE,
7880c965db44STomer Tayar 						    cur_engine,
7881c965db44STomer Tayar 						    feature_size, omit_engine);
7882c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7883c965db44STomer Tayar 		} else {
7884c965db44STomer Tayar 			DP_ERR(cdev,
7885c965db44STomer Tayar 			       "qed_dbg_protection_override failed. rc = %d\n",
7886c965db44STomer Tayar 			       rc);
7887c965db44STomer Tayar 		}
7888c965db44STomer Tayar 
7889c965db44STomer Tayar 		/* fw_asserts dump */
7890c965db44STomer Tayar 		rc = qed_dbg_fw_asserts(cdev, (u8 *)buffer + offset +
7891c965db44STomer Tayar 					REGDUMP_HEADER_SIZE, &feature_size);
7892c965db44STomer Tayar 		if (!rc) {
7893c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
78942d22bc83SMichal Kalderon 			    qed_calc_regdump_header(cdev, FW_ASSERTS,
78952d22bc83SMichal Kalderon 						    cur_engine, feature_size,
78962d22bc83SMichal Kalderon 						    omit_engine);
7897c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7898c965db44STomer Tayar 		} else {
7899c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_fw_asserts failed. rc = %d\n",
7900c965db44STomer Tayar 			       rc);
7901c965db44STomer Tayar 		}
7902c965db44STomer Tayar 
79038a52bbabSMichal Kalderon 		feature_size = qed_dbg_ilt_size(cdev);
79048a52bbabSMichal Kalderon 		if (!cdev->disable_ilt_dump &&
79058a52bbabSMichal Kalderon 		    feature_size < ILT_DUMP_MAX_SIZE) {
79068a52bbabSMichal Kalderon 			rc = qed_dbg_ilt(cdev, (u8 *)buffer + offset +
79078a52bbabSMichal Kalderon 					 REGDUMP_HEADER_SIZE, &feature_size);
79088a52bbabSMichal Kalderon 			if (!rc) {
79098a52bbabSMichal Kalderon 				*(u32 *)((u8 *)buffer + offset) =
79102d22bc83SMichal Kalderon 				    qed_calc_regdump_header(cdev, ILT_DUMP,
79118a52bbabSMichal Kalderon 							    cur_engine,
79128a52bbabSMichal Kalderon 							    feature_size,
79138a52bbabSMichal Kalderon 							    omit_engine);
79148a52bbabSMichal Kalderon 				offset += feature_size + REGDUMP_HEADER_SIZE;
79158a52bbabSMichal Kalderon 			} else {
79168a52bbabSMichal Kalderon 				DP_ERR(cdev, "qed_dbg_ilt failed. rc = %d\n",
79178a52bbabSMichal Kalderon 				       rc);
79188a52bbabSMichal Kalderon 			}
79198a52bbabSMichal Kalderon 		}
79203b86bd07SSudarsana Reddy Kalluru 
7921c965db44STomer Tayar 		/* GRC dump - must be last because when mcp stuck it will
7922c965db44STomer Tayar 		 * clutter idle_chk, reg_fifo, ...
7923c965db44STomer Tayar 		 */
79242d22bc83SMichal Kalderon 		for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
79252d22bc83SMichal Kalderon 			dev_data->grc.param_val[i] = grc_params[i];
79262d22bc83SMichal Kalderon 
7927c965db44STomer Tayar 		rc = qed_dbg_grc(cdev, (u8 *)buffer + offset +
7928c965db44STomer Tayar 				 REGDUMP_HEADER_SIZE, &feature_size);
7929c965db44STomer Tayar 		if (!rc) {
7930c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
79312d22bc83SMichal Kalderon 			    qed_calc_regdump_header(cdev, GRC_DUMP,
79322d22bc83SMichal Kalderon 						    cur_engine,
7933c965db44STomer Tayar 						    feature_size, omit_engine);
7934c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
7935c965db44STomer Tayar 		} else {
7936c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_grc failed. rc = %d", rc);
7937c965db44STomer Tayar 		}
7938c965db44STomer Tayar 	}
7939c965db44STomer Tayar 
794050bc60cbSMichal Kalderon 	qed_set_debug_engine(cdev, org_engine);
79412d22bc83SMichal Kalderon 
7942c965db44STomer Tayar 	/* mcp_trace */
7943c965db44STomer Tayar 	rc = qed_dbg_mcp_trace(cdev, (u8 *)buffer + offset +
7944c965db44STomer Tayar 			       REGDUMP_HEADER_SIZE, &feature_size);
7945c965db44STomer Tayar 	if (!rc) {
7946c965db44STomer Tayar 		*(u32 *)((u8 *)buffer + offset) =
79472d22bc83SMichal Kalderon 		    qed_calc_regdump_header(cdev, MCP_TRACE, cur_engine,
7948c965db44STomer Tayar 					    feature_size, omit_engine);
7949c965db44STomer Tayar 		offset += (feature_size + REGDUMP_HEADER_SIZE);
7950c965db44STomer Tayar 	} else {
7951c965db44STomer Tayar 		DP_ERR(cdev, "qed_dbg_mcp_trace failed. rc = %d\n", rc);
7952c965db44STomer Tayar 	}
7953c965db44STomer Tayar 
795413cf8aabSSudarsana Reddy Kalluru 	/* Re-populate nvm attribute info */
795513cf8aabSSudarsana Reddy Kalluru 	qed_mcp_nvm_info_free(p_hwfn);
795613cf8aabSSudarsana Reddy Kalluru 	qed_mcp_nvm_info_populate(p_hwfn);
795713cf8aabSSudarsana Reddy Kalluru 
79581ac4329aSDenis Bolotin 	/* nvm cfg1 */
79591ac4329aSDenis Bolotin 	rc = qed_dbg_nvm_image(cdev,
79602d22bc83SMichal Kalderon 			       (u8 *)buffer + offset +
79612d22bc83SMichal Kalderon 			       REGDUMP_HEADER_SIZE, &feature_size,
79622d22bc83SMichal Kalderon 			       QED_NVM_IMAGE_NVM_CFG1);
79631ac4329aSDenis Bolotin 	if (!rc) {
79641ac4329aSDenis Bolotin 		*(u32 *)((u8 *)buffer + offset) =
79652d22bc83SMichal Kalderon 		    qed_calc_regdump_header(cdev, NVM_CFG1, cur_engine,
79661ac4329aSDenis Bolotin 					    feature_size, omit_engine);
79671ac4329aSDenis Bolotin 		offset += (feature_size + REGDUMP_HEADER_SIZE);
79681ac4329aSDenis Bolotin 	} else if (rc != -ENOENT) {
79691ac4329aSDenis Bolotin 		DP_ERR(cdev,
79701ac4329aSDenis Bolotin 		       "qed_dbg_nvm_image failed for image  %d (%s), rc = %d\n",
79711ac4329aSDenis Bolotin 		       QED_NVM_IMAGE_NVM_CFG1, "QED_NVM_IMAGE_NVM_CFG1", rc);
79721ac4329aSDenis Bolotin 	}
79731ac4329aSDenis Bolotin 
79741ac4329aSDenis Bolotin 	/* nvm default */
79751ac4329aSDenis Bolotin 	rc = qed_dbg_nvm_image(cdev,
79761ac4329aSDenis Bolotin 			       (u8 *)buffer + offset + REGDUMP_HEADER_SIZE,
79771ac4329aSDenis Bolotin 			       &feature_size, QED_NVM_IMAGE_DEFAULT_CFG);
79781ac4329aSDenis Bolotin 	if (!rc) {
79791ac4329aSDenis Bolotin 		*(u32 *)((u8 *)buffer + offset) =
79802d22bc83SMichal Kalderon 		    qed_calc_regdump_header(cdev, DEFAULT_CFG, cur_engine,
79811ac4329aSDenis Bolotin 					    feature_size, omit_engine);
79821ac4329aSDenis Bolotin 		offset += (feature_size + REGDUMP_HEADER_SIZE);
79831ac4329aSDenis Bolotin 	} else if (rc != -ENOENT) {
79841ac4329aSDenis Bolotin 		DP_ERR(cdev,
79851ac4329aSDenis Bolotin 		       "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
79861ac4329aSDenis Bolotin 		       QED_NVM_IMAGE_DEFAULT_CFG, "QED_NVM_IMAGE_DEFAULT_CFG",
79871ac4329aSDenis Bolotin 		       rc);
79881ac4329aSDenis Bolotin 	}
79891ac4329aSDenis Bolotin 
79901ac4329aSDenis Bolotin 	/* nvm meta */
79911ac4329aSDenis Bolotin 	rc = qed_dbg_nvm_image(cdev,
79921ac4329aSDenis Bolotin 			       (u8 *)buffer + offset + REGDUMP_HEADER_SIZE,
79931ac4329aSDenis Bolotin 			       &feature_size, QED_NVM_IMAGE_NVM_META);
79941ac4329aSDenis Bolotin 	if (!rc) {
79951ac4329aSDenis Bolotin 		*(u32 *)((u8 *)buffer + offset) =
79962d22bc83SMichal Kalderon 			qed_calc_regdump_header(cdev, NVM_META, cur_engine,
79971ac4329aSDenis Bolotin 						feature_size, omit_engine);
79981ac4329aSDenis Bolotin 		offset += (feature_size + REGDUMP_HEADER_SIZE);
79991ac4329aSDenis Bolotin 	} else if (rc != -ENOENT) {
80001ac4329aSDenis Bolotin 		DP_ERR(cdev,
80011ac4329aSDenis Bolotin 		       "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
80021ac4329aSDenis Bolotin 		       QED_NVM_IMAGE_NVM_META, "QED_NVM_IMAGE_NVM_META", rc);
80031ac4329aSDenis Bolotin 	}
80041ac4329aSDenis Bolotin 
80058a52bbabSMichal Kalderon 	/* nvm mdump */
80068a52bbabSMichal Kalderon 	rc = qed_dbg_nvm_image(cdev, (u8 *)buffer + offset +
80078a52bbabSMichal Kalderon 			       REGDUMP_HEADER_SIZE, &feature_size,
80088a52bbabSMichal Kalderon 			       QED_NVM_IMAGE_MDUMP);
80098a52bbabSMichal Kalderon 	if (!rc) {
80108a52bbabSMichal Kalderon 		*(u32 *)((u8 *)buffer + offset) =
80112d22bc83SMichal Kalderon 			qed_calc_regdump_header(cdev, MDUMP, cur_engine,
80128a52bbabSMichal Kalderon 						feature_size, omit_engine);
80138a52bbabSMichal Kalderon 		offset += (feature_size + REGDUMP_HEADER_SIZE);
80148a52bbabSMichal Kalderon 	} else if (rc != -ENOENT) {
80158a52bbabSMichal Kalderon 		DP_ERR(cdev,
80168a52bbabSMichal Kalderon 		       "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
80178a52bbabSMichal Kalderon 		       QED_NVM_IMAGE_MDUMP, "QED_NVM_IMAGE_MDUMP", rc);
80188a52bbabSMichal Kalderon 	}
80198a52bbabSMichal Kalderon 
8020da328711SAlexander Lobakin 	cdev->dbg_bin_dump = false;
80212d22bc83SMichal Kalderon 	mutex_unlock(&qed_dbg_lock);
80222d22bc83SMichal Kalderon 
8023c965db44STomer Tayar 	return 0;
8024c965db44STomer Tayar }
8025c965db44STomer Tayar 
8026c965db44STomer Tayar int qed_dbg_all_data_size(struct qed_dev *cdev)
8027c965db44STomer Tayar {
80281ac4329aSDenis Bolotin 	struct qed_hwfn *p_hwfn =
8029ca352f00SIgor Russkikh 		&cdev->hwfns[cdev->engine_for_debug];
80308a52bbabSMichal Kalderon 	u32 regs_len = 0, image_len = 0, ilt_len = 0, total_ilt_len = 0;
8031c965db44STomer Tayar 	u8 cur_engine, org_engine;
8032c965db44STomer Tayar 
80332d22bc83SMichal Kalderon 	cdev->disable_ilt_dump = false;
8034c965db44STomer Tayar 	org_engine = qed_get_debug_engine(cdev);
8035c965db44STomer Tayar 	for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) {
8036c965db44STomer Tayar 		/* Engine specific */
8037c965db44STomer Tayar 		DP_VERBOSE(cdev, QED_MSG_DEBUG,
8038c965db44STomer Tayar 			   "calculating idle_chk and grcdump register length for current engine\n");
8039c965db44STomer Tayar 		qed_set_debug_engine(cdev, cur_engine);
8040c965db44STomer Tayar 		regs_len += REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) +
8041c965db44STomer Tayar 			    REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) +
8042c965db44STomer Tayar 			    REGDUMP_HEADER_SIZE + qed_dbg_grc_size(cdev) +
8043c965db44STomer Tayar 			    REGDUMP_HEADER_SIZE + qed_dbg_reg_fifo_size(cdev) +
8044c965db44STomer Tayar 			    REGDUMP_HEADER_SIZE + qed_dbg_igu_fifo_size(cdev) +
8045c965db44STomer Tayar 			    REGDUMP_HEADER_SIZE +
8046c965db44STomer Tayar 			    qed_dbg_protection_override_size(cdev) +
8047c965db44STomer Tayar 			    REGDUMP_HEADER_SIZE + qed_dbg_fw_asserts_size(cdev);
80488a52bbabSMichal Kalderon 
80498a52bbabSMichal Kalderon 		ilt_len = REGDUMP_HEADER_SIZE + qed_dbg_ilt_size(cdev);
80508a52bbabSMichal Kalderon 		if (ilt_len < ILT_DUMP_MAX_SIZE) {
80518a52bbabSMichal Kalderon 			total_ilt_len += ilt_len;
80528a52bbabSMichal Kalderon 			regs_len += ilt_len;
80538a52bbabSMichal Kalderon 		}
8054c965db44STomer Tayar 	}
8055c965db44STomer Tayar 
805650bc60cbSMichal Kalderon 	qed_set_debug_engine(cdev, org_engine);
805750bc60cbSMichal Kalderon 
8058c965db44STomer Tayar 	/* Engine common */
8059c965db44STomer Tayar 	regs_len += REGDUMP_HEADER_SIZE + qed_dbg_mcp_trace_size(cdev);
80601ac4329aSDenis Bolotin 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_CFG1, &image_len);
80611ac4329aSDenis Bolotin 	if (image_len)
80621ac4329aSDenis Bolotin 		regs_len += REGDUMP_HEADER_SIZE + image_len;
80631ac4329aSDenis Bolotin 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_DEFAULT_CFG, &image_len);
80641ac4329aSDenis Bolotin 	if (image_len)
80651ac4329aSDenis Bolotin 		regs_len += REGDUMP_HEADER_SIZE + image_len;
80661ac4329aSDenis Bolotin 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_META, &image_len);
80671ac4329aSDenis Bolotin 	if (image_len)
80681ac4329aSDenis Bolotin 		regs_len += REGDUMP_HEADER_SIZE + image_len;
80698a52bbabSMichal Kalderon 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_MDUMP, &image_len);
80708a52bbabSMichal Kalderon 	if (image_len)
80718a52bbabSMichal Kalderon 		regs_len += REGDUMP_HEADER_SIZE + image_len;
80728a52bbabSMichal Kalderon 
80738a52bbabSMichal Kalderon 	if (regs_len > REGDUMP_MAX_SIZE) {
80748a52bbabSMichal Kalderon 		DP_VERBOSE(cdev, QED_MSG_DEBUG,
80758a52bbabSMichal Kalderon 			   "Dump exceeds max size 0x%x, disable ILT dump\n",
80768a52bbabSMichal Kalderon 			   REGDUMP_MAX_SIZE);
80778a52bbabSMichal Kalderon 		cdev->disable_ilt_dump = true;
80788a52bbabSMichal Kalderon 		regs_len -= total_ilt_len;
80798a52bbabSMichal Kalderon 	}
8080c965db44STomer Tayar 
8081c965db44STomer Tayar 	return regs_len;
8082c965db44STomer Tayar }
8083c965db44STomer Tayar 
8084c965db44STomer Tayar int qed_dbg_feature(struct qed_dev *cdev, void *buffer,
8085c965db44STomer Tayar 		    enum qed_dbg_features feature, u32 *num_dumped_bytes)
8086c965db44STomer Tayar {
8087c965db44STomer Tayar 	struct qed_hwfn *p_hwfn =
8088ca352f00SIgor Russkikh 		&cdev->hwfns[cdev->engine_for_debug];
8089c965db44STomer Tayar 	struct qed_dbg_feature *qed_feature =
8090ca352f00SIgor Russkikh 		&cdev->dbg_features[feature];
8091c965db44STomer Tayar 	enum dbg_status dbg_rc;
8092c965db44STomer Tayar 	struct qed_ptt *p_ptt;
8093c965db44STomer Tayar 	int rc = 0;
8094c965db44STomer Tayar 
8095c965db44STomer Tayar 	/* Acquire ptt */
8096c965db44STomer Tayar 	p_ptt = qed_ptt_acquire(p_hwfn);
8097c965db44STomer Tayar 	if (!p_ptt)
8098c965db44STomer Tayar 		return -EINVAL;
8099c965db44STomer Tayar 
8100c965db44STomer Tayar 	/* Get dump */
8101c965db44STomer Tayar 	dbg_rc = qed_dbg_dump(p_hwfn, p_ptt, feature);
8102c965db44STomer Tayar 	if (dbg_rc != DBG_STATUS_OK) {
8103c965db44STomer Tayar 		DP_VERBOSE(cdev, QED_MSG_DEBUG, "%s\n",
8104c965db44STomer Tayar 			   qed_dbg_get_status_str(dbg_rc));
8105c965db44STomer Tayar 		*num_dumped_bytes = 0;
8106c965db44STomer Tayar 		rc = -EINVAL;
8107c965db44STomer Tayar 		goto out;
8108c965db44STomer Tayar 	}
8109c965db44STomer Tayar 
8110c965db44STomer Tayar 	DP_VERBOSE(cdev, QED_MSG_DEBUG,
8111c965db44STomer Tayar 		   "copying debugfs feature to external buffer\n");
8112c965db44STomer Tayar 	memcpy(buffer, qed_feature->dump_buf, qed_feature->buf_size);
8113ca352f00SIgor Russkikh 	*num_dumped_bytes = cdev->dbg_features[feature].dumped_dwords *
8114c965db44STomer Tayar 			    4;
8115c965db44STomer Tayar 
8116c965db44STomer Tayar out:
8117c965db44STomer Tayar 	qed_ptt_release(p_hwfn, p_ptt);
8118c965db44STomer Tayar 	return rc;
8119c965db44STomer Tayar }
8120c965db44STomer Tayar 
8121c965db44STomer Tayar int qed_dbg_feature_size(struct qed_dev *cdev, enum qed_dbg_features feature)
8122c965db44STomer Tayar {
8123c965db44STomer Tayar 	struct qed_hwfn *p_hwfn =
8124ca352f00SIgor Russkikh 		&cdev->hwfns[cdev->engine_for_debug];
81252d22bc83SMichal Kalderon 	struct qed_dbg_feature *qed_feature = &cdev->dbg_features[feature];
8126c965db44STomer Tayar 	struct qed_ptt *p_ptt = qed_ptt_acquire(p_hwfn);
8127c965db44STomer Tayar 	u32 buf_size_dwords;
8128c965db44STomer Tayar 	enum dbg_status rc;
8129c965db44STomer Tayar 
8130c965db44STomer Tayar 	if (!p_ptt)
8131c965db44STomer Tayar 		return -EINVAL;
8132c965db44STomer Tayar 
8133c965db44STomer Tayar 	rc = qed_features_lookup[feature].get_size(p_hwfn, p_ptt,
8134c965db44STomer Tayar 						   &buf_size_dwords);
8135c965db44STomer Tayar 	if (rc != DBG_STATUS_OK)
8136c965db44STomer Tayar 		buf_size_dwords = 0;
8137c965db44STomer Tayar 
81388a52bbabSMichal Kalderon 	/* Feature will not be dumped if it exceeds maximum size */
81398a52bbabSMichal Kalderon 	if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS)
81408a52bbabSMichal Kalderon 		buf_size_dwords = 0;
81418a52bbabSMichal Kalderon 
8142c965db44STomer Tayar 	qed_ptt_release(p_hwfn, p_ptt);
8143c965db44STomer Tayar 	qed_feature->buf_size = buf_size_dwords * sizeof(u32);
8144c965db44STomer Tayar 	return qed_feature->buf_size;
8145c965db44STomer Tayar }
8146c965db44STomer Tayar 
8147c965db44STomer Tayar u8 qed_get_debug_engine(struct qed_dev *cdev)
8148c965db44STomer Tayar {
8149ca352f00SIgor Russkikh 	return cdev->engine_for_debug;
8150c965db44STomer Tayar }
8151c965db44STomer Tayar 
8152c965db44STomer Tayar void qed_set_debug_engine(struct qed_dev *cdev, int engine_number)
8153c965db44STomer Tayar {
8154c965db44STomer Tayar 	DP_VERBOSE(cdev, QED_MSG_DEBUG, "set debug engine to %d\n",
8155c965db44STomer Tayar 		   engine_number);
8156ca352f00SIgor Russkikh 	cdev->engine_for_debug = engine_number;
8157c965db44STomer Tayar }
8158c965db44STomer Tayar 
8159c965db44STomer Tayar void qed_dbg_pf_init(struct qed_dev *cdev)
8160c965db44STomer Tayar {
81612d22bc83SMichal Kalderon 	const u8 *dbg_values = NULL;
81622d22bc83SMichal Kalderon 	int i;
8163c965db44STomer Tayar 
8164c965db44STomer Tayar 	/* Debug values are after init values.
8165c965db44STomer Tayar 	 * The offset is the first dword of the file.
8166c965db44STomer Tayar 	 */
8167c965db44STomer Tayar 	dbg_values = cdev->firmware->data + *(u32 *)cdev->firmware->data;
81682d22bc83SMichal Kalderon 
81692d22bc83SMichal Kalderon 	for_each_hwfn(cdev, i) {
81702d22bc83SMichal Kalderon 		qed_dbg_set_bin_ptr(&cdev->hwfns[i], dbg_values);
81712d22bc83SMichal Kalderon 		qed_dbg_user_set_bin_ptr(&cdev->hwfns[i], dbg_values);
81722d22bc83SMichal Kalderon 	}
81732d22bc83SMichal Kalderon 
81742d22bc83SMichal Kalderon 	/* Set the hwfn to be 0 as default */
8175ca352f00SIgor Russkikh 	cdev->engine_for_debug = 0;
8176c965db44STomer Tayar }
8177c965db44STomer Tayar 
8178c965db44STomer Tayar void qed_dbg_pf_exit(struct qed_dev *cdev)
8179c965db44STomer Tayar {
8180c965db44STomer Tayar 	struct qed_dbg_feature *feature = NULL;
8181c965db44STomer Tayar 	enum qed_dbg_features feature_idx;
8182c965db44STomer Tayar 
81832d22bc83SMichal Kalderon 	/* debug features' buffers may be allocated if debug feature was used
81842d22bc83SMichal Kalderon 	 * but dump wasn't called
8185c965db44STomer Tayar 	 */
8186c965db44STomer Tayar 	for (feature_idx = 0; feature_idx < DBG_FEATURE_NUM; feature_idx++) {
81872d22bc83SMichal Kalderon 		feature = &cdev->dbg_features[feature_idx];
8188c965db44STomer Tayar 		if (feature->dump_buf) {
8189c965db44STomer Tayar 			vfree(feature->dump_buf);
8190c965db44STomer Tayar 			feature->dump_buf = NULL;
8191c965db44STomer Tayar 		}
8192c965db44STomer Tayar 	}
8193c965db44STomer Tayar }
8194