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 = ®s[0].cond_reg;
37367b6859fbSMintz, Yuval info_regs = ®s[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 = ®s[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, ¶m_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 ¶m_name,
6439c965db44STomer Tayar ¶m_str_val, ¶m_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 §ion_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 §ion_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 ¶m_name, ¶m_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 ¶m_name,
66786c95dd8fSPrabhakar Kushwaha ¶m_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 §ion_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 §ion_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 ¶m_name, ¶m_str_val, ¶m_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 §ion_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 ¶m_name, ¶m_str_val, ¶m_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 §ion_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 §ion_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 ¶m_name, ¶m_str_val, ¶m_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 §ion_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 §ion_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 ¶m_name, ¶m_str_val, ¶m_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 §ion_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 §ion_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 ¶m_name, ¶m_str_val, ¶m_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 §ion_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 §ion_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 ¶m_name,
74797b6859fbSMintz, Yuval ¶m_str_val,
74807b6859fbSMintz, Yuval ¶m_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