1  /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2  /* QLogic qed NIC Driver
3   * Copyright (c) 2019-2021 Marvell International Ltd.
4   */
5  #ifndef _QED_DBG_HSI_H
6  #define _QED_DBG_HSI_H
7  
8  #include <linux/types.h>
9  #include <linux/io.h>
10  #include <linux/bitops.h>
11  #include <linux/delay.h>
12  #include <linux/kernel.h>
13  #include <linux/list.h>
14  #include <linux/slab.h>
15  
16  /****************************************/
17  /* Debug Tools HSI constants and macros */
18  /****************************************/
19  
20  enum block_id {
21  	BLOCK_GRC,
22  	BLOCK_MISCS,
23  	BLOCK_MISC,
24  	BLOCK_DBU,
25  	BLOCK_PGLUE_B,
26  	BLOCK_CNIG,
27  	BLOCK_CPMU,
28  	BLOCK_NCSI,
29  	BLOCK_OPTE,
30  	BLOCK_BMB,
31  	BLOCK_PCIE,
32  	BLOCK_MCP,
33  	BLOCK_MCP2,
34  	BLOCK_PSWHST,
35  	BLOCK_PSWHST2,
36  	BLOCK_PSWRD,
37  	BLOCK_PSWRD2,
38  	BLOCK_PSWWR,
39  	BLOCK_PSWWR2,
40  	BLOCK_PSWRQ,
41  	BLOCK_PSWRQ2,
42  	BLOCK_PGLCS,
43  	BLOCK_DMAE,
44  	BLOCK_PTU,
45  	BLOCK_TCM,
46  	BLOCK_MCM,
47  	BLOCK_UCM,
48  	BLOCK_XCM,
49  	BLOCK_YCM,
50  	BLOCK_PCM,
51  	BLOCK_QM,
52  	BLOCK_TM,
53  	BLOCK_DORQ,
54  	BLOCK_BRB,
55  	BLOCK_SRC,
56  	BLOCK_PRS,
57  	BLOCK_TSDM,
58  	BLOCK_MSDM,
59  	BLOCK_USDM,
60  	BLOCK_XSDM,
61  	BLOCK_YSDM,
62  	BLOCK_PSDM,
63  	BLOCK_TSEM,
64  	BLOCK_MSEM,
65  	BLOCK_USEM,
66  	BLOCK_XSEM,
67  	BLOCK_YSEM,
68  	BLOCK_PSEM,
69  	BLOCK_RSS,
70  	BLOCK_TMLD,
71  	BLOCK_MULD,
72  	BLOCK_YULD,
73  	BLOCK_XYLD,
74  	BLOCK_PRM,
75  	BLOCK_PBF_PB1,
76  	BLOCK_PBF_PB2,
77  	BLOCK_RPB,
78  	BLOCK_BTB,
79  	BLOCK_PBF,
80  	BLOCK_RDIF,
81  	BLOCK_TDIF,
82  	BLOCK_CDU,
83  	BLOCK_CCFC,
84  	BLOCK_TCFC,
85  	BLOCK_IGU,
86  	BLOCK_CAU,
87  	BLOCK_UMAC,
88  	BLOCK_XMAC,
89  	BLOCK_MSTAT,
90  	BLOCK_DBG,
91  	BLOCK_NIG,
92  	BLOCK_WOL,
93  	BLOCK_BMBN,
94  	BLOCK_IPC,
95  	BLOCK_NWM,
96  	BLOCK_NWS,
97  	BLOCK_MS,
98  	BLOCK_PHY_PCIE,
99  	BLOCK_LED,
100  	BLOCK_AVS_WRAP,
101  	BLOCK_PXPREQBUS,
102  	BLOCK_BAR0_MAP,
103  	BLOCK_MCP_FIO,
104  	BLOCK_LAST_INIT,
105  	BLOCK_PRS_FC,
106  	BLOCK_PBF_FC,
107  	BLOCK_NIG_LB_FC,
108  	BLOCK_NIG_LB_FC_PLLH,
109  	BLOCK_NIG_TX_FC_PLLH,
110  	BLOCK_NIG_TX_FC,
111  	BLOCK_NIG_RX_FC_PLLH,
112  	BLOCK_NIG_RX_FC,
113  	MAX_BLOCK_ID
114  };
115  
116  /* binary debug buffer types */
117  enum bin_dbg_buffer_type {
118  	BIN_BUF_DBG_MODE_TREE,
119  	BIN_BUF_DBG_DUMP_REG,
120  	BIN_BUF_DBG_DUMP_MEM,
121  	BIN_BUF_DBG_IDLE_CHK_REGS,
122  	BIN_BUF_DBG_IDLE_CHK_IMMS,
123  	BIN_BUF_DBG_IDLE_CHK_RULES,
124  	BIN_BUF_DBG_IDLE_CHK_PARSING_DATA,
125  	BIN_BUF_DBG_ATTN_BLOCKS,
126  	BIN_BUF_DBG_ATTN_REGS,
127  	BIN_BUF_DBG_ATTN_INDEXES,
128  	BIN_BUF_DBG_ATTN_NAME_OFFSETS,
129  	BIN_BUF_DBG_BLOCKS,
130  	BIN_BUF_DBG_BLOCKS_CHIP_DATA,
131  	BIN_BUF_DBG_BUS_LINES,
132  	BIN_BUF_DBG_BLOCKS_USER_DATA,
133  	BIN_BUF_DBG_BLOCKS_CHIP_USER_DATA,
134  	BIN_BUF_DBG_BUS_LINE_NAME_OFFSETS,
135  	BIN_BUF_DBG_RESET_REGS,
136  	BIN_BUF_DBG_PARSING_STRINGS,
137  	MAX_BIN_DBG_BUFFER_TYPE
138  };
139  
140  /* Attention bit mapping */
141  struct dbg_attn_bit_mapping {
142  	u16 data;
143  #define DBG_ATTN_BIT_MAPPING_VAL_MASK			0x7FFF
144  #define DBG_ATTN_BIT_MAPPING_VAL_SHIFT			0
145  #define DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT_MASK	0x1
146  #define DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT_SHIFT	15
147  };
148  
149  /* Attention block per-type data */
150  struct dbg_attn_block_type_data {
151  	u16 names_offset;
152  	u16 reserved1;
153  	u8 num_regs;
154  	u8 reserved2;
155  	u16 regs_offset;
156  
157  };
158  
159  /* Block attentions */
160  struct dbg_attn_block {
161  	struct dbg_attn_block_type_data per_type_data[2];
162  };
163  
164  /* Attention register result */
165  struct dbg_attn_reg_result {
166  	u32 data;
167  #define DBG_ATTN_REG_RESULT_STS_ADDRESS_MASK	0xFFFFFF
168  #define DBG_ATTN_REG_RESULT_STS_ADDRESS_SHIFT	0
169  #define DBG_ATTN_REG_RESULT_NUM_REG_ATTN_MASK	0xFF
170  #define DBG_ATTN_REG_RESULT_NUM_REG_ATTN_SHIFT	24
171  	u16 block_attn_offset;
172  	u16 reserved;
173  	u32 sts_val;
174  	u32 mask_val;
175  };
176  
177  /* Attention block result */
178  struct dbg_attn_block_result {
179  	u8 block_id;
180  	u8 data;
181  #define DBG_ATTN_BLOCK_RESULT_ATTN_TYPE_MASK	0x3
182  #define DBG_ATTN_BLOCK_RESULT_ATTN_TYPE_SHIFT	0
183  #define DBG_ATTN_BLOCK_RESULT_NUM_REGS_MASK	0x3F
184  #define DBG_ATTN_BLOCK_RESULT_NUM_REGS_SHIFT	2
185  	u16 names_offset;
186  	struct dbg_attn_reg_result reg_results[15];
187  };
188  
189  /* Mode header */
190  struct dbg_mode_hdr {
191  	u16 data;
192  #define DBG_MODE_HDR_EVAL_MODE_MASK		0x1
193  #define DBG_MODE_HDR_EVAL_MODE_SHIFT		0
194  #define DBG_MODE_HDR_MODES_BUF_OFFSET_MASK	0x7FFF
195  #define DBG_MODE_HDR_MODES_BUF_OFFSET_SHIFT	1
196  };
197  
198  /* Attention register */
199  struct dbg_attn_reg {
200  	struct dbg_mode_hdr mode;
201  	u16 block_attn_offset;
202  	u32 data;
203  #define DBG_ATTN_REG_STS_ADDRESS_MASK	0xFFFFFF
204  #define DBG_ATTN_REG_STS_ADDRESS_SHIFT	0
205  #define DBG_ATTN_REG_NUM_REG_ATTN_MASK	0xFF
206  #define DBG_ATTN_REG_NUM_REG_ATTN_SHIFT 24
207  	u32 sts_clr_address;
208  	u32 mask_address;
209  };
210  
211  /* Attention types */
212  enum dbg_attn_type {
213  	ATTN_TYPE_INTERRUPT,
214  	ATTN_TYPE_PARITY,
215  	MAX_DBG_ATTN_TYPE
216  };
217  
218  /* Block debug data */
219  struct dbg_block {
220  	u8 name[15];
221  	u8 associated_storm_letter;
222  };
223  
224  /* Chip-specific block debug data */
225  struct dbg_block_chip {
226  	u8 flags;
227  #define DBG_BLOCK_CHIP_IS_REMOVED_MASK		 0x1
228  #define DBG_BLOCK_CHIP_IS_REMOVED_SHIFT		 0
229  #define DBG_BLOCK_CHIP_HAS_RESET_REG_MASK	 0x1
230  #define DBG_BLOCK_CHIP_HAS_RESET_REG_SHIFT	 1
231  #define DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP_MASK  0x1
232  #define DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP_SHIFT 2
233  #define DBG_BLOCK_CHIP_HAS_DBG_BUS_MASK		 0x1
234  #define DBG_BLOCK_CHIP_HAS_DBG_BUS_SHIFT	 3
235  #define DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS_MASK	 0x1
236  #define DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS_SHIFT  4
237  #define DBG_BLOCK_CHIP_RESERVED0_MASK		 0x7
238  #define DBG_BLOCK_CHIP_RESERVED0_SHIFT		 5
239  	u8 dbg_client_id;
240  	u8 reset_reg_id;
241  	u8 reset_reg_bit_offset;
242  	struct dbg_mode_hdr dbg_bus_mode;
243  	u16 reserved1;
244  	u8 reserved2;
245  	u8 num_of_dbg_bus_lines;
246  	u16 dbg_bus_lines_offset;
247  	u32 dbg_select_reg_addr;
248  	u32 dbg_dword_enable_reg_addr;
249  	u32 dbg_shift_reg_addr;
250  	u32 dbg_force_valid_reg_addr;
251  	u32 dbg_force_frame_reg_addr;
252  };
253  
254  /* Chip-specific block user debug data */
255  struct dbg_block_chip_user {
256  	u8 num_of_dbg_bus_lines;
257  	u8 has_latency_events;
258  	u16 names_offset;
259  };
260  
261  /* Block user debug data */
262  struct dbg_block_user {
263  	u8 name[16];
264  };
265  
266  /* Block Debug line data */
267  struct dbg_bus_line {
268  	u8 data;
269  #define DBG_BUS_LINE_NUM_OF_GROUPS_MASK		0xF
270  #define DBG_BUS_LINE_NUM_OF_GROUPS_SHIFT	0
271  #define DBG_BUS_LINE_IS_256B_MASK		0x1
272  #define DBG_BUS_LINE_IS_256B_SHIFT		4
273  #define DBG_BUS_LINE_RESERVED_MASK		0x7
274  #define DBG_BUS_LINE_RESERVED_SHIFT		5
275  	u8 group_sizes;
276  };
277  
278  /* Condition header for registers dump */
279  struct dbg_dump_cond_hdr {
280  	struct dbg_mode_hdr mode; /* Mode header */
281  	u8 block_id; /* block ID */
282  	u8 data_size; /* size in dwords of the data following this header */
283  };
284  
285  /* Memory data for registers dump */
286  struct dbg_dump_mem {
287  	u32 dword0;
288  #define DBG_DUMP_MEM_ADDRESS_MASK	0xFFFFFF
289  #define DBG_DUMP_MEM_ADDRESS_SHIFT	0
290  #define DBG_DUMP_MEM_MEM_GROUP_ID_MASK	0xFF
291  #define DBG_DUMP_MEM_MEM_GROUP_ID_SHIFT	24
292  	u32 dword1;
293  #define DBG_DUMP_MEM_LENGTH_MASK	0xFFFFFF
294  #define DBG_DUMP_MEM_LENGTH_SHIFT	0
295  #define DBG_DUMP_MEM_WIDE_BUS_MASK	0x1
296  #define DBG_DUMP_MEM_WIDE_BUS_SHIFT	24
297  #define DBG_DUMP_MEM_RESERVED_MASK	0x7F
298  #define DBG_DUMP_MEM_RESERVED_SHIFT	25
299  };
300  
301  /* Register data for registers dump */
302  struct dbg_dump_reg {
303  	u32 data;
304  #define DBG_DUMP_REG_ADDRESS_MASK	0x7FFFFF
305  #define DBG_DUMP_REG_ADDRESS_SHIFT	0
306  #define DBG_DUMP_REG_WIDE_BUS_MASK	0x1
307  #define DBG_DUMP_REG_WIDE_BUS_SHIFT	23
308  #define DBG_DUMP_REG_LENGTH_MASK	0xFF
309  #define DBG_DUMP_REG_LENGTH_SHIFT	24
310  };
311  
312  /* Split header for registers dump */
313  struct dbg_dump_split_hdr {
314  	u32 hdr;
315  #define DBG_DUMP_SPLIT_HDR_DATA_SIZE_MASK	0xFFFFFF
316  #define DBG_DUMP_SPLIT_HDR_DATA_SIZE_SHIFT	0
317  #define DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID_MASK	0xFF
318  #define DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID_SHIFT	24
319  };
320  
321  /* Condition header for idle check */
322  struct dbg_idle_chk_cond_hdr {
323  	struct dbg_mode_hdr mode; /* Mode header */
324  	u16 data_size; /* size in dwords of the data following this header */
325  };
326  
327  /* Idle Check condition register */
328  struct dbg_idle_chk_cond_reg {
329  	u32 data;
330  #define DBG_IDLE_CHK_COND_REG_ADDRESS_MASK	0x7FFFFF
331  #define DBG_IDLE_CHK_COND_REG_ADDRESS_SHIFT	0
332  #define DBG_IDLE_CHK_COND_REG_WIDE_BUS_MASK	0x1
333  #define DBG_IDLE_CHK_COND_REG_WIDE_BUS_SHIFT	23
334  #define DBG_IDLE_CHK_COND_REG_BLOCK_ID_MASK	0xFF
335  #define DBG_IDLE_CHK_COND_REG_BLOCK_ID_SHIFT	24
336  	u16 num_entries;
337  	u8 entry_size;
338  	u8 start_entry;
339  };
340  
341  /* Idle Check info register */
342  struct dbg_idle_chk_info_reg {
343  	u32 data;
344  #define DBG_IDLE_CHK_INFO_REG_ADDRESS_MASK	0x7FFFFF
345  #define DBG_IDLE_CHK_INFO_REG_ADDRESS_SHIFT	0
346  #define DBG_IDLE_CHK_INFO_REG_WIDE_BUS_MASK	0x1
347  #define DBG_IDLE_CHK_INFO_REG_WIDE_BUS_SHIFT	23
348  #define DBG_IDLE_CHK_INFO_REG_BLOCK_ID_MASK	0xFF
349  #define DBG_IDLE_CHK_INFO_REG_BLOCK_ID_SHIFT	24
350  	u16 size; /* register size in dwords */
351  	struct dbg_mode_hdr mode; /* Mode header */
352  };
353  
354  /* Idle Check register */
355  union dbg_idle_chk_reg {
356  	struct dbg_idle_chk_cond_reg cond_reg; /* condition register */
357  	struct dbg_idle_chk_info_reg info_reg; /* info register */
358  };
359  
360  /* Idle Check result header */
361  struct dbg_idle_chk_result_hdr {
362  	u16 rule_id; /* Failing rule index */
363  	u16 mem_entry_id; /* Failing memory entry index */
364  	u8 num_dumped_cond_regs; /* number of dumped condition registers */
365  	u8 num_dumped_info_regs; /* number of dumped condition registers */
366  	u8 severity; /* from dbg_idle_chk_severity_types enum */
367  	u8 reserved;
368  };
369  
370  /* Idle Check result register header */
371  struct dbg_idle_chk_result_reg_hdr {
372  	u8 data;
373  #define DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM_MASK  0x1
374  #define DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM_SHIFT 0
375  #define DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID_MASK  0x7F
376  #define DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID_SHIFT 1
377  	u8 start_entry; /* index of the first checked entry */
378  	u16 size; /* register size in dwords */
379  };
380  
381  /* Idle Check rule */
382  struct dbg_idle_chk_rule {
383  	u16 rule_id; /* Idle Check rule ID */
384  	u8 severity; /* value from dbg_idle_chk_severity_types enum */
385  	u8 cond_id; /* Condition ID */
386  	u8 num_cond_regs; /* number of condition registers */
387  	u8 num_info_regs; /* number of info registers */
388  	u8 num_imms; /* number of immediates in the condition */
389  	u8 reserved1;
390  	u16 reg_offset; /* offset of this rules registers in the idle check
391  			 * register array (in dbg_idle_chk_reg units).
392  			 */
393  	u16 imm_offset; /* offset of this rules immediate values in the
394  			 * immediate values array (in dwords).
395  			 */
396  };
397  
398  /* Idle Check rule parsing data */
399  struct dbg_idle_chk_rule_parsing_data {
400  	u32 data;
401  #define DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG_MASK	0x1
402  #define DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG_SHIFT	0
403  #define DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET_MASK	0x7FFFFFFF
404  #define DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET_SHIFT	1
405  };
406  
407  /* Idle check severity types */
408  enum dbg_idle_chk_severity_types {
409  	/* idle check failure should cause an error */
410  	IDLE_CHK_SEVERITY_ERROR,
411  	/* idle check failure should cause an error only if theres no traffic */
412  	IDLE_CHK_SEVERITY_ERROR_NO_TRAFFIC,
413  	/* idle check failure should cause a warning */
414  	IDLE_CHK_SEVERITY_WARNING,
415  	MAX_DBG_IDLE_CHK_SEVERITY_TYPES
416  };
417  
418  /* Reset register */
419  struct dbg_reset_reg {
420  	u32 data;
421  #define DBG_RESET_REG_ADDR_MASK        0xFFFFFF
422  #define DBG_RESET_REG_ADDR_SHIFT       0
423  #define DBG_RESET_REG_IS_REMOVED_MASK  0x1
424  #define DBG_RESET_REG_IS_REMOVED_SHIFT 24
425  #define DBG_RESET_REG_RESERVED_MASK    0x7F
426  #define DBG_RESET_REG_RESERVED_SHIFT   25
427  };
428  
429  /* Debug Bus block data */
430  struct dbg_bus_block_data {
431  	u8 enable_mask;
432  	u8 right_shift;
433  	u8 force_valid_mask;
434  	u8 force_frame_mask;
435  	u8 dword_mask;
436  	u8 line_num;
437  	u8 hw_id;
438  	u8 flags;
439  #define DBG_BUS_BLOCK_DATA_IS_256B_LINE_MASK  0x1
440  #define DBG_BUS_BLOCK_DATA_IS_256B_LINE_SHIFT 0
441  #define DBG_BUS_BLOCK_DATA_RESERVED_MASK      0x7F
442  #define DBG_BUS_BLOCK_DATA_RESERVED_SHIFT     1
443  };
444  
445  enum dbg_bus_clients {
446  	DBG_BUS_CLIENT_RBCN,
447  	DBG_BUS_CLIENT_RBCP,
448  	DBG_BUS_CLIENT_RBCR,
449  	DBG_BUS_CLIENT_RBCT,
450  	DBG_BUS_CLIENT_RBCU,
451  	DBG_BUS_CLIENT_RBCF,
452  	DBG_BUS_CLIENT_RBCX,
453  	DBG_BUS_CLIENT_RBCS,
454  	DBG_BUS_CLIENT_RBCH,
455  	DBG_BUS_CLIENT_RBCZ,
456  	DBG_BUS_CLIENT_OTHER_ENGINE,
457  	DBG_BUS_CLIENT_TIMESTAMP,
458  	DBG_BUS_CLIENT_CPU,
459  	DBG_BUS_CLIENT_RBCY,
460  	DBG_BUS_CLIENT_RBCQ,
461  	DBG_BUS_CLIENT_RBCM,
462  	DBG_BUS_CLIENT_RBCB,
463  	DBG_BUS_CLIENT_RBCW,
464  	DBG_BUS_CLIENT_RBCV,
465  	MAX_DBG_BUS_CLIENTS
466  };
467  
468  /* Debug Bus constraint operation types */
469  enum dbg_bus_constraint_ops {
470  	DBG_BUS_CONSTRAINT_OP_EQ,
471  	DBG_BUS_CONSTRAINT_OP_NE,
472  	DBG_BUS_CONSTRAINT_OP_LT,
473  	DBG_BUS_CONSTRAINT_OP_LTC,
474  	DBG_BUS_CONSTRAINT_OP_LE,
475  	DBG_BUS_CONSTRAINT_OP_LEC,
476  	DBG_BUS_CONSTRAINT_OP_GT,
477  	DBG_BUS_CONSTRAINT_OP_GTC,
478  	DBG_BUS_CONSTRAINT_OP_GE,
479  	DBG_BUS_CONSTRAINT_OP_GEC,
480  	MAX_DBG_BUS_CONSTRAINT_OPS
481  };
482  
483  /* Debug Bus trigger state data */
484  struct dbg_bus_trigger_state_data {
485  	u8 msg_len;
486  	u8 constraint_dword_mask;
487  	u8 storm_id;
488  	u8 reserved;
489  };
490  
491  /* Debug Bus memory address */
492  struct dbg_bus_mem_addr {
493  	u32 lo;
494  	u32 hi;
495  };
496  
497  /* Debug Bus PCI buffer data */
498  struct dbg_bus_pci_buf_data {
499  	struct dbg_bus_mem_addr phys_addr; /* PCI buffer physical address */
500  	struct dbg_bus_mem_addr virt_addr; /* PCI buffer virtual address */
501  	u32 size; /* PCI buffer size in bytes */
502  };
503  
504  /* Debug Bus Storm EID range filter params */
505  struct dbg_bus_storm_eid_range_params {
506  	u8 min; /* Minimal event ID to filter on */
507  	u8 max; /* Maximal event ID to filter on */
508  };
509  
510  /* Debug Bus Storm EID mask filter params */
511  struct dbg_bus_storm_eid_mask_params {
512  	u8 val; /* Event ID value */
513  	u8 mask; /* Event ID mask. 1s in the mask = dont care bits. */
514  };
515  
516  /* Debug Bus Storm EID filter params */
517  union dbg_bus_storm_eid_params {
518  	struct dbg_bus_storm_eid_range_params range;
519  	struct dbg_bus_storm_eid_mask_params mask;
520  };
521  
522  /* Debug Bus Storm data */
523  struct dbg_bus_storm_data {
524  	u8 enabled;
525  	u8 mode;
526  	u8 hw_id;
527  	u8 eid_filter_en;
528  	u8 eid_range_not_mask;
529  	u8 cid_filter_en;
530  	union dbg_bus_storm_eid_params eid_filter_params;
531  	u32 cid;
532  };
533  
534  /* Debug Bus data */
535  struct dbg_bus_data {
536  	u32 app_version;
537  	u8 state;
538  	u8 mode_256b_en;
539  	u8 num_enabled_blocks;
540  	u8 num_enabled_storms;
541  	u8 target;
542  	u8 one_shot_en;
543  	u8 grc_input_en;
544  	u8 timestamp_input_en;
545  	u8 filter_en;
546  	u8 adding_filter;
547  	u8 filter_pre_trigger;
548  	u8 filter_post_trigger;
549  	u8 trigger_en;
550  	u8 filter_constraint_dword_mask;
551  	u8 next_trigger_state;
552  	u8 next_constraint_id;
553  	struct dbg_bus_trigger_state_data trigger_states[3];
554  	u8 filter_msg_len;
555  	u8 rcv_from_other_engine;
556  	u8 blocks_dword_mask;
557  	u8 blocks_dword_overlap;
558  	u32 hw_id_mask;
559  	struct dbg_bus_pci_buf_data pci_buf;
560  	struct dbg_bus_block_data blocks[132];
561  	struct dbg_bus_storm_data storms[6];
562  };
563  
564  /* Debug bus states */
565  enum dbg_bus_states {
566  	DBG_BUS_STATE_IDLE,
567  	DBG_BUS_STATE_READY,
568  	DBG_BUS_STATE_RECORDING,
569  	DBG_BUS_STATE_STOPPED,
570  	MAX_DBG_BUS_STATES
571  };
572  
573  /* Debug Bus Storm modes */
574  enum dbg_bus_storm_modes {
575  	DBG_BUS_STORM_MODE_PRINTF,
576  	DBG_BUS_STORM_MODE_PRAM_ADDR,
577  	DBG_BUS_STORM_MODE_DRA_RW,
578  	DBG_BUS_STORM_MODE_DRA_W,
579  	DBG_BUS_STORM_MODE_LD_ST_ADDR,
580  	DBG_BUS_STORM_MODE_DRA_FSM,
581  	DBG_BUS_STORM_MODE_FAST_DBGMUX,
582  	DBG_BUS_STORM_MODE_RH,
583  	DBG_BUS_STORM_MODE_RH_WITH_STORE,
584  	DBG_BUS_STORM_MODE_FOC,
585  	DBG_BUS_STORM_MODE_EXT_STORE,
586  	MAX_DBG_BUS_STORM_MODES
587  };
588  
589  /* Debug bus target IDs */
590  enum dbg_bus_targets {
591  	DBG_BUS_TARGET_ID_INT_BUF,
592  	DBG_BUS_TARGET_ID_NIG,
593  	DBG_BUS_TARGET_ID_PCI,
594  	MAX_DBG_BUS_TARGETS
595  };
596  
597  /* GRC Dump data */
598  struct dbg_grc_data {
599  	u8 params_initialized;
600  	u8 reserved1;
601  	u16 reserved2;
602  	u32 param_val[48];
603  };
604  
605  /* Debug GRC params */
606  enum dbg_grc_params {
607  	DBG_GRC_PARAM_DUMP_TSTORM,
608  	DBG_GRC_PARAM_DUMP_MSTORM,
609  	DBG_GRC_PARAM_DUMP_USTORM,
610  	DBG_GRC_PARAM_DUMP_XSTORM,
611  	DBG_GRC_PARAM_DUMP_YSTORM,
612  	DBG_GRC_PARAM_DUMP_PSTORM,
613  	DBG_GRC_PARAM_DUMP_REGS,
614  	DBG_GRC_PARAM_DUMP_RAM,
615  	DBG_GRC_PARAM_DUMP_PBUF,
616  	DBG_GRC_PARAM_DUMP_IOR,
617  	DBG_GRC_PARAM_DUMP_VFC,
618  	DBG_GRC_PARAM_DUMP_CM_CTX,
619  	DBG_GRC_PARAM_DUMP_PXP,
620  	DBG_GRC_PARAM_DUMP_RSS,
621  	DBG_GRC_PARAM_DUMP_CAU,
622  	DBG_GRC_PARAM_DUMP_QM,
623  	DBG_GRC_PARAM_DUMP_MCP,
624  	DBG_GRC_PARAM_DUMP_DORQ,
625  	DBG_GRC_PARAM_DUMP_CFC,
626  	DBG_GRC_PARAM_DUMP_IGU,
627  	DBG_GRC_PARAM_DUMP_BRB,
628  	DBG_GRC_PARAM_DUMP_BTB,
629  	DBG_GRC_PARAM_DUMP_BMB,
630  	DBG_GRC_PARAM_RESERVD1,
631  	DBG_GRC_PARAM_DUMP_MULD,
632  	DBG_GRC_PARAM_DUMP_PRS,
633  	DBG_GRC_PARAM_DUMP_DMAE,
634  	DBG_GRC_PARAM_DUMP_TM,
635  	DBG_GRC_PARAM_DUMP_SDM,
636  	DBG_GRC_PARAM_DUMP_DIF,
637  	DBG_GRC_PARAM_DUMP_STATIC,
638  	DBG_GRC_PARAM_UNSTALL,
639  	DBG_GRC_PARAM_RESERVED2,
640  	DBG_GRC_PARAM_MCP_TRACE_META_SIZE,
641  	DBG_GRC_PARAM_EXCLUDE_ALL,
642  	DBG_GRC_PARAM_CRASH,
643  	DBG_GRC_PARAM_PARITY_SAFE,
644  	DBG_GRC_PARAM_DUMP_CM,
645  	DBG_GRC_PARAM_DUMP_PHY,
646  	DBG_GRC_PARAM_NO_MCP,
647  	DBG_GRC_PARAM_NO_FW_VER,
648  	DBG_GRC_PARAM_RESERVED3,
649  	DBG_GRC_PARAM_DUMP_MCP_HW_DUMP,
650  	DBG_GRC_PARAM_DUMP_ILT_CDUC,
651  	DBG_GRC_PARAM_DUMP_ILT_CDUT,
652  	DBG_GRC_PARAM_DUMP_CAU_EXT,
653  	MAX_DBG_GRC_PARAMS
654  };
655  
656  /* Debug status codes */
657  enum dbg_status {
658  	DBG_STATUS_OK,
659  	DBG_STATUS_APP_VERSION_NOT_SET,
660  	DBG_STATUS_UNSUPPORTED_APP_VERSION,
661  	DBG_STATUS_DBG_BLOCK_NOT_RESET,
662  	DBG_STATUS_INVALID_ARGS,
663  	DBG_STATUS_OUTPUT_ALREADY_SET,
664  	DBG_STATUS_INVALID_PCI_BUF_SIZE,
665  	DBG_STATUS_PCI_BUF_ALLOC_FAILED,
666  	DBG_STATUS_PCI_BUF_NOT_ALLOCATED,
667  	DBG_STATUS_INVALID_FILTER_TRIGGER_DWORDS,
668  	DBG_STATUS_NO_MATCHING_FRAMING_MODE,
669  	DBG_STATUS_VFC_READ_ERROR,
670  	DBG_STATUS_STORM_ALREADY_ENABLED,
671  	DBG_STATUS_STORM_NOT_ENABLED,
672  	DBG_STATUS_BLOCK_ALREADY_ENABLED,
673  	DBG_STATUS_BLOCK_NOT_ENABLED,
674  	DBG_STATUS_NO_INPUT_ENABLED,
675  	DBG_STATUS_NO_FILTER_TRIGGER_256B,
676  	DBG_STATUS_FILTER_ALREADY_ENABLED,
677  	DBG_STATUS_TRIGGER_ALREADY_ENABLED,
678  	DBG_STATUS_TRIGGER_NOT_ENABLED,
679  	DBG_STATUS_CANT_ADD_CONSTRAINT,
680  	DBG_STATUS_TOO_MANY_TRIGGER_STATES,
681  	DBG_STATUS_TOO_MANY_CONSTRAINTS,
682  	DBG_STATUS_RECORDING_NOT_STARTED,
683  	DBG_STATUS_DATA_DIDNT_TRIGGER,
684  	DBG_STATUS_NO_DATA_RECORDED,
685  	DBG_STATUS_DUMP_BUF_TOO_SMALL,
686  	DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED,
687  	DBG_STATUS_UNKNOWN_CHIP,
688  	DBG_STATUS_VIRT_MEM_ALLOC_FAILED,
689  	DBG_STATUS_BLOCK_IN_RESET,
690  	DBG_STATUS_INVALID_TRACE_SIGNATURE,
691  	DBG_STATUS_INVALID_NVRAM_BUNDLE,
692  	DBG_STATUS_NVRAM_GET_IMAGE_FAILED,
693  	DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE,
694  	DBG_STATUS_NVRAM_READ_FAILED,
695  	DBG_STATUS_IDLE_CHK_PARSE_FAILED,
696  	DBG_STATUS_MCP_TRACE_BAD_DATA,
697  	DBG_STATUS_MCP_TRACE_NO_META,
698  	DBG_STATUS_MCP_COULD_NOT_HALT,
699  	DBG_STATUS_MCP_COULD_NOT_RESUME,
700  	DBG_STATUS_RESERVED0,
701  	DBG_STATUS_SEMI_FIFO_NOT_EMPTY,
702  	DBG_STATUS_IGU_FIFO_BAD_DATA,
703  	DBG_STATUS_MCP_COULD_NOT_MASK_PRTY,
704  	DBG_STATUS_FW_ASSERTS_PARSE_FAILED,
705  	DBG_STATUS_REG_FIFO_BAD_DATA,
706  	DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA,
707  	DBG_STATUS_DBG_ARRAY_NOT_SET,
708  	DBG_STATUS_RESERVED1,
709  	DBG_STATUS_NON_MATCHING_LINES,
710  	DBG_STATUS_INSUFFICIENT_HW_IDS,
711  	DBG_STATUS_DBG_BUS_IN_USE,
712  	DBG_STATUS_INVALID_STORM_DBG_MODE,
713  	DBG_STATUS_OTHER_ENGINE_BB_ONLY,
714  	DBG_STATUS_FILTER_SINGLE_HW_ID,
715  	DBG_STATUS_TRIGGER_SINGLE_HW_ID,
716  	DBG_STATUS_MISSING_TRIGGER_STATE_STORM,
717  	MAX_DBG_STATUS
718  };
719  
720  /* Debug Storms IDs */
721  enum dbg_storms {
722  	DBG_TSTORM_ID,
723  	DBG_MSTORM_ID,
724  	DBG_USTORM_ID,
725  	DBG_XSTORM_ID,
726  	DBG_YSTORM_ID,
727  	DBG_PSTORM_ID,
728  	MAX_DBG_STORMS
729  };
730  
731  /* Idle Check data */
732  struct idle_chk_data {
733  	u32 buf_size;
734  	u8 buf_size_set;
735  	u8 reserved1;
736  	u16 reserved2;
737  };
738  
739  struct pretend_params {
740  	u8 split_type;
741  	u8 reserved;
742  	u16 split_id;
743  };
744  
745  /* Debug Tools data (per HW function)
746   */
747  struct dbg_tools_data {
748  	struct dbg_grc_data grc;
749  	struct dbg_bus_data bus;
750  	struct idle_chk_data idle_chk;
751  	u8 mode_enable[40];
752  	u8 block_in_reset[132];
753  	u8 chip_id;
754  	u8 hw_type;
755  	u8 num_ports;
756  	u8 num_pfs_per_port;
757  	u8 num_vfs;
758  	u8 initialized;
759  	u8 use_dmae;
760  	u8 reserved;
761  	struct pretend_params pretend;
762  	u32 num_regs_read;
763  };
764  
765  /* ILT Clients */
766  enum ilt_clients {
767  	ILT_CLI_CDUC,
768  	ILT_CLI_CDUT,
769  	ILT_CLI_QM,
770  	ILT_CLI_TM,
771  	ILT_CLI_SRC,
772  	ILT_CLI_TSDM,
773  	ILT_CLI_RGFS,
774  	ILT_CLI_TGFS,
775  	MAX_ILT_CLIENTS
776  };
777  
778  /***************************** Public Functions *******************************/
779  
780  /**
781   * qed_dbg_set_bin_ptr(): Sets a pointer to the binary data with debug
782   *                        arrays.
783   *
784   * @p_hwfn: HW device data.
785   * @bin_ptr: A pointer to the binary data with debug arrays.
786   *
787   * Return: enum dbg status.
788   */
789  enum dbg_status qed_dbg_set_bin_ptr(struct qed_hwfn *p_hwfn,
790  				    const u8 * const bin_ptr);
791  
792  /**
793   * qed_read_regs(): Reads registers into a buffer (using GRC).
794   *
795   * @p_hwfn: HW device data.
796   * @p_ptt: Ptt window used for writing the registers.
797   * @buf: Destination buffer.
798   * @addr: Source GRC address in dwords.
799   * @len: Number of registers to read.
800   *
801   * Return: Void.
802   */
803  void qed_read_regs(struct qed_hwfn *p_hwfn,
804  		   struct qed_ptt *p_ptt, u32 *buf, u32 addr, u32 len);
805  
806  /**
807   * qed_read_fw_info(): Reads FW info from the chip.
808   *
809   * @p_hwfn: HW device data.
810   * @p_ptt: Ptt window used for writing the registers.
811   * @fw_info: (Out) a pointer to write the FW info into.
812   *
813   * Return: True if the FW info was read successfully from one of the Storms,
814   * or false if all Storms are in reset.
815   *
816   * The FW info contains FW-related information, such as the FW version,
817   * FW image (main/L2B/kuku), FW timestamp, etc.
818   * The FW info is read from the internal RAM of the first Storm that is not in
819   * reset.
820   */
821  bool qed_read_fw_info(struct qed_hwfn *p_hwfn,
822  		      struct qed_ptt *p_ptt, struct fw_info *fw_info);
823  /**
824   * qed_dbg_grc_config(): Sets the value of a GRC parameter.
825   *
826   * @p_hwfn: HW device data.
827   * @grc_param: GRC parameter.
828   * @val: Value to set.
829   *
830   * Return: Error if one of the following holds:
831   *         - The version wasn't set.
832   *         - Grc_param is invalid.
833   *         - Val is outside the allowed boundaries.
834   */
835  enum dbg_status qed_dbg_grc_config(struct qed_hwfn *p_hwfn,
836  				   enum dbg_grc_params grc_param, u32 val);
837  
838  /**
839   * qed_dbg_grc_set_params_default(): Reverts all GRC parameters to their
840   *                                   default value.
841   *
842   * @p_hwfn: HW device data.
843   *
844   * Return: Void.
845   */
846  void qed_dbg_grc_set_params_default(struct qed_hwfn *p_hwfn);
847  /**
848   * qed_dbg_grc_get_dump_buf_size(): Returns the required buffer size for
849   *                                  GRC Dump.
850   *
851   * @p_hwfn: HW device data.
852   * @p_ptt: Ptt window used for writing the registers.
853   * @buf_size: (OUT) required buffer size (in dwords) for the GRC Dump
854   *             data.
855   *
856   * Return: Error if one of the following holds:
857   *         - The version wasn't set
858   *           Otherwise, returns ok.
859   */
860  enum dbg_status qed_dbg_grc_get_dump_buf_size(struct qed_hwfn *p_hwfn,
861  					      struct qed_ptt *p_ptt,
862  					      u32 *buf_size);
863  
864  /**
865   * qed_dbg_grc_dump(): Dumps GRC data into the specified buffer.
866   *
867   * @p_hwfn: HW device data.
868   * @p_ptt: Ptt window used for writing the registers.
869   * @dump_buf: Pointer to write the collected GRC data into.
870   * @buf_size_in_dwords:Size of the specified buffer in dwords.
871   * @num_dumped_dwords: (OUT) number of dumped dwords.
872   *
873   * Return: Error if one of the following holds:
874   *        - The version wasn't set.
875   *        - The specified dump buffer is too small.
876   *          Otherwise, returns ok.
877   */
878  enum dbg_status qed_dbg_grc_dump(struct qed_hwfn *p_hwfn,
879  				 struct qed_ptt *p_ptt,
880  				 u32 *dump_buf,
881  				 u32 buf_size_in_dwords,
882  				 u32 *num_dumped_dwords);
883  
884  /**
885   * qed_dbg_idle_chk_get_dump_buf_size(): Returns the required buffer size
886   *                                       for idle check results.
887   *
888   * @p_hwfn: HW device data.
889   * @p_ptt: Ptt window used for writing the registers.
890   * @buf_size: (OUT) required buffer size (in dwords) for the idle check
891   *             data.
892   *
893   * return: Error if one of the following holds:
894   *        - The version wasn't set.
895   *          Otherwise, returns ok.
896   */
897  enum dbg_status qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn *p_hwfn,
898  						   struct qed_ptt *p_ptt,
899  						   u32 *buf_size);
900  
901  /**
902   * qed_dbg_idle_chk_dump: Performs idle check and writes the results
903   *                        into the specified buffer.
904   *
905   * @p_hwfn: HW device data.
906   * @p_ptt: Ptt window used for writing the registers.
907   * @dump_buf: Pointer to write the idle check data into.
908   * @buf_size_in_dwords: Size of the specified buffer in dwords.
909   * @num_dumped_dwords: (OUT) number of dumped dwords.
910   *
911   * Return: Error if one of the following holds:
912   *         - The version wasn't set.
913   *         - The specified buffer is too small.
914   *           Otherwise, returns ok.
915   */
916  enum dbg_status qed_dbg_idle_chk_dump(struct qed_hwfn *p_hwfn,
917  				      struct qed_ptt *p_ptt,
918  				      u32 *dump_buf,
919  				      u32 buf_size_in_dwords,
920  				      u32 *num_dumped_dwords);
921  
922  /**
923   * qed_dbg_mcp_trace_get_dump_buf_size(): Returns the required buffer size
924   *                                        for mcp trace results.
925   *
926   * @p_hwfn: HW device data.
927   * @p_ptt: Ptt window used for writing the registers.
928   * @buf_size: (OUT) Required buffer size (in dwords) for mcp trace data.
929   *
930   * Return: Error if one of the following holds:
931   *         - The version wasn't set.
932   *         - The trace data in MCP scratchpad contain an invalid signature.
933   *         - The bundle ID in NVRAM is invalid.
934   *         - The trace meta data cannot be found (in NVRAM or image file).
935   *           Otherwise, returns ok.
936   */
937  enum dbg_status qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn *p_hwfn,
938  						    struct qed_ptt *p_ptt,
939  						    u32 *buf_size);
940  
941  /**
942   * qed_dbg_mcp_trace_dump(): Performs mcp trace and writes the results
943   *                           into the specified buffer.
944   *
945   * @p_hwfn: HW device data.
946   * @p_ptt: Ptt window used for writing the registers.
947   * @dump_buf: Pointer to write the mcp trace data into.
948   * @buf_size_in_dwords: Size of the specified buffer in dwords.
949   * @num_dumped_dwords: (OUT) number of dumped dwords.
950   *
951   * Return: Error if one of the following holds:
952   *        - The version wasn't set.
953   *        - The specified buffer is too small.
954   *        - The trace data in MCP scratchpad contain an invalid signature.
955   *        - The bundle ID in NVRAM is invalid.
956   *        - The trace meta data cannot be found (in NVRAM or image file).
957   *        - The trace meta data cannot be read (from NVRAM or image file).
958   *          Otherwise, returns ok.
959   */
960  enum dbg_status qed_dbg_mcp_trace_dump(struct qed_hwfn *p_hwfn,
961  				       struct qed_ptt *p_ptt,
962  				       u32 *dump_buf,
963  				       u32 buf_size_in_dwords,
964  				       u32 *num_dumped_dwords);
965  
966  /**
967   * qed_dbg_reg_fifo_get_dump_buf_size(): Returns the required buffer size
968   *                                       for grc trace fifo results.
969   *
970   * @p_hwfn: HW device data.
971   * @p_ptt: Ptt window used for writing the registers.
972   * @buf_size: (OUT) Required buffer size (in dwords) for reg fifo data.
973   *
974   * Return: Error if one of the following holds:
975   *         - The version wasn't set
976   *           Otherwise, returns ok.
977   */
978  enum dbg_status qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn,
979  						   struct qed_ptt *p_ptt,
980  						   u32 *buf_size);
981  
982  /**
983   * qed_dbg_reg_fifo_dump(): Reads the reg fifo and writes the results into
984   *                          the specified buffer.
985   *
986   * @p_hwfn: HW device data.
987   * @p_ptt: Ptt window used for writing the registers.
988   * @dump_buf: Pointer to write the reg fifo data into.
989   * @buf_size_in_dwords: Size of the specified buffer in dwords.
990   * @num_dumped_dwords: (OUT) number of dumped dwords.
991   *
992   * Return: Error if one of the following holds:
993   *        - The version wasn't set.
994   *        - The specified buffer is too small.
995   *        - DMAE transaction failed.
996   *           Otherwise, returns ok.
997   */
998  enum dbg_status qed_dbg_reg_fifo_dump(struct qed_hwfn *p_hwfn,
999  				      struct qed_ptt *p_ptt,
1000  				      u32 *dump_buf,
1001  				      u32 buf_size_in_dwords,
1002  				      u32 *num_dumped_dwords);
1003  
1004  /**
1005   * qed_dbg_igu_fifo_get_dump_buf_size(): Returns the required buffer size
1006   *                                       for the IGU fifo results.
1007   *
1008   * @p_hwfn: HW device data.
1009   * @p_ptt: Ptt window used for writing the registers.
1010   * @buf_size: (OUT) Required buffer size (in dwords) for the IGU fifo
1011   *            data.
1012   *
1013   * Return: Error if one of the following holds:
1014   *         - The version wasn't set.
1015   *           Otherwise, returns ok.
1016   */
1017  enum dbg_status qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn,
1018  						   struct qed_ptt *p_ptt,
1019  						   u32 *buf_size);
1020  
1021  /**
1022   * qed_dbg_igu_fifo_dump(): Reads the IGU fifo and writes the results into
1023   *                          the specified buffer.
1024   *
1025   * @p_hwfn: HW device data.
1026   * @p_ptt: Ptt window used for writing the registers.
1027   * @dump_buf: Pointer to write the IGU fifo data into.
1028   * @buf_size_in_dwords: Size of the specified buffer in dwords.
1029   * @num_dumped_dwords: (OUT) number of dumped dwords.
1030   *
1031   * Return: Error if one of the following holds:
1032   *         - The version wasn't set
1033   *         - The specified buffer is too small
1034   *         - DMAE transaction failed
1035   *           Otherwise, returns ok.
1036   */
1037  enum dbg_status qed_dbg_igu_fifo_dump(struct qed_hwfn *p_hwfn,
1038  				      struct qed_ptt *p_ptt,
1039  				      u32 *dump_buf,
1040  				      u32 buf_size_in_dwords,
1041  				      u32 *num_dumped_dwords);
1042  
1043  /**
1044   * qed_dbg_protection_override_get_dump_buf_size(): Returns the required
1045   *        buffer size for protection override window results.
1046   *
1047   * @p_hwfn: HW device data.
1048   * @p_ptt: Ptt window used for writing the registers.
1049   * @buf_size: (OUT) Required buffer size (in dwords) for protection
1050   *             override data.
1051   *
1052   * Return: Error if one of the following holds:
1053   *         - The version wasn't set
1054   *           Otherwise, returns ok.
1055   */
1056  enum dbg_status
1057  qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn *p_hwfn,
1058  					      struct qed_ptt *p_ptt,
1059  					      u32 *buf_size);
1060  /**
1061   * qed_dbg_protection_override_dump(): Reads protection override window
1062   *       entries and writes the results into the specified buffer.
1063   *
1064   * @p_hwfn: HW device data.
1065   * @p_ptt: Ptt window used for writing the registers.
1066   * @dump_buf: Pointer to write the protection override data into.
1067   * @buf_size_in_dwords: Size of the specified buffer in dwords.
1068   * @num_dumped_dwords: (OUT) number of dumped dwords.
1069   *
1070   * @return: Error if one of the following holds:
1071   *          - The version wasn't set.
1072   *          - The specified buffer is too small.
1073   *          - DMAE transaction failed.
1074   *             Otherwise, returns ok.
1075   */
1076  enum dbg_status qed_dbg_protection_override_dump(struct qed_hwfn *p_hwfn,
1077  						 struct qed_ptt *p_ptt,
1078  						 u32 *dump_buf,
1079  						 u32 buf_size_in_dwords,
1080  						 u32 *num_dumped_dwords);
1081  /**
1082   * qed_dbg_fw_asserts_get_dump_buf_size(): Returns the required buffer
1083   *                                         size for FW Asserts results.
1084   *
1085   * @p_hwfn: HW device data.
1086   * @p_ptt: Ptt window used for writing the registers.
1087   * @buf_size: (OUT) Required buffer size (in dwords) for FW Asserts data.
1088   *
1089   * Return: Error if one of the following holds:
1090   *         - The version wasn't set.
1091   *           Otherwise, returns ok.
1092   */
1093  enum dbg_status qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn *p_hwfn,
1094  						     struct qed_ptt *p_ptt,
1095  						     u32 *buf_size);
1096  /**
1097   * qed_dbg_fw_asserts_dump(): Reads the FW Asserts and writes the results
1098   *                            into the specified buffer.
1099   *
1100   * @p_hwfn: HW device data.
1101   * @p_ptt: Ptt window used for writing the registers.
1102   * @dump_buf: Pointer to write the FW Asserts data into.
1103   * @buf_size_in_dwords: Size of the specified buffer in dwords.
1104   * @num_dumped_dwords: (OUT) number of dumped dwords.
1105   *
1106   * Return: Error if one of the following holds:
1107   *         - The version wasn't set.
1108   *         - The specified buffer is too small.
1109   *           Otherwise, returns ok.
1110   */
1111  enum dbg_status qed_dbg_fw_asserts_dump(struct qed_hwfn *p_hwfn,
1112  					struct qed_ptt *p_ptt,
1113  					u32 *dump_buf,
1114  					u32 buf_size_in_dwords,
1115  					u32 *num_dumped_dwords);
1116  
1117  /**
1118   * qed_dbg_read_attn(): Reads the attention registers of the specified
1119   * block and type, and writes the results into the specified buffer.
1120   *
1121   * @p_hwfn: HW device data.
1122   * @p_ptt: Ptt window used for writing the registers.
1123   * @block: Block ID.
1124   * @attn_type: Attention type.
1125   * @clear_status: Indicates if the attention status should be cleared.
1126   * @results:  (OUT) Pointer to write the read results into.
1127   *
1128   * Return: Error if one of the following holds:
1129   *         - The version wasn't set
1130   *          Otherwise, returns ok.
1131   */
1132  enum dbg_status qed_dbg_read_attn(struct qed_hwfn *p_hwfn,
1133  				  struct qed_ptt *p_ptt,
1134  				  enum block_id block,
1135  				  enum dbg_attn_type attn_type,
1136  				  bool clear_status,
1137  				  struct dbg_attn_block_result *results);
1138  
1139  /**
1140   * qed_dbg_print_attn(): Prints attention registers values in the
1141   *                       specified results struct.
1142   *
1143   * @p_hwfn: HW device data.
1144   * @results: Pointer to the attention read results
1145   *
1146   * Return: Error if one of the following holds:
1147   *        - The version wasn't set
1148   *          Otherwise, returns ok.
1149   */
1150  enum dbg_status qed_dbg_print_attn(struct qed_hwfn *p_hwfn,
1151  				   struct dbg_attn_block_result *results);
1152  
1153  /******************************* Data Types **********************************/
1154  
1155  struct mcp_trace_format {
1156  	u32 data;
1157  #define MCP_TRACE_FORMAT_MODULE_MASK	0x0000ffff
1158  #define MCP_TRACE_FORMAT_MODULE_OFFSET	0
1159  #define MCP_TRACE_FORMAT_LEVEL_MASK	0x00030000
1160  #define MCP_TRACE_FORMAT_LEVEL_OFFSET	16
1161  #define MCP_TRACE_FORMAT_P1_SIZE_MASK	0x000c0000
1162  #define MCP_TRACE_FORMAT_P1_SIZE_OFFSET 18
1163  #define MCP_TRACE_FORMAT_P2_SIZE_MASK	0x00300000
1164  #define MCP_TRACE_FORMAT_P2_SIZE_OFFSET 20
1165  #define MCP_TRACE_FORMAT_P3_SIZE_MASK	0x00c00000
1166  #define MCP_TRACE_FORMAT_P3_SIZE_OFFSET 22
1167  #define MCP_TRACE_FORMAT_LEN_MASK	0xff000000
1168  #define MCP_TRACE_FORMAT_LEN_OFFSET	24
1169  
1170  	char *format_str;
1171  };
1172  
1173  /* MCP Trace Meta data structure */
1174  struct mcp_trace_meta {
1175  	u32 modules_num;
1176  	char **modules;
1177  	u32 formats_num;
1178  	struct mcp_trace_format *formats;
1179  	bool is_allocated;
1180  };
1181  
1182  /* Debug Tools user data */
1183  struct dbg_tools_user_data {
1184  	struct mcp_trace_meta mcp_trace_meta;
1185  	const u32 *mcp_trace_user_meta_buf;
1186  };
1187  
1188  /******************************** Constants **********************************/
1189  
1190  #define MAX_NAME_LEN	16
1191  
1192  /***************************** Public Functions *******************************/
1193  
1194  /**
1195   * qed_dbg_user_set_bin_ptr(): Sets a pointer to the binary data with
1196   *                             debug arrays.
1197   *
1198   * @p_hwfn: HW device data.
1199   * @bin_ptr: a pointer to the binary data with debug arrays.
1200   *
1201   * Return: dbg_status.
1202   */
1203  enum dbg_status qed_dbg_user_set_bin_ptr(struct qed_hwfn *p_hwfn,
1204  					 const u8 * const bin_ptr);
1205  
1206  /**
1207   * qed_dbg_alloc_user_data(): Allocates user debug data.
1208   *
1209   * @p_hwfn: HW device data.
1210   * @user_data_ptr: (OUT) a pointer to the allocated memory.
1211   *
1212   * Return: dbg_status.
1213   */
1214  enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn,
1215  					void **user_data_ptr);
1216  
1217  /**
1218   * qed_dbg_get_status_str(): Returns a string for the specified status.
1219   *
1220   * @status: A debug status code.
1221   *
1222   * Return: A string for the specified status.
1223   */
1224  const char *qed_dbg_get_status_str(enum dbg_status status);
1225  
1226  /**
1227   * qed_get_idle_chk_results_buf_size(): Returns the required buffer size
1228   *                                      for idle check results (in bytes).
1229   *
1230   * @p_hwfn: HW device data.
1231   * @dump_buf: idle check dump buffer.
1232   * @num_dumped_dwords: number of dwords that were dumped.
1233   * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed
1234   *                    results.
1235   *
1236   * Return: Error if the parsing fails, ok otherwise.
1237   */
1238  enum dbg_status qed_get_idle_chk_results_buf_size(struct qed_hwfn *p_hwfn,
1239  						  u32 *dump_buf,
1240  						  u32  num_dumped_dwords,
1241  						  u32 *results_buf_size);
1242  /**
1243   * qed_print_idle_chk_results(): Prints idle check results
1244   *
1245   * @p_hwfn: HW device data.
1246   * @dump_buf: idle check dump buffer.
1247   * @num_dumped_dwords: number of dwords that were dumped.
1248   * @results_buf: buffer for printing the idle check results.
1249   * @num_errors: (OUT) number of errors found in idle check.
1250   * @num_warnings: (OUT) number of warnings found in idle check.
1251   *
1252   * Return: Error if the parsing fails, ok otherwise.
1253   */
1254  enum dbg_status qed_print_idle_chk_results(struct qed_hwfn *p_hwfn,
1255  					   u32 *dump_buf,
1256  					   u32 num_dumped_dwords,
1257  					   char *results_buf,
1258  					   u32 *num_errors,
1259  					   u32 *num_warnings);
1260  
1261  /**
1262   * qed_dbg_mcp_trace_set_meta_data(): Sets the MCP Trace meta data.
1263   *
1264   * @p_hwfn: HW device data.
1265   * @meta_buf: Meta buffer.
1266   *
1267   * Return: Void.
1268   *
1269   * Needed in case the MCP Trace dump doesn't contain the meta data (e.g. due to
1270   * no NVRAM access).
1271   */
1272  void qed_dbg_mcp_trace_set_meta_data(struct qed_hwfn *p_hwfn,
1273  				     const u32 *meta_buf);
1274  
1275  /**
1276   * qed_get_mcp_trace_results_buf_size(): Returns the required buffer size
1277   *                                       for MCP Trace results (in bytes).
1278   *
1279   * @p_hwfn: HW device data.
1280   * @dump_buf: MCP Trace dump buffer.
1281   * @num_dumped_dwords: number of dwords that were dumped.
1282   * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed
1283   *                    results.
1284   *
1285   * Return: Error if the parsing fails, ok otherwise.
1286   */
1287  enum dbg_status qed_get_mcp_trace_results_buf_size(struct qed_hwfn *p_hwfn,
1288  						   u32 *dump_buf,
1289  						   u32 num_dumped_dwords,
1290  						   u32 *results_buf_size);
1291  
1292  /**
1293   * qed_print_mcp_trace_results(): Prints MCP Trace results
1294   *
1295   * @p_hwfn: HW device data.
1296   * @dump_buf: MCP trace dump buffer, starting from the header.
1297   * @num_dumped_dwords: Member of dwords that were dumped.
1298   * @results_buf: Buffer for printing the mcp trace results.
1299   *
1300   * Return: Error if the parsing fails, ok otherwise.
1301   */
1302  enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn,
1303  					    u32 *dump_buf,
1304  					    u32 num_dumped_dwords,
1305  					    char *results_buf);
1306  
1307  /**
1308   * qed_print_mcp_trace_results_cont(): Prints MCP Trace results, and
1309   * keeps the MCP trace meta data allocated, to support continuous MCP Trace
1310   * parsing. After the continuous parsing ends, mcp_trace_free_meta_data should
1311   * be called to free the meta data.
1312   *
1313   * @p_hwfn: HW device data.
1314   * @dump_buf: MVP trace dump buffer, starting from the header.
1315   * @results_buf: Buffer for printing the mcp trace results.
1316   *
1317   * Return: Error if the parsing fails, ok otherwise.
1318   */
1319  enum dbg_status qed_print_mcp_trace_results_cont(struct qed_hwfn *p_hwfn,
1320  						 u32 *dump_buf,
1321  						 char *results_buf);
1322  
1323  /**
1324   * qed_print_mcp_trace_line(): Prints MCP Trace results for a single line
1325   *
1326   * @p_hwfn: HW device data.
1327   * @dump_buf: MCP trace dump buffer, starting from the header.
1328   * @num_dumped_bytes: Number of bytes that were dumped.
1329   * @results_buf: Buffer for printing the mcp trace results.
1330   *
1331   * Return: Error if the parsing fails, ok otherwise.
1332   */
1333  enum dbg_status qed_print_mcp_trace_line(struct qed_hwfn *p_hwfn,
1334  					 u8 *dump_buf,
1335  					 u32 num_dumped_bytes,
1336  					 char *results_buf);
1337  
1338  /**
1339   * qed_mcp_trace_free_meta_data(): Frees the MCP Trace meta data.
1340   * Should be called after continuous MCP Trace parsing.
1341   *
1342   * @p_hwfn: HW device data.
1343   *
1344   * Return: Void.
1345   */
1346  void qed_mcp_trace_free_meta_data(struct qed_hwfn *p_hwfn);
1347  
1348  /**
1349   * qed_get_reg_fifo_results_buf_size(): Returns the required buffer size
1350   *                                      for reg_fifo results (in bytes).
1351   *
1352   * @p_hwfn: HW device data.
1353   * @dump_buf: Reg fifo dump buffer.
1354   * @num_dumped_dwords: Number of dwords that were dumped.
1355   * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed
1356   *                     results.
1357   *
1358   * Return: Error if the parsing fails, ok otherwise.
1359   */
1360  enum dbg_status qed_get_reg_fifo_results_buf_size(struct qed_hwfn *p_hwfn,
1361  						  u32 *dump_buf,
1362  						  u32 num_dumped_dwords,
1363  						  u32 *results_buf_size);
1364  
1365  /**
1366   * qed_print_reg_fifo_results(): Prints reg fifo results.
1367   *
1368   * @p_hwfn: HW device data.
1369   * @dump_buf: Reg fifo dump buffer, starting from the header.
1370   * @num_dumped_dwords: Number of dwords that were dumped.
1371   * @results_buf: Buffer for printing the reg fifo results.
1372   *
1373   * Return: Error if the parsing fails, ok otherwise.
1374   */
1375  enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn,
1376  					   u32 *dump_buf,
1377  					   u32 num_dumped_dwords,
1378  					   char *results_buf);
1379  
1380  /**
1381   * qed_get_igu_fifo_results_buf_size(): Returns the required buffer size
1382   *                                      for igu_fifo results (in bytes).
1383   *
1384   * @p_hwfn: HW device data.
1385   * @dump_buf: IGU fifo dump buffer.
1386   * @num_dumped_dwords: number of dwords that were dumped.
1387   * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed
1388   *                    results.
1389   *
1390   * Return: Error if the parsing fails, ok otherwise.
1391   */
1392  enum dbg_status qed_get_igu_fifo_results_buf_size(struct qed_hwfn *p_hwfn,
1393  						  u32 *dump_buf,
1394  						  u32 num_dumped_dwords,
1395  						  u32 *results_buf_size);
1396  
1397  /**
1398   * qed_print_igu_fifo_results(): Prints IGU fifo results
1399   *
1400   * @p_hwfn: HW device data.
1401   * @dump_buf: IGU fifo dump buffer, starting from the header.
1402   * @num_dumped_dwords: Number of dwords that were dumped.
1403   * @results_buf: Buffer for printing the IGU fifo results.
1404   *
1405   * Return: Error if the parsing fails, ok otherwise.
1406   */
1407  enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn,
1408  					   u32 *dump_buf,
1409  					   u32 num_dumped_dwords,
1410  					   char *results_buf);
1411  
1412  /**
1413   * qed_get_protection_override_results_buf_size(): Returns the required
1414   *         buffer size for protection override results (in bytes).
1415   *
1416   * @p_hwfn: HW device data.
1417   * @dump_buf: Protection override dump buffer.
1418   * @num_dumped_dwords: Number of dwords that were dumped.
1419   * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed
1420   *                    results.
1421   *
1422   * Return: Error if the parsing fails, ok otherwise.
1423   */
1424  enum dbg_status
1425  qed_get_protection_override_results_buf_size(struct qed_hwfn *p_hwfn,
1426  					     u32 *dump_buf,
1427  					     u32 num_dumped_dwords,
1428  					     u32 *results_buf_size);
1429  
1430  /**
1431   * qed_print_protection_override_results(): Prints protection override
1432   *                                          results.
1433   *
1434   * @p_hwfn: HW device data.
1435   * @dump_buf: Protection override dump buffer, starting from the header.
1436   * @num_dumped_dwords: Number of dwords that were dumped.
1437   * @results_buf: Buffer for printing the reg fifo results.
1438   *
1439   * Return: Error if the parsing fails, ok otherwise.
1440   */
1441  enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn,
1442  						      u32 *dump_buf,
1443  						      u32 num_dumped_dwords,
1444  						      char *results_buf);
1445  
1446  /**
1447   * qed_get_fw_asserts_results_buf_size(): Returns the required buffer size
1448   *                                        for FW Asserts results (in bytes).
1449   *
1450   * @p_hwfn: HW device data.
1451   * @dump_buf: FW Asserts dump buffer.
1452   * @num_dumped_dwords: number of dwords that were dumped.
1453   * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed
1454   *                    results.
1455   *
1456   * Return: Error if the parsing fails, ok otherwise.
1457   */
1458  enum dbg_status qed_get_fw_asserts_results_buf_size(struct qed_hwfn *p_hwfn,
1459  						    u32 *dump_buf,
1460  						    u32 num_dumped_dwords,
1461  						    u32 *results_buf_size);
1462  
1463  /**
1464   * qed_print_fw_asserts_results(): Prints FW Asserts results.
1465   *
1466   * @p_hwfn: HW device data.
1467   * @dump_buf: FW Asserts dump buffer, starting from the header.
1468   * @num_dumped_dwords: number of dwords that were dumped.
1469   * @results_buf: buffer for printing the FW Asserts results.
1470   *
1471   * Return: Error if the parsing fails, ok otherwise.
1472   */
1473  enum dbg_status qed_print_fw_asserts_results(struct qed_hwfn *p_hwfn,
1474  					     u32 *dump_buf,
1475  					     u32 num_dumped_dwords,
1476  					     char *results_buf);
1477  
1478  /**
1479   * qed_dbg_parse_attn(): Parses and prints attention registers values in
1480   *                      the specified results struct.
1481   *
1482   * @p_hwfn: HW device data.
1483   * @results: Pointer to the attention read results
1484   *
1485   * Return: Error if one of the following holds:
1486   *         - The version wasn't set.
1487   *           Otherwise, returns ok.
1488   */
1489  enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn,
1490  				   struct dbg_attn_block_result *results);
1491  #endif
1492