cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

qed_dbg_hsi.h (43132B)


      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