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
20enum 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 */
117enum 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 */
141struct 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 */
150struct 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 */
160struct dbg_attn_block {
161 struct dbg_attn_block_type_data per_type_data[2];
162};
163
164/* Attention register result */
165struct 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 */
178struct 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 */
190struct 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 */
199struct 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 */
212enum dbg_attn_type {
213 ATTN_TYPE_INTERRUPT,
214 ATTN_TYPE_PARITY,
215 MAX_DBG_ATTN_TYPE
216};
217
218/* Block debug data */
219struct dbg_block {
220 u8 name[15];
221 u8 associated_storm_letter;
222};
223
224/* Chip-specific block debug data */
225struct 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 */
255struct 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 */
262struct dbg_block_user {
263 u8 name[16];
264};
265
266/* Block Debug line data */
267struct 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 */
279struct 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 */
286struct 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 */
302struct 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 */
313struct 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 */
322struct 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 */
328struct 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 */
342struct 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 */
355union 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 */
361struct 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 */
371struct 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 */
382struct 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 */
399struct 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 */
408enum 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 */
419struct 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 */
430struct 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
445enum 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 */
469enum 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 */
484struct 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 */
492struct dbg_bus_mem_addr {
493 u32 lo;
494 u32 hi;
495};
496
497/* Debug Bus PCI buffer data */
498struct 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 */
505struct 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 */
511struct 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 */
517union 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 */
523struct 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 */
535struct 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 */
565enum 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 */
574enum 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 */
590enum 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 */
598struct dbg_grc_data {
599 u8 params_initialized;
600 u8 reserved1;
601 u16 reserved2;
602 u32 param_val[48];
603};
604
605/* Debug GRC params */
606enum 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 */
657enum 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 */
721enum 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 */
732struct idle_chk_data {
733 u32 buf_size;
734 u8 buf_size_set;
735 u8 reserved1;
736 u16 reserved2;
737};
738
739struct pretend_params {
740 u8 split_type;
741 u8 reserved;
742 u16 split_id;
743};
744
745/* Debug Tools data (per HW function)
746 */
747struct 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 */
766enum 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 */
789enum 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 */
803void 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 */
821bool 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 */
835enum 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 */
846void 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 */
860enum 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 */
878enum 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 */
897enum 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 */
916enum 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 */
937enum 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 */
960enum 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 */
978enum 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 */
998enum 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 */
1017enum 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 */
1037enum 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 */
1056enum dbg_status
1057qed_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 */
1076enum 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 */
1093enum 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 */
1111enum 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 */
1132enum 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 */
1150enum dbg_status qed_dbg_print_attn(struct qed_hwfn *p_hwfn,
1151 struct dbg_attn_block_result *results);
1152
1153/******************************* Data Types **********************************/
1154
1155struct 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 */
1174struct 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 */
1183struct 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 */
1203enum 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 */
1214enum 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 */
1224const 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 */
1238enum 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 */
1254enum 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 */
1272void 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 */
1287enum 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 */
1302enum 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 */
1319enum 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 */
1333enum 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 */
1346void 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 */
1360enum 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 */
1375enum 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 */
1392enum 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 */
1407enum 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 */
1424enum dbg_status
1425qed_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 */
1441enum 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 */
1458enum 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 */
1473enum 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 */
1489enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn,
1490 struct dbg_attn_block_result *results);
1491#endif
1492

source code of linux/drivers/net/ethernet/qlogic/qed/qed_dbg_hsi.h