|
@@ -15,13 +15,6 @@
|
|
|
#include "qed_mcp.h"
|
|
|
#include "qed_reg_addr.h"
|
|
|
|
|
|
-/* Chip IDs enum */
|
|
|
-enum chip_ids {
|
|
|
- CHIP_BB_B0,
|
|
|
- CHIP_K2,
|
|
|
- MAX_CHIP_IDS
|
|
|
-};
|
|
|
-
|
|
|
/* Memory groups enum */
|
|
|
enum mem_groups {
|
|
|
MEM_GROUP_PXP_MEM,
|
|
@@ -33,7 +26,6 @@ enum mem_groups {
|
|
|
MEM_GROUP_BRB_MEM,
|
|
|
MEM_GROUP_PRS_MEM,
|
|
|
MEM_GROUP_SDM_MEM,
|
|
|
- MEM_GROUP_PBUF,
|
|
|
MEM_GROUP_IOR,
|
|
|
MEM_GROUP_RAM,
|
|
|
MEM_GROUP_BTB_RAM,
|
|
@@ -45,6 +37,7 @@ enum mem_groups {
|
|
|
MEM_GROUP_CAU_PI,
|
|
|
MEM_GROUP_CAU_MEM,
|
|
|
MEM_GROUP_PXP_ILT,
|
|
|
+ MEM_GROUP_PBUF,
|
|
|
MEM_GROUP_MULD_MEM,
|
|
|
MEM_GROUP_BTB_MEM,
|
|
|
MEM_GROUP_IGU_MEM,
|
|
@@ -66,7 +59,6 @@ static const char * const s_mem_group_names[] = {
|
|
|
"BRB_MEM",
|
|
|
"PRS_MEM",
|
|
|
"SDM_MEM",
|
|
|
- "PBUF",
|
|
|
"IOR",
|
|
|
"RAM",
|
|
|
"BTB_RAM",
|
|
@@ -78,6 +70,7 @@ static const char * const s_mem_group_names[] = {
|
|
|
"CAU_PI",
|
|
|
"CAU_MEM",
|
|
|
"PXP_ILT",
|
|
|
+ "PBUF",
|
|
|
"MULD_MEM",
|
|
|
"BTB_MEM",
|
|
|
"IGU_MEM",
|
|
@@ -88,48 +81,59 @@ static const char * const s_mem_group_names[] = {
|
|
|
};
|
|
|
|
|
|
/* Idle check conditions */
|
|
|
-static u32 cond4(const u32 *r, const u32 *imm)
|
|
|
+
|
|
|
+static u32 cond5(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return ((r[0] & imm[0]) != imm[1]) && ((r[1] & imm[2]) != imm[3]);
|
|
|
}
|
|
|
|
|
|
-static u32 cond6(const u32 *r, const u32 *imm)
|
|
|
+static u32 cond7(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return ((r[0] >> imm[0]) & imm[1]) != imm[2];
|
|
|
}
|
|
|
|
|
|
-static u32 cond5(const u32 *r, const u32 *imm)
|
|
|
+static u32 cond14(const u32 *r, const u32 *imm)
|
|
|
+{
|
|
|
+ return (r[0] != imm[0]) && (((r[1] >> imm[1]) & imm[2]) == imm[3]);
|
|
|
+}
|
|
|
+
|
|
|
+static u32 cond6(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return (r[0] & imm[0]) != imm[1];
|
|
|
}
|
|
|
|
|
|
-static u32 cond8(const u32 *r, const u32 *imm)
|
|
|
+static u32 cond9(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return ((r[0] & imm[0]) >> imm[1]) !=
|
|
|
(((r[0] & imm[2]) >> imm[3]) | ((r[1] & imm[4]) << imm[5]));
|
|
|
}
|
|
|
|
|
|
-static u32 cond9(const u32 *r, const u32 *imm)
|
|
|
+static u32 cond10(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return ((r[0] & imm[0]) >> imm[1]) != (r[0] & imm[2]);
|
|
|
}
|
|
|
|
|
|
-static u32 cond1(const u32 *r, const u32 *imm)
|
|
|
+static u32 cond4(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return (r[0] & ~imm[0]) != imm[1];
|
|
|
}
|
|
|
|
|
|
static u32 cond0(const u32 *r, const u32 *imm)
|
|
|
+{
|
|
|
+ return (r[0] & ~r[1]) != imm[0];
|
|
|
+}
|
|
|
+
|
|
|
+static u32 cond1(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return r[0] != imm[0];
|
|
|
}
|
|
|
|
|
|
-static u32 cond10(const u32 *r, const u32 *imm)
|
|
|
+static u32 cond11(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return r[0] != r[1] && r[2] == imm[0];
|
|
|
}
|
|
|
|
|
|
-static u32 cond11(const u32 *r, const u32 *imm)
|
|
|
+static u32 cond12(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return r[0] != r[1] && r[2] > imm[0];
|
|
|
}
|
|
@@ -139,12 +143,12 @@ static u32 cond3(const u32 *r, const u32 *imm)
|
|
|
return r[0] != r[1];
|
|
|
}
|
|
|
|
|
|
-static u32 cond12(const u32 *r, const u32 *imm)
|
|
|
+static u32 cond13(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return r[0] & imm[0];
|
|
|
}
|
|
|
|
|
|
-static u32 cond7(const u32 *r, const u32 *imm)
|
|
|
+static u32 cond8(const u32 *r, const u32 *imm)
|
|
|
{
|
|
|
return r[0] < (r[1] - imm[0]);
|
|
|
}
|
|
@@ -169,6 +173,8 @@ static u32(*cond_arr[]) (const u32 *r, const u32 *imm) = {
|
|
|
cond10,
|
|
|
cond11,
|
|
|
cond12,
|
|
|
+ cond13,
|
|
|
+ cond14,
|
|
|
};
|
|
|
|
|
|
/******************************* Data Types **********************************/
|
|
@@ -181,11 +187,6 @@ enum platform_ids {
|
|
|
MAX_PLATFORM_IDS
|
|
|
};
|
|
|
|
|
|
-struct dbg_array {
|
|
|
- const u32 *ptr;
|
|
|
- u32 size_in_dwords;
|
|
|
-};
|
|
|
-
|
|
|
struct chip_platform_defs {
|
|
|
u8 num_ports;
|
|
|
u8 num_pfs;
|
|
@@ -204,7 +205,9 @@ struct platform_defs {
|
|
|
u32 delay_factor;
|
|
|
};
|
|
|
|
|
|
-/* Storm constant definitions */
|
|
|
+/* Storm constant definitions.
|
|
|
+ * Addresses are in bytes, sizes are in quad-regs.
|
|
|
+ */
|
|
|
struct storm_defs {
|
|
|
char letter;
|
|
|
enum block_id block_id;
|
|
@@ -218,13 +221,13 @@ struct storm_defs {
|
|
|
u32 sem_sync_dbg_empty_addr;
|
|
|
u32 sem_slow_dbg_empty_addr;
|
|
|
u32 cm_ctx_wr_addr;
|
|
|
- u32 cm_conn_ag_ctx_lid_size; /* In quad-regs */
|
|
|
+ u32 cm_conn_ag_ctx_lid_size;
|
|
|
u32 cm_conn_ag_ctx_rd_addr;
|
|
|
- u32 cm_conn_st_ctx_lid_size; /* In quad-regs */
|
|
|
+ u32 cm_conn_st_ctx_lid_size;
|
|
|
u32 cm_conn_st_ctx_rd_addr;
|
|
|
- u32 cm_task_ag_ctx_lid_size; /* In quad-regs */
|
|
|
+ u32 cm_task_ag_ctx_lid_size;
|
|
|
u32 cm_task_ag_ctx_rd_addr;
|
|
|
- u32 cm_task_st_ctx_lid_size; /* In quad-regs */
|
|
|
+ u32 cm_task_st_ctx_lid_size;
|
|
|
u32 cm_task_st_ctx_rd_addr;
|
|
|
};
|
|
|
|
|
@@ -233,17 +236,23 @@ struct block_defs {
|
|
|
const char *name;
|
|
|
bool has_dbg_bus[MAX_CHIP_IDS];
|
|
|
bool associated_to_storm;
|
|
|
- u32 storm_id; /* Valid only if associated_to_storm is true */
|
|
|
+
|
|
|
+ /* Valid only if associated_to_storm is true */
|
|
|
+ u32 storm_id;
|
|
|
enum dbg_bus_clients dbg_client_id[MAX_CHIP_IDS];
|
|
|
u32 dbg_select_addr;
|
|
|
- u32 dbg_cycle_enable_addr;
|
|
|
+ u32 dbg_enable_addr;
|
|
|
u32 dbg_shift_addr;
|
|
|
u32 dbg_force_valid_addr;
|
|
|
u32 dbg_force_frame_addr;
|
|
|
bool has_reset_bit;
|
|
|
- bool unreset; /* If true, the block is taken out of reset before dump */
|
|
|
+
|
|
|
+ /* If true, block is taken out of reset before dump */
|
|
|
+ bool unreset;
|
|
|
enum dbg_reset_regs reset_reg;
|
|
|
- u8 reset_bit_offset; /* Bit offset in reset register */
|
|
|
+
|
|
|
+ /* Bit offset in reset register */
|
|
|
+ u8 reset_bit_offset;
|
|
|
};
|
|
|
|
|
|
/* Reset register definitions */
|
|
@@ -262,12 +271,13 @@ struct grc_param_defs {
|
|
|
u32 crash_preset_val;
|
|
|
};
|
|
|
|
|
|
+/* Address is in 128b units. Width is in bits. */
|
|
|
struct rss_mem_defs {
|
|
|
const char *mem_name;
|
|
|
const char *type_name;
|
|
|
- u32 addr; /* In 128b units */
|
|
|
+ u32 addr;
|
|
|
u32 num_entries[MAX_CHIP_IDS];
|
|
|
- u32 entry_width[MAX_CHIP_IDS]; /* In bits */
|
|
|
+ u32 entry_width[MAX_CHIP_IDS];
|
|
|
};
|
|
|
|
|
|
struct vfc_ram_defs {
|
|
@@ -289,10 +299,20 @@ struct big_ram_defs {
|
|
|
|
|
|
struct phy_defs {
|
|
|
const char *phy_name;
|
|
|
+
|
|
|
+ /* PHY base GRC address */
|
|
|
u32 base_addr;
|
|
|
+
|
|
|
+ /* Relative address of indirect TBUS address register (bits 0..7) */
|
|
|
u32 tbus_addr_lo_addr;
|
|
|
+
|
|
|
+ /* Relative address of indirect TBUS address register (bits 8..10) */
|
|
|
u32 tbus_addr_hi_addr;
|
|
|
+
|
|
|
+ /* Relative address of indirect TBUS data register (bits 0..7) */
|
|
|
u32 tbus_data_lo_addr;
|
|
|
+
|
|
|
+ /* Relative address of indirect TBUS data register (bits 8..11) */
|
|
|
u32 tbus_data_hi_addr;
|
|
|
};
|
|
|
|
|
@@ -300,9 +320,11 @@ struct phy_defs {
|
|
|
|
|
|
#define MAX_LCIDS 320
|
|
|
#define MAX_LTIDS 320
|
|
|
+
|
|
|
#define NUM_IOR_SETS 2
|
|
|
#define IORS_PER_SET 176
|
|
|
#define IOR_SET_OFFSET(set_id) ((set_id) * 256)
|
|
|
+
|
|
|
#define BYTES_IN_DWORD sizeof(u32)
|
|
|
|
|
|
/* In the macros below, size and offset are specified in bits */
|
|
@@ -315,6 +337,7 @@ struct phy_defs {
|
|
|
#define FIELD_BIT_MASK(type, field) \
|
|
|
(((1 << FIELD_BIT_SIZE(type, field)) - 1) << \
|
|
|
FIELD_DWORD_SHIFT(type, field))
|
|
|
+
|
|
|
#define SET_VAR_FIELD(var, type, field, val) \
|
|
|
do { \
|
|
|
var[FIELD_DWORD_OFFSET(type, field)] &= \
|
|
@@ -322,31 +345,51 @@ struct phy_defs {
|
|
|
var[FIELD_DWORD_OFFSET(type, field)] |= \
|
|
|
(val) << FIELD_DWORD_SHIFT(type, field); \
|
|
|
} while (0)
|
|
|
+
|
|
|
#define ARR_REG_WR(dev, ptt, addr, arr, arr_size) \
|
|
|
do { \
|
|
|
for (i = 0; i < (arr_size); i++) \
|
|
|
qed_wr(dev, ptt, addr, (arr)[i]); \
|
|
|
} while (0)
|
|
|
+
|
|
|
#define ARR_REG_RD(dev, ptt, addr, arr, arr_size) \
|
|
|
do { \
|
|
|
for (i = 0; i < (arr_size); i++) \
|
|
|
(arr)[i] = qed_rd(dev, ptt, addr); \
|
|
|
} while (0)
|
|
|
|
|
|
+#ifndef DWORDS_TO_BYTES
|
|
|
#define DWORDS_TO_BYTES(dwords) ((dwords) * BYTES_IN_DWORD)
|
|
|
+#endif
|
|
|
+#ifndef BYTES_TO_DWORDS
|
|
|
#define BYTES_TO_DWORDS(bytes) ((bytes) / BYTES_IN_DWORD)
|
|
|
+#endif
|
|
|
+
|
|
|
+/* extra lines include a signature line + optional latency events line */
|
|
|
+#ifndef NUM_DBG_LINES
|
|
|
+#define NUM_EXTRA_DBG_LINES(block_desc) \
|
|
|
+ (1 + ((block_desc)->has_latency_events ? 1 : 0))
|
|
|
+#define NUM_DBG_LINES(block_desc) \
|
|
|
+ ((block_desc)->num_of_lines + NUM_EXTRA_DBG_LINES(block_desc))
|
|
|
+#endif
|
|
|
+
|
|
|
#define RAM_LINES_TO_DWORDS(lines) ((lines) * 2)
|
|
|
#define RAM_LINES_TO_BYTES(lines) \
|
|
|
DWORDS_TO_BYTES(RAM_LINES_TO_DWORDS(lines))
|
|
|
+
|
|
|
#define REG_DUMP_LEN_SHIFT 24
|
|
|
#define MEM_DUMP_ENTRY_SIZE_DWORDS \
|
|
|
BYTES_TO_DWORDS(sizeof(struct dbg_dump_mem))
|
|
|
+
|
|
|
#define IDLE_CHK_RULE_SIZE_DWORDS \
|
|
|
BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_rule))
|
|
|
+
|
|
|
#define IDLE_CHK_RESULT_HDR_DWORDS \
|
|
|
BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_hdr))
|
|
|
+
|
|
|
#define IDLE_CHK_RESULT_REG_HDR_DWORDS \
|
|
|
BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_reg_hdr))
|
|
|
+
|
|
|
#define IDLE_CHK_MAX_ENTRIES_SIZE 32
|
|
|
|
|
|
/* The sizes and offsets below are specified in bits */
|
|
@@ -363,62 +406,92 @@ struct phy_defs {
|
|
|
#define VFC_RAM_ADDR_ROW_OFFSET 2
|
|
|
#define VFC_RAM_ADDR_ROW_SIZE 10
|
|
|
#define VFC_RAM_RESP_STRUCT_SIZE 256
|
|
|
+
|
|
|
#define VFC_CAM_CMD_DWORDS CEIL_DWORDS(VFC_CAM_CMD_STRUCT_SIZE)
|
|
|
#define VFC_CAM_ADDR_DWORDS CEIL_DWORDS(VFC_CAM_ADDR_STRUCT_SIZE)
|
|
|
#define VFC_CAM_RESP_DWORDS CEIL_DWORDS(VFC_CAM_RESP_STRUCT_SIZE)
|
|
|
#define VFC_RAM_CMD_DWORDS VFC_CAM_CMD_DWORDS
|
|
|
#define VFC_RAM_ADDR_DWORDS CEIL_DWORDS(VFC_RAM_ADDR_STRUCT_SIZE)
|
|
|
#define VFC_RAM_RESP_DWORDS CEIL_DWORDS(VFC_RAM_RESP_STRUCT_SIZE)
|
|
|
+
|
|
|
#define NUM_VFC_RAM_TYPES 4
|
|
|
+
|
|
|
#define VFC_CAM_NUM_ROWS 512
|
|
|
+
|
|
|
#define VFC_OPCODE_CAM_RD 14
|
|
|
#define VFC_OPCODE_RAM_RD 0
|
|
|
+
|
|
|
#define NUM_RSS_MEM_TYPES 5
|
|
|
+
|
|
|
#define NUM_BIG_RAM_TYPES 3
|
|
|
#define BIG_RAM_BLOCK_SIZE_BYTES 128
|
|
|
#define BIG_RAM_BLOCK_SIZE_DWORDS \
|
|
|
BYTES_TO_DWORDS(BIG_RAM_BLOCK_SIZE_BYTES)
|
|
|
+
|
|
|
#define NUM_PHY_TBUS_ADDRESSES 2048
|
|
|
#define PHY_DUMP_SIZE_DWORDS (NUM_PHY_TBUS_ADDRESSES / 2)
|
|
|
+
|
|
|
#define RESET_REG_UNRESET_OFFSET 4
|
|
|
+
|
|
|
#define STALL_DELAY_MS 500
|
|
|
+
|
|
|
#define STATIC_DEBUG_LINE_DWORDS 9
|
|
|
-#define NUM_DBG_BUS_LINES 256
|
|
|
+
|
|
|
#define NUM_COMMON_GLOBAL_PARAMS 8
|
|
|
+
|
|
|
#define FW_IMG_MAIN 1
|
|
|
-#define REG_FIFO_DEPTH_ELEMENTS 32
|
|
|
+
|
|
|
+#ifndef REG_FIFO_ELEMENT_DWORDS
|
|
|
#define REG_FIFO_ELEMENT_DWORDS 2
|
|
|
+#endif
|
|
|
+#define REG_FIFO_DEPTH_ELEMENTS 32
|
|
|
#define REG_FIFO_DEPTH_DWORDS \
|
|
|
(REG_FIFO_ELEMENT_DWORDS * REG_FIFO_DEPTH_ELEMENTS)
|
|
|
-#define IGU_FIFO_DEPTH_ELEMENTS 64
|
|
|
+
|
|
|
+#ifndef IGU_FIFO_ELEMENT_DWORDS
|
|
|
#define IGU_FIFO_ELEMENT_DWORDS 4
|
|
|
+#endif
|
|
|
+#define IGU_FIFO_DEPTH_ELEMENTS 64
|
|
|
#define IGU_FIFO_DEPTH_DWORDS \
|
|
|
(IGU_FIFO_ELEMENT_DWORDS * IGU_FIFO_DEPTH_ELEMENTS)
|
|
|
-#define PROTECTION_OVERRIDE_DEPTH_ELEMENTS 20
|
|
|
+
|
|
|
+#ifndef PROTECTION_OVERRIDE_ELEMENT_DWORDS
|
|
|
#define PROTECTION_OVERRIDE_ELEMENT_DWORDS 2
|
|
|
+#endif
|
|
|
+#define PROTECTION_OVERRIDE_DEPTH_ELEMENTS 20
|
|
|
#define PROTECTION_OVERRIDE_DEPTH_DWORDS \
|
|
|
(PROTECTION_OVERRIDE_DEPTH_ELEMENTS * \
|
|
|
PROTECTION_OVERRIDE_ELEMENT_DWORDS)
|
|
|
+
|
|
|
#define MCP_SPAD_TRACE_OFFSIZE_ADDR \
|
|
|
(MCP_REG_SCRATCH + \
|
|
|
offsetof(struct static_init, sections[SPAD_SECTION_TRACE]))
|
|
|
-#define MCP_TRACE_META_IMAGE_SIGNATURE 0x669955aa
|
|
|
+
|
|
|
#define EMPTY_FW_VERSION_STR "???_???_???_???"
|
|
|
#define EMPTY_FW_IMAGE_STR "???????????????"
|
|
|
|
|
|
/***************************** Constant Arrays *******************************/
|
|
|
|
|
|
+struct dbg_array {
|
|
|
+ const u32 *ptr;
|
|
|
+ u32 size_in_dwords;
|
|
|
+};
|
|
|
+
|
|
|
/* Debug arrays */
|
|
|
-static struct dbg_array s_dbg_arrays[MAX_BIN_DBG_BUFFER_TYPE] = { {0} };
|
|
|
+static struct dbg_array s_dbg_arrays[MAX_BIN_DBG_BUFFER_TYPE] = { {NULL} };
|
|
|
|
|
|
/* Chip constant definitions array */
|
|
|
static struct chip_defs s_chip_defs[MAX_CHIP_IDS] = {
|
|
|
- { "bb_b0",
|
|
|
- { {MAX_NUM_PORTS_BB, MAX_NUM_PFS_BB, MAX_NUM_VFS_BB}, {0, 0, 0},
|
|
|
- {0, 0, 0}, {0, 0, 0} } },
|
|
|
- { "k2",
|
|
|
- { {MAX_NUM_PORTS_K2, MAX_NUM_PFS_K2, MAX_NUM_VFS_K2}, {0, 0, 0},
|
|
|
- {0, 0, 0}, {0, 0, 0} } }
|
|
|
+ { "bb",
|
|
|
+ {{MAX_NUM_PORTS_BB, MAX_NUM_PFS_BB, MAX_NUM_VFS_BB},
|
|
|
+ {0, 0, 0},
|
|
|
+ {0, 0, 0},
|
|
|
+ {0, 0, 0} } },
|
|
|
+ { "ah",
|
|
|
+ {{MAX_NUM_PORTS_K2, MAX_NUM_PFS_K2, MAX_NUM_VFS_K2},
|
|
|
+ {0, 0, 0},
|
|
|
+ {0, 0, 0},
|
|
|
+ {0, 0, 0} } }
|
|
|
};
|
|
|
|
|
|
/* Storm constant definitions array */
|
|
@@ -427,69 +500,74 @@ static struct storm_defs s_storm_defs[] = {
|
|
|
{'T', BLOCK_TSEM,
|
|
|
{DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT}, true,
|
|
|
TSEM_REG_FAST_MEMORY,
|
|
|
- TSEM_REG_DBG_FRAME_MODE, TSEM_REG_SLOW_DBG_ACTIVE,
|
|
|
- TSEM_REG_SLOW_DBG_MODE, TSEM_REG_DBG_MODE1_CFG,
|
|
|
- TSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_SLOW_DBG_EMPTY,
|
|
|
+ TSEM_REG_DBG_FRAME_MODE_BB_K2, TSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
|
|
|
+ TSEM_REG_SLOW_DBG_MODE_BB_K2, TSEM_REG_DBG_MODE1_CFG_BB_K2,
|
|
|
+ TSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_SLOW_DBG_EMPTY_BB_K2,
|
|
|
TCM_REG_CTX_RBC_ACCS,
|
|
|
4, TCM_REG_AGG_CON_CTX,
|
|
|
16, TCM_REG_SM_CON_CTX,
|
|
|
2, TCM_REG_AGG_TASK_CTX,
|
|
|
4, TCM_REG_SM_TASK_CTX},
|
|
|
+
|
|
|
/* Mstorm */
|
|
|
{'M', BLOCK_MSEM,
|
|
|
{DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM}, false,
|
|
|
MSEM_REG_FAST_MEMORY,
|
|
|
- MSEM_REG_DBG_FRAME_MODE, MSEM_REG_SLOW_DBG_ACTIVE,
|
|
|
- MSEM_REG_SLOW_DBG_MODE, MSEM_REG_DBG_MODE1_CFG,
|
|
|
- MSEM_REG_SYNC_DBG_EMPTY, MSEM_REG_SLOW_DBG_EMPTY,
|
|
|
+ MSEM_REG_DBG_FRAME_MODE_BB_K2, MSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
|
|
|
+ MSEM_REG_SLOW_DBG_MODE_BB_K2, MSEM_REG_DBG_MODE1_CFG_BB_K2,
|
|
|
+ MSEM_REG_SYNC_DBG_EMPTY, MSEM_REG_SLOW_DBG_EMPTY_BB_K2,
|
|
|
MCM_REG_CTX_RBC_ACCS,
|
|
|
1, MCM_REG_AGG_CON_CTX,
|
|
|
10, MCM_REG_SM_CON_CTX,
|
|
|
2, MCM_REG_AGG_TASK_CTX,
|
|
|
7, MCM_REG_SM_TASK_CTX},
|
|
|
+
|
|
|
/* Ustorm */
|
|
|
{'U', BLOCK_USEM,
|
|
|
{DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU}, false,
|
|
|
USEM_REG_FAST_MEMORY,
|
|
|
- USEM_REG_DBG_FRAME_MODE, USEM_REG_SLOW_DBG_ACTIVE,
|
|
|
- USEM_REG_SLOW_DBG_MODE, USEM_REG_DBG_MODE1_CFG,
|
|
|
- USEM_REG_SYNC_DBG_EMPTY, USEM_REG_SLOW_DBG_EMPTY,
|
|
|
+ USEM_REG_DBG_FRAME_MODE_BB_K2, USEM_REG_SLOW_DBG_ACTIVE_BB_K2,
|
|
|
+ USEM_REG_SLOW_DBG_MODE_BB_K2, USEM_REG_DBG_MODE1_CFG_BB_K2,
|
|
|
+ USEM_REG_SYNC_DBG_EMPTY, USEM_REG_SLOW_DBG_EMPTY_BB_K2,
|
|
|
UCM_REG_CTX_RBC_ACCS,
|
|
|
2, UCM_REG_AGG_CON_CTX,
|
|
|
13, UCM_REG_SM_CON_CTX,
|
|
|
3, UCM_REG_AGG_TASK_CTX,
|
|
|
3, UCM_REG_SM_TASK_CTX},
|
|
|
+
|
|
|
/* Xstorm */
|
|
|
{'X', BLOCK_XSEM,
|
|
|
{DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX}, false,
|
|
|
XSEM_REG_FAST_MEMORY,
|
|
|
- XSEM_REG_DBG_FRAME_MODE, XSEM_REG_SLOW_DBG_ACTIVE,
|
|
|
- XSEM_REG_SLOW_DBG_MODE, XSEM_REG_DBG_MODE1_CFG,
|
|
|
- XSEM_REG_SYNC_DBG_EMPTY, XSEM_REG_SLOW_DBG_EMPTY,
|
|
|
+ XSEM_REG_DBG_FRAME_MODE_BB_K2, XSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
|
|
|
+ XSEM_REG_SLOW_DBG_MODE_BB_K2, XSEM_REG_DBG_MODE1_CFG_BB_K2,
|
|
|
+ XSEM_REG_SYNC_DBG_EMPTY, XSEM_REG_SLOW_DBG_EMPTY_BB_K2,
|
|
|
XCM_REG_CTX_RBC_ACCS,
|
|
|
9, XCM_REG_AGG_CON_CTX,
|
|
|
15, XCM_REG_SM_CON_CTX,
|
|
|
0, 0,
|
|
|
0, 0},
|
|
|
+
|
|
|
/* Ystorm */
|
|
|
{'Y', BLOCK_YSEM,
|
|
|
{DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY}, false,
|
|
|
YSEM_REG_FAST_MEMORY,
|
|
|
- YSEM_REG_DBG_FRAME_MODE, YSEM_REG_SLOW_DBG_ACTIVE,
|
|
|
- YSEM_REG_SLOW_DBG_MODE, YSEM_REG_DBG_MODE1_CFG,
|
|
|
- YSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_SLOW_DBG_EMPTY,
|
|
|
+ YSEM_REG_DBG_FRAME_MODE_BB_K2, YSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
|
|
|
+ YSEM_REG_SLOW_DBG_MODE_BB_K2, YSEM_REG_DBG_MODE1_CFG_BB_K2,
|
|
|
+ YSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_SLOW_DBG_EMPTY_BB_K2,
|
|
|
YCM_REG_CTX_RBC_ACCS,
|
|
|
2, YCM_REG_AGG_CON_CTX,
|
|
|
3, YCM_REG_SM_CON_CTX,
|
|
|
2, YCM_REG_AGG_TASK_CTX,
|
|
|
12, YCM_REG_SM_TASK_CTX},
|
|
|
+
|
|
|
/* Pstorm */
|
|
|
{'P', BLOCK_PSEM,
|
|
|
{DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS}, true,
|
|
|
PSEM_REG_FAST_MEMORY,
|
|
|
- PSEM_REG_DBG_FRAME_MODE, PSEM_REG_SLOW_DBG_ACTIVE,
|
|
|
- PSEM_REG_SLOW_DBG_MODE, PSEM_REG_DBG_MODE1_CFG,
|
|
|
- PSEM_REG_SYNC_DBG_EMPTY, PSEM_REG_SLOW_DBG_EMPTY,
|
|
|
+ PSEM_REG_DBG_FRAME_MODE_BB_K2, PSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
|
|
|
+ PSEM_REG_SLOW_DBG_MODE_BB_K2, PSEM_REG_DBG_MODE1_CFG_BB_K2,
|
|
|
+ PSEM_REG_SYNC_DBG_EMPTY, PSEM_REG_SLOW_DBG_EMPTY_BB_K2,
|
|
|
PCM_REG_CTX_RBC_ACCS,
|
|
|
0, 0,
|
|
|
10, PCM_REG_SM_CON_CTX,
|
|
@@ -498,6 +576,7 @@ static struct storm_defs s_storm_defs[] = {
|
|
|
};
|
|
|
|
|
|
/* Block definitions array */
|
|
|
+
|
|
|
static struct block_defs block_grc_defs = {
|
|
|
"grc",
|
|
|
{true, true}, false, 0,
|
|
@@ -587,9 +666,11 @@ static struct block_defs block_pcie_defs = {
|
|
|
"pcie",
|
|
|
{false, true}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCH},
|
|
|
- PCIE_REG_DBG_COMMON_SELECT, PCIE_REG_DBG_COMMON_DWORD_ENABLE,
|
|
|
- PCIE_REG_DBG_COMMON_SHIFT, PCIE_REG_DBG_COMMON_FORCE_VALID,
|
|
|
- PCIE_REG_DBG_COMMON_FORCE_FRAME,
|
|
|
+ PCIE_REG_DBG_COMMON_SELECT_K2,
|
|
|
+ PCIE_REG_DBG_COMMON_DWORD_ENABLE_K2,
|
|
|
+ PCIE_REG_DBG_COMMON_SHIFT_K2,
|
|
|
+ PCIE_REG_DBG_COMMON_FORCE_VALID_K2,
|
|
|
+ PCIE_REG_DBG_COMMON_FORCE_FRAME_K2,
|
|
|
false, false, MAX_DBG_RESET_REGS, 0
|
|
|
};
|
|
|
|
|
@@ -691,9 +772,9 @@ static struct block_defs block_pglcs_defs = {
|
|
|
"pglcs",
|
|
|
{false, true}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCH},
|
|
|
- PGLCS_REG_DBG_SELECT, PGLCS_REG_DBG_DWORD_ENABLE,
|
|
|
- PGLCS_REG_DBG_SHIFT, PGLCS_REG_DBG_FORCE_VALID,
|
|
|
- PGLCS_REG_DBG_FORCE_FRAME,
|
|
|
+ PGLCS_REG_DBG_SELECT_K2, PGLCS_REG_DBG_DWORD_ENABLE_K2,
|
|
|
+ PGLCS_REG_DBG_SHIFT_K2, PGLCS_REG_DBG_FORCE_VALID_K2,
|
|
|
+ PGLCS_REG_DBG_FORCE_FRAME_K2,
|
|
|
true, false, DBG_RESET_REG_MISCS_PL_HV, 2
|
|
|
};
|
|
|
|
|
@@ -991,10 +1072,11 @@ static struct block_defs block_yuld_defs = {
|
|
|
"yuld",
|
|
|
{true, true}, false, 0,
|
|
|
{DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU},
|
|
|
- YULD_REG_DBG_SELECT, YULD_REG_DBG_DWORD_ENABLE,
|
|
|
- YULD_REG_DBG_SHIFT, YULD_REG_DBG_FORCE_VALID,
|
|
|
- YULD_REG_DBG_FORCE_FRAME,
|
|
|
- true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 15
|
|
|
+ YULD_REG_DBG_SELECT_BB_K2, YULD_REG_DBG_DWORD_ENABLE_BB_K2,
|
|
|
+ YULD_REG_DBG_SHIFT_BB_K2, YULD_REG_DBG_FORCE_VALID_BB_K2,
|
|
|
+ YULD_REG_DBG_FORCE_FRAME_BB_K2,
|
|
|
+ true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2,
|
|
|
+ 15
|
|
|
};
|
|
|
|
|
|
static struct block_defs block_xyld_defs = {
|
|
@@ -1143,9 +1225,9 @@ static struct block_defs block_umac_defs = {
|
|
|
"umac",
|
|
|
{false, true}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCZ},
|
|
|
- UMAC_REG_DBG_SELECT, UMAC_REG_DBG_DWORD_ENABLE,
|
|
|
- UMAC_REG_DBG_SHIFT, UMAC_REG_DBG_FORCE_VALID,
|
|
|
- UMAC_REG_DBG_FORCE_FRAME,
|
|
|
+ UMAC_REG_DBG_SELECT_K2, UMAC_REG_DBG_DWORD_ENABLE_K2,
|
|
|
+ UMAC_REG_DBG_SHIFT_K2, UMAC_REG_DBG_FORCE_VALID_K2,
|
|
|
+ UMAC_REG_DBG_FORCE_FRAME_K2,
|
|
|
true, false, DBG_RESET_REG_MISCS_PL_HV, 6
|
|
|
};
|
|
|
|
|
@@ -1177,9 +1259,9 @@ static struct block_defs block_wol_defs = {
|
|
|
"wol",
|
|
|
{false, true}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCZ},
|
|
|
- WOL_REG_DBG_SELECT, WOL_REG_DBG_DWORD_ENABLE,
|
|
|
- WOL_REG_DBG_SHIFT, WOL_REG_DBG_FORCE_VALID,
|
|
|
- WOL_REG_DBG_FORCE_FRAME,
|
|
|
+ WOL_REG_DBG_SELECT_K2, WOL_REG_DBG_DWORD_ENABLE_K2,
|
|
|
+ WOL_REG_DBG_SHIFT_K2, WOL_REG_DBG_FORCE_VALID_K2,
|
|
|
+ WOL_REG_DBG_FORCE_FRAME_K2,
|
|
|
true, true, DBG_RESET_REG_MISC_PL_PDA_VAUX, 7
|
|
|
};
|
|
|
|
|
@@ -1187,9 +1269,9 @@ static struct block_defs block_bmbn_defs = {
|
|
|
"bmbn",
|
|
|
{false, true}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCB},
|
|
|
- BMBN_REG_DBG_SELECT, BMBN_REG_DBG_DWORD_ENABLE,
|
|
|
- BMBN_REG_DBG_SHIFT, BMBN_REG_DBG_FORCE_VALID,
|
|
|
- BMBN_REG_DBG_FORCE_FRAME,
|
|
|
+ BMBN_REG_DBG_SELECT_K2, BMBN_REG_DBG_DWORD_ENABLE_K2,
|
|
|
+ BMBN_REG_DBG_SHIFT_K2, BMBN_REG_DBG_FORCE_VALID_K2,
|
|
|
+ BMBN_REG_DBG_FORCE_FRAME_K2,
|
|
|
false, false, MAX_DBG_RESET_REGS, 0
|
|
|
};
|
|
|
|
|
@@ -1204,9 +1286,9 @@ static struct block_defs block_nwm_defs = {
|
|
|
"nwm",
|
|
|
{false, true}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCW},
|
|
|
- NWM_REG_DBG_SELECT, NWM_REG_DBG_DWORD_ENABLE,
|
|
|
- NWM_REG_DBG_SHIFT, NWM_REG_DBG_FORCE_VALID,
|
|
|
- NWM_REG_DBG_FORCE_FRAME,
|
|
|
+ NWM_REG_DBG_SELECT_K2, NWM_REG_DBG_DWORD_ENABLE_K2,
|
|
|
+ NWM_REG_DBG_SHIFT_K2, NWM_REG_DBG_FORCE_VALID_K2,
|
|
|
+ NWM_REG_DBG_FORCE_FRAME_K2,
|
|
|
true, false, DBG_RESET_REG_MISCS_PL_HV_2, 0
|
|
|
};
|
|
|
|
|
@@ -1214,9 +1296,9 @@ static struct block_defs block_nws_defs = {
|
|
|
"nws",
|
|
|
{false, true}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCW},
|
|
|
- NWS_REG_DBG_SELECT, NWS_REG_DBG_DWORD_ENABLE,
|
|
|
- NWS_REG_DBG_SHIFT, NWS_REG_DBG_FORCE_VALID,
|
|
|
- NWS_REG_DBG_FORCE_FRAME,
|
|
|
+ NWS_REG_DBG_SELECT_K2, NWS_REG_DBG_DWORD_ENABLE_K2,
|
|
|
+ NWS_REG_DBG_SHIFT_K2, NWS_REG_DBG_FORCE_VALID_K2,
|
|
|
+ NWS_REG_DBG_FORCE_FRAME_K2,
|
|
|
true, false, DBG_RESET_REG_MISCS_PL_HV, 12
|
|
|
};
|
|
|
|
|
@@ -1224,9 +1306,9 @@ static struct block_defs block_ms_defs = {
|
|
|
"ms",
|
|
|
{false, true}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCZ},
|
|
|
- MS_REG_DBG_SELECT, MS_REG_DBG_DWORD_ENABLE,
|
|
|
- MS_REG_DBG_SHIFT, MS_REG_DBG_FORCE_VALID,
|
|
|
- MS_REG_DBG_FORCE_FRAME,
|
|
|
+ MS_REG_DBG_SELECT_K2, MS_REG_DBG_DWORD_ENABLE_K2,
|
|
|
+ MS_REG_DBG_SHIFT_K2, MS_REG_DBG_FORCE_VALID_K2,
|
|
|
+ MS_REG_DBG_FORCE_FRAME_K2,
|
|
|
true, false, DBG_RESET_REG_MISCS_PL_HV, 13
|
|
|
};
|
|
|
|
|
@@ -1234,9 +1316,11 @@ static struct block_defs block_phy_pcie_defs = {
|
|
|
"phy_pcie",
|
|
|
{false, true}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCH},
|
|
|
- PCIE_REG_DBG_COMMON_SELECT, PCIE_REG_DBG_COMMON_DWORD_ENABLE,
|
|
|
- PCIE_REG_DBG_COMMON_SHIFT, PCIE_REG_DBG_COMMON_FORCE_VALID,
|
|
|
- PCIE_REG_DBG_COMMON_FORCE_FRAME,
|
|
|
+ PCIE_REG_DBG_COMMON_SELECT_K2,
|
|
|
+ PCIE_REG_DBG_COMMON_DWORD_ENABLE_K2,
|
|
|
+ PCIE_REG_DBG_COMMON_SHIFT_K2,
|
|
|
+ PCIE_REG_DBG_COMMON_FORCE_VALID_K2,
|
|
|
+ PCIE_REG_DBG_COMMON_FORCE_FRAME_K2,
|
|
|
false, false, MAX_DBG_RESET_REGS, 0
|
|
|
};
|
|
|
|
|
@@ -1261,6 +1345,13 @@ static struct block_defs block_rgfs_defs = {
|
|
|
false, false, MAX_DBG_RESET_REGS, 0
|
|
|
};
|
|
|
|
|
|
+static struct block_defs block_rgsrc_defs = {
|
|
|
+ "rgsrc", {false, false}, false, 0,
|
|
|
+ {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
|
|
|
+ 0, 0, 0, 0, 0,
|
|
|
+ false, false, MAX_DBG_RESET_REGS, 0
|
|
|
+};
|
|
|
+
|
|
|
static struct block_defs block_tgfs_defs = {
|
|
|
"tgfs", {false, false}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
|
|
@@ -1268,6 +1359,13 @@ static struct block_defs block_tgfs_defs = {
|
|
|
false, false, MAX_DBG_RESET_REGS, 0
|
|
|
};
|
|
|
|
|
|
+static struct block_defs block_tgsrc_defs = {
|
|
|
+ "tgsrc", {false, false}, false, 0,
|
|
|
+ {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
|
|
|
+ 0, 0, 0, 0, 0,
|
|
|
+ false, false, MAX_DBG_RESET_REGS, 0
|
|
|
+};
|
|
|
+
|
|
|
static struct block_defs block_ptld_defs = {
|
|
|
"ptld", {false, false}, false, 0,
|
|
|
{MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
|
|
@@ -1350,6 +1448,8 @@ static struct block_defs *s_block_defs[MAX_BLOCK_ID] = {
|
|
|
&block_muld_defs,
|
|
|
&block_yuld_defs,
|
|
|
&block_xyld_defs,
|
|
|
+ &block_ptld_defs,
|
|
|
+ &block_ypld_defs,
|
|
|
&block_prm_defs,
|
|
|
&block_pbf_pb1_defs,
|
|
|
&block_pbf_pb2_defs,
|
|
@@ -1363,6 +1463,10 @@ static struct block_defs *s_block_defs[MAX_BLOCK_ID] = {
|
|
|
&block_tcfc_defs,
|
|
|
&block_igu_defs,
|
|
|
&block_cau_defs,
|
|
|
+ &block_rgfs_defs,
|
|
|
+ &block_rgsrc_defs,
|
|
|
+ &block_tgfs_defs,
|
|
|
+ &block_tgsrc_defs,
|
|
|
&block_umac_defs,
|
|
|
&block_xmac_defs,
|
|
|
&block_dbg_defs,
|
|
@@ -1376,10 +1480,6 @@ static struct block_defs *s_block_defs[MAX_BLOCK_ID] = {
|
|
|
&block_phy_pcie_defs,
|
|
|
&block_led_defs,
|
|
|
&block_avs_wrap_defs,
|
|
|
- &block_rgfs_defs,
|
|
|
- &block_tgfs_defs,
|
|
|
- &block_ptld_defs,
|
|
|
- &block_ypld_defs,
|
|
|
&block_misc_aeu_defs,
|
|
|
&block_bar0_map_defs,
|
|
|
};
|
|
@@ -1392,66 +1492,151 @@ static struct platform_defs s_platform_defs[] = {
|
|
|
};
|
|
|
|
|
|
static struct grc_param_defs s_grc_param_defs[] = {
|
|
|
- {{1, 1}, 0, 1, false, 1, 1}, /* DBG_GRC_PARAM_DUMP_TSTORM */
|
|
|
- {{1, 1}, 0, 1, false, 1, 1}, /* DBG_GRC_PARAM_DUMP_MSTORM */
|
|
|
- {{1, 1}, 0, 1, false, 1, 1}, /* DBG_GRC_PARAM_DUMP_USTORM */
|
|
|
- {{1, 1}, 0, 1, false, 1, 1}, /* DBG_GRC_PARAM_DUMP_XSTORM */
|
|
|
- {{1, 1}, 0, 1, false, 1, 1}, /* DBG_GRC_PARAM_DUMP_YSTORM */
|
|
|
- {{1, 1}, 0, 1, false, 1, 1}, /* DBG_GRC_PARAM_DUMP_PSTORM */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_REGS */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_RAM */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_PBUF */
|
|
|
- {{0, 0}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_IOR */
|
|
|
- {{0, 0}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_VFC */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_CM_CTX */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_ILT */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_RSS */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_CAU */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_QM */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_MCP */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_RESERVED */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_CFC */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_IGU */
|
|
|
- {{0, 0}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_BRB */
|
|
|
- {{0, 0}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_BTB */
|
|
|
- {{0, 0}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_BMB */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_NIG */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_MULD */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_PRS */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_DMAE */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_TM */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_SDM */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_DIF */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_STATIC */
|
|
|
- {{0, 0}, 0, 1, false, 0, 0}, /* DBG_GRC_PARAM_UNSTALL */
|
|
|
+ /* DBG_GRC_PARAM_DUMP_TSTORM */
|
|
|
+ {{1, 1}, 0, 1, false, 1, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_MSTORM */
|
|
|
+ {{1, 1}, 0, 1, false, 1, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_USTORM */
|
|
|
+ {{1, 1}, 0, 1, false, 1, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_XSTORM */
|
|
|
+ {{1, 1}, 0, 1, false, 1, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_YSTORM */
|
|
|
+ {{1, 1}, 0, 1, false, 1, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_PSTORM */
|
|
|
+ {{1, 1}, 0, 1, false, 1, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_REGS */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_RAM */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_PBUF */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_IOR */
|
|
|
+ {{0, 0}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_VFC */
|
|
|
+ {{0, 0}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_CM_CTX */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_ILT */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_RSS */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_CAU */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_QM */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_MCP */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_RESERVED */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_CFC */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_IGU */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_BRB */
|
|
|
+ {{0, 0}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_BTB */
|
|
|
+ {{0, 0}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_BMB */
|
|
|
+ {{0, 0}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_NIG */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_MULD */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_PRS */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_DMAE */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_TM */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_SDM */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_DIF */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_STATIC */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_UNSTALL */
|
|
|
+ {{0, 0}, 0, 1, false, 0, 0},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_NUM_LCIDS */
|
|
|
{{MAX_LCIDS, MAX_LCIDS}, 1, MAX_LCIDS, false, MAX_LCIDS,
|
|
|
- MAX_LCIDS}, /* DBG_GRC_PARAM_NUM_LCIDS */
|
|
|
+ MAX_LCIDS},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_NUM_LTIDS */
|
|
|
{{MAX_LTIDS, MAX_LTIDS}, 1, MAX_LTIDS, false, MAX_LTIDS,
|
|
|
- MAX_LTIDS}, /* DBG_GRC_PARAM_NUM_LTIDS */
|
|
|
- {{0, 0}, 0, 1, true, 0, 0}, /* DBG_GRC_PARAM_EXCLUDE_ALL */
|
|
|
- {{0, 0}, 0, 1, true, 0, 0}, /* DBG_GRC_PARAM_CRASH */
|
|
|
- {{0, 0}, 0, 1, false, 1, 0}, /* DBG_GRC_PARAM_PARITY_SAFE */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_CM */
|
|
|
- {{1, 1}, 0, 1, false, 0, 1}, /* DBG_GRC_PARAM_DUMP_PHY */
|
|
|
- {{0, 0}, 0, 1, false, 0, 0}, /* DBG_GRC_PARAM_NO_MCP */
|
|
|
- {{0, 0}, 0, 1, false, 0, 0} /* DBG_GRC_PARAM_NO_FW_VER */
|
|
|
+ MAX_LTIDS},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_EXCLUDE_ALL */
|
|
|
+ {{0, 0}, 0, 1, true, 0, 0},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_CRASH */
|
|
|
+ {{0, 0}, 0, 1, true, 0, 0},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_PARITY_SAFE */
|
|
|
+ {{0, 0}, 0, 1, false, 1, 0},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_CM */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_DUMP_PHY */
|
|
|
+ {{1, 1}, 0, 1, false, 0, 1},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_NO_MCP */
|
|
|
+ {{0, 0}, 0, 1, false, 0, 0},
|
|
|
+
|
|
|
+ /* DBG_GRC_PARAM_NO_FW_VER */
|
|
|
+ {{0, 0}, 0, 1, false, 0, 0}
|
|
|
};
|
|
|
|
|
|
static struct rss_mem_defs s_rss_mem_defs[] = {
|
|
|
{ "rss_mem_cid", "rss_cid", 0,
|
|
|
{256, 320},
|
|
|
{32, 32} },
|
|
|
+
|
|
|
{ "rss_mem_key_msb", "rss_key", 1024,
|
|
|
{128, 208},
|
|
|
{256, 256} },
|
|
|
+
|
|
|
{ "rss_mem_key_lsb", "rss_key", 2048,
|
|
|
{128, 208},
|
|
|
{64, 64} },
|
|
|
+
|
|
|
{ "rss_mem_info", "rss_info", 3072,
|
|
|
{128, 208},
|
|
|
{16, 16} },
|
|
|
+
|
|
|
{ "rss_mem_ind", "rss_ind", 4096,
|
|
|
- {(128 * 128), (128 * 208)},
|
|
|
+ {16384, 26624},
|
|
|
{16, 16} }
|
|
|
};
|
|
|
|
|
@@ -1466,50 +1651,71 @@ static struct big_ram_defs s_big_ram_defs[] = {
|
|
|
{ "BRB", MEM_GROUP_BRB_MEM, MEM_GROUP_BRB_RAM, DBG_GRC_PARAM_DUMP_BRB,
|
|
|
BRB_REG_BIG_RAM_ADDRESS, BRB_REG_BIG_RAM_DATA,
|
|
|
{4800, 5632} },
|
|
|
+
|
|
|
{ "BTB", MEM_GROUP_BTB_MEM, MEM_GROUP_BTB_RAM, DBG_GRC_PARAM_DUMP_BTB,
|
|
|
BTB_REG_BIG_RAM_ADDRESS, BTB_REG_BIG_RAM_DATA,
|
|
|
{2880, 3680} },
|
|
|
+
|
|
|
{ "BMB", MEM_GROUP_BMB_MEM, MEM_GROUP_BMB_RAM, DBG_GRC_PARAM_DUMP_BMB,
|
|
|
BMB_REG_BIG_RAM_ADDRESS, BMB_REG_BIG_RAM_DATA,
|
|
|
{1152, 1152} }
|
|
|
};
|
|
|
|
|
|
static struct reset_reg_defs s_reset_regs_defs[] = {
|
|
|
+ /* DBG_RESET_REG_MISCS_PL_UA */
|
|
|
{ MISCS_REG_RESET_PL_UA, 0x0,
|
|
|
- {true, true} }, /* DBG_RESET_REG_MISCS_PL_UA */
|
|
|
+ {true, true} },
|
|
|
+
|
|
|
+ /* DBG_RESET_REG_MISCS_PL_HV */
|
|
|
{ MISCS_REG_RESET_PL_HV, 0x0,
|
|
|
- {true, true} }, /* DBG_RESET_REG_MISCS_PL_HV */
|
|
|
- { MISCS_REG_RESET_PL_HV_2, 0x0,
|
|
|
- {false, true} }, /* DBG_RESET_REG_MISCS_PL_HV_2 */
|
|
|
+ {true, true} },
|
|
|
+
|
|
|
+ /* DBG_RESET_REG_MISCS_PL_HV_2 */
|
|
|
+ { MISCS_REG_RESET_PL_HV_2_K2, 0x0,
|
|
|
+ {false, true} },
|
|
|
+
|
|
|
+ /* DBG_RESET_REG_MISC_PL_UA */
|
|
|
{ MISC_REG_RESET_PL_UA, 0x0,
|
|
|
- {true, true} }, /* DBG_RESET_REG_MISC_PL_UA */
|
|
|
+ {true, true} },
|
|
|
+
|
|
|
+ /* DBG_RESET_REG_MISC_PL_HV */
|
|
|
{ MISC_REG_RESET_PL_HV, 0x0,
|
|
|
- {true, true} }, /* DBG_RESET_REG_MISC_PL_HV */
|
|
|
+ {true, true} },
|
|
|
+
|
|
|
+ /* DBG_RESET_REG_MISC_PL_PDA_VMAIN_1 */
|
|
|
{ MISC_REG_RESET_PL_PDA_VMAIN_1, 0x4404040,
|
|
|
- {true, true} }, /* DBG_RESET_REG_MISC_PL_PDA_VMAIN_1 */
|
|
|
+ {true, true} },
|
|
|
+
|
|
|
+ /* DBG_RESET_REG_MISC_PL_PDA_VMAIN_2 */
|
|
|
{ MISC_REG_RESET_PL_PDA_VMAIN_2, 0x7c00007,
|
|
|
- {true, true} }, /* DBG_RESET_REG_MISC_PL_PDA_VMAIN_2 */
|
|
|
+ {true, true} },
|
|
|
+
|
|
|
+ /* DBG_RESET_REG_MISC_PL_PDA_VAUX */
|
|
|
{ MISC_REG_RESET_PL_PDA_VAUX, 0x2,
|
|
|
- {true, true} }, /* DBG_RESET_REG_MISC_PL_PDA_VAUX */
|
|
|
+ {true, true} },
|
|
|
};
|
|
|
|
|
|
static struct phy_defs s_phy_defs[] = {
|
|
|
- {"nw_phy", NWS_REG_NWS_CMU, PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_7_0,
|
|
|
- PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_15_8,
|
|
|
- PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_7_0,
|
|
|
- PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_11_8},
|
|
|
- {"sgmii_phy", MS_REG_MS_CMU, PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X132,
|
|
|
- PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X133,
|
|
|
- PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X130,
|
|
|
- PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X131},
|
|
|
- {"pcie_phy0", PHY_PCIE_REG_PHY0, PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132,
|
|
|
- PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133,
|
|
|
- PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130,
|
|
|
- PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131},
|
|
|
- {"pcie_phy1", PHY_PCIE_REG_PHY1, PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132,
|
|
|
- PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133,
|
|
|
- PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130,
|
|
|
- PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131},
|
|
|
+ {"nw_phy", NWS_REG_NWS_CMU_K2,
|
|
|
+ PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_7_0_K2,
|
|
|
+ PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_15_8_K2,
|
|
|
+ PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_7_0_K2,
|
|
|
+ PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_11_8_K2},
|
|
|
+ {"sgmii_phy", MS_REG_MS_CMU_K2,
|
|
|
+ PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X132_K2,
|
|
|
+ PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X133_K2,
|
|
|
+ PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X130_K2,
|
|
|
+ PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X131_K2},
|
|
|
+ {"pcie_phy0", PHY_PCIE_REG_PHY0_K2,
|
|
|
+ PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2,
|
|
|
+ PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2,
|
|
|
+ PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2,
|
|
|
+ PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2},
|
|
|
+ {"pcie_phy1", PHY_PCIE_REG_PHY1_K2,
|
|
|
+ PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2,
|
|
|
+ PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2,
|
|
|
+ PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2,
|
|
|
+ PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2},
|
|
|
};
|
|
|
|
|
|
/**************************** Private Functions ******************************/
|
|
@@ -1556,7 +1762,7 @@ static enum dbg_status qed_dbg_dev_init(struct qed_hwfn *p_hwfn,
|
|
|
dev_data->chip_id = CHIP_K2;
|
|
|
dev_data->mode_enable[MODE_K2] = 1;
|
|
|
} else if (QED_IS_BB_B0(p_hwfn->cdev)) {
|
|
|
- dev_data->chip_id = CHIP_BB_B0;
|
|
|
+ dev_data->chip_id = CHIP_BB;
|
|
|
dev_data->mode_enable[MODE_BB] = 1;
|
|
|
} else {
|
|
|
return DBG_STATUS_UNKNOWN_CHIP;
|
|
@@ -1569,9 +1775,20 @@ static enum dbg_status qed_dbg_dev_init(struct qed_hwfn *p_hwfn,
|
|
|
qed_dbg_grc_init_params(p_hwfn);
|
|
|
|
|
|
dev_data->initialized = true;
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
+static struct dbg_bus_block *get_dbg_bus_block_desc(struct qed_hwfn *p_hwfn,
|
|
|
+ enum block_id block_id)
|
|
|
+{
|
|
|
+ struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
|
|
|
+
|
|
|
+ return (struct dbg_bus_block *)&dbg_bus_blocks[block_id *
|
|
|
+ MAX_CHIP_IDS +
|
|
|
+ dev_data->chip_id];
|
|
|
+}
|
|
|
+
|
|
|
/* Reads the FW info structure for the specified Storm from the chip,
|
|
|
* and writes it to the specified fw_info pointer.
|
|
|
*/
|
|
@@ -1579,25 +1796,28 @@ static void qed_read_fw_info(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
|
u8 storm_id, struct fw_info *fw_info)
|
|
|
{
|
|
|
- /* Read first the address that points to fw_info location.
|
|
|
- * The address is located in the last line of the Storm RAM.
|
|
|
- */
|
|
|
- u32 addr = s_storm_defs[storm_id].sem_fast_mem_addr +
|
|
|
- SEM_FAST_REG_INT_RAM +
|
|
|
- DWORDS_TO_BYTES(SEM_FAST_REG_INT_RAM_SIZE) -
|
|
|
- sizeof(struct fw_info_location);
|
|
|
+ struct storm_defs *storm = &s_storm_defs[storm_id];
|
|
|
struct fw_info_location fw_info_location;
|
|
|
- u32 *dest = (u32 *)&fw_info_location;
|
|
|
- u32 i;
|
|
|
+ u32 addr, i, *dest;
|
|
|
|
|
|
memset(&fw_info_location, 0, sizeof(fw_info_location));
|
|
|
memset(fw_info, 0, sizeof(*fw_info));
|
|
|
+
|
|
|
+ /* Read first the address that points to fw_info location.
|
|
|
+ * The address is located in the last line of the Storm RAM.
|
|
|
+ */
|
|
|
+ addr = storm->sem_fast_mem_addr + SEM_FAST_REG_INT_RAM +
|
|
|
+ DWORDS_TO_BYTES(SEM_FAST_REG_INT_RAM_SIZE) -
|
|
|
+ sizeof(fw_info_location);
|
|
|
+ dest = (u32 *)&fw_info_location;
|
|
|
+
|
|
|
for (i = 0; i < BYTES_TO_DWORDS(sizeof(fw_info_location));
|
|
|
i++, addr += BYTES_IN_DWORD)
|
|
|
dest[i] = qed_rd(p_hwfn, p_ptt, addr);
|
|
|
+
|
|
|
+ /* Read FW version info from Storm RAM */
|
|
|
if (fw_info_location.size > 0 && fw_info_location.size <=
|
|
|
sizeof(*fw_info)) {
|
|
|
- /* Read FW version info from Storm RAM */
|
|
|
addr = fw_info_location.grc_addr;
|
|
|
dest = (u32 *)fw_info;
|
|
|
for (i = 0; i < BYTES_TO_DWORDS(fw_info_location.size);
|
|
@@ -1606,27 +1826,30 @@ static void qed_read_fw_info(struct qed_hwfn *p_hwfn,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* Dumps the specified string to the specified buffer. Returns the dumped size
|
|
|
- * in bytes (actual length + 1 for the null character termination).
|
|
|
+/* Dumps the specified string to the specified buffer.
|
|
|
+ * Returns the dumped size in bytes.
|
|
|
*/
|
|
|
static u32 qed_dump_str(char *dump_buf, bool dump, const char *str)
|
|
|
{
|
|
|
if (dump)
|
|
|
strcpy(dump_buf, str);
|
|
|
+
|
|
|
return (u32)strlen(str) + 1;
|
|
|
}
|
|
|
|
|
|
-/* Dumps zeros to align the specified buffer to dwords. Returns the dumped size
|
|
|
- * in bytes.
|
|
|
+/* Dumps zeros to align the specified buffer to dwords.
|
|
|
+ * Returns the dumped size in bytes.
|
|
|
*/
|
|
|
static u32 qed_dump_align(char *dump_buf, bool dump, u32 byte_offset)
|
|
|
{
|
|
|
- u8 offset_in_dword = (u8)(byte_offset & 0x3), align_size;
|
|
|
+ u8 offset_in_dword, align_size;
|
|
|
|
|
|
+ offset_in_dword = (u8)(byte_offset & 0x3);
|
|
|
align_size = offset_in_dword ? BYTES_IN_DWORD - offset_in_dword : 0;
|
|
|
|
|
|
if (dump && align_size)
|
|
|
memset(dump_buf, 0, align_size);
|
|
|
+
|
|
|
return align_size;
|
|
|
}
|
|
|
|
|
@@ -1653,6 +1876,7 @@ static u32 qed_dump_str_param(u32 *dump_buf,
|
|
|
|
|
|
/* Align buffer to next dword */
|
|
|
offset += qed_dump_align(char_buf + offset, dump, offset);
|
|
|
+
|
|
|
return BYTES_TO_DWORDS(offset);
|
|
|
}
|
|
|
|
|
@@ -1681,6 +1905,7 @@ static u32 qed_dump_num_param(u32 *dump_buf,
|
|
|
if (dump)
|
|
|
*(dump_buf + offset) = param_val;
|
|
|
offset++;
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
@@ -1695,7 +1920,6 @@ static u32 qed_dump_fw_ver_param(struct qed_hwfn *p_hwfn,
|
|
|
char fw_ver_str[16] = EMPTY_FW_VERSION_STR;
|
|
|
char fw_img_str[16] = EMPTY_FW_IMAGE_STR;
|
|
|
struct fw_info fw_info = { {0}, {0} };
|
|
|
- int printed_chars;
|
|
|
u32 offset = 0;
|
|
|
|
|
|
if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
|
|
@@ -1705,37 +1929,32 @@ static u32 qed_dump_fw_ver_param(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
for (storm_id = 0; storm_id < MAX_DBG_STORMS && !found;
|
|
|
storm_id++) {
|
|
|
- /* Read FW version/image */
|
|
|
- if (!dev_data->block_in_reset
|
|
|
- [s_storm_defs[storm_id].block_id]) {
|
|
|
- /* read FW info for the current Storm */
|
|
|
- qed_read_fw_info(p_hwfn,
|
|
|
- p_ptt, storm_id, &fw_info);
|
|
|
-
|
|
|
- /* Create FW version/image strings */
|
|
|
- printed_chars =
|
|
|
- snprintf(fw_ver_str,
|
|
|
- sizeof(fw_ver_str),
|
|
|
- "%d_%d_%d_%d",
|
|
|
- fw_info.ver.num.major,
|
|
|
- fw_info.ver.num.minor,
|
|
|
- fw_info.ver.num.rev,
|
|
|
- fw_info.ver.num.eng);
|
|
|
- if (printed_chars < 0 || printed_chars >=
|
|
|
- sizeof(fw_ver_str))
|
|
|
- DP_NOTICE(p_hwfn,
|
|
|
- "Unexpected debug error: invalid FW version string\n");
|
|
|
- switch (fw_info.ver.image_id) {
|
|
|
- case FW_IMG_MAIN:
|
|
|
- strcpy(fw_img_str, "main");
|
|
|
- break;
|
|
|
- default:
|
|
|
- strcpy(fw_img_str, "unknown");
|
|
|
- break;
|
|
|
- }
|
|
|
+ struct storm_defs *storm = &s_storm_defs[storm_id];
|
|
|
+
|
|
|
+ /* Read FW version/image */
|
|
|
+ if (dev_data->block_in_reset[storm->block_id])
|
|
|
+ continue;
|
|
|
|
|
|
- found = true;
|
|
|
+ /* Read FW info for the current Storm */
|
|
|
+ qed_read_fw_info(p_hwfn, p_ptt, storm_id, &fw_info);
|
|
|
+
|
|
|
+ /* Create FW version/image strings */
|
|
|
+ if (snprintf(fw_ver_str, sizeof(fw_ver_str),
|
|
|
+ "%d_%d_%d_%d", fw_info.ver.num.major,
|
|
|
+ fw_info.ver.num.minor, fw_info.ver.num.rev,
|
|
|
+ fw_info.ver.num.eng) < 0)
|
|
|
+ DP_NOTICE(p_hwfn,
|
|
|
+ "Unexpected debug error: invalid FW version string\n");
|
|
|
+ switch (fw_info.ver.image_id) {
|
|
|
+ case FW_IMG_MAIN:
|
|
|
+ strcpy(fw_img_str, "main");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ strcpy(fw_img_str, "unknown");
|
|
|
+ break;
|
|
|
}
|
|
|
+
|
|
|
+ found = true;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1747,6 +1966,7 @@ static u32 qed_dump_fw_ver_param(struct qed_hwfn *p_hwfn,
|
|
|
offset += qed_dump_num_param(dump_buf + offset,
|
|
|
dump,
|
|
|
"fw-timestamp", fw_info.ver.timestamp);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
@@ -1759,17 +1979,18 @@ static u32 qed_dump_mfw_ver_param(struct qed_hwfn *p_hwfn,
|
|
|
{
|
|
|
char mfw_ver_str[16] = EMPTY_FW_VERSION_STR;
|
|
|
|
|
|
- if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
|
|
|
+ if (dump &&
|
|
|
+ !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
|
|
|
u32 global_section_offsize, global_section_addr, mfw_ver;
|
|
|
u32 public_data_addr, global_section_offsize_addr;
|
|
|
- int printed_chars;
|
|
|
|
|
|
- /* Find MCP public data GRC address.
|
|
|
- * Needs to be ORed with MCP_REG_SCRATCH due to a HW bug.
|
|
|
+ /* Find MCP public data GRC address. Needs to be ORed with
|
|
|
+ * MCP_REG_SCRATCH due to a HW bug.
|
|
|
*/
|
|
|
- public_data_addr = qed_rd(p_hwfn, p_ptt,
|
|
|
+ public_data_addr = qed_rd(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
MISC_REG_SHARED_MEM_ADDR) |
|
|
|
- MCP_REG_SCRATCH;
|
|
|
+ MCP_REG_SCRATCH;
|
|
|
|
|
|
/* Find MCP public global section offset */
|
|
|
global_section_offsize_addr = public_data_addr +
|
|
@@ -1778,9 +1999,9 @@ static u32 qed_dump_mfw_ver_param(struct qed_hwfn *p_hwfn,
|
|
|
sizeof(offsize_t) * PUBLIC_GLOBAL;
|
|
|
global_section_offsize = qed_rd(p_hwfn, p_ptt,
|
|
|
global_section_offsize_addr);
|
|
|
- global_section_addr = MCP_REG_SCRATCH +
|
|
|
- (global_section_offsize &
|
|
|
- OFFSIZE_OFFSET_MASK) * 4;
|
|
|
+ global_section_addr =
|
|
|
+ MCP_REG_SCRATCH +
|
|
|
+ (global_section_offsize & OFFSIZE_OFFSET_MASK) * 4;
|
|
|
|
|
|
/* Read MFW version from MCP public global section */
|
|
|
mfw_ver = qed_rd(p_hwfn, p_ptt,
|
|
@@ -1788,13 +2009,9 @@ static u32 qed_dump_mfw_ver_param(struct qed_hwfn *p_hwfn,
|
|
|
offsetof(struct public_global, mfw_ver));
|
|
|
|
|
|
/* Dump MFW version param */
|
|
|
- printed_chars = snprintf(mfw_ver_str, sizeof(mfw_ver_str),
|
|
|
- "%d_%d_%d_%d",
|
|
|
- (u8) (mfw_ver >> 24),
|
|
|
- (u8) (mfw_ver >> 16),
|
|
|
- (u8) (mfw_ver >> 8),
|
|
|
- (u8) mfw_ver);
|
|
|
- if (printed_chars < 0 || printed_chars >= sizeof(mfw_ver_str))
|
|
|
+ if (snprintf(mfw_ver_str, sizeof(mfw_ver_str), "%d_%d_%d_%d",
|
|
|
+ (u8)(mfw_ver >> 24), (u8)(mfw_ver >> 16),
|
|
|
+ (u8)(mfw_ver >> 8), (u8)mfw_ver) < 0)
|
|
|
DP_NOTICE(p_hwfn,
|
|
|
"Unexpected debug error: invalid MFW version string\n");
|
|
|
}
|
|
@@ -1820,11 +2037,12 @@ static u32 qed_dump_common_global_params(struct qed_hwfn *p_hwfn,
|
|
|
bool dump,
|
|
|
u8 num_specific_global_params)
|
|
|
{
|
|
|
- u8 num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params;
|
|
|
struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
|
|
|
u32 offset = 0;
|
|
|
+ u8 num_params;
|
|
|
|
|
|
- /* Find platform string and dump global params section header */
|
|
|
+ /* Dump global params section header */
|
|
|
+ num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params;
|
|
|
offset += qed_dump_section_hdr(dump_buf + offset,
|
|
|
dump, "global_params", num_params);
|
|
|
|
|
@@ -1846,25 +2064,29 @@ static u32 qed_dump_common_global_params(struct qed_hwfn *p_hwfn,
|
|
|
offset +=
|
|
|
qed_dump_num_param(dump_buf + offset, dump, "pci-func",
|
|
|
p_hwfn->abs_pf_id);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
|
-/* Writes the last section to the specified buffer at the given offset.
|
|
|
- * Returns the dumped size in dwords.
|
|
|
+/* Writes the "last" section (including CRC) to the specified buffer at the
|
|
|
+ * given offset. Returns the dumped size in dwords.
|
|
|
*/
|
|
|
-static u32 qed_dump_last_section(u32 *dump_buf, u32 offset, bool dump)
|
|
|
+static u32 qed_dump_last_section(struct qed_hwfn *p_hwfn,
|
|
|
+ u32 *dump_buf, u32 offset, bool dump)
|
|
|
{
|
|
|
- u32 start_offset = offset, crc = ~0;
|
|
|
+ u32 start_offset = offset;
|
|
|
|
|
|
/* Dump CRC section header */
|
|
|
offset += qed_dump_section_hdr(dump_buf + offset, dump, "last", 0);
|
|
|
|
|
|
- /* Calculate CRC32 and add it to the dword following the "last" section.
|
|
|
- */
|
|
|
+ /* Calculate CRC32 and add it to the dword after the "last" section */
|
|
|
if (dump)
|
|
|
- *(dump_buf + offset) = ~crc32(crc, (u8 *)dump_buf,
|
|
|
+ *(dump_buf + offset) = ~crc32(0xffffffff,
|
|
|
+ (u8 *)dump_buf,
|
|
|
DWORDS_TO_BYTES(offset));
|
|
|
+
|
|
|
offset++;
|
|
|
+
|
|
|
return offset - start_offset;
|
|
|
}
|
|
|
|
|
@@ -1883,11 +2105,12 @@ static void qed_update_blocks_reset_state(struct qed_hwfn *p_hwfn,
|
|
|
p_ptt, s_reset_regs_defs[i].addr);
|
|
|
|
|
|
/* Check if blocks are in reset */
|
|
|
- for (i = 0; i < MAX_BLOCK_ID; i++)
|
|
|
- dev_data->block_in_reset[i] =
|
|
|
- s_block_defs[i]->has_reset_bit &&
|
|
|
- !(reg_val[s_block_defs[i]->reset_reg] &
|
|
|
- BIT(s_block_defs[i]->reset_bit_offset));
|
|
|
+ for (i = 0; i < MAX_BLOCK_ID; i++) {
|
|
|
+ struct block_defs *block = s_block_defs[i];
|
|
|
+
|
|
|
+ dev_data->block_in_reset[i] = block->has_reset_bit &&
|
|
|
+ !(reg_val[block->reset_reg] & BIT(block->reset_bit_offset));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Enable / disable the Debug block */
|
|
@@ -1902,12 +2125,12 @@ static void qed_bus_reset_dbg_block(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt)
|
|
|
{
|
|
|
u32 dbg_reset_reg_addr, old_reset_reg_val, new_reset_reg_val;
|
|
|
+ struct block_defs *dbg_block = s_block_defs[BLOCK_DBG];
|
|
|
|
|
|
- dbg_reset_reg_addr =
|
|
|
- s_reset_regs_defs[s_block_defs[BLOCK_DBG]->reset_reg].addr;
|
|
|
+ dbg_reset_reg_addr = s_reset_regs_defs[dbg_block->reset_reg].addr;
|
|
|
old_reset_reg_val = qed_rd(p_hwfn, p_ptt, dbg_reset_reg_addr);
|
|
|
- new_reset_reg_val = old_reset_reg_val &
|
|
|
- ~BIT(s_block_defs[BLOCK_DBG]->reset_bit_offset);
|
|
|
+ new_reset_reg_val =
|
|
|
+ old_reset_reg_val & ~BIT(dbg_block->reset_bit_offset);
|
|
|
|
|
|
qed_wr(p_hwfn, p_ptt, dbg_reset_reg_addr, new_reset_reg_val);
|
|
|
qed_wr(p_hwfn, p_ptt, dbg_reset_reg_addr, old_reset_reg_val);
|
|
@@ -1920,8 +2143,8 @@ static void qed_bus_set_framing_mode(struct qed_hwfn *p_hwfn,
|
|
|
qed_wr(p_hwfn, p_ptt, DBG_REG_FRAMING_MODE, (u8)mode);
|
|
|
}
|
|
|
|
|
|
-/* Enable / disable Debug Bus clients according to the specified mask.
|
|
|
- * (1 = enable, 0 = disable)
|
|
|
+/* Enable / disable Debug Bus clients according to the specified mask
|
|
|
+ * (1 = enable, 0 = disable).
|
|
|
*/
|
|
|
static void qed_bus_enable_clients(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt, u32 client_mask)
|
|
@@ -1931,10 +2154,14 @@ static void qed_bus_enable_clients(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
static bool qed_is_mode_match(struct qed_hwfn *p_hwfn, u16 *modes_buf_offset)
|
|
|
{
|
|
|
- const u32 *ptr = s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr;
|
|
|
struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
|
|
|
- u8 tree_val = ((u8 *)ptr)[(*modes_buf_offset)++];
|
|
|
bool arg1, arg2;
|
|
|
+ const u32 *ptr;
|
|
|
+ u8 tree_val;
|
|
|
+
|
|
|
+ /* Get next element from modes tree buffer */
|
|
|
+ ptr = s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr;
|
|
|
+ tree_val = ((u8 *)ptr)[(*modes_buf_offset)++];
|
|
|
|
|
|
switch (tree_val) {
|
|
|
case INIT_MODE_OP_NOT:
|
|
@@ -1974,75 +2201,81 @@ static bool qed_grc_is_storm_included(struct qed_hwfn *p_hwfn,
|
|
|
static bool qed_grc_is_mem_included(struct qed_hwfn *p_hwfn,
|
|
|
enum block_id block_id, u8 mem_group_id)
|
|
|
{
|
|
|
+ struct block_defs *block = s_block_defs[block_id];
|
|
|
u8 i;
|
|
|
|
|
|
/* Check Storm match */
|
|
|
- if (s_block_defs[block_id]->associated_to_storm &&
|
|
|
+ if (block->associated_to_storm &&
|
|
|
!qed_grc_is_storm_included(p_hwfn,
|
|
|
- (enum dbg_storms)s_block_defs[block_id]->storm_id))
|
|
|
+ (enum dbg_storms)block->storm_id))
|
|
|
return false;
|
|
|
|
|
|
- for (i = 0; i < NUM_BIG_RAM_TYPES; i++)
|
|
|
- if (mem_group_id == s_big_ram_defs[i].mem_group_id ||
|
|
|
- mem_group_id == s_big_ram_defs[i].ram_mem_group_id)
|
|
|
- return qed_grc_is_included(p_hwfn,
|
|
|
- s_big_ram_defs[i].grc_param);
|
|
|
- if (mem_group_id == MEM_GROUP_PXP_ILT || mem_group_id ==
|
|
|
- MEM_GROUP_PXP_MEM)
|
|
|
+ for (i = 0; i < NUM_BIG_RAM_TYPES; i++) {
|
|
|
+ struct big_ram_defs *big_ram = &s_big_ram_defs[i];
|
|
|
+
|
|
|
+ if (mem_group_id == big_ram->mem_group_id ||
|
|
|
+ mem_group_id == big_ram->ram_mem_group_id)
|
|
|
+ return qed_grc_is_included(p_hwfn, big_ram->grc_param);
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (mem_group_id) {
|
|
|
+ case MEM_GROUP_PXP_ILT:
|
|
|
+ case MEM_GROUP_PXP_MEM:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PXP);
|
|
|
- if (mem_group_id == MEM_GROUP_RAM)
|
|
|
+ case MEM_GROUP_RAM:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RAM);
|
|
|
- if (mem_group_id == MEM_GROUP_PBUF)
|
|
|
+ case MEM_GROUP_PBUF:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PBUF);
|
|
|
- if (mem_group_id == MEM_GROUP_CAU_MEM ||
|
|
|
- mem_group_id == MEM_GROUP_CAU_SB ||
|
|
|
- mem_group_id == MEM_GROUP_CAU_PI)
|
|
|
+ case MEM_GROUP_CAU_MEM:
|
|
|
+ case MEM_GROUP_CAU_SB:
|
|
|
+ case MEM_GROUP_CAU_PI:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU);
|
|
|
- if (mem_group_id == MEM_GROUP_QM_MEM)
|
|
|
+ case MEM_GROUP_QM_MEM:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_QM);
|
|
|
- if (mem_group_id == MEM_GROUP_CONN_CFC_MEM ||
|
|
|
- mem_group_id == MEM_GROUP_TASK_CFC_MEM)
|
|
|
+ case MEM_GROUP_CFC_MEM:
|
|
|
+ case MEM_GROUP_CONN_CFC_MEM:
|
|
|
+ case MEM_GROUP_TASK_CFC_MEM:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CFC);
|
|
|
- if (mem_group_id == MEM_GROUP_IGU_MEM || mem_group_id ==
|
|
|
- MEM_GROUP_IGU_MSIX)
|
|
|
+ case MEM_GROUP_IGU_MEM:
|
|
|
+ case MEM_GROUP_IGU_MSIX:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IGU);
|
|
|
- if (mem_group_id == MEM_GROUP_MULD_MEM)
|
|
|
+ case MEM_GROUP_MULD_MEM:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MULD);
|
|
|
- if (mem_group_id == MEM_GROUP_PRS_MEM)
|
|
|
+ case MEM_GROUP_PRS_MEM:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PRS);
|
|
|
- if (mem_group_id == MEM_GROUP_DMAE_MEM)
|
|
|
+ case MEM_GROUP_DMAE_MEM:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DMAE);
|
|
|
- if (mem_group_id == MEM_GROUP_TM_MEM)
|
|
|
+ case MEM_GROUP_TM_MEM:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_TM);
|
|
|
- if (mem_group_id == MEM_GROUP_SDM_MEM)
|
|
|
+ case MEM_GROUP_SDM_MEM:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_SDM);
|
|
|
- if (mem_group_id == MEM_GROUP_TDIF_CTX || mem_group_id ==
|
|
|
- MEM_GROUP_RDIF_CTX)
|
|
|
+ case MEM_GROUP_TDIF_CTX:
|
|
|
+ case MEM_GROUP_RDIF_CTX:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DIF);
|
|
|
- if (mem_group_id == MEM_GROUP_CM_MEM)
|
|
|
+ case MEM_GROUP_CM_MEM:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM);
|
|
|
- if (mem_group_id == MEM_GROUP_IOR)
|
|
|
+ case MEM_GROUP_IOR:
|
|
|
return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR);
|
|
|
-
|
|
|
- return true;
|
|
|
+ default:
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Stalls all Storms */
|
|
|
static void qed_grc_stall_storms(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt, bool stall)
|
|
|
{
|
|
|
- u8 reg_val = stall ? 1 : 0;
|
|
|
+ u32 reg_addr;
|
|
|
u8 storm_id;
|
|
|
|
|
|
for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
|
|
|
- if (qed_grc_is_storm_included(p_hwfn,
|
|
|
- (enum dbg_storms)storm_id)) {
|
|
|
- u32 reg_addr =
|
|
|
- s_storm_defs[storm_id].sem_fast_mem_addr +
|
|
|
- SEM_FAST_REG_STALL_0;
|
|
|
+ if (!qed_grc_is_storm_included(p_hwfn,
|
|
|
+ (enum dbg_storms)storm_id))
|
|
|
+ continue;
|
|
|
|
|
|
- qed_wr(p_hwfn, p_ptt, reg_addr, reg_val);
|
|
|
- }
|
|
|
+ reg_addr = s_storm_defs[storm_id].sem_fast_mem_addr +
|
|
|
+ SEM_FAST_REG_STALL_0_BB_K2;
|
|
|
+ qed_wr(p_hwfn, p_ptt, reg_addr, stall ? 1 : 0);
|
|
|
}
|
|
|
|
|
|
msleep(STALL_DELAY_MS);
|
|
@@ -2054,24 +2287,29 @@ static void qed_grc_unreset_blocks(struct qed_hwfn *p_hwfn,
|
|
|
{
|
|
|
struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
|
|
|
u32 reg_val[MAX_DBG_RESET_REGS] = { 0 };
|
|
|
- u32 i;
|
|
|
+ u32 block_id, i;
|
|
|
|
|
|
/* Fill reset regs values */
|
|
|
- for (i = 0; i < MAX_BLOCK_ID; i++)
|
|
|
- if (s_block_defs[i]->has_reset_bit && s_block_defs[i]->unreset)
|
|
|
- reg_val[s_block_defs[i]->reset_reg] |=
|
|
|
- BIT(s_block_defs[i]->reset_bit_offset);
|
|
|
+ for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
|
|
|
+ struct block_defs *block = s_block_defs[block_id];
|
|
|
+
|
|
|
+ if (block->has_reset_bit && block->unreset)
|
|
|
+ reg_val[block->reset_reg] |=
|
|
|
+ BIT(block->reset_bit_offset);
|
|
|
+ }
|
|
|
|
|
|
/* Write reset registers */
|
|
|
for (i = 0; i < MAX_DBG_RESET_REGS; i++) {
|
|
|
- if (s_reset_regs_defs[i].exists[dev_data->chip_id]) {
|
|
|
- reg_val[i] |= s_reset_regs_defs[i].unreset_val;
|
|
|
- if (reg_val[i])
|
|
|
- qed_wr(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- s_reset_regs_defs[i].addr +
|
|
|
- RESET_REG_UNRESET_OFFSET, reg_val[i]);
|
|
|
- }
|
|
|
+ if (!s_reset_regs_defs[i].exists[dev_data->chip_id])
|
|
|
+ continue;
|
|
|
+
|
|
|
+ reg_val[i] |= s_reset_regs_defs[i].unreset_val;
|
|
|
+
|
|
|
+ if (reg_val[i])
|
|
|
+ qed_wr(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ s_reset_regs_defs[i].addr +
|
|
|
+ RESET_REG_UNRESET_OFFSET, reg_val[i]);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2095,6 +2333,7 @@ qed_get_block_attn_regs(enum block_id block_id, enum dbg_attn_type attn_type,
|
|
|
qed_get_block_attn_data(block_id, attn_type);
|
|
|
|
|
|
*num_attn_regs = block_type_data->num_regs;
|
|
|
+
|
|
|
return &((const struct dbg_attn_reg *)
|
|
|
s_dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)[block_type_data->
|
|
|
regs_offset];
|
|
@@ -2105,34 +2344,34 @@ static void qed_grc_clear_all_prty(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt)
|
|
|
{
|
|
|
struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
|
|
|
+ const struct dbg_attn_reg *attn_reg_arr;
|
|
|
u8 reg_idx, num_attn_regs;
|
|
|
u32 block_id;
|
|
|
|
|
|
for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
|
|
|
- const struct dbg_attn_reg *attn_reg_arr;
|
|
|
-
|
|
|
if (dev_data->block_in_reset[block_id])
|
|
|
continue;
|
|
|
|
|
|
attn_reg_arr = qed_get_block_attn_regs((enum block_id)block_id,
|
|
|
ATTN_TYPE_PARITY,
|
|
|
&num_attn_regs);
|
|
|
+
|
|
|
for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
|
|
|
const struct dbg_attn_reg *reg_data =
|
|
|
&attn_reg_arr[reg_idx];
|
|
|
+ u16 modes_buf_offset;
|
|
|
+ bool eval_mode;
|
|
|
|
|
|
/* Check mode */
|
|
|
- bool eval_mode = GET_FIELD(reg_data->mode.data,
|
|
|
- DBG_MODE_HDR_EVAL_MODE) > 0;
|
|
|
- u16 modes_buf_offset =
|
|
|
+ eval_mode = GET_FIELD(reg_data->mode.data,
|
|
|
+ DBG_MODE_HDR_EVAL_MODE) > 0;
|
|
|
+ modes_buf_offset =
|
|
|
GET_FIELD(reg_data->mode.data,
|
|
|
DBG_MODE_HDR_MODES_BUF_OFFSET);
|
|
|
|
|
|
+ /* If Mode match: clear parity status */
|
|
|
if (!eval_mode ||
|
|
|
qed_is_mode_match(p_hwfn, &modes_buf_offset))
|
|
|
- /* Mode match - read parity status read-clear
|
|
|
- * register.
|
|
|
- */
|
|
|
qed_rd(p_hwfn, p_ptt,
|
|
|
DWORDS_TO_BYTES(reg_data->
|
|
|
sts_clr_address));
|
|
@@ -2142,11 +2381,11 @@ static void qed_grc_clear_all_prty(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Dumps GRC registers section header. Returns the dumped size in dwords.
|
|
|
* The following parameters are dumped:
|
|
|
- * - 'count' = num_dumped_entries
|
|
|
- * - 'split' = split_type
|
|
|
- * - 'id' = split_id (dumped only if split_id >= 0)
|
|
|
- * - 'param_name' = param_val (user param, dumped only if param_name != NULL and
|
|
|
- * param_val != NULL)
|
|
|
+ * - count: no. of dumped entries
|
|
|
+ * - split: split type
|
|
|
+ * - id: split ID (dumped only if split_id >= 0)
|
|
|
+ * - param_name: user parameter value (dumped only if param_name != NULL
|
|
|
+ * and param_val != NULL).
|
|
|
*/
|
|
|
static u32 qed_grc_dump_regs_hdr(u32 *dump_buf,
|
|
|
bool dump,
|
|
@@ -2170,84 +2409,100 @@ static u32 qed_grc_dump_regs_hdr(u32 *dump_buf,
|
|
|
if (param_name && param_val)
|
|
|
offset += qed_dump_str_param(dump_buf + offset,
|
|
|
dump, param_name, param_val);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
|
/* Dumps the GRC registers in the specified address range.
|
|
|
* Returns the dumped size in dwords.
|
|
|
+ * The addr and len arguments are specified in dwords.
|
|
|
*/
|
|
|
static u32 qed_grc_dump_addr_range(struct qed_hwfn *p_hwfn,
|
|
|
- struct qed_ptt *p_ptt, u32 *dump_buf,
|
|
|
- bool dump, u32 addr, u32 len)
|
|
|
+ struct qed_ptt *p_ptt,
|
|
|
+ u32 *dump_buf,
|
|
|
+ bool dump, u32 addr, u32 len, bool wide_bus)
|
|
|
{
|
|
|
u32 byte_addr = DWORDS_TO_BYTES(addr), offset = 0, i;
|
|
|
|
|
|
- if (dump)
|
|
|
- for (i = 0; i < len; i++, byte_addr += BYTES_IN_DWORD, offset++)
|
|
|
- *(dump_buf + offset) = qed_rd(p_hwfn, p_ptt, byte_addr);
|
|
|
- else
|
|
|
- offset += len;
|
|
|
+ if (!dump)
|
|
|
+ return len;
|
|
|
+
|
|
|
+ for (i = 0; i < len; i++, byte_addr += BYTES_IN_DWORD, offset++)
|
|
|
+ *(dump_buf + offset) = qed_rd(p_hwfn, p_ptt, byte_addr);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
|
-/* Dumps GRC registers sequence header. Returns the dumped size in dwords. */
|
|
|
-static u32 qed_grc_dump_reg_entry_hdr(u32 *dump_buf, bool dump, u32 addr,
|
|
|
- u32 len)
|
|
|
+/* Dumps GRC registers sequence header. Returns the dumped size in dwords.
|
|
|
+ * The addr and len arguments are specified in dwords.
|
|
|
+ */
|
|
|
+static u32 qed_grc_dump_reg_entry_hdr(u32 *dump_buf,
|
|
|
+ bool dump, u32 addr, u32 len)
|
|
|
{
|
|
|
if (dump)
|
|
|
*dump_buf = addr | (len << REG_DUMP_LEN_SHIFT);
|
|
|
+
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-/* Dumps GRC registers sequence. Returns the dumped size in dwords. */
|
|
|
+/* Dumps GRC registers sequence. Returns the dumped size in dwords.
|
|
|
+ * The addr and len arguments are specified in dwords.
|
|
|
+ */
|
|
|
static u32 qed_grc_dump_reg_entry(struct qed_hwfn *p_hwfn,
|
|
|
- struct qed_ptt *p_ptt, u32 *dump_buf,
|
|
|
- bool dump, u32 addr, u32 len)
|
|
|
+ struct qed_ptt *p_ptt,
|
|
|
+ u32 *dump_buf,
|
|
|
+ bool dump, u32 addr, u32 len, bool wide_bus)
|
|
|
{
|
|
|
u32 offset = 0;
|
|
|
|
|
|
offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, len);
|
|
|
offset += qed_grc_dump_addr_range(p_hwfn,
|
|
|
p_ptt,
|
|
|
- dump_buf + offset, dump, addr, len);
|
|
|
+ dump_buf + offset,
|
|
|
+ dump, addr, len, wide_bus);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
|
/* Dumps GRC registers sequence with skip cycle.
|
|
|
* Returns the dumped size in dwords.
|
|
|
+ * - addr: start GRC address in dwords
|
|
|
+ * - total_len: total no. of dwords to dump
|
|
|
+ * - read_len: no. consecutive dwords to read
|
|
|
+ * - skip_len: no. of dwords to skip (and fill with zeros)
|
|
|
*/
|
|
|
static u32 qed_grc_dump_reg_entry_skip(struct qed_hwfn *p_hwfn,
|
|
|
- struct qed_ptt *p_ptt, u32 *dump_buf,
|
|
|
- bool dump, u32 addr, u32 total_len,
|
|
|
+ struct qed_ptt *p_ptt,
|
|
|
+ u32 *dump_buf,
|
|
|
+ bool dump,
|
|
|
+ u32 addr,
|
|
|
+ u32 total_len,
|
|
|
u32 read_len, u32 skip_len)
|
|
|
{
|
|
|
u32 offset = 0, reg_offset = 0;
|
|
|
|
|
|
offset += qed_grc_dump_reg_entry_hdr(dump_buf, dump, addr, total_len);
|
|
|
- if (dump) {
|
|
|
- while (reg_offset < total_len) {
|
|
|
- u32 curr_len = min_t(u32,
|
|
|
- read_len,
|
|
|
- total_len - reg_offset);
|
|
|
- offset += qed_grc_dump_addr_range(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- dump_buf + offset,
|
|
|
- dump, addr, curr_len);
|
|
|
+
|
|
|
+ if (!dump)
|
|
|
+ return offset + total_len;
|
|
|
+
|
|
|
+ while (reg_offset < total_len) {
|
|
|
+ u32 curr_len = min_t(u32, read_len, total_len - reg_offset);
|
|
|
+
|
|
|
+ offset += qed_grc_dump_addr_range(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump, addr, curr_len, false);
|
|
|
+ reg_offset += curr_len;
|
|
|
+ addr += curr_len;
|
|
|
+
|
|
|
+ if (reg_offset < total_len) {
|
|
|
+ curr_len = min_t(u32, skip_len, total_len - skip_len);
|
|
|
+ memset(dump_buf + offset, 0, DWORDS_TO_BYTES(curr_len));
|
|
|
+ offset += curr_len;
|
|
|
reg_offset += curr_len;
|
|
|
addr += curr_len;
|
|
|
- if (reg_offset < total_len) {
|
|
|
- curr_len = min_t(u32,
|
|
|
- skip_len,
|
|
|
- total_len - skip_len);
|
|
|
- memset(dump_buf + offset, 0,
|
|
|
- DWORDS_TO_BYTES(curr_len));
|
|
|
- offset += curr_len;
|
|
|
- reg_offset += curr_len;
|
|
|
- addr += curr_len;
|
|
|
- }
|
|
|
}
|
|
|
- } else {
|
|
|
- offset += total_len;
|
|
|
}
|
|
|
|
|
|
return offset;
|
|
@@ -2266,43 +2521,48 @@ static u32 qed_grc_dump_regs_entries(struct qed_hwfn *p_hwfn,
|
|
|
bool mode_match = true;
|
|
|
|
|
|
*num_dumped_reg_entries = 0;
|
|
|
+
|
|
|
while (input_offset < input_regs_arr.size_in_dwords) {
|
|
|
const struct dbg_dump_cond_hdr *cond_hdr =
|
|
|
(const struct dbg_dump_cond_hdr *)
|
|
|
&input_regs_arr.ptr[input_offset++];
|
|
|
- bool eval_mode = GET_FIELD(cond_hdr->mode.data,
|
|
|
- DBG_MODE_HDR_EVAL_MODE) > 0;
|
|
|
+ u16 modes_buf_offset;
|
|
|
+ bool eval_mode;
|
|
|
|
|
|
/* Check mode/block */
|
|
|
+ eval_mode = GET_FIELD(cond_hdr->mode.data,
|
|
|
+ DBG_MODE_HDR_EVAL_MODE) > 0;
|
|
|
if (eval_mode) {
|
|
|
- u16 modes_buf_offset =
|
|
|
+ modes_buf_offset =
|
|
|
GET_FIELD(cond_hdr->mode.data,
|
|
|
DBG_MODE_HDR_MODES_BUF_OFFSET);
|
|
|
mode_match = qed_is_mode_match(p_hwfn,
|
|
|
&modes_buf_offset);
|
|
|
}
|
|
|
|
|
|
- if (mode_match && block_enable[cond_hdr->block_id]) {
|
|
|
- for (i = 0; i < cond_hdr->data_size;
|
|
|
- i++, input_offset++) {
|
|
|
- const struct dbg_dump_reg *reg =
|
|
|
- (const struct dbg_dump_reg *)
|
|
|
- &input_regs_arr.ptr[input_offset];
|
|
|
- u32 addr, len;
|
|
|
-
|
|
|
- addr = GET_FIELD(reg->data,
|
|
|
- DBG_DUMP_REG_ADDRESS);
|
|
|
- len = GET_FIELD(reg->data, DBG_DUMP_REG_LENGTH);
|
|
|
- offset +=
|
|
|
- qed_grc_dump_reg_entry(p_hwfn, p_ptt,
|
|
|
- dump_buf + offset,
|
|
|
- dump,
|
|
|
- addr,
|
|
|
- len);
|
|
|
- (*num_dumped_reg_entries)++;
|
|
|
- }
|
|
|
- } else {
|
|
|
+ if (!mode_match || !block_enable[cond_hdr->block_id]) {
|
|
|
input_offset += cond_hdr->data_size;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < cond_hdr->data_size; i++, input_offset++) {
|
|
|
+ const struct dbg_dump_reg *reg =
|
|
|
+ (const struct dbg_dump_reg *)
|
|
|
+ &input_regs_arr.ptr[input_offset];
|
|
|
+ u32 addr, len;
|
|
|
+ bool wide_bus;
|
|
|
+
|
|
|
+ addr = GET_FIELD(reg->data, DBG_DUMP_REG_ADDRESS);
|
|
|
+ len = GET_FIELD(reg->data, DBG_DUMP_REG_LENGTH);
|
|
|
+ wide_bus = GET_FIELD(reg->data, DBG_DUMP_REG_WIDE_BUS);
|
|
|
+ offset += qed_grc_dump_reg_entry(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump,
|
|
|
+ addr,
|
|
|
+ len,
|
|
|
+ wide_bus);
|
|
|
+ (*num_dumped_reg_entries)++;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2350,8 +2610,8 @@ static u32 qed_grc_dump_split_data(struct qed_hwfn *p_hwfn,
|
|
|
return num_dumped_reg_entries > 0 ? offset : 0;
|
|
|
}
|
|
|
|
|
|
-/* Dumps registers according to the input registers array.
|
|
|
- * Returns the dumped size in dwords.
|
|
|
+/* Dumps registers according to the input registers array. Returns the dumped
|
|
|
+ * size in dwords.
|
|
|
*/
|
|
|
static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
@@ -2361,29 +2621,37 @@ static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn,
|
|
|
const char *param_name, const char *param_val)
|
|
|
{
|
|
|
struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
|
|
|
- struct chip_platform_defs *p_platform_defs;
|
|
|
+ struct chip_platform_defs *chip_platform;
|
|
|
u32 offset = 0, input_offset = 0;
|
|
|
- struct chip_defs *p_chip_defs;
|
|
|
+ struct chip_defs *chip;
|
|
|
u8 port_id, pf_id, vf_id;
|
|
|
u16 fid;
|
|
|
|
|
|
- p_chip_defs = &s_chip_defs[dev_data->chip_id];
|
|
|
- p_platform_defs = &p_chip_defs->per_platform[dev_data->platform_id];
|
|
|
+ chip = &s_chip_defs[dev_data->chip_id];
|
|
|
+ chip_platform = &chip->per_platform[dev_data->platform_id];
|
|
|
|
|
|
if (dump)
|
|
|
DP_VERBOSE(p_hwfn, QED_MSG_DEBUG, "Dumping registers...\n");
|
|
|
+
|
|
|
while (input_offset <
|
|
|
s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].size_in_dwords) {
|
|
|
- const struct dbg_dump_split_hdr *split_hdr =
|
|
|
+ const struct dbg_dump_split_hdr *split_hdr;
|
|
|
+ struct dbg_array curr_input_regs_arr;
|
|
|
+ u32 split_data_size;
|
|
|
+ u8 split_type_id;
|
|
|
+
|
|
|
+ split_hdr =
|
|
|
(const struct dbg_dump_split_hdr *)
|
|
|
&s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr[input_offset++];
|
|
|
- u8 split_type_id = GET_FIELD(split_hdr->hdr,
|
|
|
- DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
|
|
|
- u32 split_data_size = GET_FIELD(split_hdr->hdr,
|
|
|
- DBG_DUMP_SPLIT_HDR_DATA_SIZE);
|
|
|
- struct dbg_array curr_input_regs_arr = {
|
|
|
- &s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr[input_offset],
|
|
|
- split_data_size};
|
|
|
+ split_type_id =
|
|
|
+ GET_FIELD(split_hdr->hdr,
|
|
|
+ DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
|
|
|
+ split_data_size =
|
|
|
+ GET_FIELD(split_hdr->hdr,
|
|
|
+ DBG_DUMP_SPLIT_HDR_DATA_SIZE);
|
|
|
+ curr_input_regs_arr.ptr =
|
|
|
+ &s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr[input_offset];
|
|
|
+ curr_input_regs_arr.size_in_dwords = split_data_size;
|
|
|
|
|
|
switch (split_type_id) {
|
|
|
case SPLIT_TYPE_NONE:
|
|
@@ -2398,8 +2666,9 @@ static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn,
|
|
|
param_name,
|
|
|
param_val);
|
|
|
break;
|
|
|
+
|
|
|
case SPLIT_TYPE_PORT:
|
|
|
- for (port_id = 0; port_id < p_platform_defs->num_ports;
|
|
|
+ for (port_id = 0; port_id < chip_platform->num_ports;
|
|
|
port_id++) {
|
|
|
if (dump)
|
|
|
qed_port_pretend(p_hwfn, p_ptt,
|
|
@@ -2414,9 +2683,10 @@ static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn,
|
|
|
param_val);
|
|
|
}
|
|
|
break;
|
|
|
+
|
|
|
case SPLIT_TYPE_PF:
|
|
|
case SPLIT_TYPE_PORT_PF:
|
|
|
- for (pf_id = 0; pf_id < p_platform_defs->num_pfs;
|
|
|
+ for (pf_id = 0; pf_id < chip_platform->num_pfs;
|
|
|
pf_id++) {
|
|
|
u8 pfid_shift =
|
|
|
PXP_PRETEND_CONCRETE_FID_PFID_SHIFT;
|
|
@@ -2427,17 +2697,21 @@ static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn,
|
|
|
}
|
|
|
|
|
|
offset +=
|
|
|
- qed_grc_dump_split_data(p_hwfn, p_ptt,
|
|
|
+ qed_grc_dump_split_data(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
curr_input_regs_arr,
|
|
|
dump_buf + offset,
|
|
|
- dump, block_enable,
|
|
|
- "pf", pf_id,
|
|
|
+ dump,
|
|
|
+ block_enable,
|
|
|
+ "pf",
|
|
|
+ pf_id,
|
|
|
param_name,
|
|
|
param_val);
|
|
|
}
|
|
|
break;
|
|
|
+
|
|
|
case SPLIT_TYPE_VF:
|
|
|
- for (vf_id = 0; vf_id < p_platform_defs->num_vfs;
|
|
|
+ for (vf_id = 0; vf_id < chip_platform->num_vfs;
|
|
|
vf_id++) {
|
|
|
u8 vfvalid_shift =
|
|
|
PXP_PRETEND_CONCRETE_FID_VFVALID_SHIFT;
|
|
@@ -2460,6 +2734,7 @@ static u32 qed_grc_dump_registers(struct qed_hwfn *p_hwfn,
|
|
|
param_val);
|
|
|
}
|
|
|
break;
|
|
|
+
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -2490,35 +2765,37 @@ static u32 qed_grc_dump_reset_regs(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Write reset registers */
|
|
|
for (i = 0; i < MAX_DBG_RESET_REGS; i++) {
|
|
|
- if (s_reset_regs_defs[i].exists[dev_data->chip_id]) {
|
|
|
- u32 addr = BYTES_TO_DWORDS(s_reset_regs_defs[i].addr);
|
|
|
+ if (!s_reset_regs_defs[i].exists[dev_data->chip_id])
|
|
|
+ continue;
|
|
|
|
|
|
- offset += qed_grc_dump_reg_entry(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- dump_buf + offset,
|
|
|
- dump,
|
|
|
- addr,
|
|
|
- 1);
|
|
|
- num_regs++;
|
|
|
- }
|
|
|
+ offset += qed_grc_dump_reg_entry(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump,
|
|
|
+ BYTES_TO_DWORDS
|
|
|
+ (s_reset_regs_defs[i].addr), 1,
|
|
|
+ false);
|
|
|
+ num_regs++;
|
|
|
}
|
|
|
|
|
|
/* Write header */
|
|
|
if (dump)
|
|
|
qed_grc_dump_regs_hdr(dump_buf,
|
|
|
true, num_regs, "eng", -1, NULL, NULL);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
|
-/* Dump registers that are modified during GRC Dump and therefore must be dumped
|
|
|
- * first. Returns the dumped size in dwords.
|
|
|
+/* Dump registers that are modified during GRC Dump and therefore must be
|
|
|
+ * dumped first. Returns the dumped size in dwords.
|
|
|
*/
|
|
|
static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
|
u32 *dump_buf, bool dump)
|
|
|
{
|
|
|
struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
|
|
|
- u32 offset = 0, num_reg_entries = 0, block_id;
|
|
|
+ u32 block_id, offset = 0, num_reg_entries = 0;
|
|
|
+ const struct dbg_attn_reg *attn_reg_arr;
|
|
|
u8 storm_id, reg_idx, num_attn_regs;
|
|
|
|
|
|
/* Calculate header size */
|
|
@@ -2527,14 +2804,13 @@ static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Write parity registers */
|
|
|
for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
|
|
|
- const struct dbg_attn_reg *attn_reg_arr;
|
|
|
-
|
|
|
if (dev_data->block_in_reset[block_id] && dump)
|
|
|
continue;
|
|
|
|
|
|
attn_reg_arr = qed_get_block_attn_regs((enum block_id)block_id,
|
|
|
ATTN_TYPE_PARITY,
|
|
|
&num_attn_regs);
|
|
|
+
|
|
|
for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
|
|
|
const struct dbg_attn_reg *reg_data =
|
|
|
&attn_reg_arr[reg_idx];
|
|
@@ -2548,37 +2824,36 @@ static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn,
|
|
|
modes_buf_offset =
|
|
|
GET_FIELD(reg_data->mode.data,
|
|
|
DBG_MODE_HDR_MODES_BUF_OFFSET);
|
|
|
- if (!eval_mode ||
|
|
|
- qed_is_mode_match(p_hwfn, &modes_buf_offset)) {
|
|
|
- /* Mode match - read and dump registers */
|
|
|
- addr = reg_data->mask_address;
|
|
|
- offset +=
|
|
|
- qed_grc_dump_reg_entry(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- dump_buf + offset,
|
|
|
- dump,
|
|
|
- addr,
|
|
|
- 1);
|
|
|
- addr = GET_FIELD(reg_data->data,
|
|
|
- DBG_ATTN_REG_STS_ADDRESS);
|
|
|
- offset +=
|
|
|
- qed_grc_dump_reg_entry(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- dump_buf + offset,
|
|
|
- dump,
|
|
|
- addr,
|
|
|
- 1);
|
|
|
- num_reg_entries += 2;
|
|
|
- }
|
|
|
+ if (eval_mode &&
|
|
|
+ !qed_is_mode_match(p_hwfn, &modes_buf_offset))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ /* Mode match: read & dump registers */
|
|
|
+ addr = reg_data->mask_address;
|
|
|
+ offset += qed_grc_dump_reg_entry(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump,
|
|
|
+ addr,
|
|
|
+ 1, false);
|
|
|
+ addr = GET_FIELD(reg_data->data,
|
|
|
+ DBG_ATTN_REG_STS_ADDRESS);
|
|
|
+ offset += qed_grc_dump_reg_entry(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump,
|
|
|
+ addr,
|
|
|
+ 1, false);
|
|
|
+ num_reg_entries += 2;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* Write storm stall status registers */
|
|
|
+ /* Write Storm stall status registers */
|
|
|
for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
|
|
|
+ struct storm_defs *storm = &s_storm_defs[storm_id];
|
|
|
u32 addr;
|
|
|
|
|
|
- if (dev_data->block_in_reset[s_storm_defs[storm_id].block_id] &&
|
|
|
- dump)
|
|
|
+ if (dev_data->block_in_reset[storm->block_id] && dump)
|
|
|
continue;
|
|
|
|
|
|
addr =
|
|
@@ -2589,7 +2864,8 @@ static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn,
|
|
|
dump_buf + offset,
|
|
|
dump,
|
|
|
addr,
|
|
|
- 1);
|
|
|
+ 1,
|
|
|
+ false);
|
|
|
num_reg_entries++;
|
|
|
}
|
|
|
|
|
@@ -2598,6 +2874,7 @@ static u32 qed_grc_dump_modified_regs(struct qed_hwfn *p_hwfn,
|
|
|
qed_grc_dump_regs_hdr(dump_buf,
|
|
|
true,
|
|
|
num_reg_entries, "eng", -1, NULL, NULL);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
@@ -2637,17 +2914,17 @@ static u32 qed_grc_dump_special_regs(struct qed_hwfn *p_hwfn,
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
|
-/* Dumps a GRC memory header (section and params).
|
|
|
- * The following parameters are dumped:
|
|
|
- * name - name is dumped only if it's not NULL.
|
|
|
- * addr - addr is dumped only if name is NULL.
|
|
|
- * len - len is always dumped.
|
|
|
- * width - bit_width is dumped if it's not zero.
|
|
|
- * packed - packed=1 is dumped if it's not false.
|
|
|
- * mem_group - mem_group is always dumped.
|
|
|
- * is_storm - true only if the memory is related to a Storm.
|
|
|
- * storm_letter - storm letter (valid only if is_storm is true).
|
|
|
- * Returns the dumped size in dwords.
|
|
|
+/* Dumps a GRC memory header (section and params). Returns the dumped size in
|
|
|
+ * dwords. The following parameters are dumped:
|
|
|
+ * - name: dumped only if it's not NULL.
|
|
|
+ * - addr: in dwords, dumped only if name is NULL.
|
|
|
+ * - len: in dwords, always dumped.
|
|
|
+ * - width: dumped if it's not zero.
|
|
|
+ * - packed: dumped only if it's not false.
|
|
|
+ * - mem_group: always dumped.
|
|
|
+ * - is_storm: true only if the memory is related to a Storm.
|
|
|
+ * - storm_letter: valid only if is_storm is true.
|
|
|
+ *
|
|
|
*/
|
|
|
static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn,
|
|
|
u32 *dump_buf,
|
|
@@ -2667,6 +2944,7 @@ static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn,
|
|
|
if (!len)
|
|
|
DP_NOTICE(p_hwfn,
|
|
|
"Unexpected GRC Dump error: dumped memory size must be non-zero\n");
|
|
|
+
|
|
|
if (bit_width)
|
|
|
num_params++;
|
|
|
if (packed)
|
|
@@ -2675,6 +2953,7 @@ static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn,
|
|
|
/* Dump section header */
|
|
|
offset += qed_dump_section_hdr(dump_buf + offset,
|
|
|
dump, "grc_mem", num_params);
|
|
|
+
|
|
|
if (name) {
|
|
|
/* Dump name */
|
|
|
if (is_storm) {
|
|
@@ -2694,14 +2973,15 @@ static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn,
|
|
|
len, buf);
|
|
|
} else {
|
|
|
/* Dump address */
|
|
|
+ u32 addr_in_bytes = DWORDS_TO_BYTES(addr);
|
|
|
+
|
|
|
offset += qed_dump_num_param(dump_buf + offset,
|
|
|
- dump, "addr",
|
|
|
- DWORDS_TO_BYTES(addr));
|
|
|
+ dump, "addr", addr_in_bytes);
|
|
|
if (dump && len > 64)
|
|
|
DP_VERBOSE(p_hwfn,
|
|
|
QED_MSG_DEBUG,
|
|
|
"Dumping %d registers from address 0x%x...\n",
|
|
|
- len, (u32)DWORDS_TO_BYTES(addr));
|
|
|
+ len, addr_in_bytes);
|
|
|
}
|
|
|
|
|
|
/* Dump len */
|
|
@@ -2727,11 +3007,13 @@ static u32 qed_grc_dump_mem_hdr(struct qed_hwfn *p_hwfn,
|
|
|
}
|
|
|
|
|
|
offset += qed_dump_str_param(dump_buf + offset, dump, "type", buf);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
|
/* Dumps a single GRC memory. If name is NULL, the memory is stored by address.
|
|
|
* Returns the dumped size in dwords.
|
|
|
+ * The addr and len arguments are specified in dwords.
|
|
|
*/
|
|
|
static u32 qed_grc_dump_mem(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
@@ -2740,6 +3022,7 @@ static u32 qed_grc_dump_mem(struct qed_hwfn *p_hwfn,
|
|
|
const char *name,
|
|
|
u32 addr,
|
|
|
u32 len,
|
|
|
+ bool wide_bus,
|
|
|
u32 bit_width,
|
|
|
bool packed,
|
|
|
const char *mem_group,
|
|
@@ -2758,7 +3041,9 @@ static u32 qed_grc_dump_mem(struct qed_hwfn *p_hwfn,
|
|
|
mem_group, is_storm, storm_letter);
|
|
|
offset += qed_grc_dump_addr_range(p_hwfn,
|
|
|
p_ptt,
|
|
|
- dump_buf + offset, dump, addr, len);
|
|
|
+ dump_buf + offset,
|
|
|
+ dump, addr, len, wide_bus);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
@@ -2773,20 +3058,21 @@ static u32 qed_grc_dump_mem_entries(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
while (input_offset < input_mems_arr.size_in_dwords) {
|
|
|
const struct dbg_dump_cond_hdr *cond_hdr;
|
|
|
+ u16 modes_buf_offset;
|
|
|
u32 num_entries;
|
|
|
bool eval_mode;
|
|
|
|
|
|
cond_hdr = (const struct dbg_dump_cond_hdr *)
|
|
|
&input_mems_arr.ptr[input_offset++];
|
|
|
- eval_mode = GET_FIELD(cond_hdr->mode.data,
|
|
|
- DBG_MODE_HDR_EVAL_MODE) > 0;
|
|
|
+ num_entries = cond_hdr->data_size / MEM_DUMP_ENTRY_SIZE_DWORDS;
|
|
|
|
|
|
/* Check required mode */
|
|
|
+ eval_mode = GET_FIELD(cond_hdr->mode.data,
|
|
|
+ DBG_MODE_HDR_EVAL_MODE) > 0;
|
|
|
if (eval_mode) {
|
|
|
- u16 modes_buf_offset =
|
|
|
+ modes_buf_offset =
|
|
|
GET_FIELD(cond_hdr->mode.data,
|
|
|
DBG_MODE_HDR_MODES_BUF_OFFSET);
|
|
|
-
|
|
|
mode_match = qed_is_mode_match(p_hwfn,
|
|
|
&modes_buf_offset);
|
|
|
}
|
|
@@ -2796,81 +3082,87 @@ static u32 qed_grc_dump_mem_entries(struct qed_hwfn *p_hwfn,
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- num_entries = cond_hdr->data_size / MEM_DUMP_ENTRY_SIZE_DWORDS;
|
|
|
for (i = 0; i < num_entries;
|
|
|
i++, input_offset += MEM_DUMP_ENTRY_SIZE_DWORDS) {
|
|
|
const struct dbg_dump_mem *mem =
|
|
|
(const struct dbg_dump_mem *)
|
|
|
&input_mems_arr.ptr[input_offset];
|
|
|
- u8 mem_group_id;
|
|
|
+ u8 mem_group_id = GET_FIELD(mem->dword0,
|
|
|
+ DBG_DUMP_MEM_MEM_GROUP_ID);
|
|
|
+ bool is_storm = false, mem_wide_bus;
|
|
|
+ enum dbg_grc_params grc_param;
|
|
|
+ char storm_letter = 'a';
|
|
|
+ enum block_id block_id;
|
|
|
+ u32 mem_addr, mem_len;
|
|
|
|
|
|
- mem_group_id = GET_FIELD(mem->dword0,
|
|
|
- DBG_DUMP_MEM_MEM_GROUP_ID);
|
|
|
if (mem_group_id >= MEM_GROUPS_NUM) {
|
|
|
DP_NOTICE(p_hwfn, "Invalid mem_group_id\n");
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- if (qed_grc_is_mem_included(p_hwfn,
|
|
|
- (enum block_id)cond_hdr->block_id,
|
|
|
- mem_group_id)) {
|
|
|
- u32 mem_addr = GET_FIELD(mem->dword0,
|
|
|
- DBG_DUMP_MEM_ADDRESS);
|
|
|
- u32 mem_len = GET_FIELD(mem->dword1,
|
|
|
- DBG_DUMP_MEM_LENGTH);
|
|
|
- enum dbg_grc_params grc_param;
|
|
|
- char storm_letter = 'a';
|
|
|
- bool is_storm = false;
|
|
|
-
|
|
|
- /* Update memory length for CCFC/TCFC memories
|
|
|
- * according to number of LCIDs/LTIDs.
|
|
|
- */
|
|
|
- if (mem_group_id == MEM_GROUP_CONN_CFC_MEM) {
|
|
|
- if (mem_len % MAX_LCIDS != 0) {
|
|
|
- DP_NOTICE(p_hwfn,
|
|
|
- "Invalid CCFC connection memory size\n");
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- grc_param = DBG_GRC_PARAM_NUM_LCIDS;
|
|
|
- mem_len = qed_grc_get_param(p_hwfn,
|
|
|
- grc_param) *
|
|
|
- (mem_len / MAX_LCIDS);
|
|
|
- } else if (mem_group_id ==
|
|
|
- MEM_GROUP_TASK_CFC_MEM) {
|
|
|
- if (mem_len % MAX_LTIDS != 0) {
|
|
|
- DP_NOTICE(p_hwfn,
|
|
|
- "Invalid TCFC task memory size\n");
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- grc_param = DBG_GRC_PARAM_NUM_LTIDS;
|
|
|
- mem_len = qed_grc_get_param(p_hwfn,
|
|
|
- grc_param) *
|
|
|
- (mem_len / MAX_LTIDS);
|
|
|
+ block_id = (enum block_id)cond_hdr->block_id;
|
|
|
+ if (!qed_grc_is_mem_included(p_hwfn,
|
|
|
+ block_id,
|
|
|
+ mem_group_id))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ mem_addr = GET_FIELD(mem->dword0, DBG_DUMP_MEM_ADDRESS);
|
|
|
+ mem_len = GET_FIELD(mem->dword1, DBG_DUMP_MEM_LENGTH);
|
|
|
+ mem_wide_bus = GET_FIELD(mem->dword1,
|
|
|
+ DBG_DUMP_MEM_WIDE_BUS);
|
|
|
+
|
|
|
+ /* Update memory length for CCFC/TCFC memories
|
|
|
+ * according to number of LCIDs/LTIDs.
|
|
|
+ */
|
|
|
+ if (mem_group_id == MEM_GROUP_CONN_CFC_MEM) {
|
|
|
+ if (mem_len % MAX_LCIDS) {
|
|
|
+ DP_NOTICE(p_hwfn,
|
|
|
+ "Invalid CCFC connection memory size\n");
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- /* If memory is associated with Storm, update
|
|
|
- * Storm details.
|
|
|
- */
|
|
|
- if (s_block_defs[cond_hdr->block_id]->
|
|
|
- associated_to_storm) {
|
|
|
- is_storm = true;
|
|
|
- storm_letter =
|
|
|
- s_storm_defs[s_block_defs[
|
|
|
- cond_hdr->block_id]->
|
|
|
- storm_id].letter;
|
|
|
+ grc_param = DBG_GRC_PARAM_NUM_LCIDS;
|
|
|
+ mem_len = qed_grc_get_param(p_hwfn, grc_param) *
|
|
|
+ (mem_len / MAX_LCIDS);
|
|
|
+ } else if (mem_group_id == MEM_GROUP_TASK_CFC_MEM) {
|
|
|
+ if (mem_len % MAX_LTIDS) {
|
|
|
+ DP_NOTICE(p_hwfn,
|
|
|
+ "Invalid TCFC task memory size\n");
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- /* Dump memory */
|
|
|
- offset += qed_grc_dump_mem(p_hwfn, p_ptt,
|
|
|
- dump_buf + offset, dump, NULL,
|
|
|
- mem_addr, mem_len, 0,
|
|
|
+ grc_param = DBG_GRC_PARAM_NUM_LTIDS;
|
|
|
+ mem_len = qed_grc_get_param(p_hwfn, grc_param) *
|
|
|
+ (mem_len / MAX_LTIDS);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* If memory is associated with Storm, update Storm
|
|
|
+ * details.
|
|
|
+ */
|
|
|
+ if (s_block_defs
|
|
|
+ [cond_hdr->block_id]->associated_to_storm) {
|
|
|
+ is_storm = true;
|
|
|
+ storm_letter =
|
|
|
+ s_storm_defs[s_block_defs
|
|
|
+ [cond_hdr->block_id]->
|
|
|
+ storm_id].letter;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Dump memory */
|
|
|
+ offset += qed_grc_dump_mem(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump,
|
|
|
+ NULL,
|
|
|
+ mem_addr,
|
|
|
+ mem_len,
|
|
|
+ mem_wide_bus,
|
|
|
+ 0,
|
|
|
false,
|
|
|
s_mem_group_names[mem_group_id],
|
|
|
- is_storm, storm_letter);
|
|
|
- }
|
|
|
- }
|
|
|
+ is_storm,
|
|
|
+ storm_letter);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return offset;
|
|
@@ -2887,16 +3179,22 @@ static u32 qed_grc_dump_memories(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
while (input_offset <
|
|
|
s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].size_in_dwords) {
|
|
|
- const struct dbg_dump_split_hdr *split_hdr =
|
|
|
- (const struct dbg_dump_split_hdr *)
|
|
|
+ const struct dbg_dump_split_hdr *split_hdr;
|
|
|
+ struct dbg_array curr_input_mems_arr;
|
|
|
+ u32 split_data_size;
|
|
|
+ u8 split_type_id;
|
|
|
+
|
|
|
+ split_hdr = (const struct dbg_dump_split_hdr *)
|
|
|
&s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr[input_offset++];
|
|
|
- u8 split_type_id = GET_FIELD(split_hdr->hdr,
|
|
|
- DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
|
|
|
- u32 split_data_size = GET_FIELD(split_hdr->hdr,
|
|
|
- DBG_DUMP_SPLIT_HDR_DATA_SIZE);
|
|
|
- struct dbg_array curr_input_mems_arr = {
|
|
|
- &s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr[input_offset],
|
|
|
- split_data_size};
|
|
|
+ split_type_id =
|
|
|
+ GET_FIELD(split_hdr->hdr,
|
|
|
+ DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
|
|
|
+ split_data_size =
|
|
|
+ GET_FIELD(split_hdr->hdr,
|
|
|
+ DBG_DUMP_SPLIT_HDR_DATA_SIZE);
|
|
|
+ curr_input_mems_arr.ptr =
|
|
|
+ &s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr[input_offset];
|
|
|
+ curr_input_mems_arr.size_in_dwords = split_data_size;
|
|
|
|
|
|
switch (split_type_id) {
|
|
|
case SPLIT_TYPE_NONE:
|
|
@@ -2906,6 +3204,7 @@ static u32 qed_grc_dump_memories(struct qed_hwfn *p_hwfn,
|
|
|
dump_buf + offset,
|
|
|
dump);
|
|
|
break;
|
|
|
+
|
|
|
default:
|
|
|
DP_NOTICE(p_hwfn,
|
|
|
"Dumping split memories is currently not supported\n");
|
|
@@ -2920,6 +3219,7 @@ static u32 qed_grc_dump_memories(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Dumps GRC context data for the specified Storm.
|
|
|
* Returns the dumped size in dwords.
|
|
|
+ * The lid_size argument is specified in quad-regs.
|
|
|
*/
|
|
|
static u32 qed_grc_dump_ctx_data(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
@@ -2931,13 +3231,15 @@ static u32 qed_grc_dump_ctx_data(struct qed_hwfn *p_hwfn,
|
|
|
u32 rd_reg_addr,
|
|
|
u8 storm_id)
|
|
|
{
|
|
|
- u32 i, lid, total_size;
|
|
|
- u32 offset = 0;
|
|
|
+ struct storm_defs *storm = &s_storm_defs[storm_id];
|
|
|
+ u32 i, lid, total_size, offset = 0;
|
|
|
|
|
|
if (!lid_size)
|
|
|
return 0;
|
|
|
+
|
|
|
lid_size *= BYTES_IN_DWORD;
|
|
|
total_size = num_lids * lid_size;
|
|
|
+
|
|
|
offset += qed_grc_dump_mem_hdr(p_hwfn,
|
|
|
dump_buf + offset,
|
|
|
dump,
|
|
@@ -2945,25 +3247,19 @@ static u32 qed_grc_dump_ctx_data(struct qed_hwfn *p_hwfn,
|
|
|
0,
|
|
|
total_size,
|
|
|
lid_size * 32,
|
|
|
- false,
|
|
|
- name,
|
|
|
- true, s_storm_defs[storm_id].letter);
|
|
|
+ false, name, true, storm->letter);
|
|
|
+
|
|
|
+ if (!dump)
|
|
|
+ return offset + total_size;
|
|
|
|
|
|
/* Dump context data */
|
|
|
- if (dump) {
|
|
|
- for (lid = 0; lid < num_lids; lid++) {
|
|
|
- for (i = 0; i < lid_size; i++, offset++) {
|
|
|
- qed_wr(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- s_storm_defs[storm_id].cm_ctx_wr_addr,
|
|
|
- BIT(9) | lid);
|
|
|
- *(dump_buf + offset) = qed_rd(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- rd_reg_addr);
|
|
|
- }
|
|
|
+ for (lid = 0; lid < num_lids; lid++) {
|
|
|
+ for (i = 0; i < lid_size; i++, offset++) {
|
|
|
+ qed_wr(p_hwfn,
|
|
|
+ p_ptt, storm->cm_ctx_wr_addr, (i << 9) | lid);
|
|
|
+ *(dump_buf + offset) = qed_rd(p_hwfn,
|
|
|
+ p_ptt, rd_reg_addr);
|
|
|
}
|
|
|
- } else {
|
|
|
- offset += total_size;
|
|
|
}
|
|
|
|
|
|
return offset;
|
|
@@ -2973,15 +3269,19 @@ static u32 qed_grc_dump_ctx_data(struct qed_hwfn *p_hwfn,
|
|
|
static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
|
|
|
{
|
|
|
+ enum dbg_grc_params grc_param;
|
|
|
u32 offset = 0;
|
|
|
u8 storm_id;
|
|
|
|
|
|
for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
|
|
|
+ struct storm_defs *storm = &s_storm_defs[storm_id];
|
|
|
+
|
|
|
if (!qed_grc_is_storm_included(p_hwfn,
|
|
|
(enum dbg_storms)storm_id))
|
|
|
continue;
|
|
|
|
|
|
/* Dump Conn AG context size */
|
|
|
+ grc_param = DBG_GRC_PARAM_NUM_LCIDS;
|
|
|
offset +=
|
|
|
qed_grc_dump_ctx_data(p_hwfn,
|
|
|
p_ptt,
|
|
@@ -2989,14 +3289,13 @@ static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn,
|
|
|
dump,
|
|
|
"CONN_AG_CTX",
|
|
|
qed_grc_get_param(p_hwfn,
|
|
|
- DBG_GRC_PARAM_NUM_LCIDS),
|
|
|
- s_storm_defs[storm_id].
|
|
|
- cm_conn_ag_ctx_lid_size,
|
|
|
- s_storm_defs[storm_id].
|
|
|
- cm_conn_ag_ctx_rd_addr,
|
|
|
+ grc_param),
|
|
|
+ storm->cm_conn_ag_ctx_lid_size,
|
|
|
+ storm->cm_conn_ag_ctx_rd_addr,
|
|
|
storm_id);
|
|
|
|
|
|
/* Dump Conn ST context size */
|
|
|
+ grc_param = DBG_GRC_PARAM_NUM_LCIDS;
|
|
|
offset +=
|
|
|
qed_grc_dump_ctx_data(p_hwfn,
|
|
|
p_ptt,
|
|
@@ -3004,14 +3303,13 @@ static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn,
|
|
|
dump,
|
|
|
"CONN_ST_CTX",
|
|
|
qed_grc_get_param(p_hwfn,
|
|
|
- DBG_GRC_PARAM_NUM_LCIDS),
|
|
|
- s_storm_defs[storm_id].
|
|
|
- cm_conn_st_ctx_lid_size,
|
|
|
- s_storm_defs[storm_id].
|
|
|
- cm_conn_st_ctx_rd_addr,
|
|
|
+ grc_param),
|
|
|
+ storm->cm_conn_st_ctx_lid_size,
|
|
|
+ storm->cm_conn_st_ctx_rd_addr,
|
|
|
storm_id);
|
|
|
|
|
|
/* Dump Task AG context size */
|
|
|
+ grc_param = DBG_GRC_PARAM_NUM_LTIDS;
|
|
|
offset +=
|
|
|
qed_grc_dump_ctx_data(p_hwfn,
|
|
|
p_ptt,
|
|
@@ -3019,14 +3317,13 @@ static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn,
|
|
|
dump,
|
|
|
"TASK_AG_CTX",
|
|
|
qed_grc_get_param(p_hwfn,
|
|
|
- DBG_GRC_PARAM_NUM_LTIDS),
|
|
|
- s_storm_defs[storm_id].
|
|
|
- cm_task_ag_ctx_lid_size,
|
|
|
- s_storm_defs[storm_id].
|
|
|
- cm_task_ag_ctx_rd_addr,
|
|
|
+ grc_param),
|
|
|
+ storm->cm_task_ag_ctx_lid_size,
|
|
|
+ storm->cm_task_ag_ctx_rd_addr,
|
|
|
storm_id);
|
|
|
|
|
|
/* Dump Task ST context size */
|
|
|
+ grc_param = DBG_GRC_PARAM_NUM_LTIDS;
|
|
|
offset +=
|
|
|
qed_grc_dump_ctx_data(p_hwfn,
|
|
|
p_ptt,
|
|
@@ -3034,11 +3331,9 @@ static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn,
|
|
|
dump,
|
|
|
"TASK_ST_CTX",
|
|
|
qed_grc_get_param(p_hwfn,
|
|
|
- DBG_GRC_PARAM_NUM_LTIDS),
|
|
|
- s_storm_defs[storm_id].
|
|
|
- cm_task_st_ctx_lid_size,
|
|
|
- s_storm_defs[storm_id].
|
|
|
- cm_task_st_ctx_rd_addr,
|
|
|
+ grc_param),
|
|
|
+ storm->cm_task_st_ctx_lid_size,
|
|
|
+ storm->cm_task_st_ctx_rd_addr,
|
|
|
storm_id);
|
|
|
}
|
|
|
|
|
@@ -3050,8 +3345,8 @@ static u32 qed_grc_dump_iors(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
|
|
|
{
|
|
|
char buf[10] = "IOR_SET_?";
|
|
|
+ u32 addr, offset = 0;
|
|
|
u8 storm_id, set_id;
|
|
|
- u32 offset = 0;
|
|
|
|
|
|
for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
|
|
|
struct storm_defs *storm = &s_storm_defs[storm_id];
|
|
@@ -3061,11 +3356,9 @@ static u32 qed_grc_dump_iors(struct qed_hwfn *p_hwfn,
|
|
|
continue;
|
|
|
|
|
|
for (set_id = 0; set_id < NUM_IOR_SETS; set_id++) {
|
|
|
- u32 dwords, addr;
|
|
|
-
|
|
|
- dwords = storm->sem_fast_mem_addr +
|
|
|
- SEM_FAST_REG_STORM_REG_FILE;
|
|
|
- addr = BYTES_TO_DWORDS(dwords) + IOR_SET_OFFSET(set_id);
|
|
|
+ addr = BYTES_TO_DWORDS(storm->sem_fast_mem_addr +
|
|
|
+ SEM_FAST_REG_STORM_REG_FILE) +
|
|
|
+ IOR_SET_OFFSET(set_id);
|
|
|
buf[strlen(buf) - 1] = '0' + set_id;
|
|
|
offset += qed_grc_dump_mem(p_hwfn,
|
|
|
p_ptt,
|
|
@@ -3074,6 +3367,7 @@ static u32 qed_grc_dump_iors(struct qed_hwfn *p_hwfn,
|
|
|
buf,
|
|
|
addr,
|
|
|
IORS_PER_SET,
|
|
|
+ false,
|
|
|
32,
|
|
|
false,
|
|
|
"ior",
|
|
@@ -3091,10 +3385,10 @@ static u32 qed_grc_dump_vfc_cam(struct qed_hwfn *p_hwfn,
|
|
|
u32 *dump_buf, bool dump, u8 storm_id)
|
|
|
{
|
|
|
u32 total_size = VFC_CAM_NUM_ROWS * VFC_CAM_RESP_DWORDS;
|
|
|
+ struct storm_defs *storm = &s_storm_defs[storm_id];
|
|
|
u32 cam_addr[VFC_CAM_ADDR_DWORDS] = { 0 };
|
|
|
u32 cam_cmd[VFC_CAM_CMD_DWORDS] = { 0 };
|
|
|
- u32 offset = 0;
|
|
|
- u32 row, i;
|
|
|
+ u32 row, i, offset = 0;
|
|
|
|
|
|
offset += qed_grc_dump_mem_hdr(p_hwfn,
|
|
|
dump_buf + offset,
|
|
@@ -3103,38 +3397,34 @@ static u32 qed_grc_dump_vfc_cam(struct qed_hwfn *p_hwfn,
|
|
|
0,
|
|
|
total_size,
|
|
|
256,
|
|
|
- false,
|
|
|
- "vfc_cam",
|
|
|
- true, s_storm_defs[storm_id].letter);
|
|
|
- if (dump) {
|
|
|
- /* Prepare CAM address */
|
|
|
- SET_VAR_FIELD(cam_addr, VFC_CAM_ADDR, OP, VFC_OPCODE_CAM_RD);
|
|
|
- for (row = 0; row < VFC_CAM_NUM_ROWS;
|
|
|
- row++, offset += VFC_CAM_RESP_DWORDS) {
|
|
|
- /* Write VFC CAM command */
|
|
|
- SET_VAR_FIELD(cam_cmd, VFC_CAM_CMD, ROW, row);
|
|
|
- ARR_REG_WR(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- s_storm_defs[storm_id].sem_fast_mem_addr +
|
|
|
- SEM_FAST_REG_VFC_DATA_WR,
|
|
|
- cam_cmd, VFC_CAM_CMD_DWORDS);
|
|
|
+ false, "vfc_cam", true, storm->letter);
|
|
|
|
|
|
- /* Write VFC CAM address */
|
|
|
- ARR_REG_WR(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- s_storm_defs[storm_id].sem_fast_mem_addr +
|
|
|
- SEM_FAST_REG_VFC_ADDR,
|
|
|
- cam_addr, VFC_CAM_ADDR_DWORDS);
|
|
|
+ if (!dump)
|
|
|
+ return offset + total_size;
|
|
|
|
|
|
- /* Read VFC CAM read response */
|
|
|
- ARR_REG_RD(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- s_storm_defs[storm_id].sem_fast_mem_addr +
|
|
|
- SEM_FAST_REG_VFC_DATA_RD,
|
|
|
- dump_buf + offset, VFC_CAM_RESP_DWORDS);
|
|
|
- }
|
|
|
- } else {
|
|
|
- offset += total_size;
|
|
|
+ /* Prepare CAM address */
|
|
|
+ SET_VAR_FIELD(cam_addr, VFC_CAM_ADDR, OP, VFC_OPCODE_CAM_RD);
|
|
|
+
|
|
|
+ for (row = 0; row < VFC_CAM_NUM_ROWS;
|
|
|
+ row++, offset += VFC_CAM_RESP_DWORDS) {
|
|
|
+ /* Write VFC CAM command */
|
|
|
+ SET_VAR_FIELD(cam_cmd, VFC_CAM_CMD, ROW, row);
|
|
|
+ ARR_REG_WR(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_WR,
|
|
|
+ cam_cmd, VFC_CAM_CMD_DWORDS);
|
|
|
+
|
|
|
+ /* Write VFC CAM address */
|
|
|
+ ARR_REG_WR(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_ADDR,
|
|
|
+ cam_addr, VFC_CAM_ADDR_DWORDS);
|
|
|
+
|
|
|
+ /* Read VFC CAM read response */
|
|
|
+ ARR_REG_RD(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_RD,
|
|
|
+ dump_buf + offset, VFC_CAM_RESP_DWORDS);
|
|
|
}
|
|
|
|
|
|
return offset;
|
|
@@ -3148,10 +3438,10 @@ static u32 qed_grc_dump_vfc_ram(struct qed_hwfn *p_hwfn,
|
|
|
u8 storm_id, struct vfc_ram_defs *ram_defs)
|
|
|
{
|
|
|
u32 total_size = ram_defs->num_rows * VFC_RAM_RESP_DWORDS;
|
|
|
+ struct storm_defs *storm = &s_storm_defs[storm_id];
|
|
|
u32 ram_addr[VFC_RAM_ADDR_DWORDS] = { 0 };
|
|
|
u32 ram_cmd[VFC_RAM_CMD_DWORDS] = { 0 };
|
|
|
- u32 offset = 0;
|
|
|
- u32 row, i;
|
|
|
+ u32 row, i, offset = 0;
|
|
|
|
|
|
offset += qed_grc_dump_mem_hdr(p_hwfn,
|
|
|
dump_buf + offset,
|
|
@@ -3162,7 +3452,7 @@ static u32 qed_grc_dump_vfc_ram(struct qed_hwfn *p_hwfn,
|
|
|
256,
|
|
|
false,
|
|
|
ram_defs->type_name,
|
|
|
- true, s_storm_defs[storm_id].letter);
|
|
|
+ true, storm->letter);
|
|
|
|
|
|
/* Prepare RAM address */
|
|
|
SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, OP, VFC_OPCODE_RAM_RD);
|
|
@@ -3176,23 +3466,20 @@ static u32 qed_grc_dump_vfc_ram(struct qed_hwfn *p_hwfn,
|
|
|
/* Write VFC RAM command */
|
|
|
ARR_REG_WR(p_hwfn,
|
|
|
p_ptt,
|
|
|
- s_storm_defs[storm_id].sem_fast_mem_addr +
|
|
|
- SEM_FAST_REG_VFC_DATA_WR,
|
|
|
+ storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_WR,
|
|
|
ram_cmd, VFC_RAM_CMD_DWORDS);
|
|
|
|
|
|
/* Write VFC RAM address */
|
|
|
SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, ROW, row);
|
|
|
ARR_REG_WR(p_hwfn,
|
|
|
p_ptt,
|
|
|
- s_storm_defs[storm_id].sem_fast_mem_addr +
|
|
|
- SEM_FAST_REG_VFC_ADDR,
|
|
|
+ storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_ADDR,
|
|
|
ram_addr, VFC_RAM_ADDR_DWORDS);
|
|
|
|
|
|
/* Read VFC RAM read response */
|
|
|
ARR_REG_RD(p_hwfn,
|
|
|
p_ptt,
|
|
|
- s_storm_defs[storm_id].sem_fast_mem_addr +
|
|
|
- SEM_FAST_REG_VFC_DATA_RD,
|
|
|
+ storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_RD,
|
|
|
dump_buf + offset, VFC_RAM_RESP_DWORDS);
|
|
|
}
|
|
|
|
|
@@ -3208,28 +3495,27 @@ static u32 qed_grc_dump_vfc(struct qed_hwfn *p_hwfn,
|
|
|
u32 offset = 0;
|
|
|
|
|
|
for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
|
|
|
- if (qed_grc_is_storm_included(p_hwfn,
|
|
|
- (enum dbg_storms)storm_id) &&
|
|
|
- s_storm_defs[storm_id].has_vfc &&
|
|
|
- (storm_id != DBG_PSTORM_ID ||
|
|
|
- dev_data->platform_id == PLATFORM_ASIC)) {
|
|
|
- /* Read CAM */
|
|
|
- offset += qed_grc_dump_vfc_cam(p_hwfn,
|
|
|
+ if (!qed_grc_is_storm_included(p_hwfn,
|
|
|
+ (enum dbg_storms)storm_id) ||
|
|
|
+ !s_storm_defs[storm_id].has_vfc ||
|
|
|
+ (storm_id == DBG_PSTORM_ID && dev_data->platform_id !=
|
|
|
+ PLATFORM_ASIC))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ /* Read CAM */
|
|
|
+ offset += qed_grc_dump_vfc_cam(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump, storm_id);
|
|
|
+
|
|
|
+ /* Read RAM */
|
|
|
+ for (i = 0; i < NUM_VFC_RAM_TYPES; i++)
|
|
|
+ offset += qed_grc_dump_vfc_ram(p_hwfn,
|
|
|
p_ptt,
|
|
|
dump_buf + offset,
|
|
|
- dump, storm_id);
|
|
|
-
|
|
|
- /* Read RAM */
|
|
|
- for (i = 0; i < NUM_VFC_RAM_TYPES; i++)
|
|
|
- offset += qed_grc_dump_vfc_ram(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- dump_buf +
|
|
|
- offset,
|
|
|
- dump,
|
|
|
- storm_id,
|
|
|
- &s_vfc_ram_defs
|
|
|
- [i]);
|
|
|
- }
|
|
|
+ dump,
|
|
|
+ storm_id,
|
|
|
+ &s_vfc_ram_defs[i]);
|
|
|
}
|
|
|
|
|
|
return offset;
|
|
@@ -3244,14 +3530,17 @@ static u32 qed_grc_dump_rss(struct qed_hwfn *p_hwfn,
|
|
|
u8 rss_mem_id;
|
|
|
|
|
|
for (rss_mem_id = 0; rss_mem_id < NUM_RSS_MEM_TYPES; rss_mem_id++) {
|
|
|
- struct rss_mem_defs *rss_defs = &s_rss_mem_defs[rss_mem_id];
|
|
|
- u32 num_entries = rss_defs->num_entries[dev_data->chip_id];
|
|
|
- u32 entry_width = rss_defs->entry_width[dev_data->chip_id];
|
|
|
- u32 total_dwords = (num_entries * entry_width) / 32;
|
|
|
- u32 size = RSS_REG_RSS_RAM_DATA_SIZE;
|
|
|
- bool packed = (entry_width == 16);
|
|
|
- u32 rss_addr = rss_defs->addr;
|
|
|
- u32 i, addr;
|
|
|
+ u32 rss_addr, num_entries, entry_width, total_dwords, i;
|
|
|
+ struct rss_mem_defs *rss_defs;
|
|
|
+ u32 addr, size;
|
|
|
+ bool packed;
|
|
|
+
|
|
|
+ rss_defs = &s_rss_mem_defs[rss_mem_id];
|
|
|
+ rss_addr = rss_defs->addr;
|
|
|
+ num_entries = rss_defs->num_entries[dev_data->chip_id];
|
|
|
+ entry_width = rss_defs->entry_width[dev_data->chip_id];
|
|
|
+ total_dwords = (num_entries * entry_width) / 32;
|
|
|
+ packed = (entry_width == 16);
|
|
|
|
|
|
offset += qed_grc_dump_mem_hdr(p_hwfn,
|
|
|
dump_buf + offset,
|
|
@@ -3263,23 +3552,23 @@ static u32 qed_grc_dump_rss(struct qed_hwfn *p_hwfn,
|
|
|
packed,
|
|
|
rss_defs->type_name, false, 0);
|
|
|
|
|
|
+ /* Dump RSS data */
|
|
|
if (!dump) {
|
|
|
offset += total_dwords;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- /* Dump RSS data */
|
|
|
- for (i = 0; i < total_dwords;
|
|
|
- i += RSS_REG_RSS_RAM_DATA_SIZE, rss_addr++) {
|
|
|
- addr = BYTES_TO_DWORDS(RSS_REG_RSS_RAM_DATA);
|
|
|
+ addr = BYTES_TO_DWORDS(RSS_REG_RSS_RAM_DATA);
|
|
|
+ size = RSS_REG_RSS_RAM_DATA_SIZE;
|
|
|
+ for (i = 0; i < total_dwords; i += size, rss_addr++) {
|
|
|
qed_wr(p_hwfn, p_ptt, RSS_REG_RSS_RAM_ADDR, rss_addr);
|
|
|
- offset += qed_grc_dump_addr_range(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- dump_buf +
|
|
|
- offset,
|
|
|
- dump,
|
|
|
- addr,
|
|
|
- size);
|
|
|
+ offset += qed_grc_dump_addr_range(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump,
|
|
|
+ addr,
|
|
|
+ size,
|
|
|
+ false);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3316,10 +3605,11 @@ static u32 qed_grc_dump_big_ram(struct qed_hwfn *p_hwfn,
|
|
|
BIG_RAM_BLOCK_SIZE_BYTES * 8,
|
|
|
false, type_name, false, 0);
|
|
|
|
|
|
+ /* Read and dump Big RAM data */
|
|
|
if (!dump)
|
|
|
return offset + ram_size;
|
|
|
|
|
|
- /* Read and dump Big RAM data */
|
|
|
+ /* Dump Big RAM */
|
|
|
for (i = 0; i < total_blocks / 2; i++) {
|
|
|
u32 addr, len;
|
|
|
|
|
@@ -3331,7 +3621,8 @@ static u32 qed_grc_dump_big_ram(struct qed_hwfn *p_hwfn,
|
|
|
dump_buf + offset,
|
|
|
dump,
|
|
|
addr,
|
|
|
- len);
|
|
|
+ len,
|
|
|
+ false);
|
|
|
}
|
|
|
|
|
|
return offset;
|
|
@@ -3359,7 +3650,7 @@ static u32 qed_grc_dump_mcp(struct qed_hwfn *p_hwfn,
|
|
|
NULL,
|
|
|
BYTES_TO_DWORDS(MCP_REG_SCRATCH),
|
|
|
MCP_REG_SCRATCH_SIZE,
|
|
|
- 0, false, "MCP", false, 0);
|
|
|
+ false, 0, false, "MCP", false, 0);
|
|
|
|
|
|
/* Dump MCP cpu_reg_file */
|
|
|
offset += qed_grc_dump_mem(p_hwfn,
|
|
@@ -3369,7 +3660,7 @@ static u32 qed_grc_dump_mcp(struct qed_hwfn *p_hwfn,
|
|
|
NULL,
|
|
|
BYTES_TO_DWORDS(MCP_REG_CPU_REG_FILE),
|
|
|
MCP_REG_CPU_REG_FILE_SIZE,
|
|
|
- 0, false, "MCP", false, 0);
|
|
|
+ false, 0, false, "MCP", false, 0);
|
|
|
|
|
|
/* Dump MCP registers */
|
|
|
block_enable[BLOCK_MCP] = true;
|
|
@@ -3387,11 +3678,13 @@ static u32 qed_grc_dump_mcp(struct qed_hwfn *p_hwfn,
|
|
|
dump_buf + offset,
|
|
|
dump,
|
|
|
addr,
|
|
|
- 1);
|
|
|
+ 1,
|
|
|
+ false);
|
|
|
|
|
|
/* Release MCP */
|
|
|
if (halted && qed_mcp_resume(p_hwfn, p_ptt))
|
|
|
DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n");
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
@@ -3404,14 +3697,26 @@ static u32 qed_grc_dump_phy(struct qed_hwfn *p_hwfn,
|
|
|
u8 phy_id;
|
|
|
|
|
|
for (phy_id = 0; phy_id < ARRAY_SIZE(s_phy_defs); phy_id++) {
|
|
|
- struct phy_defs *phy_defs = &s_phy_defs[phy_id];
|
|
|
- int printed_chars;
|
|
|
-
|
|
|
- printed_chars = snprintf(mem_name, sizeof(mem_name), "tbus_%s",
|
|
|
- phy_defs->phy_name);
|
|
|
- if (printed_chars < 0 || printed_chars >= sizeof(mem_name))
|
|
|
+ u32 addr_lo_addr, addr_hi_addr, data_lo_addr, data_hi_addr;
|
|
|
+ struct phy_defs *phy_defs;
|
|
|
+ u8 *bytes_buf;
|
|
|
+
|
|
|
+ phy_defs = &s_phy_defs[phy_id];
|
|
|
+ addr_lo_addr = phy_defs->base_addr +
|
|
|
+ phy_defs->tbus_addr_lo_addr;
|
|
|
+ addr_hi_addr = phy_defs->base_addr +
|
|
|
+ phy_defs->tbus_addr_hi_addr;
|
|
|
+ data_lo_addr = phy_defs->base_addr +
|
|
|
+ phy_defs->tbus_data_lo_addr;
|
|
|
+ data_hi_addr = phy_defs->base_addr +
|
|
|
+ phy_defs->tbus_data_hi_addr;
|
|
|
+ bytes_buf = (u8 *)(dump_buf + offset);
|
|
|
+
|
|
|
+ if (snprintf(mem_name, sizeof(mem_name), "tbus_%s",
|
|
|
+ phy_defs->phy_name) < 0)
|
|
|
DP_NOTICE(p_hwfn,
|
|
|
"Unexpected debug error: invalid PHY memory name\n");
|
|
|
+
|
|
|
offset += qed_grc_dump_mem_hdr(p_hwfn,
|
|
|
dump_buf + offset,
|
|
|
dump,
|
|
@@ -3419,34 +3724,26 @@ static u32 qed_grc_dump_phy(struct qed_hwfn *p_hwfn,
|
|
|
0,
|
|
|
PHY_DUMP_SIZE_DWORDS,
|
|
|
16, true, mem_name, false, 0);
|
|
|
- if (dump) {
|
|
|
- u32 addr_lo_addr = phy_defs->base_addr +
|
|
|
- phy_defs->tbus_addr_lo_addr;
|
|
|
- u32 addr_hi_addr = phy_defs->base_addr +
|
|
|
- phy_defs->tbus_addr_hi_addr;
|
|
|
- u32 data_lo_addr = phy_defs->base_addr +
|
|
|
- phy_defs->tbus_data_lo_addr;
|
|
|
- u32 data_hi_addr = phy_defs->base_addr +
|
|
|
- phy_defs->tbus_data_hi_addr;
|
|
|
- u8 *bytes_buf = (u8 *)(dump_buf + offset);
|
|
|
-
|
|
|
- for (tbus_hi_offset = 0;
|
|
|
- tbus_hi_offset < (NUM_PHY_TBUS_ADDRESSES >> 8);
|
|
|
- tbus_hi_offset++) {
|
|
|
+
|
|
|
+ if (!dump) {
|
|
|
+ offset += PHY_DUMP_SIZE_DWORDS;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (tbus_hi_offset = 0;
|
|
|
+ tbus_hi_offset < (NUM_PHY_TBUS_ADDRESSES >> 8);
|
|
|
+ tbus_hi_offset++) {
|
|
|
+ qed_wr(p_hwfn, p_ptt, addr_hi_addr, tbus_hi_offset);
|
|
|
+ for (tbus_lo_offset = 0; tbus_lo_offset < 256;
|
|
|
+ tbus_lo_offset++) {
|
|
|
qed_wr(p_hwfn,
|
|
|
- p_ptt, addr_hi_addr, tbus_hi_offset);
|
|
|
- for (tbus_lo_offset = 0; tbus_lo_offset < 256;
|
|
|
- tbus_lo_offset++) {
|
|
|
- qed_wr(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- addr_lo_addr, tbus_lo_offset);
|
|
|
- *(bytes_buf++) =
|
|
|
- (u8)qed_rd(p_hwfn, p_ptt,
|
|
|
- data_lo_addr);
|
|
|
- *(bytes_buf++) =
|
|
|
- (u8)qed_rd(p_hwfn, p_ptt,
|
|
|
- data_hi_addr);
|
|
|
- }
|
|
|
+ p_ptt, addr_lo_addr, tbus_lo_offset);
|
|
|
+ *(bytes_buf++) = (u8)qed_rd(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ data_lo_addr);
|
|
|
+ *(bytes_buf++) = (u8)qed_rd(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ data_hi_addr);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3460,16 +3757,17 @@ static void qed_config_dbg_line(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
|
enum block_id block_id,
|
|
|
u8 line_id,
|
|
|
- u8 cycle_en,
|
|
|
- u8 right_shift, u8 force_valid, u8 force_frame)
|
|
|
+ u8 enable_mask,
|
|
|
+ u8 right_shift,
|
|
|
+ u8 force_valid_mask, u8 force_frame_mask)
|
|
|
{
|
|
|
- struct block_defs *p_block_defs = s_block_defs[block_id];
|
|
|
+ struct block_defs *block = s_block_defs[block_id];
|
|
|
|
|
|
- qed_wr(p_hwfn, p_ptt, p_block_defs->dbg_select_addr, line_id);
|
|
|
- qed_wr(p_hwfn, p_ptt, p_block_defs->dbg_cycle_enable_addr, cycle_en);
|
|
|
- qed_wr(p_hwfn, p_ptt, p_block_defs->dbg_shift_addr, right_shift);
|
|
|
- qed_wr(p_hwfn, p_ptt, p_block_defs->dbg_force_valid_addr, force_valid);
|
|
|
- qed_wr(p_hwfn, p_ptt, p_block_defs->dbg_force_frame_addr, force_frame);
|
|
|
+ qed_wr(p_hwfn, p_ptt, block->dbg_select_addr, line_id);
|
|
|
+ qed_wr(p_hwfn, p_ptt, block->dbg_enable_addr, enable_mask);
|
|
|
+ qed_wr(p_hwfn, p_ptt, block->dbg_shift_addr, right_shift);
|
|
|
+ qed_wr(p_hwfn, p_ptt, block->dbg_force_valid_addr, force_valid_mask);
|
|
|
+ qed_wr(p_hwfn, p_ptt, block->dbg_force_frame_addr, force_frame_mask);
|
|
|
}
|
|
|
|
|
|
/* Dumps Static Debug data. Returns the dumped size in dwords. */
|
|
@@ -3477,10 +3775,12 @@ static u32 qed_grc_dump_static_debug(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
|
u32 *dump_buf, bool dump)
|
|
|
{
|
|
|
- u32 block_dwords = NUM_DBG_BUS_LINES * STATIC_DEBUG_LINE_DWORDS;
|
|
|
struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
|
|
|
- u32 offset = 0, block_id, line_id;
|
|
|
- struct block_defs *p_block_defs;
|
|
|
+ u32 block_id, line_id, offset = 0;
|
|
|
+
|
|
|
+ /* Skip static debug if a debug bus recording is in progress */
|
|
|
+ if (qed_rd(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON))
|
|
|
+ return 0;
|
|
|
|
|
|
if (dump) {
|
|
|
DP_VERBOSE(p_hwfn,
|
|
@@ -3488,11 +3788,11 @@ static u32 qed_grc_dump_static_debug(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Disable all blocks debug output */
|
|
|
for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
|
|
|
- p_block_defs = s_block_defs[block_id];
|
|
|
+ struct block_defs *block = s_block_defs[block_id];
|
|
|
|
|
|
- if (p_block_defs->has_dbg_bus[dev_data->chip_id])
|
|
|
- qed_wr(p_hwfn, p_ptt,
|
|
|
- p_block_defs->dbg_cycle_enable_addr, 0);
|
|
|
+ if (block->has_dbg_bus[dev_data->chip_id])
|
|
|
+ qed_wr(p_hwfn, p_ptt, block->dbg_enable_addr,
|
|
|
+ 0);
|
|
|
}
|
|
|
|
|
|
qed_bus_reset_dbg_block(p_hwfn, p_ptt);
|
|
@@ -3506,59 +3806,71 @@ static u32 qed_grc_dump_static_debug(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Dump all static debug lines for each relevant block */
|
|
|
for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
|
|
|
- p_block_defs = s_block_defs[block_id];
|
|
|
+ struct block_defs *block = s_block_defs[block_id];
|
|
|
+ struct dbg_bus_block *block_desc;
|
|
|
+ u32 block_dwords, addr, len;
|
|
|
+ u8 dbg_client_id;
|
|
|
|
|
|
- if (!p_block_defs->has_dbg_bus[dev_data->chip_id])
|
|
|
+ if (!block->has_dbg_bus[dev_data->chip_id])
|
|
|
continue;
|
|
|
|
|
|
+ block_desc =
|
|
|
+ get_dbg_bus_block_desc(p_hwfn,
|
|
|
+ (enum block_id)block_id);
|
|
|
+ block_dwords = NUM_DBG_LINES(block_desc) *
|
|
|
+ STATIC_DEBUG_LINE_DWORDS;
|
|
|
+
|
|
|
/* Dump static section params */
|
|
|
offset += qed_grc_dump_mem_hdr(p_hwfn,
|
|
|
dump_buf + offset,
|
|
|
dump,
|
|
|
- p_block_defs->name, 0,
|
|
|
- block_dwords, 32, false,
|
|
|
- "STATIC", false, 0);
|
|
|
-
|
|
|
- if (dump && !dev_data->block_in_reset[block_id]) {
|
|
|
- u8 dbg_client_id =
|
|
|
- p_block_defs->dbg_client_id[dev_data->chip_id];
|
|
|
- u32 addr = BYTES_TO_DWORDS(DBG_REG_CALENDAR_OUT_DATA);
|
|
|
- u32 len = STATIC_DEBUG_LINE_DWORDS;
|
|
|
-
|
|
|
- /* Enable block's client */
|
|
|
- qed_bus_enable_clients(p_hwfn, p_ptt,
|
|
|
- BIT(dbg_client_id));
|
|
|
-
|
|
|
- for (line_id = 0; line_id < NUM_DBG_BUS_LINES;
|
|
|
- line_id++) {
|
|
|
- /* Configure debug line ID */
|
|
|
- qed_config_dbg_line(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- (enum block_id)block_id,
|
|
|
- (u8)line_id,
|
|
|
- 0xf, 0, 0, 0);
|
|
|
+ block->name,
|
|
|
+ 0,
|
|
|
+ block_dwords,
|
|
|
+ 32, false, "STATIC", false, 0);
|
|
|
|
|
|
- /* Read debug line info */
|
|
|
- offset +=
|
|
|
- qed_grc_dump_addr_range(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- dump_buf + offset,
|
|
|
- dump,
|
|
|
- addr,
|
|
|
- len);
|
|
|
- }
|
|
|
+ if (!dump) {
|
|
|
+ offset += block_dwords;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- /* Disable block's client and debug output */
|
|
|
- qed_bus_enable_clients(p_hwfn, p_ptt, 0);
|
|
|
- qed_wr(p_hwfn, p_ptt,
|
|
|
- p_block_defs->dbg_cycle_enable_addr, 0);
|
|
|
- } else {
|
|
|
- /* All lines are invalid - dump zeros */
|
|
|
- if (dump)
|
|
|
- memset(dump_buf + offset, 0,
|
|
|
- DWORDS_TO_BYTES(block_dwords));
|
|
|
+ /* If all lines are invalid - dump zeros */
|
|
|
+ if (dev_data->block_in_reset[block_id]) {
|
|
|
+ memset(dump_buf + offset, 0,
|
|
|
+ DWORDS_TO_BYTES(block_dwords));
|
|
|
offset += block_dwords;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Enable block's client */
|
|
|
+ dbg_client_id = block->dbg_client_id[dev_data->chip_id];
|
|
|
+ qed_bus_enable_clients(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ BIT(dbg_client_id));
|
|
|
+
|
|
|
+ addr = BYTES_TO_DWORDS(DBG_REG_CALENDAR_OUT_DATA);
|
|
|
+ len = STATIC_DEBUG_LINE_DWORDS;
|
|
|
+ for (line_id = 0; line_id < (u32)NUM_DBG_LINES(block_desc);
|
|
|
+ line_id++) {
|
|
|
+ /* Configure debug line ID */
|
|
|
+ qed_config_dbg_line(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ (enum block_id)block_id,
|
|
|
+ (u8)line_id, 0xf, 0, 0, 0);
|
|
|
+
|
|
|
+ /* Read debug line info */
|
|
|
+ offset += qed_grc_dump_addr_range(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump,
|
|
|
+ addr,
|
|
|
+ len,
|
|
|
+ true);
|
|
|
}
|
|
|
+
|
|
|
+ /* Disable block's client and debug output */
|
|
|
+ qed_bus_enable_clients(p_hwfn, p_ptt, 0);
|
|
|
+ qed_wr(p_hwfn, p_ptt, block->dbg_enable_addr, 0);
|
|
|
}
|
|
|
|
|
|
if (dump) {
|
|
@@ -3584,8 +3896,8 @@ static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
*num_dumped_dwords = 0;
|
|
|
|
|
|
- /* Find port mode */
|
|
|
if (dump) {
|
|
|
+ /* Find port mode */
|
|
|
switch (qed_rd(p_hwfn, p_ptt, MISC_REG_PORT_MODE)) {
|
|
|
case 0:
|
|
|
port_mode = 1;
|
|
@@ -3597,11 +3909,10 @@ static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn,
|
|
|
port_mode = 4;
|
|
|
break;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- /* Update reset state */
|
|
|
- if (dump)
|
|
|
+ /* Update reset state */
|
|
|
qed_update_blocks_reset_state(p_hwfn, p_ptt);
|
|
|
+ }
|
|
|
|
|
|
/* Dump global params */
|
|
|
offset += qed_dump_common_global_params(p_hwfn,
|
|
@@ -3635,7 +3946,8 @@ static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn,
|
|
|
}
|
|
|
|
|
|
/* Disable all parities using MFW command */
|
|
|
- if (dump && !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) {
|
|
|
+ if (dump &&
|
|
|
+ !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) {
|
|
|
parities_masked = !qed_mcp_mask_parities(p_hwfn, p_ptt, 1);
|
|
|
if (!parities_masked) {
|
|
|
DP_NOTICE(p_hwfn,
|
|
@@ -3661,9 +3973,9 @@ static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Dump all regs */
|
|
|
if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) {
|
|
|
- /* Dump all blocks except MCP */
|
|
|
bool block_enable[MAX_BLOCK_ID];
|
|
|
|
|
|
+ /* Dump all blocks except MCP */
|
|
|
for (i = 0; i < MAX_BLOCK_ID; i++)
|
|
|
block_enable[i] = true;
|
|
|
block_enable[BLOCK_MCP] = false;
|
|
@@ -3732,7 +4044,8 @@ static enum dbg_status qed_grc_dump(struct qed_hwfn *p_hwfn,
|
|
|
dump_buf + offset, dump);
|
|
|
|
|
|
/* Dump last section */
|
|
|
- offset += qed_dump_last_section(dump_buf, offset, dump);
|
|
|
+ offset += qed_dump_last_section(p_hwfn, dump_buf, offset, dump);
|
|
|
+
|
|
|
if (dump) {
|
|
|
/* Unstall storms */
|
|
|
if (qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_UNSTALL))
|
|
@@ -3763,19 +4076,20 @@ static u32 qed_idle_chk_dump_failure(struct qed_hwfn *p_hwfn,
|
|
|
const struct dbg_idle_chk_rule *rule,
|
|
|
u16 fail_entry_id, u32 *cond_reg_values)
|
|
|
{
|
|
|
- const union dbg_idle_chk_reg *regs = &((const union dbg_idle_chk_reg *)
|
|
|
- s_dbg_arrays
|
|
|
- [BIN_BUF_DBG_IDLE_CHK_REGS].
|
|
|
- ptr)[rule->reg_offset];
|
|
|
- const struct dbg_idle_chk_cond_reg *cond_regs = ®s[0].cond_reg;
|
|
|
struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
|
|
|
- struct dbg_idle_chk_result_hdr *hdr =
|
|
|
- (struct dbg_idle_chk_result_hdr *)dump_buf;
|
|
|
- const struct dbg_idle_chk_info_reg *info_regs =
|
|
|
- ®s[rule->num_cond_regs].info_reg;
|
|
|
- u32 next_reg_offset = 0, i, offset = 0;
|
|
|
+ const struct dbg_idle_chk_cond_reg *cond_regs;
|
|
|
+ const struct dbg_idle_chk_info_reg *info_regs;
|
|
|
+ u32 i, next_reg_offset = 0, offset = 0;
|
|
|
+ struct dbg_idle_chk_result_hdr *hdr;
|
|
|
+ const union dbg_idle_chk_reg *regs;
|
|
|
u8 reg_id;
|
|
|
|
|
|
+ hdr = (struct dbg_idle_chk_result_hdr *)dump_buf;
|
|
|
+ regs = &((const union dbg_idle_chk_reg *)
|
|
|
+ s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr)[rule->reg_offset];
|
|
|
+ cond_regs = ®s[0].cond_reg;
|
|
|
+ info_regs = ®s[rule->num_cond_regs].info_reg;
|
|
|
+
|
|
|
/* Dump rule data */
|
|
|
if (dump) {
|
|
|
memset(hdr, 0, sizeof(*hdr));
|
|
@@ -3790,33 +4104,31 @@ static u32 qed_idle_chk_dump_failure(struct qed_hwfn *p_hwfn,
|
|
|
/* Dump condition register values */
|
|
|
for (reg_id = 0; reg_id < rule->num_cond_regs; reg_id++) {
|
|
|
const struct dbg_idle_chk_cond_reg *reg = &cond_regs[reg_id];
|
|
|
+ struct dbg_idle_chk_result_reg_hdr *reg_hdr;
|
|
|
|
|
|
- /* Write register header */
|
|
|
- if (dump) {
|
|
|
- struct dbg_idle_chk_result_reg_hdr *reg_hdr =
|
|
|
- (struct dbg_idle_chk_result_reg_hdr *)(dump_buf
|
|
|
- + offset);
|
|
|
- offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
|
|
|
- memset(reg_hdr, 0,
|
|
|
- sizeof(struct dbg_idle_chk_result_reg_hdr));
|
|
|
- reg_hdr->start_entry = reg->start_entry;
|
|
|
- reg_hdr->size = reg->entry_size;
|
|
|
- SET_FIELD(reg_hdr->data,
|
|
|
- DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM,
|
|
|
- reg->num_entries > 1 || reg->start_entry > 0
|
|
|
- ? 1 : 0);
|
|
|
- SET_FIELD(reg_hdr->data,
|
|
|
- DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, reg_id);
|
|
|
+ reg_hdr = (struct dbg_idle_chk_result_reg_hdr *)
|
|
|
+ (dump_buf + offset);
|
|
|
|
|
|
- /* Write register values */
|
|
|
- for (i = 0; i < reg_hdr->size;
|
|
|
- i++, next_reg_offset++, offset++)
|
|
|
- dump_buf[offset] =
|
|
|
- cond_reg_values[next_reg_offset];
|
|
|
- } else {
|
|
|
+ /* Write register header */
|
|
|
+ if (!dump) {
|
|
|
offset += IDLE_CHK_RESULT_REG_HDR_DWORDS +
|
|
|
reg->entry_size;
|
|
|
+ continue;
|
|
|
}
|
|
|
+
|
|
|
+ offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
|
|
|
+ memset(reg_hdr, 0, sizeof(*reg_hdr));
|
|
|
+ reg_hdr->start_entry = reg->start_entry;
|
|
|
+ reg_hdr->size = reg->entry_size;
|
|
|
+ SET_FIELD(reg_hdr->data,
|
|
|
+ DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM,
|
|
|
+ reg->num_entries > 1 || reg->start_entry > 0 ? 1 : 0);
|
|
|
+ SET_FIELD(reg_hdr->data,
|
|
|
+ DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, reg_id);
|
|
|
+
|
|
|
+ /* Write register values */
|
|
|
+ for (i = 0; i < reg_hdr->size; i++, next_reg_offset++, offset++)
|
|
|
+ dump_buf[offset] = cond_reg_values[next_reg_offset];
|
|
|
}
|
|
|
|
|
|
/* Dump info register values */
|
|
@@ -3824,12 +4136,12 @@ static u32 qed_idle_chk_dump_failure(struct qed_hwfn *p_hwfn,
|
|
|
const struct dbg_idle_chk_info_reg *reg = &info_regs[reg_id];
|
|
|
u32 block_id;
|
|
|
|
|
|
+ /* Check if register's block is in reset */
|
|
|
if (!dump) {
|
|
|
offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + reg->size;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- /* Check if register's block is in reset */
|
|
|
block_id = GET_FIELD(reg->data, DBG_IDLE_CHK_INFO_REG_BLOCK_ID);
|
|
|
if (block_id >= MAX_BLOCK_ID) {
|
|
|
DP_NOTICE(p_hwfn, "Invalid block_id\n");
|
|
@@ -3837,47 +4149,50 @@ static u32 qed_idle_chk_dump_failure(struct qed_hwfn *p_hwfn,
|
|
|
}
|
|
|
|
|
|
if (!dev_data->block_in_reset[block_id]) {
|
|
|
- bool eval_mode = GET_FIELD(reg->mode.data,
|
|
|
- DBG_MODE_HDR_EVAL_MODE) > 0;
|
|
|
- bool mode_match = true;
|
|
|
+ struct dbg_idle_chk_result_reg_hdr *reg_hdr;
|
|
|
+ bool wide_bus, eval_mode, mode_match = true;
|
|
|
+ u16 modes_buf_offset;
|
|
|
+ u32 addr;
|
|
|
+
|
|
|
+ reg_hdr = (struct dbg_idle_chk_result_reg_hdr *)
|
|
|
+ (dump_buf + offset);
|
|
|
|
|
|
/* Check mode */
|
|
|
+ eval_mode = GET_FIELD(reg->mode.data,
|
|
|
+ DBG_MODE_HDR_EVAL_MODE) > 0;
|
|
|
if (eval_mode) {
|
|
|
- u16 modes_buf_offset =
|
|
|
- GET_FIELD(reg->mode.data,
|
|
|
- DBG_MODE_HDR_MODES_BUF_OFFSET);
|
|
|
+ modes_buf_offset =
|
|
|
+ GET_FIELD(reg->mode.data,
|
|
|
+ DBG_MODE_HDR_MODES_BUF_OFFSET);
|
|
|
mode_match =
|
|
|
qed_is_mode_match(p_hwfn,
|
|
|
&modes_buf_offset);
|
|
|
}
|
|
|
|
|
|
- if (mode_match) {
|
|
|
- u32 addr =
|
|
|
- GET_FIELD(reg->data,
|
|
|
- DBG_IDLE_CHK_INFO_REG_ADDRESS);
|
|
|
-
|
|
|
- /* Write register header */
|
|
|
- struct dbg_idle_chk_result_reg_hdr *reg_hdr =
|
|
|
- (struct dbg_idle_chk_result_reg_hdr *)
|
|
|
- (dump_buf + offset);
|
|
|
-
|
|
|
- offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
|
|
|
- hdr->num_dumped_info_regs++;
|
|
|
- memset(reg_hdr, 0, sizeof(*reg_hdr));
|
|
|
- reg_hdr->size = reg->size;
|
|
|
- SET_FIELD(reg_hdr->data,
|
|
|
- DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID,
|
|
|
- rule->num_cond_regs + reg_id);
|
|
|
-
|
|
|
- /* Write register values */
|
|
|
- offset +=
|
|
|
- qed_grc_dump_addr_range(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- dump_buf + offset,
|
|
|
- dump,
|
|
|
- addr,
|
|
|
- reg->size);
|
|
|
- }
|
|
|
+ if (!mode_match)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ addr = GET_FIELD(reg->data,
|
|
|
+ DBG_IDLE_CHK_INFO_REG_ADDRESS);
|
|
|
+ wide_bus = GET_FIELD(reg->data,
|
|
|
+ DBG_IDLE_CHK_INFO_REG_WIDE_BUS);
|
|
|
+
|
|
|
+ /* Write register header */
|
|
|
+ offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
|
|
|
+ hdr->num_dumped_info_regs++;
|
|
|
+ memset(reg_hdr, 0, sizeof(*reg_hdr));
|
|
|
+ reg_hdr->size = reg->size;
|
|
|
+ SET_FIELD(reg_hdr->data,
|
|
|
+ DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID,
|
|
|
+ rule->num_cond_regs + reg_id);
|
|
|
+
|
|
|
+ /* Write register values */
|
|
|
+ offset += qed_grc_dump_addr_range(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump,
|
|
|
+ addr,
|
|
|
+ reg->size, wide_bus);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3898,6 +4213,7 @@ qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
|
|
u8 reg_id;
|
|
|
|
|
|
*num_failing_rules = 0;
|
|
|
+
|
|
|
for (i = 0; i < num_input_rules; i++) {
|
|
|
const struct dbg_idle_chk_cond_reg *cond_regs;
|
|
|
const struct dbg_idle_chk_rule *rule;
|
|
@@ -3920,8 +4236,9 @@ qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
|
|
*/
|
|
|
for (reg_id = 0; reg_id < rule->num_cond_regs && check_rule;
|
|
|
reg_id++) {
|
|
|
- u32 block_id = GET_FIELD(cond_regs[reg_id].data,
|
|
|
- DBG_IDLE_CHK_COND_REG_BLOCK_ID);
|
|
|
+ u32 block_id =
|
|
|
+ GET_FIELD(cond_regs[reg_id].data,
|
|
|
+ DBG_IDLE_CHK_COND_REG_BLOCK_ID);
|
|
|
|
|
|
if (block_id >= MAX_BLOCK_ID) {
|
|
|
DP_NOTICE(p_hwfn, "Invalid block_id\n");
|
|
@@ -3936,48 +4253,47 @@ qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
|
|
if (!check_rule && dump)
|
|
|
continue;
|
|
|
|
|
|
- if (!dump) {
|
|
|
- u32 entry_dump_size =
|
|
|
- qed_idle_chk_dump_failure(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- dump_buf + offset,
|
|
|
- false,
|
|
|
- rule->rule_id,
|
|
|
- rule,
|
|
|
- 0,
|
|
|
- NULL);
|
|
|
-
|
|
|
- offset += num_reg_entries * entry_dump_size;
|
|
|
- (*num_failing_rules) += num_reg_entries;
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
/* Go over all register entries (number of entries is the same
|
|
|
* for all condition registers).
|
|
|
*/
|
|
|
for (entry_id = 0; entry_id < num_reg_entries; entry_id++) {
|
|
|
- /* Read current entry of all condition registers */
|
|
|
u32 next_reg_offset = 0;
|
|
|
|
|
|
+ if (!dump) {
|
|
|
+ offset += qed_idle_chk_dump_failure(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ false,
|
|
|
+ rule->rule_id,
|
|
|
+ rule,
|
|
|
+ entry_id,
|
|
|
+ NULL);
|
|
|
+ (*num_failing_rules)++;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Read current entry of all condition registers */
|
|
|
for (reg_id = 0; reg_id < rule->num_cond_regs;
|
|
|
reg_id++) {
|
|
|
const struct dbg_idle_chk_cond_reg *reg =
|
|
|
- &cond_regs[reg_id];
|
|
|
+ &cond_regs[reg_id];
|
|
|
+ u32 padded_entry_size, addr;
|
|
|
+ bool wide_bus;
|
|
|
|
|
|
- /* Find GRC address (if it's a memory,the
|
|
|
+ /* Find GRC address (if it's a memory, the
|
|
|
* address of the specific entry is calculated).
|
|
|
*/
|
|
|
- u32 addr =
|
|
|
+ addr = GET_FIELD(reg->data,
|
|
|
+ DBG_IDLE_CHK_COND_REG_ADDRESS);
|
|
|
+ wide_bus =
|
|
|
GET_FIELD(reg->data,
|
|
|
- DBG_IDLE_CHK_COND_REG_ADDRESS);
|
|
|
-
|
|
|
+ DBG_IDLE_CHK_COND_REG_WIDE_BUS);
|
|
|
if (reg->num_entries > 1 ||
|
|
|
reg->start_entry > 0) {
|
|
|
- u32 padded_entry_size =
|
|
|
- reg->entry_size > 1 ?
|
|
|
- roundup_pow_of_two(reg->entry_size) :
|
|
|
- 1;
|
|
|
-
|
|
|
+ padded_entry_size =
|
|
|
+ reg->entry_size > 1 ?
|
|
|
+ roundup_pow_of_two(reg->entry_size)
|
|
|
+ : 1;
|
|
|
addr += (reg->start_entry + entry_id) *
|
|
|
padded_entry_size;
|
|
|
}
|
|
@@ -3991,28 +4307,27 @@ qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
|
|
}
|
|
|
|
|
|
next_reg_offset +=
|
|
|
- qed_grc_dump_addr_range(p_hwfn,
|
|
|
- p_ptt,
|
|
|
+ qed_grc_dump_addr_range(p_hwfn, p_ptt,
|
|
|
cond_reg_values +
|
|
|
next_reg_offset,
|
|
|
dump, addr,
|
|
|
- reg->entry_size);
|
|
|
+ reg->entry_size,
|
|
|
+ wide_bus);
|
|
|
}
|
|
|
|
|
|
- /* Call rule's condition function - a return value of
|
|
|
- * true indicates failure.
|
|
|
+ /* Call rule condition function.
|
|
|
+ * If returns true, it's a failure.
|
|
|
*/
|
|
|
- if ((*cond_arr[rule->cond_id])(cond_reg_values,
|
|
|
- imm_values)) {
|
|
|
- offset +=
|
|
|
- qed_idle_chk_dump_failure(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- dump_buf + offset,
|
|
|
- dump,
|
|
|
- rule->rule_id,
|
|
|
- rule,
|
|
|
- entry_id,
|
|
|
- cond_reg_values);
|
|
|
+ if ((*cond_arr[rule->cond_id]) (cond_reg_values,
|
|
|
+ imm_values)) {
|
|
|
+ offset += qed_idle_chk_dump_failure(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ dump_buf + offset,
|
|
|
+ dump,
|
|
|
+ rule->rule_id,
|
|
|
+ rule,
|
|
|
+ entry_id,
|
|
|
+ cond_reg_values);
|
|
|
(*num_failing_rules)++;
|
|
|
break;
|
|
|
}
|
|
@@ -4028,8 +4343,8 @@ qed_idle_chk_dump_rule_entries(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
|
|
static u32 qed_idle_chk_dump(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
|
|
|
{
|
|
|
- u32 offset = 0, input_offset = 0, num_failing_rules = 0;
|
|
|
- u32 num_failing_rules_offset;
|
|
|
+ u32 num_failing_rules_offset, offset = 0, input_offset = 0;
|
|
|
+ u32 num_failing_rules = 0;
|
|
|
|
|
|
/* Dump global params */
|
|
|
offset += qed_dump_common_global_params(p_hwfn,
|
|
@@ -4042,29 +4357,29 @@ static u32 qed_idle_chk_dump(struct qed_hwfn *p_hwfn,
|
|
|
offset += qed_dump_section_hdr(dump_buf + offset, dump, "idle_chk", 1);
|
|
|
num_failing_rules_offset = offset;
|
|
|
offset += qed_dump_num_param(dump_buf + offset, dump, "num_rules", 0);
|
|
|
+
|
|
|
while (input_offset <
|
|
|
s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].size_in_dwords) {
|
|
|
const struct dbg_idle_chk_cond_hdr *cond_hdr =
|
|
|
(const struct dbg_idle_chk_cond_hdr *)
|
|
|
&s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr
|
|
|
[input_offset++];
|
|
|
- bool eval_mode = GET_FIELD(cond_hdr->mode.data,
|
|
|
- DBG_MODE_HDR_EVAL_MODE) > 0;
|
|
|
- bool mode_match = true;
|
|
|
+ bool eval_mode, mode_match = true;
|
|
|
+ u32 curr_failing_rules;
|
|
|
+ u16 modes_buf_offset;
|
|
|
|
|
|
/* Check mode */
|
|
|
+ eval_mode = GET_FIELD(cond_hdr->mode.data,
|
|
|
+ DBG_MODE_HDR_EVAL_MODE) > 0;
|
|
|
if (eval_mode) {
|
|
|
- u16 modes_buf_offset =
|
|
|
+ modes_buf_offset =
|
|
|
GET_FIELD(cond_hdr->mode.data,
|
|
|
DBG_MODE_HDR_MODES_BUF_OFFSET);
|
|
|
-
|
|
|
mode_match = qed_is_mode_match(p_hwfn,
|
|
|
&modes_buf_offset);
|
|
|
}
|
|
|
|
|
|
if (mode_match) {
|
|
|
- u32 curr_failing_rules;
|
|
|
-
|
|
|
offset +=
|
|
|
qed_idle_chk_dump_rule_entries(p_hwfn,
|
|
|
p_ptt,
|
|
@@ -4086,10 +4401,13 @@ static u32 qed_idle_chk_dump(struct qed_hwfn *p_hwfn,
|
|
|
qed_dump_num_param(dump_buf + num_failing_rules_offset,
|
|
|
dump, "num_rules", num_failing_rules);
|
|
|
|
|
|
+ /* Dump last section */
|
|
|
+ offset += qed_dump_last_section(p_hwfn, dump_buf, offset, dump);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
|
-/* Finds the meta data image in NVRAM. */
|
|
|
+/* Finds the meta data image in NVRAM */
|
|
|
static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
|
u32 image_type,
|
|
@@ -4098,16 +4416,16 @@ static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn,
|
|
|
{
|
|
|
u32 ret_mcp_resp, ret_mcp_param, ret_txn_size;
|
|
|
struct mcp_file_att file_att;
|
|
|
+ int nvm_result;
|
|
|
|
|
|
/* Call NVRAM get file command */
|
|
|
- int nvm_result = qed_mcp_nvm_rd_cmd(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- DRV_MSG_CODE_NVM_GET_FILE_ATT,
|
|
|
- image_type,
|
|
|
- &ret_mcp_resp,
|
|
|
- &ret_mcp_param,
|
|
|
- &ret_txn_size,
|
|
|
- (u32 *)&file_att);
|
|
|
+ nvm_result = qed_mcp_nvm_rd_cmd(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ DRV_MSG_CODE_NVM_GET_FILE_ATT,
|
|
|
+ image_type,
|
|
|
+ &ret_mcp_resp,
|
|
|
+ &ret_mcp_param,
|
|
|
+ &ret_txn_size, (u32 *)&file_att);
|
|
|
|
|
|
/* Check response */
|
|
|
if (nvm_result ||
|
|
@@ -4117,6 +4435,7 @@ static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn,
|
|
|
/* Update return values */
|
|
|
*nvram_offset_bytes = file_att.nvm_start_addr;
|
|
|
*nvram_size_bytes = file_att.len;
|
|
|
+
|
|
|
DP_VERBOSE(p_hwfn,
|
|
|
QED_MSG_DEBUG,
|
|
|
"find_nvram_image: found NVRAM image of type %d in NVRAM offset %d bytes with size %d bytes\n",
|
|
@@ -4125,22 +4444,25 @@ static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn,
|
|
|
/* Check alignment */
|
|
|
if (*nvram_size_bytes & 0x3)
|
|
|
return DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE;
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
+/* Reads data from NVRAM */
|
|
|
static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
|
u32 nvram_offset_bytes,
|
|
|
u32 nvram_size_bytes, u32 *ret_buf)
|
|
|
{
|
|
|
- u32 ret_mcp_resp, ret_mcp_param, ret_read_size;
|
|
|
- u32 bytes_to_copy, read_offset = 0;
|
|
|
+ u32 ret_mcp_resp, ret_mcp_param, ret_read_size, bytes_to_copy;
|
|
|
s32 bytes_left = nvram_size_bytes;
|
|
|
+ u32 read_offset = 0;
|
|
|
|
|
|
DP_VERBOSE(p_hwfn,
|
|
|
QED_MSG_DEBUG,
|
|
|
"nvram_read: reading image of size %d bytes from NVRAM\n",
|
|
|
nvram_size_bytes);
|
|
|
+
|
|
|
do {
|
|
|
bytes_to_copy =
|
|
|
(bytes_left >
|
|
@@ -4155,8 +4477,7 @@ static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn,
|
|
|
DRV_MB_PARAM_NVM_LEN_SHIFT),
|
|
|
&ret_mcp_resp, &ret_mcp_param,
|
|
|
&ret_read_size,
|
|
|
- (u32 *)((u8 *)ret_buf +
|
|
|
- read_offset)) != 0)
|
|
|
+ (u32 *)((u8 *)ret_buf + read_offset)))
|
|
|
return DBG_STATUS_NVRAM_READ_FAILED;
|
|
|
|
|
|
/* Check response */
|
|
@@ -4172,24 +4493,20 @@ static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn,
|
|
|
}
|
|
|
|
|
|
/* Get info on the MCP Trace data in the scratchpad:
|
|
|
- * - trace_data_grc_addr - the GRC address of the trace data
|
|
|
- * - trace_data_size_bytes - the size in bytes of the MCP Trace data (without
|
|
|
- * the header)
|
|
|
+ * - trace_data_grc_addr (OUT): trace data GRC address in bytes
|
|
|
+ * - trace_data_size (OUT): trace data size in bytes (without the header)
|
|
|
*/
|
|
|
static enum dbg_status qed_mcp_trace_get_data_info(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
|
u32 *trace_data_grc_addr,
|
|
|
- u32 *trace_data_size_bytes)
|
|
|
+ u32 *trace_data_size)
|
|
|
{
|
|
|
- /* Read MCP trace section offsize structure from MCP scratchpad */
|
|
|
- u32 spad_trace_offsize = qed_rd(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- MCP_SPAD_TRACE_OFFSIZE_ADDR);
|
|
|
- u32 signature;
|
|
|
+ u32 spad_trace_offsize, signature;
|
|
|
|
|
|
- /* Extract MCP trace section GRC address from offsize structure (within
|
|
|
- * scratchpad).
|
|
|
- */
|
|
|
+ /* Read trace section offsize structure from MCP scratchpad */
|
|
|
+ spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR);
|
|
|
+
|
|
|
+ /* Extract trace section address from offsize (in scratchpad) */
|
|
|
*trace_data_grc_addr =
|
|
|
MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize);
|
|
|
|
|
@@ -4197,42 +4514,41 @@ static enum dbg_status qed_mcp_trace_get_data_info(struct qed_hwfn *p_hwfn,
|
|
|
signature = qed_rd(p_hwfn, p_ptt,
|
|
|
*trace_data_grc_addr +
|
|
|
offsetof(struct mcp_trace, signature));
|
|
|
+
|
|
|
if (signature != MFW_TRACE_SIGNATURE)
|
|
|
return DBG_STATUS_INVALID_TRACE_SIGNATURE;
|
|
|
|
|
|
/* Read trace size from MCP trace section */
|
|
|
- *trace_data_size_bytes = qed_rd(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- *trace_data_grc_addr +
|
|
|
- offsetof(struct mcp_trace, size));
|
|
|
+ *trace_data_size = qed_rd(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ *trace_data_grc_addr +
|
|
|
+ offsetof(struct mcp_trace, size));
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
-/* Reads MCP trace meta data image from NVRAM.
|
|
|
- * - running_bundle_id (OUT) - the running bundle ID (invalid when loaded from
|
|
|
- * file)
|
|
|
- * - trace_meta_offset_bytes (OUT) - the NVRAM offset in bytes in which the MCP
|
|
|
- * Trace meta data starts (invalid when loaded from file)
|
|
|
- * - trace_meta_size_bytes (OUT) - the size in bytes of the MCP Trace meta data
|
|
|
+/* Reads MCP trace meta data image from NVRAM
|
|
|
+ * - running_bundle_id (OUT): running bundle ID (invalid when loaded from file)
|
|
|
+ * - trace_meta_offset (OUT): trace meta offset in NVRAM in bytes (invalid when
|
|
|
+ * loaded from file).
|
|
|
+ * - trace_meta_size (OUT): size in bytes of the trace meta data.
|
|
|
*/
|
|
|
static enum dbg_status qed_mcp_trace_get_meta_info(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
|
u32 trace_data_size_bytes,
|
|
|
u32 *running_bundle_id,
|
|
|
- u32 *trace_meta_offset_bytes,
|
|
|
- u32 *trace_meta_size_bytes)
|
|
|
+ u32 *trace_meta_offset,
|
|
|
+ u32 *trace_meta_size)
|
|
|
{
|
|
|
+ u32 spad_trace_offsize, nvram_image_type, running_mfw_addr;
|
|
|
+
|
|
|
/* Read MCP trace section offsize structure from MCP scratchpad */
|
|
|
- u32 spad_trace_offsize = qed_rd(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- MCP_SPAD_TRACE_OFFSIZE_ADDR);
|
|
|
+ spad_trace_offsize = qed_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR);
|
|
|
|
|
|
/* Find running bundle ID */
|
|
|
- u32 running_mfw_addr =
|
|
|
+ running_mfw_addr =
|
|
|
MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize) +
|
|
|
QED_SECTION_SIZE(spad_trace_offsize) + trace_data_size_bytes;
|
|
|
- u32 nvram_image_type;
|
|
|
-
|
|
|
*running_bundle_id = qed_rd(p_hwfn, p_ptt, running_mfw_addr);
|
|
|
if (*running_bundle_id > 1)
|
|
|
return DBG_STATUS_INVALID_NVRAM_BUNDLE;
|
|
@@ -4241,40 +4557,33 @@ static enum dbg_status qed_mcp_trace_get_meta_info(struct qed_hwfn *p_hwfn,
|
|
|
nvram_image_type =
|
|
|
(*running_bundle_id ==
|
|
|
DIR_ID_1) ? NVM_TYPE_MFW_TRACE1 : NVM_TYPE_MFW_TRACE2;
|
|
|
-
|
|
|
return qed_find_nvram_image(p_hwfn,
|
|
|
p_ptt,
|
|
|
nvram_image_type,
|
|
|
- trace_meta_offset_bytes,
|
|
|
- trace_meta_size_bytes);
|
|
|
+ trace_meta_offset, trace_meta_size);
|
|
|
}
|
|
|
|
|
|
-/* Reads the MCP Trace meta data (from NVRAM or buffer) into the specified
|
|
|
- * buffer.
|
|
|
- */
|
|
|
+/* Reads the MCP Trace meta data from NVRAM into the specified buffer */
|
|
|
static enum dbg_status qed_mcp_trace_read_meta(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
|
u32 nvram_offset_in_bytes,
|
|
|
u32 size_in_bytes, u32 *buf)
|
|
|
{
|
|
|
- u8 *byte_buf = (u8 *)buf;
|
|
|
- u8 modules_num, i;
|
|
|
+ u8 modules_num, module_len, i, *byte_buf = (u8 *)buf;
|
|
|
+ enum dbg_status status;
|
|
|
u32 signature;
|
|
|
|
|
|
/* Read meta data from NVRAM */
|
|
|
- enum dbg_status status = qed_nvram_read(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- nvram_offset_in_bytes,
|
|
|
- size_in_bytes,
|
|
|
- buf);
|
|
|
-
|
|
|
+ status = qed_nvram_read(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ nvram_offset_in_bytes, size_in_bytes, buf);
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
|
|
|
/* Extract and check first signature */
|
|
|
signature = qed_read_unaligned_dword(byte_buf);
|
|
|
- byte_buf += sizeof(u32);
|
|
|
- if (signature != MCP_TRACE_META_IMAGE_SIGNATURE)
|
|
|
+ byte_buf += sizeof(signature);
|
|
|
+ if (signature != NVM_MAGIC_VALUE)
|
|
|
return DBG_STATUS_INVALID_TRACE_SIGNATURE;
|
|
|
|
|
|
/* Extract number of modules */
|
|
@@ -4282,16 +4591,16 @@ static enum dbg_status qed_mcp_trace_read_meta(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Skip all modules */
|
|
|
for (i = 0; i < modules_num; i++) {
|
|
|
- u8 module_len = *(byte_buf++);
|
|
|
-
|
|
|
+ module_len = *(byte_buf++);
|
|
|
byte_buf += module_len;
|
|
|
}
|
|
|
|
|
|
/* Extract and check second signature */
|
|
|
signature = qed_read_unaligned_dword(byte_buf);
|
|
|
- byte_buf += sizeof(u32);
|
|
|
- if (signature != MCP_TRACE_META_IMAGE_SIGNATURE)
|
|
|
+ byte_buf += sizeof(signature);
|
|
|
+ if (signature != NVM_MAGIC_VALUE)
|
|
|
return DBG_STATUS_INVALID_TRACE_SIGNATURE;
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
@@ -4308,10 +4617,10 @@ static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
bool mcp_access;
|
|
|
int halted = 0;
|
|
|
|
|
|
- mcp_access = !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP);
|
|
|
-
|
|
|
*num_dumped_dwords = 0;
|
|
|
|
|
|
+ mcp_access = !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP);
|
|
|
+
|
|
|
/* Get trace data info */
|
|
|
status = qed_mcp_trace_get_data_info(p_hwfn,
|
|
|
p_ptt,
|
|
@@ -4328,7 +4637,7 @@ static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
dump, "dump-type", "mcp-trace");
|
|
|
|
|
|
/* Halt MCP while reading from scratchpad so the read data will be
|
|
|
- * consistent if halt fails, MCP trace is taken anyway, with a small
|
|
|
+ * consistent. if halt fails, MCP trace is taken anyway, with a small
|
|
|
* risk that it may be corrupt.
|
|
|
*/
|
|
|
if (dump && mcp_access) {
|
|
@@ -4339,8 +4648,8 @@ static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Find trace data size */
|
|
|
trace_data_size_dwords =
|
|
|
- DIV_ROUND_UP(trace_data_size_bytes + sizeof(struct mcp_trace),
|
|
|
- BYTES_IN_DWORD);
|
|
|
+ DIV_ROUND_UP(trace_data_size_bytes + sizeof(struct mcp_trace),
|
|
|
+ BYTES_IN_DWORD);
|
|
|
|
|
|
/* Dump trace data section header and param */
|
|
|
offset += qed_dump_section_hdr(dump_buf + offset,
|
|
@@ -4354,17 +4663,17 @@ static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
dump_buf + offset,
|
|
|
dump,
|
|
|
BYTES_TO_DWORDS(trace_data_grc_addr),
|
|
|
- trace_data_size_dwords);
|
|
|
+ trace_data_size_dwords, false);
|
|
|
|
|
|
/* Resume MCP (only if halt succeeded) */
|
|
|
- if (halted && qed_mcp_resume(p_hwfn, p_ptt) != 0)
|
|
|
+ if (halted && qed_mcp_resume(p_hwfn, p_ptt))
|
|
|
DP_NOTICE(p_hwfn, "Failed to resume MCP after halt!\n");
|
|
|
|
|
|
/* Dump trace meta section header */
|
|
|
offset += qed_dump_section_hdr(dump_buf + offset,
|
|
|
dump, "mcp_trace_meta", 1);
|
|
|
|
|
|
- /* Read trace meta info */
|
|
|
+ /* Read trace meta info (trace_meta_size_bytes is dword-aligned) */
|
|
|
if (mcp_access) {
|
|
|
status = qed_mcp_trace_get_meta_info(p_hwfn,
|
|
|
p_ptt,
|
|
@@ -4391,6 +4700,9 @@ static enum dbg_status qed_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
if (status == DBG_STATUS_OK)
|
|
|
offset += trace_meta_size_dwords;
|
|
|
|
|
|
+ /* Dump last section */
|
|
|
+ offset += qed_dump_last_section(p_hwfn, dump_buf, offset, dump);
|
|
|
+
|
|
|
*num_dumped_dwords = offset;
|
|
|
|
|
|
/* If no mcp access, indicate that the dump doesn't contain the meta
|
|
@@ -4405,7 +4717,7 @@ static enum dbg_status qed_reg_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
u32 *dump_buf,
|
|
|
bool dump, u32 *num_dumped_dwords)
|
|
|
{
|
|
|
- u32 offset = 0, dwords_read, size_param_offset;
|
|
|
+ u32 dwords_read, size_param_offset, offset = 0;
|
|
|
bool fifo_has_data;
|
|
|
|
|
|
*num_dumped_dwords = 0;
|
|
@@ -4417,8 +4729,8 @@ static enum dbg_status qed_reg_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
offset += qed_dump_str_param(dump_buf + offset,
|
|
|
dump, "dump-type", "reg-fifo");
|
|
|
|
|
|
- /* Dump fifo data section header and param. The size param is 0 for now,
|
|
|
- * and is overwritten after reading the FIFO.
|
|
|
+ /* Dump fifo data section header and param. The size param is 0 for
|
|
|
+ * now, and is overwritten after reading the FIFO.
|
|
|
*/
|
|
|
offset += qed_dump_section_hdr(dump_buf + offset,
|
|
|
dump, "reg_fifo_data", 1);
|
|
@@ -4430,8 +4742,7 @@ static enum dbg_status qed_reg_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
* test how much data is available, except for reading it.
|
|
|
*/
|
|
|
offset += REG_FIFO_DEPTH_DWORDS;
|
|
|
- *num_dumped_dwords = offset;
|
|
|
- return DBG_STATUS_OK;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
fifo_has_data = qed_rd(p_hwfn, p_ptt,
|
|
@@ -4456,8 +4767,12 @@ static enum dbg_status qed_reg_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
|
|
|
dwords_read);
|
|
|
+out:
|
|
|
+ /* Dump last section */
|
|
|
+ offset += qed_dump_last_section(p_hwfn, dump_buf, offset, dump);
|
|
|
|
|
|
*num_dumped_dwords = offset;
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
@@ -4467,7 +4782,7 @@ static enum dbg_status qed_igu_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
u32 *dump_buf,
|
|
|
bool dump, u32 *num_dumped_dwords)
|
|
|
{
|
|
|
- u32 offset = 0, dwords_read, size_param_offset;
|
|
|
+ u32 dwords_read, size_param_offset, offset = 0;
|
|
|
bool fifo_has_data;
|
|
|
|
|
|
*num_dumped_dwords = 0;
|
|
@@ -4479,8 +4794,8 @@ static enum dbg_status qed_igu_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
offset += qed_dump_str_param(dump_buf + offset,
|
|
|
dump, "dump-type", "igu-fifo");
|
|
|
|
|
|
- /* Dump fifo data section header and param. The size param is 0 for now,
|
|
|
- * and is overwritten after reading the FIFO.
|
|
|
+ /* Dump fifo data section header and param. The size param is 0 for
|
|
|
+ * now, and is overwritten after reading the FIFO.
|
|
|
*/
|
|
|
offset += qed_dump_section_hdr(dump_buf + offset,
|
|
|
dump, "igu_fifo_data", 1);
|
|
@@ -4492,8 +4807,7 @@ static enum dbg_status qed_igu_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
* test how much data is available, except for reading it.
|
|
|
*/
|
|
|
offset += IGU_FIFO_DEPTH_DWORDS;
|
|
|
- *num_dumped_dwords = offset;
|
|
|
- return DBG_STATUS_OK;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
fifo_has_data = qed_rd(p_hwfn, p_ptt,
|
|
@@ -4519,8 +4833,12 @@ static enum dbg_status qed_igu_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
|
|
|
dwords_read);
|
|
|
+out:
|
|
|
+ /* Dump last section */
|
|
|
+ offset += qed_dump_last_section(p_hwfn, dump_buf, offset, dump);
|
|
|
|
|
|
*num_dumped_dwords = offset;
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
@@ -4531,7 +4849,7 @@ static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn,
|
|
|
bool dump,
|
|
|
u32 *num_dumped_dwords)
|
|
|
{
|
|
|
- u32 offset = 0, size_param_offset, override_window_dwords;
|
|
|
+ u32 size_param_offset, override_window_dwords, offset = 0;
|
|
|
|
|
|
*num_dumped_dwords = 0;
|
|
|
|
|
@@ -4542,8 +4860,8 @@ static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn,
|
|
|
offset += qed_dump_str_param(dump_buf + offset,
|
|
|
dump, "dump-type", "protection-override");
|
|
|
|
|
|
- /* Dump data section header and param. The size param is 0 for now, and
|
|
|
- * is overwritten after reading the data.
|
|
|
+ /* Dump data section header and param. The size param is 0 for now,
|
|
|
+ * and is overwritten after reading the data.
|
|
|
*/
|
|
|
offset += qed_dump_section_hdr(dump_buf + offset,
|
|
|
dump, "protection_override_data", 1);
|
|
@@ -4552,8 +4870,7 @@ static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
if (!dump) {
|
|
|
offset += PROTECTION_OVERRIDE_DEPTH_DWORDS;
|
|
|
- *num_dumped_dwords = offset;
|
|
|
- return DBG_STATUS_OK;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
/* Add override window info to buffer */
|
|
@@ -4569,8 +4886,12 @@ static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn,
|
|
|
offset += override_window_dwords;
|
|
|
qed_dump_num_param(dump_buf + size_param_offset, dump, "size",
|
|
|
override_window_dwords);
|
|
|
+out:
|
|
|
+ /* Dump last section */
|
|
|
+ offset += qed_dump_last_section(p_hwfn, dump_buf, offset, dump);
|
|
|
|
|
|
*num_dumped_dwords = offset;
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
@@ -4593,11 +4914,14 @@ static u32 qed_fw_asserts_dump(struct qed_hwfn *p_hwfn,
|
|
|
dump_buf + offset, dump, 1);
|
|
|
offset += qed_dump_str_param(dump_buf + offset,
|
|
|
dump, "dump-type", "fw-asserts");
|
|
|
+
|
|
|
+ /* Find Storm dump size */
|
|
|
for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
|
|
|
u32 fw_asserts_section_addr, next_list_idx_addr, next_list_idx;
|
|
|
+ struct storm_defs *storm = &s_storm_defs[storm_id];
|
|
|
u32 last_list_idx, addr;
|
|
|
|
|
|
- if (dev_data->block_in_reset[s_storm_defs[storm_id].block_id])
|
|
|
+ if (dev_data->block_in_reset[storm->block_id])
|
|
|
continue;
|
|
|
|
|
|
/* Read FW info for the current Storm */
|
|
@@ -4606,26 +4930,26 @@ static u32 qed_fw_asserts_dump(struct qed_hwfn *p_hwfn,
|
|
|
asserts = &fw_info.fw_asserts_section;
|
|
|
|
|
|
/* Dump FW Asserts section header and params */
|
|
|
- storm_letter_str[0] = s_storm_defs[storm_id].letter;
|
|
|
- offset += qed_dump_section_hdr(dump_buf + offset, dump,
|
|
|
- "fw_asserts", 2);
|
|
|
- offset += qed_dump_str_param(dump_buf + offset, dump, "storm",
|
|
|
- storm_letter_str);
|
|
|
- offset += qed_dump_num_param(dump_buf + offset, dump, "size",
|
|
|
+ storm_letter_str[0] = storm->letter;
|
|
|
+ offset += qed_dump_section_hdr(dump_buf + offset,
|
|
|
+ dump, "fw_asserts", 2);
|
|
|
+ offset += qed_dump_str_param(dump_buf + offset,
|
|
|
+ dump, "storm", storm_letter_str);
|
|
|
+ offset += qed_dump_num_param(dump_buf + offset,
|
|
|
+ dump,
|
|
|
+ "size",
|
|
|
asserts->list_element_dword_size);
|
|
|
|
|
|
+ /* Read and dump FW Asserts data */
|
|
|
if (!dump) {
|
|
|
offset += asserts->list_element_dword_size;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- /* Read and dump FW Asserts data */
|
|
|
- fw_asserts_section_addr =
|
|
|
- s_storm_defs[storm_id].sem_fast_mem_addr +
|
|
|
+ fw_asserts_section_addr = storm->sem_fast_mem_addr +
|
|
|
SEM_FAST_REG_INT_RAM +
|
|
|
RAM_LINES_TO_BYTES(asserts->section_ram_line_offset);
|
|
|
- next_list_idx_addr =
|
|
|
- fw_asserts_section_addr +
|
|
|
+ next_list_idx_addr = fw_asserts_section_addr +
|
|
|
DWORDS_TO_BYTES(asserts->list_next_index_dword_offset);
|
|
|
next_list_idx = qed_rd(p_hwfn, p_ptt, next_list_idx_addr);
|
|
|
last_list_idx = (next_list_idx > 0
|
|
@@ -4638,11 +4962,13 @@ static u32 qed_fw_asserts_dump(struct qed_hwfn *p_hwfn,
|
|
|
qed_grc_dump_addr_range(p_hwfn, p_ptt,
|
|
|
dump_buf + offset,
|
|
|
dump, addr,
|
|
|
- asserts->list_element_dword_size);
|
|
|
+ asserts->list_element_dword_size,
|
|
|
+ false);
|
|
|
}
|
|
|
|
|
|
/* Dump last section */
|
|
|
- offset += qed_dump_section_hdr(dump_buf + offset, dump, "last", 0);
|
|
|
+ offset += qed_dump_last_section(p_hwfn, dump_buf, offset, dump);
|
|
|
+
|
|
|
return offset;
|
|
|
}
|
|
|
|
|
@@ -4650,10 +4976,10 @@ static u32 qed_fw_asserts_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
enum dbg_status qed_dbg_set_bin_ptr(const u8 * const bin_ptr)
|
|
|
{
|
|
|
- /* Convert binary data to debug arrays */
|
|
|
struct bin_buffer_hdr *buf_array = (struct bin_buffer_hdr *)bin_ptr;
|
|
|
u8 buf_id;
|
|
|
|
|
|
+ /* convert binary data to debug arrays */
|
|
|
for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) {
|
|
|
s_dbg_arrays[buf_id].ptr =
|
|
|
(u32 *)(bin_ptr + buf_array[buf_id].offset);
|
|
@@ -4682,14 +5008,17 @@ enum dbg_status qed_dbg_grc_get_dump_buf_size(struct qed_hwfn *p_hwfn,
|
|
|
enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
|
|
|
|
|
|
*buf_size = 0;
|
|
|
+
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
if (!s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
|
|
|
!s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr ||
|
|
|
!s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr ||
|
|
|
!s_dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
|
|
|
!s_dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
|
|
|
return DBG_STATUS_DBG_ARRAY_NOT_SET;
|
|
|
+
|
|
|
return qed_grc_dump(p_hwfn, p_ptt, NULL, false, buf_size);
|
|
|
}
|
|
|
|
|
@@ -4702,12 +5031,14 @@ enum dbg_status qed_dbg_grc_dump(struct qed_hwfn *p_hwfn,
|
|
|
u32 needed_buf_size_in_dwords;
|
|
|
enum dbg_status status;
|
|
|
|
|
|
- status = qed_dbg_grc_get_dump_buf_size(p_hwfn, p_ptt,
|
|
|
- &needed_buf_size_in_dwords);
|
|
|
-
|
|
|
*num_dumped_dwords = 0;
|
|
|
+
|
|
|
+ status = qed_dbg_grc_get_dump_buf_size(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ &needed_buf_size_in_dwords);
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
if (buf_size_in_dwords < needed_buf_size_in_dwords)
|
|
|
return DBG_STATUS_DUMP_BUF_TOO_SMALL;
|
|
|
|
|
@@ -4724,25 +5055,31 @@ enum dbg_status qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn *p_hwfn,
|
|
|
struct qed_ptt *p_ptt,
|
|
|
u32 *buf_size)
|
|
|
{
|
|
|
- enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
|
|
|
struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
|
|
|
+ struct idle_chk_data *idle_chk;
|
|
|
+ enum dbg_status status;
|
|
|
|
|
|
+ idle_chk = &dev_data->idle_chk;
|
|
|
*buf_size = 0;
|
|
|
+
|
|
|
+ status = qed_dbg_dev_init(p_hwfn, p_ptt);
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
if (!s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
|
|
|
!s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr ||
|
|
|
!s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr ||
|
|
|
!s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr)
|
|
|
return DBG_STATUS_DBG_ARRAY_NOT_SET;
|
|
|
- if (!dev_data->idle_chk.buf_size_set) {
|
|
|
- dev_data->idle_chk.buf_size = qed_idle_chk_dump(p_hwfn,
|
|
|
- p_ptt,
|
|
|
- NULL, false);
|
|
|
- dev_data->idle_chk.buf_size_set = true;
|
|
|
+
|
|
|
+ if (!idle_chk->buf_size_set) {
|
|
|
+ idle_chk->buf_size = qed_idle_chk_dump(p_hwfn,
|
|
|
+ p_ptt, NULL, false);
|
|
|
+ idle_chk->buf_size_set = true;
|
|
|
}
|
|
|
|
|
|
- *buf_size = dev_data->idle_chk.buf_size;
|
|
|
+ *buf_size = idle_chk->buf_size;
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
@@ -4755,12 +5092,14 @@ enum dbg_status qed_dbg_idle_chk_dump(struct qed_hwfn *p_hwfn,
|
|
|
u32 needed_buf_size_in_dwords;
|
|
|
enum dbg_status status;
|
|
|
|
|
|
- status = qed_dbg_idle_chk_get_dump_buf_size(p_hwfn, p_ptt,
|
|
|
- &needed_buf_size_in_dwords);
|
|
|
-
|
|
|
*num_dumped_dwords = 0;
|
|
|
+
|
|
|
+ status = qed_dbg_idle_chk_get_dump_buf_size(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ &needed_buf_size_in_dwords);
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
if (buf_size_in_dwords < needed_buf_size_in_dwords)
|
|
|
return DBG_STATUS_DUMP_BUF_TOO_SMALL;
|
|
|
|
|
@@ -4783,8 +5122,10 @@ enum dbg_status qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn *p_hwfn,
|
|
|
enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
|
|
|
|
|
|
*buf_size = 0;
|
|
|
+
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
return qed_mcp_trace_dump(p_hwfn, p_ptt, NULL, false, buf_size);
|
|
|
}
|
|
|
|
|
@@ -4797,13 +5138,12 @@ enum dbg_status qed_dbg_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
u32 needed_buf_size_in_dwords;
|
|
|
enum dbg_status status;
|
|
|
|
|
|
- /* validate buffer size */
|
|
|
status =
|
|
|
- qed_dbg_mcp_trace_get_dump_buf_size(p_hwfn, p_ptt,
|
|
|
- &needed_buf_size_in_dwords);
|
|
|
-
|
|
|
- if (status != DBG_STATUS_OK &&
|
|
|
- status != DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
|
|
|
+ qed_dbg_mcp_trace_get_dump_buf_size(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ &needed_buf_size_in_dwords);
|
|
|
+ if (status != DBG_STATUS_OK && status !=
|
|
|
+ DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
|
|
|
return status;
|
|
|
|
|
|
if (buf_size_in_dwords < needed_buf_size_in_dwords)
|
|
@@ -4829,8 +5169,10 @@ enum dbg_status qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn,
|
|
|
enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
|
|
|
|
|
|
*buf_size = 0;
|
|
|
+
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
return qed_reg_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size);
|
|
|
}
|
|
|
|
|
@@ -4843,12 +5185,14 @@ enum dbg_status qed_dbg_reg_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
u32 needed_buf_size_in_dwords;
|
|
|
enum dbg_status status;
|
|
|
|
|
|
- status = qed_dbg_reg_fifo_get_dump_buf_size(p_hwfn, p_ptt,
|
|
|
- &needed_buf_size_in_dwords);
|
|
|
-
|
|
|
*num_dumped_dwords = 0;
|
|
|
+
|
|
|
+ status = qed_dbg_reg_fifo_get_dump_buf_size(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ &needed_buf_size_in_dwords);
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
if (buf_size_in_dwords < needed_buf_size_in_dwords)
|
|
|
return DBG_STATUS_DUMP_BUF_TOO_SMALL;
|
|
|
|
|
@@ -4871,8 +5215,10 @@ enum dbg_status qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn,
|
|
|
enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
|
|
|
|
|
|
*buf_size = 0;
|
|
|
+
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
return qed_igu_fifo_dump(p_hwfn, p_ptt, NULL, false, buf_size);
|
|
|
}
|
|
|
|
|
@@ -4885,12 +5231,14 @@ enum dbg_status qed_dbg_igu_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
u32 needed_buf_size_in_dwords;
|
|
|
enum dbg_status status;
|
|
|
|
|
|
- status = qed_dbg_igu_fifo_get_dump_buf_size(p_hwfn, p_ptt,
|
|
|
- &needed_buf_size_in_dwords);
|
|
|
-
|
|
|
*num_dumped_dwords = 0;
|
|
|
+
|
|
|
+ status = qed_dbg_igu_fifo_get_dump_buf_size(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ &needed_buf_size_in_dwords);
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
if (buf_size_in_dwords < needed_buf_size_in_dwords)
|
|
|
return DBG_STATUS_DUMP_BUF_TOO_SMALL;
|
|
|
|
|
@@ -4913,8 +5261,10 @@ qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn *p_hwfn,
|
|
|
enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
|
|
|
|
|
|
*buf_size = 0;
|
|
|
+
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
return qed_protection_override_dump(p_hwfn,
|
|
|
p_ptt, NULL, false, buf_size);
|
|
|
}
|
|
@@ -4925,15 +5275,18 @@ enum dbg_status qed_dbg_protection_override_dump(struct qed_hwfn *p_hwfn,
|
|
|
u32 buf_size_in_dwords,
|
|
|
u32 *num_dumped_dwords)
|
|
|
{
|
|
|
- u32 needed_buf_size_in_dwords;
|
|
|
+ u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords;
|
|
|
enum dbg_status status;
|
|
|
|
|
|
- status = qed_dbg_protection_override_get_dump_buf_size(p_hwfn, p_ptt,
|
|
|
- &needed_buf_size_in_dwords);
|
|
|
-
|
|
|
*num_dumped_dwords = 0;
|
|
|
+
|
|
|
+ status =
|
|
|
+ qed_dbg_protection_override_get_dump_buf_size(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ p_size);
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
if (buf_size_in_dwords < needed_buf_size_in_dwords)
|
|
|
return DBG_STATUS_DUMP_BUF_TOO_SMALL;
|
|
|
|
|
@@ -4958,12 +5311,15 @@ enum dbg_status qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn *p_hwfn,
|
|
|
enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
|
|
|
|
|
|
*buf_size = 0;
|
|
|
+
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
|
|
|
/* Update reset state */
|
|
|
qed_update_blocks_reset_state(p_hwfn, p_ptt);
|
|
|
+
|
|
|
*buf_size = qed_fw_asserts_dump(p_hwfn, p_ptt, NULL, false);
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
@@ -4973,19 +5329,26 @@ enum dbg_status qed_dbg_fw_asserts_dump(struct qed_hwfn *p_hwfn,
|
|
|
u32 buf_size_in_dwords,
|
|
|
u32 *num_dumped_dwords)
|
|
|
{
|
|
|
- u32 needed_buf_size_in_dwords;
|
|
|
+ u32 needed_buf_size_in_dwords, *p_size = &needed_buf_size_in_dwords;
|
|
|
enum dbg_status status;
|
|
|
|
|
|
- status = qed_dbg_fw_asserts_get_dump_buf_size(p_hwfn, p_ptt,
|
|
|
- &needed_buf_size_in_dwords);
|
|
|
-
|
|
|
*num_dumped_dwords = 0;
|
|
|
+
|
|
|
+ status =
|
|
|
+ qed_dbg_fw_asserts_get_dump_buf_size(p_hwfn,
|
|
|
+ p_ptt,
|
|
|
+ p_size);
|
|
|
if (status != DBG_STATUS_OK)
|
|
|
return status;
|
|
|
+
|
|
|
if (buf_size_in_dwords < needed_buf_size_in_dwords)
|
|
|
return DBG_STATUS_DUMP_BUF_TOO_SMALL;
|
|
|
|
|
|
*num_dumped_dwords = qed_fw_asserts_dump(p_hwfn, p_ptt, dump_buf, true);
|
|
|
+
|
|
|
+ /* Revert GRC params to their default */
|
|
|
+ qed_dbg_grc_set_params_default(p_hwfn);
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
@@ -5005,9 +5368,14 @@ struct mcp_trace_format {
|
|
|
#define MCP_TRACE_FORMAT_P3_SIZE_SHIFT 22
|
|
|
#define MCP_TRACE_FORMAT_LEN_MASK 0xff000000
|
|
|
#define MCP_TRACE_FORMAT_LEN_SHIFT 24
|
|
|
+
|
|
|
char *format_str;
|
|
|
};
|
|
|
|
|
|
+/* Meta data structure, generated by a perl script during MFW build. therefore,
|
|
|
+ * the structs mcp_trace_meta and mcp_trace_format are duplicated in the perl
|
|
|
+ * script.
|
|
|
+ */
|
|
|
struct mcp_trace_meta {
|
|
|
u32 modules_num;
|
|
|
char **modules;
|
|
@@ -5015,7 +5383,7 @@ struct mcp_trace_meta {
|
|
|
struct mcp_trace_format *formats;
|
|
|
};
|
|
|
|
|
|
-/* Reg fifo element */
|
|
|
+/* REG fifo element */
|
|
|
struct reg_fifo_element {
|
|
|
u64 data;
|
|
|
#define REG_FIFO_ELEMENT_ADDRESS_SHIFT 0
|
|
@@ -5140,12 +5508,15 @@ struct igu_fifo_addr_data {
|
|
|
/******************************** Constants **********************************/
|
|
|
|
|
|
#define MAX_MSG_LEN 1024
|
|
|
+
|
|
|
#define MCP_TRACE_MAX_MODULE_LEN 8
|
|
|
#define MCP_TRACE_FORMAT_MAX_PARAMS 3
|
|
|
#define MCP_TRACE_FORMAT_PARAM_WIDTH \
|
|
|
(MCP_TRACE_FORMAT_P2_SIZE_SHIFT - MCP_TRACE_FORMAT_P1_SIZE_SHIFT)
|
|
|
+
|
|
|
#define REG_FIFO_ELEMENT_ADDR_FACTOR 4
|
|
|
#define REG_FIFO_ELEMENT_IS_PF_VF_VAL 127
|
|
|
+
|
|
|
#define PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR 4
|
|
|
|
|
|
/********************************* Macros ************************************/
|
|
@@ -5154,59 +5525,178 @@ struct igu_fifo_addr_data {
|
|
|
|
|
|
/***************************** Constant Arrays *******************************/
|
|
|
|
|
|
+struct user_dbg_array {
|
|
|
+ const u32 *ptr;
|
|
|
+ u32 size_in_dwords;
|
|
|
+};
|
|
|
+
|
|
|
+/* Debug arrays */
|
|
|
+static struct user_dbg_array
|
|
|
+s_user_dbg_arrays[MAX_BIN_DBG_BUFFER_TYPE] = { {NULL} };
|
|
|
+
|
|
|
/* Status string array */
|
|
|
static const char * const s_status_str[] = {
|
|
|
+ /* DBG_STATUS_OK */
|
|
|
"Operation completed successfully",
|
|
|
+
|
|
|
+ /* DBG_STATUS_APP_VERSION_NOT_SET */
|
|
|
"Debug application version wasn't set",
|
|
|
+
|
|
|
+ /* DBG_STATUS_UNSUPPORTED_APP_VERSION */
|
|
|
"Unsupported debug application version",
|
|
|
+
|
|
|
+ /* DBG_STATUS_DBG_BLOCK_NOT_RESET */
|
|
|
"The debug block wasn't reset since the last recording",
|
|
|
+
|
|
|
+ /* DBG_STATUS_INVALID_ARGS */
|
|
|
"Invalid arguments",
|
|
|
+
|
|
|
+ /* DBG_STATUS_OUTPUT_ALREADY_SET */
|
|
|
"The debug output was already set",
|
|
|
+
|
|
|
+ /* DBG_STATUS_INVALID_PCI_BUF_SIZE */
|
|
|
"Invalid PCI buffer size",
|
|
|
+
|
|
|
+ /* DBG_STATUS_PCI_BUF_ALLOC_FAILED */
|
|
|
"PCI buffer allocation failed",
|
|
|
+
|
|
|
+ /* DBG_STATUS_PCI_BUF_NOT_ALLOCATED */
|
|
|
"A PCI buffer wasn't allocated",
|
|
|
+
|
|
|
+ /* DBG_STATUS_TOO_MANY_INPUTS */
|
|
|
"Too many inputs were enabled. Enabled less inputs, or set 'unifyInputs' to true",
|
|
|
- "GRC/Timestamp input overlap in cycle dword 0",
|
|
|
+
|
|
|
+ /* DBG_STATUS_INPUT_OVERLAP */
|
|
|
+ "Overlapping debug bus inputs",
|
|
|
+
|
|
|
+ /* DBG_STATUS_HW_ONLY_RECORDING */
|
|
|
"Cannot record Storm data since the entire recording cycle is used by HW",
|
|
|
+
|
|
|
+ /* DBG_STATUS_STORM_ALREADY_ENABLED */
|
|
|
"The Storm was already enabled",
|
|
|
+
|
|
|
+ /* DBG_STATUS_STORM_NOT_ENABLED */
|
|
|
"The specified Storm wasn't enabled",
|
|
|
+
|
|
|
+ /* DBG_STATUS_BLOCK_ALREADY_ENABLED */
|
|
|
"The block was already enabled",
|
|
|
+
|
|
|
+ /* DBG_STATUS_BLOCK_NOT_ENABLED */
|
|
|
"The specified block wasn't enabled",
|
|
|
+
|
|
|
+ /* DBG_STATUS_NO_INPUT_ENABLED */
|
|
|
"No input was enabled for recording",
|
|
|
+
|
|
|
+ /* DBG_STATUS_NO_FILTER_TRIGGER_64B */
|
|
|
"Filters and triggers are not allowed when recording in 64b units",
|
|
|
+
|
|
|
+ /* DBG_STATUS_FILTER_ALREADY_ENABLED */
|
|
|
"The filter was already enabled",
|
|
|
+
|
|
|
+ /* DBG_STATUS_TRIGGER_ALREADY_ENABLED */
|
|
|
"The trigger was already enabled",
|
|
|
+
|
|
|
+ /* DBG_STATUS_TRIGGER_NOT_ENABLED */
|
|
|
"The trigger wasn't enabled",
|
|
|
+
|
|
|
+ /* DBG_STATUS_CANT_ADD_CONSTRAINT */
|
|
|
"A constraint can be added only after a filter was enabled or a trigger state was added",
|
|
|
+
|
|
|
+ /* DBG_STATUS_TOO_MANY_TRIGGER_STATES */
|
|
|
"Cannot add more than 3 trigger states",
|
|
|
+
|
|
|
+ /* DBG_STATUS_TOO_MANY_CONSTRAINTS */
|
|
|
"Cannot add more than 4 constraints per filter or trigger state",
|
|
|
+
|
|
|
+ /* DBG_STATUS_RECORDING_NOT_STARTED */
|
|
|
"The recording wasn't started",
|
|
|
+
|
|
|
+ /* DBG_STATUS_DATA_DIDNT_TRIGGER */
|
|
|
"A trigger was configured, but it didn't trigger",
|
|
|
+
|
|
|
+ /* DBG_STATUS_NO_DATA_RECORDED */
|
|
|
"No data was recorded",
|
|
|
+
|
|
|
+ /* DBG_STATUS_DUMP_BUF_TOO_SMALL */
|
|
|
"Dump buffer is too small",
|
|
|
+
|
|
|
+ /* DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED */
|
|
|
"Dumped data is not aligned to chunks",
|
|
|
+
|
|
|
+ /* DBG_STATUS_UNKNOWN_CHIP */
|
|
|
"Unknown chip",
|
|
|
+
|
|
|
+ /* DBG_STATUS_VIRT_MEM_ALLOC_FAILED */
|
|
|
"Failed allocating virtual memory",
|
|
|
+
|
|
|
+ /* DBG_STATUS_BLOCK_IN_RESET */
|
|
|
"The input block is in reset",
|
|
|
+
|
|
|
+ /* DBG_STATUS_INVALID_TRACE_SIGNATURE */
|
|
|
"Invalid MCP trace signature found in NVRAM",
|
|
|
+
|
|
|
+ /* DBG_STATUS_INVALID_NVRAM_BUNDLE */
|
|
|
"Invalid bundle ID found in NVRAM",
|
|
|
+
|
|
|
+ /* DBG_STATUS_NVRAM_GET_IMAGE_FAILED */
|
|
|
"Failed getting NVRAM image",
|
|
|
+
|
|
|
+ /* DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE */
|
|
|
"NVRAM image is not dword-aligned",
|
|
|
+
|
|
|
+ /* DBG_STATUS_NVRAM_READ_FAILED */
|
|
|
"Failed reading from NVRAM",
|
|
|
+
|
|
|
+ /* DBG_STATUS_IDLE_CHK_PARSE_FAILED */
|
|
|
"Idle check parsing failed",
|
|
|
+
|
|
|
+ /* DBG_STATUS_MCP_TRACE_BAD_DATA */
|
|
|
"MCP Trace data is corrupt",
|
|
|
- "Dump doesn't contain meta data - it must be provided in an image file",
|
|
|
+
|
|
|
+ /* DBG_STATUS_MCP_TRACE_NO_META */
|
|
|
+ "Dump doesn't contain meta data - it must be provided in image file",
|
|
|
+
|
|
|
+ /* DBG_STATUS_MCP_COULD_NOT_HALT */
|
|
|
"Failed to halt MCP",
|
|
|
+
|
|
|
+ /* DBG_STATUS_MCP_COULD_NOT_RESUME */
|
|
|
"Failed to resume MCP after halt",
|
|
|
+
|
|
|
+ /* DBG_STATUS_DMAE_FAILED */
|
|
|
"DMAE transaction failed",
|
|
|
+
|
|
|
+ /* DBG_STATUS_SEMI_FIFO_NOT_EMPTY */
|
|
|
"Failed to empty SEMI sync FIFO",
|
|
|
+
|
|
|
+ /* DBG_STATUS_IGU_FIFO_BAD_DATA */
|
|
|
"IGU FIFO data is corrupt",
|
|
|
+
|
|
|
+ /* DBG_STATUS_MCP_COULD_NOT_MASK_PRTY */
|
|
|
"MCP failed to mask parities",
|
|
|
+
|
|
|
+ /* DBG_STATUS_FW_ASSERTS_PARSE_FAILED */
|
|
|
"FW Asserts parsing failed",
|
|
|
+
|
|
|
+ /* DBG_STATUS_REG_FIFO_BAD_DATA */
|
|
|
"GRC FIFO data is corrupt",
|
|
|
+
|
|
|
+ /* DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA */
|
|
|
"Protection Override data is corrupt",
|
|
|
+
|
|
|
+ /* DBG_STATUS_DBG_ARRAY_NOT_SET */
|
|
|
"Debug arrays were not set (when using binary files, dbg_set_bin_ptr must be called)",
|
|
|
- "When a block is filtered, no other blocks can be recorded unless inputs are unified (due to a HW bug)"
|
|
|
+
|
|
|
+ /* DBG_STATUS_FILTER_BUG */
|
|
|
+ "Debug Bus filtering requires the -unifyInputs option (due to a HW bug)",
|
|
|
+
|
|
|
+ /* DBG_STATUS_NON_MATCHING_LINES */
|
|
|
+ "Non-matching debug lines - all lines must be of the same type (either 128b or 256b)",
|
|
|
+
|
|
|
+ /* DBG_STATUS_INVALID_TRIGGER_DWORD_OFFSET */
|
|
|
+ "The selected trigger dword offset wasn't enabled in the recorded HW block",
|
|
|
+
|
|
|
+ /* DBG_STATUS_DBG_BUS_IN_USE */
|
|
|
+ "The debug bus is in use"
|
|
|
};
|
|
|
|
|
|
/* Idle check severity names array */
|
|
@@ -5223,12 +5713,13 @@ static const char * const s_mcp_trace_level_str[] = {
|
|
|
"DEBUG"
|
|
|
};
|
|
|
|
|
|
-/* Parsing strings */
|
|
|
+/* Access type names array */
|
|
|
static const char * const s_access_strs[] = {
|
|
|
"read",
|
|
|
"write"
|
|
|
};
|
|
|
|
|
|
+/* Privilege type names array */
|
|
|
static const char * const s_privilege_strs[] = {
|
|
|
"VF",
|
|
|
"PDA",
|
|
@@ -5236,6 +5727,7 @@ static const char * const s_privilege_strs[] = {
|
|
|
"UA"
|
|
|
};
|
|
|
|
|
|
+/* Protection type names array */
|
|
|
static const char * const s_protection_strs[] = {
|
|
|
"(default)",
|
|
|
"(default)",
|
|
@@ -5247,6 +5739,7 @@ static const char * const s_protection_strs[] = {
|
|
|
"override UA"
|
|
|
};
|
|
|
|
|
|
+/* Master type names array */
|
|
|
static const char * const s_master_strs[] = {
|
|
|
"???",
|
|
|
"pxp",
|
|
@@ -5266,6 +5759,7 @@ static const char * const s_master_strs[] = {
|
|
|
"???"
|
|
|
};
|
|
|
|
|
|
+/* REG FIFO error messages array */
|
|
|
static const char * const s_reg_fifo_error_strs[] = {
|
|
|
"grc timeout",
|
|
|
"address doesn't belong to any block",
|
|
@@ -5274,6 +5768,7 @@ static const char * const s_reg_fifo_error_strs[] = {
|
|
|
"path isolation error"
|
|
|
};
|
|
|
|
|
|
+/* IGU FIFO sources array */
|
|
|
static const char * const s_igu_fifo_source_strs[] = {
|
|
|
"TSTORM",
|
|
|
"MSTORM",
|
|
@@ -5288,6 +5783,7 @@ static const char * const s_igu_fifo_source_strs[] = {
|
|
|
"GRC",
|
|
|
};
|
|
|
|
|
|
+/* IGU FIFO error messages */
|
|
|
static const char * const s_igu_fifo_error_strs[] = {
|
|
|
"no error",
|
|
|
"length error",
|
|
@@ -5308,13 +5804,18 @@ static const char * const s_igu_fifo_error_strs[] = {
|
|
|
|
|
|
/* IGU FIFO address data */
|
|
|
static const struct igu_fifo_addr_data s_igu_fifo_addr_data[] = {
|
|
|
- {0x0, 0x101, "MSI-X Memory", NULL, IGU_ADDR_TYPE_MSIX_MEM},
|
|
|
- {0x102, 0x1ff, "reserved", NULL, IGU_ADDR_TYPE_RESERVED},
|
|
|
- {0x200, 0x200, "Write PBA[0:63]", NULL, IGU_ADDR_TYPE_WRITE_PBA},
|
|
|
+ {0x0, 0x101, "MSI-X Memory", NULL,
|
|
|
+ IGU_ADDR_TYPE_MSIX_MEM},
|
|
|
+ {0x102, 0x1ff, "reserved", NULL,
|
|
|
+ IGU_ADDR_TYPE_RESERVED},
|
|
|
+ {0x200, 0x200, "Write PBA[0:63]", NULL,
|
|
|
+ IGU_ADDR_TYPE_WRITE_PBA},
|
|
|
{0x201, 0x201, "Write PBA[64:127]", "reserved",
|
|
|
IGU_ADDR_TYPE_WRITE_PBA},
|
|
|
- {0x202, 0x202, "Write PBA[128]", "reserved", IGU_ADDR_TYPE_WRITE_PBA},
|
|
|
- {0x203, 0x3ff, "reserved", NULL, IGU_ADDR_TYPE_RESERVED},
|
|
|
+ {0x202, 0x202, "Write PBA[128]", "reserved",
|
|
|
+ IGU_ADDR_TYPE_WRITE_PBA},
|
|
|
+ {0x203, 0x3ff, "reserved", NULL,
|
|
|
+ IGU_ADDR_TYPE_RESERVED},
|
|
|
{0x400, 0x5ef, "Write interrupt acknowledgment", NULL,
|
|
|
IGU_ADDR_TYPE_WRITE_INT_ACK},
|
|
|
{0x5f0, 0x5f0, "Attention bits update", NULL,
|
|
@@ -5331,8 +5832,10 @@ static const struct igu_fifo_addr_data s_igu_fifo_addr_data[] = {
|
|
|
IGU_ADDR_TYPE_READ_INT},
|
|
|
{0x5f6, 0x5f6, "Read interrupt 0:63 without mask", NULL,
|
|
|
IGU_ADDR_TYPE_READ_INT},
|
|
|
- {0x5f7, 0x5ff, "reserved", NULL, IGU_ADDR_TYPE_RESERVED},
|
|
|
- {0x600, 0x7ff, "Producer update", NULL, IGU_ADDR_TYPE_WRITE_PROD_UPDATE}
|
|
|
+ {0x5f7, 0x5ff, "reserved", NULL,
|
|
|
+ IGU_ADDR_TYPE_RESERVED},
|
|
|
+ {0x600, 0x7ff, "Producer update", NULL,
|
|
|
+ IGU_ADDR_TYPE_WRITE_PROD_UPDATE}
|
|
|
};
|
|
|
|
|
|
/******************************** Variables **********************************/
|
|
@@ -5340,28 +5843,12 @@ static const struct igu_fifo_addr_data s_igu_fifo_addr_data[] = {
|
|
|
/* MCP Trace meta data - used in case the dump doesn't contain the meta data
|
|
|
* (e.g. due to no NVRAM access).
|
|
|
*/
|
|
|
-static struct dbg_array s_mcp_trace_meta = { NULL, 0 };
|
|
|
+static struct user_dbg_array s_mcp_trace_meta = { NULL, 0 };
|
|
|
|
|
|
/* Temporary buffer, used for print size calculations */
|
|
|
static char s_temp_buf[MAX_MSG_LEN];
|
|
|
|
|
|
-/***************************** Public Functions *******************************/
|
|
|
-
|
|
|
-enum dbg_status qed_dbg_user_set_bin_ptr(const u8 * const bin_ptr)
|
|
|
-{
|
|
|
- /* Convert binary data to debug arrays */
|
|
|
- struct bin_buffer_hdr *buf_array = (struct bin_buffer_hdr *)bin_ptr;
|
|
|
- u8 buf_id;
|
|
|
-
|
|
|
- for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) {
|
|
|
- s_dbg_arrays[buf_id].ptr =
|
|
|
- (u32 *)(bin_ptr + buf_array[buf_id].offset);
|
|
|
- s_dbg_arrays[buf_id].size_in_dwords =
|
|
|
- BYTES_TO_DWORDS(buf_array[buf_id].length);
|
|
|
- }
|
|
|
-
|
|
|
- return DBG_STATUS_OK;
|
|
|
-}
|
|
|
+/**************************** Private Functions ******************************/
|
|
|
|
|
|
static u32 qed_cyclic_add(u32 a, u32 b, u32 size)
|
|
|
{
|
|
@@ -5381,10 +5868,8 @@ static u32 qed_read_from_cyclic_buf(void *buf,
|
|
|
u32 *offset,
|
|
|
u32 buf_size, u8 num_bytes_to_read)
|
|
|
{
|
|
|
- u8 *bytes_buf = (u8 *)buf;
|
|
|
- u8 *val_ptr;
|
|
|
+ u8 i, *val_ptr, *bytes_buf = (u8 *)buf;
|
|
|
u32 val = 0;
|
|
|
- u8 i;
|
|
|
|
|
|
val_ptr = (u8 *)&val;
|
|
|
|
|
@@ -5412,6 +5897,7 @@ static u32 qed_read_dword_from_buf(void *buf, u32 *offset)
|
|
|
u32 dword_val = *(u32 *)&((u8 *)buf)[*offset];
|
|
|
|
|
|
*offset += 4;
|
|
|
+
|
|
|
return dword_val;
|
|
|
}
|
|
|
|
|
@@ -5445,7 +5931,7 @@ static u32 qed_read_param(u32 *dump_buf,
|
|
|
const char **param_str_val, u32 *param_num_val)
|
|
|
{
|
|
|
char *char_buf = (char *)dump_buf;
|
|
|
- u32 offset = 0; /* In bytes */
|
|
|
+ size_t offset = 0;
|
|
|
|
|
|
/* Extract param name */
|
|
|
*param_name = char_buf;
|
|
@@ -5493,37 +5979,31 @@ static u32 qed_print_section_params(u32 *dump_buf,
|
|
|
u32 i, dump_offset = 0, results_offset = 0;
|
|
|
|
|
|
for (i = 0; i < num_section_params; i++) {
|
|
|
- const char *param_name;
|
|
|
- const char *param_str_val;
|
|
|
+ const char *param_name, *param_str_val;
|
|
|
u32 param_num_val = 0;
|
|
|
|
|
|
dump_offset += qed_read_param(dump_buf + dump_offset,
|
|
|
¶m_name,
|
|
|
¶m_str_val, ¶m_num_val);
|
|
|
+
|
|
|
if (param_str_val)
|
|
|
- /* String param */
|
|
|
results_offset +=
|
|
|
sprintf(qed_get_buf_ptr(results_buf,
|
|
|
results_offset),
|
|
|
"%s: %s\n", param_name, param_str_val);
|
|
|
else if (strcmp(param_name, "fw-timestamp"))
|
|
|
- /* Numeric param */
|
|
|
results_offset +=
|
|
|
sprintf(qed_get_buf_ptr(results_buf,
|
|
|
results_offset),
|
|
|
"%s: %d\n", param_name, param_num_val);
|
|
|
}
|
|
|
|
|
|
- results_offset +=
|
|
|
- sprintf(qed_get_buf_ptr(results_buf, results_offset), "\n");
|
|
|
+ results_offset += sprintf(qed_get_buf_ptr(results_buf, results_offset),
|
|
|
+ "\n");
|
|
|
+
|
|
|
*num_chars_printed = results_offset;
|
|
|
- return dump_offset;
|
|
|
-}
|
|
|
|
|
|
-const char *qed_dbg_get_status_str(enum dbg_status status)
|
|
|
-{
|
|
|
- return (status <
|
|
|
- MAX_DBG_STATUS) ? s_status_str[status] : "Invalid debug status";
|
|
|
+ return dump_offset;
|
|
|
}
|
|
|
|
|
|
/* Parses the idle check rules and returns the number of characters printed.
|
|
@@ -5537,7 +6017,10 @@ static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn,
|
|
|
char *results_buf,
|
|
|
u32 *num_errors, u32 *num_warnings)
|
|
|
{
|
|
|
- u32 rule_idx, results_offset = 0; /* Offset in results_buf in bytes */
|
|
|
+ /* Offset in results_buf in bytes */
|
|
|
+ u32 results_offset = 0;
|
|
|
+
|
|
|
+ u32 rule_idx;
|
|
|
u16 i, j;
|
|
|
|
|
|
*num_errors = 0;
|
|
@@ -5548,16 +6031,15 @@ static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn,
|
|
|
rule_idx++) {
|
|
|
const struct dbg_idle_chk_rule_parsing_data *rule_parsing_data;
|
|
|
struct dbg_idle_chk_result_hdr *hdr;
|
|
|
- const char *parsing_str;
|
|
|
+ const char *parsing_str, *lsi_msg;
|
|
|
u32 parsing_str_offset;
|
|
|
- const char *lsi_msg;
|
|
|
- u8 curr_reg_id = 0;
|
|
|
bool has_fw_msg;
|
|
|
+ u8 curr_reg_id;
|
|
|
|
|
|
hdr = (struct dbg_idle_chk_result_hdr *)dump_buf;
|
|
|
rule_parsing_data =
|
|
|
(const struct dbg_idle_chk_rule_parsing_data *)
|
|
|
- &s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].
|
|
|
+ &s_user_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].
|
|
|
ptr[hdr->rule_id];
|
|
|
parsing_str_offset =
|
|
|
GET_FIELD(rule_parsing_data->data,
|
|
@@ -5565,16 +6047,18 @@ static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn,
|
|
|
has_fw_msg =
|
|
|
GET_FIELD(rule_parsing_data->data,
|
|
|
DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG) > 0;
|
|
|
- parsing_str = &((const char *)
|
|
|
- s_dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr)
|
|
|
- [parsing_str_offset];
|
|
|
+ parsing_str =
|
|
|
+ &((const char *)
|
|
|
+ s_user_dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr)
|
|
|
+ [parsing_str_offset];
|
|
|
lsi_msg = parsing_str;
|
|
|
+ curr_reg_id = 0;
|
|
|
|
|
|
if (hdr->severity >= MAX_DBG_IDLE_CHK_SEVERITY_TYPES)
|
|
|
return 0;
|
|
|
|
|
|
/* Skip rule header */
|
|
|
- dump_buf += (sizeof(struct dbg_idle_chk_result_hdr) / 4);
|
|
|
+ dump_buf += BYTES_TO_DWORDS(sizeof(*hdr));
|
|
|
|
|
|
/* Update errors/warnings count */
|
|
|
if (hdr->severity == IDLE_CHK_SEVERITY_ERROR ||
|
|
@@ -5606,19 +6090,19 @@ static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn,
|
|
|
for (i = 0;
|
|
|
i < hdr->num_dumped_cond_regs + hdr->num_dumped_info_regs;
|
|
|
i++) {
|
|
|
- struct dbg_idle_chk_result_reg_hdr *reg_hdr
|
|
|
- = (struct dbg_idle_chk_result_reg_hdr *)
|
|
|
- dump_buf;
|
|
|
- bool is_mem =
|
|
|
- GET_FIELD(reg_hdr->data,
|
|
|
- DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM);
|
|
|
- u8 reg_id =
|
|
|
- GET_FIELD(reg_hdr->data,
|
|
|
- DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID);
|
|
|
+ struct dbg_idle_chk_result_reg_hdr *reg_hdr;
|
|
|
+ bool is_mem;
|
|
|
+ u8 reg_id;
|
|
|
+
|
|
|
+ reg_hdr =
|
|
|
+ (struct dbg_idle_chk_result_reg_hdr *)dump_buf;
|
|
|
+ is_mem = GET_FIELD(reg_hdr->data,
|
|
|
+ DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM);
|
|
|
+ reg_id = GET_FIELD(reg_hdr->data,
|
|
|
+ DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID);
|
|
|
|
|
|
/* Skip reg header */
|
|
|
- dump_buf +=
|
|
|
- (sizeof(struct dbg_idle_chk_result_reg_hdr) / 4);
|
|
|
+ dump_buf += BYTES_TO_DWORDS(sizeof(*reg_hdr));
|
|
|
|
|
|
/* Skip register names until the required reg_id is
|
|
|
* reached.
|
|
@@ -5660,6 +6144,7 @@ static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn,
|
|
|
/* Check if end of dump buffer was exceeded */
|
|
|
if (dump_buf > dump_buf_end)
|
|
|
return 0;
|
|
|
+
|
|
|
return results_offset;
|
|
|
}
|
|
|
|
|
@@ -5680,13 +6165,16 @@ static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn,
|
|
|
const char *section_name, *param_name, *param_str_val;
|
|
|
u32 *dump_buf_end = dump_buf + num_dumped_dwords;
|
|
|
u32 num_section_params = 0, num_rules;
|
|
|
- u32 results_offset = 0; /* Offset in results_buf in bytes */
|
|
|
+
|
|
|
+ /* Offset in results_buf in bytes */
|
|
|
+ u32 results_offset = 0;
|
|
|
|
|
|
*parsed_results_bytes = 0;
|
|
|
*num_errors = 0;
|
|
|
*num_warnings = 0;
|
|
|
- if (!s_dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr ||
|
|
|
- !s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr)
|
|
|
+
|
|
|
+ if (!s_user_dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr ||
|
|
|
+ !s_user_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr)
|
|
|
return DBG_STATUS_DBG_ARRAY_NOT_SET;
|
|
|
|
|
|
/* Read global_params section */
|
|
@@ -5705,10 +6193,9 @@ static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn,
|
|
|
§ion_name, &num_section_params);
|
|
|
if (strcmp(section_name, "idle_chk") || num_section_params != 1)
|
|
|
return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
|
|
|
-
|
|
|
dump_buf += qed_read_param(dump_buf,
|
|
|
¶m_name, ¶m_str_val, &num_rules);
|
|
|
- if (strcmp(param_name, "num_rules") != 0)
|
|
|
+ if (strcmp(param_name, "num_rules"))
|
|
|
return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
|
|
|
|
|
|
if (num_rules) {
|
|
@@ -5728,7 +6215,7 @@ static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn,
|
|
|
results_offset : NULL,
|
|
|
num_errors, num_warnings);
|
|
|
results_offset += rules_print_size;
|
|
|
- if (rules_print_size == 0)
|
|
|
+ if (!rules_print_size)
|
|
|
return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
|
|
|
|
|
|
/* Print LSI output */
|
|
@@ -5745,69 +6232,38 @@ static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn,
|
|
|
results_offset : NULL,
|
|
|
num_errors, num_warnings);
|
|
|
results_offset += rules_print_size;
|
|
|
- if (rules_print_size == 0)
|
|
|
+ if (!rules_print_size)
|
|
|
return DBG_STATUS_IDLE_CHK_PARSE_FAILED;
|
|
|
}
|
|
|
|
|
|
/* Print errors/warnings count */
|
|
|
- if (*num_errors) {
|
|
|
+ if (*num_errors)
|
|
|
results_offset +=
|
|
|
sprintf(qed_get_buf_ptr(results_buf,
|
|
|
results_offset),
|
|
|
"\nIdle Check failed!!! (with %d errors and %d warnings)\n",
|
|
|
*num_errors, *num_warnings);
|
|
|
- } else if (*num_warnings) {
|
|
|
+ else if (*num_warnings)
|
|
|
results_offset +=
|
|
|
sprintf(qed_get_buf_ptr(results_buf,
|
|
|
results_offset),
|
|
|
- "\nIdle Check completed successfuly (with %d warnings)\n",
|
|
|
+ "\nIdle Check completed successfully (with %d warnings)\n",
|
|
|
*num_warnings);
|
|
|
- } else {
|
|
|
+ else
|
|
|
results_offset +=
|
|
|
sprintf(qed_get_buf_ptr(results_buf,
|
|
|
results_offset),
|
|
|
- "\nIdle Check completed successfuly\n");
|
|
|
- }
|
|
|
+ "\nIdle Check completed successfully\n");
|
|
|
|
|
|
/* Add 1 for string NULL termination */
|
|
|
*parsed_results_bytes = results_offset + 1;
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
-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)
|
|
|
-{
|
|
|
- u32 num_errors, num_warnings;
|
|
|
-
|
|
|
- return qed_parse_idle_chk_dump(p_hwfn,
|
|
|
- dump_buf,
|
|
|
- num_dumped_dwords,
|
|
|
- NULL,
|
|
|
- results_buf_size,
|
|
|
- &num_errors, &num_warnings);
|
|
|
-}
|
|
|
-
|
|
|
-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)
|
|
|
-{
|
|
|
- u32 parsed_buf_size;
|
|
|
-
|
|
|
- return qed_parse_idle_chk_dump(p_hwfn,
|
|
|
- dump_buf,
|
|
|
- num_dumped_dwords,
|
|
|
- results_buf,
|
|
|
- &parsed_buf_size,
|
|
|
- num_errors, num_warnings);
|
|
|
-}
|
|
|
-
|
|
|
-/* Frees the specified MCP Trace meta data */
|
|
|
-static void qed_mcp_trace_free_meta(struct qed_hwfn *p_hwfn,
|
|
|
- struct mcp_trace_meta *meta)
|
|
|
+/* Frees the specified MCP Trace meta data */
|
|
|
+static void qed_mcp_trace_free_meta(struct qed_hwfn *p_hwfn,
|
|
|
+ struct mcp_trace_meta *meta)
|
|
|
{
|
|
|
u32 i;
|
|
|
|
|
@@ -5841,12 +6297,10 @@ static enum dbg_status qed_mcp_trace_alloc_meta(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Read first signature */
|
|
|
signature = qed_read_dword_from_buf(meta_buf_bytes, &offset);
|
|
|
- if (signature != MCP_TRACE_META_IMAGE_SIGNATURE)
|
|
|
+ if (signature != NVM_MAGIC_VALUE)
|
|
|
return DBG_STATUS_INVALID_TRACE_SIGNATURE;
|
|
|
|
|
|
- /* Read number of modules and allocate memory for all the modules
|
|
|
- * pointers.
|
|
|
- */
|
|
|
+ /* Read no. of modules and allocate memory for their pointers */
|
|
|
meta->modules_num = qed_read_byte_from_buf(meta_buf_bytes, &offset);
|
|
|
meta->modules = kzalloc(meta->modules_num * sizeof(char *), GFP_KERNEL);
|
|
|
if (!meta->modules)
|
|
@@ -5871,7 +6325,7 @@ static enum dbg_status qed_mcp_trace_alloc_meta(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Read second signature */
|
|
|
signature = qed_read_dword_from_buf(meta_buf_bytes, &offset);
|
|
|
- if (signature != MCP_TRACE_META_IMAGE_SIGNATURE)
|
|
|
+ if (signature != NVM_MAGIC_VALUE)
|
|
|
return DBG_STATUS_INVALID_TRACE_SIGNATURE;
|
|
|
|
|
|
/* Read number of formats and allocate memory for all formats */
|
|
@@ -5919,10 +6373,10 @@ static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
char *results_buf,
|
|
|
u32 *parsed_results_bytes)
|
|
|
{
|
|
|
- u32 results_offset = 0, param_mask, param_shift, param_num_val;
|
|
|
- u32 num_section_params, offset, end_offset, bytes_left;
|
|
|
+ u32 end_offset, bytes_left, trace_data_dwords, trace_meta_dwords;
|
|
|
+ u32 param_mask, param_shift, param_num_val, num_section_params;
|
|
|
const char *section_name, *param_name, *param_str_val;
|
|
|
- u32 trace_data_dwords, trace_meta_dwords;
|
|
|
+ u32 offset, results_offset = 0;
|
|
|
struct mcp_trace_meta meta;
|
|
|
struct mcp_trace *trace;
|
|
|
enum dbg_status status;
|
|
@@ -5955,7 +6409,7 @@ static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Prepare trace info */
|
|
|
trace = (struct mcp_trace *)dump_buf;
|
|
|
- trace_buf = (u8 *)dump_buf + sizeof(struct mcp_trace);
|
|
|
+ trace_buf = (u8 *)dump_buf + sizeof(*trace);
|
|
|
offset = trace->trace_oldest;
|
|
|
end_offset = trace->trace_prod;
|
|
|
bytes_left = qed_cyclic_sub(end_offset, offset, trace->size);
|
|
@@ -5968,7 +6422,7 @@ static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
return DBG_STATUS_MCP_TRACE_BAD_DATA;
|
|
|
dump_buf += qed_read_param(dump_buf,
|
|
|
¶m_name, ¶m_str_val, ¶m_num_val);
|
|
|
- if (strcmp(param_name, "size") != 0)
|
|
|
+ if (strcmp(param_name, "size"))
|
|
|
return DBG_STATUS_MCP_TRACE_BAD_DATA;
|
|
|
trace_meta_dwords = param_num_val;
|
|
|
|
|
@@ -6028,6 +6482,7 @@ static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
}
|
|
|
|
|
|
format_ptr = &meta.formats[format_idx];
|
|
|
+
|
|
|
for (i = 0,
|
|
|
param_mask = MCP_TRACE_FORMAT_P1_SIZE_MASK, param_shift =
|
|
|
MCP_TRACE_FORMAT_P1_SIZE_SHIFT;
|
|
@@ -6050,6 +6505,7 @@ static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
*/
|
|
|
if (param_size == 3)
|
|
|
param_size = 4;
|
|
|
+
|
|
|
if (bytes_left < param_size) {
|
|
|
status = DBG_STATUS_MCP_TRACE_BAD_DATA;
|
|
|
goto free_mem;
|
|
@@ -6059,13 +6515,14 @@ static enum dbg_status qed_parse_mcp_trace_dump(struct qed_hwfn *p_hwfn,
|
|
|
&offset,
|
|
|
trace->size,
|
|
|
param_size);
|
|
|
+
|
|
|
bytes_left -= param_size;
|
|
|
}
|
|
|
|
|
|
format_level =
|
|
|
(u8)((format_ptr->data &
|
|
|
MCP_TRACE_FORMAT_LEVEL_MASK) >>
|
|
|
- MCP_TRACE_FORMAT_LEVEL_SHIFT);
|
|
|
+ MCP_TRACE_FORMAT_LEVEL_SHIFT);
|
|
|
format_module =
|
|
|
(u8)((format_ptr->data &
|
|
|
MCP_TRACE_FORMAT_MODULE_MASK) >>
|
|
@@ -6094,30 +6551,6 @@ free_mem:
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
-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)
|
|
|
-{
|
|
|
- return qed_parse_mcp_trace_dump(p_hwfn,
|
|
|
- dump_buf,
|
|
|
- num_dumped_dwords,
|
|
|
- NULL, results_buf_size);
|
|
|
-}
|
|
|
-
|
|
|
-enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn,
|
|
|
- u32 *dump_buf,
|
|
|
- u32 num_dumped_dwords,
|
|
|
- char *results_buf)
|
|
|
-{
|
|
|
- u32 parsed_buf_size;
|
|
|
-
|
|
|
- return qed_parse_mcp_trace_dump(p_hwfn,
|
|
|
- dump_buf,
|
|
|
- num_dumped_dwords,
|
|
|
- results_buf, &parsed_buf_size);
|
|
|
-}
|
|
|
-
|
|
|
/* Parses a Reg FIFO dump buffer.
|
|
|
* If result_buf is not NULL, the Reg FIFO results are printed to it.
|
|
|
* In any case, the required results buffer size is assigned to
|
|
@@ -6130,10 +6563,11 @@ static enum dbg_status qed_parse_reg_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
char *results_buf,
|
|
|
u32 *parsed_results_bytes)
|
|
|
{
|
|
|
- u32 results_offset = 0, param_num_val, num_section_params, num_elements;
|
|
|
const char *section_name, *param_name, *param_str_val;
|
|
|
+ u32 param_num_val, num_section_params, num_elements;
|
|
|
struct reg_fifo_element *elements;
|
|
|
u8 i, j, err_val, vf_val;
|
|
|
+ u32 results_offset = 0;
|
|
|
char vf_str[4];
|
|
|
|
|
|
/* Read global_params section */
|
|
@@ -6179,17 +6613,17 @@ static enum dbg_status qed_parse_reg_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
"raw: 0x%016llx, address: 0x%07x, access: %-5s, pf: %2d, vf: %s, port: %d, privilege: %-3s, protection: %-12s, master: %-4s, errors: ",
|
|
|
elements[i].data,
|
|
|
(u32)GET_FIELD(elements[i].data,
|
|
|
- REG_FIFO_ELEMENT_ADDRESS) *
|
|
|
- REG_FIFO_ELEMENT_ADDR_FACTOR,
|
|
|
- s_access_strs[GET_FIELD(elements[i].data,
|
|
|
+ REG_FIFO_ELEMENT_ADDRESS) *
|
|
|
+ REG_FIFO_ELEMENT_ADDR_FACTOR,
|
|
|
+ s_access_strs[GET_FIELD(elements[i].data,
|
|
|
REG_FIFO_ELEMENT_ACCESS)],
|
|
|
(u32)GET_FIELD(elements[i].data,
|
|
|
- REG_FIFO_ELEMENT_PF), vf_str,
|
|
|
+ REG_FIFO_ELEMENT_PF),
|
|
|
+ vf_str,
|
|
|
(u32)GET_FIELD(elements[i].data,
|
|
|
- REG_FIFO_ELEMENT_PORT),
|
|
|
- s_privilege_strs[GET_FIELD(elements[i].
|
|
|
- data,
|
|
|
- REG_FIFO_ELEMENT_PRIVILEGE)],
|
|
|
+ REG_FIFO_ELEMENT_PORT),
|
|
|
+ s_privilege_strs[GET_FIELD(elements[i].data,
|
|
|
+ REG_FIFO_ELEMENT_PRIVILEGE)],
|
|
|
s_protection_strs[GET_FIELD(elements[i].data,
|
|
|
REG_FIFO_ELEMENT_PROTECTION)],
|
|
|
s_master_strs[GET_FIELD(elements[i].data,
|
|
@@ -6201,18 +6635,18 @@ static enum dbg_status qed_parse_reg_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
REG_FIFO_ELEMENT_ERROR);
|
|
|
j < ARRAY_SIZE(s_reg_fifo_error_strs);
|
|
|
j++, err_val >>= 1) {
|
|
|
- if (!(err_val & 0x1))
|
|
|
- continue;
|
|
|
- if (err_printed)
|
|
|
+ if (err_val & 0x1) {
|
|
|
+ if (err_printed)
|
|
|
+ results_offset +=
|
|
|
+ sprintf(qed_get_buf_ptr
|
|
|
+ (results_buf,
|
|
|
+ results_offset), ", ");
|
|
|
results_offset +=
|
|
|
- sprintf(qed_get_buf_ptr(results_buf,
|
|
|
- results_offset),
|
|
|
- ", ");
|
|
|
- results_offset +=
|
|
|
- sprintf(qed_get_buf_ptr(results_buf,
|
|
|
- results_offset), "%s",
|
|
|
- s_reg_fifo_error_strs[j]);
|
|
|
- err_printed = true;
|
|
|
+ sprintf(qed_get_buf_ptr
|
|
|
+ (results_buf, results_offset), "%s",
|
|
|
+ s_reg_fifo_error_strs[j]);
|
|
|
+ err_printed = true;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
results_offset +=
|
|
@@ -6225,31 +6659,140 @@ static enum dbg_status qed_parse_reg_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Add 1 for string NULL termination */
|
|
|
*parsed_results_bytes = results_offset + 1;
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
-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)
|
|
|
+static enum dbg_status qed_parse_igu_fifo_element(struct igu_fifo_element
|
|
|
+ *element, char
|
|
|
+ *results_buf,
|
|
|
+ u32 *results_offset,
|
|
|
+ u32 *parsed_results_bytes)
|
|
|
{
|
|
|
- return qed_parse_reg_fifo_dump(p_hwfn,
|
|
|
- dump_buf,
|
|
|
- num_dumped_dwords,
|
|
|
- NULL, results_buf_size);
|
|
|
-}
|
|
|
+ const struct igu_fifo_addr_data *found_addr = NULL;
|
|
|
+ u8 source, err_type, i, is_cleanup;
|
|
|
+ char parsed_addr_data[32];
|
|
|
+ char parsed_wr_data[256];
|
|
|
+ u32 wr_data, prod_cons;
|
|
|
+ bool is_wr_cmd, is_pf;
|
|
|
+ u16 cmd_addr;
|
|
|
+ u64 dword12;
|
|
|
|
|
|
-enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn,
|
|
|
- u32 *dump_buf,
|
|
|
- u32 num_dumped_dwords,
|
|
|
- char *results_buf)
|
|
|
-{
|
|
|
- u32 parsed_buf_size;
|
|
|
+ /* Dword12 (dword index 1 and 2) contains bits 32..95 of the
|
|
|
+ * FIFO element.
|
|
|
+ */
|
|
|
+ dword12 = ((u64)element->dword2 << 32) | element->dword1;
|
|
|
+ is_wr_cmd = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD);
|
|
|
+ is_pf = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_IS_PF);
|
|
|
+ cmd_addr = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR);
|
|
|
+ source = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_SOURCE);
|
|
|
+ err_type = GET_FIELD(element->dword0, IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE);
|
|
|
+
|
|
|
+ if (source >= ARRAY_SIZE(s_igu_fifo_source_strs))
|
|
|
+ return DBG_STATUS_IGU_FIFO_BAD_DATA;
|
|
|
+ if (err_type >= ARRAY_SIZE(s_igu_fifo_error_strs))
|
|
|
+ return DBG_STATUS_IGU_FIFO_BAD_DATA;
|
|
|
|
|
|
- return qed_parse_reg_fifo_dump(p_hwfn,
|
|
|
- dump_buf,
|
|
|
- num_dumped_dwords,
|
|
|
- results_buf, &parsed_buf_size);
|
|
|
+ /* Find address data */
|
|
|
+ for (i = 0; i < ARRAY_SIZE(s_igu_fifo_addr_data) && !found_addr; i++) {
|
|
|
+ const struct igu_fifo_addr_data *curr_addr =
|
|
|
+ &s_igu_fifo_addr_data[i];
|
|
|
+
|
|
|
+ if (cmd_addr >= curr_addr->start_addr && cmd_addr <=
|
|
|
+ curr_addr->end_addr)
|
|
|
+ found_addr = curr_addr;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!found_addr)
|
|
|
+ return DBG_STATUS_IGU_FIFO_BAD_DATA;
|
|
|
+
|
|
|
+ /* Prepare parsed address data */
|
|
|
+ switch (found_addr->type) {
|
|
|
+ case IGU_ADDR_TYPE_MSIX_MEM:
|
|
|
+ sprintf(parsed_addr_data, " vector_num = 0x%x", cmd_addr / 2);
|
|
|
+ break;
|
|
|
+ case IGU_ADDR_TYPE_WRITE_INT_ACK:
|
|
|
+ case IGU_ADDR_TYPE_WRITE_PROD_UPDATE:
|
|
|
+ sprintf(parsed_addr_data,
|
|
|
+ " SB = 0x%x", cmd_addr - found_addr->start_addr);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ parsed_addr_data[0] = '\0';
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!is_wr_cmd) {
|
|
|
+ parsed_wr_data[0] = '\0';
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Prepare parsed write data */
|
|
|
+ wr_data = GET_FIELD(dword12, IGU_FIFO_ELEMENT_DWORD12_WR_DATA);
|
|
|
+ prod_cons = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_PROD_CONS);
|
|
|
+ is_cleanup = GET_FIELD(wr_data, IGU_FIFO_WR_DATA_CMD_TYPE);
|
|
|
+
|
|
|
+ if (source == IGU_SRC_ATTN) {
|
|
|
+ sprintf(parsed_wr_data, "prod: 0x%x, ", prod_cons);
|
|
|
+ } else {
|
|
|
+ if (is_cleanup) {
|
|
|
+ u8 cleanup_val, cleanup_type;
|
|
|
+
|
|
|
+ cleanup_val =
|
|
|
+ GET_FIELD(wr_data,
|
|
|
+ IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL);
|
|
|
+ cleanup_type =
|
|
|
+ GET_FIELD(wr_data,
|
|
|
+ IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE);
|
|
|
+
|
|
|
+ sprintf(parsed_wr_data,
|
|
|
+ "cmd_type: cleanup, cleanup_val: %s, cleanup_type : %d, ",
|
|
|
+ cleanup_val ? "set" : "clear",
|
|
|
+ cleanup_type);
|
|
|
+ } else {
|
|
|
+ u8 update_flag, en_dis_int_for_sb, segment;
|
|
|
+ u8 timer_mask;
|
|
|
+
|
|
|
+ update_flag = GET_FIELD(wr_data,
|
|
|
+ IGU_FIFO_WR_DATA_UPDATE_FLAG);
|
|
|
+ en_dis_int_for_sb =
|
|
|
+ GET_FIELD(wr_data,
|
|
|
+ IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB);
|
|
|
+ segment = GET_FIELD(wr_data,
|
|
|
+ IGU_FIFO_WR_DATA_SEGMENT);
|
|
|
+ timer_mask = GET_FIELD(wr_data,
|
|
|
+ IGU_FIFO_WR_DATA_TIMER_MASK);
|
|
|
+
|
|
|
+ sprintf(parsed_wr_data,
|
|
|
+ "cmd_type: prod/cons update, prod/cons: 0x%x, update_flag: %s, en_dis_int_for_sb : %s, segment : %s, timer_mask = %d, ",
|
|
|
+ prod_cons,
|
|
|
+ update_flag ? "update" : "nop",
|
|
|
+ en_dis_int_for_sb
|
|
|
+ ? (en_dis_int_for_sb == 1 ? "disable" : "nop")
|
|
|
+ : "enable",
|
|
|
+ segment ? "attn" : "regular",
|
|
|
+ timer_mask);
|
|
|
+ }
|
|
|
+ }
|
|
|
+out:
|
|
|
+ /* Add parsed element to parsed buffer */
|
|
|
+ *results_offset += sprintf(qed_get_buf_ptr(results_buf,
|
|
|
+ *results_offset),
|
|
|
+ "raw: 0x%01x%08x%08x, %s: %d, source : %s, type : %s, cmd_addr : 0x%x(%s%s), %serror: %s\n",
|
|
|
+ element->dword2, element->dword1,
|
|
|
+ element->dword0,
|
|
|
+ is_pf ? "pf" : "vf",
|
|
|
+ GET_FIELD(element->dword0,
|
|
|
+ IGU_FIFO_ELEMENT_DWORD0_FID),
|
|
|
+ s_igu_fifo_source_strs[source],
|
|
|
+ is_wr_cmd ? "wr" : "rd",
|
|
|
+ cmd_addr,
|
|
|
+ (!is_pf && found_addr->vf_desc)
|
|
|
+ ? found_addr->vf_desc
|
|
|
+ : found_addr->desc,
|
|
|
+ parsed_addr_data,
|
|
|
+ parsed_wr_data,
|
|
|
+ s_igu_fifo_error_strs[err_type]);
|
|
|
+
|
|
|
+ return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
/* Parses an IGU FIFO dump buffer.
|
|
@@ -6264,12 +6807,12 @@ static enum dbg_status qed_parse_igu_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
char *results_buf,
|
|
|
u32 *parsed_results_bytes)
|
|
|
{
|
|
|
- u32 results_offset = 0, param_num_val, num_section_params, num_elements;
|
|
|
const char *section_name, *param_name, *param_str_val;
|
|
|
+ u32 param_num_val, num_section_params, num_elements;
|
|
|
struct igu_fifo_element *elements;
|
|
|
- char parsed_addr_data[32];
|
|
|
- char parsed_wr_data[256];
|
|
|
- u8 i, j;
|
|
|
+ enum dbg_status status;
|
|
|
+ u32 results_offset = 0;
|
|
|
+ u8 i;
|
|
|
|
|
|
/* Read global_params section */
|
|
|
dump_buf += qed_read_section_hdr(dump_buf,
|
|
@@ -6298,118 +6841,12 @@ static enum dbg_status qed_parse_igu_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Decode elements */
|
|
|
for (i = 0; i < num_elements; i++) {
|
|
|
- /* dword12 (dword index 1 and 2) contains bits 32..95 of the
|
|
|
- * FIFO element.
|
|
|
- */
|
|
|
- u64 dword12 =
|
|
|
- ((u64)elements[i].dword2 << 32) | elements[i].dword1;
|
|
|
- bool is_wr_cmd = GET_FIELD(dword12,
|
|
|
- IGU_FIFO_ELEMENT_DWORD12_IS_WR_CMD);
|
|
|
- bool is_pf = GET_FIELD(elements[i].dword0,
|
|
|
- IGU_FIFO_ELEMENT_DWORD0_IS_PF);
|
|
|
- u16 cmd_addr = GET_FIELD(elements[i].dword0,
|
|
|
- IGU_FIFO_ELEMENT_DWORD0_CMD_ADDR);
|
|
|
- u8 source = GET_FIELD(elements[i].dword0,
|
|
|
- IGU_FIFO_ELEMENT_DWORD0_SOURCE);
|
|
|
- u8 err_type = GET_FIELD(elements[i].dword0,
|
|
|
- IGU_FIFO_ELEMENT_DWORD0_ERR_TYPE);
|
|
|
- const struct igu_fifo_addr_data *addr_data = NULL;
|
|
|
-
|
|
|
- if (source >= ARRAY_SIZE(s_igu_fifo_source_strs))
|
|
|
- return DBG_STATUS_IGU_FIFO_BAD_DATA;
|
|
|
- if (err_type >= ARRAY_SIZE(s_igu_fifo_error_strs))
|
|
|
- return DBG_STATUS_IGU_FIFO_BAD_DATA;
|
|
|
-
|
|
|
- /* Find address data */
|
|
|
- for (j = 0; j < ARRAY_SIZE(s_igu_fifo_addr_data) && !addr_data;
|
|
|
- j++)
|
|
|
- if (cmd_addr >= s_igu_fifo_addr_data[j].start_addr &&
|
|
|
- cmd_addr <= s_igu_fifo_addr_data[j].end_addr)
|
|
|
- addr_data = &s_igu_fifo_addr_data[j];
|
|
|
- if (!addr_data)
|
|
|
- return DBG_STATUS_IGU_FIFO_BAD_DATA;
|
|
|
-
|
|
|
- /* Prepare parsed address data */
|
|
|
- switch (addr_data->type) {
|
|
|
- case IGU_ADDR_TYPE_MSIX_MEM:
|
|
|
- sprintf(parsed_addr_data,
|
|
|
- " vector_num=0x%x", cmd_addr / 2);
|
|
|
- break;
|
|
|
- case IGU_ADDR_TYPE_WRITE_INT_ACK:
|
|
|
- case IGU_ADDR_TYPE_WRITE_PROD_UPDATE:
|
|
|
- sprintf(parsed_addr_data,
|
|
|
- " SB=0x%x", cmd_addr - addr_data->start_addr);
|
|
|
- break;
|
|
|
- default:
|
|
|
- parsed_addr_data[0] = '\0';
|
|
|
- }
|
|
|
-
|
|
|
- /* Prepare parsed write data */
|
|
|
- if (is_wr_cmd) {
|
|
|
- u32 wr_data = GET_FIELD(dword12,
|
|
|
- IGU_FIFO_ELEMENT_DWORD12_WR_DATA);
|
|
|
- u32 prod_cons = GET_FIELD(wr_data,
|
|
|
- IGU_FIFO_WR_DATA_PROD_CONS);
|
|
|
- u8 is_cleanup = GET_FIELD(wr_data,
|
|
|
- IGU_FIFO_WR_DATA_CMD_TYPE);
|
|
|
-
|
|
|
- if (source == IGU_SRC_ATTN) {
|
|
|
- sprintf(parsed_wr_data,
|
|
|
- "prod: 0x%x, ", prod_cons);
|
|
|
- } else {
|
|
|
- if (is_cleanup) {
|
|
|
- u8 cleanup_val = GET_FIELD(wr_data,
|
|
|
- IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_VAL);
|
|
|
- u8 cleanup_type = GET_FIELD(wr_data,
|
|
|
- IGU_FIFO_CLEANUP_WR_DATA_CLEANUP_TYPE);
|
|
|
-
|
|
|
- sprintf(parsed_wr_data,
|
|
|
- "cmd_type: cleanup, cleanup_val: %s, cleanup_type: %d, ",
|
|
|
- cleanup_val ? "set" : "clear",
|
|
|
- cleanup_type);
|
|
|
- } else {
|
|
|
- u8 update_flag = GET_FIELD(wr_data,
|
|
|
- IGU_FIFO_WR_DATA_UPDATE_FLAG);
|
|
|
- u8 en_dis_int_for_sb =
|
|
|
- GET_FIELD(wr_data,
|
|
|
- IGU_FIFO_WR_DATA_EN_DIS_INT_FOR_SB);
|
|
|
- u8 segment = GET_FIELD(wr_data,
|
|
|
- IGU_FIFO_WR_DATA_SEGMENT);
|
|
|
- u8 timer_mask = GET_FIELD(wr_data,
|
|
|
- IGU_FIFO_WR_DATA_TIMER_MASK);
|
|
|
-
|
|
|
- sprintf(parsed_wr_data,
|
|
|
- "cmd_type: prod/cons update, prod/cons: 0x%x, update_flag: %s, en_dis_int_for_sb: %s, segment: %s, timer_mask=%d, ",
|
|
|
- prod_cons,
|
|
|
- update_flag ? "update" : "nop",
|
|
|
- en_dis_int_for_sb
|
|
|
- ? (en_dis_int_for_sb ==
|
|
|
- 1 ? "disable" : "nop") :
|
|
|
- "enable",
|
|
|
- segment ? "attn" : "regular",
|
|
|
- timer_mask);
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- parsed_wr_data[0] = '\0';
|
|
|
- }
|
|
|
-
|
|
|
- /* Add parsed element to parsed buffer */
|
|
|
- results_offset +=
|
|
|
- sprintf(qed_get_buf_ptr(results_buf,
|
|
|
- results_offset),
|
|
|
- "raw: 0x%01x%08x%08x, %s: %d, source: %s, type: %s, cmd_addr: 0x%x (%s%s), %serror: %s\n",
|
|
|
- elements[i].dword2, elements[i].dword1,
|
|
|
- elements[i].dword0,
|
|
|
- is_pf ? "pf" : "vf",
|
|
|
- GET_FIELD(elements[i].dword0,
|
|
|
- IGU_FIFO_ELEMENT_DWORD0_FID),
|
|
|
- s_igu_fifo_source_strs[source],
|
|
|
- is_wr_cmd ? "wr" : "rd", cmd_addr,
|
|
|
- (!is_pf && addr_data->vf_desc)
|
|
|
- ? addr_data->vf_desc : addr_data->desc,
|
|
|
- parsed_addr_data, parsed_wr_data,
|
|
|
- s_igu_fifo_error_strs[err_type]);
|
|
|
+ status = qed_parse_igu_fifo_element(&elements[i],
|
|
|
+ results_buf,
|
|
|
+ &results_offset,
|
|
|
+ parsed_results_bytes);
|
|
|
+ if (status != DBG_STATUS_OK)
|
|
|
+ return status;
|
|
|
}
|
|
|
|
|
|
results_offset += sprintf(qed_get_buf_ptr(results_buf,
|
|
@@ -6418,31 +6855,8 @@ static enum dbg_status qed_parse_igu_fifo_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Add 1 for string NULL termination */
|
|
|
*parsed_results_bytes = results_offset + 1;
|
|
|
- return DBG_STATUS_OK;
|
|
|
-}
|
|
|
-
|
|
|
-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)
|
|
|
-{
|
|
|
- return qed_parse_igu_fifo_dump(p_hwfn,
|
|
|
- dump_buf,
|
|
|
- num_dumped_dwords,
|
|
|
- NULL, results_buf_size);
|
|
|
-}
|
|
|
-
|
|
|
-enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn,
|
|
|
- u32 *dump_buf,
|
|
|
- u32 num_dumped_dwords,
|
|
|
- char *results_buf)
|
|
|
-{
|
|
|
- u32 parsed_buf_size;
|
|
|
|
|
|
- return qed_parse_igu_fifo_dump(p_hwfn,
|
|
|
- dump_buf,
|
|
|
- num_dumped_dwords,
|
|
|
- results_buf, &parsed_buf_size);
|
|
|
+ return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
static enum dbg_status
|
|
@@ -6452,9 +6866,10 @@ qed_parse_protection_override_dump(struct qed_hwfn *p_hwfn,
|
|
|
char *results_buf,
|
|
|
u32 *parsed_results_bytes)
|
|
|
{
|
|
|
- u32 results_offset = 0, param_num_val, num_section_params, num_elements;
|
|
|
const char *section_name, *param_name, *param_str_val;
|
|
|
+ u32 param_num_val, num_section_params, num_elements;
|
|
|
struct protection_override_element *elements;
|
|
|
+ u32 results_offset = 0;
|
|
|
u8 i;
|
|
|
|
|
|
/* Read global_params section */
|
|
@@ -6477,7 +6892,7 @@ qed_parse_protection_override_dump(struct qed_hwfn *p_hwfn,
|
|
|
¶m_name, ¶m_str_val, ¶m_num_val);
|
|
|
if (strcmp(param_name, "size"))
|
|
|
return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
|
|
|
- if (param_num_val % PROTECTION_OVERRIDE_ELEMENT_DWORDS != 0)
|
|
|
+ if (param_num_val % PROTECTION_OVERRIDE_ELEMENT_DWORDS)
|
|
|
return DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA;
|
|
|
num_elements = param_num_val / PROTECTION_OVERRIDE_ELEMENT_DWORDS;
|
|
|
elements = (struct protection_override_element *)dump_buf;
|
|
@@ -6486,7 +6901,7 @@ qed_parse_protection_override_dump(struct qed_hwfn *p_hwfn,
|
|
|
for (i = 0; i < num_elements; i++) {
|
|
|
u32 address = GET_FIELD(elements[i].data,
|
|
|
PROTECTION_OVERRIDE_ELEMENT_ADDRESS) *
|
|
|
- PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR;
|
|
|
+ PROTECTION_OVERRIDE_ELEMENT_ADDR_FACTOR;
|
|
|
|
|
|
results_offset +=
|
|
|
sprintf(qed_get_buf_ptr(results_buf,
|
|
@@ -6512,33 +6927,8 @@ qed_parse_protection_override_dump(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
/* Add 1 for string NULL termination */
|
|
|
*parsed_results_bytes = results_offset + 1;
|
|
|
- return DBG_STATUS_OK;
|
|
|
-}
|
|
|
-
|
|
|
-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)
|
|
|
-{
|
|
|
- return qed_parse_protection_override_dump(p_hwfn,
|
|
|
- dump_buf,
|
|
|
- num_dumped_dwords,
|
|
|
- NULL, results_buf_size);
|
|
|
-}
|
|
|
|
|
|
-enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn,
|
|
|
- u32 *dump_buf,
|
|
|
- u32 num_dumped_dwords,
|
|
|
- char *results_buf)
|
|
|
-{
|
|
|
- u32 parsed_buf_size;
|
|
|
-
|
|
|
- return qed_parse_protection_override_dump(p_hwfn,
|
|
|
- dump_buf,
|
|
|
- num_dumped_dwords,
|
|
|
- results_buf,
|
|
|
- &parsed_buf_size);
|
|
|
+ return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
/* Parses a FW Asserts dump buffer.
|
|
@@ -6553,7 +6943,7 @@ static enum dbg_status qed_parse_fw_asserts_dump(struct qed_hwfn *p_hwfn,
|
|
|
char *results_buf,
|
|
|
u32 *parsed_results_bytes)
|
|
|
{
|
|
|
- u32 results_offset = 0, num_section_params, param_num_val, i;
|
|
|
+ u32 num_section_params, param_num_val, i, results_offset = 0;
|
|
|
const char *param_name, *param_str_val, *section_name;
|
|
|
bool last_section_found = false;
|
|
|
|
|
@@ -6569,54 +6959,216 @@ static enum dbg_status qed_parse_fw_asserts_dump(struct qed_hwfn *p_hwfn,
|
|
|
dump_buf += qed_print_section_params(dump_buf,
|
|
|
num_section_params,
|
|
|
results_buf, &results_offset);
|
|
|
- while (!last_section_found) {
|
|
|
- const char *storm_letter = NULL;
|
|
|
- u32 storm_dump_size = 0;
|
|
|
|
|
|
+ while (!last_section_found) {
|
|
|
dump_buf += qed_read_section_hdr(dump_buf,
|
|
|
§ion_name,
|
|
|
&num_section_params);
|
|
|
- if (!strcmp(section_name, "last")) {
|
|
|
- last_section_found = true;
|
|
|
- continue;
|
|
|
- } else if (strcmp(section_name, "fw_asserts")) {
|
|
|
- return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
|
|
|
- }
|
|
|
+ if (!strcmp(section_name, "fw_asserts")) {
|
|
|
+ /* Extract params */
|
|
|
+ const char *storm_letter = NULL;
|
|
|
+ u32 storm_dump_size = 0;
|
|
|
+
|
|
|
+ for (i = 0; i < num_section_params; i++) {
|
|
|
+ dump_buf += qed_read_param(dump_buf,
|
|
|
+ ¶m_name,
|
|
|
+ ¶m_str_val,
|
|
|
+ ¶m_num_val);
|
|
|
+ if (!strcmp(param_name, "storm"))
|
|
|
+ storm_letter = param_str_val;
|
|
|
+ else if (!strcmp(param_name, "size"))
|
|
|
+ storm_dump_size = param_num_val;
|
|
|
+ else
|
|
|
+ return
|
|
|
+ DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
|
|
|
+ }
|
|
|
|
|
|
- /* Extract params */
|
|
|
- for (i = 0; i < num_section_params; i++) {
|
|
|
- dump_buf += qed_read_param(dump_buf,
|
|
|
- ¶m_name,
|
|
|
- ¶m_str_val,
|
|
|
- ¶m_num_val);
|
|
|
- if (!strcmp(param_name, "storm"))
|
|
|
- storm_letter = param_str_val;
|
|
|
- else if (!strcmp(param_name, "size"))
|
|
|
- storm_dump_size = param_num_val;
|
|
|
- else
|
|
|
+ if (!storm_letter || !storm_dump_size)
|
|
|
return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
|
|
|
- }
|
|
|
-
|
|
|
- if (!storm_letter || !storm_dump_size)
|
|
|
- return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
|
|
|
|
|
|
- /* Print data */
|
|
|
- results_offset += sprintf(qed_get_buf_ptr(results_buf,
|
|
|
- results_offset),
|
|
|
- "\n%sSTORM_ASSERT: size=%d\n",
|
|
|
- storm_letter, storm_dump_size);
|
|
|
- for (i = 0; i < storm_dump_size; i++, dump_buf++)
|
|
|
+ /* Print data */
|
|
|
results_offset +=
|
|
|
sprintf(qed_get_buf_ptr(results_buf,
|
|
|
results_offset),
|
|
|
- "%08x\n", *dump_buf);
|
|
|
+ "\n%sSTORM_ASSERT: size=%d\n",
|
|
|
+ storm_letter, storm_dump_size);
|
|
|
+ for (i = 0; i < storm_dump_size; i++, dump_buf++)
|
|
|
+ results_offset +=
|
|
|
+ sprintf(qed_get_buf_ptr(results_buf,
|
|
|
+ results_offset),
|
|
|
+ "%08x\n", *dump_buf);
|
|
|
+ } else if (!strcmp(section_name, "last")) {
|
|
|
+ last_section_found = true;
|
|
|
+ } else {
|
|
|
+ return DBG_STATUS_FW_ASSERTS_PARSE_FAILED;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Add 1 for string NULL termination */
|
|
|
*parsed_results_bytes = results_offset + 1;
|
|
|
+
|
|
|
+ return DBG_STATUS_OK;
|
|
|
+}
|
|
|
+
|
|
|
+/***************************** Public Functions *******************************/
|
|
|
+
|
|
|
+enum dbg_status qed_dbg_user_set_bin_ptr(const u8 * const bin_ptr)
|
|
|
+{
|
|
|
+ struct bin_buffer_hdr *buf_array = (struct bin_buffer_hdr *)bin_ptr;
|
|
|
+ u8 buf_id;
|
|
|
+
|
|
|
+ /* Convert binary data to debug arrays */
|
|
|
+ for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) {
|
|
|
+ s_user_dbg_arrays[buf_id].ptr =
|
|
|
+ (u32 *)(bin_ptr + buf_array[buf_id].offset);
|
|
|
+ s_user_dbg_arrays[buf_id].size_in_dwords =
|
|
|
+ BYTES_TO_DWORDS(buf_array[buf_id].length);
|
|
|
+ }
|
|
|
+
|
|
|
return DBG_STATUS_OK;
|
|
|
}
|
|
|
|
|
|
+const char *qed_dbg_get_status_str(enum dbg_status status)
|
|
|
+{
|
|
|
+ return (status <
|
|
|
+ MAX_DBG_STATUS) ? s_status_str[status] : "Invalid debug status";
|
|
|
+}
|
|
|
+
|
|
|
+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)
|
|
|
+{
|
|
|
+ u32 num_errors, num_warnings;
|
|
|
+
|
|
|
+ return qed_parse_idle_chk_dump(p_hwfn,
|
|
|
+ dump_buf,
|
|
|
+ num_dumped_dwords,
|
|
|
+ NULL,
|
|
|
+ results_buf_size,
|
|
|
+ &num_errors, &num_warnings);
|
|
|
+}
|
|
|
+
|
|
|
+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)
|
|
|
+{
|
|
|
+ u32 parsed_buf_size;
|
|
|
+
|
|
|
+ return qed_parse_idle_chk_dump(p_hwfn,
|
|
|
+ dump_buf,
|
|
|
+ num_dumped_dwords,
|
|
|
+ results_buf,
|
|
|
+ &parsed_buf_size,
|
|
|
+ num_errors, num_warnings);
|
|
|
+}
|
|
|
+
|
|
|
+void qed_dbg_mcp_trace_set_meta_data(u32 *data, u32 size)
|
|
|
+{
|
|
|
+ s_mcp_trace_meta.ptr = data;
|
|
|
+ s_mcp_trace_meta.size_in_dwords = size;
|
|
|
+}
|
|
|
+
|
|
|
+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)
|
|
|
+{
|
|
|
+ return qed_parse_mcp_trace_dump(p_hwfn,
|
|
|
+ dump_buf,
|
|
|
+ num_dumped_dwords,
|
|
|
+ NULL, results_buf_size);
|
|
|
+}
|
|
|
+
|
|
|
+enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn,
|
|
|
+ u32 *dump_buf,
|
|
|
+ u32 num_dumped_dwords,
|
|
|
+ char *results_buf)
|
|
|
+{
|
|
|
+ u32 parsed_buf_size;
|
|
|
+
|
|
|
+ return qed_parse_mcp_trace_dump(p_hwfn,
|
|
|
+ dump_buf,
|
|
|
+ num_dumped_dwords,
|
|
|
+ results_buf, &parsed_buf_size);
|
|
|
+}
|
|
|
+
|
|
|
+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)
|
|
|
+{
|
|
|
+ return qed_parse_reg_fifo_dump(p_hwfn,
|
|
|
+ dump_buf,
|
|
|
+ num_dumped_dwords,
|
|
|
+ NULL, results_buf_size);
|
|
|
+}
|
|
|
+
|
|
|
+enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn,
|
|
|
+ u32 *dump_buf,
|
|
|
+ u32 num_dumped_dwords,
|
|
|
+ char *results_buf)
|
|
|
+{
|
|
|
+ u32 parsed_buf_size;
|
|
|
+
|
|
|
+ return qed_parse_reg_fifo_dump(p_hwfn,
|
|
|
+ dump_buf,
|
|
|
+ num_dumped_dwords,
|
|
|
+ results_buf, &parsed_buf_size);
|
|
|
+}
|
|
|
+
|
|
|
+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)
|
|
|
+{
|
|
|
+ return qed_parse_igu_fifo_dump(p_hwfn,
|
|
|
+ dump_buf,
|
|
|
+ num_dumped_dwords,
|
|
|
+ NULL, results_buf_size);
|
|
|
+}
|
|
|
+
|
|
|
+enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn,
|
|
|
+ u32 *dump_buf,
|
|
|
+ u32 num_dumped_dwords,
|
|
|
+ char *results_buf)
|
|
|
+{
|
|
|
+ u32 parsed_buf_size;
|
|
|
+
|
|
|
+ return qed_parse_igu_fifo_dump(p_hwfn,
|
|
|
+ dump_buf,
|
|
|
+ num_dumped_dwords,
|
|
|
+ results_buf, &parsed_buf_size);
|
|
|
+}
|
|
|
+
|
|
|
+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)
|
|
|
+{
|
|
|
+ return qed_parse_protection_override_dump(p_hwfn,
|
|
|
+ dump_buf,
|
|
|
+ num_dumped_dwords,
|
|
|
+ NULL, results_buf_size);
|
|
|
+}
|
|
|
+
|
|
|
+enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn,
|
|
|
+ u32 *dump_buf,
|
|
|
+ u32 num_dumped_dwords,
|
|
|
+ char *results_buf)
|
|
|
+{
|
|
|
+ u32 parsed_buf_size;
|
|
|
+
|
|
|
+ return qed_parse_protection_override_dump(p_hwfn,
|
|
|
+ dump_buf,
|
|
|
+ num_dumped_dwords,
|
|
|
+ results_buf,
|
|
|
+ &parsed_buf_size);
|
|
|
+}
|
|
|
+
|
|
|
enum dbg_status qed_get_fw_asserts_results_buf_size(struct qed_hwfn *p_hwfn,
|
|
|
u32 *dump_buf,
|
|
|
u32 num_dumped_dwords,
|