| /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ |
| /* QLogic qed NIC Driver |
| * Copyright (c) 2019-2021 Marvell International Ltd. |
| */ |
| #ifndef _QED_DBG_HSI_H |
| #define _QED_DBG_HSI_H |
| |
| #include <linux/types.h> |
| #include <linux/io.h> |
| #include <linux/bitops.h> |
| #include <linux/delay.h> |
| #include <linux/kernel.h> |
| #include <linux/list.h> |
| #include <linux/slab.h> |
| |
| /****************************************/ |
| /* Debug Tools HSI constants and macros */ |
| /****************************************/ |
| |
| enum block_id { |
| BLOCK_GRC, |
| BLOCK_MISCS, |
| BLOCK_MISC, |
| BLOCK_DBU, |
| BLOCK_PGLUE_B, |
| BLOCK_CNIG, |
| BLOCK_CPMU, |
| BLOCK_NCSI, |
| BLOCK_OPTE, |
| BLOCK_BMB, |
| BLOCK_PCIE, |
| BLOCK_MCP, |
| BLOCK_MCP2, |
| BLOCK_PSWHST, |
| BLOCK_PSWHST2, |
| BLOCK_PSWRD, |
| BLOCK_PSWRD2, |
| BLOCK_PSWWR, |
| BLOCK_PSWWR2, |
| BLOCK_PSWRQ, |
| BLOCK_PSWRQ2, |
| BLOCK_PGLCS, |
| BLOCK_DMAE, |
| BLOCK_PTU, |
| BLOCK_TCM, |
| BLOCK_MCM, |
| BLOCK_UCM, |
| BLOCK_XCM, |
| BLOCK_YCM, |
| BLOCK_PCM, |
| BLOCK_QM, |
| BLOCK_TM, |
| BLOCK_DORQ, |
| BLOCK_BRB, |
| BLOCK_SRC, |
| BLOCK_PRS, |
| BLOCK_TSDM, |
| BLOCK_MSDM, |
| BLOCK_USDM, |
| BLOCK_XSDM, |
| BLOCK_YSDM, |
| BLOCK_PSDM, |
| BLOCK_TSEM, |
| BLOCK_MSEM, |
| BLOCK_USEM, |
| BLOCK_XSEM, |
| BLOCK_YSEM, |
| BLOCK_PSEM, |
| BLOCK_RSS, |
| BLOCK_TMLD, |
| BLOCK_MULD, |
| BLOCK_YULD, |
| BLOCK_XYLD, |
| BLOCK_PRM, |
| BLOCK_PBF_PB1, |
| BLOCK_PBF_PB2, |
| BLOCK_RPB, |
| BLOCK_BTB, |
| BLOCK_PBF, |
| BLOCK_RDIF, |
| BLOCK_TDIF, |
| BLOCK_CDU, |
| BLOCK_CCFC, |
| BLOCK_TCFC, |
| BLOCK_IGU, |
| BLOCK_CAU, |
| BLOCK_UMAC, |
| BLOCK_XMAC, |
| BLOCK_MSTAT, |
| BLOCK_DBG, |
| BLOCK_NIG, |
| BLOCK_WOL, |
| BLOCK_BMBN, |
| BLOCK_IPC, |
| BLOCK_NWM, |
| BLOCK_NWS, |
| BLOCK_MS, |
| BLOCK_PHY_PCIE, |
| BLOCK_LED, |
| BLOCK_AVS_WRAP, |
| BLOCK_PXPREQBUS, |
| BLOCK_BAR0_MAP, |
| BLOCK_MCP_FIO, |
| BLOCK_LAST_INIT, |
| BLOCK_PRS_FC, |
| BLOCK_PBF_FC, |
| BLOCK_NIG_LB_FC, |
| BLOCK_NIG_LB_FC_PLLH, |
| BLOCK_NIG_TX_FC_PLLH, |
| BLOCK_NIG_TX_FC, |
| BLOCK_NIG_RX_FC_PLLH, |
| BLOCK_NIG_RX_FC, |
| MAX_BLOCK_ID |
| }; |
| |
| /* binary debug buffer types */ |
| enum bin_dbg_buffer_type { |
| BIN_BUF_DBG_MODE_TREE, |
| BIN_BUF_DBG_DUMP_REG, |
| BIN_BUF_DBG_DUMP_MEM, |
| BIN_BUF_DBG_IDLE_CHK_REGS, |
| BIN_BUF_DBG_IDLE_CHK_IMMS, |
| BIN_BUF_DBG_IDLE_CHK_RULES, |
| BIN_BUF_DBG_IDLE_CHK_PARSING_DATA, |
| BIN_BUF_DBG_ATTN_BLOCKS, |
| BIN_BUF_DBG_ATTN_REGS, |
| BIN_BUF_DBG_ATTN_INDEXES, |
| BIN_BUF_DBG_ATTN_NAME_OFFSETS, |
| BIN_BUF_DBG_BLOCKS, |
| BIN_BUF_DBG_BLOCKS_CHIP_DATA, |
| BIN_BUF_DBG_BUS_LINES, |
| BIN_BUF_DBG_BLOCKS_USER_DATA, |
| BIN_BUF_DBG_BLOCKS_CHIP_USER_DATA, |
| BIN_BUF_DBG_BUS_LINE_NAME_OFFSETS, |
| BIN_BUF_DBG_RESET_REGS, |
| BIN_BUF_DBG_PARSING_STRINGS, |
| MAX_BIN_DBG_BUFFER_TYPE |
| }; |
| |
| /* Attention bit mapping */ |
| struct dbg_attn_bit_mapping { |
| u16 data; |
| #define DBG_ATTN_BIT_MAPPING_VAL_MASK 0x7FFF |
| #define DBG_ATTN_BIT_MAPPING_VAL_SHIFT 0 |
| #define DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT_MASK 0x1 |
| #define DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT_SHIFT 15 |
| }; |
| |
| /* Attention block per-type data */ |
| struct dbg_attn_block_type_data { |
| u16 names_offset; |
| u16 reserved1; |
| u8 num_regs; |
| u8 reserved2; |
| u16 regs_offset; |
| |
| }; |
| |
| /* Block attentions */ |
| struct dbg_attn_block { |
| struct dbg_attn_block_type_data per_type_data[2]; |
| }; |
| |
| /* Attention register result */ |
| struct dbg_attn_reg_result { |
| u32 data; |
| #define DBG_ATTN_REG_RESULT_STS_ADDRESS_MASK 0xFFFFFF |
| #define DBG_ATTN_REG_RESULT_STS_ADDRESS_SHIFT 0 |
| #define DBG_ATTN_REG_RESULT_NUM_REG_ATTN_MASK 0xFF |
| #define DBG_ATTN_REG_RESULT_NUM_REG_ATTN_SHIFT 24 |
| u16 block_attn_offset; |
| u16 reserved; |
| u32 sts_val; |
| u32 mask_val; |
| }; |
| |
| /* Attention block result */ |
| struct dbg_attn_block_result { |
| u8 block_id; |
| u8 data; |
| #define DBG_ATTN_BLOCK_RESULT_ATTN_TYPE_MASK 0x3 |
| #define DBG_ATTN_BLOCK_RESULT_ATTN_TYPE_SHIFT 0 |
| #define DBG_ATTN_BLOCK_RESULT_NUM_REGS_MASK 0x3F |
| #define DBG_ATTN_BLOCK_RESULT_NUM_REGS_SHIFT 2 |
| u16 names_offset; |
| struct dbg_attn_reg_result reg_results[15]; |
| }; |
| |
| /* Mode header */ |
| struct dbg_mode_hdr { |
| u16 data; |
| #define DBG_MODE_HDR_EVAL_MODE_MASK 0x1 |
| #define DBG_MODE_HDR_EVAL_MODE_SHIFT 0 |
| #define DBG_MODE_HDR_MODES_BUF_OFFSET_MASK 0x7FFF |
| #define DBG_MODE_HDR_MODES_BUF_OFFSET_SHIFT 1 |
| }; |
| |
| /* Attention register */ |
| struct dbg_attn_reg { |
| struct dbg_mode_hdr mode; |
| u16 block_attn_offset; |
| u32 data; |
| #define DBG_ATTN_REG_STS_ADDRESS_MASK 0xFFFFFF |
| #define DBG_ATTN_REG_STS_ADDRESS_SHIFT 0 |
| #define DBG_ATTN_REG_NUM_REG_ATTN_MASK 0xFF |
| #define DBG_ATTN_REG_NUM_REG_ATTN_SHIFT 24 |
| u32 sts_clr_address; |
| u32 mask_address; |
| }; |
| |
| /* Attention types */ |
| enum dbg_attn_type { |
| ATTN_TYPE_INTERRUPT, |
| ATTN_TYPE_PARITY, |
| MAX_DBG_ATTN_TYPE |
| }; |
| |
| /* Block debug data */ |
| struct dbg_block { |
| u8 name[15]; |
| u8 associated_storm_letter; |
| }; |
| |
| /* Chip-specific block debug data */ |
| struct dbg_block_chip { |
| u8 flags; |
| #define DBG_BLOCK_CHIP_IS_REMOVED_MASK 0x1 |
| #define DBG_BLOCK_CHIP_IS_REMOVED_SHIFT 0 |
| #define DBG_BLOCK_CHIP_HAS_RESET_REG_MASK 0x1 |
| #define DBG_BLOCK_CHIP_HAS_RESET_REG_SHIFT 1 |
| #define DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP_MASK 0x1 |
| #define DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP_SHIFT 2 |
| #define DBG_BLOCK_CHIP_HAS_DBG_BUS_MASK 0x1 |
| #define DBG_BLOCK_CHIP_HAS_DBG_BUS_SHIFT 3 |
| #define DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS_MASK 0x1 |
| #define DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS_SHIFT 4 |
| #define DBG_BLOCK_CHIP_RESERVED0_MASK 0x7 |
| #define DBG_BLOCK_CHIP_RESERVED0_SHIFT 5 |
| u8 dbg_client_id; |
| u8 reset_reg_id; |
| u8 reset_reg_bit_offset; |
| struct dbg_mode_hdr dbg_bus_mode; |
| u16 reserved1; |
| u8 reserved2; |
| u8 num_of_dbg_bus_lines; |
| u16 dbg_bus_lines_offset; |
| u32 dbg_select_reg_addr; |
| u32 dbg_dword_enable_reg_addr; |
| u32 dbg_shift_reg_addr; |
| u32 dbg_force_valid_reg_addr; |
| u32 dbg_force_frame_reg_addr; |
| }; |
| |
| /* Chip-specific block user debug data */ |
| struct dbg_block_chip_user { |
| u8 num_of_dbg_bus_lines; |
| u8 has_latency_events; |
| u16 names_offset; |
| }; |
| |
| /* Block user debug data */ |
| struct dbg_block_user { |
| u8 name[16]; |
| }; |
| |
| /* Block Debug line data */ |
| struct dbg_bus_line { |
| u8 data; |
| #define DBG_BUS_LINE_NUM_OF_GROUPS_MASK 0xF |
| #define DBG_BUS_LINE_NUM_OF_GROUPS_SHIFT 0 |
| #define DBG_BUS_LINE_IS_256B_MASK 0x1 |
| #define DBG_BUS_LINE_IS_256B_SHIFT 4 |
| #define DBG_BUS_LINE_RESERVED_MASK 0x7 |
| #define DBG_BUS_LINE_RESERVED_SHIFT 5 |
| u8 group_sizes; |
| }; |
| |
| /* Condition header for registers dump */ |
| struct dbg_dump_cond_hdr { |
| struct dbg_mode_hdr mode; /* Mode header */ |
| u8 block_id; /* block ID */ |
| u8 data_size; /* size in dwords of the data following this header */ |
| }; |
| |
| /* Memory data for registers dump */ |
| struct dbg_dump_mem { |
| u32 dword0; |
| #define DBG_DUMP_MEM_ADDRESS_MASK 0xFFFFFF |
| #define DBG_DUMP_MEM_ADDRESS_SHIFT 0 |
| #define DBG_DUMP_MEM_MEM_GROUP_ID_MASK 0xFF |
| #define DBG_DUMP_MEM_MEM_GROUP_ID_SHIFT 24 |
| u32 dword1; |
| #define DBG_DUMP_MEM_LENGTH_MASK 0xFFFFFF |
| #define DBG_DUMP_MEM_LENGTH_SHIFT 0 |
| #define DBG_DUMP_MEM_WIDE_BUS_MASK 0x1 |
| #define DBG_DUMP_MEM_WIDE_BUS_SHIFT 24 |
| #define DBG_DUMP_MEM_RESERVED_MASK 0x7F |
| #define DBG_DUMP_MEM_RESERVED_SHIFT 25 |
| }; |
| |
| /* Register data for registers dump */ |
| struct dbg_dump_reg { |
| u32 data; |
| #define DBG_DUMP_REG_ADDRESS_MASK 0x7FFFFF |
| #define DBG_DUMP_REG_ADDRESS_SHIFT 0 |
| #define DBG_DUMP_REG_WIDE_BUS_MASK 0x1 |
| #define DBG_DUMP_REG_WIDE_BUS_SHIFT 23 |
| #define DBG_DUMP_REG_LENGTH_MASK 0xFF |
| #define DBG_DUMP_REG_LENGTH_SHIFT 24 |
| }; |
| |
| /* Split header for registers dump */ |
| struct dbg_dump_split_hdr { |
| u32 hdr; |
| #define DBG_DUMP_SPLIT_HDR_DATA_SIZE_MASK 0xFFFFFF |
| #define DBG_DUMP_SPLIT_HDR_DATA_SIZE_SHIFT 0 |
| #define DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID_MASK 0xFF |
| #define DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID_SHIFT 24 |
| }; |
| |
| /* Condition header for idle check */ |
| struct dbg_idle_chk_cond_hdr { |
| struct dbg_mode_hdr mode; /* Mode header */ |
| u16 data_size; /* size in dwords of the data following this header */ |
| }; |
| |
| /* Idle Check condition register */ |
| struct dbg_idle_chk_cond_reg { |
| u32 data; |
| #define DBG_IDLE_CHK_COND_REG_ADDRESS_MASK 0x7FFFFF |
| #define DBG_IDLE_CHK_COND_REG_ADDRESS_SHIFT 0 |
| #define DBG_IDLE_CHK_COND_REG_WIDE_BUS_MASK 0x1 |
| #define DBG_IDLE_CHK_COND_REG_WIDE_BUS_SHIFT 23 |
| #define DBG_IDLE_CHK_COND_REG_BLOCK_ID_MASK 0xFF |
| #define DBG_IDLE_CHK_COND_REG_BLOCK_ID_SHIFT 24 |
| u16 num_entries; |
| u8 entry_size; |
| u8 start_entry; |
| }; |
| |
| /* Idle Check info register */ |
| struct dbg_idle_chk_info_reg { |
| u32 data; |
| #define DBG_IDLE_CHK_INFO_REG_ADDRESS_MASK 0x7FFFFF |
| #define DBG_IDLE_CHK_INFO_REG_ADDRESS_SHIFT 0 |
| #define DBG_IDLE_CHK_INFO_REG_WIDE_BUS_MASK 0x1 |
| #define DBG_IDLE_CHK_INFO_REG_WIDE_BUS_SHIFT 23 |
| #define DBG_IDLE_CHK_INFO_REG_BLOCK_ID_MASK 0xFF |
| #define DBG_IDLE_CHK_INFO_REG_BLOCK_ID_SHIFT 24 |
| u16 size; /* register size in dwords */ |
| struct dbg_mode_hdr mode; /* Mode header */ |
| }; |
| |
| /* Idle Check register */ |
| union dbg_idle_chk_reg { |
| struct dbg_idle_chk_cond_reg cond_reg; /* condition register */ |
| struct dbg_idle_chk_info_reg info_reg; /* info register */ |
| }; |
| |
| /* Idle Check result header */ |
| struct dbg_idle_chk_result_hdr { |
| u16 rule_id; /* Failing rule index */ |
| u16 mem_entry_id; /* Failing memory entry index */ |
| u8 num_dumped_cond_regs; /* number of dumped condition registers */ |
| u8 num_dumped_info_regs; /* number of dumped condition registers */ |
| u8 severity; /* from dbg_idle_chk_severity_types enum */ |
| u8 reserved; |
| }; |
| |
| /* Idle Check result register header */ |
| struct dbg_idle_chk_result_reg_hdr { |
| u8 data; |
| #define DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM_MASK 0x1 |
| #define DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM_SHIFT 0 |
| #define DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID_MASK 0x7F |
| #define DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID_SHIFT 1 |
| u8 start_entry; /* index of the first checked entry */ |
| u16 size; /* register size in dwords */ |
| }; |
| |
| /* Idle Check rule */ |
| struct dbg_idle_chk_rule { |
| u16 rule_id; /* Idle Check rule ID */ |
| u8 severity; /* value from dbg_idle_chk_severity_types enum */ |
| u8 cond_id; /* Condition ID */ |
| u8 num_cond_regs; /* number of condition registers */ |
| u8 num_info_regs; /* number of info registers */ |
| u8 num_imms; /* number of immediates in the condition */ |
| u8 reserved1; |
| u16 reg_offset; /* offset of this rules registers in the idle check |
| * register array (in dbg_idle_chk_reg units). |
| */ |
| u16 imm_offset; /* offset of this rules immediate values in the |
| * immediate values array (in dwords). |
| */ |
| }; |
| |
| /* Idle Check rule parsing data */ |
| struct dbg_idle_chk_rule_parsing_data { |
| u32 data; |
| #define DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG_MASK 0x1 |
| #define DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG_SHIFT 0 |
| #define DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET_MASK 0x7FFFFFFF |
| #define DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET_SHIFT 1 |
| }; |
| |
| /* Idle check severity types */ |
| enum dbg_idle_chk_severity_types { |
| /* idle check failure should cause an error */ |
| IDLE_CHK_SEVERITY_ERROR, |
| /* idle check failure should cause an error only if theres no traffic */ |
| IDLE_CHK_SEVERITY_ERROR_NO_TRAFFIC, |
| /* idle check failure should cause a warning */ |
| IDLE_CHK_SEVERITY_WARNING, |
| MAX_DBG_IDLE_CHK_SEVERITY_TYPES |
| }; |
| |
| /* Reset register */ |
| struct dbg_reset_reg { |
| u32 data; |
| #define DBG_RESET_REG_ADDR_MASK 0xFFFFFF |
| #define DBG_RESET_REG_ADDR_SHIFT 0 |
| #define DBG_RESET_REG_IS_REMOVED_MASK 0x1 |
| #define DBG_RESET_REG_IS_REMOVED_SHIFT 24 |
| #define DBG_RESET_REG_RESERVED_MASK 0x7F |
| #define DBG_RESET_REG_RESERVED_SHIFT 25 |
| }; |
| |
| /* Debug Bus block data */ |
| struct dbg_bus_block_data { |
| u8 enable_mask; |
| u8 right_shift; |
| u8 force_valid_mask; |
| u8 force_frame_mask; |
| u8 dword_mask; |
| u8 line_num; |
| u8 hw_id; |
| u8 flags; |
| #define DBG_BUS_BLOCK_DATA_IS_256B_LINE_MASK 0x1 |
| #define DBG_BUS_BLOCK_DATA_IS_256B_LINE_SHIFT 0 |
| #define DBG_BUS_BLOCK_DATA_RESERVED_MASK 0x7F |
| #define DBG_BUS_BLOCK_DATA_RESERVED_SHIFT 1 |
| }; |
| |
| enum dbg_bus_clients { |
| DBG_BUS_CLIENT_RBCN, |
| DBG_BUS_CLIENT_RBCP, |
| DBG_BUS_CLIENT_RBCR, |
| DBG_BUS_CLIENT_RBCT, |
| DBG_BUS_CLIENT_RBCU, |
| DBG_BUS_CLIENT_RBCF, |
| DBG_BUS_CLIENT_RBCX, |
| DBG_BUS_CLIENT_RBCS, |
| DBG_BUS_CLIENT_RBCH, |
| DBG_BUS_CLIENT_RBCZ, |
| DBG_BUS_CLIENT_OTHER_ENGINE, |
| DBG_BUS_CLIENT_TIMESTAMP, |
| DBG_BUS_CLIENT_CPU, |
| DBG_BUS_CLIENT_RBCY, |
| DBG_BUS_CLIENT_RBCQ, |
| DBG_BUS_CLIENT_RBCM, |
| DBG_BUS_CLIENT_RBCB, |
| DBG_BUS_CLIENT_RBCW, |
| DBG_BUS_CLIENT_RBCV, |
| MAX_DBG_BUS_CLIENTS |
| }; |
| |
| /* Debug Bus constraint operation types */ |
| enum dbg_bus_constraint_ops { |
| DBG_BUS_CONSTRAINT_OP_EQ, |
| DBG_BUS_CONSTRAINT_OP_NE, |
| DBG_BUS_CONSTRAINT_OP_LT, |
| DBG_BUS_CONSTRAINT_OP_LTC, |
| DBG_BUS_CONSTRAINT_OP_LE, |
| DBG_BUS_CONSTRAINT_OP_LEC, |
| DBG_BUS_CONSTRAINT_OP_GT, |
| DBG_BUS_CONSTRAINT_OP_GTC, |
| DBG_BUS_CONSTRAINT_OP_GE, |
| DBG_BUS_CONSTRAINT_OP_GEC, |
| MAX_DBG_BUS_CONSTRAINT_OPS |
| }; |
| |
| /* Debug Bus trigger state data */ |
| struct dbg_bus_trigger_state_data { |
| u8 msg_len; |
| u8 constraint_dword_mask; |
| u8 storm_id; |
| u8 reserved; |
| }; |
| |
| /* Debug Bus memory address */ |
| struct dbg_bus_mem_addr { |
| u32 lo; |
| u32 hi; |
| }; |
| |
| /* Debug Bus PCI buffer data */ |
| struct dbg_bus_pci_buf_data { |
| struct dbg_bus_mem_addr phys_addr; /* PCI buffer physical address */ |
| struct dbg_bus_mem_addr virt_addr; /* PCI buffer virtual address */ |
| u32 size; /* PCI buffer size in bytes */ |
| }; |
| |
| /* Debug Bus Storm EID range filter params */ |
| struct dbg_bus_storm_eid_range_params { |
| u8 min; /* Minimal event ID to filter on */ |
| u8 max; /* Maximal event ID to filter on */ |
| }; |
| |
| /* Debug Bus Storm EID mask filter params */ |
| struct dbg_bus_storm_eid_mask_params { |
| u8 val; /* Event ID value */ |
| u8 mask; /* Event ID mask. 1s in the mask = dont care bits. */ |
| }; |
| |
| /* Debug Bus Storm EID filter params */ |
| union dbg_bus_storm_eid_params { |
| struct dbg_bus_storm_eid_range_params range; |
| struct dbg_bus_storm_eid_mask_params mask; |
| }; |
| |
| /* Debug Bus Storm data */ |
| struct dbg_bus_storm_data { |
| u8 enabled; |
| u8 mode; |
| u8 hw_id; |
| u8 eid_filter_en; |
| u8 eid_range_not_mask; |
| u8 cid_filter_en; |
| union dbg_bus_storm_eid_params eid_filter_params; |
| u32 cid; |
| }; |
| |
| /* Debug Bus data */ |
| struct dbg_bus_data { |
| u32 app_version; |
| u8 state; |
| u8 mode_256b_en; |
| u8 num_enabled_blocks; |
| u8 num_enabled_storms; |
| u8 target; |
| u8 one_shot_en; |
| u8 grc_input_en; |
| u8 timestamp_input_en; |
| u8 filter_en; |
| u8 adding_filter; |
| u8 filter_pre_trigger; |
| u8 filter_post_trigger; |
| u8 trigger_en; |
| u8 filter_constraint_dword_mask; |
| u8 next_trigger_state; |
| u8 next_constraint_id; |
| struct dbg_bus_trigger_state_data trigger_states[3]; |
| u8 filter_msg_len; |
| u8 rcv_from_other_engine; |
| u8 blocks_dword_mask; |
| u8 blocks_dword_overlap; |
| u32 hw_id_mask; |
| struct dbg_bus_pci_buf_data pci_buf; |
| struct dbg_bus_block_data blocks[132]; |
| struct dbg_bus_storm_data storms[6]; |
| }; |
| |
| /* Debug bus states */ |
| enum dbg_bus_states { |
| DBG_BUS_STATE_IDLE, |
| DBG_BUS_STATE_READY, |
| DBG_BUS_STATE_RECORDING, |
| DBG_BUS_STATE_STOPPED, |
| MAX_DBG_BUS_STATES |
| }; |
| |
| /* Debug Bus Storm modes */ |
| enum dbg_bus_storm_modes { |
| DBG_BUS_STORM_MODE_PRINTF, |
| DBG_BUS_STORM_MODE_PRAM_ADDR, |
| DBG_BUS_STORM_MODE_DRA_RW, |
| DBG_BUS_STORM_MODE_DRA_W, |
| DBG_BUS_STORM_MODE_LD_ST_ADDR, |
| DBG_BUS_STORM_MODE_DRA_FSM, |
| DBG_BUS_STORM_MODE_FAST_DBGMUX, |
| DBG_BUS_STORM_MODE_RH, |
| DBG_BUS_STORM_MODE_RH_WITH_STORE, |
| DBG_BUS_STORM_MODE_FOC, |
| DBG_BUS_STORM_MODE_EXT_STORE, |
| MAX_DBG_BUS_STORM_MODES |
| }; |
| |
| /* Debug bus target IDs */ |
| enum dbg_bus_targets { |
| DBG_BUS_TARGET_ID_INT_BUF, |
| DBG_BUS_TARGET_ID_NIG, |
| DBG_BUS_TARGET_ID_PCI, |
| MAX_DBG_BUS_TARGETS |
| }; |
| |
| /* GRC Dump data */ |
| struct dbg_grc_data { |
| u8 params_initialized; |
| u8 reserved1; |
| u16 reserved2; |
| u32 param_val[48]; |
| }; |
| |
| /* Debug GRC params */ |
| enum dbg_grc_params { |
| DBG_GRC_PARAM_DUMP_TSTORM, |
| DBG_GRC_PARAM_DUMP_MSTORM, |
| DBG_GRC_PARAM_DUMP_USTORM, |
| DBG_GRC_PARAM_DUMP_XSTORM, |
| DBG_GRC_PARAM_DUMP_YSTORM, |
| DBG_GRC_PARAM_DUMP_PSTORM, |
| DBG_GRC_PARAM_DUMP_REGS, |
| DBG_GRC_PARAM_DUMP_RAM, |
| DBG_GRC_PARAM_DUMP_PBUF, |
| DBG_GRC_PARAM_DUMP_IOR, |
| DBG_GRC_PARAM_DUMP_VFC, |
| DBG_GRC_PARAM_DUMP_CM_CTX, |
| DBG_GRC_PARAM_DUMP_PXP, |
| DBG_GRC_PARAM_DUMP_RSS, |
| DBG_GRC_PARAM_DUMP_CAU, |
| DBG_GRC_PARAM_DUMP_QM, |
| DBG_GRC_PARAM_DUMP_MCP, |
| DBG_GRC_PARAM_DUMP_DORQ, |
| DBG_GRC_PARAM_DUMP_CFC, |
| DBG_GRC_PARAM_DUMP_IGU, |
| DBG_GRC_PARAM_DUMP_BRB, |
| DBG_GRC_PARAM_DUMP_BTB, |
| DBG_GRC_PARAM_DUMP_BMB, |
| DBG_GRC_PARAM_RESERVD1, |
| DBG_GRC_PARAM_DUMP_MULD, |
| DBG_GRC_PARAM_DUMP_PRS, |
| DBG_GRC_PARAM_DUMP_DMAE, |
| DBG_GRC_PARAM_DUMP_TM, |
| DBG_GRC_PARAM_DUMP_SDM, |
| DBG_GRC_PARAM_DUMP_DIF, |
| DBG_GRC_PARAM_DUMP_STATIC, |
| DBG_GRC_PARAM_UNSTALL, |
| DBG_GRC_PARAM_RESERVED2, |
| DBG_GRC_PARAM_MCP_TRACE_META_SIZE, |
| DBG_GRC_PARAM_EXCLUDE_ALL, |
| DBG_GRC_PARAM_CRASH, |
| DBG_GRC_PARAM_PARITY_SAFE, |
| DBG_GRC_PARAM_DUMP_CM, |
| DBG_GRC_PARAM_DUMP_PHY, |
| DBG_GRC_PARAM_NO_MCP, |
| DBG_GRC_PARAM_NO_FW_VER, |
| DBG_GRC_PARAM_RESERVED3, |
| DBG_GRC_PARAM_DUMP_MCP_HW_DUMP, |
| DBG_GRC_PARAM_DUMP_ILT_CDUC, |
| DBG_GRC_PARAM_DUMP_ILT_CDUT, |
| DBG_GRC_PARAM_DUMP_CAU_EXT, |
| MAX_DBG_GRC_PARAMS |
| }; |
| |
| /* Debug status codes */ |
| enum dbg_status { |
| DBG_STATUS_OK, |
| DBG_STATUS_APP_VERSION_NOT_SET, |
| DBG_STATUS_UNSUPPORTED_APP_VERSION, |
| DBG_STATUS_DBG_BLOCK_NOT_RESET, |
| DBG_STATUS_INVALID_ARGS, |
| DBG_STATUS_OUTPUT_ALREADY_SET, |
| DBG_STATUS_INVALID_PCI_BUF_SIZE, |
| DBG_STATUS_PCI_BUF_ALLOC_FAILED, |
| DBG_STATUS_PCI_BUF_NOT_ALLOCATED, |
| DBG_STATUS_INVALID_FILTER_TRIGGER_DWORDS, |
| DBG_STATUS_NO_MATCHING_FRAMING_MODE, |
| DBG_STATUS_VFC_READ_ERROR, |
| DBG_STATUS_STORM_ALREADY_ENABLED, |
| DBG_STATUS_STORM_NOT_ENABLED, |
| DBG_STATUS_BLOCK_ALREADY_ENABLED, |
| DBG_STATUS_BLOCK_NOT_ENABLED, |
| DBG_STATUS_NO_INPUT_ENABLED, |
| DBG_STATUS_NO_FILTER_TRIGGER_256B, |
| DBG_STATUS_FILTER_ALREADY_ENABLED, |
| DBG_STATUS_TRIGGER_ALREADY_ENABLED, |
| DBG_STATUS_TRIGGER_NOT_ENABLED, |
| DBG_STATUS_CANT_ADD_CONSTRAINT, |
| DBG_STATUS_TOO_MANY_TRIGGER_STATES, |
| DBG_STATUS_TOO_MANY_CONSTRAINTS, |
| DBG_STATUS_RECORDING_NOT_STARTED, |
| DBG_STATUS_DATA_DIDNT_TRIGGER, |
| DBG_STATUS_NO_DATA_RECORDED, |
| DBG_STATUS_DUMP_BUF_TOO_SMALL, |
| DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED, |
| DBG_STATUS_UNKNOWN_CHIP, |
| DBG_STATUS_VIRT_MEM_ALLOC_FAILED, |
| DBG_STATUS_BLOCK_IN_RESET, |
| DBG_STATUS_INVALID_TRACE_SIGNATURE, |
| DBG_STATUS_INVALID_NVRAM_BUNDLE, |
| DBG_STATUS_NVRAM_GET_IMAGE_FAILED, |
| DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE, |
| DBG_STATUS_NVRAM_READ_FAILED, |
| DBG_STATUS_IDLE_CHK_PARSE_FAILED, |
| DBG_STATUS_MCP_TRACE_BAD_DATA, |
| DBG_STATUS_MCP_TRACE_NO_META, |
| DBG_STATUS_MCP_COULD_NOT_HALT, |
| DBG_STATUS_MCP_COULD_NOT_RESUME, |
| DBG_STATUS_RESERVED0, |
| DBG_STATUS_SEMI_FIFO_NOT_EMPTY, |
| DBG_STATUS_IGU_FIFO_BAD_DATA, |
| DBG_STATUS_MCP_COULD_NOT_MASK_PRTY, |
| DBG_STATUS_FW_ASSERTS_PARSE_FAILED, |
| DBG_STATUS_REG_FIFO_BAD_DATA, |
| DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA, |
| DBG_STATUS_DBG_ARRAY_NOT_SET, |
| DBG_STATUS_RESERVED1, |
| DBG_STATUS_NON_MATCHING_LINES, |
| DBG_STATUS_INSUFFICIENT_HW_IDS, |
| DBG_STATUS_DBG_BUS_IN_USE, |
| DBG_STATUS_INVALID_STORM_DBG_MODE, |
| DBG_STATUS_OTHER_ENGINE_BB_ONLY, |
| DBG_STATUS_FILTER_SINGLE_HW_ID, |
| DBG_STATUS_TRIGGER_SINGLE_HW_ID, |
| DBG_STATUS_MISSING_TRIGGER_STATE_STORM, |
| MAX_DBG_STATUS |
| }; |
| |
| /* Debug Storms IDs */ |
| enum dbg_storms { |
| DBG_TSTORM_ID, |
| DBG_MSTORM_ID, |
| DBG_USTORM_ID, |
| DBG_XSTORM_ID, |
| DBG_YSTORM_ID, |
| DBG_PSTORM_ID, |
| MAX_DBG_STORMS |
| }; |
| |
| /* Idle Check data */ |
| struct idle_chk_data { |
| u32 buf_size; |
| u8 buf_size_set; |
| u8 reserved1; |
| u16 reserved2; |
| }; |
| |
| struct pretend_params { |
| u8 split_type; |
| u8 reserved; |
| u16 split_id; |
| }; |
| |
| /* Debug Tools data (per HW function) |
| */ |
| struct dbg_tools_data { |
| struct dbg_grc_data grc; |
| struct dbg_bus_data bus; |
| struct idle_chk_data idle_chk; |
| u8 mode_enable[40]; |
| u8 block_in_reset[132]; |
| u8 chip_id; |
| u8 hw_type; |
| u8 num_ports; |
| u8 num_pfs_per_port; |
| u8 num_vfs; |
| u8 initialized; |
| u8 use_dmae; |
| u8 reserved; |
| struct pretend_params pretend; |
| u32 num_regs_read; |
| }; |
| |
| /* ILT Clients */ |
| enum ilt_clients { |
| ILT_CLI_CDUC, |
| ILT_CLI_CDUT, |
| ILT_CLI_QM, |
| ILT_CLI_TM, |
| ILT_CLI_SRC, |
| ILT_CLI_TSDM, |
| ILT_CLI_RGFS, |
| ILT_CLI_TGFS, |
| MAX_ILT_CLIENTS |
| }; |
| |
| /***************************** Public Functions *******************************/ |
| |
| /** |
| * qed_dbg_set_bin_ptr(): Sets a pointer to the binary data with debug |
| * arrays. |
| * |
| * @p_hwfn: HW device data. |
| * @bin_ptr: A pointer to the binary data with debug arrays. |
| * |
| * Return: enum dbg status. |
| */ |
| enum dbg_status qed_dbg_set_bin_ptr(struct qed_hwfn *p_hwfn, |
| const u8 * const bin_ptr); |
| |
| /** |
| * qed_read_regs(): Reads registers into a buffer (using GRC). |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @buf: Destination buffer. |
| * @addr: Source GRC address in dwords. |
| * @len: Number of registers to read. |
| * |
| * Return: Void. |
| */ |
| void qed_read_regs(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, u32 *buf, u32 addr, u32 len); |
| |
| /** |
| * qed_read_fw_info(): Reads FW info from the chip. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @fw_info: (Out) a pointer to write the FW info into. |
| * |
| * Return: True if the FW info was read successfully from one of the Storms, |
| * or false if all Storms are in reset. |
| * |
| * The FW info contains FW-related information, such as the FW version, |
| * FW image (main/L2B/kuku), FW timestamp, etc. |
| * The FW info is read from the internal RAM of the first Storm that is not in |
| * reset. |
| */ |
| bool qed_read_fw_info(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, struct fw_info *fw_info); |
| /** |
| * qed_dbg_grc_config(): Sets the value of a GRC parameter. |
| * |
| * @p_hwfn: HW device data. |
| * @grc_param: GRC parameter. |
| * @val: Value to set. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set. |
| * - Grc_param is invalid. |
| * - Val is outside the allowed boundaries. |
| */ |
| enum dbg_status qed_dbg_grc_config(struct qed_hwfn *p_hwfn, |
| enum dbg_grc_params grc_param, u32 val); |
| |
| /** |
| * qed_dbg_grc_set_params_default(): Reverts all GRC parameters to their |
| * default value. |
| * |
| * @p_hwfn: HW device data. |
| * |
| * Return: Void. |
| */ |
| void qed_dbg_grc_set_params_default(struct qed_hwfn *p_hwfn); |
| /** |
| * qed_dbg_grc_get_dump_buf_size(): Returns the required buffer size for |
| * GRC Dump. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @buf_size: (OUT) required buffer size (in dwords) for the GRC Dump |
| * data. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_grc_get_dump_buf_size(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *buf_size); |
| |
| /** |
| * qed_dbg_grc_dump(): Dumps GRC data into the specified buffer. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @dump_buf: Pointer to write the collected GRC data into. |
| * @buf_size_in_dwords:Size of the specified buffer in dwords. |
| * @num_dumped_dwords: (OUT) number of dumped dwords. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set. |
| * - The specified dump buffer is too small. |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_grc_dump(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *dump_buf, |
| u32 buf_size_in_dwords, |
| u32 *num_dumped_dwords); |
| |
| /** |
| * qed_dbg_idle_chk_get_dump_buf_size(): Returns the required buffer size |
| * for idle check results. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @buf_size: (OUT) required buffer size (in dwords) for the idle check |
| * data. |
| * |
| * return: Error if one of the following holds: |
| * - The version wasn't set. |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *buf_size); |
| |
| /** |
| * qed_dbg_idle_chk_dump: Performs idle check and writes the results |
| * into the specified buffer. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @dump_buf: Pointer to write the idle check data into. |
| * @buf_size_in_dwords: Size of the specified buffer in dwords. |
| * @num_dumped_dwords: (OUT) number of dumped dwords. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set. |
| * - The specified buffer is too small. |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_idle_chk_dump(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *dump_buf, |
| u32 buf_size_in_dwords, |
| u32 *num_dumped_dwords); |
| |
| /** |
| * qed_dbg_mcp_trace_get_dump_buf_size(): Returns the required buffer size |
| * for mcp trace results. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @buf_size: (OUT) Required buffer size (in dwords) for mcp trace data. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set. |
| * - The trace data in MCP scratchpad contain an invalid signature. |
| * - The bundle ID in NVRAM is invalid. |
| * - The trace meta data cannot be found (in NVRAM or image file). |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *buf_size); |
| |
| /** |
| * qed_dbg_mcp_trace_dump(): Performs mcp trace and writes the results |
| * into the specified buffer. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @dump_buf: Pointer to write the mcp trace data into. |
| * @buf_size_in_dwords: Size of the specified buffer in dwords. |
| * @num_dumped_dwords: (OUT) number of dumped dwords. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set. |
| * - The specified buffer is too small. |
| * - The trace data in MCP scratchpad contain an invalid signature. |
| * - The bundle ID in NVRAM is invalid. |
| * - The trace meta data cannot be found (in NVRAM or image file). |
| * - The trace meta data cannot be read (from NVRAM or image file). |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_mcp_trace_dump(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *dump_buf, |
| u32 buf_size_in_dwords, |
| u32 *num_dumped_dwords); |
| |
| /** |
| * qed_dbg_reg_fifo_get_dump_buf_size(): Returns the required buffer size |
| * for grc trace fifo results. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @buf_size: (OUT) Required buffer size (in dwords) for reg fifo data. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *buf_size); |
| |
| /** |
| * qed_dbg_reg_fifo_dump(): Reads the reg fifo and writes the results into |
| * the specified buffer. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @dump_buf: Pointer to write the reg fifo data into. |
| * @buf_size_in_dwords: Size of the specified buffer in dwords. |
| * @num_dumped_dwords: (OUT) number of dumped dwords. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set. |
| * - The specified buffer is too small. |
| * - DMAE transaction failed. |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_reg_fifo_dump(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *dump_buf, |
| u32 buf_size_in_dwords, |
| u32 *num_dumped_dwords); |
| |
| /** |
| * qed_dbg_igu_fifo_get_dump_buf_size(): Returns the required buffer size |
| * for the IGU fifo results. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @buf_size: (OUT) Required buffer size (in dwords) for the IGU fifo |
| * data. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set. |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *buf_size); |
| |
| /** |
| * qed_dbg_igu_fifo_dump(): Reads the IGU fifo and writes the results into |
| * the specified buffer. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @dump_buf: Pointer to write the IGU fifo data into. |
| * @buf_size_in_dwords: Size of the specified buffer in dwords. |
| * @num_dumped_dwords: (OUT) number of dumped dwords. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set |
| * - The specified buffer is too small |
| * - DMAE transaction failed |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_igu_fifo_dump(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *dump_buf, |
| u32 buf_size_in_dwords, |
| u32 *num_dumped_dwords); |
| |
| /** |
| * qed_dbg_protection_override_get_dump_buf_size(): Returns the required |
| * buffer size for protection override window results. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @buf_size: (OUT) Required buffer size (in dwords) for protection |
| * override data. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status |
| qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *buf_size); |
| /** |
| * qed_dbg_protection_override_dump(): Reads protection override window |
| * entries and writes the results into the specified buffer. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @dump_buf: Pointer to write the protection override data into. |
| * @buf_size_in_dwords: Size of the specified buffer in dwords. |
| * @num_dumped_dwords: (OUT) number of dumped dwords. |
| * |
| * @return: Error if one of the following holds: |
| * - The version wasn't set. |
| * - The specified buffer is too small. |
| * - DMAE transaction failed. |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_protection_override_dump(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *dump_buf, |
| u32 buf_size_in_dwords, |
| u32 *num_dumped_dwords); |
| /** |
| * qed_dbg_fw_asserts_get_dump_buf_size(): Returns the required buffer |
| * size for FW Asserts results. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @buf_size: (OUT) Required buffer size (in dwords) for FW Asserts data. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set. |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *buf_size); |
| /** |
| * qed_dbg_fw_asserts_dump(): Reads the FW Asserts and writes the results |
| * into the specified buffer. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @dump_buf: Pointer to write the FW Asserts data into. |
| * @buf_size_in_dwords: Size of the specified buffer in dwords. |
| * @num_dumped_dwords: (OUT) number of dumped dwords. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set. |
| * - The specified buffer is too small. |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_fw_asserts_dump(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *dump_buf, |
| u32 buf_size_in_dwords, |
| u32 *num_dumped_dwords); |
| |
| /** |
| * qed_dbg_read_attn(): Reads the attention registers of the specified |
| * block and type, and writes the results into the specified buffer. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: Ptt window used for writing the registers. |
| * @block: Block ID. |
| * @attn_type: Attention type. |
| * @clear_status: Indicates if the attention status should be cleared. |
| * @results: (OUT) Pointer to write the read results into. |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_read_attn(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| enum block_id block, |
| enum dbg_attn_type attn_type, |
| bool clear_status, |
| struct dbg_attn_block_result *results); |
| |
| /** |
| * qed_dbg_print_attn(): Prints attention registers values in the |
| * specified results struct. |
| * |
| * @p_hwfn: HW device data. |
| * @results: Pointer to the attention read results |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_print_attn(struct qed_hwfn *p_hwfn, |
| struct dbg_attn_block_result *results); |
| |
| /******************************* Data Types **********************************/ |
| |
| struct mcp_trace_format { |
| u32 data; |
| #define MCP_TRACE_FORMAT_MODULE_MASK 0x0000ffff |
| #define MCP_TRACE_FORMAT_MODULE_OFFSET 0 |
| #define MCP_TRACE_FORMAT_LEVEL_MASK 0x00030000 |
| #define MCP_TRACE_FORMAT_LEVEL_OFFSET 16 |
| #define MCP_TRACE_FORMAT_P1_SIZE_MASK 0x000c0000 |
| #define MCP_TRACE_FORMAT_P1_SIZE_OFFSET 18 |
| #define MCP_TRACE_FORMAT_P2_SIZE_MASK 0x00300000 |
| #define MCP_TRACE_FORMAT_P2_SIZE_OFFSET 20 |
| #define MCP_TRACE_FORMAT_P3_SIZE_MASK 0x00c00000 |
| #define MCP_TRACE_FORMAT_P3_SIZE_OFFSET 22 |
| #define MCP_TRACE_FORMAT_LEN_MASK 0xff000000 |
| #define MCP_TRACE_FORMAT_LEN_OFFSET 24 |
| |
| char *format_str; |
| }; |
| |
| /* MCP Trace Meta data structure */ |
| struct mcp_trace_meta { |
| u32 modules_num; |
| char **modules; |
| u32 formats_num; |
| struct mcp_trace_format *formats; |
| bool is_allocated; |
| }; |
| |
| /* Debug Tools user data */ |
| struct dbg_tools_user_data { |
| struct mcp_trace_meta mcp_trace_meta; |
| const u32 *mcp_trace_user_meta_buf; |
| }; |
| |
| /******************************** Constants **********************************/ |
| |
| #define MAX_NAME_LEN 16 |
| |
| /***************************** Public Functions *******************************/ |
| |
| /** |
| * qed_dbg_user_set_bin_ptr(): Sets a pointer to the binary data with |
| * debug arrays. |
| * |
| * @p_hwfn: HW device data. |
| * @bin_ptr: a pointer to the binary data with debug arrays. |
| * |
| * Return: dbg_status. |
| */ |
| enum dbg_status qed_dbg_user_set_bin_ptr(struct qed_hwfn *p_hwfn, |
| const u8 * const bin_ptr); |
| |
| /** |
| * qed_dbg_alloc_user_data(): Allocates user debug data. |
| * |
| * @p_hwfn: HW device data. |
| * @user_data_ptr: (OUT) a pointer to the allocated memory. |
| * |
| * Return: dbg_status. |
| */ |
| enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn, |
| void **user_data_ptr); |
| |
| /** |
| * qed_dbg_get_status_str(): Returns a string for the specified status. |
| * |
| * @status: A debug status code. |
| * |
| * Return: A string for the specified status. |
| */ |
| const char *qed_dbg_get_status_str(enum dbg_status status); |
| |
| /** |
| * qed_get_idle_chk_results_buf_size(): Returns the required buffer size |
| * for idle check results (in bytes). |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: idle check dump buffer. |
| * @num_dumped_dwords: number of dwords that were dumped. |
| * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed |
| * results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_get_idle_chk_results_buf_size(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| u32 *results_buf_size); |
| /** |
| * qed_print_idle_chk_results(): Prints idle check results |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: idle check dump buffer. |
| * @num_dumped_dwords: number of dwords that were dumped. |
| * @results_buf: buffer for printing the idle check results. |
| * @num_errors: (OUT) number of errors found in idle check. |
| * @num_warnings: (OUT) number of warnings found in idle check. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_print_idle_chk_results(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| char *results_buf, |
| u32 *num_errors, |
| u32 *num_warnings); |
| |
| /** |
| * qed_dbg_mcp_trace_set_meta_data(): Sets the MCP Trace meta data. |
| * |
| * @p_hwfn: HW device data. |
| * @meta_buf: Meta buffer. |
| * |
| * Return: Void. |
| * |
| * Needed in case the MCP Trace dump doesn't contain the meta data (e.g. due to |
| * no NVRAM access). |
| */ |
| void qed_dbg_mcp_trace_set_meta_data(struct qed_hwfn *p_hwfn, |
| const u32 *meta_buf); |
| |
| /** |
| * qed_get_mcp_trace_results_buf_size(): Returns the required buffer size |
| * for MCP Trace results (in bytes). |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: MCP Trace dump buffer. |
| * @num_dumped_dwords: number of dwords that were dumped. |
| * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed |
| * results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_get_mcp_trace_results_buf_size(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| u32 *results_buf_size); |
| |
| /** |
| * qed_print_mcp_trace_results(): Prints MCP Trace results |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: MCP trace dump buffer, starting from the header. |
| * @num_dumped_dwords: Member of dwords that were dumped. |
| * @results_buf: Buffer for printing the mcp trace results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| char *results_buf); |
| |
| /** |
| * qed_print_mcp_trace_results_cont(): Prints MCP Trace results, and |
| * keeps the MCP trace meta data allocated, to support continuous MCP Trace |
| * parsing. After the continuous parsing ends, mcp_trace_free_meta_data should |
| * be called to free the meta data. |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: MVP trace dump buffer, starting from the header. |
| * @results_buf: Buffer for printing the mcp trace results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_print_mcp_trace_results_cont(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| char *results_buf); |
| |
| /** |
| * qed_print_mcp_trace_line(): Prints MCP Trace results for a single line |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: MCP trace dump buffer, starting from the header. |
| * @num_dumped_bytes: Number of bytes that were dumped. |
| * @results_buf: Buffer for printing the mcp trace results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_print_mcp_trace_line(struct qed_hwfn *p_hwfn, |
| u8 *dump_buf, |
| u32 num_dumped_bytes, |
| char *results_buf); |
| |
| /** |
| * qed_mcp_trace_free_meta_data(): Frees the MCP Trace meta data. |
| * Should be called after continuous MCP Trace parsing. |
| * |
| * @p_hwfn: HW device data. |
| * |
| * Return: Void. |
| */ |
| void qed_mcp_trace_free_meta_data(struct qed_hwfn *p_hwfn); |
| |
| /** |
| * qed_get_reg_fifo_results_buf_size(): Returns the required buffer size |
| * for reg_fifo results (in bytes). |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: Reg fifo dump buffer. |
| * @num_dumped_dwords: Number of dwords that were dumped. |
| * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed |
| * results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_get_reg_fifo_results_buf_size(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| u32 *results_buf_size); |
| |
| /** |
| * qed_print_reg_fifo_results(): Prints reg fifo results. |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: Reg fifo dump buffer, starting from the header. |
| * @num_dumped_dwords: Number of dwords that were dumped. |
| * @results_buf: Buffer for printing the reg fifo results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| char *results_buf); |
| |
| /** |
| * qed_get_igu_fifo_results_buf_size(): Returns the required buffer size |
| * for igu_fifo results (in bytes). |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: IGU fifo dump buffer. |
| * @num_dumped_dwords: number of dwords that were dumped. |
| * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed |
| * results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_get_igu_fifo_results_buf_size(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| u32 *results_buf_size); |
| |
| /** |
| * qed_print_igu_fifo_results(): Prints IGU fifo results |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: IGU fifo dump buffer, starting from the header. |
| * @num_dumped_dwords: Number of dwords that were dumped. |
| * @results_buf: Buffer for printing the IGU fifo results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| char *results_buf); |
| |
| /** |
| * qed_get_protection_override_results_buf_size(): Returns the required |
| * buffer size for protection override results (in bytes). |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: Protection override dump buffer. |
| * @num_dumped_dwords: Number of dwords that were dumped. |
| * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed |
| * results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status |
| qed_get_protection_override_results_buf_size(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| u32 *results_buf_size); |
| |
| /** |
| * qed_print_protection_override_results(): Prints protection override |
| * results. |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: Protection override dump buffer, starting from the header. |
| * @num_dumped_dwords: Number of dwords that were dumped. |
| * @results_buf: Buffer for printing the reg fifo results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| char *results_buf); |
| |
| /** |
| * qed_get_fw_asserts_results_buf_size(): Returns the required buffer size |
| * for FW Asserts results (in bytes). |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: FW Asserts dump buffer. |
| * @num_dumped_dwords: number of dwords that were dumped. |
| * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed |
| * results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_get_fw_asserts_results_buf_size(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| u32 *results_buf_size); |
| |
| /** |
| * qed_print_fw_asserts_results(): Prints FW Asserts results. |
| * |
| * @p_hwfn: HW device data. |
| * @dump_buf: FW Asserts dump buffer, starting from the header. |
| * @num_dumped_dwords: number of dwords that were dumped. |
| * @results_buf: buffer for printing the FW Asserts results. |
| * |
| * Return: Error if the parsing fails, ok otherwise. |
| */ |
| enum dbg_status qed_print_fw_asserts_results(struct qed_hwfn *p_hwfn, |
| u32 *dump_buf, |
| u32 num_dumped_dwords, |
| char *results_buf); |
| |
| /** |
| * qed_dbg_parse_attn(): Parses and prints attention registers values in |
| * the specified results struct. |
| * |
| * @p_hwfn: HW device data. |
| * @results: Pointer to the attention read results |
| * |
| * Return: Error if one of the following holds: |
| * - The version wasn't set. |
| * Otherwise, returns ok. |
| */ |
| enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn, |
| struct dbg_attn_block_result *results); |
| #endif |