1ab81e23cSAlexander Lobakin // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2c965db44STomer Tayar /* QLogic qed NIC Driver
3c965db44STomer Tayar  * Copyright (c) 2015 QLogic Corporation
46c95dd8fSPrabhakar Kushwaha  * Copyright (c) 2019-2021 Marvell International Ltd.
5c965db44STomer Tayar  */
6c965db44STomer Tayar 
7c965db44STomer Tayar #include <linux/module.h>
8c965db44STomer Tayar #include <linux/vmalloc.h>
9c965db44STomer Tayar #include <linux/crc32.h>
10c965db44STomer Tayar #include "qed.h"
118a52bbabSMichal Kalderon #include "qed_cxt.h"
12c965db44STomer Tayar #include "qed_hsi.h"
13ee824f4bSOmkar Kulkarni #include "qed_dbg_hsi.h"
14c965db44STomer Tayar #include "qed_hw.h"
15c965db44STomer Tayar #include "qed_mcp.h"
16c965db44STomer Tayar #include "qed_reg_addr.h"
17c965db44STomer Tayar 
18c965db44STomer Tayar /* Memory groups enum */
19c965db44STomer Tayar enum mem_groups {
20c965db44STomer Tayar 	MEM_GROUP_PXP_MEM,
21c965db44STomer Tayar 	MEM_GROUP_DMAE_MEM,
22c965db44STomer Tayar 	MEM_GROUP_CM_MEM,
23c965db44STomer Tayar 	MEM_GROUP_QM_MEM,
24da090917STomer Tayar 	MEM_GROUP_DORQ_MEM,
25c965db44STomer Tayar 	MEM_GROUP_BRB_RAM,
26c965db44STomer Tayar 	MEM_GROUP_BRB_MEM,
27c965db44STomer Tayar 	MEM_GROUP_PRS_MEM,
28da090917STomer Tayar 	MEM_GROUP_SDM_MEM,
297b6859fbSMintz, Yuval 	MEM_GROUP_PBUF,
302d22bc83SMichal Kalderon 	MEM_GROUP_IOR,
31da090917STomer Tayar 	MEM_GROUP_RAM,
322d22bc83SMichal Kalderon 	MEM_GROUP_BTB_RAM,
33da090917STomer Tayar 	MEM_GROUP_RDIF_CTX,
34da090917STomer Tayar 	MEM_GROUP_TDIF_CTX,
35da090917STomer Tayar 	MEM_GROUP_CFC_MEM,
362d22bc83SMichal Kalderon 	MEM_GROUP_CONN_CFC_MEM,
372d22bc83SMichal Kalderon 	MEM_GROUP_CAU_PI,
382d22bc83SMichal Kalderon 	MEM_GROUP_CAU_MEM,
392d22bc83SMichal Kalderon 	MEM_GROUP_CAU_MEM_EXT,
402d22bc83SMichal Kalderon 	MEM_GROUP_PXP_ILT,
412d22bc83SMichal Kalderon 	MEM_GROUP_MULD_MEM,
422d22bc83SMichal Kalderon 	MEM_GROUP_BTB_MEM,
43c965db44STomer Tayar 	MEM_GROUP_IGU_MEM,
44c965db44STomer Tayar 	MEM_GROUP_IGU_MSIX,
45c965db44STomer Tayar 	MEM_GROUP_CAU_SB,
46c965db44STomer Tayar 	MEM_GROUP_BMB_RAM,
47c965db44STomer Tayar 	MEM_GROUP_BMB_MEM,
482d22bc83SMichal Kalderon 	MEM_GROUP_TM_MEM,
492d22bc83SMichal Kalderon 	MEM_GROUP_TASK_CFC_MEM,
50c965db44STomer Tayar 	MEM_GROUPS_NUM
51c965db44STomer Tayar };
52c965db44STomer Tayar 
53c965db44STomer Tayar /* Memory groups names */
54c965db44STomer Tayar static const char * const s_mem_group_names[] = {
55c965db44STomer Tayar 	"PXP_MEM",
56c965db44STomer Tayar 	"DMAE_MEM",
57c965db44STomer Tayar 	"CM_MEM",
58c965db44STomer Tayar 	"QM_MEM",
59da090917STomer Tayar 	"DORQ_MEM",
60c965db44STomer Tayar 	"BRB_RAM",
61c965db44STomer Tayar 	"BRB_MEM",
62c965db44STomer Tayar 	"PRS_MEM",
63da090917STomer Tayar 	"SDM_MEM",
647b6859fbSMintz, Yuval 	"PBUF",
652d22bc83SMichal Kalderon 	"IOR",
66da090917STomer Tayar 	"RAM",
672d22bc83SMichal Kalderon 	"BTB_RAM",
68da090917STomer Tayar 	"RDIF_CTX",
69da090917STomer Tayar 	"TDIF_CTX",
70da090917STomer Tayar 	"CFC_MEM",
712d22bc83SMichal Kalderon 	"CONN_CFC_MEM",
722d22bc83SMichal Kalderon 	"CAU_PI",
732d22bc83SMichal Kalderon 	"CAU_MEM",
742d22bc83SMichal Kalderon 	"CAU_MEM_EXT",
752d22bc83SMichal Kalderon 	"PXP_ILT",
762d22bc83SMichal Kalderon 	"MULD_MEM",
772d22bc83SMichal Kalderon 	"BTB_MEM",
78c965db44STomer Tayar 	"IGU_MEM",
79c965db44STomer Tayar 	"IGU_MSIX",
80c965db44STomer Tayar 	"CAU_SB",
81c965db44STomer Tayar 	"BMB_RAM",
82c965db44STomer Tayar 	"BMB_MEM",
832d22bc83SMichal Kalderon 	"TM_MEM",
842d22bc83SMichal Kalderon 	"TASK_CFC_MEM",
85c965db44STomer Tayar };
86c965db44STomer Tayar 
87c965db44STomer Tayar /* Idle check conditions */
887b6859fbSMintz, Yuval 
cond5(const u32 * r,const u32 * imm)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 
cond7(const u32 * r,const u32 * imm)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 
cond6(const u32 * r,const u32 * imm)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 
cond9(const u32 * r,const u32 * imm)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 
cond10(const u32 * r,const u32 * imm)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 
cond4(const u32 * r,const u32 * imm)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 
cond0(const u32 * r,const u32 * imm)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 
cond14(const u32 * r,const u32 * imm)1256c95dd8fSPrabhakar Kushwaha static u32 cond14(const u32 *r, const u32 *imm)
1266c95dd8fSPrabhakar Kushwaha {
1276c95dd8fSPrabhakar Kushwaha 	return (r[0] | imm[0]) != imm[1];
1286c95dd8fSPrabhakar Kushwaha }
1296c95dd8fSPrabhakar Kushwaha 
cond1(const u32 * r,const u32 * imm)1307b6859fbSMintz, Yuval static u32 cond1(const u32 *r, const u32 *imm)
1317b6859fbSMintz, Yuval {
132c965db44STomer Tayar 	return r[0] != imm[0];
133c965db44STomer Tayar }
134c965db44STomer Tayar 
cond11(const u32 * r,const u32 * imm)1357b6859fbSMintz, Yuval static u32 cond11(const u32 *r, const u32 *imm)
136c965db44STomer Tayar {
137c965db44STomer Tayar 	return r[0] != r[1] && r[2] == imm[0];
138c965db44STomer Tayar }
139c965db44STomer Tayar 
cond12(const u32 * r,const u32 * imm)1407b6859fbSMintz, Yuval static u32 cond12(const u32 *r, const u32 *imm)
141c965db44STomer Tayar {
142c965db44STomer Tayar 	return r[0] != r[1] && r[2] > imm[0];
143c965db44STomer Tayar }
144c965db44STomer Tayar 
cond3(const u32 * r,const u32 * imm)145c965db44STomer Tayar static u32 cond3(const u32 *r, const u32 *imm)
146c965db44STomer Tayar {
147c965db44STomer Tayar 	return r[0] != r[1];
148c965db44STomer Tayar }
149c965db44STomer Tayar 
cond13(const u32 * r,const u32 * imm)1507b6859fbSMintz, Yuval static u32 cond13(const u32 *r, const u32 *imm)
151c965db44STomer Tayar {
152c965db44STomer Tayar 	return r[0] & imm[0];
153c965db44STomer Tayar }
154c965db44STomer Tayar 
cond8(const u32 * r,const u32 * imm)1557b6859fbSMintz, Yuval static u32 cond8(const u32 *r, const u32 *imm)
156c965db44STomer Tayar {
157c965db44STomer Tayar 	return r[0] < (r[1] - imm[0]);
158c965db44STomer Tayar }
159c965db44STomer Tayar 
cond2(const u32 * r,const u32 * imm)160c965db44STomer Tayar static u32 cond2(const u32 *r, const u32 *imm)
161c965db44STomer Tayar {
162c965db44STomer Tayar 	return r[0] > imm[0];
163c965db44STomer Tayar }
164c965db44STomer Tayar 
165c965db44STomer Tayar /* Array of Idle Check conditions */
166c965db44STomer Tayar static u32(*cond_arr[]) (const u32 *r, const u32 *imm) = {
167c965db44STomer Tayar 	cond0,
168c965db44STomer Tayar 	cond1,
169c965db44STomer Tayar 	cond2,
170c965db44STomer Tayar 	cond3,
171c965db44STomer Tayar 	cond4,
172c965db44STomer Tayar 	cond5,
173c965db44STomer Tayar 	cond6,
174c965db44STomer Tayar 	cond7,
175c965db44STomer Tayar 	cond8,
176c965db44STomer Tayar 	cond9,
177c965db44STomer Tayar 	cond10,
178c965db44STomer Tayar 	cond11,
179c965db44STomer Tayar 	cond12,
1807b6859fbSMintz, Yuval 	cond13,
1816c95dd8fSPrabhakar Kushwaha 	cond14,
182c965db44STomer Tayar };
183c965db44STomer Tayar 
1842d22bc83SMichal Kalderon #define NUM_PHYS_BLOCKS 84
1852d22bc83SMichal Kalderon 
1862d22bc83SMichal Kalderon #define NUM_DBG_RESET_REGS 8
1872d22bc83SMichal Kalderon 
188c965db44STomer Tayar /******************************* Data Types **********************************/
189c965db44STomer Tayar 
1902d22bc83SMichal Kalderon enum hw_types {
1912d22bc83SMichal Kalderon 	HW_TYPE_ASIC,
192c965db44STomer Tayar 	PLATFORM_RESERVED,
193c965db44STomer Tayar 	PLATFORM_RESERVED2,
194c965db44STomer Tayar 	PLATFORM_RESERVED3,
1952d22bc83SMichal Kalderon 	PLATFORM_RESERVED4,
1962d22bc83SMichal Kalderon 	MAX_HW_TYPES
1972d22bc83SMichal Kalderon };
1982d22bc83SMichal Kalderon 
1992d22bc83SMichal Kalderon /* CM context types */
2002d22bc83SMichal Kalderon enum cm_ctx_types {
2012d22bc83SMichal Kalderon 	CM_CTX_CONN_AG,
2022d22bc83SMichal Kalderon 	CM_CTX_CONN_ST,
2032d22bc83SMichal Kalderon 	CM_CTX_TASK_AG,
2042d22bc83SMichal Kalderon 	CM_CTX_TASK_ST,
2052d22bc83SMichal Kalderon 	NUM_CM_CTX_TYPES
2062d22bc83SMichal Kalderon };
2072d22bc83SMichal Kalderon 
2082d22bc83SMichal Kalderon /* Debug bus frame modes */
2092d22bc83SMichal Kalderon enum dbg_bus_frame_modes {
2102d22bc83SMichal Kalderon 	DBG_BUS_FRAME_MODE_4ST = 0,	/* 4 Storm dwords (no HW) */
2112d22bc83SMichal Kalderon 	DBG_BUS_FRAME_MODE_2ST_2HW = 1,	/* 2 Storm dwords, 2 HW dwords */
2122d22bc83SMichal Kalderon 	DBG_BUS_FRAME_MODE_1ST_3HW = 2,	/* 1 Storm dwords, 3 HW dwords */
2132d22bc83SMichal Kalderon 	DBG_BUS_FRAME_MODE_4HW = 3,	/* 4 HW dwords (no Storms) */
2142d22bc83SMichal Kalderon 	DBG_BUS_FRAME_MODE_8HW = 4,	/* 8 HW dwords (no Storms) */
2152d22bc83SMichal Kalderon 	DBG_BUS_NUM_FRAME_MODES
216c965db44STomer Tayar };
217c965db44STomer Tayar 
2186c95dd8fSPrabhakar Kushwaha /* Debug bus SEMI frame modes */
2196c95dd8fSPrabhakar Kushwaha enum dbg_bus_semi_frame_modes {
2206c95dd8fSPrabhakar Kushwaha 	DBG_BUS_SEMI_FRAME_MODE_4FAST = 0,	/* 4 fast dw */
2216c95dd8fSPrabhakar Kushwaha 	DBG_BUS_SEMI_FRAME_MODE_2FAST_2SLOW = 1, /* 2 fast dw, 2 slow dw */
2226c95dd8fSPrabhakar Kushwaha 	DBG_BUS_SEMI_FRAME_MODE_1FAST_3SLOW = 2, /* 1 fast dw,3 slow dw */
2236c95dd8fSPrabhakar Kushwaha 	DBG_BUS_SEMI_FRAME_MODE_4SLOW = 3,	/* 4 slow dw */
2246c95dd8fSPrabhakar Kushwaha 	DBG_BUS_SEMI_NUM_FRAME_MODES
2256c95dd8fSPrabhakar Kushwaha };
2266c95dd8fSPrabhakar Kushwaha 
2276c95dd8fSPrabhakar Kushwaha /* Debug bus filter types */
2286c95dd8fSPrabhakar Kushwaha enum dbg_bus_filter_types {
2296c95dd8fSPrabhakar Kushwaha 	DBG_BUS_FILTER_TYPE_OFF,	/* Filter always off */
2306c95dd8fSPrabhakar Kushwaha 	DBG_BUS_FILTER_TYPE_PRE,	/* Filter before trigger only */
2316c95dd8fSPrabhakar Kushwaha 	DBG_BUS_FILTER_TYPE_POST,	/* Filter after trigger only */
2326c95dd8fSPrabhakar Kushwaha 	DBG_BUS_FILTER_TYPE_ON	/* Filter always on */
2336c95dd8fSPrabhakar Kushwaha };
2346c95dd8fSPrabhakar Kushwaha 
2356c95dd8fSPrabhakar Kushwaha /* Debug bus pre-trigger recording types */
2366c95dd8fSPrabhakar Kushwaha enum dbg_bus_pre_trigger_types {
2376c95dd8fSPrabhakar Kushwaha 	DBG_BUS_PRE_TRIGGER_FROM_ZERO,	/* Record from time 0 */
2386c95dd8fSPrabhakar Kushwaha 	DBG_BUS_PRE_TRIGGER_NUM_CHUNKS,	/* Record some chunks before trigger */
2396c95dd8fSPrabhakar Kushwaha 	DBG_BUS_PRE_TRIGGER_DROP	/* Drop data before trigger */
2406c95dd8fSPrabhakar Kushwaha };
2416c95dd8fSPrabhakar Kushwaha 
2426c95dd8fSPrabhakar Kushwaha /* Debug bus post-trigger recording types */
2436c95dd8fSPrabhakar Kushwaha enum dbg_bus_post_trigger_types {
2446c95dd8fSPrabhakar Kushwaha 	DBG_BUS_POST_TRIGGER_RECORD,	/* Start recording after trigger */
2456c95dd8fSPrabhakar Kushwaha 	DBG_BUS_POST_TRIGGER_DROP	/* Drop data after trigger */
2466c95dd8fSPrabhakar Kushwaha };
2476c95dd8fSPrabhakar Kushwaha 
2486c95dd8fSPrabhakar Kushwaha /* Debug bus other engine mode */
2496c95dd8fSPrabhakar Kushwaha enum dbg_bus_other_engine_modes {
2506c95dd8fSPrabhakar Kushwaha 	DBG_BUS_OTHER_ENGINE_MODE_NONE,
2516c95dd8fSPrabhakar Kushwaha 	DBG_BUS_OTHER_ENGINE_MODE_DOUBLE_BW_TX,
2526c95dd8fSPrabhakar Kushwaha 	DBG_BUS_OTHER_ENGINE_MODE_DOUBLE_BW_RX,
2536c95dd8fSPrabhakar Kushwaha 	DBG_BUS_OTHER_ENGINE_MODE_CROSS_ENGINE_TX,
2546c95dd8fSPrabhakar Kushwaha 	DBG_BUS_OTHER_ENGINE_MODE_CROSS_ENGINE_RX
2556c95dd8fSPrabhakar Kushwaha };
2566c95dd8fSPrabhakar Kushwaha 
2576c95dd8fSPrabhakar Kushwaha /* DBG block Framing mode definitions */
2586c95dd8fSPrabhakar Kushwaha struct framing_mode_defs {
2596c95dd8fSPrabhakar Kushwaha 	u8 id;
2606c95dd8fSPrabhakar Kushwaha 	u8 blocks_dword_mask;
2616c95dd8fSPrabhakar Kushwaha 	u8 storms_dword_mask;
2626c95dd8fSPrabhakar Kushwaha 	u8 semi_framing_mode_id;
2636c95dd8fSPrabhakar Kushwaha 	u8 full_buf_thr;
2646c95dd8fSPrabhakar Kushwaha };
2656c95dd8fSPrabhakar Kushwaha 
266c965db44STomer Tayar /* Chip constant definitions */
267c965db44STomer Tayar struct chip_defs {
268c965db44STomer Tayar 	const char *name;
2696c95dd8fSPrabhakar Kushwaha 	u8 dwords_per_cycle;
2706c95dd8fSPrabhakar Kushwaha 	u8 num_framing_modes;
2718a52bbabSMichal Kalderon 	u32 num_ilt_pages;
2726c95dd8fSPrabhakar Kushwaha 	struct framing_mode_defs *framing_modes;
273c965db44STomer Tayar };
274c965db44STomer Tayar 
2752d22bc83SMichal Kalderon /* HW type constant definitions */
2762d22bc83SMichal Kalderon struct hw_type_defs {
277c965db44STomer Tayar 	const char *name;
278c965db44STomer Tayar 	u32 delay_factor;
279da090917STomer Tayar 	u32 dmae_thresh;
280da090917STomer Tayar 	u32 log_thresh;
281c965db44STomer Tayar };
282c965db44STomer Tayar 
2832d22bc83SMichal Kalderon /* RBC reset definitions */
2842d22bc83SMichal Kalderon struct rbc_reset_defs {
2852d22bc83SMichal Kalderon 	u32 reset_reg_addr;
2862d22bc83SMichal Kalderon 	u32 reset_val[MAX_CHIP_IDS];
2872d22bc83SMichal Kalderon };
2882d22bc83SMichal Kalderon 
2897b6859fbSMintz, Yuval /* Storm constant definitions.
2907b6859fbSMintz, Yuval  * Addresses are in bytes, sizes are in quad-regs.
2917b6859fbSMintz, Yuval  */
292c965db44STomer Tayar struct storm_defs {
293c965db44STomer Tayar 	char letter;
2942d22bc83SMichal Kalderon 	enum block_id sem_block_id;
295c965db44STomer Tayar 	enum dbg_bus_clients dbg_client_id[MAX_CHIP_IDS];
296c965db44STomer Tayar 	bool has_vfc;
297c965db44STomer Tayar 	u32 sem_fast_mem_addr;
298c965db44STomer Tayar 	u32 sem_frame_mode_addr;
299c965db44STomer Tayar 	u32 sem_slow_enable_addr;
300c965db44STomer Tayar 	u32 sem_slow_mode_addr;
301c965db44STomer Tayar 	u32 sem_slow_mode1_conf_addr;
302c965db44STomer Tayar 	u32 sem_sync_dbg_empty_addr;
3032d22bc83SMichal Kalderon 	u32 sem_gpre_vect_addr;
304c965db44STomer Tayar 	u32 cm_ctx_wr_addr;
3052d22bc83SMichal Kalderon 	u32 cm_ctx_rd_addr[NUM_CM_CTX_TYPES];
3062d22bc83SMichal Kalderon 	u32 cm_ctx_lid_sizes[MAX_CHIP_IDS][NUM_CM_CTX_TYPES];
307c965db44STomer Tayar };
308c965db44STomer Tayar 
3092d22bc83SMichal Kalderon /* Debug Bus Constraint operation constant definitions */
3102d22bc83SMichal Kalderon struct dbg_bus_constraint_op_defs {
3112d22bc83SMichal Kalderon 	u8 hw_op_val;
3122d22bc83SMichal Kalderon 	bool is_cyclic;
3132d22bc83SMichal Kalderon };
3142d22bc83SMichal Kalderon 
3152d22bc83SMichal Kalderon /* Storm Mode definitions */
3162d22bc83SMichal Kalderon struct storm_mode_defs {
317c965db44STomer Tayar 	const char *name;
3182d22bc83SMichal Kalderon 	bool is_fast_dbg;
3192d22bc83SMichal Kalderon 	u8 id_in_hw;
3202d22bc83SMichal Kalderon 	u32 src_disable_reg_addr;
3212d22bc83SMichal Kalderon 	u32 src_enable_val;
322da090917STomer Tayar 	bool exists[MAX_CHIP_IDS];
323c965db44STomer Tayar };
324c965db44STomer Tayar 
325c965db44STomer Tayar struct grc_param_defs {
326c965db44STomer Tayar 	u32 default_val[MAX_CHIP_IDS];
327c965db44STomer Tayar 	u32 min;
328c965db44STomer Tayar 	u32 max;
329c965db44STomer Tayar 	bool is_preset;
33050bc60cbSMichal Kalderon 	bool is_persistent;
331c965db44STomer Tayar 	u32 exclude_all_preset_val;
3322d22bc83SMichal Kalderon 	u32 crash_preset_val[MAX_CHIP_IDS];
333c965db44STomer Tayar };
334c965db44STomer Tayar 
3357b6859fbSMintz, Yuval /* Address is in 128b units. Width is in bits. */
336c965db44STomer Tayar struct rss_mem_defs {
337c965db44STomer Tayar 	const char *mem_name;
338c965db44STomer Tayar 	const char *type_name;
3397b6859fbSMintz, Yuval 	u32 addr;
340da090917STomer Tayar 	u32 entry_width;
341c965db44STomer Tayar 	u32 num_entries[MAX_CHIP_IDS];
342c965db44STomer Tayar };
343c965db44STomer Tayar 
344c965db44STomer Tayar struct vfc_ram_defs {
345c965db44STomer Tayar 	const char *mem_name;
346c965db44STomer Tayar 	const char *type_name;
347c965db44STomer Tayar 	u32 base_row;
348c965db44STomer Tayar 	u32 num_rows;
349c965db44STomer Tayar };
350c965db44STomer Tayar 
351c965db44STomer Tayar struct big_ram_defs {
352c965db44STomer Tayar 	const char *instance_name;
353c965db44STomer Tayar 	enum mem_groups mem_group_id;
354c965db44STomer Tayar 	enum mem_groups ram_mem_group_id;
355c965db44STomer Tayar 	enum dbg_grc_params grc_param;
356c965db44STomer Tayar 	u32 addr_reg_addr;
357c965db44STomer Tayar 	u32 data_reg_addr;
358da090917STomer Tayar 	u32 is_256b_reg_addr;
359da090917STomer Tayar 	u32 is_256b_bit_offset[MAX_CHIP_IDS];
360da090917STomer Tayar 	u32 ram_size[MAX_CHIP_IDS]; /* In dwords */
361c965db44STomer Tayar };
362c965db44STomer Tayar 
363c965db44STomer Tayar struct phy_defs {
364c965db44STomer Tayar 	const char *phy_name;
3657b6859fbSMintz, Yuval 
3667b6859fbSMintz, Yuval 	/* PHY base GRC address */
367c965db44STomer Tayar 	u32 base_addr;
3687b6859fbSMintz, Yuval 
3697b6859fbSMintz, Yuval 	/* Relative address of indirect TBUS address register (bits 0..7) */
370c965db44STomer Tayar 	u32 tbus_addr_lo_addr;
3717b6859fbSMintz, Yuval 
3727b6859fbSMintz, Yuval 	/* Relative address of indirect TBUS address register (bits 8..10) */
373c965db44STomer Tayar 	u32 tbus_addr_hi_addr;
3747b6859fbSMintz, Yuval 
3757b6859fbSMintz, Yuval 	/* Relative address of indirect TBUS data register (bits 0..7) */
376c965db44STomer Tayar 	u32 tbus_data_lo_addr;
3777b6859fbSMintz, Yuval 
3787b6859fbSMintz, Yuval 	/* Relative address of indirect TBUS data register (bits 8..11) */
379c965db44STomer Tayar 	u32 tbus_data_hi_addr;
380c965db44STomer Tayar };
381c965db44STomer Tayar 
382d52c89f1SMichal Kalderon /* Split type definitions */
383d52c89f1SMichal Kalderon struct split_type_defs {
384d52c89f1SMichal Kalderon 	const char *name;
385d52c89f1SMichal Kalderon };
386d52c89f1SMichal Kalderon 
387c965db44STomer Tayar /******************************** Constants **********************************/
388c965db44STomer Tayar 
389c965db44STomer Tayar #define BYTES_IN_DWORD			sizeof(u32)
390c965db44STomer Tayar /* In the macros below, size and offset are specified in bits */
391c965db44STomer Tayar #define CEIL_DWORDS(size)		DIV_ROUND_UP(size, 32)
392c965db44STomer Tayar #define FIELD_BIT_OFFSET(type, field)	type ## _ ## field ## _ ## OFFSET
393c965db44STomer Tayar #define FIELD_BIT_SIZE(type, field)	type ## _ ## field ## _ ## SIZE
394c965db44STomer Tayar #define FIELD_DWORD_OFFSET(type, field) \
3956c95dd8fSPrabhakar Kushwaha 	 ((int)(FIELD_BIT_OFFSET(type, field) / 32))
396c965db44STomer Tayar #define FIELD_DWORD_SHIFT(type, field)	(FIELD_BIT_OFFSET(type, field) % 32)
397c965db44STomer Tayar #define FIELD_BIT_MASK(type, field) \
398c965db44STomer Tayar 	(((1 << FIELD_BIT_SIZE(type, field)) - 1) << \
399c965db44STomer Tayar 	 FIELD_DWORD_SHIFT(type, field))
4007b6859fbSMintz, Yuval 
401c965db44STomer Tayar #define SET_VAR_FIELD(var, type, field, val) \
402c965db44STomer Tayar 	do { \
403c965db44STomer Tayar 		var[FIELD_DWORD_OFFSET(type, field)] &=	\
404c965db44STomer Tayar 		(~FIELD_BIT_MASK(type, field));	\
405c965db44STomer Tayar 		var[FIELD_DWORD_OFFSET(type, field)] |= \
406c965db44STomer Tayar 		(val) << FIELD_DWORD_SHIFT(type, field); \
407c965db44STomer Tayar 	} while (0)
4087b6859fbSMintz, Yuval 
409c965db44STomer Tayar #define ARR_REG_WR(dev, ptt, addr, arr, arr_size) \
410c965db44STomer Tayar 	do { \
411c965db44STomer Tayar 		for (i = 0; i < (arr_size); i++) \
412c965db44STomer Tayar 			qed_wr(dev, ptt, addr,	(arr)[i]); \
413c965db44STomer Tayar 	} while (0)
4147b6859fbSMintz, Yuval 
415c965db44STomer Tayar #define DWORDS_TO_BYTES(dwords)		((dwords) * BYTES_IN_DWORD)
416c965db44STomer Tayar #define BYTES_TO_DWORDS(bytes)		((bytes) / BYTES_IN_DWORD)
4177b6859fbSMintz, Yuval 
4182d22bc83SMichal Kalderon /* extra lines include a signature line + optional latency events line */
4192d22bc83SMichal Kalderon #define NUM_EXTRA_DBG_LINES(block) \
4202d22bc83SMichal Kalderon 	(GET_FIELD((block)->flags, DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS) ? 2 : 1)
4212d22bc83SMichal Kalderon #define NUM_DBG_LINES(block) \
4222d22bc83SMichal Kalderon 	((block)->num_of_dbg_bus_lines + NUM_EXTRA_DBG_LINES(block))
4232d22bc83SMichal Kalderon 
4242d22bc83SMichal Kalderon #define USE_DMAE			true
4252d22bc83SMichal Kalderon #define PROTECT_WIDE_BUS		true
4267b6859fbSMintz, Yuval 
427c965db44STomer Tayar #define RAM_LINES_TO_DWORDS(lines)	((lines) * 2)
428c965db44STomer Tayar #define RAM_LINES_TO_BYTES(lines) \
429c965db44STomer Tayar 	DWORDS_TO_BYTES(RAM_LINES_TO_DWORDS(lines))
4307b6859fbSMintz, Yuval 
431c965db44STomer Tayar #define REG_DUMP_LEN_SHIFT		24
432c965db44STomer Tayar #define MEM_DUMP_ENTRY_SIZE_DWORDS \
433c965db44STomer Tayar 	BYTES_TO_DWORDS(sizeof(struct dbg_dump_mem))
4347b6859fbSMintz, Yuval 
435c965db44STomer Tayar #define IDLE_CHK_RULE_SIZE_DWORDS \
436c965db44STomer Tayar 	BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_rule))
4377b6859fbSMintz, Yuval 
438c965db44STomer Tayar #define IDLE_CHK_RESULT_HDR_DWORDS \
439c965db44STomer Tayar 	BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_hdr))
4407b6859fbSMintz, Yuval 
441c965db44STomer Tayar #define IDLE_CHK_RESULT_REG_HDR_DWORDS \
442c965db44STomer Tayar 	BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_reg_hdr))
4437b6859fbSMintz, Yuval 
4448a52bbabSMichal Kalderon #define PAGE_MEM_DESC_SIZE_DWORDS \
4458a52bbabSMichal Kalderon 	BYTES_TO_DWORDS(sizeof(struct phys_mem_desc))
4468a52bbabSMichal Kalderon 
447c965db44STomer Tayar #define IDLE_CHK_MAX_ENTRIES_SIZE	32
448c965db44STomer Tayar 
449c965db44STomer Tayar /* The sizes and offsets below are specified in bits */
450c965db44STomer Tayar #define VFC_CAM_CMD_STRUCT_SIZE		64
451c965db44STomer Tayar #define VFC_CAM_CMD_ROW_OFFSET		48
452c965db44STomer Tayar #define VFC_CAM_CMD_ROW_SIZE		9
453c965db44STomer Tayar #define VFC_CAM_ADDR_STRUCT_SIZE	16
454c965db44STomer Tayar #define VFC_CAM_ADDR_OP_OFFSET		0
455c965db44STomer Tayar #define VFC_CAM_ADDR_OP_SIZE		4
456c965db44STomer Tayar #define VFC_CAM_RESP_STRUCT_SIZE	256
457c965db44STomer Tayar #define VFC_RAM_ADDR_STRUCT_SIZE	16
458c965db44STomer Tayar #define VFC_RAM_ADDR_OP_OFFSET		0
459c965db44STomer Tayar #define VFC_RAM_ADDR_OP_SIZE		2
460c965db44STomer Tayar #define VFC_RAM_ADDR_ROW_OFFSET		2
461c965db44STomer Tayar #define VFC_RAM_ADDR_ROW_SIZE		10
462c965db44STomer Tayar #define VFC_RAM_RESP_STRUCT_SIZE	256
4637b6859fbSMintz, Yuval 
464c965db44STomer Tayar #define VFC_CAM_CMD_DWORDS		CEIL_DWORDS(VFC_CAM_CMD_STRUCT_SIZE)
465c965db44STomer Tayar #define VFC_CAM_ADDR_DWORDS		CEIL_DWORDS(VFC_CAM_ADDR_STRUCT_SIZE)
466c965db44STomer Tayar #define VFC_CAM_RESP_DWORDS		CEIL_DWORDS(VFC_CAM_RESP_STRUCT_SIZE)
467c965db44STomer Tayar #define VFC_RAM_CMD_DWORDS		VFC_CAM_CMD_DWORDS
468c965db44STomer Tayar #define VFC_RAM_ADDR_DWORDS		CEIL_DWORDS(VFC_RAM_ADDR_STRUCT_SIZE)
469c965db44STomer Tayar #define VFC_RAM_RESP_DWORDS		CEIL_DWORDS(VFC_RAM_RESP_STRUCT_SIZE)
4707b6859fbSMintz, Yuval 
471c965db44STomer Tayar #define NUM_VFC_RAM_TYPES		4
4727b6859fbSMintz, Yuval 
473c965db44STomer Tayar #define VFC_CAM_NUM_ROWS		512
4747b6859fbSMintz, Yuval 
475c965db44STomer Tayar #define VFC_OPCODE_CAM_RD		14
476c965db44STomer Tayar #define VFC_OPCODE_RAM_RD		0
4777b6859fbSMintz, Yuval 
478c965db44STomer Tayar #define NUM_RSS_MEM_TYPES		5
4797b6859fbSMintz, Yuval 
480c965db44STomer Tayar #define NUM_BIG_RAM_TYPES		3
481c7d852e3SDenis Bolotin #define BIG_RAM_NAME_LEN		3
4827b6859fbSMintz, Yuval 
483c965db44STomer Tayar #define NUM_PHY_TBUS_ADDRESSES		2048
484c965db44STomer Tayar #define PHY_DUMP_SIZE_DWORDS		(NUM_PHY_TBUS_ADDRESSES / 2)
4857b6859fbSMintz, Yuval 
486c965db44STomer Tayar #define RESET_REG_UNRESET_OFFSET	4
4877b6859fbSMintz, Yuval 
488c965db44STomer Tayar #define STALL_DELAY_MS			500
4897b6859fbSMintz, Yuval 
490c965db44STomer Tayar #define STATIC_DEBUG_LINE_DWORDS	9
4917b6859fbSMintz, Yuval 
49220921c0cSManish Chopra #define NUM_COMMON_GLOBAL_PARAMS	10
4932d22bc83SMichal Kalderon 
4942d22bc83SMichal Kalderon #define MAX_RECURSION_DEPTH		10
4957b6859fbSMintz, Yuval 
4966c95dd8fSPrabhakar Kushwaha #define FW_IMG_KUKU                     0
497c965db44STomer Tayar #define FW_IMG_MAIN			1
4986c95dd8fSPrabhakar Kushwaha #define FW_IMG_L2B                      2
4997b6859fbSMintz, Yuval 
500c965db44STomer Tayar #define REG_FIFO_ELEMENT_DWORDS		2
5017b6859fbSMintz, Yuval #define REG_FIFO_DEPTH_ELEMENTS		32
502c965db44STomer Tayar #define REG_FIFO_DEPTH_DWORDS \
503c965db44STomer Tayar 	(REG_FIFO_ELEMENT_DWORDS * REG_FIFO_DEPTH_ELEMENTS)
5047b6859fbSMintz, Yuval 
505c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORDS		4
5067b6859fbSMintz, Yuval #define IGU_FIFO_DEPTH_ELEMENTS		64
507c965db44STomer Tayar #define IGU_FIFO_DEPTH_DWORDS \
508c965db44STomer Tayar 	(IGU_FIFO_ELEMENT_DWORDS * IGU_FIFO_DEPTH_ELEMENTS)
5097b6859fbSMintz, Yuval 
510c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_DWORDS	2
5117b6859fbSMintz, Yuval #define PROTECTION_OVERRIDE_DEPTH_ELEMENTS	20
512c965db44STomer Tayar #define PROTECTION_OVERRIDE_DEPTH_DWORDS \
513c965db44STomer Tayar 	(PROTECTION_OVERRIDE_DEPTH_ELEMENTS * \
514c965db44STomer Tayar 	 PROTECTION_OVERRIDE_ELEMENT_DWORDS)
5157b6859fbSMintz, Yuval 
516c965db44STomer Tayar #define MCP_SPAD_TRACE_OFFSIZE_ADDR \
517c965db44STomer Tayar 	(MCP_REG_SCRATCH + \
518c965db44STomer Tayar 	 offsetof(struct static_init, sections[SPAD_SECTION_TRACE]))
5197b6859fbSMintz, Yuval 
5202d22bc83SMichal Kalderon #define MAX_SW_PLTAFORM_STR_SIZE	64
5212d22bc83SMichal Kalderon 
522c965db44STomer Tayar #define EMPTY_FW_VERSION_STR		"???_???_???_???"
523c965db44STomer Tayar #define EMPTY_FW_IMAGE_STR		"???????????????"
524c965db44STomer Tayar 
525c965db44STomer Tayar /***************************** Constant Arrays *******************************/
526c965db44STomer Tayar 
5276c95dd8fSPrabhakar Kushwaha /* DBG block framing mode definitions, in descending preference order */
5286c95dd8fSPrabhakar Kushwaha static struct framing_mode_defs s_framing_mode_defs[4] = {
5296c95dd8fSPrabhakar Kushwaha 	{DBG_BUS_FRAME_MODE_4ST, 0x0, 0xf,
5306c95dd8fSPrabhakar Kushwaha 	 DBG_BUS_SEMI_FRAME_MODE_4FAST,
5316c95dd8fSPrabhakar Kushwaha 	 10},
5326c95dd8fSPrabhakar Kushwaha 	{DBG_BUS_FRAME_MODE_4HW, 0xf, 0x0, DBG_BUS_SEMI_FRAME_MODE_4SLOW,
5336c95dd8fSPrabhakar Kushwaha 	 10},
5346c95dd8fSPrabhakar Kushwaha 	{DBG_BUS_FRAME_MODE_2ST_2HW, 0x3, 0xc,
5356c95dd8fSPrabhakar Kushwaha 	 DBG_BUS_SEMI_FRAME_MODE_2FAST_2SLOW, 10},
5366c95dd8fSPrabhakar Kushwaha 	{DBG_BUS_FRAME_MODE_1ST_3HW, 0x7, 0x8,
5376c95dd8fSPrabhakar Kushwaha 	 DBG_BUS_SEMI_FRAME_MODE_1FAST_3SLOW, 10}
5386c95dd8fSPrabhakar Kushwaha };
5396c95dd8fSPrabhakar Kushwaha 
540c965db44STomer Tayar /* Chip constant definitions array */
541c965db44STomer Tayar static struct chip_defs s_chip_defs[MAX_CHIP_IDS] = {
5426c95dd8fSPrabhakar Kushwaha 	{"bb", 4, DBG_BUS_NUM_FRAME_MODES, PSWRQ2_REG_ILT_MEMORY_SIZE_BB / 2,
5436c95dd8fSPrabhakar Kushwaha 	 s_framing_mode_defs},
5446c95dd8fSPrabhakar Kushwaha 	{"ah", 4, DBG_BUS_NUM_FRAME_MODES, PSWRQ2_REG_ILT_MEMORY_SIZE_K2 / 2,
5456c95dd8fSPrabhakar Kushwaha 	 s_framing_mode_defs}
546c965db44STomer Tayar };
547c965db44STomer Tayar 
548c965db44STomer Tayar /* Storm constant definitions array */
549c965db44STomer Tayar static struct storm_defs s_storm_defs[] = {
550c965db44STomer Tayar 	/* Tstorm */
551c965db44STomer Tayar 	{'T', BLOCK_TSEM,
5522d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT},
5532d22bc83SMichal Kalderon 		true,
554c965db44STomer Tayar 		TSEM_REG_FAST_MEMORY,
5556c95dd8fSPrabhakar Kushwaha 		TSEM_REG_DBG_FRAME_MODE, TSEM_REG_SLOW_DBG_ACTIVE,
5566c95dd8fSPrabhakar Kushwaha 		TSEM_REG_SLOW_DBG_MODE, TSEM_REG_DBG_MODE1_CFG,
5572d22bc83SMichal Kalderon 		TSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_DBG_GPRE_VECT,
558c965db44STomer Tayar 		TCM_REG_CTX_RBC_ACCS,
5592d22bc83SMichal Kalderon 		{TCM_REG_AGG_CON_CTX, TCM_REG_SM_CON_CTX, TCM_REG_AGG_TASK_CTX,
5602d22bc83SMichal Kalderon 		 TCM_REG_SM_TASK_CTX},
5612d22bc83SMichal Kalderon 		{{4, 16, 2, 4}, {4, 16, 2, 4}} /* {bb} {k2} */
5622d22bc83SMichal Kalderon 	},
5637b6859fbSMintz, Yuval 
564c965db44STomer Tayar 	/* Mstorm */
565c965db44STomer Tayar 	{'M', BLOCK_MSEM,
5662d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM},
5672d22bc83SMichal Kalderon 		false,
568c965db44STomer Tayar 		MSEM_REG_FAST_MEMORY,
5696c95dd8fSPrabhakar Kushwaha 		MSEM_REG_DBG_FRAME_MODE,
5706c95dd8fSPrabhakar Kushwaha 		MSEM_REG_SLOW_DBG_ACTIVE,
5716c95dd8fSPrabhakar Kushwaha 		MSEM_REG_SLOW_DBG_MODE,
5726c95dd8fSPrabhakar Kushwaha 		MSEM_REG_DBG_MODE1_CFG,
5732d22bc83SMichal Kalderon 		MSEM_REG_SYNC_DBG_EMPTY,
5742d22bc83SMichal Kalderon 		MSEM_REG_DBG_GPRE_VECT,
575c965db44STomer Tayar 		MCM_REG_CTX_RBC_ACCS,
5762d22bc83SMichal Kalderon 		{MCM_REG_AGG_CON_CTX, MCM_REG_SM_CON_CTX, MCM_REG_AGG_TASK_CTX,
5772d22bc83SMichal Kalderon 		 MCM_REG_SM_TASK_CTX },
5782d22bc83SMichal Kalderon 		{{1, 10, 2, 7}, {1, 10, 2, 7}} /* {bb} {k2}*/
5792d22bc83SMichal Kalderon 	},
5807b6859fbSMintz, Yuval 
581c965db44STomer Tayar 	/* Ustorm */
582c965db44STomer Tayar 	{'U', BLOCK_USEM,
5832d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU},
5842d22bc83SMichal Kalderon 		false,
585c965db44STomer Tayar 		USEM_REG_FAST_MEMORY,
5866c95dd8fSPrabhakar Kushwaha 		USEM_REG_DBG_FRAME_MODE,
5876c95dd8fSPrabhakar Kushwaha 		USEM_REG_SLOW_DBG_ACTIVE,
5886c95dd8fSPrabhakar Kushwaha 		USEM_REG_SLOW_DBG_MODE,
5896c95dd8fSPrabhakar Kushwaha 		USEM_REG_DBG_MODE1_CFG,
5902d22bc83SMichal Kalderon 		USEM_REG_SYNC_DBG_EMPTY,
5912d22bc83SMichal Kalderon 		USEM_REG_DBG_GPRE_VECT,
592c965db44STomer Tayar 		UCM_REG_CTX_RBC_ACCS,
5932d22bc83SMichal Kalderon 		{UCM_REG_AGG_CON_CTX, UCM_REG_SM_CON_CTX, UCM_REG_AGG_TASK_CTX,
5942d22bc83SMichal Kalderon 		 UCM_REG_SM_TASK_CTX},
5952d22bc83SMichal Kalderon 		{{2, 13, 3, 3}, {2, 13, 3, 3}} /* {bb} {k2} */
5962d22bc83SMichal Kalderon 	},
5977b6859fbSMintz, Yuval 
598c965db44STomer Tayar 	/* Xstorm */
599c965db44STomer Tayar 	{'X', BLOCK_XSEM,
6002d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX},
6012d22bc83SMichal Kalderon 		false,
602c965db44STomer Tayar 		XSEM_REG_FAST_MEMORY,
6036c95dd8fSPrabhakar Kushwaha 		XSEM_REG_DBG_FRAME_MODE,
6046c95dd8fSPrabhakar Kushwaha 		XSEM_REG_SLOW_DBG_ACTIVE,
6056c95dd8fSPrabhakar Kushwaha 		XSEM_REG_SLOW_DBG_MODE,
6066c95dd8fSPrabhakar Kushwaha 		XSEM_REG_DBG_MODE1_CFG,
6072d22bc83SMichal Kalderon 		XSEM_REG_SYNC_DBG_EMPTY,
6082d22bc83SMichal Kalderon 		XSEM_REG_DBG_GPRE_VECT,
609c965db44STomer Tayar 		XCM_REG_CTX_RBC_ACCS,
6102d22bc83SMichal Kalderon 		{XCM_REG_AGG_CON_CTX, XCM_REG_SM_CON_CTX, 0, 0},
6112d22bc83SMichal Kalderon 		{{9, 15, 0, 0}, {9, 15,	0, 0}} /* {bb} {k2} */
6122d22bc83SMichal Kalderon 	},
6137b6859fbSMintz, Yuval 
614c965db44STomer Tayar 	/* Ystorm */
615c965db44STomer Tayar 	{'Y', BLOCK_YSEM,
6162d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY},
6172d22bc83SMichal Kalderon 		false,
618c965db44STomer Tayar 		YSEM_REG_FAST_MEMORY,
6196c95dd8fSPrabhakar Kushwaha 		YSEM_REG_DBG_FRAME_MODE,
6206c95dd8fSPrabhakar Kushwaha 		YSEM_REG_SLOW_DBG_ACTIVE,
6216c95dd8fSPrabhakar Kushwaha 		YSEM_REG_SLOW_DBG_MODE,
6226c95dd8fSPrabhakar Kushwaha 		YSEM_REG_DBG_MODE1_CFG,
6232d22bc83SMichal Kalderon 		YSEM_REG_SYNC_DBG_EMPTY,
6242d22bc83SMichal Kalderon 		YSEM_REG_DBG_GPRE_VECT,
625c965db44STomer Tayar 		YCM_REG_CTX_RBC_ACCS,
6262d22bc83SMichal Kalderon 		{YCM_REG_AGG_CON_CTX, YCM_REG_SM_CON_CTX, YCM_REG_AGG_TASK_CTX,
6272d22bc83SMichal Kalderon 		 YCM_REG_SM_TASK_CTX},
6282d22bc83SMichal Kalderon 		{{2, 3, 2, 12}, {2, 3, 2, 12}} /* {bb} {k2} */
6292d22bc83SMichal Kalderon 	},
6307b6859fbSMintz, Yuval 
631c965db44STomer Tayar 	/* Pstorm */
632c965db44STomer Tayar 	{'P', BLOCK_PSEM,
6332d22bc83SMichal Kalderon 		{DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS},
6342d22bc83SMichal Kalderon 		true,
635c965db44STomer Tayar 		PSEM_REG_FAST_MEMORY,
6366c95dd8fSPrabhakar Kushwaha 		PSEM_REG_DBG_FRAME_MODE,
6376c95dd8fSPrabhakar Kushwaha 		PSEM_REG_SLOW_DBG_ACTIVE,
6386c95dd8fSPrabhakar Kushwaha 		PSEM_REG_SLOW_DBG_MODE,
6396c95dd8fSPrabhakar Kushwaha 		PSEM_REG_DBG_MODE1_CFG,
6402d22bc83SMichal Kalderon 		PSEM_REG_SYNC_DBG_EMPTY,
6412d22bc83SMichal Kalderon 		PSEM_REG_DBG_GPRE_VECT,
642c965db44STomer Tayar 		PCM_REG_CTX_RBC_ACCS,
6432d22bc83SMichal Kalderon 		{0, PCM_REG_SM_CON_CTX, 0, 0},
6442d22bc83SMichal Kalderon 		{{0, 10, 0, 0}, {0, 10, 0, 0}} /* {bb} {k2} */
6452d22bc83SMichal Kalderon 	},
646c965db44STomer Tayar };
647c965db44STomer Tayar 
6482d22bc83SMichal Kalderon static struct hw_type_defs s_hw_type_defs[] = {
6492d22bc83SMichal Kalderon 	/* HW_TYPE_ASIC */
650da090917STomer Tayar 	{"asic", 1, 256, 32768},
651da090917STomer Tayar 	{"reserved", 0, 0, 0},
652da090917STomer Tayar 	{"reserved2", 0, 0, 0},
6536c95dd8fSPrabhakar Kushwaha 	{"reserved3", 0, 0, 0},
6546c95dd8fSPrabhakar Kushwaha 	{"reserved4", 0, 0, 0}
655c965db44STomer Tayar };
656c965db44STomer Tayar 
657c965db44STomer Tayar static struct grc_param_defs s_grc_param_defs[] = {
6587b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_TSTORM */
6592d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
6607b6859fbSMintz, Yuval 
6617b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_MSTORM */
6622d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
6637b6859fbSMintz, Yuval 
6647b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_USTORM */
6652d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
6667b6859fbSMintz, Yuval 
6677b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_XSTORM */
6682d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
6697b6859fbSMintz, Yuval 
6707b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_YSTORM */
6712d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
6727b6859fbSMintz, Yuval 
6737b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_PSTORM */
6742d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 1, {1, 1}},
6757b6859fbSMintz, Yuval 
6767b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_REGS */
6772d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6787b6859fbSMintz, Yuval 
6797b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_RAM */
6802d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6817b6859fbSMintz, Yuval 
6827b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_PBUF */
6832d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6847b6859fbSMintz, Yuval 
6857b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_IOR */
6862d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
6877b6859fbSMintz, Yuval 
6887b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_VFC */
6892d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
6907b6859fbSMintz, Yuval 
6917b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_CM_CTX */
6922d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6937b6859fbSMintz, Yuval 
6947b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_ILT */
6952d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6967b6859fbSMintz, Yuval 
6977b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_RSS */
6982d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
6997b6859fbSMintz, Yuval 
7007b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_CAU */
7012d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7027b6859fbSMintz, Yuval 
7037b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_QM */
7042d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7057b6859fbSMintz, Yuval 
7067b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_MCP */
7072d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7087b6859fbSMintz, Yuval 
7092d22bc83SMichal Kalderon 	/* DBG_GRC_PARAM_DUMP_DORQ */
7102d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7117b6859fbSMintz, Yuval 
7127b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_CFC */
7132d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7147b6859fbSMintz, Yuval 
7157b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_IGU */
7162d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7177b6859fbSMintz, Yuval 
7187b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_BRB */
7192d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
7207b6859fbSMintz, Yuval 
7217b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_BTB */
7222d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {1, 1}},
7237b6859fbSMintz, Yuval 
7247b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_BMB */
7252d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7267b6859fbSMintz, Yuval 
7272d22bc83SMichal Kalderon 	/* DBG_GRC_PARAM_RESERVED1 */
7282d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7297b6859fbSMintz, Yuval 
7307b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_MULD */
7312d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7327b6859fbSMintz, Yuval 
7337b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_PRS */
7342d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7357b6859fbSMintz, Yuval 
7367b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_DMAE */
7372d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7387b6859fbSMintz, Yuval 
7397b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_TM */
7402d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7417b6859fbSMintz, Yuval 
7427b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_SDM */
7432d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7447b6859fbSMintz, Yuval 
7457b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_DIF */
7462d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7477b6859fbSMintz, Yuval 
7487b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_STATIC */
7492d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7507b6859fbSMintz, Yuval 
7517b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_UNSTALL */
7522d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7537b6859fbSMintz, Yuval 
7542d22bc83SMichal Kalderon 	/* DBG_GRC_PARAM_RESERVED2 */
7552d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7567b6859fbSMintz, Yuval 
7572d22bc83SMichal Kalderon 	/* DBG_GRC_PARAM_MCP_TRACE_META_SIZE */
7582d22bc83SMichal Kalderon 	{{0, 0}, 1, 0xffffffff, false, true, 0, {0, 0}},
7597b6859fbSMintz, Yuval 
7607b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_EXCLUDE_ALL */
7612d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, true, false, 0, {0, 0}},
7627b6859fbSMintz, Yuval 
7637b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_CRASH */
7642d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, true, false, 0, {0, 0}},
7657b6859fbSMintz, Yuval 
7667b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_PARITY_SAFE */
7672d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7687b6859fbSMintz, Yuval 
7697b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_CM */
7702d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {1, 1}},
7717b6859fbSMintz, Yuval 
7727b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_DUMP_PHY */
7732d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7747b6859fbSMintz, Yuval 
7757b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_NO_MCP */
7762d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7777b6859fbSMintz, Yuval 
7787b6859fbSMintz, Yuval 	/* DBG_GRC_PARAM_NO_FW_VER */
7792d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7808a52bbabSMichal Kalderon 
7818a52bbabSMichal Kalderon 	/* DBG_GRC_PARAM_RESERVED3 */
7822d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {0, 0}},
7838a52bbabSMichal Kalderon 
7848a52bbabSMichal Kalderon 	/* DBG_GRC_PARAM_DUMP_MCP_HW_DUMP */
7852d22bc83SMichal Kalderon 	{{0, 1}, 0, 1, false, false, 0, {0, 1}},
7868a52bbabSMichal Kalderon 
7878a52bbabSMichal Kalderon 	/* DBG_GRC_PARAM_DUMP_ILT_CDUC */
7882d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {0, 0}},
7898a52bbabSMichal Kalderon 
7908a52bbabSMichal Kalderon 	/* DBG_GRC_PARAM_DUMP_ILT_CDUT */
7912d22bc83SMichal Kalderon 	{{1, 1}, 0, 1, false, false, 0, {0, 0}},
7928a52bbabSMichal Kalderon 
7938a52bbabSMichal Kalderon 	/* DBG_GRC_PARAM_DUMP_CAU_EXT */
7942d22bc83SMichal Kalderon 	{{0, 0}, 0, 1, false, false, 0, {1, 1}}
795c965db44STomer Tayar };
796c965db44STomer Tayar 
797c965db44STomer Tayar static struct rss_mem_defs s_rss_mem_defs[] = {
798da090917STomer Tayar 	{"rss_mem_cid", "rss_cid", 0, 32,
7992d22bc83SMichal Kalderon 	 {256, 320}},
8007b6859fbSMintz, Yuval 
801da090917STomer Tayar 	{"rss_mem_key_msb", "rss_key", 1024, 256,
8022d22bc83SMichal Kalderon 	 {128, 208}},
8037b6859fbSMintz, Yuval 
804da090917STomer Tayar 	{"rss_mem_key_lsb", "rss_key", 2048, 64,
8052d22bc83SMichal Kalderon 	 {128, 208}},
8067b6859fbSMintz, Yuval 
807da090917STomer Tayar 	{"rss_mem_info", "rss_info", 3072, 16,
8082d22bc83SMichal Kalderon 	 {128, 208}},
8097b6859fbSMintz, Yuval 
810da090917STomer Tayar 	{"rss_mem_ind", "rss_ind", 4096, 16,
8112d22bc83SMichal Kalderon 	 {16384, 26624}}
812c965db44STomer Tayar };
813c965db44STomer Tayar 
814c965db44STomer Tayar static struct vfc_ram_defs s_vfc_ram_defs[] = {
815c965db44STomer Tayar 	{"vfc_ram_tt1", "vfc_ram", 0, 512},
816c965db44STomer Tayar 	{"vfc_ram_mtt2", "vfc_ram", 512, 128},
817c965db44STomer Tayar 	{"vfc_ram_stt2", "vfc_ram", 640, 32},
818c965db44STomer Tayar 	{"vfc_ram_ro_vect", "vfc_ram", 672, 32}
819c965db44STomer Tayar };
820c965db44STomer Tayar 
821c965db44STomer Tayar static struct big_ram_defs s_big_ram_defs[] = {
822c965db44STomer Tayar 	{"BRB", MEM_GROUP_BRB_MEM, MEM_GROUP_BRB_RAM, DBG_GRC_PARAM_DUMP_BRB,
823c965db44STomer Tayar 	 BRB_REG_BIG_RAM_ADDRESS, BRB_REG_BIG_RAM_DATA,
8242d22bc83SMichal Kalderon 	 MISC_REG_BLOCK_256B_EN, {0, 0},
8252d22bc83SMichal Kalderon 	 {153600, 180224}},
8267b6859fbSMintz, Yuval 
827c965db44STomer Tayar 	{"BTB", MEM_GROUP_BTB_MEM, MEM_GROUP_BTB_RAM, DBG_GRC_PARAM_DUMP_BTB,
828c965db44STomer Tayar 	 BTB_REG_BIG_RAM_ADDRESS, BTB_REG_BIG_RAM_DATA,
8292d22bc83SMichal Kalderon 	 MISC_REG_BLOCK_256B_EN, {0, 1},
8302d22bc83SMichal Kalderon 	 {92160, 117760}},
8317b6859fbSMintz, Yuval 
832c965db44STomer Tayar 	{"BMB", MEM_GROUP_BMB_MEM, MEM_GROUP_BMB_RAM, DBG_GRC_PARAM_DUMP_BMB,
833c965db44STomer Tayar 	 BMB_REG_BIG_RAM_ADDRESS, BMB_REG_BIG_RAM_DATA,
8342d22bc83SMichal Kalderon 	 MISCS_REG_BLOCK_256B_EN, {0, 0},
8352d22bc83SMichal Kalderon 	 {36864, 36864}}
836c965db44STomer Tayar };
837c965db44STomer Tayar 
8382d22bc83SMichal Kalderon static struct rbc_reset_defs s_rbc_reset_defs[] = {
839da090917STomer Tayar 	{MISCS_REG_RESET_PL_HV,
8402d22bc83SMichal Kalderon 	 {0x0, 0x400}},
841da090917STomer Tayar 	{MISC_REG_RESET_PL_PDA_VMAIN_1,
8422d22bc83SMichal Kalderon 	 {0x4404040, 0x4404040}},
843da090917STomer Tayar 	{MISC_REG_RESET_PL_PDA_VMAIN_2,
8442d22bc83SMichal Kalderon 	 {0x7, 0x7c00007}},
845da090917STomer Tayar 	{MISC_REG_RESET_PL_PDA_VAUX,
8462d22bc83SMichal Kalderon 	 {0x2, 0x2}},
847c965db44STomer Tayar };
848c965db44STomer Tayar 
849c965db44STomer Tayar static struct phy_defs s_phy_defs[] = {
8507b6859fbSMintz, Yuval 	{"nw_phy", NWS_REG_NWS_CMU_K2,
8516c95dd8fSPrabhakar Kushwaha 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_7_0_K2,
8526c95dd8fSPrabhakar Kushwaha 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_15_8_K2,
8536c95dd8fSPrabhakar Kushwaha 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_7_0_K2,
8546c95dd8fSPrabhakar Kushwaha 	 PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_11_8_K2},
8556c95dd8fSPrabhakar Kushwaha 	{"sgmii_phy", MS_REG_MS_CMU_K2,
8566c95dd8fSPrabhakar Kushwaha 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X132_K2,
8576c95dd8fSPrabhakar Kushwaha 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X133_K2,
8586c95dd8fSPrabhakar Kushwaha 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X130_K2,
8596c95dd8fSPrabhakar Kushwaha 	 PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X131_K2},
8606c95dd8fSPrabhakar Kushwaha 	{"pcie_phy0", PHY_PCIE_REG_PHY0_K2,
8616c95dd8fSPrabhakar Kushwaha 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2,
8626c95dd8fSPrabhakar Kushwaha 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2,
8636c95dd8fSPrabhakar Kushwaha 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2,
8646c95dd8fSPrabhakar Kushwaha 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2},
8656c95dd8fSPrabhakar Kushwaha 	{"pcie_phy1", PHY_PCIE_REG_PHY1_K2,
8666c95dd8fSPrabhakar Kushwaha 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2,
8676c95dd8fSPrabhakar Kushwaha 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2,
8686c95dd8fSPrabhakar Kushwaha 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2,
8696c95dd8fSPrabhakar Kushwaha 	 PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2},
870c965db44STomer Tayar };
871c965db44STomer Tayar 
872d52c89f1SMichal Kalderon static struct split_type_defs s_split_type_defs[] = {
873d52c89f1SMichal Kalderon 	/* SPLIT_TYPE_NONE */
874d52c89f1SMichal Kalderon 	{"eng"},
875d52c89f1SMichal Kalderon 
876d52c89f1SMichal Kalderon 	/* SPLIT_TYPE_PORT */
877d52c89f1SMichal Kalderon 	{"port"},
878d52c89f1SMichal Kalderon 
879d52c89f1SMichal Kalderon 	/* SPLIT_TYPE_PF */
880d52c89f1SMichal Kalderon 	{"pf"},
881d52c89f1SMichal Kalderon 
882d52c89f1SMichal Kalderon 	/* SPLIT_TYPE_PORT_PF */
883d52c89f1SMichal Kalderon 	{"port"},
884d52c89f1SMichal Kalderon 
885d52c89f1SMichal Kalderon 	/* SPLIT_TYPE_VF */
886d52c89f1SMichal Kalderon 	{"vf"}
887d52c89f1SMichal Kalderon };
888d52c89f1SMichal Kalderon 
8896c95dd8fSPrabhakar Kushwaha /******************************** Variables **********************************/
8906c95dd8fSPrabhakar Kushwaha 
8916c95dd8fSPrabhakar Kushwaha /* The version of the calling app */
8926c95dd8fSPrabhakar Kushwaha static u32 s_app_ver;
8936c95dd8fSPrabhakar Kushwaha 
894c965db44STomer Tayar /**************************** Private Functions ******************************/
895c965db44STomer Tayar 
qed_static_asserts(void)8966c95dd8fSPrabhakar Kushwaha static void qed_static_asserts(void)
8976c95dd8fSPrabhakar Kushwaha {
8986c95dd8fSPrabhakar Kushwaha }
8996c95dd8fSPrabhakar Kushwaha 
900c965db44STomer Tayar /* Reads and returns a single dword from the specified unaligned buffer */
qed_read_unaligned_dword(u8 * buf)901c965db44STomer Tayar static u32 qed_read_unaligned_dword(u8 *buf)
902c965db44STomer Tayar {
903c965db44STomer Tayar 	u32 dword;
904c965db44STomer Tayar 
905c965db44STomer Tayar 	memcpy((u8 *)&dword, buf, sizeof(dword));
906c965db44STomer Tayar 	return dword;
907c965db44STomer Tayar }
908c965db44STomer Tayar 
9093b86bd07SSudarsana Reddy Kalluru /* Sets the value of the specified GRC param */
qed_grc_set_param(struct qed_hwfn * p_hwfn,enum dbg_grc_params grc_param,u32 val)9103b86bd07SSudarsana Reddy Kalluru static void qed_grc_set_param(struct qed_hwfn *p_hwfn,
9113b86bd07SSudarsana Reddy Kalluru 			      enum dbg_grc_params grc_param, u32 val)
9123b86bd07SSudarsana Reddy Kalluru {
9133b86bd07SSudarsana Reddy Kalluru 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
9143b86bd07SSudarsana Reddy Kalluru 
9153b86bd07SSudarsana Reddy Kalluru 	dev_data->grc.param_val[grc_param] = val;
9163b86bd07SSudarsana Reddy Kalluru }
9173b86bd07SSudarsana Reddy Kalluru 
918be086e7cSMintz, Yuval /* Returns the value of the specified GRC param */
qed_grc_get_param(struct qed_hwfn * p_hwfn,enum dbg_grc_params grc_param)919be086e7cSMintz, Yuval static u32 qed_grc_get_param(struct qed_hwfn *p_hwfn,
920be086e7cSMintz, Yuval 			     enum dbg_grc_params grc_param)
921be086e7cSMintz, Yuval {
922be086e7cSMintz, Yuval 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
923be086e7cSMintz, Yuval 
924be086e7cSMintz, Yuval 	return dev_data->grc.param_val[grc_param];
925be086e7cSMintz, Yuval }
926be086e7cSMintz, Yuval 
927be086e7cSMintz, Yuval /* Initializes the GRC parameters */
qed_dbg_grc_init_params(struct qed_hwfn * p_hwfn)928be086e7cSMintz, Yuval static void qed_dbg_grc_init_params(struct qed_hwfn *p_hwfn)
929be086e7cSMintz, Yuval {
930be086e7cSMintz, Yuval 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
931be086e7cSMintz, Yuval 
932be086e7cSMintz, Yuval 	if (!dev_data->grc.params_initialized) {
933be086e7cSMintz, Yuval 		qed_dbg_grc_set_params_default(p_hwfn);
934be086e7cSMintz, Yuval 		dev_data->grc.params_initialized = 1;
935be086e7cSMintz, Yuval 	}
936be086e7cSMintz, Yuval }
937be086e7cSMintz, Yuval 
9382d22bc83SMichal Kalderon /* Sets pointer and size for the specified binary buffer type */
qed_set_dbg_bin_buf(struct qed_hwfn * p_hwfn,enum bin_dbg_buffer_type buf_type,const u32 * ptr,u32 size)9392d22bc83SMichal Kalderon static void qed_set_dbg_bin_buf(struct qed_hwfn *p_hwfn,
9402d22bc83SMichal Kalderon 				enum bin_dbg_buffer_type buf_type,
9412d22bc83SMichal Kalderon 				const u32 *ptr, u32 size)
9422d22bc83SMichal Kalderon {
9432d22bc83SMichal Kalderon 	struct virt_mem_desc *buf = &p_hwfn->dbg_arrays[buf_type];
9442d22bc83SMichal Kalderon 
9452d22bc83SMichal Kalderon 	buf->ptr = (void *)ptr;
9462d22bc83SMichal Kalderon 	buf->size = size;
9472d22bc83SMichal Kalderon }
9482d22bc83SMichal Kalderon 
949c965db44STomer Tayar /* Initializes debug data for the specified device */
qed_dbg_dev_init(struct qed_hwfn * p_hwfn)9502d22bc83SMichal Kalderon static enum dbg_status qed_dbg_dev_init(struct qed_hwfn *p_hwfn)
951c965db44STomer Tayar {
952c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
953d52c89f1SMichal Kalderon 	u8 num_pfs = 0, max_pfs_per_port = 0;
954c965db44STomer Tayar 
955c965db44STomer Tayar 	if (dev_data->initialized)
956c965db44STomer Tayar 		return DBG_STATUS_OK;
957c965db44STomer Tayar 
9586c95dd8fSPrabhakar Kushwaha 	if (!s_app_ver)
9596c95dd8fSPrabhakar Kushwaha 		return DBG_STATUS_APP_VERSION_NOT_SET;
9606c95dd8fSPrabhakar Kushwaha 
961d52c89f1SMichal Kalderon 	/* Set chip */
962c965db44STomer Tayar 	if (QED_IS_K2(p_hwfn->cdev)) {
963c965db44STomer Tayar 		dev_data->chip_id = CHIP_K2;
964c965db44STomer Tayar 		dev_data->mode_enable[MODE_K2] = 1;
965d52c89f1SMichal Kalderon 		dev_data->num_vfs = MAX_NUM_VFS_K2;
966d52c89f1SMichal Kalderon 		num_pfs = MAX_NUM_PFS_K2;
967d52c89f1SMichal Kalderon 		max_pfs_per_port = MAX_NUM_PFS_K2 / 2;
968c965db44STomer Tayar 	} else if (QED_IS_BB_B0(p_hwfn->cdev)) {
9697b6859fbSMintz, Yuval 		dev_data->chip_id = CHIP_BB;
9709c79ddaaSMintz, Yuval 		dev_data->mode_enable[MODE_BB] = 1;
971d52c89f1SMichal Kalderon 		dev_data->num_vfs = MAX_NUM_VFS_BB;
972d52c89f1SMichal Kalderon 		num_pfs = MAX_NUM_PFS_BB;
973d52c89f1SMichal Kalderon 		max_pfs_per_port = MAX_NUM_PFS_BB;
974c965db44STomer Tayar 	} else {
975c965db44STomer Tayar 		return DBG_STATUS_UNKNOWN_CHIP;
976c965db44STomer Tayar 	}
977c965db44STomer Tayar 
9782d22bc83SMichal Kalderon 	/* Set HW type */
9792d22bc83SMichal Kalderon 	dev_data->hw_type = HW_TYPE_ASIC;
980c965db44STomer Tayar 	dev_data->mode_enable[MODE_ASIC] = 1;
981be086e7cSMintz, Yuval 
982d52c89f1SMichal Kalderon 	/* Set port mode */
9832d22bc83SMichal Kalderon 	switch (p_hwfn->cdev->num_ports_in_engine) {
9842d22bc83SMichal Kalderon 	case 1:
985d52c89f1SMichal Kalderon 		dev_data->mode_enable[MODE_PORTS_PER_ENG_1] = 1;
986d52c89f1SMichal Kalderon 		break;
9872d22bc83SMichal Kalderon 	case 2:
988d52c89f1SMichal Kalderon 		dev_data->mode_enable[MODE_PORTS_PER_ENG_2] = 1;
989d52c89f1SMichal Kalderon 		break;
9902d22bc83SMichal Kalderon 	case 4:
991d52c89f1SMichal Kalderon 		dev_data->mode_enable[MODE_PORTS_PER_ENG_4] = 1;
992d52c89f1SMichal Kalderon 		break;
993d52c89f1SMichal Kalderon 	}
994d52c89f1SMichal Kalderon 
995d52c89f1SMichal Kalderon 	/* Set 100G mode */
9962d22bc83SMichal Kalderon 	if (QED_IS_CMT(p_hwfn->cdev))
997d52c89f1SMichal Kalderon 		dev_data->mode_enable[MODE_100G] = 1;
998d52c89f1SMichal Kalderon 
999d52c89f1SMichal Kalderon 	/* Set number of ports */
1000d52c89f1SMichal Kalderon 	if (dev_data->mode_enable[MODE_PORTS_PER_ENG_1] ||
1001d52c89f1SMichal Kalderon 	    dev_data->mode_enable[MODE_100G])
1002d52c89f1SMichal Kalderon 		dev_data->num_ports = 1;
1003d52c89f1SMichal Kalderon 	else if (dev_data->mode_enable[MODE_PORTS_PER_ENG_2])
1004d52c89f1SMichal Kalderon 		dev_data->num_ports = 2;
1005d52c89f1SMichal Kalderon 	else if (dev_data->mode_enable[MODE_PORTS_PER_ENG_4])
1006d52c89f1SMichal Kalderon 		dev_data->num_ports = 4;
1007d52c89f1SMichal Kalderon 
1008d52c89f1SMichal Kalderon 	/* Set number of PFs per port */
1009d52c89f1SMichal Kalderon 	dev_data->num_pfs_per_port = min_t(u32,
1010d52c89f1SMichal Kalderon 					   num_pfs / dev_data->num_ports,
1011d52c89f1SMichal Kalderon 					   max_pfs_per_port);
1012d52c89f1SMichal Kalderon 
1013be086e7cSMintz, Yuval 	/* Initializes the GRC parameters */
1014be086e7cSMintz, Yuval 	qed_dbg_grc_init_params(p_hwfn);
1015be086e7cSMintz, Yuval 
1016da090917STomer Tayar 	dev_data->use_dmae = true;
1017da090917STomer Tayar 	dev_data->initialized = 1;
10187b6859fbSMintz, Yuval 
1019c965db44STomer Tayar 	return DBG_STATUS_OK;
1020c965db44STomer Tayar }
1021c965db44STomer Tayar 
get_dbg_block(struct qed_hwfn * p_hwfn,enum block_id block_id)10222d22bc83SMichal Kalderon static const struct dbg_block *get_dbg_block(struct qed_hwfn *p_hwfn,
10237b6859fbSMintz, Yuval 					     enum block_id block_id)
10247b6859fbSMintz, Yuval {
10252d22bc83SMichal Kalderon 	const struct dbg_block *dbg_block;
10262d22bc83SMichal Kalderon 
10272d22bc83SMichal Kalderon 	dbg_block = p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS].ptr;
10282d22bc83SMichal Kalderon 	return dbg_block + block_id;
10292d22bc83SMichal Kalderon }
10302d22bc83SMichal Kalderon 
qed_get_dbg_block_per_chip(struct qed_hwfn * p_hwfn,enum block_id block_id)10312d22bc83SMichal Kalderon static const struct dbg_block_chip *qed_get_dbg_block_per_chip(struct qed_hwfn
10322d22bc83SMichal Kalderon 							       *p_hwfn,
10332d22bc83SMichal Kalderon 							       enum block_id
10342d22bc83SMichal Kalderon 							       block_id)
10352d22bc83SMichal Kalderon {
10367b6859fbSMintz, Yuval 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
10377b6859fbSMintz, Yuval 
10382d22bc83SMichal Kalderon 	return (const struct dbg_block_chip *)
10392d22bc83SMichal Kalderon 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_CHIP_DATA].ptr +
10402d22bc83SMichal Kalderon 	    block_id * MAX_CHIP_IDS + dev_data->chip_id;
10412d22bc83SMichal Kalderon }
10422d22bc83SMichal Kalderon 
qed_get_dbg_reset_reg(struct qed_hwfn * p_hwfn,u8 reset_reg_id)10432d22bc83SMichal Kalderon static const struct dbg_reset_reg *qed_get_dbg_reset_reg(struct qed_hwfn
10442d22bc83SMichal Kalderon 							 *p_hwfn,
10452d22bc83SMichal Kalderon 							 u8 reset_reg_id)
10462d22bc83SMichal Kalderon {
10472d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
10482d22bc83SMichal Kalderon 
10492d22bc83SMichal Kalderon 	return (const struct dbg_reset_reg *)
10502d22bc83SMichal Kalderon 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_RESET_REGS].ptr +
10512d22bc83SMichal Kalderon 	    reset_reg_id * MAX_CHIP_IDS + dev_data->chip_id;
10527b6859fbSMintz, Yuval }
10537b6859fbSMintz, Yuval 
1054c965db44STomer Tayar /* Reads the FW info structure for the specified Storm from the chip,
1055c965db44STomer Tayar  * and writes it to the specified fw_info pointer.
1056c965db44STomer Tayar  */
qed_read_storm_fw_info(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u8 storm_id,struct fw_info * fw_info)1057d52c89f1SMichal Kalderon static void qed_read_storm_fw_info(struct qed_hwfn *p_hwfn,
1058c965db44STomer Tayar 				   struct qed_ptt *p_ptt,
1059c965db44STomer Tayar 				   u8 storm_id, struct fw_info *fw_info)
1060c965db44STomer Tayar {
10617b6859fbSMintz, Yuval 	struct storm_defs *storm = &s_storm_defs[storm_id];
1062c965db44STomer Tayar 	struct fw_info_location fw_info_location;
10635ab90341SAlexander Lobakin 	u32 addr, i, size, *dest;
1064c965db44STomer Tayar 
1065c965db44STomer Tayar 	memset(&fw_info_location, 0, sizeof(fw_info_location));
1066c965db44STomer Tayar 	memset(fw_info, 0, sizeof(*fw_info));
10677b6859fbSMintz, Yuval 
10687b6859fbSMintz, Yuval 	/* Read first the address that points to fw_info location.
10697b6859fbSMintz, Yuval 	 * The address is located in the last line of the Storm RAM.
10707b6859fbSMintz, Yuval 	 */
10717b6859fbSMintz, Yuval 	addr = storm->sem_fast_mem_addr + SEM_FAST_REG_INT_RAM +
10722d22bc83SMichal Kalderon 	    DWORDS_TO_BYTES(SEM_FAST_REG_INT_RAM_SIZE) -
10737b6859fbSMintz, Yuval 	    sizeof(fw_info_location);
10742d22bc83SMichal Kalderon 
10757b6859fbSMintz, Yuval 	dest = (u32 *)&fw_info_location;
10765ab90341SAlexander Lobakin 	size = BYTES_TO_DWORDS(sizeof(fw_info_location));
10777b6859fbSMintz, Yuval 
10785ab90341SAlexander Lobakin 	for (i = 0; i < size; i++, addr += BYTES_IN_DWORD)
1079c965db44STomer Tayar 		dest[i] = qed_rd(p_hwfn, p_ptt, addr);
10807b6859fbSMintz, Yuval 
10817b6859fbSMintz, Yuval 	/* Read FW version info from Storm RAM */
10825ab90341SAlexander Lobakin 	size = le32_to_cpu(fw_info_location.size);
10835ab90341SAlexander Lobakin 	if (!size || size > sizeof(*fw_info))
10845ab90341SAlexander Lobakin 		return;
10855ab90341SAlexander Lobakin 
10865ab90341SAlexander Lobakin 	addr = le32_to_cpu(fw_info_location.grc_addr);
1087c965db44STomer Tayar 	dest = (u32 *)fw_info;
10885ab90341SAlexander Lobakin 	size = BYTES_TO_DWORDS(size);
10895ab90341SAlexander Lobakin 
10905ab90341SAlexander Lobakin 	for (i = 0; i < size; i++, addr += BYTES_IN_DWORD)
1091c965db44STomer Tayar 		dest[i] = qed_rd(p_hwfn, p_ptt, addr);
1092c965db44STomer Tayar }
1093c965db44STomer Tayar 
10947b6859fbSMintz, Yuval /* Dumps the specified string to the specified buffer.
10957b6859fbSMintz, Yuval  * Returns the dumped size in bytes.
1096c965db44STomer Tayar  */
qed_dump_str(char * dump_buf,bool dump,const char * str)1097c965db44STomer Tayar static u32 qed_dump_str(char *dump_buf, bool dump, const char *str)
1098c965db44STomer Tayar {
1099c965db44STomer Tayar 	if (dump)
1100c965db44STomer Tayar 		strcpy(dump_buf, str);
11017b6859fbSMintz, Yuval 
1102c965db44STomer Tayar 	return (u32)strlen(str) + 1;
1103c965db44STomer Tayar }
1104c965db44STomer Tayar 
11057b6859fbSMintz, Yuval /* Dumps zeros to align the specified buffer to dwords.
11067b6859fbSMintz, Yuval  * Returns the dumped size in bytes.
1107c965db44STomer Tayar  */
qed_dump_align(char * dump_buf,bool dump,u32 byte_offset)1108c965db44STomer Tayar static u32 qed_dump_align(char *dump_buf, bool dump, u32 byte_offset)
1109c965db44STomer Tayar {
11107b6859fbSMintz, Yuval 	u8 offset_in_dword, align_size;
1111c965db44STomer Tayar 
11127b6859fbSMintz, Yuval 	offset_in_dword = (u8)(byte_offset & 0x3);
1113c965db44STomer Tayar 	align_size = offset_in_dword ? BYTES_IN_DWORD - offset_in_dword : 0;
1114c965db44STomer Tayar 
1115c965db44STomer Tayar 	if (dump && align_size)
1116c965db44STomer Tayar 		memset(dump_buf, 0, align_size);
11177b6859fbSMintz, Yuval 
1118c965db44STomer Tayar 	return align_size;
1119c965db44STomer Tayar }
1120c965db44STomer Tayar 
1121c965db44STomer Tayar /* Writes the specified string param to the specified buffer.
1122c965db44STomer Tayar  * Returns the dumped size in dwords.
1123c965db44STomer Tayar  */
qed_dump_str_param(u32 * dump_buf,bool dump,const char * param_name,const char * param_val)1124c965db44STomer Tayar static u32 qed_dump_str_param(u32 *dump_buf,
1125c965db44STomer Tayar 			      bool dump,
1126c965db44STomer Tayar 			      const char *param_name, const char *param_val)
1127c965db44STomer Tayar {
1128c965db44STomer Tayar 	char *char_buf = (char *)dump_buf;
1129c965db44STomer Tayar 	u32 offset = 0;
1130c965db44STomer Tayar 
1131c965db44STomer Tayar 	/* Dump param name */
1132c965db44STomer Tayar 	offset += qed_dump_str(char_buf + offset, dump, param_name);
1133c965db44STomer Tayar 
1134c965db44STomer Tayar 	/* Indicate a string param value */
1135c965db44STomer Tayar 	if (dump)
1136c965db44STomer Tayar 		*(char_buf + offset) = 1;
1137c965db44STomer Tayar 	offset++;
1138c965db44STomer Tayar 
1139c965db44STomer Tayar 	/* Dump param value */
1140c965db44STomer Tayar 	offset += qed_dump_str(char_buf + offset, dump, param_val);
1141c965db44STomer Tayar 
1142c965db44STomer Tayar 	/* Align buffer to next dword */
1143c965db44STomer Tayar 	offset += qed_dump_align(char_buf + offset, dump, offset);
11447b6859fbSMintz, Yuval 
1145c965db44STomer Tayar 	return BYTES_TO_DWORDS(offset);
1146c965db44STomer Tayar }
1147c965db44STomer Tayar 
1148c965db44STomer Tayar /* Writes the specified numeric param to the specified buffer.
1149c965db44STomer Tayar  * Returns the dumped size in dwords.
1150c965db44STomer Tayar  */
qed_dump_num_param(u32 * dump_buf,bool dump,const char * param_name,u32 param_val)1151c965db44STomer Tayar static u32 qed_dump_num_param(u32 *dump_buf,
1152c965db44STomer Tayar 			      bool dump, const char *param_name, u32 param_val)
1153c965db44STomer Tayar {
1154c965db44STomer Tayar 	char *char_buf = (char *)dump_buf;
1155c965db44STomer Tayar 	u32 offset = 0;
1156c965db44STomer Tayar 
1157c965db44STomer Tayar 	/* Dump param name */
1158c965db44STomer Tayar 	offset += qed_dump_str(char_buf + offset, dump, param_name);
1159c965db44STomer Tayar 
1160c965db44STomer Tayar 	/* Indicate a numeric param value */
1161c965db44STomer Tayar 	if (dump)
1162c965db44STomer Tayar 		*(char_buf + offset) = 0;
1163c965db44STomer Tayar 	offset++;
1164c965db44STomer Tayar 
1165c965db44STomer Tayar 	/* Align buffer to next dword */
1166c965db44STomer Tayar 	offset += qed_dump_align(char_buf + offset, dump, offset);
1167c965db44STomer Tayar 
1168c965db44STomer Tayar 	/* Dump param value (and change offset from bytes to dwords) */
1169c965db44STomer Tayar 	offset = BYTES_TO_DWORDS(offset);
1170c965db44STomer Tayar 	if (dump)
1171c965db44STomer Tayar 		*(dump_buf + offset) = param_val;
1172c965db44STomer Tayar 	offset++;
11737b6859fbSMintz, Yuval 
1174c965db44STomer Tayar 	return offset;
1175c965db44STomer Tayar }
1176c965db44STomer Tayar 
1177c965db44STomer Tayar /* Reads the FW version and writes it as a param to the specified buffer.
1178c965db44STomer Tayar  * Returns the dumped size in dwords.
1179c965db44STomer Tayar  */
qed_dump_fw_ver_param(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)1180c965db44STomer Tayar static u32 qed_dump_fw_ver_param(struct qed_hwfn *p_hwfn,
1181c965db44STomer Tayar 				 struct qed_ptt *p_ptt,
1182c965db44STomer Tayar 				 u32 *dump_buf, bool dump)
1183c965db44STomer Tayar {
1184c965db44STomer Tayar 	char fw_ver_str[16] = EMPTY_FW_VERSION_STR;
1185c965db44STomer Tayar 	char fw_img_str[16] = EMPTY_FW_IMAGE_STR;
1186c965db44STomer Tayar 	struct fw_info fw_info = { {0}, {0} };
1187c965db44STomer Tayar 	u32 offset = 0;
1188c965db44STomer Tayar 
1189be086e7cSMintz, Yuval 	if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
1190d52c89f1SMichal Kalderon 		/* Read FW info from chip */
1191d52c89f1SMichal Kalderon 		qed_read_fw_info(p_hwfn, p_ptt, &fw_info);
1192c965db44STomer Tayar 
1193c965db44STomer Tayar 		/* Create FW version/image strings */
11947b6859fbSMintz, Yuval 		if (snprintf(fw_ver_str, sizeof(fw_ver_str),
11957b6859fbSMintz, Yuval 			     "%d_%d_%d_%d", fw_info.ver.num.major,
11967b6859fbSMintz, Yuval 			     fw_info.ver.num.minor, fw_info.ver.num.rev,
11977b6859fbSMintz, Yuval 			     fw_info.ver.num.eng) < 0)
1198c965db44STomer Tayar 			DP_NOTICE(p_hwfn,
1199c965db44STomer Tayar 				  "Unexpected debug error: invalid FW version string\n");
1200c965db44STomer Tayar 		switch (fw_info.ver.image_id) {
12016c95dd8fSPrabhakar Kushwaha 		case FW_IMG_KUKU:
12026c95dd8fSPrabhakar Kushwaha 			strcpy(fw_img_str, "kuku");
12036c95dd8fSPrabhakar Kushwaha 			break;
1204c965db44STomer Tayar 		case FW_IMG_MAIN:
1205c965db44STomer Tayar 			strcpy(fw_img_str, "main");
1206c965db44STomer Tayar 			break;
12076c95dd8fSPrabhakar Kushwaha 		case FW_IMG_L2B:
12086c95dd8fSPrabhakar Kushwaha 			strcpy(fw_img_str, "l2b");
12096c95dd8fSPrabhakar Kushwaha 			break;
1210c965db44STomer Tayar 		default:
1211c965db44STomer Tayar 			strcpy(fw_img_str, "unknown");
1212c965db44STomer Tayar 			break;
1213c965db44STomer Tayar 		}
1214c965db44STomer Tayar 	}
1215c965db44STomer Tayar 
1216c965db44STomer Tayar 	/* Dump FW version, image and timestamp */
1217c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
1218c965db44STomer Tayar 				     dump, "fw-version", fw_ver_str);
1219c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
1220c965db44STomer Tayar 				     dump, "fw-image", fw_img_str);
12211451e467SAlexander Lobakin 	offset += qed_dump_num_param(dump_buf + offset, dump, "fw-timestamp",
12225ab90341SAlexander Lobakin 				     le32_to_cpu(fw_info.ver.timestamp));
12237b6859fbSMintz, Yuval 
1224c965db44STomer Tayar 	return offset;
1225c965db44STomer Tayar }
1226c965db44STomer Tayar 
1227c965db44STomer Tayar /* Reads the MFW version and writes it as a param to the specified buffer.
1228c965db44STomer Tayar  * Returns the dumped size in dwords.
1229c965db44STomer Tayar  */
qed_dump_mfw_ver_param(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)1230c965db44STomer Tayar static u32 qed_dump_mfw_ver_param(struct qed_hwfn *p_hwfn,
1231c965db44STomer Tayar 				  struct qed_ptt *p_ptt,
1232c965db44STomer Tayar 				  u32 *dump_buf, bool dump)
1233c965db44STomer Tayar {
1234c965db44STomer Tayar 	char mfw_ver_str[16] = EMPTY_FW_VERSION_STR;
1235c965db44STomer Tayar 
12367b6859fbSMintz, Yuval 	if (dump &&
12377b6859fbSMintz, Yuval 	    !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
1238c965db44STomer Tayar 		u32 global_section_offsize, global_section_addr, mfw_ver;
1239c965db44STomer Tayar 		u32 public_data_addr, global_section_offsize_addr;
1240c965db44STomer Tayar 
12417b6859fbSMintz, Yuval 		/* Find MCP public data GRC address. Needs to be ORed with
12427b6859fbSMintz, Yuval 		 * MCP_REG_SCRATCH due to a HW bug.
1243c965db44STomer Tayar 		 */
12447b6859fbSMintz, Yuval 		public_data_addr = qed_rd(p_hwfn,
12457b6859fbSMintz, Yuval 					  p_ptt,
1246c965db44STomer Tayar 					  MISC_REG_SHARED_MEM_ADDR) |
1247c965db44STomer Tayar 				   MCP_REG_SCRATCH;
1248c965db44STomer Tayar 
1249c965db44STomer Tayar 		/* Find MCP public global section offset */
1250c965db44STomer Tayar 		global_section_offsize_addr = public_data_addr +
1251c965db44STomer Tayar 					      offsetof(struct mcp_public_data,
1252c965db44STomer Tayar 						       sections) +
1253c965db44STomer Tayar 					      sizeof(offsize_t) * PUBLIC_GLOBAL;
1254c965db44STomer Tayar 		global_section_offsize = qed_rd(p_hwfn, p_ptt,
1255c965db44STomer Tayar 						global_section_offsize_addr);
12567b6859fbSMintz, Yuval 		global_section_addr =
12577b6859fbSMintz, Yuval 			MCP_REG_SCRATCH +
12587b6859fbSMintz, Yuval 			(global_section_offsize & OFFSIZE_OFFSET_MASK) * 4;
1259c965db44STomer Tayar 
1260c965db44STomer Tayar 		/* Read MFW version from MCP public global section */
1261c965db44STomer Tayar 		mfw_ver = qed_rd(p_hwfn, p_ptt,
1262c965db44STomer Tayar 				 global_section_addr +
1263c965db44STomer Tayar 				 offsetof(struct public_global, mfw_ver));
1264c965db44STomer Tayar 
1265c965db44STomer Tayar 		/* Dump MFW version param */
12667b6859fbSMintz, Yuval 		if (snprintf(mfw_ver_str, sizeof(mfw_ver_str), "%d_%d_%d_%d",
12677b6859fbSMintz, Yuval 			     (u8)(mfw_ver >> 24), (u8)(mfw_ver >> 16),
12687b6859fbSMintz, Yuval 			     (u8)(mfw_ver >> 8), (u8)mfw_ver) < 0)
1269c965db44STomer Tayar 			DP_NOTICE(p_hwfn,
1270c965db44STomer Tayar 				  "Unexpected debug error: invalid MFW version string\n");
1271c965db44STomer Tayar 	}
1272c965db44STomer Tayar 
1273c965db44STomer Tayar 	return qed_dump_str_param(dump_buf, dump, "mfw-version", mfw_ver_str);
1274c965db44STomer Tayar }
1275c965db44STomer Tayar 
12762d22bc83SMichal Kalderon /* Reads the chip revision from the chip and writes it as a param to the
12772d22bc83SMichal Kalderon  * specified buffer. Returns the dumped size in dwords.
12782d22bc83SMichal Kalderon  */
qed_dump_chip_revision_param(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)12792d22bc83SMichal Kalderon static u32 qed_dump_chip_revision_param(struct qed_hwfn *p_hwfn,
12802d22bc83SMichal Kalderon 					struct qed_ptt *p_ptt,
12812d22bc83SMichal Kalderon 					u32 *dump_buf, bool dump)
12822d22bc83SMichal Kalderon {
12832d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
12842d22bc83SMichal Kalderon 	char param_str[3] = "??";
12852d22bc83SMichal Kalderon 
12862d22bc83SMichal Kalderon 	if (dev_data->hw_type == HW_TYPE_ASIC) {
12872d22bc83SMichal Kalderon 		u32 chip_rev, chip_metal;
12882d22bc83SMichal Kalderon 
12892d22bc83SMichal Kalderon 		chip_rev = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_REV);
12902d22bc83SMichal Kalderon 		chip_metal = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_METAL);
12912d22bc83SMichal Kalderon 
12922d22bc83SMichal Kalderon 		param_str[0] = 'a' + (u8)chip_rev;
12932d22bc83SMichal Kalderon 		param_str[1] = '0' + (u8)chip_metal;
12942d22bc83SMichal Kalderon 	}
12952d22bc83SMichal Kalderon 
12962d22bc83SMichal Kalderon 	return qed_dump_str_param(dump_buf, dump, "chip-revision", param_str);
12972d22bc83SMichal Kalderon }
12982d22bc83SMichal Kalderon 
1299c965db44STomer Tayar /* Writes a section header to the specified buffer.
1300c965db44STomer Tayar  * Returns the dumped size in dwords.
1301c965db44STomer Tayar  */
qed_dump_section_hdr(u32 * dump_buf,bool dump,const char * name,u32 num_params)1302c965db44STomer Tayar static u32 qed_dump_section_hdr(u32 *dump_buf,
1303c965db44STomer Tayar 				bool dump, const char *name, u32 num_params)
1304c965db44STomer Tayar {
1305c965db44STomer Tayar 	return qed_dump_num_param(dump_buf, dump, name, num_params);
1306c965db44STomer Tayar }
1307c965db44STomer Tayar 
1308c965db44STomer Tayar /* Writes the common global params to the specified buffer.
1309c965db44STomer Tayar  * Returns the dumped size in dwords.
1310c965db44STomer Tayar  */
qed_dump_common_global_params(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u8 num_specific_global_params)1311c965db44STomer Tayar static u32 qed_dump_common_global_params(struct qed_hwfn *p_hwfn,
1312c965db44STomer Tayar 					 struct qed_ptt *p_ptt,
1313c965db44STomer Tayar 					 u32 *dump_buf,
1314c965db44STomer Tayar 					 bool dump,
1315c965db44STomer Tayar 					 u8 num_specific_global_params)
1316c965db44STomer Tayar {
1317c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
1318c965db44STomer Tayar 	u32 offset = 0;
13197b6859fbSMintz, Yuval 	u8 num_params;
1320c965db44STomer Tayar 
13217b6859fbSMintz, Yuval 	/* Dump global params section header */
13222d22bc83SMichal Kalderon 	num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params +
13232d22bc83SMichal Kalderon 		(dev_data->chip_id == CHIP_BB ? 1 : 0);
1324c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
1325be086e7cSMintz, Yuval 				       dump, "global_params", num_params);
1326c965db44STomer Tayar 
1327c965db44STomer Tayar 	/* Store params */
1328c965db44STomer Tayar 	offset += qed_dump_fw_ver_param(p_hwfn, p_ptt, dump_buf + offset, dump);
1329c965db44STomer Tayar 	offset += qed_dump_mfw_ver_param(p_hwfn,
1330c965db44STomer Tayar 					 p_ptt, dump_buf + offset, dump);
13312d22bc83SMichal Kalderon 	offset += qed_dump_chip_revision_param(p_hwfn,
13322d22bc83SMichal Kalderon 					       p_ptt, dump_buf + offset, dump);
1333c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
1334c965db44STomer Tayar 				     dump, "tools-version", TOOLS_VERSION);
1335c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
1336c965db44STomer Tayar 				     dump,
1337c965db44STomer Tayar 				     "chip",
1338c965db44STomer Tayar 				     s_chip_defs[dev_data->chip_id].name);
1339c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
1340c965db44STomer Tayar 				     dump,
1341c965db44STomer Tayar 				     "platform",
13422d22bc83SMichal Kalderon 				     s_hw_type_defs[dev_data->hw_type].name);
13432d22bc83SMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
13442d22bc83SMichal Kalderon 				     dump, "pci-func", p_hwfn->abs_pf_id);
13456c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
13466c95dd8fSPrabhakar Kushwaha 				     dump, "epoch", qed_get_epoch_time());
13472d22bc83SMichal Kalderon 	if (dev_data->chip_id == CHIP_BB)
13482d22bc83SMichal Kalderon 		offset += qed_dump_num_param(dump_buf + offset,
13492d22bc83SMichal Kalderon 					     dump, "path", QED_PATH_ID(p_hwfn));
13507b6859fbSMintz, Yuval 
1351c965db44STomer Tayar 	return offset;
1352c965db44STomer Tayar }
1353c965db44STomer Tayar 
13547b6859fbSMintz, Yuval /* Writes the "last" section (including CRC) to the specified buffer at the
13557b6859fbSMintz, Yuval  * given offset. Returns the dumped size in dwords.
1356c965db44STomer Tayar  */
qed_dump_last_section(u32 * dump_buf,u32 offset,bool dump)1357da090917STomer Tayar static u32 qed_dump_last_section(u32 *dump_buf, u32 offset, bool dump)
1358c965db44STomer Tayar {
13597b6859fbSMintz, Yuval 	u32 start_offset = offset;
1360c965db44STomer Tayar 
1361c965db44STomer Tayar 	/* Dump CRC section header */
1362c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset, dump, "last", 0);
1363c965db44STomer Tayar 
13647b6859fbSMintz, Yuval 	/* Calculate CRC32 and add it to the dword after the "last" section */
1365c965db44STomer Tayar 	if (dump)
13667b6859fbSMintz, Yuval 		*(dump_buf + offset) = ~crc32(0xffffffff,
13677b6859fbSMintz, Yuval 					      (u8 *)dump_buf,
1368c965db44STomer Tayar 					      DWORDS_TO_BYTES(offset));
13697b6859fbSMintz, Yuval 
1370c965db44STomer Tayar 	offset++;
13717b6859fbSMintz, Yuval 
1372c965db44STomer Tayar 	return offset - start_offset;
1373c965db44STomer Tayar }
1374c965db44STomer Tayar 
1375c965db44STomer Tayar /* Update blocks reset state  */
qed_update_blocks_reset_state(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt)1376c965db44STomer Tayar static void qed_update_blocks_reset_state(struct qed_hwfn *p_hwfn,
1377c965db44STomer Tayar 					  struct qed_ptt *p_ptt)
1378c965db44STomer Tayar {
1379c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
13802d22bc83SMichal Kalderon 	u32 reg_val[NUM_DBG_RESET_REGS] = { 0 };
13812d22bc83SMichal Kalderon 	u8 rst_reg_id;
13822d22bc83SMichal Kalderon 	u32 blk_id;
1383c965db44STomer Tayar 
1384c965db44STomer Tayar 	/* Read reset registers */
13852d22bc83SMichal Kalderon 	for (rst_reg_id = 0; rst_reg_id < NUM_DBG_RESET_REGS; rst_reg_id++) {
13862d22bc83SMichal Kalderon 		const struct dbg_reset_reg *rst_reg;
13872d22bc83SMichal Kalderon 		bool rst_reg_removed;
13882d22bc83SMichal Kalderon 		u32 rst_reg_addr;
13892d22bc83SMichal Kalderon 
13902d22bc83SMichal Kalderon 		rst_reg = qed_get_dbg_reset_reg(p_hwfn, rst_reg_id);
13912d22bc83SMichal Kalderon 		rst_reg_removed = GET_FIELD(rst_reg->data,
13922d22bc83SMichal Kalderon 					    DBG_RESET_REG_IS_REMOVED);
13932d22bc83SMichal Kalderon 		rst_reg_addr = DWORDS_TO_BYTES(GET_FIELD(rst_reg->data,
13942d22bc83SMichal Kalderon 							 DBG_RESET_REG_ADDR));
13952d22bc83SMichal Kalderon 
13962d22bc83SMichal Kalderon 		if (!rst_reg_removed)
13972d22bc83SMichal Kalderon 			reg_val[rst_reg_id] = qed_rd(p_hwfn, p_ptt,
13982d22bc83SMichal Kalderon 						     rst_reg_addr);
13992d22bc83SMichal Kalderon 	}
1400c965db44STomer Tayar 
1401c965db44STomer Tayar 	/* Check if blocks are in reset */
14022d22bc83SMichal Kalderon 	for (blk_id = 0; blk_id < NUM_PHYS_BLOCKS; blk_id++) {
14032d22bc83SMichal Kalderon 		const struct dbg_block_chip *blk;
14042d22bc83SMichal Kalderon 		bool has_rst_reg;
14052d22bc83SMichal Kalderon 		bool is_removed;
14067b6859fbSMintz, Yuval 
14072d22bc83SMichal Kalderon 		blk = qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)blk_id);
14082d22bc83SMichal Kalderon 		is_removed = GET_FIELD(blk->flags, DBG_BLOCK_CHIP_IS_REMOVED);
14092d22bc83SMichal Kalderon 		has_rst_reg = GET_FIELD(blk->flags,
14102d22bc83SMichal Kalderon 					DBG_BLOCK_CHIP_HAS_RESET_REG);
14112d22bc83SMichal Kalderon 
14122d22bc83SMichal Kalderon 		if (!is_removed && has_rst_reg)
14132d22bc83SMichal Kalderon 			dev_data->block_in_reset[blk_id] =
14142d22bc83SMichal Kalderon 			    !(reg_val[blk->reset_reg_id] &
14152d22bc83SMichal Kalderon 			      BIT(blk->reset_reg_bit_offset));
14167b6859fbSMintz, Yuval 	}
1417c965db44STomer Tayar }
1418c965db44STomer Tayar 
14192d22bc83SMichal Kalderon /* is_mode_match recursive function */
qed_is_mode_match_rec(struct qed_hwfn * p_hwfn,u16 * modes_buf_offset,u8 rec_depth)14202d22bc83SMichal Kalderon static bool qed_is_mode_match_rec(struct qed_hwfn *p_hwfn,
14212d22bc83SMichal Kalderon 				  u16 *modes_buf_offset, u8 rec_depth)
14222d22bc83SMichal Kalderon {
14232d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
14242d22bc83SMichal Kalderon 	u8 *dbg_array;
14252d22bc83SMichal Kalderon 	bool arg1, arg2;
14262d22bc83SMichal Kalderon 	u8 tree_val;
14272d22bc83SMichal Kalderon 
14282d22bc83SMichal Kalderon 	if (rec_depth > MAX_RECURSION_DEPTH) {
14292d22bc83SMichal Kalderon 		DP_NOTICE(p_hwfn,
14302d22bc83SMichal Kalderon 			  "Unexpected error: is_mode_match_rec exceeded the max recursion depth. This is probably due to a corrupt init/debug buffer.\n");
14312d22bc83SMichal Kalderon 		return false;
14322d22bc83SMichal Kalderon 	}
14332d22bc83SMichal Kalderon 
14342d22bc83SMichal Kalderon 	/* Get next element from modes tree buffer */
14352d22bc83SMichal Kalderon 	dbg_array = p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr;
14362d22bc83SMichal Kalderon 	tree_val = dbg_array[(*modes_buf_offset)++];
14372d22bc83SMichal Kalderon 
14382d22bc83SMichal Kalderon 	switch (tree_val) {
14392d22bc83SMichal Kalderon 	case INIT_MODE_OP_NOT:
14402d22bc83SMichal Kalderon 		return !qed_is_mode_match_rec(p_hwfn,
14412d22bc83SMichal Kalderon 					      modes_buf_offset, rec_depth + 1);
14422d22bc83SMichal Kalderon 	case INIT_MODE_OP_OR:
14432d22bc83SMichal Kalderon 	case INIT_MODE_OP_AND:
14442d22bc83SMichal Kalderon 		arg1 = qed_is_mode_match_rec(p_hwfn,
14452d22bc83SMichal Kalderon 					     modes_buf_offset, rec_depth + 1);
14462d22bc83SMichal Kalderon 		arg2 = qed_is_mode_match_rec(p_hwfn,
14472d22bc83SMichal Kalderon 					     modes_buf_offset, rec_depth + 1);
14482d22bc83SMichal Kalderon 		return (tree_val == INIT_MODE_OP_OR) ? (arg1 ||
14492d22bc83SMichal Kalderon 							arg2) : (arg1 && arg2);
14502d22bc83SMichal Kalderon 	default:
14512d22bc83SMichal Kalderon 		return dev_data->mode_enable[tree_val - MAX_INIT_MODE_OPS] > 0;
14522d22bc83SMichal Kalderon 	}
14532d22bc83SMichal Kalderon }
14542d22bc83SMichal Kalderon 
14552d22bc83SMichal Kalderon /* Returns true if the mode (specified using modes_buf_offset) is enabled */
qed_is_mode_match(struct qed_hwfn * p_hwfn,u16 * modes_buf_offset)14562d22bc83SMichal Kalderon static bool qed_is_mode_match(struct qed_hwfn *p_hwfn, u16 *modes_buf_offset)
14572d22bc83SMichal Kalderon {
14582d22bc83SMichal Kalderon 	return qed_is_mode_match_rec(p_hwfn, modes_buf_offset, 0);
14592d22bc83SMichal Kalderon }
14602d22bc83SMichal Kalderon 
1461c965db44STomer Tayar /* Enable / disable the Debug block */
qed_bus_enable_dbg_block(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,bool enable)1462c965db44STomer Tayar static void qed_bus_enable_dbg_block(struct qed_hwfn *p_hwfn,
1463c965db44STomer Tayar 				     struct qed_ptt *p_ptt, bool enable)
1464c965db44STomer Tayar {
1465c965db44STomer Tayar 	qed_wr(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON, enable ? 1 : 0);
1466c965db44STomer Tayar }
1467c965db44STomer Tayar 
1468c965db44STomer Tayar /* Resets the Debug block */
qed_bus_reset_dbg_block(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt)1469c965db44STomer Tayar static void qed_bus_reset_dbg_block(struct qed_hwfn *p_hwfn,
1470c965db44STomer Tayar 				    struct qed_ptt *p_ptt)
1471c965db44STomer Tayar {
14722d22bc83SMichal Kalderon 	u32 reset_reg_addr, old_reset_reg_val, new_reset_reg_val;
14732d22bc83SMichal Kalderon 	const struct dbg_reset_reg *reset_reg;
14742d22bc83SMichal Kalderon 	const struct dbg_block_chip *block;
1475c965db44STomer Tayar 
14762d22bc83SMichal Kalderon 	block = qed_get_dbg_block_per_chip(p_hwfn, BLOCK_DBG);
14772d22bc83SMichal Kalderon 	reset_reg = qed_get_dbg_reset_reg(p_hwfn, block->reset_reg_id);
14782d22bc83SMichal Kalderon 	reset_reg_addr =
14792d22bc83SMichal Kalderon 	    DWORDS_TO_BYTES(GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR));
14802d22bc83SMichal Kalderon 
14812d22bc83SMichal Kalderon 	old_reset_reg_val = qed_rd(p_hwfn, p_ptt, reset_reg_addr);
14827b6859fbSMintz, Yuval 	new_reset_reg_val =
14832d22bc83SMichal Kalderon 	    old_reset_reg_val & ~BIT(block->reset_reg_bit_offset);
1484c965db44STomer Tayar 
14852d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, reset_reg_addr, new_reset_reg_val);
14862d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, reset_reg_addr, old_reset_reg_val);
1487c965db44STomer Tayar }
1488c965db44STomer Tayar 
14897b6859fbSMintz, Yuval /* Enable / disable Debug Bus clients according to the specified mask
14907b6859fbSMintz, Yuval  * (1 = enable, 0 = disable).
1491c965db44STomer Tayar  */
qed_bus_enable_clients(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 client_mask)1492c965db44STomer Tayar static void qed_bus_enable_clients(struct qed_hwfn *p_hwfn,
1493c965db44STomer Tayar 				   struct qed_ptt *p_ptt, u32 client_mask)
1494c965db44STomer Tayar {
1495c965db44STomer Tayar 	qed_wr(p_hwfn, p_ptt, DBG_REG_CLIENT_ENABLE, client_mask);
1496c965db44STomer Tayar }
1497c965db44STomer Tayar 
qed_bus_config_dbg_line(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,enum block_id block_id,u8 line_id,u8 enable_mask,u8 right_shift,u8 force_valid_mask,u8 force_frame_mask)14982d22bc83SMichal Kalderon static void qed_bus_config_dbg_line(struct qed_hwfn *p_hwfn,
14992d22bc83SMichal Kalderon 				    struct qed_ptt *p_ptt,
15002d22bc83SMichal Kalderon 				    enum block_id block_id,
15012d22bc83SMichal Kalderon 				    u8 line_id,
15022d22bc83SMichal Kalderon 				    u8 enable_mask,
15032d22bc83SMichal Kalderon 				    u8 right_shift,
15042d22bc83SMichal Kalderon 				    u8 force_valid_mask, u8 force_frame_mask)
15052d22bc83SMichal Kalderon {
15062d22bc83SMichal Kalderon 	const struct dbg_block_chip *block =
15072d22bc83SMichal Kalderon 		qed_get_dbg_block_per_chip(p_hwfn, block_id);
15082d22bc83SMichal Kalderon 
15092d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_select_reg_addr),
15102d22bc83SMichal Kalderon 	       line_id);
15112d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_dword_enable_reg_addr),
15122d22bc83SMichal Kalderon 	       enable_mask);
15132d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_shift_reg_addr),
15142d22bc83SMichal Kalderon 	       right_shift);
15152d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_valid_reg_addr),
15162d22bc83SMichal Kalderon 	       force_valid_mask);
15172d22bc83SMichal Kalderon 	qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_frame_reg_addr),
15182d22bc83SMichal Kalderon 	       force_frame_mask);
15192d22bc83SMichal Kalderon }
15202d22bc83SMichal Kalderon 
15212d22bc83SMichal Kalderon /* Disable debug bus in all blocks */
qed_bus_disable_blocks(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt)15222d22bc83SMichal Kalderon static void qed_bus_disable_blocks(struct qed_hwfn *p_hwfn,
15232d22bc83SMichal Kalderon 				   struct qed_ptt *p_ptt)
1524c965db44STomer Tayar {
1525c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
15262d22bc83SMichal Kalderon 	u32 block_id;
15277b6859fbSMintz, Yuval 
15282d22bc83SMichal Kalderon 	/* Disable all blocks */
15292d22bc83SMichal Kalderon 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
15302d22bc83SMichal Kalderon 		const struct dbg_block_chip *block_per_chip =
15312d22bc83SMichal Kalderon 		    qed_get_dbg_block_per_chip(p_hwfn,
15322d22bc83SMichal Kalderon 					       (enum block_id)block_id);
1533c965db44STomer Tayar 
15342d22bc83SMichal Kalderon 		if (GET_FIELD(block_per_chip->flags,
15352d22bc83SMichal Kalderon 			      DBG_BLOCK_CHIP_IS_REMOVED) ||
15362d22bc83SMichal Kalderon 		    dev_data->block_in_reset[block_id])
15372d22bc83SMichal Kalderon 			continue;
15382d22bc83SMichal Kalderon 
15392d22bc83SMichal Kalderon 		/* Disable debug bus */
15402d22bc83SMichal Kalderon 		if (GET_FIELD(block_per_chip->flags,
15412d22bc83SMichal Kalderon 			      DBG_BLOCK_CHIP_HAS_DBG_BUS)) {
15422d22bc83SMichal Kalderon 			u32 dbg_en_addr =
15432d22bc83SMichal Kalderon 				block_per_chip->dbg_dword_enable_reg_addr;
15442d22bc83SMichal Kalderon 			u16 modes_buf_offset =
15452d22bc83SMichal Kalderon 			    GET_FIELD(block_per_chip->dbg_bus_mode.data,
15462d22bc83SMichal Kalderon 				      DBG_MODE_HDR_MODES_BUF_OFFSET);
15472d22bc83SMichal Kalderon 			bool eval_mode =
15482d22bc83SMichal Kalderon 			    GET_FIELD(block_per_chip->dbg_bus_mode.data,
15492d22bc83SMichal Kalderon 				      DBG_MODE_HDR_EVAL_MODE) > 0;
15502d22bc83SMichal Kalderon 
15512d22bc83SMichal Kalderon 			if (!eval_mode ||
15522d22bc83SMichal Kalderon 			    qed_is_mode_match(p_hwfn, &modes_buf_offset))
15532d22bc83SMichal Kalderon 				qed_wr(p_hwfn, p_ptt,
15542d22bc83SMichal Kalderon 				       DWORDS_TO_BYTES(dbg_en_addr),
15552d22bc83SMichal Kalderon 				       0);
15562d22bc83SMichal Kalderon 		}
1557c965db44STomer Tayar 	}
1558c965db44STomer Tayar }
1559c965db44STomer Tayar 
1560c965db44STomer Tayar /* Returns true if the specified entity (indicated by GRC param) should be
1561c965db44STomer Tayar  * included in the dump, false otherwise.
1562c965db44STomer Tayar  */
qed_grc_is_included(struct qed_hwfn * p_hwfn,enum dbg_grc_params grc_param)1563c965db44STomer Tayar static bool qed_grc_is_included(struct qed_hwfn *p_hwfn,
1564c965db44STomer Tayar 				enum dbg_grc_params grc_param)
1565c965db44STomer Tayar {
1566c965db44STomer Tayar 	return qed_grc_get_param(p_hwfn, grc_param) > 0;
1567c965db44STomer Tayar }
1568c965db44STomer Tayar 
15692d22bc83SMichal Kalderon /* Returns the storm_id that matches the specified Storm letter,
15702d22bc83SMichal Kalderon  * or MAX_DBG_STORMS if invalid storm letter.
15712d22bc83SMichal Kalderon  */
qed_get_id_from_letter(char storm_letter)15722d22bc83SMichal Kalderon static enum dbg_storms qed_get_id_from_letter(char storm_letter)
15732d22bc83SMichal Kalderon {
15742d22bc83SMichal Kalderon 	u8 storm_id;
15752d22bc83SMichal Kalderon 
15762d22bc83SMichal Kalderon 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++)
15772d22bc83SMichal Kalderon 		if (s_storm_defs[storm_id].letter == storm_letter)
15782d22bc83SMichal Kalderon 			return (enum dbg_storms)storm_id;
15792d22bc83SMichal Kalderon 
15802d22bc83SMichal Kalderon 	return MAX_DBG_STORMS;
15812d22bc83SMichal Kalderon }
15822d22bc83SMichal Kalderon 
1583c965db44STomer Tayar /* Returns true of the specified Storm should be included in the dump, false
1584c965db44STomer Tayar  * otherwise.
1585c965db44STomer Tayar  */
qed_grc_is_storm_included(struct qed_hwfn * p_hwfn,enum dbg_storms storm)1586c965db44STomer Tayar static bool qed_grc_is_storm_included(struct qed_hwfn *p_hwfn,
1587c965db44STomer Tayar 				      enum dbg_storms storm)
1588c965db44STomer Tayar {
1589c965db44STomer Tayar 	return qed_grc_get_param(p_hwfn, (enum dbg_grc_params)storm) > 0;
1590c965db44STomer Tayar }
1591c965db44STomer Tayar 
1592c965db44STomer Tayar /* Returns true if the specified memory should be included in the dump, false
1593c965db44STomer Tayar  * otherwise.
1594c965db44STomer Tayar  */
qed_grc_is_mem_included(struct qed_hwfn * p_hwfn,enum block_id block_id,u8 mem_group_id)1595c965db44STomer Tayar static bool qed_grc_is_mem_included(struct qed_hwfn *p_hwfn,
1596c965db44STomer Tayar 				    enum block_id block_id, u8 mem_group_id)
1597c965db44STomer Tayar {
15982d22bc83SMichal Kalderon 	const struct dbg_block *block;
1599c965db44STomer Tayar 	u8 i;
1600c965db44STomer Tayar 
16012d22bc83SMichal Kalderon 	block = get_dbg_block(p_hwfn, block_id);
16022d22bc83SMichal Kalderon 
16032d22bc83SMichal Kalderon 	/* If the block is associated with a Storm, check Storm match */
16042d22bc83SMichal Kalderon 	if (block->associated_storm_letter) {
16052d22bc83SMichal Kalderon 		enum dbg_storms associated_storm_id =
16062d22bc83SMichal Kalderon 		    qed_get_id_from_letter(block->associated_storm_letter);
16072d22bc83SMichal Kalderon 
16082d22bc83SMichal Kalderon 		if (associated_storm_id == MAX_DBG_STORMS ||
16092d22bc83SMichal Kalderon 		    !qed_grc_is_storm_included(p_hwfn, associated_storm_id))
1610c965db44STomer Tayar 			return false;
16112d22bc83SMichal Kalderon 	}
1612c965db44STomer Tayar 
16137b6859fbSMintz, Yuval 	for (i = 0; i < NUM_BIG_RAM_TYPES; i++) {
16147b6859fbSMintz, Yuval 		struct big_ram_defs *big_ram = &s_big_ram_defs[i];
1615c965db44STomer Tayar 
16167b6859fbSMintz, Yuval 		if (mem_group_id == big_ram->mem_group_id ||
16177b6859fbSMintz, Yuval 		    mem_group_id == big_ram->ram_mem_group_id)
16187b6859fbSMintz, Yuval 			return qed_grc_is_included(p_hwfn, big_ram->grc_param);
16197b6859fbSMintz, Yuval 	}
16207b6859fbSMintz, Yuval 
16217b6859fbSMintz, Yuval 	switch (mem_group_id) {
16227b6859fbSMintz, Yuval 	case MEM_GROUP_PXP_ILT:
16237b6859fbSMintz, Yuval 	case MEM_GROUP_PXP_MEM:
16247b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PXP);
16257b6859fbSMintz, Yuval 	case MEM_GROUP_RAM:
16267b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RAM);
16277b6859fbSMintz, Yuval 	case MEM_GROUP_PBUF:
16287b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PBUF);
16297b6859fbSMintz, Yuval 	case MEM_GROUP_CAU_MEM:
16307b6859fbSMintz, Yuval 	case MEM_GROUP_CAU_SB:
16317b6859fbSMintz, Yuval 	case MEM_GROUP_CAU_PI:
16327b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU);
16332d22bc83SMichal Kalderon 	case MEM_GROUP_CAU_MEM_EXT:
16342d22bc83SMichal Kalderon 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU_EXT);
16357b6859fbSMintz, Yuval 	case MEM_GROUP_QM_MEM:
16367b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_QM);
16377b6859fbSMintz, Yuval 	case MEM_GROUP_CFC_MEM:
16387b6859fbSMintz, Yuval 	case MEM_GROUP_CONN_CFC_MEM:
16397b6859fbSMintz, Yuval 	case MEM_GROUP_TASK_CFC_MEM:
1640da090917STomer Tayar 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CFC) ||
1641da090917STomer Tayar 		       qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX);
16422d22bc83SMichal Kalderon 	case MEM_GROUP_DORQ_MEM:
16432d22bc83SMichal Kalderon 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DORQ);
16447b6859fbSMintz, Yuval 	case MEM_GROUP_IGU_MEM:
16457b6859fbSMintz, Yuval 	case MEM_GROUP_IGU_MSIX:
16467b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IGU);
16477b6859fbSMintz, Yuval 	case MEM_GROUP_MULD_MEM:
16487b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MULD);
16497b6859fbSMintz, Yuval 	case MEM_GROUP_PRS_MEM:
16507b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PRS);
16517b6859fbSMintz, Yuval 	case MEM_GROUP_DMAE_MEM:
16527b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DMAE);
16537b6859fbSMintz, Yuval 	case MEM_GROUP_TM_MEM:
16547b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_TM);
16557b6859fbSMintz, Yuval 	case MEM_GROUP_SDM_MEM:
16567b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_SDM);
16577b6859fbSMintz, Yuval 	case MEM_GROUP_TDIF_CTX:
16587b6859fbSMintz, Yuval 	case MEM_GROUP_RDIF_CTX:
16597b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DIF);
16607b6859fbSMintz, Yuval 	case MEM_GROUP_CM_MEM:
16617b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM);
16627b6859fbSMintz, Yuval 	case MEM_GROUP_IOR:
16637b6859fbSMintz, Yuval 		return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR);
16647b6859fbSMintz, Yuval 	default:
1665c965db44STomer Tayar 		return true;
1666c965db44STomer Tayar 	}
16677b6859fbSMintz, Yuval }
1668c965db44STomer Tayar 
1669c965db44STomer Tayar /* Stalls all Storms */
qed_grc_stall_storms(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,bool stall)1670c965db44STomer Tayar static void qed_grc_stall_storms(struct qed_hwfn *p_hwfn,
1671c965db44STomer Tayar 				 struct qed_ptt *p_ptt, bool stall)
1672c965db44STomer Tayar {
16737b6859fbSMintz, Yuval 	u32 reg_addr;
1674c965db44STomer Tayar 	u8 storm_id;
1675c965db44STomer Tayar 
1676c965db44STomer Tayar 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
16777b6859fbSMintz, Yuval 		if (!qed_grc_is_storm_included(p_hwfn,
16787b6859fbSMintz, Yuval 					       (enum dbg_storms)storm_id))
16797b6859fbSMintz, Yuval 			continue;
1680c965db44STomer Tayar 
16817b6859fbSMintz, Yuval 		reg_addr = s_storm_defs[storm_id].sem_fast_mem_addr +
16826c95dd8fSPrabhakar Kushwaha 		    SEM_FAST_REG_STALL_0;
16837b6859fbSMintz, Yuval 		qed_wr(p_hwfn, p_ptt, reg_addr, stall ? 1 : 0);
1684c965db44STomer Tayar 	}
1685c965db44STomer Tayar 
1686c965db44STomer Tayar 	msleep(STALL_DELAY_MS);
1687c965db44STomer Tayar }
1688c965db44STomer Tayar 
16892d22bc83SMichal Kalderon /* Takes all blocks out of reset. If rbc_only is true, only RBC clients are
16902d22bc83SMichal Kalderon  * taken out of reset.
16912d22bc83SMichal Kalderon  */
qed_grc_unreset_blocks(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,bool rbc_only)1692c965db44STomer Tayar static void qed_grc_unreset_blocks(struct qed_hwfn *p_hwfn,
16932d22bc83SMichal Kalderon 				   struct qed_ptt *p_ptt, bool rbc_only)
1694c965db44STomer Tayar {
1695c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
16962d22bc83SMichal Kalderon 	u8 chip_id = dev_data->chip_id;
16972d22bc83SMichal Kalderon 	u32 i;
16982d22bc83SMichal Kalderon 
16992d22bc83SMichal Kalderon 	/* Take RBCs out of reset */
17002d22bc83SMichal Kalderon 	for (i = 0; i < ARRAY_SIZE(s_rbc_reset_defs); i++)
17012d22bc83SMichal Kalderon 		if (s_rbc_reset_defs[i].reset_val[dev_data->chip_id])
17022d22bc83SMichal Kalderon 			qed_wr(p_hwfn,
17032d22bc83SMichal Kalderon 			       p_ptt,
17042d22bc83SMichal Kalderon 			       s_rbc_reset_defs[i].reset_reg_addr +
17052d22bc83SMichal Kalderon 			       RESET_REG_UNRESET_OFFSET,
17062d22bc83SMichal Kalderon 			       s_rbc_reset_defs[i].reset_val[chip_id]);
17072d22bc83SMichal Kalderon 
17082d22bc83SMichal Kalderon 	if (!rbc_only) {
17092d22bc83SMichal Kalderon 		u32 reg_val[NUM_DBG_RESET_REGS] = { 0 };
17102d22bc83SMichal Kalderon 		u8 reset_reg_id;
17112d22bc83SMichal Kalderon 		u32 block_id;
1712c965db44STomer Tayar 
1713c965db44STomer Tayar 		/* Fill reset regs values */
17142d22bc83SMichal Kalderon 		for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
17152d22bc83SMichal Kalderon 			bool is_removed, has_reset_reg, unreset_before_dump;
17162d22bc83SMichal Kalderon 			const struct dbg_block_chip *block;
17177b6859fbSMintz, Yuval 
17182d22bc83SMichal Kalderon 			block = qed_get_dbg_block_per_chip(p_hwfn,
17192d22bc83SMichal Kalderon 							   (enum block_id)
17202d22bc83SMichal Kalderon 							   block_id);
17212d22bc83SMichal Kalderon 			is_removed =
17222d22bc83SMichal Kalderon 			    GET_FIELD(block->flags, DBG_BLOCK_CHIP_IS_REMOVED);
17232d22bc83SMichal Kalderon 			has_reset_reg =
17242d22bc83SMichal Kalderon 			    GET_FIELD(block->flags,
17252d22bc83SMichal Kalderon 				      DBG_BLOCK_CHIP_HAS_RESET_REG);
17262d22bc83SMichal Kalderon 			unreset_before_dump =
17272d22bc83SMichal Kalderon 			    GET_FIELD(block->flags,
17282d22bc83SMichal Kalderon 				      DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP);
17292d22bc83SMichal Kalderon 
17302d22bc83SMichal Kalderon 			if (!is_removed && has_reset_reg && unreset_before_dump)
17312d22bc83SMichal Kalderon 				reg_val[block->reset_reg_id] |=
17322d22bc83SMichal Kalderon 				    BIT(block->reset_reg_bit_offset);
17337b6859fbSMintz, Yuval 		}
1734c965db44STomer Tayar 
1735c965db44STomer Tayar 		/* Write reset registers */
17362d22bc83SMichal Kalderon 		for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS;
17372d22bc83SMichal Kalderon 		     reset_reg_id++) {
17382d22bc83SMichal Kalderon 			const struct dbg_reset_reg *reset_reg;
17392d22bc83SMichal Kalderon 			u32 reset_reg_addr;
17402d22bc83SMichal Kalderon 
17412d22bc83SMichal Kalderon 			reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id);
17422d22bc83SMichal Kalderon 
17432d22bc83SMichal Kalderon 			if (GET_FIELD
17442d22bc83SMichal Kalderon 			    (reset_reg->data, DBG_RESET_REG_IS_REMOVED))
17457b6859fbSMintz, Yuval 				continue;
17467b6859fbSMintz, Yuval 
17472d22bc83SMichal Kalderon 			if (reg_val[reset_reg_id]) {
17482d22bc83SMichal Kalderon 				reset_reg_addr =
17492d22bc83SMichal Kalderon 				    GET_FIELD(reset_reg->data,
17502d22bc83SMichal Kalderon 					      DBG_RESET_REG_ADDR);
1751c965db44STomer Tayar 				qed_wr(p_hwfn,
1752c965db44STomer Tayar 				       p_ptt,
17532d22bc83SMichal Kalderon 				       DWORDS_TO_BYTES(reset_reg_addr) +
17542d22bc83SMichal Kalderon 				       RESET_REG_UNRESET_OFFSET,
17552d22bc83SMichal Kalderon 				       reg_val[reset_reg_id]);
17562d22bc83SMichal Kalderon 			}
17572d22bc83SMichal Kalderon 		}
1758c965db44STomer Tayar 	}
1759c965db44STomer Tayar }
1760c965db44STomer Tayar 
1761be086e7cSMintz, Yuval /* Returns the attention block data of the specified block */
1762c965db44STomer Tayar static const struct dbg_attn_block_type_data *
qed_get_block_attn_data(struct qed_hwfn * p_hwfn,enum block_id block_id,enum dbg_attn_type attn_type)17632d22bc83SMichal Kalderon qed_get_block_attn_data(struct qed_hwfn *p_hwfn,
17642d22bc83SMichal Kalderon 			enum block_id block_id, enum dbg_attn_type attn_type)
1765c965db44STomer Tayar {
1766c965db44STomer Tayar 	const struct dbg_attn_block *base_attn_block_arr =
1767c965db44STomer Tayar 	    (const struct dbg_attn_block *)
17682d22bc83SMichal Kalderon 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr;
1769c965db44STomer Tayar 
1770c965db44STomer Tayar 	return &base_attn_block_arr[block_id].per_type_data[attn_type];
1771c965db44STomer Tayar }
1772c965db44STomer Tayar 
1773c965db44STomer Tayar /* Returns the attention registers of the specified block */
1774c965db44STomer Tayar static const struct dbg_attn_reg *
qed_get_block_attn_regs(struct qed_hwfn * p_hwfn,enum block_id block_id,enum dbg_attn_type attn_type,u8 * num_attn_regs)17752d22bc83SMichal Kalderon qed_get_block_attn_regs(struct qed_hwfn *p_hwfn,
17762d22bc83SMichal Kalderon 			enum block_id block_id, enum dbg_attn_type attn_type,
1777c965db44STomer Tayar 			u8 *num_attn_regs)
1778c965db44STomer Tayar {
1779c965db44STomer Tayar 	const struct dbg_attn_block_type_data *block_type_data =
17802d22bc83SMichal Kalderon 	    qed_get_block_attn_data(p_hwfn, block_id, attn_type);
1781c965db44STomer Tayar 
1782c965db44STomer Tayar 	*num_attn_regs = block_type_data->num_regs;
17837b6859fbSMintz, Yuval 
17842d22bc83SMichal Kalderon 	return (const struct dbg_attn_reg *)
17852d22bc83SMichal Kalderon 		p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr +
17862d22bc83SMichal Kalderon 		block_type_data->regs_offset;
1787c965db44STomer Tayar }
1788c965db44STomer Tayar 
1789c965db44STomer Tayar /* For each block, clear the status of all parities */
qed_grc_clear_all_prty(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt)1790c965db44STomer Tayar static void qed_grc_clear_all_prty(struct qed_hwfn *p_hwfn,
1791c965db44STomer Tayar 				   struct qed_ptt *p_ptt)
1792c965db44STomer Tayar {
1793c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
17947b6859fbSMintz, Yuval 	const struct dbg_attn_reg *attn_reg_arr;
17956c95dd8fSPrabhakar Kushwaha 	u32 block_id, sts_clr_address;
1796c965db44STomer Tayar 	u8 reg_idx, num_attn_regs;
1797c965db44STomer Tayar 
17982d22bc83SMichal Kalderon 	for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
1799c965db44STomer Tayar 		if (dev_data->block_in_reset[block_id])
1800c965db44STomer Tayar 			continue;
1801c965db44STomer Tayar 
18022d22bc83SMichal Kalderon 		attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
18032d22bc83SMichal Kalderon 						       (enum block_id)block_id,
1804c965db44STomer Tayar 						       ATTN_TYPE_PARITY,
1805c965db44STomer Tayar 						       &num_attn_regs);
18067b6859fbSMintz, Yuval 
1807c965db44STomer Tayar 		for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
1808c965db44STomer Tayar 			const struct dbg_attn_reg *reg_data =
1809c965db44STomer Tayar 				&attn_reg_arr[reg_idx];
18107b6859fbSMintz, Yuval 			u16 modes_buf_offset;
18117b6859fbSMintz, Yuval 			bool eval_mode;
1812c965db44STomer Tayar 
1813c965db44STomer Tayar 			/* Check mode */
18147b6859fbSMintz, Yuval 			eval_mode = GET_FIELD(reg_data->mode.data,
1815c965db44STomer Tayar 					      DBG_MODE_HDR_EVAL_MODE) > 0;
18167b6859fbSMintz, Yuval 			modes_buf_offset =
1817c965db44STomer Tayar 				GET_FIELD(reg_data->mode.data,
1818c965db44STomer Tayar 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
1819c965db44STomer Tayar 
18206c95dd8fSPrabhakar Kushwaha 			sts_clr_address = reg_data->sts_clr_address;
18217b6859fbSMintz, Yuval 			/* If Mode match: clear parity status */
1822c965db44STomer Tayar 			if (!eval_mode ||
1823c965db44STomer Tayar 			    qed_is_mode_match(p_hwfn, &modes_buf_offset))
1824c965db44STomer Tayar 				qed_rd(p_hwfn, p_ptt,
18256c95dd8fSPrabhakar Kushwaha 				       DWORDS_TO_BYTES(sts_clr_address));
1826c965db44STomer Tayar 		}
1827c965db44STomer Tayar 	}
1828c965db44STomer Tayar }
1829c965db44STomer Tayar 
18306c95dd8fSPrabhakar Kushwaha /* Finds the meta data image in NVRAM */
qed_find_nvram_image(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 image_type,u32 * nvram_offset_bytes,u32 * nvram_size_bytes,bool b_can_sleep)18316c95dd8fSPrabhakar Kushwaha static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn,
18326c95dd8fSPrabhakar Kushwaha 					    struct qed_ptt *p_ptt,
18336c95dd8fSPrabhakar Kushwaha 					    u32 image_type,
18346c95dd8fSPrabhakar Kushwaha 					    u32 *nvram_offset_bytes,
1835*5401c3e0SCaleb Sander 					    u32 *nvram_size_bytes,
1836*5401c3e0SCaleb Sander 					    bool b_can_sleep)
18376c95dd8fSPrabhakar Kushwaha {
18386c95dd8fSPrabhakar Kushwaha 	u32 ret_mcp_resp, ret_mcp_param, ret_txn_size;
18396c95dd8fSPrabhakar Kushwaha 	struct mcp_file_att file_att;
18406c95dd8fSPrabhakar Kushwaha 	int nvm_result;
18416c95dd8fSPrabhakar Kushwaha 
18426c95dd8fSPrabhakar Kushwaha 	/* Call NVRAM get file command */
18436c95dd8fSPrabhakar Kushwaha 	nvm_result = qed_mcp_nvm_rd_cmd(p_hwfn,
18446c95dd8fSPrabhakar Kushwaha 					p_ptt,
18456c95dd8fSPrabhakar Kushwaha 					DRV_MSG_CODE_NVM_GET_FILE_ATT,
18466c95dd8fSPrabhakar Kushwaha 					image_type,
18476c95dd8fSPrabhakar Kushwaha 					&ret_mcp_resp,
18486c95dd8fSPrabhakar Kushwaha 					&ret_mcp_param,
18496c95dd8fSPrabhakar Kushwaha 					&ret_txn_size,
1850*5401c3e0SCaleb Sander 					(u32 *)&file_att,
1851*5401c3e0SCaleb Sander 					b_can_sleep);
18526c95dd8fSPrabhakar Kushwaha 
18536c95dd8fSPrabhakar Kushwaha 	/* Check response */
18546c95dd8fSPrabhakar Kushwaha 	if (nvm_result || (ret_mcp_resp & FW_MSG_CODE_MASK) !=
18556c95dd8fSPrabhakar Kushwaha 	    FW_MSG_CODE_NVM_OK)
18566c95dd8fSPrabhakar Kushwaha 		return DBG_STATUS_NVRAM_GET_IMAGE_FAILED;
18576c95dd8fSPrabhakar Kushwaha 
18586c95dd8fSPrabhakar Kushwaha 	/* Update return values */
18596c95dd8fSPrabhakar Kushwaha 	*nvram_offset_bytes = file_att.nvm_start_addr;
18606c95dd8fSPrabhakar Kushwaha 	*nvram_size_bytes = file_att.len;
18616c95dd8fSPrabhakar Kushwaha 
18626c95dd8fSPrabhakar Kushwaha 	DP_VERBOSE(p_hwfn,
18636c95dd8fSPrabhakar Kushwaha 		   QED_MSG_DEBUG,
18646c95dd8fSPrabhakar Kushwaha 		   "find_nvram_image: found NVRAM image of type %d in NVRAM offset %d bytes with size %d bytes\n",
18656c95dd8fSPrabhakar Kushwaha 		   image_type, *nvram_offset_bytes, *nvram_size_bytes);
18666c95dd8fSPrabhakar Kushwaha 
18676c95dd8fSPrabhakar Kushwaha 	/* Check alignment */
18686c95dd8fSPrabhakar Kushwaha 	if (*nvram_size_bytes & 0x3)
18696c95dd8fSPrabhakar Kushwaha 		return DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE;
18706c95dd8fSPrabhakar Kushwaha 
18716c95dd8fSPrabhakar Kushwaha 	return DBG_STATUS_OK;
18726c95dd8fSPrabhakar Kushwaha }
18736c95dd8fSPrabhakar Kushwaha 
18746c95dd8fSPrabhakar Kushwaha /* Reads data from NVRAM */
qed_nvram_read(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 nvram_offset_bytes,u32 nvram_size_bytes,u32 * ret_buf,bool b_can_sleep)18756c95dd8fSPrabhakar Kushwaha static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn,
18766c95dd8fSPrabhakar Kushwaha 				      struct qed_ptt *p_ptt,
18776c95dd8fSPrabhakar Kushwaha 				      u32 nvram_offset_bytes,
1878*5401c3e0SCaleb Sander 				      u32 nvram_size_bytes,
1879*5401c3e0SCaleb Sander 				      u32 *ret_buf,
1880*5401c3e0SCaleb Sander 				      bool b_can_sleep)
18816c95dd8fSPrabhakar Kushwaha {
18826c95dd8fSPrabhakar Kushwaha 	u32 ret_mcp_resp, ret_mcp_param, ret_read_size, bytes_to_copy;
18836c95dd8fSPrabhakar Kushwaha 	s32 bytes_left = nvram_size_bytes;
18846c95dd8fSPrabhakar Kushwaha 	u32 read_offset = 0, param = 0;
18856c95dd8fSPrabhakar Kushwaha 
18866c95dd8fSPrabhakar Kushwaha 	DP_VERBOSE(p_hwfn,
18876c95dd8fSPrabhakar Kushwaha 		   QED_MSG_DEBUG,
18886c95dd8fSPrabhakar Kushwaha 		   "nvram_read: reading image of size %d bytes from NVRAM\n",
18896c95dd8fSPrabhakar Kushwaha 		   nvram_size_bytes);
18906c95dd8fSPrabhakar Kushwaha 
18916c95dd8fSPrabhakar Kushwaha 	do {
18926c95dd8fSPrabhakar Kushwaha 		bytes_to_copy =
18936c95dd8fSPrabhakar Kushwaha 		    (bytes_left >
18946c95dd8fSPrabhakar Kushwaha 		     MCP_DRV_NVM_BUF_LEN) ? MCP_DRV_NVM_BUF_LEN : bytes_left;
18956c95dd8fSPrabhakar Kushwaha 
18966c95dd8fSPrabhakar Kushwaha 		/* Call NVRAM read command */
18976c95dd8fSPrabhakar Kushwaha 		SET_MFW_FIELD(param,
18986c95dd8fSPrabhakar Kushwaha 			      DRV_MB_PARAM_NVM_OFFSET,
18996c95dd8fSPrabhakar Kushwaha 			      nvram_offset_bytes + read_offset);
19006c95dd8fSPrabhakar Kushwaha 		SET_MFW_FIELD(param, DRV_MB_PARAM_NVM_LEN, bytes_to_copy);
19016c95dd8fSPrabhakar Kushwaha 		if (qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt,
19026c95dd8fSPrabhakar Kushwaha 				       DRV_MSG_CODE_NVM_READ_NVRAM, param,
19036c95dd8fSPrabhakar Kushwaha 				       &ret_mcp_resp,
19046c95dd8fSPrabhakar Kushwaha 				       &ret_mcp_param, &ret_read_size,
19056c95dd8fSPrabhakar Kushwaha 				       (u32 *)((u8 *)ret_buf + read_offset),
1906*5401c3e0SCaleb Sander 				       b_can_sleep))
19076c95dd8fSPrabhakar Kushwaha 			return DBG_STATUS_NVRAM_READ_FAILED;
19086c95dd8fSPrabhakar Kushwaha 
19096c95dd8fSPrabhakar Kushwaha 		/* Check response */
19106c95dd8fSPrabhakar Kushwaha 		if ((ret_mcp_resp & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK)
19116c95dd8fSPrabhakar Kushwaha 			return DBG_STATUS_NVRAM_READ_FAILED;
19126c95dd8fSPrabhakar Kushwaha 
19136c95dd8fSPrabhakar Kushwaha 		/* Update read offset */
19146c95dd8fSPrabhakar Kushwaha 		read_offset += ret_read_size;
19156c95dd8fSPrabhakar Kushwaha 		bytes_left -= ret_read_size;
19166c95dd8fSPrabhakar Kushwaha 	} while (bytes_left > 0);
19176c95dd8fSPrabhakar Kushwaha 
19186c95dd8fSPrabhakar Kushwaha 	return DBG_STATUS_OK;
19196c95dd8fSPrabhakar Kushwaha }
19206c95dd8fSPrabhakar Kushwaha 
1921c965db44STomer Tayar /* Dumps GRC registers section header. Returns the dumped size in dwords.
19222d22bc83SMichal Kalderon  * the following parameters are dumped:
19237b6859fbSMintz, Yuval  * - count: no. of dumped entries
1924d52c89f1SMichal Kalderon  * - split_type: split type
1925d52c89f1SMichal Kalderon  * - split_id: split ID (dumped only if split_id != SPLIT_TYPE_NONE)
19262d22bc83SMichal Kalderon  * - reg_type_name: register type name (dumped only if reg_type_name != NULL)
1927c965db44STomer Tayar  */
qed_grc_dump_regs_hdr(u32 * dump_buf,bool dump,u32 num_reg_entries,enum init_split_types split_type,u8 split_id,const char * reg_type_name)1928c965db44STomer Tayar static u32 qed_grc_dump_regs_hdr(u32 *dump_buf,
1929c965db44STomer Tayar 				 bool dump,
1930c965db44STomer Tayar 				 u32 num_reg_entries,
1931d52c89f1SMichal Kalderon 				 enum init_split_types split_type,
19322d22bc83SMichal Kalderon 				 u8 split_id, const char *reg_type_name)
1933c965db44STomer Tayar {
1934d52c89f1SMichal Kalderon 	u8 num_params = 2 +
19352d22bc83SMichal Kalderon 	    (split_type != SPLIT_TYPE_NONE ? 1 : 0) + (reg_type_name ? 1 : 0);
1936c965db44STomer Tayar 	u32 offset = 0;
1937c965db44STomer Tayar 
1938c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
1939c965db44STomer Tayar 				       dump, "grc_regs", num_params);
1940c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
1941c965db44STomer Tayar 				     dump, "count", num_reg_entries);
1942c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
1943d52c89f1SMichal Kalderon 				     dump, "split",
1944d52c89f1SMichal Kalderon 				     s_split_type_defs[split_type].name);
1945d52c89f1SMichal Kalderon 	if (split_type != SPLIT_TYPE_NONE)
1946c965db44STomer Tayar 		offset += qed_dump_num_param(dump_buf + offset,
1947c965db44STomer Tayar 					     dump, "id", split_id);
19482d22bc83SMichal Kalderon 	if (reg_type_name)
1949c965db44STomer Tayar 		offset += qed_dump_str_param(dump_buf + offset,
19502d22bc83SMichal Kalderon 					     dump, "type", reg_type_name);
19517b6859fbSMintz, Yuval 
1952c965db44STomer Tayar 	return offset;
1953c965db44STomer Tayar }
1954c965db44STomer Tayar 
1955da090917STomer Tayar /* Reads the specified registers into the specified buffer.
1956da090917STomer Tayar  * The addr and len arguments are specified in dwords.
1957da090917STomer Tayar  */
qed_read_regs(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * buf,u32 addr,u32 len)1958da090917STomer Tayar void qed_read_regs(struct qed_hwfn *p_hwfn,
1959da090917STomer Tayar 		   struct qed_ptt *p_ptt, u32 *buf, u32 addr, u32 len)
1960da090917STomer Tayar {
1961da090917STomer Tayar 	u32 i;
1962da090917STomer Tayar 
1963da090917STomer Tayar 	for (i = 0; i < len; i++)
1964da090917STomer Tayar 		buf[i] = qed_rd(p_hwfn, p_ptt, DWORDS_TO_BYTES(addr + i));
1965da090917STomer Tayar }
1966da090917STomer Tayar 
1967be086e7cSMintz, Yuval /* Dumps the GRC registers in the specified address range.
1968be086e7cSMintz, Yuval  * Returns the dumped size in dwords.
19697b6859fbSMintz, Yuval  * The addr and len arguments are specified in dwords.
1970be086e7cSMintz, Yuval  */
qed_grc_dump_addr_range(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u32 addr,u32 len,bool wide_bus,enum init_split_types split_type,u8 split_id)1971be086e7cSMintz, Yuval static u32 qed_grc_dump_addr_range(struct qed_hwfn *p_hwfn,
19727b6859fbSMintz, Yuval 				   struct qed_ptt *p_ptt,
19737b6859fbSMintz, Yuval 				   u32 *dump_buf,
1974d52c89f1SMichal Kalderon 				   bool dump, u32 addr, u32 len, bool wide_bus,
1975d52c89f1SMichal Kalderon 				   enum init_split_types split_type,
1976d52c89f1SMichal Kalderon 				   u8 split_id)
1977be086e7cSMintz, Yuval {
1978da090917STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
19797d841182SJiri Slaby (SUSE) 	u8 port_id = 0, pf_id = 0, vf_id = 0;
19802d22bc83SMichal Kalderon 	bool read_using_dmae = false;
19812d22bc83SMichal Kalderon 	u32 thresh;
19827d841182SJiri Slaby (SUSE) 	u16 fid;
1983be086e7cSMintz, Yuval 
19847b6859fbSMintz, Yuval 	if (!dump)
19857b6859fbSMintz, Yuval 		return len;
19867b6859fbSMintz, Yuval 
1987d52c89f1SMichal Kalderon 	switch (split_type) {
1988d52c89f1SMichal Kalderon 	case SPLIT_TYPE_PORT:
1989d52c89f1SMichal Kalderon 		port_id = split_id;
1990d52c89f1SMichal Kalderon 		break;
1991d52c89f1SMichal Kalderon 	case SPLIT_TYPE_PF:
1992d52c89f1SMichal Kalderon 		pf_id = split_id;
1993d52c89f1SMichal Kalderon 		break;
1994d52c89f1SMichal Kalderon 	case SPLIT_TYPE_PORT_PF:
1995d52c89f1SMichal Kalderon 		port_id = split_id / dev_data->num_pfs_per_port;
1996d52c89f1SMichal Kalderon 		pf_id = port_id + dev_data->num_ports *
1997d52c89f1SMichal Kalderon 		    (split_id % dev_data->num_pfs_per_port);
1998d52c89f1SMichal Kalderon 		break;
1999d52c89f1SMichal Kalderon 	case SPLIT_TYPE_VF:
2000d52c89f1SMichal Kalderon 		vf_id = split_id;
2001d52c89f1SMichal Kalderon 		break;
2002d52c89f1SMichal Kalderon 	default:
2003d52c89f1SMichal Kalderon 		break;
2004d52c89f1SMichal Kalderon 	}
2005d52c89f1SMichal Kalderon 
2006da090917STomer Tayar 	/* Try reading using DMAE */
20072d22bc83SMichal Kalderon 	if (dev_data->use_dmae && split_type != SPLIT_TYPE_VF &&
20082d22bc83SMichal Kalderon 	    (len >= s_hw_type_defs[dev_data->hw_type].dmae_thresh ||
20092d22bc83SMichal Kalderon 	     (PROTECT_WIDE_BUS && wide_bus))) {
20102d22bc83SMichal Kalderon 		struct qed_dmae_params dmae_params;
20112d22bc83SMichal Kalderon 
20122d22bc83SMichal Kalderon 		/* Set DMAE params */
20132d22bc83SMichal Kalderon 		memset(&dmae_params, 0, sizeof(dmae_params));
20142d22bc83SMichal Kalderon 		SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_COMPLETION_DST, 1);
20152d22bc83SMichal Kalderon 		switch (split_type) {
20162d22bc83SMichal Kalderon 		case SPLIT_TYPE_PORT:
20172d22bc83SMichal Kalderon 			SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID,
20182d22bc83SMichal Kalderon 				  1);
20192d22bc83SMichal Kalderon 			dmae_params.port_id = port_id;
20202d22bc83SMichal Kalderon 			break;
20212d22bc83SMichal Kalderon 		case SPLIT_TYPE_PF:
20222d22bc83SMichal Kalderon 			SET_FIELD(dmae_params.flags,
20232d22bc83SMichal Kalderon 				  QED_DMAE_PARAMS_SRC_PF_VALID, 1);
20242d22bc83SMichal Kalderon 			dmae_params.src_pfid = pf_id;
20252d22bc83SMichal Kalderon 			break;
20262d22bc83SMichal Kalderon 		case SPLIT_TYPE_PORT_PF:
20272d22bc83SMichal Kalderon 			SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID,
20282d22bc83SMichal Kalderon 				  1);
20292d22bc83SMichal Kalderon 			SET_FIELD(dmae_params.flags,
20302d22bc83SMichal Kalderon 				  QED_DMAE_PARAMS_SRC_PF_VALID, 1);
20312d22bc83SMichal Kalderon 			dmae_params.port_id = port_id;
20322d22bc83SMichal Kalderon 			dmae_params.src_pfid = pf_id;
20332d22bc83SMichal Kalderon 			break;
20342d22bc83SMichal Kalderon 		default:
20352d22bc83SMichal Kalderon 			break;
20362d22bc83SMichal Kalderon 		}
20372d22bc83SMichal Kalderon 
20382d22bc83SMichal Kalderon 		/* Execute DMAE command */
20392d22bc83SMichal Kalderon 		read_using_dmae = !qed_dmae_grc2host(p_hwfn,
20402d22bc83SMichal Kalderon 						     p_ptt,
20412d22bc83SMichal Kalderon 						     DWORDS_TO_BYTES(addr),
20422d22bc83SMichal Kalderon 						     (u64)(uintptr_t)(dump_buf),
20432d22bc83SMichal Kalderon 						     len, &dmae_params);
20442d22bc83SMichal Kalderon 		if (!read_using_dmae) {
2045da090917STomer Tayar 			dev_data->use_dmae = 0;
2046da090917STomer Tayar 			DP_VERBOSE(p_hwfn,
2047da090917STomer Tayar 				   QED_MSG_DEBUG,
2048da090917STomer Tayar 				   "Failed reading from chip using DMAE, using GRC instead\n");
2049da090917STomer Tayar 		}
20502d22bc83SMichal Kalderon 	}
20512d22bc83SMichal Kalderon 
20522d22bc83SMichal Kalderon 	if (read_using_dmae)
20532d22bc83SMichal Kalderon 		goto print_log;
2054da090917STomer Tayar 
2055d52c89f1SMichal Kalderon 	/* If not read using DMAE, read using GRC */
2056d52c89f1SMichal Kalderon 
2057d52c89f1SMichal Kalderon 	/* Set pretend */
20582d22bc83SMichal Kalderon 	if (split_type != dev_data->pretend.split_type ||
20592d22bc83SMichal Kalderon 	    split_id != dev_data->pretend.split_id) {
2060d52c89f1SMichal Kalderon 		switch (split_type) {
2061d52c89f1SMichal Kalderon 		case SPLIT_TYPE_PORT:
2062d52c89f1SMichal Kalderon 			qed_port_pretend(p_hwfn, p_ptt, port_id);
2063d52c89f1SMichal Kalderon 			break;
2064d52c89f1SMichal Kalderon 		case SPLIT_TYPE_PF:
20652d22bc83SMichal Kalderon 			fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
20662d22bc83SMichal Kalderon 					  pf_id);
2067d52c89f1SMichal Kalderon 			qed_fid_pretend(p_hwfn, p_ptt, fid);
2068d52c89f1SMichal Kalderon 			break;
2069d52c89f1SMichal Kalderon 		case SPLIT_TYPE_PORT_PF:
20702d22bc83SMichal Kalderon 			fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
20712d22bc83SMichal Kalderon 					  pf_id);
2072d52c89f1SMichal Kalderon 			qed_port_fid_pretend(p_hwfn, p_ptt, port_id, fid);
2073d52c89f1SMichal Kalderon 			break;
2074d52c89f1SMichal Kalderon 		case SPLIT_TYPE_VF:
20752d22bc83SMichal Kalderon 			fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFVALID, 1)
20762d22bc83SMichal Kalderon 			      | FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFID,
20772d22bc83SMichal Kalderon 					  vf_id);
2078d52c89f1SMichal Kalderon 			qed_fid_pretend(p_hwfn, p_ptt, fid);
2079d52c89f1SMichal Kalderon 			break;
2080d52c89f1SMichal Kalderon 		default:
2081d52c89f1SMichal Kalderon 			break;
2082d52c89f1SMichal Kalderon 		}
2083d52c89f1SMichal Kalderon 
2084d52c89f1SMichal Kalderon 		dev_data->pretend.split_type = (u8)split_type;
2085d52c89f1SMichal Kalderon 		dev_data->pretend.split_id = split_id;
2086d52c89f1SMichal Kalderon 	}
2087d52c89f1SMichal Kalderon 
2088d52c89f1SMichal Kalderon 	/* Read registers using GRC */
2089da090917STomer Tayar 	qed_read_regs(p_hwfn, p_ptt, dump_buf, addr, len);
2090da090917STomer Tayar 
20912d22bc83SMichal Kalderon print_log:
20922d22bc83SMichal Kalderon 	/* Print log */
20932d22bc83SMichal Kalderon 	dev_data->num_regs_read += len;
20942d22bc83SMichal Kalderon 	thresh = s_hw_type_defs[dev_data->hw_type].log_thresh;
20952d22bc83SMichal Kalderon 	if ((dev_data->num_regs_read / thresh) >
20962d22bc83SMichal Kalderon 	    ((dev_data->num_regs_read - len) / thresh))
20972d22bc83SMichal Kalderon 		DP_VERBOSE(p_hwfn,
20982d22bc83SMichal Kalderon 			   QED_MSG_DEBUG,
20992d22bc83SMichal Kalderon 			   "Dumped %d registers...\n", dev_data->num_regs_read);
21002d22bc83SMichal Kalderon 
2101da090917STomer Tayar 	return len;
2102be086e7cSMintz, Yuval }
2103be086e7cSMintz, Yuval 
21047b6859fbSMintz, Yuval /* Dumps GRC registers sequence header. Returns the dumped size in dwords.
21057b6859fbSMintz, Yuval  * The addr and len arguments are specified in dwords.
21067b6859fbSMintz, Yuval  */
qed_grc_dump_reg_entry_hdr(u32 * dump_buf,bool dump,u32 addr,u32 len)21077b6859fbSMintz, Yuval static u32 qed_grc_dump_reg_entry_hdr(u32 *dump_buf,
21087b6859fbSMintz, Yuval 				      bool dump, u32 addr, u32 len)
2109be086e7cSMintz, Yuval {
2110be086e7cSMintz, Yuval 	if (dump)
2111be086e7cSMintz, Yuval 		*dump_buf = addr | (len << REG_DUMP_LEN_SHIFT);
21127b6859fbSMintz, Yuval 
2113be086e7cSMintz, Yuval 	return 1;
2114be086e7cSMintz, Yuval }
2115be086e7cSMintz, Yuval 
21167b6859fbSMintz, Yuval /* Dumps GRC registers sequence. Returns the dumped size in dwords.
21177b6859fbSMintz, Yuval  * The addr and len arguments are specified in dwords.
21187b6859fbSMintz, Yuval  */
qed_grc_dump_reg_entry(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u32 addr,u32 len,bool wide_bus,enum init_split_types split_type,u8 split_id)2119c965db44STomer Tayar static u32 qed_grc_dump_reg_entry(struct qed_hwfn *p_hwfn,
21207b6859fbSMintz, Yuval 				  struct qed_ptt *p_ptt,
21217b6859fbSMintz, Yuval 				  u32 *dump_buf,
2122d52c89f1SMichal Kalderon 				  bool dump, u32 addr, u32 len, bool wide_bus,
2123d52c89f1SMichal Kalderon 				  enum init_split_types split_type, u8 split_id)
2124c965db44STomer Tayar {
2125be086e7cSMintz, Yuval 	u32 offset = 0;
2126c965db44STomer Tayar 
2127be086e7cSMintz, Yuval 	offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, len);
2128be086e7cSMintz, Yuval 	offset += qed_grc_dump_addr_range(p_hwfn,
2129c965db44STomer Tayar 					  p_ptt,
21307b6859fbSMintz, Yuval 					  dump_buf + offset,
2131d52c89f1SMichal Kalderon 					  dump, addr, len, wide_bus,
2132d52c89f1SMichal Kalderon 					  split_type, split_id);
21337b6859fbSMintz, Yuval 
2134be086e7cSMintz, Yuval 	return offset;
2135be086e7cSMintz, Yuval }
2136be086e7cSMintz, Yuval 
2137be086e7cSMintz, Yuval /* Dumps GRC registers sequence with skip cycle.
2138be086e7cSMintz, Yuval  * Returns the dumped size in dwords.
21397b6859fbSMintz, Yuval  * - addr:	start GRC address in dwords
21407b6859fbSMintz, Yuval  * - total_len:	total no. of dwords to dump
21417b6859fbSMintz, Yuval  * - read_len:	no. consecutive dwords to read
21427b6859fbSMintz, Yuval  * - skip_len:	no. of dwords to skip (and fill with zeros)
2143be086e7cSMintz, Yuval  */
qed_grc_dump_reg_entry_skip(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u32 addr,u32 total_len,u32 read_len,u32 skip_len)2144be086e7cSMintz, Yuval static u32 qed_grc_dump_reg_entry_skip(struct qed_hwfn *p_hwfn,
21457b6859fbSMintz, Yuval 				       struct qed_ptt *p_ptt,
21467b6859fbSMintz, Yuval 				       u32 *dump_buf,
21477b6859fbSMintz, Yuval 				       bool dump,
21487b6859fbSMintz, Yuval 				       u32 addr,
21497b6859fbSMintz, Yuval 				       u32 total_len,
2150be086e7cSMintz, Yuval 				       u32 read_len, u32 skip_len)
2151be086e7cSMintz, Yuval {
2152be086e7cSMintz, Yuval 	u32 offset = 0, reg_offset = 0;
2153be086e7cSMintz, Yuval 
2154be086e7cSMintz, Yuval 	offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, total_len);
21557b6859fbSMintz, Yuval 
21567b6859fbSMintz, Yuval 	if (!dump)
21577b6859fbSMintz, Yuval 		return offset + total_len;
21587b6859fbSMintz, Yuval 
2159be086e7cSMintz, Yuval 	while (reg_offset < total_len) {
21607b6859fbSMintz, Yuval 		u32 curr_len = min_t(u32, read_len, total_len - reg_offset);
21617b6859fbSMintz, Yuval 
2162be086e7cSMintz, Yuval 		offset += qed_grc_dump_addr_range(p_hwfn,
2163be086e7cSMintz, Yuval 						  p_ptt,
2164be086e7cSMintz, Yuval 						  dump_buf + offset,
2165d52c89f1SMichal Kalderon 						  dump,  addr, curr_len, false,
2166d52c89f1SMichal Kalderon 						  SPLIT_TYPE_NONE, 0);
2167be086e7cSMintz, Yuval 		reg_offset += curr_len;
2168be086e7cSMintz, Yuval 		addr += curr_len;
21697b6859fbSMintz, Yuval 
2170be086e7cSMintz, Yuval 		if (reg_offset < total_len) {
21717b6859fbSMintz, Yuval 			curr_len = min_t(u32, skip_len, total_len - skip_len);
21727b6859fbSMintz, Yuval 			memset(dump_buf + offset, 0, DWORDS_TO_BYTES(curr_len));
2173be086e7cSMintz, Yuval 			offset += curr_len;
2174be086e7cSMintz, Yuval 			reg_offset += curr_len;
2175be086e7cSMintz, Yuval 			addr += curr_len;
2176be086e7cSMintz, Yuval 		}
2177be086e7cSMintz, Yuval 	}
2178c965db44STomer Tayar 
2179c965db44STomer Tayar 	return offset;
2180c965db44STomer Tayar }
2181c965db44STomer Tayar 
2182c965db44STomer Tayar /* Dumps GRC registers entries. Returns the dumped size in dwords. */
qed_grc_dump_regs_entries(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,struct virt_mem_desc input_regs_arr,u32 * dump_buf,bool dump,enum init_split_types split_type,u8 split_id,bool block_enable[MAX_BLOCK_ID],u32 * num_dumped_reg_entries)2183c965db44STomer Tayar static u32 qed_grc_dump_regs_entries(struct qed_hwfn *p_hwfn,
2184c965db44STomer Tayar 				     struct qed_ptt *p_ptt,
21852d22bc83SMichal Kalderon 				     struct virt_mem_desc input_regs_arr,
2186c965db44STomer Tayar 				     u32 *dump_buf,
2187c965db44STomer Tayar 				     bool dump,
2188d52c89f1SMichal Kalderon 				     enum init_split_types split_type,
2189d52c89f1SMichal Kalderon 				     u8 split_id,
2190c965db44STomer Tayar 				     bool block_enable[MAX_BLOCK_ID],
2191c965db44STomer Tayar 				     u32 *num_dumped_reg_entries)
2192c965db44STomer Tayar {
2193c965db44STomer Tayar 	u32 i, offset = 0, input_offset = 0;
2194c965db44STomer Tayar 	bool mode_match = true;
2195c965db44STomer Tayar 
2196c965db44STomer Tayar 	*num_dumped_reg_entries = 0;
21977b6859fbSMintz, Yuval 
21982d22bc83SMichal Kalderon 	while (input_offset < BYTES_TO_DWORDS(input_regs_arr.size)) {
2199c965db44STomer Tayar 		const struct dbg_dump_cond_hdr *cond_hdr =
2200c965db44STomer Tayar 		    (const struct dbg_dump_cond_hdr *)
22012d22bc83SMichal Kalderon 		    input_regs_arr.ptr + input_offset++;
22027b6859fbSMintz, Yuval 		u16 modes_buf_offset;
22037b6859fbSMintz, Yuval 		bool eval_mode;
2204c965db44STomer Tayar 
2205c965db44STomer Tayar 		/* Check mode/block */
22067b6859fbSMintz, Yuval 		eval_mode = GET_FIELD(cond_hdr->mode.data,
22077b6859fbSMintz, Yuval 				      DBG_MODE_HDR_EVAL_MODE) > 0;
2208c965db44STomer Tayar 		if (eval_mode) {
22097b6859fbSMintz, Yuval 			modes_buf_offset =
2210c965db44STomer Tayar 				GET_FIELD(cond_hdr->mode.data,
2211c965db44STomer Tayar 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
2212c965db44STomer Tayar 			mode_match = qed_is_mode_match(p_hwfn,
2213c965db44STomer Tayar 						       &modes_buf_offset);
2214c965db44STomer Tayar 		}
2215c965db44STomer Tayar 
22167b6859fbSMintz, Yuval 		if (!mode_match || !block_enable[cond_hdr->block_id]) {
22177b6859fbSMintz, Yuval 			input_offset += cond_hdr->data_size;
22187b6859fbSMintz, Yuval 			continue;
22197b6859fbSMintz, Yuval 		}
22207b6859fbSMintz, Yuval 
22217b6859fbSMintz, Yuval 		for (i = 0; i < cond_hdr->data_size; i++, input_offset++) {
2222c965db44STomer Tayar 			const struct dbg_dump_reg *reg =
2223c965db44STomer Tayar 			    (const struct dbg_dump_reg *)
22242d22bc83SMichal Kalderon 			    input_regs_arr.ptr + input_offset;
2225be086e7cSMintz, Yuval 			u32 addr, len;
22267b6859fbSMintz, Yuval 			bool wide_bus;
2227c965db44STomer Tayar 
22287b6859fbSMintz, Yuval 			addr = GET_FIELD(reg->data, DBG_DUMP_REG_ADDRESS);
2229be086e7cSMintz, Yuval 			len = GET_FIELD(reg->data, DBG_DUMP_REG_LENGTH);
22307b6859fbSMintz, Yuval 			wide_bus = GET_FIELD(reg->data, DBG_DUMP_REG_WIDE_BUS);
22317b6859fbSMintz, Yuval 			offset += qed_grc_dump_reg_entry(p_hwfn,
22327b6859fbSMintz, Yuval 							 p_ptt,
2233be086e7cSMintz, Yuval 							 dump_buf + offset,
2234be086e7cSMintz, Yuval 							 dump,
2235be086e7cSMintz, Yuval 							 addr,
22367b6859fbSMintz, Yuval 							 len,
2237d52c89f1SMichal Kalderon 							 wide_bus,
2238d52c89f1SMichal Kalderon 							 split_type, split_id);
2239c965db44STomer Tayar 			(*num_dumped_reg_entries)++;
2240c965db44STomer Tayar 		}
2241c965db44STomer Tayar 	}
2242c965db44STomer Tayar 
2243c965db44STomer Tayar 	return offset;
2244c965db44STomer Tayar }
2245c965db44STomer Tayar 
2246c965db44STomer Tayar /* Dumps GRC registers entries. Returns the dumped size in dwords. */
qed_grc_dump_split_data(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,struct virt_mem_desc input_regs_arr,u32 * dump_buf,bool dump,bool block_enable[MAX_BLOCK_ID],enum init_split_types split_type,u8 split_id,const char * reg_type_name)2247c965db44STomer Tayar static u32 qed_grc_dump_split_data(struct qed_hwfn *p_hwfn,
2248c965db44STomer Tayar 				   struct qed_ptt *p_ptt,
22492d22bc83SMichal Kalderon 				   struct virt_mem_desc input_regs_arr,
2250c965db44STomer Tayar 				   u32 *dump_buf,
2251c965db44STomer Tayar 				   bool dump,
2252c965db44STomer Tayar 				   bool block_enable[MAX_BLOCK_ID],
2253d52c89f1SMichal Kalderon 				   enum init_split_types split_type,
22542d22bc83SMichal Kalderon 				   u8 split_id, const char *reg_type_name)
2255c965db44STomer Tayar {
2256d52c89f1SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2257d52c89f1SMichal Kalderon 	enum init_split_types hdr_split_type = split_type;
2258c965db44STomer Tayar 	u32 num_dumped_reg_entries, offset;
2259d52c89f1SMichal Kalderon 	u8 hdr_split_id = split_id;
2260d52c89f1SMichal Kalderon 
2261d52c89f1SMichal Kalderon 	/* In PORT_PF split type, print a port split header */
2262d52c89f1SMichal Kalderon 	if (split_type == SPLIT_TYPE_PORT_PF) {
2263d52c89f1SMichal Kalderon 		hdr_split_type = SPLIT_TYPE_PORT;
2264d52c89f1SMichal Kalderon 		hdr_split_id = split_id / dev_data->num_pfs_per_port;
2265d52c89f1SMichal Kalderon 	}
2266c965db44STomer Tayar 
2267c965db44STomer Tayar 	/* Calculate register dump header size (and skip it for now) */
2268c965db44STomer Tayar 	offset = qed_grc_dump_regs_hdr(dump_buf,
2269c965db44STomer Tayar 				       false,
2270c965db44STomer Tayar 				       0,
2271d52c89f1SMichal Kalderon 				       hdr_split_type,
22722d22bc83SMichal Kalderon 				       hdr_split_id, reg_type_name);
2273c965db44STomer Tayar 
2274c965db44STomer Tayar 	/* Dump registers */
2275c965db44STomer Tayar 	offset += qed_grc_dump_regs_entries(p_hwfn,
2276c965db44STomer Tayar 					    p_ptt,
2277c965db44STomer Tayar 					    input_regs_arr,
2278c965db44STomer Tayar 					    dump_buf + offset,
2279c965db44STomer Tayar 					    dump,
2280d52c89f1SMichal Kalderon 					    split_type,
2281d52c89f1SMichal Kalderon 					    split_id,
2282c965db44STomer Tayar 					    block_enable,
2283c965db44STomer Tayar 					    &num_dumped_reg_entries);
2284c965db44STomer Tayar 
2285c965db44STomer Tayar 	/* Write register dump header */
2286c965db44STomer Tayar 	if (dump && num_dumped_reg_entries > 0)
2287c965db44STomer Tayar 		qed_grc_dump_regs_hdr(dump_buf,
2288c965db44STomer Tayar 				      dump,
2289c965db44STomer Tayar 				      num_dumped_reg_entries,
2290d52c89f1SMichal Kalderon 				      hdr_split_type,
22912d22bc83SMichal Kalderon 				      hdr_split_id, reg_type_name);
2292c965db44STomer Tayar 
2293c965db44STomer Tayar 	return num_dumped_reg_entries > 0 ? offset : 0;
2294c965db44STomer Tayar }
2295c965db44STomer Tayar 
22967b6859fbSMintz, Yuval /* Dumps registers according to the input registers array. Returns the dumped
22977b6859fbSMintz, Yuval  * size in dwords.
2298c965db44STomer Tayar  */
qed_grc_dump_registers(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,bool block_enable[MAX_BLOCK_ID],const char * reg_type_name)2299c965db44STomer Tayar static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn,
2300c965db44STomer Tayar 				  struct qed_ptt *p_ptt,
2301c965db44STomer Tayar 				  u32 *dump_buf,
2302c965db44STomer Tayar 				  bool dump,
2303c965db44STomer Tayar 				  bool block_enable[MAX_BLOCK_ID],
23042d22bc83SMichal Kalderon 				  const char *reg_type_name)
2305c965db44STomer Tayar {
23062d22bc83SMichal Kalderon 	struct virt_mem_desc *dbg_buf =
23072d22bc83SMichal Kalderon 	    &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG];
2308c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
2309c965db44STomer Tayar 	u32 offset = 0, input_offset = 0;
23102d22bc83SMichal Kalderon 
23112d22bc83SMichal Kalderon 	while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
23127b6859fbSMintz, Yuval 		const struct dbg_dump_split_hdr *split_hdr;
23132d22bc83SMichal Kalderon 		struct virt_mem_desc curr_input_regs_arr;
2314d52c89f1SMichal Kalderon 		enum init_split_types split_type;
2315d52c89f1SMichal Kalderon 		u16 split_count = 0;
23167b6859fbSMintz, Yuval 		u32 split_data_size;
2317d52c89f1SMichal Kalderon 		u8 split_id;
23187b6859fbSMintz, Yuval 
23197b6859fbSMintz, Yuval 		split_hdr =
2320c965db44STomer Tayar 		    (const struct dbg_dump_split_hdr *)
23212d22bc83SMichal Kalderon 		    dbg_buf->ptr + input_offset++;
2322d52c89f1SMichal Kalderon 		split_type =
23237b6859fbSMintz, Yuval 		    GET_FIELD(split_hdr->hdr,
2324c965db44STomer Tayar 			      DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
23252d22bc83SMichal Kalderon 		split_data_size = GET_FIELD(split_hdr->hdr,
2326c965db44STomer Tayar 					    DBG_DUMP_SPLIT_HDR_DATA_SIZE);
23277b6859fbSMintz, Yuval 		curr_input_regs_arr.ptr =
23282d22bc83SMichal Kalderon 		    (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr +
23292d22bc83SMichal Kalderon 		    input_offset;
23302d22bc83SMichal Kalderon 		curr_input_regs_arr.size = DWORDS_TO_BYTES(split_data_size);
2331c965db44STomer Tayar 
2332d52c89f1SMichal Kalderon 		switch (split_type) {
2333c965db44STomer Tayar 		case SPLIT_TYPE_NONE:
2334d52c89f1SMichal Kalderon 			split_count = 1;
2335c965db44STomer Tayar 			break;
2336c965db44STomer Tayar 		case SPLIT_TYPE_PORT:
2337d52c89f1SMichal Kalderon 			split_count = dev_data->num_ports;
2338c965db44STomer Tayar 			break;
2339c965db44STomer Tayar 		case SPLIT_TYPE_PF:
2340c965db44STomer Tayar 		case SPLIT_TYPE_PORT_PF:
2341d52c89f1SMichal Kalderon 			split_count = dev_data->num_ports *
2342d52c89f1SMichal Kalderon 			    dev_data->num_pfs_per_port;
2343be086e7cSMintz, Yuval 			break;
2344be086e7cSMintz, Yuval 		case SPLIT_TYPE_VF:
2345d52c89f1SMichal Kalderon 			split_count = dev_data->num_vfs;
2346d52c89f1SMichal Kalderon 			break;
2347d52c89f1SMichal Kalderon 		default:
2348d52c89f1SMichal Kalderon 			return 0;
2349be086e7cSMintz, Yuval 		}
2350be086e7cSMintz, Yuval 
2351d52c89f1SMichal Kalderon 		for (split_id = 0; split_id < split_count; split_id++)
2352d52c89f1SMichal Kalderon 			offset += qed_grc_dump_split_data(p_hwfn, p_ptt,
2353be086e7cSMintz, Yuval 							  curr_input_regs_arr,
2354be086e7cSMintz, Yuval 							  dump_buf + offset,
2355be086e7cSMintz, Yuval 							  dump, block_enable,
2356d52c89f1SMichal Kalderon 							  split_type,
2357d52c89f1SMichal Kalderon 							  split_id,
23582d22bc83SMichal Kalderon 							  reg_type_name);
2359c965db44STomer Tayar 
2360c965db44STomer Tayar 		input_offset += split_data_size;
2361c965db44STomer Tayar 	}
2362c965db44STomer Tayar 
2363d52c89f1SMichal Kalderon 	/* Cancel pretends (pretend to original PF) */
2364be086e7cSMintz, Yuval 	if (dump) {
23652d22bc83SMichal Kalderon 		qed_fid_pretend(p_hwfn, p_ptt,
23662d22bc83SMichal Kalderon 				FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
23672d22bc83SMichal Kalderon 					    p_hwfn->rel_pf_id));
2368d52c89f1SMichal Kalderon 		dev_data->pretend.split_type = SPLIT_TYPE_NONE;
2369d52c89f1SMichal Kalderon 		dev_data->pretend.split_id = 0;
2370be086e7cSMintz, Yuval 	}
2371be086e7cSMintz, Yuval 
2372c965db44STomer Tayar 	return offset;
2373c965db44STomer Tayar }
2374c965db44STomer Tayar 
2375c965db44STomer Tayar /* Dump reset registers. Returns the dumped size in dwords. */
qed_grc_dump_reset_regs(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)2376c965db44STomer Tayar static u32 qed_grc_dump_reset_regs(struct qed_hwfn *p_hwfn,
2377c965db44STomer Tayar 				   struct qed_ptt *p_ptt,
2378c965db44STomer Tayar 				   u32 *dump_buf, bool dump)
2379c965db44STomer Tayar {
23802d22bc83SMichal Kalderon 	u32 offset = 0, num_regs = 0;
23812d22bc83SMichal Kalderon 	u8 reset_reg_id;
2382c965db44STomer Tayar 
2383c965db44STomer Tayar 	/* Calculate header size */
2384c965db44STomer Tayar 	offset += qed_grc_dump_regs_hdr(dump_buf,
23852d22bc83SMichal Kalderon 					false,
23862d22bc83SMichal Kalderon 					0, SPLIT_TYPE_NONE, 0, "RESET_REGS");
2387c965db44STomer Tayar 
2388c965db44STomer Tayar 	/* Write reset registers */
23892d22bc83SMichal Kalderon 	for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS;
23902d22bc83SMichal Kalderon 	     reset_reg_id++) {
23912d22bc83SMichal Kalderon 		const struct dbg_reset_reg *reset_reg;
23922d22bc83SMichal Kalderon 		u32 reset_reg_addr;
23932d22bc83SMichal Kalderon 
23942d22bc83SMichal Kalderon 		reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id);
23952d22bc83SMichal Kalderon 
23962d22bc83SMichal Kalderon 		if (GET_FIELD(reset_reg->data, DBG_RESET_REG_IS_REMOVED))
23977b6859fbSMintz, Yuval 			continue;
2398be086e7cSMintz, Yuval 
23992d22bc83SMichal Kalderon 		reset_reg_addr = GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR);
2400c965db44STomer Tayar 		offset += qed_grc_dump_reg_entry(p_hwfn,
2401c965db44STomer Tayar 						 p_ptt,
2402c965db44STomer Tayar 						 dump_buf + offset,
2403c965db44STomer Tayar 						 dump,
24042d22bc83SMichal Kalderon 						 reset_reg_addr,
24052d22bc83SMichal Kalderon 						 1, false, SPLIT_TYPE_NONE, 0);
2406c965db44STomer Tayar 		num_regs++;
2407c965db44STomer Tayar 	}
2408c965db44STomer Tayar 
2409c965db44STomer Tayar 	/* Write header */
2410c965db44STomer Tayar 	if (dump)
2411c965db44STomer Tayar 		qed_grc_dump_regs_hdr(dump_buf,
2412d52c89f1SMichal Kalderon 				      true, num_regs, SPLIT_TYPE_NONE,
24132d22bc83SMichal Kalderon 				      0, "RESET_REGS");
24147b6859fbSMintz, Yuval 
2415c965db44STomer Tayar 	return offset;
2416c965db44STomer Tayar }
2417c965db44STomer Tayar 
24187b6859fbSMintz, Yuval /* Dump registers that are modified during GRC Dump and therefore must be
24197b6859fbSMintz, Yuval  * dumped first. Returns the dumped size in dwords.
2420c965db44STomer Tayar  */
qed_grc_dump_modified_regs(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)2421c965db44STomer Tayar static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn,
2422c965db44STomer Tayar 				      struct qed_ptt *p_ptt,
2423c965db44STomer Tayar 				      u32 *dump_buf, bool dump)
2424c965db44STomer Tayar {
2425c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
24262d22bc83SMichal Kalderon 	u32 block_id, offset = 0, stall_regs_offset;
24277b6859fbSMintz, Yuval 	const struct dbg_attn_reg *attn_reg_arr;
2428c965db44STomer Tayar 	u8 storm_id, reg_idx, num_attn_regs;
24292d22bc83SMichal Kalderon 	u32 num_reg_entries = 0;
2430c965db44STomer Tayar 
24312d22bc83SMichal Kalderon 	/* Write empty header for attention registers */
2432c965db44STomer Tayar 	offset += qed_grc_dump_regs_hdr(dump_buf,
24332d22bc83SMichal Kalderon 					false,
24342d22bc83SMichal Kalderon 					0, SPLIT_TYPE_NONE, 0, "ATTN_REGS");
2435c965db44STomer Tayar 
2436c965db44STomer Tayar 	/* Write parity registers */
24372d22bc83SMichal Kalderon 	for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
2438c965db44STomer Tayar 		if (dev_data->block_in_reset[block_id] && dump)
2439c965db44STomer Tayar 			continue;
2440c965db44STomer Tayar 
24412d22bc83SMichal Kalderon 		attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
24422d22bc83SMichal Kalderon 						       (enum block_id)block_id,
2443c965db44STomer Tayar 						       ATTN_TYPE_PARITY,
2444c965db44STomer Tayar 						       &num_attn_regs);
24457b6859fbSMintz, Yuval 
2446c965db44STomer Tayar 		for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
2447c965db44STomer Tayar 			const struct dbg_attn_reg *reg_data =
2448c965db44STomer Tayar 				&attn_reg_arr[reg_idx];
2449c965db44STomer Tayar 			u16 modes_buf_offset;
2450c965db44STomer Tayar 			bool eval_mode;
2451be086e7cSMintz, Yuval 			u32 addr;
2452c965db44STomer Tayar 
2453c965db44STomer Tayar 			/* Check mode */
2454c965db44STomer Tayar 			eval_mode = GET_FIELD(reg_data->mode.data,
2455c965db44STomer Tayar 					      DBG_MODE_HDR_EVAL_MODE) > 0;
2456c965db44STomer Tayar 			modes_buf_offset =
2457c965db44STomer Tayar 				GET_FIELD(reg_data->mode.data,
2458c965db44STomer Tayar 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
24597b6859fbSMintz, Yuval 			if (eval_mode &&
24607b6859fbSMintz, Yuval 			    !qed_is_mode_match(p_hwfn, &modes_buf_offset))
24617b6859fbSMintz, Yuval 				continue;
24627b6859fbSMintz, Yuval 
24637b6859fbSMintz, Yuval 			/* Mode match: read & dump registers */
2464be086e7cSMintz, Yuval 			addr = reg_data->mask_address;
24657b6859fbSMintz, Yuval 			offset += qed_grc_dump_reg_entry(p_hwfn,
2466c965db44STomer Tayar 							 p_ptt,
2467c965db44STomer Tayar 							 dump_buf + offset,
2468c965db44STomer Tayar 							 dump,
2469be086e7cSMintz, Yuval 							 addr,
2470d52c89f1SMichal Kalderon 							 1, false,
2471d52c89f1SMichal Kalderon 							 SPLIT_TYPE_NONE, 0);
2472be086e7cSMintz, Yuval 			addr = GET_FIELD(reg_data->data,
2473be086e7cSMintz, Yuval 					 DBG_ATTN_REG_STS_ADDRESS);
24747b6859fbSMintz, Yuval 			offset += qed_grc_dump_reg_entry(p_hwfn,
2475c965db44STomer Tayar 							 p_ptt,
2476c965db44STomer Tayar 							 dump_buf + offset,
2477c965db44STomer Tayar 							 dump,
2478be086e7cSMintz, Yuval 							 addr,
2479d52c89f1SMichal Kalderon 							 1, false,
2480d52c89f1SMichal Kalderon 							 SPLIT_TYPE_NONE, 0);
2481c965db44STomer Tayar 			num_reg_entries += 2;
2482c965db44STomer Tayar 		}
2483c965db44STomer Tayar 	}
2484c965db44STomer Tayar 
24852d22bc83SMichal Kalderon 	/* Overwrite header for attention registers */
24862d22bc83SMichal Kalderon 	if (dump)
24872d22bc83SMichal Kalderon 		qed_grc_dump_regs_hdr(dump_buf,
24882d22bc83SMichal Kalderon 				      true,
24892d22bc83SMichal Kalderon 				      num_reg_entries,
24902d22bc83SMichal Kalderon 				      SPLIT_TYPE_NONE, 0, "ATTN_REGS");
24912d22bc83SMichal Kalderon 
24922d22bc83SMichal Kalderon 	/* Write empty header for stall registers */
24932d22bc83SMichal Kalderon 	stall_regs_offset = offset;
24942d22bc83SMichal Kalderon 	offset += qed_grc_dump_regs_hdr(dump_buf,
24952d22bc83SMichal Kalderon 					false, 0, SPLIT_TYPE_NONE, 0, "REGS");
24962d22bc83SMichal Kalderon 
24977b6859fbSMintz, Yuval 	/* Write Storm stall status registers */
24982d22bc83SMichal Kalderon 	for (storm_id = 0, num_reg_entries = 0; storm_id < MAX_DBG_STORMS;
24992d22bc83SMichal Kalderon 	     storm_id++) {
25007b6859fbSMintz, Yuval 		struct storm_defs *storm = &s_storm_defs[storm_id];
2501be086e7cSMintz, Yuval 		u32 addr;
2502be086e7cSMintz, Yuval 
25032d22bc83SMichal Kalderon 		if (dev_data->block_in_reset[storm->sem_block_id] && dump)
2504c965db44STomer Tayar 			continue;
2505c965db44STomer Tayar 
2506be086e7cSMintz, Yuval 		addr =
25072d22bc83SMichal Kalderon 		    BYTES_TO_DWORDS(storm->sem_fast_mem_addr +
2508be086e7cSMintz, Yuval 				    SEM_FAST_REG_STALLED);
2509c965db44STomer Tayar 		offset += qed_grc_dump_reg_entry(p_hwfn,
2510c965db44STomer Tayar 						 p_ptt,
2511c965db44STomer Tayar 						 dump_buf + offset,
2512c965db44STomer Tayar 						 dump,
2513be086e7cSMintz, Yuval 						 addr,
25147b6859fbSMintz, Yuval 						 1,
2515d52c89f1SMichal Kalderon 						 false, SPLIT_TYPE_NONE, 0);
2516c965db44STomer Tayar 		num_reg_entries++;
2517c965db44STomer Tayar 	}
2518c965db44STomer Tayar 
25192d22bc83SMichal Kalderon 	/* Overwrite header for stall registers */
2520c965db44STomer Tayar 	if (dump)
25212d22bc83SMichal Kalderon 		qed_grc_dump_regs_hdr(dump_buf + stall_regs_offset,
2522c965db44STomer Tayar 				      true,
25232d22bc83SMichal Kalderon 				      num_reg_entries,
25242d22bc83SMichal Kalderon 				      SPLIT_TYPE_NONE, 0, "REGS");
25257b6859fbSMintz, Yuval 
2526c965db44STomer Tayar 	return offset;
2527c965db44STomer Tayar }
2528c965db44STomer Tayar 
2529be086e7cSMintz, Yuval /* Dumps registers that can't be represented in the debug arrays */
qed_grc_dump_special_regs(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)2530be086e7cSMintz, Yuval static u32 qed_grc_dump_special_regs(struct qed_hwfn *p_hwfn,
2531be086e7cSMintz, Yuval 				     struct qed_ptt *p_ptt,
2532be086e7cSMintz, Yuval 				     u32 *dump_buf, bool dump)
2533be086e7cSMintz, Yuval {
2534be086e7cSMintz, Yuval 	u32 offset = 0, addr;
2535be086e7cSMintz, Yuval 
2536be086e7cSMintz, Yuval 	offset += qed_grc_dump_regs_hdr(dump_buf,
25372d22bc83SMichal Kalderon 					dump, 2, SPLIT_TYPE_NONE, 0, "REGS");
2538be086e7cSMintz, Yuval 
2539be086e7cSMintz, Yuval 	/* Dump R/TDIF_REG_DEBUG_ERROR_INFO_SIZE (every 8'th register should be
2540be086e7cSMintz, Yuval 	 * skipped).
2541be086e7cSMintz, Yuval 	 */
2542be086e7cSMintz, Yuval 	addr = BYTES_TO_DWORDS(RDIF_REG_DEBUG_ERROR_INFO);
2543be086e7cSMintz, Yuval 	offset += qed_grc_dump_reg_entry_skip(p_hwfn,
2544be086e7cSMintz, Yuval 					      p_ptt,
2545be086e7cSMintz, Yuval 					      dump_buf + offset,
2546be086e7cSMintz, Yuval 					      dump,
2547be086e7cSMintz, Yuval 					      addr,
2548be086e7cSMintz, Yuval 					      RDIF_REG_DEBUG_ERROR_INFO_SIZE,
2549be086e7cSMintz, Yuval 					      7,
2550be086e7cSMintz, Yuval 					      1);
2551be086e7cSMintz, Yuval 	addr = BYTES_TO_DWORDS(TDIF_REG_DEBUG_ERROR_INFO);
2552be086e7cSMintz, Yuval 	offset +=
2553be086e7cSMintz, Yuval 	    qed_grc_dump_reg_entry_skip(p_hwfn,
2554be086e7cSMintz, Yuval 					p_ptt,
2555be086e7cSMintz, Yuval 					dump_buf + offset,
2556be086e7cSMintz, Yuval 					dump,
2557be086e7cSMintz, Yuval 					addr,
2558be086e7cSMintz, Yuval 					TDIF_REG_DEBUG_ERROR_INFO_SIZE,
2559be086e7cSMintz, Yuval 					7,
2560be086e7cSMintz, Yuval 					1);
2561be086e7cSMintz, Yuval 
2562be086e7cSMintz, Yuval 	return offset;
2563be086e7cSMintz, Yuval }
2564be086e7cSMintz, Yuval 
25657b6859fbSMintz, Yuval /* Dumps a GRC memory header (section and params). Returns the dumped size in
25667b6859fbSMintz, Yuval  * dwords. The following parameters are dumped:
25677b6859fbSMintz, Yuval  * - name:	   dumped only if it's not NULL.
25687b6859fbSMintz, Yuval  * - addr:	   in dwords, dumped only if name is NULL.
25697b6859fbSMintz, Yuval  * - len:	   in dwords, always dumped.
25707b6859fbSMintz, Yuval  * - width:	   dumped if it's not zero.
25717b6859fbSMintz, Yuval  * - packed:	   dumped only if it's not false.
25727b6859fbSMintz, Yuval  * - mem_group:	   always dumped.
25737b6859fbSMintz, Yuval  * - is_storm:	   true only if the memory is related to a Storm.
25747b6859fbSMintz, Yuval  * - storm_letter: valid only if is_storm is true.
25757b6859fbSMintz, Yuval  *
2576c965db44STomer Tayar  */
qed_grc_dump_mem_hdr(struct qed_hwfn * p_hwfn,u32 * dump_buf,bool dump,const char * name,u32 addr,u32 len,u32 bit_width,bool packed,const char * mem_group,char storm_letter)2577c965db44STomer Tayar static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn,
2578c965db44STomer Tayar 				u32 *dump_buf,
2579c965db44STomer Tayar 				bool dump,
2580c965db44STomer Tayar 				const char *name,
2581be086e7cSMintz, Yuval 				u32 addr,
2582be086e7cSMintz, Yuval 				u32 len,
2583c965db44STomer Tayar 				u32 bit_width,
2584c965db44STomer Tayar 				bool packed,
25852d22bc83SMichal Kalderon 				const char *mem_group, char storm_letter)
2586c965db44STomer Tayar {
2587c965db44STomer Tayar 	u8 num_params = 3;
2588c965db44STomer Tayar 	u32 offset = 0;
2589c965db44STomer Tayar 	char buf[64];
2590c965db44STomer Tayar 
2591be086e7cSMintz, Yuval 	if (!len)
2592c965db44STomer Tayar 		DP_NOTICE(p_hwfn,
2593c965db44STomer Tayar 			  "Unexpected GRC Dump error: dumped memory size must be non-zero\n");
25947b6859fbSMintz, Yuval 
2595c965db44STomer Tayar 	if (bit_width)
2596c965db44STomer Tayar 		num_params++;
2597c965db44STomer Tayar 	if (packed)
2598c965db44STomer Tayar 		num_params++;
2599c965db44STomer Tayar 
2600c965db44STomer Tayar 	/* Dump section header */
2601c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
2602c965db44STomer Tayar 				       dump, "grc_mem", num_params);
26037b6859fbSMintz, Yuval 
2604c965db44STomer Tayar 	if (name) {
2605c965db44STomer Tayar 		/* Dump name */
26062d22bc83SMichal Kalderon 		if (storm_letter) {
2607c965db44STomer Tayar 			strcpy(buf, "?STORM_");
2608c965db44STomer Tayar 			buf[0] = storm_letter;
2609c965db44STomer Tayar 			strcpy(buf + strlen(buf), name);
2610c965db44STomer Tayar 		} else {
2611c965db44STomer Tayar 			strcpy(buf, name);
2612c965db44STomer Tayar 		}
2613c965db44STomer Tayar 
2614c965db44STomer Tayar 		offset += qed_dump_str_param(dump_buf + offset,
2615c965db44STomer Tayar 					     dump, "name", buf);
2616c965db44STomer Tayar 	} else {
2617c965db44STomer Tayar 		/* Dump address */
26187b6859fbSMintz, Yuval 		u32 addr_in_bytes = DWORDS_TO_BYTES(addr);
26197b6859fbSMintz, Yuval 
2620c965db44STomer Tayar 		offset += qed_dump_num_param(dump_buf + offset,
26217b6859fbSMintz, Yuval 					     dump, "addr", addr_in_bytes);
2622c965db44STomer Tayar 	}
2623c965db44STomer Tayar 
2624c965db44STomer Tayar 	/* Dump len */
2625be086e7cSMintz, Yuval 	offset += qed_dump_num_param(dump_buf + offset, dump, "len", len);
2626c965db44STomer Tayar 
2627c965db44STomer Tayar 	/* Dump bit width */
2628c965db44STomer Tayar 	if (bit_width)
2629c965db44STomer Tayar 		offset += qed_dump_num_param(dump_buf + offset,
2630c965db44STomer Tayar 					     dump, "width", bit_width);
2631c965db44STomer Tayar 
2632c965db44STomer Tayar 	/* Dump packed */
2633c965db44STomer Tayar 	if (packed)
2634c965db44STomer Tayar 		offset += qed_dump_num_param(dump_buf + offset,
2635c965db44STomer Tayar 					     dump, "packed", 1);
2636c965db44STomer Tayar 
2637c965db44STomer Tayar 	/* Dump reg type */
26382d22bc83SMichal Kalderon 	if (storm_letter) {
2639c965db44STomer Tayar 		strcpy(buf, "?STORM_");
2640c965db44STomer Tayar 		buf[0] = storm_letter;
2641c965db44STomer Tayar 		strcpy(buf + strlen(buf), mem_group);
2642c965db44STomer Tayar 	} else {
2643c965db44STomer Tayar 		strcpy(buf, mem_group);
2644c965db44STomer Tayar 	}
2645c965db44STomer Tayar 
2646c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset, dump, "type", buf);
26477b6859fbSMintz, Yuval 
2648c965db44STomer Tayar 	return offset;
2649c965db44STomer Tayar }
2650c965db44STomer Tayar 
2651c965db44STomer Tayar /* Dumps a single GRC memory. If name is NULL, the memory is stored by address.
2652c965db44STomer Tayar  * Returns the dumped size in dwords.
26537b6859fbSMintz, Yuval  * The addr and len arguments are specified in dwords.
2654c965db44STomer Tayar  */
qed_grc_dump_mem(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,const char * name,u32 addr,u32 len,bool wide_bus,u32 bit_width,bool packed,const char * mem_group,char storm_letter)2655c965db44STomer Tayar static u32 qed_grc_dump_mem(struct qed_hwfn *p_hwfn,
2656c965db44STomer Tayar 			    struct qed_ptt *p_ptt,
2657c965db44STomer Tayar 			    u32 *dump_buf,
2658c965db44STomer Tayar 			    bool dump,
2659c965db44STomer Tayar 			    const char *name,
2660be086e7cSMintz, Yuval 			    u32 addr,
2661be086e7cSMintz, Yuval 			    u32 len,
26627b6859fbSMintz, Yuval 			    bool wide_bus,
2663c965db44STomer Tayar 			    u32 bit_width,
2664c965db44STomer Tayar 			    bool packed,
26652d22bc83SMichal Kalderon 			    const char *mem_group, char storm_letter)
2666c965db44STomer Tayar {
2667c965db44STomer Tayar 	u32 offset = 0;
2668c965db44STomer Tayar 
2669c965db44STomer Tayar 	offset += qed_grc_dump_mem_hdr(p_hwfn,
2670c965db44STomer Tayar 				       dump_buf + offset,
2671c965db44STomer Tayar 				       dump,
2672c965db44STomer Tayar 				       name,
2673be086e7cSMintz, Yuval 				       addr,
2674be086e7cSMintz, Yuval 				       len,
2675c965db44STomer Tayar 				       bit_width,
26762d22bc83SMichal Kalderon 				       packed, mem_group, storm_letter);
2677be086e7cSMintz, Yuval 	offset += qed_grc_dump_addr_range(p_hwfn,
2678be086e7cSMintz, Yuval 					  p_ptt,
26797b6859fbSMintz, Yuval 					  dump_buf + offset,
2680d52c89f1SMichal Kalderon 					  dump, addr, len, wide_bus,
2681d52c89f1SMichal Kalderon 					  SPLIT_TYPE_NONE, 0);
26827b6859fbSMintz, Yuval 
2683c965db44STomer Tayar 	return offset;
2684c965db44STomer Tayar }
2685c965db44STomer Tayar 
2686c965db44STomer Tayar /* Dumps GRC memories entries. Returns the dumped size in dwords. */
qed_grc_dump_mem_entries(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,struct virt_mem_desc input_mems_arr,u32 * dump_buf,bool dump)2687c965db44STomer Tayar static u32 qed_grc_dump_mem_entries(struct qed_hwfn *p_hwfn,
2688c965db44STomer Tayar 				    struct qed_ptt *p_ptt,
26892d22bc83SMichal Kalderon 				    struct virt_mem_desc input_mems_arr,
2690c965db44STomer Tayar 				    u32 *dump_buf, bool dump)
2691c965db44STomer Tayar {
2692c965db44STomer Tayar 	u32 i, offset = 0, input_offset = 0;
2693c965db44STomer Tayar 	bool mode_match = true;
2694c965db44STomer Tayar 
26952d22bc83SMichal Kalderon 	while (input_offset < BYTES_TO_DWORDS(input_mems_arr.size)) {
2696c965db44STomer Tayar 		const struct dbg_dump_cond_hdr *cond_hdr;
26977b6859fbSMintz, Yuval 		u16 modes_buf_offset;
2698c965db44STomer Tayar 		u32 num_entries;
2699c965db44STomer Tayar 		bool eval_mode;
2700c965db44STomer Tayar 
27012d22bc83SMichal Kalderon 		cond_hdr =
27022d22bc83SMichal Kalderon 		    (const struct dbg_dump_cond_hdr *)input_mems_arr.ptr +
27032d22bc83SMichal Kalderon 		    input_offset++;
27047b6859fbSMintz, Yuval 		num_entries = cond_hdr->data_size / MEM_DUMP_ENTRY_SIZE_DWORDS;
2705c965db44STomer Tayar 
2706c965db44STomer Tayar 		/* Check required mode */
27077b6859fbSMintz, Yuval 		eval_mode = GET_FIELD(cond_hdr->mode.data,
27087b6859fbSMintz, Yuval 				      DBG_MODE_HDR_EVAL_MODE) > 0;
2709c965db44STomer Tayar 		if (eval_mode) {
27107b6859fbSMintz, Yuval 			modes_buf_offset =
2711c965db44STomer Tayar 				GET_FIELD(cond_hdr->mode.data,
2712c965db44STomer Tayar 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
2713c965db44STomer Tayar 			mode_match = qed_is_mode_match(p_hwfn,
2714c965db44STomer Tayar 						       &modes_buf_offset);
2715c965db44STomer Tayar 		}
2716c965db44STomer Tayar 
2717c965db44STomer Tayar 		if (!mode_match) {
2718c965db44STomer Tayar 			input_offset += cond_hdr->data_size;
2719c965db44STomer Tayar 			continue;
2720c965db44STomer Tayar 		}
2721c965db44STomer Tayar 
2722c965db44STomer Tayar 		for (i = 0; i < num_entries;
2723c965db44STomer Tayar 		     i++, input_offset += MEM_DUMP_ENTRY_SIZE_DWORDS) {
2724c965db44STomer Tayar 			const struct dbg_dump_mem *mem =
27252d22bc83SMichal Kalderon 			    (const struct dbg_dump_mem *)((u32 *)
27262d22bc83SMichal Kalderon 							  input_mems_arr.ptr
27272d22bc83SMichal Kalderon 							  + input_offset);
27282d22bc83SMichal Kalderon 			const struct dbg_block *block;
27292d22bc83SMichal Kalderon 			char storm_letter = 0;
27307b6859fbSMintz, Yuval 			u32 mem_addr, mem_len;
27312d22bc83SMichal Kalderon 			bool mem_wide_bus;
27322d22bc83SMichal Kalderon 			u8 mem_group_id;
27337b6859fbSMintz, Yuval 
27342d22bc83SMichal Kalderon 			mem_group_id = GET_FIELD(mem->dword0,
27352d22bc83SMichal Kalderon 						 DBG_DUMP_MEM_MEM_GROUP_ID);
2736c965db44STomer Tayar 			if (mem_group_id >= MEM_GROUPS_NUM) {
2737c965db44STomer Tayar 				DP_NOTICE(p_hwfn, "Invalid mem_group_id\n");
2738c965db44STomer Tayar 				return 0;
2739c965db44STomer Tayar 			}
2740c965db44STomer Tayar 
27417b6859fbSMintz, Yuval 			if (!qed_grc_is_mem_included(p_hwfn,
27422d22bc83SMichal Kalderon 						     (enum block_id)
27432d22bc83SMichal Kalderon 						     cond_hdr->block_id,
27447b6859fbSMintz, Yuval 						     mem_group_id))
27457b6859fbSMintz, Yuval 				continue;
27467b6859fbSMintz, Yuval 
27477b6859fbSMintz, Yuval 			mem_addr = GET_FIELD(mem->dword0, DBG_DUMP_MEM_ADDRESS);
27487b6859fbSMintz, Yuval 			mem_len = GET_FIELD(mem->dword1, DBG_DUMP_MEM_LENGTH);
27497b6859fbSMintz, Yuval 			mem_wide_bus = GET_FIELD(mem->dword1,
27507b6859fbSMintz, Yuval 						 DBG_DUMP_MEM_WIDE_BUS);
2751c965db44STomer Tayar 
27522d22bc83SMichal Kalderon 			block = get_dbg_block(p_hwfn,
27532d22bc83SMichal Kalderon 					      cond_hdr->block_id);
27542d22bc83SMichal Kalderon 
27552d22bc83SMichal Kalderon 			/* If memory is associated with Storm,
27562d22bc83SMichal Kalderon 			 * update storm details
2757c965db44STomer Tayar 			 */
27582d22bc83SMichal Kalderon 			if (block->associated_storm_letter)
27592d22bc83SMichal Kalderon 				storm_letter = block->associated_storm_letter;
2760c965db44STomer Tayar 
2761c965db44STomer Tayar 			/* Dump memory */
27627b6859fbSMintz, Yuval 			offset += qed_grc_dump_mem(p_hwfn,
27637b6859fbSMintz, Yuval 						p_ptt,
27647b6859fbSMintz, Yuval 						dump_buf + offset,
27657b6859fbSMintz, Yuval 						dump,
27667b6859fbSMintz, Yuval 						NULL,
27677b6859fbSMintz, Yuval 						mem_addr,
27687b6859fbSMintz, Yuval 						mem_len,
27697b6859fbSMintz, Yuval 						mem_wide_bus,
27707b6859fbSMintz, Yuval 						0,
2771c965db44STomer Tayar 						false,
2772c965db44STomer Tayar 						s_mem_group_names[mem_group_id],
27737b6859fbSMintz, Yuval 						storm_letter);
2774c965db44STomer Tayar 		}
2775c965db44STomer Tayar 	}
2776c965db44STomer Tayar 
2777c965db44STomer Tayar 	return offset;
2778c965db44STomer Tayar }
2779c965db44STomer Tayar 
2780c965db44STomer Tayar /* Dumps GRC memories according to the input array dump_mem.
2781c965db44STomer Tayar  * Returns the dumped size in dwords.
2782c965db44STomer Tayar  */
qed_grc_dump_memories(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)2783c965db44STomer Tayar static u32 qed_grc_dump_memories(struct qed_hwfn *p_hwfn,
2784c965db44STomer Tayar 				 struct qed_ptt *p_ptt,
2785c965db44STomer Tayar 				 u32 *dump_buf, bool dump)
2786c965db44STomer Tayar {
27872d22bc83SMichal Kalderon 	struct virt_mem_desc *dbg_buf =
27882d22bc83SMichal Kalderon 	    &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM];
2789c965db44STomer Tayar 	u32 offset = 0, input_offset = 0;
2790c965db44STomer Tayar 
27912d22bc83SMichal Kalderon 	while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
27927b6859fbSMintz, Yuval 		const struct dbg_dump_split_hdr *split_hdr;
27932d22bc83SMichal Kalderon 		struct virt_mem_desc curr_input_mems_arr;
2794d52c89f1SMichal Kalderon 		enum init_split_types split_type;
27957b6859fbSMintz, Yuval 		u32 split_data_size;
27967b6859fbSMintz, Yuval 
27972d22bc83SMichal Kalderon 		split_hdr =
27982d22bc83SMichal Kalderon 		    (const struct dbg_dump_split_hdr *)dbg_buf->ptr +
27992d22bc83SMichal Kalderon 		    input_offset++;
28002d22bc83SMichal Kalderon 		split_type = GET_FIELD(split_hdr->hdr,
2801c965db44STomer Tayar 				       DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
28022d22bc83SMichal Kalderon 		split_data_size = GET_FIELD(split_hdr->hdr,
2803c965db44STomer Tayar 					    DBG_DUMP_SPLIT_HDR_DATA_SIZE);
28042d22bc83SMichal Kalderon 		curr_input_mems_arr.ptr = (u32 *)dbg_buf->ptr + input_offset;
28052d22bc83SMichal Kalderon 		curr_input_mems_arr.size = DWORDS_TO_BYTES(split_data_size);
2806c965db44STomer Tayar 
2807d52c89f1SMichal Kalderon 		if (split_type == SPLIT_TYPE_NONE)
2808c965db44STomer Tayar 			offset += qed_grc_dump_mem_entries(p_hwfn,
2809c965db44STomer Tayar 							   p_ptt,
2810c965db44STomer Tayar 							   curr_input_mems_arr,
2811c965db44STomer Tayar 							   dump_buf + offset,
2812c965db44STomer Tayar 							   dump);
2813d52c89f1SMichal Kalderon 		else
2814c965db44STomer Tayar 			DP_NOTICE(p_hwfn,
2815c965db44STomer Tayar 				  "Dumping split memories is currently not supported\n");
2816c965db44STomer Tayar 
2817c965db44STomer Tayar 		input_offset += split_data_size;
2818c965db44STomer Tayar 	}
2819c965db44STomer Tayar 
2820c965db44STomer Tayar 	return offset;
2821c965db44STomer Tayar }
2822c965db44STomer Tayar 
2823c965db44STomer Tayar /* Dumps GRC context data for the specified Storm.
2824c965db44STomer Tayar  * Returns the dumped size in dwords.
28257b6859fbSMintz, Yuval  * The lid_size argument is specified in quad-regs.
2826c965db44STomer Tayar  */
qed_grc_dump_ctx_data(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,const char * name,u32 num_lids,enum cm_ctx_types ctx_type,u8 storm_id)2827c965db44STomer Tayar static u32 qed_grc_dump_ctx_data(struct qed_hwfn *p_hwfn,
2828c965db44STomer Tayar 				 struct qed_ptt *p_ptt,
2829c965db44STomer Tayar 				 u32 *dump_buf,
2830c965db44STomer Tayar 				 bool dump,
2831c965db44STomer Tayar 				 const char *name,
2832c965db44STomer Tayar 				 u32 num_lids,
28332d22bc83SMichal Kalderon 				 enum cm_ctx_types ctx_type, u8 storm_id)
2834c965db44STomer Tayar {
28352d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
28367b6859fbSMintz, Yuval 	struct storm_defs *storm = &s_storm_defs[storm_id];
28372d22bc83SMichal Kalderon 	u32 i, lid, lid_size, total_size;
28382d22bc83SMichal Kalderon 	u32 rd_reg_addr, offset = 0;
28392d22bc83SMichal Kalderon 
28402d22bc83SMichal Kalderon 	/* Convert quad-regs to dwords */
28412d22bc83SMichal Kalderon 	lid_size = storm->cm_ctx_lid_sizes[dev_data->chip_id][ctx_type] * 4;
2842c965db44STomer Tayar 
2843c965db44STomer Tayar 	if (!lid_size)
2844c965db44STomer Tayar 		return 0;
28457b6859fbSMintz, Yuval 
2846c965db44STomer Tayar 	total_size = num_lids * lid_size;
28477b6859fbSMintz, Yuval 
2848c965db44STomer Tayar 	offset += qed_grc_dump_mem_hdr(p_hwfn,
2849c965db44STomer Tayar 				       dump_buf + offset,
2850c965db44STomer Tayar 				       dump,
2851c965db44STomer Tayar 				       name,
2852c965db44STomer Tayar 				       0,
2853c965db44STomer Tayar 				       total_size,
2854c965db44STomer Tayar 				       lid_size * 32,
28552d22bc83SMichal Kalderon 				       false, name, storm->letter);
28567b6859fbSMintz, Yuval 
28577b6859fbSMintz, Yuval 	if (!dump)
28587b6859fbSMintz, Yuval 		return offset + total_size;
2859c965db44STomer Tayar 
28602d22bc83SMichal Kalderon 	rd_reg_addr = BYTES_TO_DWORDS(storm->cm_ctx_rd_addr[ctx_type]);
28612d22bc83SMichal Kalderon 
2862c965db44STomer Tayar 	/* Dump context data */
2863c965db44STomer Tayar 	for (lid = 0; lid < num_lids; lid++) {
28642d22bc83SMichal Kalderon 		for (i = 0; i < lid_size; i++) {
2865c965db44STomer Tayar 			qed_wr(p_hwfn,
28667b6859fbSMintz, Yuval 			       p_ptt, storm->cm_ctx_wr_addr, (i << 9) | lid);
28672d22bc83SMichal Kalderon 			offset += qed_grc_dump_addr_range(p_hwfn,
28682d22bc83SMichal Kalderon 							  p_ptt,
28692d22bc83SMichal Kalderon 							  dump_buf + offset,
28702d22bc83SMichal Kalderon 							  dump,
28712d22bc83SMichal Kalderon 							  rd_reg_addr,
28722d22bc83SMichal Kalderon 							  1,
28732d22bc83SMichal Kalderon 							  false,
28742d22bc83SMichal Kalderon 							  SPLIT_TYPE_NONE, 0);
2875c965db44STomer Tayar 		}
2876c965db44STomer Tayar 	}
2877c965db44STomer Tayar 
2878c965db44STomer Tayar 	return offset;
2879c965db44STomer Tayar }
2880c965db44STomer Tayar 
2881c965db44STomer Tayar /* Dumps GRC contexts. Returns the dumped size in dwords. */
qed_grc_dump_ctx(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)2882c965db44STomer Tayar static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn,
2883c965db44STomer Tayar 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
2884c965db44STomer Tayar {
2885c965db44STomer Tayar 	u32 offset = 0;
2886c965db44STomer Tayar 	u8 storm_id;
2887c965db44STomer Tayar 
2888c965db44STomer Tayar 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
2889c965db44STomer Tayar 		if (!qed_grc_is_storm_included(p_hwfn,
2890c965db44STomer Tayar 					       (enum dbg_storms)storm_id))
2891c965db44STomer Tayar 			continue;
2892c965db44STomer Tayar 
2893c965db44STomer Tayar 		/* Dump Conn AG context size */
28942d22bc83SMichal Kalderon 		offset += qed_grc_dump_ctx_data(p_hwfn,
2895c965db44STomer Tayar 						p_ptt,
2896c965db44STomer Tayar 						dump_buf + offset,
2897c965db44STomer Tayar 						dump,
2898c965db44STomer Tayar 						"CONN_AG_CTX",
28992d22bc83SMichal Kalderon 						NUM_OF_LCIDS,
29002d22bc83SMichal Kalderon 						CM_CTX_CONN_AG, storm_id);
2901c965db44STomer Tayar 
2902c965db44STomer Tayar 		/* Dump Conn ST context size */
29032d22bc83SMichal Kalderon 		offset += qed_grc_dump_ctx_data(p_hwfn,
2904c965db44STomer Tayar 						p_ptt,
2905c965db44STomer Tayar 						dump_buf + offset,
2906c965db44STomer Tayar 						dump,
2907c965db44STomer Tayar 						"CONN_ST_CTX",
29082d22bc83SMichal Kalderon 						NUM_OF_LCIDS,
29092d22bc83SMichal Kalderon 						CM_CTX_CONN_ST, storm_id);
2910c965db44STomer Tayar 
2911c965db44STomer Tayar 		/* Dump Task AG context size */
29122d22bc83SMichal Kalderon 		offset += qed_grc_dump_ctx_data(p_hwfn,
2913c965db44STomer Tayar 						p_ptt,
2914c965db44STomer Tayar 						dump_buf + offset,
2915c965db44STomer Tayar 						dump,
2916c965db44STomer Tayar 						"TASK_AG_CTX",
29172d22bc83SMichal Kalderon 						NUM_OF_LTIDS,
29182d22bc83SMichal Kalderon 						CM_CTX_TASK_AG, storm_id);
2919c965db44STomer Tayar 
2920c965db44STomer Tayar 		/* Dump Task ST context size */
29212d22bc83SMichal Kalderon 		offset += qed_grc_dump_ctx_data(p_hwfn,
2922c965db44STomer Tayar 						p_ptt,
2923c965db44STomer Tayar 						dump_buf + offset,
2924c965db44STomer Tayar 						dump,
2925c965db44STomer Tayar 						"TASK_ST_CTX",
29262d22bc83SMichal Kalderon 						NUM_OF_LTIDS,
29272d22bc83SMichal Kalderon 						CM_CTX_TASK_ST, storm_id);
2928c965db44STomer Tayar 	}
2929c965db44STomer Tayar 
2930c965db44STomer Tayar 	return offset;
2931c965db44STomer Tayar }
2932c965db44STomer Tayar 
29332d22bc83SMichal Kalderon #define VFC_STATUS_RESP_READY_BIT	0
29342d22bc83SMichal Kalderon #define VFC_STATUS_BUSY_BIT		1
29352d22bc83SMichal Kalderon #define VFC_STATUS_SENDING_CMD_BIT	2
29362d22bc83SMichal Kalderon 
29372d22bc83SMichal Kalderon #define VFC_POLLING_DELAY_MS	1
29382d22bc83SMichal Kalderon #define VFC_POLLING_COUNT		20
29392d22bc83SMichal Kalderon 
29402d22bc83SMichal Kalderon /* Reads data from VFC. Returns the number of dwords read (0 on error).
29412d22bc83SMichal Kalderon  * Sizes are specified in dwords.
29422d22bc83SMichal Kalderon  */
qed_grc_dump_read_from_vfc(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,struct storm_defs * storm,u32 * cmd_data,u32 cmd_size,u32 * addr_data,u32 addr_size,u32 resp_size,u32 * dump_buf)29432d22bc83SMichal Kalderon static u32 qed_grc_dump_read_from_vfc(struct qed_hwfn *p_hwfn,
29442d22bc83SMichal Kalderon 				      struct qed_ptt *p_ptt,
29452d22bc83SMichal Kalderon 				      struct storm_defs *storm,
29462d22bc83SMichal Kalderon 				      u32 *cmd_data,
29472d22bc83SMichal Kalderon 				      u32 cmd_size,
29482d22bc83SMichal Kalderon 				      u32 *addr_data,
29492d22bc83SMichal Kalderon 				      u32 addr_size,
29502d22bc83SMichal Kalderon 				      u32 resp_size, u32 *dump_buf)
2951c965db44STomer Tayar {
29522d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
29532d22bc83SMichal Kalderon 	u32 vfc_status, polling_ms, polling_count = 0, i;
29542d22bc83SMichal Kalderon 	u32 reg_addr, sem_base;
29552d22bc83SMichal Kalderon 	bool is_ready = false;
2956c965db44STomer Tayar 
29572d22bc83SMichal Kalderon 	sem_base = storm->sem_fast_mem_addr;
29582d22bc83SMichal Kalderon 	polling_ms = VFC_POLLING_DELAY_MS *
29592d22bc83SMichal Kalderon 	    s_hw_type_defs[dev_data->hw_type].delay_factor;
2960c965db44STomer Tayar 
29612d22bc83SMichal Kalderon 	/* Write VFC command */
29622d22bc83SMichal Kalderon 	ARR_REG_WR(p_hwfn,
2963c965db44STomer Tayar 		   p_ptt,
29642d22bc83SMichal Kalderon 		   sem_base + SEM_FAST_REG_VFC_DATA_WR,
29652d22bc83SMichal Kalderon 		   cmd_data, cmd_size);
29662d22bc83SMichal Kalderon 
29672d22bc83SMichal Kalderon 	/* Write VFC address */
29682d22bc83SMichal Kalderon 	ARR_REG_WR(p_hwfn,
29692d22bc83SMichal Kalderon 		   p_ptt,
29702d22bc83SMichal Kalderon 		   sem_base + SEM_FAST_REG_VFC_ADDR,
29712d22bc83SMichal Kalderon 		   addr_data, addr_size);
29722d22bc83SMichal Kalderon 
29732d22bc83SMichal Kalderon 	/* Read response */
29742d22bc83SMichal Kalderon 	for (i = 0; i < resp_size; i++) {
29752d22bc83SMichal Kalderon 		/* Poll until ready */
29762d22bc83SMichal Kalderon 		do {
29772d22bc83SMichal Kalderon 			reg_addr = sem_base + SEM_FAST_REG_VFC_STATUS;
29782d22bc83SMichal Kalderon 			qed_grc_dump_addr_range(p_hwfn,
29792d22bc83SMichal Kalderon 						p_ptt,
29802d22bc83SMichal Kalderon 						&vfc_status,
2981c965db44STomer Tayar 						true,
29822d22bc83SMichal Kalderon 						BYTES_TO_DWORDS(reg_addr),
29832d22bc83SMichal Kalderon 						1,
29842d22bc83SMichal Kalderon 						false, SPLIT_TYPE_NONE, 0);
29852d22bc83SMichal Kalderon 			is_ready = vfc_status & BIT(VFC_STATUS_RESP_READY_BIT);
29862d22bc83SMichal Kalderon 
29872d22bc83SMichal Kalderon 			if (!is_ready) {
29882d22bc83SMichal Kalderon 				if (polling_count++ == VFC_POLLING_COUNT)
29892d22bc83SMichal Kalderon 					return 0;
29902d22bc83SMichal Kalderon 
29912d22bc83SMichal Kalderon 				msleep(polling_ms);
2992c965db44STomer Tayar 			}
29932d22bc83SMichal Kalderon 		} while (!is_ready);
29942d22bc83SMichal Kalderon 
29952d22bc83SMichal Kalderon 		reg_addr = sem_base + SEM_FAST_REG_VFC_DATA_RD;
29962d22bc83SMichal Kalderon 		qed_grc_dump_addr_range(p_hwfn,
29972d22bc83SMichal Kalderon 					p_ptt,
29982d22bc83SMichal Kalderon 					dump_buf + i,
29992d22bc83SMichal Kalderon 					true,
30002d22bc83SMichal Kalderon 					BYTES_TO_DWORDS(reg_addr),
30012d22bc83SMichal Kalderon 					1, false, SPLIT_TYPE_NONE, 0);
3002c965db44STomer Tayar 	}
3003c965db44STomer Tayar 
30042d22bc83SMichal Kalderon 	return resp_size;
3005c965db44STomer Tayar }
3006c965db44STomer Tayar 
3007c965db44STomer Tayar /* Dump VFC CAM. Returns the dumped size in dwords. */
qed_grc_dump_vfc_cam(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u8 storm_id)3008c965db44STomer Tayar static u32 qed_grc_dump_vfc_cam(struct qed_hwfn *p_hwfn,
3009c965db44STomer Tayar 				struct qed_ptt *p_ptt,
3010c965db44STomer Tayar 				u32 *dump_buf, bool dump, u8 storm_id)
3011c965db44STomer Tayar {
3012c965db44STomer Tayar 	u32 total_size = VFC_CAM_NUM_ROWS * VFC_CAM_RESP_DWORDS;
30137b6859fbSMintz, Yuval 	struct storm_defs *storm = &s_storm_defs[storm_id];
3014c965db44STomer Tayar 	u32 cam_addr[VFC_CAM_ADDR_DWORDS] = { 0 };
3015c965db44STomer Tayar 	u32 cam_cmd[VFC_CAM_CMD_DWORDS] = { 0 };
30162d22bc83SMichal Kalderon 	u32 row, offset = 0;
3017c965db44STomer Tayar 
3018c965db44STomer Tayar 	offset += qed_grc_dump_mem_hdr(p_hwfn,
3019c965db44STomer Tayar 				       dump_buf + offset,
3020c965db44STomer Tayar 				       dump,
3021c965db44STomer Tayar 				       "vfc_cam",
3022c965db44STomer Tayar 				       0,
3023c965db44STomer Tayar 				       total_size,
3024c965db44STomer Tayar 				       256,
30252d22bc83SMichal Kalderon 				       false, "vfc_cam", storm->letter);
30267b6859fbSMintz, Yuval 
30277b6859fbSMintz, Yuval 	if (!dump)
30287b6859fbSMintz, Yuval 		return offset + total_size;
30297b6859fbSMintz, Yuval 
3030c965db44STomer Tayar 	/* Prepare CAM address */
3031c965db44STomer Tayar 	SET_VAR_FIELD(cam_addr, VFC_CAM_ADDR, OP, VFC_OPCODE_CAM_RD);
30327b6859fbSMintz, Yuval 
30332d22bc83SMichal Kalderon 	/* Read VFC CAM data */
30342d22bc83SMichal Kalderon 	for (row = 0; row < VFC_CAM_NUM_ROWS; row++) {
3035c965db44STomer Tayar 		SET_VAR_FIELD(cam_cmd, VFC_CAM_CMD, ROW, row);
30362d22bc83SMichal Kalderon 		offset += qed_grc_dump_read_from_vfc(p_hwfn,
3037c965db44STomer Tayar 						     p_ptt,
30382d22bc83SMichal Kalderon 						     storm,
30392d22bc83SMichal Kalderon 						     cam_cmd,
30402d22bc83SMichal Kalderon 						     VFC_CAM_CMD_DWORDS,
30412d22bc83SMichal Kalderon 						     cam_addr,
30422d22bc83SMichal Kalderon 						     VFC_CAM_ADDR_DWORDS,
30432d22bc83SMichal Kalderon 						     VFC_CAM_RESP_DWORDS,
30442d22bc83SMichal Kalderon 						     dump_buf + offset);
3045c965db44STomer Tayar 	}
3046c965db44STomer Tayar 
3047c965db44STomer Tayar 	return offset;
3048c965db44STomer Tayar }
3049c965db44STomer Tayar 
3050c965db44STomer Tayar /* Dump VFC RAM. Returns the dumped size in dwords. */
qed_grc_dump_vfc_ram(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u8 storm_id,struct vfc_ram_defs * ram_defs)3051c965db44STomer Tayar static u32 qed_grc_dump_vfc_ram(struct qed_hwfn *p_hwfn,
3052c965db44STomer Tayar 				struct qed_ptt *p_ptt,
3053c965db44STomer Tayar 				u32 *dump_buf,
3054c965db44STomer Tayar 				bool dump,
3055c965db44STomer Tayar 				u8 storm_id, struct vfc_ram_defs *ram_defs)
3056c965db44STomer Tayar {
3057c965db44STomer Tayar 	u32 total_size = ram_defs->num_rows * VFC_RAM_RESP_DWORDS;
30587b6859fbSMintz, Yuval 	struct storm_defs *storm = &s_storm_defs[storm_id];
3059c965db44STomer Tayar 	u32 ram_addr[VFC_RAM_ADDR_DWORDS] = { 0 };
3060c965db44STomer Tayar 	u32 ram_cmd[VFC_RAM_CMD_DWORDS] = { 0 };
30612d22bc83SMichal Kalderon 	u32 row, offset = 0;
3062c965db44STomer Tayar 
3063c965db44STomer Tayar 	offset += qed_grc_dump_mem_hdr(p_hwfn,
3064c965db44STomer Tayar 				       dump_buf + offset,
3065c965db44STomer Tayar 				       dump,
3066c965db44STomer Tayar 				       ram_defs->mem_name,
3067c965db44STomer Tayar 				       0,
3068c965db44STomer Tayar 				       total_size,
3069c965db44STomer Tayar 				       256,
3070c965db44STomer Tayar 				       false,
3071c965db44STomer Tayar 				       ram_defs->type_name,
30722d22bc83SMichal Kalderon 				       storm->letter);
3073c965db44STomer Tayar 
3074c965db44STomer Tayar 	if (!dump)
3075c965db44STomer Tayar 		return offset + total_size;
3076c965db44STomer Tayar 
30772d22bc83SMichal Kalderon 	/* Prepare RAM address */
30782d22bc83SMichal Kalderon 	SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, OP, VFC_OPCODE_RAM_RD);
30792d22bc83SMichal Kalderon 
30802d22bc83SMichal Kalderon 	/* Read VFC RAM data */
3081c965db44STomer Tayar 	for (row = ram_defs->base_row;
30822d22bc83SMichal Kalderon 	     row < ram_defs->base_row + ram_defs->num_rows; row++) {
3083c965db44STomer Tayar 		SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, ROW, row);
30842d22bc83SMichal Kalderon 		offset += qed_grc_dump_read_from_vfc(p_hwfn,
3085c965db44STomer Tayar 						     p_ptt,
30862d22bc83SMichal Kalderon 						     storm,
30872d22bc83SMichal Kalderon 						     ram_cmd,
30882d22bc83SMichal Kalderon 						     VFC_RAM_CMD_DWORDS,
30892d22bc83SMichal Kalderon 						     ram_addr,
30902d22bc83SMichal Kalderon 						     VFC_RAM_ADDR_DWORDS,
30912d22bc83SMichal Kalderon 						     VFC_RAM_RESP_DWORDS,
30922d22bc83SMichal Kalderon 						     dump_buf + offset);
3093c965db44STomer Tayar 	}
3094c965db44STomer Tayar 
3095c965db44STomer Tayar 	return offset;
3096c965db44STomer Tayar }
3097c965db44STomer Tayar 
3098c965db44STomer Tayar /* Dumps GRC VFC data. Returns the dumped size in dwords. */
qed_grc_dump_vfc(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)3099c965db44STomer Tayar static u32 qed_grc_dump_vfc(struct qed_hwfn *p_hwfn,
3100c965db44STomer Tayar 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3101c965db44STomer Tayar {
3102c965db44STomer Tayar 	u8 storm_id, i;
3103c965db44STomer Tayar 	u32 offset = 0;
3104c965db44STomer Tayar 
3105c965db44STomer Tayar 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
31067b6859fbSMintz, Yuval 		if (!qed_grc_is_storm_included(p_hwfn,
31077b6859fbSMintz, Yuval 					       (enum dbg_storms)storm_id) ||
31082d22bc83SMichal Kalderon 		    !s_storm_defs[storm_id].has_vfc)
31097b6859fbSMintz, Yuval 			continue;
31107b6859fbSMintz, Yuval 
3111c965db44STomer Tayar 		/* Read CAM */
3112c965db44STomer Tayar 		offset += qed_grc_dump_vfc_cam(p_hwfn,
3113c965db44STomer Tayar 					       p_ptt,
3114c965db44STomer Tayar 					       dump_buf + offset,
3115c965db44STomer Tayar 					       dump, storm_id);
3116c965db44STomer Tayar 
3117c965db44STomer Tayar 		/* Read RAM */
3118c965db44STomer Tayar 		for (i = 0; i < NUM_VFC_RAM_TYPES; i++)
3119c965db44STomer Tayar 			offset += qed_grc_dump_vfc_ram(p_hwfn,
3120c965db44STomer Tayar 						       p_ptt,
31217b6859fbSMintz, Yuval 						       dump_buf + offset,
3122c965db44STomer Tayar 						       dump,
3123c965db44STomer Tayar 						       storm_id,
31247b6859fbSMintz, Yuval 						       &s_vfc_ram_defs[i]);
3125c965db44STomer Tayar 	}
3126c965db44STomer Tayar 
3127c965db44STomer Tayar 	return offset;
3128c965db44STomer Tayar }
3129c965db44STomer Tayar 
3130c965db44STomer Tayar /* Dumps GRC RSS data. Returns the dumped size in dwords. */
qed_grc_dump_rss(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)3131c965db44STomer Tayar static u32 qed_grc_dump_rss(struct qed_hwfn *p_hwfn,
3132c965db44STomer Tayar 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3133c965db44STomer Tayar {
3134c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3135c965db44STomer Tayar 	u32 offset = 0;
3136c965db44STomer Tayar 	u8 rss_mem_id;
3137c965db44STomer Tayar 
3138c965db44STomer Tayar 	for (rss_mem_id = 0; rss_mem_id < NUM_RSS_MEM_TYPES; rss_mem_id++) {
3139da090917STomer Tayar 		u32 rss_addr, num_entries, total_dwords;
31407b6859fbSMintz, Yuval 		struct rss_mem_defs *rss_defs;
3141da090917STomer Tayar 		u32 addr, num_dwords_to_read;
31427b6859fbSMintz, Yuval 		bool packed;
31437b6859fbSMintz, Yuval 
31447b6859fbSMintz, Yuval 		rss_defs = &s_rss_mem_defs[rss_mem_id];
31457b6859fbSMintz, Yuval 		rss_addr = rss_defs->addr;
31467b6859fbSMintz, Yuval 		num_entries = rss_defs->num_entries[dev_data->chip_id];
3147da090917STomer Tayar 		total_dwords = (num_entries * rss_defs->entry_width) / 32;
3148da090917STomer Tayar 		packed = (rss_defs->entry_width == 16);
3149c965db44STomer Tayar 
3150c965db44STomer Tayar 		offset += qed_grc_dump_mem_hdr(p_hwfn,
3151c965db44STomer Tayar 					       dump_buf + offset,
3152c965db44STomer Tayar 					       dump,
3153c965db44STomer Tayar 					       rss_defs->mem_name,
3154be086e7cSMintz, Yuval 					       0,
3155be086e7cSMintz, Yuval 					       total_dwords,
3156da090917STomer Tayar 					       rss_defs->entry_width,
3157c965db44STomer Tayar 					       packed,
31582d22bc83SMichal Kalderon 					       rss_defs->type_name, 0);
3159c965db44STomer Tayar 
31607b6859fbSMintz, Yuval 		/* Dump RSS data */
3161c965db44STomer Tayar 		if (!dump) {
3162be086e7cSMintz, Yuval 			offset += total_dwords;
3163c965db44STomer Tayar 			continue;
3164c965db44STomer Tayar 		}
3165c965db44STomer Tayar 
3166be086e7cSMintz, Yuval 		addr = BYTES_TO_DWORDS(RSS_REG_RSS_RAM_DATA);
3167da090917STomer Tayar 		while (total_dwords) {
3168da090917STomer Tayar 			num_dwords_to_read = min_t(u32,
3169da090917STomer Tayar 						   RSS_REG_RSS_RAM_DATA_SIZE,
3170da090917STomer Tayar 						   total_dwords);
3171be086e7cSMintz, Yuval 			qed_wr(p_hwfn, p_ptt, RSS_REG_RSS_RAM_ADDR, rss_addr);
3172be086e7cSMintz, Yuval 			offset += qed_grc_dump_addr_range(p_hwfn,
3173be086e7cSMintz, Yuval 							  p_ptt,
31747b6859fbSMintz, Yuval 							  dump_buf + offset,
3175be086e7cSMintz, Yuval 							  dump,
3176be086e7cSMintz, Yuval 							  addr,
3177da090917STomer Tayar 							  num_dwords_to_read,
3178d52c89f1SMichal Kalderon 							  false,
3179d52c89f1SMichal Kalderon 							  SPLIT_TYPE_NONE, 0);
3180da090917STomer Tayar 			total_dwords -= num_dwords_to_read;
3181da090917STomer Tayar 			rss_addr++;
3182c965db44STomer Tayar 		}
3183c965db44STomer Tayar 	}
3184c965db44STomer Tayar 
3185c965db44STomer Tayar 	return offset;
3186c965db44STomer Tayar }
3187c965db44STomer Tayar 
3188c965db44STomer Tayar /* Dumps GRC Big RAM. Returns the dumped size in dwords. */
qed_grc_dump_big_ram(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u8 big_ram_id)3189c965db44STomer Tayar static u32 qed_grc_dump_big_ram(struct qed_hwfn *p_hwfn,
3190c965db44STomer Tayar 				struct qed_ptt *p_ptt,
3191c965db44STomer Tayar 				u32 *dump_buf, bool dump, u8 big_ram_id)
3192c965db44STomer Tayar {
3193c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3194da090917STomer Tayar 	u32 block_size, ram_size, offset = 0, reg_val, i;
3195c965db44STomer Tayar 	char mem_name[12] = "???_BIG_RAM";
3196c965db44STomer Tayar 	char type_name[8] = "???_RAM";
3197be086e7cSMintz, Yuval 	struct big_ram_defs *big_ram;
3198c965db44STomer Tayar 
3199be086e7cSMintz, Yuval 	big_ram = &s_big_ram_defs[big_ram_id];
3200da090917STomer Tayar 	ram_size = big_ram->ram_size[dev_data->chip_id];
3201da090917STomer Tayar 
3202da090917STomer Tayar 	reg_val = qed_rd(p_hwfn, p_ptt, big_ram->is_256b_reg_addr);
3203da090917STomer Tayar 	block_size = reg_val &
3204da090917STomer Tayar 		     BIT(big_ram->is_256b_bit_offset[dev_data->chip_id]) ? 256
3205da090917STomer Tayar 									 : 128;
3206c965db44STomer Tayar 
3207c7d852e3SDenis Bolotin 	strncpy(type_name, big_ram->instance_name, BIG_RAM_NAME_LEN);
3208c7d852e3SDenis Bolotin 	strncpy(mem_name, big_ram->instance_name, BIG_RAM_NAME_LEN);
3209c965db44STomer Tayar 
3210c965db44STomer Tayar 	/* Dump memory header */
3211c965db44STomer Tayar 	offset += qed_grc_dump_mem_hdr(p_hwfn,
3212c965db44STomer Tayar 				       dump_buf + offset,
3213c965db44STomer Tayar 				       dump,
3214c965db44STomer Tayar 				       mem_name,
3215c965db44STomer Tayar 				       0,
3216c965db44STomer Tayar 				       ram_size,
3217da090917STomer Tayar 				       block_size * 8,
32182d22bc83SMichal Kalderon 				       false, type_name, 0);
3219c965db44STomer Tayar 
32207b6859fbSMintz, Yuval 	/* Read and dump Big RAM data */
3221c965db44STomer Tayar 	if (!dump)
3222c965db44STomer Tayar 		return offset + ram_size;
3223c965db44STomer Tayar 
32247b6859fbSMintz, Yuval 	/* Dump Big RAM */
3225da090917STomer Tayar 	for (i = 0; i < DIV_ROUND_UP(ram_size, BRB_REG_BIG_RAM_DATA_SIZE);
3226da090917STomer Tayar 	     i++) {
3227be086e7cSMintz, Yuval 		u32 addr, len;
3228be086e7cSMintz, Yuval 
3229be086e7cSMintz, Yuval 		qed_wr(p_hwfn, p_ptt, big_ram->addr_reg_addr, i);
3230be086e7cSMintz, Yuval 		addr = BYTES_TO_DWORDS(big_ram->data_reg_addr);
3231da090917STomer Tayar 		len = BRB_REG_BIG_RAM_DATA_SIZE;
3232be086e7cSMintz, Yuval 		offset += qed_grc_dump_addr_range(p_hwfn,
3233be086e7cSMintz, Yuval 						  p_ptt,
3234be086e7cSMintz, Yuval 						  dump_buf + offset,
3235be086e7cSMintz, Yuval 						  dump,
3236be086e7cSMintz, Yuval 						  addr,
32377b6859fbSMintz, Yuval 						  len,
3238d52c89f1SMichal Kalderon 						  false, SPLIT_TYPE_NONE, 0);
3239c965db44STomer Tayar 	}
3240c965db44STomer Tayar 
3241c965db44STomer Tayar 	return offset;
3242c965db44STomer Tayar }
3243c965db44STomer Tayar 
32442d22bc83SMichal Kalderon /* Dumps MCP scratchpad. Returns the dumped size in dwords. */
qed_grc_dump_mcp(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)3245c965db44STomer Tayar static u32 qed_grc_dump_mcp(struct qed_hwfn *p_hwfn,
3246c965db44STomer Tayar 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3247c965db44STomer Tayar {
3248c965db44STomer Tayar 	bool block_enable[MAX_BLOCK_ID] = { 0 };
3249be086e7cSMintz, Yuval 	u32 offset = 0, addr;
3250c965db44STomer Tayar 	bool halted = false;
3251c965db44STomer Tayar 
3252c965db44STomer Tayar 	/* Halt MCP */
3253be086e7cSMintz, Yuval 	if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) {
3254c965db44STomer Tayar 		halted = !qed_mcp_halt(p_hwfn, p_ptt);
3255c965db44STomer Tayar 		if (!halted)
3256c965db44STomer Tayar 			DP_NOTICE(p_hwfn, "MCP halt failed!\n");
3257c965db44STomer Tayar 	}
3258c965db44STomer Tayar 
3259c965db44STomer Tayar 	/* Dump MCP scratchpad */
3260c965db44STomer Tayar 	offset += qed_grc_dump_mem(p_hwfn,
3261c965db44STomer Tayar 				   p_ptt,
3262c965db44STomer Tayar 				   dump_buf + offset,
3263c965db44STomer Tayar 				   dump,
3264c965db44STomer Tayar 				   NULL,
3265be086e7cSMintz, Yuval 				   BYTES_TO_DWORDS(MCP_REG_SCRATCH),
32662d22bc83SMichal Kalderon 				   MCP_REG_SCRATCH_SIZE,
32672d22bc83SMichal Kalderon 				   false, 0, false, "MCP", 0);
3268c965db44STomer Tayar 
3269c965db44STomer Tayar 	/* Dump MCP cpu_reg_file */
3270c965db44STomer Tayar 	offset += qed_grc_dump_mem(p_hwfn,
3271c965db44STomer Tayar 				   p_ptt,
3272c965db44STomer Tayar 				   dump_buf + offset,
3273c965db44STomer Tayar 				   dump,
3274c965db44STomer Tayar 				   NULL,
3275be086e7cSMintz, Yuval 				   BYTES_TO_DWORDS(MCP_REG_CPU_REG_FILE),
3276c965db44STomer Tayar 				   MCP_REG_CPU_REG_FILE_SIZE,
32772d22bc83SMichal Kalderon 				   false, 0, false, "MCP", 0);
3278c965db44STomer Tayar 
3279c965db44STomer Tayar 	/* Dump MCP registers */
3280c965db44STomer Tayar 	block_enable[BLOCK_MCP] = true;
3281c965db44STomer Tayar 	offset += qed_grc_dump_registers(p_hwfn,
3282c965db44STomer Tayar 					 p_ptt,
3283c965db44STomer Tayar 					 dump_buf + offset,
32842d22bc83SMichal Kalderon 					 dump, block_enable, "MCP");
3285c965db44STomer Tayar 
3286c965db44STomer Tayar 	/* Dump required non-MCP registers */
3287c965db44STomer Tayar 	offset += qed_grc_dump_regs_hdr(dump_buf + offset,
3288d52c89f1SMichal Kalderon 					dump, 1, SPLIT_TYPE_NONE, 0,
32892d22bc83SMichal Kalderon 					"MCP");
3290be086e7cSMintz, Yuval 	addr = BYTES_TO_DWORDS(MISC_REG_SHARED_MEM_ADDR);
3291c965db44STomer Tayar 	offset += qed_grc_dump_reg_entry(p_hwfn,
3292c965db44STomer Tayar 					 p_ptt,
3293c965db44STomer Tayar 					 dump_buf + offset,
3294c965db44STomer Tayar 					 dump,
3295be086e7cSMintz, Yuval 					 addr,
32967b6859fbSMintz, Yuval 					 1,
3297d52c89f1SMichal Kalderon 					 false, SPLIT_TYPE_NONE, 0);
3298c965db44STomer Tayar 
3299c965db44STomer Tayar 	/* Release MCP */
3300c965db44STomer Tayar 	if (halted && qed_mcp_resume(p_hwfn, p_ptt))
3301c965db44STomer Tayar 		DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n");
33027b6859fbSMintz, Yuval 
3303c965db44STomer Tayar 	return offset;
3304c965db44STomer Tayar }
3305c965db44STomer Tayar 
33062d22bc83SMichal Kalderon /* Dumps the tbus indirect memory for all PHYs.
33072d22bc83SMichal Kalderon  * Returns the dumped size in dwords.
33082d22bc83SMichal Kalderon  */
qed_grc_dump_phy(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)3309c965db44STomer Tayar static u32 qed_grc_dump_phy(struct qed_hwfn *p_hwfn,
3310c965db44STomer Tayar 			    struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3311c965db44STomer Tayar {
3312c965db44STomer Tayar 	u32 offset = 0, tbus_lo_offset, tbus_hi_offset;
3313c965db44STomer Tayar 	char mem_name[32];
3314c965db44STomer Tayar 	u8 phy_id;
3315c965db44STomer Tayar 
3316c965db44STomer Tayar 	for (phy_id = 0; phy_id < ARRAY_SIZE(s_phy_defs); phy_id++) {
33177b6859fbSMintz, Yuval 		u32 addr_lo_addr, addr_hi_addr, data_lo_addr, data_hi_addr;
33187b6859fbSMintz, Yuval 		struct phy_defs *phy_defs;
33197b6859fbSMintz, Yuval 		u8 *bytes_buf;
3320c965db44STomer Tayar 
33217b6859fbSMintz, Yuval 		phy_defs = &s_phy_defs[phy_id];
33227b6859fbSMintz, Yuval 		addr_lo_addr = phy_defs->base_addr +
33237b6859fbSMintz, Yuval 			       phy_defs->tbus_addr_lo_addr;
33247b6859fbSMintz, Yuval 		addr_hi_addr = phy_defs->base_addr +
33257b6859fbSMintz, Yuval 			       phy_defs->tbus_addr_hi_addr;
33267b6859fbSMintz, Yuval 		data_lo_addr = phy_defs->base_addr +
33277b6859fbSMintz, Yuval 			       phy_defs->tbus_data_lo_addr;
33287b6859fbSMintz, Yuval 		data_hi_addr = phy_defs->base_addr +
33297b6859fbSMintz, Yuval 			       phy_defs->tbus_data_hi_addr;
33307b6859fbSMintz, Yuval 
33317b6859fbSMintz, Yuval 		if (snprintf(mem_name, sizeof(mem_name), "tbus_%s",
33327b6859fbSMintz, Yuval 			     phy_defs->phy_name) < 0)
3333c965db44STomer Tayar 			DP_NOTICE(p_hwfn,
3334c965db44STomer Tayar 				  "Unexpected debug error: invalid PHY memory name\n");
33357b6859fbSMintz, Yuval 
3336c965db44STomer Tayar 		offset += qed_grc_dump_mem_hdr(p_hwfn,
3337c965db44STomer Tayar 					       dump_buf + offset,
3338c965db44STomer Tayar 					       dump,
3339c965db44STomer Tayar 					       mem_name,
3340c965db44STomer Tayar 					       0,
3341c965db44STomer Tayar 					       PHY_DUMP_SIZE_DWORDS,
33422d22bc83SMichal Kalderon 					       16, true, mem_name, 0);
33437b6859fbSMintz, Yuval 
33447b6859fbSMintz, Yuval 		if (!dump) {
33457b6859fbSMintz, Yuval 			offset += PHY_DUMP_SIZE_DWORDS;
33467b6859fbSMintz, Yuval 			continue;
33477b6859fbSMintz, Yuval 		}
3348c965db44STomer Tayar 
3349da090917STomer Tayar 		bytes_buf = (u8 *)(dump_buf + offset);
3350c965db44STomer Tayar 		for (tbus_hi_offset = 0;
3351c965db44STomer Tayar 		     tbus_hi_offset < (NUM_PHY_TBUS_ADDRESSES >> 8);
3352c965db44STomer Tayar 		     tbus_hi_offset++) {
33537b6859fbSMintz, Yuval 			qed_wr(p_hwfn, p_ptt, addr_hi_addr, tbus_hi_offset);
3354c965db44STomer Tayar 			for (tbus_lo_offset = 0; tbus_lo_offset < 256;
3355c965db44STomer Tayar 			     tbus_lo_offset++) {
3356c965db44STomer Tayar 				qed_wr(p_hwfn,
33577b6859fbSMintz, Yuval 				       p_ptt, addr_lo_addr, tbus_lo_offset);
33587b6859fbSMintz, Yuval 				*(bytes_buf++) = (u8)qed_rd(p_hwfn,
3359c965db44STomer Tayar 							    p_ptt,
3360c965db44STomer Tayar 							    data_lo_addr);
33617b6859fbSMintz, Yuval 				*(bytes_buf++) = (u8)qed_rd(p_hwfn,
33627b6859fbSMintz, Yuval 							    p_ptt,
3363c965db44STomer Tayar 							    data_hi_addr);
3364c965db44STomer Tayar 			}
3365c965db44STomer Tayar 		}
3366c965db44STomer Tayar 
3367c965db44STomer Tayar 		offset += PHY_DUMP_SIZE_DWORDS;
3368c965db44STomer Tayar 	}
3369c965db44STomer Tayar 
3370c965db44STomer Tayar 	return offset;
3371c965db44STomer Tayar }
3372c965db44STomer Tayar 
33732d22bc83SMichal Kalderon /* Dumps the MCP HW dump from NVRAM. Returns the dumped size in dwords. */
qed_grc_dump_mcp_hw_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)33742d22bc83SMichal Kalderon static u32 qed_grc_dump_mcp_hw_dump(struct qed_hwfn *p_hwfn,
33752d22bc83SMichal Kalderon 				    struct qed_ptt *p_ptt,
33762d22bc83SMichal Kalderon 				    u32 *dump_buf, bool dump)
33772d22bc83SMichal Kalderon {
33782d22bc83SMichal Kalderon 	u32 hw_dump_offset_bytes = 0, hw_dump_size_bytes = 0;
33792d22bc83SMichal Kalderon 	u32 hw_dump_size_dwords = 0, offset = 0;
33802d22bc83SMichal Kalderon 	enum dbg_status status;
33812d22bc83SMichal Kalderon 
33822d22bc83SMichal Kalderon 	/* Read HW dump image from NVRAM */
33832d22bc83SMichal Kalderon 	status = qed_find_nvram_image(p_hwfn,
33842d22bc83SMichal Kalderon 				      p_ptt,
33852d22bc83SMichal Kalderon 				      NVM_TYPE_HW_DUMP_OUT,
33862d22bc83SMichal Kalderon 				      &hw_dump_offset_bytes,
3387*5401c3e0SCaleb Sander 				      &hw_dump_size_bytes,
3388*5401c3e0SCaleb Sander 				      false);
33892d22bc83SMichal Kalderon 	if (status != DBG_STATUS_OK)
33902d22bc83SMichal Kalderon 		return 0;
33912d22bc83SMichal Kalderon 
33922d22bc83SMichal Kalderon 	hw_dump_size_dwords = BYTES_TO_DWORDS(hw_dump_size_bytes);
33932d22bc83SMichal Kalderon 
33942d22bc83SMichal Kalderon 	/* Dump HW dump image section */
33952d22bc83SMichal Kalderon 	offset += qed_dump_section_hdr(dump_buf + offset,
33962d22bc83SMichal Kalderon 				       dump, "mcp_hw_dump", 1);
33972d22bc83SMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
33982d22bc83SMichal Kalderon 				     dump, "size", hw_dump_size_dwords);
33992d22bc83SMichal Kalderon 
34002d22bc83SMichal Kalderon 	/* Read MCP HW dump image into dump buffer */
34012d22bc83SMichal Kalderon 	if (dump && hw_dump_size_dwords) {
34022d22bc83SMichal Kalderon 		status = qed_nvram_read(p_hwfn,
34032d22bc83SMichal Kalderon 					p_ptt,
34042d22bc83SMichal Kalderon 					hw_dump_offset_bytes,
3405*5401c3e0SCaleb Sander 					hw_dump_size_bytes,
3406*5401c3e0SCaleb Sander 					dump_buf + offset,
3407*5401c3e0SCaleb Sander 					false);
34082d22bc83SMichal Kalderon 		if (status != DBG_STATUS_OK) {
34092d22bc83SMichal Kalderon 			DP_NOTICE(p_hwfn,
34102d22bc83SMichal Kalderon 				  "Failed to read MCP HW Dump image from NVRAM\n");
34112d22bc83SMichal Kalderon 			return 0;
34122d22bc83SMichal Kalderon 		}
34132d22bc83SMichal Kalderon 	}
34142d22bc83SMichal Kalderon 	offset += hw_dump_size_dwords;
34152d22bc83SMichal Kalderon 
34162d22bc83SMichal Kalderon 	return offset;
3417c965db44STomer Tayar }
3418c965db44STomer Tayar 
3419c965db44STomer Tayar /* Dumps Static Debug data. Returns the dumped size in dwords. */
qed_grc_dump_static_debug(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)3420c965db44STomer Tayar static u32 qed_grc_dump_static_debug(struct qed_hwfn *p_hwfn,
3421c965db44STomer Tayar 				     struct qed_ptt *p_ptt,
3422c965db44STomer Tayar 				     u32 *dump_buf, bool dump)
3423c965db44STomer Tayar {
3424c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
34252d22bc83SMichal Kalderon 	u32 block_id, line_id, offset = 0, addr, len;
34267b6859fbSMintz, Yuval 
3427da090917STomer Tayar 	/* Don't dump static debug if a debug bus recording is in progress */
3428da090917STomer Tayar 	if (dump && qed_rd(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON))
34297b6859fbSMintz, Yuval 		return 0;
3430c965db44STomer Tayar 
3431c965db44STomer Tayar 	if (dump) {
34322d22bc83SMichal Kalderon 		/* Disable debug bus in all blocks */
34332d22bc83SMichal Kalderon 		qed_bus_disable_blocks(p_hwfn, p_ptt);
3434c965db44STomer Tayar 
3435c965db44STomer Tayar 		qed_bus_reset_dbg_block(p_hwfn, p_ptt);
34362d22bc83SMichal Kalderon 		qed_wr(p_hwfn,
34372d22bc83SMichal Kalderon 		       p_ptt, DBG_REG_FRAMING_MODE, DBG_BUS_FRAME_MODE_8HW);
3438c965db44STomer Tayar 		qed_wr(p_hwfn,
3439c965db44STomer Tayar 		       p_ptt, DBG_REG_DEBUG_TARGET, DBG_BUS_TARGET_ID_INT_BUF);
3440c965db44STomer Tayar 		qed_wr(p_hwfn, p_ptt, DBG_REG_FULL_MODE, 1);
3441c965db44STomer Tayar 		qed_bus_enable_dbg_block(p_hwfn, p_ptt, true);
3442c965db44STomer Tayar 	}
3443c965db44STomer Tayar 
3444c965db44STomer Tayar 	/* Dump all static debug lines for each relevant block */
3445c965db44STomer Tayar 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
34462d22bc83SMichal Kalderon 		const struct dbg_block_chip *block_per_chip;
34472d22bc83SMichal Kalderon 		const struct dbg_block *block;
34482d22bc83SMichal Kalderon 		bool is_removed, has_dbg_bus;
34492d22bc83SMichal Kalderon 		u16 modes_buf_offset;
34502d22bc83SMichal Kalderon 		u32 block_dwords;
3451c965db44STomer Tayar 
34522d22bc83SMichal Kalderon 		block_per_chip =
34532d22bc83SMichal Kalderon 		    qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)block_id);
34542d22bc83SMichal Kalderon 		is_removed = GET_FIELD(block_per_chip->flags,
34552d22bc83SMichal Kalderon 				       DBG_BLOCK_CHIP_IS_REMOVED);
34562d22bc83SMichal Kalderon 		has_dbg_bus = GET_FIELD(block_per_chip->flags,
34572d22bc83SMichal Kalderon 					DBG_BLOCK_CHIP_HAS_DBG_BUS);
34582d22bc83SMichal Kalderon 
34592d22bc83SMichal Kalderon 		if (!is_removed && has_dbg_bus &&
34602d22bc83SMichal Kalderon 		    GET_FIELD(block_per_chip->dbg_bus_mode.data,
34612d22bc83SMichal Kalderon 			      DBG_MODE_HDR_EVAL_MODE) > 0) {
34622d22bc83SMichal Kalderon 			modes_buf_offset =
34632d22bc83SMichal Kalderon 			    GET_FIELD(block_per_chip->dbg_bus_mode.data,
34642d22bc83SMichal Kalderon 				      DBG_MODE_HDR_MODES_BUF_OFFSET);
34652d22bc83SMichal Kalderon 			if (!qed_is_mode_match(p_hwfn, &modes_buf_offset))
34662d22bc83SMichal Kalderon 				has_dbg_bus = false;
34672d22bc83SMichal Kalderon 		}
34682d22bc83SMichal Kalderon 
34692d22bc83SMichal Kalderon 		if (is_removed || !has_dbg_bus)
34702d22bc83SMichal Kalderon 			continue;
34712d22bc83SMichal Kalderon 
34722d22bc83SMichal Kalderon 		block_dwords = NUM_DBG_LINES(block_per_chip) *
34737b6859fbSMintz, Yuval 			       STATIC_DEBUG_LINE_DWORDS;
34747b6859fbSMintz, Yuval 
3475c965db44STomer Tayar 		/* Dump static section params */
34762d22bc83SMichal Kalderon 		block = get_dbg_block(p_hwfn, (enum block_id)block_id);
3477c965db44STomer Tayar 		offset += qed_grc_dump_mem_hdr(p_hwfn,
3478c965db44STomer Tayar 					       dump_buf + offset,
3479c965db44STomer Tayar 					       dump,
34807b6859fbSMintz, Yuval 					       block->name,
34817b6859fbSMintz, Yuval 					       0,
34827b6859fbSMintz, Yuval 					       block_dwords,
34832d22bc83SMichal Kalderon 					       32, false, "STATIC", 0);
3484c965db44STomer Tayar 
34857b6859fbSMintz, Yuval 		if (!dump) {
34867b6859fbSMintz, Yuval 			offset += block_dwords;
34877b6859fbSMintz, Yuval 			continue;
34887b6859fbSMintz, Yuval 		}
34897b6859fbSMintz, Yuval 
34907b6859fbSMintz, Yuval 		/* If all lines are invalid - dump zeros */
34917b6859fbSMintz, Yuval 		if (dev_data->block_in_reset[block_id]) {
34927b6859fbSMintz, Yuval 			memset(dump_buf + offset, 0,
34937b6859fbSMintz, Yuval 			       DWORDS_TO_BYTES(block_dwords));
34947b6859fbSMintz, Yuval 			offset += block_dwords;
34957b6859fbSMintz, Yuval 			continue;
34967b6859fbSMintz, Yuval 		}
3497c965db44STomer Tayar 
3498c965db44STomer Tayar 		/* Enable block's client */
34997b6859fbSMintz, Yuval 		qed_bus_enable_clients(p_hwfn,
35007b6859fbSMintz, Yuval 				       p_ptt,
35012d22bc83SMichal Kalderon 				       BIT(block_per_chip->dbg_client_id));
3502c965db44STomer Tayar 
35037b6859fbSMintz, Yuval 		addr = BYTES_TO_DWORDS(DBG_REG_CALENDAR_OUT_DATA);
35047b6859fbSMintz, Yuval 		len = STATIC_DEBUG_LINE_DWORDS;
35052d22bc83SMichal Kalderon 		for (line_id = 0; line_id < (u32)NUM_DBG_LINES(block_per_chip);
3506c965db44STomer Tayar 		     line_id++) {
3507c965db44STomer Tayar 			/* Configure debug line ID */
35082d22bc83SMichal Kalderon 			qed_bus_config_dbg_line(p_hwfn,
3509c965db44STomer Tayar 						p_ptt,
3510c965db44STomer Tayar 						(enum block_id)block_id,
35117b6859fbSMintz, Yuval 						(u8)line_id, 0xf, 0, 0, 0);
3512c965db44STomer Tayar 
3513c965db44STomer Tayar 			/* Read debug line info */
35147b6859fbSMintz, Yuval 			offset += qed_grc_dump_addr_range(p_hwfn,
3515be086e7cSMintz, Yuval 							  p_ptt,
3516be086e7cSMintz, Yuval 							  dump_buf + offset,
3517be086e7cSMintz, Yuval 							  dump,
3518be086e7cSMintz, Yuval 							  addr,
35197b6859fbSMintz, Yuval 							  len,
3520d52c89f1SMichal Kalderon 							  true, SPLIT_TYPE_NONE,
3521d52c89f1SMichal Kalderon 							  0);
3522c965db44STomer Tayar 		}
3523c965db44STomer Tayar 
3524c965db44STomer Tayar 		/* Disable block's client and debug output */
3525c965db44STomer Tayar 		qed_bus_enable_clients(p_hwfn, p_ptt, 0);
35262d22bc83SMichal Kalderon 		qed_bus_config_dbg_line(p_hwfn, p_ptt,
35272d22bc83SMichal Kalderon 					(enum block_id)block_id, 0, 0, 0, 0, 0);
3528c965db44STomer Tayar 	}
3529c965db44STomer Tayar 
3530c965db44STomer Tayar 	if (dump) {
3531c965db44STomer Tayar 		qed_bus_enable_dbg_block(p_hwfn, p_ptt, false);
3532c965db44STomer Tayar 		qed_bus_enable_clients(p_hwfn, p_ptt, 0);
3533c965db44STomer Tayar 	}
3534c965db44STomer Tayar 
3535c965db44STomer Tayar 	return offset;
3536c965db44STomer Tayar }
3537c965db44STomer Tayar 
3538c965db44STomer Tayar /* Performs GRC Dump to the specified buffer.
3539c965db44STomer Tayar  * Returns the dumped size in dwords.
3540c965db44STomer Tayar  */
qed_grc_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u32 * num_dumped_dwords)3541c965db44STomer Tayar static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn,
3542c965db44STomer Tayar 				    struct qed_ptt *p_ptt,
3543c965db44STomer Tayar 				    u32 *dump_buf,
3544c965db44STomer Tayar 				    bool dump, u32 *num_dumped_dwords)
3545c965db44STomer Tayar {
3546c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3547c965db44STomer Tayar 	bool parities_masked = false;
35486c95dd8fSPrabhakar Kushwaha 	u32 dwords_read, offset = 0;
3549d52c89f1SMichal Kalderon 	u8 i;
3550c965db44STomer Tayar 
3551c965db44STomer Tayar 	*num_dumped_dwords = 0;
3552d52c89f1SMichal Kalderon 	dev_data->num_regs_read = 0;
3553c965db44STomer Tayar 
3554c965db44STomer Tayar 	/* Update reset state */
3555d52c89f1SMichal Kalderon 	if (dump)
3556c965db44STomer Tayar 		qed_update_blocks_reset_state(p_hwfn, p_ptt);
3557c965db44STomer Tayar 
3558c965db44STomer Tayar 	/* Dump global params */
3559c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
3560c965db44STomer Tayar 						p_ptt,
3561c965db44STomer Tayar 						dump_buf + offset, dump, 4);
3562c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
3563c965db44STomer Tayar 				     dump, "dump-type", "grc-dump");
3564c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
3565c965db44STomer Tayar 				     dump,
3566c965db44STomer Tayar 				     "num-lcids",
35672d22bc83SMichal Kalderon 				     NUM_OF_LCIDS);
3568c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
3569c965db44STomer Tayar 				     dump,
3570c965db44STomer Tayar 				     "num-ltids",
35712d22bc83SMichal Kalderon 				     NUM_OF_LTIDS);
3572c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
3573d52c89f1SMichal Kalderon 				     dump, "num-ports", dev_data->num_ports);
3574c965db44STomer Tayar 
3575c965db44STomer Tayar 	/* Dump reset registers (dumped before taking blocks out of reset ) */
3576c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS))
3577c965db44STomer Tayar 		offset += qed_grc_dump_reset_regs(p_hwfn,
3578c965db44STomer Tayar 						  p_ptt,
3579c965db44STomer Tayar 						  dump_buf + offset, dump);
3580c965db44STomer Tayar 
3581c965db44STomer Tayar 	/* Take all blocks out of reset (using reset registers) */
3582c965db44STomer Tayar 	if (dump) {
35832d22bc83SMichal Kalderon 		qed_grc_unreset_blocks(p_hwfn, p_ptt, false);
3584c965db44STomer Tayar 		qed_update_blocks_reset_state(p_hwfn, p_ptt);
3585c965db44STomer Tayar 	}
3586c965db44STomer Tayar 
3587c965db44STomer Tayar 	/* Disable all parities using MFW command */
35887b6859fbSMintz, Yuval 	if (dump &&
35897b6859fbSMintz, Yuval 	    !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) {
3590c965db44STomer Tayar 		parities_masked = !qed_mcp_mask_parities(p_hwfn, p_ptt, 1);
3591c965db44STomer Tayar 		if (!parities_masked) {
3592be086e7cSMintz, Yuval 			DP_NOTICE(p_hwfn,
3593be086e7cSMintz, Yuval 				  "Failed to mask parities using MFW\n");
3594c965db44STomer Tayar 			if (qed_grc_get_param
3595c965db44STomer Tayar 			    (p_hwfn, DBG_GRC_PARAM_PARITY_SAFE))
3596c965db44STomer Tayar 				return DBG_STATUS_MCP_COULD_NOT_MASK_PRTY;
3597c965db44STomer Tayar 		}
3598c965db44STomer Tayar 	}
3599c965db44STomer Tayar 
3600c965db44STomer Tayar 	/* Dump modified registers (dumped before modifying them) */
3601c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS))
3602c965db44STomer Tayar 		offset += qed_grc_dump_modified_regs(p_hwfn,
3603c965db44STomer Tayar 						     p_ptt,
3604c965db44STomer Tayar 						     dump_buf + offset, dump);
3605c965db44STomer Tayar 
3606c965db44STomer Tayar 	/* Stall storms */
3607c965db44STomer Tayar 	if (dump &&
3608c965db44STomer Tayar 	    (qed_grc_is_included(p_hwfn,
3609c965db44STomer Tayar 				 DBG_GRC_PARAM_DUMP_IOR) ||
3610c965db44STomer Tayar 	     qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)))
3611c965db44STomer Tayar 		qed_grc_stall_storms(p_hwfn, p_ptt, true);
3612c965db44STomer Tayar 
3613c965db44STomer Tayar 	/* Dump all regs  */
3614c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) {
3615c965db44STomer Tayar 		bool block_enable[MAX_BLOCK_ID];
3616c965db44STomer Tayar 
36177b6859fbSMintz, Yuval 		/* Dump all blocks except MCP */
3618c965db44STomer Tayar 		for (i = 0; i < MAX_BLOCK_ID; i++)
3619c965db44STomer Tayar 			block_enable[i] = true;
3620c965db44STomer Tayar 		block_enable[BLOCK_MCP] = false;
3621c965db44STomer Tayar 		offset += qed_grc_dump_registers(p_hwfn,
3622c965db44STomer Tayar 						 p_ptt,
3623c965db44STomer Tayar 						 dump_buf +
3624c965db44STomer Tayar 						 offset,
3625c965db44STomer Tayar 						 dump,
36262d22bc83SMichal Kalderon 						 block_enable, NULL);
3627be086e7cSMintz, Yuval 
3628be086e7cSMintz, Yuval 		/* Dump special registers */
3629be086e7cSMintz, Yuval 		offset += qed_grc_dump_special_regs(p_hwfn,
3630be086e7cSMintz, Yuval 						    p_ptt,
3631be086e7cSMintz, Yuval 						    dump_buf + offset, dump);
3632c965db44STomer Tayar 	}
3633c965db44STomer Tayar 
3634c965db44STomer Tayar 	/* Dump memories */
3635c965db44STomer Tayar 	offset += qed_grc_dump_memories(p_hwfn, p_ptt, dump_buf + offset, dump);
3636c965db44STomer Tayar 
3637c965db44STomer Tayar 	/* Dump MCP */
3638c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP))
3639c965db44STomer Tayar 		offset += qed_grc_dump_mcp(p_hwfn,
3640c965db44STomer Tayar 					   p_ptt, dump_buf + offset, dump);
3641c965db44STomer Tayar 
3642c965db44STomer Tayar 	/* Dump context */
3643c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX))
3644c965db44STomer Tayar 		offset += qed_grc_dump_ctx(p_hwfn,
3645c965db44STomer Tayar 					   p_ptt, dump_buf + offset, dump);
3646c965db44STomer Tayar 
3647c965db44STomer Tayar 	/* Dump RSS memories */
3648c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RSS))
3649c965db44STomer Tayar 		offset += qed_grc_dump_rss(p_hwfn,
3650c965db44STomer Tayar 					   p_ptt, dump_buf + offset, dump);
3651c965db44STomer Tayar 
3652c965db44STomer Tayar 	/* Dump Big RAM */
3653c965db44STomer Tayar 	for (i = 0; i < NUM_BIG_RAM_TYPES; i++)
3654c965db44STomer Tayar 		if (qed_grc_is_included(p_hwfn, s_big_ram_defs[i].grc_param))
3655c965db44STomer Tayar 			offset += qed_grc_dump_big_ram(p_hwfn,
3656c965db44STomer Tayar 						       p_ptt,
3657c965db44STomer Tayar 						       dump_buf + offset,
3658c965db44STomer Tayar 						       dump, i);
3659c965db44STomer Tayar 
3660c965db44STomer Tayar 	/* Dump VFC */
36612d22bc83SMichal Kalderon 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)) {
36622d22bc83SMichal Kalderon 		dwords_read = qed_grc_dump_vfc(p_hwfn,
3663c965db44STomer Tayar 					       p_ptt, dump_buf + offset, dump);
36642d22bc83SMichal Kalderon 		offset += dwords_read;
36652d22bc83SMichal Kalderon 		if (!dwords_read)
36662d22bc83SMichal Kalderon 			return DBG_STATUS_VFC_READ_ERROR;
36672d22bc83SMichal Kalderon 	}
3668c965db44STomer Tayar 
3669c965db44STomer Tayar 	/* Dump PHY tbus */
3670c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn,
3671c965db44STomer Tayar 				DBG_GRC_PARAM_DUMP_PHY) && dev_data->chip_id ==
36722d22bc83SMichal Kalderon 	    CHIP_K2 && dev_data->hw_type == HW_TYPE_ASIC)
3673c965db44STomer Tayar 		offset += qed_grc_dump_phy(p_hwfn,
3674c965db44STomer Tayar 					   p_ptt, dump_buf + offset, dump);
3675c965db44STomer Tayar 
36762d22bc83SMichal Kalderon 	/* Dump MCP HW Dump */
36772d22bc83SMichal Kalderon 	if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP_HW_DUMP) &&
36782d22bc83SMichal Kalderon 	    !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP) && 1)
36792d22bc83SMichal Kalderon 		offset += qed_grc_dump_mcp_hw_dump(p_hwfn,
36802d22bc83SMichal Kalderon 						   p_ptt,
36812d22bc83SMichal Kalderon 						   dump_buf + offset, dump);
36822d22bc83SMichal Kalderon 
3683d52c89f1SMichal Kalderon 	/* Dump static debug data (only if not during debug bus recording) */
3684c965db44STomer Tayar 	if (qed_grc_is_included(p_hwfn,
3685c965db44STomer Tayar 				DBG_GRC_PARAM_DUMP_STATIC) &&
3686d52c89f1SMichal Kalderon 	    (!dump || dev_data->bus.state == DBG_BUS_STATE_IDLE))
3687c965db44STomer Tayar 		offset += qed_grc_dump_static_debug(p_hwfn,
3688c965db44STomer Tayar 						    p_ptt,
3689c965db44STomer Tayar 						    dump_buf + offset, dump);
3690c965db44STomer Tayar 
3691c965db44STomer Tayar 	/* Dump last section */
3692da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
36937b6859fbSMintz, Yuval 
3694c965db44STomer Tayar 	if (dump) {
3695c965db44STomer Tayar 		/* Unstall storms */
3696c965db44STomer Tayar 		if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_UNSTALL))
3697c965db44STomer Tayar 			qed_grc_stall_storms(p_hwfn, p_ptt, false);
3698c965db44STomer Tayar 
3699c965db44STomer Tayar 		/* Clear parity status */
3700c965db44STomer Tayar 		qed_grc_clear_all_prty(p_hwfn, p_ptt);
3701c965db44STomer Tayar 
3702c965db44STomer Tayar 		/* Enable all parities using MFW command */
3703c965db44STomer Tayar 		if (parities_masked)
3704c965db44STomer Tayar 			qed_mcp_mask_parities(p_hwfn, p_ptt, 0);
3705c965db44STomer Tayar 	}
3706c965db44STomer Tayar 
3707c965db44STomer Tayar 	*num_dumped_dwords = offset;
3708c965db44STomer Tayar 
3709c965db44STomer Tayar 	return DBG_STATUS_OK;
3710c965db44STomer Tayar }
3711c965db44STomer Tayar 
3712c965db44STomer Tayar /* Writes the specified failing Idle Check rule to the specified buffer.
3713c965db44STomer Tayar  * Returns the dumped size in dwords.
3714c965db44STomer Tayar  */
qed_idle_chk_dump_failure(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u16 rule_id,const struct dbg_idle_chk_rule * rule,u16 fail_entry_id,u32 * cond_reg_values)3715c965db44STomer Tayar static u32 qed_idle_chk_dump_failure(struct qed_hwfn *p_hwfn,
3716c965db44STomer Tayar 				     struct qed_ptt *p_ptt,
37176c95dd8fSPrabhakar Kushwaha 				     u32 *dump_buf,
3718c965db44STomer Tayar 				     bool dump,
3719c965db44STomer Tayar 				     u16 rule_id,
3720c965db44STomer Tayar 				     const struct dbg_idle_chk_rule *rule,
3721c965db44STomer Tayar 				     u16 fail_entry_id, u32 *cond_reg_values)
3722c965db44STomer Tayar {
3723c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
37247b6859fbSMintz, Yuval 	const struct dbg_idle_chk_cond_reg *cond_regs;
37257b6859fbSMintz, Yuval 	const struct dbg_idle_chk_info_reg *info_regs;
37267b6859fbSMintz, Yuval 	u32 i, next_reg_offset = 0, offset = 0;
37277b6859fbSMintz, Yuval 	struct dbg_idle_chk_result_hdr *hdr;
37287b6859fbSMintz, Yuval 	const union dbg_idle_chk_reg *regs;
3729c965db44STomer Tayar 	u8 reg_id;
3730c965db44STomer Tayar 
37317b6859fbSMintz, Yuval 	hdr = (struct dbg_idle_chk_result_hdr *)dump_buf;
37322d22bc83SMichal Kalderon 	regs = (const union dbg_idle_chk_reg *)
37332d22bc83SMichal Kalderon 		p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr +
37342d22bc83SMichal Kalderon 		rule->reg_offset;
37357b6859fbSMintz, Yuval 	cond_regs = &regs[0].cond_reg;
37367b6859fbSMintz, Yuval 	info_regs = &regs[rule->num_cond_regs].info_reg;
37377b6859fbSMintz, Yuval 
3738c965db44STomer Tayar 	/* Dump rule data */
3739c965db44STomer Tayar 	if (dump) {
3740c965db44STomer Tayar 		memset(hdr, 0, sizeof(*hdr));
3741c965db44STomer Tayar 		hdr->rule_id = rule_id;
3742c965db44STomer Tayar 		hdr->mem_entry_id = fail_entry_id;
3743c965db44STomer Tayar 		hdr->severity = rule->severity;
3744c965db44STomer Tayar 		hdr->num_dumped_cond_regs = rule->num_cond_regs;
3745c965db44STomer Tayar 	}
3746c965db44STomer Tayar 
3747c965db44STomer Tayar 	offset += IDLE_CHK_RESULT_HDR_DWORDS;
3748c965db44STomer Tayar 
3749c965db44STomer Tayar 	/* Dump condition register values */
3750c965db44STomer Tayar 	for (reg_id = 0; reg_id < rule->num_cond_regs; reg_id++) {
3751c965db44STomer Tayar 		const struct dbg_idle_chk_cond_reg *reg = &cond_regs[reg_id];
37527b6859fbSMintz, Yuval 		struct dbg_idle_chk_result_reg_hdr *reg_hdr;
37537b6859fbSMintz, Yuval 
37542d22bc83SMichal Kalderon 		reg_hdr =
37552d22bc83SMichal Kalderon 		    (struct dbg_idle_chk_result_reg_hdr *)(dump_buf + offset);
3756c965db44STomer Tayar 
3757c965db44STomer Tayar 		/* Write register header */
37587b6859fbSMintz, Yuval 		if (!dump) {
37597b6859fbSMintz, Yuval 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS +
37607b6859fbSMintz, Yuval 			    reg->entry_size;
37617b6859fbSMintz, Yuval 			continue;
37627b6859fbSMintz, Yuval 		}
37637b6859fbSMintz, Yuval 
3764c965db44STomer Tayar 		offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
37657b6859fbSMintz, Yuval 		memset(reg_hdr, 0, sizeof(*reg_hdr));
3766c965db44STomer Tayar 		reg_hdr->start_entry = reg->start_entry;
3767c965db44STomer Tayar 		reg_hdr->size = reg->entry_size;
3768c965db44STomer Tayar 		SET_FIELD(reg_hdr->data,
3769c965db44STomer Tayar 			  DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM,
37707b6859fbSMintz, Yuval 			  reg->num_entries > 1 || reg->start_entry > 0 ? 1 : 0);
3771c965db44STomer Tayar 		SET_FIELD(reg_hdr->data,
3772c965db44STomer Tayar 			  DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, reg_id);
3773c965db44STomer Tayar 
3774c965db44STomer Tayar 		/* Write register values */
37757b6859fbSMintz, Yuval 		for (i = 0; i < reg_hdr->size; i++, next_reg_offset++, offset++)
37767b6859fbSMintz, Yuval 			dump_buf[offset] = cond_reg_values[next_reg_offset];
3777c965db44STomer Tayar 	}
3778c965db44STomer Tayar 
3779c965db44STomer Tayar 	/* Dump info register values */
3780c965db44STomer Tayar 	for (reg_id = 0; reg_id < rule->num_info_regs; reg_id++) {
3781c965db44STomer Tayar 		const struct dbg_idle_chk_info_reg *reg = &info_regs[reg_id];
3782c965db44STomer Tayar 		u32 block_id;
3783c965db44STomer Tayar 
37847b6859fbSMintz, Yuval 		/* Check if register's block is in reset */
3785c965db44STomer Tayar 		if (!dump) {
3786c965db44STomer Tayar 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + reg->size;
3787c965db44STomer Tayar 			continue;
3788c965db44STomer Tayar 		}
3789c965db44STomer Tayar 
3790c965db44STomer Tayar 		block_id = GET_FIELD(reg->data, DBG_IDLE_CHK_INFO_REG_BLOCK_ID);
3791c965db44STomer Tayar 		if (block_id >= MAX_BLOCK_ID) {
3792c965db44STomer Tayar 			DP_NOTICE(p_hwfn, "Invalid block_id\n");
3793c965db44STomer Tayar 			return 0;
3794c965db44STomer Tayar 		}
3795c965db44STomer Tayar 
3796c965db44STomer Tayar 		if (!dev_data->block_in_reset[block_id]) {
37977b6859fbSMintz, Yuval 			struct dbg_idle_chk_result_reg_hdr *reg_hdr;
37987b6859fbSMintz, Yuval 			bool wide_bus, eval_mode, mode_match = true;
37997b6859fbSMintz, Yuval 			u16 modes_buf_offset;
38007b6859fbSMintz, Yuval 			u32 addr;
38017b6859fbSMintz, Yuval 
38027b6859fbSMintz, Yuval 			reg_hdr = (struct dbg_idle_chk_result_reg_hdr *)
38037b6859fbSMintz, Yuval 				  (dump_buf + offset);
3804c965db44STomer Tayar 
3805c965db44STomer Tayar 			/* Check mode */
38067b6859fbSMintz, Yuval 			eval_mode = GET_FIELD(reg->mode.data,
38077b6859fbSMintz, Yuval 					      DBG_MODE_HDR_EVAL_MODE) > 0;
3808c965db44STomer Tayar 			if (eval_mode) {
38097b6859fbSMintz, Yuval 				modes_buf_offset =
3810c965db44STomer Tayar 				    GET_FIELD(reg->mode.data,
3811c965db44STomer Tayar 					      DBG_MODE_HDR_MODES_BUF_OFFSET);
3812c965db44STomer Tayar 				mode_match =
3813c965db44STomer Tayar 					qed_is_mode_match(p_hwfn,
3814c965db44STomer Tayar 							  &modes_buf_offset);
3815c965db44STomer Tayar 			}
3816c965db44STomer Tayar 
38177b6859fbSMintz, Yuval 			if (!mode_match)
38187b6859fbSMintz, Yuval 				continue;
38197b6859fbSMintz, Yuval 
38207b6859fbSMintz, Yuval 			addr = GET_FIELD(reg->data,
3821be086e7cSMintz, Yuval 					 DBG_IDLE_CHK_INFO_REG_ADDRESS);
38227b6859fbSMintz, Yuval 			wide_bus = GET_FIELD(reg->data,
38237b6859fbSMintz, Yuval 					     DBG_IDLE_CHK_INFO_REG_WIDE_BUS);
3824c965db44STomer Tayar 
3825c965db44STomer Tayar 			/* Write register header */
3826c965db44STomer Tayar 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
3827c965db44STomer Tayar 			hdr->num_dumped_info_regs++;
3828c965db44STomer Tayar 			memset(reg_hdr, 0, sizeof(*reg_hdr));
3829c965db44STomer Tayar 			reg_hdr->size = reg->size;
3830c965db44STomer Tayar 			SET_FIELD(reg_hdr->data,
3831c965db44STomer Tayar 				  DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID,
3832c965db44STomer Tayar 				  rule->num_cond_regs + reg_id);
3833c965db44STomer Tayar 
3834c965db44STomer Tayar 			/* Write register values */
38357b6859fbSMintz, Yuval 			offset += qed_grc_dump_addr_range(p_hwfn,
3836be086e7cSMintz, Yuval 							  p_ptt,
3837be086e7cSMintz, Yuval 							  dump_buf + offset,
3838be086e7cSMintz, Yuval 							  dump,
3839be086e7cSMintz, Yuval 							  addr,
3840d52c89f1SMichal Kalderon 							  reg->size, wide_bus,
3841d52c89f1SMichal Kalderon 							  SPLIT_TYPE_NONE, 0);
3842c965db44STomer Tayar 		}
3843c965db44STomer Tayar 	}
3844c965db44STomer Tayar 
3845c965db44STomer Tayar 	return offset;
3846c965db44STomer Tayar }
3847c965db44STomer Tayar 
3848c965db44STomer Tayar /* Dumps idle check rule entries. Returns the dumped size in dwords. */
3849c965db44STomer Tayar static u32
qed_idle_chk_dump_rule_entries(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,const struct dbg_idle_chk_rule * input_rules,u32 num_input_rules,u32 * num_failing_rules)3850c965db44STomer Tayar qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
3851c965db44STomer Tayar 			       u32 *dump_buf, bool dump,
3852c965db44STomer Tayar 			       const struct dbg_idle_chk_rule *input_rules,
3853c965db44STomer Tayar 			       u32 num_input_rules, u32 *num_failing_rules)
3854c965db44STomer Tayar {
3855c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
3856c965db44STomer Tayar 	u32 cond_reg_values[IDLE_CHK_MAX_ENTRIES_SIZE];
3857be086e7cSMintz, Yuval 	u32 i, offset = 0;
3858c965db44STomer Tayar 	u16 entry_id;
3859c965db44STomer Tayar 	u8 reg_id;
3860c965db44STomer Tayar 
3861c965db44STomer Tayar 	*num_failing_rules = 0;
38627b6859fbSMintz, Yuval 
3863c965db44STomer Tayar 	for (i = 0; i < num_input_rules; i++) {
3864c965db44STomer Tayar 		const struct dbg_idle_chk_cond_reg *cond_regs;
3865c965db44STomer Tayar 		const struct dbg_idle_chk_rule *rule;
3866c965db44STomer Tayar 		const union dbg_idle_chk_reg *regs;
3867c965db44STomer Tayar 		u16 num_reg_entries = 1;
3868c965db44STomer Tayar 		bool check_rule = true;
3869c965db44STomer Tayar 		const u32 *imm_values;
3870c965db44STomer Tayar 
3871c965db44STomer Tayar 		rule = &input_rules[i];
38722d22bc83SMichal Kalderon 		regs = (const union dbg_idle_chk_reg *)
38732d22bc83SMichal Kalderon 			p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr +
38742d22bc83SMichal Kalderon 			rule->reg_offset;
3875c965db44STomer Tayar 		cond_regs = &regs[0].cond_reg;
38762d22bc83SMichal Kalderon 		imm_values =
38772d22bc83SMichal Kalderon 		    (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr +
38782d22bc83SMichal Kalderon 		    rule->imm_offset;
3879c965db44STomer Tayar 
3880c965db44STomer Tayar 		/* Check if all condition register blocks are out of reset, and
3881c965db44STomer Tayar 		 * find maximal number of entries (all condition registers that
3882c965db44STomer Tayar 		 * are memories must have the same size, which is > 1).
3883c965db44STomer Tayar 		 */
3884c965db44STomer Tayar 		for (reg_id = 0; reg_id < rule->num_cond_regs && check_rule;
3885c965db44STomer Tayar 		     reg_id++) {
38867b6859fbSMintz, Yuval 			u32 block_id =
38877b6859fbSMintz, Yuval 				GET_FIELD(cond_regs[reg_id].data,
3888c965db44STomer Tayar 					  DBG_IDLE_CHK_COND_REG_BLOCK_ID);
3889c965db44STomer Tayar 
3890c965db44STomer Tayar 			if (block_id >= MAX_BLOCK_ID) {
3891c965db44STomer Tayar 				DP_NOTICE(p_hwfn, "Invalid block_id\n");
3892c965db44STomer Tayar 				return 0;
3893c965db44STomer Tayar 			}
3894c965db44STomer Tayar 
3895c965db44STomer Tayar 			check_rule = !dev_data->block_in_reset[block_id];
3896c965db44STomer Tayar 			if (cond_regs[reg_id].num_entries > num_reg_entries)
3897c965db44STomer Tayar 				num_reg_entries = cond_regs[reg_id].num_entries;
3898c965db44STomer Tayar 		}
3899c965db44STomer Tayar 
3900c965db44STomer Tayar 		if (!check_rule && dump)
3901c965db44STomer Tayar 			continue;
3902c965db44STomer Tayar 
3903be086e7cSMintz, Yuval 		if (!dump) {
3904da090917STomer Tayar 			u32 entry_dump_size =
3905da090917STomer Tayar 				qed_idle_chk_dump_failure(p_hwfn,
3906be086e7cSMintz, Yuval 							  p_ptt,
3907be086e7cSMintz, Yuval 							  dump_buf + offset,
3908be086e7cSMintz, Yuval 							  false,
3909be086e7cSMintz, Yuval 							  rule->rule_id,
3910be086e7cSMintz, Yuval 							  rule,
3911da090917STomer Tayar 							  0,
3912be086e7cSMintz, Yuval 							  NULL);
3913da090917STomer Tayar 
3914da090917STomer Tayar 			offset += num_reg_entries * entry_dump_size;
3915da090917STomer Tayar 			(*num_failing_rules) += num_reg_entries;
3916da090917STomer Tayar 			continue;
3917be086e7cSMintz, Yuval 		}
3918be086e7cSMintz, Yuval 
3919da090917STomer Tayar 		/* Go over all register entries (number of entries is the same
3920da090917STomer Tayar 		 * for all condition registers).
3921da090917STomer Tayar 		 */
3922da090917STomer Tayar 		for (entry_id = 0; entry_id < num_reg_entries; entry_id++) {
3923da090917STomer Tayar 			u32 next_reg_offset = 0;
3924da090917STomer Tayar 
3925c965db44STomer Tayar 			/* Read current entry of all condition registers */
3926be086e7cSMintz, Yuval 			for (reg_id = 0; reg_id < rule->num_cond_regs;
3927c965db44STomer Tayar 			     reg_id++) {
3928be086e7cSMintz, Yuval 				const struct dbg_idle_chk_cond_reg *reg =
3929be086e7cSMintz, Yuval 					&cond_regs[reg_id];
39307b6859fbSMintz, Yuval 				u32 padded_entry_size, addr;
39317b6859fbSMintz, Yuval 				bool wide_bus;
3932c965db44STomer Tayar 
3933be086e7cSMintz, Yuval 				/* Find GRC address (if it's a memory, the
3934be086e7cSMintz, Yuval 				 * address of the specific entry is calculated).
3935c965db44STomer Tayar 				 */
39367b6859fbSMintz, Yuval 				addr = GET_FIELD(reg->data,
3937be086e7cSMintz, Yuval 						 DBG_IDLE_CHK_COND_REG_ADDRESS);
39387b6859fbSMintz, Yuval 				wide_bus =
39397b6859fbSMintz, Yuval 				    GET_FIELD(reg->data,
39407b6859fbSMintz, Yuval 					      DBG_IDLE_CHK_COND_REG_WIDE_BUS);
3941c965db44STomer Tayar 				if (reg->num_entries > 1 ||
3942c965db44STomer Tayar 				    reg->start_entry > 0) {
39437b6859fbSMintz, Yuval 					padded_entry_size =
3944c965db44STomer Tayar 					   reg->entry_size > 1 ?
3945da090917STomer Tayar 					   roundup_pow_of_two(reg->entry_size) :
3946da090917STomer Tayar 					   1;
3947be086e7cSMintz, Yuval 					addr += (reg->start_entry + entry_id) *
3948be086e7cSMintz, Yuval 						padded_entry_size;
3949c965db44STomer Tayar 				}
3950c965db44STomer Tayar 
3951c965db44STomer Tayar 				/* Read registers */
3952c965db44STomer Tayar 				if (next_reg_offset + reg->entry_size >=
3953c965db44STomer Tayar 				    IDLE_CHK_MAX_ENTRIES_SIZE) {
3954c965db44STomer Tayar 					DP_NOTICE(p_hwfn,
3955c965db44STomer Tayar 						  "idle check registers entry is too large\n");
3956c965db44STomer Tayar 					return 0;
3957c965db44STomer Tayar 				}
3958c965db44STomer Tayar 
3959be086e7cSMintz, Yuval 				next_reg_offset +=
39607b6859fbSMintz, Yuval 				    qed_grc_dump_addr_range(p_hwfn, p_ptt,
3961be086e7cSMintz, Yuval 							    cond_reg_values +
3962be086e7cSMintz, Yuval 							    next_reg_offset,
3963be086e7cSMintz, Yuval 							    dump, addr,
39647b6859fbSMintz, Yuval 							    reg->entry_size,
3965d52c89f1SMichal Kalderon 							    wide_bus,
3966d52c89f1SMichal Kalderon 							    SPLIT_TYPE_NONE, 0);
3967c965db44STomer Tayar 			}
3968c965db44STomer Tayar 
39697b6859fbSMintz, Yuval 			/* Call rule condition function.
39707b6859fbSMintz, Yuval 			 * If returns true, it's a failure.
3971c965db44STomer Tayar 			 */
3972c965db44STomer Tayar 			if ((*cond_arr[rule->cond_id]) (cond_reg_values,
3973be086e7cSMintz, Yuval 							imm_values)) {
39747b6859fbSMintz, Yuval 				offset += qed_idle_chk_dump_failure(p_hwfn,
3975c965db44STomer Tayar 							p_ptt,
3976c965db44STomer Tayar 							dump_buf + offset,
3977c965db44STomer Tayar 							dump,
3978c965db44STomer Tayar 							rule->rule_id,
3979c965db44STomer Tayar 							rule,
3980c965db44STomer Tayar 							entry_id,
3981c965db44STomer Tayar 							cond_reg_values);
3982c965db44STomer Tayar 				(*num_failing_rules)++;
3983c965db44STomer Tayar 			}
3984c965db44STomer Tayar 		}
3985c965db44STomer Tayar 	}
3986c965db44STomer Tayar 
3987c965db44STomer Tayar 	return offset;
3988c965db44STomer Tayar }
3989c965db44STomer Tayar 
3990c965db44STomer Tayar /* Performs Idle Check Dump to the specified buffer.
3991c965db44STomer Tayar  * Returns the dumped size in dwords.
3992c965db44STomer Tayar  */
qed_idle_chk_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)3993c965db44STomer Tayar static u32 qed_idle_chk_dump(struct qed_hwfn *p_hwfn,
3994c965db44STomer Tayar 			     struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
3995c965db44STomer Tayar {
39962d22bc83SMichal Kalderon 	struct virt_mem_desc *dbg_buf =
39972d22bc83SMichal Kalderon 	    &p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES];
39982d22bc83SMichal Kalderon 	u32 num_failing_rules_offset, offset = 0,
39992d22bc83SMichal Kalderon 	    input_offset = 0, num_failing_rules = 0;
4000c965db44STomer Tayar 
40012d22bc83SMichal Kalderon 	/* Dump global params  - 1 must match below amount of params */
4002c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4003c965db44STomer Tayar 						p_ptt,
4004c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4005c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4006c965db44STomer Tayar 				     dump, "dump-type", "idle-chk");
4007c965db44STomer Tayar 
4008c965db44STomer Tayar 	/* Dump idle check section header with a single parameter */
4009c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset, dump, "idle_chk", 1);
4010c965db44STomer Tayar 	num_failing_rules_offset = offset;
4011c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset, dump, "num_rules", 0);
40127b6859fbSMintz, Yuval 
40132d22bc83SMichal Kalderon 	while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
4014c965db44STomer Tayar 		const struct dbg_idle_chk_cond_hdr *cond_hdr =
40152d22bc83SMichal Kalderon 		    (const struct dbg_idle_chk_cond_hdr *)dbg_buf->ptr +
40162d22bc83SMichal Kalderon 		    input_offset++;
40177b6859fbSMintz, Yuval 		bool eval_mode, mode_match = true;
40187b6859fbSMintz, Yuval 		u32 curr_failing_rules;
40197b6859fbSMintz, Yuval 		u16 modes_buf_offset;
4020c965db44STomer Tayar 
4021c965db44STomer Tayar 		/* Check mode */
40227b6859fbSMintz, Yuval 		eval_mode = GET_FIELD(cond_hdr->mode.data,
40237b6859fbSMintz, Yuval 				      DBG_MODE_HDR_EVAL_MODE) > 0;
4024c965db44STomer Tayar 		if (eval_mode) {
40257b6859fbSMintz, Yuval 			modes_buf_offset =
4026c965db44STomer Tayar 				GET_FIELD(cond_hdr->mode.data,
4027c965db44STomer Tayar 					  DBG_MODE_HDR_MODES_BUF_OFFSET);
4028c965db44STomer Tayar 			mode_match = qed_is_mode_match(p_hwfn,
4029c965db44STomer Tayar 						       &modes_buf_offset);
4030c965db44STomer Tayar 		}
4031c965db44STomer Tayar 
4032c965db44STomer Tayar 		if (mode_match) {
40332d22bc83SMichal Kalderon 			const struct dbg_idle_chk_rule *rule =
40342d22bc83SMichal Kalderon 			    (const struct dbg_idle_chk_rule *)((u32 *)
40352d22bc83SMichal Kalderon 							       dbg_buf->ptr
40362d22bc83SMichal Kalderon 							       + input_offset);
40372d22bc83SMichal Kalderon 			u32 num_input_rules =
40382d22bc83SMichal Kalderon 				cond_hdr->data_size / IDLE_CHK_RULE_SIZE_DWORDS;
4039c965db44STomer Tayar 			offset +=
4040c965db44STomer Tayar 			    qed_idle_chk_dump_rule_entries(p_hwfn,
4041c965db44STomer Tayar 							   p_ptt,
40422d22bc83SMichal Kalderon 							   dump_buf +
40432d22bc83SMichal Kalderon 							   offset,
4044c965db44STomer Tayar 							   dump,
40452d22bc83SMichal Kalderon 							   rule,
40462d22bc83SMichal Kalderon 							   num_input_rules,
4047c965db44STomer Tayar 							   &curr_failing_rules);
4048c965db44STomer Tayar 			num_failing_rules += curr_failing_rules;
4049c965db44STomer Tayar 		}
4050c965db44STomer Tayar 
4051c965db44STomer Tayar 		input_offset += cond_hdr->data_size;
4052c965db44STomer Tayar 	}
4053c965db44STomer Tayar 
4054c965db44STomer Tayar 	/* Overwrite num_rules parameter */
4055c965db44STomer Tayar 	if (dump)
4056c965db44STomer Tayar 		qed_dump_num_param(dump_buf + num_failing_rules_offset,
4057c965db44STomer Tayar 				   dump, "num_rules", num_failing_rules);
4058c965db44STomer Tayar 
40597b6859fbSMintz, Yuval 	/* Dump last section */
4060da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
40617b6859fbSMintz, Yuval 
4062c965db44STomer Tayar 	return offset;
4063c965db44STomer Tayar }
4064c965db44STomer Tayar 
4065c965db44STomer Tayar /* Get info on the MCP Trace data in the scratchpad:
40667b6859fbSMintz, Yuval  * - trace_data_grc_addr (OUT): trace data GRC address in bytes
40677b6859fbSMintz, Yuval  * - trace_data_size (OUT): trace data size in bytes (without the header)
4068c965db44STomer Tayar  */
qed_mcp_trace_get_data_info(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * trace_data_grc_addr,u32 * trace_data_size)4069c965db44STomer Tayar static enum dbg_status qed_mcp_trace_get_data_info(struct qed_hwfn *p_hwfn,
4070c965db44STomer Tayar 						   struct qed_ptt *p_ptt,
4071c965db44STomer Tayar 						   u32 *trace_data_grc_addr,
40727b6859fbSMintz, Yuval 						   u32 *trace_data_size)
4073c965db44STomer Tayar {
40747b6859fbSMintz, Yuval 	u32 spad_trace_offsize, signature;
4075c965db44STomer Tayar 
40767b6859fbSMintz, Yuval 	/* Read trace section offsize structure from MCP scratchpad */
40777b6859fbSMintz, Yuval 	spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR);
40787b6859fbSMintz, Yuval 
40797b6859fbSMintz, Yuval 	/* Extract trace section address from offsize (in scratchpad) */
4080c965db44STomer Tayar 	*trace_data_grc_addr =
4081c965db44STomer Tayar 		MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize);
4082c965db44STomer Tayar 
4083c965db44STomer Tayar 	/* Read signature from MCP trace section */
4084c965db44STomer Tayar 	signature = qed_rd(p_hwfn, p_ptt,
4085c965db44STomer Tayar 			   *trace_data_grc_addr +
4086c965db44STomer Tayar 			   offsetof(struct mcp_trace, signature));
40877b6859fbSMintz, Yuval 
4088c965db44STomer Tayar 	if (signature != MFW_TRACE_SIGNATURE)
4089c965db44STomer Tayar 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
4090c965db44STomer Tayar 
4091c965db44STomer Tayar 	/* Read trace size from MCP trace section */
40927b6859fbSMintz, Yuval 	*trace_data_size = qed_rd(p_hwfn,
4093c965db44STomer Tayar 				  p_ptt,
4094c965db44STomer Tayar 				  *trace_data_grc_addr +
4095c965db44STomer Tayar 				  offsetof(struct mcp_trace, size));
40967b6859fbSMintz, Yuval 
4097c965db44STomer Tayar 	return DBG_STATUS_OK;
4098c965db44STomer Tayar }
4099c965db44STomer Tayar 
41007b6859fbSMintz, Yuval /* Reads MCP trace meta data image from NVRAM
41017b6859fbSMintz, Yuval  * - running_bundle_id (OUT): running bundle ID (invalid when loaded from file)
41027b6859fbSMintz, Yuval  * - trace_meta_offset (OUT): trace meta offset in NVRAM in bytes (invalid when
41037b6859fbSMintz, Yuval  *			      loaded from file).
41047b6859fbSMintz, Yuval  * - trace_meta_size (OUT):   size in bytes of the trace meta data.
4105c965db44STomer Tayar  */
qed_mcp_trace_get_meta_info(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 trace_data_size_bytes,u32 * running_bundle_id,u32 * trace_meta_offset,u32 * trace_meta_size)4106c965db44STomer Tayar static enum dbg_status qed_mcp_trace_get_meta_info(struct qed_hwfn *p_hwfn,
4107c965db44STomer Tayar 						   struct qed_ptt *p_ptt,
4108c965db44STomer Tayar 						   u32 trace_data_size_bytes,
4109c965db44STomer Tayar 						   u32 *running_bundle_id,
41107b6859fbSMintz, Yuval 						   u32 *trace_meta_offset,
41117b6859fbSMintz, Yuval 						   u32 *trace_meta_size)
4112c965db44STomer Tayar {
41137b6859fbSMintz, Yuval 	u32 spad_trace_offsize, nvram_image_type, running_mfw_addr;
41147b6859fbSMintz, Yuval 
4115c965db44STomer Tayar 	/* Read MCP trace section offsize structure from MCP scratchpad */
41167b6859fbSMintz, Yuval 	spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR);
4117c965db44STomer Tayar 
4118c965db44STomer Tayar 	/* Find running bundle ID */
41197b6859fbSMintz, Yuval 	running_mfw_addr =
4120c965db44STomer Tayar 		MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize) +
4121c965db44STomer Tayar 		QED_SECTION_SIZE(spad_trace_offsize) + trace_data_size_bytes;
4122c965db44STomer Tayar 	*running_bundle_id = qed_rd(p_hwfn, p_ptt, running_mfw_addr);
4123c965db44STomer Tayar 	if (*running_bundle_id > 1)
4124c965db44STomer Tayar 		return DBG_STATUS_INVALID_NVRAM_BUNDLE;
4125c965db44STomer Tayar 
4126c965db44STomer Tayar 	/* Find image in NVRAM */
4127c965db44STomer Tayar 	nvram_image_type =
4128c965db44STomer Tayar 	    (*running_bundle_id ==
4129c965db44STomer Tayar 	     DIR_ID_1) ? NVM_TYPE_MFW_TRACE1 : NVM_TYPE_MFW_TRACE2;
4130be086e7cSMintz, Yuval 	return qed_find_nvram_image(p_hwfn,
4131c965db44STomer Tayar 				    p_ptt,
4132c965db44STomer Tayar 				    nvram_image_type,
4133*5401c3e0SCaleb Sander 				    trace_meta_offset,
4134*5401c3e0SCaleb Sander 				    trace_meta_size,
4135*5401c3e0SCaleb Sander 				    true);
4136c965db44STomer Tayar }
4137c965db44STomer Tayar 
41387b6859fbSMintz, Yuval /* Reads the MCP Trace meta data from NVRAM into the specified buffer */
qed_mcp_trace_read_meta(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 nvram_offset_in_bytes,u32 size_in_bytes,u32 * buf)4139c965db44STomer Tayar static enum dbg_status qed_mcp_trace_read_meta(struct qed_hwfn *p_hwfn,
4140c965db44STomer Tayar 					       struct qed_ptt *p_ptt,
4141c965db44STomer Tayar 					       u32 nvram_offset_in_bytes,
4142c965db44STomer Tayar 					       u32 size_in_bytes, u32 *buf)
4143c965db44STomer Tayar {
41447b6859fbSMintz, Yuval 	u8 modules_num, module_len, i, *byte_buf = (u8 *)buf;
41457b6859fbSMintz, Yuval 	enum dbg_status status;
4146c965db44STomer Tayar 	u32 signature;
4147c965db44STomer Tayar 
4148c965db44STomer Tayar 	/* Read meta data from NVRAM */
41497b6859fbSMintz, Yuval 	status = qed_nvram_read(p_hwfn,
4150c965db44STomer Tayar 				p_ptt,
4151*5401c3e0SCaleb Sander 				nvram_offset_in_bytes,
4152*5401c3e0SCaleb Sander 				size_in_bytes,
4153*5401c3e0SCaleb Sander 				buf,
4154*5401c3e0SCaleb Sander 				true);
4155c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
4156c965db44STomer Tayar 		return status;
4157c965db44STomer Tayar 
4158c965db44STomer Tayar 	/* Extract and check first signature */
4159c965db44STomer Tayar 	signature = qed_read_unaligned_dword(byte_buf);
41607b6859fbSMintz, Yuval 	byte_buf += sizeof(signature);
41617b6859fbSMintz, Yuval 	if (signature != NVM_MAGIC_VALUE)
4162c965db44STomer Tayar 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
4163c965db44STomer Tayar 
4164c965db44STomer Tayar 	/* Extract number of modules */
4165c965db44STomer Tayar 	modules_num = *(byte_buf++);
4166c965db44STomer Tayar 
4167c965db44STomer Tayar 	/* Skip all modules */
4168c965db44STomer Tayar 	for (i = 0; i < modules_num; i++) {
41697b6859fbSMintz, Yuval 		module_len = *(byte_buf++);
4170c965db44STomer Tayar 		byte_buf += module_len;
4171c965db44STomer Tayar 	}
4172c965db44STomer Tayar 
4173c965db44STomer Tayar 	/* Extract and check second signature */
4174c965db44STomer Tayar 	signature = qed_read_unaligned_dword(byte_buf);
41757b6859fbSMintz, Yuval 	byte_buf += sizeof(signature);
41767b6859fbSMintz, Yuval 	if (signature != NVM_MAGIC_VALUE)
4177c965db44STomer Tayar 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
41787b6859fbSMintz, Yuval 
4179c965db44STomer Tayar 	return DBG_STATUS_OK;
4180c965db44STomer Tayar }
4181c965db44STomer Tayar 
4182c965db44STomer Tayar /* Dump MCP Trace */
qed_mcp_trace_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u32 * num_dumped_dwords)41838c93beafSYuval Mintz static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn,
4184c965db44STomer Tayar 					  struct qed_ptt *p_ptt,
4185c965db44STomer Tayar 					  u32 *dump_buf,
4186c965db44STomer Tayar 					  bool dump, u32 *num_dumped_dwords)
4187c965db44STomer Tayar {
4188c965db44STomer Tayar 	u32 trace_data_grc_addr, trace_data_size_bytes, trace_data_size_dwords;
4189be086e7cSMintz, Yuval 	u32 trace_meta_size_dwords = 0, running_bundle_id, offset = 0;
4190be086e7cSMintz, Yuval 	u32 trace_meta_offset_bytes = 0, trace_meta_size_bytes = 0;
4191c965db44STomer Tayar 	enum dbg_status status;
4192c965db44STomer Tayar 	int halted = 0;
41932d22bc83SMichal Kalderon 	bool use_mfw;
4194c965db44STomer Tayar 
4195c965db44STomer Tayar 	*num_dumped_dwords = 0;
4196c965db44STomer Tayar 
41972d22bc83SMichal Kalderon 	use_mfw = !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP);
41987b6859fbSMintz, Yuval 
4199c965db44STomer Tayar 	/* Get trace data info */
4200c965db44STomer Tayar 	status = qed_mcp_trace_get_data_info(p_hwfn,
4201c965db44STomer Tayar 					     p_ptt,
4202c965db44STomer Tayar 					     &trace_data_grc_addr,
4203c965db44STomer Tayar 					     &trace_data_size_bytes);
4204c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
4205c965db44STomer Tayar 		return status;
4206c965db44STomer Tayar 
4207c965db44STomer Tayar 	/* Dump global params */
4208c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4209c965db44STomer Tayar 						p_ptt,
4210c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4211c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4212c965db44STomer Tayar 				     dump, "dump-type", "mcp-trace");
4213c965db44STomer Tayar 
4214c965db44STomer Tayar 	/* Halt MCP while reading from scratchpad so the read data will be
42157b6859fbSMintz, Yuval 	 * consistent. if halt fails, MCP trace is taken anyway, with a small
4216c965db44STomer Tayar 	 * risk that it may be corrupt.
4217c965db44STomer Tayar 	 */
42182d22bc83SMichal Kalderon 	if (dump && use_mfw) {
4219c965db44STomer Tayar 		halted = !qed_mcp_halt(p_hwfn, p_ptt);
4220c965db44STomer Tayar 		if (!halted)
4221c965db44STomer Tayar 			DP_NOTICE(p_hwfn, "MCP halt failed!\n");
4222c965db44STomer Tayar 	}
4223c965db44STomer Tayar 
4224c965db44STomer Tayar 	/* Find trace data size */
4225c965db44STomer Tayar 	trace_data_size_dwords =
4226c965db44STomer Tayar 	    DIV_ROUND_UP(trace_data_size_bytes + sizeof(struct mcp_trace),
4227c965db44STomer Tayar 			 BYTES_IN_DWORD);
4228c965db44STomer Tayar 
4229c965db44STomer Tayar 	/* Dump trace data section header and param */
4230c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
4231c965db44STomer Tayar 				       dump, "mcp_trace_data", 1);
4232c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset,
4233c965db44STomer Tayar 				     dump, "size", trace_data_size_dwords);
4234c965db44STomer Tayar 
4235c965db44STomer Tayar 	/* Read trace data from scratchpad into dump buffer */
4236be086e7cSMintz, Yuval 	offset += qed_grc_dump_addr_range(p_hwfn,
4237c965db44STomer Tayar 					  p_ptt,
4238be086e7cSMintz, Yuval 					  dump_buf + offset,
4239be086e7cSMintz, Yuval 					  dump,
4240be086e7cSMintz, Yuval 					  BYTES_TO_DWORDS(trace_data_grc_addr),
4241d52c89f1SMichal Kalderon 					  trace_data_size_dwords, false,
4242d52c89f1SMichal Kalderon 					  SPLIT_TYPE_NONE, 0);
4243c965db44STomer Tayar 
4244c965db44STomer Tayar 	/* Resume MCP (only if halt succeeded) */
42457b6859fbSMintz, Yuval 	if (halted && qed_mcp_resume(p_hwfn, p_ptt))
4246c965db44STomer Tayar 		DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n");
4247c965db44STomer Tayar 
4248c965db44STomer Tayar 	/* Dump trace meta section header */
4249c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
4250c965db44STomer Tayar 				       dump, "mcp_trace_meta", 1);
4251c965db44STomer Tayar 
425250bc60cbSMichal Kalderon 	/* If MCP Trace meta size parameter was set, use it.
425350bc60cbSMichal Kalderon 	 * Otherwise, read trace meta.
425450bc60cbSMichal Kalderon 	 * trace_meta_size_bytes is dword-aligned.
425550bc60cbSMichal Kalderon 	 */
425650bc60cbSMichal Kalderon 	trace_meta_size_bytes =
425750bc60cbSMichal Kalderon 		qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_MCP_TRACE_META_SIZE);
42582d22bc83SMichal Kalderon 	if ((!trace_meta_size_bytes || dump) && use_mfw)
4259c965db44STomer Tayar 		status = qed_mcp_trace_get_meta_info(p_hwfn,
4260c965db44STomer Tayar 						     p_ptt,
4261c965db44STomer Tayar 						     trace_data_size_bytes,
4262c965db44STomer Tayar 						     &running_bundle_id,
4263c965db44STomer Tayar 						     &trace_meta_offset_bytes,
4264c965db44STomer Tayar 						     &trace_meta_size_bytes);
4265be086e7cSMintz, Yuval 	if (status == DBG_STATUS_OK)
42662d22bc83SMichal Kalderon 		trace_meta_size_dwords = BYTES_TO_DWORDS(trace_meta_size_bytes);
4267c965db44STomer Tayar 
4268be086e7cSMintz, Yuval 	/* Dump trace meta size param */
4269be086e7cSMintz, Yuval 	offset += qed_dump_num_param(dump_buf + offset,
4270be086e7cSMintz, Yuval 				     dump, "size", trace_meta_size_dwords);
4271c965db44STomer Tayar 
4272c965db44STomer Tayar 	/* Read trace meta image into dump buffer */
4273be086e7cSMintz, Yuval 	if (dump && trace_meta_size_dwords)
4274c965db44STomer Tayar 		status = qed_mcp_trace_read_meta(p_hwfn,
4275c965db44STomer Tayar 						 p_ptt,
4276c965db44STomer Tayar 						 trace_meta_offset_bytes,
4277c965db44STomer Tayar 						 trace_meta_size_bytes,
4278c965db44STomer Tayar 						 dump_buf + offset);
4279be086e7cSMintz, Yuval 	if (status == DBG_STATUS_OK)
4280c965db44STomer Tayar 		offset += trace_meta_size_dwords;
4281c965db44STomer Tayar 
42827b6859fbSMintz, Yuval 	/* Dump last section */
4283da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
42847b6859fbSMintz, Yuval 
4285c965db44STomer Tayar 	*num_dumped_dwords = offset;
4286c965db44STomer Tayar 
4287be086e7cSMintz, Yuval 	/* If no mcp access, indicate that the dump doesn't contain the meta
4288be086e7cSMintz, Yuval 	 * data from NVRAM.
4289be086e7cSMintz, Yuval 	 */
42902d22bc83SMichal Kalderon 	return use_mfw ? status : DBG_STATUS_NVRAM_GET_IMAGE_FAILED;
4291c965db44STomer Tayar }
4292c965db44STomer Tayar 
4293c965db44STomer Tayar /* Dump GRC FIFO */
qed_reg_fifo_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u32 * num_dumped_dwords)42948c93beafSYuval Mintz static enum dbg_status qed_reg_fifo_dump(struct qed_hwfn *p_hwfn,
4295c965db44STomer Tayar 					 struct qed_ptt *p_ptt,
4296c965db44STomer Tayar 					 u32 *dump_buf,
4297c965db44STomer Tayar 					 bool dump, u32 *num_dumped_dwords)
4298c965db44STomer Tayar {
4299da090917STomer Tayar 	u32 dwords_read, size_param_offset, offset = 0, addr, len;
4300c965db44STomer Tayar 	bool fifo_has_data;
4301c965db44STomer Tayar 
4302c965db44STomer Tayar 	*num_dumped_dwords = 0;
4303c965db44STomer Tayar 
4304c965db44STomer Tayar 	/* Dump global params */
4305c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4306c965db44STomer Tayar 						p_ptt,
4307c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4308c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4309c965db44STomer Tayar 				     dump, "dump-type", "reg-fifo");
4310c965db44STomer Tayar 
43117b6859fbSMintz, Yuval 	/* Dump fifo data section header and param. The size param is 0 for
43127b6859fbSMintz, Yuval 	 * now, and is overwritten after reading the FIFO.
4313c965db44STomer Tayar 	 */
4314c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
4315c965db44STomer Tayar 				       dump, "reg_fifo_data", 1);
4316c965db44STomer Tayar 	size_param_offset = offset;
4317c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
4318c965db44STomer Tayar 
4319c965db44STomer Tayar 	if (!dump) {
4320c965db44STomer Tayar 		/* FIFO max size is REG_FIFO_DEPTH_DWORDS. There is no way to
4321c965db44STomer Tayar 		 * test how much data is available, except for reading it.
4322c965db44STomer Tayar 		 */
4323c965db44STomer Tayar 		offset += REG_FIFO_DEPTH_DWORDS;
43247b6859fbSMintz, Yuval 		goto out;
4325c965db44STomer Tayar 	}
4326c965db44STomer Tayar 
4327c965db44STomer Tayar 	fifo_has_data = qed_rd(p_hwfn, p_ptt,
4328c965db44STomer Tayar 			       GRC_REG_TRACE_FIFO_VALID_DATA) > 0;
4329c965db44STomer Tayar 
4330c965db44STomer Tayar 	/* Pull available data from fifo. Use DMAE since this is widebus memory
4331c965db44STomer Tayar 	 * and must be accessed atomically. Test for dwords_read not passing
4332c965db44STomer Tayar 	 * buffer size since more entries could be added to the buffer as we are
4333c965db44STomer Tayar 	 * emptying it.
4334c965db44STomer Tayar 	 */
4335da090917STomer Tayar 	addr = BYTES_TO_DWORDS(GRC_REG_TRACE_FIFO);
4336da090917STomer Tayar 	len = REG_FIFO_ELEMENT_DWORDS;
4337c965db44STomer Tayar 	for (dwords_read = 0;
4338c965db44STomer Tayar 	     fifo_has_data && dwords_read < REG_FIFO_DEPTH_DWORDS;
4339da090917STomer Tayar 	     dwords_read += REG_FIFO_ELEMENT_DWORDS) {
4340da090917STomer Tayar 		offset += qed_grc_dump_addr_range(p_hwfn,
4341da090917STomer Tayar 						  p_ptt,
4342da090917STomer Tayar 						  dump_buf + offset,
4343da090917STomer Tayar 						  true,
4344da090917STomer Tayar 						  addr,
4345da090917STomer Tayar 						  len,
4346d52c89f1SMichal Kalderon 						  true, SPLIT_TYPE_NONE,
4347d52c89f1SMichal Kalderon 						  0);
4348c965db44STomer Tayar 		fifo_has_data = qed_rd(p_hwfn, p_ptt,
4349c965db44STomer Tayar 				       GRC_REG_TRACE_FIFO_VALID_DATA) > 0;
4350c965db44STomer Tayar 	}
4351c965db44STomer Tayar 
4352c965db44STomer Tayar 	qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
4353c965db44STomer Tayar 			   dwords_read);
43547b6859fbSMintz, Yuval out:
43557b6859fbSMintz, Yuval 	/* Dump last section */
4356da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
4357c965db44STomer Tayar 
4358c965db44STomer Tayar 	*num_dumped_dwords = offset;
43597b6859fbSMintz, Yuval 
4360c965db44STomer Tayar 	return DBG_STATUS_OK;
4361c965db44STomer Tayar }
4362c965db44STomer Tayar 
4363c965db44STomer Tayar /* Dump IGU FIFO */
qed_igu_fifo_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u32 * num_dumped_dwords)43648c93beafSYuval Mintz static enum dbg_status qed_igu_fifo_dump(struct qed_hwfn *p_hwfn,
4365c965db44STomer Tayar 					 struct qed_ptt *p_ptt,
4366c965db44STomer Tayar 					 u32 *dump_buf,
4367c965db44STomer Tayar 					 bool dump, u32 *num_dumped_dwords)
4368c965db44STomer Tayar {
4369da090917STomer Tayar 	u32 dwords_read, size_param_offset, offset = 0, addr, len;
4370c965db44STomer Tayar 	bool fifo_has_data;
4371c965db44STomer Tayar 
4372c965db44STomer Tayar 	*num_dumped_dwords = 0;
4373c965db44STomer Tayar 
4374c965db44STomer Tayar 	/* Dump global params */
4375c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4376c965db44STomer Tayar 						p_ptt,
4377c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4378c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4379c965db44STomer Tayar 				     dump, "dump-type", "igu-fifo");
4380c965db44STomer Tayar 
43817b6859fbSMintz, Yuval 	/* Dump fifo data section header and param. The size param is 0 for
43827b6859fbSMintz, Yuval 	 * now, and is overwritten after reading the FIFO.
4383c965db44STomer Tayar 	 */
4384c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
4385c965db44STomer Tayar 				       dump, "igu_fifo_data", 1);
4386c965db44STomer Tayar 	size_param_offset = offset;
4387c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
4388c965db44STomer Tayar 
4389c965db44STomer Tayar 	if (!dump) {
4390c965db44STomer Tayar 		/* FIFO max size is IGU_FIFO_DEPTH_DWORDS. There is no way to
4391c965db44STomer Tayar 		 * test how much data is available, except for reading it.
4392c965db44STomer Tayar 		 */
4393c965db44STomer Tayar 		offset += IGU_FIFO_DEPTH_DWORDS;
43947b6859fbSMintz, Yuval 		goto out;
4395c965db44STomer Tayar 	}
4396c965db44STomer Tayar 
4397c965db44STomer Tayar 	fifo_has_data = qed_rd(p_hwfn, p_ptt,
4398c965db44STomer Tayar 			       IGU_REG_ERROR_HANDLING_DATA_VALID) > 0;
4399c965db44STomer Tayar 
4400c965db44STomer Tayar 	/* Pull available data from fifo. Use DMAE since this is widebus memory
4401c965db44STomer Tayar 	 * and must be accessed atomically. Test for dwords_read not passing
4402c965db44STomer Tayar 	 * buffer size since more entries could be added to the buffer as we are
4403c965db44STomer Tayar 	 * emptying it.
4404c965db44STomer Tayar 	 */
4405da090917STomer Tayar 	addr = BYTES_TO_DWORDS(IGU_REG_ERROR_HANDLING_MEMORY);
4406da090917STomer Tayar 	len = IGU_FIFO_ELEMENT_DWORDS;
4407c965db44STomer Tayar 	for (dwords_read = 0;
4408c965db44STomer Tayar 	     fifo_has_data && dwords_read < IGU_FIFO_DEPTH_DWORDS;
4409da090917STomer Tayar 	     dwords_read += IGU_FIFO_ELEMENT_DWORDS) {
4410da090917STomer Tayar 		offset += qed_grc_dump_addr_range(p_hwfn,
4411da090917STomer Tayar 						  p_ptt,
4412da090917STomer Tayar 						  dump_buf + offset,
4413da090917STomer Tayar 						  true,
4414da090917STomer Tayar 						  addr,
4415da090917STomer Tayar 						  len,
4416d52c89f1SMichal Kalderon 						  true, SPLIT_TYPE_NONE,
4417d52c89f1SMichal Kalderon 						  0);
4418c965db44STomer Tayar 		fifo_has_data = qed_rd(p_hwfn, p_ptt,
4419c965db44STomer Tayar 				       IGU_REG_ERROR_HANDLING_DATA_VALID) > 0;
4420c965db44STomer Tayar 	}
4421c965db44STomer Tayar 
4422c965db44STomer Tayar 	qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
4423c965db44STomer Tayar 			   dwords_read);
44247b6859fbSMintz, Yuval out:
44257b6859fbSMintz, Yuval 	/* Dump last section */
4426da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
4427c965db44STomer Tayar 
4428c965db44STomer Tayar 	*num_dumped_dwords = offset;
44297b6859fbSMintz, Yuval 
4430c965db44STomer Tayar 	return DBG_STATUS_OK;
4431c965db44STomer Tayar }
4432c965db44STomer Tayar 
4433c965db44STomer Tayar /* Protection Override dump */
qed_protection_override_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u32 * num_dumped_dwords)44348c93beafSYuval Mintz static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn,
4435c965db44STomer Tayar 						    struct qed_ptt *p_ptt,
4436c965db44STomer Tayar 						    u32 *dump_buf,
44378c93beafSYuval Mintz 						    bool dump,
44388c93beafSYuval Mintz 						    u32 *num_dumped_dwords)
4439c965db44STomer Tayar {
4440da090917STomer Tayar 	u32 size_param_offset, override_window_dwords, offset = 0, addr;
4441c965db44STomer Tayar 
4442c965db44STomer Tayar 	*num_dumped_dwords = 0;
4443c965db44STomer Tayar 
4444c965db44STomer Tayar 	/* Dump global params */
4445c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4446c965db44STomer Tayar 						p_ptt,
4447c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4448c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4449c965db44STomer Tayar 				     dump, "dump-type", "protection-override");
4450c965db44STomer Tayar 
44517b6859fbSMintz, Yuval 	/* Dump data section header and param. The size param is 0 for now,
44527b6859fbSMintz, Yuval 	 * and is overwritten after reading the data.
4453c965db44STomer Tayar 	 */
4454c965db44STomer Tayar 	offset += qed_dump_section_hdr(dump_buf + offset,
4455c965db44STomer Tayar 				       dump, "protection_override_data", 1);
4456c965db44STomer Tayar 	size_param_offset = offset;
4457c965db44STomer Tayar 	offset += qed_dump_num_param(dump_buf + offset, dump, "size", 0);
4458c965db44STomer Tayar 
4459c965db44STomer Tayar 	if (!dump) {
4460c965db44STomer Tayar 		offset += PROTECTION_OVERRIDE_DEPTH_DWORDS;
44617b6859fbSMintz, Yuval 		goto out;
4462c965db44STomer Tayar 	}
4463c965db44STomer Tayar 
4464c965db44STomer Tayar 	/* Add override window info to buffer */
4465c965db44STomer Tayar 	override_window_dwords =
4466da090917STomer Tayar 		qed_rd(p_hwfn, p_ptt, GRC_REG_NUMBER_VALID_OVERRIDE_WINDOW) *
4467c965db44STomer Tayar 		PROTECTION_OVERRIDE_ELEMENT_DWORDS;
44688a52bbabSMichal Kalderon 	if (override_window_dwords) {
4469da090917STomer Tayar 		addr = BYTES_TO_DWORDS(GRC_REG_PROTECTION_OVERRIDE_WINDOW);
4470da090917STomer Tayar 		offset += qed_grc_dump_addr_range(p_hwfn,
4471da090917STomer Tayar 						  p_ptt,
4472da090917STomer Tayar 						  dump_buf + offset,
4473da090917STomer Tayar 						  true,
4474da090917STomer Tayar 						  addr,
4475da090917STomer Tayar 						  override_window_dwords,
4476d52c89f1SMichal Kalderon 						  true, SPLIT_TYPE_NONE, 0);
4477c965db44STomer Tayar 		qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
4478c965db44STomer Tayar 				   override_window_dwords);
44798a52bbabSMichal Kalderon 	}
44807b6859fbSMintz, Yuval out:
44817b6859fbSMintz, Yuval 	/* Dump last section */
4482da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
4483c965db44STomer Tayar 
4484c965db44STomer Tayar 	*num_dumped_dwords = offset;
44857b6859fbSMintz, Yuval 
4486c965db44STomer Tayar 	return DBG_STATUS_OK;
4487c965db44STomer Tayar }
4488c965db44STomer Tayar 
4489c965db44STomer Tayar /* Performs FW Asserts Dump to the specified buffer.
4490c965db44STomer Tayar  * Returns the dumped size in dwords.
4491c965db44STomer Tayar  */
qed_fw_asserts_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump)4492c965db44STomer Tayar static u32 qed_fw_asserts_dump(struct qed_hwfn *p_hwfn,
4493c965db44STomer Tayar 			       struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
4494c965db44STomer Tayar {
4495c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
4496be086e7cSMintz, Yuval 	struct fw_asserts_ram_section *asserts;
4497c965db44STomer Tayar 	char storm_letter_str[2] = "?";
4498c965db44STomer Tayar 	struct fw_info fw_info;
4499be086e7cSMintz, Yuval 	u32 offset = 0;
4500c965db44STomer Tayar 	u8 storm_id;
4501c965db44STomer Tayar 
4502c965db44STomer Tayar 	/* Dump global params */
4503c965db44STomer Tayar 	offset += qed_dump_common_global_params(p_hwfn,
4504c965db44STomer Tayar 						p_ptt,
4505c965db44STomer Tayar 						dump_buf + offset, dump, 1);
4506c965db44STomer Tayar 	offset += qed_dump_str_param(dump_buf + offset,
4507c965db44STomer Tayar 				     dump, "dump-type", "fw-asserts");
45087b6859fbSMintz, Yuval 
45097b6859fbSMintz, Yuval 	/* Find Storm dump size */
4510c965db44STomer Tayar 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
4511be086e7cSMintz, Yuval 		u32 fw_asserts_section_addr, next_list_idx_addr, next_list_idx;
45127b6859fbSMintz, Yuval 		struct storm_defs *storm = &s_storm_defs[storm_id];
4513be086e7cSMintz, Yuval 		u32 last_list_idx, addr;
4514c965db44STomer Tayar 
45152d22bc83SMichal Kalderon 		if (dev_data->block_in_reset[storm->sem_block_id])
4516c965db44STomer Tayar 			continue;
4517c965db44STomer Tayar 
4518c965db44STomer Tayar 		/* Read FW info for the current Storm */
4519d52c89f1SMichal Kalderon 		qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, &fw_info);
4520c965db44STomer Tayar 
4521be086e7cSMintz, Yuval 		asserts = &fw_info.fw_asserts_section;
4522be086e7cSMintz, Yuval 
4523c965db44STomer Tayar 		/* Dump FW Asserts section header and params */
45247b6859fbSMintz, Yuval 		storm_letter_str[0] = storm->letter;
45257b6859fbSMintz, Yuval 		offset += qed_dump_section_hdr(dump_buf + offset,
45267b6859fbSMintz, Yuval 					       dump, "fw_asserts", 2);
45277b6859fbSMintz, Yuval 		offset += qed_dump_str_param(dump_buf + offset,
45287b6859fbSMintz, Yuval 					     dump, "storm", storm_letter_str);
45297b6859fbSMintz, Yuval 		offset += qed_dump_num_param(dump_buf + offset,
45307b6859fbSMintz, Yuval 					     dump,
45317b6859fbSMintz, Yuval 					     "size",
4532be086e7cSMintz, Yuval 					     asserts->list_element_dword_size);
4533c965db44STomer Tayar 
45347b6859fbSMintz, Yuval 		/* Read and dump FW Asserts data */
4535c965db44STomer Tayar 		if (!dump) {
4536be086e7cSMintz, Yuval 			offset += asserts->list_element_dword_size;
4537c965db44STomer Tayar 			continue;
4538c965db44STomer Tayar 		}
4539c965db44STomer Tayar 
45405ab90341SAlexander Lobakin 		addr = le16_to_cpu(asserts->section_ram_line_offset);
45417b6859fbSMintz, Yuval 		fw_asserts_section_addr = storm->sem_fast_mem_addr +
4542c965db44STomer Tayar 					  SEM_FAST_REG_INT_RAM +
45435ab90341SAlexander Lobakin 					  RAM_LINES_TO_BYTES(addr);
45445ab90341SAlexander Lobakin 
45457b6859fbSMintz, Yuval 		next_list_idx_addr = fw_asserts_section_addr +
4546be086e7cSMintz, Yuval 			DWORDS_TO_BYTES(asserts->list_next_index_dword_offset);
4547c965db44STomer Tayar 		next_list_idx = qed_rd(p_hwfn, p_ptt, next_list_idx_addr);
4548da090917STomer Tayar 		last_list_idx = (next_list_idx > 0 ?
4549da090917STomer Tayar 				 next_list_idx :
4550da090917STomer Tayar 				 asserts->list_num_elements) - 1;
4551be086e7cSMintz, Yuval 		addr = BYTES_TO_DWORDS(fw_asserts_section_addr) +
4552be086e7cSMintz, Yuval 		       asserts->list_dword_offset +
4553be086e7cSMintz, Yuval 		       last_list_idx * asserts->list_element_dword_size;
4554be086e7cSMintz, Yuval 		offset +=
4555be086e7cSMintz, Yuval 		    qed_grc_dump_addr_range(p_hwfn, p_ptt,
4556be086e7cSMintz, Yuval 					    dump_buf + offset,
4557be086e7cSMintz, Yuval 					    dump, addr,
45587b6859fbSMintz, Yuval 					    asserts->list_element_dword_size,
4559d52c89f1SMichal Kalderon 						  false, SPLIT_TYPE_NONE, 0);
4560c965db44STomer Tayar 	}
4561c965db44STomer Tayar 
4562c965db44STomer Tayar 	/* Dump last section */
4563da090917STomer Tayar 	offset += qed_dump_last_section(dump_buf, offset, dump);
45647b6859fbSMintz, Yuval 
4565c965db44STomer Tayar 	return offset;
4566c965db44STomer Tayar }
4567c965db44STomer Tayar 
45688a52bbabSMichal Kalderon /* Dumps the specified ILT pages to the specified buffer.
45698a52bbabSMichal Kalderon  * Returns the dumped size in dwords.
45708a52bbabSMichal Kalderon  */
qed_ilt_dump_pages_range(u32 * dump_buf,u32 * given_offset,bool * dump,u32 start_page_id,u32 num_pages,struct phys_mem_desc * ilt_pages,bool dump_page_ids,u32 buf_size_in_dwords,u32 * given_actual_dump_size_in_dwords)45716c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump_pages_range(u32 *dump_buf, u32 *given_offset,
45726c95dd8fSPrabhakar Kushwaha 				    bool *dump, u32 start_page_id,
45738a52bbabSMichal Kalderon 				    u32 num_pages,
45748a52bbabSMichal Kalderon 				    struct phys_mem_desc *ilt_pages,
45756c95dd8fSPrabhakar Kushwaha 				    bool dump_page_ids, u32 buf_size_in_dwords,
45766c95dd8fSPrabhakar Kushwaha 				    u32 *given_actual_dump_size_in_dwords)
45778a52bbabSMichal Kalderon {
45786c95dd8fSPrabhakar Kushwaha 	u32 actual_dump_size_in_dwords = *given_actual_dump_size_in_dwords;
45796c95dd8fSPrabhakar Kushwaha 	u32 page_id, end_page_id, offset = *given_offset;
45806c95dd8fSPrabhakar Kushwaha 	struct phys_mem_desc *mem_desc = NULL;
45816c95dd8fSPrabhakar Kushwaha 	bool continue_dump = *dump;
45826c95dd8fSPrabhakar Kushwaha 	u32 partial_page_size = 0;
45838a52bbabSMichal Kalderon 
45848a52bbabSMichal Kalderon 	if (num_pages == 0)
45858a52bbabSMichal Kalderon 		return offset;
45868a52bbabSMichal Kalderon 
45878a52bbabSMichal Kalderon 	end_page_id = start_page_id + num_pages - 1;
45888a52bbabSMichal Kalderon 
45898a52bbabSMichal Kalderon 	for (page_id = start_page_id; page_id <= end_page_id; page_id++) {
45906c95dd8fSPrabhakar Kushwaha 		mem_desc = &ilt_pages[page_id];
45918a52bbabSMichal Kalderon 		if (!ilt_pages[page_id].virt_addr)
45928a52bbabSMichal Kalderon 			continue;
45938a52bbabSMichal Kalderon 
45948a52bbabSMichal Kalderon 		if (dump_page_ids) {
45956c95dd8fSPrabhakar Kushwaha 			/* Copy page ID to dump buffer
45966c95dd8fSPrabhakar Kushwaha 			 * (if dump is needed and buffer is not full)
45976c95dd8fSPrabhakar Kushwaha 			 */
45986c95dd8fSPrabhakar Kushwaha 			if ((continue_dump) &&
45996c95dd8fSPrabhakar Kushwaha 			    (offset + 1 > buf_size_in_dwords)) {
46006c95dd8fSPrabhakar Kushwaha 				continue_dump = false;
46016c95dd8fSPrabhakar Kushwaha 				actual_dump_size_in_dwords = offset;
46026c95dd8fSPrabhakar Kushwaha 			}
46036c95dd8fSPrabhakar Kushwaha 			if (continue_dump)
46048a52bbabSMichal Kalderon 				*(dump_buf + offset) = page_id;
46058a52bbabSMichal Kalderon 			offset++;
46068a52bbabSMichal Kalderon 		} else {
46078a52bbabSMichal Kalderon 			/* Copy page memory to dump buffer */
46086c95dd8fSPrabhakar Kushwaha 			if ((continue_dump) &&
46096c95dd8fSPrabhakar Kushwaha 			    (offset + BYTES_TO_DWORDS(mem_desc->size) >
46106c95dd8fSPrabhakar Kushwaha 			     buf_size_in_dwords)) {
46116c95dd8fSPrabhakar Kushwaha 				if (offset + BYTES_TO_DWORDS(mem_desc->size) >
46126c95dd8fSPrabhakar Kushwaha 				    buf_size_in_dwords) {
46136c95dd8fSPrabhakar Kushwaha 					partial_page_size =
46146c95dd8fSPrabhakar Kushwaha 					    buf_size_in_dwords - offset;
46156c95dd8fSPrabhakar Kushwaha 					memcpy(dump_buf + offset,
46166c95dd8fSPrabhakar Kushwaha 					       mem_desc->virt_addr,
46176c95dd8fSPrabhakar Kushwaha 					       partial_page_size);
46186c95dd8fSPrabhakar Kushwaha 					continue_dump = false;
46196c95dd8fSPrabhakar Kushwaha 					actual_dump_size_in_dwords =
46206c95dd8fSPrabhakar Kushwaha 					    offset + partial_page_size;
46216c95dd8fSPrabhakar Kushwaha 				}
46226c95dd8fSPrabhakar Kushwaha 			}
46236c95dd8fSPrabhakar Kushwaha 
46246c95dd8fSPrabhakar Kushwaha 			if (continue_dump)
46258a52bbabSMichal Kalderon 				memcpy(dump_buf + offset,
46268a52bbabSMichal Kalderon 				       mem_desc->virt_addr, mem_desc->size);
46278a52bbabSMichal Kalderon 			offset += BYTES_TO_DWORDS(mem_desc->size);
46288a52bbabSMichal Kalderon 		}
46298a52bbabSMichal Kalderon 	}
46308a52bbabSMichal Kalderon 
46316c95dd8fSPrabhakar Kushwaha 	*dump = continue_dump;
46326c95dd8fSPrabhakar Kushwaha 	*given_offset = offset;
46336c95dd8fSPrabhakar Kushwaha 	*given_actual_dump_size_in_dwords = actual_dump_size_in_dwords;
46346c95dd8fSPrabhakar Kushwaha 
46358a52bbabSMichal Kalderon 	return offset;
46368a52bbabSMichal Kalderon }
46378a52bbabSMichal Kalderon 
46388a52bbabSMichal Kalderon /* Dumps a section containing the dumped ILT pages.
46398a52bbabSMichal Kalderon  * Returns the dumped size in dwords.
46408a52bbabSMichal Kalderon  */
qed_ilt_dump_pages_section(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 * given_offset,bool * dump,u32 valid_conn_pf_pages,u32 valid_conn_vf_pages,struct phys_mem_desc * ilt_pages,bool dump_page_ids,u32 buf_size_in_dwords,u32 * given_actual_dump_size_in_dwords)46418a52bbabSMichal Kalderon static u32 qed_ilt_dump_pages_section(struct qed_hwfn *p_hwfn,
46428a52bbabSMichal Kalderon 				      u32 *dump_buf,
46436c95dd8fSPrabhakar Kushwaha 				      u32 *given_offset,
46446c95dd8fSPrabhakar Kushwaha 				      bool *dump,
46458a52bbabSMichal Kalderon 				      u32 valid_conn_pf_pages,
46468a52bbabSMichal Kalderon 				      u32 valid_conn_vf_pages,
46478a52bbabSMichal Kalderon 				      struct phys_mem_desc *ilt_pages,
46486c95dd8fSPrabhakar Kushwaha 				      bool dump_page_ids,
46496c95dd8fSPrabhakar Kushwaha 				      u32 buf_size_in_dwords,
46506c95dd8fSPrabhakar Kushwaha 				      u32 *given_actual_dump_size_in_dwords)
46518a52bbabSMichal Kalderon {
46528a52bbabSMichal Kalderon 	struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients;
46536c95dd8fSPrabhakar Kushwaha 	u32 pf_start_line, start_page_id, offset = *given_offset;
46548a52bbabSMichal Kalderon 	u32 cdut_pf_init_pages, cdut_vf_init_pages;
46558a52bbabSMichal Kalderon 	u32 cdut_pf_work_pages, cdut_vf_work_pages;
46568a52bbabSMichal Kalderon 	u32 base_data_offset, size_param_offset;
46576c95dd8fSPrabhakar Kushwaha 	u32 src_pages;
46586c95dd8fSPrabhakar Kushwaha 	u32 section_header_and_param_size;
46598a52bbabSMichal Kalderon 	u32 cdut_pf_pages, cdut_vf_pages;
46606c95dd8fSPrabhakar Kushwaha 	u32 actual_dump_size_in_dwords;
46616c95dd8fSPrabhakar Kushwaha 	bool continue_dump = *dump;
46626c95dd8fSPrabhakar Kushwaha 	bool update_size = *dump;
46638a52bbabSMichal Kalderon 	const char *section_name;
46646c95dd8fSPrabhakar Kushwaha 	u32 i;
46658a52bbabSMichal Kalderon 
46666c95dd8fSPrabhakar Kushwaha 	actual_dump_size_in_dwords = *given_actual_dump_size_in_dwords;
46678a52bbabSMichal Kalderon 	section_name = dump_page_ids ? "ilt_page_ids" : "ilt_page_mem";
46688a52bbabSMichal Kalderon 	cdut_pf_init_pages = qed_get_cdut_num_pf_init_pages(p_hwfn);
46698a52bbabSMichal Kalderon 	cdut_vf_init_pages = qed_get_cdut_num_vf_init_pages(p_hwfn);
46708a52bbabSMichal Kalderon 	cdut_pf_work_pages = qed_get_cdut_num_pf_work_pages(p_hwfn);
46718a52bbabSMichal Kalderon 	cdut_vf_work_pages = qed_get_cdut_num_vf_work_pages(p_hwfn);
46728a52bbabSMichal Kalderon 	cdut_pf_pages = cdut_pf_init_pages + cdut_pf_work_pages;
46738a52bbabSMichal Kalderon 	cdut_vf_pages = cdut_vf_init_pages + cdut_vf_work_pages;
46748a52bbabSMichal Kalderon 	pf_start_line = p_hwfn->p_cxt_mngr->pf_start_line;
46756c95dd8fSPrabhakar Kushwaha 	section_header_and_param_size = qed_dump_section_hdr(NULL,
46766c95dd8fSPrabhakar Kushwaha 							     false,
46776c95dd8fSPrabhakar Kushwaha 							     section_name,
46786c95dd8fSPrabhakar Kushwaha 							     1) +
46796c95dd8fSPrabhakar Kushwaha 	qed_dump_num_param(NULL, false, "size", 0);
46808a52bbabSMichal Kalderon 
46816c95dd8fSPrabhakar Kushwaha 	if ((continue_dump) &&
46826c95dd8fSPrabhakar Kushwaha 	    (offset + section_header_and_param_size > buf_size_in_dwords)) {
46836c95dd8fSPrabhakar Kushwaha 		continue_dump = false;
46846c95dd8fSPrabhakar Kushwaha 		update_size = false;
46856c95dd8fSPrabhakar Kushwaha 		actual_dump_size_in_dwords = offset;
46866c95dd8fSPrabhakar Kushwaha 	}
46876c95dd8fSPrabhakar Kushwaha 
46886c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_section_hdr(dump_buf + offset,
46896c95dd8fSPrabhakar Kushwaha 				       continue_dump, section_name, 1);
46908a52bbabSMichal Kalderon 
46918a52bbabSMichal Kalderon 	/* Dump size parameter (0 for now, overwritten with real size later) */
46928a52bbabSMichal Kalderon 	size_param_offset = offset;
46936c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
46946c95dd8fSPrabhakar Kushwaha 				     continue_dump, "size", 0);
46958a52bbabSMichal Kalderon 	base_data_offset = offset;
46968a52bbabSMichal Kalderon 
46978a52bbabSMichal Kalderon 	/* CDUC pages are ordered as follows:
46988a52bbabSMichal Kalderon 	 * - PF pages - valid section (included in PF connection type mapping)
46998a52bbabSMichal Kalderon 	 * - PF pages - invalid section (not dumped)
47008a52bbabSMichal Kalderon 	 * - For each VF in the PF:
47018a52bbabSMichal Kalderon 	 *   - VF pages - valid section (included in VF connection type mapping)
47028a52bbabSMichal Kalderon 	 *   - VF pages - invalid section (not dumped)
47038a52bbabSMichal Kalderon 	 */
47048a52bbabSMichal Kalderon 	if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUC)) {
47058a52bbabSMichal Kalderon 		/* Dump connection PF pages */
47068a52bbabSMichal Kalderon 		start_page_id = clients[ILT_CLI_CDUC].first.val - pf_start_line;
47076c95dd8fSPrabhakar Kushwaha 		qed_ilt_dump_pages_range(dump_buf, &offset, &continue_dump,
47086c95dd8fSPrabhakar Kushwaha 					 start_page_id, valid_conn_pf_pages,
47096c95dd8fSPrabhakar Kushwaha 					 ilt_pages, dump_page_ids,
47106c95dd8fSPrabhakar Kushwaha 					 buf_size_in_dwords,
47116c95dd8fSPrabhakar Kushwaha 					 &actual_dump_size_in_dwords);
47128a52bbabSMichal Kalderon 
47138a52bbabSMichal Kalderon 		/* Dump connection VF pages */
47148a52bbabSMichal Kalderon 		start_page_id += clients[ILT_CLI_CDUC].pf_total_lines;
47158a52bbabSMichal Kalderon 		for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count;
47168a52bbabSMichal Kalderon 		     i++, start_page_id += clients[ILT_CLI_CDUC].vf_total_lines)
47176c95dd8fSPrabhakar Kushwaha 			qed_ilt_dump_pages_range(dump_buf, &offset,
47186c95dd8fSPrabhakar Kushwaha 						 &continue_dump, start_page_id,
47198a52bbabSMichal Kalderon 						 valid_conn_vf_pages,
47206c95dd8fSPrabhakar Kushwaha 						 ilt_pages, dump_page_ids,
47216c95dd8fSPrabhakar Kushwaha 						 buf_size_in_dwords,
47226c95dd8fSPrabhakar Kushwaha 						 &actual_dump_size_in_dwords);
47238a52bbabSMichal Kalderon 	}
47248a52bbabSMichal Kalderon 
47258a52bbabSMichal Kalderon 	/* CDUT pages are ordered as follows:
47268a52bbabSMichal Kalderon 	 * - PF init pages (not dumped)
47278a52bbabSMichal Kalderon 	 * - PF work pages
47288a52bbabSMichal Kalderon 	 * - For each VF in the PF:
47298a52bbabSMichal Kalderon 	 *   - VF init pages (not dumped)
47308a52bbabSMichal Kalderon 	 *   - VF work pages
47318a52bbabSMichal Kalderon 	 */
47328a52bbabSMichal Kalderon 	if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_DUMP_ILT_CDUT)) {
47338a52bbabSMichal Kalderon 		/* Dump task PF pages */
47348a52bbabSMichal Kalderon 		start_page_id = clients[ILT_CLI_CDUT].first.val +
47358a52bbabSMichal Kalderon 		    cdut_pf_init_pages - pf_start_line;
47366c95dd8fSPrabhakar Kushwaha 		qed_ilt_dump_pages_range(dump_buf, &offset, &continue_dump,
47376c95dd8fSPrabhakar Kushwaha 					 start_page_id, cdut_pf_work_pages,
47386c95dd8fSPrabhakar Kushwaha 					 ilt_pages, dump_page_ids,
47396c95dd8fSPrabhakar Kushwaha 					 buf_size_in_dwords,
47406c95dd8fSPrabhakar Kushwaha 					 &actual_dump_size_in_dwords);
47418a52bbabSMichal Kalderon 
47428a52bbabSMichal Kalderon 		/* Dump task VF pages */
47438a52bbabSMichal Kalderon 		start_page_id = clients[ILT_CLI_CDUT].first.val +
47448a52bbabSMichal Kalderon 		    cdut_pf_pages + cdut_vf_init_pages - pf_start_line;
47458a52bbabSMichal Kalderon 		for (i = 0; i < p_hwfn->p_cxt_mngr->vf_count;
47468a52bbabSMichal Kalderon 		     i++, start_page_id += cdut_vf_pages)
47476c95dd8fSPrabhakar Kushwaha 			qed_ilt_dump_pages_range(dump_buf, &offset,
47486c95dd8fSPrabhakar Kushwaha 						 &continue_dump, start_page_id,
47496c95dd8fSPrabhakar Kushwaha 						 cdut_vf_work_pages, ilt_pages,
47506c95dd8fSPrabhakar Kushwaha 						 dump_page_ids,
47516c95dd8fSPrabhakar Kushwaha 						 buf_size_in_dwords,
47526c95dd8fSPrabhakar Kushwaha 						 &actual_dump_size_in_dwords);
47536c95dd8fSPrabhakar Kushwaha 	}
47546c95dd8fSPrabhakar Kushwaha 
47556c95dd8fSPrabhakar Kushwaha 	/*Dump Searcher pages */
47566c95dd8fSPrabhakar Kushwaha 	if (clients[ILT_CLI_SRC].active) {
47576c95dd8fSPrabhakar Kushwaha 		start_page_id = clients[ILT_CLI_SRC].first.val - pf_start_line;
47586c95dd8fSPrabhakar Kushwaha 		src_pages = clients[ILT_CLI_SRC].last.val -
47596c95dd8fSPrabhakar Kushwaha 		    clients[ILT_CLI_SRC].first.val + 1;
47606c95dd8fSPrabhakar Kushwaha 		qed_ilt_dump_pages_range(dump_buf, &offset, &continue_dump,
47616c95dd8fSPrabhakar Kushwaha 					 start_page_id, src_pages, ilt_pages,
47626c95dd8fSPrabhakar Kushwaha 					 dump_page_ids, buf_size_in_dwords,
47636c95dd8fSPrabhakar Kushwaha 					 &actual_dump_size_in_dwords);
47648a52bbabSMichal Kalderon 	}
47658a52bbabSMichal Kalderon 
47668a52bbabSMichal Kalderon 	/* Overwrite size param */
47676c95dd8fSPrabhakar Kushwaha 	if (update_size) {
47686c95dd8fSPrabhakar Kushwaha 		u32 section_size = (*dump == continue_dump) ?
47696c95dd8fSPrabhakar Kushwaha 		    offset - base_data_offset :
47706c95dd8fSPrabhakar Kushwaha 		    actual_dump_size_in_dwords - base_data_offset;
47716c95dd8fSPrabhakar Kushwaha 		if (section_size > 0)
47728a52bbabSMichal Kalderon 			qed_dump_num_param(dump_buf + size_param_offset,
47736c95dd8fSPrabhakar Kushwaha 					   *dump, "size", section_size);
47746c95dd8fSPrabhakar Kushwaha 		else if ((section_size == 0) && (*dump != continue_dump))
47756c95dd8fSPrabhakar Kushwaha 			actual_dump_size_in_dwords -=
47766c95dd8fSPrabhakar Kushwaha 			    section_header_and_param_size;
47776c95dd8fSPrabhakar Kushwaha 	}
47786c95dd8fSPrabhakar Kushwaha 
47796c95dd8fSPrabhakar Kushwaha 	*dump = continue_dump;
47806c95dd8fSPrabhakar Kushwaha 	*given_offset = offset;
47816c95dd8fSPrabhakar Kushwaha 	*given_actual_dump_size_in_dwords = actual_dump_size_in_dwords;
47828a52bbabSMichal Kalderon 
47838a52bbabSMichal Kalderon 	return offset;
47848a52bbabSMichal Kalderon }
47858a52bbabSMichal Kalderon 
47866c95dd8fSPrabhakar Kushwaha /* Dumps a section containing the global parameters.
47876c95dd8fSPrabhakar Kushwaha  * Part of ilt dump process
47888a52bbabSMichal Kalderon  * Returns the dumped size in dwords.
47898a52bbabSMichal Kalderon  */
47906c95dd8fSPrabhakar Kushwaha static u32
qed_ilt_dump_dump_common_global_params(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,bool dump,u32 cduc_page_size,u32 conn_ctx_size,u32 cdut_page_size,u32 * full_dump_size_param_offset,u32 * actual_dump_size_param_offset)47916c95dd8fSPrabhakar Kushwaha qed_ilt_dump_dump_common_global_params(struct qed_hwfn *p_hwfn,
47926c95dd8fSPrabhakar Kushwaha 				       struct qed_ptt *p_ptt,
47936c95dd8fSPrabhakar Kushwaha 				       u32 *dump_buf,
47946c95dd8fSPrabhakar Kushwaha 				       bool dump,
47956c95dd8fSPrabhakar Kushwaha 				       u32 cduc_page_size,
47966c95dd8fSPrabhakar Kushwaha 				       u32 conn_ctx_size,
47976c95dd8fSPrabhakar Kushwaha 				       u32 cdut_page_size,
47986c95dd8fSPrabhakar Kushwaha 				       u32 *full_dump_size_param_offset,
47996c95dd8fSPrabhakar Kushwaha 				       u32 *actual_dump_size_param_offset)
48008a52bbabSMichal Kalderon {
48018a52bbabSMichal Kalderon 	struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients;
48026c95dd8fSPrabhakar Kushwaha 	u32 offset = 0;
48038a52bbabSMichal Kalderon 
48048a52bbabSMichal Kalderon 	offset += qed_dump_common_global_params(p_hwfn, p_ptt,
48056c95dd8fSPrabhakar Kushwaha 						dump_buf + offset,
48066c95dd8fSPrabhakar Kushwaha 						dump, 30);
48078a52bbabSMichal Kalderon 	offset += qed_dump_str_param(dump_buf + offset,
48086c95dd8fSPrabhakar Kushwaha 				     dump,
48096c95dd8fSPrabhakar Kushwaha 				     "dump-type", "ilt-dump");
48108a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48118a52bbabSMichal Kalderon 				     dump,
48126c95dd8fSPrabhakar Kushwaha 				     "cduc-page-size",
48136c95dd8fSPrabhakar Kushwaha 				     cduc_page_size);
48148a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48158a52bbabSMichal Kalderon 				     dump,
48168a52bbabSMichal Kalderon 				     "cduc-first-page-id",
48178a52bbabSMichal Kalderon 				     clients[ILT_CLI_CDUC].first.val);
48188a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48198a52bbabSMichal Kalderon 				     dump,
48208a52bbabSMichal Kalderon 				     "cduc-last-page-id",
48218a52bbabSMichal Kalderon 				     clients[ILT_CLI_CDUC].last.val);
48228a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48238a52bbabSMichal Kalderon 				     dump,
48248a52bbabSMichal Kalderon 				     "cduc-num-pf-pages",
48256c95dd8fSPrabhakar Kushwaha 				     clients[ILT_CLI_CDUC].pf_total_lines);
48268a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48278a52bbabSMichal Kalderon 				     dump,
48288a52bbabSMichal Kalderon 				     "cduc-num-vf-pages",
48296c95dd8fSPrabhakar Kushwaha 				     clients[ILT_CLI_CDUC].vf_total_lines);
48308a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48318a52bbabSMichal Kalderon 				     dump,
48328a52bbabSMichal Kalderon 				     "max-conn-ctx-size",
48338a52bbabSMichal Kalderon 				     conn_ctx_size);
48348a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48358a52bbabSMichal Kalderon 				     dump,
48366c95dd8fSPrabhakar Kushwaha 				     "cdut-page-size",
48376c95dd8fSPrabhakar Kushwaha 				     cdut_page_size);
48388a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48398a52bbabSMichal Kalderon 				     dump,
48408a52bbabSMichal Kalderon 				     "cdut-first-page-id",
48418a52bbabSMichal Kalderon 				     clients[ILT_CLI_CDUT].first.val);
48428a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48438a52bbabSMichal Kalderon 				     dump,
48448a52bbabSMichal Kalderon 				     "cdut-last-page-id",
48458a52bbabSMichal Kalderon 				     clients[ILT_CLI_CDUT].last.val);
48468a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48478a52bbabSMichal Kalderon 				     dump,
48488a52bbabSMichal Kalderon 				     "cdut-num-pf-init-pages",
48498a52bbabSMichal Kalderon 				     qed_get_cdut_num_pf_init_pages(p_hwfn));
48508a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48518a52bbabSMichal Kalderon 				     dump,
48528a52bbabSMichal Kalderon 				     "cdut-num-vf-init-pages",
48538a52bbabSMichal Kalderon 				     qed_get_cdut_num_vf_init_pages(p_hwfn));
48548a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48558a52bbabSMichal Kalderon 				     dump,
48568a52bbabSMichal Kalderon 				     "cdut-num-pf-work-pages",
48578a52bbabSMichal Kalderon 				     qed_get_cdut_num_pf_work_pages(p_hwfn));
48588a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48598a52bbabSMichal Kalderon 				     dump,
48608a52bbabSMichal Kalderon 				     "cdut-num-vf-work-pages",
48618a52bbabSMichal Kalderon 				     qed_get_cdut_num_vf_work_pages(p_hwfn));
48628a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48638a52bbabSMichal Kalderon 				     dump,
48648a52bbabSMichal Kalderon 				     "max-task-ctx-size",
48658a52bbabSMichal Kalderon 				     p_hwfn->p_cxt_mngr->task_ctx_size);
48668a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48678a52bbabSMichal Kalderon 				     dump,
48688a52bbabSMichal Kalderon 				     "first-vf-id-in-pf",
48698a52bbabSMichal Kalderon 				     p_hwfn->p_cxt_mngr->first_vf_in_pf);
48706c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
48718a52bbabSMichal Kalderon 				     dump,
48728a52bbabSMichal Kalderon 				     "num-vfs-in-pf",
48738a52bbabSMichal Kalderon 				     p_hwfn->p_cxt_mngr->vf_count);
48748a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48758a52bbabSMichal Kalderon 				     dump,
48766c95dd8fSPrabhakar Kushwaha 				     "ptr-size-bytes",
48776c95dd8fSPrabhakar Kushwaha 				     sizeof(void *));
48788a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48798a52bbabSMichal Kalderon 				     dump,
48808a52bbabSMichal Kalderon 				     "pf-start-line",
48818a52bbabSMichal Kalderon 				     p_hwfn->p_cxt_mngr->pf_start_line);
48828a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48838a52bbabSMichal Kalderon 				     dump,
48848a52bbabSMichal Kalderon 				     "page-mem-desc-size-dwords",
48858a52bbabSMichal Kalderon 				     PAGE_MEM_DESC_SIZE_DWORDS);
48868a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
48878a52bbabSMichal Kalderon 				     dump,
48888a52bbabSMichal Kalderon 				     "ilt-shadow-size",
48898a52bbabSMichal Kalderon 				     p_hwfn->p_cxt_mngr->ilt_shadow_size);
48906c95dd8fSPrabhakar Kushwaha 
48916c95dd8fSPrabhakar Kushwaha 	*full_dump_size_param_offset = offset;
48926c95dd8fSPrabhakar Kushwaha 
48936c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
48946c95dd8fSPrabhakar Kushwaha 				     dump, "dump-size-full", 0);
48956c95dd8fSPrabhakar Kushwaha 
48966c95dd8fSPrabhakar Kushwaha 	*actual_dump_size_param_offset = offset;
48976c95dd8fSPrabhakar Kushwaha 
48986c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
48996c95dd8fSPrabhakar Kushwaha 				     dump,
49006c95dd8fSPrabhakar Kushwaha 				     "dump-size-actual", 0);
49016c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
49026c95dd8fSPrabhakar Kushwaha 				     dump,
49036c95dd8fSPrabhakar Kushwaha 				     "iscsi_task_pages",
49046c95dd8fSPrabhakar Kushwaha 				     p_hwfn->p_cxt_mngr->iscsi_task_pages);
49056c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
49066c95dd8fSPrabhakar Kushwaha 				     dump,
49076c95dd8fSPrabhakar Kushwaha 				     "fcoe_task_pages",
49086c95dd8fSPrabhakar Kushwaha 				     p_hwfn->p_cxt_mngr->fcoe_task_pages);
49096c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
49106c95dd8fSPrabhakar Kushwaha 				     dump,
49116c95dd8fSPrabhakar Kushwaha 				     "roce_task_pages",
49126c95dd8fSPrabhakar Kushwaha 				     p_hwfn->p_cxt_mngr->roce_task_pages);
49136c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
49146c95dd8fSPrabhakar Kushwaha 				     dump,
49156c95dd8fSPrabhakar Kushwaha 				     "eth_task_pages",
49166c95dd8fSPrabhakar Kushwaha 				     p_hwfn->p_cxt_mngr->eth_task_pages);
49176c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
49186c95dd8fSPrabhakar Kushwaha 				      dump,
49196c95dd8fSPrabhakar Kushwaha 				      "src-first-page-id",
49206c95dd8fSPrabhakar Kushwaha 				      clients[ILT_CLI_SRC].first.val);
49216c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
49226c95dd8fSPrabhakar Kushwaha 				     dump,
49236c95dd8fSPrabhakar Kushwaha 				     "src-last-page-id",
49246c95dd8fSPrabhakar Kushwaha 				     clients[ILT_CLI_SRC].last.val);
49256c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_num_param(dump_buf + offset,
49266c95dd8fSPrabhakar Kushwaha 				     dump,
49276c95dd8fSPrabhakar Kushwaha 				     "src-is-active",
49286c95dd8fSPrabhakar Kushwaha 				     clients[ILT_CLI_SRC].active);
49296c95dd8fSPrabhakar Kushwaha 
49308a52bbabSMichal Kalderon 	/* Additional/Less parameters require matching of number in call to
49318a52bbabSMichal Kalderon 	 * dump_common_global_params()
49328a52bbabSMichal Kalderon 	 */
49338a52bbabSMichal Kalderon 
49346c95dd8fSPrabhakar Kushwaha 	return offset;
49356c95dd8fSPrabhakar Kushwaha }
49366c95dd8fSPrabhakar Kushwaha 
49376c95dd8fSPrabhakar Kushwaha /* Dump section containing number of PF CIDs per connection type.
49386c95dd8fSPrabhakar Kushwaha  * Part of ilt dump process.
49396c95dd8fSPrabhakar Kushwaha  * Returns the dumped size in dwords.
49406c95dd8fSPrabhakar Kushwaha  */
qed_ilt_dump_dump_num_pf_cids(struct qed_hwfn * p_hwfn,u32 * dump_buf,bool dump,u32 * valid_conn_pf_cids)49416c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump_dump_num_pf_cids(struct qed_hwfn *p_hwfn,
49426c95dd8fSPrabhakar Kushwaha 					 u32 *dump_buf,
49436c95dd8fSPrabhakar Kushwaha 					 bool dump, u32 *valid_conn_pf_cids)
49446c95dd8fSPrabhakar Kushwaha {
49456c95dd8fSPrabhakar Kushwaha 	u32 num_pf_cids = 0;
49466c95dd8fSPrabhakar Kushwaha 	u32 offset = 0;
49476c95dd8fSPrabhakar Kushwaha 	u8 conn_type;
49486c95dd8fSPrabhakar Kushwaha 
49498a52bbabSMichal Kalderon 	offset += qed_dump_section_hdr(dump_buf + offset,
49508a52bbabSMichal Kalderon 				       dump, "num_pf_cids_per_conn_type", 1);
49518a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
4952fb09a1edSShai Malin 				     dump, "size", NUM_OF_CONNECTION_TYPES);
49536c95dd8fSPrabhakar Kushwaha 	for (conn_type = 0, *valid_conn_pf_cids = 0;
4954fb09a1edSShai Malin 	     conn_type < NUM_OF_CONNECTION_TYPES; conn_type++, offset++) {
49556c95dd8fSPrabhakar Kushwaha 		num_pf_cids = p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cid_count;
49568a52bbabSMichal Kalderon 		if (dump)
49578a52bbabSMichal Kalderon 			*(dump_buf + offset) = num_pf_cids;
49586c95dd8fSPrabhakar Kushwaha 		*valid_conn_pf_cids += num_pf_cids;
49598a52bbabSMichal Kalderon 	}
49608a52bbabSMichal Kalderon 
49616c95dd8fSPrabhakar Kushwaha 	return offset;
49626c95dd8fSPrabhakar Kushwaha }
49636c95dd8fSPrabhakar Kushwaha 
49646c95dd8fSPrabhakar Kushwaha /* Dump section containing number of VF CIDs per connection type
49656c95dd8fSPrabhakar Kushwaha  * Part of ilt dump process.
49666c95dd8fSPrabhakar Kushwaha  * Returns the dumped size in dwords.
49676c95dd8fSPrabhakar Kushwaha  */
qed_ilt_dump_dump_num_vf_cids(struct qed_hwfn * p_hwfn,u32 * dump_buf,bool dump,u32 * valid_conn_vf_cids)49686c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump_dump_num_vf_cids(struct qed_hwfn *p_hwfn,
49696c95dd8fSPrabhakar Kushwaha 					 u32 *dump_buf,
49706c95dd8fSPrabhakar Kushwaha 					 bool dump, u32 *valid_conn_vf_cids)
49716c95dd8fSPrabhakar Kushwaha {
49726c95dd8fSPrabhakar Kushwaha 	u32 num_vf_cids = 0;
49736c95dd8fSPrabhakar Kushwaha 	u32 offset = 0;
49746c95dd8fSPrabhakar Kushwaha 	u8 conn_type;
49756c95dd8fSPrabhakar Kushwaha 
49766c95dd8fSPrabhakar Kushwaha 	offset += qed_dump_section_hdr(dump_buf + offset, dump,
49776c95dd8fSPrabhakar Kushwaha 				       "num_vf_cids_per_conn_type", 1);
49788a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
4979fb09a1edSShai Malin 				     dump, "size", NUM_OF_CONNECTION_TYPES);
49806c95dd8fSPrabhakar Kushwaha 	for (conn_type = 0, *valid_conn_vf_cids = 0;
4981fb09a1edSShai Malin 	     conn_type < NUM_OF_CONNECTION_TYPES; conn_type++, offset++) {
49826c95dd8fSPrabhakar Kushwaha 		num_vf_cids =
49838a52bbabSMichal Kalderon 		    p_hwfn->p_cxt_mngr->conn_cfg[conn_type].cids_per_vf;
49848a52bbabSMichal Kalderon 		if (dump)
49858a52bbabSMichal Kalderon 			*(dump_buf + offset) = num_vf_cids;
49866c95dd8fSPrabhakar Kushwaha 		*valid_conn_vf_cids += num_vf_cids;
49878a52bbabSMichal Kalderon 	}
49888a52bbabSMichal Kalderon 
49896c95dd8fSPrabhakar Kushwaha 	return offset;
49906c95dd8fSPrabhakar Kushwaha }
49916c95dd8fSPrabhakar Kushwaha 
49926c95dd8fSPrabhakar Kushwaha /* Performs ILT Dump to the specified buffer.
49936c95dd8fSPrabhakar Kushwaha  * buf_size_in_dwords - The dumped buffer size.
49946c95dd8fSPrabhakar Kushwaha  * Returns the dumped size in dwords.
49956c95dd8fSPrabhakar Kushwaha  */
qed_ilt_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,bool dump)49966c95dd8fSPrabhakar Kushwaha static u32 qed_ilt_dump(struct qed_hwfn *p_hwfn,
49976c95dd8fSPrabhakar Kushwaha 			struct qed_ptt *p_ptt,
49986c95dd8fSPrabhakar Kushwaha 			u32 *dump_buf, u32 buf_size_in_dwords, bool dump)
49996c95dd8fSPrabhakar Kushwaha {
50006c95dd8fSPrabhakar Kushwaha #if ((!defined VMWARE) && (!defined UEFI))
50016c95dd8fSPrabhakar Kushwaha 	struct qed_ilt_client_cfg *clients = p_hwfn->p_cxt_mngr->clients;
50026c95dd8fSPrabhakar Kushwaha #endif
50036c95dd8fSPrabhakar Kushwaha 	u32 valid_conn_vf_cids = 0,
50046c95dd8fSPrabhakar Kushwaha 	    valid_conn_vf_pages, offset = 0, real_dumped_size = 0;
50056c95dd8fSPrabhakar Kushwaha 	u32 valid_conn_pf_cids = 0, valid_conn_pf_pages, num_pages;
50066c95dd8fSPrabhakar Kushwaha 	u32 num_cids_per_page, conn_ctx_size;
50076c95dd8fSPrabhakar Kushwaha 	u32 cduc_page_size, cdut_page_size;
50086c95dd8fSPrabhakar Kushwaha 	u32 actual_dump_size_in_dwords = 0;
50096c95dd8fSPrabhakar Kushwaha 	struct phys_mem_desc *ilt_pages;
50106c95dd8fSPrabhakar Kushwaha 	u32 actul_dump_off = 0;
50116c95dd8fSPrabhakar Kushwaha 	u32 last_section_size;
50126c95dd8fSPrabhakar Kushwaha 	u32 full_dump_off = 0;
50136c95dd8fSPrabhakar Kushwaha 	u32 section_size = 0;
50146c95dd8fSPrabhakar Kushwaha 	bool continue_dump;
50156c95dd8fSPrabhakar Kushwaha 	u32 page_id;
50166c95dd8fSPrabhakar Kushwaha 
50176c95dd8fSPrabhakar Kushwaha 	last_section_size = qed_dump_last_section(NULL, 0, false);
50186c95dd8fSPrabhakar Kushwaha 	cduc_page_size = 1 <<
50196c95dd8fSPrabhakar Kushwaha 	    (clients[ILT_CLI_CDUC].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN);
50206c95dd8fSPrabhakar Kushwaha 	cdut_page_size = 1 <<
50216c95dd8fSPrabhakar Kushwaha 	    (clients[ILT_CLI_CDUT].p_size.val + PXP_ILT_PAGE_SIZE_NUM_BITS_MIN);
50226c95dd8fSPrabhakar Kushwaha 	conn_ctx_size = p_hwfn->p_cxt_mngr->conn_ctx_size;
50236c95dd8fSPrabhakar Kushwaha 	num_cids_per_page = (int)(cduc_page_size / conn_ctx_size);
50246c95dd8fSPrabhakar Kushwaha 	ilt_pages = p_hwfn->p_cxt_mngr->ilt_shadow;
50256c95dd8fSPrabhakar Kushwaha 	continue_dump = dump;
50266c95dd8fSPrabhakar Kushwaha 
50276c95dd8fSPrabhakar Kushwaha 	/* if need to dump then save memory for the last section
50286c95dd8fSPrabhakar Kushwaha 	 * (last section calculates CRC of dumped data)
50296c95dd8fSPrabhakar Kushwaha 	 */
50306c95dd8fSPrabhakar Kushwaha 	if (dump) {
50316c95dd8fSPrabhakar Kushwaha 		if (buf_size_in_dwords >= last_section_size) {
50326c95dd8fSPrabhakar Kushwaha 			buf_size_in_dwords -= last_section_size;
50336c95dd8fSPrabhakar Kushwaha 		} else {
50346c95dd8fSPrabhakar Kushwaha 			continue_dump = false;
50356c95dd8fSPrabhakar Kushwaha 			actual_dump_size_in_dwords = offset;
50366c95dd8fSPrabhakar Kushwaha 		}
50376c95dd8fSPrabhakar Kushwaha 	}
50386c95dd8fSPrabhakar Kushwaha 
50396c95dd8fSPrabhakar Kushwaha 	/* Dump global params */
50406c95dd8fSPrabhakar Kushwaha 
50416c95dd8fSPrabhakar Kushwaha 	/* if need to dump then first check that there is enough memory
50426c95dd8fSPrabhakar Kushwaha 	 * in dumped buffer for this section calculate the size of this
50436c95dd8fSPrabhakar Kushwaha 	 * section without dumping. if there is not enough memory - then
50446c95dd8fSPrabhakar Kushwaha 	 * stop the dumping.
50456c95dd8fSPrabhakar Kushwaha 	 */
50466c95dd8fSPrabhakar Kushwaha 	if (continue_dump) {
50476c95dd8fSPrabhakar Kushwaha 		section_size =
50486c95dd8fSPrabhakar Kushwaha 			qed_ilt_dump_dump_common_global_params(p_hwfn,
50496c95dd8fSPrabhakar Kushwaha 							       p_ptt,
50506c95dd8fSPrabhakar Kushwaha 							       NULL,
50516c95dd8fSPrabhakar Kushwaha 							       false,
50526c95dd8fSPrabhakar Kushwaha 							       cduc_page_size,
50536c95dd8fSPrabhakar Kushwaha 							       conn_ctx_size,
50546c95dd8fSPrabhakar Kushwaha 							       cdut_page_size,
50556c95dd8fSPrabhakar Kushwaha 							       &full_dump_off,
50566c95dd8fSPrabhakar Kushwaha 							       &actul_dump_off);
50576c95dd8fSPrabhakar Kushwaha 		if (offset + section_size > buf_size_in_dwords) {
50586c95dd8fSPrabhakar Kushwaha 			continue_dump = false;
50596c95dd8fSPrabhakar Kushwaha 			actual_dump_size_in_dwords = offset;
50606c95dd8fSPrabhakar Kushwaha 		}
50616c95dd8fSPrabhakar Kushwaha 	}
50626c95dd8fSPrabhakar Kushwaha 
50636c95dd8fSPrabhakar Kushwaha 	offset += qed_ilt_dump_dump_common_global_params(p_hwfn,
50646c95dd8fSPrabhakar Kushwaha 							 p_ptt,
50656c95dd8fSPrabhakar Kushwaha 							 dump_buf + offset,
50666c95dd8fSPrabhakar Kushwaha 							 continue_dump,
50676c95dd8fSPrabhakar Kushwaha 							 cduc_page_size,
50686c95dd8fSPrabhakar Kushwaha 							 conn_ctx_size,
50696c95dd8fSPrabhakar Kushwaha 							 cdut_page_size,
50706c95dd8fSPrabhakar Kushwaha 							 &full_dump_off,
50716c95dd8fSPrabhakar Kushwaha 							 &actul_dump_off);
50726c95dd8fSPrabhakar Kushwaha 
50736c95dd8fSPrabhakar Kushwaha 	/* Dump section containing number of PF CIDs per connection type
50746c95dd8fSPrabhakar Kushwaha 	 * If need to dump then first check that there is enough memory in
50756c95dd8fSPrabhakar Kushwaha 	 * dumped buffer for this section.
50766c95dd8fSPrabhakar Kushwaha 	 */
50776c95dd8fSPrabhakar Kushwaha 	if (continue_dump) {
50786c95dd8fSPrabhakar Kushwaha 		section_size =
50796c95dd8fSPrabhakar Kushwaha 			qed_ilt_dump_dump_num_pf_cids(p_hwfn,
50806c95dd8fSPrabhakar Kushwaha 						      NULL,
50816c95dd8fSPrabhakar Kushwaha 						      false,
50826c95dd8fSPrabhakar Kushwaha 						      &valid_conn_pf_cids);
50836c95dd8fSPrabhakar Kushwaha 		if (offset + section_size > buf_size_in_dwords) {
50846c95dd8fSPrabhakar Kushwaha 			continue_dump = false;
50856c95dd8fSPrabhakar Kushwaha 			actual_dump_size_in_dwords = offset;
50866c95dd8fSPrabhakar Kushwaha 		}
50876c95dd8fSPrabhakar Kushwaha 	}
50886c95dd8fSPrabhakar Kushwaha 
50896c95dd8fSPrabhakar Kushwaha 	offset += qed_ilt_dump_dump_num_pf_cids(p_hwfn,
50906c95dd8fSPrabhakar Kushwaha 						dump_buf + offset,
50916c95dd8fSPrabhakar Kushwaha 						continue_dump,
50926c95dd8fSPrabhakar Kushwaha 						&valid_conn_pf_cids);
50936c95dd8fSPrabhakar Kushwaha 
50946c95dd8fSPrabhakar Kushwaha 	/* Dump section containing number of VF CIDs per connection type
50956c95dd8fSPrabhakar Kushwaha 	 * If need to dump then first check that there is enough memory in
50966c95dd8fSPrabhakar Kushwaha 	 * dumped buffer for this section.
50976c95dd8fSPrabhakar Kushwaha 	 */
50986c95dd8fSPrabhakar Kushwaha 	if (continue_dump) {
50996c95dd8fSPrabhakar Kushwaha 		section_size =
51006c95dd8fSPrabhakar Kushwaha 			qed_ilt_dump_dump_num_vf_cids(p_hwfn,
51016c95dd8fSPrabhakar Kushwaha 						      NULL,
51026c95dd8fSPrabhakar Kushwaha 						      false,
51036c95dd8fSPrabhakar Kushwaha 						      &valid_conn_vf_cids);
51046c95dd8fSPrabhakar Kushwaha 		if (offset + section_size > buf_size_in_dwords) {
51056c95dd8fSPrabhakar Kushwaha 			continue_dump = false;
51066c95dd8fSPrabhakar Kushwaha 			actual_dump_size_in_dwords = offset;
51076c95dd8fSPrabhakar Kushwaha 		}
51086c95dd8fSPrabhakar Kushwaha 	}
51096c95dd8fSPrabhakar Kushwaha 
51106c95dd8fSPrabhakar Kushwaha 	offset += qed_ilt_dump_dump_num_vf_cids(p_hwfn,
51116c95dd8fSPrabhakar Kushwaha 						dump_buf + offset,
51126c95dd8fSPrabhakar Kushwaha 						continue_dump,
51136c95dd8fSPrabhakar Kushwaha 						&valid_conn_vf_cids);
51146c95dd8fSPrabhakar Kushwaha 
51156c95dd8fSPrabhakar Kushwaha 	/* Dump section containing physical memory descriptors for each
51166c95dd8fSPrabhakar Kushwaha 	 * ILT page.
51176c95dd8fSPrabhakar Kushwaha 	 */
51188a52bbabSMichal Kalderon 	num_pages = p_hwfn->p_cxt_mngr->ilt_shadow_size;
51196c95dd8fSPrabhakar Kushwaha 
51206c95dd8fSPrabhakar Kushwaha 	/* If need to dump then first check that there is enough memory
51216c95dd8fSPrabhakar Kushwaha 	 * in dumped buffer for the section header.
51226c95dd8fSPrabhakar Kushwaha 	 */
51236c95dd8fSPrabhakar Kushwaha 	if (continue_dump) {
51246c95dd8fSPrabhakar Kushwaha 		section_size = qed_dump_section_hdr(NULL,
51256c95dd8fSPrabhakar Kushwaha 						    false,
51266c95dd8fSPrabhakar Kushwaha 						    "ilt_page_desc",
51276c95dd8fSPrabhakar Kushwaha 						    1) +
51286c95dd8fSPrabhakar Kushwaha 		    qed_dump_num_param(NULL,
51296c95dd8fSPrabhakar Kushwaha 				       false,
51306c95dd8fSPrabhakar Kushwaha 				       "size",
51316c95dd8fSPrabhakar Kushwaha 				       num_pages * PAGE_MEM_DESC_SIZE_DWORDS);
51326c95dd8fSPrabhakar Kushwaha 		if (offset + section_size > buf_size_in_dwords) {
51336c95dd8fSPrabhakar Kushwaha 			continue_dump = false;
51346c95dd8fSPrabhakar Kushwaha 			actual_dump_size_in_dwords = offset;
51356c95dd8fSPrabhakar Kushwaha 		}
51366c95dd8fSPrabhakar Kushwaha 	}
51376c95dd8fSPrabhakar Kushwaha 
51388a52bbabSMichal Kalderon 	offset += qed_dump_section_hdr(dump_buf + offset,
51396c95dd8fSPrabhakar Kushwaha 				       continue_dump, "ilt_page_desc", 1);
51408a52bbabSMichal Kalderon 	offset += qed_dump_num_param(dump_buf + offset,
51416c95dd8fSPrabhakar Kushwaha 				     continue_dump,
51428a52bbabSMichal Kalderon 				     "size",
51438a52bbabSMichal Kalderon 				     num_pages * PAGE_MEM_DESC_SIZE_DWORDS);
51448a52bbabSMichal Kalderon 
51456c95dd8fSPrabhakar Kushwaha 	/* Copy memory descriptors to dump buffer
51466c95dd8fSPrabhakar Kushwaha 	 * If need to dump then dump till the dump buffer size
51476c95dd8fSPrabhakar Kushwaha 	 */
51486c95dd8fSPrabhakar Kushwaha 	if (continue_dump) {
51498a52bbabSMichal Kalderon 		for (page_id = 0; page_id < num_pages;
51506c95dd8fSPrabhakar Kushwaha 		     page_id++, offset += PAGE_MEM_DESC_SIZE_DWORDS) {
51516c95dd8fSPrabhakar Kushwaha 			if (continue_dump &&
51526c95dd8fSPrabhakar Kushwaha 			    (offset + PAGE_MEM_DESC_SIZE_DWORDS <=
51536c95dd8fSPrabhakar Kushwaha 			     buf_size_in_dwords)) {
51548a52bbabSMichal Kalderon 				memcpy(dump_buf + offset,
51558a52bbabSMichal Kalderon 				       &ilt_pages[page_id],
51566c95dd8fSPrabhakar Kushwaha 				       DWORDS_TO_BYTES
51576c95dd8fSPrabhakar Kushwaha 				       (PAGE_MEM_DESC_SIZE_DWORDS));
51586c95dd8fSPrabhakar Kushwaha 			} else {
51596c95dd8fSPrabhakar Kushwaha 				if (continue_dump) {
51606c95dd8fSPrabhakar Kushwaha 					continue_dump = false;
51616c95dd8fSPrabhakar Kushwaha 					actual_dump_size_in_dwords = offset;
51626c95dd8fSPrabhakar Kushwaha 				}
51636c95dd8fSPrabhakar Kushwaha 			}
51646c95dd8fSPrabhakar Kushwaha 		}
51658a52bbabSMichal Kalderon 	} else {
51668a52bbabSMichal Kalderon 		offset += num_pages * PAGE_MEM_DESC_SIZE_DWORDS;
51678a52bbabSMichal Kalderon 	}
51688a52bbabSMichal Kalderon 
51698a52bbabSMichal Kalderon 	valid_conn_pf_pages = DIV_ROUND_UP(valid_conn_pf_cids,
51708a52bbabSMichal Kalderon 					   num_cids_per_page);
51718a52bbabSMichal Kalderon 	valid_conn_vf_pages = DIV_ROUND_UP(valid_conn_vf_cids,
51728a52bbabSMichal Kalderon 					   num_cids_per_page);
51738a52bbabSMichal Kalderon 
51748a52bbabSMichal Kalderon 	/* Dump ILT pages IDs */
51756c95dd8fSPrabhakar Kushwaha 	qed_ilt_dump_pages_section(p_hwfn, dump_buf, &offset, &continue_dump,
51766c95dd8fSPrabhakar Kushwaha 				   valid_conn_pf_pages, valid_conn_vf_pages,
51776c95dd8fSPrabhakar Kushwaha 				   ilt_pages, true, buf_size_in_dwords,
51786c95dd8fSPrabhakar Kushwaha 				   &actual_dump_size_in_dwords);
51798a52bbabSMichal Kalderon 
51808a52bbabSMichal Kalderon 	/* Dump ILT pages memory */
51816c95dd8fSPrabhakar Kushwaha 	qed_ilt_dump_pages_section(p_hwfn, dump_buf, &offset, &continue_dump,
51826c95dd8fSPrabhakar Kushwaha 				   valid_conn_pf_pages, valid_conn_vf_pages,
51836c95dd8fSPrabhakar Kushwaha 				   ilt_pages, false, buf_size_in_dwords,
51846c95dd8fSPrabhakar Kushwaha 				   &actual_dump_size_in_dwords);
51856c95dd8fSPrabhakar Kushwaha 
51866c95dd8fSPrabhakar Kushwaha 	real_dumped_size =
51876c95dd8fSPrabhakar Kushwaha 	    (continue_dump == dump) ? offset : actual_dump_size_in_dwords;
51886c95dd8fSPrabhakar Kushwaha 	qed_dump_num_param(dump_buf + full_dump_off, dump,
51896c95dd8fSPrabhakar Kushwaha 			   "full-dump-size", offset + last_section_size);
51906c95dd8fSPrabhakar Kushwaha 	qed_dump_num_param(dump_buf + actul_dump_off,
51918a52bbabSMichal Kalderon 			   dump,
51926c95dd8fSPrabhakar Kushwaha 			   "actual-dump-size",
51936c95dd8fSPrabhakar Kushwaha 			   real_dumped_size + last_section_size);
51948a52bbabSMichal Kalderon 
51958a52bbabSMichal Kalderon 	/* Dump last section */
51966c95dd8fSPrabhakar Kushwaha 	real_dumped_size += qed_dump_last_section(dump_buf,
51976c95dd8fSPrabhakar Kushwaha 						  real_dumped_size, dump);
51988a52bbabSMichal Kalderon 
51996c95dd8fSPrabhakar Kushwaha 	return real_dumped_size;
52008a52bbabSMichal Kalderon }
52018a52bbabSMichal Kalderon 
5202c965db44STomer Tayar /***************************** Public Functions *******************************/
5203c965db44STomer Tayar 
qed_dbg_set_bin_ptr(struct qed_hwfn * p_hwfn,const u8 * const bin_ptr)52042d22bc83SMichal Kalderon enum dbg_status qed_dbg_set_bin_ptr(struct qed_hwfn *p_hwfn,
52052d22bc83SMichal Kalderon 				    const u8 * const bin_ptr)
5206c965db44STomer Tayar {
52072d22bc83SMichal Kalderon 	struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr;
5208c965db44STomer Tayar 	u8 buf_id;
5209c965db44STomer Tayar 
52102d22bc83SMichal Kalderon 	/* Convert binary data to debug arrays */
52112d22bc83SMichal Kalderon 	for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++)
52122d22bc83SMichal Kalderon 		qed_set_dbg_bin_buf(p_hwfn,
52132d22bc83SMichal Kalderon 				    buf_id,
52142d22bc83SMichal Kalderon 				    (u32 *)(bin_ptr + buf_hdrs[buf_id].offset),
52152d22bc83SMichal Kalderon 				    buf_hdrs[buf_id].length);
5216c965db44STomer Tayar 
5217c965db44STomer Tayar 	return DBG_STATUS_OK;
5218c965db44STomer Tayar }
5219c965db44STomer Tayar 
qed_dbg_set_app_ver(u32 ver)52206c95dd8fSPrabhakar Kushwaha static enum dbg_status qed_dbg_set_app_ver(u32 ver)
52216c95dd8fSPrabhakar Kushwaha {
52226c95dd8fSPrabhakar Kushwaha 	if (ver < TOOLS_VERSION)
52236c95dd8fSPrabhakar Kushwaha 		return DBG_STATUS_UNSUPPORTED_APP_VERSION;
52246c95dd8fSPrabhakar Kushwaha 
52256c95dd8fSPrabhakar Kushwaha 	s_app_ver = ver;
52266c95dd8fSPrabhakar Kushwaha 
52276c95dd8fSPrabhakar Kushwaha 	return DBG_STATUS_OK;
52286c95dd8fSPrabhakar Kushwaha }
52296c95dd8fSPrabhakar Kushwaha 
qed_read_fw_info(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,struct fw_info * fw_info)5230d52c89f1SMichal Kalderon bool qed_read_fw_info(struct qed_hwfn *p_hwfn,
5231d52c89f1SMichal Kalderon 		      struct qed_ptt *p_ptt, struct fw_info *fw_info)
5232d52c89f1SMichal Kalderon {
5233d52c89f1SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
5234d52c89f1SMichal Kalderon 	u8 storm_id;
5235d52c89f1SMichal Kalderon 
5236d52c89f1SMichal Kalderon 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
5237d52c89f1SMichal Kalderon 		struct storm_defs *storm = &s_storm_defs[storm_id];
5238d52c89f1SMichal Kalderon 
5239d52c89f1SMichal Kalderon 		/* Skip Storm if it's in reset */
52402d22bc83SMichal Kalderon 		if (dev_data->block_in_reset[storm->sem_block_id])
5241d52c89f1SMichal Kalderon 			continue;
5242d52c89f1SMichal Kalderon 
5243d52c89f1SMichal Kalderon 		/* Read FW info for the current Storm */
5244d52c89f1SMichal Kalderon 		qed_read_storm_fw_info(p_hwfn, p_ptt, storm_id, fw_info);
5245d52c89f1SMichal Kalderon 
5246d52c89f1SMichal Kalderon 		return true;
5247d52c89f1SMichal Kalderon 	}
5248d52c89f1SMichal Kalderon 
5249d52c89f1SMichal Kalderon 	return false;
5250d52c89f1SMichal Kalderon }
5251d52c89f1SMichal Kalderon 
qed_dbg_grc_config(struct qed_hwfn * p_hwfn,enum dbg_grc_params grc_param,u32 val)52523b86bd07SSudarsana Reddy Kalluru enum dbg_status qed_dbg_grc_config(struct qed_hwfn *p_hwfn,
52533b86bd07SSudarsana Reddy Kalluru 				   enum dbg_grc_params grc_param, u32 val)
52543b86bd07SSudarsana Reddy Kalluru {
52552d22bc83SMichal Kalderon 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
52563b86bd07SSudarsana Reddy Kalluru 	enum dbg_status status;
52573b86bd07SSudarsana Reddy Kalluru 	int i;
52583b86bd07SSudarsana Reddy Kalluru 
52592d22bc83SMichal Kalderon 	DP_VERBOSE(p_hwfn,
52602d22bc83SMichal Kalderon 		   QED_MSG_DEBUG,
52613b86bd07SSudarsana Reddy Kalluru 		   "dbg_grc_config: paramId = %d, val = %d\n", grc_param, val);
52623b86bd07SSudarsana Reddy Kalluru 
52632d22bc83SMichal Kalderon 	status = qed_dbg_dev_init(p_hwfn);
52643b86bd07SSudarsana Reddy Kalluru 	if (status != DBG_STATUS_OK)
52653b86bd07SSudarsana Reddy Kalluru 		return status;
52663b86bd07SSudarsana Reddy Kalluru 
52673b86bd07SSudarsana Reddy Kalluru 	/* Initializes the GRC parameters (if not initialized). Needed in order
52683b86bd07SSudarsana Reddy Kalluru 	 * to set the default parameter values for the first time.
52693b86bd07SSudarsana Reddy Kalluru 	 */
52703b86bd07SSudarsana Reddy Kalluru 	qed_dbg_grc_init_params(p_hwfn);
52713b86bd07SSudarsana Reddy Kalluru 
527250515cacSJean Sacren 	if (grc_param >= MAX_DBG_GRC_PARAMS)
52733b86bd07SSudarsana Reddy Kalluru 		return DBG_STATUS_INVALID_ARGS;
52743b86bd07SSudarsana Reddy Kalluru 	if (val < s_grc_param_defs[grc_param].min ||
52753b86bd07SSudarsana Reddy Kalluru 	    val > s_grc_param_defs[grc_param].max)
52763b86bd07SSudarsana Reddy Kalluru 		return DBG_STATUS_INVALID_ARGS;
52773b86bd07SSudarsana Reddy Kalluru 
52783b86bd07SSudarsana Reddy Kalluru 	if (s_grc_param_defs[grc_param].is_preset) {
52793b86bd07SSudarsana Reddy Kalluru 		/* Preset param */
52803b86bd07SSudarsana Reddy Kalluru 
52813b86bd07SSudarsana Reddy Kalluru 		/* Disabling a preset is not allowed. Call
52823b86bd07SSudarsana Reddy Kalluru 		 * dbg_grc_set_params_default instead.
52833b86bd07SSudarsana Reddy Kalluru 		 */
52843b86bd07SSudarsana Reddy Kalluru 		if (!val)
52853b86bd07SSudarsana Reddy Kalluru 			return DBG_STATUS_INVALID_ARGS;
52863b86bd07SSudarsana Reddy Kalluru 
52873b86bd07SSudarsana Reddy Kalluru 		/* Update all params with the preset values */
52883b86bd07SSudarsana Reddy Kalluru 		for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) {
52892d22bc83SMichal Kalderon 			struct grc_param_defs *defs = &s_grc_param_defs[i];
52903b86bd07SSudarsana Reddy Kalluru 			u32 preset_val;
52913b86bd07SSudarsana Reddy Kalluru 			/* Skip persistent params */
52922d22bc83SMichal Kalderon 			if (defs->is_persistent)
52933b86bd07SSudarsana Reddy Kalluru 				continue;
52943b86bd07SSudarsana Reddy Kalluru 
52953b86bd07SSudarsana Reddy Kalluru 			/* Find preset value */
52963b86bd07SSudarsana Reddy Kalluru 			if (grc_param == DBG_GRC_PARAM_EXCLUDE_ALL)
52973b86bd07SSudarsana Reddy Kalluru 				preset_val =
52982d22bc83SMichal Kalderon 				    defs->exclude_all_preset_val;
52993b86bd07SSudarsana Reddy Kalluru 			else if (grc_param == DBG_GRC_PARAM_CRASH)
53003b86bd07SSudarsana Reddy Kalluru 				preset_val =
53012d22bc83SMichal Kalderon 				    defs->crash_preset_val[dev_data->chip_id];
53023b86bd07SSudarsana Reddy Kalluru 			else
53033b86bd07SSudarsana Reddy Kalluru 				return DBG_STATUS_INVALID_ARGS;
53043b86bd07SSudarsana Reddy Kalluru 
53052d22bc83SMichal Kalderon 			qed_grc_set_param(p_hwfn, i, preset_val);
53063b86bd07SSudarsana Reddy Kalluru 		}
53073b86bd07SSudarsana Reddy Kalluru 	} else {
53083b86bd07SSudarsana Reddy Kalluru 		/* Regular param - set its value */
53093b86bd07SSudarsana Reddy Kalluru 		qed_grc_set_param(p_hwfn, grc_param, val);
53103b86bd07SSudarsana Reddy Kalluru 	}
53113b86bd07SSudarsana Reddy Kalluru 
53123b86bd07SSudarsana Reddy Kalluru 	return DBG_STATUS_OK;
53133b86bd07SSudarsana Reddy Kalluru }
53143b86bd07SSudarsana Reddy Kalluru 
5315be086e7cSMintz, Yuval /* Assign default GRC param values */
qed_dbg_grc_set_params_default(struct qed_hwfn * p_hwfn)5316be086e7cSMintz, Yuval void qed_dbg_grc_set_params_default(struct qed_hwfn *p_hwfn)
5317be086e7cSMintz, Yuval {
5318be086e7cSMintz, Yuval 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
5319be086e7cSMintz, Yuval 	u32 i;
5320be086e7cSMintz, Yuval 
5321be086e7cSMintz, Yuval 	for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
532250bc60cbSMichal Kalderon 		if (!s_grc_param_defs[i].is_persistent)
5323be086e7cSMintz, Yuval 			dev_data->grc.param_val[i] =
5324be086e7cSMintz, Yuval 			    s_grc_param_defs[i].default_val[dev_data->chip_id];
5325be086e7cSMintz, Yuval }
5326be086e7cSMintz, Yuval 
qed_dbg_grc_get_dump_buf_size(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * buf_size)5327c965db44STomer Tayar enum dbg_status qed_dbg_grc_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5328c965db44STomer Tayar 					      struct qed_ptt *p_ptt,
5329c965db44STomer Tayar 					      u32 *buf_size)
5330c965db44STomer Tayar {
53312d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5332c965db44STomer Tayar 
5333c965db44STomer Tayar 	*buf_size = 0;
53347b6859fbSMintz, Yuval 
5335c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5336c965db44STomer Tayar 		return status;
53377b6859fbSMintz, Yuval 
53382d22bc83SMichal Kalderon 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
53392d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr ||
53402d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr ||
53412d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
53422d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
5343c965db44STomer Tayar 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
53447b6859fbSMintz, Yuval 
5345c965db44STomer Tayar 	return qed_grc_dump(p_hwfn, p_ptt, NULL, false, buf_size);
5346c965db44STomer Tayar }
5347c965db44STomer Tayar 
qed_dbg_grc_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)5348c965db44STomer Tayar enum dbg_status qed_dbg_grc_dump(struct qed_hwfn *p_hwfn,
5349c965db44STomer Tayar 				 struct qed_ptt *p_ptt,
5350c965db44STomer Tayar 				 u32 *dump_buf,
5351c965db44STomer Tayar 				 u32 buf_size_in_dwords,
5352c965db44STomer Tayar 				 u32 *num_dumped_dwords)
5353c965db44STomer Tayar {
5354c965db44STomer Tayar 	u32 needed_buf_size_in_dwords;
5355c965db44STomer Tayar 	enum dbg_status status;
5356c965db44STomer Tayar 
5357c965db44STomer Tayar 	*num_dumped_dwords = 0;
53587b6859fbSMintz, Yuval 
53597b6859fbSMintz, Yuval 	status = qed_dbg_grc_get_dump_buf_size(p_hwfn,
53607b6859fbSMintz, Yuval 					       p_ptt,
53617b6859fbSMintz, Yuval 					       &needed_buf_size_in_dwords);
5362c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5363c965db44STomer Tayar 		return status;
53647b6859fbSMintz, Yuval 
5365c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5366c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5367c965db44STomer Tayar 
53686c95dd8fSPrabhakar Kushwaha 	/* Doesn't do anything, needed for compile time asserts */
53696c95dd8fSPrabhakar Kushwaha 	qed_static_asserts();
53706c95dd8fSPrabhakar Kushwaha 
5371c965db44STomer Tayar 	/* GRC Dump */
5372c965db44STomer Tayar 	status = qed_grc_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords);
5373c965db44STomer Tayar 
5374be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5375be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5376be086e7cSMintz, Yuval 
5377c965db44STomer Tayar 	return status;
5378c965db44STomer Tayar }
5379c965db44STomer Tayar 
qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * buf_size)5380c965db44STomer Tayar enum dbg_status qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5381c965db44STomer Tayar 						   struct qed_ptt *p_ptt,
5382c965db44STomer Tayar 						   u32 *buf_size)
5383c965db44STomer Tayar {
5384c965db44STomer Tayar 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
53852d22bc83SMichal Kalderon 	struct idle_chk_data *idle_chk = &dev_data->idle_chk;
53867b6859fbSMintz, Yuval 	enum dbg_status status;
5387c965db44STomer Tayar 
5388c965db44STomer Tayar 	*buf_size = 0;
53897b6859fbSMintz, Yuval 
53902d22bc83SMichal Kalderon 	status = qed_dbg_dev_init(p_hwfn);
5391c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5392c965db44STomer Tayar 		return status;
53937b6859fbSMintz, Yuval 
53942d22bc83SMichal Kalderon 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
53952d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr ||
53962d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr ||
53972d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr)
5398c965db44STomer Tayar 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
53997b6859fbSMintz, Yuval 
54007b6859fbSMintz, Yuval 	if (!idle_chk->buf_size_set) {
54017b6859fbSMintz, Yuval 		idle_chk->buf_size = qed_idle_chk_dump(p_hwfn,
54027b6859fbSMintz, Yuval 						       p_ptt, NULL, false);
54037b6859fbSMintz, Yuval 		idle_chk->buf_size_set = true;
5404c965db44STomer Tayar 	}
5405c965db44STomer Tayar 
54067b6859fbSMintz, Yuval 	*buf_size = idle_chk->buf_size;
54077b6859fbSMintz, Yuval 
5408c965db44STomer Tayar 	return DBG_STATUS_OK;
5409c965db44STomer Tayar }
5410c965db44STomer Tayar 
qed_dbg_idle_chk_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)5411c965db44STomer Tayar enum dbg_status qed_dbg_idle_chk_dump(struct qed_hwfn *p_hwfn,
5412c965db44STomer Tayar 				      struct qed_ptt *p_ptt,
5413c965db44STomer Tayar 				      u32 *dump_buf,
5414c965db44STomer Tayar 				      u32 buf_size_in_dwords,
5415c965db44STomer Tayar 				      u32 *num_dumped_dwords)
5416c965db44STomer Tayar {
5417c965db44STomer Tayar 	u32 needed_buf_size_in_dwords;
5418c965db44STomer Tayar 	enum dbg_status status;
5419c965db44STomer Tayar 
5420c965db44STomer Tayar 	*num_dumped_dwords = 0;
54217b6859fbSMintz, Yuval 
54227b6859fbSMintz, Yuval 	status = qed_dbg_idle_chk_get_dump_buf_size(p_hwfn,
54237b6859fbSMintz, Yuval 						    p_ptt,
54247b6859fbSMintz, Yuval 						    &needed_buf_size_in_dwords);
5425c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5426c965db44STomer Tayar 		return status;
54277b6859fbSMintz, Yuval 
5428c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5429c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5430c965db44STomer Tayar 
5431c965db44STomer Tayar 	/* Update reset state */
54322d22bc83SMichal Kalderon 	qed_grc_unreset_blocks(p_hwfn, p_ptt, true);
5433c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5434c965db44STomer Tayar 
5435c965db44STomer Tayar 	/* Idle Check Dump */
5436c965db44STomer Tayar 	*num_dumped_dwords = qed_idle_chk_dump(p_hwfn, p_ptt, dump_buf, true);
5437be086e7cSMintz, Yuval 
5438be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5439be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5440be086e7cSMintz, Yuval 
5441c965db44STomer Tayar 	return DBG_STATUS_OK;
5442c965db44STomer Tayar }
5443c965db44STomer Tayar 
qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * buf_size)5444c965db44STomer Tayar enum dbg_status qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5445c965db44STomer Tayar 						    struct qed_ptt *p_ptt,
5446c965db44STomer Tayar 						    u32 *buf_size)
5447c965db44STomer Tayar {
54482d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5449c965db44STomer Tayar 
5450c965db44STomer Tayar 	*buf_size = 0;
54517b6859fbSMintz, Yuval 
5452c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5453c965db44STomer Tayar 		return status;
54547b6859fbSMintz, Yuval 
5455c965db44STomer Tayar 	return qed_mcp_trace_dump(p_hwfn, p_ptt, NULL, false, buf_size);
5456c965db44STomer Tayar }
5457c965db44STomer Tayar 
qed_dbg_mcp_trace_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)5458c965db44STomer Tayar enum dbg_status qed_dbg_mcp_trace_dump(struct qed_hwfn *p_hwfn,
5459c965db44STomer Tayar 				       struct qed_ptt *p_ptt,
5460c965db44STomer Tayar 				       u32 *dump_buf,
5461c965db44STomer Tayar 				       u32 buf_size_in_dwords,
5462c965db44STomer Tayar 				       u32 *num_dumped_dwords)
5463c965db44STomer Tayar {
5464c965db44STomer Tayar 	u32 needed_buf_size_in_dwords;
5465c965db44STomer Tayar 	enum dbg_status status;
5466c965db44STomer Tayar 
5467be086e7cSMintz, Yuval 	status =
54687b6859fbSMintz, Yuval 		qed_dbg_mcp_trace_get_dump_buf_size(p_hwfn,
54697b6859fbSMintz, Yuval 						    p_ptt,
5470c965db44STomer Tayar 						    &needed_buf_size_in_dwords);
54717b6859fbSMintz, Yuval 	if (status != DBG_STATUS_OK && status !=
54727b6859fbSMintz, Yuval 	    DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
5473c965db44STomer Tayar 		return status;
5474be086e7cSMintz, Yuval 
5475c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5476c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5477c965db44STomer Tayar 
5478c965db44STomer Tayar 	/* Update reset state */
5479c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5480c965db44STomer Tayar 
5481c965db44STomer Tayar 	/* Perform dump */
5482be086e7cSMintz, Yuval 	status = qed_mcp_trace_dump(p_hwfn,
5483c965db44STomer Tayar 				    p_ptt, dump_buf, true, num_dumped_dwords);
5484be086e7cSMintz, Yuval 
5485be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5486be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5487be086e7cSMintz, Yuval 
5488be086e7cSMintz, Yuval 	return status;
5489c965db44STomer Tayar }
5490c965db44STomer Tayar 
qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * buf_size)5491c965db44STomer Tayar enum dbg_status qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5492c965db44STomer Tayar 						   struct qed_ptt *p_ptt,
5493c965db44STomer Tayar 						   u32 *buf_size)
5494c965db44STomer Tayar {
54952d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5496c965db44STomer Tayar 
5497c965db44STomer Tayar 	*buf_size = 0;
54987b6859fbSMintz, Yuval 
5499c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5500c965db44STomer Tayar 		return status;
55017b6859fbSMintz, Yuval 
5502c965db44STomer Tayar 	return qed_reg_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size);
5503c965db44STomer Tayar }
5504c965db44STomer Tayar 
qed_dbg_reg_fifo_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)5505c965db44STomer Tayar enum dbg_status qed_dbg_reg_fifo_dump(struct qed_hwfn *p_hwfn,
5506c965db44STomer Tayar 				      struct qed_ptt *p_ptt,
5507c965db44STomer Tayar 				      u32 *dump_buf,
5508c965db44STomer Tayar 				      u32 buf_size_in_dwords,
5509c965db44STomer Tayar 				      u32 *num_dumped_dwords)
5510c965db44STomer Tayar {
5511c965db44STomer Tayar 	u32 needed_buf_size_in_dwords;
5512c965db44STomer Tayar 	enum dbg_status status;
5513c965db44STomer Tayar 
5514c965db44STomer Tayar 	*num_dumped_dwords = 0;
55157b6859fbSMintz, Yuval 
55167b6859fbSMintz, Yuval 	status = qed_dbg_reg_fifo_get_dump_buf_size(p_hwfn,
55177b6859fbSMintz, Yuval 						    p_ptt,
55187b6859fbSMintz, Yuval 						    &needed_buf_size_in_dwords);
5519c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5520c965db44STomer Tayar 		return status;
55217b6859fbSMintz, Yuval 
5522c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5523c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5524c965db44STomer Tayar 
5525c965db44STomer Tayar 	/* Update reset state */
5526c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5527be086e7cSMintz, Yuval 
5528be086e7cSMintz, Yuval 	status = qed_reg_fifo_dump(p_hwfn,
5529c965db44STomer Tayar 				   p_ptt, dump_buf, true, num_dumped_dwords);
5530be086e7cSMintz, Yuval 
5531be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5532be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5533be086e7cSMintz, Yuval 
5534be086e7cSMintz, Yuval 	return status;
5535c965db44STomer Tayar }
5536c965db44STomer Tayar 
qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * buf_size)5537c965db44STomer Tayar enum dbg_status qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5538c965db44STomer Tayar 						   struct qed_ptt *p_ptt,
5539c965db44STomer Tayar 						   u32 *buf_size)
5540c965db44STomer Tayar {
55412d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5542c965db44STomer Tayar 
5543c965db44STomer Tayar 	*buf_size = 0;
55447b6859fbSMintz, Yuval 
5545c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5546c965db44STomer Tayar 		return status;
55477b6859fbSMintz, Yuval 
5548c965db44STomer Tayar 	return qed_igu_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size);
5549c965db44STomer Tayar }
5550c965db44STomer Tayar 
qed_dbg_igu_fifo_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)5551c965db44STomer Tayar enum dbg_status qed_dbg_igu_fifo_dump(struct qed_hwfn *p_hwfn,
5552c965db44STomer Tayar 				      struct qed_ptt *p_ptt,
5553c965db44STomer Tayar 				      u32 *dump_buf,
5554c965db44STomer Tayar 				      u32 buf_size_in_dwords,
5555c965db44STomer Tayar 				      u32 *num_dumped_dwords)
5556c965db44STomer Tayar {
5557c965db44STomer Tayar 	u32 needed_buf_size_in_dwords;
5558c965db44STomer Tayar 	enum dbg_status status;
5559c965db44STomer Tayar 
5560c965db44STomer Tayar 	*num_dumped_dwords = 0;
55617b6859fbSMintz, Yuval 
55627b6859fbSMintz, Yuval 	status = qed_dbg_igu_fifo_get_dump_buf_size(p_hwfn,
55637b6859fbSMintz, Yuval 						    p_ptt,
55647b6859fbSMintz, Yuval 						    &needed_buf_size_in_dwords);
5565c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5566c965db44STomer Tayar 		return status;
55677b6859fbSMintz, Yuval 
5568c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5569c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5570c965db44STomer Tayar 
5571c965db44STomer Tayar 	/* Update reset state */
5572c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5573be086e7cSMintz, Yuval 
5574be086e7cSMintz, Yuval 	status = qed_igu_fifo_dump(p_hwfn,
5575c965db44STomer Tayar 				   p_ptt, dump_buf, true, num_dumped_dwords);
5576be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5577be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5578be086e7cSMintz, Yuval 
5579be086e7cSMintz, Yuval 	return status;
5580c965db44STomer Tayar }
5581c965db44STomer Tayar 
5582c965db44STomer Tayar enum dbg_status
qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * buf_size)5583c965db44STomer Tayar qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5584c965db44STomer Tayar 					      struct qed_ptt *p_ptt,
5585c965db44STomer Tayar 					      u32 *buf_size)
5586c965db44STomer Tayar {
55872d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5588c965db44STomer Tayar 
5589c965db44STomer Tayar 	*buf_size = 0;
55907b6859fbSMintz, Yuval 
5591c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5592c965db44STomer Tayar 		return status;
55937b6859fbSMintz, Yuval 
5594c965db44STomer Tayar 	return qed_protection_override_dump(p_hwfn,
5595c965db44STomer Tayar 					    p_ptt, NULL, false, buf_size);
5596c965db44STomer Tayar }
5597c965db44STomer Tayar 
qed_dbg_protection_override_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)5598c965db44STomer Tayar enum dbg_status qed_dbg_protection_override_dump(struct qed_hwfn *p_hwfn,
5599c965db44STomer Tayar 						 struct qed_ptt *p_ptt,
5600c965db44STomer Tayar 						 u32 *dump_buf,
5601c965db44STomer Tayar 						 u32 buf_size_in_dwords,
5602c965db44STomer Tayar 						 u32 *num_dumped_dwords)
5603c965db44STomer Tayar {
56047b6859fbSMintz, Yuval 	u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords;
5605c965db44STomer Tayar 	enum dbg_status status;
5606c965db44STomer Tayar 
5607c965db44STomer Tayar 	*num_dumped_dwords = 0;
56087b6859fbSMintz, Yuval 
56097b6859fbSMintz, Yuval 	status =
56107b6859fbSMintz, Yuval 		qed_dbg_protection_override_get_dump_buf_size(p_hwfn,
56117b6859fbSMintz, Yuval 							      p_ptt,
56127b6859fbSMintz, Yuval 							      p_size);
5613c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5614c965db44STomer Tayar 		return status;
56157b6859fbSMintz, Yuval 
5616c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5617c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5618c965db44STomer Tayar 
5619c965db44STomer Tayar 	/* Update reset state */
5620c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
5621be086e7cSMintz, Yuval 
5622be086e7cSMintz, Yuval 	status = qed_protection_override_dump(p_hwfn,
5623c965db44STomer Tayar 					      p_ptt,
5624be086e7cSMintz, Yuval 					      dump_buf,
5625be086e7cSMintz, Yuval 					      true, num_dumped_dwords);
5626be086e7cSMintz, Yuval 
5627be086e7cSMintz, Yuval 	/* Revert GRC params to their default */
5628be086e7cSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
5629be086e7cSMintz, Yuval 
5630be086e7cSMintz, Yuval 	return status;
5631c965db44STomer Tayar }
5632c965db44STomer Tayar 
qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * buf_size)5633c965db44STomer Tayar enum dbg_status qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn *p_hwfn,
5634c965db44STomer Tayar 						     struct qed_ptt *p_ptt,
5635c965db44STomer Tayar 						     u32 *buf_size)
5636c965db44STomer Tayar {
56372d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
5638c965db44STomer Tayar 
5639c965db44STomer Tayar 	*buf_size = 0;
56407b6859fbSMintz, Yuval 
5641c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5642c965db44STomer Tayar 		return status;
5643c965db44STomer Tayar 
5644c965db44STomer Tayar 	/* Update reset state */
5645c965db44STomer Tayar 	qed_update_blocks_reset_state(p_hwfn, p_ptt);
56467b6859fbSMintz, Yuval 
5647c965db44STomer Tayar 	*buf_size = qed_fw_asserts_dump(p_hwfn, p_ptt, NULL, false);
56487b6859fbSMintz, Yuval 
5649c965db44STomer Tayar 	return DBG_STATUS_OK;
5650c965db44STomer Tayar }
5651c965db44STomer Tayar 
qed_dbg_fw_asserts_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)5652c965db44STomer Tayar enum dbg_status qed_dbg_fw_asserts_dump(struct qed_hwfn *p_hwfn,
5653c965db44STomer Tayar 					struct qed_ptt *p_ptt,
5654c965db44STomer Tayar 					u32 *dump_buf,
5655c965db44STomer Tayar 					u32 buf_size_in_dwords,
5656c965db44STomer Tayar 					u32 *num_dumped_dwords)
5657c965db44STomer Tayar {
56587b6859fbSMintz, Yuval 	u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords;
5659c965db44STomer Tayar 	enum dbg_status status;
5660c965db44STomer Tayar 
5661c965db44STomer Tayar 	*num_dumped_dwords = 0;
56627b6859fbSMintz, Yuval 
56637b6859fbSMintz, Yuval 	status =
56647b6859fbSMintz, Yuval 		qed_dbg_fw_asserts_get_dump_buf_size(p_hwfn,
56657b6859fbSMintz, Yuval 						     p_ptt,
56667b6859fbSMintz, Yuval 						     p_size);
5667c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
5668c965db44STomer Tayar 		return status;
56697b6859fbSMintz, Yuval 
5670c965db44STomer Tayar 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
5671c965db44STomer Tayar 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
5672c965db44STomer Tayar 
5673c965db44STomer Tayar 	*num_dumped_dwords = qed_fw_asserts_dump(p_hwfn, p_ptt, dump_buf, true);
56747b6859fbSMintz, Yuval 
56757b6859fbSMintz, Yuval 	/* Revert GRC params to their default */
56767b6859fbSMintz, Yuval 	qed_dbg_grc_set_params_default(p_hwfn);
56777b6859fbSMintz, Yuval 
5678c965db44STomer Tayar 	return DBG_STATUS_OK;
5679c965db44STomer Tayar }
5680c965db44STomer Tayar 
qed_dbg_ilt_get_dump_buf_size(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * buf_size)56818a52bbabSMichal Kalderon static enum dbg_status qed_dbg_ilt_get_dump_buf_size(struct qed_hwfn *p_hwfn,
56828a52bbabSMichal Kalderon 						     struct qed_ptt *p_ptt,
56838a52bbabSMichal Kalderon 						     u32 *buf_size)
56848a52bbabSMichal Kalderon {
56852d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
56868a52bbabSMichal Kalderon 
56878a52bbabSMichal Kalderon 	*buf_size = 0;
56888a52bbabSMichal Kalderon 
56898a52bbabSMichal Kalderon 	if (status != DBG_STATUS_OK)
56908a52bbabSMichal Kalderon 		return status;
56918a52bbabSMichal Kalderon 
56926c95dd8fSPrabhakar Kushwaha 	*buf_size = qed_ilt_dump(p_hwfn, p_ptt, NULL, 0, false);
56938a52bbabSMichal Kalderon 
56948a52bbabSMichal Kalderon 	return DBG_STATUS_OK;
56958a52bbabSMichal Kalderon }
56968a52bbabSMichal Kalderon 
qed_dbg_ilt_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)56978a52bbabSMichal Kalderon static enum dbg_status qed_dbg_ilt_dump(struct qed_hwfn *p_hwfn,
56988a52bbabSMichal Kalderon 					struct qed_ptt *p_ptt,
56998a52bbabSMichal Kalderon 					u32 *dump_buf,
57008a52bbabSMichal Kalderon 					u32 buf_size_in_dwords,
57018a52bbabSMichal Kalderon 					u32 *num_dumped_dwords)
57028a52bbabSMichal Kalderon {
57036c95dd8fSPrabhakar Kushwaha 	*num_dumped_dwords = qed_ilt_dump(p_hwfn,
57048a52bbabSMichal Kalderon 					  p_ptt,
57056c95dd8fSPrabhakar Kushwaha 					  dump_buf, buf_size_in_dwords, true);
57068a52bbabSMichal Kalderon 
57078a52bbabSMichal Kalderon 	/* Reveret GRC params to their default */
57088a52bbabSMichal Kalderon 	qed_dbg_grc_set_params_default(p_hwfn);
57098a52bbabSMichal Kalderon 
57108a52bbabSMichal Kalderon 	return DBG_STATUS_OK;
57118a52bbabSMichal Kalderon }
57128a52bbabSMichal Kalderon 
qed_dbg_read_attn(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,enum block_id block_id,enum dbg_attn_type attn_type,bool clear_status,struct dbg_attn_block_result * results)57130ebbd1c8SMintz, Yuval enum dbg_status qed_dbg_read_attn(struct qed_hwfn *p_hwfn,
57140ebbd1c8SMintz, Yuval 				  struct qed_ptt *p_ptt,
57150ebbd1c8SMintz, Yuval 				  enum block_id block_id,
57160ebbd1c8SMintz, Yuval 				  enum dbg_attn_type attn_type,
57170ebbd1c8SMintz, Yuval 				  bool clear_status,
57180ebbd1c8SMintz, Yuval 				  struct dbg_attn_block_result *results)
57190ebbd1c8SMintz, Yuval {
57202d22bc83SMichal Kalderon 	enum dbg_status status = qed_dbg_dev_init(p_hwfn);
57210ebbd1c8SMintz, Yuval 	u8 reg_idx, num_attn_regs, num_result_regs = 0;
57220ebbd1c8SMintz, Yuval 	const struct dbg_attn_reg *attn_reg_arr;
57230ebbd1c8SMintz, Yuval 
57240ebbd1c8SMintz, Yuval 	if (status != DBG_STATUS_OK)
57250ebbd1c8SMintz, Yuval 		return status;
57260ebbd1c8SMintz, Yuval 
57272d22bc83SMichal Kalderon 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
57282d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
57292d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
57300ebbd1c8SMintz, Yuval 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
57310ebbd1c8SMintz, Yuval 
57322d22bc83SMichal Kalderon 	attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
57332d22bc83SMichal Kalderon 					       block_id,
57340ebbd1c8SMintz, Yuval 					       attn_type, &num_attn_regs);
57350ebbd1c8SMintz, Yuval 
57360ebbd1c8SMintz, Yuval 	for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
57370ebbd1c8SMintz, Yuval 		const struct dbg_attn_reg *reg_data = &attn_reg_arr[reg_idx];
57380ebbd1c8SMintz, Yuval 		struct dbg_attn_reg_result *reg_result;
57390ebbd1c8SMintz, Yuval 		u32 sts_addr, sts_val;
57400ebbd1c8SMintz, Yuval 		u16 modes_buf_offset;
57410ebbd1c8SMintz, Yuval 		bool eval_mode;
57420ebbd1c8SMintz, Yuval 
57430ebbd1c8SMintz, Yuval 		/* Check mode */
57440ebbd1c8SMintz, Yuval 		eval_mode = GET_FIELD(reg_data->mode.data,
57450ebbd1c8SMintz, Yuval 				      DBG_MODE_HDR_EVAL_MODE) > 0;
57460ebbd1c8SMintz, Yuval 		modes_buf_offset = GET_FIELD(reg_data->mode.data,
57470ebbd1c8SMintz, Yuval 					     DBG_MODE_HDR_MODES_BUF_OFFSET);
57480ebbd1c8SMintz, Yuval 		if (eval_mode && !qed_is_mode_match(p_hwfn, &modes_buf_offset))
57490ebbd1c8SMintz, Yuval 			continue;
57500ebbd1c8SMintz, Yuval 
57510ebbd1c8SMintz, Yuval 		/* Mode match - read attention status register */
57520ebbd1c8SMintz, Yuval 		sts_addr = DWORDS_TO_BYTES(clear_status ?
57530ebbd1c8SMintz, Yuval 					   reg_data->sts_clr_address :
57540ebbd1c8SMintz, Yuval 					   GET_FIELD(reg_data->data,
57550ebbd1c8SMintz, Yuval 						     DBG_ATTN_REG_STS_ADDRESS));
57560ebbd1c8SMintz, Yuval 		sts_val = qed_rd(p_hwfn, p_ptt, sts_addr);
57570ebbd1c8SMintz, Yuval 		if (!sts_val)
57580ebbd1c8SMintz, Yuval 			continue;
57590ebbd1c8SMintz, Yuval 
57600ebbd1c8SMintz, Yuval 		/* Non-zero attention status - add to results */
57610ebbd1c8SMintz, Yuval 		reg_result = &results->reg_results[num_result_regs];
57620ebbd1c8SMintz, Yuval 		SET_FIELD(reg_result->data,
57630ebbd1c8SMintz, Yuval 			  DBG_ATTN_REG_RESULT_STS_ADDRESS, sts_addr);
57640ebbd1c8SMintz, Yuval 		SET_FIELD(reg_result->data,
57650ebbd1c8SMintz, Yuval 			  DBG_ATTN_REG_RESULT_NUM_REG_ATTN,
57660ebbd1c8SMintz, Yuval 			  GET_FIELD(reg_data->data, DBG_ATTN_REG_NUM_REG_ATTN));
57670ebbd1c8SMintz, Yuval 		reg_result->block_attn_offset = reg_data->block_attn_offset;
57680ebbd1c8SMintz, Yuval 		reg_result->sts_val = sts_val;
57690ebbd1c8SMintz, Yuval 		reg_result->mask_val = qed_rd(p_hwfn,
57700ebbd1c8SMintz, Yuval 					      p_ptt,
57710ebbd1c8SMintz, Yuval 					      DWORDS_TO_BYTES
57720ebbd1c8SMintz, Yuval 					      (reg_data->mask_address));
57730ebbd1c8SMintz, Yuval 		num_result_regs++;
57740ebbd1c8SMintz, Yuval 	}
57750ebbd1c8SMintz, Yuval 
57760ebbd1c8SMintz, Yuval 	results->block_id = (u8)block_id;
57770ebbd1c8SMintz, Yuval 	results->names_offset =
57782d22bc83SMichal Kalderon 	    qed_get_block_attn_data(p_hwfn, block_id, attn_type)->names_offset;
57790ebbd1c8SMintz, Yuval 	SET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE, attn_type);
57800ebbd1c8SMintz, Yuval 	SET_FIELD(results->data,
57810ebbd1c8SMintz, Yuval 		  DBG_ATTN_BLOCK_RESULT_NUM_REGS, num_result_regs);
57820ebbd1c8SMintz, Yuval 
57830ebbd1c8SMintz, Yuval 	return DBG_STATUS_OK;
57840ebbd1c8SMintz, Yuval }
57850ebbd1c8SMintz, Yuval 
5786c965db44STomer Tayar /******************************* Data Types **********************************/
5787c965db44STomer Tayar 
57887b6859fbSMintz, Yuval /* REG fifo element */
5789c965db44STomer Tayar struct reg_fifo_element {
5790c965db44STomer Tayar 	u64 data;
5791c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDRESS_SHIFT		0
5792c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDRESS_MASK		0x7fffff
5793c965db44STomer Tayar #define REG_FIFO_ELEMENT_ACCESS_SHIFT		23
5794c965db44STomer Tayar #define REG_FIFO_ELEMENT_ACCESS_MASK		0x1
5795c965db44STomer Tayar #define REG_FIFO_ELEMENT_PF_SHIFT		24
5796c965db44STomer Tayar #define REG_FIFO_ELEMENT_PF_MASK		0xf
5797c965db44STomer Tayar #define REG_FIFO_ELEMENT_VF_SHIFT		28
5798c965db44STomer Tayar #define REG_FIFO_ELEMENT_VF_MASK		0xff
5799c965db44STomer Tayar #define REG_FIFO_ELEMENT_PORT_SHIFT		36
5800c965db44STomer Tayar #define REG_FIFO_ELEMENT_PORT_MASK		0x3
5801c965db44STomer Tayar #define REG_FIFO_ELEMENT_PRIVILEGE_SHIFT	38
5802c965db44STomer Tayar #define REG_FIFO_ELEMENT_PRIVILEGE_MASK		0x3
5803c965db44STomer Tayar #define REG_FIFO_ELEMENT_PROTECTION_SHIFT	40
5804c965db44STomer Tayar #define REG_FIFO_ELEMENT_PROTECTION_MASK	0x7
5805c965db44STomer Tayar #define REG_FIFO_ELEMENT_MASTER_SHIFT		43
5806c965db44STomer Tayar #define REG_FIFO_ELEMENT_MASTER_MASK		0xf
5807c965db44STomer Tayar #define REG_FIFO_ELEMENT_ERROR_SHIFT		47
5808c965db44STomer Tayar #define REG_FIFO_ELEMENT_ERROR_MASK		0x1f
5809c965db44STomer Tayar };
5810c965db44STomer Tayar 
58112d22bc83SMichal Kalderon /* REG fifo error element */
58122d22bc83SMichal Kalderon struct reg_fifo_err {
58132d22bc83SMichal Kalderon 	u32 err_code;
58142d22bc83SMichal Kalderon 	const char *err_msg;
58152d22bc83SMichal Kalderon };
58162d22bc83SMichal Kalderon 
5817c965db44STomer Tayar /* IGU fifo element */
5818c965db44STomer Tayar struct igu_fifo_element {
5819c965db44STomer Tayar 	u32 dword0;
5820c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_FID_SHIFT		0
5821c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_FID_MASK		0xff
5822c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_SHIFT		8
5823c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_IS_PF_MASK		0x1
5824c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_SHIFT		9
5825c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_SOURCE_MASK		0xf
5826c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_SHIFT		13
5827c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE_MASK		0xf
5828c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_SHIFT		17
5829c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR_MASK		0x7fff
5830c965db44STomer Tayar 	u32 dword1;
5831c965db44STomer Tayar 	u32 dword2;
5832c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_SHIFT	0
5833c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD_MASK		0x1
5834c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_SHIFT		1
5835c965db44STomer Tayar #define IGU_FIFO_ELEMENT_DWORD12_WR_DATA_MASK		0xffffffff
5836c965db44STomer Tayar 	u32 reserved;
5837c965db44STomer Tayar };
5838c965db44STomer Tayar 
5839c965db44STomer Tayar struct igu_fifo_wr_data {
5840c965db44STomer Tayar 	u32 data;
5841c965db44STomer Tayar #define IGU_FIFO_WR_DATA_PROD_CONS_SHIFT		0
5842c965db44STomer Tayar #define IGU_FIFO_WR_DATA_PROD_CONS_MASK			0xffffff
5843c965db44STomer Tayar #define IGU_FIFO_WR_DATA_UPDATE_FLAG_SHIFT		24
5844c965db44STomer Tayar #define IGU_FIFO_WR_DATA_UPDATE_FLAG_MASK		0x1
5845c965db44STomer Tayar #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_SHIFT	25
5846c965db44STomer Tayar #define IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB_MASK		0x3
5847c965db44STomer Tayar #define IGU_FIFO_WR_DATA_SEGMENT_SHIFT			27
5848c965db44STomer Tayar #define IGU_FIFO_WR_DATA_SEGMENT_MASK			0x1
5849c965db44STomer Tayar #define IGU_FIFO_WR_DATA_TIMER_MASK_SHIFT		28
5850c965db44STomer Tayar #define IGU_FIFO_WR_DATA_TIMER_MASK_MASK		0x1
5851c965db44STomer Tayar #define IGU_FIFO_WR_DATA_CMD_TYPE_SHIFT			31
5852c965db44STomer Tayar #define IGU_FIFO_WR_DATA_CMD_TYPE_MASK			0x1
5853c965db44STomer Tayar };
5854c965db44STomer Tayar 
5855c965db44STomer Tayar struct igu_fifo_cleanup_wr_data {
5856c965db44STomer Tayar 	u32 data;
5857c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_SHIFT		0
5858c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_RESERVED_MASK		0x7ffffff
5859c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_SHIFT	27
5860c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL_MASK	0x1
5861c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_SHIFT	28
5862c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE_MASK	0x7
5863c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_SHIFT		31
5864c965db44STomer Tayar #define IGU_FIFO_CLEANUP_WR_DATA_CMD_TYPE_MASK		0x1
5865c965db44STomer Tayar };
5866c965db44STomer Tayar 
5867c965db44STomer Tayar /* Protection override element */
5868c965db44STomer Tayar struct protection_override_element {
5869c965db44STomer Tayar 	u64 data;
5870c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_SHIFT		0
5871c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDRESS_MASK		0x7fffff
5872c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_SHIFT		23
5873c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE_MASK		0xffffff
5874c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_SHIFT			47
5875c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_MASK			0x1
5876c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_SHIFT			48
5877c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_MASK			0x1
5878c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_SHIFT	49
5879c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION_MASK	0x7
5880c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_SHIFT	52
5881c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION_MASK	0x7
5882c965db44STomer Tayar };
5883c965db44STomer Tayar 
5884c965db44STomer Tayar enum igu_fifo_sources {
5885c965db44STomer Tayar 	IGU_SRC_PXP0,
5886c965db44STomer Tayar 	IGU_SRC_PXP1,
5887c965db44STomer Tayar 	IGU_SRC_PXP2,
5888c965db44STomer Tayar 	IGU_SRC_PXP3,
5889c965db44STomer Tayar 	IGU_SRC_PXP4,
5890c965db44STomer Tayar 	IGU_SRC_PXP5,
5891c965db44STomer Tayar 	IGU_SRC_PXP6,
5892c965db44STomer Tayar 	IGU_SRC_PXP7,
5893c965db44STomer Tayar 	IGU_SRC_CAU,
5894c965db44STomer Tayar 	IGU_SRC_ATTN,
5895c965db44STomer Tayar 	IGU_SRC_GRC
5896c965db44STomer Tayar };
5897c965db44STomer Tayar 
5898c965db44STomer Tayar enum igu_fifo_addr_types {
5899c965db44STomer Tayar 	IGU_ADDR_TYPE_MSIX_MEM,
5900c965db44STomer Tayar 	IGU_ADDR_TYPE_WRITE_PBA,
5901c965db44STomer Tayar 	IGU_ADDR_TYPE_WRITE_INT_ACK,
5902c965db44STomer Tayar 	IGU_ADDR_TYPE_WRITE_ATTN_BITS,
5903c965db44STomer Tayar 	IGU_ADDR_TYPE_READ_INT,
5904c965db44STomer Tayar 	IGU_ADDR_TYPE_WRITE_PROD_UPDATE,
5905c965db44STomer Tayar 	IGU_ADDR_TYPE_RESERVED
5906c965db44STomer Tayar };
5907c965db44STomer Tayar 
5908c965db44STomer Tayar struct igu_fifo_addr_data {
5909c965db44STomer Tayar 	u16 start_addr;
5910c965db44STomer Tayar 	u16 end_addr;
5911c965db44STomer Tayar 	char *desc;
5912c965db44STomer Tayar 	char *vf_desc;
5913c965db44STomer Tayar 	enum igu_fifo_addr_types type;
5914c965db44STomer Tayar };
5915c965db44STomer Tayar 
5916c965db44STomer Tayar /******************************** Constants **********************************/
5917c965db44STomer Tayar 
5918c965db44STomer Tayar #define MAX_MSG_LEN				1024
59197b6859fbSMintz, Yuval 
5920c965db44STomer Tayar #define MCP_TRACE_MAX_MODULE_LEN		8
5921c965db44STomer Tayar #define MCP_TRACE_FORMAT_MAX_PARAMS		3
5922c965db44STomer Tayar #define MCP_TRACE_FORMAT_PARAM_WIDTH \
59232d22bc83SMichal Kalderon 	(MCP_TRACE_FORMAT_P2_SIZE_OFFSET - MCP_TRACE_FORMAT_P1_SIZE_OFFSET)
59247b6859fbSMintz, Yuval 
5925c965db44STomer Tayar #define REG_FIFO_ELEMENT_ADDR_FACTOR		4
5926c965db44STomer Tayar #define REG_FIFO_ELEMENT_IS_PF_VF_VAL		127
59277b6859fbSMintz, Yuval 
5928c965db44STomer Tayar #define PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR	4
5929c965db44STomer Tayar 
5930c965db44STomer Tayar /***************************** Constant Arrays *******************************/
5931c965db44STomer Tayar 
5932c965db44STomer Tayar /* Status string array */
5933c965db44STomer Tayar static const char * const s_status_str[] = {
59347b6859fbSMintz, Yuval 	/* DBG_STATUS_OK */
5935c965db44STomer Tayar 	"Operation completed successfully",
59367b6859fbSMintz, Yuval 
59377b6859fbSMintz, Yuval 	/* DBG_STATUS_APP_VERSION_NOT_SET */
5938c965db44STomer Tayar 	"Debug application version wasn't set",
59397b6859fbSMintz, Yuval 
59407b6859fbSMintz, Yuval 	/* DBG_STATUS_UNSUPPORTED_APP_VERSION */
5941c965db44STomer Tayar 	"Unsupported debug application version",
59427b6859fbSMintz, Yuval 
59437b6859fbSMintz, Yuval 	/* DBG_STATUS_DBG_BLOCK_NOT_RESET */
5944c965db44STomer Tayar 	"The debug block wasn't reset since the last recording",
59457b6859fbSMintz, Yuval 
59467b6859fbSMintz, Yuval 	/* DBG_STATUS_INVALID_ARGS */
5947c965db44STomer Tayar 	"Invalid arguments",
59487b6859fbSMintz, Yuval 
59497b6859fbSMintz, Yuval 	/* DBG_STATUS_OUTPUT_ALREADY_SET */
5950c965db44STomer Tayar 	"The debug output was already set",
59517b6859fbSMintz, Yuval 
59527b6859fbSMintz, Yuval 	/* DBG_STATUS_INVALID_PCI_BUF_SIZE */
5953c965db44STomer Tayar 	"Invalid PCI buffer size",
59547b6859fbSMintz, Yuval 
59557b6859fbSMintz, Yuval 	/* DBG_STATUS_PCI_BUF_ALLOC_FAILED */
5956c965db44STomer Tayar 	"PCI buffer allocation failed",
59577b6859fbSMintz, Yuval 
59587b6859fbSMintz, Yuval 	/* DBG_STATUS_PCI_BUF_NOT_ALLOCATED */
5959c965db44STomer Tayar 	"A PCI buffer wasn't allocated",
59607b6859fbSMintz, Yuval 
59612d22bc83SMichal Kalderon 	/* DBG_STATUS_INVALID_FILTER_TRIGGER_DWORDS */
59622d22bc83SMichal Kalderon 	"The filter/trigger constraint dword offsets are not enabled for recording",
5963a5124386SColin Ian King 	/* DBG_STATUS_NO_MATCHING_FRAMING_MODE */
5964a5124386SColin Ian King 	"No matching framing mode",
59657b6859fbSMintz, Yuval 
59662d22bc83SMichal Kalderon 	/* DBG_STATUS_VFC_READ_ERROR */
59672d22bc83SMichal Kalderon 	"Error reading from VFC",
59687b6859fbSMintz, Yuval 
59697b6859fbSMintz, Yuval 	/* DBG_STATUS_STORM_ALREADY_ENABLED */
5970c965db44STomer Tayar 	"The Storm was already enabled",
59717b6859fbSMintz, Yuval 
59727b6859fbSMintz, Yuval 	/* DBG_STATUS_STORM_NOT_ENABLED */
5973c965db44STomer Tayar 	"The specified Storm wasn't enabled",
59747b6859fbSMintz, Yuval 
59757b6859fbSMintz, Yuval 	/* DBG_STATUS_BLOCK_ALREADY_ENABLED */
5976c965db44STomer Tayar 	"The block was already enabled",
59777b6859fbSMintz, Yuval 
59787b6859fbSMintz, Yuval 	/* DBG_STATUS_BLOCK_NOT_ENABLED */
5979c965db44STomer Tayar 	"The specified block wasn't enabled",
59807b6859fbSMintz, Yuval 
59817b6859fbSMintz, Yuval 	/* DBG_STATUS_NO_INPUT_ENABLED */
5982c965db44STomer Tayar 	"No input was enabled for recording",
59837b6859fbSMintz, Yuval 
59842d22bc83SMichal Kalderon 	/* DBG_STATUS_NO_FILTER_TRIGGER_256B */
59852d22bc83SMichal Kalderon 	"Filters and triggers are not allowed in E4 256-bit mode",
59867b6859fbSMintz, Yuval 
59877b6859fbSMintz, Yuval 	/* DBG_STATUS_FILTER_ALREADY_ENABLED */
5988c965db44STomer Tayar 	"The filter was already enabled",
59897b6859fbSMintz, Yuval 
59907b6859fbSMintz, Yuval 	/* DBG_STATUS_TRIGGER_ALREADY_ENABLED */
5991c965db44STomer Tayar 	"The trigger was already enabled",
59927b6859fbSMintz, Yuval 
59937b6859fbSMintz, Yuval 	/* DBG_STATUS_TRIGGER_NOT_ENABLED */
5994c965db44STomer Tayar 	"The trigger wasn't enabled",
59957b6859fbSMintz, Yuval 
59967b6859fbSMintz, Yuval 	/* DBG_STATUS_CANT_ADD_CONSTRAINT */
5997c965db44STomer Tayar 	"A constraint can be added only after a filter was enabled or a trigger state was added",
59987b6859fbSMintz, Yuval 
59997b6859fbSMintz, Yuval 	/* DBG_STATUS_TOO_MANY_TRIGGER_STATES */
6000c965db44STomer Tayar 	"Cannot add more than 3 trigger states",
60017b6859fbSMintz, Yuval 
60027b6859fbSMintz, Yuval 	/* DBG_STATUS_TOO_MANY_CONSTRAINTS */
6003c965db44STomer Tayar 	"Cannot add more than 4 constraints per filter or trigger state",
60047b6859fbSMintz, Yuval 
60057b6859fbSMintz, Yuval 	/* DBG_STATUS_RECORDING_NOT_STARTED */
6006c965db44STomer Tayar 	"The recording wasn't started",
60077b6859fbSMintz, Yuval 
60087b6859fbSMintz, Yuval 	/* DBG_STATUS_DATA_DIDNT_TRIGGER */
6009c965db44STomer Tayar 	"A trigger was configured, but it didn't trigger",
60107b6859fbSMintz, Yuval 
60117b6859fbSMintz, Yuval 	/* DBG_STATUS_NO_DATA_RECORDED */
6012c965db44STomer Tayar 	"No data was recorded",
60137b6859fbSMintz, Yuval 
60147b6859fbSMintz, Yuval 	/* DBG_STATUS_DUMP_BUF_TOO_SMALL */
6015c965db44STomer Tayar 	"Dump buffer is too small",
60167b6859fbSMintz, Yuval 
60177b6859fbSMintz, Yuval 	/* DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED */
6018c965db44STomer Tayar 	"Dumped data is not aligned to chunks",
60197b6859fbSMintz, Yuval 
60207b6859fbSMintz, Yuval 	/* DBG_STATUS_UNKNOWN_CHIP */
6021c965db44STomer Tayar 	"Unknown chip",
60227b6859fbSMintz, Yuval 
60237b6859fbSMintz, Yuval 	/* DBG_STATUS_VIRT_MEM_ALLOC_FAILED */
6024c965db44STomer Tayar 	"Failed allocating virtual memory",
60257b6859fbSMintz, Yuval 
60267b6859fbSMintz, Yuval 	/* DBG_STATUS_BLOCK_IN_RESET */
6027c965db44STomer Tayar 	"The input block is in reset",
60287b6859fbSMintz, Yuval 
60297b6859fbSMintz, Yuval 	/* DBG_STATUS_INVALID_TRACE_SIGNATURE */
6030c965db44STomer Tayar 	"Invalid MCP trace signature found in NVRAM",
60317b6859fbSMintz, Yuval 
60327b6859fbSMintz, Yuval 	/* DBG_STATUS_INVALID_NVRAM_BUNDLE */
6033c965db44STomer Tayar 	"Invalid bundle ID found in NVRAM",
60347b6859fbSMintz, Yuval 
60357b6859fbSMintz, Yuval 	/* DBG_STATUS_NVRAM_GET_IMAGE_FAILED */
6036c965db44STomer Tayar 	"Failed getting NVRAM image",
60377b6859fbSMintz, Yuval 
60387b6859fbSMintz, Yuval 	/* DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE */
6039c965db44STomer Tayar 	"NVRAM image is not dword-aligned",
60407b6859fbSMintz, Yuval 
60417b6859fbSMintz, Yuval 	/* DBG_STATUS_NVRAM_READ_FAILED */
6042c965db44STomer Tayar 	"Failed reading from NVRAM",
60437b6859fbSMintz, Yuval 
60447b6859fbSMintz, Yuval 	/* DBG_STATUS_IDLE_CHK_PARSE_FAILED */
6045c965db44STomer Tayar 	"Idle check parsing failed",
60467b6859fbSMintz, Yuval 
60477b6859fbSMintz, Yuval 	/* DBG_STATUS_MCP_TRACE_BAD_DATA */
6048c965db44STomer Tayar 	"MCP Trace data is corrupt",
60497b6859fbSMintz, Yuval 
60507b6859fbSMintz, Yuval 	/* DBG_STATUS_MCP_TRACE_NO_META */
60517b6859fbSMintz, Yuval 	"Dump doesn't contain meta data - it must be provided in image file",
60527b6859fbSMintz, Yuval 
60537b6859fbSMintz, Yuval 	/* DBG_STATUS_MCP_COULD_NOT_HALT */
6054c965db44STomer Tayar 	"Failed to halt MCP",
60557b6859fbSMintz, Yuval 
60567b6859fbSMintz, Yuval 	/* DBG_STATUS_MCP_COULD_NOT_RESUME */
6057c965db44STomer Tayar 	"Failed to resume MCP after halt",
60587b6859fbSMintz, Yuval 
60592d22bc83SMichal Kalderon 	/* DBG_STATUS_RESERVED0 */
60602d22bc83SMichal Kalderon 	"",
60617b6859fbSMintz, Yuval 
60627b6859fbSMintz, Yuval 	/* DBG_STATUS_SEMI_FIFO_NOT_EMPTY */
6063c965db44STomer Tayar 	"Failed to empty SEMI sync FIFO",
60647b6859fbSMintz, Yuval 
60657b6859fbSMintz, Yuval 	/* DBG_STATUS_IGU_FIFO_BAD_DATA */
6066c965db44STomer Tayar 	"IGU FIFO data is corrupt",
60677b6859fbSMintz, Yuval 
60687b6859fbSMintz, Yuval 	/* DBG_STATUS_MCP_COULD_NOT_MASK_PRTY */
6069c965db44STomer Tayar 	"MCP failed to mask parities",
60707b6859fbSMintz, Yuval 
60717b6859fbSMintz, Yuval 	/* DBG_STATUS_FW_ASSERTS_PARSE_FAILED */
6072c965db44STomer Tayar 	"FW Asserts parsing failed",
60737b6859fbSMintz, Yuval 
60747b6859fbSMintz, Yuval 	/* DBG_STATUS_REG_FIFO_BAD_DATA */
6075c965db44STomer Tayar 	"GRC FIFO data is corrupt",
60767b6859fbSMintz, Yuval 
60777b6859fbSMintz, Yuval 	/* DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA */
6078c965db44STomer Tayar 	"Protection Override data is corrupt",
60797b6859fbSMintz, Yuval 
60807b6859fbSMintz, Yuval 	/* DBG_STATUS_DBG_ARRAY_NOT_SET */
6081c965db44STomer Tayar 	"Debug arrays were not set (when using binary files, dbg_set_bin_ptr must be called)",
60827b6859fbSMintz, Yuval 
60832d22bc83SMichal Kalderon 	/* DBG_STATUS_RESERVED1 */
60842d22bc83SMichal Kalderon 	"",
60857b6859fbSMintz, Yuval 
60867b6859fbSMintz, Yuval 	/* DBG_STATUS_NON_MATCHING_LINES */
60872d22bc83SMichal Kalderon 	"Non-matching debug lines - in E4, all lines must be of the same type (either 128b or 256b)",
60887b6859fbSMintz, Yuval 
60892d22bc83SMichal Kalderon 	/* DBG_STATUS_INSUFFICIENT_HW_IDS */
60902d22bc83SMichal Kalderon 	"Insufficient HW IDs. Try to record less Storms/blocks",
60917b6859fbSMintz, Yuval 
60927b6859fbSMintz, Yuval 	/* DBG_STATUS_DBG_BUS_IN_USE */
60932d22bc83SMichal Kalderon 	"The debug bus is in use",
60942d22bc83SMichal Kalderon 
60952d22bc83SMichal Kalderon 	/* DBG_STATUS_INVALID_STORM_DBG_MODE */
60962d22bc83SMichal Kalderon 	"The storm debug mode is not supported in the current chip",
60972d22bc83SMichal Kalderon 
60982d22bc83SMichal Kalderon 	/* DBG_STATUS_OTHER_ENGINE_BB_ONLY */
60992d22bc83SMichal Kalderon 	"Other engine is supported only in BB",
61002d22bc83SMichal Kalderon 
61012d22bc83SMichal Kalderon 	/* DBG_STATUS_FILTER_SINGLE_HW_ID */
61022d22bc83SMichal Kalderon 	"The configured filter mode requires a single Storm/block input",
61032d22bc83SMichal Kalderon 
61042d22bc83SMichal Kalderon 	/* DBG_STATUS_TRIGGER_SINGLE_HW_ID */
61052d22bc83SMichal Kalderon 	"The configured filter mode requires that all the constraints of a single trigger state will be defined on a single Storm/block input",
61062d22bc83SMichal Kalderon 
61072d22bc83SMichal Kalderon 	/* DBG_STATUS_MISSING_TRIGGER_STATE_STORM */
61086c95dd8fSPrabhakar Kushwaha 	"When triggering on Storm data, the Storm to trigger on must be specified",
61096c95dd8fSPrabhakar Kushwaha 
61106c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_FAILED_TO_REQUEST_OFFSIZE */
61116c95dd8fSPrabhakar Kushwaha 	"Failed to request MDUMP2 Offsize",
61126c95dd8fSPrabhakar Kushwaha 
61136c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_FAILED_VALIDATION_OF_DATA_CRC */
61146c95dd8fSPrabhakar Kushwaha 	"Expected CRC (part of the MDUMP2 data) is different than the calculated CRC over that data",
61156c95dd8fSPrabhakar Kushwaha 
61166c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_INVALID_SIGNATURE */
61176c95dd8fSPrabhakar Kushwaha 	"Invalid Signature found at start of MDUMP2",
61186c95dd8fSPrabhakar Kushwaha 
61196c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_INVALID_LOG_SIZE */
61206c95dd8fSPrabhakar Kushwaha 	"Invalid Log Size of MDUMP2",
61216c95dd8fSPrabhakar Kushwaha 
61226c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_INVALID_LOG_HDR */
61236c95dd8fSPrabhakar Kushwaha 	"Invalid Log Header of MDUMP2",
61246c95dd8fSPrabhakar Kushwaha 
61256c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_INVALID_LOG_DATA */
61266c95dd8fSPrabhakar Kushwaha 	"Invalid Log Data of MDUMP2",
61276c95dd8fSPrabhakar Kushwaha 
61286c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_ERROR_EXTRACTING_NUM_PORTS */
61296c95dd8fSPrabhakar Kushwaha 	"Could not extract number of ports from regval buf of MDUMP2",
61306c95dd8fSPrabhakar Kushwaha 
61316c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_ERROR_EXTRACTING_MFW_STATUS */
61326c95dd8fSPrabhakar Kushwaha 	"Could not extract MFW (link) status from regval buf of MDUMP2",
61336c95dd8fSPrabhakar Kushwaha 
61346c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_ERROR_DISPLAYING_LINKDUMP */
61356c95dd8fSPrabhakar Kushwaha 	"Could not display linkdump of MDUMP2",
61366c95dd8fSPrabhakar Kushwaha 
61376c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_ERROR_READING_PHY_CFG */
61386c95dd8fSPrabhakar Kushwaha 	"Could not read PHY CFG of MDUMP2",
61396c95dd8fSPrabhakar Kushwaha 
61406c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_ERROR_READING_PLL_MODE */
61416c95dd8fSPrabhakar Kushwaha 	"Could not read PLL Mode of MDUMP2",
61426c95dd8fSPrabhakar Kushwaha 
61436c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_ERROR_READING_LANE_REGS */
61446c95dd8fSPrabhakar Kushwaha 	"Could not read TSCF/TSCE Lane Regs of MDUMP2",
61456c95dd8fSPrabhakar Kushwaha 
61466c95dd8fSPrabhakar Kushwaha 	/* DBG_STATUS_MDUMP2_ERROR_ALLOCATING_BUF */
61476c95dd8fSPrabhakar Kushwaha 	"Could not allocate MDUMP2 reg-val internal buffer"
6148c965db44STomer Tayar };
6149c965db44STomer Tayar 
6150c965db44STomer Tayar /* Idle check severity names array */
6151c965db44STomer Tayar static const char * const s_idle_chk_severity_str[] = {
6152c965db44STomer Tayar 	"Error",
6153c965db44STomer Tayar 	"Error if no traffic",
6154c965db44STomer Tayar 	"Warning"
6155c965db44STomer Tayar };
6156c965db44STomer Tayar 
6157c965db44STomer Tayar /* MCP Trace level names array */
6158c965db44STomer Tayar static const char * const s_mcp_trace_level_str[] = {
6159c965db44STomer Tayar 	"ERROR",
6160c965db44STomer Tayar 	"TRACE",
6161c965db44STomer Tayar 	"DEBUG"
6162c965db44STomer Tayar };
6163c965db44STomer Tayar 
61647b6859fbSMintz, Yuval /* Access type names array */
6165c965db44STomer Tayar static const char * const s_access_strs[] = {
6166c965db44STomer Tayar 	"read",
6167c965db44STomer Tayar 	"write"
6168c965db44STomer Tayar };
6169c965db44STomer Tayar 
61707b6859fbSMintz, Yuval /* Privilege type names array */
6171c965db44STomer Tayar static const char * const s_privilege_strs[] = {
6172c965db44STomer Tayar 	"VF",
6173c965db44STomer Tayar 	"PDA",
6174c965db44STomer Tayar 	"HV",
6175c965db44STomer Tayar 	"UA"
6176c965db44STomer Tayar };
6177c965db44STomer Tayar 
61787b6859fbSMintz, Yuval /* Protection type names array */
6179c965db44STomer Tayar static const char * const s_protection_strs[] = {
6180c965db44STomer Tayar 	"(default)",
6181c965db44STomer Tayar 	"(default)",
6182c965db44STomer Tayar 	"(default)",
6183c965db44STomer Tayar 	"(default)",
6184c965db44STomer Tayar 	"override VF",
6185c965db44STomer Tayar 	"override PDA",
6186c965db44STomer Tayar 	"override HV",
6187c965db44STomer Tayar 	"override UA"
6188c965db44STomer Tayar };
6189c965db44STomer Tayar 
61907b6859fbSMintz, Yuval /* Master type names array */
6191c965db44STomer Tayar static const char * const s_master_strs[] = {
6192c965db44STomer Tayar 	"???",
6193c965db44STomer Tayar 	"pxp",
6194c965db44STomer Tayar 	"mcp",
6195c965db44STomer Tayar 	"msdm",
6196c965db44STomer Tayar 	"psdm",
6197c965db44STomer Tayar 	"ysdm",
6198c965db44STomer Tayar 	"usdm",
6199c965db44STomer Tayar 	"tsdm",
6200c965db44STomer Tayar 	"xsdm",
6201c965db44STomer Tayar 	"dbu",
6202c965db44STomer Tayar 	"dmae",
62032d22bc83SMichal Kalderon 	"jdap",
6204c965db44STomer Tayar 	"???",
6205c965db44STomer Tayar 	"???",
6206c965db44STomer Tayar 	"???",
6207c965db44STomer Tayar 	"???"
6208c965db44STomer Tayar };
6209c965db44STomer Tayar 
62107b6859fbSMintz, Yuval /* REG FIFO error messages array */
62112d22bc83SMichal Kalderon static struct reg_fifo_err s_reg_fifo_errors[] = {
62122d22bc83SMichal Kalderon 	{1, "grc timeout"},
62132d22bc83SMichal Kalderon 	{2, "address doesn't belong to any block"},
62142d22bc83SMichal Kalderon 	{4, "reserved address in block or write to read-only address"},
62152d22bc83SMichal Kalderon 	{8, "privilege/protection mismatch"},
62162d22bc83SMichal Kalderon 	{16, "path isolation error"},
62172d22bc83SMichal Kalderon 	{17, "RSL error"}
6218c965db44STomer Tayar };
6219c965db44STomer Tayar 
62207b6859fbSMintz, Yuval /* IGU FIFO sources array */
6221c965db44STomer Tayar static const char * const s_igu_fifo_source_strs[] = {
6222c965db44STomer Tayar 	"TSTORM",
6223c965db44STomer Tayar 	"MSTORM",
6224c965db44STomer Tayar 	"USTORM",
6225c965db44STomer Tayar 	"XSTORM",
6226c965db44STomer Tayar 	"YSTORM",
6227c965db44STomer Tayar 	"PSTORM",
6228c965db44STomer Tayar 	"PCIE",
6229c965db44STomer Tayar 	"NIG_QM_PBF",
6230c965db44STomer Tayar 	"CAU",
6231c965db44STomer Tayar 	"ATTN",
6232c965db44STomer Tayar 	"GRC",
6233c965db44STomer Tayar };
6234c965db44STomer Tayar 
62357b6859fbSMintz, Yuval /* IGU FIFO error messages */
6236c965db44STomer Tayar static const char * const s_igu_fifo_error_strs[] = {
6237c965db44STomer Tayar 	"no error",
6238c965db44STomer Tayar 	"length error",
6239c965db44STomer Tayar 	"function disabled",
62401d510657SColin Ian King 	"VF sent command to attention address",
6241c965db44STomer Tayar 	"host sent prod update command",
6242c965db44STomer Tayar 	"read of during interrupt register while in MIMD mode",
6243c965db44STomer Tayar 	"access to PXP BAR reserved address",
6244c965db44STomer Tayar 	"producer update command to attention index",
6245c965db44STomer Tayar 	"unknown error",
6246c965db44STomer Tayar 	"SB index not valid",
6247c965db44STomer Tayar 	"SB relative index and FID not found",
6248c965db44STomer Tayar 	"FID not match",
6249c965db44STomer Tayar 	"command with error flag asserted (PCI error or CAU discard)",
6250c965db44STomer Tayar 	"VF sent cleanup and RF cleanup is disabled",
6251c965db44STomer Tayar 	"cleanup command on type bigger than 4"
6252c965db44STomer Tayar };
6253c965db44STomer Tayar 
6254c965db44STomer Tayar /* IGU FIFO address data */
6255c965db44STomer Tayar static const struct igu_fifo_addr_data s_igu_fifo_addr_data[] = {
62567b6859fbSMintz, Yuval 	{0x0, 0x101, "MSI-X Memory", NULL,
62577b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_MSIX_MEM},
62587b6859fbSMintz, Yuval 	{0x102, 0x1ff, "reserved", NULL,
62597b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_RESERVED},
62607b6859fbSMintz, Yuval 	{0x200, 0x200, "Write PBA[0:63]", NULL,
62617b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_WRITE_PBA},
6262c965db44STomer Tayar 	{0x201, 0x201, "Write PBA[64:127]", "reserved",
6263c965db44STomer Tayar 	 IGU_ADDR_TYPE_WRITE_PBA},
62647b6859fbSMintz, Yuval 	{0x202, 0x202, "Write PBA[128]", "reserved",
62657b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_WRITE_PBA},
62667b6859fbSMintz, Yuval 	{0x203, 0x3ff, "reserved", NULL,
62677b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_RESERVED},
6268c965db44STomer Tayar 	{0x400, 0x5ef, "Write interrupt acknowledgment", NULL,
6269c965db44STomer Tayar 	 IGU_ADDR_TYPE_WRITE_INT_ACK},
6270c965db44STomer Tayar 	{0x5f0, 0x5f0, "Attention bits update", NULL,
6271c965db44STomer Tayar 	 IGU_ADDR_TYPE_WRITE_ATTN_BITS},
6272c965db44STomer Tayar 	{0x5f1, 0x5f1, "Attention bits set", NULL,
6273c965db44STomer Tayar 	 IGU_ADDR_TYPE_WRITE_ATTN_BITS},
6274c965db44STomer Tayar 	{0x5f2, 0x5f2, "Attention bits clear", NULL,
6275c965db44STomer Tayar 	 IGU_ADDR_TYPE_WRITE_ATTN_BITS},
6276c965db44STomer Tayar 	{0x5f3, 0x5f3, "Read interrupt 0:63 with mask", NULL,
6277c965db44STomer Tayar 	 IGU_ADDR_TYPE_READ_INT},
6278c965db44STomer Tayar 	{0x5f4, 0x5f4, "Read interrupt 0:31 with mask", NULL,
6279c965db44STomer Tayar 	 IGU_ADDR_TYPE_READ_INT},
6280c965db44STomer Tayar 	{0x5f5, 0x5f5, "Read interrupt 32:63 with mask", NULL,
6281c965db44STomer Tayar 	 IGU_ADDR_TYPE_READ_INT},
6282c965db44STomer Tayar 	{0x5f6, 0x5f6, "Read interrupt 0:63 without mask", NULL,
6283c965db44STomer Tayar 	 IGU_ADDR_TYPE_READ_INT},
62847b6859fbSMintz, Yuval 	{0x5f7, 0x5ff, "reserved", NULL,
62857b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_RESERVED},
62867b6859fbSMintz, Yuval 	{0x600, 0x7ff, "Producer update", NULL,
62877b6859fbSMintz, Yuval 	 IGU_ADDR_TYPE_WRITE_PROD_UPDATE}
6288c965db44STomer Tayar };
6289c965db44STomer Tayar 
6290c965db44STomer Tayar /******************************** Variables **********************************/
6291c965db44STomer Tayar 
6292c965db44STomer Tayar /* Temporary buffer, used for print size calculations */
6293c965db44STomer Tayar static char s_temp_buf[MAX_MSG_LEN];
6294c965db44STomer Tayar 
62957b6859fbSMintz, Yuval /**************************** Private Functions ******************************/
6296c965db44STomer Tayar 
qed_user_static_asserts(void)62976c95dd8fSPrabhakar Kushwaha static void qed_user_static_asserts(void)
62986c95dd8fSPrabhakar Kushwaha {
62996c95dd8fSPrabhakar Kushwaha }
63006c95dd8fSPrabhakar Kushwaha 
qed_cyclic_add(u32 a,u32 b,u32 size)6301c965db44STomer Tayar static u32 qed_cyclic_add(u32 a, u32 b, u32 size)
6302c965db44STomer Tayar {
6303c965db44STomer Tayar 	return (a + b) % size;
6304c965db44STomer Tayar }
6305c965db44STomer Tayar 
qed_cyclic_sub(u32 a,u32 b,u32 size)6306c965db44STomer Tayar static u32 qed_cyclic_sub(u32 a, u32 b, u32 size)
6307c965db44STomer Tayar {
6308c965db44STomer Tayar 	return (size + a - b) % size;
6309c965db44STomer Tayar }
6310c965db44STomer Tayar 
6311c965db44STomer Tayar /* Reads the specified number of bytes from the specified cyclic buffer (up to 4
6312c965db44STomer Tayar  * bytes) and returns them as a dword value. the specified buffer offset is
6313c965db44STomer Tayar  * updated.
6314c965db44STomer Tayar  */
qed_read_from_cyclic_buf(void * buf,u32 * offset,u32 buf_size,u8 num_bytes_to_read)6315c965db44STomer Tayar static u32 qed_read_from_cyclic_buf(void *buf,
6316c965db44STomer Tayar 				    u32 *offset,
6317c965db44STomer Tayar 				    u32 buf_size, u8 num_bytes_to_read)
6318c965db44STomer Tayar {
63197b6859fbSMintz, Yuval 	u8 i, *val_ptr, *bytes_buf = (u8 *)buf;
6320c965db44STomer Tayar 	u32 val = 0;
6321c965db44STomer Tayar 
6322c965db44STomer Tayar 	val_ptr = (u8 *)&val;
6323c965db44STomer Tayar 
632450bc60cbSMichal Kalderon 	/* Assume running on a LITTLE ENDIAN and the buffer is network order
632550bc60cbSMichal Kalderon 	 * (BIG ENDIAN), as high order bytes are placed in lower memory address.
632650bc60cbSMichal Kalderon 	 */
6327c965db44STomer Tayar 	for (i = 0; i < num_bytes_to_read; i++) {
6328c965db44STomer Tayar 		val_ptr[i] = bytes_buf[*offset];
6329c965db44STomer Tayar 		*offset = qed_cyclic_add(*offset, 1, buf_size);
6330c965db44STomer Tayar 	}
6331c965db44STomer Tayar 
6332c965db44STomer Tayar 	return val;
6333c965db44STomer Tayar }
6334c965db44STomer Tayar 
6335c965db44STomer Tayar /* Reads and returns the next byte from the specified buffer.
6336c965db44STomer Tayar  * The specified buffer offset is updated.
6337c965db44STomer Tayar  */
qed_read_byte_from_buf(void * buf,u32 * offset)6338c965db44STomer Tayar static u8 qed_read_byte_from_buf(void *buf, u32 *offset)
6339c965db44STomer Tayar {
6340c965db44STomer Tayar 	return ((u8 *)buf)[(*offset)++];
6341c965db44STomer Tayar }
6342c965db44STomer Tayar 
6343c965db44STomer Tayar /* Reads and returns the next dword from the specified buffer.
6344c965db44STomer Tayar  * The specified buffer offset is updated.
6345c965db44STomer Tayar  */
qed_read_dword_from_buf(void * buf,u32 * offset)6346c965db44STomer Tayar static u32 qed_read_dword_from_buf(void *buf, u32 *offset)
6347c965db44STomer Tayar {
6348c965db44STomer Tayar 	u32 dword_val = *(u32 *)&((u8 *)buf)[*offset];
6349c965db44STomer Tayar 
6350c965db44STomer Tayar 	*offset += 4;
63517b6859fbSMintz, Yuval 
6352c965db44STomer Tayar 	return dword_val;
6353c965db44STomer Tayar }
6354c965db44STomer Tayar 
6355c965db44STomer Tayar /* Reads the next string from the specified buffer, and copies it to the
6356c965db44STomer Tayar  * specified pointer. The specified buffer offset is updated.
6357c965db44STomer Tayar  */
qed_read_str_from_buf(void * buf,u32 * offset,u32 size,char * dest)6358c965db44STomer Tayar static void qed_read_str_from_buf(void *buf, u32 *offset, u32 size, char *dest)
6359c965db44STomer Tayar {
6360c965db44STomer Tayar 	const char *source_str = &((const char *)buf)[*offset];
6361c965db44STomer Tayar 
6362c965db44STomer Tayar 	strncpy(dest, source_str, size);
6363c965db44STomer Tayar 	dest[size - 1] = '\0';
6364c965db44STomer Tayar 	*offset += size;
6365c965db44STomer Tayar }
6366c965db44STomer Tayar 
6367c965db44STomer Tayar /* Returns a pointer to the specified offset (in bytes) of the specified buffer.
6368c965db44STomer Tayar  * If the specified buffer in NULL, a temporary buffer pointer is returned.
6369c965db44STomer Tayar  */
qed_get_buf_ptr(void * buf,u32 offset)6370c965db44STomer Tayar static char *qed_get_buf_ptr(void *buf, u32 offset)
6371c965db44STomer Tayar {
6372c965db44STomer Tayar 	return buf ? (char *)buf + offset : s_temp_buf;
6373c965db44STomer Tayar }
6374c965db44STomer Tayar 
6375c965db44STomer Tayar /* Reads a param from the specified buffer. Returns the number of dwords read.
6376c965db44STomer Tayar  * If the returned str_param is NULL, the param is numeric and its value is
6377c965db44STomer Tayar  * returned in num_param.
6378c965db44STomer Tayar  * Otheriwise, the param is a string and its pointer is returned in str_param.
6379c965db44STomer Tayar  */
qed_read_param(u32 * dump_buf,const char ** param_name,const char ** param_str_val,u32 * param_num_val)6380c965db44STomer Tayar static u32 qed_read_param(u32 *dump_buf,
6381c965db44STomer Tayar 			  const char **param_name,
6382c965db44STomer Tayar 			  const char **param_str_val, u32 *param_num_val)
6383c965db44STomer Tayar {
6384c965db44STomer Tayar 	char *char_buf = (char *)dump_buf;
63857b6859fbSMintz, Yuval 	size_t offset = 0;
6386c965db44STomer Tayar 
6387c965db44STomer Tayar 	/* Extract param name */
6388c965db44STomer Tayar 	*param_name = char_buf;
6389c965db44STomer Tayar 	offset += strlen(*param_name) + 1;
6390c965db44STomer Tayar 
6391c965db44STomer Tayar 	/* Check param type */
6392c965db44STomer Tayar 	if (*(char_buf + offset++)) {
6393c965db44STomer Tayar 		/* String param */
6394c965db44STomer Tayar 		*param_str_val = char_buf + offset;
6395da090917STomer Tayar 		*param_num_val = 0;
6396c965db44STomer Tayar 		offset += strlen(*param_str_val) + 1;
6397c965db44STomer Tayar 		if (offset & 0x3)
6398c965db44STomer Tayar 			offset += (4 - (offset & 0x3));
6399c965db44STomer Tayar 	} else {
6400c965db44STomer Tayar 		/* Numeric param */
6401c965db44STomer Tayar 		*param_str_val = NULL;
6402c965db44STomer Tayar 		if (offset & 0x3)
6403c965db44STomer Tayar 			offset += (4 - (offset & 0x3));
6404c965db44STomer Tayar 		*param_num_val = *(u32 *)(char_buf + offset);
6405c965db44STomer Tayar 		offset += 4;
6406c965db44STomer Tayar 	}
6407c965db44STomer Tayar 
640850bc60cbSMichal Kalderon 	return (u32)offset / 4;
6409c965db44STomer Tayar }
6410c965db44STomer Tayar 
6411c965db44STomer Tayar /* Reads a section header from the specified buffer.
6412c965db44STomer Tayar  * Returns the number of dwords read.
6413c965db44STomer Tayar  */
qed_read_section_hdr(u32 * dump_buf,const char ** section_name,u32 * num_section_params)6414c965db44STomer Tayar static u32 qed_read_section_hdr(u32 *dump_buf,
6415c965db44STomer Tayar 				const char **section_name,
6416c965db44STomer Tayar 				u32 *num_section_params)
6417c965db44STomer Tayar {
6418c965db44STomer Tayar 	const char *param_str_val;
6419c965db44STomer Tayar 
6420c965db44STomer Tayar 	return qed_read_param(dump_buf,
6421c965db44STomer Tayar 			      section_name, &param_str_val, num_section_params);
6422c965db44STomer Tayar }
6423c965db44STomer Tayar 
6424c965db44STomer Tayar /* Reads section params from the specified buffer and prints them to the results
6425c965db44STomer Tayar  * buffer. Returns the number of dwords read.
6426c965db44STomer Tayar  */
qed_print_section_params(u32 * dump_buf,u32 num_section_params,char * results_buf,u32 * num_chars_printed)6427c965db44STomer Tayar static u32 qed_print_section_params(u32 *dump_buf,
6428c965db44STomer Tayar 				    u32 num_section_params,
6429c965db44STomer Tayar 				    char *results_buf, u32 *num_chars_printed)
6430c965db44STomer Tayar {
6431c965db44STomer Tayar 	u32 i, dump_offset = 0, results_offset = 0;
6432c965db44STomer Tayar 
6433c965db44STomer Tayar 	for (i = 0; i < num_section_params; i++) {
64347b6859fbSMintz, Yuval 		const char *param_name, *param_str_val;
6435c965db44STomer Tayar 		u32 param_num_val = 0;
6436c965db44STomer Tayar 
6437c965db44STomer Tayar 		dump_offset += qed_read_param(dump_buf + dump_offset,
6438c965db44STomer Tayar 					      &param_name,
6439c965db44STomer Tayar 					      &param_str_val, &param_num_val);
64407b6859fbSMintz, Yuval 
6441c965db44STomer Tayar 		if (param_str_val)
6442c965db44STomer Tayar 			results_offset +=
6443c965db44STomer Tayar 				sprintf(qed_get_buf_ptr(results_buf,
6444c965db44STomer Tayar 							results_offset),
6445c965db44STomer Tayar 					"%s: %s\n", param_name, param_str_val);
6446c965db44STomer Tayar 		else if (strcmp(param_name, "fw-timestamp"))
6447c965db44STomer Tayar 			results_offset +=
6448c965db44STomer Tayar 				sprintf(qed_get_buf_ptr(results_buf,
6449c965db44STomer Tayar 							results_offset),
6450c965db44STomer Tayar 					"%s: %d\n", param_name, param_num_val);
6451c965db44STomer Tayar 	}
6452c965db44STomer Tayar 
64537b6859fbSMintz, Yuval 	results_offset += sprintf(qed_get_buf_ptr(results_buf, results_offset),
64547b6859fbSMintz, Yuval 				  "\n");
6455c965db44STomer Tayar 
64567b6859fbSMintz, Yuval 	*num_chars_printed = results_offset;
64577b6859fbSMintz, Yuval 
64587b6859fbSMintz, Yuval 	return dump_offset;
6459c965db44STomer Tayar }
6460c965db44STomer Tayar 
64612d22bc83SMichal Kalderon /* Returns the block name that matches the specified block ID,
64622d22bc83SMichal Kalderon  * or NULL if not found.
64632d22bc83SMichal Kalderon  */
qed_dbg_get_block_name(struct qed_hwfn * p_hwfn,enum block_id block_id)64642d22bc83SMichal Kalderon static const char *qed_dbg_get_block_name(struct qed_hwfn *p_hwfn,
64652d22bc83SMichal Kalderon 					  enum block_id block_id)
64662d22bc83SMichal Kalderon {
64672d22bc83SMichal Kalderon 	const struct dbg_block_user *block =
64682d22bc83SMichal Kalderon 	    (const struct dbg_block_user *)
64692d22bc83SMichal Kalderon 	    p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_USER_DATA].ptr + block_id;
64702d22bc83SMichal Kalderon 
64712d22bc83SMichal Kalderon 	return (const char *)block->name;
64722d22bc83SMichal Kalderon }
64732d22bc83SMichal Kalderon 
qed_dbg_get_user_data(struct qed_hwfn * p_hwfn)64742d22bc83SMichal Kalderon static struct dbg_tools_user_data *qed_dbg_get_user_data(struct qed_hwfn
64752d22bc83SMichal Kalderon 							 *p_hwfn)
6476a3f72307SDenis Bolotin {
6477a3f72307SDenis Bolotin 	return (struct dbg_tools_user_data *)p_hwfn->dbg_user_info;
6478a3f72307SDenis Bolotin }
6479a3f72307SDenis Bolotin 
6480c965db44STomer Tayar /* Parses the idle check rules and returns the number of characters printed.
6481c965db44STomer Tayar  * In case of parsing error, returns 0.
6482c965db44STomer Tayar  */
qed_parse_idle_chk_dump_rules(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 * dump_buf_end,u32 num_rules,bool print_fw_idle_chk,char * results_buf,u32 * num_errors,u32 * num_warnings)64832d22bc83SMichal Kalderon static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn,
64842d22bc83SMichal Kalderon 					 u32 *dump_buf,
6485c965db44STomer Tayar 					 u32 *dump_buf_end,
6486c965db44STomer Tayar 					 u32 num_rules,
6487c965db44STomer Tayar 					 bool print_fw_idle_chk,
6488c965db44STomer Tayar 					 char *results_buf,
6489c965db44STomer Tayar 					 u32 *num_errors, u32 *num_warnings)
6490c965db44STomer Tayar {
64917b6859fbSMintz, Yuval 	/* Offset in results_buf in bytes */
64927b6859fbSMintz, Yuval 	u32 results_offset = 0;
64937b6859fbSMintz, Yuval 
64947b6859fbSMintz, Yuval 	u32 rule_idx;
6495c965db44STomer Tayar 	u16 i, j;
6496c965db44STomer Tayar 
6497c965db44STomer Tayar 	*num_errors = 0;
6498c965db44STomer Tayar 	*num_warnings = 0;
6499c965db44STomer Tayar 
6500c965db44STomer Tayar 	/* Go over dumped results */
6501c965db44STomer Tayar 	for (rule_idx = 0; rule_idx < num_rules && dump_buf < dump_buf_end;
6502c965db44STomer Tayar 	     rule_idx++) {
6503c965db44STomer Tayar 		const struct dbg_idle_chk_rule_parsing_data *rule_parsing_data;
6504c965db44STomer Tayar 		struct dbg_idle_chk_result_hdr *hdr;
65057b6859fbSMintz, Yuval 		const char *parsing_str, *lsi_msg;
6506c965db44STomer Tayar 		u32 parsing_str_offset;
6507c965db44STomer Tayar 		bool has_fw_msg;
65087b6859fbSMintz, Yuval 		u8 curr_reg_id;
6509c965db44STomer Tayar 
6510c965db44STomer Tayar 		hdr = (struct dbg_idle_chk_result_hdr *)dump_buf;
6511c965db44STomer Tayar 		rule_parsing_data =
6512c965db44STomer Tayar 		    (const struct dbg_idle_chk_rule_parsing_data *)
65132d22bc83SMichal Kalderon 		    p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr +
65142d22bc83SMichal Kalderon 		    hdr->rule_id;
6515c965db44STomer Tayar 		parsing_str_offset =
6516c965db44STomer Tayar 		    GET_FIELD(rule_parsing_data->data,
6517c965db44STomer Tayar 			      DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET);
6518c965db44STomer Tayar 		has_fw_msg =
6519c965db44STomer Tayar 		    GET_FIELD(rule_parsing_data->data,
6520c965db44STomer Tayar 			      DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG) > 0;
65212d22bc83SMichal Kalderon 		parsing_str = (const char *)
65222d22bc83SMichal Kalderon 		    p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr +
65232d22bc83SMichal Kalderon 		    parsing_str_offset;
6524c965db44STomer Tayar 		lsi_msg = parsing_str;
65257b6859fbSMintz, Yuval 		curr_reg_id = 0;
6526c965db44STomer Tayar 
6527c965db44STomer Tayar 		if (hdr->severity >= MAX_DBG_IDLE_CHK_SEVERITY_TYPES)
6528c965db44STomer Tayar 			return 0;
6529c965db44STomer Tayar 
6530c965db44STomer Tayar 		/* Skip rule header */
65317b6859fbSMintz, Yuval 		dump_buf += BYTES_TO_DWORDS(sizeof(*hdr));
6532c965db44STomer Tayar 
6533c965db44STomer Tayar 		/* Update errors/warnings count */
6534c965db44STomer Tayar 		if (hdr->severity == IDLE_CHK_SEVERITY_ERROR ||
6535c965db44STomer Tayar 		    hdr->severity == IDLE_CHK_SEVERITY_ERROR_NO_TRAFFIC)
6536c965db44STomer Tayar 			(*num_errors)++;
6537c965db44STomer Tayar 		else
6538c965db44STomer Tayar 			(*num_warnings)++;
6539c965db44STomer Tayar 
6540c965db44STomer Tayar 		/* Print rule severity */
6541c965db44STomer Tayar 		results_offset +=
6542c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6543c965db44STomer Tayar 					    results_offset), "%s: ",
6544c965db44STomer Tayar 			    s_idle_chk_severity_str[hdr->severity]);
6545c965db44STomer Tayar 
6546c965db44STomer Tayar 		/* Print rule message */
6547c965db44STomer Tayar 		if (has_fw_msg)
6548c965db44STomer Tayar 			parsing_str += strlen(parsing_str) + 1;
6549c965db44STomer Tayar 		results_offset +=
6550c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6551c965db44STomer Tayar 					    results_offset), "%s.",
6552c965db44STomer Tayar 			    has_fw_msg &&
6553c965db44STomer Tayar 			    print_fw_idle_chk ? parsing_str : lsi_msg);
6554c965db44STomer Tayar 		parsing_str += strlen(parsing_str) + 1;
6555c965db44STomer Tayar 
6556c965db44STomer Tayar 		/* Print register values */
6557c965db44STomer Tayar 		results_offset +=
6558c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6559c965db44STomer Tayar 					    results_offset), " Registers:");
6560c965db44STomer Tayar 		for (i = 0;
6561c965db44STomer Tayar 		     i < hdr->num_dumped_cond_regs + hdr->num_dumped_info_regs;
6562c965db44STomer Tayar 		     i++) {
65637b6859fbSMintz, Yuval 			struct dbg_idle_chk_result_reg_hdr *reg_hdr;
65647b6859fbSMintz, Yuval 			bool is_mem;
65657b6859fbSMintz, Yuval 			u8 reg_id;
65667b6859fbSMintz, Yuval 
65677b6859fbSMintz, Yuval 			reg_hdr =
65687b6859fbSMintz, Yuval 				(struct dbg_idle_chk_result_reg_hdr *)dump_buf;
65697b6859fbSMintz, Yuval 			is_mem = GET_FIELD(reg_hdr->data,
6570c965db44STomer Tayar 					   DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM);
65717b6859fbSMintz, Yuval 			reg_id = GET_FIELD(reg_hdr->data,
6572c965db44STomer Tayar 					   DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID);
6573c965db44STomer Tayar 
6574c965db44STomer Tayar 			/* Skip reg header */
65757b6859fbSMintz, Yuval 			dump_buf += BYTES_TO_DWORDS(sizeof(*reg_hdr));
6576c965db44STomer Tayar 
6577c965db44STomer Tayar 			/* Skip register names until the required reg_id is
6578c965db44STomer Tayar 			 * reached.
6579c965db44STomer Tayar 			 */
65806c95dd8fSPrabhakar Kushwaha 			for (; reg_id > curr_reg_id; curr_reg_id++)
65816c95dd8fSPrabhakar Kushwaha 				parsing_str += strlen(parsing_str) + 1;
6582c965db44STomer Tayar 
6583c965db44STomer Tayar 			results_offset +=
6584c965db44STomer Tayar 			    sprintf(qed_get_buf_ptr(results_buf,
6585c965db44STomer Tayar 						    results_offset), " %s",
6586c965db44STomer Tayar 				    parsing_str);
6587c965db44STomer Tayar 			if (i < hdr->num_dumped_cond_regs && is_mem)
6588c965db44STomer Tayar 				results_offset +=
6589c965db44STomer Tayar 				    sprintf(qed_get_buf_ptr(results_buf,
6590c965db44STomer Tayar 							    results_offset),
6591c965db44STomer Tayar 					    "[%d]", hdr->mem_entry_id +
6592c965db44STomer Tayar 					    reg_hdr->start_entry);
6593c965db44STomer Tayar 			results_offset +=
6594c965db44STomer Tayar 			    sprintf(qed_get_buf_ptr(results_buf,
6595c965db44STomer Tayar 						    results_offset), "=");
6596c965db44STomer Tayar 			for (j = 0; j < reg_hdr->size; j++, dump_buf++) {
6597c965db44STomer Tayar 				results_offset +=
6598c965db44STomer Tayar 				    sprintf(qed_get_buf_ptr(results_buf,
6599c965db44STomer Tayar 							    results_offset),
6600c965db44STomer Tayar 					    "0x%x", *dump_buf);
6601c965db44STomer Tayar 				if (j < reg_hdr->size - 1)
6602c965db44STomer Tayar 					results_offset +=
6603c965db44STomer Tayar 					    sprintf(qed_get_buf_ptr
6604c965db44STomer Tayar 						    (results_buf,
6605c965db44STomer Tayar 						     results_offset), ",");
6606c965db44STomer Tayar 			}
6607c965db44STomer Tayar 		}
6608c965db44STomer Tayar 
6609c965db44STomer Tayar 		results_offset +=
6610c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf, results_offset), "\n");
6611c965db44STomer Tayar 	}
6612c965db44STomer Tayar 
6613c965db44STomer Tayar 	/* Check if end of dump buffer was exceeded */
6614c965db44STomer Tayar 	if (dump_buf > dump_buf_end)
6615c965db44STomer Tayar 		return 0;
66167b6859fbSMintz, Yuval 
6617c965db44STomer Tayar 	return results_offset;
6618c965db44STomer Tayar }
6619c965db44STomer Tayar 
6620c965db44STomer Tayar /* Parses an idle check dump buffer.
6621c965db44STomer Tayar  * If result_buf is not NULL, the idle check results are printed to it.
6622c965db44STomer Tayar  * In any case, the required results buffer size is assigned to
6623c965db44STomer Tayar  * parsed_results_bytes.
6624c965db44STomer Tayar  * The parsing status is returned.
6625c965db44STomer Tayar  */
qed_parse_idle_chk_dump(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,char * results_buf,u32 * parsed_results_bytes,u32 * num_errors,u32 * num_warnings)66262d22bc83SMichal Kalderon static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn,
66272d22bc83SMichal Kalderon 					       u32 *dump_buf,
6628c965db44STomer Tayar 					       u32 num_dumped_dwords,
6629c965db44STomer Tayar 					       char *results_buf,
6630c965db44STomer Tayar 					       u32 *parsed_results_bytes,
6631c965db44STomer Tayar 					       u32 *num_errors,
6632c965db44STomer Tayar 					       u32 *num_warnings)
6633c965db44STomer Tayar {
66346c95dd8fSPrabhakar Kushwaha 	u32 num_section_params = 0, num_rules, num_rules_not_dumped;
6635c965db44STomer Tayar 	const char *section_name, *param_name, *param_str_val;
6636c965db44STomer Tayar 	u32 *dump_buf_end = dump_buf + num_dumped_dwords;
66377b6859fbSMintz, Yuval 
66387b6859fbSMintz, Yuval 	/* Offset in results_buf in bytes */
66397b6859fbSMintz, Yuval 	u32 results_offset = 0;
6640c965db44STomer Tayar 
6641c965db44STomer Tayar 	*parsed_results_bytes = 0;
6642c965db44STomer Tayar 	*num_errors = 0;
6643c965db44STomer Tayar 	*num_warnings = 0;
66447b6859fbSMintz, Yuval 
66452d22bc83SMichal Kalderon 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr ||
66462d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr)
6647c965db44STomer Tayar 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
6648c965db44STomer Tayar 
6649c965db44STomer Tayar 	/* Read global_params section */
6650c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6651c965db44STomer Tayar 					 &section_name, &num_section_params);
6652c965db44STomer Tayar 	if (strcmp(section_name, "global_params"))
6653c965db44STomer Tayar 		return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6654c965db44STomer Tayar 
6655c965db44STomer Tayar 	/* Print global params */
6656c965db44STomer Tayar 	dump_buf += qed_print_section_params(dump_buf,
6657c965db44STomer Tayar 					     num_section_params,
6658c965db44STomer Tayar 					     results_buf, &results_offset);
6659c965db44STomer Tayar 
66606c95dd8fSPrabhakar Kushwaha 	/* Read idle_chk section
66616c95dd8fSPrabhakar Kushwaha 	 * There may be 1 or 2 idle_chk section parameters:
66626c95dd8fSPrabhakar Kushwaha 	 * - 1st is "num_rules"
66636c95dd8fSPrabhakar Kushwaha 	 * - 2nd is "num_rules_not_dumped" (optional)
66646c95dd8fSPrabhakar Kushwaha 	 */
66656c95dd8fSPrabhakar Kushwaha 
6666c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
6667c965db44STomer Tayar 					 &section_name, &num_section_params);
66686c95dd8fSPrabhakar Kushwaha 	if (strcmp(section_name, "idle_chk") ||
66696c95dd8fSPrabhakar Kushwaha 	    (num_section_params != 2 && num_section_params != 1))
6670c965db44STomer Tayar 		return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6671c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
6672c965db44STomer Tayar 				   &param_name, &param_str_val, &num_rules);
66737b6859fbSMintz, Yuval 	if (strcmp(param_name, "num_rules"))
6674c965db44STomer Tayar 		return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
66756c95dd8fSPrabhakar Kushwaha 	if (num_section_params > 1) {
66766c95dd8fSPrabhakar Kushwaha 		dump_buf += qed_read_param(dump_buf,
66776c95dd8fSPrabhakar Kushwaha 					   &param_name,
66786c95dd8fSPrabhakar Kushwaha 					   &param_str_val,
66796c95dd8fSPrabhakar Kushwaha 					   &num_rules_not_dumped);
66806c95dd8fSPrabhakar Kushwaha 		if (strcmp(param_name, "num_rules_not_dumped"))
66816c95dd8fSPrabhakar Kushwaha 			return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
66826c95dd8fSPrabhakar Kushwaha 	} else {
66836c95dd8fSPrabhakar Kushwaha 		num_rules_not_dumped = 0;
66846c95dd8fSPrabhakar Kushwaha 	}
6685c965db44STomer Tayar 
6686c965db44STomer Tayar 	if (num_rules) {
6687c965db44STomer Tayar 		u32 rules_print_size;
6688c965db44STomer Tayar 
6689c965db44STomer Tayar 		/* Print FW output */
6690c965db44STomer Tayar 		results_offset +=
6691c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6692c965db44STomer Tayar 					    results_offset),
6693c965db44STomer Tayar 			    "FW_IDLE_CHECK:\n");
6694c965db44STomer Tayar 		rules_print_size =
66952d22bc83SMichal Kalderon 			qed_parse_idle_chk_dump_rules(p_hwfn,
66962d22bc83SMichal Kalderon 						      dump_buf,
6697da090917STomer Tayar 						      dump_buf_end,
6698da090917STomer Tayar 						      num_rules,
6699c965db44STomer Tayar 						      true,
6700c965db44STomer Tayar 						      results_buf ?
6701c965db44STomer Tayar 						      results_buf +
6702da090917STomer Tayar 						      results_offset :
6703da090917STomer Tayar 						      NULL,
6704da090917STomer Tayar 						      num_errors,
6705da090917STomer Tayar 						      num_warnings);
6706c965db44STomer Tayar 		results_offset += rules_print_size;
67077b6859fbSMintz, Yuval 		if (!rules_print_size)
6708c965db44STomer Tayar 			return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6709c965db44STomer Tayar 
6710c965db44STomer Tayar 		/* Print LSI output */
6711c965db44STomer Tayar 		results_offset +=
6712c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6713c965db44STomer Tayar 					    results_offset),
6714c965db44STomer Tayar 			    "\nLSI_IDLE_CHECK:\n");
6715c965db44STomer Tayar 		rules_print_size =
67162d22bc83SMichal Kalderon 			qed_parse_idle_chk_dump_rules(p_hwfn,
67172d22bc83SMichal Kalderon 						      dump_buf,
6718da090917STomer Tayar 						      dump_buf_end,
6719da090917STomer Tayar 						      num_rules,
6720c965db44STomer Tayar 						      false,
6721c965db44STomer Tayar 						      results_buf ?
6722c965db44STomer Tayar 						      results_buf +
6723da090917STomer Tayar 						      results_offset :
6724da090917STomer Tayar 						      NULL,
6725da090917STomer Tayar 						      num_errors,
6726da090917STomer Tayar 						      num_warnings);
6727c965db44STomer Tayar 		results_offset += rules_print_size;
67287b6859fbSMintz, Yuval 		if (!rules_print_size)
6729c965db44STomer Tayar 			return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
6730c965db44STomer Tayar 	}
6731c965db44STomer Tayar 
6732c965db44STomer Tayar 	/* Print errors/warnings count */
67337b6859fbSMintz, Yuval 	if (*num_errors)
6734c965db44STomer Tayar 		results_offset +=
6735c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6736c965db44STomer Tayar 					    results_offset),
6737c965db44STomer Tayar 			    "\nIdle Check failed!!! (with %d errors and %d warnings)\n",
6738c965db44STomer Tayar 			    *num_errors, *num_warnings);
67397b6859fbSMintz, Yuval 	else if (*num_warnings)
6740c965db44STomer Tayar 		results_offset +=
6741c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6742c965db44STomer Tayar 					    results_offset),
67437b6859fbSMintz, Yuval 			    "\nIdle Check completed successfully (with %d warnings)\n",
6744c965db44STomer Tayar 			    *num_warnings);
67457b6859fbSMintz, Yuval 	else
6746c965db44STomer Tayar 		results_offset +=
6747c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
6748c965db44STomer Tayar 					    results_offset),
67497b6859fbSMintz, Yuval 			    "\nIdle Check completed successfully\n");
6750c965db44STomer Tayar 
67516c95dd8fSPrabhakar Kushwaha 	if (num_rules_not_dumped)
67526c95dd8fSPrabhakar Kushwaha 		results_offset +=
67536c95dd8fSPrabhakar Kushwaha 		    sprintf(qed_get_buf_ptr(results_buf,
67546c95dd8fSPrabhakar Kushwaha 					    results_offset),
67556c95dd8fSPrabhakar Kushwaha 			    "\nIdle Check Partially dumped : num_rules_not_dumped = %d\n",
67566c95dd8fSPrabhakar Kushwaha 			    num_rules_not_dumped);
67576c95dd8fSPrabhakar Kushwaha 
6758c965db44STomer Tayar 	/* Add 1 for string NULL termination */
6759c965db44STomer Tayar 	*parsed_results_bytes = results_offset + 1;
67607b6859fbSMintz, Yuval 
6761c965db44STomer Tayar 	return DBG_STATUS_OK;
6762c965db44STomer Tayar }
6763c965db44STomer Tayar 
6764c965db44STomer Tayar /* Allocates and fills MCP Trace meta data based on the specified meta data
6765c965db44STomer Tayar  * dump buffer.
6766c965db44STomer Tayar  * Returns debug status code.
6767c965db44STomer Tayar  */
6768a3f72307SDenis Bolotin static enum dbg_status
qed_mcp_trace_alloc_meta_data(struct qed_hwfn * p_hwfn,const u32 * meta_buf)6769a3f72307SDenis Bolotin qed_mcp_trace_alloc_meta_data(struct qed_hwfn *p_hwfn,
6770a3f72307SDenis Bolotin 			      const u32 *meta_buf)
6771c965db44STomer Tayar {
6772a3f72307SDenis Bolotin 	struct dbg_tools_user_data *dev_user_data;
6773c965db44STomer Tayar 	u32 offset = 0, signature, i;
6774a3f72307SDenis Bolotin 	struct mcp_trace_meta *meta;
6775a3f72307SDenis Bolotin 	u8 *meta_buf_bytes;
6776a3f72307SDenis Bolotin 
6777a3f72307SDenis Bolotin 	dev_user_data = qed_dbg_get_user_data(p_hwfn);
6778a3f72307SDenis Bolotin 	meta = &dev_user_data->mcp_trace_meta;
6779a3f72307SDenis Bolotin 	meta_buf_bytes = (u8 *)meta_buf;
6780c965db44STomer Tayar 
678150bc60cbSMichal Kalderon 	/* Free the previous meta before loading a new one. */
6782a3f72307SDenis Bolotin 	if (meta->is_allocated)
6783a3f72307SDenis Bolotin 		qed_mcp_trace_free_meta_data(p_hwfn);
678450bc60cbSMichal Kalderon 
6785c965db44STomer Tayar 	memset(meta, 0, sizeof(*meta));
6786c965db44STomer Tayar 
6787c965db44STomer Tayar 	/* Read first signature */
6788c965db44STomer Tayar 	signature = qed_read_dword_from_buf(meta_buf_bytes, &offset);
67897b6859fbSMintz, Yuval 	if (signature != NVM_MAGIC_VALUE)
6790c965db44STomer Tayar 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
6791c965db44STomer Tayar 
67927b6859fbSMintz, Yuval 	/* Read no. of modules and allocate memory for their pointers */
6793c965db44STomer Tayar 	meta->modules_num = qed_read_byte_from_buf(meta_buf_bytes, &offset);
67946396bb22SKees Cook 	meta->modules = kcalloc(meta->modules_num, sizeof(char *),
67956396bb22SKees Cook 				GFP_KERNEL);
6796c965db44STomer Tayar 	if (!meta->modules)
6797c965db44STomer Tayar 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6798c965db44STomer Tayar 
6799c965db44STomer Tayar 	/* Allocate and read all module strings */
6800c965db44STomer Tayar 	for (i = 0; i < meta->modules_num; i++) {
6801c965db44STomer Tayar 		u8 module_len = qed_read_byte_from_buf(meta_buf_bytes, &offset);
6802c965db44STomer Tayar 
6803c965db44STomer Tayar 		*(meta->modules + i) = kzalloc(module_len, GFP_KERNEL);
6804c965db44STomer Tayar 		if (!(*(meta->modules + i))) {
6805c965db44STomer Tayar 			/* Update number of modules to be released */
6806c965db44STomer Tayar 			meta->modules_num = i ? i - 1 : 0;
6807c965db44STomer Tayar 			return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6808c965db44STomer Tayar 		}
6809c965db44STomer Tayar 
6810c965db44STomer Tayar 		qed_read_str_from_buf(meta_buf_bytes, &offset, module_len,
6811c965db44STomer Tayar 				      *(meta->modules + i));
6812c965db44STomer Tayar 		if (module_len > MCP_TRACE_MAX_MODULE_LEN)
6813c965db44STomer Tayar 			(*(meta->modules + i))[MCP_TRACE_MAX_MODULE_LEN] = '\0';
6814c965db44STomer Tayar 	}
6815c965db44STomer Tayar 
6816c965db44STomer Tayar 	/* Read second signature */
6817c965db44STomer Tayar 	signature = qed_read_dword_from_buf(meta_buf_bytes, &offset);
68187b6859fbSMintz, Yuval 	if (signature != NVM_MAGIC_VALUE)
6819c965db44STomer Tayar 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
6820c965db44STomer Tayar 
6821c965db44STomer Tayar 	/* Read number of formats and allocate memory for all formats */
6822c965db44STomer Tayar 	meta->formats_num = qed_read_dword_from_buf(meta_buf_bytes, &offset);
68236396bb22SKees Cook 	meta->formats = kcalloc(meta->formats_num,
6824c965db44STomer Tayar 				sizeof(struct mcp_trace_format),
6825c965db44STomer Tayar 				GFP_KERNEL);
6826c965db44STomer Tayar 	if (!meta->formats)
6827c965db44STomer Tayar 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6828c965db44STomer Tayar 
6829c965db44STomer Tayar 	/* Allocate and read all strings */
6830c965db44STomer Tayar 	for (i = 0; i < meta->formats_num; i++) {
6831c965db44STomer Tayar 		struct mcp_trace_format *format_ptr = &meta->formats[i];
6832c965db44STomer Tayar 		u8 format_len;
6833c965db44STomer Tayar 
6834c965db44STomer Tayar 		format_ptr->data = qed_read_dword_from_buf(meta_buf_bytes,
6835c965db44STomer Tayar 							   &offset);
68362d22bc83SMichal Kalderon 		format_len = GET_MFW_FIELD(format_ptr->data,
68372d22bc83SMichal Kalderon 					   MCP_TRACE_FORMAT_LEN);
6838c965db44STomer Tayar 		format_ptr->format_str = kzalloc(format_len, GFP_KERNEL);
6839c965db44STomer Tayar 		if (!format_ptr->format_str) {
6840c965db44STomer Tayar 			/* Update number of modules to be released */
6841c965db44STomer Tayar 			meta->formats_num = i ? i - 1 : 0;
6842c965db44STomer Tayar 			return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
6843c965db44STomer Tayar 		}
6844c965db44STomer Tayar 
6845c965db44STomer Tayar 		qed_read_str_from_buf(meta_buf_bytes,
6846c965db44STomer Tayar 				      &offset,
6847c965db44STomer Tayar 				      format_len, format_ptr->format_str);
6848c965db44STomer Tayar 	}
6849c965db44STomer Tayar 
6850a3f72307SDenis Bolotin 	meta->is_allocated = true;
6851c965db44STomer Tayar 	return DBG_STATUS_OK;
6852c965db44STomer Tayar }
6853c965db44STomer Tayar 
685450bc60cbSMichal Kalderon /* Parses an MCP trace buffer. If result_buf is not NULL, the MCP Trace results
685550bc60cbSMichal Kalderon  * are printed to it. The parsing status is returned.
685650bc60cbSMichal Kalderon  * Arguments:
685750bc60cbSMichal Kalderon  * trace_buf - MCP trace cyclic buffer
685850bc60cbSMichal Kalderon  * trace_buf_size - MCP trace cyclic buffer size in bytes
685950bc60cbSMichal Kalderon  * data_offset - offset in bytes of the data to parse in the MCP trace cyclic
686050bc60cbSMichal Kalderon  *		 buffer.
686150bc60cbSMichal Kalderon  * data_size - size in bytes of data to parse.
686250bc60cbSMichal Kalderon  * parsed_buf - destination buffer for parsed data.
6863a3f72307SDenis Bolotin  * parsed_results_bytes - size of parsed data in bytes.
686450bc60cbSMichal Kalderon  */
qed_parse_mcp_trace_buf(struct qed_hwfn * p_hwfn,u8 * trace_buf,u32 trace_buf_size,u32 data_offset,u32 data_size,char * parsed_buf,u32 * parsed_results_bytes)6865a3f72307SDenis Bolotin static enum dbg_status qed_parse_mcp_trace_buf(struct qed_hwfn *p_hwfn,
6866a3f72307SDenis Bolotin 					       u8 *trace_buf,
686750bc60cbSMichal Kalderon 					       u32 trace_buf_size,
686850bc60cbSMichal Kalderon 					       u32 data_offset,
686950bc60cbSMichal Kalderon 					       u32 data_size,
687050bc60cbSMichal Kalderon 					       char *parsed_buf,
6871a3f72307SDenis Bolotin 					       u32 *parsed_results_bytes)
687250bc60cbSMichal Kalderon {
6873a3f72307SDenis Bolotin 	struct dbg_tools_user_data *dev_user_data;
6874a3f72307SDenis Bolotin 	struct mcp_trace_meta *meta;
687550bc60cbSMichal Kalderon 	u32 param_mask, param_shift;
687650bc60cbSMichal Kalderon 	enum dbg_status status;
687750bc60cbSMichal Kalderon 
6878a3f72307SDenis Bolotin 	dev_user_data = qed_dbg_get_user_data(p_hwfn);
6879a3f72307SDenis Bolotin 	meta = &dev_user_data->mcp_trace_meta;
6880a3f72307SDenis Bolotin 	*parsed_results_bytes = 0;
688150bc60cbSMichal Kalderon 
6882a3f72307SDenis Bolotin 	if (!meta->is_allocated)
688350bc60cbSMichal Kalderon 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
688450bc60cbSMichal Kalderon 
688550bc60cbSMichal Kalderon 	status = DBG_STATUS_OK;
688650bc60cbSMichal Kalderon 
688750bc60cbSMichal Kalderon 	while (data_size) {
688850bc60cbSMichal Kalderon 		struct mcp_trace_format *format_ptr;
688950bc60cbSMichal Kalderon 		u8 format_level, format_module;
689050bc60cbSMichal Kalderon 		u32 params[3] = { 0, 0, 0 };
689150bc60cbSMichal Kalderon 		u32 header, format_idx, i;
689250bc60cbSMichal Kalderon 
689350bc60cbSMichal Kalderon 		if (data_size < MFW_TRACE_ENTRY_SIZE)
689450bc60cbSMichal Kalderon 			return DBG_STATUS_MCP_TRACE_BAD_DATA;
689550bc60cbSMichal Kalderon 
689650bc60cbSMichal Kalderon 		header = qed_read_from_cyclic_buf(trace_buf,
689750bc60cbSMichal Kalderon 						  &data_offset,
689850bc60cbSMichal Kalderon 						  trace_buf_size,
689950bc60cbSMichal Kalderon 						  MFW_TRACE_ENTRY_SIZE);
690050bc60cbSMichal Kalderon 		data_size -= MFW_TRACE_ENTRY_SIZE;
690150bc60cbSMichal Kalderon 		format_idx = header & MFW_TRACE_EVENTID_MASK;
690250bc60cbSMichal Kalderon 
690350bc60cbSMichal Kalderon 		/* Skip message if its index doesn't exist in the meta data */
6904a3f72307SDenis Bolotin 		if (format_idx >= meta->formats_num) {
69052d22bc83SMichal Kalderon 			u8 format_size = (u8)GET_MFW_FIELD(header,
69062d22bc83SMichal Kalderon 							   MFW_TRACE_PRM_SIZE);
690750bc60cbSMichal Kalderon 
690850bc60cbSMichal Kalderon 			if (data_size < format_size)
690950bc60cbSMichal Kalderon 				return DBG_STATUS_MCP_TRACE_BAD_DATA;
691050bc60cbSMichal Kalderon 
691150bc60cbSMichal Kalderon 			data_offset = qed_cyclic_add(data_offset,
691250bc60cbSMichal Kalderon 						     format_size,
691350bc60cbSMichal Kalderon 						     trace_buf_size);
691450bc60cbSMichal Kalderon 			data_size -= format_size;
691550bc60cbSMichal Kalderon 			continue;
691650bc60cbSMichal Kalderon 		}
691750bc60cbSMichal Kalderon 
6918a3f72307SDenis Bolotin 		format_ptr = &meta->formats[format_idx];
691950bc60cbSMichal Kalderon 
692050bc60cbSMichal Kalderon 		for (i = 0,
69212d22bc83SMichal Kalderon 		     param_mask = MCP_TRACE_FORMAT_P1_SIZE_MASK, param_shift =
69222d22bc83SMichal Kalderon 		     MCP_TRACE_FORMAT_P1_SIZE_OFFSET;
692350bc60cbSMichal Kalderon 		     i < MCP_TRACE_FORMAT_MAX_PARAMS;
69242d22bc83SMichal Kalderon 		     i++, param_mask <<= MCP_TRACE_FORMAT_PARAM_WIDTH,
692550bc60cbSMichal Kalderon 		     param_shift += MCP_TRACE_FORMAT_PARAM_WIDTH) {
692650bc60cbSMichal Kalderon 			/* Extract param size (0..3) */
692750bc60cbSMichal Kalderon 			u8 param_size = (u8)((format_ptr->data & param_mask) >>
692850bc60cbSMichal Kalderon 					     param_shift);
692950bc60cbSMichal Kalderon 
693050bc60cbSMichal Kalderon 			/* If the param size is zero, there are no other
693150bc60cbSMichal Kalderon 			 * parameters.
693250bc60cbSMichal Kalderon 			 */
693350bc60cbSMichal Kalderon 			if (!param_size)
693450bc60cbSMichal Kalderon 				break;
693550bc60cbSMichal Kalderon 
693650bc60cbSMichal Kalderon 			/* Size is encoded using 2 bits, where 3 is used to
693750bc60cbSMichal Kalderon 			 * encode 4.
693850bc60cbSMichal Kalderon 			 */
693950bc60cbSMichal Kalderon 			if (param_size == 3)
694050bc60cbSMichal Kalderon 				param_size = 4;
694150bc60cbSMichal Kalderon 
694250bc60cbSMichal Kalderon 			if (data_size < param_size)
694350bc60cbSMichal Kalderon 				return DBG_STATUS_MCP_TRACE_BAD_DATA;
694450bc60cbSMichal Kalderon 
694550bc60cbSMichal Kalderon 			params[i] = qed_read_from_cyclic_buf(trace_buf,
694650bc60cbSMichal Kalderon 							     &data_offset,
694750bc60cbSMichal Kalderon 							     trace_buf_size,
694850bc60cbSMichal Kalderon 							     param_size);
694950bc60cbSMichal Kalderon 			data_size -= param_size;
695050bc60cbSMichal Kalderon 		}
695150bc60cbSMichal Kalderon 
69522d22bc83SMichal Kalderon 		format_level = (u8)GET_MFW_FIELD(format_ptr->data,
69532d22bc83SMichal Kalderon 						 MCP_TRACE_FORMAT_LEVEL);
69542d22bc83SMichal Kalderon 		format_module = (u8)GET_MFW_FIELD(format_ptr->data,
69552d22bc83SMichal Kalderon 						  MCP_TRACE_FORMAT_MODULE);
695650bc60cbSMichal Kalderon 		if (format_level >= ARRAY_SIZE(s_mcp_trace_level_str))
695750bc60cbSMichal Kalderon 			return DBG_STATUS_MCP_TRACE_BAD_DATA;
695850bc60cbSMichal Kalderon 
695950bc60cbSMichal Kalderon 		/* Print current message to results buffer */
6960a3f72307SDenis Bolotin 		*parsed_results_bytes +=
6961a3f72307SDenis Bolotin 			sprintf(qed_get_buf_ptr(parsed_buf,
6962a3f72307SDenis Bolotin 						*parsed_results_bytes),
696350bc60cbSMichal Kalderon 				"%s %-8s: ",
696450bc60cbSMichal Kalderon 				s_mcp_trace_level_str[format_level],
6965a3f72307SDenis Bolotin 				meta->modules[format_module]);
6966a3f72307SDenis Bolotin 		*parsed_results_bytes +=
6967a3f72307SDenis Bolotin 		    sprintf(qed_get_buf_ptr(parsed_buf, *parsed_results_bytes),
696850bc60cbSMichal Kalderon 			    format_ptr->format_str,
696950bc60cbSMichal Kalderon 			    params[0], params[1], params[2]);
697050bc60cbSMichal Kalderon 	}
697150bc60cbSMichal Kalderon 
697250bc60cbSMichal Kalderon 	/* Add string NULL terminator */
6973a3f72307SDenis Bolotin 	(*parsed_results_bytes)++;
697450bc60cbSMichal Kalderon 
697550bc60cbSMichal Kalderon 	return status;
697650bc60cbSMichal Kalderon }
697750bc60cbSMichal Kalderon 
6978c965db44STomer Tayar /* Parses an MCP Trace dump buffer.
6979c965db44STomer Tayar  * If result_buf is not NULL, the MCP Trace results are printed to it.
6980c965db44STomer Tayar  * In any case, the required results buffer size is assigned to
6981a3f72307SDenis Bolotin  * parsed_results_bytes.
6982c965db44STomer Tayar  * The parsing status is returned.
6983c965db44STomer Tayar  */
qed_parse_mcp_trace_dump(struct qed_hwfn * p_hwfn,u32 * dump_buf,char * results_buf,u32 * parsed_results_bytes,bool free_meta_data)6984c965db44STomer Tayar static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn,
6985c965db44STomer Tayar 						u32 *dump_buf,
6986a3f72307SDenis Bolotin 						char *results_buf,
6987a3f72307SDenis Bolotin 						u32 *parsed_results_bytes,
6988a3f72307SDenis Bolotin 						bool free_meta_data)
6989c965db44STomer Tayar {
6990c965db44STomer Tayar 	const char *section_name, *param_name, *param_str_val;
699150bc60cbSMichal Kalderon 	u32 data_size, trace_data_dwords, trace_meta_dwords;
6992a3f72307SDenis Bolotin 	u32 offset, results_offset, results_buf_bytes;
699350bc60cbSMichal Kalderon 	u32 param_num_val, num_section_params;
6994c965db44STomer Tayar 	struct mcp_trace *trace;
6995c965db44STomer Tayar 	enum dbg_status status;
6996c965db44STomer Tayar 	const u32 *meta_buf;
6997c965db44STomer Tayar 	u8 *trace_buf;
6998c965db44STomer Tayar 
6999a3f72307SDenis Bolotin 	*parsed_results_bytes = 0;
7000c965db44STomer Tayar 
7001c965db44STomer Tayar 	/* Read global_params section */
7002c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
7003c965db44STomer Tayar 					 &section_name, &num_section_params);
7004c965db44STomer Tayar 	if (strcmp(section_name, "global_params"))
7005c965db44STomer Tayar 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
7006c965db44STomer Tayar 
7007c965db44STomer Tayar 	/* Print global params */
7008c965db44STomer Tayar 	dump_buf += qed_print_section_params(dump_buf,
7009c965db44STomer Tayar 					     num_section_params,
7010a3f72307SDenis Bolotin 					     results_buf, &results_offset);
7011c965db44STomer Tayar 
7012c965db44STomer Tayar 	/* Read trace_data section */
7013c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
7014c965db44STomer Tayar 					 &section_name, &num_section_params);
7015c965db44STomer Tayar 	if (strcmp(section_name, "mcp_trace_data") || num_section_params != 1)
7016c965db44STomer Tayar 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
7017c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
7018c965db44STomer Tayar 				   &param_name, &param_str_val, &param_num_val);
7019c965db44STomer Tayar 	if (strcmp(param_name, "size"))
7020c965db44STomer Tayar 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
7021c965db44STomer Tayar 	trace_data_dwords = param_num_val;
7022c965db44STomer Tayar 
7023c965db44STomer Tayar 	/* Prepare trace info */
7024c965db44STomer Tayar 	trace = (struct mcp_trace *)dump_buf;
7025a3f72307SDenis Bolotin 	if (trace->signature != MFW_TRACE_SIGNATURE || !trace->size)
7026a3f72307SDenis Bolotin 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
7027a3f72307SDenis Bolotin 
70287b6859fbSMintz, Yuval 	trace_buf = (u8 *)dump_buf + sizeof(*trace);
7029c965db44STomer Tayar 	offset = trace->trace_oldest;
703050bc60cbSMichal Kalderon 	data_size = qed_cyclic_sub(trace->trace_prod, offset, trace->size);
7031c965db44STomer Tayar 	dump_buf += trace_data_dwords;
7032c965db44STomer Tayar 
7033c965db44STomer Tayar 	/* Read meta_data section */
7034c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
7035c965db44STomer Tayar 					 &section_name, &num_section_params);
7036c965db44STomer Tayar 	if (strcmp(section_name, "mcp_trace_meta"))
7037c965db44STomer Tayar 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
7038c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
7039c965db44STomer Tayar 				   &param_name, &param_str_val, &param_num_val);
70407b6859fbSMintz, Yuval 	if (strcmp(param_name, "size"))
7041c965db44STomer Tayar 		return DBG_STATUS_MCP_TRACE_BAD_DATA;
7042c965db44STomer Tayar 	trace_meta_dwords = param_num_val;
7043c965db44STomer Tayar 
7044c965db44STomer Tayar 	/* Choose meta data buffer */
7045c965db44STomer Tayar 	if (!trace_meta_dwords) {
7046c965db44STomer Tayar 		/* Dump doesn't include meta data */
7047a3f72307SDenis Bolotin 		struct dbg_tools_user_data *dev_user_data =
7048a3f72307SDenis Bolotin 			qed_dbg_get_user_data(p_hwfn);
7049a3f72307SDenis Bolotin 
7050a3f72307SDenis Bolotin 		if (!dev_user_data->mcp_trace_user_meta_buf)
7051c965db44STomer Tayar 			return DBG_STATUS_MCP_TRACE_NO_META;
7052a3f72307SDenis Bolotin 
7053a3f72307SDenis Bolotin 		meta_buf = dev_user_data->mcp_trace_user_meta_buf;
7054c965db44STomer Tayar 	} else {
7055c965db44STomer Tayar 		/* Dump includes meta data */
7056c965db44STomer Tayar 		meta_buf = dump_buf;
7057c965db44STomer Tayar 	}
7058c965db44STomer Tayar 
7059c965db44STomer Tayar 	/* Allocate meta data memory */
7060a3f72307SDenis Bolotin 	status = qed_mcp_trace_alloc_meta_data(p_hwfn, meta_buf);
7061c965db44STomer Tayar 	if (status != DBG_STATUS_OK)
7062c965db44STomer Tayar 		return status;
706350bc60cbSMichal Kalderon 
7064a3f72307SDenis Bolotin 	status = qed_parse_mcp_trace_buf(p_hwfn,
7065a3f72307SDenis Bolotin 					 trace_buf,
706650bc60cbSMichal Kalderon 					 trace->size,
706750bc60cbSMichal Kalderon 					 offset,
706850bc60cbSMichal Kalderon 					 data_size,
7069a3f72307SDenis Bolotin 					 results_buf ?
7070a3f72307SDenis Bolotin 					 results_buf + results_offset :
707150bc60cbSMichal Kalderon 					 NULL,
7072a3f72307SDenis Bolotin 					 &results_buf_bytes);
707350bc60cbSMichal Kalderon 	if (status != DBG_STATUS_OK)
707450bc60cbSMichal Kalderon 		return status;
707550bc60cbSMichal Kalderon 
7076a3f72307SDenis Bolotin 	if (free_meta_data)
7077a3f72307SDenis Bolotin 		qed_mcp_trace_free_meta_data(p_hwfn);
7078a3f72307SDenis Bolotin 
7079a3f72307SDenis Bolotin 	*parsed_results_bytes = results_offset + results_buf_bytes;
708050bc60cbSMichal Kalderon 
708150bc60cbSMichal Kalderon 	return DBG_STATUS_OK;
7082c965db44STomer Tayar }
7083c965db44STomer Tayar 
7084c965db44STomer Tayar /* Parses a Reg FIFO dump buffer.
7085c965db44STomer Tayar  * If result_buf is not NULL, the Reg FIFO results are printed to it.
7086c965db44STomer Tayar  * In any case, the required results buffer size is assigned to
7087c965db44STomer Tayar  * parsed_results_bytes.
7088c965db44STomer Tayar  * The parsing status is returned.
7089c965db44STomer Tayar  */
qed_parse_reg_fifo_dump(u32 * dump_buf,char * results_buf,u32 * parsed_results_bytes)7090da090917STomer Tayar static enum dbg_status qed_parse_reg_fifo_dump(u32 *dump_buf,
7091c965db44STomer Tayar 					       char *results_buf,
7092c965db44STomer Tayar 					       u32 *parsed_results_bytes)
7093c965db44STomer Tayar {
7094c965db44STomer Tayar 	const char *section_name, *param_name, *param_str_val;
70957b6859fbSMintz, Yuval 	u32 param_num_val, num_section_params, num_elements;
7096c965db44STomer Tayar 	struct reg_fifo_element *elements;
70972d22bc83SMichal Kalderon 	u8 i, j, err_code, vf_val;
70987b6859fbSMintz, Yuval 	u32 results_offset = 0;
7099c965db44STomer Tayar 	char vf_str[4];
7100c965db44STomer Tayar 
7101c965db44STomer Tayar 	/* Read global_params section */
7102c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
7103c965db44STomer Tayar 					 &section_name, &num_section_params);
7104c965db44STomer Tayar 	if (strcmp(section_name, "global_params"))
7105c965db44STomer Tayar 		return DBG_STATUS_REG_FIFO_BAD_DATA;
7106c965db44STomer Tayar 
7107c965db44STomer Tayar 	/* Print global params */
7108c965db44STomer Tayar 	dump_buf += qed_print_section_params(dump_buf,
7109c965db44STomer Tayar 					     num_section_params,
7110c965db44STomer Tayar 					     results_buf, &results_offset);
7111c965db44STomer Tayar 
7112c965db44STomer Tayar 	/* Read reg_fifo_data section */
7113c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
7114c965db44STomer Tayar 					 &section_name, &num_section_params);
7115c965db44STomer Tayar 	if (strcmp(section_name, "reg_fifo_data"))
7116c965db44STomer Tayar 		return DBG_STATUS_REG_FIFO_BAD_DATA;
7117c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
7118c965db44STomer Tayar 				   &param_name, &param_str_val, &param_num_val);
7119c965db44STomer Tayar 	if (strcmp(param_name, "size"))
7120c965db44STomer Tayar 		return DBG_STATUS_REG_FIFO_BAD_DATA;
7121c965db44STomer Tayar 	if (param_num_val % REG_FIFO_ELEMENT_DWORDS)
7122c965db44STomer Tayar 		return DBG_STATUS_REG_FIFO_BAD_DATA;
7123c965db44STomer Tayar 	num_elements = param_num_val / REG_FIFO_ELEMENT_DWORDS;
7124c965db44STomer Tayar 	elements = (struct reg_fifo_element *)dump_buf;
7125c965db44STomer Tayar 
7126c965db44STomer Tayar 	/* Decode elements */
7127c965db44STomer Tayar 	for (i = 0; i < num_elements; i++) {
71282d22bc83SMichal Kalderon 		const char *err_msg = NULL;
7129c965db44STomer Tayar 
7130c965db44STomer Tayar 		/* Discover if element belongs to a VF or a PF */
7131c965db44STomer Tayar 		vf_val = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_VF);
7132c965db44STomer Tayar 		if (vf_val == REG_FIFO_ELEMENT_IS_PF_VF_VAL)
7133c965db44STomer Tayar 			sprintf(vf_str, "%s", "N/A");
7134c965db44STomer Tayar 		else
7135c965db44STomer Tayar 			sprintf(vf_str, "%d", vf_val);
7136c965db44STomer Tayar 
71372d22bc83SMichal Kalderon 		/* Find error message */
71382d22bc83SMichal Kalderon 		err_code = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_ERROR);
71392d22bc83SMichal Kalderon 		for (j = 0; j < ARRAY_SIZE(s_reg_fifo_errors) && !err_msg; j++)
71402d22bc83SMichal Kalderon 			if (err_code == s_reg_fifo_errors[j].err_code)
71412d22bc83SMichal Kalderon 				err_msg = s_reg_fifo_errors[j].err_msg;
71422d22bc83SMichal Kalderon 
7143c965db44STomer Tayar 		/* Add parsed element to parsed buffer */
7144c965db44STomer Tayar 		results_offset +=
7145c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
7146c965db44STomer Tayar 					    results_offset),
71472d22bc83SMichal Kalderon 			    "raw: 0x%016llx, address: 0x%07x, access: %-5s, pf: %2d, vf: %s, port: %d, privilege: %-3s, protection: %-12s, master: %-4s, error: %s\n",
7148c965db44STomer Tayar 			    elements[i].data,
7149be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
7150c965db44STomer Tayar 					   REG_FIFO_ELEMENT_ADDRESS) *
7151c965db44STomer Tayar 			    REG_FIFO_ELEMENT_ADDR_FACTOR,
7152c965db44STomer Tayar 			    s_access_strs[GET_FIELD(elements[i].data,
7153c965db44STomer Tayar 						    REG_FIFO_ELEMENT_ACCESS)],
7154be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
71557b6859fbSMintz, Yuval 					   REG_FIFO_ELEMENT_PF),
71567b6859fbSMintz, Yuval 			    vf_str,
7157be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
7158c965db44STomer Tayar 					   REG_FIFO_ELEMENT_PORT),
71597b6859fbSMintz, Yuval 			    s_privilege_strs[GET_FIELD(elements[i].data,
7160c965db44STomer Tayar 						REG_FIFO_ELEMENT_PRIVILEGE)],
7161c965db44STomer Tayar 			    s_protection_strs[GET_FIELD(elements[i].data,
7162c965db44STomer Tayar 						REG_FIFO_ELEMENT_PROTECTION)],
7163c965db44STomer Tayar 			    s_master_strs[GET_FIELD(elements[i].data,
71642d22bc83SMichal Kalderon 						    REG_FIFO_ELEMENT_MASTER)],
71652d22bc83SMichal Kalderon 			    err_msg ? err_msg : "unknown error code");
7166c965db44STomer Tayar 	}
7167c965db44STomer Tayar 
7168c965db44STomer Tayar 	results_offset += sprintf(qed_get_buf_ptr(results_buf,
7169c965db44STomer Tayar 						  results_offset),
7170c965db44STomer Tayar 				  "fifo contained %d elements", num_elements);
7171c965db44STomer Tayar 
7172c965db44STomer Tayar 	/* Add 1 for string NULL termination */
7173c965db44STomer Tayar 	*parsed_results_bytes = results_offset + 1;
71747b6859fbSMintz, Yuval 
7175c965db44STomer Tayar 	return DBG_STATUS_OK;
7176c965db44STomer Tayar }
7177c965db44STomer Tayar 
qed_parse_igu_fifo_element(struct igu_fifo_element * element,char * results_buf,u32 * results_offset)71787b6859fbSMintz, Yuval static enum dbg_status qed_parse_igu_fifo_element(struct igu_fifo_element
71797b6859fbSMintz, Yuval 						  *element, char
71807b6859fbSMintz, Yuval 						  *results_buf,
7181da090917STomer Tayar 						  u32 *results_offset)
7182c965db44STomer Tayar {
71837b6859fbSMintz, Yuval 	const struct igu_fifo_addr_data *found_addr = NULL;
71847b6859fbSMintz, Yuval 	u8 source, err_type, i, is_cleanup;
71857b6859fbSMintz, Yuval 	char parsed_addr_data[32];
71867b6859fbSMintz, Yuval 	char parsed_wr_data[256];
71877b6859fbSMintz, Yuval 	u32 wr_data, prod_cons;
71887b6859fbSMintz, Yuval 	bool is_wr_cmd, is_pf;
71897b6859fbSMintz, Yuval 	u16 cmd_addr;
71907b6859fbSMintz, Yuval 	u64 dword12;
71917b6859fbSMintz, Yuval 
71927b6859fbSMintz, Yuval 	/* Dword12 (dword index 1 and 2) contains bits 32..95 of the
71937b6859fbSMintz, Yuval 	 * FIFO element.
71947b6859fbSMintz, Yuval 	 */
71957b6859fbSMintz, Yuval 	dword12 = ((u64)element->dword2 << 32) | element->dword1;
71967b6859fbSMintz, Yuval 	is_wr_cmd = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD);
71977b6859fbSMintz, Yuval 	is_pf = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_IS_PF);
71987b6859fbSMintz, Yuval 	cmd_addr = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR);
71997b6859fbSMintz, Yuval 	source = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_SOURCE);
72007b6859fbSMintz, Yuval 	err_type = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE);
72017b6859fbSMintz, Yuval 
72027b6859fbSMintz, Yuval 	if (source >= ARRAY_SIZE(s_igu_fifo_source_strs))
72037b6859fbSMintz, Yuval 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
72047b6859fbSMintz, Yuval 	if (err_type >= ARRAY_SIZE(s_igu_fifo_error_strs))
72057b6859fbSMintz, Yuval 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
72067b6859fbSMintz, Yuval 
72077b6859fbSMintz, Yuval 	/* Find address data */
72087b6859fbSMintz, Yuval 	for (i = 0; i < ARRAY_SIZE(s_igu_fifo_addr_data) && !found_addr; i++) {
72097b6859fbSMintz, Yuval 		const struct igu_fifo_addr_data *curr_addr =
72107b6859fbSMintz, Yuval 			&s_igu_fifo_addr_data[i];
72117b6859fbSMintz, Yuval 
72127b6859fbSMintz, Yuval 		if (cmd_addr >= curr_addr->start_addr && cmd_addr <=
72137b6859fbSMintz, Yuval 		    curr_addr->end_addr)
72147b6859fbSMintz, Yuval 			found_addr = curr_addr;
7215c965db44STomer Tayar 	}
7216c965db44STomer Tayar 
72177b6859fbSMintz, Yuval 	if (!found_addr)
72187b6859fbSMintz, Yuval 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
7219c965db44STomer Tayar 
72207b6859fbSMintz, Yuval 	/* Prepare parsed address data */
72217b6859fbSMintz, Yuval 	switch (found_addr->type) {
72227b6859fbSMintz, Yuval 	case IGU_ADDR_TYPE_MSIX_MEM:
72237b6859fbSMintz, Yuval 		sprintf(parsed_addr_data, " vector_num = 0x%x", cmd_addr / 2);
72247b6859fbSMintz, Yuval 		break;
72257b6859fbSMintz, Yuval 	case IGU_ADDR_TYPE_WRITE_INT_ACK:
72267b6859fbSMintz, Yuval 	case IGU_ADDR_TYPE_WRITE_PROD_UPDATE:
72277b6859fbSMintz, Yuval 		sprintf(parsed_addr_data,
72287b6859fbSMintz, Yuval 			" SB = 0x%x", cmd_addr - found_addr->start_addr);
72297b6859fbSMintz, Yuval 		break;
72307b6859fbSMintz, Yuval 	default:
72317b6859fbSMintz, Yuval 		parsed_addr_data[0] = '\0';
72327b6859fbSMintz, Yuval 	}
72337b6859fbSMintz, Yuval 
72347b6859fbSMintz, Yuval 	if (!is_wr_cmd) {
72357b6859fbSMintz, Yuval 		parsed_wr_data[0] = '\0';
72367b6859fbSMintz, Yuval 		goto out;
72377b6859fbSMintz, Yuval 	}
72387b6859fbSMintz, Yuval 
72397b6859fbSMintz, Yuval 	/* Prepare parsed write data */
72407b6859fbSMintz, Yuval 	wr_data = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_WR_DATA);
72417b6859fbSMintz, Yuval 	prod_cons = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_PROD_CONS);
72427b6859fbSMintz, Yuval 	is_cleanup = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_CMD_TYPE);
72437b6859fbSMintz, Yuval 
72447b6859fbSMintz, Yuval 	if (source == IGU_SRC_ATTN) {
72457b6859fbSMintz, Yuval 		sprintf(parsed_wr_data, "prod: 0x%x, ", prod_cons);
72467b6859fbSMintz, Yuval 	} else {
72477b6859fbSMintz, Yuval 		if (is_cleanup) {
72487b6859fbSMintz, Yuval 			u8 cleanup_val, cleanup_type;
72497b6859fbSMintz, Yuval 
72507b6859fbSMintz, Yuval 			cleanup_val =
72517b6859fbSMintz, Yuval 				GET_FIELD(wr_data,
72527b6859fbSMintz, Yuval 					  IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL);
72537b6859fbSMintz, Yuval 			cleanup_type =
72547b6859fbSMintz, Yuval 			    GET_FIELD(wr_data,
72557b6859fbSMintz, Yuval 				      IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE);
72567b6859fbSMintz, Yuval 
72577b6859fbSMintz, Yuval 			sprintf(parsed_wr_data,
72587b6859fbSMintz, Yuval 				"cmd_type: cleanup, cleanup_val: %s, cleanup_type : %d, ",
72597b6859fbSMintz, Yuval 				cleanup_val ? "set" : "clear",
72607b6859fbSMintz, Yuval 				cleanup_type);
72617b6859fbSMintz, Yuval 		} else {
72627b6859fbSMintz, Yuval 			u8 update_flag, en_dis_int_for_sb, segment;
72637b6859fbSMintz, Yuval 			u8 timer_mask;
72647b6859fbSMintz, Yuval 
72657b6859fbSMintz, Yuval 			update_flag = GET_FIELD(wr_data,
72667b6859fbSMintz, Yuval 						IGU_FIFO_WR_DATA_UPDATE_FLAG);
72677b6859fbSMintz, Yuval 			en_dis_int_for_sb =
72687b6859fbSMintz, Yuval 				GET_FIELD(wr_data,
72697b6859fbSMintz, Yuval 					  IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB);
72707b6859fbSMintz, Yuval 			segment = GET_FIELD(wr_data,
72717b6859fbSMintz, Yuval 					    IGU_FIFO_WR_DATA_SEGMENT);
72727b6859fbSMintz, Yuval 			timer_mask = GET_FIELD(wr_data,
72737b6859fbSMintz, Yuval 					       IGU_FIFO_WR_DATA_TIMER_MASK);
72747b6859fbSMintz, Yuval 
72757b6859fbSMintz, Yuval 			sprintf(parsed_wr_data,
72767b6859fbSMintz, Yuval 				"cmd_type: prod/cons update, prod/cons: 0x%x, update_flag: %s, en_dis_int_for_sb : %s, segment : %s, timer_mask = %d, ",
72777b6859fbSMintz, Yuval 				prod_cons,
72787b6859fbSMintz, Yuval 				update_flag ? "update" : "nop",
7279da090917STomer Tayar 				en_dis_int_for_sb ?
7280da090917STomer Tayar 				(en_dis_int_for_sb == 1 ? "disable" : "nop") :
7281da090917STomer Tayar 				"enable",
72827b6859fbSMintz, Yuval 				segment ? "attn" : "regular",
72837b6859fbSMintz, Yuval 				timer_mask);
72847b6859fbSMintz, Yuval 		}
72857b6859fbSMintz, Yuval 	}
72867b6859fbSMintz, Yuval out:
72877b6859fbSMintz, Yuval 	/* Add parsed element to parsed buffer */
72887b6859fbSMintz, Yuval 	*results_offset += sprintf(qed_get_buf_ptr(results_buf,
72897b6859fbSMintz, Yuval 						   *results_offset),
72907b6859fbSMintz, Yuval 				   "raw: 0x%01x%08x%08x, %s: %d, source : %s, type : %s, cmd_addr : 0x%x(%s%s), %serror: %s\n",
72917b6859fbSMintz, Yuval 				   element->dword2, element->dword1,
72927b6859fbSMintz, Yuval 				   element->dword0,
72937b6859fbSMintz, Yuval 				   is_pf ? "pf" : "vf",
72947b6859fbSMintz, Yuval 				   GET_FIELD(element->dword0,
72957b6859fbSMintz, Yuval 					     IGU_FIFO_ELEMENT_DWORD0_FID),
72967b6859fbSMintz, Yuval 				   s_igu_fifo_source_strs[source],
72977b6859fbSMintz, Yuval 				   is_wr_cmd ? "wr" : "rd",
72987b6859fbSMintz, Yuval 				   cmd_addr,
72997b6859fbSMintz, Yuval 				   (!is_pf && found_addr->vf_desc)
73007b6859fbSMintz, Yuval 				   ? found_addr->vf_desc
73017b6859fbSMintz, Yuval 				   : found_addr->desc,
73027b6859fbSMintz, Yuval 				   parsed_addr_data,
73037b6859fbSMintz, Yuval 				   parsed_wr_data,
73047b6859fbSMintz, Yuval 				   s_igu_fifo_error_strs[err_type]);
73057b6859fbSMintz, Yuval 
73067b6859fbSMintz, Yuval 	return DBG_STATUS_OK;
7307c965db44STomer Tayar }
7308c965db44STomer Tayar 
7309c965db44STomer Tayar /* Parses an IGU FIFO dump buffer.
7310c965db44STomer Tayar  * If result_buf is not NULL, the IGU FIFO results are printed to it.
7311c965db44STomer Tayar  * In any case, the required results buffer size is assigned to
7312c965db44STomer Tayar  * parsed_results_bytes.
7313c965db44STomer Tayar  * The parsing status is returned.
7314c965db44STomer Tayar  */
qed_parse_igu_fifo_dump(u32 * dump_buf,char * results_buf,u32 * parsed_results_bytes)7315da090917STomer Tayar static enum dbg_status qed_parse_igu_fifo_dump(u32 *dump_buf,
7316c965db44STomer Tayar 					       char *results_buf,
7317c965db44STomer Tayar 					       u32 *parsed_results_bytes)
7318c965db44STomer Tayar {
7319c965db44STomer Tayar 	const char *section_name, *param_name, *param_str_val;
73207b6859fbSMintz, Yuval 	u32 param_num_val, num_section_params, num_elements;
7321c965db44STomer Tayar 	struct igu_fifo_element *elements;
73227b6859fbSMintz, Yuval 	enum dbg_status status;
73237b6859fbSMintz, Yuval 	u32 results_offset = 0;
73247b6859fbSMintz, Yuval 	u8 i;
7325c965db44STomer Tayar 
7326c965db44STomer Tayar 	/* Read global_params section */
7327c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
7328c965db44STomer Tayar 					 &section_name, &num_section_params);
7329c965db44STomer Tayar 	if (strcmp(section_name, "global_params"))
7330c965db44STomer Tayar 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
7331c965db44STomer Tayar 
7332c965db44STomer Tayar 	/* Print global params */
7333c965db44STomer Tayar 	dump_buf += qed_print_section_params(dump_buf,
7334c965db44STomer Tayar 					     num_section_params,
7335c965db44STomer Tayar 					     results_buf, &results_offset);
7336c965db44STomer Tayar 
7337c965db44STomer Tayar 	/* Read igu_fifo_data section */
7338c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
7339c965db44STomer Tayar 					 &section_name, &num_section_params);
7340c965db44STomer Tayar 	if (strcmp(section_name, "igu_fifo_data"))
7341c965db44STomer Tayar 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
7342c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
7343c965db44STomer Tayar 				   &param_name, &param_str_val, &param_num_val);
7344c965db44STomer Tayar 	if (strcmp(param_name, "size"))
7345c965db44STomer Tayar 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
7346c965db44STomer Tayar 	if (param_num_val % IGU_FIFO_ELEMENT_DWORDS)
7347c965db44STomer Tayar 		return DBG_STATUS_IGU_FIFO_BAD_DATA;
7348c965db44STomer Tayar 	num_elements = param_num_val / IGU_FIFO_ELEMENT_DWORDS;
7349c965db44STomer Tayar 	elements = (struct igu_fifo_element *)dump_buf;
7350c965db44STomer Tayar 
7351c965db44STomer Tayar 	/* Decode elements */
7352c965db44STomer Tayar 	for (i = 0; i < num_elements; i++) {
73537b6859fbSMintz, Yuval 		status = qed_parse_igu_fifo_element(&elements[i],
73547b6859fbSMintz, Yuval 						    results_buf,
7355da090917STomer Tayar 						    &results_offset);
73567b6859fbSMintz, Yuval 		if (status != DBG_STATUS_OK)
73577b6859fbSMintz, Yuval 			return status;
7358c965db44STomer Tayar 	}
7359c965db44STomer Tayar 
7360c965db44STomer Tayar 	results_offset += sprintf(qed_get_buf_ptr(results_buf,
7361c965db44STomer Tayar 						  results_offset),
7362c965db44STomer Tayar 				  "fifo contained %d elements", num_elements);
7363c965db44STomer Tayar 
7364c965db44STomer Tayar 	/* Add 1 for string NULL termination */
7365c965db44STomer Tayar 	*parsed_results_bytes = results_offset + 1;
73667b6859fbSMintz, Yuval 
7367c965db44STomer Tayar 	return DBG_STATUS_OK;
7368c965db44STomer Tayar }
7369c965db44STomer Tayar 
7370c965db44STomer Tayar static enum dbg_status
qed_parse_protection_override_dump(u32 * dump_buf,char * results_buf,u32 * parsed_results_bytes)7371da090917STomer Tayar qed_parse_protection_override_dump(u32 *dump_buf,
7372c965db44STomer Tayar 				   char *results_buf,
7373c965db44STomer Tayar 				   u32 *parsed_results_bytes)
7374c965db44STomer Tayar {
7375c965db44STomer Tayar 	const char *section_name, *param_name, *param_str_val;
73767b6859fbSMintz, Yuval 	u32 param_num_val, num_section_params, num_elements;
7377c965db44STomer Tayar 	struct protection_override_element *elements;
73787b6859fbSMintz, Yuval 	u32 results_offset = 0;
7379c965db44STomer Tayar 	u8 i;
7380c965db44STomer Tayar 
7381c965db44STomer Tayar 	/* Read global_params section */
7382c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
7383c965db44STomer Tayar 					 &section_name, &num_section_params);
7384c965db44STomer Tayar 	if (strcmp(section_name, "global_params"))
7385c965db44STomer Tayar 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
7386c965db44STomer Tayar 
7387c965db44STomer Tayar 	/* Print global params */
7388c965db44STomer Tayar 	dump_buf += qed_print_section_params(dump_buf,
7389c965db44STomer Tayar 					     num_section_params,
7390c965db44STomer Tayar 					     results_buf, &results_offset);
7391c965db44STomer Tayar 
7392c965db44STomer Tayar 	/* Read protection_override_data section */
7393c965db44STomer Tayar 	dump_buf += qed_read_section_hdr(dump_buf,
7394c965db44STomer Tayar 					 &section_name, &num_section_params);
7395c965db44STomer Tayar 	if (strcmp(section_name, "protection_override_data"))
7396c965db44STomer Tayar 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
7397c965db44STomer Tayar 	dump_buf += qed_read_param(dump_buf,
7398c965db44STomer Tayar 				   &param_name, &param_str_val, &param_num_val);
7399c965db44STomer Tayar 	if (strcmp(param_name, "size"))
7400c965db44STomer Tayar 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
74017b6859fbSMintz, Yuval 	if (param_num_val % PROTECTION_OVERRIDE_ELEMENT_DWORDS)
7402c965db44STomer Tayar 		return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
7403c965db44STomer Tayar 	num_elements = param_num_val / PROTECTION_OVERRIDE_ELEMENT_DWORDS;
7404c965db44STomer Tayar 	elements = (struct protection_override_element *)dump_buf;
7405c965db44STomer Tayar 
7406c965db44STomer Tayar 	/* Decode elements */
7407c965db44STomer Tayar 	for (i = 0; i < num_elements; i++) {
7408c965db44STomer Tayar 		u32 address = GET_FIELD(elements[i].data,
7409c965db44STomer Tayar 					PROTECTION_OVERRIDE_ELEMENT_ADDRESS) *
7410c965db44STomer Tayar 			      PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR;
7411c965db44STomer Tayar 
7412c965db44STomer Tayar 		results_offset +=
7413c965db44STomer Tayar 		    sprintf(qed_get_buf_ptr(results_buf,
7414c965db44STomer Tayar 					    results_offset),
7415be086e7cSMintz, Yuval 			    "window %2d, address: 0x%07x, size: %7d regs, read: %d, write: %d, read protection: %-12s, write protection: %-12s\n",
7416c965db44STomer Tayar 			    i, address,
7417be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
7418c965db44STomer Tayar 				      PROTECTION_OVERRIDE_ELEMENT_WINDOW_SIZE),
7419be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
7420c965db44STomer Tayar 				      PROTECTION_OVERRIDE_ELEMENT_READ),
7421be086e7cSMintz, Yuval 			    (u32)GET_FIELD(elements[i].data,
7422c965db44STomer Tayar 				      PROTECTION_OVERRIDE_ELEMENT_WRITE),
7423c965db44STomer Tayar 			    s_protection_strs[GET_FIELD(elements[i].data,
7424c965db44STomer Tayar 				PROTECTION_OVERRIDE_ELEMENT_READ_PROTECTION)],
7425c965db44STomer Tayar 			    s_protection_strs[GET_FIELD(elements[i].data,
7426c965db44STomer Tayar 				PROTECTION_OVERRIDE_ELEMENT_WRITE_PROTECTION)]);
7427c965db44STomer Tayar 	}
7428c965db44STomer Tayar 
7429c965db44STomer Tayar 	results_offset += sprintf(qed_get_buf_ptr(results_buf,
7430c965db44STomer Tayar 						  results_offset),
7431c965db44STomer Tayar 				  "protection override contained %d elements",
7432c965db44STomer Tayar 				  num_elements);
7433c965db44STomer Tayar 
7434c965db44STomer Tayar 	/* Add 1 for string NULL termination */
7435c965db44STomer Tayar 	*parsed_results_bytes = results_offset + 1;
74367b6859fbSMintz, Yuval 
7437c965db44STomer Tayar 	return DBG_STATUS_OK;
7438c965db44STomer Tayar }
7439c965db44STomer Tayar 
74407b6859fbSMintz, Yuval /* Parses a FW Asserts dump buffer.
74417b6859fbSMintz, Yuval  * If result_buf is not NULL, the FW Asserts results are printed to it.
74427b6859fbSMintz, Yuval  * In any case, the required results buffer size is assigned to
74437b6859fbSMintz, Yuval  * parsed_results_bytes.
74447b6859fbSMintz, Yuval  * The parsing status is returned.
74457b6859fbSMintz, Yuval  */
qed_parse_fw_asserts_dump(u32 * dump_buf,char * results_buf,u32 * parsed_results_bytes)7446da090917STomer Tayar static enum dbg_status qed_parse_fw_asserts_dump(u32 *dump_buf,
74477b6859fbSMintz, Yuval 						 char *results_buf,
74487b6859fbSMintz, Yuval 						 u32 *parsed_results_bytes)
74497b6859fbSMintz, Yuval {
74507b6859fbSMintz, Yuval 	u32 num_section_params, param_num_val, i, results_offset = 0;
74517b6859fbSMintz, Yuval 	const char *param_name, *param_str_val, *section_name;
74527b6859fbSMintz, Yuval 	bool last_section_found = false;
74537b6859fbSMintz, Yuval 
74547b6859fbSMintz, Yuval 	*parsed_results_bytes = 0;
74557b6859fbSMintz, Yuval 
74567b6859fbSMintz, Yuval 	/* Read global_params section */
74577b6859fbSMintz, Yuval 	dump_buf += qed_read_section_hdr(dump_buf,
74587b6859fbSMintz, Yuval 					 &section_name, &num_section_params);
74597b6859fbSMintz, Yuval 	if (strcmp(section_name, "global_params"))
74607b6859fbSMintz, Yuval 		return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
74617b6859fbSMintz, Yuval 
74627b6859fbSMintz, Yuval 	/* Print global params */
74637b6859fbSMintz, Yuval 	dump_buf += qed_print_section_params(dump_buf,
74647b6859fbSMintz, Yuval 					     num_section_params,
74657b6859fbSMintz, Yuval 					     results_buf, &results_offset);
74667b6859fbSMintz, Yuval 
74677b6859fbSMintz, Yuval 	while (!last_section_found) {
74687b6859fbSMintz, Yuval 		dump_buf += qed_read_section_hdr(dump_buf,
74697b6859fbSMintz, Yuval 						 &section_name,
74707b6859fbSMintz, Yuval 						 &num_section_params);
74717b6859fbSMintz, Yuval 		if (!strcmp(section_name, "fw_asserts")) {
74727b6859fbSMintz, Yuval 			/* Extract params */
74737b6859fbSMintz, Yuval 			const char *storm_letter = NULL;
74747b6859fbSMintz, Yuval 			u32 storm_dump_size = 0;
74757b6859fbSMintz, Yuval 
74767b6859fbSMintz, Yuval 			for (i = 0; i < num_section_params; i++) {
74777b6859fbSMintz, Yuval 				dump_buf += qed_read_param(dump_buf,
74787b6859fbSMintz, Yuval 							   &param_name,
74797b6859fbSMintz, Yuval 							   &param_str_val,
74807b6859fbSMintz, Yuval 							   &param_num_val);
74817b6859fbSMintz, Yuval 				if (!strcmp(param_name, "storm"))
74827b6859fbSMintz, Yuval 					storm_letter = param_str_val;
74837b6859fbSMintz, Yuval 				else if (!strcmp(param_name, "size"))
74847b6859fbSMintz, Yuval 					storm_dump_size = param_num_val;
74857b6859fbSMintz, Yuval 				else
74867b6859fbSMintz, Yuval 					return
74877b6859fbSMintz, Yuval 					    DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
74887b6859fbSMintz, Yuval 			}
74897b6859fbSMintz, Yuval 
74907b6859fbSMintz, Yuval 			if (!storm_letter || !storm_dump_size)
74917b6859fbSMintz, Yuval 				return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
74927b6859fbSMintz, Yuval 
74937b6859fbSMintz, Yuval 			/* Print data */
74947b6859fbSMintz, Yuval 			results_offset +=
74957b6859fbSMintz, Yuval 			    sprintf(qed_get_buf_ptr(results_buf,
74967b6859fbSMintz, Yuval 						    results_offset),
74977b6859fbSMintz, Yuval 				    "\n%sSTORM_ASSERT: size=%d\n",
74987b6859fbSMintz, Yuval 				    storm_letter, storm_dump_size);
74997b6859fbSMintz, Yuval 			for (i = 0; i < storm_dump_size; i++, dump_buf++)
75007b6859fbSMintz, Yuval 				results_offset +=
75017b6859fbSMintz, Yuval 				    sprintf(qed_get_buf_ptr(results_buf,
75027b6859fbSMintz, Yuval 							    results_offset),
75037b6859fbSMintz, Yuval 					    "%08x\n", *dump_buf);
75047b6859fbSMintz, Yuval 		} else if (!strcmp(section_name, "last")) {
75057b6859fbSMintz, Yuval 			last_section_found = true;
75067b6859fbSMintz, Yuval 		} else {
75077b6859fbSMintz, Yuval 			return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
75087b6859fbSMintz, Yuval 		}
75097b6859fbSMintz, Yuval 	}
75107b6859fbSMintz, Yuval 
75117b6859fbSMintz, Yuval 	/* Add 1 for string NULL termination */
75127b6859fbSMintz, Yuval 	*parsed_results_bytes = results_offset + 1;
75137b6859fbSMintz, Yuval 
75147b6859fbSMintz, Yuval 	return DBG_STATUS_OK;
75157b6859fbSMintz, Yuval }
75167b6859fbSMintz, Yuval 
75177b6859fbSMintz, Yuval /***************************** Public Functions *******************************/
75187b6859fbSMintz, Yuval 
qed_dbg_user_set_bin_ptr(struct qed_hwfn * p_hwfn,const u8 * const bin_ptr)75192d22bc83SMichal Kalderon enum dbg_status qed_dbg_user_set_bin_ptr(struct qed_hwfn *p_hwfn,
75202d22bc83SMichal Kalderon 					 const u8 * const bin_ptr)
75217b6859fbSMintz, Yuval {
75222d22bc83SMichal Kalderon 	struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr;
75237b6859fbSMintz, Yuval 	u8 buf_id;
75247b6859fbSMintz, Yuval 
75257b6859fbSMintz, Yuval 	/* Convert binary data to debug arrays */
75262d22bc83SMichal Kalderon 	for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++)
75272d22bc83SMichal Kalderon 		qed_set_dbg_bin_buf(p_hwfn,
75282d22bc83SMichal Kalderon 				    (enum bin_dbg_buffer_type)buf_id,
75292d22bc83SMichal Kalderon 				    (u32 *)(bin_ptr + buf_hdrs[buf_id].offset),
75302d22bc83SMichal Kalderon 				    buf_hdrs[buf_id].length);
75317b6859fbSMintz, Yuval 
75327b6859fbSMintz, Yuval 	return DBG_STATUS_OK;
75337b6859fbSMintz, Yuval }
75347b6859fbSMintz, Yuval 
qed_dbg_alloc_user_data(struct qed_hwfn * p_hwfn,void ** user_data_ptr)75352d22bc83SMichal Kalderon enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn,
75362d22bc83SMichal Kalderon 					void **user_data_ptr)
7537a3f72307SDenis Bolotin {
75382d22bc83SMichal Kalderon 	*user_data_ptr = kzalloc(sizeof(struct dbg_tools_user_data),
7539a3f72307SDenis Bolotin 				 GFP_KERNEL);
75402d22bc83SMichal Kalderon 	if (!(*user_data_ptr))
7541a3f72307SDenis Bolotin 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
7542a3f72307SDenis Bolotin 
7543a3f72307SDenis Bolotin 	return DBG_STATUS_OK;
7544a3f72307SDenis Bolotin }
7545a3f72307SDenis Bolotin 
qed_dbg_get_status_str(enum dbg_status status)75467b6859fbSMintz, Yuval const char *qed_dbg_get_status_str(enum dbg_status status)
75477b6859fbSMintz, Yuval {
75487b6859fbSMintz, Yuval 	return (status <
75497b6859fbSMintz, Yuval 		MAX_DBG_STATUS) ? s_status_str[status] : "Invalid debug status";
75507b6859fbSMintz, Yuval }
75517b6859fbSMintz, Yuval 
qed_get_idle_chk_results_buf_size(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,u32 * results_buf_size)75527b6859fbSMintz, Yuval enum dbg_status qed_get_idle_chk_results_buf_size(struct qed_hwfn *p_hwfn,
75537b6859fbSMintz, Yuval 						  u32 *dump_buf,
75547b6859fbSMintz, Yuval 						  u32 num_dumped_dwords,
75557b6859fbSMintz, Yuval 						  u32 *results_buf_size)
75567b6859fbSMintz, Yuval {
75577b6859fbSMintz, Yuval 	u32 num_errors, num_warnings;
75587b6859fbSMintz, Yuval 
75592d22bc83SMichal Kalderon 	return qed_parse_idle_chk_dump(p_hwfn,
75602d22bc83SMichal Kalderon 				       dump_buf,
75617b6859fbSMintz, Yuval 				       num_dumped_dwords,
75627b6859fbSMintz, Yuval 				       NULL,
75637b6859fbSMintz, Yuval 				       results_buf_size,
75647b6859fbSMintz, Yuval 				       &num_errors, &num_warnings);
75657b6859fbSMintz, Yuval }
75667b6859fbSMintz, Yuval 
qed_print_idle_chk_results(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,char * results_buf,u32 * num_errors,u32 * num_warnings)75677b6859fbSMintz, Yuval enum dbg_status qed_print_idle_chk_results(struct qed_hwfn *p_hwfn,
75687b6859fbSMintz, Yuval 					   u32 *dump_buf,
75697b6859fbSMintz, Yuval 					   u32 num_dumped_dwords,
75707b6859fbSMintz, Yuval 					   char *results_buf,
7571da090917STomer Tayar 					   u32 *num_errors,
7572da090917STomer Tayar 					   u32 *num_warnings)
75737b6859fbSMintz, Yuval {
75747b6859fbSMintz, Yuval 	u32 parsed_buf_size;
75757b6859fbSMintz, Yuval 
75762d22bc83SMichal Kalderon 	return qed_parse_idle_chk_dump(p_hwfn,
75772d22bc83SMichal Kalderon 				       dump_buf,
75787b6859fbSMintz, Yuval 				       num_dumped_dwords,
75797b6859fbSMintz, Yuval 				       results_buf,
75807b6859fbSMintz, Yuval 				       &parsed_buf_size,
75817b6859fbSMintz, Yuval 				       num_errors, num_warnings);
75827b6859fbSMintz, Yuval }
75837b6859fbSMintz, Yuval 
qed_dbg_mcp_trace_set_meta_data(struct qed_hwfn * p_hwfn,const u32 * meta_buf)7584a3f72307SDenis Bolotin void qed_dbg_mcp_trace_set_meta_data(struct qed_hwfn *p_hwfn,
7585a3f72307SDenis Bolotin 				     const u32 *meta_buf)
75867b6859fbSMintz, Yuval {
7587a3f72307SDenis Bolotin 	struct dbg_tools_user_data *dev_user_data =
7588a3f72307SDenis Bolotin 		qed_dbg_get_user_data(p_hwfn);
7589a3f72307SDenis Bolotin 
7590a3f72307SDenis Bolotin 	dev_user_data->mcp_trace_user_meta_buf = meta_buf;
75917b6859fbSMintz, Yuval }
75927b6859fbSMintz, Yuval 
qed_get_mcp_trace_results_buf_size(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,u32 * results_buf_size)75937b6859fbSMintz, Yuval enum dbg_status qed_get_mcp_trace_results_buf_size(struct qed_hwfn *p_hwfn,
75947b6859fbSMintz, Yuval 						   u32 *dump_buf,
75957b6859fbSMintz, Yuval 						   u32 num_dumped_dwords,
75967b6859fbSMintz, Yuval 						   u32 *results_buf_size)
75977b6859fbSMintz, Yuval {
75987b6859fbSMintz, Yuval 	return qed_parse_mcp_trace_dump(p_hwfn,
7599a3f72307SDenis Bolotin 					dump_buf, NULL, results_buf_size, true);
76007b6859fbSMintz, Yuval }
76017b6859fbSMintz, Yuval 
qed_print_mcp_trace_results(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,char * results_buf)76027b6859fbSMintz, Yuval enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn,
76037b6859fbSMintz, Yuval 					    u32 *dump_buf,
76047b6859fbSMintz, Yuval 					    u32 num_dumped_dwords,
76057b6859fbSMintz, Yuval 					    char *results_buf)
76067b6859fbSMintz, Yuval {
76077b6859fbSMintz, Yuval 	u32 parsed_buf_size;
76087b6859fbSMintz, Yuval 
76096c95dd8fSPrabhakar Kushwaha 	/* Doesn't do anything, needed for compile time asserts */
76106c95dd8fSPrabhakar Kushwaha 	qed_user_static_asserts();
76116c95dd8fSPrabhakar Kushwaha 
76127b6859fbSMintz, Yuval 	return qed_parse_mcp_trace_dump(p_hwfn,
76137b6859fbSMintz, Yuval 					dump_buf,
7614a3f72307SDenis Bolotin 					results_buf, &parsed_buf_size, true);
76157b6859fbSMintz, Yuval }
76167b6859fbSMintz, Yuval 
qed_print_mcp_trace_results_cont(struct qed_hwfn * p_hwfn,u32 * dump_buf,char * results_buf)7617a3f72307SDenis Bolotin enum dbg_status qed_print_mcp_trace_results_cont(struct qed_hwfn *p_hwfn,
7618a3f72307SDenis Bolotin 						 u32 *dump_buf,
7619a3f72307SDenis Bolotin 						 char *results_buf)
7620a3f72307SDenis Bolotin {
7621a3f72307SDenis Bolotin 	u32 parsed_buf_size;
7622a3f72307SDenis Bolotin 
7623a3f72307SDenis Bolotin 	return qed_parse_mcp_trace_dump(p_hwfn, dump_buf, results_buf,
7624a3f72307SDenis Bolotin 					&parsed_buf_size, false);
7625a3f72307SDenis Bolotin }
7626a3f72307SDenis Bolotin 
qed_print_mcp_trace_line(struct qed_hwfn * p_hwfn,u8 * dump_buf,u32 num_dumped_bytes,char * results_buf)7627a3f72307SDenis Bolotin enum dbg_status qed_print_mcp_trace_line(struct qed_hwfn *p_hwfn,
7628a3f72307SDenis Bolotin 					 u8 *dump_buf,
762950bc60cbSMichal Kalderon 					 u32 num_dumped_bytes,
763050bc60cbSMichal Kalderon 					 char *results_buf)
763150bc60cbSMichal Kalderon {
7632a3f72307SDenis Bolotin 	u32 parsed_results_bytes;
763350bc60cbSMichal Kalderon 
7634a3f72307SDenis Bolotin 	return qed_parse_mcp_trace_buf(p_hwfn,
7635a3f72307SDenis Bolotin 				       dump_buf,
763650bc60cbSMichal Kalderon 				       num_dumped_bytes,
763750bc60cbSMichal Kalderon 				       0,
763850bc60cbSMichal Kalderon 				       num_dumped_bytes,
7639a3f72307SDenis Bolotin 				       results_buf, &parsed_results_bytes);
7640a3f72307SDenis Bolotin }
7641a3f72307SDenis Bolotin 
7642a3f72307SDenis Bolotin /* Frees the specified MCP Trace meta data */
qed_mcp_trace_free_meta_data(struct qed_hwfn * p_hwfn)7643a3f72307SDenis Bolotin void qed_mcp_trace_free_meta_data(struct qed_hwfn *p_hwfn)
7644a3f72307SDenis Bolotin {
7645a3f72307SDenis Bolotin 	struct dbg_tools_user_data *dev_user_data;
7646a3f72307SDenis Bolotin 	struct mcp_trace_meta *meta;
7647a3f72307SDenis Bolotin 	u32 i;
7648a3f72307SDenis Bolotin 
7649a3f72307SDenis Bolotin 	dev_user_data = qed_dbg_get_user_data(p_hwfn);
7650a3f72307SDenis Bolotin 	meta = &dev_user_data->mcp_trace_meta;
7651a3f72307SDenis Bolotin 	if (!meta->is_allocated)
7652a3f72307SDenis Bolotin 		return;
7653a3f72307SDenis Bolotin 
7654a3f72307SDenis Bolotin 	/* Release modules */
7655a3f72307SDenis Bolotin 	if (meta->modules) {
7656a3f72307SDenis Bolotin 		for (i = 0; i < meta->modules_num; i++)
7657a3f72307SDenis Bolotin 			kfree(meta->modules[i]);
7658a3f72307SDenis Bolotin 		kfree(meta->modules);
7659a3f72307SDenis Bolotin 	}
7660a3f72307SDenis Bolotin 
7661a3f72307SDenis Bolotin 	/* Release formats */
7662a3f72307SDenis Bolotin 	if (meta->formats) {
7663a3f72307SDenis Bolotin 		for (i = 0; i < meta->formats_num; i++)
7664a3f72307SDenis Bolotin 			kfree(meta->formats[i].format_str);
7665a3f72307SDenis Bolotin 		kfree(meta->formats);
7666a3f72307SDenis Bolotin 	}
7667a3f72307SDenis Bolotin 
7668a3f72307SDenis Bolotin 	meta->is_allocated = false;
766950bc60cbSMichal Kalderon }
767050bc60cbSMichal Kalderon 
qed_get_reg_fifo_results_buf_size(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,u32 * results_buf_size)76717b6859fbSMintz, Yuval enum dbg_status qed_get_reg_fifo_results_buf_size(struct qed_hwfn *p_hwfn,
76727b6859fbSMintz, Yuval 						  u32 *dump_buf,
76737b6859fbSMintz, Yuval 						  u32 num_dumped_dwords,
76747b6859fbSMintz, Yuval 						  u32 *results_buf_size)
76757b6859fbSMintz, Yuval {
7676da090917STomer Tayar 	return qed_parse_reg_fifo_dump(dump_buf, NULL, results_buf_size);
76777b6859fbSMintz, Yuval }
76787b6859fbSMintz, Yuval 
qed_print_reg_fifo_results(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,char * results_buf)76797b6859fbSMintz, Yuval enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn,
76807b6859fbSMintz, Yuval 					   u32 *dump_buf,
76817b6859fbSMintz, Yuval 					   u32 num_dumped_dwords,
76827b6859fbSMintz, Yuval 					   char *results_buf)
76837b6859fbSMintz, Yuval {
76847b6859fbSMintz, Yuval 	u32 parsed_buf_size;
76857b6859fbSMintz, Yuval 
7686da090917STomer Tayar 	return qed_parse_reg_fifo_dump(dump_buf, results_buf, &parsed_buf_size);
76877b6859fbSMintz, Yuval }
76887b6859fbSMintz, Yuval 
qed_get_igu_fifo_results_buf_size(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,u32 * results_buf_size)76897b6859fbSMintz, Yuval enum dbg_status qed_get_igu_fifo_results_buf_size(struct qed_hwfn *p_hwfn,
76907b6859fbSMintz, Yuval 						  u32 *dump_buf,
76917b6859fbSMintz, Yuval 						  u32 num_dumped_dwords,
76927b6859fbSMintz, Yuval 						  u32 *results_buf_size)
76937b6859fbSMintz, Yuval {
7694da090917STomer Tayar 	return qed_parse_igu_fifo_dump(dump_buf, NULL, results_buf_size);
76957b6859fbSMintz, Yuval }
76967b6859fbSMintz, Yuval 
qed_print_igu_fifo_results(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,char * results_buf)76977b6859fbSMintz, Yuval enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn,
76987b6859fbSMintz, Yuval 					   u32 *dump_buf,
76997b6859fbSMintz, Yuval 					   u32 num_dumped_dwords,
77007b6859fbSMintz, Yuval 					   char *results_buf)
77017b6859fbSMintz, Yuval {
77027b6859fbSMintz, Yuval 	u32 parsed_buf_size;
77037b6859fbSMintz, Yuval 
7704da090917STomer Tayar 	return qed_parse_igu_fifo_dump(dump_buf, results_buf, &parsed_buf_size);
77057b6859fbSMintz, Yuval }
77067b6859fbSMintz, Yuval 
7707c965db44STomer Tayar enum dbg_status
qed_get_protection_override_results_buf_size(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,u32 * results_buf_size)7708c965db44STomer Tayar qed_get_protection_override_results_buf_size(struct qed_hwfn *p_hwfn,
7709c965db44STomer Tayar 					     u32 *dump_buf,
7710c965db44STomer Tayar 					     u32 num_dumped_dwords,
7711c965db44STomer Tayar 					     u32 *results_buf_size)
7712c965db44STomer Tayar {
7713da090917STomer Tayar 	return qed_parse_protection_override_dump(dump_buf,
7714c965db44STomer Tayar 						  NULL, results_buf_size);
7715c965db44STomer Tayar }
7716c965db44STomer Tayar 
qed_print_protection_override_results(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,char * results_buf)7717c965db44STomer Tayar enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn,
7718c965db44STomer Tayar 						      u32 *dump_buf,
7719c965db44STomer Tayar 						      u32 num_dumped_dwords,
7720c965db44STomer Tayar 						      char *results_buf)
7721c965db44STomer Tayar {
7722c965db44STomer Tayar 	u32 parsed_buf_size;
7723c965db44STomer Tayar 
7724da090917STomer Tayar 	return qed_parse_protection_override_dump(dump_buf,
7725c965db44STomer Tayar 						  results_buf,
7726c965db44STomer Tayar 						  &parsed_buf_size);
7727c965db44STomer Tayar }
7728c965db44STomer Tayar 
qed_get_fw_asserts_results_buf_size(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,u32 * results_buf_size)7729c965db44STomer Tayar enum dbg_status qed_get_fw_asserts_results_buf_size(struct qed_hwfn *p_hwfn,
7730c965db44STomer Tayar 						    u32 *dump_buf,
7731c965db44STomer Tayar 						    u32 num_dumped_dwords,
7732c965db44STomer Tayar 						    u32 *results_buf_size)
7733c965db44STomer Tayar {
7734da090917STomer Tayar 	return qed_parse_fw_asserts_dump(dump_buf, NULL, results_buf_size);
7735c965db44STomer Tayar }
7736c965db44STomer Tayar 
qed_print_fw_asserts_results(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,char * results_buf)7737c965db44STomer Tayar enum dbg_status qed_print_fw_asserts_results(struct qed_hwfn *p_hwfn,
7738c965db44STomer Tayar 					     u32 *dump_buf,
7739c965db44STomer Tayar 					     u32 num_dumped_dwords,
7740c965db44STomer Tayar 					     char *results_buf)
7741c965db44STomer Tayar {
7742c965db44STomer Tayar 	u32 parsed_buf_size;
7743c965db44STomer Tayar 
7744da090917STomer Tayar 	return qed_parse_fw_asserts_dump(dump_buf,
7745c965db44STomer Tayar 					 results_buf, &parsed_buf_size);
7746c965db44STomer Tayar }
7747c965db44STomer Tayar 
qed_dbg_parse_attn(struct qed_hwfn * p_hwfn,struct dbg_attn_block_result * results)77480ebbd1c8SMintz, Yuval enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn,
77490ebbd1c8SMintz, Yuval 				   struct dbg_attn_block_result *results)
77500ebbd1c8SMintz, Yuval {
77510ebbd1c8SMintz, Yuval 	const u32 *block_attn_name_offsets;
77522d22bc83SMichal Kalderon 	const char *attn_name_base;
77530ebbd1c8SMintz, Yuval 	const char *block_name;
77542d22bc83SMichal Kalderon 	enum dbg_attn_type attn_type;
77550ebbd1c8SMintz, Yuval 	u8 num_regs, i, j;
77560ebbd1c8SMintz, Yuval 
77570ebbd1c8SMintz, Yuval 	num_regs = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_NUM_REGS);
77582d22bc83SMichal Kalderon 	attn_type = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE);
77592d22bc83SMichal Kalderon 	block_name = qed_dbg_get_block_name(p_hwfn, results->block_id);
77602d22bc83SMichal Kalderon 	if (!block_name)
77612d22bc83SMichal Kalderon 		return DBG_STATUS_INVALID_ARGS;
77620ebbd1c8SMintz, Yuval 
77632d22bc83SMichal Kalderon 	if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr ||
77642d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr ||
77652d22bc83SMichal Kalderon 	    !p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr)
77660ebbd1c8SMintz, Yuval 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
77670ebbd1c8SMintz, Yuval 
77682d22bc83SMichal Kalderon 	block_attn_name_offsets =
77692d22bc83SMichal Kalderon 	    (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr +
77702d22bc83SMichal Kalderon 	    results->names_offset;
77712d22bc83SMichal Kalderon 
77722d22bc83SMichal Kalderon 	attn_name_base = p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr;
77730ebbd1c8SMintz, Yuval 
77740ebbd1c8SMintz, Yuval 	/* Go over registers with a non-zero attention status */
77750ebbd1c8SMintz, Yuval 	for (i = 0; i < num_regs; i++) {
7776da090917STomer Tayar 		struct dbg_attn_bit_mapping *bit_mapping;
77770ebbd1c8SMintz, Yuval 		struct dbg_attn_reg_result *reg_result;
77780ebbd1c8SMintz, Yuval 		u8 num_reg_attn, bit_idx = 0;
77790ebbd1c8SMintz, Yuval 
77800ebbd1c8SMintz, Yuval 		reg_result = &results->reg_results[i];
77810ebbd1c8SMintz, Yuval 		num_reg_attn = GET_FIELD(reg_result->data,
77820ebbd1c8SMintz, Yuval 					 DBG_ATTN_REG_RESULT_NUM_REG_ATTN);
77832d22bc83SMichal Kalderon 		bit_mapping = (struct dbg_attn_bit_mapping *)
77842d22bc83SMichal Kalderon 		    p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr +
77852d22bc83SMichal Kalderon 		    reg_result->block_attn_offset;
77860ebbd1c8SMintz, Yuval 
77870ebbd1c8SMintz, Yuval 		/* Go over attention status bits */
77886c95dd8fSPrabhakar Kushwaha 		for (j = 0; j < num_reg_attn; j++) {
7789da090917STomer Tayar 			u16 attn_idx_val = GET_FIELD(bit_mapping[j].data,
77900ebbd1c8SMintz, Yuval 						     DBG_ATTN_BIT_MAPPING_VAL);
77910ebbd1c8SMintz, Yuval 			const char *attn_name, *attn_type_str, *masked_str;
77922d22bc83SMichal Kalderon 			u32 attn_name_offset;
77932d22bc83SMichal Kalderon 			u32 sts_addr;
77940ebbd1c8SMintz, Yuval 
77950ebbd1c8SMintz, Yuval 			/* Check if bit mask should be advanced (due to unused
77960ebbd1c8SMintz, Yuval 			 * bits).
77970ebbd1c8SMintz, Yuval 			 */
7798da090917STomer Tayar 			if (GET_FIELD(bit_mapping[j].data,
77990ebbd1c8SMintz, Yuval 				      DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT)) {
78000ebbd1c8SMintz, Yuval 				bit_idx += (u8)attn_idx_val;
78010ebbd1c8SMintz, Yuval 				continue;
78020ebbd1c8SMintz, Yuval 			}
78030ebbd1c8SMintz, Yuval 
78040ebbd1c8SMintz, Yuval 			/* Check current bit index */
78056c95dd8fSPrabhakar Kushwaha 			if (reg_result->sts_val & BIT(bit_idx)) {
78062d22bc83SMichal Kalderon 				/* An attention bit with value=1 was found
78072d22bc83SMichal Kalderon 				 * Find attention name
78082d22bc83SMichal Kalderon 				 */
7809da090917STomer Tayar 				attn_name_offset =
7810da090917STomer Tayar 					block_attn_name_offsets[attn_idx_val];
78112d22bc83SMichal Kalderon 				attn_name = attn_name_base + attn_name_offset;
78122d22bc83SMichal Kalderon 				attn_type_str =
78132d22bc83SMichal Kalderon 					(attn_type ==
78142d22bc83SMichal Kalderon 					 ATTN_TYPE_INTERRUPT ? "Interrupt" :
78152d22bc83SMichal Kalderon 					 "Parity");
78166c95dd8fSPrabhakar Kushwaha 				masked_str = reg_result->mask_val &
78176c95dd8fSPrabhakar Kushwaha 					     BIT(bit_idx) ?
78180ebbd1c8SMintz, Yuval 					     " [masked]" : "";
78196c95dd8fSPrabhakar Kushwaha 				sts_addr =
78206c95dd8fSPrabhakar Kushwaha 				GET_FIELD(reg_result->data,
78210ebbd1c8SMintz, Yuval 					  DBG_ATTN_REG_RESULT_STS_ADDRESS);
78220ebbd1c8SMintz, Yuval 				DP_NOTICE(p_hwfn,
78230ebbd1c8SMintz, Yuval 					  "%s (%s) : %s [address 0x%08x, bit %d]%s\n",
78240ebbd1c8SMintz, Yuval 					  block_name, attn_type_str, attn_name,
78252d22bc83SMichal Kalderon 					  sts_addr * 4, bit_idx, masked_str);
78260ebbd1c8SMintz, Yuval 			}
78276c95dd8fSPrabhakar Kushwaha 
78286c95dd8fSPrabhakar Kushwaha 			bit_idx++;
78296c95dd8fSPrabhakar Kushwaha 		}
78300ebbd1c8SMintz, Yuval 	}
78310ebbd1c8SMintz, Yuval 
78320ebbd1c8SMintz, Yuval 	return DBG_STATUS_OK;
78330ebbd1c8SMintz, Yuval }
78340ebbd1c8SMintz, Yuval 
7835c965db44STomer Tayar /* Wrapper for unifying the idle_chk and mcp_trace api */
78368c93beafSYuval Mintz static enum dbg_status
qed_print_idle_chk_results_wrapper(struct qed_hwfn * p_hwfn,u32 * dump_buf,u32 num_dumped_dwords,char * results_buf)78378c93beafSYuval Mintz qed_print_idle_chk_results_wrapper(struct qed_hwfn *p_hwfn,
7838c965db44STomer Tayar 				   u32 *dump_buf,
7839c965db44STomer Tayar 				   u32 num_dumped_dwords,
7840c965db44STomer Tayar 				   char *results_buf)
7841c965db44STomer Tayar {
7842c965db44STomer Tayar 	u32 num_errors, num_warnnings;
7843c965db44STomer Tayar 
7844c965db44STomer Tayar 	return qed_print_idle_chk_results(p_hwfn, dump_buf, num_dumped_dwords,
7845c965db44STomer Tayar 					  results_buf, &num_errors,
7846c965db44STomer Tayar 					  &num_warnnings);
7847c965db44STomer Tayar }
7848c965db44STomer Tayar 
78496c95dd8fSPrabhakar Kushwaha static DEFINE_MUTEX(qed_dbg_lock);
78506c95dd8fSPrabhakar Kushwaha 
78516c95dd8fSPrabhakar Kushwaha #define MAX_PHY_RESULT_BUFFER 9000
78526c95dd8fSPrabhakar Kushwaha 
78536c95dd8fSPrabhakar Kushwaha /******************************** Feature Meta data section ******************/
78546c95dd8fSPrabhakar Kushwaha 
78556c95dd8fSPrabhakar Kushwaha #define GRC_NUM_STR_FUNCS 2
78566c95dd8fSPrabhakar Kushwaha #define IDLE_CHK_NUM_STR_FUNCS 1
78576c95dd8fSPrabhakar Kushwaha #define MCP_TRACE_NUM_STR_FUNCS 1
78586c95dd8fSPrabhakar Kushwaha #define REG_FIFO_NUM_STR_FUNCS 1
78596c95dd8fSPrabhakar Kushwaha #define IGU_FIFO_NUM_STR_FUNCS 1
78606c95dd8fSPrabhakar Kushwaha #define PROTECTION_OVERRIDE_NUM_STR_FUNCS 1
78616c95dd8fSPrabhakar Kushwaha #define FW_ASSERTS_NUM_STR_FUNCS 1
78626c95dd8fSPrabhakar Kushwaha #define ILT_NUM_STR_FUNCS 1
78636c95dd8fSPrabhakar Kushwaha #define PHY_NUM_STR_FUNCS 20
78646c95dd8fSPrabhakar Kushwaha 
7865c965db44STomer Tayar /* Feature meta data lookup table */
7866c965db44STomer Tayar static struct {
7867c965db44STomer Tayar 	char *name;
78686c95dd8fSPrabhakar Kushwaha 	u32 num_funcs;
7869c965db44STomer Tayar 	enum dbg_status (*get_size)(struct qed_hwfn *p_hwfn,
7870c965db44STomer Tayar 				    struct qed_ptt *p_ptt, u32 *size);
7871c965db44STomer Tayar 	enum dbg_status (*perform_dump)(struct qed_hwfn *p_hwfn,
7872c965db44STomer Tayar 					struct qed_ptt *p_ptt, u32 *dump_buf,
7873c965db44STomer Tayar 					u32 buf_size, u32 *dumped_dwords);
7874c965db44STomer Tayar 	enum dbg_status (*print_results)(struct qed_hwfn *p_hwfn,
7875c965db44STomer Tayar 					 u32 *dump_buf, u32 num_dumped_dwords,
7876c965db44STomer Tayar 					 char *results_buf);
7877c965db44STomer Tayar 	enum dbg_status (*results_buf_size)(struct qed_hwfn *p_hwfn,
7878c965db44STomer Tayar 					    u32 *dump_buf,
7879c965db44STomer Tayar 					    u32 num_dumped_dwords,
7880c965db44STomer Tayar 					    u32 *results_buf_size);
78816c95dd8fSPrabhakar Kushwaha 	const struct qed_func_lookup *hsi_func_lookup;
7882c965db44STomer Tayar } qed_features_lookup[] = {
7883c965db44STomer Tayar 	{
78846c95dd8fSPrabhakar Kushwaha 	"grc", GRC_NUM_STR_FUNCS, qed_dbg_grc_get_dump_buf_size,
78856c95dd8fSPrabhakar Kushwaha 		    qed_dbg_grc_dump, NULL, NULL, NULL}, {
78866c95dd8fSPrabhakar Kushwaha 	"idle_chk", IDLE_CHK_NUM_STR_FUNCS,
7887c965db44STomer Tayar 		    qed_dbg_idle_chk_get_dump_buf_size,
7888c965db44STomer Tayar 		    qed_dbg_idle_chk_dump,
7889c965db44STomer Tayar 		    qed_print_idle_chk_results_wrapper,
78906c95dd8fSPrabhakar Kushwaha 		    qed_get_idle_chk_results_buf_size,
78916c95dd8fSPrabhakar Kushwaha 		    NULL}, {
78926c95dd8fSPrabhakar Kushwaha 	"mcp_trace", MCP_TRACE_NUM_STR_FUNCS,
7893c965db44STomer Tayar 		    qed_dbg_mcp_trace_get_dump_buf_size,
7894c965db44STomer Tayar 		    qed_dbg_mcp_trace_dump, qed_print_mcp_trace_results,
78956c95dd8fSPrabhakar Kushwaha 		    qed_get_mcp_trace_results_buf_size,
78966c95dd8fSPrabhakar Kushwaha 		    NULL}, {
78976c95dd8fSPrabhakar Kushwaha 	"reg_fifo", REG_FIFO_NUM_STR_FUNCS,
7898c965db44STomer Tayar 		    qed_dbg_reg_fifo_get_dump_buf_size,
7899c965db44STomer Tayar 		    qed_dbg_reg_fifo_dump, qed_print_reg_fifo_results,
79006c95dd8fSPrabhakar Kushwaha 		    qed_get_reg_fifo_results_buf_size,
79016c95dd8fSPrabhakar Kushwaha 		    NULL}, {
79026c95dd8fSPrabhakar Kushwaha 	"igu_fifo", IGU_FIFO_NUM_STR_FUNCS,
7903c965db44STomer Tayar 		    qed_dbg_igu_fifo_get_dump_buf_size,
7904c965db44STomer Tayar 		    qed_dbg_igu_fifo_dump, qed_print_igu_fifo_results,
79056c95dd8fSPrabhakar Kushwaha 		    qed_get_igu_fifo_results_buf_size,
79066c95dd8fSPrabhakar Kushwaha 		    NULL}, {
79076c95dd8fSPrabhakar Kushwaha 	"protection_override", PROTECTION_OVERRIDE_NUM_STR_FUNCS,
7908c965db44STomer Tayar 		    qed_dbg_protection_override_get_dump_buf_size,
7909c965db44STomer Tayar 		    qed_dbg_protection_override_dump,
7910c965db44STomer Tayar 		    qed_print_protection_override_results,
79116c95dd8fSPrabhakar Kushwaha 		    qed_get_protection_override_results_buf_size,
79126c95dd8fSPrabhakar Kushwaha 		    NULL}, {
79136c95dd8fSPrabhakar Kushwaha 	"fw_asserts", FW_ASSERTS_NUM_STR_FUNCS,
7914c965db44STomer Tayar 		    qed_dbg_fw_asserts_get_dump_buf_size,
7915c965db44STomer Tayar 		    qed_dbg_fw_asserts_dump,
7916c965db44STomer Tayar 		    qed_print_fw_asserts_results,
79176c95dd8fSPrabhakar Kushwaha 		    qed_get_fw_asserts_results_buf_size,
79186c95dd8fSPrabhakar Kushwaha 		    NULL}, {
79196c95dd8fSPrabhakar Kushwaha 	"ilt", ILT_NUM_STR_FUNCS, qed_dbg_ilt_get_dump_buf_size,
79206c95dd8fSPrabhakar Kushwaha 		    qed_dbg_ilt_dump, NULL, NULL, NULL},};
7921c965db44STomer Tayar 
qed_dbg_print_feature(u8 * p_text_buf,u32 text_size)7922c965db44STomer Tayar static void qed_dbg_print_feature(u8 *p_text_buf, u32 text_size)
7923c965db44STomer Tayar {
7924c965db44STomer Tayar 	u32 i, precision = 80;
7925c965db44STomer Tayar 
7926c965db44STomer Tayar 	if (!p_text_buf)
7927c965db44STomer Tayar 		return;
7928c965db44STomer Tayar 
7929c965db44STomer Tayar 	pr_notice("\n%.*s", precision, p_text_buf);
7930c965db44STomer Tayar 	for (i = precision; i < text_size; i += precision)
7931c965db44STomer Tayar 		pr_cont("%.*s", precision, p_text_buf + i);
7932c965db44STomer Tayar 	pr_cont("\n");
7933c965db44STomer Tayar }
7934c965db44STomer Tayar 
7935c965db44STomer Tayar #define QED_RESULTS_BUF_MIN_SIZE 16
7936c965db44STomer Tayar /* Generic function for decoding debug feature info */
format_feature(struct qed_hwfn * p_hwfn,enum qed_dbg_features feature_idx)79378c93beafSYuval Mintz static enum dbg_status format_feature(struct qed_hwfn *p_hwfn,
7938c965db44STomer Tayar 				      enum qed_dbg_features feature_idx)
7939c965db44STomer Tayar {
7940c965db44STomer Tayar 	struct qed_dbg_feature *feature =
7941ca352f00SIgor Russkikh 	    &p_hwfn->cdev->dbg_features[feature_idx];
79426c95dd8fSPrabhakar Kushwaha 	u32 txt_size_bytes, null_char_pos, i;
79436c95dd8fSPrabhakar Kushwaha 	u32 *dbuf, dwords;
7944c965db44STomer Tayar 	enum dbg_status rc;
7945c965db44STomer Tayar 	char *text_buf;
7946c965db44STomer Tayar 
7947c965db44STomer Tayar 	/* Check if feature supports formatting capability */
7948c965db44STomer Tayar 	if (!qed_features_lookup[feature_idx].results_buf_size)
7949c965db44STomer Tayar 		return DBG_STATUS_OK;
7950c965db44STomer Tayar 
79516c95dd8fSPrabhakar Kushwaha 	dbuf = (u32 *)feature->dump_buf;
79526c95dd8fSPrabhakar Kushwaha 	dwords = feature->dumped_dwords;
79536c95dd8fSPrabhakar Kushwaha 
7954c965db44STomer Tayar 	/* Obtain size of formatted output */
79556c95dd8fSPrabhakar Kushwaha 	rc = qed_features_lookup[feature_idx].results_buf_size(p_hwfn,
79566c95dd8fSPrabhakar Kushwaha 							       dbuf,
79576c95dd8fSPrabhakar Kushwaha 							       dwords,
79586c95dd8fSPrabhakar Kushwaha 							       &txt_size_bytes);
7959c965db44STomer Tayar 	if (rc != DBG_STATUS_OK)
7960c965db44STomer Tayar 		return rc;
7961c965db44STomer Tayar 
79626c95dd8fSPrabhakar Kushwaha 	/* Make sure that the allocated size is a multiple of dword
79636c95dd8fSPrabhakar Kushwaha 	 * (4 bytes).
79646c95dd8fSPrabhakar Kushwaha 	 */
79656c95dd8fSPrabhakar Kushwaha 	null_char_pos = txt_size_bytes - 1;
79666c95dd8fSPrabhakar Kushwaha 	txt_size_bytes = (txt_size_bytes + 3) & ~0x3;
7967c965db44STomer Tayar 
79686c95dd8fSPrabhakar Kushwaha 	if (txt_size_bytes < QED_RESULTS_BUF_MIN_SIZE) {
7969c965db44STomer Tayar 		DP_NOTICE(p_hwfn->cdev,
7970c965db44STomer Tayar 			  "formatted size of feature was too small %d. Aborting\n",
79716c95dd8fSPrabhakar Kushwaha 			  txt_size_bytes);
7972c965db44STomer Tayar 		return DBG_STATUS_INVALID_ARGS;
7973c965db44STomer Tayar 	}
7974c965db44STomer Tayar 
79756c95dd8fSPrabhakar Kushwaha 	/* allocate temp text buf */
79766c95dd8fSPrabhakar Kushwaha 	text_buf = vzalloc(txt_size_bytes);
79776c95dd8fSPrabhakar Kushwaha 	if (!text_buf) {
79786c95dd8fSPrabhakar Kushwaha 		DP_NOTICE(p_hwfn->cdev,
79796c95dd8fSPrabhakar Kushwaha 			  "failed to allocate text buffer. Aborting\n");
7980c965db44STomer Tayar 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
79816c95dd8fSPrabhakar Kushwaha 	}
7982c965db44STomer Tayar 
7983c965db44STomer Tayar 	/* Decode feature opcodes to string on temp buf */
79846c95dd8fSPrabhakar Kushwaha 	rc = qed_features_lookup[feature_idx].print_results(p_hwfn,
79856c95dd8fSPrabhakar Kushwaha 							    dbuf,
79866c95dd8fSPrabhakar Kushwaha 							    dwords,
79876c95dd8fSPrabhakar Kushwaha 							    text_buf);
7988c965db44STomer Tayar 	if (rc != DBG_STATUS_OK) {
7989c965db44STomer Tayar 		vfree(text_buf);
7990c965db44STomer Tayar 		return rc;
7991c965db44STomer Tayar 	}
7992c965db44STomer Tayar 
7993c965db44STomer Tayar 	/* Replace the original null character with a '\n' character.
7994c965db44STomer Tayar 	 * The bytes that were added as a result of the dword alignment are also
7995c965db44STomer Tayar 	 * padded with '\n' characters.
7996c965db44STomer Tayar 	 */
79976c95dd8fSPrabhakar Kushwaha 	for (i = null_char_pos; i < txt_size_bytes; i++)
7998c965db44STomer Tayar 		text_buf[i] = '\n';
7999c965db44STomer Tayar 
8000c965db44STomer Tayar 	/* Dump printable feature to log */
8001ca352f00SIgor Russkikh 	if (p_hwfn->cdev->print_dbg_data)
80026c95dd8fSPrabhakar Kushwaha 		qed_dbg_print_feature(text_buf, txt_size_bytes);
8003c965db44STomer Tayar 
80046c95dd8fSPrabhakar Kushwaha 	/* Dump binary data as is to the output file */
8005da328711SAlexander Lobakin 	if (p_hwfn->cdev->dbg_bin_dump) {
8006da328711SAlexander Lobakin 		vfree(text_buf);
80076c95dd8fSPrabhakar Kushwaha 		return rc;
8008da328711SAlexander Lobakin 	}
8009da328711SAlexander Lobakin 
80106c95dd8fSPrabhakar Kushwaha 	/* Free the old dump_buf and point the dump_buf to the newly allocated
8011c965db44STomer Tayar 	 * and formatted text buffer.
8012c965db44STomer Tayar 	 */
8013c965db44STomer Tayar 	vfree(feature->dump_buf);
8014c965db44STomer Tayar 	feature->dump_buf = text_buf;
80156c95dd8fSPrabhakar Kushwaha 	feature->buf_size = txt_size_bytes;
80166c95dd8fSPrabhakar Kushwaha 	feature->dumped_dwords = txt_size_bytes / 4;
80176c95dd8fSPrabhakar Kushwaha 
8018c965db44STomer Tayar 	return rc;
8019c965db44STomer Tayar }
8020c965db44STomer Tayar 
80218a52bbabSMichal Kalderon #define MAX_DBG_FEATURE_SIZE_DWORDS	0x3FFFFFFF
80228a52bbabSMichal Kalderon 
8023c965db44STomer Tayar /* Generic function for performing the dump of a debug feature. */
qed_dbg_dump(struct qed_hwfn * p_hwfn,struct qed_ptt * p_ptt,enum qed_dbg_features feature_idx)80248c93beafSYuval Mintz static enum dbg_status qed_dbg_dump(struct qed_hwfn *p_hwfn,
80258c93beafSYuval Mintz 				    struct qed_ptt *p_ptt,
8026c965db44STomer Tayar 				    enum qed_dbg_features feature_idx)
8027c965db44STomer Tayar {
8028c965db44STomer Tayar 	struct qed_dbg_feature *feature =
8029ca352f00SIgor Russkikh 	    &p_hwfn->cdev->dbg_features[feature_idx];
80306c95dd8fSPrabhakar Kushwaha 	u32 buf_size_dwords, *dbuf, *dwords;
8031c965db44STomer Tayar 	enum dbg_status rc;
8032c965db44STomer Tayar 
8033c965db44STomer Tayar 	DP_NOTICE(p_hwfn->cdev, "Collecting a debug feature [\"%s\"]\n",
8034c965db44STomer Tayar 		  qed_features_lookup[feature_idx].name);
8035c965db44STomer Tayar 
8036c965db44STomer Tayar 	/* Dump_buf was already allocated need to free (this can happen if dump
8037c965db44STomer Tayar 	 * was called but file was never read).
8038c965db44STomer Tayar 	 * We can't use the buffer as is since size may have changed.
8039c965db44STomer Tayar 	 */
8040c965db44STomer Tayar 	if (feature->dump_buf) {
8041c965db44STomer Tayar 		vfree(feature->dump_buf);
8042c965db44STomer Tayar 		feature->dump_buf = NULL;
8043c965db44STomer Tayar 	}
8044c965db44STomer Tayar 
8045c965db44STomer Tayar 	/* Get buffer size from hsi, allocate accordingly, and perform the
8046c965db44STomer Tayar 	 * dump.
8047c965db44STomer Tayar 	 */
8048c965db44STomer Tayar 	rc = qed_features_lookup[feature_idx].get_size(p_hwfn, p_ptt,
8049c965db44STomer Tayar 						       &buf_size_dwords);
8050be086e7cSMintz, Yuval 	if (rc != DBG_STATUS_OK && rc != DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
8051c965db44STomer Tayar 		return rc;
80522d22bc83SMichal Kalderon 
80532d22bc83SMichal Kalderon 	if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS) {
80542d22bc83SMichal Kalderon 		feature->buf_size = 0;
80552d22bc83SMichal Kalderon 		DP_NOTICE(p_hwfn->cdev,
80562d22bc83SMichal Kalderon 			  "Debug feature [\"%s\"] size (0x%x dwords) exceeds maximum size (0x%x dwords)\n",
80572d22bc83SMichal Kalderon 			  qed_features_lookup[feature_idx].name,
80582d22bc83SMichal Kalderon 			  buf_size_dwords, MAX_DBG_FEATURE_SIZE_DWORDS);
80592d22bc83SMichal Kalderon 
80602d22bc83SMichal Kalderon 		return DBG_STATUS_OK;
80612d22bc83SMichal Kalderon 	}
80622d22bc83SMichal Kalderon 
8063c965db44STomer Tayar 	feature->buf_size = buf_size_dwords * sizeof(u32);
8064c965db44STomer Tayar 	feature->dump_buf = vmalloc(feature->buf_size);
8065c965db44STomer Tayar 	if (!feature->dump_buf)
8066c965db44STomer Tayar 		return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
8067c965db44STomer Tayar 
80686c95dd8fSPrabhakar Kushwaha 	dbuf = (u32 *)feature->dump_buf;
80696c95dd8fSPrabhakar Kushwaha 	dwords = &feature->dumped_dwords;
80706c95dd8fSPrabhakar Kushwaha 	rc = qed_features_lookup[feature_idx].perform_dump(p_hwfn, p_ptt,
80716c95dd8fSPrabhakar Kushwaha 							   dbuf,
80726c95dd8fSPrabhakar Kushwaha 							   feature->buf_size /
80736c95dd8fSPrabhakar Kushwaha 							   sizeof(u32),
80746c95dd8fSPrabhakar Kushwaha 							   dwords);
8075c965db44STomer Tayar 
8076c965db44STomer Tayar 	/* If mcp is stuck we get DBG_STATUS_NVRAM_GET_IMAGE_FAILED error.
80776c95dd8fSPrabhakar Kushwaha 	 * In this case the buffer holds valid binary data, but we won't able
8078c965db44STomer Tayar 	 * to parse it (since parsing relies on data in NVRAM which is only
8079c965db44STomer Tayar 	 * accessible when MFW is responsive). skip the formatting but return
8080c965db44STomer Tayar 	 * success so that binary data is provided.
8081c965db44STomer Tayar 	 */
8082c965db44STomer Tayar 	if (rc == DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
8083c965db44STomer Tayar 		return DBG_STATUS_OK;
8084c965db44STomer Tayar 
8085c965db44STomer Tayar 	if (rc != DBG_STATUS_OK)
8086c965db44STomer Tayar 		return rc;
8087c965db44STomer Tayar 
8088c965db44STomer Tayar 	/* Format output */
8089c965db44STomer Tayar 	rc = format_feature(p_hwfn, feature_idx);
8090c965db44STomer Tayar 	return rc;
8091c965db44STomer Tayar }
8092c965db44STomer Tayar 
qed_dbg_grc(struct qed_dev * cdev,void * buffer,u32 * num_dumped_bytes)8093c965db44STomer Tayar int qed_dbg_grc(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
8094c965db44STomer Tayar {
8095c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_GRC, num_dumped_bytes);
8096c965db44STomer Tayar }
8097c965db44STomer Tayar 
qed_dbg_grc_size(struct qed_dev * cdev)8098c965db44STomer Tayar int qed_dbg_grc_size(struct qed_dev *cdev)
8099c965db44STomer Tayar {
8100c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_GRC);
8101c965db44STomer Tayar }
8102c965db44STomer Tayar 
qed_dbg_idle_chk(struct qed_dev * cdev,void * buffer,u32 * num_dumped_bytes)8103c965db44STomer Tayar int qed_dbg_idle_chk(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
8104c965db44STomer Tayar {
8105c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IDLE_CHK,
8106c965db44STomer Tayar 			       num_dumped_bytes);
8107c965db44STomer Tayar }
8108c965db44STomer Tayar 
qed_dbg_idle_chk_size(struct qed_dev * cdev)8109c965db44STomer Tayar int qed_dbg_idle_chk_size(struct qed_dev *cdev)
8110c965db44STomer Tayar {
8111c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_IDLE_CHK);
8112c965db44STomer Tayar }
8113c965db44STomer Tayar 
qed_dbg_reg_fifo(struct qed_dev * cdev,void * buffer,u32 * num_dumped_bytes)8114c965db44STomer Tayar int qed_dbg_reg_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
8115c965db44STomer Tayar {
8116c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_REG_FIFO,
8117c965db44STomer Tayar 			       num_dumped_bytes);
8118c965db44STomer Tayar }
8119c965db44STomer Tayar 
qed_dbg_reg_fifo_size(struct qed_dev * cdev)8120c965db44STomer Tayar int qed_dbg_reg_fifo_size(struct qed_dev *cdev)
8121c965db44STomer Tayar {
8122c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_REG_FIFO);
8123c965db44STomer Tayar }
8124c965db44STomer Tayar 
qed_dbg_igu_fifo(struct qed_dev * cdev,void * buffer,u32 * num_dumped_bytes)8125c965db44STomer Tayar int qed_dbg_igu_fifo(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
8126c965db44STomer Tayar {
8127c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_IGU_FIFO,
8128c965db44STomer Tayar 			       num_dumped_bytes);
8129c965db44STomer Tayar }
8130c965db44STomer Tayar 
qed_dbg_igu_fifo_size(struct qed_dev * cdev)8131c965db44STomer Tayar int qed_dbg_igu_fifo_size(struct qed_dev *cdev)
8132c965db44STomer Tayar {
8133c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_IGU_FIFO);
8134c965db44STomer Tayar }
8135c965db44STomer Tayar 
qed_dbg_nvm_image_length(struct qed_hwfn * p_hwfn,enum qed_nvm_images image_id,u32 * length)8136bf774d14SYueHaibing static int qed_dbg_nvm_image_length(struct qed_hwfn *p_hwfn,
81371ac4329aSDenis Bolotin 				    enum qed_nvm_images image_id, u32 *length)
81381ac4329aSDenis Bolotin {
81391ac4329aSDenis Bolotin 	struct qed_nvm_image_att image_att;
81401ac4329aSDenis Bolotin 	int rc;
81411ac4329aSDenis Bolotin 
81421ac4329aSDenis Bolotin 	*length = 0;
81431ac4329aSDenis Bolotin 	rc = qed_mcp_get_nvm_image_att(p_hwfn, image_id, &image_att);
81441ac4329aSDenis Bolotin 	if (rc)
81451ac4329aSDenis Bolotin 		return rc;
81461ac4329aSDenis Bolotin 
81471ac4329aSDenis Bolotin 	*length = image_att.length;
81481ac4329aSDenis Bolotin 
81491ac4329aSDenis Bolotin 	return rc;
81501ac4329aSDenis Bolotin }
81511ac4329aSDenis Bolotin 
qed_dbg_nvm_image(struct qed_dev * cdev,void * buffer,u32 * num_dumped_bytes,enum qed_nvm_images image_id)8152bf774d14SYueHaibing static int qed_dbg_nvm_image(struct qed_dev *cdev, void *buffer,
8153bf774d14SYueHaibing 			     u32 *num_dumped_bytes,
8154bf774d14SYueHaibing 			     enum qed_nvm_images image_id)
81551ac4329aSDenis Bolotin {
81561ac4329aSDenis Bolotin 	struct qed_hwfn *p_hwfn =
8157ca352f00SIgor Russkikh 		&cdev->hwfns[cdev->engine_for_debug];
81585ab90341SAlexander Lobakin 	u32 len_rounded;
81591ac4329aSDenis Bolotin 	int rc;
81601ac4329aSDenis Bolotin 
81611ac4329aSDenis Bolotin 	*num_dumped_bytes = 0;
81621ac4329aSDenis Bolotin 	rc = qed_dbg_nvm_image_length(p_hwfn, image_id, &len_rounded);
81631ac4329aSDenis Bolotin 	if (rc)
81641ac4329aSDenis Bolotin 		return rc;
81651ac4329aSDenis Bolotin 
81661ac4329aSDenis Bolotin 	DP_NOTICE(p_hwfn->cdev,
81671ac4329aSDenis Bolotin 		  "Collecting a debug feature [\"nvram image %d\"]\n",
81681ac4329aSDenis Bolotin 		  image_id);
81691ac4329aSDenis Bolotin 
81701ac4329aSDenis Bolotin 	len_rounded = roundup(len_rounded, sizeof(u32));
81711ac4329aSDenis Bolotin 	rc = qed_mcp_get_nvm_image(p_hwfn, image_id, buffer, len_rounded);
81721ac4329aSDenis Bolotin 	if (rc)
81731ac4329aSDenis Bolotin 		return rc;
81741ac4329aSDenis Bolotin 
81751ac4329aSDenis Bolotin 	/* QED_NVM_IMAGE_NVM_META image is not swapped like other images */
81761ac4329aSDenis Bolotin 	if (image_id != QED_NVM_IMAGE_NVM_META)
81775ab90341SAlexander Lobakin 		cpu_to_be32_array((__force __be32 *)buffer,
81785ab90341SAlexander Lobakin 				  (const u32 *)buffer,
81795ab90341SAlexander Lobakin 				  len_rounded / sizeof(u32));
81801ac4329aSDenis Bolotin 
81811ac4329aSDenis Bolotin 	*num_dumped_bytes = len_rounded;
81821ac4329aSDenis Bolotin 
81831ac4329aSDenis Bolotin 	return rc;
81841ac4329aSDenis Bolotin }
81851ac4329aSDenis Bolotin 
qed_dbg_protection_override(struct qed_dev * cdev,void * buffer,u32 * num_dumped_bytes)8186c965db44STomer Tayar int qed_dbg_protection_override(struct qed_dev *cdev, void *buffer,
8187c965db44STomer Tayar 				u32 *num_dumped_bytes)
8188c965db44STomer Tayar {
8189c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_PROTECTION_OVERRIDE,
8190c965db44STomer Tayar 			       num_dumped_bytes);
8191c965db44STomer Tayar }
8192c965db44STomer Tayar 
qed_dbg_protection_override_size(struct qed_dev * cdev)8193c965db44STomer Tayar int qed_dbg_protection_override_size(struct qed_dev *cdev)
8194c965db44STomer Tayar {
8195c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_PROTECTION_OVERRIDE);
8196c965db44STomer Tayar }
8197c965db44STomer Tayar 
qed_dbg_fw_asserts(struct qed_dev * cdev,void * buffer,u32 * num_dumped_bytes)8198c965db44STomer Tayar int qed_dbg_fw_asserts(struct qed_dev *cdev, void *buffer,
8199c965db44STomer Tayar 		       u32 *num_dumped_bytes)
8200c965db44STomer Tayar {
8201c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_FW_ASSERTS,
8202c965db44STomer Tayar 			       num_dumped_bytes);
8203c965db44STomer Tayar }
8204c965db44STomer Tayar 
qed_dbg_fw_asserts_size(struct qed_dev * cdev)8205c965db44STomer Tayar int qed_dbg_fw_asserts_size(struct qed_dev *cdev)
8206c965db44STomer Tayar {
8207c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_FW_ASSERTS);
8208c965db44STomer Tayar }
8209c965db44STomer Tayar 
qed_dbg_ilt(struct qed_dev * cdev,void * buffer,u32 * num_dumped_bytes)82108a52bbabSMichal Kalderon int qed_dbg_ilt(struct qed_dev *cdev, void *buffer, u32 *num_dumped_bytes)
82118a52bbabSMichal Kalderon {
82128a52bbabSMichal Kalderon 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_ILT, num_dumped_bytes);
82138a52bbabSMichal Kalderon }
82148a52bbabSMichal Kalderon 
qed_dbg_ilt_size(struct qed_dev * cdev)82158a52bbabSMichal Kalderon int qed_dbg_ilt_size(struct qed_dev *cdev)
82168a52bbabSMichal Kalderon {
82178a52bbabSMichal Kalderon 	return qed_dbg_feature_size(cdev, DBG_FEATURE_ILT);
82188a52bbabSMichal Kalderon }
82198a52bbabSMichal Kalderon 
qed_dbg_mcp_trace(struct qed_dev * cdev,void * buffer,u32 * num_dumped_bytes)8220c965db44STomer Tayar int qed_dbg_mcp_trace(struct qed_dev *cdev, void *buffer,
8221c965db44STomer Tayar 		      u32 *num_dumped_bytes)
8222c965db44STomer Tayar {
8223c965db44STomer Tayar 	return qed_dbg_feature(cdev, buffer, DBG_FEATURE_MCP_TRACE,
8224c965db44STomer Tayar 			       num_dumped_bytes);
8225c965db44STomer Tayar }
8226c965db44STomer Tayar 
qed_dbg_mcp_trace_size(struct qed_dev * cdev)8227c965db44STomer Tayar int qed_dbg_mcp_trace_size(struct qed_dev *cdev)
8228c965db44STomer Tayar {
8229c965db44STomer Tayar 	return qed_dbg_feature_size(cdev, DBG_FEATURE_MCP_TRACE);
8230c965db44STomer Tayar }
8231c965db44STomer Tayar 
8232c965db44STomer Tayar /* Defines the amount of bytes allocated for recording the length of debugfs
8233c965db44STomer Tayar  * feature buffer.
8234c965db44STomer Tayar  */
8235c965db44STomer Tayar #define REGDUMP_HEADER_SIZE			sizeof(u32)
82368a52bbabSMichal Kalderon #define REGDUMP_HEADER_SIZE_SHIFT		0
82378a52bbabSMichal Kalderon #define REGDUMP_HEADER_SIZE_MASK		0xffffff
8238c965db44STomer Tayar #define REGDUMP_HEADER_FEATURE_SHIFT		24
8239da328711SAlexander Lobakin #define REGDUMP_HEADER_FEATURE_MASK		0x1f
8240da328711SAlexander Lobakin #define REGDUMP_HEADER_BIN_DUMP_SHIFT		29
8241da328711SAlexander Lobakin #define REGDUMP_HEADER_BIN_DUMP_MASK		0x1
8242c965db44STomer Tayar #define REGDUMP_HEADER_OMIT_ENGINE_SHIFT	30
82438a52bbabSMichal Kalderon #define REGDUMP_HEADER_OMIT_ENGINE_MASK		0x1
82448a52bbabSMichal Kalderon #define REGDUMP_HEADER_ENGINE_SHIFT		31
82458a52bbabSMichal Kalderon #define REGDUMP_HEADER_ENGINE_MASK		0x1
82468a52bbabSMichal Kalderon #define REGDUMP_MAX_SIZE			0x1000000
82478a52bbabSMichal Kalderon #define ILT_DUMP_MAX_SIZE			(1024 * 1024 * 15)
82488a52bbabSMichal Kalderon 
8249c965db44STomer Tayar enum debug_print_features {
8250c965db44STomer Tayar 	OLD_MODE = 0,
8251c965db44STomer Tayar 	IDLE_CHK = 1,
8252c965db44STomer Tayar 	GRC_DUMP = 2,
8253c965db44STomer Tayar 	MCP_TRACE = 3,
8254c965db44STomer Tayar 	REG_FIFO = 4,
8255c965db44STomer Tayar 	PROTECTION_OVERRIDE = 5,
8256c965db44STomer Tayar 	IGU_FIFO = 6,
8257c965db44STomer Tayar 	PHY = 7,
8258c965db44STomer Tayar 	FW_ASSERTS = 8,
82591ac4329aSDenis Bolotin 	NVM_CFG1 = 9,
82601ac4329aSDenis Bolotin 	DEFAULT_CFG = 10,
82611ac4329aSDenis Bolotin 	NVM_META = 11,
82628a52bbabSMichal Kalderon 	MDUMP = 12,
82638a52bbabSMichal Kalderon 	ILT_DUMP = 13,
8264c965db44STomer Tayar };
8265c965db44STomer Tayar 
qed_calc_regdump_header(struct qed_dev * cdev,enum debug_print_features feature,int engine,u32 feature_size,u8 omit_engine,u8 dbg_bin_dump)82662d22bc83SMichal Kalderon static u32 qed_calc_regdump_header(struct qed_dev *cdev,
82672d22bc83SMichal Kalderon 				   enum debug_print_features feature,
82686c95dd8fSPrabhakar Kushwaha 				   int engine, u32 feature_size,
82696c95dd8fSPrabhakar Kushwaha 				   u8 omit_engine, u8 dbg_bin_dump)
8270c965db44STomer Tayar {
82712d22bc83SMichal Kalderon 	u32 res = 0;
82722d22bc83SMichal Kalderon 
82732d22bc83SMichal Kalderon 	SET_FIELD(res, REGDUMP_HEADER_SIZE, feature_size);
82742d22bc83SMichal Kalderon 	if (res != feature_size)
82752d22bc83SMichal Kalderon 		DP_NOTICE(cdev,
82762d22bc83SMichal Kalderon 			  "Feature %d is too large (size 0x%x) and will corrupt the dump\n",
82772d22bc83SMichal Kalderon 			  feature, feature_size);
82782d22bc83SMichal Kalderon 
82792d22bc83SMichal Kalderon 	SET_FIELD(res, REGDUMP_HEADER_FEATURE, feature);
82806c95dd8fSPrabhakar Kushwaha 	SET_FIELD(res, REGDUMP_HEADER_BIN_DUMP, dbg_bin_dump);
82812d22bc83SMichal Kalderon 	SET_FIELD(res, REGDUMP_HEADER_OMIT_ENGINE, omit_engine);
82822d22bc83SMichal Kalderon 	SET_FIELD(res, REGDUMP_HEADER_ENGINE, engine);
82832d22bc83SMichal Kalderon 
82842d22bc83SMichal Kalderon 	return res;
8285c965db44STomer Tayar }
8286c965db44STomer Tayar 
qed_dbg_all_data(struct qed_dev * cdev,void * buffer)8287c965db44STomer Tayar int qed_dbg_all_data(struct qed_dev *cdev, void *buffer)
8288c965db44STomer Tayar {
8289c965db44STomer Tayar 	u8 cur_engine, omit_engine = 0, org_engine;
82906c95dd8fSPrabhakar Kushwaha 	struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug];
82913b86bd07SSudarsana Reddy Kalluru 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
82926c95dd8fSPrabhakar Kushwaha 	int grc_params[MAX_DBG_GRC_PARAMS], rc, i;
8293c965db44STomer Tayar 	u32 offset = 0, feature_size;
8294c965db44STomer Tayar 
82953b86bd07SSudarsana Reddy Kalluru 	for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
82963b86bd07SSudarsana Reddy Kalluru 		grc_params[i] = dev_data->grc.param_val[i];
82973b86bd07SSudarsana Reddy Kalluru 
82982d22bc83SMichal Kalderon 	if (!QED_IS_CMT(cdev))
8299c965db44STomer Tayar 		omit_engine = 1;
8300c965db44STomer Tayar 
83016c95dd8fSPrabhakar Kushwaha 	cdev->dbg_bin_dump = 1;
83022d22bc83SMichal Kalderon 	mutex_lock(&qed_dbg_lock);
83032d22bc83SMichal Kalderon 
8304c965db44STomer Tayar 	org_engine = qed_get_debug_engine(cdev);
8305c965db44STomer Tayar 	for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) {
8306c965db44STomer Tayar 		/* Collect idle_chks and grcDump for each hw function */
8307c965db44STomer Tayar 		DP_VERBOSE(cdev, QED_MSG_DEBUG,
8308c965db44STomer Tayar 			   "obtaining idle_chk and grcdump for current engine\n");
8309c965db44STomer Tayar 		qed_set_debug_engine(cdev, cur_engine);
8310c965db44STomer Tayar 
8311c965db44STomer Tayar 		/* First idle_chk */
8312c965db44STomer Tayar 		rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset +
8313c965db44STomer Tayar 				      REGDUMP_HEADER_SIZE, &feature_size);
8314c965db44STomer Tayar 		if (!rc) {
8315c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
83166c95dd8fSPrabhakar Kushwaha 			    qed_calc_regdump_header(cdev, IDLE_CHK,
83176c95dd8fSPrabhakar Kushwaha 						    cur_engine,
83186c95dd8fSPrabhakar Kushwaha 						    feature_size,
83196c95dd8fSPrabhakar Kushwaha 						    omit_engine,
83206c95dd8fSPrabhakar Kushwaha 						    cdev->dbg_bin_dump);
8321c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
8322c965db44STomer Tayar 		} else {
8323c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc);
8324c965db44STomer Tayar 		}
8325c965db44STomer Tayar 
8326c965db44STomer Tayar 		/* Second idle_chk */
8327c965db44STomer Tayar 		rc = qed_dbg_idle_chk(cdev, (u8 *)buffer + offset +
8328c965db44STomer Tayar 				      REGDUMP_HEADER_SIZE, &feature_size);
8329c965db44STomer Tayar 		if (!rc) {
8330c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
83316c95dd8fSPrabhakar Kushwaha 			    qed_calc_regdump_header(cdev, IDLE_CHK,
83326c95dd8fSPrabhakar Kushwaha 						    cur_engine,
83336c95dd8fSPrabhakar Kushwaha 						    feature_size,
83346c95dd8fSPrabhakar Kushwaha 						    omit_engine,
83356c95dd8fSPrabhakar Kushwaha 						    cdev->dbg_bin_dump);
8336c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
8337c965db44STomer Tayar 		} else {
8338c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_idle_chk failed. rc = %d\n", rc);
8339c965db44STomer Tayar 		}
8340c965db44STomer Tayar 
8341c965db44STomer Tayar 		/* reg_fifo dump */
8342c965db44STomer Tayar 		rc = qed_dbg_reg_fifo(cdev, (u8 *)buffer + offset +
8343c965db44STomer Tayar 				      REGDUMP_HEADER_SIZE, &feature_size);
8344c965db44STomer Tayar 		if (!rc) {
8345c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
83466c95dd8fSPrabhakar Kushwaha 			    qed_calc_regdump_header(cdev, REG_FIFO,
83476c95dd8fSPrabhakar Kushwaha 						    cur_engine,
83486c95dd8fSPrabhakar Kushwaha 						    feature_size,
83496c95dd8fSPrabhakar Kushwaha 						    omit_engine,
83506c95dd8fSPrabhakar Kushwaha 						    cdev->dbg_bin_dump);
8351c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
8352c965db44STomer Tayar 		} else {
8353c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_reg_fifo failed. rc = %d\n", rc);
8354c965db44STomer Tayar 		}
8355c965db44STomer Tayar 
8356c965db44STomer Tayar 		/* igu_fifo dump */
8357c965db44STomer Tayar 		rc = qed_dbg_igu_fifo(cdev, (u8 *)buffer + offset +
8358c965db44STomer Tayar 				      REGDUMP_HEADER_SIZE, &feature_size);
8359c965db44STomer Tayar 		if (!rc) {
8360c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
83616c95dd8fSPrabhakar Kushwaha 			    qed_calc_regdump_header(cdev, IGU_FIFO,
83626c95dd8fSPrabhakar Kushwaha 						    cur_engine,
83636c95dd8fSPrabhakar Kushwaha 						    feature_size,
83646c95dd8fSPrabhakar Kushwaha 						    omit_engine,
83656c95dd8fSPrabhakar Kushwaha 						    cdev->dbg_bin_dump);
8366c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
8367c965db44STomer Tayar 		} else {
8368c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_igu_fifo failed. rc = %d", rc);
8369c965db44STomer Tayar 		}
8370c965db44STomer Tayar 
8371c965db44STomer Tayar 		/* protection_override dump */
8372c965db44STomer Tayar 		rc = qed_dbg_protection_override(cdev, (u8 *)buffer + offset +
8373c965db44STomer Tayar 						 REGDUMP_HEADER_SIZE,
8374c965db44STomer Tayar 						 &feature_size);
8375c965db44STomer Tayar 		if (!rc) {
8376c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
83776c95dd8fSPrabhakar Kushwaha 			    qed_calc_regdump_header(cdev,
83786c95dd8fSPrabhakar Kushwaha 						    PROTECTION_OVERRIDE,
8379c965db44STomer Tayar 						    cur_engine,
83806c95dd8fSPrabhakar Kushwaha 						    feature_size,
83816c95dd8fSPrabhakar Kushwaha 						    omit_engine,
83826c95dd8fSPrabhakar Kushwaha 						    cdev->dbg_bin_dump);
8383c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
8384c965db44STomer Tayar 		} else {
8385c965db44STomer Tayar 			DP_ERR(cdev,
8386c965db44STomer Tayar 			       "qed_dbg_protection_override failed. rc = %d\n",
8387c965db44STomer Tayar 			       rc);
8388c965db44STomer Tayar 		}
8389c965db44STomer Tayar 
8390c965db44STomer Tayar 		/* fw_asserts dump */
8391c965db44STomer Tayar 		rc = qed_dbg_fw_asserts(cdev, (u8 *)buffer + offset +
8392c965db44STomer Tayar 					REGDUMP_HEADER_SIZE, &feature_size);
8393c965db44STomer Tayar 		if (!rc) {
8394c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
83952d22bc83SMichal Kalderon 			    qed_calc_regdump_header(cdev, FW_ASSERTS,
83966c95dd8fSPrabhakar Kushwaha 						    cur_engine,
83976c95dd8fSPrabhakar Kushwaha 						    feature_size,
83986c95dd8fSPrabhakar Kushwaha 						    omit_engine,
83996c95dd8fSPrabhakar Kushwaha 						    cdev->dbg_bin_dump);
8400c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
8401c965db44STomer Tayar 		} else {
8402c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_fw_asserts failed. rc = %d\n",
8403c965db44STomer Tayar 			       rc);
8404c965db44STomer Tayar 		}
8405c965db44STomer Tayar 
84068a52bbabSMichal Kalderon 		feature_size = qed_dbg_ilt_size(cdev);
84076c95dd8fSPrabhakar Kushwaha 		if (!cdev->disable_ilt_dump && feature_size <
84086c95dd8fSPrabhakar Kushwaha 		    ILT_DUMP_MAX_SIZE) {
84098a52bbabSMichal Kalderon 			rc = qed_dbg_ilt(cdev, (u8 *)buffer + offset +
84108a52bbabSMichal Kalderon 					 REGDUMP_HEADER_SIZE, &feature_size);
84118a52bbabSMichal Kalderon 			if (!rc) {
84128a52bbabSMichal Kalderon 				*(u32 *)((u8 *)buffer + offset) =
84132d22bc83SMichal Kalderon 				    qed_calc_regdump_header(cdev, ILT_DUMP,
84148a52bbabSMichal Kalderon 							    cur_engine,
84158a52bbabSMichal Kalderon 							    feature_size,
84166c95dd8fSPrabhakar Kushwaha 							    omit_engine,
84176c95dd8fSPrabhakar Kushwaha 							    cdev->dbg_bin_dump);
84186c95dd8fSPrabhakar Kushwaha 				offset += (feature_size + REGDUMP_HEADER_SIZE);
84198a52bbabSMichal Kalderon 			} else {
84208a52bbabSMichal Kalderon 				DP_ERR(cdev, "qed_dbg_ilt failed. rc = %d\n",
84218a52bbabSMichal Kalderon 				       rc);
84228a52bbabSMichal Kalderon 			}
84238a52bbabSMichal Kalderon 		}
84243b86bd07SSudarsana Reddy Kalluru 
84256c95dd8fSPrabhakar Kushwaha 		/* Grc dump - must be last because when mcp stuck it will
8426c965db44STomer Tayar 		 * clutter idle_chk, reg_fifo, ...
8427c965db44STomer Tayar 		 */
84282d22bc83SMichal Kalderon 		for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
84292d22bc83SMichal Kalderon 			dev_data->grc.param_val[i] = grc_params[i];
84302d22bc83SMichal Kalderon 
8431c965db44STomer Tayar 		rc = qed_dbg_grc(cdev, (u8 *)buffer + offset +
8432c965db44STomer Tayar 				 REGDUMP_HEADER_SIZE, &feature_size);
8433c965db44STomer Tayar 		if (!rc) {
8434c965db44STomer Tayar 			*(u32 *)((u8 *)buffer + offset) =
84352d22bc83SMichal Kalderon 			    qed_calc_regdump_header(cdev, GRC_DUMP,
84362d22bc83SMichal Kalderon 						    cur_engine,
84376c95dd8fSPrabhakar Kushwaha 						    feature_size,
84386c95dd8fSPrabhakar Kushwaha 						    omit_engine,
84396c95dd8fSPrabhakar Kushwaha 						    cdev->dbg_bin_dump);
8440c965db44STomer Tayar 			offset += (feature_size + REGDUMP_HEADER_SIZE);
8441c965db44STomer Tayar 		} else {
8442c965db44STomer Tayar 			DP_ERR(cdev, "qed_dbg_grc failed. rc = %d", rc);
8443c965db44STomer Tayar 		}
8444c965db44STomer Tayar 	}
8445c965db44STomer Tayar 
844650bc60cbSMichal Kalderon 	qed_set_debug_engine(cdev, org_engine);
84472d22bc83SMichal Kalderon 
8448c965db44STomer Tayar 	/* mcp_trace */
8449c965db44STomer Tayar 	rc = qed_dbg_mcp_trace(cdev, (u8 *)buffer + offset +
8450c965db44STomer Tayar 			       REGDUMP_HEADER_SIZE, &feature_size);
8451c965db44STomer Tayar 	if (!rc) {
8452c965db44STomer Tayar 		*(u32 *)((u8 *)buffer + offset) =
84532d22bc83SMichal Kalderon 		    qed_calc_regdump_header(cdev, MCP_TRACE, cur_engine,
84546c95dd8fSPrabhakar Kushwaha 					    feature_size, omit_engine,
84556c95dd8fSPrabhakar Kushwaha 					    cdev->dbg_bin_dump);
8456c965db44STomer Tayar 		offset += (feature_size + REGDUMP_HEADER_SIZE);
8457c965db44STomer Tayar 	} else {
8458c965db44STomer Tayar 		DP_ERR(cdev, "qed_dbg_mcp_trace failed. rc = %d\n", rc);
8459c965db44STomer Tayar 	}
8460c965db44STomer Tayar 
84611ac4329aSDenis Bolotin 	/* nvm cfg1 */
84621ac4329aSDenis Bolotin 	rc = qed_dbg_nvm_image(cdev,
84632d22bc83SMichal Kalderon 			       (u8 *)buffer + offset +
84642d22bc83SMichal Kalderon 			       REGDUMP_HEADER_SIZE, &feature_size,
84652d22bc83SMichal Kalderon 			       QED_NVM_IMAGE_NVM_CFG1);
84661ac4329aSDenis Bolotin 	if (!rc) {
84671ac4329aSDenis Bolotin 		*(u32 *)((u8 *)buffer + offset) =
84682d22bc83SMichal Kalderon 		    qed_calc_regdump_header(cdev, NVM_CFG1, cur_engine,
84696c95dd8fSPrabhakar Kushwaha 					    feature_size, omit_engine,
84706c95dd8fSPrabhakar Kushwaha 					    cdev->dbg_bin_dump);
84711ac4329aSDenis Bolotin 		offset += (feature_size + REGDUMP_HEADER_SIZE);
84721ac4329aSDenis Bolotin 	} else if (rc != -ENOENT) {
84731ac4329aSDenis Bolotin 		DP_ERR(cdev,
84741ac4329aSDenis Bolotin 		       "qed_dbg_nvm_image failed for image  %d (%s), rc = %d\n",
84756c95dd8fSPrabhakar Kushwaha 		       QED_NVM_IMAGE_NVM_CFG1, "QED_NVM_IMAGE_NVM_CFG1",
84766c95dd8fSPrabhakar Kushwaha 		       rc);
84771ac4329aSDenis Bolotin 	}
84781ac4329aSDenis Bolotin 
84791ac4329aSDenis Bolotin 		/* nvm default */
84801ac4329aSDenis Bolotin 	rc = qed_dbg_nvm_image(cdev,
84816c95dd8fSPrabhakar Kushwaha 			       (u8 *)buffer + offset +
84826c95dd8fSPrabhakar Kushwaha 			       REGDUMP_HEADER_SIZE, &feature_size,
84836c95dd8fSPrabhakar Kushwaha 			       QED_NVM_IMAGE_DEFAULT_CFG);
84841ac4329aSDenis Bolotin 	if (!rc) {
84851ac4329aSDenis Bolotin 		*(u32 *)((u8 *)buffer + offset) =
84866c95dd8fSPrabhakar Kushwaha 		    qed_calc_regdump_header(cdev, DEFAULT_CFG,
84876c95dd8fSPrabhakar Kushwaha 					    cur_engine, feature_size,
84886c95dd8fSPrabhakar Kushwaha 					    omit_engine,
84896c95dd8fSPrabhakar Kushwaha 					    cdev->dbg_bin_dump);
84901ac4329aSDenis Bolotin 		offset += (feature_size + REGDUMP_HEADER_SIZE);
84911ac4329aSDenis Bolotin 	} else if (rc != -ENOENT) {
84921ac4329aSDenis Bolotin 		DP_ERR(cdev,
84931ac4329aSDenis Bolotin 		       "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
84946c95dd8fSPrabhakar Kushwaha 		       QED_NVM_IMAGE_DEFAULT_CFG,
84956c95dd8fSPrabhakar Kushwaha 		       "QED_NVM_IMAGE_DEFAULT_CFG", rc);
84961ac4329aSDenis Bolotin 	}
84971ac4329aSDenis Bolotin 
84981ac4329aSDenis Bolotin 	/* nvm meta */
84991ac4329aSDenis Bolotin 	rc = qed_dbg_nvm_image(cdev,
85006c95dd8fSPrabhakar Kushwaha 			       (u8 *)buffer + offset +
85016c95dd8fSPrabhakar Kushwaha 			       REGDUMP_HEADER_SIZE, &feature_size,
85026c95dd8fSPrabhakar Kushwaha 			       QED_NVM_IMAGE_NVM_META);
85031ac4329aSDenis Bolotin 	if (!rc) {
85041ac4329aSDenis Bolotin 		*(u32 *)((u8 *)buffer + offset) =
85052d22bc83SMichal Kalderon 		    qed_calc_regdump_header(cdev, NVM_META, cur_engine,
85066c95dd8fSPrabhakar Kushwaha 					    feature_size, omit_engine,
85076c95dd8fSPrabhakar Kushwaha 					    cdev->dbg_bin_dump);
85081ac4329aSDenis Bolotin 		offset += (feature_size + REGDUMP_HEADER_SIZE);
85091ac4329aSDenis Bolotin 	} else if (rc != -ENOENT) {
85101ac4329aSDenis Bolotin 		DP_ERR(cdev,
85111ac4329aSDenis Bolotin 		       "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
85126c95dd8fSPrabhakar Kushwaha 		       QED_NVM_IMAGE_NVM_META, "QED_NVM_IMAGE_NVM_META",
85136c95dd8fSPrabhakar Kushwaha 		       rc);
85141ac4329aSDenis Bolotin 	}
85151ac4329aSDenis Bolotin 
85168a52bbabSMichal Kalderon 	/* nvm mdump */
85178a52bbabSMichal Kalderon 	rc = qed_dbg_nvm_image(cdev, (u8 *)buffer + offset +
85188a52bbabSMichal Kalderon 			       REGDUMP_HEADER_SIZE, &feature_size,
85198a52bbabSMichal Kalderon 			       QED_NVM_IMAGE_MDUMP);
85208a52bbabSMichal Kalderon 	if (!rc) {
85218a52bbabSMichal Kalderon 		*(u32 *)((u8 *)buffer + offset) =
85222d22bc83SMichal Kalderon 		    qed_calc_regdump_header(cdev, MDUMP, cur_engine,
85236c95dd8fSPrabhakar Kushwaha 					    feature_size, omit_engine,
85246c95dd8fSPrabhakar Kushwaha 					    cdev->dbg_bin_dump);
85258a52bbabSMichal Kalderon 		offset += (feature_size + REGDUMP_HEADER_SIZE);
85268a52bbabSMichal Kalderon 	} else if (rc != -ENOENT) {
85278a52bbabSMichal Kalderon 		DP_ERR(cdev,
85288a52bbabSMichal Kalderon 		       "qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
85298a52bbabSMichal Kalderon 		       QED_NVM_IMAGE_MDUMP, "QED_NVM_IMAGE_MDUMP", rc);
85308a52bbabSMichal Kalderon 	}
85318a52bbabSMichal Kalderon 
85322d22bc83SMichal Kalderon 	mutex_unlock(&qed_dbg_lock);
85336c95dd8fSPrabhakar Kushwaha 	cdev->dbg_bin_dump = 0;
85342d22bc83SMichal Kalderon 
8535c965db44STomer Tayar 	return 0;
8536c965db44STomer Tayar }
8537c965db44STomer Tayar 
qed_dbg_all_data_size(struct qed_dev * cdev)8538c965db44STomer Tayar int qed_dbg_all_data_size(struct qed_dev *cdev)
8539c965db44STomer Tayar {
85408a52bbabSMichal Kalderon 	u32 regs_len = 0, image_len = 0, ilt_len = 0, total_ilt_len = 0;
85416c95dd8fSPrabhakar Kushwaha 	struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug];
8542c965db44STomer Tayar 	u8 cur_engine, org_engine;
8543c965db44STomer Tayar 
85442d22bc83SMichal Kalderon 	cdev->disable_ilt_dump = false;
8545c965db44STomer Tayar 	org_engine = qed_get_debug_engine(cdev);
8546c965db44STomer Tayar 	for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) {
8547c965db44STomer Tayar 		/* Engine specific */
8548c965db44STomer Tayar 		DP_VERBOSE(cdev, QED_MSG_DEBUG,
8549c965db44STomer Tayar 			   "calculating idle_chk and grcdump register length for current engine\n");
8550c965db44STomer Tayar 		qed_set_debug_engine(cdev, cur_engine);
8551c965db44STomer Tayar 		regs_len += REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) +
8552c965db44STomer Tayar 		    REGDUMP_HEADER_SIZE + qed_dbg_idle_chk_size(cdev) +
8553c965db44STomer Tayar 		    REGDUMP_HEADER_SIZE + qed_dbg_grc_size(cdev) +
8554c965db44STomer Tayar 		    REGDUMP_HEADER_SIZE + qed_dbg_reg_fifo_size(cdev) +
8555c965db44STomer Tayar 		    REGDUMP_HEADER_SIZE + qed_dbg_igu_fifo_size(cdev) +
8556c965db44STomer Tayar 		    REGDUMP_HEADER_SIZE +
8557c965db44STomer Tayar 		    qed_dbg_protection_override_size(cdev) +
8558c965db44STomer Tayar 		    REGDUMP_HEADER_SIZE + qed_dbg_fw_asserts_size(cdev);
85598a52bbabSMichal Kalderon 		ilt_len = REGDUMP_HEADER_SIZE + qed_dbg_ilt_size(cdev);
85608a52bbabSMichal Kalderon 		if (ilt_len < ILT_DUMP_MAX_SIZE) {
85618a52bbabSMichal Kalderon 			total_ilt_len += ilt_len;
85628a52bbabSMichal Kalderon 			regs_len += ilt_len;
85638a52bbabSMichal Kalderon 		}
8564c965db44STomer Tayar 	}
8565c965db44STomer Tayar 
856650bc60cbSMichal Kalderon 	qed_set_debug_engine(cdev, org_engine);
856750bc60cbSMichal Kalderon 
8568c965db44STomer Tayar 	/* Engine common */
85696c95dd8fSPrabhakar Kushwaha 	regs_len += REGDUMP_HEADER_SIZE + qed_dbg_mcp_trace_size(cdev) +
85706c95dd8fSPrabhakar Kushwaha 	    REGDUMP_HEADER_SIZE + qed_dbg_phy_size(cdev);
85711ac4329aSDenis Bolotin 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_CFG1, &image_len);
85721ac4329aSDenis Bolotin 	if (image_len)
85731ac4329aSDenis Bolotin 		regs_len += REGDUMP_HEADER_SIZE + image_len;
85741ac4329aSDenis Bolotin 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_DEFAULT_CFG, &image_len);
85751ac4329aSDenis Bolotin 	if (image_len)
85761ac4329aSDenis Bolotin 		regs_len += REGDUMP_HEADER_SIZE + image_len;
85771ac4329aSDenis Bolotin 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_META, &image_len);
85781ac4329aSDenis Bolotin 	if (image_len)
85791ac4329aSDenis Bolotin 		regs_len += REGDUMP_HEADER_SIZE + image_len;
85808a52bbabSMichal Kalderon 	qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_MDUMP, &image_len);
85818a52bbabSMichal Kalderon 	if (image_len)
85828a52bbabSMichal Kalderon 		regs_len += REGDUMP_HEADER_SIZE + image_len;
85838a52bbabSMichal Kalderon 
85848a52bbabSMichal Kalderon 	if (regs_len > REGDUMP_MAX_SIZE) {
85858a52bbabSMichal Kalderon 		DP_VERBOSE(cdev, QED_MSG_DEBUG,
85868a52bbabSMichal Kalderon 			   "Dump exceeds max size 0x%x, disable ILT dump\n",
85878a52bbabSMichal Kalderon 			   REGDUMP_MAX_SIZE);
85888a52bbabSMichal Kalderon 		cdev->disable_ilt_dump = true;
85898a52bbabSMichal Kalderon 		regs_len -= total_ilt_len;
85908a52bbabSMichal Kalderon 	}
8591c965db44STomer Tayar 
8592c965db44STomer Tayar 	return regs_len;
8593c965db44STomer Tayar }
8594c965db44STomer Tayar 
qed_dbg_feature(struct qed_dev * cdev,void * buffer,enum qed_dbg_features feature,u32 * num_dumped_bytes)8595c965db44STomer Tayar int qed_dbg_feature(struct qed_dev *cdev, void *buffer,
8596c965db44STomer Tayar 		    enum qed_dbg_features feature, u32 *num_dumped_bytes)
8597c965db44STomer Tayar {
85986c95dd8fSPrabhakar Kushwaha 	struct qed_dbg_feature *qed_feature = &cdev->dbg_features[feature];
85996c95dd8fSPrabhakar Kushwaha 	struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug];
8600c965db44STomer Tayar 	enum dbg_status dbg_rc;
8601c965db44STomer Tayar 	struct qed_ptt *p_ptt;
8602c965db44STomer Tayar 	int rc = 0;
8603c965db44STomer Tayar 
8604c965db44STomer Tayar 	/* Acquire ptt */
8605c965db44STomer Tayar 	p_ptt = qed_ptt_acquire(p_hwfn);
8606c965db44STomer Tayar 	if (!p_ptt)
8607c965db44STomer Tayar 		return -EINVAL;
8608c965db44STomer Tayar 
8609c965db44STomer Tayar 	/* Get dump */
8610c965db44STomer Tayar 	dbg_rc = qed_dbg_dump(p_hwfn, p_ptt, feature);
8611c965db44STomer Tayar 	if (dbg_rc != DBG_STATUS_OK) {
8612c965db44STomer Tayar 		DP_VERBOSE(cdev, QED_MSG_DEBUG, "%s\n",
8613c965db44STomer Tayar 			   qed_dbg_get_status_str(dbg_rc));
8614c965db44STomer Tayar 		*num_dumped_bytes = 0;
8615c965db44STomer Tayar 		rc = -EINVAL;
8616c965db44STomer Tayar 		goto out;
8617c965db44STomer Tayar 	}
8618c965db44STomer Tayar 
8619c965db44STomer Tayar 	DP_VERBOSE(cdev, QED_MSG_DEBUG,
8620c965db44STomer Tayar 		   "copying debugfs feature to external buffer\n");
8621c965db44STomer Tayar 	memcpy(buffer, qed_feature->dump_buf, qed_feature->buf_size);
8622ca352f00SIgor Russkikh 	*num_dumped_bytes = cdev->dbg_features[feature].dumped_dwords *
8623c965db44STomer Tayar 			    4;
8624c965db44STomer Tayar 
8625c965db44STomer Tayar out:
8626c965db44STomer Tayar 	qed_ptt_release(p_hwfn, p_ptt);
8627c965db44STomer Tayar 	return rc;
8628c965db44STomer Tayar }
8629c965db44STomer Tayar 
qed_dbg_feature_size(struct qed_dev * cdev,enum qed_dbg_features feature)8630c965db44STomer Tayar int qed_dbg_feature_size(struct qed_dev *cdev, enum qed_dbg_features feature)
8631c965db44STomer Tayar {
86322d22bc83SMichal Kalderon 	struct qed_dbg_feature *qed_feature = &cdev->dbg_features[feature];
86336c95dd8fSPrabhakar Kushwaha 	struct qed_hwfn *p_hwfn = &cdev->hwfns[cdev->engine_for_debug];
8634c965db44STomer Tayar 	struct qed_ptt *p_ptt = qed_ptt_acquire(p_hwfn);
8635c965db44STomer Tayar 	u32 buf_size_dwords;
8636c965db44STomer Tayar 	enum dbg_status rc;
8637c965db44STomer Tayar 
8638c965db44STomer Tayar 	if (!p_ptt)
8639c965db44STomer Tayar 		return -EINVAL;
8640c965db44STomer Tayar 
8641c965db44STomer Tayar 	rc = qed_features_lookup[feature].get_size(p_hwfn, p_ptt,
8642c965db44STomer Tayar 						   &buf_size_dwords);
8643c965db44STomer Tayar 	if (rc != DBG_STATUS_OK)
8644c965db44STomer Tayar 		buf_size_dwords = 0;
8645c965db44STomer Tayar 
86468a52bbabSMichal Kalderon 	/* Feature will not be dumped if it exceeds maximum size */
86478a52bbabSMichal Kalderon 	if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS)
86488a52bbabSMichal Kalderon 		buf_size_dwords = 0;
86498a52bbabSMichal Kalderon 
8650c965db44STomer Tayar 	qed_ptt_release(p_hwfn, p_ptt);
8651c965db44STomer Tayar 	qed_feature->buf_size = buf_size_dwords * sizeof(u32);
8652c965db44STomer Tayar 	return qed_feature->buf_size;
8653c965db44STomer Tayar }
8654c965db44STomer Tayar 
qed_dbg_phy_size(struct qed_dev * cdev)86556c95dd8fSPrabhakar Kushwaha int qed_dbg_phy_size(struct qed_dev *cdev)
86566c95dd8fSPrabhakar Kushwaha {
86576c95dd8fSPrabhakar Kushwaha 	/* return max size of phy info and
86586c95dd8fSPrabhakar Kushwaha 	 * phy mac_stat multiplied by the number of ports
86596c95dd8fSPrabhakar Kushwaha 	 */
86606c95dd8fSPrabhakar Kushwaha 	return MAX_PHY_RESULT_BUFFER * (1 + qed_device_num_ports(cdev));
86616c95dd8fSPrabhakar Kushwaha }
86626c95dd8fSPrabhakar Kushwaha 
qed_get_debug_engine(struct qed_dev * cdev)8663c965db44STomer Tayar u8 qed_get_debug_engine(struct qed_dev *cdev)
8664c965db44STomer Tayar {
8665ca352f00SIgor Russkikh 	return cdev->engine_for_debug;
8666c965db44STomer Tayar }
8667c965db44STomer Tayar 
qed_set_debug_engine(struct qed_dev * cdev,int engine_number)8668c965db44STomer Tayar void qed_set_debug_engine(struct qed_dev *cdev, int engine_number)
8669c965db44STomer Tayar {
8670c965db44STomer Tayar 	DP_VERBOSE(cdev, QED_MSG_DEBUG, "set debug engine to %d\n",
8671c965db44STomer Tayar 		   engine_number);
8672ca352f00SIgor Russkikh 	cdev->engine_for_debug = engine_number;
8673c965db44STomer Tayar }
8674c965db44STomer Tayar 
qed_dbg_pf_init(struct qed_dev * cdev)8675c965db44STomer Tayar void qed_dbg_pf_init(struct qed_dev *cdev)
8676c965db44STomer Tayar {
86772d22bc83SMichal Kalderon 	const u8 *dbg_values = NULL;
86782d22bc83SMichal Kalderon 	int i;
8679c965db44STomer Tayar 
86806c95dd8fSPrabhakar Kushwaha 	/* Sync ver with debugbus qed code */
86816c95dd8fSPrabhakar Kushwaha 	qed_dbg_set_app_ver(TOOLS_VERSION);
86826c95dd8fSPrabhakar Kushwaha 
8683c965db44STomer Tayar 	/* Debug values are after init values.
8684c965db44STomer Tayar 	 * The offset is the first dword of the file.
8685c965db44STomer Tayar 	 */
8686c965db44STomer Tayar 	dbg_values = cdev->firmware->data + *(u32 *)cdev->firmware->data;
86872d22bc83SMichal Kalderon 
86882d22bc83SMichal Kalderon 	for_each_hwfn(cdev, i) {
86892d22bc83SMichal Kalderon 		qed_dbg_set_bin_ptr(&cdev->hwfns[i], dbg_values);
86902d22bc83SMichal Kalderon 		qed_dbg_user_set_bin_ptr(&cdev->hwfns[i], dbg_values);
86912d22bc83SMichal Kalderon 	}
86922d22bc83SMichal Kalderon 
86932d22bc83SMichal Kalderon 	/* Set the hwfn to be 0 as default */
8694ca352f00SIgor Russkikh 	cdev->engine_for_debug = 0;
8695c965db44STomer Tayar }
8696c965db44STomer Tayar 
qed_dbg_pf_exit(struct qed_dev * cdev)8697c965db44STomer Tayar void qed_dbg_pf_exit(struct qed_dev *cdev)
8698c965db44STomer Tayar {
8699c965db44STomer Tayar 	struct qed_dbg_feature *feature = NULL;
8700c965db44STomer Tayar 	enum qed_dbg_features feature_idx;
8701c965db44STomer Tayar 
87022d22bc83SMichal Kalderon 	/* debug features' buffers may be allocated if debug feature was used
87032d22bc83SMichal Kalderon 	 * but dump wasn't called
8704c965db44STomer Tayar 	 */
8705c965db44STomer Tayar 	for (feature_idx = 0; feature_idx < DBG_FEATURE_NUM; feature_idx++) {
87062d22bc83SMichal Kalderon 		feature = &cdev->dbg_features[feature_idx];
8707c965db44STomer Tayar 		if (feature->dump_buf) {
8708c965db44STomer Tayar 			vfree(feature->dump_buf);
8709c965db44STomer Tayar 			feature->dump_buf = NULL;
8710c965db44STomer Tayar 		}
8711c965db44STomer Tayar 	}
8712c965db44STomer Tayar }
8713