diff options
Diffstat (limited to 'drivers/net/ethernet/qlogic/qed/qed_debug.c')
| -rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_debug.c | 3576 | 
1 files changed, 2189 insertions, 1387 deletions
| diff --git a/drivers/net/ethernet/qlogic/qed/qed_debug.c b/drivers/net/ethernet/qlogic/qed/qed_debug.c index 483241b4b05d..03c3cf77aaff 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_debug.c +++ b/drivers/net/ethernet/qlogic/qed/qed_debug.c @@ -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]; -				found = true; +			/* Read FW version/image */ +			if (dev_data->block_in_reset[storm->block_id]) +				continue; + +			/* 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,24 +5329,108 @@ 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; +} + +enum dbg_status qed_dbg_read_attn(struct qed_hwfn *p_hwfn, +				  struct qed_ptt *p_ptt, +				  enum block_id block_id, +				  enum dbg_attn_type attn_type, +				  bool clear_status, +				  struct dbg_attn_block_result *results) +{ +	enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt); +	u8 reg_idx, num_attn_regs, num_result_regs = 0; +	const struct dbg_attn_reg *attn_reg_arr; + +	if (status != DBG_STATUS_OK) +		return status; + +	if (!s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].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; + +	attn_reg_arr = qed_get_block_attn_regs(block_id, +					       attn_type, &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]; +		struct dbg_attn_reg_result *reg_result; +		u32 sts_addr, sts_val; +		u16 modes_buf_offset; +		bool eval_mode; + +		/* Check mode */ +		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 (eval_mode && !qed_is_mode_match(p_hwfn, &modes_buf_offset)) +			continue; + +		/* Mode match - read attention status register */ +		sts_addr = DWORDS_TO_BYTES(clear_status ? +					   reg_data->sts_clr_address : +					   GET_FIELD(reg_data->data, +						     DBG_ATTN_REG_STS_ADDRESS)); +		sts_val = qed_rd(p_hwfn, p_ptt, sts_addr); +		if (!sts_val) +			continue; + +		/* Non-zero attention status - add to results */ +		reg_result = &results->reg_results[num_result_regs]; +		SET_FIELD(reg_result->data, +			  DBG_ATTN_REG_RESULT_STS_ADDRESS, sts_addr); +		SET_FIELD(reg_result->data, +			  DBG_ATTN_REG_RESULT_NUM_REG_ATTN, +			  GET_FIELD(reg_data->data, DBG_ATTN_REG_NUM_REG_ATTN)); +		reg_result->block_attn_offset = reg_data->block_attn_offset; +		reg_result->sts_val = sts_val; +		reg_result->mask_val = qed_rd(p_hwfn, +					      p_ptt, +					      DWORDS_TO_BYTES +					      (reg_data->mask_address)); +		num_result_regs++; +	} + +	results->block_id = (u8)block_id; +	results->names_offset = +	    qed_get_block_attn_data(block_id, attn_type)->names_offset; +	SET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE, attn_type); +	SET_FIELD(results->data, +		  DBG_ATTN_BLOCK_RESULT_NUM_REGS, num_result_regs); +  	return DBG_STATUS_OK;  }  /******************************* Data Types **********************************/ +struct block_info { +	const char *name; +	enum block_id id; +}; +  struct mcp_trace_format {  	u32 data;  #define MCP_TRACE_FORMAT_MODULE_MASK	0x0000ffff @@ -5005,9 +5445,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 +5460,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 +5585,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 +5602,269 @@ 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} }; + +/* Block names array */ +static struct block_info s_block_info_arr[] = { +	{"grc", BLOCK_GRC}, +	{"miscs", BLOCK_MISCS}, +	{"misc", BLOCK_MISC}, +	{"dbu", BLOCK_DBU}, +	{"pglue_b", BLOCK_PGLUE_B}, +	{"cnig", BLOCK_CNIG}, +	{"cpmu", BLOCK_CPMU}, +	{"ncsi", BLOCK_NCSI}, +	{"opte", BLOCK_OPTE}, +	{"bmb", BLOCK_BMB}, +	{"pcie", BLOCK_PCIE}, +	{"mcp", BLOCK_MCP}, +	{"mcp2", BLOCK_MCP2}, +	{"pswhst", BLOCK_PSWHST}, +	{"pswhst2", BLOCK_PSWHST2}, +	{"pswrd", BLOCK_PSWRD}, +	{"pswrd2", BLOCK_PSWRD2}, +	{"pswwr", BLOCK_PSWWR}, +	{"pswwr2", BLOCK_PSWWR2}, +	{"pswrq", BLOCK_PSWRQ}, +	{"pswrq2", BLOCK_PSWRQ2}, +	{"pglcs", BLOCK_PGLCS}, +	{"ptu", BLOCK_PTU}, +	{"dmae", BLOCK_DMAE}, +	{"tcm", BLOCK_TCM}, +	{"mcm", BLOCK_MCM}, +	{"ucm", BLOCK_UCM}, +	{"xcm", BLOCK_XCM}, +	{"ycm", BLOCK_YCM}, +	{"pcm", BLOCK_PCM}, +	{"qm", BLOCK_QM}, +	{"tm", BLOCK_TM}, +	{"dorq", BLOCK_DORQ}, +	{"brb", BLOCK_BRB}, +	{"src", BLOCK_SRC}, +	{"prs", BLOCK_PRS}, +	{"tsdm", BLOCK_TSDM}, +	{"msdm", BLOCK_MSDM}, +	{"usdm", BLOCK_USDM}, +	{"xsdm", BLOCK_XSDM}, +	{"ysdm", BLOCK_YSDM}, +	{"psdm", BLOCK_PSDM}, +	{"tsem", BLOCK_TSEM}, +	{"msem", BLOCK_MSEM}, +	{"usem", BLOCK_USEM}, +	{"xsem", BLOCK_XSEM}, +	{"ysem", BLOCK_YSEM}, +	{"psem", BLOCK_PSEM}, +	{"rss", BLOCK_RSS}, +	{"tmld", BLOCK_TMLD}, +	{"muld", BLOCK_MULD}, +	{"yuld", BLOCK_YULD}, +	{"xyld", BLOCK_XYLD}, +	{"ptld", BLOCK_PTLD}, +	{"ypld", BLOCK_YPLD}, +	{"prm", BLOCK_PRM}, +	{"pbf_pb1", BLOCK_PBF_PB1}, +	{"pbf_pb2", BLOCK_PBF_PB2}, +	{"rpb", BLOCK_RPB}, +	{"btb", BLOCK_BTB}, +	{"pbf", BLOCK_PBF}, +	{"rdif", BLOCK_RDIF}, +	{"tdif", BLOCK_TDIF}, +	{"cdu", BLOCK_CDU}, +	{"ccfc", BLOCK_CCFC}, +	{"tcfc", BLOCK_TCFC}, +	{"igu", BLOCK_IGU}, +	{"cau", BLOCK_CAU}, +	{"rgfs", BLOCK_RGFS}, +	{"rgsrc", BLOCK_RGSRC}, +	{"tgfs", BLOCK_TGFS}, +	{"tgsrc", BLOCK_TGSRC}, +	{"umac", BLOCK_UMAC}, +	{"xmac", BLOCK_XMAC}, +	{"dbg", BLOCK_DBG}, +	{"nig", BLOCK_NIG}, +	{"wol", BLOCK_WOL}, +	{"bmbn", BLOCK_BMBN}, +	{"ipc", BLOCK_IPC}, +	{"nwm", BLOCK_NWM}, +	{"nws", BLOCK_NWS}, +	{"ms", BLOCK_MS}, +	{"phy_pcie", BLOCK_PHY_PCIE}, +	{"led", BLOCK_LED}, +	{"avs_wrap", BLOCK_AVS_WRAP}, +	{"misc_aeu", BLOCK_MISC_AEU}, +	{"bar0_map", BLOCK_BAR0_MAP} +}; +  /* 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 +5881,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 +5895,7 @@ static const char * const s_privilege_strs[] = {  	"UA"  }; +/* Protection type names array */  static const char * const s_protection_strs[] = {  	"(default)",  	"(default)", @@ -5247,6 +5907,7 @@ static const char * const s_protection_strs[] = {  	"override UA"  }; +/* Master type names array */  static const char * const s_master_strs[] = {  	"???",  	"pxp", @@ -5266,6 +5927,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 +5936,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 +5951,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 +5972,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 +6000,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 +6011,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 +6036,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 +6065,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 +6099,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 +6147,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 +6185,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 +6199,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 +6215,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 +6258,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 +6312,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 +6333,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 +6361,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 +6383,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,64 +6400,33 @@ 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); +	return DBG_STATUS_OK;  }  /* Frees the specified MCP Trace meta data */ @@ -5841,12 +6465,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 +6493,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 +6541,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 +6577,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 +6590,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 +6650,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 +6673,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 +6683,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 +6719,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 +6731,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 +6781,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 +6803,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 +6827,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 +6975,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 +7009,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 +7023,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 +7034,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 +7060,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 +7069,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 +7095,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 +7111,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 +7127,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, @@ -6641,6 +7361,88 @@ enum dbg_status qed_print_fw_asserts_results(struct qed_hwfn *p_hwfn,  					 results_buf, &parsed_buf_size);  } +enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn, +				   struct dbg_attn_block_result *results) +{ +	struct user_dbg_array *block_attn, *pstrings; +	const u32 *block_attn_name_offsets; +	enum dbg_attn_type attn_type; +	const char *block_name; +	u8 num_regs, i, j; + +	num_regs = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_NUM_REGS); +	attn_type = (enum dbg_attn_type) +		    GET_FIELD(results->data, +			      DBG_ATTN_BLOCK_RESULT_ATTN_TYPE); +	block_name = s_block_info_arr[results->block_id].name; + +	if (!s_user_dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr || +	    !s_user_dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr || +	    !s_user_dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr) +		return DBG_STATUS_DBG_ARRAY_NOT_SET; + +	block_attn = &s_user_dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS]; +	block_attn_name_offsets = &block_attn->ptr[results->names_offset]; + +	/* Go over registers with a non-zero attention status */ +	for (i = 0; i < num_regs; i++) { +		struct dbg_attn_reg_result *reg_result; +		struct dbg_attn_bit_mapping *mapping; +		u8 num_reg_attn, bit_idx = 0; + +		reg_result = &results->reg_results[i]; +		num_reg_attn = GET_FIELD(reg_result->data, +					 DBG_ATTN_REG_RESULT_NUM_REG_ATTN); +		block_attn = &s_user_dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES]; +		mapping = &((struct dbg_attn_bit_mapping *) +			    block_attn->ptr)[reg_result->block_attn_offset]; + +		pstrings = &s_user_dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS]; + +		/* Go over attention status bits */ +		for (j = 0; j < num_reg_attn; j++) { +			u16 attn_idx_val = GET_FIELD(mapping[j].data, +						     DBG_ATTN_BIT_MAPPING_VAL); +			const char *attn_name, *attn_type_str, *masked_str; +			u32 name_offset, sts_addr; + +			/* Check if bit mask should be advanced (due to unused +			 * bits). +			 */ +			if (GET_FIELD(mapping[j].data, +				      DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT)) { +				bit_idx += (u8)attn_idx_val; +				continue; +			} + +			/* Check current bit index */ +			if (!(reg_result->sts_val & BIT(bit_idx))) { +				bit_idx++; +				continue; +			} + +			/* Find attention name */ +			name_offset = block_attn_name_offsets[attn_idx_val]; +			attn_name = &((const char *) +				      pstrings->ptr)[name_offset]; +			attn_type_str = attn_type == ATTN_TYPE_INTERRUPT ? +					"Interrupt" : "Parity"; +			masked_str = reg_result->mask_val & BIT(bit_idx) ? +				     " [masked]" : ""; +			sts_addr = GET_FIELD(reg_result->data, +					     DBG_ATTN_REG_RESULT_STS_ADDRESS); +			DP_NOTICE(p_hwfn, +				  "%s (%s) : %s [address 0x%08x, bit %d]%s\n", +				  block_name, attn_type_str, attn_name, +				  sts_addr, bit_idx, masked_str); + +			bit_idx++; +		} +	} + +	return DBG_STATUS_OK; +} +  /* Wrapper for unifying the idle_chk and mcp_trace api */  static enum dbg_status  qed_print_idle_chk_results_wrapper(struct qed_hwfn *p_hwfn, | 
