114b24e2bSVaishali Kulkarni /*
214b24e2bSVaishali Kulkarni * CDDL HEADER START
314b24e2bSVaishali Kulkarni *
414b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the
514b24e2bSVaishali Kulkarni * Common Development and Distribution License, v.1,  (the "License").
614b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
714b24e2bSVaishali Kulkarni *
814b24e2bSVaishali Kulkarni * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
914b24e2bSVaishali Kulkarni * or http://opensource.org/licenses/CDDL-1.0.
1014b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions
1114b24e2bSVaishali Kulkarni * and limitations under the License.
1214b24e2bSVaishali Kulkarni *
1314b24e2bSVaishali Kulkarni * When distributing Covered Code, include this CDDL HEADER in each
1414b24e2bSVaishali Kulkarni * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1514b24e2bSVaishali Kulkarni * If applicable, add the following below this CDDL HEADER, with the
1614b24e2bSVaishali Kulkarni * fields enclosed by brackets "[]" replaced with your own identifying
1714b24e2bSVaishali Kulkarni * information: Portions Copyright [yyyy] [name of copyright owner]
1814b24e2bSVaishali Kulkarni *
1914b24e2bSVaishali Kulkarni * CDDL HEADER END
2014b24e2bSVaishali Kulkarni */
2114b24e2bSVaishali Kulkarni 
2214b24e2bSVaishali Kulkarni /*
2314b24e2bSVaishali Kulkarni * Copyright 2014-2017 Cavium, Inc.
2414b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the Common Development
2514b24e2bSVaishali Kulkarni * and Distribution License, v.1,  (the "License").
2614b24e2bSVaishali Kulkarni 
2714b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
2814b24e2bSVaishali Kulkarni 
2914b24e2bSVaishali Kulkarni * You can obtain a copy of the License at available
3014b24e2bSVaishali Kulkarni * at http://opensource.org/licenses/CDDL-1.0
3114b24e2bSVaishali Kulkarni 
3214b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions and
3314b24e2bSVaishali Kulkarni * limitations under the License.
3414b24e2bSVaishali Kulkarni */
3514b24e2bSVaishali Kulkarni 
3614b24e2bSVaishali Kulkarni #include "bcm_osal.h"
3714b24e2bSVaishali Kulkarni #include "ecore.h"
3814b24e2bSVaishali Kulkarni #include "ecore_hw.h"
3914b24e2bSVaishali Kulkarni #include "ecore_mcp.h"
4014b24e2bSVaishali Kulkarni #include "spad_layout.h"
4114b24e2bSVaishali Kulkarni #include "nvm_map.h"
4214b24e2bSVaishali Kulkarni #include "reg_addr.h"
4314b24e2bSVaishali Kulkarni #include "ecore_hsi_common.h"
4414b24e2bSVaishali Kulkarni #include "ecore_hsi_debug_tools.h"
4514b24e2bSVaishali Kulkarni #include "mcp_public.h"
4614b24e2bSVaishali Kulkarni #include "nvm_map.h"
4714b24e2bSVaishali Kulkarni #ifndef USE_DBG_BIN_FILE
4814b24e2bSVaishali Kulkarni #include "ecore_dbg_values.h"
4914b24e2bSVaishali Kulkarni #endif
5014b24e2bSVaishali Kulkarni #include "ecore_dbg_fw_funcs.h"
5114b24e2bSVaishali Kulkarni 
5214b24e2bSVaishali Kulkarni /* Memory groups enum */
5314b24e2bSVaishali Kulkarni enum mem_groups {
5414b24e2bSVaishali Kulkarni 	MEM_GROUP_PXP_MEM,
5514b24e2bSVaishali Kulkarni 	MEM_GROUP_DMAE_MEM,
5614b24e2bSVaishali Kulkarni 	MEM_GROUP_CM_MEM,
5714b24e2bSVaishali Kulkarni 	MEM_GROUP_QM_MEM,
5814b24e2bSVaishali Kulkarni 	MEM_GROUP_TM_MEM,
5914b24e2bSVaishali Kulkarni 	MEM_GROUP_BRB_RAM,
6014b24e2bSVaishali Kulkarni 	MEM_GROUP_BRB_MEM,
6114b24e2bSVaishali Kulkarni 	MEM_GROUP_PRS_MEM,
6214b24e2bSVaishali Kulkarni 	MEM_GROUP_SDM_MEM,
6314b24e2bSVaishali Kulkarni 	MEM_GROUP_IOR,
6414b24e2bSVaishali Kulkarni 	MEM_GROUP_RAM,
6514b24e2bSVaishali Kulkarni 	MEM_GROUP_BTB_RAM,
6614b24e2bSVaishali Kulkarni 	MEM_GROUP_RDIF_CTX,
6714b24e2bSVaishali Kulkarni 	MEM_GROUP_TDIF_CTX,
6814b24e2bSVaishali Kulkarni 	MEM_GROUP_CFC_MEM,
6914b24e2bSVaishali Kulkarni 	MEM_GROUP_CONN_CFC_MEM,
7014b24e2bSVaishali Kulkarni 	MEM_GROUP_TASK_CFC_MEM,
7114b24e2bSVaishali Kulkarni 	MEM_GROUP_CAU_PI,
7214b24e2bSVaishali Kulkarni 	MEM_GROUP_CAU_MEM,
7314b24e2bSVaishali Kulkarni 	MEM_GROUP_PXP_ILT,
7414b24e2bSVaishali Kulkarni 	MEM_GROUP_PBUF,
7514b24e2bSVaishali Kulkarni 	MEM_GROUP_MULD_MEM,
7614b24e2bSVaishali Kulkarni 	MEM_GROUP_BTB_MEM,
7714b24e2bSVaishali Kulkarni 	MEM_GROUP_IGU_MEM,
7814b24e2bSVaishali Kulkarni 	MEM_GROUP_IGU_MSIX,
7914b24e2bSVaishali Kulkarni 	MEM_GROUP_CAU_SB,
8014b24e2bSVaishali Kulkarni 	MEM_GROUP_BMB_RAM,
8114b24e2bSVaishali Kulkarni 	MEM_GROUP_BMB_MEM,
8214b24e2bSVaishali Kulkarni 	MEM_GROUPS_NUM
8314b24e2bSVaishali Kulkarni };
8414b24e2bSVaishali Kulkarni 
8514b24e2bSVaishali Kulkarni /* Memory groups names */
8614b24e2bSVaishali Kulkarni static const char* s_mem_group_names[] = {
8714b24e2bSVaishali Kulkarni 	"PXP_MEM",
8814b24e2bSVaishali Kulkarni 	"DMAE_MEM",
8914b24e2bSVaishali Kulkarni 	"CM_MEM",
9014b24e2bSVaishali Kulkarni 	"QM_MEM",
9114b24e2bSVaishali Kulkarni 	"TM_MEM",
9214b24e2bSVaishali Kulkarni 	"BRB_RAM",
9314b24e2bSVaishali Kulkarni 	"BRB_MEM",
9414b24e2bSVaishali Kulkarni 	"PRS_MEM",
9514b24e2bSVaishali Kulkarni 	"SDM_MEM",
9614b24e2bSVaishali Kulkarni 	"IOR",
9714b24e2bSVaishali Kulkarni 	"RAM",
9814b24e2bSVaishali Kulkarni 	"BTB_RAM",
9914b24e2bSVaishali Kulkarni 	"RDIF_CTX",
10014b24e2bSVaishali Kulkarni 	"TDIF_CTX",
10114b24e2bSVaishali Kulkarni 	"CFC_MEM",
10214b24e2bSVaishali Kulkarni 	"CONN_CFC_MEM",
10314b24e2bSVaishali Kulkarni 	"TASK_CFC_MEM",
10414b24e2bSVaishali Kulkarni 	"CAU_PI",
10514b24e2bSVaishali Kulkarni 	"CAU_MEM",
10614b24e2bSVaishali Kulkarni 	"PXP_ILT",
10714b24e2bSVaishali Kulkarni 	"PBUF",
10814b24e2bSVaishali Kulkarni 	"MULD_MEM",
10914b24e2bSVaishali Kulkarni 	"BTB_MEM",
11014b24e2bSVaishali Kulkarni 	"IGU_MEM",
11114b24e2bSVaishali Kulkarni 	"IGU_MSIX",
11214b24e2bSVaishali Kulkarni 	"CAU_SB",
11314b24e2bSVaishali Kulkarni 	"BMB_RAM",
11414b24e2bSVaishali Kulkarni 	"BMB_MEM",
11514b24e2bSVaishali Kulkarni };
11614b24e2bSVaishali Kulkarni 
11714b24e2bSVaishali Kulkarni /* Idle check conditions */
11814b24e2bSVaishali Kulkarni 
11914b24e2bSVaishali Kulkarni #ifndef __PREVENT_COND_ARR__
12014b24e2bSVaishali Kulkarni 
cond5(const u32 * r,const u32 * imm)12114b24e2bSVaishali Kulkarni static u32 cond5(const u32 *r, const u32 *imm) {
12214b24e2bSVaishali Kulkarni 	return (((r[0] & imm[0]) != imm[1]) && ((r[1] & imm[2]) != imm[3]));
12314b24e2bSVaishali Kulkarni }
12414b24e2bSVaishali Kulkarni 
cond7(const u32 * r,const u32 * imm)12514b24e2bSVaishali Kulkarni static u32 cond7(const u32 *r, const u32 *imm) {
12614b24e2bSVaishali Kulkarni 	return (((r[0] >> imm[0]) & imm[1]) != imm[2]);
12714b24e2bSVaishali Kulkarni }
12814b24e2bSVaishali Kulkarni 
cond14(const u32 * r,const u32 * imm)12914b24e2bSVaishali Kulkarni static u32 cond14(const u32 *r, const u32 *imm) {
13014b24e2bSVaishali Kulkarni 	return ((r[0] != imm[0]) && (((r[1] >> imm[1]) & imm[2]) == imm[3]));
13114b24e2bSVaishali Kulkarni }
13214b24e2bSVaishali Kulkarni 
cond6(const u32 * r,const u32 * imm)13314b24e2bSVaishali Kulkarni static u32 cond6(const u32 *r, const u32 *imm) {
13414b24e2bSVaishali Kulkarni 	return ((r[0] & imm[0]) != imm[1]);
13514b24e2bSVaishali Kulkarni }
13614b24e2bSVaishali Kulkarni 
cond9(const u32 * r,const u32 * imm)13714b24e2bSVaishali Kulkarni static u32 cond9(const u32 *r, const u32 *imm) {
13814b24e2bSVaishali Kulkarni 	return ((r[0] & imm[0]) >> imm[1]) != (((r[0] & imm[2]) >> imm[3]) | ((r[1] & imm[4]) << imm[5]));
13914b24e2bSVaishali Kulkarni }
14014b24e2bSVaishali Kulkarni 
cond10(const u32 * r,const u32 * imm)14114b24e2bSVaishali Kulkarni static u32 cond10(const u32 *r, const u32 *imm) {
14214b24e2bSVaishali Kulkarni 	return ((r[0] & imm[0]) >> imm[1]) != (r[0] & imm[2]);
14314b24e2bSVaishali Kulkarni }
14414b24e2bSVaishali Kulkarni 
cond4(const u32 * r,const u32 * imm)14514b24e2bSVaishali Kulkarni static u32 cond4(const u32 *r, const u32 *imm) {
14614b24e2bSVaishali Kulkarni 	return ((r[0] & ~imm[0]) != imm[1]);
14714b24e2bSVaishali Kulkarni }
14814b24e2bSVaishali Kulkarni 
cond0(const u32 * r,const u32 * imm)14914b24e2bSVaishali Kulkarni static u32 cond0(const u32 *r, const u32 *imm) {
15014b24e2bSVaishali Kulkarni 	return ((r[0] & ~r[1]) != imm[0]);
15114b24e2bSVaishali Kulkarni }
15214b24e2bSVaishali Kulkarni 
cond1(const u32 * r,const u32 * imm)15314b24e2bSVaishali Kulkarni static u32 cond1(const u32 *r, const u32 *imm) {
15414b24e2bSVaishali Kulkarni 	return (r[0] != imm[0]);
15514b24e2bSVaishali Kulkarni }
15614b24e2bSVaishali Kulkarni 
cond11(const u32 * r,const u32 * imm)15714b24e2bSVaishali Kulkarni static u32 cond11(const u32 *r, const u32 *imm) {
15814b24e2bSVaishali Kulkarni 	return (r[0] != r[1] && r[2] == imm[0]);
15914b24e2bSVaishali Kulkarni }
16014b24e2bSVaishali Kulkarni 
cond12(const u32 * r,const u32 * imm)16114b24e2bSVaishali Kulkarni static u32 cond12(const u32 *r, const u32 *imm) {
16214b24e2bSVaishali Kulkarni 	return (r[0] != r[1] && r[2] > imm[0]);
16314b24e2bSVaishali Kulkarni }
16414b24e2bSVaishali Kulkarni 
cond3(const u32 * r,const u32 * imm)16514b24e2bSVaishali Kulkarni static u32 cond3(const u32 *r, const u32 *imm) {
16614b24e2bSVaishali Kulkarni 	return (r[0] != r[1]);
16714b24e2bSVaishali Kulkarni }
16814b24e2bSVaishali Kulkarni 
cond13(const u32 * r,const u32 * imm)16914b24e2bSVaishali Kulkarni static u32 cond13(const u32 *r, const u32 *imm) {
17014b24e2bSVaishali Kulkarni 	return (r[0] & imm[0]);
17114b24e2bSVaishali Kulkarni }
17214b24e2bSVaishali Kulkarni 
cond8(const u32 * r,const u32 * imm)17314b24e2bSVaishali Kulkarni static u32 cond8(const u32 *r, const u32 *imm) {
17414b24e2bSVaishali Kulkarni 	return (r[0] < (r[1] - imm[0]));
17514b24e2bSVaishali Kulkarni }
17614b24e2bSVaishali Kulkarni 
cond2(const u32 * r,const u32 * imm)17714b24e2bSVaishali Kulkarni static u32 cond2(const u32 *r, const u32 *imm) {
17814b24e2bSVaishali Kulkarni 	return (r[0] > imm[0]);
17914b24e2bSVaishali Kulkarni }
18014b24e2bSVaishali Kulkarni 
18114b24e2bSVaishali Kulkarni /* Array of Idle Check conditions */
18214b24e2bSVaishali Kulkarni static u32 (*cond_arr[])(const u32 *r, const u32 *imm) = {
18314b24e2bSVaishali Kulkarni 	cond0,
18414b24e2bSVaishali Kulkarni 	cond1,
18514b24e2bSVaishali Kulkarni 	cond2,
18614b24e2bSVaishali Kulkarni 	cond3,
18714b24e2bSVaishali Kulkarni 	cond4,
18814b24e2bSVaishali Kulkarni 	cond5,
18914b24e2bSVaishali Kulkarni 	cond6,
19014b24e2bSVaishali Kulkarni 	cond7,
19114b24e2bSVaishali Kulkarni 	cond8,
19214b24e2bSVaishali Kulkarni 	cond9,
19314b24e2bSVaishali Kulkarni 	cond10,
19414b24e2bSVaishali Kulkarni 	cond11,
19514b24e2bSVaishali Kulkarni 	cond12,
19614b24e2bSVaishali Kulkarni 	cond13,
19714b24e2bSVaishali Kulkarni 	cond14,
19814b24e2bSVaishali Kulkarni };
19914b24e2bSVaishali Kulkarni 
20014b24e2bSVaishali Kulkarni #endif /* __PREVENT_COND_ARR__ */
20114b24e2bSVaishali Kulkarni 
20214b24e2bSVaishali Kulkarni 
20314b24e2bSVaishali Kulkarni /******************************* Data Types **********************************/
20414b24e2bSVaishali Kulkarni 
20514b24e2bSVaishali Kulkarni enum platform_ids {
20614b24e2bSVaishali Kulkarni 	PLATFORM_ASIC,
20714b24e2bSVaishali Kulkarni 	PLATFORM_EMUL_FULL,
20814b24e2bSVaishali Kulkarni 	PLATFORM_EMUL_REDUCED,
20914b24e2bSVaishali Kulkarni 	PLATFORM_FPGA,
21014b24e2bSVaishali Kulkarni 	MAX_PLATFORM_IDS
21114b24e2bSVaishali Kulkarni };
21214b24e2bSVaishali Kulkarni 
21314b24e2bSVaishali Kulkarni struct chip_platform_defs {
21414b24e2bSVaishali Kulkarni 	u8 num_ports;
21514b24e2bSVaishali Kulkarni 	u8 num_pfs;
21614b24e2bSVaishali Kulkarni 	u8 num_vfs;
21714b24e2bSVaishali Kulkarni };
21814b24e2bSVaishali Kulkarni 
21914b24e2bSVaishali Kulkarni /* Chip constant definitions */
22014b24e2bSVaishali Kulkarni struct chip_defs {
22114b24e2bSVaishali Kulkarni 	const char *name;
22214b24e2bSVaishali Kulkarni 	struct chip_platform_defs per_platform[MAX_PLATFORM_IDS];
22314b24e2bSVaishali Kulkarni };
22414b24e2bSVaishali Kulkarni 
22514b24e2bSVaishali Kulkarni /* Platform constant definitions */
22614b24e2bSVaishali Kulkarni struct platform_defs {
22714b24e2bSVaishali Kulkarni 	const char *name;
22814b24e2bSVaishali Kulkarni 	u32 delay_factor;
22914b24e2bSVaishali Kulkarni };
23014b24e2bSVaishali Kulkarni 
23114b24e2bSVaishali Kulkarni /* Storm constant definitions.
23214b24e2bSVaishali Kulkarni  * Addresses are in bytes, sizes are in quad-regs.
23314b24e2bSVaishali Kulkarni  */
23414b24e2bSVaishali Kulkarni struct storm_defs {
23514b24e2bSVaishali Kulkarni 	char letter;
23614b24e2bSVaishali Kulkarni 	enum block_id block_id;
23714b24e2bSVaishali Kulkarni 	enum dbg_bus_clients dbg_client_id[MAX_CHIP_IDS];
23814b24e2bSVaishali Kulkarni 	bool has_vfc;
23914b24e2bSVaishali Kulkarni 	u32 sem_fast_mem_addr;
24014b24e2bSVaishali Kulkarni 	u32 sem_frame_mode_addr;
24114b24e2bSVaishali Kulkarni 	u32 sem_slow_enable_addr;
24214b24e2bSVaishali Kulkarni 	u32 sem_slow_mode_addr;
24314b24e2bSVaishali Kulkarni 	u32 sem_slow_mode1_conf_addr;
24414b24e2bSVaishali Kulkarni 	u32 sem_sync_dbg_empty_addr;
24514b24e2bSVaishali Kulkarni 	u32 sem_slow_dbg_empty_addr;
24614b24e2bSVaishali Kulkarni 	u32 cm_ctx_wr_addr;
24714b24e2bSVaishali Kulkarni 	u32 cm_conn_ag_ctx_lid_size;
24814b24e2bSVaishali Kulkarni 	u32 cm_conn_ag_ctx_rd_addr;
24914b24e2bSVaishali Kulkarni 	u32 cm_conn_st_ctx_lid_size;
25014b24e2bSVaishali Kulkarni 	u32 cm_conn_st_ctx_rd_addr;
25114b24e2bSVaishali Kulkarni 	u32 cm_task_ag_ctx_lid_size;
25214b24e2bSVaishali Kulkarni 	u32 cm_task_ag_ctx_rd_addr;
25314b24e2bSVaishali Kulkarni 	u32 cm_task_st_ctx_lid_size;
25414b24e2bSVaishali Kulkarni 	u32 cm_task_st_ctx_rd_addr;
25514b24e2bSVaishali Kulkarni };
25614b24e2bSVaishali Kulkarni 
25714b24e2bSVaishali Kulkarni /* Block constant definitions */
25814b24e2bSVaishali Kulkarni struct block_defs {
25914b24e2bSVaishali Kulkarni 	const char *name;
26014b24e2bSVaishali Kulkarni 	bool has_dbg_bus[MAX_CHIP_IDS];
26114b24e2bSVaishali Kulkarni 	bool associated_to_storm;
26214b24e2bSVaishali Kulkarni 
26314b24e2bSVaishali Kulkarni 	/* Valid only if associated_to_storm is true */
26414b24e2bSVaishali Kulkarni 	u32 storm_id;
26514b24e2bSVaishali Kulkarni 	enum dbg_bus_clients dbg_client_id[MAX_CHIP_IDS];
26614b24e2bSVaishali Kulkarni 	u32 dbg_select_addr;
26714b24e2bSVaishali Kulkarni 	u32 dbg_enable_addr;
26814b24e2bSVaishali Kulkarni 	u32 dbg_shift_addr;
26914b24e2bSVaishali Kulkarni 	u32 dbg_force_valid_addr;
27014b24e2bSVaishali Kulkarni 	u32 dbg_force_frame_addr;
27114b24e2bSVaishali Kulkarni 	bool has_reset_bit;
27214b24e2bSVaishali Kulkarni 
27314b24e2bSVaishali Kulkarni 	/* If true, block is taken out of reset before dump */
27414b24e2bSVaishali Kulkarni 	bool unreset;
27514b24e2bSVaishali Kulkarni 	enum dbg_reset_regs reset_reg;
27614b24e2bSVaishali Kulkarni 
27714b24e2bSVaishali Kulkarni 	/* Bit offset in reset register */
27814b24e2bSVaishali Kulkarni 	u8 reset_bit_offset;
27914b24e2bSVaishali Kulkarni };
28014b24e2bSVaishali Kulkarni 
28114b24e2bSVaishali Kulkarni /* Reset register definitions */
28214b24e2bSVaishali Kulkarni struct reset_reg_defs {
28314b24e2bSVaishali Kulkarni 	u32 addr;
28414b24e2bSVaishali Kulkarni 	u32 unreset_val;
28514b24e2bSVaishali Kulkarni 	bool exists[MAX_CHIP_IDS];
28614b24e2bSVaishali Kulkarni };
28714b24e2bSVaishali Kulkarni 
28814b24e2bSVaishali Kulkarni /* Debug Bus Constraint operation constant definitions */
28914b24e2bSVaishali Kulkarni struct dbg_bus_constraint_op_defs {
29014b24e2bSVaishali Kulkarni 	u8 hw_op_val;
29114b24e2bSVaishali Kulkarni 	bool is_cyclic;
29214b24e2bSVaishali Kulkarni };
29314b24e2bSVaishali Kulkarni 
29414b24e2bSVaishali Kulkarni /* Storm Mode definitions */
29514b24e2bSVaishali Kulkarni struct storm_mode_defs {
29614b24e2bSVaishali Kulkarni 	const char *name;
29714b24e2bSVaishali Kulkarni 	bool is_fast_dbg;
29814b24e2bSVaishali Kulkarni 	u8 id_in_hw;
29914b24e2bSVaishali Kulkarni };
30014b24e2bSVaishali Kulkarni 
30114b24e2bSVaishali Kulkarni struct grc_param_defs {
30214b24e2bSVaishali Kulkarni 	u32 default_val[MAX_CHIP_IDS];
30314b24e2bSVaishali Kulkarni 	u32 min;
30414b24e2bSVaishali Kulkarni 	u32 max;
30514b24e2bSVaishali Kulkarni 	bool is_preset;
30614b24e2bSVaishali Kulkarni 	u32 exclude_all_preset_val;
30714b24e2bSVaishali Kulkarni 	u32 crash_preset_val;
30814b24e2bSVaishali Kulkarni };
30914b24e2bSVaishali Kulkarni 
31014b24e2bSVaishali Kulkarni /* address is in 128b units. Width is in bits. */
31114b24e2bSVaishali Kulkarni struct rss_mem_defs {
31214b24e2bSVaishali Kulkarni 	const char *mem_name;
31314b24e2bSVaishali Kulkarni 	const char *type_name;
31414b24e2bSVaishali Kulkarni 	u32 addr;
31514b24e2bSVaishali Kulkarni 	u32 num_entries[MAX_CHIP_IDS];
31614b24e2bSVaishali Kulkarni 	u32 entry_width[MAX_CHIP_IDS];
31714b24e2bSVaishali Kulkarni };
31814b24e2bSVaishali Kulkarni 
31914b24e2bSVaishali Kulkarni struct vfc_ram_defs {
32014b24e2bSVaishali Kulkarni 	const char *mem_name;
32114b24e2bSVaishali Kulkarni 	const char *type_name;
32214b24e2bSVaishali Kulkarni 	u32 base_row;
32314b24e2bSVaishali Kulkarni 	u32 num_rows;
32414b24e2bSVaishali Kulkarni };
32514b24e2bSVaishali Kulkarni 
32614b24e2bSVaishali Kulkarni struct big_ram_defs {
32714b24e2bSVaishali Kulkarni 	const char *instance_name;
32814b24e2bSVaishali Kulkarni 	enum mem_groups mem_group_id;
32914b24e2bSVaishali Kulkarni 	enum mem_groups ram_mem_group_id;
33014b24e2bSVaishali Kulkarni 	enum dbg_grc_params grc_param;
33114b24e2bSVaishali Kulkarni 	u32 addr_reg_addr;
33214b24e2bSVaishali Kulkarni 	u32 data_reg_addr;
33314b24e2bSVaishali Kulkarni 	u32 num_of_blocks[MAX_CHIP_IDS];
33414b24e2bSVaishali Kulkarni };
33514b24e2bSVaishali Kulkarni 
33614b24e2bSVaishali Kulkarni struct phy_defs {
33714b24e2bSVaishali Kulkarni 	const char *phy_name;
33814b24e2bSVaishali Kulkarni 
33914b24e2bSVaishali Kulkarni 	/* PHY base GRC address */
34014b24e2bSVaishali Kulkarni 	u32 base_addr;
34114b24e2bSVaishali Kulkarni 
34214b24e2bSVaishali Kulkarni 	/* Relative address of indirect TBUS address register (bits 0..7) */
34314b24e2bSVaishali Kulkarni 	u32 tbus_addr_lo_addr;
34414b24e2bSVaishali Kulkarni 
34514b24e2bSVaishali Kulkarni 	/* Relative address of indirect TBUS address register (bits 8..10) */
34614b24e2bSVaishali Kulkarni 	u32 tbus_addr_hi_addr;
34714b24e2bSVaishali Kulkarni 
34814b24e2bSVaishali Kulkarni 	/* Relative address of indirect TBUS data register (bits 0..7) */
34914b24e2bSVaishali Kulkarni 	u32 tbus_data_lo_addr;
35014b24e2bSVaishali Kulkarni 
35114b24e2bSVaishali Kulkarni 	/* Relative address of indirect TBUS data register (bits 8..11) */
35214b24e2bSVaishali Kulkarni 	u32 tbus_data_hi_addr;
35314b24e2bSVaishali Kulkarni };
35414b24e2bSVaishali Kulkarni 
35514b24e2bSVaishali Kulkarni /******************************** Constants **********************************/
35614b24e2bSVaishali Kulkarni 
35714b24e2bSVaishali Kulkarni #define MAX_LCIDS			320
35814b24e2bSVaishali Kulkarni #define MAX_LTIDS			320
35914b24e2bSVaishali Kulkarni 
36014b24e2bSVaishali Kulkarni #define NUM_IOR_SETS			2
36114b24e2bSVaishali Kulkarni #define IORS_PER_SET			176
36214b24e2bSVaishali Kulkarni #define IOR_SET_OFFSET(set_id)		((set_id) * 256)
36314b24e2bSVaishali Kulkarni 
36414b24e2bSVaishali Kulkarni #define BYTES_IN_DWORD			sizeof(u32)
36514b24e2bSVaishali Kulkarni 
36614b24e2bSVaishali Kulkarni /* Cyclic  right */
36714b24e2bSVaishali Kulkarni #define SHR(val, val_width, amount)	(((val) | ((val) << (val_width))) 					>> (amount)) & ((1 << (val_width)) - 1)
36814b24e2bSVaishali Kulkarni 
36914b24e2bSVaishali Kulkarni /* In the macros below, size and offset are specified in bits */
37014b24e2bSVaishali Kulkarni #define CEIL_DWORDS(size)		DIV_ROUND_UP(size, 32)
37114b24e2bSVaishali Kulkarni #define FIELD_BIT_OFFSET(type, field)	type##_##field##_##OFFSET
37214b24e2bSVaishali Kulkarni #define FIELD_BIT_SIZE(type, field)	type##_##field##_##SIZE
37314b24e2bSVaishali Kulkarni #define FIELD_DWORD_OFFSET(type, field)		(int)(FIELD_BIT_OFFSET(type, field) / 32)
37414b24e2bSVaishali Kulkarni #define FIELD_DWORD_SHIFT(type, field)	(FIELD_BIT_OFFSET(type, field) % 32)
37514b24e2bSVaishali Kulkarni #define FIELD_BIT_MASK(type, field)		(((1 << FIELD_BIT_SIZE(type, field)) - 1) 	<< FIELD_DWORD_SHIFT(type, field))
37614b24e2bSVaishali Kulkarni 
37714b24e2bSVaishali Kulkarni #define SET_VAR_FIELD(var, type, field, val) 	var[FIELD_DWORD_OFFSET(type, field)] &= 		(~FIELD_BIT_MASK(type, field)); 	var[FIELD_DWORD_OFFSET(type, field)] |= 		(val) << FIELD_DWORD_SHIFT(type, field)
37814b24e2bSVaishali Kulkarni 
37914b24e2bSVaishali Kulkarni #define ARR_REG_WR(dev, ptt, addr, arr, arr_size) 	for (i = 0; i < (arr_size); i++) 		ecore_wr(dev, ptt, addr, (arr)[i])
38014b24e2bSVaishali Kulkarni 
38114b24e2bSVaishali Kulkarni #define ARR_REG_RD(dev, ptt, addr, arr, arr_size) 	for (i = 0; i < (arr_size); i++) 		(arr)[i] = ecore_rd(dev, ptt, addr)
38214b24e2bSVaishali Kulkarni 
38314b24e2bSVaishali Kulkarni #define CHECK_ARR_SIZE(arr, size) 	OSAL_BUILD_BUG_ON(!(OSAL_ARRAY_SIZE(arr) == size))
38414b24e2bSVaishali Kulkarni 
38514b24e2bSVaishali Kulkarni #ifndef DWORDS_TO_BYTES
38614b24e2bSVaishali Kulkarni #define DWORDS_TO_BYTES(dwords)		((dwords) * BYTES_IN_DWORD)
38714b24e2bSVaishali Kulkarni #endif
38814b24e2bSVaishali Kulkarni #ifndef BYTES_TO_DWORDS
38914b24e2bSVaishali Kulkarni #define BYTES_TO_DWORDS(bytes)		((bytes) / BYTES_IN_DWORD)
39014b24e2bSVaishali Kulkarni #endif
39114b24e2bSVaishali Kulkarni 
39214b24e2bSVaishali Kulkarni /* extra lines include a signature line + optional latency events line */
39314b24e2bSVaishali Kulkarni #ifndef NUM_DBG_LINES
39414b24e2bSVaishali Kulkarni #define NUM_EXTRA_DBG_LINES(block_desc)		(1 + (block_desc->has_latency_events ? 1 : 0))
39514b24e2bSVaishali Kulkarni #define NUM_DBG_LINES(block_desc)		(block_desc->num_of_lines + NUM_EXTRA_DBG_LINES(block_desc))
39614b24e2bSVaishali Kulkarni #endif
39714b24e2bSVaishali Kulkarni 
39814b24e2bSVaishali Kulkarni #define RAM_LINES_TO_DWORDS(lines)	((lines) * 2)
39914b24e2bSVaishali Kulkarni #define RAM_LINES_TO_BYTES(lines)		DWORDS_TO_BYTES(RAM_LINES_TO_DWORDS(lines))
40014b24e2bSVaishali Kulkarni 
40114b24e2bSVaishali Kulkarni #define REG_DUMP_LEN_SHIFT		24
40214b24e2bSVaishali Kulkarni #define MEM_DUMP_ENTRY_SIZE_DWORDS		BYTES_TO_DWORDS(sizeof(struct dbg_dump_mem))
40314b24e2bSVaishali Kulkarni 
40414b24e2bSVaishali Kulkarni #define IDLE_CHK_RULE_SIZE_DWORDS		BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_rule))
40514b24e2bSVaishali Kulkarni 
40614b24e2bSVaishali Kulkarni #define IDLE_CHK_RESULT_HDR_DWORDS		BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_hdr))
40714b24e2bSVaishali Kulkarni 
40814b24e2bSVaishali Kulkarni #define IDLE_CHK_RESULT_REG_HDR_DWORDS		BYTES_TO_DWORDS(sizeof(struct dbg_idle_chk_result_reg_hdr))
40914b24e2bSVaishali Kulkarni 
41014b24e2bSVaishali Kulkarni #define IDLE_CHK_MAX_ENTRIES_SIZE	32
41114b24e2bSVaishali Kulkarni 
41214b24e2bSVaishali Kulkarni /* The sizes and offsets below are specified in bits */
41314b24e2bSVaishali Kulkarni #define VFC_CAM_CMD_STRUCT_SIZE		64
41414b24e2bSVaishali Kulkarni #define VFC_CAM_CMD_ROW_OFFSET		48
41514b24e2bSVaishali Kulkarni #define VFC_CAM_CMD_ROW_SIZE		9
41614b24e2bSVaishali Kulkarni #define VFC_CAM_ADDR_STRUCT_SIZE	16
41714b24e2bSVaishali Kulkarni #define VFC_CAM_ADDR_OP_OFFSET		0
41814b24e2bSVaishali Kulkarni #define VFC_CAM_ADDR_OP_SIZE		4
41914b24e2bSVaishali Kulkarni #define VFC_CAM_RESP_STRUCT_SIZE	256
42014b24e2bSVaishali Kulkarni #define VFC_RAM_ADDR_STRUCT_SIZE	16
42114b24e2bSVaishali Kulkarni #define VFC_RAM_ADDR_OP_OFFSET		0
42214b24e2bSVaishali Kulkarni #define VFC_RAM_ADDR_OP_SIZE		2
42314b24e2bSVaishali Kulkarni #define VFC_RAM_ADDR_ROW_OFFSET		2
42414b24e2bSVaishali Kulkarni #define VFC_RAM_ADDR_ROW_SIZE		10
42514b24e2bSVaishali Kulkarni #define VFC_RAM_RESP_STRUCT_SIZE	256
42614b24e2bSVaishali Kulkarni 
42714b24e2bSVaishali Kulkarni #define VFC_CAM_CMD_DWORDS		CEIL_DWORDS(VFC_CAM_CMD_STRUCT_SIZE)
42814b24e2bSVaishali Kulkarni #define VFC_CAM_ADDR_DWORDS		CEIL_DWORDS(VFC_CAM_ADDR_STRUCT_SIZE)
42914b24e2bSVaishali Kulkarni #define VFC_CAM_RESP_DWORDS		CEIL_DWORDS(VFC_CAM_RESP_STRUCT_SIZE)
43014b24e2bSVaishali Kulkarni #define VFC_RAM_CMD_DWORDS		VFC_CAM_CMD_DWORDS
43114b24e2bSVaishali Kulkarni #define VFC_RAM_ADDR_DWORDS		CEIL_DWORDS(VFC_RAM_ADDR_STRUCT_SIZE)
43214b24e2bSVaishali Kulkarni #define VFC_RAM_RESP_DWORDS		CEIL_DWORDS(VFC_RAM_RESP_STRUCT_SIZE)
43314b24e2bSVaishali Kulkarni 
43414b24e2bSVaishali Kulkarni #define NUM_VFC_RAM_TYPES		4
43514b24e2bSVaishali Kulkarni 
43614b24e2bSVaishali Kulkarni #define VFC_CAM_NUM_ROWS		512
43714b24e2bSVaishali Kulkarni 
43814b24e2bSVaishali Kulkarni #define VFC_OPCODE_CAM_RD		14
43914b24e2bSVaishali Kulkarni #define VFC_OPCODE_RAM_RD		0
44014b24e2bSVaishali Kulkarni 
44114b24e2bSVaishali Kulkarni #define NUM_RSS_MEM_TYPES		5
44214b24e2bSVaishali Kulkarni 
44314b24e2bSVaishali Kulkarni #define NUM_BIG_RAM_TYPES		3
44414b24e2bSVaishali Kulkarni #define BIG_RAM_BLOCK_SIZE_BYTES	128
44514b24e2bSVaishali Kulkarni #define BIG_RAM_BLOCK_SIZE_DWORDS		BYTES_TO_DWORDS(BIG_RAM_BLOCK_SIZE_BYTES)
44614b24e2bSVaishali Kulkarni 
44714b24e2bSVaishali Kulkarni #define NUM_PHY_TBUS_ADDRESSES		2048
44814b24e2bSVaishali Kulkarni #define PHY_DUMP_SIZE_DWORDS		(NUM_PHY_TBUS_ADDRESSES / 2)
44914b24e2bSVaishali Kulkarni 
45014b24e2bSVaishali Kulkarni #define SEM_FAST_MODE6_SRC_ENABLE	0x10
45114b24e2bSVaishali Kulkarni #define SEM_FAST_MODE6_SRC_DISABLE	0x3f
45214b24e2bSVaishali Kulkarni 
45314b24e2bSVaishali Kulkarni #define SEM_SLOW_MODE1_DATA_ENABLE	0x1
45414b24e2bSVaishali Kulkarni 
45514b24e2bSVaishali Kulkarni #define VALUES_PER_CYCLE		4
45614b24e2bSVaishali Kulkarni #define MAX_CYCLE_VALUES_MASK		((1 << VALUES_PER_CYCLE) - 1)
45714b24e2bSVaishali Kulkarni 
45814b24e2bSVaishali Kulkarni #define MAX_DWORDS_PER_CYCLE		8
45914b24e2bSVaishali Kulkarni 
46014b24e2bSVaishali Kulkarni #define HW_ID_BITS			3
46114b24e2bSVaishali Kulkarni 
46214b24e2bSVaishali Kulkarni #define NUM_CALENDAR_SLOTS		16
46314b24e2bSVaishali Kulkarni 
46414b24e2bSVaishali Kulkarni #define MAX_TRIGGER_STATES		3
46514b24e2bSVaishali Kulkarni #define TRIGGER_SETS_PER_STATE		2
46614b24e2bSVaishali Kulkarni #define MAX_CONSTRAINTS			4
46714b24e2bSVaishali Kulkarni 
46814b24e2bSVaishali Kulkarni #define SEM_FILTER_CID_EN_MASK		0x008
46914b24e2bSVaishali Kulkarni #define SEM_FILTER_EID_MASK_EN_MASK	0x010
47014b24e2bSVaishali Kulkarni #define SEM_FILTER_EID_RANGE_EN_MASK	0x110
47114b24e2bSVaishali Kulkarni 
47214b24e2bSVaishali Kulkarni #define CHUNK_SIZE_IN_DWORDS		64
47314b24e2bSVaishali Kulkarni #define CHUNK_SIZE_IN_BYTES		DWORDS_TO_BYTES(CHUNK_SIZE_IN_DWORDS)
47414b24e2bSVaishali Kulkarni 
47514b24e2bSVaishali Kulkarni #define INT_BUF_NUM_OF_LINES		192
47614b24e2bSVaishali Kulkarni #define INT_BUF_LINE_SIZE_IN_DWORDS	16
47714b24e2bSVaishali Kulkarni #define INT_BUF_SIZE_IN_DWORDS			(INT_BUF_NUM_OF_LINES * INT_BUF_LINE_SIZE_IN_DWORDS)
47814b24e2bSVaishali Kulkarni #define INT_BUF_SIZE_IN_CHUNKS			(INT_BUF_SIZE_IN_DWORDS / CHUNK_SIZE_IN_DWORDS)
47914b24e2bSVaishali Kulkarni 
48014b24e2bSVaishali Kulkarni #define PCI_BUF_LINE_SIZE_IN_DWORDS	8
48114b24e2bSVaishali Kulkarni #define PCI_BUF_LINE_SIZE_IN_BYTES		DWORDS_TO_BYTES(PCI_BUF_LINE_SIZE_IN_DWORDS)
48214b24e2bSVaishali Kulkarni 
48314b24e2bSVaishali Kulkarni #define TARGET_EN_MASK_PCI		0x3
48414b24e2bSVaishali Kulkarni #define TARGET_EN_MASK_NIG		0x4
48514b24e2bSVaishali Kulkarni 
48614b24e2bSVaishali Kulkarni #define PCI_REQ_CREDIT			1
48714b24e2bSVaishali Kulkarni #define PCI_PHYS_ADDR_TYPE		0
48814b24e2bSVaishali Kulkarni 
48914b24e2bSVaishali Kulkarni #define OPAQUE_FID(pci_func)		((pci_func << 4) | 0xff00)
49014b24e2bSVaishali Kulkarni 
49114b24e2bSVaishali Kulkarni #define RESET_REG_UNRESET_OFFSET	4
49214b24e2bSVaishali Kulkarni 
49314b24e2bSVaishali Kulkarni #define PCI_PKT_SIZE_IN_CHUNKS		1
49414b24e2bSVaishali Kulkarni #define PCI_PKT_SIZE_IN_BYTES			(PCI_PKT_SIZE_IN_CHUNKS * CHUNK_SIZE_IN_BYTES)
49514b24e2bSVaishali Kulkarni 
49614b24e2bSVaishali Kulkarni #define NIG_PKT_SIZE_IN_CHUNKS		4
49714b24e2bSVaishali Kulkarni 
49814b24e2bSVaishali Kulkarni #define FLUSH_DELAY_MS			500
49914b24e2bSVaishali Kulkarni #define STALL_DELAY_MS			500
50014b24e2bSVaishali Kulkarni 
50114b24e2bSVaishali Kulkarni #define SRC_MAC_ADDR_LO16		0x0a0b
50214b24e2bSVaishali Kulkarni #define SRC_MAC_ADDR_HI32		0x0c0d0e0f
50314b24e2bSVaishali Kulkarni #define ETH_TYPE			0x1000
50414b24e2bSVaishali Kulkarni 
50514b24e2bSVaishali Kulkarni #define STATIC_DEBUG_LINE_DWORDS	9
50614b24e2bSVaishali Kulkarni 
50714b24e2bSVaishali Kulkarni #define NUM_COMMON_GLOBAL_PARAMS	8
50814b24e2bSVaishali Kulkarni 
50914b24e2bSVaishali Kulkarni #define FW_IMG_KUKU			0
51014b24e2bSVaishali Kulkarni #define FW_IMG_MAIN			1
51114b24e2bSVaishali Kulkarni #define FW_IMG_L2B			2
51214b24e2bSVaishali Kulkarni 
51314b24e2bSVaishali Kulkarni #ifndef REG_FIFO_ELEMENT_DWORDS
51414b24e2bSVaishali Kulkarni #define REG_FIFO_ELEMENT_DWORDS		2
51514b24e2bSVaishali Kulkarni #endif
51614b24e2bSVaishali Kulkarni #define REG_FIFO_DEPTH_ELEMENTS		32
51714b24e2bSVaishali Kulkarni #define REG_FIFO_DEPTH_DWORDS			(REG_FIFO_ELEMENT_DWORDS * REG_FIFO_DEPTH_ELEMENTS)
51814b24e2bSVaishali Kulkarni 
51914b24e2bSVaishali Kulkarni #ifndef IGU_FIFO_ELEMENT_DWORDS
52014b24e2bSVaishali Kulkarni #define IGU_FIFO_ELEMENT_DWORDS		4
52114b24e2bSVaishali Kulkarni #endif
52214b24e2bSVaishali Kulkarni #define IGU_FIFO_DEPTH_ELEMENTS		64
52314b24e2bSVaishali Kulkarni #define IGU_FIFO_DEPTH_DWORDS			(IGU_FIFO_ELEMENT_DWORDS * IGU_FIFO_DEPTH_ELEMENTS)
52414b24e2bSVaishali Kulkarni 
52514b24e2bSVaishali Kulkarni #define SEMI_SYNC_FIFO_POLLING_DELAY_MS	5
52614b24e2bSVaishali Kulkarni #define SEMI_SYNC_FIFO_POLLING_COUNT	20
52714b24e2bSVaishali Kulkarni 
52814b24e2bSVaishali Kulkarni #ifndef PROTECTION_OVERRIDE_ELEMENT_DWORDS
52914b24e2bSVaishali Kulkarni #define PROTECTION_OVERRIDE_ELEMENT_DWORDS 2
53014b24e2bSVaishali Kulkarni #endif
53114b24e2bSVaishali Kulkarni #define PROTECTION_OVERRIDE_DEPTH_ELEMENTS 20
53214b24e2bSVaishali Kulkarni #define PROTECTION_OVERRIDE_DEPTH_DWORDS   	(PROTECTION_OVERRIDE_DEPTH_ELEMENTS 	* PROTECTION_OVERRIDE_ELEMENT_DWORDS)
53314b24e2bSVaishali Kulkarni 
534*04443fdeSToomas Soome #define MCP_SPAD_TRACE_OFFSIZE_ADDR		(MCP_REG_SCRATCH + 	offsetof(struct static_init, sections[SPAD_SECTION_TRACE]))
53514b24e2bSVaishali Kulkarni 
53614b24e2bSVaishali Kulkarni #define EMPTY_FW_VERSION_STR		"???_???_???_???"
53714b24e2bSVaishali Kulkarni #define EMPTY_FW_IMAGE_STR		"???????????????"
53814b24e2bSVaishali Kulkarni 
53914b24e2bSVaishali Kulkarni 
54014b24e2bSVaishali Kulkarni /***************************** Constant Arrays *******************************/
54114b24e2bSVaishali Kulkarni 
54214b24e2bSVaishali Kulkarni struct dbg_array {
54314b24e2bSVaishali Kulkarni 	const u32 *ptr;
54414b24e2bSVaishali Kulkarni 	u32 size_in_dwords;
54514b24e2bSVaishali Kulkarni };
54614b24e2bSVaishali Kulkarni 
54714b24e2bSVaishali Kulkarni /* Debug arrays */
54814b24e2bSVaishali Kulkarni #ifdef USE_DBG_BIN_FILE
54914b24e2bSVaishali Kulkarni static struct dbg_array s_dbg_arrays[MAX_BIN_DBG_BUFFER_TYPE] = { { OSAL_NULL } };
55014b24e2bSVaishali Kulkarni #else
55114b24e2bSVaishali Kulkarni static struct dbg_array s_dbg_arrays[MAX_BIN_DBG_BUFFER_TYPE] = {
55214b24e2bSVaishali Kulkarni 
55314b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_MODE_TREE */
55414b24e2bSVaishali Kulkarni 	{ (u32*)dbg_modes_tree_buf, OSAL_ARRAY_SIZE(dbg_modes_tree_buf)},
55514b24e2bSVaishali Kulkarni 
55614b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_DUMP_REG */
55714b24e2bSVaishali Kulkarni 	{ dump_reg, OSAL_ARRAY_SIZE(dump_reg) },
55814b24e2bSVaishali Kulkarni 
55914b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_DUMP_MEM */
56014b24e2bSVaishali Kulkarni 	{ dump_mem, OSAL_ARRAY_SIZE(dump_mem) },
56114b24e2bSVaishali Kulkarni 
56214b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_IDLE_CHK_REGS */
56314b24e2bSVaishali Kulkarni 	{ idle_chk_regs, OSAL_ARRAY_SIZE(idle_chk_regs) },
56414b24e2bSVaishali Kulkarni 
56514b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_IDLE_CHK_IMMS */
56614b24e2bSVaishali Kulkarni 	{ idle_chk_imms, OSAL_ARRAY_SIZE(idle_chk_imms) },
56714b24e2bSVaishali Kulkarni 
56814b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_IDLE_CHK_RULES */
56914b24e2bSVaishali Kulkarni 	{ idle_chk_rules, OSAL_ARRAY_SIZE(idle_chk_rules) },
57014b24e2bSVaishali Kulkarni 
57114b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_IDLE_CHK_PARSING_DATA */
57214b24e2bSVaishali Kulkarni 	{ OSAL_NULL, 0 },
57314b24e2bSVaishali Kulkarni 
57414b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_ATTN_BLOCKS */
57514b24e2bSVaishali Kulkarni 	{ attn_block, OSAL_ARRAY_SIZE(attn_block) },
57614b24e2bSVaishali Kulkarni 
57714b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_ATTN_REGSS */
57814b24e2bSVaishali Kulkarni 	{ attn_reg, OSAL_ARRAY_SIZE(attn_reg) },
57914b24e2bSVaishali Kulkarni 
58014b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_ATTN_INDEXES */
58114b24e2bSVaishali Kulkarni 	{ OSAL_NULL, 0 },
58214b24e2bSVaishali Kulkarni 
58314b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_ATTN_NAME_OFFSETS */
58414b24e2bSVaishali Kulkarni 	{ OSAL_NULL, 0 },
58514b24e2bSVaishali Kulkarni 
58614b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_BUS_BLOCKS */
58714b24e2bSVaishali Kulkarni 	{ dbg_bus_blocks, OSAL_ARRAY_SIZE(dbg_bus_blocks) },
58814b24e2bSVaishali Kulkarni 
58914b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_BUS_LINES */
59014b24e2bSVaishali Kulkarni 	{ dbg_bus_lines, OSAL_ARRAY_SIZE(dbg_bus_lines) },
59114b24e2bSVaishali Kulkarni 
59214b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_BUS_BLOCKS_USER_DATA */
59314b24e2bSVaishali Kulkarni 	{ OSAL_NULL, 0 },
59414b24e2bSVaishali Kulkarni 
59514b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_BUS_LINE_NAME_OFFSETS */
59614b24e2bSVaishali Kulkarni 	{ OSAL_NULL, 0 },
59714b24e2bSVaishali Kulkarni 
59814b24e2bSVaishali Kulkarni 	/* BIN_BUF_DBG_PARSING_STRINGS */
59914b24e2bSVaishali Kulkarni 	{ OSAL_NULL, 0 }
60014b24e2bSVaishali Kulkarni };
60114b24e2bSVaishali Kulkarni #endif
60214b24e2bSVaishali Kulkarni 
60314b24e2bSVaishali Kulkarni /* Chip constant definitions array */
60414b24e2bSVaishali Kulkarni static struct chip_defs s_chip_defs[MAX_CHIP_IDS] = {
60514b24e2bSVaishali Kulkarni 	{ "bb",
60614b24e2bSVaishali Kulkarni 
60714b24e2bSVaishali Kulkarni 		/* ASIC */
60814b24e2bSVaishali Kulkarni 		{ { MAX_NUM_PORTS_BB, MAX_NUM_PFS_BB, MAX_NUM_VFS_BB },
60914b24e2bSVaishali Kulkarni 
61014b24e2bSVaishali Kulkarni 		/* EMUL_FULL */
61114b24e2bSVaishali Kulkarni 		{ MAX_NUM_PORTS_BB, MAX_NUM_PFS_BB, MAX_NUM_VFS_BB },
61214b24e2bSVaishali Kulkarni 
61314b24e2bSVaishali Kulkarni 		/* EMUL_REDUCED */
61414b24e2bSVaishali Kulkarni 		{ MAX_NUM_PORTS_BB, MAX_NUM_PFS_BB, MAX_NUM_VFS_BB },
61514b24e2bSVaishali Kulkarni 
61614b24e2bSVaishali Kulkarni 		/* FPGA */
61714b24e2bSVaishali Kulkarni 		{ MAX_NUM_PORTS_BB, MAX_NUM_PFS_BB, MAX_NUM_VFS_BB } } },
61814b24e2bSVaishali Kulkarni 
61914b24e2bSVaishali Kulkarni 	{ "ah",
62014b24e2bSVaishali Kulkarni 
62114b24e2bSVaishali Kulkarni 		/* ASIC */
62214b24e2bSVaishali Kulkarni 		{ { MAX_NUM_PORTS_K2, MAX_NUM_PFS_K2, MAX_NUM_VFS_K2 },
62314b24e2bSVaishali Kulkarni 
62414b24e2bSVaishali Kulkarni 		/* EMUL_FULL */
62514b24e2bSVaishali Kulkarni 		{ MAX_NUM_PORTS_K2, MAX_NUM_PFS_K2, MAX_NUM_VFS_K2 },
62614b24e2bSVaishali Kulkarni 
62714b24e2bSVaishali Kulkarni 		/* EMUL_REDUCED */
62814b24e2bSVaishali Kulkarni 		{ MAX_NUM_PORTS_K2, MAX_NUM_PFS_K2, MAX_NUM_VFS_K2 },
62914b24e2bSVaishali Kulkarni 
63014b24e2bSVaishali Kulkarni 		/* FPGA */
63114b24e2bSVaishali Kulkarni 		{ MAX_NUM_PORTS_K2, 8, MAX_NUM_VFS_K2 } } }
63214b24e2bSVaishali Kulkarni };
63314b24e2bSVaishali Kulkarni 
63414b24e2bSVaishali Kulkarni /* Storm constant definitions array */
63514b24e2bSVaishali Kulkarni static struct storm_defs s_storm_defs[] = {
63614b24e2bSVaishali Kulkarni 
63714b24e2bSVaishali Kulkarni 	/* Tstorm */
63814b24e2bSVaishali Kulkarni 	{	'T', BLOCK_TSEM,
63914b24e2bSVaishali Kulkarni 		{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT }, true,
64014b24e2bSVaishali Kulkarni 		TSEM_REG_FAST_MEMORY,
64114b24e2bSVaishali Kulkarni 		TSEM_REG_DBG_FRAME_MODE_BB_K2, TSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
64214b24e2bSVaishali Kulkarni 		TSEM_REG_SLOW_DBG_MODE_BB_K2, TSEM_REG_DBG_MODE1_CFG_BB_K2,
64314b24e2bSVaishali Kulkarni 		TSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_SLOW_DBG_EMPTY_BB_K2,
64414b24e2bSVaishali Kulkarni 		TCM_REG_CTX_RBC_ACCS,
64514b24e2bSVaishali Kulkarni 		4, TCM_REG_AGG_CON_CTX,
64614b24e2bSVaishali Kulkarni 		16, TCM_REG_SM_CON_CTX,
64714b24e2bSVaishali Kulkarni 		2, TCM_REG_AGG_TASK_CTX,
64814b24e2bSVaishali Kulkarni 		4, TCM_REG_SM_TASK_CTX },
64914b24e2bSVaishali Kulkarni 
65014b24e2bSVaishali Kulkarni 	/* Mstorm */
65114b24e2bSVaishali Kulkarni 	{	'M', BLOCK_MSEM,
65214b24e2bSVaishali Kulkarni 		{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM }, false,
65314b24e2bSVaishali Kulkarni 		MSEM_REG_FAST_MEMORY,
65414b24e2bSVaishali Kulkarni 		MSEM_REG_DBG_FRAME_MODE_BB_K2, MSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
65514b24e2bSVaishali Kulkarni 		MSEM_REG_SLOW_DBG_MODE_BB_K2, MSEM_REG_DBG_MODE1_CFG_BB_K2,
65614b24e2bSVaishali Kulkarni 		MSEM_REG_SYNC_DBG_EMPTY, MSEM_REG_SLOW_DBG_EMPTY_BB_K2,
65714b24e2bSVaishali Kulkarni 		MCM_REG_CTX_RBC_ACCS,
65814b24e2bSVaishali Kulkarni 		1, MCM_REG_AGG_CON_CTX,
65914b24e2bSVaishali Kulkarni 		10, MCM_REG_SM_CON_CTX,
66014b24e2bSVaishali Kulkarni 		2, MCM_REG_AGG_TASK_CTX,
66114b24e2bSVaishali Kulkarni 		7, MCM_REG_SM_TASK_CTX },
66214b24e2bSVaishali Kulkarni 
66314b24e2bSVaishali Kulkarni 	/* Ustorm */
66414b24e2bSVaishali Kulkarni 	{	'U', BLOCK_USEM,
66514b24e2bSVaishali Kulkarni 		{ DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU }, false,
66614b24e2bSVaishali Kulkarni 		USEM_REG_FAST_MEMORY,
66714b24e2bSVaishali Kulkarni 		USEM_REG_DBG_FRAME_MODE_BB_K2, USEM_REG_SLOW_DBG_ACTIVE_BB_K2,
66814b24e2bSVaishali Kulkarni 		USEM_REG_SLOW_DBG_MODE_BB_K2, USEM_REG_DBG_MODE1_CFG_BB_K2,
66914b24e2bSVaishali Kulkarni 		USEM_REG_SYNC_DBG_EMPTY, USEM_REG_SLOW_DBG_EMPTY_BB_K2,
67014b24e2bSVaishali Kulkarni 		UCM_REG_CTX_RBC_ACCS,
67114b24e2bSVaishali Kulkarni 		2, UCM_REG_AGG_CON_CTX,
67214b24e2bSVaishali Kulkarni 		13, UCM_REG_SM_CON_CTX,
67314b24e2bSVaishali Kulkarni 		3, UCM_REG_AGG_TASK_CTX,
67414b24e2bSVaishali Kulkarni 		3, UCM_REG_SM_TASK_CTX },
67514b24e2bSVaishali Kulkarni 
67614b24e2bSVaishali Kulkarni 	/* Xstorm */
67714b24e2bSVaishali Kulkarni 	{	'X', BLOCK_XSEM,
67814b24e2bSVaishali Kulkarni 		{ DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX }, false,
67914b24e2bSVaishali Kulkarni 		XSEM_REG_FAST_MEMORY,
68014b24e2bSVaishali Kulkarni 		XSEM_REG_DBG_FRAME_MODE_BB_K2, XSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
68114b24e2bSVaishali Kulkarni 		XSEM_REG_SLOW_DBG_MODE_BB_K2, XSEM_REG_DBG_MODE1_CFG_BB_K2,
68214b24e2bSVaishali Kulkarni 		XSEM_REG_SYNC_DBG_EMPTY, XSEM_REG_SLOW_DBG_EMPTY_BB_K2,
68314b24e2bSVaishali Kulkarni 		XCM_REG_CTX_RBC_ACCS,
68414b24e2bSVaishali Kulkarni 		9, XCM_REG_AGG_CON_CTX,
68514b24e2bSVaishali Kulkarni 		15, XCM_REG_SM_CON_CTX,
68614b24e2bSVaishali Kulkarni 		0, 0,
68714b24e2bSVaishali Kulkarni 		0, 0 },
68814b24e2bSVaishali Kulkarni 
68914b24e2bSVaishali Kulkarni 	/* Ystorm */
69014b24e2bSVaishali Kulkarni 	{	'Y', BLOCK_YSEM,
69114b24e2bSVaishali Kulkarni 		{ DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY }, false,
69214b24e2bSVaishali Kulkarni 		YSEM_REG_FAST_MEMORY,
69314b24e2bSVaishali Kulkarni 		YSEM_REG_DBG_FRAME_MODE_BB_K2, YSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
69414b24e2bSVaishali Kulkarni 		YSEM_REG_SLOW_DBG_MODE_BB_K2, YSEM_REG_DBG_MODE1_CFG_BB_K2,
69514b24e2bSVaishali Kulkarni 		YSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_SLOW_DBG_EMPTY_BB_K2,
69614b24e2bSVaishali Kulkarni 		YCM_REG_CTX_RBC_ACCS,
69714b24e2bSVaishali Kulkarni 		2, YCM_REG_AGG_CON_CTX,
69814b24e2bSVaishali Kulkarni 		3, YCM_REG_SM_CON_CTX,
69914b24e2bSVaishali Kulkarni 		2, YCM_REG_AGG_TASK_CTX,
70014b24e2bSVaishali Kulkarni 		12, YCM_REG_SM_TASK_CTX },
70114b24e2bSVaishali Kulkarni 
70214b24e2bSVaishali Kulkarni 	/* Pstorm */
70314b24e2bSVaishali Kulkarni 	{	'P', BLOCK_PSEM,
70414b24e2bSVaishali Kulkarni 		{ DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS }, true,
70514b24e2bSVaishali Kulkarni 		PSEM_REG_FAST_MEMORY,
70614b24e2bSVaishali Kulkarni 		PSEM_REG_DBG_FRAME_MODE_BB_K2, PSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
70714b24e2bSVaishali Kulkarni 		PSEM_REG_SLOW_DBG_MODE_BB_K2, PSEM_REG_DBG_MODE1_CFG_BB_K2,
70814b24e2bSVaishali Kulkarni 		PSEM_REG_SYNC_DBG_EMPTY, PSEM_REG_SLOW_DBG_EMPTY_BB_K2,
70914b24e2bSVaishali Kulkarni 		PCM_REG_CTX_RBC_ACCS,
71014b24e2bSVaishali Kulkarni 		0, 0,
71114b24e2bSVaishali Kulkarni 		10, PCM_REG_SM_CON_CTX,
71214b24e2bSVaishali Kulkarni 		0, 0,
71314b24e2bSVaishali Kulkarni 		0, 0 }
71414b24e2bSVaishali Kulkarni };
71514b24e2bSVaishali Kulkarni 
71614b24e2bSVaishali Kulkarni /* Block definitions array */
71714b24e2bSVaishali Kulkarni 
71814b24e2bSVaishali Kulkarni static struct block_defs block_grc_defs = {
71914b24e2bSVaishali Kulkarni 	"grc", { true, true }, false, 0,
72014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCN, DBG_BUS_CLIENT_RBCN },
72114b24e2bSVaishali Kulkarni 	GRC_REG_DBG_SELECT, GRC_REG_DBG_DWORD_ENABLE,
72214b24e2bSVaishali Kulkarni 	GRC_REG_DBG_SHIFT, GRC_REG_DBG_FORCE_VALID,
72314b24e2bSVaishali Kulkarni 	GRC_REG_DBG_FORCE_FRAME,
72414b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISC_PL_UA, 1 };
72514b24e2bSVaishali Kulkarni 
72614b24e2bSVaishali Kulkarni static struct block_defs block_miscs_defs = {
72714b24e2bSVaishali Kulkarni 	"miscs", { false, false }, false, 0,
72814b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
72914b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
73014b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
73114b24e2bSVaishali Kulkarni 
73214b24e2bSVaishali Kulkarni static struct block_defs block_misc_defs = {
73314b24e2bSVaishali Kulkarni 	"misc", { false, false }, false, 0,
73414b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
73514b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
73614b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
73714b24e2bSVaishali Kulkarni 
73814b24e2bSVaishali Kulkarni static struct block_defs block_dbu_defs = {
73914b24e2bSVaishali Kulkarni 	"dbu", { false, false }, false, 0,
74014b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
74114b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
74214b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
74314b24e2bSVaishali Kulkarni 
74414b24e2bSVaishali Kulkarni static struct block_defs block_pglue_b_defs = {
74514b24e2bSVaishali Kulkarni 	"pglue_b", { true, true }, false, 0,
74614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCH, DBG_BUS_CLIENT_RBCH },
74714b24e2bSVaishali Kulkarni 	PGLUE_B_REG_DBG_SELECT, PGLUE_B_REG_DBG_DWORD_ENABLE,
74814b24e2bSVaishali Kulkarni 	PGLUE_B_REG_DBG_SHIFT, PGLUE_B_REG_DBG_FORCE_VALID,
74914b24e2bSVaishali Kulkarni 	PGLUE_B_REG_DBG_FORCE_FRAME,
75014b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV, 1 };
75114b24e2bSVaishali Kulkarni 
75214b24e2bSVaishali Kulkarni static struct block_defs block_cnig_defs = {
75314b24e2bSVaishali Kulkarni 	"cnig", { false, true }, false, 0,
75414b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCW },
75514b24e2bSVaishali Kulkarni 	CNIG_REG_DBG_SELECT_K2_E5, CNIG_REG_DBG_DWORD_ENABLE_K2_E5,
75614b24e2bSVaishali Kulkarni 	CNIG_REG_DBG_SHIFT_K2_E5, CNIG_REG_DBG_FORCE_VALID_K2_E5,
75714b24e2bSVaishali Kulkarni 	CNIG_REG_DBG_FORCE_FRAME_K2_E5,
75814b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV, 0 };
75914b24e2bSVaishali Kulkarni 
76014b24e2bSVaishali Kulkarni static struct block_defs block_cpmu_defs = {
76114b24e2bSVaishali Kulkarni 	"cpmu", { false, false }, false, 0,
76214b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
76314b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
76414b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV, 8 };
76514b24e2bSVaishali Kulkarni 
76614b24e2bSVaishali Kulkarni static struct block_defs block_ncsi_defs = {
76714b24e2bSVaishali Kulkarni 	"ncsi", { true, true }, false, 0,
76814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCZ, DBG_BUS_CLIENT_RBCZ },
76914b24e2bSVaishali Kulkarni 	NCSI_REG_DBG_SELECT, NCSI_REG_DBG_DWORD_ENABLE,
77014b24e2bSVaishali Kulkarni 	NCSI_REG_DBG_SHIFT, NCSI_REG_DBG_FORCE_VALID,
77114b24e2bSVaishali Kulkarni 	NCSI_REG_DBG_FORCE_FRAME,
77214b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV, 5 };
77314b24e2bSVaishali Kulkarni 
77414b24e2bSVaishali Kulkarni static struct block_defs block_opte_defs = {
77514b24e2bSVaishali Kulkarni 	"opte", { false, false }, false, 0,
77614b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
77714b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
77814b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV, 4 };
77914b24e2bSVaishali Kulkarni 
78014b24e2bSVaishali Kulkarni static struct block_defs block_bmb_defs = {
78114b24e2bSVaishali Kulkarni 	"bmb", { true, true }, false, 0,
78214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCZ, DBG_BUS_CLIENT_RBCB },
78314b24e2bSVaishali Kulkarni 	BMB_REG_DBG_SELECT, BMB_REG_DBG_DWORD_ENABLE,
78414b24e2bSVaishali Kulkarni 	BMB_REG_DBG_SHIFT, BMB_REG_DBG_FORCE_VALID,
78514b24e2bSVaishali Kulkarni 	BMB_REG_DBG_FORCE_FRAME,
78614b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_UA, 7 };
78714b24e2bSVaishali Kulkarni 
78814b24e2bSVaishali Kulkarni static struct block_defs block_pcie_defs = {
78914b24e2bSVaishali Kulkarni 	"pcie", { false, true }, false, 0,
79014b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCH },
79114b24e2bSVaishali Kulkarni 	PCIE_REG_DBG_COMMON_SELECT_K2_E5, PCIE_REG_DBG_COMMON_DWORD_ENABLE_K2_E5,
79214b24e2bSVaishali Kulkarni 	PCIE_REG_DBG_COMMON_SHIFT_K2_E5, PCIE_REG_DBG_COMMON_FORCE_VALID_K2_E5,
79314b24e2bSVaishali Kulkarni 	PCIE_REG_DBG_COMMON_FORCE_FRAME_K2_E5,
79414b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
79514b24e2bSVaishali Kulkarni 
79614b24e2bSVaishali Kulkarni static struct block_defs block_mcp_defs = {
79714b24e2bSVaishali Kulkarni 	"mcp", { false, false }, false, 0,
79814b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
79914b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
80014b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
80114b24e2bSVaishali Kulkarni 
80214b24e2bSVaishali Kulkarni static struct block_defs block_mcp2_defs = {
80314b24e2bSVaishali Kulkarni 	"mcp2", { true, true }, false, 0,
80414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCZ, DBG_BUS_CLIENT_RBCZ },
80514b24e2bSVaishali Kulkarni 	MCP2_REG_DBG_SELECT, MCP2_REG_DBG_DWORD_ENABLE,
80614b24e2bSVaishali Kulkarni 	MCP2_REG_DBG_SHIFT, MCP2_REG_DBG_FORCE_VALID,
80714b24e2bSVaishali Kulkarni 	MCP2_REG_DBG_FORCE_FRAME,
80814b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
80914b24e2bSVaishali Kulkarni 
81014b24e2bSVaishali Kulkarni static struct block_defs block_pswhst_defs = {
81114b24e2bSVaishali Kulkarni 	"pswhst", { true, true }, false, 0,
81214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
81314b24e2bSVaishali Kulkarni 	PSWHST_REG_DBG_SELECT, PSWHST_REG_DBG_DWORD_ENABLE,
81414b24e2bSVaishali Kulkarni 	PSWHST_REG_DBG_SHIFT, PSWHST_REG_DBG_FORCE_VALID,
81514b24e2bSVaishali Kulkarni 	PSWHST_REG_DBG_FORCE_FRAME,
81614b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISC_PL_HV, 0 };
81714b24e2bSVaishali Kulkarni 
81814b24e2bSVaishali Kulkarni static struct block_defs block_pswhst2_defs = {
81914b24e2bSVaishali Kulkarni 	"pswhst2", { true, true }, false, 0,
82014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
82114b24e2bSVaishali Kulkarni 	PSWHST2_REG_DBG_SELECT, PSWHST2_REG_DBG_DWORD_ENABLE,
82214b24e2bSVaishali Kulkarni 	PSWHST2_REG_DBG_SHIFT, PSWHST2_REG_DBG_FORCE_VALID,
82314b24e2bSVaishali Kulkarni 	PSWHST2_REG_DBG_FORCE_FRAME,
82414b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISC_PL_HV, 0 };
82514b24e2bSVaishali Kulkarni 
82614b24e2bSVaishali Kulkarni static struct block_defs block_pswrd_defs = {
82714b24e2bSVaishali Kulkarni 	"pswrd", { true, true }, false, 0,
82814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
82914b24e2bSVaishali Kulkarni 	PSWRD_REG_DBG_SELECT, PSWRD_REG_DBG_DWORD_ENABLE,
83014b24e2bSVaishali Kulkarni 	PSWRD_REG_DBG_SHIFT, PSWRD_REG_DBG_FORCE_VALID,
83114b24e2bSVaishali Kulkarni 	PSWRD_REG_DBG_FORCE_FRAME,
83214b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISC_PL_HV, 2 };
83314b24e2bSVaishali Kulkarni 
83414b24e2bSVaishali Kulkarni static struct block_defs block_pswrd2_defs = {
83514b24e2bSVaishali Kulkarni 	"pswrd2", { true, true }, false, 0,
83614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
83714b24e2bSVaishali Kulkarni 	PSWRD2_REG_DBG_SELECT, PSWRD2_REG_DBG_DWORD_ENABLE,
83814b24e2bSVaishali Kulkarni 	PSWRD2_REG_DBG_SHIFT,	PSWRD2_REG_DBG_FORCE_VALID,
83914b24e2bSVaishali Kulkarni 	PSWRD2_REG_DBG_FORCE_FRAME,
84014b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISC_PL_HV, 2 };
84114b24e2bSVaishali Kulkarni 
84214b24e2bSVaishali Kulkarni static struct block_defs block_pswwr_defs = {
84314b24e2bSVaishali Kulkarni 	"pswwr", { true, true }, false, 0,
84414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
84514b24e2bSVaishali Kulkarni 	PSWWR_REG_DBG_SELECT, PSWWR_REG_DBG_DWORD_ENABLE,
84614b24e2bSVaishali Kulkarni 	PSWWR_REG_DBG_SHIFT, PSWWR_REG_DBG_FORCE_VALID,
84714b24e2bSVaishali Kulkarni 	PSWWR_REG_DBG_FORCE_FRAME,
84814b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISC_PL_HV, 3 };
84914b24e2bSVaishali Kulkarni 
85014b24e2bSVaishali Kulkarni static struct block_defs block_pswwr2_defs = {
85114b24e2bSVaishali Kulkarni 	"pswwr2", { false, false }, false, 0,
85214b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
85314b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
85414b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISC_PL_HV, 3 };
85514b24e2bSVaishali Kulkarni 
85614b24e2bSVaishali Kulkarni static struct block_defs block_pswrq_defs = {
85714b24e2bSVaishali Kulkarni 	"pswrq", { true, true }, false, 0,
85814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
85914b24e2bSVaishali Kulkarni 	PSWRQ_REG_DBG_SELECT, PSWRQ_REG_DBG_DWORD_ENABLE,
86014b24e2bSVaishali Kulkarni 	PSWRQ_REG_DBG_SHIFT, PSWRQ_REG_DBG_FORCE_VALID,
86114b24e2bSVaishali Kulkarni 	PSWRQ_REG_DBG_FORCE_FRAME,
86214b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISC_PL_HV, 1 };
86314b24e2bSVaishali Kulkarni 
86414b24e2bSVaishali Kulkarni static struct block_defs block_pswrq2_defs = {
86514b24e2bSVaishali Kulkarni 	"pswrq2", { true, true }, false, 0,
86614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
86714b24e2bSVaishali Kulkarni 	PSWRQ2_REG_DBG_SELECT, PSWRQ2_REG_DBG_DWORD_ENABLE,
86814b24e2bSVaishali Kulkarni 	PSWRQ2_REG_DBG_SHIFT, PSWRQ2_REG_DBG_FORCE_VALID,
86914b24e2bSVaishali Kulkarni 	PSWRQ2_REG_DBG_FORCE_FRAME,
87014b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISC_PL_HV, 1 };
87114b24e2bSVaishali Kulkarni 
87214b24e2bSVaishali Kulkarni static struct block_defs block_pglcs_defs =	{
87314b24e2bSVaishali Kulkarni 	"pglcs", { false, true }, false, 0,
87414b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCH },
87514b24e2bSVaishali Kulkarni 	PGLCS_REG_DBG_SELECT_K2_E5, PGLCS_REG_DBG_DWORD_ENABLE_K2_E5,
87614b24e2bSVaishali Kulkarni 	PGLCS_REG_DBG_SHIFT_K2_E5, PGLCS_REG_DBG_FORCE_VALID_K2_E5,
87714b24e2bSVaishali Kulkarni 	PGLCS_REG_DBG_FORCE_FRAME_K2_E5,
87814b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV, 2 };
87914b24e2bSVaishali Kulkarni 
88014b24e2bSVaishali Kulkarni static struct block_defs block_ptu_defs ={
88114b24e2bSVaishali Kulkarni 	"ptu", { true, true }, false, 0,
88214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
88314b24e2bSVaishali Kulkarni 	PTU_REG_DBG_SELECT, PTU_REG_DBG_DWORD_ENABLE,
88414b24e2bSVaishali Kulkarni 	PTU_REG_DBG_SHIFT, PTU_REG_DBG_FORCE_VALID,
88514b24e2bSVaishali Kulkarni 	PTU_REG_DBG_FORCE_FRAME,
88614b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 20 };
88714b24e2bSVaishali Kulkarni 
88814b24e2bSVaishali Kulkarni static struct block_defs block_dmae_defs = {
88914b24e2bSVaishali Kulkarni 	"dmae", { true, true }, false, 0,
89014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
89114b24e2bSVaishali Kulkarni 	DMAE_REG_DBG_SELECT, DMAE_REG_DBG_DWORD_ENABLE,
89214b24e2bSVaishali Kulkarni 	DMAE_REG_DBG_SHIFT, DMAE_REG_DBG_FORCE_VALID,
89314b24e2bSVaishali Kulkarni 	DMAE_REG_DBG_FORCE_FRAME,
89414b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 28 };
89514b24e2bSVaishali Kulkarni 
89614b24e2bSVaishali Kulkarni static struct block_defs block_tcm_defs = {
89714b24e2bSVaishali Kulkarni 	"tcm", { true, true }, true, DBG_TSTORM_ID,
89814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT },
89914b24e2bSVaishali Kulkarni 	TCM_REG_DBG_SELECT, TCM_REG_DBG_DWORD_ENABLE,
90014b24e2bSVaishali Kulkarni 	TCM_REG_DBG_SHIFT, TCM_REG_DBG_FORCE_VALID,
90114b24e2bSVaishali Kulkarni 	TCM_REG_DBG_FORCE_FRAME,
90214b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 5 };
90314b24e2bSVaishali Kulkarni 
90414b24e2bSVaishali Kulkarni static struct block_defs block_mcm_defs = {
90514b24e2bSVaishali Kulkarni 	"mcm", { true, true }, true, DBG_MSTORM_ID,
90614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM },
90714b24e2bSVaishali Kulkarni 	MCM_REG_DBG_SELECT, MCM_REG_DBG_DWORD_ENABLE,
90814b24e2bSVaishali Kulkarni 	MCM_REG_DBG_SHIFT, MCM_REG_DBG_FORCE_VALID,
90914b24e2bSVaishali Kulkarni 	MCM_REG_DBG_FORCE_FRAME,
91014b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 3 };
91114b24e2bSVaishali Kulkarni 
91214b24e2bSVaishali Kulkarni static struct block_defs block_ucm_defs = {
91314b24e2bSVaishali Kulkarni 	"ucm", { true, true }, true, DBG_USTORM_ID,
91414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU },
91514b24e2bSVaishali Kulkarni 	UCM_REG_DBG_SELECT, UCM_REG_DBG_DWORD_ENABLE,
91614b24e2bSVaishali Kulkarni 	UCM_REG_DBG_SHIFT, UCM_REG_DBG_FORCE_VALID,
91714b24e2bSVaishali Kulkarni 	UCM_REG_DBG_FORCE_FRAME,
91814b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 8 };
91914b24e2bSVaishali Kulkarni 
92014b24e2bSVaishali Kulkarni static struct block_defs block_xcm_defs = {
92114b24e2bSVaishali Kulkarni 	"xcm", { true, true }, true, DBG_XSTORM_ID,
92214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX },
92314b24e2bSVaishali Kulkarni 	XCM_REG_DBG_SELECT, XCM_REG_DBG_DWORD_ENABLE,
92414b24e2bSVaishali Kulkarni 	XCM_REG_DBG_SHIFT, XCM_REG_DBG_FORCE_VALID,
92514b24e2bSVaishali Kulkarni 	XCM_REG_DBG_FORCE_FRAME,
92614b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 19 };
92714b24e2bSVaishali Kulkarni 
92814b24e2bSVaishali Kulkarni static struct block_defs block_ycm_defs = {
92914b24e2bSVaishali Kulkarni 	"ycm", { true, true }, true, DBG_YSTORM_ID,
93014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY },
93114b24e2bSVaishali Kulkarni 	YCM_REG_DBG_SELECT, YCM_REG_DBG_DWORD_ENABLE,
93214b24e2bSVaishali Kulkarni 	YCM_REG_DBG_SHIFT, YCM_REG_DBG_FORCE_VALID,
93314b24e2bSVaishali Kulkarni 	YCM_REG_DBG_FORCE_FRAME,
93414b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 5 };
93514b24e2bSVaishali Kulkarni 
93614b24e2bSVaishali Kulkarni static struct block_defs block_pcm_defs = {
93714b24e2bSVaishali Kulkarni 	"pcm", { true, true }, true, DBG_PSTORM_ID,
93814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS },
93914b24e2bSVaishali Kulkarni 	PCM_REG_DBG_SELECT, PCM_REG_DBG_DWORD_ENABLE,
94014b24e2bSVaishali Kulkarni 	PCM_REG_DBG_SHIFT, PCM_REG_DBG_FORCE_VALID,
94114b24e2bSVaishali Kulkarni 	PCM_REG_DBG_FORCE_FRAME,
94214b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 4 };
94314b24e2bSVaishali Kulkarni 
94414b24e2bSVaishali Kulkarni static struct block_defs block_qm_defs = {
94514b24e2bSVaishali Kulkarni 	"qm", { true, true }, false, 0,
94614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCQ },
94714b24e2bSVaishali Kulkarni 	QM_REG_DBG_SELECT, QM_REG_DBG_DWORD_ENABLE,
94814b24e2bSVaishali Kulkarni 	QM_REG_DBG_SHIFT, QM_REG_DBG_FORCE_VALID,
94914b24e2bSVaishali Kulkarni 	QM_REG_DBG_FORCE_FRAME,
95014b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 16 };
95114b24e2bSVaishali Kulkarni 
95214b24e2bSVaishali Kulkarni static struct block_defs block_tm_defs = {
95314b24e2bSVaishali Kulkarni 	"tm", { true, true }, false, 0,
95414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS },
95514b24e2bSVaishali Kulkarni 	TM_REG_DBG_SELECT, TM_REG_DBG_DWORD_ENABLE,
95614b24e2bSVaishali Kulkarni 	TM_REG_DBG_SHIFT, TM_REG_DBG_FORCE_VALID,
95714b24e2bSVaishali Kulkarni 	TM_REG_DBG_FORCE_FRAME,
95814b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 17 };
95914b24e2bSVaishali Kulkarni 
96014b24e2bSVaishali Kulkarni static struct block_defs block_dorq_defs = {
96114b24e2bSVaishali Kulkarni 	"dorq", { true, true }, false, 0,
96214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY },
96314b24e2bSVaishali Kulkarni 	DORQ_REG_DBG_SELECT, DORQ_REG_DBG_DWORD_ENABLE,
96414b24e2bSVaishali Kulkarni 	DORQ_REG_DBG_SHIFT, DORQ_REG_DBG_FORCE_VALID,
96514b24e2bSVaishali Kulkarni 	DORQ_REG_DBG_FORCE_FRAME,
96614b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 18 };
96714b24e2bSVaishali Kulkarni 
96814b24e2bSVaishali Kulkarni static struct block_defs block_brb_defs = {
96914b24e2bSVaishali Kulkarni 	"brb", { true, true }, false, 0,
97014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCR, DBG_BUS_CLIENT_RBCR },
97114b24e2bSVaishali Kulkarni 	BRB_REG_DBG_SELECT, BRB_REG_DBG_DWORD_ENABLE,
97214b24e2bSVaishali Kulkarni 	BRB_REG_DBG_SHIFT, BRB_REG_DBG_FORCE_VALID,
97314b24e2bSVaishali Kulkarni 	BRB_REG_DBG_FORCE_FRAME,
97414b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 0 };
97514b24e2bSVaishali Kulkarni 
97614b24e2bSVaishali Kulkarni static struct block_defs block_src_defs = {
97714b24e2bSVaishali Kulkarni 	"src", { true, true }, false, 0,
97814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF },
97914b24e2bSVaishali Kulkarni 	SRC_REG_DBG_SELECT, SRC_REG_DBG_DWORD_ENABLE,
98014b24e2bSVaishali Kulkarni 	SRC_REG_DBG_SHIFT, SRC_REG_DBG_FORCE_VALID,
98114b24e2bSVaishali Kulkarni 	SRC_REG_DBG_FORCE_FRAME,
98214b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 2 };
98314b24e2bSVaishali Kulkarni 
98414b24e2bSVaishali Kulkarni static struct block_defs block_prs_defs = {
98514b24e2bSVaishali Kulkarni 	"prs", { true, true }, false, 0,
98614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCR, DBG_BUS_CLIENT_RBCR },
98714b24e2bSVaishali Kulkarni 	PRS_REG_DBG_SELECT, PRS_REG_DBG_DWORD_ENABLE,
98814b24e2bSVaishali Kulkarni 	PRS_REG_DBG_SHIFT, PRS_REG_DBG_FORCE_VALID,
98914b24e2bSVaishali Kulkarni 	PRS_REG_DBG_FORCE_FRAME,
99014b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 1 };
99114b24e2bSVaishali Kulkarni 
99214b24e2bSVaishali Kulkarni static struct block_defs block_tsdm_defs = {
99314b24e2bSVaishali Kulkarni 	"tsdm", { true, true }, true, DBG_TSTORM_ID,
99414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT },
99514b24e2bSVaishali Kulkarni 	TSDM_REG_DBG_SELECT, TSDM_REG_DBG_DWORD_ENABLE,
99614b24e2bSVaishali Kulkarni 	TSDM_REG_DBG_SHIFT, TSDM_REG_DBG_FORCE_VALID,
99714b24e2bSVaishali Kulkarni 	TSDM_REG_DBG_FORCE_FRAME,
99814b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 3 };
99914b24e2bSVaishali Kulkarni 
100014b24e2bSVaishali Kulkarni static struct block_defs block_msdm_defs = {
100114b24e2bSVaishali Kulkarni 	"msdm", { true, true }, true, DBG_MSTORM_ID,
100214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM },
100314b24e2bSVaishali Kulkarni 	MSDM_REG_DBG_SELECT, MSDM_REG_DBG_DWORD_ENABLE,
100414b24e2bSVaishali Kulkarni 	MSDM_REG_DBG_SHIFT, MSDM_REG_DBG_FORCE_VALID,
100514b24e2bSVaishali Kulkarni 	MSDM_REG_DBG_FORCE_FRAME,
100614b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 6 };
100714b24e2bSVaishali Kulkarni 
100814b24e2bSVaishali Kulkarni static struct block_defs block_usdm_defs = {
100914b24e2bSVaishali Kulkarni 	"usdm", { true, true }, true, DBG_USTORM_ID,
101014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU },
101114b24e2bSVaishali Kulkarni 	USDM_REG_DBG_SELECT, USDM_REG_DBG_DWORD_ENABLE,
101214b24e2bSVaishali Kulkarni 	USDM_REG_DBG_SHIFT, USDM_REG_DBG_FORCE_VALID,
101314b24e2bSVaishali Kulkarni 	USDM_REG_DBG_FORCE_FRAME,
101414b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 7
101514b24e2bSVaishali Kulkarni 	};
101614b24e2bSVaishali Kulkarni static struct block_defs block_xsdm_defs = {
101714b24e2bSVaishali Kulkarni 	"xsdm", { true, true }, true, DBG_XSTORM_ID,
101814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX },
101914b24e2bSVaishali Kulkarni 	XSDM_REG_DBG_SELECT, XSDM_REG_DBG_DWORD_ENABLE,
102014b24e2bSVaishali Kulkarni 	XSDM_REG_DBG_SHIFT, XSDM_REG_DBG_FORCE_VALID,
102114b24e2bSVaishali Kulkarni 	XSDM_REG_DBG_FORCE_FRAME,
102214b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 20 };
102314b24e2bSVaishali Kulkarni 
102414b24e2bSVaishali Kulkarni static struct block_defs block_ysdm_defs = {
102514b24e2bSVaishali Kulkarni 	"ysdm", { true, true }, true, DBG_YSTORM_ID,
102614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY },
102714b24e2bSVaishali Kulkarni 	YSDM_REG_DBG_SELECT, YSDM_REG_DBG_DWORD_ENABLE,
102814b24e2bSVaishali Kulkarni 	YSDM_REG_DBG_SHIFT, YSDM_REG_DBG_FORCE_VALID,
102914b24e2bSVaishali Kulkarni 	YSDM_REG_DBG_FORCE_FRAME,
103014b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 8 };
103114b24e2bSVaishali Kulkarni 
103214b24e2bSVaishali Kulkarni static struct block_defs block_psdm_defs = {
103314b24e2bSVaishali Kulkarni 	"psdm", { true, true }, true, DBG_PSTORM_ID,
103414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS },
103514b24e2bSVaishali Kulkarni 	PSDM_REG_DBG_SELECT, PSDM_REG_DBG_DWORD_ENABLE,
103614b24e2bSVaishali Kulkarni 	PSDM_REG_DBG_SHIFT, PSDM_REG_DBG_FORCE_VALID,
103714b24e2bSVaishali Kulkarni 	PSDM_REG_DBG_FORCE_FRAME,
103814b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 7 };
103914b24e2bSVaishali Kulkarni 
104014b24e2bSVaishali Kulkarni static struct block_defs block_tsem_defs = {
104114b24e2bSVaishali Kulkarni 	"tsem", { true, true }, true, DBG_TSTORM_ID,
104214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT },
104314b24e2bSVaishali Kulkarni 	TSEM_REG_DBG_SELECT, TSEM_REG_DBG_DWORD_ENABLE,
104414b24e2bSVaishali Kulkarni 	TSEM_REG_DBG_SHIFT, TSEM_REG_DBG_FORCE_VALID,
104514b24e2bSVaishali Kulkarni 	TSEM_REG_DBG_FORCE_FRAME,
104614b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 4 };
104714b24e2bSVaishali Kulkarni 
104814b24e2bSVaishali Kulkarni static struct block_defs block_msem_defs = {
104914b24e2bSVaishali Kulkarni 	"msem", { true, true }, true, DBG_MSTORM_ID,
105014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM },
105114b24e2bSVaishali Kulkarni 	MSEM_REG_DBG_SELECT, MSEM_REG_DBG_DWORD_ENABLE,
105214b24e2bSVaishali Kulkarni 	MSEM_REG_DBG_SHIFT, MSEM_REG_DBG_FORCE_VALID,
105314b24e2bSVaishali Kulkarni 	MSEM_REG_DBG_FORCE_FRAME,
105414b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 9 };
105514b24e2bSVaishali Kulkarni 
105614b24e2bSVaishali Kulkarni static struct block_defs block_usem_defs = {
105714b24e2bSVaishali Kulkarni 	"usem", { true, true }, true, DBG_USTORM_ID,
105814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU },
105914b24e2bSVaishali Kulkarni 	USEM_REG_DBG_SELECT, USEM_REG_DBG_DWORD_ENABLE,
106014b24e2bSVaishali Kulkarni 	USEM_REG_DBG_SHIFT, USEM_REG_DBG_FORCE_VALID,
106114b24e2bSVaishali Kulkarni 	USEM_REG_DBG_FORCE_FRAME,
106214b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 9 };
106314b24e2bSVaishali Kulkarni 
106414b24e2bSVaishali Kulkarni static struct block_defs block_xsem_defs = {
106514b24e2bSVaishali Kulkarni 	"xsem", { true, true }, true, DBG_XSTORM_ID,
106614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX },
106714b24e2bSVaishali Kulkarni 	XSEM_REG_DBG_SELECT, XSEM_REG_DBG_DWORD_ENABLE,
106814b24e2bSVaishali Kulkarni 	XSEM_REG_DBG_SHIFT, XSEM_REG_DBG_FORCE_VALID,
106914b24e2bSVaishali Kulkarni 	XSEM_REG_DBG_FORCE_FRAME,
107014b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 21 };
107114b24e2bSVaishali Kulkarni 
107214b24e2bSVaishali Kulkarni static struct block_defs block_ysem_defs = {
107314b24e2bSVaishali Kulkarni 	"ysem", { true, true }, true, DBG_YSTORM_ID,
107414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY },
107514b24e2bSVaishali Kulkarni 	YSEM_REG_DBG_SELECT, YSEM_REG_DBG_DWORD_ENABLE,
107614b24e2bSVaishali Kulkarni 	YSEM_REG_DBG_SHIFT, YSEM_REG_DBG_FORCE_VALID,
107714b24e2bSVaishali Kulkarni 	YSEM_REG_DBG_FORCE_FRAME,
107814b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 11 };
107914b24e2bSVaishali Kulkarni 
108014b24e2bSVaishali Kulkarni static struct block_defs block_psem_defs = {
108114b24e2bSVaishali Kulkarni 	"psem", { true, true }, true, DBG_PSTORM_ID,
108214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS },
108314b24e2bSVaishali Kulkarni 	PSEM_REG_DBG_SELECT, PSEM_REG_DBG_DWORD_ENABLE,
108414b24e2bSVaishali Kulkarni 	PSEM_REG_DBG_SHIFT, PSEM_REG_DBG_FORCE_VALID,
108514b24e2bSVaishali Kulkarni 	PSEM_REG_DBG_FORCE_FRAME,
108614b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 10 };
108714b24e2bSVaishali Kulkarni 
108814b24e2bSVaishali Kulkarni static struct block_defs block_rss_defs = {
108914b24e2bSVaishali Kulkarni 	"rss", { true, true }, false, 0,
109014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT },
109114b24e2bSVaishali Kulkarni 	RSS_REG_DBG_SELECT, RSS_REG_DBG_DWORD_ENABLE,
109214b24e2bSVaishali Kulkarni 	RSS_REG_DBG_SHIFT, RSS_REG_DBG_FORCE_VALID,
109314b24e2bSVaishali Kulkarni 	RSS_REG_DBG_FORCE_FRAME,
109414b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 18 };
109514b24e2bSVaishali Kulkarni 
109614b24e2bSVaishali Kulkarni static struct block_defs block_tmld_defs = {
109714b24e2bSVaishali Kulkarni 	"tmld", { true, true }, false, 0,
109814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM },
109914b24e2bSVaishali Kulkarni 	TMLD_REG_DBG_SELECT, TMLD_REG_DBG_DWORD_ENABLE,
110014b24e2bSVaishali Kulkarni 	TMLD_REG_DBG_SHIFT, TMLD_REG_DBG_FORCE_VALID,
110114b24e2bSVaishali Kulkarni 	TMLD_REG_DBG_FORCE_FRAME,
110214b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 13 };
110314b24e2bSVaishali Kulkarni 
110414b24e2bSVaishali Kulkarni static struct block_defs block_muld_defs = {
110514b24e2bSVaishali Kulkarni 	"muld", { true, true }, false, 0,
110614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU },
110714b24e2bSVaishali Kulkarni 	MULD_REG_DBG_SELECT, MULD_REG_DBG_DWORD_ENABLE,
110814b24e2bSVaishali Kulkarni 	MULD_REG_DBG_SHIFT, MULD_REG_DBG_FORCE_VALID,
110914b24e2bSVaishali Kulkarni 	MULD_REG_DBG_FORCE_FRAME,
111014b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 14 };
111114b24e2bSVaishali Kulkarni 
111214b24e2bSVaishali Kulkarni static struct block_defs block_yuld_defs = {
111314b24e2bSVaishali Kulkarni 	"yuld", { true, true }, false, 0,
111414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU },
111514b24e2bSVaishali Kulkarni 	YULD_REG_DBG_SELECT_BB_K2, YULD_REG_DBG_DWORD_ENABLE_BB_K2,
111614b24e2bSVaishali Kulkarni 	YULD_REG_DBG_SHIFT_BB_K2, YULD_REG_DBG_FORCE_VALID_BB_K2,
111714b24e2bSVaishali Kulkarni 	YULD_REG_DBG_FORCE_FRAME_BB_K2,
111814b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 15 };
111914b24e2bSVaishali Kulkarni 
112014b24e2bSVaishali Kulkarni static struct block_defs block_xyld_defs = {
112114b24e2bSVaishali Kulkarni 	"xyld", { true, true }, false, 0,
112214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX },
112314b24e2bSVaishali Kulkarni 	XYLD_REG_DBG_SELECT, XYLD_REG_DBG_DWORD_ENABLE,
112414b24e2bSVaishali Kulkarni 	XYLD_REG_DBG_SHIFT, XYLD_REG_DBG_FORCE_VALID,
112514b24e2bSVaishali Kulkarni 	XYLD_REG_DBG_FORCE_FRAME,
112614b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 12 };
112714b24e2bSVaishali Kulkarni 
112814b24e2bSVaishali Kulkarni static struct block_defs block_prm_defs = {
112914b24e2bSVaishali Kulkarni 	"prm", { true, true }, false, 0,
113014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM },
113114b24e2bSVaishali Kulkarni 	PRM_REG_DBG_SELECT, PRM_REG_DBG_DWORD_ENABLE,
113214b24e2bSVaishali Kulkarni 	PRM_REG_DBG_SHIFT, PRM_REG_DBG_FORCE_VALID,
113314b24e2bSVaishali Kulkarni 	PRM_REG_DBG_FORCE_FRAME,
113414b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 21 };
113514b24e2bSVaishali Kulkarni 
113614b24e2bSVaishali Kulkarni static struct block_defs block_pbf_pb1_defs = {
113714b24e2bSVaishali Kulkarni 	"pbf_pb1", { true, true }, false, 0,
113814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCV },
113914b24e2bSVaishali Kulkarni 	PBF_PB1_REG_DBG_SELECT, PBF_PB1_REG_DBG_DWORD_ENABLE,
114014b24e2bSVaishali Kulkarni 	PBF_PB1_REG_DBG_SHIFT, PBF_PB1_REG_DBG_FORCE_VALID,
114114b24e2bSVaishali Kulkarni 	PBF_PB1_REG_DBG_FORCE_FRAME,
114214b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 11 };
114314b24e2bSVaishali Kulkarni 
114414b24e2bSVaishali Kulkarni static struct block_defs block_pbf_pb2_defs = {
114514b24e2bSVaishali Kulkarni 	"pbf_pb2", { true, true }, false, 0,
114614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCV },
114714b24e2bSVaishali Kulkarni 	PBF_PB2_REG_DBG_SELECT, PBF_PB2_REG_DBG_DWORD_ENABLE,
114814b24e2bSVaishali Kulkarni 	PBF_PB2_REG_DBG_SHIFT, PBF_PB2_REG_DBG_FORCE_VALID,
114914b24e2bSVaishali Kulkarni 	PBF_PB2_REG_DBG_FORCE_FRAME,
115014b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 12 };
115114b24e2bSVaishali Kulkarni 
115214b24e2bSVaishali Kulkarni static struct block_defs block_rpb_defs = {
115314b24e2bSVaishali Kulkarni 	"rpb", { true, true }, false, 0,
115414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM },
115514b24e2bSVaishali Kulkarni 	RPB_REG_DBG_SELECT, RPB_REG_DBG_DWORD_ENABLE,
115614b24e2bSVaishali Kulkarni 	RPB_REG_DBG_SHIFT, RPB_REG_DBG_FORCE_VALID,
115714b24e2bSVaishali Kulkarni 	RPB_REG_DBG_FORCE_FRAME,
115814b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 13 };
115914b24e2bSVaishali Kulkarni 
116014b24e2bSVaishali Kulkarni static struct block_defs block_btb_defs = {
116114b24e2bSVaishali Kulkarni 	"btb", { true, true }, false, 0,
116214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCR, DBG_BUS_CLIENT_RBCV },
116314b24e2bSVaishali Kulkarni 	BTB_REG_DBG_SELECT, BTB_REG_DBG_DWORD_ENABLE,
116414b24e2bSVaishali Kulkarni 	BTB_REG_DBG_SHIFT, BTB_REG_DBG_FORCE_VALID,
116514b24e2bSVaishali Kulkarni 	BTB_REG_DBG_FORCE_FRAME,
116614b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 10 };
116714b24e2bSVaishali Kulkarni 
116814b24e2bSVaishali Kulkarni static struct block_defs block_pbf_defs = {
116914b24e2bSVaishali Kulkarni 	"pbf", { true, true }, false, 0,
117014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCV },
117114b24e2bSVaishali Kulkarni 	PBF_REG_DBG_SELECT, PBF_REG_DBG_DWORD_ENABLE,
117214b24e2bSVaishali Kulkarni 	PBF_REG_DBG_SHIFT, PBF_REG_DBG_FORCE_VALID,
117314b24e2bSVaishali Kulkarni 	PBF_REG_DBG_FORCE_FRAME,
117414b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 15 };
117514b24e2bSVaishali Kulkarni 
117614b24e2bSVaishali Kulkarni static struct block_defs block_rdif_defs = {
117714b24e2bSVaishali Kulkarni 	"rdif", { true, true }, false, 0,
117814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM },
117914b24e2bSVaishali Kulkarni 	RDIF_REG_DBG_SELECT, RDIF_REG_DBG_DWORD_ENABLE,
118014b24e2bSVaishali Kulkarni 	RDIF_REG_DBG_SHIFT, RDIF_REG_DBG_FORCE_VALID,
118114b24e2bSVaishali Kulkarni 	RDIF_REG_DBG_FORCE_FRAME,
118214b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 16 };
118314b24e2bSVaishali Kulkarni 
118414b24e2bSVaishali Kulkarni static struct block_defs block_tdif_defs = {
118514b24e2bSVaishali Kulkarni 	"tdif", { true, true }, false, 0,
118614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS },
118714b24e2bSVaishali Kulkarni 	TDIF_REG_DBG_SELECT, TDIF_REG_DBG_DWORD_ENABLE,
118814b24e2bSVaishali Kulkarni 	TDIF_REG_DBG_SHIFT, TDIF_REG_DBG_FORCE_VALID,
118914b24e2bSVaishali Kulkarni 	TDIF_REG_DBG_FORCE_FRAME,
119014b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 17 };
119114b24e2bSVaishali Kulkarni 
119214b24e2bSVaishali Kulkarni static struct block_defs block_cdu_defs = {
119314b24e2bSVaishali Kulkarni 	"cdu", { true, true }, false, 0,
119414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF },
119514b24e2bSVaishali Kulkarni 	CDU_REG_DBG_SELECT, CDU_REG_DBG_DWORD_ENABLE,
119614b24e2bSVaishali Kulkarni 	CDU_REG_DBG_SHIFT, CDU_REG_DBG_FORCE_VALID,
119714b24e2bSVaishali Kulkarni 	CDU_REG_DBG_FORCE_FRAME,
119814b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 23 };
119914b24e2bSVaishali Kulkarni 
120014b24e2bSVaishali Kulkarni static struct block_defs block_ccfc_defs = {
120114b24e2bSVaishali Kulkarni 	"ccfc", { true, true }, false, 0,
120214b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF },
120314b24e2bSVaishali Kulkarni 	CCFC_REG_DBG_SELECT, CCFC_REG_DBG_DWORD_ENABLE,
120414b24e2bSVaishali Kulkarni 	CCFC_REG_DBG_SHIFT, CCFC_REG_DBG_FORCE_VALID,
120514b24e2bSVaishali Kulkarni 	CCFC_REG_DBG_FORCE_FRAME,
120614b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 24 };
120714b24e2bSVaishali Kulkarni 
120814b24e2bSVaishali Kulkarni static struct block_defs block_tcfc_defs = {
120914b24e2bSVaishali Kulkarni 	"tcfc", { true, true }, false, 0,
121014b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF },
121114b24e2bSVaishali Kulkarni 	TCFC_REG_DBG_SELECT, TCFC_REG_DBG_DWORD_ENABLE,
121214b24e2bSVaishali Kulkarni 	TCFC_REG_DBG_SHIFT, TCFC_REG_DBG_FORCE_VALID,
121314b24e2bSVaishali Kulkarni 	TCFC_REG_DBG_FORCE_FRAME,
121414b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 25 };
121514b24e2bSVaishali Kulkarni 
121614b24e2bSVaishali Kulkarni static struct block_defs block_igu_defs = {
121714b24e2bSVaishali Kulkarni 	"igu", { true, true }, false, 0,
121814b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
121914b24e2bSVaishali Kulkarni 	IGU_REG_DBG_SELECT, IGU_REG_DBG_DWORD_ENABLE,
122014b24e2bSVaishali Kulkarni 	IGU_REG_DBG_SHIFT, IGU_REG_DBG_FORCE_VALID,
122114b24e2bSVaishali Kulkarni 	IGU_REG_DBG_FORCE_FRAME,
122214b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 27 };
122314b24e2bSVaishali Kulkarni 
122414b24e2bSVaishali Kulkarni static struct block_defs block_cau_defs = {
122514b24e2bSVaishali Kulkarni 	"cau", { true, true }, false, 0,
122614b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP },
122714b24e2bSVaishali Kulkarni 	CAU_REG_DBG_SELECT, CAU_REG_DBG_DWORD_ENABLE,
122814b24e2bSVaishali Kulkarni 	CAU_REG_DBG_SHIFT, CAU_REG_DBG_FORCE_VALID,
122914b24e2bSVaishali Kulkarni 	CAU_REG_DBG_FORCE_FRAME,
123014b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 19 };
123114b24e2bSVaishali Kulkarni 
123214b24e2bSVaishali Kulkarni static struct block_defs block_umac_defs = {
123314b24e2bSVaishali Kulkarni 	"umac", { false, true }, false, 0,
123414b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCZ },
123514b24e2bSVaishali Kulkarni 	UMAC_REG_DBG_SELECT_K2_E5, UMAC_REG_DBG_DWORD_ENABLE_K2_E5,
123614b24e2bSVaishali Kulkarni 	UMAC_REG_DBG_SHIFT_K2_E5, UMAC_REG_DBG_FORCE_VALID_K2_E5,
123714b24e2bSVaishali Kulkarni 	UMAC_REG_DBG_FORCE_FRAME_K2_E5,
123814b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV, 6 };
123914b24e2bSVaishali Kulkarni 
124014b24e2bSVaishali Kulkarni static struct block_defs block_xmac_defs = {
124114b24e2bSVaishali Kulkarni 	"xmac", { false, false }, false, 0,
124214b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
124314b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
124414b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0	};
124514b24e2bSVaishali Kulkarni 
124614b24e2bSVaishali Kulkarni static struct block_defs block_dbg_defs = {
124714b24e2bSVaishali Kulkarni 	"dbg", { false, false }, false, 0,
124814b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
124914b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
125014b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VAUX, 3 };
125114b24e2bSVaishali Kulkarni 
125214b24e2bSVaishali Kulkarni static struct block_defs block_nig_defs = {
125314b24e2bSVaishali Kulkarni 	"nig", { true, true }, false, 0,
125414b24e2bSVaishali Kulkarni 	{ DBG_BUS_CLIENT_RBCN, DBG_BUS_CLIENT_RBCN },
125514b24e2bSVaishali Kulkarni 	NIG_REG_DBG_SELECT, NIG_REG_DBG_DWORD_ENABLE,
125614b24e2bSVaishali Kulkarni 	NIG_REG_DBG_SHIFT, NIG_REG_DBG_FORCE_VALID,
125714b24e2bSVaishali Kulkarni 	NIG_REG_DBG_FORCE_FRAME,
125814b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VAUX, 0 };
125914b24e2bSVaishali Kulkarni 
126014b24e2bSVaishali Kulkarni static struct block_defs block_wol_defs = {
126114b24e2bSVaishali Kulkarni 	"wol", { false, true }, false, 0,
126214b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCZ },
126314b24e2bSVaishali Kulkarni 	WOL_REG_DBG_SELECT_K2_E5, WOL_REG_DBG_DWORD_ENABLE_K2_E5,
126414b24e2bSVaishali Kulkarni 	WOL_REG_DBG_SHIFT_K2_E5, WOL_REG_DBG_FORCE_VALID_K2_E5,
126514b24e2bSVaishali Kulkarni 	WOL_REG_DBG_FORCE_FRAME_K2_E5,
126614b24e2bSVaishali Kulkarni 	true, true, DBG_RESET_REG_MISC_PL_PDA_VAUX, 7 };
126714b24e2bSVaishali Kulkarni 
126814b24e2bSVaishali Kulkarni static struct block_defs block_bmbn_defs = {
126914b24e2bSVaishali Kulkarni 	"bmbn", { false, true }, false, 0,
127014b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCB },
127114b24e2bSVaishali Kulkarni 	BMBN_REG_DBG_SELECT_K2_E5, BMBN_REG_DBG_DWORD_ENABLE_K2_E5,
127214b24e2bSVaishali Kulkarni 	BMBN_REG_DBG_SHIFT_K2_E5, BMBN_REG_DBG_FORCE_VALID_K2_E5,
127314b24e2bSVaishali Kulkarni 	BMBN_REG_DBG_FORCE_FRAME_K2_E5,
127414b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
127514b24e2bSVaishali Kulkarni 
127614b24e2bSVaishali Kulkarni static struct block_defs block_ipc_defs = {
127714b24e2bSVaishali Kulkarni 	"ipc", { false, false }, false, 0,
127814b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
127914b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
128014b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_UA, 8 };
128114b24e2bSVaishali Kulkarni 
128214b24e2bSVaishali Kulkarni static struct block_defs block_nwm_defs = {
128314b24e2bSVaishali Kulkarni 	"nwm", { false, true }, false, 0,
128414b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCW },
128514b24e2bSVaishali Kulkarni 	NWM_REG_DBG_SELECT_K2_E5, NWM_REG_DBG_DWORD_ENABLE_K2_E5,
128614b24e2bSVaishali Kulkarni 	NWM_REG_DBG_SHIFT_K2_E5, NWM_REG_DBG_FORCE_VALID_K2_E5,
128714b24e2bSVaishali Kulkarni 	NWM_REG_DBG_FORCE_FRAME_K2_E5,
128814b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV_2, 0 };
128914b24e2bSVaishali Kulkarni 
129014b24e2bSVaishali Kulkarni static struct block_defs block_nws_defs = {
129114b24e2bSVaishali Kulkarni 	"nws", { false, true }, false, 0,
129214b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCW },
129314b24e2bSVaishali Kulkarni 	NWS_REG_DBG_SELECT_K2_E5, NWS_REG_DBG_DWORD_ENABLE_K2_E5,
129414b24e2bSVaishali Kulkarni 	NWS_REG_DBG_SHIFT_K2_E5, NWS_REG_DBG_FORCE_VALID_K2_E5,
129514b24e2bSVaishali Kulkarni 	NWS_REG_DBG_FORCE_FRAME_K2_E5,
129614b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV, 12 };
129714b24e2bSVaishali Kulkarni 
129814b24e2bSVaishali Kulkarni static struct block_defs block_ms_defs = {
129914b24e2bSVaishali Kulkarni 	"ms", { false, true }, false, 0,
130014b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCZ },
130114b24e2bSVaishali Kulkarni 	MS_REG_DBG_SELECT_K2_E5, MS_REG_DBG_DWORD_ENABLE_K2_E5,
130214b24e2bSVaishali Kulkarni 	MS_REG_DBG_SHIFT_K2_E5, MS_REG_DBG_FORCE_VALID_K2_E5,
130314b24e2bSVaishali Kulkarni 	MS_REG_DBG_FORCE_FRAME_K2_E5,
130414b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV, 13 };
130514b24e2bSVaishali Kulkarni 
130614b24e2bSVaishali Kulkarni static struct block_defs block_phy_pcie_defs = {
130714b24e2bSVaishali Kulkarni 	"phy_pcie", { false, true }, false, 0,
130814b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCH },
130914b24e2bSVaishali Kulkarni 	PCIE_REG_DBG_COMMON_SELECT_K2_E5, PCIE_REG_DBG_COMMON_DWORD_ENABLE_K2_E5,
131014b24e2bSVaishali Kulkarni 	PCIE_REG_DBG_COMMON_SHIFT_K2_E5, PCIE_REG_DBG_COMMON_FORCE_VALID_K2_E5,
131114b24e2bSVaishali Kulkarni 	PCIE_REG_DBG_COMMON_FORCE_FRAME_K2_E5,
131214b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
131314b24e2bSVaishali Kulkarni 
131414b24e2bSVaishali Kulkarni static struct block_defs block_led_defs = {
131514b24e2bSVaishali Kulkarni 	"led", { false, false }, false, 0,
131614b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
131714b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
131814b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_HV, 14 };
131914b24e2bSVaishali Kulkarni 
132014b24e2bSVaishali Kulkarni static struct block_defs block_avs_wrap_defs = {
132114b24e2bSVaishali Kulkarni 	"avs_wrap", { false, false }, false, 0,
132214b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
132314b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
132414b24e2bSVaishali Kulkarni 	true, false, DBG_RESET_REG_MISCS_PL_UA, 11 };
132514b24e2bSVaishali Kulkarni 
132614b24e2bSVaishali Kulkarni static struct block_defs block_rgfs_defs = {
132714b24e2bSVaishali Kulkarni 	"rgfs", { false, false }, false, 0,
132814b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
132914b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
133014b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
133114b24e2bSVaishali Kulkarni 
133214b24e2bSVaishali Kulkarni static struct block_defs block_rgsrc_defs = {
133314b24e2bSVaishali Kulkarni 	"rgsrc", { false, false }, false, 0,
133414b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
133514b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
133614b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
133714b24e2bSVaishali Kulkarni 
133814b24e2bSVaishali Kulkarni static struct block_defs block_tgfs_defs = {
133914b24e2bSVaishali Kulkarni 	"tgfs", { false, false }, false, 0,
134014b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
134114b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
134214b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
134314b24e2bSVaishali Kulkarni 
134414b24e2bSVaishali Kulkarni static struct block_defs block_tgsrc_defs = {
134514b24e2bSVaishali Kulkarni 	"tgsrc", { false, false }, false, 0,
134614b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
134714b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
134814b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
134914b24e2bSVaishali Kulkarni 
135014b24e2bSVaishali Kulkarni static struct block_defs block_ptld_defs = {
135114b24e2bSVaishali Kulkarni 	"ptld", { false, false }, false, 0,
135214b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
135314b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
135414b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
135514b24e2bSVaishali Kulkarni 
135614b24e2bSVaishali Kulkarni static struct block_defs block_ypld_defs = {
135714b24e2bSVaishali Kulkarni 	"ypld", { false, false }, false, 0,
135814b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
135914b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
136014b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
136114b24e2bSVaishali Kulkarni 
136214b24e2bSVaishali Kulkarni static struct block_defs block_misc_aeu_defs = {
136314b24e2bSVaishali Kulkarni 	"misc_aeu", { false, false }, false, 0,
136414b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
136514b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
136614b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
136714b24e2bSVaishali Kulkarni 
136814b24e2bSVaishali Kulkarni static struct block_defs block_bar0_map_defs = {
136914b24e2bSVaishali Kulkarni 	"bar0_map", { false, false }, false, 0,
137014b24e2bSVaishali Kulkarni 	{ MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS },
137114b24e2bSVaishali Kulkarni 	0, 0, 0, 0, 0,
137214b24e2bSVaishali Kulkarni 	false, false, MAX_DBG_RESET_REGS, 0 };
137314b24e2bSVaishali Kulkarni 
137414b24e2bSVaishali Kulkarni 
137514b24e2bSVaishali Kulkarni static struct block_defs* s_block_defs[MAX_BLOCK_ID] = {
137614b24e2bSVaishali Kulkarni 	&block_grc_defs,
137714b24e2bSVaishali Kulkarni  	&block_miscs_defs,
137814b24e2bSVaishali Kulkarni  	&block_misc_defs,
137914b24e2bSVaishali Kulkarni  	&block_dbu_defs,
138014b24e2bSVaishali Kulkarni  	&block_pglue_b_defs,
138114b24e2bSVaishali Kulkarni  	&block_cnig_defs,
138214b24e2bSVaishali Kulkarni  	&block_cpmu_defs,
138314b24e2bSVaishali Kulkarni  	&block_ncsi_defs,
138414b24e2bSVaishali Kulkarni  	&block_opte_defs,
138514b24e2bSVaishali Kulkarni  	&block_bmb_defs,
138614b24e2bSVaishali Kulkarni  	&block_pcie_defs,
138714b24e2bSVaishali Kulkarni  	&block_mcp_defs,
138814b24e2bSVaishali Kulkarni  	&block_mcp2_defs,
138914b24e2bSVaishali Kulkarni  	&block_pswhst_defs,
139014b24e2bSVaishali Kulkarni  	&block_pswhst2_defs,
139114b24e2bSVaishali Kulkarni  	&block_pswrd_defs,
139214b24e2bSVaishali Kulkarni  	&block_pswrd2_defs,
139314b24e2bSVaishali Kulkarni  	&block_pswwr_defs,
139414b24e2bSVaishali Kulkarni  	&block_pswwr2_defs,
139514b24e2bSVaishali Kulkarni  	&block_pswrq_defs,
139614b24e2bSVaishali Kulkarni  	&block_pswrq2_defs,
139714b24e2bSVaishali Kulkarni  	&block_pglcs_defs,
139814b24e2bSVaishali Kulkarni  	&block_dmae_defs,
139914b24e2bSVaishali Kulkarni  	&block_ptu_defs,
140014b24e2bSVaishali Kulkarni  	&block_tcm_defs,
140114b24e2bSVaishali Kulkarni  	&block_mcm_defs,
140214b24e2bSVaishali Kulkarni  	&block_ucm_defs,
140314b24e2bSVaishali Kulkarni  	&block_xcm_defs,
140414b24e2bSVaishali Kulkarni  	&block_ycm_defs,
140514b24e2bSVaishali Kulkarni  	&block_pcm_defs,
140614b24e2bSVaishali Kulkarni  	&block_qm_defs,
140714b24e2bSVaishali Kulkarni  	&block_tm_defs,
140814b24e2bSVaishali Kulkarni  	&block_dorq_defs,
140914b24e2bSVaishali Kulkarni  	&block_brb_defs,
141014b24e2bSVaishali Kulkarni  	&block_src_defs,
141114b24e2bSVaishali Kulkarni  	&block_prs_defs,
141214b24e2bSVaishali Kulkarni  	&block_tsdm_defs,
141314b24e2bSVaishali Kulkarni  	&block_msdm_defs,
141414b24e2bSVaishali Kulkarni  	&block_usdm_defs,
141514b24e2bSVaishali Kulkarni  	&block_xsdm_defs,
141614b24e2bSVaishali Kulkarni  	&block_ysdm_defs,
141714b24e2bSVaishali Kulkarni  	&block_psdm_defs,
141814b24e2bSVaishali Kulkarni  	&block_tsem_defs,
141914b24e2bSVaishali Kulkarni  	&block_msem_defs,
142014b24e2bSVaishali Kulkarni  	&block_usem_defs,
142114b24e2bSVaishali Kulkarni  	&block_xsem_defs,
142214b24e2bSVaishali Kulkarni  	&block_ysem_defs,
142314b24e2bSVaishali Kulkarni  	&block_psem_defs,
142414b24e2bSVaishali Kulkarni  	&block_rss_defs,
142514b24e2bSVaishali Kulkarni  	&block_tmld_defs,
142614b24e2bSVaishali Kulkarni  	&block_muld_defs,
142714b24e2bSVaishali Kulkarni  	&block_yuld_defs,
142814b24e2bSVaishali Kulkarni  	&block_xyld_defs,
142914b24e2bSVaishali Kulkarni  	&block_ptld_defs,
143014b24e2bSVaishali Kulkarni  	&block_ypld_defs,
143114b24e2bSVaishali Kulkarni  	&block_prm_defs,
143214b24e2bSVaishali Kulkarni  	&block_pbf_pb1_defs,
143314b24e2bSVaishali Kulkarni  	&block_pbf_pb2_defs,
143414b24e2bSVaishali Kulkarni  	&block_rpb_defs,
143514b24e2bSVaishali Kulkarni  	&block_btb_defs,
143614b24e2bSVaishali Kulkarni  	&block_pbf_defs,
143714b24e2bSVaishali Kulkarni  	&block_rdif_defs,
143814b24e2bSVaishali Kulkarni  	&block_tdif_defs,
143914b24e2bSVaishali Kulkarni  	&block_cdu_defs,
144014b24e2bSVaishali Kulkarni  	&block_ccfc_defs,
144114b24e2bSVaishali Kulkarni  	&block_tcfc_defs,
144214b24e2bSVaishali Kulkarni  	&block_igu_defs,
144314b24e2bSVaishali Kulkarni  	&block_cau_defs,
144414b24e2bSVaishali Kulkarni  	&block_rgfs_defs,
144514b24e2bSVaishali Kulkarni  	&block_rgsrc_defs,
144614b24e2bSVaishali Kulkarni  	&block_tgfs_defs,
144714b24e2bSVaishali Kulkarni  	&block_tgsrc_defs,
144814b24e2bSVaishali Kulkarni  	&block_umac_defs,
144914b24e2bSVaishali Kulkarni  	&block_xmac_defs,
145014b24e2bSVaishali Kulkarni  	&block_dbg_defs,
145114b24e2bSVaishali Kulkarni  	&block_nig_defs,
145214b24e2bSVaishali Kulkarni  	&block_wol_defs,
145314b24e2bSVaishali Kulkarni  	&block_bmbn_defs,
145414b24e2bSVaishali Kulkarni  	&block_ipc_defs,
145514b24e2bSVaishali Kulkarni  	&block_nwm_defs,
145614b24e2bSVaishali Kulkarni  	&block_nws_defs,
145714b24e2bSVaishali Kulkarni  	&block_ms_defs,
145814b24e2bSVaishali Kulkarni  	&block_phy_pcie_defs,
145914b24e2bSVaishali Kulkarni  	&block_led_defs,
146014b24e2bSVaishali Kulkarni  	&block_avs_wrap_defs,
146114b24e2bSVaishali Kulkarni  	&block_misc_aeu_defs,
146214b24e2bSVaishali Kulkarni  	&block_bar0_map_defs,
146314b24e2bSVaishali Kulkarni 
146414b24e2bSVaishali Kulkarni };
146514b24e2bSVaishali Kulkarni 
146614b24e2bSVaishali Kulkarni 
146714b24e2bSVaishali Kulkarni /* Constraint operation types */
146814b24e2bSVaishali Kulkarni static struct dbg_bus_constraint_op_defs s_constraint_op_defs[] = {
146914b24e2bSVaishali Kulkarni 
147014b24e2bSVaishali Kulkarni 	/* DBG_BUS_CONSTRAINT_OP_EQ */
147114b24e2bSVaishali Kulkarni 	{ 0, false },
147214b24e2bSVaishali Kulkarni 
147314b24e2bSVaishali Kulkarni 	/* DBG_BUS_CONSTRAINT_OP_NE */
147414b24e2bSVaishali Kulkarni 	{ 5, false },
147514b24e2bSVaishali Kulkarni 
147614b24e2bSVaishali Kulkarni 	/* DBG_BUS_CONSTRAINT_OP_LT */
147714b24e2bSVaishali Kulkarni 	{ 1, false },
147814b24e2bSVaishali Kulkarni 
147914b24e2bSVaishali Kulkarni 	/* DBG_BUS_CONSTRAINT_OP_LTC */
148014b24e2bSVaishali Kulkarni 	{ 1, true },
148114b24e2bSVaishali Kulkarni 
148214b24e2bSVaishali Kulkarni 	/* DBG_BUS_CONSTRAINT_OP_LE */
148314b24e2bSVaishali Kulkarni 	{ 2, false },
148414b24e2bSVaishali Kulkarni 
148514b24e2bSVaishali Kulkarni 	/* DBG_BUS_CONSTRAINT_OP_LEC */
148614b24e2bSVaishali Kulkarni 	{ 2, true },
148714b24e2bSVaishali Kulkarni 
148814b24e2bSVaishali Kulkarni 	/* DBG_BUS_CONSTRAINT_OP_GT */
148914b24e2bSVaishali Kulkarni 	{ 4, false },
149014b24e2bSVaishali Kulkarni 
149114b24e2bSVaishali Kulkarni 	/* DBG_BUS_CONSTRAINT_OP_GTC */
149214b24e2bSVaishali Kulkarni 	{ 4, true },
149314b24e2bSVaishali Kulkarni 
149414b24e2bSVaishali Kulkarni 	/* DBG_BUS_CONSTRAINT_OP_GE */
149514b24e2bSVaishali Kulkarni 	{ 3, false },
149614b24e2bSVaishali Kulkarni 
149714b24e2bSVaishali Kulkarni 	/* DBG_BUS_CONSTRAINT_OP_GEC */
149814b24e2bSVaishali Kulkarni 	{ 3, true }
149914b24e2bSVaishali Kulkarni };
150014b24e2bSVaishali Kulkarni 
150114b24e2bSVaishali Kulkarni static const char* s_dbg_target_names[] = {
150214b24e2bSVaishali Kulkarni 
150314b24e2bSVaishali Kulkarni 	/* DBG_BUS_TARGET_ID_INT_BUF */
150414b24e2bSVaishali Kulkarni 	"int-buf",
150514b24e2bSVaishali Kulkarni 
150614b24e2bSVaishali Kulkarni 	/* DBG_BUS_TARGET_ID_NIG */
150714b24e2bSVaishali Kulkarni 	"nw",
150814b24e2bSVaishali Kulkarni 
150914b24e2bSVaishali Kulkarni 	/* DBG_BUS_TARGET_ID_PCI */
151014b24e2bSVaishali Kulkarni 	"pci-buf"
151114b24e2bSVaishali Kulkarni };
151214b24e2bSVaishali Kulkarni 
151314b24e2bSVaishali Kulkarni static struct storm_mode_defs s_storm_mode_defs[] = {
151414b24e2bSVaishali Kulkarni 
151514b24e2bSVaishali Kulkarni 	/* DBG_BUS_STORM_MODE_PRINTF */
151614b24e2bSVaishali Kulkarni 	{ "printf", true, 0 },
151714b24e2bSVaishali Kulkarni 
151814b24e2bSVaishali Kulkarni 	/* DBG_BUS_STORM_MODE_PRAM_ADDR */
151914b24e2bSVaishali Kulkarni 	{ "pram_addr", true, 1 },
152014b24e2bSVaishali Kulkarni 
152114b24e2bSVaishali Kulkarni 	/* DBG_BUS_STORM_MODE_DRA_RW */
152214b24e2bSVaishali Kulkarni 	{ "dra_rw", true, 2 },
152314b24e2bSVaishali Kulkarni 
152414b24e2bSVaishali Kulkarni 	/* DBG_BUS_STORM_MODE_DRA_W */
152514b24e2bSVaishali Kulkarni 	{ "dra_w", true, 3 },
152614b24e2bSVaishali Kulkarni 
152714b24e2bSVaishali Kulkarni 	/* DBG_BUS_STORM_MODE_LD_ST_ADDR */
152814b24e2bSVaishali Kulkarni 	{ "ld_st_addr", true, 4 },
152914b24e2bSVaishali Kulkarni 
153014b24e2bSVaishali Kulkarni 	/* DBG_BUS_STORM_MODE_DRA_FSM */
153114b24e2bSVaishali Kulkarni 	{ "dra_fsm", true, 5 },
153214b24e2bSVaishali Kulkarni 
153314b24e2bSVaishali Kulkarni 	/* DBG_BUS_STORM_MODE_RH */
153414b24e2bSVaishali Kulkarni 	{ "rh", true, 6 },
153514b24e2bSVaishali Kulkarni 
153614b24e2bSVaishali Kulkarni 	/* DBG_BUS_STORM_MODE_FOC */
153714b24e2bSVaishali Kulkarni 	{ "foc", false, 1 },
153814b24e2bSVaishali Kulkarni 
153914b24e2bSVaishali Kulkarni 	/* DBG_BUS_STORM_MODE_EXT_STORE */
154014b24e2bSVaishali Kulkarni 	{ "ext_store", false, 3 }
154114b24e2bSVaishali Kulkarni };
154214b24e2bSVaishali Kulkarni 
154314b24e2bSVaishali Kulkarni static struct platform_defs s_platform_defs[] = {
154414b24e2bSVaishali Kulkarni 
154514b24e2bSVaishali Kulkarni 	/* PLATFORM_ASIC */
154614b24e2bSVaishali Kulkarni 	{ "asic", 1 },
154714b24e2bSVaishali Kulkarni 
154814b24e2bSVaishali Kulkarni 	/* PLATFORM_EMUL_FULL */
154914b24e2bSVaishali Kulkarni 	{ "emul_full", 2000 },
155014b24e2bSVaishali Kulkarni 
155114b24e2bSVaishali Kulkarni 	/* PLATFORM_EMUL_REDUCED */
155214b24e2bSVaishali Kulkarni 	{ "emul_reduced", 2000 },
155314b24e2bSVaishali Kulkarni 
155414b24e2bSVaishali Kulkarni 	/* PLATFORM_FPGA */
155514b24e2bSVaishali Kulkarni 	{ "fpga", 200 }
155614b24e2bSVaishali Kulkarni };
155714b24e2bSVaishali Kulkarni 
155814b24e2bSVaishali Kulkarni static struct grc_param_defs s_grc_param_defs[] = {
155914b24e2bSVaishali Kulkarni 
156014b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_TSTORM */
156114b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 1, 1 },
156214b24e2bSVaishali Kulkarni 
156314b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_MSTORM */
156414b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 1, 1 },
156514b24e2bSVaishali Kulkarni 
156614b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_USTORM */
156714b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 1, 1 },
156814b24e2bSVaishali Kulkarni 
156914b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_XSTORM */
157014b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 1, 1 },
157114b24e2bSVaishali Kulkarni 
157214b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_YSTORM */
157314b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 1, 1 },
157414b24e2bSVaishali Kulkarni 
157514b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_PSTORM */
157614b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 1, 1 },
157714b24e2bSVaishali Kulkarni 
157814b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_REGS */
157914b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
158014b24e2bSVaishali Kulkarni 
158114b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_RAM */
158214b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
158314b24e2bSVaishali Kulkarni 
158414b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_PBUF */
158514b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
158614b24e2bSVaishali Kulkarni 
158714b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_IOR */
158814b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, false, 0, 1 },
158914b24e2bSVaishali Kulkarni 
159014b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_VFC */
159114b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, false, 0, 1 },
159214b24e2bSVaishali Kulkarni 
159314b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_CM_CTX */
159414b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
159514b24e2bSVaishali Kulkarni 
159614b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_ILT */
159714b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
159814b24e2bSVaishali Kulkarni 
159914b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_RSS */
160014b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
160114b24e2bSVaishali Kulkarni 
160214b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_CAU */
160314b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
160414b24e2bSVaishali Kulkarni 
160514b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_QM */
160614b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
160714b24e2bSVaishali Kulkarni 
160814b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_MCP */
160914b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
161014b24e2bSVaishali Kulkarni 
161114b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_RESERVED */
161214b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
161314b24e2bSVaishali Kulkarni 
161414b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_CFC */
161514b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
161614b24e2bSVaishali Kulkarni 
161714b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_IGU */
161814b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
161914b24e2bSVaishali Kulkarni 
162014b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_BRB */
162114b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, false, 0, 1 },
162214b24e2bSVaishali Kulkarni 
162314b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_BTB */
162414b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, false, 0, 1 },
162514b24e2bSVaishali Kulkarni 
162614b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_BMB */
162714b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, false, 0, 1 },
162814b24e2bSVaishali Kulkarni 
162914b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_NIG */
163014b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
163114b24e2bSVaishali Kulkarni 
163214b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_MULD */
163314b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
163414b24e2bSVaishali Kulkarni 
163514b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_PRS */
163614b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
163714b24e2bSVaishali Kulkarni 
163814b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_DMAE */
163914b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
164014b24e2bSVaishali Kulkarni 
164114b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_TM */
164214b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
164314b24e2bSVaishali Kulkarni 
164414b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_SDM */
164514b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
164614b24e2bSVaishali Kulkarni 
164714b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_DIF */
164814b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
164914b24e2bSVaishali Kulkarni 
165014b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_STATIC */
165114b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
165214b24e2bSVaishali Kulkarni 
165314b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_UNSTALL */
165414b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, false, 0, 0 },
165514b24e2bSVaishali Kulkarni 
165614b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_NUM_LCIDS */
165714b24e2bSVaishali Kulkarni 	{ { MAX_LCIDS, MAX_LCIDS }, 1, MAX_LCIDS, false, MAX_LCIDS, MAX_LCIDS },
165814b24e2bSVaishali Kulkarni 
165914b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_NUM_LTIDS */
166014b24e2bSVaishali Kulkarni 	{ { MAX_LTIDS, MAX_LTIDS }, 1, MAX_LTIDS, false, MAX_LTIDS, MAX_LTIDS },
166114b24e2bSVaishali Kulkarni 
166214b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_EXCLUDE_ALL */
166314b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, true, 0, 0 },
166414b24e2bSVaishali Kulkarni 
166514b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_CRASH */
166614b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, true, 0, 0 },
166714b24e2bSVaishali Kulkarni 
166814b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_PARITY_SAFE */
166914b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, false, 1, 0 },
167014b24e2bSVaishali Kulkarni 
167114b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_CM */
167214b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
167314b24e2bSVaishali Kulkarni 
167414b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_DUMP_PHY */
167514b24e2bSVaishali Kulkarni 	{ { 1, 1 }, 0, 1, false, 0, 1 },
167614b24e2bSVaishali Kulkarni 
167714b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_NO_MCP */
167814b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, false, 0, 0 },
167914b24e2bSVaishali Kulkarni 
168014b24e2bSVaishali Kulkarni 	/* DBG_GRC_PARAM_NO_FW_VER */
168114b24e2bSVaishali Kulkarni 	{ { 0, 0 }, 0, 1, false, 0, 0 }
168214b24e2bSVaishali Kulkarni };
168314b24e2bSVaishali Kulkarni 
168414b24e2bSVaishali Kulkarni static struct rss_mem_defs s_rss_mem_defs[] = {
168514b24e2bSVaishali Kulkarni 	{ "rss_mem_cid", "rss_cid", 0,
168614b24e2bSVaishali Kulkarni 	{ 256, 320 },
168714b24e2bSVaishali Kulkarni 	{ 32, 32 } },
168814b24e2bSVaishali Kulkarni 
168914b24e2bSVaishali Kulkarni 	{ "rss_mem_key_msb", "rss_key", 1024,
169014b24e2bSVaishali Kulkarni 	{ 128, 208 },
169114b24e2bSVaishali Kulkarni 	{ 256, 256 } },
169214b24e2bSVaishali Kulkarni 
169314b24e2bSVaishali Kulkarni 	{ "rss_mem_key_lsb", "rss_key", 2048,
169414b24e2bSVaishali Kulkarni 	{ 128, 208 },
169514b24e2bSVaishali Kulkarni 	{ 64, 64 } },
169614b24e2bSVaishali Kulkarni 
169714b24e2bSVaishali Kulkarni 	{ "rss_mem_info", "rss_info", 3072,
169814b24e2bSVaishali Kulkarni 	{ 128, 208 },
169914b24e2bSVaishali Kulkarni 	{ 16, 16 } },
170014b24e2bSVaishali Kulkarni 
170114b24e2bSVaishali Kulkarni 	{ "rss_mem_ind", "rss_ind", 4096,
170214b24e2bSVaishali Kulkarni 	{ 16384, 26624 },
170314b24e2bSVaishali Kulkarni 	{ 16, 16 } }
170414b24e2bSVaishali Kulkarni };
170514b24e2bSVaishali Kulkarni 
170614b24e2bSVaishali Kulkarni static struct vfc_ram_defs s_vfc_ram_defs[] = {
170714b24e2bSVaishali Kulkarni 	{ "vfc_ram_tt1", "vfc_ram", 0, 512 },
170814b24e2bSVaishali Kulkarni 	{ "vfc_ram_mtt2", "vfc_ram", 512, 128 },
170914b24e2bSVaishali Kulkarni 	{ "vfc_ram_stt2", "vfc_ram", 640, 32 },
171014b24e2bSVaishali Kulkarni 	{ "vfc_ram_ro_vect", "vfc_ram", 672, 32 }
171114b24e2bSVaishali Kulkarni };
171214b24e2bSVaishali Kulkarni 
171314b24e2bSVaishali Kulkarni static struct big_ram_defs s_big_ram_defs[] = {
171414b24e2bSVaishali Kulkarni 	{ "BRB", MEM_GROUP_BRB_MEM, MEM_GROUP_BRB_RAM, DBG_GRC_PARAM_DUMP_BRB, BRB_REG_BIG_RAM_ADDRESS, BRB_REG_BIG_RAM_DATA,
171514b24e2bSVaishali Kulkarni 	  { 4800, 5632 } },
171614b24e2bSVaishali Kulkarni 
171714b24e2bSVaishali Kulkarni 	{ "BTB", MEM_GROUP_BTB_MEM, MEM_GROUP_BTB_RAM, DBG_GRC_PARAM_DUMP_BTB, BTB_REG_BIG_RAM_ADDRESS, BTB_REG_BIG_RAM_DATA,
171814b24e2bSVaishali Kulkarni 	  { 2880, 3680 } },
171914b24e2bSVaishali Kulkarni 
172014b24e2bSVaishali Kulkarni 	{ "BMB", MEM_GROUP_BMB_MEM, MEM_GROUP_BMB_RAM, DBG_GRC_PARAM_DUMP_BMB, BMB_REG_BIG_RAM_ADDRESS, BMB_REG_BIG_RAM_DATA,
172114b24e2bSVaishali Kulkarni 	  { 1152, 1152 } }
172214b24e2bSVaishali Kulkarni };
172314b24e2bSVaishali Kulkarni 
172414b24e2bSVaishali Kulkarni static struct reset_reg_defs s_reset_regs_defs[] = {
172514b24e2bSVaishali Kulkarni 
172614b24e2bSVaishali Kulkarni 	/* DBG_RESET_REG_MISCS_PL_UA */
172714b24e2bSVaishali Kulkarni 	{ MISCS_REG_RESET_PL_UA, 0x0, { true, true } },
172814b24e2bSVaishali Kulkarni 
172914b24e2bSVaishali Kulkarni 	/* DBG_RESET_REG_MISCS_PL_HV */
173014b24e2bSVaishali Kulkarni 	{ MISCS_REG_RESET_PL_HV, 0x0, { true, true } },
173114b24e2bSVaishali Kulkarni 
173214b24e2bSVaishali Kulkarni 	/* DBG_RESET_REG_MISCS_PL_HV_2 */
173314b24e2bSVaishali Kulkarni 	{ MISCS_REG_RESET_PL_HV_2_K2_E5, 0x0, { false, true } },
173414b24e2bSVaishali Kulkarni 
173514b24e2bSVaishali Kulkarni 	/* DBG_RESET_REG_MISC_PL_UA */
173614b24e2bSVaishali Kulkarni 	{ MISC_REG_RESET_PL_UA, 0x0, { true, true } },
173714b24e2bSVaishali Kulkarni 
173814b24e2bSVaishali Kulkarni 	/* DBG_RESET_REG_MISC_PL_HV */
173914b24e2bSVaishali Kulkarni 	{ MISC_REG_RESET_PL_HV, 0x0, { true, true } },
174014b24e2bSVaishali Kulkarni 
174114b24e2bSVaishali Kulkarni 	/* DBG_RESET_REG_MISC_PL_PDA_VMAIN_1 */
174214b24e2bSVaishali Kulkarni 	{ MISC_REG_RESET_PL_PDA_VMAIN_1, 0x4404040, { true, true } },
174314b24e2bSVaishali Kulkarni 
174414b24e2bSVaishali Kulkarni 	/* DBG_RESET_REG_MISC_PL_PDA_VMAIN_2 */
174514b24e2bSVaishali Kulkarni 	{ MISC_REG_RESET_PL_PDA_VMAIN_2, 0x7c00007, { true, true } },
174614b24e2bSVaishali Kulkarni 
174714b24e2bSVaishali Kulkarni 	/* DBG_RESET_REG_MISC_PL_PDA_VAUX */
174814b24e2bSVaishali Kulkarni 	{ MISC_REG_RESET_PL_PDA_VAUX, 0x2, { true, true } },
174914b24e2bSVaishali Kulkarni };
175014b24e2bSVaishali Kulkarni 
175114b24e2bSVaishali Kulkarni static struct phy_defs s_phy_defs[] = {
175214b24e2bSVaishali Kulkarni 	{ "nw_phy", NWS_REG_NWS_CMU_K2_E5, PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_7_0_K2_E5, PHY_NW_IP_REG_PHY0_TOP_TBUS_ADDR_15_8_K2_E5, PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_7_0_K2_E5, PHY_NW_IP_REG_PHY0_TOP_TBUS_DATA_11_8_K2_E5 },
175314b24e2bSVaishali Kulkarni 	{ "sgmii_phy", MS_REG_MS_CMU_K2_E5, PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X132_K2_E5, PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X133_K2_E5, PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X130_K2_E5, PHY_SGMII_IP_REG_AHB_CMU_CSR_0_X131_K2_E5 },
175414b24e2bSVaishali Kulkarni 	{ "pcie_phy0", PHY_PCIE_REG_PHY0_K2_E5, PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2_E5, PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2_E5, PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2_E5, PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2_E5 },
175514b24e2bSVaishali Kulkarni 	{ "pcie_phy1", PHY_PCIE_REG_PHY1_K2_E5, PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X132_K2_E5, PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X133_K2_E5, PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X130_K2_E5, PHY_PCIE_IP_REG_AHB_CMU_CSR_0_X131_K2_E5 },
175614b24e2bSVaishali Kulkarni };
175714b24e2bSVaishali Kulkarni 
175814b24e2bSVaishali Kulkarni /* The order of indexes that should be applied to a PCI buffer line */
175914b24e2bSVaishali Kulkarni static const u8 s_pci_buf_line_ind[PCI_BUF_LINE_SIZE_IN_DWORDS] = { 1, 0, 3, 2, 5, 4, 7, 6 };
176014b24e2bSVaishali Kulkarni 
176114b24e2bSVaishali Kulkarni /******************************** Variables **********************************/
176214b24e2bSVaishali Kulkarni 
176314b24e2bSVaishali Kulkarni /* The version of the calling app */
176414b24e2bSVaishali Kulkarni static u32 s_app_ver;
176514b24e2bSVaishali Kulkarni 
176614b24e2bSVaishali Kulkarni /**************************** Private Functions ******************************/
176714b24e2bSVaishali Kulkarni 
ecore_static_asserts(void)176814b24e2bSVaishali Kulkarni static void ecore_static_asserts(void)
176914b24e2bSVaishali Kulkarni {
177014b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_dbg_arrays, MAX_BIN_DBG_BUFFER_TYPE);
177114b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_big_ram_defs, NUM_BIG_RAM_TYPES);
177214b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_vfc_ram_defs, NUM_VFC_RAM_TYPES);
177314b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_rss_mem_defs, NUM_RSS_MEM_TYPES);
177414b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_chip_defs, MAX_CHIP_IDS);
177514b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_platform_defs, MAX_PLATFORM_IDS);
177614b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_storm_defs, MAX_DBG_STORMS);
177714b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_constraint_op_defs, MAX_DBG_BUS_CONSTRAINT_OPS);
177814b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_dbg_target_names, MAX_DBG_BUS_TARGETS);
177914b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_storm_mode_defs, MAX_DBG_BUS_STORM_MODES);
178014b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_grc_param_defs, MAX_DBG_GRC_PARAMS);
178114b24e2bSVaishali Kulkarni 	CHECK_ARR_SIZE(s_reset_regs_defs, MAX_DBG_RESET_REGS);
178214b24e2bSVaishali Kulkarni }
178314b24e2bSVaishali Kulkarni 
178414b24e2bSVaishali Kulkarni /* Reads and returns a single dword from the specified unaligned buffer. */
ecore_read_unaligned_dword(u8 * buf)178514b24e2bSVaishali Kulkarni static u32 ecore_read_unaligned_dword(u8 *buf)
178614b24e2bSVaishali Kulkarni {
178714b24e2bSVaishali Kulkarni 	u32 dword;
178814b24e2bSVaishali Kulkarni 
178914b24e2bSVaishali Kulkarni 	OSAL_MEMCPY((u8*)&dword, buf, sizeof(dword));
179014b24e2bSVaishali Kulkarni 	return dword;
179114b24e2bSVaishali Kulkarni }
179214b24e2bSVaishali Kulkarni 
179314b24e2bSVaishali Kulkarni /* Returns the difference in bytes between the specified physical addresses.
179414b24e2bSVaishali Kulkarni  * Assumes that the first address is bigger then the second, and that the
179514b24e2bSVaishali Kulkarni  * difference is a 32-bit value.
179614b24e2bSVaishali Kulkarni  */
ecore_phys_addr_diff(struct dbg_bus_mem_addr * a,struct dbg_bus_mem_addr * b)179714b24e2bSVaishali Kulkarni static u32 ecore_phys_addr_diff(struct dbg_bus_mem_addr *a,
179814b24e2bSVaishali Kulkarni 								struct dbg_bus_mem_addr *b)
179914b24e2bSVaishali Kulkarni {
180014b24e2bSVaishali Kulkarni 	return a->hi == b->hi ? a->lo - b->lo : b->lo - a->lo;
180114b24e2bSVaishali Kulkarni }
180214b24e2bSVaishali Kulkarni 
180314b24e2bSVaishali Kulkarni /* Sets the value of the specified GRC param */
ecore_grc_set_param(struct ecore_hwfn * p_hwfn,enum dbg_grc_params grc_param,u32 val)180414b24e2bSVaishali Kulkarni static void ecore_grc_set_param(struct ecore_hwfn *p_hwfn,
180514b24e2bSVaishali Kulkarni 				 enum dbg_grc_params grc_param,
180614b24e2bSVaishali Kulkarni 				 u32 val)
180714b24e2bSVaishali Kulkarni {
180814b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
180914b24e2bSVaishali Kulkarni 
181014b24e2bSVaishali Kulkarni 	dev_data->grc.param_val[grc_param] = val;
181114b24e2bSVaishali Kulkarni }
181214b24e2bSVaishali Kulkarni 
181314b24e2bSVaishali Kulkarni /* Returns the value of the specified GRC param */
ecore_grc_get_param(struct ecore_hwfn * p_hwfn,enum dbg_grc_params grc_param)181414b24e2bSVaishali Kulkarni static u32 ecore_grc_get_param(struct ecore_hwfn *p_hwfn,
181514b24e2bSVaishali Kulkarni 							   enum dbg_grc_params grc_param)
181614b24e2bSVaishali Kulkarni {
181714b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
181814b24e2bSVaishali Kulkarni 
181914b24e2bSVaishali Kulkarni 	return dev_data->grc.param_val[grc_param];
182014b24e2bSVaishali Kulkarni }
182114b24e2bSVaishali Kulkarni 
182214b24e2bSVaishali Kulkarni /* Initializes the GRC parameters */
ecore_dbg_grc_init_params(struct ecore_hwfn * p_hwfn)182314b24e2bSVaishali Kulkarni static void ecore_dbg_grc_init_params(struct ecore_hwfn *p_hwfn)
182414b24e2bSVaishali Kulkarni {
182514b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
182614b24e2bSVaishali Kulkarni 
182714b24e2bSVaishali Kulkarni 	if (!dev_data->grc.params_initialized) {
182814b24e2bSVaishali Kulkarni 		ecore_dbg_grc_set_params_default(p_hwfn);
182914b24e2bSVaishali Kulkarni 		dev_data->grc.params_initialized = 1;
183014b24e2bSVaishali Kulkarni 	}
183114b24e2bSVaishali Kulkarni }
183214b24e2bSVaishali Kulkarni 
183314b24e2bSVaishali Kulkarni /* Initializes debug data for the specified device */
ecore_dbg_dev_init(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)183414b24e2bSVaishali Kulkarni static enum dbg_status ecore_dbg_dev_init(struct ecore_hwfn *p_hwfn,
183514b24e2bSVaishali Kulkarni 										  struct ecore_ptt *p_ptt)
183614b24e2bSVaishali Kulkarni {
183714b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
183814b24e2bSVaishali Kulkarni 
183914b24e2bSVaishali Kulkarni 	if (dev_data->initialized)
184014b24e2bSVaishali Kulkarni 		return DBG_STATUS_OK;
184114b24e2bSVaishali Kulkarni 
184214b24e2bSVaishali Kulkarni 	if (!s_app_ver)
184314b24e2bSVaishali Kulkarni 		return DBG_STATUS_APP_VERSION_NOT_SET;
184414b24e2bSVaishali Kulkarni 
184514b24e2bSVaishali Kulkarni 	if (ECORE_IS_K2(p_hwfn->p_dev)) {
184614b24e2bSVaishali Kulkarni 		dev_data->chip_id = CHIP_K2;
184714b24e2bSVaishali Kulkarni 		dev_data->mode_enable[MODE_K2] = 1;
184814b24e2bSVaishali Kulkarni 	}
184914b24e2bSVaishali Kulkarni 	else if (ECORE_IS_BB_B0(p_hwfn->p_dev)) {
185014b24e2bSVaishali Kulkarni 		dev_data->chip_id = CHIP_BB;
185114b24e2bSVaishali Kulkarni 		dev_data->mode_enable[MODE_BB] = 1;
185214b24e2bSVaishali Kulkarni 	}
185314b24e2bSVaishali Kulkarni 	else {
185414b24e2bSVaishali Kulkarni 		return DBG_STATUS_UNKNOWN_CHIP;
185514b24e2bSVaishali Kulkarni 	}
185614b24e2bSVaishali Kulkarni 
185714b24e2bSVaishali Kulkarni #ifdef ASIC_ONLY
185814b24e2bSVaishali Kulkarni 	dev_data->platform_id = PLATFORM_ASIC;
185914b24e2bSVaishali Kulkarni 	dev_data->mode_enable[MODE_ASIC] = 1;
186014b24e2bSVaishali Kulkarni #else
186114b24e2bSVaishali Kulkarni 	if (CHIP_REV_IS_ASIC(p_hwfn->p_dev)) {
186214b24e2bSVaishali Kulkarni 		dev_data->platform_id = PLATFORM_ASIC;
186314b24e2bSVaishali Kulkarni 		dev_data->mode_enable[MODE_ASIC] = 1;
186414b24e2bSVaishali Kulkarni 	}
186514b24e2bSVaishali Kulkarni 	else if (CHIP_REV_IS_EMUL(p_hwfn->p_dev)) {
186614b24e2bSVaishali Kulkarni 		if (ecore_rd(p_hwfn, p_ptt, MISCS_REG_ECO_RESERVED) & 0x20000000) {
186714b24e2bSVaishali Kulkarni 			dev_data->platform_id = PLATFORM_EMUL_FULL;
186814b24e2bSVaishali Kulkarni 			dev_data->mode_enable[MODE_EMUL_FULL] = 1;
186914b24e2bSVaishali Kulkarni 		}
187014b24e2bSVaishali Kulkarni 		else {
187114b24e2bSVaishali Kulkarni 			dev_data->platform_id = PLATFORM_EMUL_REDUCED;
187214b24e2bSVaishali Kulkarni 			dev_data->mode_enable[MODE_EMUL_REDUCED] = 1;
187314b24e2bSVaishali Kulkarni 		}
187414b24e2bSVaishali Kulkarni 	}
187514b24e2bSVaishali Kulkarni 	else if (CHIP_REV_IS_FPGA(p_hwfn->p_dev)) {
187614b24e2bSVaishali Kulkarni 		dev_data->platform_id = PLATFORM_FPGA;
187714b24e2bSVaishali Kulkarni 		dev_data->mode_enable[MODE_FPGA] = 1;
187814b24e2bSVaishali Kulkarni 	}
187914b24e2bSVaishali Kulkarni 	else {
188014b24e2bSVaishali Kulkarni 		return DBG_STATUS_UNKNOWN_CHIP;
188114b24e2bSVaishali Kulkarni 	}
188214b24e2bSVaishali Kulkarni #endif
188314b24e2bSVaishali Kulkarni 
188414b24e2bSVaishali Kulkarni 	/* Initializes the GRC parameters */
188514b24e2bSVaishali Kulkarni 	ecore_dbg_grc_init_params(p_hwfn);
188614b24e2bSVaishali Kulkarni 
188714b24e2bSVaishali Kulkarni 	dev_data->initialized = true;
188814b24e2bSVaishali Kulkarni 
188914b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
189014b24e2bSVaishali Kulkarni }
189114b24e2bSVaishali Kulkarni 
get_dbg_bus_block_desc(struct ecore_hwfn * p_hwfn,enum block_id block_id)189214b24e2bSVaishali Kulkarni static struct dbg_bus_block* get_dbg_bus_block_desc(struct ecore_hwfn *p_hwfn,
189314b24e2bSVaishali Kulkarni 														  enum block_id block_id)
189414b24e2bSVaishali Kulkarni {
189514b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
189614b24e2bSVaishali Kulkarni 
189714b24e2bSVaishali Kulkarni 	return (struct dbg_bus_block*)&dbg_bus_blocks[block_id * MAX_CHIP_IDS + dev_data->chip_id];
189814b24e2bSVaishali Kulkarni }
189914b24e2bSVaishali Kulkarni 
190014b24e2bSVaishali Kulkarni /* Returns OSAL_NULL for signature line, latency line and non-existing lines */
get_dbg_bus_line_desc(struct ecore_hwfn * p_hwfn,enum block_id block_id)190114b24e2bSVaishali Kulkarni static struct dbg_bus_line* get_dbg_bus_line_desc(struct ecore_hwfn *p_hwfn,
190214b24e2bSVaishali Kulkarni 														enum block_id block_id)
190314b24e2bSVaishali Kulkarni {
190414b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
190514b24e2bSVaishali Kulkarni 	struct dbg_bus_block_data *block_bus;
190614b24e2bSVaishali Kulkarni 	struct dbg_bus_block *block_desc;
190714b24e2bSVaishali Kulkarni 
190814b24e2bSVaishali Kulkarni 	block_bus = &dev_data->bus.blocks[block_id];
190914b24e2bSVaishali Kulkarni 	block_desc = get_dbg_bus_block_desc(p_hwfn, block_id);
191014b24e2bSVaishali Kulkarni 
191114b24e2bSVaishali Kulkarni 	if (!block_bus->line_num ||
191214b24e2bSVaishali Kulkarni 		(block_bus->line_num == 1 && block_desc->has_latency_events) ||
191314b24e2bSVaishali Kulkarni 		block_bus->line_num >= NUM_DBG_LINES(block_desc))
191414b24e2bSVaishali Kulkarni 		return OSAL_NULL;
191514b24e2bSVaishali Kulkarni 
191614b24e2bSVaishali Kulkarni 	return (struct dbg_bus_line*)&dbg_bus_lines[block_desc->lines_offset + block_bus->line_num - NUM_EXTRA_DBG_LINES(block_desc)];
191714b24e2bSVaishali Kulkarni }
191814b24e2bSVaishali Kulkarni 
191914b24e2bSVaishali Kulkarni /* Reads the FW info structure for the specified Storm from the chip,
192014b24e2bSVaishali Kulkarni  * and writes it to the specified fw_info pointer.
192114b24e2bSVaishali Kulkarni  */
ecore_read_fw_info(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u8 storm_id,struct fw_info * fw_info)192214b24e2bSVaishali Kulkarni static void ecore_read_fw_info(struct ecore_hwfn *p_hwfn,
192314b24e2bSVaishali Kulkarni 							   struct ecore_ptt *p_ptt,
192414b24e2bSVaishali Kulkarni 							   u8 storm_id,
192514b24e2bSVaishali Kulkarni 							   struct fw_info *fw_info)
192614b24e2bSVaishali Kulkarni {
192714b24e2bSVaishali Kulkarni 	struct storm_defs *storm = &s_storm_defs[storm_id];
192814b24e2bSVaishali Kulkarni 	struct fw_info_location fw_info_location;
192914b24e2bSVaishali Kulkarni 	u32 addr, i, *dest;
193014b24e2bSVaishali Kulkarni 
193114b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&fw_info_location, 0, sizeof(fw_info_location));
193214b24e2bSVaishali Kulkarni 	OSAL_MEMSET(fw_info, 0, sizeof(*fw_info));
193314b24e2bSVaishali Kulkarni 
193414b24e2bSVaishali Kulkarni 	/* Read first the address that points to fw_info location.
193514b24e2bSVaishali Kulkarni 	 * The address is located in the last line of the Storm RAM.
193614b24e2bSVaishali Kulkarni 	 */
193714b24e2bSVaishali Kulkarni 	addr = storm->sem_fast_mem_addr + SEM_FAST_REG_INT_RAM + DWORDS_TO_BYTES(SEM_FAST_REG_INT_RAM_SIZE) - sizeof(fw_info_location);
193814b24e2bSVaishali Kulkarni 	dest = (u32*)&fw_info_location;
193914b24e2bSVaishali Kulkarni 
194014b24e2bSVaishali Kulkarni 	for (i = 0; i < BYTES_TO_DWORDS(sizeof(fw_info_location)); i++, addr += BYTES_IN_DWORD)
194114b24e2bSVaishali Kulkarni 		dest[i] = ecore_rd(p_hwfn, p_ptt, addr);
194214b24e2bSVaishali Kulkarni 
194314b24e2bSVaishali Kulkarni 	/* Read FW version info from Storm RAM */
194414b24e2bSVaishali Kulkarni 	if (fw_info_location.size > 0 && fw_info_location.size <= sizeof(*fw_info)) {
194514b24e2bSVaishali Kulkarni 		addr = fw_info_location.grc_addr;
194614b24e2bSVaishali Kulkarni 		dest = (u32*)fw_info;
194714b24e2bSVaishali Kulkarni 		for (i = 0; i < BYTES_TO_DWORDS(fw_info_location.size); i++, addr += BYTES_IN_DWORD)
194814b24e2bSVaishali Kulkarni 			dest[i] = ecore_rd(p_hwfn, p_ptt, addr);
194914b24e2bSVaishali Kulkarni 	}
195014b24e2bSVaishali Kulkarni }
195114b24e2bSVaishali Kulkarni 
195214b24e2bSVaishali Kulkarni /* Dumps the specified string to the specified buffer.
195314b24e2bSVaishali Kulkarni  * Returns the dumped size in bytes.
195414b24e2bSVaishali Kulkarni  */
ecore_dump_str(char * dump_buf,bool dump,const char * str)195514b24e2bSVaishali Kulkarni static u32 ecore_dump_str(char *dump_buf,
195614b24e2bSVaishali Kulkarni 						  bool dump,
195714b24e2bSVaishali Kulkarni 						  const char *str)
195814b24e2bSVaishali Kulkarni {
195914b24e2bSVaishali Kulkarni 	if (dump)
196014b24e2bSVaishali Kulkarni 		OSAL_STRCPY(dump_buf, str);
196114b24e2bSVaishali Kulkarni 
196214b24e2bSVaishali Kulkarni 	return (u32)OSAL_STRLEN(str) + 1;
196314b24e2bSVaishali Kulkarni }
196414b24e2bSVaishali Kulkarni 
196514b24e2bSVaishali Kulkarni /* Dumps zeros to align the specified buffer to dwords.
196614b24e2bSVaishali Kulkarni  * Returns the dumped size in bytes.
196714b24e2bSVaishali Kulkarni  */
ecore_dump_align(char * dump_buf,bool dump,u32 byte_offset)196814b24e2bSVaishali Kulkarni static u32 ecore_dump_align(char *dump_buf,
196914b24e2bSVaishali Kulkarni 							bool dump,
197014b24e2bSVaishali Kulkarni 							u32 byte_offset)
197114b24e2bSVaishali Kulkarni {
197214b24e2bSVaishali Kulkarni 	u8 offset_in_dword, align_size;
197314b24e2bSVaishali Kulkarni 
197414b24e2bSVaishali Kulkarni 	offset_in_dword = (u8)(byte_offset & 0x3);
197514b24e2bSVaishali Kulkarni 	align_size = offset_in_dword ? BYTES_IN_DWORD - offset_in_dword : 0;
197614b24e2bSVaishali Kulkarni 
197714b24e2bSVaishali Kulkarni 	if (dump && align_size)
197814b24e2bSVaishali Kulkarni 		OSAL_MEMSET(dump_buf, 0, align_size);
197914b24e2bSVaishali Kulkarni 
198014b24e2bSVaishali Kulkarni 	return align_size;
198114b24e2bSVaishali Kulkarni }
198214b24e2bSVaishali Kulkarni 
198314b24e2bSVaishali Kulkarni /* Writes the specified string param to the specified buffer.
198414b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
198514b24e2bSVaishali Kulkarni  */
ecore_dump_str_param(u32 * dump_buf,bool dump,const char * param_name,const char * param_val)198614b24e2bSVaishali Kulkarni static u32 ecore_dump_str_param(u32 *dump_buf,
198714b24e2bSVaishali Kulkarni 								bool dump,
198814b24e2bSVaishali Kulkarni 								const char *param_name,
198914b24e2bSVaishali Kulkarni 								const char *param_val)
199014b24e2bSVaishali Kulkarni {
199114b24e2bSVaishali Kulkarni 	char *char_buf = (char*)dump_buf;
199214b24e2bSVaishali Kulkarni 	u32 offset = 0;
199314b24e2bSVaishali Kulkarni 
199414b24e2bSVaishali Kulkarni 	/* Dump param name */
199514b24e2bSVaishali Kulkarni 	offset += ecore_dump_str(char_buf + offset, dump, param_name);
199614b24e2bSVaishali Kulkarni 
199714b24e2bSVaishali Kulkarni 	/* Indicate a string param value */
199814b24e2bSVaishali Kulkarni 	if (dump)
199914b24e2bSVaishali Kulkarni 		*(char_buf + offset) = 1;
200014b24e2bSVaishali Kulkarni 	offset++;
200114b24e2bSVaishali Kulkarni 
200214b24e2bSVaishali Kulkarni 	/* Dump param value */
200314b24e2bSVaishali Kulkarni 	offset += ecore_dump_str(char_buf + offset, dump, param_val);
200414b24e2bSVaishali Kulkarni 
200514b24e2bSVaishali Kulkarni 	/* Align buffer to next dword */
200614b24e2bSVaishali Kulkarni 	offset += ecore_dump_align(char_buf + offset, dump, offset);
200714b24e2bSVaishali Kulkarni 
200814b24e2bSVaishali Kulkarni 	return BYTES_TO_DWORDS(offset);
200914b24e2bSVaishali Kulkarni }
201014b24e2bSVaishali Kulkarni 
201114b24e2bSVaishali Kulkarni /* Writes the specified numeric param to the specified buffer.
201214b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
201314b24e2bSVaishali Kulkarni  */
ecore_dump_num_param(u32 * dump_buf,bool dump,const char * param_name,u32 param_val)201414b24e2bSVaishali Kulkarni static u32 ecore_dump_num_param(u32 *dump_buf,
201514b24e2bSVaishali Kulkarni 								bool dump,
201614b24e2bSVaishali Kulkarni 								const char *param_name,
201714b24e2bSVaishali Kulkarni 								u32 param_val)
201814b24e2bSVaishali Kulkarni {
201914b24e2bSVaishali Kulkarni 	char *char_buf = (char*)dump_buf;
202014b24e2bSVaishali Kulkarni 	u32 offset = 0;
202114b24e2bSVaishali Kulkarni 
202214b24e2bSVaishali Kulkarni 	/* Dump param name */
202314b24e2bSVaishali Kulkarni 	offset += ecore_dump_str(char_buf + offset, dump, param_name);
202414b24e2bSVaishali Kulkarni 
202514b24e2bSVaishali Kulkarni 	/* Indicate a numeric param value */
202614b24e2bSVaishali Kulkarni 	if (dump)
202714b24e2bSVaishali Kulkarni 		*(char_buf + offset) = 0;
202814b24e2bSVaishali Kulkarni 	offset++;
202914b24e2bSVaishali Kulkarni 
203014b24e2bSVaishali Kulkarni 	/* Align buffer to next dword */
203114b24e2bSVaishali Kulkarni 	offset += ecore_dump_align(char_buf + offset, dump, offset);
203214b24e2bSVaishali Kulkarni 
203314b24e2bSVaishali Kulkarni 	/* Dump param value (and change offset from bytes to dwords) */
203414b24e2bSVaishali Kulkarni 	offset = BYTES_TO_DWORDS(offset);
203514b24e2bSVaishali Kulkarni 	if (dump)
203614b24e2bSVaishali Kulkarni 		*(dump_buf + offset) = param_val;
203714b24e2bSVaishali Kulkarni 	offset++;
203814b24e2bSVaishali Kulkarni 
203914b24e2bSVaishali Kulkarni 	return offset;
204014b24e2bSVaishali Kulkarni }
204114b24e2bSVaishali Kulkarni 
204214b24e2bSVaishali Kulkarni /* Reads the FW version and writes it as a param to the specified buffer.
204314b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
204414b24e2bSVaishali Kulkarni  */
ecore_dump_fw_ver_param(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)204514b24e2bSVaishali Kulkarni static u32 ecore_dump_fw_ver_param(struct ecore_hwfn *p_hwfn,
204614b24e2bSVaishali Kulkarni 								   struct ecore_ptt *p_ptt,
204714b24e2bSVaishali Kulkarni 								   u32 *dump_buf,
204814b24e2bSVaishali Kulkarni 								   bool dump)
204914b24e2bSVaishali Kulkarni {
205014b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
205114b24e2bSVaishali Kulkarni 	char fw_ver_str[16] = EMPTY_FW_VERSION_STR;
205214b24e2bSVaishali Kulkarni 	char fw_img_str[16] = EMPTY_FW_IMAGE_STR;
205314b24e2bSVaishali Kulkarni 	struct fw_info fw_info = { { 0 }, { 0 } };
205414b24e2bSVaishali Kulkarni 	u32 offset = 0;
205514b24e2bSVaishali Kulkarni 
205614b24e2bSVaishali Kulkarni 	if (dump && !ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
205714b24e2bSVaishali Kulkarni 		/* Read FW image/version from PRAM in a non-reset SEMI */
205814b24e2bSVaishali Kulkarni 		bool found = false;
205914b24e2bSVaishali Kulkarni 		u8 storm_id;
206014b24e2bSVaishali Kulkarni 
206114b24e2bSVaishali Kulkarni 		for (storm_id = 0; storm_id < MAX_DBG_STORMS && !found; storm_id++) {
206214b24e2bSVaishali Kulkarni 			struct storm_defs *storm = &s_storm_defs[storm_id];
206314b24e2bSVaishali Kulkarni 
206414b24e2bSVaishali Kulkarni 			/* Read FW version/image */
206514b24e2bSVaishali Kulkarni 			if (dev_data->block_in_reset[storm->block_id])
206614b24e2bSVaishali Kulkarni 				continue;
206714b24e2bSVaishali Kulkarni 
206814b24e2bSVaishali Kulkarni 			/* Read FW info for the current Storm */
206914b24e2bSVaishali Kulkarni 			ecore_read_fw_info(p_hwfn, p_ptt, storm_id, &fw_info);
207014b24e2bSVaishali Kulkarni 
207114b24e2bSVaishali Kulkarni 			/* Create FW version/image strings */
207214b24e2bSVaishali Kulkarni 			if (OSAL_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)
207314b24e2bSVaishali Kulkarni 				DP_NOTICE(p_hwfn, true, "Unexpected debug error: invalid FW version string\n");
207414b24e2bSVaishali Kulkarni 			switch (fw_info.ver.image_id) {
207514b24e2bSVaishali Kulkarni 			case FW_IMG_KUKU: OSAL_STRCPY(fw_img_str, "kuku"); break;
207614b24e2bSVaishali Kulkarni 			case FW_IMG_MAIN: OSAL_STRCPY(fw_img_str, "main"); break;
207714b24e2bSVaishali Kulkarni 			case FW_IMG_L2B: OSAL_STRCPY(fw_img_str, "l2b"); break;
207814b24e2bSVaishali Kulkarni 			default: OSAL_STRCPY(fw_img_str, "unknown"); break;
207914b24e2bSVaishali Kulkarni 			}
208014b24e2bSVaishali Kulkarni 
208114b24e2bSVaishali Kulkarni 			found = true;
208214b24e2bSVaishali Kulkarni 		}
208314b24e2bSVaishali Kulkarni 	}
208414b24e2bSVaishali Kulkarni 
208514b24e2bSVaishali Kulkarni 	/* Dump FW version, image and timestamp */
208614b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "fw-version", fw_ver_str);
208714b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "fw-image", fw_img_str);
208814b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "fw-timestamp", fw_info.ver.timestamp);
208914b24e2bSVaishali Kulkarni 
209014b24e2bSVaishali Kulkarni 	return offset;
209114b24e2bSVaishali Kulkarni }
209214b24e2bSVaishali Kulkarni 
209314b24e2bSVaishali Kulkarni /* Reads the MFW version and writes it as a param to the specified buffer.
209414b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
209514b24e2bSVaishali Kulkarni  */
ecore_dump_mfw_ver_param(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)209614b24e2bSVaishali Kulkarni static u32 ecore_dump_mfw_ver_param(struct ecore_hwfn *p_hwfn,
209714b24e2bSVaishali Kulkarni 									struct ecore_ptt *p_ptt,
209814b24e2bSVaishali Kulkarni 									u32 *dump_buf,
209914b24e2bSVaishali Kulkarni 									bool dump)
210014b24e2bSVaishali Kulkarni {
210114b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
210214b24e2bSVaishali Kulkarni 	char mfw_ver_str[16] = EMPTY_FW_VERSION_STR;
210314b24e2bSVaishali Kulkarni 	bool is_emul;
210414b24e2bSVaishali Kulkarni 
210514b24e2bSVaishali Kulkarni 	is_emul = dev_data->platform_id == PLATFORM_EMUL_FULL || dev_data->platform_id == PLATFORM_EMUL_REDUCED;
210614b24e2bSVaishali Kulkarni 
210714b24e2bSVaishali Kulkarni 	if (dump && !is_emul && !ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_FW_VER)) {
210814b24e2bSVaishali Kulkarni 		u32 public_data_addr, global_section_offsize_addr, global_section_offsize, global_section_addr, mfw_ver;
210914b24e2bSVaishali Kulkarni 
211014b24e2bSVaishali Kulkarni 		/* Find MCP public data GRC address. Needs to be ORed with
211114b24e2bSVaishali Kulkarni 		 * MCP_REG_SCRATCH due to a HW bug.
211214b24e2bSVaishali Kulkarni 		 */
211314b24e2bSVaishali Kulkarni 		public_data_addr = ecore_rd(p_hwfn, p_ptt, MISC_REG_SHARED_MEM_ADDR) | MCP_REG_SCRATCH;
211414b24e2bSVaishali Kulkarni 
211514b24e2bSVaishali Kulkarni 		/* Find MCP public global section offset */
2116*04443fdeSToomas Soome 		global_section_offsize_addr = public_data_addr + offsetof(struct mcp_public_data, sections) + sizeof(offsize_t) * PUBLIC_GLOBAL;
211714b24e2bSVaishali Kulkarni 		global_section_offsize = ecore_rd(p_hwfn, p_ptt, global_section_offsize_addr);
211814b24e2bSVaishali Kulkarni 		global_section_addr = MCP_REG_SCRATCH + (global_section_offsize & OFFSIZE_OFFSET_MASK) * 4;
211914b24e2bSVaishali Kulkarni 
212014b24e2bSVaishali Kulkarni 		/* Read MFW version from MCP public global section */
2121*04443fdeSToomas Soome 		mfw_ver = ecore_rd(p_hwfn, p_ptt, global_section_addr + offsetof(struct public_global, mfw_ver));
212214b24e2bSVaishali Kulkarni 
212314b24e2bSVaishali Kulkarni 		/* Dump MFW version param */
212414b24e2bSVaishali Kulkarni 		if (OSAL_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)
212514b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, true, "Unexpected debug error: invalid MFW version string\n");
212614b24e2bSVaishali Kulkarni 	}
212714b24e2bSVaishali Kulkarni 
212814b24e2bSVaishali Kulkarni 	return ecore_dump_str_param(dump_buf, dump, "mfw-version", mfw_ver_str);
212914b24e2bSVaishali Kulkarni }
213014b24e2bSVaishali Kulkarni 
213114b24e2bSVaishali Kulkarni /* Writes a section header to the specified buffer.
213214b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
213314b24e2bSVaishali Kulkarni  */
ecore_dump_section_hdr(u32 * dump_buf,bool dump,const char * name,u32 num_params)213414b24e2bSVaishali Kulkarni static u32 ecore_dump_section_hdr(u32 *dump_buf,
213514b24e2bSVaishali Kulkarni 								  bool dump,
213614b24e2bSVaishali Kulkarni 								  const char *name,
213714b24e2bSVaishali Kulkarni 								  u32 num_params)
213814b24e2bSVaishali Kulkarni {
213914b24e2bSVaishali Kulkarni 	return ecore_dump_num_param(dump_buf, dump, name, num_params);
214014b24e2bSVaishali Kulkarni }
214114b24e2bSVaishali Kulkarni 
214214b24e2bSVaishali Kulkarni /* Writes the common global params to the specified buffer.
214314b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
214414b24e2bSVaishali Kulkarni  */
ecore_dump_common_global_params(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u8 num_specific_global_params)214514b24e2bSVaishali Kulkarni static u32 ecore_dump_common_global_params(struct ecore_hwfn *p_hwfn,
214614b24e2bSVaishali Kulkarni 										   struct ecore_ptt *p_ptt,
214714b24e2bSVaishali Kulkarni 										   u32 *dump_buf,
214814b24e2bSVaishali Kulkarni 										   bool dump,
214914b24e2bSVaishali Kulkarni 										   u8 num_specific_global_params)
215014b24e2bSVaishali Kulkarni {
215114b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
215214b24e2bSVaishali Kulkarni 	u32 offset = 0;
215314b24e2bSVaishali Kulkarni 	u8 num_params;
215414b24e2bSVaishali Kulkarni 
215514b24e2bSVaishali Kulkarni 	/* Dump global params section header */
215614b24e2bSVaishali Kulkarni 	num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params;
215714b24e2bSVaishali Kulkarni 	offset += ecore_dump_section_hdr(dump_buf + offset, dump, "global_params", num_params);
215814b24e2bSVaishali Kulkarni 
215914b24e2bSVaishali Kulkarni 	/* Store params */
216014b24e2bSVaishali Kulkarni 	offset += ecore_dump_fw_ver_param(p_hwfn, p_ptt, dump_buf + offset, dump);
216114b24e2bSVaishali Kulkarni 	offset += ecore_dump_mfw_ver_param(p_hwfn, p_ptt, dump_buf + offset, dump);
216214b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "tools-version", TOOLS_VERSION);
216314b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "chip", s_chip_defs[dev_data->chip_id].name);
216414b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "platform", s_platform_defs[dev_data->platform_id].name);
216514b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "pci-func", p_hwfn->abs_pf_id);
216614b24e2bSVaishali Kulkarni 
216714b24e2bSVaishali Kulkarni 	return offset;
216814b24e2bSVaishali Kulkarni }
216914b24e2bSVaishali Kulkarni 
217014b24e2bSVaishali Kulkarni /* Writes the "last" section (including CRC) to the specified buffer at the
217114b24e2bSVaishali Kulkarni  * given offset. Returns the dumped size in dwords.
217214b24e2bSVaishali Kulkarni  */
ecore_dump_last_section(struct ecore_hwfn * p_hwfn,u32 * dump_buf,u32 offset,bool dump)217314b24e2bSVaishali Kulkarni static u32 ecore_dump_last_section(struct ecore_hwfn *p_hwfn,
217414b24e2bSVaishali Kulkarni 								   u32 *dump_buf,
217514b24e2bSVaishali Kulkarni 								   u32 offset,
217614b24e2bSVaishali Kulkarni 								   bool dump)
217714b24e2bSVaishali Kulkarni {
217814b24e2bSVaishali Kulkarni 	u32 start_offset = offset;
217914b24e2bSVaishali Kulkarni 
218014b24e2bSVaishali Kulkarni 	/* Dump CRC section header */
218114b24e2bSVaishali Kulkarni 	offset += ecore_dump_section_hdr(dump_buf + offset, dump, "last", 0);
218214b24e2bSVaishali Kulkarni 
218314b24e2bSVaishali Kulkarni 	/* Calculate CRC32 and add it to the dword after the "last" section */
218414b24e2bSVaishali Kulkarni 	if (dump)
218514b24e2bSVaishali Kulkarni 		*(dump_buf + offset) = ~OSAL_CRC32(0xffffffff, (u8*)dump_buf, DWORDS_TO_BYTES(offset));
218614b24e2bSVaishali Kulkarni 
218714b24e2bSVaishali Kulkarni 	offset++;
218814b24e2bSVaishali Kulkarni 
218914b24e2bSVaishali Kulkarni 	return offset - start_offset;
219014b24e2bSVaishali Kulkarni }
219114b24e2bSVaishali Kulkarni 
219214b24e2bSVaishali Kulkarni /* Update blocks reset state  */
ecore_update_blocks_reset_state(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)219314b24e2bSVaishali Kulkarni static void ecore_update_blocks_reset_state(struct ecore_hwfn *p_hwfn,
219414b24e2bSVaishali Kulkarni 											struct ecore_ptt *p_ptt)
219514b24e2bSVaishali Kulkarni {
219614b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
219714b24e2bSVaishali Kulkarni 	u32 reg_val[MAX_DBG_RESET_REGS] = { 0 };
219814b24e2bSVaishali Kulkarni 	u32 i;
219914b24e2bSVaishali Kulkarni 
220014b24e2bSVaishali Kulkarni 	/* Read reset registers */
220114b24e2bSVaishali Kulkarni 	for (i = 0; i < MAX_DBG_RESET_REGS; i++)
220214b24e2bSVaishali Kulkarni 		if (s_reset_regs_defs[i].exists[dev_data->chip_id])
220314b24e2bSVaishali Kulkarni 			reg_val[i] = ecore_rd(p_hwfn, p_ptt, s_reset_regs_defs[i].addr);
220414b24e2bSVaishali Kulkarni 
220514b24e2bSVaishali Kulkarni 	/* Check if blocks are in reset */
220614b24e2bSVaishali Kulkarni 	for (i = 0; i < MAX_BLOCK_ID; i++) {
220714b24e2bSVaishali Kulkarni 		struct block_defs *block = s_block_defs[i];
220814b24e2bSVaishali Kulkarni 
220914b24e2bSVaishali Kulkarni 		dev_data->block_in_reset[i] = block->has_reset_bit && !(reg_val[block->reset_reg] & (1 << block->reset_bit_offset));
221014b24e2bSVaishali Kulkarni 	}
221114b24e2bSVaishali Kulkarni }
221214b24e2bSVaishali Kulkarni 
221314b24e2bSVaishali Kulkarni /* Enable / disable the Debug block */
ecore_bus_enable_dbg_block(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,bool enable)221414b24e2bSVaishali Kulkarni static void ecore_bus_enable_dbg_block(struct ecore_hwfn *p_hwfn,
221514b24e2bSVaishali Kulkarni 									   struct ecore_ptt *p_ptt,
221614b24e2bSVaishali Kulkarni 									   bool enable)
221714b24e2bSVaishali Kulkarni {
221814b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON, enable ? 1 : 0);
221914b24e2bSVaishali Kulkarni }
222014b24e2bSVaishali Kulkarni 
222114b24e2bSVaishali Kulkarni /* Resets the Debug block */
ecore_bus_reset_dbg_block(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)222214b24e2bSVaishali Kulkarni static void ecore_bus_reset_dbg_block(struct ecore_hwfn *p_hwfn,
222314b24e2bSVaishali Kulkarni 									  struct ecore_ptt *p_ptt)
222414b24e2bSVaishali Kulkarni {
222514b24e2bSVaishali Kulkarni 	u32 dbg_reset_reg_addr, old_reset_reg_val, new_reset_reg_val;
222614b24e2bSVaishali Kulkarni 	struct block_defs *dbg_block = s_block_defs[BLOCK_DBG];
222714b24e2bSVaishali Kulkarni 
222814b24e2bSVaishali Kulkarni 	dbg_reset_reg_addr = s_reset_regs_defs[dbg_block->reset_reg].addr;
222914b24e2bSVaishali Kulkarni 	old_reset_reg_val = ecore_rd(p_hwfn, p_ptt, dbg_reset_reg_addr);
223014b24e2bSVaishali Kulkarni 	new_reset_reg_val = old_reset_reg_val & ~(1 << dbg_block->reset_bit_offset);
223114b24e2bSVaishali Kulkarni 
223214b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, dbg_reset_reg_addr, new_reset_reg_val);
223314b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, dbg_reset_reg_addr, old_reset_reg_val);
223414b24e2bSVaishali Kulkarni }
223514b24e2bSVaishali Kulkarni 
ecore_bus_set_framing_mode(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,enum dbg_bus_frame_modes mode)223614b24e2bSVaishali Kulkarni static void ecore_bus_set_framing_mode(struct ecore_hwfn *p_hwfn,
223714b24e2bSVaishali Kulkarni 									   struct ecore_ptt *p_ptt,
223814b24e2bSVaishali Kulkarni 									   enum dbg_bus_frame_modes mode)
223914b24e2bSVaishali Kulkarni {
224014b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_FRAMING_MODE, (u8)mode);
224114b24e2bSVaishali Kulkarni }
224214b24e2bSVaishali Kulkarni 
224314b24e2bSVaishali Kulkarni /* Enable / disable Debug Bus clients according to the specified mask
224414b24e2bSVaishali Kulkarni  * (1 = enable, 0 = disable).
224514b24e2bSVaishali Kulkarni  */
ecore_bus_enable_clients(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 client_mask)224614b24e2bSVaishali Kulkarni static void ecore_bus_enable_clients(struct ecore_hwfn *p_hwfn,
224714b24e2bSVaishali Kulkarni 									 struct ecore_ptt *p_ptt,
224814b24e2bSVaishali Kulkarni 									 u32 client_mask)
224914b24e2bSVaishali Kulkarni {
225014b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_CLIENT_ENABLE, client_mask);
225114b24e2bSVaishali Kulkarni }
225214b24e2bSVaishali Kulkarni 
225314b24e2bSVaishali Kulkarni /* Enables the specified Storm for Debug Bus. Assumes a valid Storm ID. */
ecore_bus_enable_storm(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,enum dbg_storms storm_id,enum dbg_bus_filter_types filter_type)225414b24e2bSVaishali Kulkarni static void ecore_bus_enable_storm(struct ecore_hwfn *p_hwfn,
225514b24e2bSVaishali Kulkarni 								   struct ecore_ptt *p_ptt,
225614b24e2bSVaishali Kulkarni 								   enum dbg_storms storm_id,
225714b24e2bSVaishali Kulkarni 								   enum dbg_bus_filter_types filter_type)
225814b24e2bSVaishali Kulkarni {
225914b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
226014b24e2bSVaishali Kulkarni 	u32 base_addr, sem_filter_params = filter_type;
226114b24e2bSVaishali Kulkarni 	struct dbg_bus_storm_data *storm_bus;
226214b24e2bSVaishali Kulkarni 	struct storm_mode_defs *storm_mode;
226314b24e2bSVaishali Kulkarni 	struct storm_defs *storm;
226414b24e2bSVaishali Kulkarni 
226514b24e2bSVaishali Kulkarni 	storm = &s_storm_defs[storm_id];
226614b24e2bSVaishali Kulkarni 	storm_bus = &dev_data->bus.storms[storm_id];
226714b24e2bSVaishali Kulkarni 	storm_mode = &s_storm_mode_defs[storm_bus->mode];
226814b24e2bSVaishali Kulkarni 	base_addr = storm->sem_fast_mem_addr;
226914b24e2bSVaishali Kulkarni 
227014b24e2bSVaishali Kulkarni 	/* Config SEM */
227114b24e2bSVaishali Kulkarni 	if (storm_mode->is_fast_dbg) {
227214b24e2bSVaishali Kulkarni 
227314b24e2bSVaishali Kulkarni 		/* Enable fast debug */
227414b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, storm->sem_frame_mode_addr, DBG_BUS_SEMI_FRAME_MODE_0SLOW_4FAST);
227514b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_DEBUG_MODE, storm_mode->id_in_hw);
227614b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_DEBUG_ACTIVE, 1);
227714b24e2bSVaishali Kulkarni 
227814b24e2bSVaishali Kulkarni 		/* Enable all messages except STORE. Must be done after
227914b24e2bSVaishali Kulkarni 		 * enabling SEM_FAST_REG_DEBUG_ACTIVE, otherwise messages will
228014b24e2bSVaishali Kulkarni 		 * be dropped after the SEMI sync fifo is filled.
228114b24e2bSVaishali Kulkarni 		 */
228214b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_DBG_MODE6_SRC_DISABLE, SEM_FAST_MODE6_SRC_ENABLE);
228314b24e2bSVaishali Kulkarni 	}
228414b24e2bSVaishali Kulkarni 	else {
228514b24e2bSVaishali Kulkarni 
228614b24e2bSVaishali Kulkarni 		/* Ensable slow debug */
228714b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, storm->sem_frame_mode_addr, DBG_BUS_SEMI_FRAME_MODE_4SLOW_0FAST);
228814b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, storm->sem_slow_enable_addr, 1);
228914b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, storm->sem_slow_mode_addr, storm_mode->id_in_hw);
229014b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, storm->sem_slow_mode1_conf_addr, SEM_SLOW_MODE1_DATA_ENABLE);
229114b24e2bSVaishali Kulkarni 	}
229214b24e2bSVaishali Kulkarni 
229314b24e2bSVaishali Kulkarni 	/* Config SEM cid filter */
229414b24e2bSVaishali Kulkarni 	if (storm_bus->cid_filter_en) {
229514b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_FILTER_CID, storm_bus->cid);
229614b24e2bSVaishali Kulkarni 		sem_filter_params |= SEM_FILTER_CID_EN_MASK;
229714b24e2bSVaishali Kulkarni 	}
229814b24e2bSVaishali Kulkarni 
229914b24e2bSVaishali Kulkarni 	/* Config SEM eid filter */
230014b24e2bSVaishali Kulkarni 	if (storm_bus->eid_filter_en) {
230114b24e2bSVaishali Kulkarni 		const union dbg_bus_storm_eid_params *eid_filter = &storm_bus->eid_filter_params;
230214b24e2bSVaishali Kulkarni 
230314b24e2bSVaishali Kulkarni 		if (storm_bus->eid_range_not_mask) {
230414b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_EVENT_ID_RANGE_STRT, eid_filter->range.min);
230514b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_EVENT_ID_RANGE_END, eid_filter->range.max);
230614b24e2bSVaishali Kulkarni 			sem_filter_params |= SEM_FILTER_EID_RANGE_EN_MASK;
230714b24e2bSVaishali Kulkarni 		}
230814b24e2bSVaishali Kulkarni 		else {
230914b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_FILTER_EVENT_ID, eid_filter->mask.val);
231014b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_EVENT_ID_MASK, ~eid_filter->mask.mask);
231114b24e2bSVaishali Kulkarni 			sem_filter_params |= SEM_FILTER_EID_MASK_EN_MASK;
231214b24e2bSVaishali Kulkarni 		}
231314b24e2bSVaishali Kulkarni 	}
231414b24e2bSVaishali Kulkarni 
231514b24e2bSVaishali Kulkarni 	/* Config accumulaed SEM filter parameters (if any) */
231614b24e2bSVaishali Kulkarni 	if (sem_filter_params)
231714b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_RECORD_FILTER_ENABLE, sem_filter_params);
231814b24e2bSVaishali Kulkarni }
231914b24e2bSVaishali Kulkarni 
232014b24e2bSVaishali Kulkarni /* Disables Debug Bus block inputs */
ecore_bus_disable_inputs(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,bool empty_semi_fifos)232114b24e2bSVaishali Kulkarni static enum dbg_status ecore_bus_disable_inputs(struct ecore_hwfn *p_hwfn,
232214b24e2bSVaishali Kulkarni 												struct ecore_ptt *p_ptt,
232314b24e2bSVaishali Kulkarni 												bool empty_semi_fifos)
232414b24e2bSVaishali Kulkarni {
232514b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
232614b24e2bSVaishali Kulkarni 	u8 storm_id, num_fifos_to_empty = MAX_DBG_STORMS;
232714b24e2bSVaishali Kulkarni 	bool is_fifo_empty[MAX_DBG_STORMS] = { false };
232814b24e2bSVaishali Kulkarni 	u32 block_id;
232914b24e2bSVaishali Kulkarni 
233014b24e2bSVaishali Kulkarni 	/* Disable messages output in all Storms */
233114b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
233214b24e2bSVaishali Kulkarni 		struct storm_defs *storm = &s_storm_defs[storm_id];
233314b24e2bSVaishali Kulkarni 
233414b24e2bSVaishali Kulkarni 		if (!dev_data->block_in_reset[storm->block_id])
233514b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, storm->sem_fast_mem_addr + SEM_FAST_REG_DBG_MODE6_SRC_DISABLE, SEM_FAST_MODE6_SRC_DISABLE);
233614b24e2bSVaishali Kulkarni 	}
233714b24e2bSVaishali Kulkarni 
233814b24e2bSVaishali Kulkarni 	/* Try to empty the SEMI sync fifo. Must be done after messages output
233914b24e2bSVaishali Kulkarni 	 * were disabled in all Storms (i.e. SEM_FAST_REG_DBG_MODE6_SRC_DISABLE
234014b24e2bSVaishali Kulkarni 	 * was set to all 1's.
234114b24e2bSVaishali Kulkarni 	 */
234214b24e2bSVaishali Kulkarni 	while (num_fifos_to_empty) {
234314b24e2bSVaishali Kulkarni 		for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
234414b24e2bSVaishali Kulkarni 			struct storm_defs *storm = &s_storm_defs[storm_id];
234514b24e2bSVaishali Kulkarni 
234614b24e2bSVaishali Kulkarni 			if (is_fifo_empty[storm_id])
234714b24e2bSVaishali Kulkarni 				continue;
234814b24e2bSVaishali Kulkarni 
234914b24e2bSVaishali Kulkarni 			/* Check if sync fifo got empty */
235014b24e2bSVaishali Kulkarni 			if (dev_data->block_in_reset[storm->block_id] || ecore_rd(p_hwfn, p_ptt, storm->sem_sync_dbg_empty_addr)) {
235114b24e2bSVaishali Kulkarni 				is_fifo_empty[storm_id] = true;
235214b24e2bSVaishali Kulkarni 				num_fifos_to_empty--;
235314b24e2bSVaishali Kulkarni 			}
235414b24e2bSVaishali Kulkarni 		}
235514b24e2bSVaishali Kulkarni 
235614b24e2bSVaishali Kulkarni 		/* Check if need to continue polling */
235714b24e2bSVaishali Kulkarni 		if (num_fifos_to_empty) {
235814b24e2bSVaishali Kulkarni 			u32 polling_ms = SEMI_SYNC_FIFO_POLLING_DELAY_MS * s_platform_defs[dev_data->platform_id].delay_factor;
235914b24e2bSVaishali Kulkarni 			u32 polling_count = 0;
236014b24e2bSVaishali Kulkarni 
236114b24e2bSVaishali Kulkarni 			if (empty_semi_fifos && polling_count < SEMI_SYNC_FIFO_POLLING_COUNT) {
236214b24e2bSVaishali Kulkarni 				OSAL_MSLEEP(polling_ms);
236314b24e2bSVaishali Kulkarni 				polling_count++;
236414b24e2bSVaishali Kulkarni 			}
236514b24e2bSVaishali Kulkarni 			else {
236614b24e2bSVaishali Kulkarni 				DP_NOTICE(p_hwfn, false, "Warning: failed to empty the SEMI sync FIFO. It means that the last few messages from the SEMI could not be sent to the DBG block. This can happen when the DBG block is blocked (e.g. due to a PCI problem).\n");
236714b24e2bSVaishali Kulkarni 				break;
236814b24e2bSVaishali Kulkarni 			}
236914b24e2bSVaishali Kulkarni 		}
237014b24e2bSVaishali Kulkarni 	}
237114b24e2bSVaishali Kulkarni 
237214b24e2bSVaishali Kulkarni 	/* Disable debug in all Storms */
237314b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
237414b24e2bSVaishali Kulkarni 		struct storm_defs *storm = &s_storm_defs[storm_id];
237514b24e2bSVaishali Kulkarni 		u32 base_addr = storm->sem_fast_mem_addr;
237614b24e2bSVaishali Kulkarni 
237714b24e2bSVaishali Kulkarni 		if (dev_data->block_in_reset[storm->block_id])
237814b24e2bSVaishali Kulkarni 			continue;
237914b24e2bSVaishali Kulkarni 
238014b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_DEBUG_ACTIVE, 0);
238114b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, base_addr + SEM_FAST_REG_RECORD_FILTER_ENABLE, DBG_BUS_FILTER_TYPE_OFF);
238214b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, storm->sem_frame_mode_addr, DBG_BUS_FRAME_MODE_4HW_0ST);
238314b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, storm->sem_slow_enable_addr, 0);
238414b24e2bSVaishali Kulkarni 	}
238514b24e2bSVaishali Kulkarni 
238614b24e2bSVaishali Kulkarni 	/* Disable all clients */
238714b24e2bSVaishali Kulkarni 	ecore_bus_enable_clients(p_hwfn, p_ptt, 0);
238814b24e2bSVaishali Kulkarni 
238914b24e2bSVaishali Kulkarni 	/* Disable all blocks */
239014b24e2bSVaishali Kulkarni 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
239114b24e2bSVaishali Kulkarni 		struct block_defs *block = s_block_defs[block_id];
239214b24e2bSVaishali Kulkarni 
239314b24e2bSVaishali Kulkarni 		if (block->has_dbg_bus[dev_data->chip_id] && !dev_data->block_in_reset[block_id])
239414b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, block->dbg_enable_addr, 0);
239514b24e2bSVaishali Kulkarni 	}
239614b24e2bSVaishali Kulkarni 
239714b24e2bSVaishali Kulkarni 	/* Disable timestamp */
239814b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TIMESTAMP_VALID_EN, 0);
239914b24e2bSVaishali Kulkarni 
240014b24e2bSVaishali Kulkarni 	/* Disable filters and triggers */
240114b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_FILTER_ENABLE, DBG_BUS_FILTER_TYPE_OFF);
240214b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TRIGGER_ENABLE, 0);
240314b24e2bSVaishali Kulkarni 
240414b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
240514b24e2bSVaishali Kulkarni }
240614b24e2bSVaishali Kulkarni 
240714b24e2bSVaishali Kulkarni /* Sets a Debug Bus trigger/filter constraint */
ecore_bus_set_constraint(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,bool is_filter,u8 constraint_id,u8 hw_op_val,u32 data_val,u32 data_mask,u8 frame_bit,u8 frame_mask,u16 dword_offset,u16 range,u8 cyclic_bit,u8 must_bit)240814b24e2bSVaishali Kulkarni static void ecore_bus_set_constraint(struct ecore_hwfn *p_hwfn,
240914b24e2bSVaishali Kulkarni 									 struct ecore_ptt *p_ptt,
241014b24e2bSVaishali Kulkarni 									 bool is_filter,
241114b24e2bSVaishali Kulkarni 									 u8 constraint_id,
241214b24e2bSVaishali Kulkarni 									 u8 hw_op_val,
241314b24e2bSVaishali Kulkarni 									 u32 data_val,
241414b24e2bSVaishali Kulkarni 									 u32 data_mask,
241514b24e2bSVaishali Kulkarni 									 u8 frame_bit,
241614b24e2bSVaishali Kulkarni 									 u8 frame_mask,
241714b24e2bSVaishali Kulkarni 									 u16 dword_offset,
241814b24e2bSVaishali Kulkarni 									 u16 range,
241914b24e2bSVaishali Kulkarni 									 u8 cyclic_bit,
242014b24e2bSVaishali Kulkarni 									 u8 must_bit)
242114b24e2bSVaishali Kulkarni {
242214b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
242314b24e2bSVaishali Kulkarni 	u32 reg_offset = constraint_id * BYTES_IN_DWORD;
242414b24e2bSVaishali Kulkarni 	u8 curr_trigger_state;
242514b24e2bSVaishali Kulkarni 
242614b24e2bSVaishali Kulkarni 	/* For trigger only - set register offset according to state */
242714b24e2bSVaishali Kulkarni 	if (!is_filter) {
242814b24e2bSVaishali Kulkarni 		curr_trigger_state = dev_data->bus.next_trigger_state - 1;
242914b24e2bSVaishali Kulkarni 		reg_offset += curr_trigger_state * TRIGGER_SETS_PER_STATE * MAX_CONSTRAINTS * BYTES_IN_DWORD;
243014b24e2bSVaishali Kulkarni 	}
243114b24e2bSVaishali Kulkarni 
243214b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, (is_filter ? DBG_REG_FILTER_CNSTR_OPRTN_0 : DBG_REG_TRIGGER_STATE_SET_CNSTR_OPRTN_0) + reg_offset, hw_op_val);
243314b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, (is_filter ? DBG_REG_FILTER_CNSTR_DATA_0 : DBG_REG_TRIGGER_STATE_SET_CNSTR_DATA_0) + reg_offset, data_val);
243414b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, (is_filter ? DBG_REG_FILTER_CNSTR_DATA_MASK_0 : DBG_REG_TRIGGER_STATE_SET_CNSTR_DATA_MASK_0) + reg_offset, data_mask);
243514b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, (is_filter ? DBG_REG_FILTER_CNSTR_FRAME_0 : DBG_REG_TRIGGER_STATE_SET_CNSTR_FRAME_0) + reg_offset, frame_bit);
243614b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, (is_filter ? DBG_REG_FILTER_CNSTR_FRAME_MASK_0 : DBG_REG_TRIGGER_STATE_SET_CNSTR_FRAME_MASK_0) + reg_offset, frame_mask);
243714b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, (is_filter ? DBG_REG_FILTER_CNSTR_OFFSET_0 : DBG_REG_TRIGGER_STATE_SET_CNSTR_OFFSET_0) + reg_offset, dword_offset);
243814b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, (is_filter ? DBG_REG_FILTER_CNSTR_RANGE_0 : DBG_REG_TRIGGER_STATE_SET_CNSTR_RANGE_0) + reg_offset, range);
243914b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, (is_filter ? DBG_REG_FILTER_CNSTR_CYCLIC_0 : DBG_REG_TRIGGER_STATE_SET_CNSTR_CYCLIC_0) + reg_offset, cyclic_bit);
244014b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, (is_filter ? DBG_REG_FILTER_CNSTR_MUST_0 : DBG_REG_TRIGGER_STATE_SET_CNSTR_MUST_0) + reg_offset, must_bit);
244114b24e2bSVaishali Kulkarni }
244214b24e2bSVaishali Kulkarni 
244314b24e2bSVaishali Kulkarni /* Reads the specified DBG Bus internal buffer range and copy it to the
244414b24e2bSVaishali Kulkarni  * specified buffer. Returns the dumped size in dwords.
244514b24e2bSVaishali Kulkarni  */
ecore_bus_dump_int_buf_range(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u32 start_line,u32 end_line)244614b24e2bSVaishali Kulkarni static u32 ecore_bus_dump_int_buf_range(struct ecore_hwfn *p_hwfn,
244714b24e2bSVaishali Kulkarni 										struct ecore_ptt *p_ptt,
244814b24e2bSVaishali Kulkarni 										u32 *dump_buf,
244914b24e2bSVaishali Kulkarni 										bool dump,
245014b24e2bSVaishali Kulkarni 										u32 start_line,
245114b24e2bSVaishali Kulkarni 										u32 end_line)
245214b24e2bSVaishali Kulkarni {
245314b24e2bSVaishali Kulkarni 	u32 line, reg_addr, i, offset = 0;
245414b24e2bSVaishali Kulkarni 
245514b24e2bSVaishali Kulkarni 	if (!dump)
245614b24e2bSVaishali Kulkarni 		return (end_line - start_line + 1) * INT_BUF_LINE_SIZE_IN_DWORDS;
245714b24e2bSVaishali Kulkarni 
245814b24e2bSVaishali Kulkarni 	for (line = start_line, reg_addr = DBG_REG_INTR_BUFFER + DWORDS_TO_BYTES(start_line * INT_BUF_LINE_SIZE_IN_DWORDS);
245914b24e2bSVaishali Kulkarni 		line <= end_line;
246014b24e2bSVaishali Kulkarni 		line++, offset += INT_BUF_LINE_SIZE_IN_DWORDS)
246114b24e2bSVaishali Kulkarni 		for (i = 0; i < INT_BUF_LINE_SIZE_IN_DWORDS; i++, reg_addr += BYTES_IN_DWORD)
246214b24e2bSVaishali Kulkarni 			dump_buf[offset + INT_BUF_LINE_SIZE_IN_DWORDS - 1 - i] = ecore_rd(p_hwfn, p_ptt, reg_addr);
246314b24e2bSVaishali Kulkarni 
246414b24e2bSVaishali Kulkarni 	return offset;
246514b24e2bSVaishali Kulkarni }
246614b24e2bSVaishali Kulkarni 
246714b24e2bSVaishali Kulkarni /* Reads the DBG Bus internal buffer and copy its contents to a buffer.
246814b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
246914b24e2bSVaishali Kulkarni  */
ecore_bus_dump_int_buf(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)247014b24e2bSVaishali Kulkarni static u32 ecore_bus_dump_int_buf(struct ecore_hwfn *p_hwfn,
247114b24e2bSVaishali Kulkarni 								  struct ecore_ptt *p_ptt,
247214b24e2bSVaishali Kulkarni 								  u32 *dump_buf,
247314b24e2bSVaishali Kulkarni 								  bool dump)
247414b24e2bSVaishali Kulkarni {
247514b24e2bSVaishali Kulkarni 	u32 last_written_line, offset = 0;
247614b24e2bSVaishali Kulkarni 
247714b24e2bSVaishali Kulkarni 	last_written_line = ecore_rd(p_hwfn, p_ptt, DBG_REG_INTR_BUFFER_WR_PTR);
247814b24e2bSVaishali Kulkarni 
247914b24e2bSVaishali Kulkarni 	if (ecore_rd(p_hwfn, p_ptt, DBG_REG_WRAP_ON_INT_BUFFER)) {
248014b24e2bSVaishali Kulkarni 
248114b24e2bSVaishali Kulkarni 		/* Internal buffer was wrapped: first dump from write pointer
248214b24e2bSVaishali Kulkarni 		 * to buffer end, then dump from buffer start to write pointer.
248314b24e2bSVaishali Kulkarni 		 */
248414b24e2bSVaishali Kulkarni 		if (last_written_line < INT_BUF_NUM_OF_LINES - 1)
248514b24e2bSVaishali Kulkarni 			offset += ecore_bus_dump_int_buf_range(p_hwfn, p_ptt, dump_buf + offset, dump, last_written_line + 1, INT_BUF_NUM_OF_LINES - 1);
248614b24e2bSVaishali Kulkarni 		offset += ecore_bus_dump_int_buf_range(p_hwfn, p_ptt, dump_buf + offset, dump, 0, last_written_line);
248714b24e2bSVaishali Kulkarni 	}
248814b24e2bSVaishali Kulkarni 	else if (last_written_line) {
248914b24e2bSVaishali Kulkarni 
249014b24e2bSVaishali Kulkarni 		/* Internal buffer wasn't wrapped: dump from buffer start until
249114b24e2bSVaishali Kulkarni 		 *  write pointer.
249214b24e2bSVaishali Kulkarni 		 */
249314b24e2bSVaishali Kulkarni 		if (!ecore_rd(p_hwfn, p_ptt, DBG_REG_INTR_BUFFER_RD_PTR))
249414b24e2bSVaishali Kulkarni 			offset += ecore_bus_dump_int_buf_range(p_hwfn, p_ptt, dump_buf + offset, dump, 0, last_written_line);
249514b24e2bSVaishali Kulkarni 		else
249614b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, true, "Unexpected Debug Bus error: internal buffer read pointer is not zero\n");
249714b24e2bSVaishali Kulkarni 	}
249814b24e2bSVaishali Kulkarni 
249914b24e2bSVaishali Kulkarni 	return offset;
250014b24e2bSVaishali Kulkarni }
250114b24e2bSVaishali Kulkarni 
250214b24e2bSVaishali Kulkarni /* Reads the specified DBG Bus PCI buffer range and copy it to the specified
250314b24e2bSVaishali Kulkarni  * buffer. Returns the dumped size in dwords.
250414b24e2bSVaishali Kulkarni  */
ecore_bus_dump_pci_buf_range(struct ecore_hwfn * p_hwfn,u32 * dump_buf,bool dump,u32 start_line,u32 end_line)250514b24e2bSVaishali Kulkarni static u32 ecore_bus_dump_pci_buf_range(struct ecore_hwfn *p_hwfn,
250614b24e2bSVaishali Kulkarni 										u32 *dump_buf,
250714b24e2bSVaishali Kulkarni 										bool dump,
250814b24e2bSVaishali Kulkarni 										u32 start_line,
250914b24e2bSVaishali Kulkarni 										u32 end_line)
251014b24e2bSVaishali Kulkarni {
251114b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
251214b24e2bSVaishali Kulkarni 	u32 offset = 0;
251314b24e2bSVaishali Kulkarni 
251414b24e2bSVaishali Kulkarni 	/* Extract PCI buffer pointer from virtual address */
251514b24e2bSVaishali Kulkarni 	void *virt_addr_lo = &dev_data->bus.pci_buf.virt_addr.lo;
251614b24e2bSVaishali Kulkarni 	u32 *pci_buf_start = (u32*)(osal_uintptr_t)*((u64*)virt_addr_lo);
251714b24e2bSVaishali Kulkarni 	u32 *pci_buf, line, i;
251814b24e2bSVaishali Kulkarni 
251914b24e2bSVaishali Kulkarni 	if (!dump)
252014b24e2bSVaishali Kulkarni 		return (end_line - start_line + 1) * PCI_BUF_LINE_SIZE_IN_DWORDS;
252114b24e2bSVaishali Kulkarni 
252214b24e2bSVaishali Kulkarni 	for (line = start_line, pci_buf = pci_buf_start + start_line * PCI_BUF_LINE_SIZE_IN_DWORDS;
252314b24e2bSVaishali Kulkarni 	line <= end_line;
252414b24e2bSVaishali Kulkarni 		line++, offset += PCI_BUF_LINE_SIZE_IN_DWORDS)
252514b24e2bSVaishali Kulkarni 		for (i = 0; i < PCI_BUF_LINE_SIZE_IN_DWORDS; i++, pci_buf++)
252614b24e2bSVaishali Kulkarni 			dump_buf[offset + s_pci_buf_line_ind[i]] = *pci_buf;
252714b24e2bSVaishali Kulkarni 
252814b24e2bSVaishali Kulkarni 	return offset;
252914b24e2bSVaishali Kulkarni }
253014b24e2bSVaishali Kulkarni 
253114b24e2bSVaishali Kulkarni /* Copies the DBG Bus PCI buffer to the specified buffer.
253214b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
253314b24e2bSVaishali Kulkarni  */
ecore_bus_dump_pci_buf(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)253414b24e2bSVaishali Kulkarni static u32 ecore_bus_dump_pci_buf(struct ecore_hwfn *p_hwfn,
253514b24e2bSVaishali Kulkarni 								  struct ecore_ptt *p_ptt,
253614b24e2bSVaishali Kulkarni 								  u32 *dump_buf,
253714b24e2bSVaishali Kulkarni 								  bool dump)
253814b24e2bSVaishali Kulkarni {
253914b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
254014b24e2bSVaishali Kulkarni 	u32 next_wr_byte_offset, next_wr_line_offset;
254114b24e2bSVaishali Kulkarni 	struct dbg_bus_mem_addr next_wr_phys_addr;
254214b24e2bSVaishali Kulkarni 	u32 pci_buf_size_in_lines, offset = 0;
254314b24e2bSVaishali Kulkarni 
254414b24e2bSVaishali Kulkarni 	pci_buf_size_in_lines = dev_data->bus.pci_buf.size / PCI_BUF_LINE_SIZE_IN_BYTES;
254514b24e2bSVaishali Kulkarni 
254614b24e2bSVaishali Kulkarni 	/* Extract write pointer (physical address) */
254714b24e2bSVaishali Kulkarni 	next_wr_phys_addr.lo = ecore_rd(p_hwfn, p_ptt, DBG_REG_EXT_BUFFER_WR_PTR);
254814b24e2bSVaishali Kulkarni 	next_wr_phys_addr.hi = ecore_rd(p_hwfn, p_ptt, DBG_REG_EXT_BUFFER_WR_PTR + BYTES_IN_DWORD);
254914b24e2bSVaishali Kulkarni 
255014b24e2bSVaishali Kulkarni 	/* Convert write pointer to offset */
255114b24e2bSVaishali Kulkarni 	next_wr_byte_offset = ecore_phys_addr_diff(&next_wr_phys_addr, &dev_data->bus.pci_buf.phys_addr);
255214b24e2bSVaishali Kulkarni 	if ((next_wr_byte_offset % PCI_BUF_LINE_SIZE_IN_BYTES) || next_wr_byte_offset > dev_data->bus.pci_buf.size)
255314b24e2bSVaishali Kulkarni 		return 0;
255414b24e2bSVaishali Kulkarni 	next_wr_line_offset = next_wr_byte_offset / PCI_BUF_LINE_SIZE_IN_BYTES;
255514b24e2bSVaishali Kulkarni 
255614b24e2bSVaishali Kulkarni 	/* PCI buffer wrapped: first dump from write pointer to buffer end. */
255714b24e2bSVaishali Kulkarni 	if (ecore_rd(p_hwfn, p_ptt, DBG_REG_WRAP_ON_EXT_BUFFER))
255814b24e2bSVaishali Kulkarni 		offset += ecore_bus_dump_pci_buf_range(p_hwfn, dump_buf + offset, dump, next_wr_line_offset, pci_buf_size_in_lines - 1);
255914b24e2bSVaishali Kulkarni 
256014b24e2bSVaishali Kulkarni 	/* Dump from buffer start until write pointer */
256114b24e2bSVaishali Kulkarni 	if (next_wr_line_offset)
256214b24e2bSVaishali Kulkarni 		offset += ecore_bus_dump_pci_buf_range(p_hwfn, dump_buf + offset, dump, 0, next_wr_line_offset - 1);
256314b24e2bSVaishali Kulkarni 
256414b24e2bSVaishali Kulkarni 	return offset;
256514b24e2bSVaishali Kulkarni }
256614b24e2bSVaishali Kulkarni 
256714b24e2bSVaishali Kulkarni /* Copies the DBG Bus recorded data to the specified buffer.
256814b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
256914b24e2bSVaishali Kulkarni  */
ecore_bus_dump_data(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)257014b24e2bSVaishali Kulkarni static u32 ecore_bus_dump_data(struct ecore_hwfn *p_hwfn,
257114b24e2bSVaishali Kulkarni 							   struct ecore_ptt *p_ptt,
257214b24e2bSVaishali Kulkarni 							   u32 *dump_buf,
257314b24e2bSVaishali Kulkarni 							   bool dump)
257414b24e2bSVaishali Kulkarni {
257514b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
257614b24e2bSVaishali Kulkarni 
257714b24e2bSVaishali Kulkarni 	switch (dev_data->bus.target) {
257814b24e2bSVaishali Kulkarni 	case DBG_BUS_TARGET_ID_INT_BUF:
257914b24e2bSVaishali Kulkarni 		return ecore_bus_dump_int_buf(p_hwfn, p_ptt, dump_buf, dump);
258014b24e2bSVaishali Kulkarni 	case DBG_BUS_TARGET_ID_PCI:
258114b24e2bSVaishali Kulkarni 		return ecore_bus_dump_pci_buf(p_hwfn, p_ptt, dump_buf, dump);
258214b24e2bSVaishali Kulkarni 	default:
258314b24e2bSVaishali Kulkarni 		break;
258414b24e2bSVaishali Kulkarni 	}
258514b24e2bSVaishali Kulkarni 
258614b24e2bSVaishali Kulkarni 	return 0;
258714b24e2bSVaishali Kulkarni }
258814b24e2bSVaishali Kulkarni 
258914b24e2bSVaishali Kulkarni /* Frees the Debug Bus PCI buffer */
ecore_bus_free_pci_buf(struct ecore_hwfn * p_hwfn)259014b24e2bSVaishali Kulkarni static void ecore_bus_free_pci_buf(struct ecore_hwfn *p_hwfn)
259114b24e2bSVaishali Kulkarni {
259214b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
259314b24e2bSVaishali Kulkarni 	dma_addr_t pci_buf_phys_addr;
259414b24e2bSVaishali Kulkarni 	void *virt_addr_lo;
259514b24e2bSVaishali Kulkarni 	u32 *pci_buf;
259614b24e2bSVaishali Kulkarni 
259714b24e2bSVaishali Kulkarni 	/* Extract PCI buffer pointer from virtual address */
259814b24e2bSVaishali Kulkarni 	virt_addr_lo = &dev_data->bus.pci_buf.virt_addr.lo;
259914b24e2bSVaishali Kulkarni 	pci_buf = (u32*)(osal_uintptr_t)*((u64*)virt_addr_lo);
260014b24e2bSVaishali Kulkarni 
260114b24e2bSVaishali Kulkarni 	if (!dev_data->bus.pci_buf.size)
260214b24e2bSVaishali Kulkarni 		return;
260314b24e2bSVaishali Kulkarni 
260414b24e2bSVaishali Kulkarni 	OSAL_MEMCPY(&pci_buf_phys_addr, &dev_data->bus.pci_buf.phys_addr, sizeof(pci_buf_phys_addr));
260514b24e2bSVaishali Kulkarni 
260614b24e2bSVaishali Kulkarni 	OSAL_DMA_FREE_COHERENT(p_hwfn->p_dev, pci_buf, pci_buf_phys_addr, dev_data->bus.pci_buf.size);
260714b24e2bSVaishali Kulkarni 
260814b24e2bSVaishali Kulkarni 	dev_data->bus.pci_buf.size = 0;
260914b24e2bSVaishali Kulkarni }
261014b24e2bSVaishali Kulkarni 
261114b24e2bSVaishali Kulkarni /* Dumps the list of DBG Bus inputs (blocks/Storms) to the specified buffer.
261214b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
261314b24e2bSVaishali Kulkarni  */
ecore_bus_dump_inputs(struct ecore_hwfn * p_hwfn,u32 * dump_buf,bool dump)261414b24e2bSVaishali Kulkarni static u32 ecore_bus_dump_inputs(struct ecore_hwfn *p_hwfn,
261514b24e2bSVaishali Kulkarni 								 u32 *dump_buf,
261614b24e2bSVaishali Kulkarni 								 bool dump)
261714b24e2bSVaishali Kulkarni {
261814b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
261914b24e2bSVaishali Kulkarni 	char storm_name[8] = "?storm";
262014b24e2bSVaishali Kulkarni 	u32 block_id, offset = 0;
262114b24e2bSVaishali Kulkarni 	u8 storm_id;
262214b24e2bSVaishali Kulkarni 
262314b24e2bSVaishali Kulkarni 	/* Store storms */
262414b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
262514b24e2bSVaishali Kulkarni 		struct dbg_bus_storm_data *storm_bus = &dev_data->bus.storms[storm_id];
262614b24e2bSVaishali Kulkarni 		struct storm_defs *storm = &s_storm_defs[storm_id];
262714b24e2bSVaishali Kulkarni 
262814b24e2bSVaishali Kulkarni 		if (!dev_data->bus.storms[storm_id].enabled)
262914b24e2bSVaishali Kulkarni 			continue;
263014b24e2bSVaishali Kulkarni 
263114b24e2bSVaishali Kulkarni 		/* Dump section header */
263214b24e2bSVaishali Kulkarni 		storm_name[0] = storm->letter;
263314b24e2bSVaishali Kulkarni 		offset += ecore_dump_section_hdr(dump_buf + offset, dump, "bus_input", 3);
263414b24e2bSVaishali Kulkarni 		offset += ecore_dump_str_param(dump_buf + offset, dump, "name", storm_name);
263514b24e2bSVaishali Kulkarni 		offset += ecore_dump_num_param(dump_buf + offset, dump, "id", storm_bus->hw_id);
263614b24e2bSVaishali Kulkarni 		offset += ecore_dump_str_param(dump_buf + offset, dump, "mode", s_storm_mode_defs[storm_bus->mode].name);
263714b24e2bSVaishali Kulkarni 	}
263814b24e2bSVaishali Kulkarni 
263914b24e2bSVaishali Kulkarni 	/* Store blocks */
264014b24e2bSVaishali Kulkarni 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
264114b24e2bSVaishali Kulkarni 		struct dbg_bus_block_data *block_bus = &dev_data->bus.blocks[block_id];
264214b24e2bSVaishali Kulkarni 		struct block_defs *block = s_block_defs[block_id];
264314b24e2bSVaishali Kulkarni 
264414b24e2bSVaishali Kulkarni 		if (!GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK))
264514b24e2bSVaishali Kulkarni 			continue;
264614b24e2bSVaishali Kulkarni 
264714b24e2bSVaishali Kulkarni 		/* Dump section header */
264814b24e2bSVaishali Kulkarni 		offset += ecore_dump_section_hdr(dump_buf + offset, dump, "bus_input", 4);
264914b24e2bSVaishali Kulkarni 		offset += ecore_dump_str_param(dump_buf + offset, dump, "name", block->name);
265014b24e2bSVaishali Kulkarni 		offset += ecore_dump_num_param(dump_buf + offset, dump, "line", block_bus->line_num);
265114b24e2bSVaishali Kulkarni 		offset += ecore_dump_num_param(dump_buf + offset, dump, "en", GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK));
265214b24e2bSVaishali Kulkarni 		offset += ecore_dump_num_param(dump_buf + offset, dump, "shr", GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_RIGHT_SHIFT));
265314b24e2bSVaishali Kulkarni 	}
265414b24e2bSVaishali Kulkarni 
265514b24e2bSVaishali Kulkarni 	return offset;
265614b24e2bSVaishali Kulkarni }
265714b24e2bSVaishali Kulkarni 
265814b24e2bSVaishali Kulkarni /* Dumps the Debug Bus header (params, inputs, data header) to the specified
265914b24e2bSVaishali Kulkarni  * buffer. Returns the dumped size in dwords.
266014b24e2bSVaishali Kulkarni  */
ecore_bus_dump_hdr(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)266114b24e2bSVaishali Kulkarni static u32 ecore_bus_dump_hdr(struct ecore_hwfn *p_hwfn,
266214b24e2bSVaishali Kulkarni 							  struct ecore_ptt *p_ptt,
266314b24e2bSVaishali Kulkarni 							  u32 *dump_buf,
266414b24e2bSVaishali Kulkarni 							  bool dump)
266514b24e2bSVaishali Kulkarni {
266614b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
266714b24e2bSVaishali Kulkarni 	char hw_id_mask_str[16];
266814b24e2bSVaishali Kulkarni 	u32 offset = 0;
266914b24e2bSVaishali Kulkarni 
267014b24e2bSVaishali Kulkarni 	if (OSAL_SNPRINTF(hw_id_mask_str, sizeof(hw_id_mask_str), "0x%x", dev_data->bus.hw_id_mask) < 0)
267114b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Unexpected debug error: invalid HW ID mask\n");
267214b24e2bSVaishali Kulkarni 
267314b24e2bSVaishali Kulkarni 	/* Dump global params */
267414b24e2bSVaishali Kulkarni 	offset += ecore_dump_common_global_params(p_hwfn, p_ptt, dump_buf + offset, dump, 5);
267514b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "dump-type", "debug-bus");
267614b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "wrap-mode", dev_data->bus.one_shot_en ? "one-shot" : "wrap-around");
267714b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "hw-dwords", dev_data->bus.hw_dwords);
267814b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "hw-id-mask", hw_id_mask_str);
267914b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "target", s_dbg_target_names[dev_data->bus.target]);
268014b24e2bSVaishali Kulkarni 
268114b24e2bSVaishali Kulkarni 	offset += ecore_bus_dump_inputs(p_hwfn, dump_buf + offset, dump);
268214b24e2bSVaishali Kulkarni 
268314b24e2bSVaishali Kulkarni 	if (dev_data->bus.target != DBG_BUS_TARGET_ID_NIG) {
268414b24e2bSVaishali Kulkarni 		u32 recorded_dwords = 0;
268514b24e2bSVaishali Kulkarni 
268614b24e2bSVaishali Kulkarni 		if (dump)
268714b24e2bSVaishali Kulkarni 			recorded_dwords = ecore_bus_dump_data(p_hwfn, p_ptt, OSAL_NULL, false);
268814b24e2bSVaishali Kulkarni 
268914b24e2bSVaishali Kulkarni 		offset += ecore_dump_section_hdr(dump_buf + offset, dump, "bus_data", 1);
269014b24e2bSVaishali Kulkarni 		offset += ecore_dump_num_param(dump_buf + offset, dump, "size", recorded_dwords);
269114b24e2bSVaishali Kulkarni 	}
269214b24e2bSVaishali Kulkarni 
269314b24e2bSVaishali Kulkarni 	return offset;
269414b24e2bSVaishali Kulkarni }
269514b24e2bSVaishali Kulkarni 
ecore_is_mode_match(struct ecore_hwfn * p_hwfn,u16 * modes_buf_offset)269614b24e2bSVaishali Kulkarni static bool ecore_is_mode_match(struct ecore_hwfn *p_hwfn,
269714b24e2bSVaishali Kulkarni 								u16 *modes_buf_offset)
269814b24e2bSVaishali Kulkarni {
269914b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
270014b24e2bSVaishali Kulkarni 	bool arg1, arg2;
270114b24e2bSVaishali Kulkarni 	u8 tree_val;
270214b24e2bSVaishali Kulkarni 
270314b24e2bSVaishali Kulkarni 	/* Get next element from modes tree buffer */
270414b24e2bSVaishali Kulkarni 	tree_val = ((u8*)s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr)[(*modes_buf_offset)++];
270514b24e2bSVaishali Kulkarni 
270614b24e2bSVaishali Kulkarni 	switch (tree_val) {
270714b24e2bSVaishali Kulkarni 	case INIT_MODE_OP_NOT:
270814b24e2bSVaishali Kulkarni 		return !ecore_is_mode_match(p_hwfn, modes_buf_offset);
270914b24e2bSVaishali Kulkarni 	case INIT_MODE_OP_OR:
271014b24e2bSVaishali Kulkarni 	case INIT_MODE_OP_AND:
271114b24e2bSVaishali Kulkarni 		arg1 = ecore_is_mode_match(p_hwfn, modes_buf_offset);
271214b24e2bSVaishali Kulkarni 		arg2 = ecore_is_mode_match(p_hwfn, modes_buf_offset);
271314b24e2bSVaishali Kulkarni 		return (tree_val == INIT_MODE_OP_OR) ? (arg1 || arg2) : (arg1 && arg2);
271414b24e2bSVaishali Kulkarni 	default: return dev_data->mode_enable[tree_val - MAX_INIT_MODE_OPS] > 0;
271514b24e2bSVaishali Kulkarni 	}
271614b24e2bSVaishali Kulkarni }
271714b24e2bSVaishali Kulkarni 
271814b24e2bSVaishali Kulkarni /* Returns true if the specified entity (indicated by GRC param) should be
271914b24e2bSVaishali Kulkarni  * included in the dump, false otherwise.
272014b24e2bSVaishali Kulkarni  */
ecore_grc_is_included(struct ecore_hwfn * p_hwfn,enum dbg_grc_params grc_param)272114b24e2bSVaishali Kulkarni static bool ecore_grc_is_included(struct ecore_hwfn *p_hwfn,
272214b24e2bSVaishali Kulkarni 								  enum dbg_grc_params grc_param)
272314b24e2bSVaishali Kulkarni {
272414b24e2bSVaishali Kulkarni 	return ecore_grc_get_param(p_hwfn, grc_param) > 0;
272514b24e2bSVaishali Kulkarni }
272614b24e2bSVaishali Kulkarni 
272714b24e2bSVaishali Kulkarni /* Returns true of the specified Storm should be included in the dump, false
272814b24e2bSVaishali Kulkarni  * otherwise.
272914b24e2bSVaishali Kulkarni  */
ecore_grc_is_storm_included(struct ecore_hwfn * p_hwfn,enum dbg_storms storm)273014b24e2bSVaishali Kulkarni static bool ecore_grc_is_storm_included(struct ecore_hwfn *p_hwfn,
273114b24e2bSVaishali Kulkarni 										enum dbg_storms storm)
273214b24e2bSVaishali Kulkarni {
273314b24e2bSVaishali Kulkarni 	return ecore_grc_get_param(p_hwfn, (enum dbg_grc_params)storm) > 0;
273414b24e2bSVaishali Kulkarni }
273514b24e2bSVaishali Kulkarni 
273614b24e2bSVaishali Kulkarni /* Returns true if the specified memory should be included in the dump, false
273714b24e2bSVaishali Kulkarni  * otherwise.
273814b24e2bSVaishali Kulkarni  */
ecore_grc_is_mem_included(struct ecore_hwfn * p_hwfn,enum block_id block_id,u8 mem_group_id)273914b24e2bSVaishali Kulkarni static bool ecore_grc_is_mem_included(struct ecore_hwfn *p_hwfn,
274014b24e2bSVaishali Kulkarni 									  enum block_id block_id,
274114b24e2bSVaishali Kulkarni 									  u8 mem_group_id)
274214b24e2bSVaishali Kulkarni {
274314b24e2bSVaishali Kulkarni 	struct block_defs *block = s_block_defs[block_id];
274414b24e2bSVaishali Kulkarni 	u8 i;
274514b24e2bSVaishali Kulkarni 
274614b24e2bSVaishali Kulkarni 	/* Check Storm match */
274714b24e2bSVaishali Kulkarni 	if (block->associated_to_storm &&
274814b24e2bSVaishali Kulkarni 		!ecore_grc_is_storm_included(p_hwfn, (enum dbg_storms)block->storm_id))
274914b24e2bSVaishali Kulkarni 		return false;
275014b24e2bSVaishali Kulkarni 
275114b24e2bSVaishali Kulkarni 	for (i = 0; i < NUM_BIG_RAM_TYPES; i++) {
275214b24e2bSVaishali Kulkarni 		struct big_ram_defs *big_ram = &s_big_ram_defs[i];
275314b24e2bSVaishali Kulkarni 
275414b24e2bSVaishali Kulkarni 		if (mem_group_id == big_ram->mem_group_id || mem_group_id == big_ram->ram_mem_group_id)
275514b24e2bSVaishali Kulkarni 			return ecore_grc_is_included(p_hwfn, big_ram->grc_param);
275614b24e2bSVaishali Kulkarni 	}
275714b24e2bSVaishali Kulkarni 
275814b24e2bSVaishali Kulkarni 	switch (mem_group_id) {
275914b24e2bSVaishali Kulkarni 	case MEM_GROUP_PXP_ILT:
276014b24e2bSVaishali Kulkarni 	case MEM_GROUP_PXP_MEM:
276114b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PXP);
276214b24e2bSVaishali Kulkarni 	case MEM_GROUP_RAM:
276314b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RAM);
276414b24e2bSVaishali Kulkarni 	case MEM_GROUP_PBUF:
276514b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PBUF);
276614b24e2bSVaishali Kulkarni 	case MEM_GROUP_CAU_MEM:
276714b24e2bSVaishali Kulkarni 	case MEM_GROUP_CAU_SB:
276814b24e2bSVaishali Kulkarni 	case MEM_GROUP_CAU_PI:
276914b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU);
277014b24e2bSVaishali Kulkarni 	case MEM_GROUP_QM_MEM:
277114b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_QM);
277214b24e2bSVaishali Kulkarni 	case MEM_GROUP_CFC_MEM:
277314b24e2bSVaishali Kulkarni 	case MEM_GROUP_CONN_CFC_MEM:
277414b24e2bSVaishali Kulkarni 	case MEM_GROUP_TASK_CFC_MEM:
277514b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CFC);
277614b24e2bSVaishali Kulkarni 	case MEM_GROUP_IGU_MEM:
277714b24e2bSVaishali Kulkarni 	case MEM_GROUP_IGU_MSIX:
277814b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IGU);
277914b24e2bSVaishali Kulkarni 	case MEM_GROUP_MULD_MEM:
278014b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MULD);
278114b24e2bSVaishali Kulkarni 	case MEM_GROUP_PRS_MEM:
278214b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PRS);
278314b24e2bSVaishali Kulkarni 	case MEM_GROUP_DMAE_MEM:
278414b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DMAE);
278514b24e2bSVaishali Kulkarni 	case MEM_GROUP_TM_MEM:
278614b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_TM);
278714b24e2bSVaishali Kulkarni 	case MEM_GROUP_SDM_MEM:
278814b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_SDM);
278914b24e2bSVaishali Kulkarni 	case MEM_GROUP_TDIF_CTX:
279014b24e2bSVaishali Kulkarni 	case MEM_GROUP_RDIF_CTX:
279114b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DIF);
279214b24e2bSVaishali Kulkarni 	case MEM_GROUP_CM_MEM:
279314b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM);
279414b24e2bSVaishali Kulkarni 	case MEM_GROUP_IOR:
279514b24e2bSVaishali Kulkarni 		return ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR);
279614b24e2bSVaishali Kulkarni 	default:
279714b24e2bSVaishali Kulkarni 		return true;
279814b24e2bSVaishali Kulkarni 	}
279914b24e2bSVaishali Kulkarni }
280014b24e2bSVaishali Kulkarni 
280114b24e2bSVaishali Kulkarni /* Stalls all Storms */
ecore_grc_stall_storms(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,bool stall)280214b24e2bSVaishali Kulkarni static void ecore_grc_stall_storms(struct ecore_hwfn *p_hwfn,
280314b24e2bSVaishali Kulkarni 								   struct ecore_ptt *p_ptt,
280414b24e2bSVaishali Kulkarni 								   bool stall)
280514b24e2bSVaishali Kulkarni {
280614b24e2bSVaishali Kulkarni 	u32 reg_addr;
280714b24e2bSVaishali Kulkarni 	u8 storm_id;
280814b24e2bSVaishali Kulkarni 
280914b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
281014b24e2bSVaishali Kulkarni 		if (!ecore_grc_is_storm_included(p_hwfn, (enum dbg_storms)storm_id))
281114b24e2bSVaishali Kulkarni 			continue;
281214b24e2bSVaishali Kulkarni 
281314b24e2bSVaishali Kulkarni 		reg_addr = s_storm_defs[storm_id].sem_fast_mem_addr + SEM_FAST_REG_STALL_0_BB_K2;
281414b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, reg_addr, stall ? 1 : 0);
281514b24e2bSVaishali Kulkarni 	}
281614b24e2bSVaishali Kulkarni 
281714b24e2bSVaishali Kulkarni 	OSAL_MSLEEP(STALL_DELAY_MS);
281814b24e2bSVaishali Kulkarni }
281914b24e2bSVaishali Kulkarni 
282014b24e2bSVaishali Kulkarni /* Takes all blocks out of reset */
ecore_grc_unreset_blocks(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)282114b24e2bSVaishali Kulkarni static void ecore_grc_unreset_blocks(struct ecore_hwfn *p_hwfn,
282214b24e2bSVaishali Kulkarni 									 struct ecore_ptt *p_ptt)
282314b24e2bSVaishali Kulkarni {
282414b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
282514b24e2bSVaishali Kulkarni 	u32 reg_val[MAX_DBG_RESET_REGS] = { 0 };
282614b24e2bSVaishali Kulkarni 	u32 block_id, i;
282714b24e2bSVaishali Kulkarni 
282814b24e2bSVaishali Kulkarni 	/* Fill reset regs values */
282914b24e2bSVaishali Kulkarni 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
283014b24e2bSVaishali Kulkarni 		struct block_defs *block = s_block_defs[block_id];
283114b24e2bSVaishali Kulkarni 
283214b24e2bSVaishali Kulkarni 		if (block->has_reset_bit && block->unreset)
283314b24e2bSVaishali Kulkarni 			reg_val[block->reset_reg] |= (1 << block->reset_bit_offset);
283414b24e2bSVaishali Kulkarni 	}
283514b24e2bSVaishali Kulkarni 
283614b24e2bSVaishali Kulkarni 	/* Write reset registers */
283714b24e2bSVaishali Kulkarni 	for (i = 0; i < MAX_DBG_RESET_REGS; i++) {
283814b24e2bSVaishali Kulkarni 		if (!s_reset_regs_defs[i].exists[dev_data->chip_id])
283914b24e2bSVaishali Kulkarni 			continue;
284014b24e2bSVaishali Kulkarni 
284114b24e2bSVaishali Kulkarni 		reg_val[i] |= s_reset_regs_defs[i].unreset_val;
284214b24e2bSVaishali Kulkarni 
284314b24e2bSVaishali Kulkarni 		if (reg_val[i])
284414b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, s_reset_regs_defs[i].addr + RESET_REG_UNRESET_OFFSET, reg_val[i]);
284514b24e2bSVaishali Kulkarni 	}
284614b24e2bSVaishali Kulkarni }
284714b24e2bSVaishali Kulkarni 
284814b24e2bSVaishali Kulkarni /* Returns the attention block data of the specified block */
ecore_get_block_attn_data(enum block_id block_id,enum dbg_attn_type attn_type)284914b24e2bSVaishali Kulkarni static const struct dbg_attn_block_type_data* ecore_get_block_attn_data(enum block_id block_id,
285014b24e2bSVaishali Kulkarni 																		enum dbg_attn_type attn_type)
285114b24e2bSVaishali Kulkarni {
285214b24e2bSVaishali Kulkarni 	const struct dbg_attn_block *base_attn_block_arr = (const struct dbg_attn_block*)s_dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr;
285314b24e2bSVaishali Kulkarni 
285414b24e2bSVaishali Kulkarni 	return &base_attn_block_arr[block_id].per_type_data[attn_type];
285514b24e2bSVaishali Kulkarni }
285614b24e2bSVaishali Kulkarni 
285714b24e2bSVaishali Kulkarni /* Returns the attention registers of the specified block */
ecore_get_block_attn_regs(enum block_id block_id,enum dbg_attn_type attn_type,u8 * num_attn_regs)285814b24e2bSVaishali Kulkarni static const struct dbg_attn_reg* ecore_get_block_attn_regs(enum block_id block_id,
285914b24e2bSVaishali Kulkarni 															enum dbg_attn_type attn_type,
286014b24e2bSVaishali Kulkarni 															u8 *num_attn_regs)
286114b24e2bSVaishali Kulkarni {
286214b24e2bSVaishali Kulkarni 	const struct dbg_attn_block_type_data *block_type_data = ecore_get_block_attn_data(block_id, attn_type);
286314b24e2bSVaishali Kulkarni 
286414b24e2bSVaishali Kulkarni 	*num_attn_regs = block_type_data->num_regs;
286514b24e2bSVaishali Kulkarni 
286614b24e2bSVaishali Kulkarni 	return &((const struct dbg_attn_reg*)s_dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)[block_type_data->regs_offset];
286714b24e2bSVaishali Kulkarni }
286814b24e2bSVaishali Kulkarni 
286914b24e2bSVaishali Kulkarni /* For each block, clear the status of all parities */
ecore_grc_clear_all_prty(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)287014b24e2bSVaishali Kulkarni static void ecore_grc_clear_all_prty(struct ecore_hwfn *p_hwfn,
287114b24e2bSVaishali Kulkarni 									 struct ecore_ptt *p_ptt)
287214b24e2bSVaishali Kulkarni {
287314b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
287414b24e2bSVaishali Kulkarni 	const struct dbg_attn_reg *attn_reg_arr;
287514b24e2bSVaishali Kulkarni 	u8 reg_idx, num_attn_regs;
287614b24e2bSVaishali Kulkarni 	u32 block_id;
287714b24e2bSVaishali Kulkarni 
287814b24e2bSVaishali Kulkarni 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
287914b24e2bSVaishali Kulkarni 		if (dev_data->block_in_reset[block_id])
288014b24e2bSVaishali Kulkarni 			continue;
288114b24e2bSVaishali Kulkarni 
288214b24e2bSVaishali Kulkarni 		attn_reg_arr = ecore_get_block_attn_regs((enum block_id)block_id, ATTN_TYPE_PARITY, &num_attn_regs);
288314b24e2bSVaishali Kulkarni 
288414b24e2bSVaishali Kulkarni 		for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
288514b24e2bSVaishali Kulkarni 			const struct dbg_attn_reg *reg_data = &attn_reg_arr[reg_idx];
288614b24e2bSVaishali Kulkarni 			u16 modes_buf_offset;
288714b24e2bSVaishali Kulkarni 			bool eval_mode;
288814b24e2bSVaishali Kulkarni 
288914b24e2bSVaishali Kulkarni 			/* Check mode */
289014b24e2bSVaishali Kulkarni 			eval_mode = GET_FIELD(reg_data->mode.data, DBG_MODE_HDR_EVAL_MODE) > 0;
289114b24e2bSVaishali Kulkarni 			modes_buf_offset = GET_FIELD(reg_data->mode.data, DBG_MODE_HDR_MODES_BUF_OFFSET);
289214b24e2bSVaishali Kulkarni 
289314b24e2bSVaishali Kulkarni 			/* If Mode match: clear parity status */
289414b24e2bSVaishali Kulkarni 			if (!eval_mode || ecore_is_mode_match(p_hwfn, &modes_buf_offset))
289514b24e2bSVaishali Kulkarni 				ecore_rd(p_hwfn, p_ptt, DWORDS_TO_BYTES(reg_data->sts_clr_address));
289614b24e2bSVaishali Kulkarni 		}
289714b24e2bSVaishali Kulkarni 	}
289814b24e2bSVaishali Kulkarni }
289914b24e2bSVaishali Kulkarni 
290014b24e2bSVaishali Kulkarni /* Dumps GRC registers section header. Returns the dumped size in dwords.
290114b24e2bSVaishali Kulkarni  * the following parameters are dumped:
290214b24e2bSVaishali Kulkarni  * - count:	 no. of dumped entries
290314b24e2bSVaishali Kulkarni  * - split:	 split type
290414b24e2bSVaishali Kulkarni  * - id:	 split ID (dumped only if split_id >= 0)
290514b24e2bSVaishali Kulkarni  * - param_name: user parameter value (dumped only if param_name != OSAL_NULL
290614b24e2bSVaishali Kulkarni  *		 and param_val != OSAL_NULL).
290714b24e2bSVaishali Kulkarni  */
ecore_grc_dump_regs_hdr(u32 * dump_buf,bool dump,u32 num_reg_entries,const char * split_type,int split_id,const char * param_name,const char * param_val)290814b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_regs_hdr(u32 *dump_buf,
290914b24e2bSVaishali Kulkarni 								   bool dump,
291014b24e2bSVaishali Kulkarni 								   u32 num_reg_entries,
291114b24e2bSVaishali Kulkarni 								   const char *split_type,
291214b24e2bSVaishali Kulkarni 								   int split_id,
291314b24e2bSVaishali Kulkarni 								   const char *param_name,
291414b24e2bSVaishali Kulkarni 								   const char *param_val)
291514b24e2bSVaishali Kulkarni {
291614b24e2bSVaishali Kulkarni 	u8 num_params = 2 + (split_id >= 0 ? 1 : 0) + (param_name ? 1 : 0);
291714b24e2bSVaishali Kulkarni 	u32 offset = 0;
291814b24e2bSVaishali Kulkarni 
291914b24e2bSVaishali Kulkarni 	offset += ecore_dump_section_hdr(dump_buf + offset, dump, "grc_regs", num_params);
292014b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "count", num_reg_entries);
292114b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "split", split_type);
292214b24e2bSVaishali Kulkarni 	if (split_id >= 0)
292314b24e2bSVaishali Kulkarni 		offset += ecore_dump_num_param(dump_buf + offset, dump, "id", split_id);
292414b24e2bSVaishali Kulkarni 	if (param_name && param_val)
292514b24e2bSVaishali Kulkarni 		offset += ecore_dump_str_param(dump_buf + offset, dump, param_name, param_val);
292614b24e2bSVaishali Kulkarni 
292714b24e2bSVaishali Kulkarni 	return offset;
292814b24e2bSVaishali Kulkarni }
292914b24e2bSVaishali Kulkarni 
293014b24e2bSVaishali Kulkarni /* Dumps the GRC registers in the specified address range.
293114b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
293214b24e2bSVaishali Kulkarni  * The addr and len arguments are specified in dwords.
293314b24e2bSVaishali Kulkarni  */
ecore_grc_dump_addr_range(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u32 addr,u32 len,bool wide_bus)293414b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_addr_range(struct ecore_hwfn *p_hwfn,
293514b24e2bSVaishali Kulkarni 									 struct ecore_ptt *p_ptt,
293614b24e2bSVaishali Kulkarni 									 u32 *dump_buf,
293714b24e2bSVaishali Kulkarni 									 bool dump,
293814b24e2bSVaishali Kulkarni 									 u32 addr,
293914b24e2bSVaishali Kulkarni 									 u32 len,
294014b24e2bSVaishali Kulkarni 									 bool wide_bus)
294114b24e2bSVaishali Kulkarni {
294214b24e2bSVaishali Kulkarni 	u32 byte_addr = DWORDS_TO_BYTES(addr), offset = 0, i;
294314b24e2bSVaishali Kulkarni 
294414b24e2bSVaishali Kulkarni 	if (!dump)
294514b24e2bSVaishali Kulkarni 		return len;
294614b24e2bSVaishali Kulkarni 
294714b24e2bSVaishali Kulkarni 	for (i = 0; i < len; i++, byte_addr += BYTES_IN_DWORD, offset++)
294814b24e2bSVaishali Kulkarni 		*(dump_buf + offset) = ecore_rd(p_hwfn, p_ptt, byte_addr);
294914b24e2bSVaishali Kulkarni 
295014b24e2bSVaishali Kulkarni 	return offset;
295114b24e2bSVaishali Kulkarni }
295214b24e2bSVaishali Kulkarni 
295314b24e2bSVaishali Kulkarni /* Dumps GRC registers sequence header. Returns the dumped size in dwords.
295414b24e2bSVaishali Kulkarni  * The addr and len arguments are specified in dwords.
295514b24e2bSVaishali Kulkarni  */
ecore_grc_dump_reg_entry_hdr(u32 * dump_buf,bool dump,u32 addr,u32 len)295614b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_reg_entry_hdr(u32 *dump_buf,
295714b24e2bSVaishali Kulkarni 										bool dump,
295814b24e2bSVaishali Kulkarni 										u32 addr,
295914b24e2bSVaishali Kulkarni 										u32 len)
296014b24e2bSVaishali Kulkarni {
296114b24e2bSVaishali Kulkarni 	if (dump)
296214b24e2bSVaishali Kulkarni 		*dump_buf = addr | (len << REG_DUMP_LEN_SHIFT);
296314b24e2bSVaishali Kulkarni 
296414b24e2bSVaishali Kulkarni 	return 1;
296514b24e2bSVaishali Kulkarni }
296614b24e2bSVaishali Kulkarni 
296714b24e2bSVaishali Kulkarni /* Dumps GRC registers sequence. Returns the dumped size in dwords.
296814b24e2bSVaishali Kulkarni  * The addr and len arguments are specified in dwords.
296914b24e2bSVaishali Kulkarni  */
ecore_grc_dump_reg_entry(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u32 addr,u32 len,bool wide_bus)297014b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_reg_entry(struct ecore_hwfn *p_hwfn,
297114b24e2bSVaishali Kulkarni 									struct ecore_ptt *p_ptt,
297214b24e2bSVaishali Kulkarni 									u32 *dump_buf,
297314b24e2bSVaishali Kulkarni 									bool dump,
297414b24e2bSVaishali Kulkarni 									u32 addr,
297514b24e2bSVaishali Kulkarni 									u32 len,
297614b24e2bSVaishali Kulkarni 									bool wide_bus)
297714b24e2bSVaishali Kulkarni {
297814b24e2bSVaishali Kulkarni 	u32 offset = 0;
297914b24e2bSVaishali Kulkarni 
298014b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_reg_entry_hdr(dump_buf, dump, addr, len);
298114b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_addr_range(p_hwfn, p_ptt, dump_buf + offset, dump, addr, len, wide_bus);
298214b24e2bSVaishali Kulkarni 
298314b24e2bSVaishali Kulkarni 	return offset;
298414b24e2bSVaishali Kulkarni }
298514b24e2bSVaishali Kulkarni 
298614b24e2bSVaishali Kulkarni /* Dumps GRC registers sequence with skip cycle.
298714b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
298814b24e2bSVaishali Kulkarni  * - addr:	start GRC address in dwords
298914b24e2bSVaishali Kulkarni  * - total_len:	total no. of dwords to dump
299014b24e2bSVaishali Kulkarni  * - read_len:	no. consecutive dwords to read
299114b24e2bSVaishali Kulkarni  * - skip_len:	no. of dwords to skip (and fill with zeros)
299214b24e2bSVaishali Kulkarni  */
ecore_grc_dump_reg_entry_skip(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u32 addr,u32 total_len,u32 read_len,u32 skip_len)299314b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_reg_entry_skip(struct ecore_hwfn *p_hwfn,
299414b24e2bSVaishali Kulkarni 										 struct ecore_ptt *p_ptt,
299514b24e2bSVaishali Kulkarni 										 u32 *dump_buf,
299614b24e2bSVaishali Kulkarni 										 bool dump,
299714b24e2bSVaishali Kulkarni 										 u32 addr,
299814b24e2bSVaishali Kulkarni 										 u32 total_len,
299914b24e2bSVaishali Kulkarni 										 u32 read_len,
300014b24e2bSVaishali Kulkarni 										 u32 skip_len)
300114b24e2bSVaishali Kulkarni {
300214b24e2bSVaishali Kulkarni 	u32 offset = 0, reg_offset = 0;
300314b24e2bSVaishali Kulkarni 
300414b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_reg_entry_hdr(dump_buf, dump, addr, total_len);
300514b24e2bSVaishali Kulkarni 
300614b24e2bSVaishali Kulkarni 	if (!dump)
300714b24e2bSVaishali Kulkarni 		return offset + total_len;
300814b24e2bSVaishali Kulkarni 
300914b24e2bSVaishali Kulkarni 	while (reg_offset < total_len) {
301014b24e2bSVaishali Kulkarni 		u32 curr_len = OSAL_MIN_T(u32, read_len, total_len - reg_offset);
301114b24e2bSVaishali Kulkarni 
301214b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_addr_range(p_hwfn, p_ptt, dump_buf + offset, dump, addr, curr_len, false);
301314b24e2bSVaishali Kulkarni 		reg_offset += curr_len;
301414b24e2bSVaishali Kulkarni 		addr += curr_len;
301514b24e2bSVaishali Kulkarni 
301614b24e2bSVaishali Kulkarni 		if (reg_offset < total_len) {
301714b24e2bSVaishali Kulkarni 			curr_len = OSAL_MIN_T(u32, skip_len, total_len - skip_len);
301814b24e2bSVaishali Kulkarni 			OSAL_MEMSET(dump_buf + offset, 0, DWORDS_TO_BYTES(curr_len));
301914b24e2bSVaishali Kulkarni 			offset += curr_len;
302014b24e2bSVaishali Kulkarni 			reg_offset += curr_len;
302114b24e2bSVaishali Kulkarni 			addr += curr_len;
302214b24e2bSVaishali Kulkarni 		}
302314b24e2bSVaishali Kulkarni 	}
302414b24e2bSVaishali Kulkarni 
302514b24e2bSVaishali Kulkarni 	return offset;
302614b24e2bSVaishali Kulkarni }
302714b24e2bSVaishali Kulkarni 
302814b24e2bSVaishali Kulkarni /* Dumps GRC registers entries. Returns the dumped size in dwords. */
ecore_grc_dump_regs_entries(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct dbg_array input_regs_arr,u32 * dump_buf,bool dump,bool block_enable[MAX_BLOCK_ID],u32 * num_dumped_reg_entries)302914b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_regs_entries(struct ecore_hwfn *p_hwfn,
303014b24e2bSVaishali Kulkarni 									   struct ecore_ptt *p_ptt,
303114b24e2bSVaishali Kulkarni 									   struct dbg_array input_regs_arr,
303214b24e2bSVaishali Kulkarni 									   u32 *dump_buf,
303314b24e2bSVaishali Kulkarni 									   bool dump,
303414b24e2bSVaishali Kulkarni 									   bool block_enable[MAX_BLOCK_ID],
303514b24e2bSVaishali Kulkarni 									   u32 *num_dumped_reg_entries)
303614b24e2bSVaishali Kulkarni {
303714b24e2bSVaishali Kulkarni 	u32 i, offset = 0, input_offset = 0;
303814b24e2bSVaishali Kulkarni 	bool mode_match = true;
303914b24e2bSVaishali Kulkarni 
304014b24e2bSVaishali Kulkarni 	*num_dumped_reg_entries = 0;
304114b24e2bSVaishali Kulkarni 
304214b24e2bSVaishali Kulkarni 	while (input_offset < input_regs_arr.size_in_dwords) {
304314b24e2bSVaishali Kulkarni 		const struct dbg_dump_cond_hdr* cond_hdr = (const struct dbg_dump_cond_hdr*)&input_regs_arr.ptr[input_offset++];
304414b24e2bSVaishali Kulkarni 		u16 modes_buf_offset;
304514b24e2bSVaishali Kulkarni 		bool eval_mode;
304614b24e2bSVaishali Kulkarni 
304714b24e2bSVaishali Kulkarni 		/* Check mode/block */
304814b24e2bSVaishali Kulkarni 		eval_mode = GET_FIELD(cond_hdr->mode.data, DBG_MODE_HDR_EVAL_MODE) > 0;
304914b24e2bSVaishali Kulkarni 		if (eval_mode) {
305014b24e2bSVaishali Kulkarni 			modes_buf_offset = GET_FIELD(cond_hdr->mode.data, DBG_MODE_HDR_MODES_BUF_OFFSET);
305114b24e2bSVaishali Kulkarni 			mode_match = ecore_is_mode_match(p_hwfn, &modes_buf_offset);
305214b24e2bSVaishali Kulkarni 		}
305314b24e2bSVaishali Kulkarni 
305414b24e2bSVaishali Kulkarni 		if (!mode_match || !block_enable[cond_hdr->block_id]) {
305514b24e2bSVaishali Kulkarni 			input_offset += cond_hdr->data_size;
305614b24e2bSVaishali Kulkarni 			continue;
305714b24e2bSVaishali Kulkarni 		}
305814b24e2bSVaishali Kulkarni 
305914b24e2bSVaishali Kulkarni 		for (i = 0; i < cond_hdr->data_size; i++, input_offset++) {
306014b24e2bSVaishali Kulkarni 			const struct dbg_dump_reg *reg = (const struct dbg_dump_reg*)&input_regs_arr.ptr[input_offset];
306114b24e2bSVaishali Kulkarni 
306214b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_reg_entry(p_hwfn, p_ptt, dump_buf + offset, dump,
306314b24e2bSVaishali Kulkarni 												GET_FIELD(reg->data, DBG_DUMP_REG_ADDRESS),
306414b24e2bSVaishali Kulkarni 												GET_FIELD(reg->data, DBG_DUMP_REG_LENGTH),
306514b24e2bSVaishali Kulkarni 												GET_FIELD(reg->data, DBG_DUMP_REG_WIDE_BUS));
306614b24e2bSVaishali Kulkarni 			(*num_dumped_reg_entries)++;
306714b24e2bSVaishali Kulkarni 		}
306814b24e2bSVaishali Kulkarni 	}
306914b24e2bSVaishali Kulkarni 
307014b24e2bSVaishali Kulkarni 	return offset;
307114b24e2bSVaishali Kulkarni }
307214b24e2bSVaishali Kulkarni 
307314b24e2bSVaishali Kulkarni /* Dumps GRC registers entries. Returns the dumped size in dwords. */
ecore_grc_dump_split_data(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct dbg_array input_regs_arr,u32 * dump_buf,bool dump,bool block_enable[MAX_BLOCK_ID],const char * split_type_name,u32 split_id,const char * param_name,const char * param_val)307414b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_split_data(struct ecore_hwfn *p_hwfn,
307514b24e2bSVaishali Kulkarni 									 struct ecore_ptt *p_ptt,
307614b24e2bSVaishali Kulkarni 									 struct dbg_array input_regs_arr,
307714b24e2bSVaishali Kulkarni 									 u32 *dump_buf,
307814b24e2bSVaishali Kulkarni 									 bool dump,
307914b24e2bSVaishali Kulkarni 									 bool block_enable[MAX_BLOCK_ID],
308014b24e2bSVaishali Kulkarni 									 const char *split_type_name,
308114b24e2bSVaishali Kulkarni 									 u32 split_id,
308214b24e2bSVaishali Kulkarni 									 const char *param_name,
308314b24e2bSVaishali Kulkarni 									 const char *param_val)
308414b24e2bSVaishali Kulkarni {
308514b24e2bSVaishali Kulkarni 	u32 num_dumped_reg_entries, offset;
308614b24e2bSVaishali Kulkarni 
308714b24e2bSVaishali Kulkarni 	/* Calculate register dump header size (and skip it for now) */
308814b24e2bSVaishali Kulkarni 	offset = ecore_grc_dump_regs_hdr(dump_buf, false, 0, split_type_name, split_id, param_name, param_val);
308914b24e2bSVaishali Kulkarni 
309014b24e2bSVaishali Kulkarni 	/* Dump registers */
309114b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_regs_entries(p_hwfn, p_ptt, input_regs_arr, dump_buf + offset, dump, block_enable, &num_dumped_reg_entries);
309214b24e2bSVaishali Kulkarni 
309314b24e2bSVaishali Kulkarni 	/* Write register dump header */
309414b24e2bSVaishali Kulkarni 	if (dump && num_dumped_reg_entries > 0)
309514b24e2bSVaishali Kulkarni 		ecore_grc_dump_regs_hdr(dump_buf, dump, num_dumped_reg_entries, split_type_name, split_id, param_name, param_val);
309614b24e2bSVaishali Kulkarni 
309714b24e2bSVaishali Kulkarni 	return num_dumped_reg_entries > 0 ? offset : 0;
309814b24e2bSVaishali Kulkarni }
309914b24e2bSVaishali Kulkarni 
310014b24e2bSVaishali Kulkarni /* Dumps registers according to the input registers array. Returns the dumped
310114b24e2bSVaishali Kulkarni  * size in dwords.
310214b24e2bSVaishali Kulkarni  */
ecore_grc_dump_registers(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,bool block_enable[MAX_BLOCK_ID],const char * param_name,const char * param_val)310314b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_registers(struct ecore_hwfn *p_hwfn,
310414b24e2bSVaishali Kulkarni 									struct ecore_ptt *p_ptt,
310514b24e2bSVaishali Kulkarni 									u32 *dump_buf,
310614b24e2bSVaishali Kulkarni 									bool dump,
310714b24e2bSVaishali Kulkarni 									bool block_enable[MAX_BLOCK_ID],
310814b24e2bSVaishali Kulkarni 									const char *param_name,
310914b24e2bSVaishali Kulkarni 									const char *param_val)
311014b24e2bSVaishali Kulkarni {
311114b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
311214b24e2bSVaishali Kulkarni 	struct chip_platform_defs *chip_platform;
311314b24e2bSVaishali Kulkarni 	u32 offset = 0, input_offset = 0;
311414b24e2bSVaishali Kulkarni 	u8 port_id, pf_id, vf_id;
311514b24e2bSVaishali Kulkarni 
311614b24e2bSVaishali Kulkarni 	chip_platform = &s_chip_defs[dev_data->chip_id].per_platform[dev_data->platform_id];
311714b24e2bSVaishali Kulkarni 
311814b24e2bSVaishali Kulkarni 	if (dump)
311914b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "Dumping registers...\n");
312014b24e2bSVaishali Kulkarni 
312114b24e2bSVaishali Kulkarni 	while (input_offset < s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].size_in_dwords) {
312214b24e2bSVaishali Kulkarni 		const struct dbg_dump_split_hdr *split_hdr;
312314b24e2bSVaishali Kulkarni 		struct dbg_array curr_input_regs_arr;
312414b24e2bSVaishali Kulkarni 		u32 split_data_size;
312514b24e2bSVaishali Kulkarni 		u8 split_type_id;
312614b24e2bSVaishali Kulkarni 
312714b24e2bSVaishali Kulkarni 		split_hdr = (const struct dbg_dump_split_hdr*)&s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr[input_offset++];
312814b24e2bSVaishali Kulkarni 		split_type_id = GET_FIELD(split_hdr->hdr, DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
312914b24e2bSVaishali Kulkarni 		split_data_size = GET_FIELD(split_hdr->hdr, DBG_DUMP_SPLIT_HDR_DATA_SIZE);
313014b24e2bSVaishali Kulkarni 		curr_input_regs_arr.ptr = &s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr[input_offset];
313114b24e2bSVaishali Kulkarni 		curr_input_regs_arr.size_in_dwords = split_data_size;
313214b24e2bSVaishali Kulkarni 
313314b24e2bSVaishali Kulkarni 		switch(split_type_id) {
313414b24e2bSVaishali Kulkarni 		case SPLIT_TYPE_NONE:
313514b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_split_data(p_hwfn, p_ptt, curr_input_regs_arr, dump_buf + offset, dump, block_enable, "eng", (u32)(-1), param_name, param_val);
313614b24e2bSVaishali Kulkarni 			break;
313714b24e2bSVaishali Kulkarni 
313814b24e2bSVaishali Kulkarni 		case SPLIT_TYPE_PORT:
313914b24e2bSVaishali Kulkarni 			for (port_id = 0; port_id < chip_platform->num_ports; port_id++) {
314014b24e2bSVaishali Kulkarni 				if (dump)
314114b24e2bSVaishali Kulkarni 					ecore_port_pretend(p_hwfn, p_ptt, port_id);
314214b24e2bSVaishali Kulkarni 				offset += ecore_grc_dump_split_data(p_hwfn, p_ptt, curr_input_regs_arr, dump_buf + offset, dump, block_enable, "port", port_id, param_name, param_val);
314314b24e2bSVaishali Kulkarni 			}
314414b24e2bSVaishali Kulkarni 			break;
314514b24e2bSVaishali Kulkarni 
314614b24e2bSVaishali Kulkarni 		case SPLIT_TYPE_PF:
314714b24e2bSVaishali Kulkarni 		case SPLIT_TYPE_PORT_PF:
314814b24e2bSVaishali Kulkarni 			for (pf_id = 0; pf_id < chip_platform->num_pfs; pf_id++) {
314914b24e2bSVaishali Kulkarni 				if (dump)
315014b24e2bSVaishali Kulkarni 					ecore_fid_pretend(p_hwfn, p_ptt, (pf_id << PXP_PRETEND_CONCRETE_FID_PFID_SHIFT));
315114b24e2bSVaishali Kulkarni 				offset += ecore_grc_dump_split_data(p_hwfn, p_ptt, curr_input_regs_arr, dump_buf + offset, dump, block_enable, "pf", pf_id, param_name, param_val);
315214b24e2bSVaishali Kulkarni 			}
315314b24e2bSVaishali Kulkarni 			break;
315414b24e2bSVaishali Kulkarni 
315514b24e2bSVaishali Kulkarni 		case SPLIT_TYPE_VF:
315614b24e2bSVaishali Kulkarni 			for (vf_id = 0; vf_id < chip_platform->num_vfs; vf_id++) {
315714b24e2bSVaishali Kulkarni 				if (dump)
315814b24e2bSVaishali Kulkarni 					ecore_fid_pretend(p_hwfn, p_ptt, (1 << PXP_PRETEND_CONCRETE_FID_VFVALID_SHIFT) | (vf_id << PXP_PRETEND_CONCRETE_FID_VFID_SHIFT));
315914b24e2bSVaishali Kulkarni 				offset += ecore_grc_dump_split_data(p_hwfn, p_ptt, curr_input_regs_arr, dump_buf + offset, dump, block_enable, "vf", vf_id, param_name, param_val);
316014b24e2bSVaishali Kulkarni 			}
316114b24e2bSVaishali Kulkarni 			break;
316214b24e2bSVaishali Kulkarni 
316314b24e2bSVaishali Kulkarni 		default:
316414b24e2bSVaishali Kulkarni 			break;
316514b24e2bSVaishali Kulkarni 		}
316614b24e2bSVaishali Kulkarni 
316714b24e2bSVaishali Kulkarni 		input_offset += split_data_size;
316814b24e2bSVaishali Kulkarni 	}
316914b24e2bSVaishali Kulkarni 
317014b24e2bSVaishali Kulkarni 	/* Pretend to original PF */
317114b24e2bSVaishali Kulkarni 	if (dump)
317214b24e2bSVaishali Kulkarni 		ecore_fid_pretend(p_hwfn, p_ptt, (p_hwfn->rel_pf_id << PXP_PRETEND_CONCRETE_FID_PFID_SHIFT));
317314b24e2bSVaishali Kulkarni 
317414b24e2bSVaishali Kulkarni 	return offset;
317514b24e2bSVaishali Kulkarni }
317614b24e2bSVaishali Kulkarni 
317714b24e2bSVaishali Kulkarni /* Dump reset registers. Returns the dumped size in dwords. */
ecore_grc_dump_reset_regs(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)317814b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_reset_regs(struct ecore_hwfn *p_hwfn,
317914b24e2bSVaishali Kulkarni 	struct ecore_ptt *p_ptt,
318014b24e2bSVaishali Kulkarni 	u32 *dump_buf,
318114b24e2bSVaishali Kulkarni 	bool dump)
318214b24e2bSVaishali Kulkarni {
318314b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
318414b24e2bSVaishali Kulkarni 	u32 i, offset = 0, num_regs = 0;
318514b24e2bSVaishali Kulkarni 
318614b24e2bSVaishali Kulkarni 	/* Calculate header size */
318714b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_regs_hdr(dump_buf, false, 0, "eng", -1, OSAL_NULL, OSAL_NULL);
318814b24e2bSVaishali Kulkarni 
318914b24e2bSVaishali Kulkarni 	/* Write reset registers */
319014b24e2bSVaishali Kulkarni 	for (i = 0; i < MAX_DBG_RESET_REGS; i++) {
319114b24e2bSVaishali Kulkarni 		if (!s_reset_regs_defs[i].exists[dev_data->chip_id])
319214b24e2bSVaishali Kulkarni 			continue;
319314b24e2bSVaishali Kulkarni 
319414b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_reg_entry(p_hwfn, p_ptt, dump_buf + offset, dump, BYTES_TO_DWORDS(s_reset_regs_defs[i].addr), 1, false);
319514b24e2bSVaishali Kulkarni 		num_regs++;
319614b24e2bSVaishali Kulkarni 	}
319714b24e2bSVaishali Kulkarni 
319814b24e2bSVaishali Kulkarni 	/* Write header */
319914b24e2bSVaishali Kulkarni 	if (dump)
320014b24e2bSVaishali Kulkarni 		ecore_grc_dump_regs_hdr(dump_buf, true, num_regs, "eng", -1, OSAL_NULL, OSAL_NULL);
320114b24e2bSVaishali Kulkarni 
320214b24e2bSVaishali Kulkarni 	return offset;
320314b24e2bSVaishali Kulkarni }
320414b24e2bSVaishali Kulkarni 
320514b24e2bSVaishali Kulkarni /* Dump registers that are modified during GRC Dump and therefore must be
320614b24e2bSVaishali Kulkarni  * dumped first. Returns the dumped size in dwords.
320714b24e2bSVaishali Kulkarni  */
ecore_grc_dump_modified_regs(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)320814b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_modified_regs(struct ecore_hwfn *p_hwfn,
320914b24e2bSVaishali Kulkarni 										struct ecore_ptt *p_ptt,
321014b24e2bSVaishali Kulkarni 										u32 *dump_buf,
321114b24e2bSVaishali Kulkarni 										bool dump)
321214b24e2bSVaishali Kulkarni {
321314b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
321414b24e2bSVaishali Kulkarni 	u32 block_id, offset = 0, num_reg_entries = 0;
321514b24e2bSVaishali Kulkarni 	const struct dbg_attn_reg *attn_reg_arr;
321614b24e2bSVaishali Kulkarni 	u8 storm_id, reg_idx, num_attn_regs;
321714b24e2bSVaishali Kulkarni 
321814b24e2bSVaishali Kulkarni 	/* Calculate header size */
321914b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_regs_hdr(dump_buf, false, 0, "eng", -1, OSAL_NULL, OSAL_NULL);
322014b24e2bSVaishali Kulkarni 
322114b24e2bSVaishali Kulkarni 	/* Write parity registers */
322214b24e2bSVaishali Kulkarni 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
322314b24e2bSVaishali Kulkarni 		if (dev_data->block_in_reset[block_id] && dump)
322414b24e2bSVaishali Kulkarni 			continue;
322514b24e2bSVaishali Kulkarni 
322614b24e2bSVaishali Kulkarni 		attn_reg_arr = ecore_get_block_attn_regs((enum block_id)block_id, ATTN_TYPE_PARITY, &num_attn_regs);
322714b24e2bSVaishali Kulkarni 
322814b24e2bSVaishali Kulkarni 		for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
322914b24e2bSVaishali Kulkarni 			const struct dbg_attn_reg *reg_data = &attn_reg_arr[reg_idx];
323014b24e2bSVaishali Kulkarni 			u16 modes_buf_offset;
323114b24e2bSVaishali Kulkarni 			bool eval_mode;
323214b24e2bSVaishali Kulkarni 
323314b24e2bSVaishali Kulkarni 			/* Check mode */
323414b24e2bSVaishali Kulkarni 			eval_mode = GET_FIELD(reg_data->mode.data, DBG_MODE_HDR_EVAL_MODE) > 0;
323514b24e2bSVaishali Kulkarni 			modes_buf_offset = GET_FIELD(reg_data->mode.data, DBG_MODE_HDR_MODES_BUF_OFFSET);
323614b24e2bSVaishali Kulkarni 			if (eval_mode && !ecore_is_mode_match(p_hwfn, &modes_buf_offset))
323714b24e2bSVaishali Kulkarni 				continue;
323814b24e2bSVaishali Kulkarni 
323914b24e2bSVaishali Kulkarni 			/* Mode match: read & dump registers */
324014b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_reg_entry(p_hwfn, p_ptt, dump_buf + offset, dump, reg_data->mask_address, 1, false);
324114b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_reg_entry(p_hwfn, p_ptt, dump_buf + offset, dump, GET_FIELD(reg_data->data, DBG_ATTN_REG_STS_ADDRESS), 1, false);
324214b24e2bSVaishali Kulkarni 			num_reg_entries += 2;
324314b24e2bSVaishali Kulkarni 		}
324414b24e2bSVaishali Kulkarni 	}
324514b24e2bSVaishali Kulkarni 
324614b24e2bSVaishali Kulkarni 	/* Write Storm stall status registers */
324714b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
324814b24e2bSVaishali Kulkarni 		struct storm_defs *storm = &s_storm_defs[storm_id];
324914b24e2bSVaishali Kulkarni 
325014b24e2bSVaishali Kulkarni 		if (dev_data->block_in_reset[storm->block_id] && dump)
325114b24e2bSVaishali Kulkarni 			continue;
325214b24e2bSVaishali Kulkarni 
325314b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_reg_entry(p_hwfn, p_ptt, dump_buf + offset, dump,
325414b24e2bSVaishali Kulkarni 			BYTES_TO_DWORDS(storm->sem_fast_mem_addr + SEM_FAST_REG_STALLED), 1, false);
325514b24e2bSVaishali Kulkarni 		num_reg_entries++;
325614b24e2bSVaishali Kulkarni 	}
325714b24e2bSVaishali Kulkarni 
325814b24e2bSVaishali Kulkarni 	/* Write header */
325914b24e2bSVaishali Kulkarni 	if (dump)
326014b24e2bSVaishali Kulkarni 		ecore_grc_dump_regs_hdr(dump_buf, true, num_reg_entries, "eng", -1, OSAL_NULL, OSAL_NULL);
326114b24e2bSVaishali Kulkarni 
326214b24e2bSVaishali Kulkarni 	return offset;
326314b24e2bSVaishali Kulkarni }
326414b24e2bSVaishali Kulkarni 
326514b24e2bSVaishali Kulkarni /* Dumps registers that can't be represented in the debug arrays */
ecore_grc_dump_special_regs(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)326614b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_special_regs(struct ecore_hwfn *p_hwfn,
326714b24e2bSVaishali Kulkarni 									   struct ecore_ptt *p_ptt,
326814b24e2bSVaishali Kulkarni 									   u32 *dump_buf,
326914b24e2bSVaishali Kulkarni 									   bool dump)
327014b24e2bSVaishali Kulkarni {
327114b24e2bSVaishali Kulkarni 	u32 offset = 0;
327214b24e2bSVaishali Kulkarni 
327314b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_regs_hdr(dump_buf, dump, 2, "eng", -1, OSAL_NULL, OSAL_NULL);
327414b24e2bSVaishali Kulkarni 
327514b24e2bSVaishali Kulkarni 	/* Dump R/TDIF_REG_DEBUG_ERROR_INFO_SIZE (every 8'th register should be
327614b24e2bSVaishali Kulkarni 	 * skipped).
327714b24e2bSVaishali Kulkarni 	 */
327814b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_reg_entry_skip(p_hwfn, p_ptt, dump_buf + offset, dump, BYTES_TO_DWORDS(RDIF_REG_DEBUG_ERROR_INFO), RDIF_REG_DEBUG_ERROR_INFO_SIZE, 7, 1);
327914b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_reg_entry_skip(p_hwfn, p_ptt, dump_buf + offset, dump, BYTES_TO_DWORDS(TDIF_REG_DEBUG_ERROR_INFO), TDIF_REG_DEBUG_ERROR_INFO_SIZE, 7, 1);
328014b24e2bSVaishali Kulkarni 
328114b24e2bSVaishali Kulkarni 	return offset;
328214b24e2bSVaishali Kulkarni }
328314b24e2bSVaishali Kulkarni 
328414b24e2bSVaishali Kulkarni /* Dumps a GRC memory header (section and params). Returns the dumped size in
328514b24e2bSVaishali Kulkarni  * dwords. The following parameters are dumped:
328614b24e2bSVaishali Kulkarni  * - name:	   dumped only if it's not OSAL_NULL.
328714b24e2bSVaishali Kulkarni  * - addr:	   in dwords, dumped only if name is OSAL_NULL.
328814b24e2bSVaishali Kulkarni  * - len:	   in dwords, always dumped.
328914b24e2bSVaishali Kulkarni  * - width:	   dumped if it's not zero.
329014b24e2bSVaishali Kulkarni  * - packed:	   dumped only if it's not false.
329114b24e2bSVaishali Kulkarni  * - mem_group:	   always dumped.
329214b24e2bSVaishali Kulkarni  * - is_storm:	   true only if the memory is related to a Storm.
329314b24e2bSVaishali Kulkarni  * - storm_letter: valid only if is_storm is true.
329414b24e2bSVaishali Kulkarni  *
329514b24e2bSVaishali Kulkarni  */
ecore_grc_dump_mem_hdr(struct ecore_hwfn * p_hwfn,u32 * dump_buf,bool dump,const char * name,u32 addr,u32 len,u32 bit_width,bool packed,const char * mem_group,bool is_storm,char storm_letter)329614b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_mem_hdr(struct ecore_hwfn *p_hwfn,
329714b24e2bSVaishali Kulkarni 								  u32 *dump_buf,
329814b24e2bSVaishali Kulkarni 								  bool dump,
329914b24e2bSVaishali Kulkarni 								  const char *name,
330014b24e2bSVaishali Kulkarni 								  u32 addr,
330114b24e2bSVaishali Kulkarni 								  u32 len,
330214b24e2bSVaishali Kulkarni 								  u32 bit_width,
330314b24e2bSVaishali Kulkarni 								  bool packed,
330414b24e2bSVaishali Kulkarni 								  const char *mem_group,
330514b24e2bSVaishali Kulkarni 								  bool is_storm,
330614b24e2bSVaishali Kulkarni 								  char storm_letter)
330714b24e2bSVaishali Kulkarni {
330814b24e2bSVaishali Kulkarni 	u8 num_params = 3;
330914b24e2bSVaishali Kulkarni 	u32 offset = 0;
331014b24e2bSVaishali Kulkarni 	char buf[64];
331114b24e2bSVaishali Kulkarni 
331214b24e2bSVaishali Kulkarni 	if (!len)
331314b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Unexpected GRC Dump error: dumped memory size must be non-zero\n");
331414b24e2bSVaishali Kulkarni 
331514b24e2bSVaishali Kulkarni 	if (bit_width)
331614b24e2bSVaishali Kulkarni 		num_params++;
331714b24e2bSVaishali Kulkarni 	if (packed)
331814b24e2bSVaishali Kulkarni 		num_params++;
331914b24e2bSVaishali Kulkarni 
332014b24e2bSVaishali Kulkarni 	/* Dump section header */
332114b24e2bSVaishali Kulkarni 	offset += ecore_dump_section_hdr(dump_buf + offset, dump, "grc_mem", num_params);
332214b24e2bSVaishali Kulkarni 
332314b24e2bSVaishali Kulkarni 	if (name) {
332414b24e2bSVaishali Kulkarni 
332514b24e2bSVaishali Kulkarni 		/* Dump name */
332614b24e2bSVaishali Kulkarni 		if (is_storm) {
332714b24e2bSVaishali Kulkarni 			OSAL_STRCPY(buf, "?STORM_");
332814b24e2bSVaishali Kulkarni 			buf[0] = storm_letter;
332914b24e2bSVaishali Kulkarni 			OSAL_STRCPY(buf + OSAL_STRLEN(buf), name);
333014b24e2bSVaishali Kulkarni 		}
333114b24e2bSVaishali Kulkarni 		else {
333214b24e2bSVaishali Kulkarni 			OSAL_STRCPY(buf, name);
333314b24e2bSVaishali Kulkarni 		}
333414b24e2bSVaishali Kulkarni 
333514b24e2bSVaishali Kulkarni 		offset += ecore_dump_str_param(dump_buf + offset, dump, "name", buf);
333614b24e2bSVaishali Kulkarni 		if (dump)
333714b24e2bSVaishali Kulkarni 			DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "Dumping %d registers from %s...\n", len, buf);
333814b24e2bSVaishali Kulkarni 	}
333914b24e2bSVaishali Kulkarni 	else {
334014b24e2bSVaishali Kulkarni 
334114b24e2bSVaishali Kulkarni 		/* Dump address */
334214b24e2bSVaishali Kulkarni 		u32 addr_in_bytes = DWORDS_TO_BYTES(addr);
334314b24e2bSVaishali Kulkarni 
334414b24e2bSVaishali Kulkarni 		offset += ecore_dump_num_param(dump_buf + offset, dump, "addr", addr_in_bytes);
334514b24e2bSVaishali Kulkarni 		if (dump && len > 64)
334614b24e2bSVaishali Kulkarni 			DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "Dumping %d registers from address 0x%x...\n", len, addr_in_bytes);
334714b24e2bSVaishali Kulkarni 	}
334814b24e2bSVaishali Kulkarni 
334914b24e2bSVaishali Kulkarni 	/* Dump len */
335014b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "len", len);
335114b24e2bSVaishali Kulkarni 
335214b24e2bSVaishali Kulkarni 	/* Dump bit width */
335314b24e2bSVaishali Kulkarni 	if (bit_width)
335414b24e2bSVaishali Kulkarni 		offset += ecore_dump_num_param(dump_buf + offset, dump, "width", bit_width);
335514b24e2bSVaishali Kulkarni 
335614b24e2bSVaishali Kulkarni 	/* Dump packed */
335714b24e2bSVaishali Kulkarni 	if (packed)
335814b24e2bSVaishali Kulkarni 		offset += ecore_dump_num_param(dump_buf + offset, dump, "packed", 1);
335914b24e2bSVaishali Kulkarni 
336014b24e2bSVaishali Kulkarni 	/* Dump reg type */
336114b24e2bSVaishali Kulkarni 	if (is_storm) {
336214b24e2bSVaishali Kulkarni 		OSAL_STRCPY(buf, "?STORM_");
336314b24e2bSVaishali Kulkarni 		buf[0] = storm_letter;
336414b24e2bSVaishali Kulkarni 		OSAL_STRCPY(buf + OSAL_STRLEN(buf), mem_group);
336514b24e2bSVaishali Kulkarni 	}
336614b24e2bSVaishali Kulkarni 	else {
336714b24e2bSVaishali Kulkarni 		OSAL_STRCPY(buf, mem_group);
336814b24e2bSVaishali Kulkarni 	}
336914b24e2bSVaishali Kulkarni 
337014b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "type", buf);
337114b24e2bSVaishali Kulkarni 
337214b24e2bSVaishali Kulkarni 	return offset;
337314b24e2bSVaishali Kulkarni }
337414b24e2bSVaishali Kulkarni 
337514b24e2bSVaishali Kulkarni /* Dumps a single GRC memory. If name is OSAL_NULL, the memory is stored by address.
337614b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
337714b24e2bSVaishali Kulkarni  * The addr and len arguments are specified in dwords.
337814b24e2bSVaishali Kulkarni  */
ecore_grc_dump_mem(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,const char * name,u32 addr,u32 len,bool wide_bus,u32 bit_width,bool packed,const char * mem_group,bool is_storm,char storm_letter)337914b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_mem(struct ecore_hwfn *p_hwfn,
338014b24e2bSVaishali Kulkarni 							  struct ecore_ptt *p_ptt,
338114b24e2bSVaishali Kulkarni 							  u32 *dump_buf,
338214b24e2bSVaishali Kulkarni 							  bool dump,
338314b24e2bSVaishali Kulkarni 							  const char *name,
338414b24e2bSVaishali Kulkarni 							  u32 addr,
338514b24e2bSVaishali Kulkarni 							  u32 len,
338614b24e2bSVaishali Kulkarni 							  bool wide_bus,
338714b24e2bSVaishali Kulkarni 							  u32 bit_width,
338814b24e2bSVaishali Kulkarni 							  bool packed,
338914b24e2bSVaishali Kulkarni 							  const char *mem_group,
339014b24e2bSVaishali Kulkarni 							  bool is_storm,
339114b24e2bSVaishali Kulkarni 							  char storm_letter)
339214b24e2bSVaishali Kulkarni {
339314b24e2bSVaishali Kulkarni 	u32 offset = 0;
339414b24e2bSVaishali Kulkarni 
339514b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_mem_hdr(p_hwfn, dump_buf + offset, dump, name, addr, len, bit_width, packed, mem_group, is_storm, storm_letter);
339614b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_addr_range(p_hwfn, p_ptt, dump_buf + offset, dump, addr, len, wide_bus);
339714b24e2bSVaishali Kulkarni 
339814b24e2bSVaishali Kulkarni 	return offset;
339914b24e2bSVaishali Kulkarni }
340014b24e2bSVaishali Kulkarni 
340114b24e2bSVaishali Kulkarni /* Dumps GRC memories entries. Returns the dumped size in dwords. */
ecore_grc_dump_mem_entries(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct dbg_array input_mems_arr,u32 * dump_buf,bool dump)340214b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_mem_entries(struct ecore_hwfn *p_hwfn,
340314b24e2bSVaishali Kulkarni 									  struct ecore_ptt *p_ptt,
340414b24e2bSVaishali Kulkarni 									  struct dbg_array input_mems_arr,
340514b24e2bSVaishali Kulkarni 									  u32 *dump_buf,
340614b24e2bSVaishali Kulkarni 									  bool dump)
340714b24e2bSVaishali Kulkarni {
340814b24e2bSVaishali Kulkarni 	u32 i, offset = 0, input_offset = 0;
340914b24e2bSVaishali Kulkarni 	bool mode_match = true;
341014b24e2bSVaishali Kulkarni 
341114b24e2bSVaishali Kulkarni 	while (input_offset < input_mems_arr.size_in_dwords) {
341214b24e2bSVaishali Kulkarni 		const struct dbg_dump_cond_hdr* cond_hdr;
341314b24e2bSVaishali Kulkarni 		u16 modes_buf_offset;
341414b24e2bSVaishali Kulkarni 		u32 num_entries;
341514b24e2bSVaishali Kulkarni 		bool eval_mode;
341614b24e2bSVaishali Kulkarni 
341714b24e2bSVaishali Kulkarni 		cond_hdr = (const struct dbg_dump_cond_hdr*)&input_mems_arr.ptr[input_offset++];
341814b24e2bSVaishali Kulkarni 		num_entries = cond_hdr->data_size / MEM_DUMP_ENTRY_SIZE_DWORDS;
341914b24e2bSVaishali Kulkarni 
342014b24e2bSVaishali Kulkarni 		/* Check required mode */
342114b24e2bSVaishali Kulkarni 		eval_mode = GET_FIELD(cond_hdr->mode.data, DBG_MODE_HDR_EVAL_MODE) > 0;
342214b24e2bSVaishali Kulkarni 		if (eval_mode) {
342314b24e2bSVaishali Kulkarni 			modes_buf_offset = GET_FIELD(cond_hdr->mode.data, DBG_MODE_HDR_MODES_BUF_OFFSET);
342414b24e2bSVaishali Kulkarni 			mode_match = ecore_is_mode_match(p_hwfn, &modes_buf_offset);
342514b24e2bSVaishali Kulkarni 		}
342614b24e2bSVaishali Kulkarni 
342714b24e2bSVaishali Kulkarni 		if (!mode_match) {
342814b24e2bSVaishali Kulkarni 			input_offset += cond_hdr->data_size;
342914b24e2bSVaishali Kulkarni 			continue;
343014b24e2bSVaishali Kulkarni 		}
343114b24e2bSVaishali Kulkarni 
343214b24e2bSVaishali Kulkarni 		for (i = 0; i < num_entries; i++, input_offset += MEM_DUMP_ENTRY_SIZE_DWORDS) {
343314b24e2bSVaishali Kulkarni 			const struct dbg_dump_mem *mem = (const struct dbg_dump_mem*)&input_mems_arr.ptr[input_offset];
343414b24e2bSVaishali Kulkarni 			u8 mem_group_id = GET_FIELD(mem->dword0, DBG_DUMP_MEM_MEM_GROUP_ID);
343514b24e2bSVaishali Kulkarni 			bool is_storm = false, mem_wide_bus;
343614b24e2bSVaishali Kulkarni 			char storm_letter = 'a';
343714b24e2bSVaishali Kulkarni 			u32 mem_addr, mem_len;
343814b24e2bSVaishali Kulkarni 
343914b24e2bSVaishali Kulkarni 			if (mem_group_id >= MEM_GROUPS_NUM) {
344014b24e2bSVaishali Kulkarni 				DP_NOTICE(p_hwfn, true, "Invalid mem_group_id\n");
344114b24e2bSVaishali Kulkarni 				return 0;
344214b24e2bSVaishali Kulkarni 			}
344314b24e2bSVaishali Kulkarni 
344414b24e2bSVaishali Kulkarni 			if (!ecore_grc_is_mem_included(p_hwfn, (enum block_id)cond_hdr->block_id, mem_group_id))
344514b24e2bSVaishali Kulkarni 				continue;
344614b24e2bSVaishali Kulkarni 
344714b24e2bSVaishali Kulkarni 			mem_addr = GET_FIELD(mem->dword0, DBG_DUMP_MEM_ADDRESS);
344814b24e2bSVaishali Kulkarni 			mem_len = GET_FIELD(mem->dword1, DBG_DUMP_MEM_LENGTH);
344914b24e2bSVaishali Kulkarni 			mem_wide_bus = GET_FIELD(mem->dword1, DBG_DUMP_MEM_WIDE_BUS);
345014b24e2bSVaishali Kulkarni 
345114b24e2bSVaishali Kulkarni 			/* Update memory length for CCFC/TCFC memories
345214b24e2bSVaishali Kulkarni 			 * according to number of LCIDs/LTIDs.
345314b24e2bSVaishali Kulkarni 			 */
345414b24e2bSVaishali Kulkarni 			if (mem_group_id == MEM_GROUP_CONN_CFC_MEM) {
345514b24e2bSVaishali Kulkarni 				if (mem_len % MAX_LCIDS) {
345614b24e2bSVaishali Kulkarni 					DP_NOTICE(p_hwfn, true, "Invalid CCFC connection memory size\n");
345714b24e2bSVaishali Kulkarni 					return 0;
345814b24e2bSVaishali Kulkarni 				}
345914b24e2bSVaishali Kulkarni 
346014b24e2bSVaishali Kulkarni 				mem_len = ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NUM_LCIDS) * (mem_len / MAX_LCIDS);
346114b24e2bSVaishali Kulkarni 			}
346214b24e2bSVaishali Kulkarni 			else if (mem_group_id == MEM_GROUP_TASK_CFC_MEM) {
346314b24e2bSVaishali Kulkarni 				if (mem_len % MAX_LTIDS) {
346414b24e2bSVaishali Kulkarni 					DP_NOTICE(p_hwfn, true, "Invalid TCFC task memory size\n");
346514b24e2bSVaishali Kulkarni 					return 0;
346614b24e2bSVaishali Kulkarni 				}
346714b24e2bSVaishali Kulkarni 
346814b24e2bSVaishali Kulkarni 				mem_len = ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NUM_LTIDS) * (mem_len / MAX_LTIDS);
346914b24e2bSVaishali Kulkarni 			}
347014b24e2bSVaishali Kulkarni 
347114b24e2bSVaishali Kulkarni 			/* If memory is associated with Storm, udpate Storm
347214b24e2bSVaishali Kulkarni 			 * details.
347314b24e2bSVaishali Kulkarni 			 */
347414b24e2bSVaishali Kulkarni 			if (s_block_defs[cond_hdr->block_id]->associated_to_storm) {
347514b24e2bSVaishali Kulkarni 				is_storm = true;
347614b24e2bSVaishali Kulkarni 				storm_letter = s_storm_defs[s_block_defs[cond_hdr->block_id]->storm_id].letter;
347714b24e2bSVaishali Kulkarni 			}
347814b24e2bSVaishali Kulkarni 
347914b24e2bSVaishali Kulkarni 			/* Dump memory */
348014b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_mem(p_hwfn, p_ptt, dump_buf + offset, dump, OSAL_NULL, mem_addr, mem_len, mem_wide_bus,
348114b24e2bSVaishali Kulkarni 											0, false, s_mem_group_names[mem_group_id], is_storm, storm_letter);
348214b24e2bSVaishali Kulkarni 		}
348314b24e2bSVaishali Kulkarni 	}
348414b24e2bSVaishali Kulkarni 
348514b24e2bSVaishali Kulkarni 	return offset;
348614b24e2bSVaishali Kulkarni }
348714b24e2bSVaishali Kulkarni 
348814b24e2bSVaishali Kulkarni /* Dumps GRC memories according to the input array dump_mem.
348914b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
349014b24e2bSVaishali Kulkarni  */
ecore_grc_dump_memories(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)349114b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_memories(struct ecore_hwfn *p_hwfn,
349214b24e2bSVaishali Kulkarni 								   struct ecore_ptt *p_ptt,
349314b24e2bSVaishali Kulkarni 								   u32 *dump_buf,
349414b24e2bSVaishali Kulkarni 								   bool dump)
349514b24e2bSVaishali Kulkarni {
349614b24e2bSVaishali Kulkarni 	u32 offset = 0, input_offset = 0;
349714b24e2bSVaishali Kulkarni 
349814b24e2bSVaishali Kulkarni 	while (input_offset < s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].size_in_dwords) {
349914b24e2bSVaishali Kulkarni 		const struct dbg_dump_split_hdr *split_hdr;
350014b24e2bSVaishali Kulkarni 		struct dbg_array curr_input_mems_arr;
350114b24e2bSVaishali Kulkarni 		u32 split_data_size;
350214b24e2bSVaishali Kulkarni 		u8 split_type_id;
350314b24e2bSVaishali Kulkarni 
350414b24e2bSVaishali Kulkarni 		split_hdr = (const struct dbg_dump_split_hdr*)&s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr[input_offset++];
350514b24e2bSVaishali Kulkarni 		split_type_id = GET_FIELD(split_hdr->hdr, DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
350614b24e2bSVaishali Kulkarni 		split_data_size = GET_FIELD(split_hdr->hdr, DBG_DUMP_SPLIT_HDR_DATA_SIZE);
350714b24e2bSVaishali Kulkarni 		curr_input_mems_arr.ptr = &s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr[input_offset];
350814b24e2bSVaishali Kulkarni 		curr_input_mems_arr.size_in_dwords = split_data_size;
350914b24e2bSVaishali Kulkarni 
351014b24e2bSVaishali Kulkarni 		switch (split_type_id) {
351114b24e2bSVaishali Kulkarni 		case SPLIT_TYPE_NONE:
351214b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_mem_entries(p_hwfn, p_ptt, curr_input_mems_arr, dump_buf + offset, dump);
351314b24e2bSVaishali Kulkarni 			break;
351414b24e2bSVaishali Kulkarni 
351514b24e2bSVaishali Kulkarni 		default:
351614b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, true, "Dumping split memories is currently not supported\n");
351714b24e2bSVaishali Kulkarni 			break;
351814b24e2bSVaishali Kulkarni 		}
351914b24e2bSVaishali Kulkarni 
352014b24e2bSVaishali Kulkarni 		input_offset += split_data_size;
352114b24e2bSVaishali Kulkarni 	}
352214b24e2bSVaishali Kulkarni 
352314b24e2bSVaishali Kulkarni 	return offset;
352414b24e2bSVaishali Kulkarni }
352514b24e2bSVaishali Kulkarni 
352614b24e2bSVaishali Kulkarni /* Dumps GRC context data for the specified Storm.
352714b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
352814b24e2bSVaishali Kulkarni  * The lid_size argument is specified in quad-regs.
352914b24e2bSVaishali Kulkarni  */
ecore_grc_dump_ctx_data(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,const char * name,u32 num_lids,u32 lid_size,u32 rd_reg_addr,u8 storm_id)353014b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_ctx_data(struct ecore_hwfn *p_hwfn,
353114b24e2bSVaishali Kulkarni 								   struct ecore_ptt *p_ptt,
353214b24e2bSVaishali Kulkarni 								   u32 *dump_buf,
353314b24e2bSVaishali Kulkarni 								   bool dump,
353414b24e2bSVaishali Kulkarni 								   const char *name,
353514b24e2bSVaishali Kulkarni 								   u32 num_lids,
353614b24e2bSVaishali Kulkarni 								   u32 lid_size,
353714b24e2bSVaishali Kulkarni 								   u32 rd_reg_addr,
353814b24e2bSVaishali Kulkarni 								   u8 storm_id)
353914b24e2bSVaishali Kulkarni {
354014b24e2bSVaishali Kulkarni 	struct storm_defs *storm = &s_storm_defs[storm_id];
354114b24e2bSVaishali Kulkarni 	u32 i, lid, total_size, offset = 0;
354214b24e2bSVaishali Kulkarni 
354314b24e2bSVaishali Kulkarni 	if (!lid_size)
354414b24e2bSVaishali Kulkarni 		return 0;
354514b24e2bSVaishali Kulkarni 
354614b24e2bSVaishali Kulkarni 	lid_size *= BYTES_IN_DWORD;
354714b24e2bSVaishali Kulkarni 	total_size = num_lids * lid_size;
354814b24e2bSVaishali Kulkarni 
354914b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_mem_hdr(p_hwfn, dump_buf + offset, dump, name, 0, total_size, lid_size * 32, false, name, true, storm->letter);
355014b24e2bSVaishali Kulkarni 
355114b24e2bSVaishali Kulkarni 	if (!dump)
355214b24e2bSVaishali Kulkarni 		return offset + total_size;
355314b24e2bSVaishali Kulkarni 
355414b24e2bSVaishali Kulkarni 	/* Dump context data */
355514b24e2bSVaishali Kulkarni 	for (lid = 0; lid < num_lids; lid++) {
355614b24e2bSVaishali Kulkarni 		for (i = 0; i < lid_size; i++, offset++) {
355714b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, storm->cm_ctx_wr_addr, (i << 9) | lid);
355814b24e2bSVaishali Kulkarni 			*(dump_buf + offset) = ecore_rd(p_hwfn, p_ptt, rd_reg_addr);
355914b24e2bSVaishali Kulkarni 		}
356014b24e2bSVaishali Kulkarni 	}
356114b24e2bSVaishali Kulkarni 
356214b24e2bSVaishali Kulkarni 	return offset;
356314b24e2bSVaishali Kulkarni }
356414b24e2bSVaishali Kulkarni 
356514b24e2bSVaishali Kulkarni /* Dumps GRC contexts. Returns the dumped size in dwords. */
ecore_grc_dump_ctx(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)356614b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_ctx(struct ecore_hwfn *p_hwfn,
356714b24e2bSVaishali Kulkarni 							  struct ecore_ptt *p_ptt,
356814b24e2bSVaishali Kulkarni 							  u32 *dump_buf,
356914b24e2bSVaishali Kulkarni 							  bool dump)
357014b24e2bSVaishali Kulkarni {
357114b24e2bSVaishali Kulkarni 	u32 offset = 0;
357214b24e2bSVaishali Kulkarni 	u8 storm_id;
357314b24e2bSVaishali Kulkarni 
357414b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
357514b24e2bSVaishali Kulkarni 		struct storm_defs *storm = &s_storm_defs[storm_id];
357614b24e2bSVaishali Kulkarni 
357714b24e2bSVaishali Kulkarni 		if (!ecore_grc_is_storm_included(p_hwfn, (enum dbg_storms)storm_id))
357814b24e2bSVaishali Kulkarni 			continue;
357914b24e2bSVaishali Kulkarni 
358014b24e2bSVaishali Kulkarni 		/* Dump Conn AG context size */
358114b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_ctx_data(p_hwfn, p_ptt, dump_buf + offset, dump, "CONN_AG_CTX", ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NUM_LCIDS),
358214b24e2bSVaishali Kulkarni 			storm->cm_conn_ag_ctx_lid_size, storm->cm_conn_ag_ctx_rd_addr, storm_id);
358314b24e2bSVaishali Kulkarni 
358414b24e2bSVaishali Kulkarni 		/* Dump Conn ST context size */
358514b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_ctx_data(p_hwfn, p_ptt, dump_buf + offset, dump, "CONN_ST_CTX", ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NUM_LCIDS),
358614b24e2bSVaishali Kulkarni 			storm->cm_conn_st_ctx_lid_size, storm->cm_conn_st_ctx_rd_addr, storm_id);
358714b24e2bSVaishali Kulkarni 
358814b24e2bSVaishali Kulkarni 		/* Dump Task AG context size */
358914b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_ctx_data(p_hwfn, p_ptt, dump_buf + offset, dump, "TASK_AG_CTX", ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NUM_LTIDS),
359014b24e2bSVaishali Kulkarni 			storm->cm_task_ag_ctx_lid_size, storm->cm_task_ag_ctx_rd_addr, storm_id);
359114b24e2bSVaishali Kulkarni 
359214b24e2bSVaishali Kulkarni 		/* Dump Task ST context size */
359314b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_ctx_data(p_hwfn, p_ptt, dump_buf + offset, dump, "TASK_ST_CTX", ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NUM_LTIDS),
359414b24e2bSVaishali Kulkarni 			storm->cm_task_st_ctx_lid_size, storm->cm_task_st_ctx_rd_addr, storm_id);
359514b24e2bSVaishali Kulkarni 	}
359614b24e2bSVaishali Kulkarni 
359714b24e2bSVaishali Kulkarni 	return offset;
359814b24e2bSVaishali Kulkarni }
359914b24e2bSVaishali Kulkarni 
360014b24e2bSVaishali Kulkarni /* Dumps GRC IORs data. Returns the dumped size in dwords. */
ecore_grc_dump_iors(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)360114b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_iors(struct ecore_hwfn *p_hwfn,
360214b24e2bSVaishali Kulkarni 							   struct ecore_ptt *p_ptt,
360314b24e2bSVaishali Kulkarni 							   u32 *dump_buf,
360414b24e2bSVaishali Kulkarni 							   bool dump)
360514b24e2bSVaishali Kulkarni {
360614b24e2bSVaishali Kulkarni 	char buf[10] = "IOR_SET_?";
360714b24e2bSVaishali Kulkarni 	u32 addr, offset = 0;
360814b24e2bSVaishali Kulkarni 	u8 storm_id, set_id;
360914b24e2bSVaishali Kulkarni 
361014b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
361114b24e2bSVaishali Kulkarni 		struct storm_defs *storm = &s_storm_defs[storm_id];
361214b24e2bSVaishali Kulkarni 
361314b24e2bSVaishali Kulkarni 		if (!ecore_grc_is_storm_included(p_hwfn, (enum dbg_storms)storm_id))
361414b24e2bSVaishali Kulkarni 			continue;
361514b24e2bSVaishali Kulkarni 
361614b24e2bSVaishali Kulkarni 		for (set_id = 0; set_id < NUM_IOR_SETS; set_id++) {
361714b24e2bSVaishali Kulkarni 			addr = BYTES_TO_DWORDS(storm->sem_fast_mem_addr + SEM_FAST_REG_STORM_REG_FILE) + IOR_SET_OFFSET(set_id);
361814b24e2bSVaishali Kulkarni 			buf[OSAL_STRLEN(buf) - 1] = '0' + set_id;
361914b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_mem(p_hwfn, p_ptt, dump_buf + offset, dump, buf, addr, IORS_PER_SET, false, 32, false, "ior", true, storm->letter);
362014b24e2bSVaishali Kulkarni 		}
362114b24e2bSVaishali Kulkarni 	}
362214b24e2bSVaishali Kulkarni 
362314b24e2bSVaishali Kulkarni 	return offset;
362414b24e2bSVaishali Kulkarni }
362514b24e2bSVaishali Kulkarni 
362614b24e2bSVaishali Kulkarni /* Dump VFC CAM. Returns the dumped size in dwords. */
ecore_grc_dump_vfc_cam(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u8 storm_id)362714b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_vfc_cam(struct ecore_hwfn *p_hwfn,
362814b24e2bSVaishali Kulkarni 								  struct ecore_ptt *p_ptt,
362914b24e2bSVaishali Kulkarni 								  u32 *dump_buf,
363014b24e2bSVaishali Kulkarni 								  bool dump,
363114b24e2bSVaishali Kulkarni 								  u8 storm_id)
363214b24e2bSVaishali Kulkarni {
363314b24e2bSVaishali Kulkarni 	u32 total_size = VFC_CAM_NUM_ROWS * VFC_CAM_RESP_DWORDS;
363414b24e2bSVaishali Kulkarni 	struct storm_defs *storm = &s_storm_defs[storm_id];
363514b24e2bSVaishali Kulkarni 	u32 cam_addr[VFC_CAM_ADDR_DWORDS] = { 0 };
363614b24e2bSVaishali Kulkarni 	u32 cam_cmd[VFC_CAM_CMD_DWORDS] = { 0 };
363714b24e2bSVaishali Kulkarni 	u32 row, i, offset = 0;
363814b24e2bSVaishali Kulkarni 
363914b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_mem_hdr(p_hwfn, dump_buf + offset, dump, "vfc_cam", 0, total_size, 256, false, "vfc_cam", true, storm->letter);
364014b24e2bSVaishali Kulkarni 
364114b24e2bSVaishali Kulkarni 	if (!dump)
364214b24e2bSVaishali Kulkarni 		return offset + total_size;
364314b24e2bSVaishali Kulkarni 
364414b24e2bSVaishali Kulkarni 	/* Prepare CAM address */
364514b24e2bSVaishali Kulkarni 	SET_VAR_FIELD(cam_addr, VFC_CAM_ADDR, OP, VFC_OPCODE_CAM_RD);
364614b24e2bSVaishali Kulkarni 
364714b24e2bSVaishali Kulkarni 	for (row = 0; row < VFC_CAM_NUM_ROWS; row++, offset += VFC_CAM_RESP_DWORDS) {
364814b24e2bSVaishali Kulkarni 
364914b24e2bSVaishali Kulkarni 		/* Write VFC CAM command */
365014b24e2bSVaishali Kulkarni 		SET_VAR_FIELD(cam_cmd, VFC_CAM_CMD, ROW, row);
365114b24e2bSVaishali Kulkarni 		ARR_REG_WR(p_hwfn, p_ptt, storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_WR, cam_cmd, VFC_CAM_CMD_DWORDS);
365214b24e2bSVaishali Kulkarni 
365314b24e2bSVaishali Kulkarni 		/* Write VFC CAM address */
365414b24e2bSVaishali Kulkarni 		ARR_REG_WR(p_hwfn, p_ptt, storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_ADDR, cam_addr, VFC_CAM_ADDR_DWORDS);
365514b24e2bSVaishali Kulkarni 
365614b24e2bSVaishali Kulkarni 		/* Read VFC CAM read response */
365714b24e2bSVaishali Kulkarni 		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);
365814b24e2bSVaishali Kulkarni 	}
365914b24e2bSVaishali Kulkarni 
366014b24e2bSVaishali Kulkarni 	return offset;
366114b24e2bSVaishali Kulkarni }
366214b24e2bSVaishali Kulkarni 
366314b24e2bSVaishali Kulkarni /* Dump VFC RAM. Returns the dumped size in dwords. */
ecore_grc_dump_vfc_ram(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u8 storm_id,struct vfc_ram_defs * ram_defs)366414b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_vfc_ram(struct ecore_hwfn *p_hwfn,
366514b24e2bSVaishali Kulkarni 								  struct ecore_ptt *p_ptt,
366614b24e2bSVaishali Kulkarni 								  u32 *dump_buf,
366714b24e2bSVaishali Kulkarni 								  bool dump,
366814b24e2bSVaishali Kulkarni 								  u8 storm_id,
366914b24e2bSVaishali Kulkarni 								  struct vfc_ram_defs *ram_defs)
367014b24e2bSVaishali Kulkarni {
367114b24e2bSVaishali Kulkarni 	u32 total_size = ram_defs->num_rows * VFC_RAM_RESP_DWORDS;
367214b24e2bSVaishali Kulkarni 	struct storm_defs *storm = &s_storm_defs[storm_id];
367314b24e2bSVaishali Kulkarni 	u32 ram_addr[VFC_RAM_ADDR_DWORDS] = { 0 };
367414b24e2bSVaishali Kulkarni 	u32 ram_cmd[VFC_RAM_CMD_DWORDS] = { 0 };
367514b24e2bSVaishali Kulkarni 	u32 row, i, offset = 0;
367614b24e2bSVaishali Kulkarni 
367714b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_mem_hdr(p_hwfn, dump_buf + offset, dump, ram_defs->mem_name, 0, total_size, 256, false, ram_defs->type_name, true, storm->letter);
367814b24e2bSVaishali Kulkarni 
367914b24e2bSVaishali Kulkarni 	/* Prepare RAM address */
368014b24e2bSVaishali Kulkarni 	SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, OP, VFC_OPCODE_RAM_RD);
368114b24e2bSVaishali Kulkarni 
368214b24e2bSVaishali Kulkarni 	if (!dump)
368314b24e2bSVaishali Kulkarni 		return offset + total_size;
368414b24e2bSVaishali Kulkarni 
368514b24e2bSVaishali Kulkarni 	for (row = ram_defs->base_row; row < ram_defs->base_row + ram_defs->num_rows; row++, offset += VFC_RAM_RESP_DWORDS) {
368614b24e2bSVaishali Kulkarni 
368714b24e2bSVaishali Kulkarni 		/* Write VFC RAM command */
368814b24e2bSVaishali Kulkarni 		ARR_REG_WR(p_hwfn, p_ptt, storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_WR, ram_cmd, VFC_RAM_CMD_DWORDS);
368914b24e2bSVaishali Kulkarni 
369014b24e2bSVaishali Kulkarni 		/* Write VFC RAM address */
369114b24e2bSVaishali Kulkarni 		SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, ROW, row);
369214b24e2bSVaishali Kulkarni 		ARR_REG_WR(p_hwfn, p_ptt, storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_ADDR, ram_addr, VFC_RAM_ADDR_DWORDS);
369314b24e2bSVaishali Kulkarni 
369414b24e2bSVaishali Kulkarni 		/* Read VFC RAM read response */
369514b24e2bSVaishali Kulkarni 		ARR_REG_RD(p_hwfn, p_ptt, storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_RD, dump_buf + offset, VFC_RAM_RESP_DWORDS);
369614b24e2bSVaishali Kulkarni 	}
369714b24e2bSVaishali Kulkarni 
369814b24e2bSVaishali Kulkarni 	return offset;
369914b24e2bSVaishali Kulkarni }
370014b24e2bSVaishali Kulkarni 
370114b24e2bSVaishali Kulkarni /* Dumps GRC VFC data. Returns the dumped size in dwords. */
ecore_grc_dump_vfc(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)370214b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_vfc(struct ecore_hwfn *p_hwfn,
370314b24e2bSVaishali Kulkarni 							  struct ecore_ptt *p_ptt,
370414b24e2bSVaishali Kulkarni 							  u32 *dump_buf,
370514b24e2bSVaishali Kulkarni 							  bool dump)
370614b24e2bSVaishali Kulkarni {
370714b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
370814b24e2bSVaishali Kulkarni 	u8 storm_id, i;
370914b24e2bSVaishali Kulkarni 	u32 offset = 0;
371014b24e2bSVaishali Kulkarni 
371114b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
371214b24e2bSVaishali Kulkarni 		if (!ecore_grc_is_storm_included(p_hwfn, (enum dbg_storms)storm_id) ||
371314b24e2bSVaishali Kulkarni 			!s_storm_defs[storm_id].has_vfc ||
371414b24e2bSVaishali Kulkarni 			(storm_id == DBG_PSTORM_ID && dev_data->platform_id != PLATFORM_ASIC))
371514b24e2bSVaishali Kulkarni 			continue;
371614b24e2bSVaishali Kulkarni 
371714b24e2bSVaishali Kulkarni 		/* Read CAM */
371814b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_vfc_cam(p_hwfn, p_ptt, dump_buf + offset, dump, storm_id);
371914b24e2bSVaishali Kulkarni 
372014b24e2bSVaishali Kulkarni 		/* Read RAM */
372114b24e2bSVaishali Kulkarni 		for (i = 0; i < NUM_VFC_RAM_TYPES; i++)
372214b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_vfc_ram(p_hwfn, p_ptt, dump_buf + offset, dump, storm_id, &s_vfc_ram_defs[i]);
372314b24e2bSVaishali Kulkarni 	}
372414b24e2bSVaishali Kulkarni 
372514b24e2bSVaishali Kulkarni 	return offset;
372614b24e2bSVaishali Kulkarni }
372714b24e2bSVaishali Kulkarni 
372814b24e2bSVaishali Kulkarni /* Dumps GRC RSS data. Returns the dumped size in dwords. */
ecore_grc_dump_rss(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)372914b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_rss(struct ecore_hwfn *p_hwfn,
373014b24e2bSVaishali Kulkarni 							  struct ecore_ptt *p_ptt,
373114b24e2bSVaishali Kulkarni 							  u32 *dump_buf,
373214b24e2bSVaishali Kulkarni 							  bool dump)
373314b24e2bSVaishali Kulkarni {
373414b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
373514b24e2bSVaishali Kulkarni 	u32 offset = 0;
373614b24e2bSVaishali Kulkarni 	u8 rss_mem_id;
373714b24e2bSVaishali Kulkarni 
373814b24e2bSVaishali Kulkarni 	for (rss_mem_id = 0; rss_mem_id < NUM_RSS_MEM_TYPES; rss_mem_id++) {
373914b24e2bSVaishali Kulkarni 		u32 rss_addr, num_entries, entry_width, total_dwords, i;
374014b24e2bSVaishali Kulkarni 		struct rss_mem_defs *rss_defs;
374114b24e2bSVaishali Kulkarni 		bool packed;
374214b24e2bSVaishali Kulkarni 
374314b24e2bSVaishali Kulkarni 		rss_defs = &s_rss_mem_defs[rss_mem_id];
374414b24e2bSVaishali Kulkarni 		rss_addr = rss_defs->addr;
374514b24e2bSVaishali Kulkarni 		num_entries = rss_defs->num_entries[dev_data->chip_id];
374614b24e2bSVaishali Kulkarni 		entry_width = rss_defs->entry_width[dev_data->chip_id];
374714b24e2bSVaishali Kulkarni 		total_dwords = (num_entries * entry_width) / 32;
374814b24e2bSVaishali Kulkarni 		packed = (entry_width == 16);
374914b24e2bSVaishali Kulkarni 
375014b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_mem_hdr(p_hwfn, dump_buf + offset, dump, rss_defs->mem_name, 0, total_dwords,
375114b24e2bSVaishali Kulkarni 			entry_width, packed, rss_defs->type_name, false, 0);
375214b24e2bSVaishali Kulkarni 
375314b24e2bSVaishali Kulkarni 		/* Dump RSS data */
375414b24e2bSVaishali Kulkarni 		if (!dump) {
375514b24e2bSVaishali Kulkarni 			offset += total_dwords;
375614b24e2bSVaishali Kulkarni 			continue;
375714b24e2bSVaishali Kulkarni 		}
375814b24e2bSVaishali Kulkarni 
375914b24e2bSVaishali Kulkarni 		for (i = 0; i < total_dwords; i += RSS_REG_RSS_RAM_DATA_SIZE, rss_addr++) {
376014b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, RSS_REG_RSS_RAM_ADDR, rss_addr);
376114b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_addr_range(p_hwfn, p_ptt, dump_buf + offset, dump, BYTES_TO_DWORDS(RSS_REG_RSS_RAM_DATA), RSS_REG_RSS_RAM_DATA_SIZE, false);
376214b24e2bSVaishali Kulkarni 		}
376314b24e2bSVaishali Kulkarni 	}
376414b24e2bSVaishali Kulkarni 
376514b24e2bSVaishali Kulkarni 	return offset;
376614b24e2bSVaishali Kulkarni }
376714b24e2bSVaishali Kulkarni 
376814b24e2bSVaishali Kulkarni /* Dumps GRC Big RAM. Returns the dumped size in dwords. */
ecore_grc_dump_big_ram(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u8 big_ram_id)376914b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_big_ram(struct ecore_hwfn *p_hwfn,
377014b24e2bSVaishali Kulkarni 								  struct ecore_ptt *p_ptt,
377114b24e2bSVaishali Kulkarni 								  u32 *dump_buf,
377214b24e2bSVaishali Kulkarni 								  bool dump,
377314b24e2bSVaishali Kulkarni 								  u8 big_ram_id)
377414b24e2bSVaishali Kulkarni {
377514b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
377614b24e2bSVaishali Kulkarni 	u32 total_blocks, ram_size, offset = 0, i;
377714b24e2bSVaishali Kulkarni 	char mem_name[12] = "???_BIG_RAM";
377814b24e2bSVaishali Kulkarni 	char type_name[8] = "???_RAM";
377914b24e2bSVaishali Kulkarni 	struct big_ram_defs *big_ram;
378014b24e2bSVaishali Kulkarni 
378114b24e2bSVaishali Kulkarni 	big_ram = &s_big_ram_defs[big_ram_id];
378214b24e2bSVaishali Kulkarni 	total_blocks = big_ram->num_of_blocks[dev_data->chip_id];
378314b24e2bSVaishali Kulkarni 	ram_size = total_blocks * BIG_RAM_BLOCK_SIZE_DWORDS;
378414b24e2bSVaishali Kulkarni 
378514b24e2bSVaishali Kulkarni 	OSAL_STRNCPY(type_name, big_ram->instance_name, OSAL_STRLEN(big_ram->instance_name));
378614b24e2bSVaishali Kulkarni 	OSAL_STRNCPY(mem_name, big_ram->instance_name, OSAL_STRLEN(big_ram->instance_name));
378714b24e2bSVaishali Kulkarni 
378814b24e2bSVaishali Kulkarni 	/* Dump memory header */
378914b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_mem_hdr(p_hwfn, dump_buf + offset, dump, mem_name, 0, ram_size, BIG_RAM_BLOCK_SIZE_BYTES * 8, false, type_name, false, 0);
379014b24e2bSVaishali Kulkarni 
379114b24e2bSVaishali Kulkarni 	/* Read and dump Big RAM data */
379214b24e2bSVaishali Kulkarni 	if (!dump)
379314b24e2bSVaishali Kulkarni 		return offset + ram_size;
379414b24e2bSVaishali Kulkarni 
379514b24e2bSVaishali Kulkarni 	/* Dump Big RAM */
379614b24e2bSVaishali Kulkarni 	for (i = 0; i < total_blocks / 2; i++) {
379714b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, big_ram->addr_reg_addr, i);
379814b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_addr_range(p_hwfn, p_ptt, dump_buf + offset, dump, BYTES_TO_DWORDS(big_ram->data_reg_addr), 2 * BIG_RAM_BLOCK_SIZE_DWORDS, false);
379914b24e2bSVaishali Kulkarni 	}
380014b24e2bSVaishali Kulkarni 
380114b24e2bSVaishali Kulkarni 	return offset;
380214b24e2bSVaishali Kulkarni }
380314b24e2bSVaishali Kulkarni 
ecore_grc_dump_mcp(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)380414b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_mcp(struct ecore_hwfn *p_hwfn,
380514b24e2bSVaishali Kulkarni 							  struct ecore_ptt *p_ptt,
380614b24e2bSVaishali Kulkarni 							  u32 *dump_buf,
380714b24e2bSVaishali Kulkarni 							  bool dump)
380814b24e2bSVaishali Kulkarni {
380914b24e2bSVaishali Kulkarni 	bool block_enable[MAX_BLOCK_ID] = { 0 };
381014b24e2bSVaishali Kulkarni 	bool halted = false;
381114b24e2bSVaishali Kulkarni 	u32 offset = 0;
381214b24e2bSVaishali Kulkarni 
381314b24e2bSVaishali Kulkarni 	/* Halt MCP */
381414b24e2bSVaishali Kulkarni 	if (dump && !ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) {
381514b24e2bSVaishali Kulkarni 		halted = !ecore_mcp_halt(p_hwfn, p_ptt);
381614b24e2bSVaishali Kulkarni 		if (!halted)
381714b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, false, "MCP halt failed!\n");
381814b24e2bSVaishali Kulkarni 	}
381914b24e2bSVaishali Kulkarni 
382014b24e2bSVaishali Kulkarni 	/* Dump MCP scratchpad */
382114b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_mem(p_hwfn, p_ptt, dump_buf + offset, dump, OSAL_NULL, BYTES_TO_DWORDS(MCP_REG_SCRATCH), MCP_REG_SCRATCH_SIZE, false, 0, false, "MCP", false, 0);
382214b24e2bSVaishali Kulkarni 
382314b24e2bSVaishali Kulkarni 	/* Dump MCP cpu_reg_file */
382414b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_mem(p_hwfn, p_ptt, dump_buf + offset, dump, OSAL_NULL, BYTES_TO_DWORDS(MCP_REG_CPU_REG_FILE), MCP_REG_CPU_REG_FILE_SIZE, false, 0, false, "MCP", false, 0);
382514b24e2bSVaishali Kulkarni 
382614b24e2bSVaishali Kulkarni 	/* Dump MCP registers */
382714b24e2bSVaishali Kulkarni 	block_enable[BLOCK_MCP] = true;
382814b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_registers(p_hwfn, p_ptt, dump_buf + offset, dump, block_enable, "block", "MCP");
382914b24e2bSVaishali Kulkarni 
383014b24e2bSVaishali Kulkarni 	/* Dump required non-MCP registers */
383114b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_regs_hdr(dump_buf + offset, dump, 1, "eng", -1, "block", "MCP");
383214b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_reg_entry(p_hwfn, p_ptt, dump_buf + offset, dump, BYTES_TO_DWORDS(MISC_REG_SHARED_MEM_ADDR), 1, false);
383314b24e2bSVaishali Kulkarni 
383414b24e2bSVaishali Kulkarni 	/* Release MCP */
383514b24e2bSVaishali Kulkarni 	if (halted && ecore_mcp_resume(p_hwfn, p_ptt))
383614b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, false, "Failed to resume MCP after halt!\n");
383714b24e2bSVaishali Kulkarni 
383814b24e2bSVaishali Kulkarni 	return offset;
383914b24e2bSVaishali Kulkarni }
384014b24e2bSVaishali Kulkarni 
384114b24e2bSVaishali Kulkarni /* Dumps the tbus indirect memory for all PHYs. */
ecore_grc_dump_phy(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)384214b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_phy(struct ecore_hwfn *p_hwfn,
384314b24e2bSVaishali Kulkarni 							  struct ecore_ptt *p_ptt,
384414b24e2bSVaishali Kulkarni 							  u32 *dump_buf,
384514b24e2bSVaishali Kulkarni 							  bool dump)
384614b24e2bSVaishali Kulkarni {
384714b24e2bSVaishali Kulkarni 	u32 offset = 0, tbus_lo_offset, tbus_hi_offset;
384814b24e2bSVaishali Kulkarni 	char mem_name[32];
384914b24e2bSVaishali Kulkarni 	u8 phy_id;
385014b24e2bSVaishali Kulkarni 
385114b24e2bSVaishali Kulkarni 	for (phy_id = 0; phy_id < OSAL_ARRAY_SIZE(s_phy_defs); phy_id++) {
385214b24e2bSVaishali Kulkarni 		u32 addr_lo_addr, addr_hi_addr, data_lo_addr, data_hi_addr;
385314b24e2bSVaishali Kulkarni 		struct phy_defs *phy_defs;
385414b24e2bSVaishali Kulkarni 		u8 *bytes_buf;
385514b24e2bSVaishali Kulkarni 
385614b24e2bSVaishali Kulkarni 		phy_defs = &s_phy_defs[phy_id];
385714b24e2bSVaishali Kulkarni 		addr_lo_addr = phy_defs->base_addr + phy_defs->tbus_addr_lo_addr;
385814b24e2bSVaishali Kulkarni 		addr_hi_addr = phy_defs->base_addr + phy_defs->tbus_addr_hi_addr;
385914b24e2bSVaishali Kulkarni 		data_lo_addr = phy_defs->base_addr + phy_defs->tbus_data_lo_addr;
386014b24e2bSVaishali Kulkarni 		data_hi_addr = phy_defs->base_addr + phy_defs->tbus_data_hi_addr;
386114b24e2bSVaishali Kulkarni 		bytes_buf = (u8*)(dump_buf + offset);
386214b24e2bSVaishali Kulkarni 
386314b24e2bSVaishali Kulkarni 		if (OSAL_SNPRINTF(mem_name, sizeof(mem_name), "tbus_%s", phy_defs->phy_name) < 0)
386414b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, true, "Unexpected debug error: invalid PHY memory name\n");
386514b24e2bSVaishali Kulkarni 
386614b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_mem_hdr(p_hwfn, dump_buf + offset, dump, mem_name, 0, PHY_DUMP_SIZE_DWORDS, 16, true, mem_name, false, 0);
386714b24e2bSVaishali Kulkarni 
386814b24e2bSVaishali Kulkarni 		if (!dump) {
386914b24e2bSVaishali Kulkarni 			offset += PHY_DUMP_SIZE_DWORDS;
387014b24e2bSVaishali Kulkarni 			continue;
387114b24e2bSVaishali Kulkarni 		}
387214b24e2bSVaishali Kulkarni 
387314b24e2bSVaishali Kulkarni 		for (tbus_hi_offset = 0; tbus_hi_offset < (NUM_PHY_TBUS_ADDRESSES >> 8); tbus_hi_offset++) {
387414b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, addr_hi_addr, tbus_hi_offset);
387514b24e2bSVaishali Kulkarni 			for (tbus_lo_offset = 0; tbus_lo_offset < 256; tbus_lo_offset++) {
387614b24e2bSVaishali Kulkarni 				ecore_wr(p_hwfn, p_ptt, addr_lo_addr, tbus_lo_offset);
387714b24e2bSVaishali Kulkarni 				*(bytes_buf++) = (u8)ecore_rd(p_hwfn, p_ptt, data_lo_addr);
387814b24e2bSVaishali Kulkarni 				*(bytes_buf++) = (u8)ecore_rd(p_hwfn, p_ptt, data_hi_addr);
387914b24e2bSVaishali Kulkarni 			}
388014b24e2bSVaishali Kulkarni 		}
388114b24e2bSVaishali Kulkarni 
388214b24e2bSVaishali Kulkarni 		offset += PHY_DUMP_SIZE_DWORDS;
388314b24e2bSVaishali Kulkarni 	}
388414b24e2bSVaishali Kulkarni 
388514b24e2bSVaishali Kulkarni 	return offset;
388614b24e2bSVaishali Kulkarni }
388714b24e2bSVaishali Kulkarni 
ecore_config_dbg_line(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,enum block_id block_id,u8 line_id,u8 enable_mask,u8 right_shift,u8 force_valid_mask,u8 force_frame_mask)388814b24e2bSVaishali Kulkarni static void ecore_config_dbg_line(struct ecore_hwfn *p_hwfn,
388914b24e2bSVaishali Kulkarni 								  struct ecore_ptt *p_ptt,
389014b24e2bSVaishali Kulkarni 								  enum block_id block_id,
389114b24e2bSVaishali Kulkarni 								  u8 line_id,
389214b24e2bSVaishali Kulkarni 								  u8 enable_mask,
389314b24e2bSVaishali Kulkarni 								  u8 right_shift,
389414b24e2bSVaishali Kulkarni 								  u8 force_valid_mask,
389514b24e2bSVaishali Kulkarni 								  u8 force_frame_mask)
389614b24e2bSVaishali Kulkarni {
389714b24e2bSVaishali Kulkarni 	struct block_defs *block = s_block_defs[block_id];
389814b24e2bSVaishali Kulkarni 
389914b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, block->dbg_select_addr, line_id);
390014b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, block->dbg_enable_addr, enable_mask);
390114b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, block->dbg_shift_addr, right_shift);
390214b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, block->dbg_force_valid_addr, force_valid_mask);
390314b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, block->dbg_force_frame_addr, force_frame_mask);
390414b24e2bSVaishali Kulkarni }
390514b24e2bSVaishali Kulkarni 
390614b24e2bSVaishali Kulkarni /* Dumps Static Debug data. Returns the dumped size in dwords. */
ecore_grc_dump_static_debug(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)390714b24e2bSVaishali Kulkarni static u32 ecore_grc_dump_static_debug(struct ecore_hwfn *p_hwfn,
390814b24e2bSVaishali Kulkarni 									   struct ecore_ptt *p_ptt,
390914b24e2bSVaishali Kulkarni 									   u32 *dump_buf,
391014b24e2bSVaishali Kulkarni 									   bool dump)
391114b24e2bSVaishali Kulkarni {
391214b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
391314b24e2bSVaishali Kulkarni 	u32 block_id, line_id, offset = 0;
391414b24e2bSVaishali Kulkarni 
391514b24e2bSVaishali Kulkarni 	/* Skip static debug if a debug bus recording is in progress */
391614b24e2bSVaishali Kulkarni 	if (ecore_rd(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON))
391714b24e2bSVaishali Kulkarni 		return 0;
391814b24e2bSVaishali Kulkarni 
391914b24e2bSVaishali Kulkarni 	if (dump) {
392014b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "Dumping static debug data...\n");
392114b24e2bSVaishali Kulkarni 
392214b24e2bSVaishali Kulkarni 		/* Disable all blocks debug output */
392314b24e2bSVaishali Kulkarni 		for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
392414b24e2bSVaishali Kulkarni 			struct block_defs *block = s_block_defs[block_id];
392514b24e2bSVaishali Kulkarni 
392614b24e2bSVaishali Kulkarni 			if (block->has_dbg_bus[dev_data->chip_id])
392714b24e2bSVaishali Kulkarni 				ecore_wr(p_hwfn, p_ptt, block->dbg_enable_addr, 0);
392814b24e2bSVaishali Kulkarni 		}
392914b24e2bSVaishali Kulkarni 
393014b24e2bSVaishali Kulkarni 		ecore_bus_reset_dbg_block(p_hwfn, p_ptt);
393114b24e2bSVaishali Kulkarni 		ecore_bus_set_framing_mode(p_hwfn, p_ptt, DBG_BUS_FRAME_MODE_8HW_0ST);
393214b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_DEBUG_TARGET, DBG_BUS_TARGET_ID_INT_BUF);
393314b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_FULL_MODE, 1);
393414b24e2bSVaishali Kulkarni 		ecore_bus_enable_dbg_block(p_hwfn, p_ptt, true);
393514b24e2bSVaishali Kulkarni 	}
393614b24e2bSVaishali Kulkarni 
393714b24e2bSVaishali Kulkarni 	/* Dump all static debug lines for each relevant block */
393814b24e2bSVaishali Kulkarni 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
393914b24e2bSVaishali Kulkarni 		struct block_defs *block = s_block_defs[block_id];
394014b24e2bSVaishali Kulkarni 		struct dbg_bus_block *block_desc;
394114b24e2bSVaishali Kulkarni 		u32 block_dwords;
394214b24e2bSVaishali Kulkarni 
394314b24e2bSVaishali Kulkarni 		if (!block->has_dbg_bus[dev_data->chip_id])
394414b24e2bSVaishali Kulkarni 			continue;
394514b24e2bSVaishali Kulkarni 
394614b24e2bSVaishali Kulkarni 		block_desc = get_dbg_bus_block_desc(p_hwfn, (enum block_id)block_id);
394714b24e2bSVaishali Kulkarni 		block_dwords = NUM_DBG_LINES(block_desc) * STATIC_DEBUG_LINE_DWORDS;
394814b24e2bSVaishali Kulkarni 
394914b24e2bSVaishali Kulkarni 		/* Dump static section params */
395014b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_mem_hdr(p_hwfn, dump_buf + offset, dump, block->name, 0, block_dwords, 32, false, "STATIC", false, 0);
395114b24e2bSVaishali Kulkarni 
395214b24e2bSVaishali Kulkarni 		if (!dump) {
395314b24e2bSVaishali Kulkarni 			offset += block_dwords;
395414b24e2bSVaishali Kulkarni 			continue;
395514b24e2bSVaishali Kulkarni 		}
395614b24e2bSVaishali Kulkarni 
395714b24e2bSVaishali Kulkarni 		/* If all lines are invalid - dump zeros */
395814b24e2bSVaishali Kulkarni 		if (dev_data->block_in_reset[block_id]) {
395914b24e2bSVaishali Kulkarni 			OSAL_MEMSET(dump_buf + offset, 0, DWORDS_TO_BYTES(block_dwords));
396014b24e2bSVaishali Kulkarni 			offset += block_dwords;
396114b24e2bSVaishali Kulkarni 			continue;
396214b24e2bSVaishali Kulkarni 		}
396314b24e2bSVaishali Kulkarni 
396414b24e2bSVaishali Kulkarni 		/* Enable block's client */
396514b24e2bSVaishali Kulkarni 		ecore_bus_enable_clients(p_hwfn, p_ptt, 1 << block->dbg_client_id[dev_data->chip_id]);
396614b24e2bSVaishali Kulkarni 		for (line_id = 0; line_id < (u32)NUM_DBG_LINES(block_desc); line_id++) {
396714b24e2bSVaishali Kulkarni 
396814b24e2bSVaishali Kulkarni 			/* Configure debug line ID */
396914b24e2bSVaishali Kulkarni 			ecore_config_dbg_line(p_hwfn, p_ptt, (enum block_id)block_id, (u8)line_id, 0xf, 0, 0, 0);
397014b24e2bSVaishali Kulkarni 
397114b24e2bSVaishali Kulkarni 			/* Read debug line info */
397214b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_addr_range(p_hwfn, p_ptt, dump_buf + offset, dump, BYTES_TO_DWORDS(DBG_REG_CALENDAR_OUT_DATA), STATIC_DEBUG_LINE_DWORDS, true);
397314b24e2bSVaishali Kulkarni 		}
397414b24e2bSVaishali Kulkarni 
397514b24e2bSVaishali Kulkarni 		/* Disable block's client and debug output */
397614b24e2bSVaishali Kulkarni 		ecore_bus_enable_clients(p_hwfn, p_ptt, 0);
397714b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, block->dbg_enable_addr, 0);
397814b24e2bSVaishali Kulkarni 	}
397914b24e2bSVaishali Kulkarni 
398014b24e2bSVaishali Kulkarni 	if (dump) {
398114b24e2bSVaishali Kulkarni 		ecore_bus_enable_dbg_block(p_hwfn, p_ptt, false);
398214b24e2bSVaishali Kulkarni 		ecore_bus_enable_clients(p_hwfn, p_ptt, 0);
398314b24e2bSVaishali Kulkarni 	}
398414b24e2bSVaishali Kulkarni 
398514b24e2bSVaishali Kulkarni 	return offset;
398614b24e2bSVaishali Kulkarni }
398714b24e2bSVaishali Kulkarni 
398814b24e2bSVaishali Kulkarni /* Performs GRC Dump to the specified buffer.
398914b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
399014b24e2bSVaishali Kulkarni  */
ecore_grc_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u32 * num_dumped_dwords)399114b24e2bSVaishali Kulkarni static enum dbg_status ecore_grc_dump(struct ecore_hwfn *p_hwfn,
399214b24e2bSVaishali Kulkarni 									  struct ecore_ptt *p_ptt,
399314b24e2bSVaishali Kulkarni 									  u32 *dump_buf,
399414b24e2bSVaishali Kulkarni 									  bool dump,
399514b24e2bSVaishali Kulkarni 									  u32 *num_dumped_dwords)
399614b24e2bSVaishali Kulkarni {
399714b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
399814b24e2bSVaishali Kulkarni 	bool is_emul, parities_masked = false;
399914b24e2bSVaishali Kulkarni 	u8 i, port_mode = 0;
400014b24e2bSVaishali Kulkarni 	u32 offset = 0;
400114b24e2bSVaishali Kulkarni 
400214b24e2bSVaishali Kulkarni 	is_emul = dev_data->platform_id == PLATFORM_EMUL_FULL || dev_data->platform_id == PLATFORM_EMUL_REDUCED;
400314b24e2bSVaishali Kulkarni 
400414b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
400514b24e2bSVaishali Kulkarni 
400614b24e2bSVaishali Kulkarni 	;
400714b24e2bSVaishali Kulkarni 
400814b24e2bSVaishali Kulkarni 	if (dump) {
400914b24e2bSVaishali Kulkarni 
401014b24e2bSVaishali Kulkarni 		/* Find port mode */
401114b24e2bSVaishali Kulkarni 		switch (ecore_rd(p_hwfn, p_ptt, MISC_REG_PORT_MODE)) {
401214b24e2bSVaishali Kulkarni 		case 0: port_mode = 1; break;
401314b24e2bSVaishali Kulkarni 		case 1: port_mode = 2; break;
401414b24e2bSVaishali Kulkarni 		case 2: port_mode = 4; break;
401514b24e2bSVaishali Kulkarni 		}
401614b24e2bSVaishali Kulkarni 
401714b24e2bSVaishali Kulkarni 		/* Update reset state */
401814b24e2bSVaishali Kulkarni 		ecore_update_blocks_reset_state(p_hwfn, p_ptt);
401914b24e2bSVaishali Kulkarni 	}
402014b24e2bSVaishali Kulkarni 
402114b24e2bSVaishali Kulkarni 	/* Dump global params */
402214b24e2bSVaishali Kulkarni 	offset += ecore_dump_common_global_params(p_hwfn, p_ptt, dump_buf + offset, dump, 4);
402314b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "dump-type", "grc-dump");
402414b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "num-lcids", ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NUM_LCIDS));
402514b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "num-ltids", ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NUM_LTIDS));
402614b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "num-ports", port_mode);
402714b24e2bSVaishali Kulkarni 
402814b24e2bSVaishali Kulkarni 	/* Dump reset registers (dumped before taking blocks out of reset ) */
402914b24e2bSVaishali Kulkarni 	if (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS))
403014b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_reset_regs(p_hwfn, p_ptt, dump_buf + offset, dump);
403114b24e2bSVaishali Kulkarni 
403214b24e2bSVaishali Kulkarni 	/* Take all blocks out of reset (using reset registers) */
403314b24e2bSVaishali Kulkarni 	if (dump) {
403414b24e2bSVaishali Kulkarni 		ecore_grc_unreset_blocks(p_hwfn, p_ptt);
403514b24e2bSVaishali Kulkarni 		ecore_update_blocks_reset_state(p_hwfn, p_ptt);
403614b24e2bSVaishali Kulkarni 	}
403714b24e2bSVaishali Kulkarni 
403814b24e2bSVaishali Kulkarni 	/* Disable all parities using MFW command */
403914b24e2bSVaishali Kulkarni 	if (dump && !is_emul && !ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP)) {
404014b24e2bSVaishali Kulkarni 		parities_masked = !ecore_mcp_mask_parities(p_hwfn, p_ptt, 1);
404114b24e2bSVaishali Kulkarni 		if (!parities_masked) {
404214b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, false, "Failed to mask parities using MFW\n");
404314b24e2bSVaishali Kulkarni 			if (ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_PARITY_SAFE))
404414b24e2bSVaishali Kulkarni 				return DBG_STATUS_MCP_COULD_NOT_MASK_PRTY;
404514b24e2bSVaishali Kulkarni 		}
404614b24e2bSVaishali Kulkarni 	}
404714b24e2bSVaishali Kulkarni 
404814b24e2bSVaishali Kulkarni 	/* Dump modified registers (dumped before modifying them) */
404914b24e2bSVaishali Kulkarni 	if (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS))
405014b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_modified_regs(p_hwfn, p_ptt, dump_buf + offset, dump);
405114b24e2bSVaishali Kulkarni 
405214b24e2bSVaishali Kulkarni 	/* Stall storms */
405314b24e2bSVaishali Kulkarni 	if (dump && (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR) || ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)))
405414b24e2bSVaishali Kulkarni 		ecore_grc_stall_storms(p_hwfn, p_ptt, true);
405514b24e2bSVaishali Kulkarni 
405614b24e2bSVaishali Kulkarni 	/* Dump all regs  */
405714b24e2bSVaishali Kulkarni 	if (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_REGS)) {
405814b24e2bSVaishali Kulkarni 		bool block_enable[MAX_BLOCK_ID];
405914b24e2bSVaishali Kulkarni 
406014b24e2bSVaishali Kulkarni 		/* Dump all blocks except MCP */
406114b24e2bSVaishali Kulkarni 		for (i = 0; i < MAX_BLOCK_ID; i++)
406214b24e2bSVaishali Kulkarni 			block_enable[i] = true;
406314b24e2bSVaishali Kulkarni 		block_enable[BLOCK_MCP] = false;
406414b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_registers(p_hwfn, p_ptt, dump_buf + offset, dump, block_enable, OSAL_NULL, OSAL_NULL);
406514b24e2bSVaishali Kulkarni 
406614b24e2bSVaishali Kulkarni 		/* Dump special registers */
406714b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_special_regs(p_hwfn, p_ptt, dump_buf + offset, dump);
406814b24e2bSVaishali Kulkarni 	}
406914b24e2bSVaishali Kulkarni 
407014b24e2bSVaishali Kulkarni 	/* Dump memories */
407114b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_memories(p_hwfn, p_ptt, dump_buf + offset, dump);
407214b24e2bSVaishali Kulkarni 
407314b24e2bSVaishali Kulkarni 	/* Dump MCP */
407414b24e2bSVaishali Kulkarni 	if (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP))
407514b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_mcp(p_hwfn, p_ptt, dump_buf + offset, dump);
407614b24e2bSVaishali Kulkarni 
407714b24e2bSVaishali Kulkarni 	/* Dump context */
407814b24e2bSVaishali Kulkarni 	if (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX))
407914b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_ctx(p_hwfn, p_ptt, dump_buf + offset, dump);
408014b24e2bSVaishali Kulkarni 
408114b24e2bSVaishali Kulkarni 	/* Dump RSS memories */
408214b24e2bSVaishali Kulkarni 	if (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_RSS))
408314b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_rss(p_hwfn, p_ptt, dump_buf + offset, dump);
408414b24e2bSVaishali Kulkarni 
408514b24e2bSVaishali Kulkarni 	/* Dump Big RAM */
408614b24e2bSVaishali Kulkarni 	for (i = 0; i < NUM_BIG_RAM_TYPES; i++)
408714b24e2bSVaishali Kulkarni 		if (ecore_grc_is_included(p_hwfn, s_big_ram_defs[i].grc_param))
408814b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_big_ram(p_hwfn, p_ptt, dump_buf + offset, dump, i);
408914b24e2bSVaishali Kulkarni 
409014b24e2bSVaishali Kulkarni 	/* Dump IORs */
409114b24e2bSVaishali Kulkarni 	if (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR))
409214b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_iors(p_hwfn, p_ptt, dump_buf + offset, dump);
409314b24e2bSVaishali Kulkarni 
409414b24e2bSVaishali Kulkarni 	/* Dump VFC */
409514b24e2bSVaishali Kulkarni 	if (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC))
409614b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_vfc(p_hwfn, p_ptt, dump_buf + offset, dump);
409714b24e2bSVaishali Kulkarni 
409814b24e2bSVaishali Kulkarni 	/* Dump PHY tbus */
409914b24e2bSVaishali Kulkarni 	if (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_PHY) && dev_data->chip_id == CHIP_K2 && dev_data->platform_id == PLATFORM_ASIC)
410014b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_phy(p_hwfn, p_ptt, dump_buf + offset, dump);
410114b24e2bSVaishali Kulkarni 
410214b24e2bSVaishali Kulkarni 	/* Dump static debug data  */
410314b24e2bSVaishali Kulkarni 	if (ecore_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_STATIC) && dev_data->bus.state == DBG_BUS_STATE_IDLE)
410414b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_static_debug(p_hwfn, p_ptt, dump_buf + offset, dump);
410514b24e2bSVaishali Kulkarni 
410614b24e2bSVaishali Kulkarni 	/* Dump last section */
410714b24e2bSVaishali Kulkarni 	offset += ecore_dump_last_section(p_hwfn, dump_buf, offset, dump);
410814b24e2bSVaishali Kulkarni 
410914b24e2bSVaishali Kulkarni 	if (dump) {
411014b24e2bSVaishali Kulkarni 
411114b24e2bSVaishali Kulkarni 		/* Unstall storms */
411214b24e2bSVaishali Kulkarni 		if (ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_UNSTALL))
411314b24e2bSVaishali Kulkarni 			ecore_grc_stall_storms(p_hwfn, p_ptt, false);
411414b24e2bSVaishali Kulkarni 
411514b24e2bSVaishali Kulkarni 		/* Clear parity status */
411614b24e2bSVaishali Kulkarni 		if (!is_emul)
411714b24e2bSVaishali Kulkarni 			ecore_grc_clear_all_prty(p_hwfn, p_ptt);
411814b24e2bSVaishali Kulkarni 
411914b24e2bSVaishali Kulkarni 		/* Enable all parities using MFW command */
412014b24e2bSVaishali Kulkarni 		if (parities_masked)
412114b24e2bSVaishali Kulkarni 			ecore_mcp_mask_parities(p_hwfn, p_ptt, 0);
412214b24e2bSVaishali Kulkarni 	}
412314b24e2bSVaishali Kulkarni 
412414b24e2bSVaishali Kulkarni 	*num_dumped_dwords = offset;
412514b24e2bSVaishali Kulkarni 
412614b24e2bSVaishali Kulkarni 	;
412714b24e2bSVaishali Kulkarni 
412814b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
412914b24e2bSVaishali Kulkarni }
413014b24e2bSVaishali Kulkarni 
413114b24e2bSVaishali Kulkarni /* Writes the specified failing Idle Check rule to the specified buffer.
413214b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
413314b24e2bSVaishali Kulkarni  */
ecore_idle_chk_dump_failure(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u16 rule_id,const struct dbg_idle_chk_rule * rule,u16 fail_entry_id,u32 * cond_reg_values)413414b24e2bSVaishali Kulkarni static u32 ecore_idle_chk_dump_failure(struct ecore_hwfn *p_hwfn,
413514b24e2bSVaishali Kulkarni 									   struct ecore_ptt *p_ptt,
413614b24e2bSVaishali Kulkarni 									   u32 *dump_buf,
413714b24e2bSVaishali Kulkarni 									   bool dump,
413814b24e2bSVaishali Kulkarni 									   u16 rule_id,
413914b24e2bSVaishali Kulkarni 									   const struct dbg_idle_chk_rule *rule,
414014b24e2bSVaishali Kulkarni 									   u16 fail_entry_id,
414114b24e2bSVaishali Kulkarni 									   u32 *cond_reg_values)
414214b24e2bSVaishali Kulkarni {
414314b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
414414b24e2bSVaishali Kulkarni 	const struct dbg_idle_chk_cond_reg *cond_regs;
414514b24e2bSVaishali Kulkarni 	const struct dbg_idle_chk_info_reg *info_regs;
414614b24e2bSVaishali Kulkarni 	u32 i, next_reg_offset = 0, offset = 0;
414714b24e2bSVaishali Kulkarni 	struct dbg_idle_chk_result_hdr *hdr;
414814b24e2bSVaishali Kulkarni 	const union dbg_idle_chk_reg *regs;
414914b24e2bSVaishali Kulkarni 	u8 reg_id;
415014b24e2bSVaishali Kulkarni 
415114b24e2bSVaishali Kulkarni 	hdr = (struct dbg_idle_chk_result_hdr*)dump_buf;
415214b24e2bSVaishali Kulkarni 	regs = &((const union dbg_idle_chk_reg*)s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr)[rule->reg_offset];
415314b24e2bSVaishali Kulkarni 	cond_regs = &regs[0].cond_reg;
415414b24e2bSVaishali Kulkarni 	info_regs = &regs[rule->num_cond_regs].info_reg;
415514b24e2bSVaishali Kulkarni 
415614b24e2bSVaishali Kulkarni 	/* Dump rule data */
415714b24e2bSVaishali Kulkarni 	if (dump) {
415814b24e2bSVaishali Kulkarni 		OSAL_MEMSET(hdr, 0, sizeof(*hdr));
415914b24e2bSVaishali Kulkarni 		hdr->rule_id = rule_id;
416014b24e2bSVaishali Kulkarni 		hdr->mem_entry_id = fail_entry_id;
416114b24e2bSVaishali Kulkarni 		hdr->severity = rule->severity;
416214b24e2bSVaishali Kulkarni 		hdr->num_dumped_cond_regs = rule->num_cond_regs;
416314b24e2bSVaishali Kulkarni 	}
416414b24e2bSVaishali Kulkarni 
416514b24e2bSVaishali Kulkarni 	offset += IDLE_CHK_RESULT_HDR_DWORDS;
416614b24e2bSVaishali Kulkarni 
416714b24e2bSVaishali Kulkarni 	/* Dump condition register values */
416814b24e2bSVaishali Kulkarni 	for (reg_id = 0; reg_id < rule->num_cond_regs; reg_id++) {
416914b24e2bSVaishali Kulkarni 		const struct dbg_idle_chk_cond_reg *reg = &cond_regs[reg_id];
417014b24e2bSVaishali Kulkarni 		struct dbg_idle_chk_result_reg_hdr *reg_hdr;
417114b24e2bSVaishali Kulkarni 
417214b24e2bSVaishali Kulkarni 		reg_hdr = (struct dbg_idle_chk_result_reg_hdr*)(dump_buf + offset);
417314b24e2bSVaishali Kulkarni 
417414b24e2bSVaishali Kulkarni 		/* Write register header */
417514b24e2bSVaishali Kulkarni 		if (!dump) {
417614b24e2bSVaishali Kulkarni 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + reg->entry_size;
417714b24e2bSVaishali Kulkarni 			continue;
417814b24e2bSVaishali Kulkarni 		}
417914b24e2bSVaishali Kulkarni 
418014b24e2bSVaishali Kulkarni 		offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
418114b24e2bSVaishali Kulkarni 		OSAL_MEMSET(reg_hdr, 0, sizeof(*reg_hdr));
418214b24e2bSVaishali Kulkarni 		reg_hdr->start_entry = reg->start_entry;
418314b24e2bSVaishali Kulkarni 		reg_hdr->size = reg->entry_size;
418414b24e2bSVaishali Kulkarni 		SET_FIELD(reg_hdr->data, DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM, reg->num_entries > 1 || reg->start_entry > 0 ? 1 : 0);
418514b24e2bSVaishali Kulkarni 		SET_FIELD(reg_hdr->data, DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, reg_id);
418614b24e2bSVaishali Kulkarni 
418714b24e2bSVaishali Kulkarni 		/* Write register values */
418814b24e2bSVaishali Kulkarni 		for (i = 0; i < reg_hdr->size; i++, next_reg_offset++, offset++)
418914b24e2bSVaishali Kulkarni 			dump_buf[offset] = cond_reg_values[next_reg_offset];
419014b24e2bSVaishali Kulkarni 	}
419114b24e2bSVaishali Kulkarni 
419214b24e2bSVaishali Kulkarni 	/* Dump info register values */
419314b24e2bSVaishali Kulkarni 	for (reg_id = 0; reg_id < rule->num_info_regs; reg_id++) {
419414b24e2bSVaishali Kulkarni 		const struct dbg_idle_chk_info_reg *reg = &info_regs[reg_id];
419514b24e2bSVaishali Kulkarni 		u32 block_id;
419614b24e2bSVaishali Kulkarni 
419714b24e2bSVaishali Kulkarni 		/* Check if register's block is in reset */
419814b24e2bSVaishali Kulkarni 		if (!dump) {
419914b24e2bSVaishali Kulkarni 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS + reg->size;
420014b24e2bSVaishali Kulkarni 			continue;
420114b24e2bSVaishali Kulkarni 		}
420214b24e2bSVaishali Kulkarni 
420314b24e2bSVaishali Kulkarni 		block_id = GET_FIELD(reg->data, DBG_IDLE_CHK_INFO_REG_BLOCK_ID);
420414b24e2bSVaishali Kulkarni 		if (block_id >= MAX_BLOCK_ID) {
420514b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, true, "Invalid block_id\n");
420614b24e2bSVaishali Kulkarni 			return 0;
420714b24e2bSVaishali Kulkarni 		}
420814b24e2bSVaishali Kulkarni 
420914b24e2bSVaishali Kulkarni 		if (!dev_data->block_in_reset[block_id]) {
421014b24e2bSVaishali Kulkarni 			struct dbg_idle_chk_result_reg_hdr *reg_hdr;
421114b24e2bSVaishali Kulkarni 			bool wide_bus, eval_mode, mode_match = true;
421214b24e2bSVaishali Kulkarni 			u16 modes_buf_offset;
421314b24e2bSVaishali Kulkarni 			u32 addr;
421414b24e2bSVaishali Kulkarni 
421514b24e2bSVaishali Kulkarni 			reg_hdr = (struct dbg_idle_chk_result_reg_hdr*)(dump_buf + offset);
421614b24e2bSVaishali Kulkarni 
421714b24e2bSVaishali Kulkarni 			/* Check mode */
421814b24e2bSVaishali Kulkarni 			eval_mode = GET_FIELD(reg->mode.data, DBG_MODE_HDR_EVAL_MODE) > 0;
421914b24e2bSVaishali Kulkarni 			if (eval_mode) {
422014b24e2bSVaishali Kulkarni 				modes_buf_offset = GET_FIELD(reg->mode.data, DBG_MODE_HDR_MODES_BUF_OFFSET);
422114b24e2bSVaishali Kulkarni 				mode_match = ecore_is_mode_match(p_hwfn, &modes_buf_offset);
422214b24e2bSVaishali Kulkarni 			}
422314b24e2bSVaishali Kulkarni 
422414b24e2bSVaishali Kulkarni 			if (!mode_match)
422514b24e2bSVaishali Kulkarni 				continue;
422614b24e2bSVaishali Kulkarni 
422714b24e2bSVaishali Kulkarni 			addr = GET_FIELD(reg->data, DBG_IDLE_CHK_INFO_REG_ADDRESS);
422814b24e2bSVaishali Kulkarni 			wide_bus = GET_FIELD(reg->data, DBG_IDLE_CHK_INFO_REG_WIDE_BUS);
422914b24e2bSVaishali Kulkarni 
423014b24e2bSVaishali Kulkarni 			/* Write register header */
423114b24e2bSVaishali Kulkarni 			offset += IDLE_CHK_RESULT_REG_HDR_DWORDS;
423214b24e2bSVaishali Kulkarni 			hdr->num_dumped_info_regs++;
423314b24e2bSVaishali Kulkarni 			OSAL_MEMSET(reg_hdr, 0, sizeof(*reg_hdr));
423414b24e2bSVaishali Kulkarni 			reg_hdr->size = reg->size;
423514b24e2bSVaishali Kulkarni 			SET_FIELD(reg_hdr->data, DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID, rule->num_cond_regs + reg_id);
423614b24e2bSVaishali Kulkarni 
423714b24e2bSVaishali Kulkarni 			/* Write register values */
423814b24e2bSVaishali Kulkarni 			offset += ecore_grc_dump_addr_range(p_hwfn, p_ptt, dump_buf + offset, dump, addr, reg->size, wide_bus);
423914b24e2bSVaishali Kulkarni 		}
424014b24e2bSVaishali Kulkarni 	}
424114b24e2bSVaishali Kulkarni 
424214b24e2bSVaishali Kulkarni 	return offset;
424314b24e2bSVaishali Kulkarni }
424414b24e2bSVaishali Kulkarni 
424514b24e2bSVaishali Kulkarni /* Dumps idle check rule entries. Returns the dumped size in dwords. */
ecore_idle_chk_dump_rule_entries(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,const struct dbg_idle_chk_rule * input_rules,u32 num_input_rules,u32 * num_failing_rules)424614b24e2bSVaishali Kulkarni static u32 ecore_idle_chk_dump_rule_entries(struct ecore_hwfn *p_hwfn,
424714b24e2bSVaishali Kulkarni 											struct ecore_ptt *p_ptt,
424814b24e2bSVaishali Kulkarni 											u32 *dump_buf,
424914b24e2bSVaishali Kulkarni 											bool dump,
425014b24e2bSVaishali Kulkarni 											const struct dbg_idle_chk_rule *input_rules,
425114b24e2bSVaishali Kulkarni 											u32 num_input_rules,
425214b24e2bSVaishali Kulkarni 											u32 *num_failing_rules)
425314b24e2bSVaishali Kulkarni {
425414b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
425514b24e2bSVaishali Kulkarni 	u32 cond_reg_values[IDLE_CHK_MAX_ENTRIES_SIZE];
425614b24e2bSVaishali Kulkarni 	u32 i, offset = 0;
425714b24e2bSVaishali Kulkarni 	u16 entry_id;
425814b24e2bSVaishali Kulkarni 	u8 reg_id;
425914b24e2bSVaishali Kulkarni 
426014b24e2bSVaishali Kulkarni 	*num_failing_rules = 0;
426114b24e2bSVaishali Kulkarni 
426214b24e2bSVaishali Kulkarni 	for (i = 0; i < num_input_rules; i++) {
426314b24e2bSVaishali Kulkarni 		const struct dbg_idle_chk_cond_reg *cond_regs;
426414b24e2bSVaishali Kulkarni 		const struct dbg_idle_chk_rule *rule;
426514b24e2bSVaishali Kulkarni 		const union dbg_idle_chk_reg *regs;
426614b24e2bSVaishali Kulkarni 		u16 num_reg_entries = 1;
426714b24e2bSVaishali Kulkarni 		bool check_rule = true;
426814b24e2bSVaishali Kulkarni 		const u32 *imm_values;
426914b24e2bSVaishali Kulkarni 
427014b24e2bSVaishali Kulkarni 		rule = &input_rules[i];
427114b24e2bSVaishali Kulkarni 		regs = &((const union dbg_idle_chk_reg*)s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr)[rule->reg_offset];
427214b24e2bSVaishali Kulkarni 		cond_regs = &regs[0].cond_reg;
427314b24e2bSVaishali Kulkarni 		imm_values = &s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr[rule->imm_offset];
427414b24e2bSVaishali Kulkarni 
427514b24e2bSVaishali Kulkarni 		/* Check if all condition register blocks are out of reset, and
427614b24e2bSVaishali Kulkarni 		 * find maximal number of entries (all condition registers that
427714b24e2bSVaishali Kulkarni 		 * are memories must have the same size, which is > 1).
427814b24e2bSVaishali Kulkarni 		 */
427914b24e2bSVaishali Kulkarni 		for (reg_id = 0; reg_id < rule->num_cond_regs && check_rule; reg_id++) {
428014b24e2bSVaishali Kulkarni 			u32 block_id = GET_FIELD(cond_regs[reg_id].data, DBG_IDLE_CHK_COND_REG_BLOCK_ID);
428114b24e2bSVaishali Kulkarni 
428214b24e2bSVaishali Kulkarni 			if (block_id >= MAX_BLOCK_ID) {
428314b24e2bSVaishali Kulkarni 				DP_NOTICE(p_hwfn, true, "Invalid block_id\n");
428414b24e2bSVaishali Kulkarni 				return 0;
428514b24e2bSVaishali Kulkarni 			}
428614b24e2bSVaishali Kulkarni 
428714b24e2bSVaishali Kulkarni 			check_rule = !dev_data->block_in_reset[block_id];
428814b24e2bSVaishali Kulkarni 			if (cond_regs[reg_id].num_entries > num_reg_entries)
428914b24e2bSVaishali Kulkarni 				num_reg_entries = cond_regs[reg_id].num_entries;
429014b24e2bSVaishali Kulkarni 		}
429114b24e2bSVaishali Kulkarni 
429214b24e2bSVaishali Kulkarni 		if (!check_rule && dump)
429314b24e2bSVaishali Kulkarni 			continue;
429414b24e2bSVaishali Kulkarni 
429514b24e2bSVaishali Kulkarni 		/* Go over all register entries (number of entries is the same for all
429614b24e2bSVaishali Kulkarni 		 * condition registers).
429714b24e2bSVaishali Kulkarni 		 */
429814b24e2bSVaishali Kulkarni 		for (entry_id = 0; entry_id < num_reg_entries; entry_id++) {
429914b24e2bSVaishali Kulkarni 			u32 next_reg_offset = 0;
430014b24e2bSVaishali Kulkarni 
430114b24e2bSVaishali Kulkarni 			if (!dump) {
430214b24e2bSVaishali Kulkarni 				offset += ecore_idle_chk_dump_failure(p_hwfn, p_ptt, dump_buf + offset, false, rule->rule_id, rule, entry_id, OSAL_NULL);
430314b24e2bSVaishali Kulkarni 				(*num_failing_rules)++;
430414b24e2bSVaishali Kulkarni 				break;
430514b24e2bSVaishali Kulkarni 			}
430614b24e2bSVaishali Kulkarni 
430714b24e2bSVaishali Kulkarni 			/* Read current entry of all condition registers */
430814b24e2bSVaishali Kulkarni 			for (reg_id = 0; reg_id < rule->num_cond_regs; reg_id++) {
430914b24e2bSVaishali Kulkarni 				const struct dbg_idle_chk_cond_reg *reg = &cond_regs[reg_id];
431014b24e2bSVaishali Kulkarni 				u32 padded_entry_size, addr;
431114b24e2bSVaishali Kulkarni 				bool wide_bus;
431214b24e2bSVaishali Kulkarni 
431314b24e2bSVaishali Kulkarni 				/* Find GRC address (if it's a memory, the address of the
431414b24e2bSVaishali Kulkarni 				 * specific entry is calculated).
431514b24e2bSVaishali Kulkarni 				 */
431614b24e2bSVaishali Kulkarni 				addr = GET_FIELD(reg->data, DBG_IDLE_CHK_COND_REG_ADDRESS);
431714b24e2bSVaishali Kulkarni 				wide_bus = GET_FIELD(reg->data, DBG_IDLE_CHK_COND_REG_WIDE_BUS);
431814b24e2bSVaishali Kulkarni 				if (reg->num_entries > 1 || reg->start_entry > 0) {
431914b24e2bSVaishali Kulkarni 					padded_entry_size = reg->entry_size > 1 ? OSAL_ROUNDUP_POW_OF_TWO(reg->entry_size) : 1;
432014b24e2bSVaishali Kulkarni 					addr += (reg->start_entry + entry_id) * padded_entry_size;
432114b24e2bSVaishali Kulkarni 				}
432214b24e2bSVaishali Kulkarni 
432314b24e2bSVaishali Kulkarni 				/* Read registers */
432414b24e2bSVaishali Kulkarni 				if (next_reg_offset + reg->entry_size >= IDLE_CHK_MAX_ENTRIES_SIZE) {
432514b24e2bSVaishali Kulkarni 					DP_NOTICE(p_hwfn, true, "idle check registers entry is too large\n");
432614b24e2bSVaishali Kulkarni 					return 0;
432714b24e2bSVaishali Kulkarni 				}
432814b24e2bSVaishali Kulkarni 
432914b24e2bSVaishali Kulkarni 				next_reg_offset += ecore_grc_dump_addr_range(p_hwfn, p_ptt, cond_reg_values + next_reg_offset, dump, addr, reg->entry_size, wide_bus);
433014b24e2bSVaishali Kulkarni 			}
433114b24e2bSVaishali Kulkarni 
433214b24e2bSVaishali Kulkarni 			/* Call rule condition function. if returns true, it's a failure.*/
433314b24e2bSVaishali Kulkarni 			if ((*cond_arr[rule->cond_id])(cond_reg_values, imm_values)) {
433414b24e2bSVaishali Kulkarni 				offset += ecore_idle_chk_dump_failure(p_hwfn, p_ptt, dump_buf + offset, dump, rule->rule_id, rule, entry_id, cond_reg_values);
433514b24e2bSVaishali Kulkarni 				(*num_failing_rules)++;
433614b24e2bSVaishali Kulkarni 				break;
433714b24e2bSVaishali Kulkarni 			}
433814b24e2bSVaishali Kulkarni 		}
433914b24e2bSVaishali Kulkarni 	}
434014b24e2bSVaishali Kulkarni 
434114b24e2bSVaishali Kulkarni 	return offset;
434214b24e2bSVaishali Kulkarni }
434314b24e2bSVaishali Kulkarni 
434414b24e2bSVaishali Kulkarni /* Performs Idle Check Dump to the specified buffer.
434514b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
434614b24e2bSVaishali Kulkarni  */
ecore_idle_chk_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)434714b24e2bSVaishali Kulkarni static u32 ecore_idle_chk_dump(struct ecore_hwfn *p_hwfn,
434814b24e2bSVaishali Kulkarni 							   struct ecore_ptt *p_ptt,
434914b24e2bSVaishali Kulkarni 							   u32 *dump_buf,
435014b24e2bSVaishali Kulkarni 							   bool dump)
435114b24e2bSVaishali Kulkarni {
435214b24e2bSVaishali Kulkarni 	u32 num_failing_rules_offset, offset = 0, input_offset = 0, num_failing_rules = 0;
435314b24e2bSVaishali Kulkarni 
435414b24e2bSVaishali Kulkarni 	/* Dump global params */
435514b24e2bSVaishali Kulkarni 	offset += ecore_dump_common_global_params(p_hwfn, p_ptt, dump_buf + offset, dump, 1);
435614b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "dump-type", "idle-chk");
435714b24e2bSVaishali Kulkarni 
435814b24e2bSVaishali Kulkarni 	/* Dump idle check section header with a single parameter */
435914b24e2bSVaishali Kulkarni 	offset += ecore_dump_section_hdr(dump_buf + offset, dump, "idle_chk", 1);
436014b24e2bSVaishali Kulkarni 	num_failing_rules_offset = offset;
436114b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "num_rules", 0);
436214b24e2bSVaishali Kulkarni 
436314b24e2bSVaishali Kulkarni 	while (input_offset < s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].size_in_dwords) {
436414b24e2bSVaishali Kulkarni 		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++];
436514b24e2bSVaishali Kulkarni 		bool eval_mode, mode_match = true;
436614b24e2bSVaishali Kulkarni 		u32 curr_failing_rules;
436714b24e2bSVaishali Kulkarni 		u16 modes_buf_offset;
436814b24e2bSVaishali Kulkarni 
436914b24e2bSVaishali Kulkarni 		/* Check mode */
437014b24e2bSVaishali Kulkarni 		eval_mode = GET_FIELD(cond_hdr->mode.data, DBG_MODE_HDR_EVAL_MODE) > 0;
437114b24e2bSVaishali Kulkarni 		if (eval_mode) {
437214b24e2bSVaishali Kulkarni 			modes_buf_offset = GET_FIELD(cond_hdr->mode.data, DBG_MODE_HDR_MODES_BUF_OFFSET);
437314b24e2bSVaishali Kulkarni 			mode_match = ecore_is_mode_match(p_hwfn, &modes_buf_offset);
437414b24e2bSVaishali Kulkarni 		}
437514b24e2bSVaishali Kulkarni 
437614b24e2bSVaishali Kulkarni 		if (mode_match) {
437714b24e2bSVaishali Kulkarni 			offset += ecore_idle_chk_dump_rule_entries(p_hwfn, p_ptt, dump_buf + offset, dump, (const struct dbg_idle_chk_rule*)&s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr[input_offset], cond_hdr->data_size / IDLE_CHK_RULE_SIZE_DWORDS, &curr_failing_rules);
437814b24e2bSVaishali Kulkarni 			num_failing_rules += curr_failing_rules;
437914b24e2bSVaishali Kulkarni 		}
438014b24e2bSVaishali Kulkarni 
438114b24e2bSVaishali Kulkarni 		input_offset += cond_hdr->data_size;
438214b24e2bSVaishali Kulkarni 	}
438314b24e2bSVaishali Kulkarni 
438414b24e2bSVaishali Kulkarni 	/* Overwrite num_rules parameter */
438514b24e2bSVaishali Kulkarni 	if (dump)
438614b24e2bSVaishali Kulkarni 		ecore_dump_num_param(dump_buf + num_failing_rules_offset, dump, "num_rules", num_failing_rules);
438714b24e2bSVaishali Kulkarni 
438814b24e2bSVaishali Kulkarni 	/* Dump last section */
438914b24e2bSVaishali Kulkarni 	offset += ecore_dump_last_section(p_hwfn, dump_buf, offset, dump);
439014b24e2bSVaishali Kulkarni 
439114b24e2bSVaishali Kulkarni 	return offset;
439214b24e2bSVaishali Kulkarni }
439314b24e2bSVaishali Kulkarni 
439414b24e2bSVaishali Kulkarni /* Finds the meta data image in NVRAM */
ecore_find_nvram_image(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 image_type,u32 * nvram_offset_bytes,u32 * nvram_size_bytes)439514b24e2bSVaishali Kulkarni static enum dbg_status ecore_find_nvram_image(struct ecore_hwfn *p_hwfn,
439614b24e2bSVaishali Kulkarni 											  struct ecore_ptt *p_ptt,
439714b24e2bSVaishali Kulkarni 											  u32 image_type,
439814b24e2bSVaishali Kulkarni 											  u32 *nvram_offset_bytes,
439914b24e2bSVaishali Kulkarni 											  u32 *nvram_size_bytes)
440014b24e2bSVaishali Kulkarni {
440114b24e2bSVaishali Kulkarni 	u32 ret_mcp_resp, ret_mcp_param, ret_txn_size;
440214b24e2bSVaishali Kulkarni 	struct mcp_file_att file_att;
440314b24e2bSVaishali Kulkarni 	int nvm_result;
440414b24e2bSVaishali Kulkarni 
440514b24e2bSVaishali Kulkarni 	/* Call NVRAM get file command */
440614b24e2bSVaishali Kulkarni 	nvm_result = ecore_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);
440714b24e2bSVaishali Kulkarni 
440814b24e2bSVaishali Kulkarni 	/* Check response */
440914b24e2bSVaishali Kulkarni 	if (nvm_result || (ret_mcp_resp & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK)
441014b24e2bSVaishali Kulkarni 		return DBG_STATUS_NVRAM_GET_IMAGE_FAILED;
441114b24e2bSVaishali Kulkarni 
441214b24e2bSVaishali Kulkarni 	/* Update return values */
441314b24e2bSVaishali Kulkarni 	*nvram_offset_bytes = file_att.nvm_start_addr;
441414b24e2bSVaishali Kulkarni 	*nvram_size_bytes = file_att.len;
441514b24e2bSVaishali Kulkarni 
441614b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "find_nvram_image: found NVRAM image of type %d in NVRAM offset %d bytes with size %d bytes\n", image_type, *nvram_offset_bytes, *nvram_size_bytes);
441714b24e2bSVaishali Kulkarni 
441814b24e2bSVaishali Kulkarni 	/* Check alignment */
441914b24e2bSVaishali Kulkarni 	if (*nvram_size_bytes & 0x3)
442014b24e2bSVaishali Kulkarni 		return DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE;
442114b24e2bSVaishali Kulkarni 
442214b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
442314b24e2bSVaishali Kulkarni }
442414b24e2bSVaishali Kulkarni 
442514b24e2bSVaishali Kulkarni /* Reads data from NVRAM */
ecore_nvram_read(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 nvram_offset_bytes,u32 nvram_size_bytes,u32 * ret_buf)442614b24e2bSVaishali Kulkarni static enum dbg_status ecore_nvram_read(struct ecore_hwfn *p_hwfn,
442714b24e2bSVaishali Kulkarni 										struct ecore_ptt *p_ptt,
442814b24e2bSVaishali Kulkarni 										u32 nvram_offset_bytes,
442914b24e2bSVaishali Kulkarni 										u32 nvram_size_bytes,
443014b24e2bSVaishali Kulkarni 										u32 *ret_buf)
443114b24e2bSVaishali Kulkarni {
443214b24e2bSVaishali Kulkarni 	u32 ret_mcp_resp, ret_mcp_param, ret_read_size, bytes_to_copy;
443314b24e2bSVaishali Kulkarni 	s32 bytes_left = nvram_size_bytes;
443414b24e2bSVaishali Kulkarni 	u32 read_offset = 0;
443514b24e2bSVaishali Kulkarni 
443614b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "nvram_read: reading image of size %d bytes from NVRAM\n", nvram_size_bytes);
443714b24e2bSVaishali Kulkarni 
443814b24e2bSVaishali Kulkarni 	do {
443914b24e2bSVaishali Kulkarni 		bytes_to_copy = (bytes_left > MCP_DRV_NVM_BUF_LEN) ? MCP_DRV_NVM_BUF_LEN : bytes_left;
444014b24e2bSVaishali Kulkarni 
444114b24e2bSVaishali Kulkarni 		/* Call NVRAM read command */
444214b24e2bSVaishali Kulkarni 		if (ecore_mcp_nvm_rd_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_NVM_READ_NVRAM, (nvram_offset_bytes + read_offset) | (bytes_to_copy << DRV_MB_PARAM_NVM_LEN_SHIFT), &ret_mcp_resp, &ret_mcp_param, &ret_read_size, (u32*)((u8*)ret_buf + read_offset)))
444314b24e2bSVaishali Kulkarni 			return DBG_STATUS_NVRAM_READ_FAILED;
444414b24e2bSVaishali Kulkarni 
444514b24e2bSVaishali Kulkarni 		/* Check response */
444614b24e2bSVaishali Kulkarni 		if ((ret_mcp_resp  & FW_MSG_CODE_MASK) != FW_MSG_CODE_NVM_OK)
444714b24e2bSVaishali Kulkarni 			return DBG_STATUS_NVRAM_READ_FAILED;
444814b24e2bSVaishali Kulkarni 
444914b24e2bSVaishali Kulkarni 		/* Update read offset */
445014b24e2bSVaishali Kulkarni 		read_offset += ret_read_size;
445114b24e2bSVaishali Kulkarni 		bytes_left -= ret_read_size;
445214b24e2bSVaishali Kulkarni 	} while (bytes_left > 0);
445314b24e2bSVaishali Kulkarni 
445414b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
445514b24e2bSVaishali Kulkarni }
445614b24e2bSVaishali Kulkarni 
445714b24e2bSVaishali Kulkarni /* Get info on the MCP Trace data in the scratchpad:
445814b24e2bSVaishali Kulkarni  * - trace_data_grc_addr (OUT): trace data GRC address in bytes
445914b24e2bSVaishali Kulkarni  * - trace_data_size (OUT): trace data size in bytes (without the header)
446014b24e2bSVaishali Kulkarni  */
ecore_mcp_trace_get_data_info(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * trace_data_grc_addr,u32 * trace_data_size)446114b24e2bSVaishali Kulkarni static enum dbg_status ecore_mcp_trace_get_data_info(struct ecore_hwfn *p_hwfn,
446214b24e2bSVaishali Kulkarni 													 struct ecore_ptt *p_ptt,
446314b24e2bSVaishali Kulkarni 													 u32 *trace_data_grc_addr,
446414b24e2bSVaishali Kulkarni 													 u32 *trace_data_size)
446514b24e2bSVaishali Kulkarni {
446614b24e2bSVaishali Kulkarni 	u32 spad_trace_offsize, signature;
446714b24e2bSVaishali Kulkarni 
446814b24e2bSVaishali Kulkarni 	/* Read trace section offsize structure from MCP scratchpad */
446914b24e2bSVaishali Kulkarni 	spad_trace_offsize = ecore_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR);
447014b24e2bSVaishali Kulkarni 
447114b24e2bSVaishali Kulkarni 	/* Extract trace section address from offsize (in scratchpad) */
447214b24e2bSVaishali Kulkarni 	*trace_data_grc_addr = MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize);
447314b24e2bSVaishali Kulkarni 
447414b24e2bSVaishali Kulkarni 	/* Read signature from MCP trace section */
4475*04443fdeSToomas Soome 	signature = ecore_rd(p_hwfn, p_ptt, *trace_data_grc_addr + offsetof(struct mcp_trace, signature));
447614b24e2bSVaishali Kulkarni 
447714b24e2bSVaishali Kulkarni 	if (signature != MFW_TRACE_SIGNATURE)
447814b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
447914b24e2bSVaishali Kulkarni 
448014b24e2bSVaishali Kulkarni 	/* Read trace size from MCP trace section */
4481*04443fdeSToomas Soome 	*trace_data_size = ecore_rd(p_hwfn, p_ptt, *trace_data_grc_addr + offsetof(struct mcp_trace, size));
448214b24e2bSVaishali Kulkarni 
448314b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
448414b24e2bSVaishali Kulkarni }
448514b24e2bSVaishali Kulkarni 
448614b24e2bSVaishali Kulkarni /* Reads MCP trace meta data image from NVRAM
448714b24e2bSVaishali Kulkarni  * - running_bundle_id (OUT): running bundle ID (invalid when loaded from file)
448814b24e2bSVaishali Kulkarni  * - trace_meta_offset (OUT): trace meta offset in NVRAM in bytes (invalid when
448914b24e2bSVaishali Kulkarni  *			      loaded from file).
449014b24e2bSVaishali Kulkarni  * - trace_meta_size (OUT):   size in bytes of the trace meta data.
449114b24e2bSVaishali Kulkarni  */
ecore_mcp_trace_get_meta_info(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 trace_data_size_bytes,u32 * running_bundle_id,u32 * trace_meta_offset,u32 * trace_meta_size)449214b24e2bSVaishali Kulkarni static enum dbg_status ecore_mcp_trace_get_meta_info(struct ecore_hwfn *p_hwfn,
449314b24e2bSVaishali Kulkarni 													 struct ecore_ptt *p_ptt,
449414b24e2bSVaishali Kulkarni 													 u32 trace_data_size_bytes,
449514b24e2bSVaishali Kulkarni 													 u32 *running_bundle_id,
449614b24e2bSVaishali Kulkarni 													 u32 *trace_meta_offset,
449714b24e2bSVaishali Kulkarni 													 u32 *trace_meta_size)
449814b24e2bSVaishali Kulkarni {
449914b24e2bSVaishali Kulkarni 	u32 spad_trace_offsize, nvram_image_type, running_mfw_addr;
450014b24e2bSVaishali Kulkarni 
450114b24e2bSVaishali Kulkarni 	/* Read MCP trace section offsize structure from MCP scratchpad */
450214b24e2bSVaishali Kulkarni 	spad_trace_offsize = ecore_rd(p_hwfn, p_ptt, MCP_SPAD_TRACE_OFFSIZE_ADDR);
450314b24e2bSVaishali Kulkarni 
450414b24e2bSVaishali Kulkarni 	/* Find running bundle ID */
450514b24e2bSVaishali Kulkarni 	running_mfw_addr = MCP_REG_SCRATCH + SECTION_OFFSET(spad_trace_offsize) + SECTION_SIZE(spad_trace_offsize) + trace_data_size_bytes;
450614b24e2bSVaishali Kulkarni 	*running_bundle_id = ecore_rd(p_hwfn, p_ptt, running_mfw_addr);
450714b24e2bSVaishali Kulkarni 	if (*running_bundle_id > 1)
450814b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_NVRAM_BUNDLE;
450914b24e2bSVaishali Kulkarni 
451014b24e2bSVaishali Kulkarni 	/* Find image in NVRAM */
451114b24e2bSVaishali Kulkarni 	nvram_image_type = (*running_bundle_id == DIR_ID_1) ? NVM_TYPE_MFW_TRACE1 : NVM_TYPE_MFW_TRACE2;
451214b24e2bSVaishali Kulkarni 	return ecore_find_nvram_image(p_hwfn, p_ptt, nvram_image_type, trace_meta_offset, trace_meta_size);
451314b24e2bSVaishali Kulkarni }
451414b24e2bSVaishali Kulkarni 
451514b24e2bSVaishali Kulkarni /* Reads the MCP Trace meta data from NVRAM into the specified buffer */
ecore_mcp_trace_read_meta(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 nvram_offset_in_bytes,u32 size_in_bytes,u32 * buf)451614b24e2bSVaishali Kulkarni static enum dbg_status ecore_mcp_trace_read_meta(struct ecore_hwfn *p_hwfn,
451714b24e2bSVaishali Kulkarni 												 struct ecore_ptt *p_ptt,
451814b24e2bSVaishali Kulkarni 												 u32 nvram_offset_in_bytes,
451914b24e2bSVaishali Kulkarni 												 u32 size_in_bytes,
452014b24e2bSVaishali Kulkarni 												 u32 *buf)
452114b24e2bSVaishali Kulkarni {
452214b24e2bSVaishali Kulkarni 	u8 modules_num, module_len, i, *byte_buf = (u8*)buf;
452314b24e2bSVaishali Kulkarni 	enum dbg_status status;
452414b24e2bSVaishali Kulkarni 	u32 signature;
452514b24e2bSVaishali Kulkarni 
452614b24e2bSVaishali Kulkarni 	/* Read meta data from NVRAM */
452714b24e2bSVaishali Kulkarni 	status = ecore_nvram_read(p_hwfn, p_ptt, nvram_offset_in_bytes, size_in_bytes, buf);
452814b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
452914b24e2bSVaishali Kulkarni 		return status;
453014b24e2bSVaishali Kulkarni 
453114b24e2bSVaishali Kulkarni 	/* Extract and check first signature */
453214b24e2bSVaishali Kulkarni 	signature = ecore_read_unaligned_dword(byte_buf);
453314b24e2bSVaishali Kulkarni 	byte_buf += sizeof(signature);
453414b24e2bSVaishali Kulkarni 	if (signature != NVM_MAGIC_VALUE)
453514b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
453614b24e2bSVaishali Kulkarni 
453714b24e2bSVaishali Kulkarni 	/* Extract number of modules */
453814b24e2bSVaishali Kulkarni 	modules_num = *(byte_buf++);
453914b24e2bSVaishali Kulkarni 
454014b24e2bSVaishali Kulkarni 	/* Skip all modules */
454114b24e2bSVaishali Kulkarni 	for (i = 0; i < modules_num; i++) {
454214b24e2bSVaishali Kulkarni 		module_len = *(byte_buf++);
454314b24e2bSVaishali Kulkarni 		byte_buf += module_len;
454414b24e2bSVaishali Kulkarni 	}
454514b24e2bSVaishali Kulkarni 
454614b24e2bSVaishali Kulkarni 	/* Extract and check second signature */
454714b24e2bSVaishali Kulkarni 	signature = ecore_read_unaligned_dword(byte_buf);
454814b24e2bSVaishali Kulkarni 	byte_buf += sizeof(signature);
454914b24e2bSVaishali Kulkarni 	if (signature != NVM_MAGIC_VALUE)
455014b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_TRACE_SIGNATURE;
455114b24e2bSVaishali Kulkarni 
455214b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
455314b24e2bSVaishali Kulkarni }
455414b24e2bSVaishali Kulkarni 
455514b24e2bSVaishali Kulkarni /* Dump MCP Trace */
ecore_mcp_trace_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u32 * num_dumped_dwords)455614b24e2bSVaishali Kulkarni static enum dbg_status ecore_mcp_trace_dump(struct ecore_hwfn *p_hwfn,
455714b24e2bSVaishali Kulkarni 											struct ecore_ptt *p_ptt,
455814b24e2bSVaishali Kulkarni 											u32 *dump_buf,
455914b24e2bSVaishali Kulkarni 											bool dump,
456014b24e2bSVaishali Kulkarni 											u32 *num_dumped_dwords)
456114b24e2bSVaishali Kulkarni {
456214b24e2bSVaishali Kulkarni 	u32 trace_meta_offset_bytes = 0, trace_meta_size_bytes = 0, trace_meta_size_dwords = 0;
456314b24e2bSVaishali Kulkarni 	u32 trace_data_grc_addr, trace_data_size_bytes, trace_data_size_dwords;
456414b24e2bSVaishali Kulkarni 	u32 running_bundle_id, offset = 0;
456514b24e2bSVaishali Kulkarni 	enum dbg_status status;
456614b24e2bSVaishali Kulkarni 	bool mcp_access;
456714b24e2bSVaishali Kulkarni 	int halted = 0;
456814b24e2bSVaishali Kulkarni 
456914b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
457014b24e2bSVaishali Kulkarni 
457114b24e2bSVaishali Kulkarni 	mcp_access = !ecore_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP);
457214b24e2bSVaishali Kulkarni 
457314b24e2bSVaishali Kulkarni 	/* Get trace data info */
457414b24e2bSVaishali Kulkarni 	status = ecore_mcp_trace_get_data_info(p_hwfn, p_ptt, &trace_data_grc_addr, &trace_data_size_bytes);
457514b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
457614b24e2bSVaishali Kulkarni 		return status;
457714b24e2bSVaishali Kulkarni 
457814b24e2bSVaishali Kulkarni 	/* Dump global params */
457914b24e2bSVaishali Kulkarni 	offset += ecore_dump_common_global_params(p_hwfn, p_ptt, dump_buf + offset, dump, 1);
458014b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "dump-type", "mcp-trace");
458114b24e2bSVaishali Kulkarni 
458214b24e2bSVaishali Kulkarni 	/* Halt MCP while reading from scratchpad so the read data will be
458314b24e2bSVaishali Kulkarni 	 * consistent. if halt fails, MCP trace is taken anyway, with a small
458414b24e2bSVaishali Kulkarni 	 * risk that it may be corrupt.
458514b24e2bSVaishali Kulkarni 	 */
458614b24e2bSVaishali Kulkarni 	if (dump && mcp_access) {
458714b24e2bSVaishali Kulkarni 		halted = !ecore_mcp_halt(p_hwfn, p_ptt);
458814b24e2bSVaishali Kulkarni 		if (!halted)
458914b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, false, "MCP halt failed!\n");
459014b24e2bSVaishali Kulkarni 	}
459114b24e2bSVaishali Kulkarni 
459214b24e2bSVaishali Kulkarni 	/* Find trace data size */
459314b24e2bSVaishali Kulkarni 	trace_data_size_dwords = DIV_ROUND_UP(trace_data_size_bytes + sizeof(struct mcp_trace), BYTES_IN_DWORD);
459414b24e2bSVaishali Kulkarni 
459514b24e2bSVaishali Kulkarni 	/* Dump trace data section header and param */
459614b24e2bSVaishali Kulkarni 	offset += ecore_dump_section_hdr(dump_buf + offset, dump, "mcp_trace_data", 1);
459714b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "size", trace_data_size_dwords);
459814b24e2bSVaishali Kulkarni 
459914b24e2bSVaishali Kulkarni 	/* Read trace data from scratchpad into dump buffer */
460014b24e2bSVaishali Kulkarni 	offset += ecore_grc_dump_addr_range(p_hwfn, p_ptt, dump_buf + offset, dump, BYTES_TO_DWORDS(trace_data_grc_addr), trace_data_size_dwords, false);
460114b24e2bSVaishali Kulkarni 
460214b24e2bSVaishali Kulkarni 	/* Resume MCP (only if halt succeeded) */
460314b24e2bSVaishali Kulkarni 	if (halted && ecore_mcp_resume(p_hwfn, p_ptt))
460414b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, false, "Failed to resume MCP after halt!\n");
460514b24e2bSVaishali Kulkarni 
460614b24e2bSVaishali Kulkarni 	/* Dump trace meta section header */
460714b24e2bSVaishali Kulkarni 	offset += ecore_dump_section_hdr(dump_buf + offset, dump, "mcp_trace_meta", 1);
460814b24e2bSVaishali Kulkarni 
460914b24e2bSVaishali Kulkarni 	/* Read trace meta only if NVRAM access is enabled
461014b24e2bSVaishali Kulkarni 	 * (trace_meta_size_bytes is dword-aligned).
461114b24e2bSVaishali Kulkarni 	 */
461214b24e2bSVaishali Kulkarni 	if (OSAL_NVM_IS_ACCESS_ENABLED(p_hwfn) && mcp_access) {
461314b24e2bSVaishali Kulkarni 		status = ecore_mcp_trace_get_meta_info(p_hwfn, p_ptt, trace_data_size_bytes, &running_bundle_id, &trace_meta_offset_bytes, &trace_meta_size_bytes);
461414b24e2bSVaishali Kulkarni 		if (status == DBG_STATUS_OK)
461514b24e2bSVaishali Kulkarni 			trace_meta_size_dwords = BYTES_TO_DWORDS(trace_meta_size_bytes);
461614b24e2bSVaishali Kulkarni 	}
461714b24e2bSVaishali Kulkarni 
461814b24e2bSVaishali Kulkarni 	/* Dump trace meta size param */
461914b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "size", trace_meta_size_dwords);
462014b24e2bSVaishali Kulkarni 
462114b24e2bSVaishali Kulkarni 	/* Read trace meta image into dump buffer */
462214b24e2bSVaishali Kulkarni 	if (dump && trace_meta_size_dwords)
462314b24e2bSVaishali Kulkarni 		status = ecore_mcp_trace_read_meta(p_hwfn, p_ptt, trace_meta_offset_bytes, trace_meta_size_bytes, dump_buf + offset);
462414b24e2bSVaishali Kulkarni 	if (status == DBG_STATUS_OK)
462514b24e2bSVaishali Kulkarni 		offset += trace_meta_size_dwords;
462614b24e2bSVaishali Kulkarni 
462714b24e2bSVaishali Kulkarni 	/* Dump last section */
462814b24e2bSVaishali Kulkarni 	offset += ecore_dump_last_section(p_hwfn, dump_buf, offset, dump);
462914b24e2bSVaishali Kulkarni 
463014b24e2bSVaishali Kulkarni 	*num_dumped_dwords = offset;
463114b24e2bSVaishali Kulkarni 
463214b24e2bSVaishali Kulkarni 	/* If no mcp access, indicate that the dump doesn't contain the meta
463314b24e2bSVaishali Kulkarni 	 * data from NVRAM.
463414b24e2bSVaishali Kulkarni 	 */
463514b24e2bSVaishali Kulkarni 	return mcp_access ? status : DBG_STATUS_NVRAM_GET_IMAGE_FAILED;
463614b24e2bSVaishali Kulkarni }
463714b24e2bSVaishali Kulkarni 
463814b24e2bSVaishali Kulkarni /* Dump GRC FIFO */
ecore_reg_fifo_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u32 * num_dumped_dwords)463914b24e2bSVaishali Kulkarni static enum dbg_status ecore_reg_fifo_dump(struct ecore_hwfn *p_hwfn,
464014b24e2bSVaishali Kulkarni 										   struct ecore_ptt *p_ptt,
464114b24e2bSVaishali Kulkarni 										   u32 *dump_buf,
464214b24e2bSVaishali Kulkarni 										   bool dump,
464314b24e2bSVaishali Kulkarni 										   u32 *num_dumped_dwords)
464414b24e2bSVaishali Kulkarni {
464514b24e2bSVaishali Kulkarni 	u32 dwords_read, size_param_offset, offset = 0;
464614b24e2bSVaishali Kulkarni 	bool fifo_has_data;
464714b24e2bSVaishali Kulkarni 
464814b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
464914b24e2bSVaishali Kulkarni 
465014b24e2bSVaishali Kulkarni 	/* Dump global params */
465114b24e2bSVaishali Kulkarni 	offset += ecore_dump_common_global_params(p_hwfn, p_ptt, dump_buf + offset, dump, 1);
465214b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "dump-type", "reg-fifo");
465314b24e2bSVaishali Kulkarni 
465414b24e2bSVaishali Kulkarni 	/* Dump fifo data section header and param. The size param is 0 for
465514b24e2bSVaishali Kulkarni 	 * now, and is overwritten after reading the FIFO.
465614b24e2bSVaishali Kulkarni 	 */
465714b24e2bSVaishali Kulkarni 	offset += ecore_dump_section_hdr(dump_buf + offset, dump, "reg_fifo_data", 1);
465814b24e2bSVaishali Kulkarni 	size_param_offset = offset;
465914b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "size", 0);
466014b24e2bSVaishali Kulkarni 
466114b24e2bSVaishali Kulkarni 	if (dump) {
466214b24e2bSVaishali Kulkarni 		fifo_has_data = ecore_rd(p_hwfn, p_ptt, GRC_REG_TRACE_FIFO_VALID_DATA) > 0;
466314b24e2bSVaishali Kulkarni 
466414b24e2bSVaishali Kulkarni 		/* Pull available data from fifo. Use DMAE since this is
466514b24e2bSVaishali Kulkarni 		 * widebus memory and must be accessed atomically. Test for
466614b24e2bSVaishali Kulkarni 		 * dwords_read not passing buffer size since more entries could
466714b24e2bSVaishali Kulkarni 		 * be added to the buffer as we
466814b24e2bSVaishali Kulkarni 		 * are emptying it.
466914b24e2bSVaishali Kulkarni 		 */
467014b24e2bSVaishali Kulkarni 		for (dwords_read = 0; fifo_has_data && dwords_read < REG_FIFO_DEPTH_DWORDS; dwords_read += REG_FIFO_ELEMENT_DWORDS, offset += REG_FIFO_ELEMENT_DWORDS) {
467114b24e2bSVaishali Kulkarni 			if (ecore_dmae_grc2host(p_hwfn, p_ptt, GRC_REG_TRACE_FIFO, (u64)(osal_uintptr_t)(&dump_buf[offset]), REG_FIFO_ELEMENT_DWORDS, 0))
467214b24e2bSVaishali Kulkarni 				return DBG_STATUS_DMAE_FAILED;
467314b24e2bSVaishali Kulkarni 			fifo_has_data = ecore_rd(p_hwfn, p_ptt, GRC_REG_TRACE_FIFO_VALID_DATA) > 0;
467414b24e2bSVaishali Kulkarni 		}
467514b24e2bSVaishali Kulkarni 
467614b24e2bSVaishali Kulkarni 		ecore_dump_num_param(dump_buf + size_param_offset, dump, "size", dwords_read);
467714b24e2bSVaishali Kulkarni 	}
467814b24e2bSVaishali Kulkarni 	else {
467914b24e2bSVaishali Kulkarni 
468014b24e2bSVaishali Kulkarni 		/* FIFO max size is REG_FIFO_DEPTH_DWORDS. There is no way to
468114b24e2bSVaishali Kulkarni 		 * test how much data is available, except for reading it.
468214b24e2bSVaishali Kulkarni 		 */
468314b24e2bSVaishali Kulkarni 		offset += REG_FIFO_DEPTH_DWORDS;
468414b24e2bSVaishali Kulkarni 	}
468514b24e2bSVaishali Kulkarni 
468614b24e2bSVaishali Kulkarni 	/* Dump last section */
468714b24e2bSVaishali Kulkarni 	offset += ecore_dump_last_section(p_hwfn, dump_buf, offset, dump);
468814b24e2bSVaishali Kulkarni 
468914b24e2bSVaishali Kulkarni 	*num_dumped_dwords = offset;
469014b24e2bSVaishali Kulkarni 
469114b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
469214b24e2bSVaishali Kulkarni }
469314b24e2bSVaishali Kulkarni 
469414b24e2bSVaishali Kulkarni /* Dump IGU FIFO */
ecore_igu_fifo_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u32 * num_dumped_dwords)469514b24e2bSVaishali Kulkarni static enum dbg_status ecore_igu_fifo_dump(struct ecore_hwfn *p_hwfn,
469614b24e2bSVaishali Kulkarni 										   struct ecore_ptt *p_ptt,
469714b24e2bSVaishali Kulkarni 										   u32 *dump_buf,
469814b24e2bSVaishali Kulkarni 										   bool dump,
469914b24e2bSVaishali Kulkarni 										   u32 *num_dumped_dwords)
470014b24e2bSVaishali Kulkarni {
470114b24e2bSVaishali Kulkarni 	u32 dwords_read, size_param_offset, offset = 0;
470214b24e2bSVaishali Kulkarni 	bool fifo_has_data;
470314b24e2bSVaishali Kulkarni 
470414b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
470514b24e2bSVaishali Kulkarni 
470614b24e2bSVaishali Kulkarni 	/* Dump global params */
470714b24e2bSVaishali Kulkarni 	offset += ecore_dump_common_global_params(p_hwfn, p_ptt, dump_buf + offset, dump, 1);
470814b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "dump-type", "igu-fifo");
470914b24e2bSVaishali Kulkarni 
471014b24e2bSVaishali Kulkarni 	/* Dump fifo data section header and param. The size param is 0 for
471114b24e2bSVaishali Kulkarni 	 * now, and is overwritten after reading the FIFO.
471214b24e2bSVaishali Kulkarni 	 */
471314b24e2bSVaishali Kulkarni 	offset += ecore_dump_section_hdr(dump_buf + offset, dump, "igu_fifo_data", 1);
471414b24e2bSVaishali Kulkarni 	size_param_offset = offset;
471514b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "size", 0);
471614b24e2bSVaishali Kulkarni 
471714b24e2bSVaishali Kulkarni 	if (dump) {
471814b24e2bSVaishali Kulkarni 		fifo_has_data = ecore_rd(p_hwfn, p_ptt, IGU_REG_ERROR_HANDLING_DATA_VALID) > 0;
471914b24e2bSVaishali Kulkarni 
472014b24e2bSVaishali Kulkarni 		/* Pull available data from fifo. Use DMAE since this is
472114b24e2bSVaishali Kulkarni 		 * widebus memory and must be accessed atomically. Test for
472214b24e2bSVaishali Kulkarni 		 * dwords_read not passing buffer size since more entries could
472314b24e2bSVaishali Kulkarni 		 * be added to the buffer as we are emptying it.
472414b24e2bSVaishali Kulkarni 		 */
472514b24e2bSVaishali Kulkarni 		for (dwords_read = 0; fifo_has_data && dwords_read < IGU_FIFO_DEPTH_DWORDS; dwords_read += IGU_FIFO_ELEMENT_DWORDS, offset += IGU_FIFO_ELEMENT_DWORDS) {
472614b24e2bSVaishali Kulkarni 			if (ecore_dmae_grc2host(p_hwfn, p_ptt, IGU_REG_ERROR_HANDLING_MEMORY, (u64)(osal_uintptr_t)(&dump_buf[offset]), IGU_FIFO_ELEMENT_DWORDS, 0))
472714b24e2bSVaishali Kulkarni 				return DBG_STATUS_DMAE_FAILED;
472814b24e2bSVaishali Kulkarni 			fifo_has_data = ecore_rd(p_hwfn, p_ptt, IGU_REG_ERROR_HANDLING_DATA_VALID) > 0;
472914b24e2bSVaishali Kulkarni 		}
473014b24e2bSVaishali Kulkarni 
473114b24e2bSVaishali Kulkarni 		ecore_dump_num_param(dump_buf + size_param_offset, dump, "size", dwords_read);
473214b24e2bSVaishali Kulkarni 	}
473314b24e2bSVaishali Kulkarni 	else {
473414b24e2bSVaishali Kulkarni 
473514b24e2bSVaishali Kulkarni 		/* FIFO max size is IGU_FIFO_DEPTH_DWORDS. There is no way to
473614b24e2bSVaishali Kulkarni 		 * test how much data is available, except for reading it.
473714b24e2bSVaishali Kulkarni 		 */
473814b24e2bSVaishali Kulkarni 		offset += IGU_FIFO_DEPTH_DWORDS;
473914b24e2bSVaishali Kulkarni 	}
474014b24e2bSVaishali Kulkarni 
474114b24e2bSVaishali Kulkarni 	/* Dump last section */
474214b24e2bSVaishali Kulkarni 	offset += ecore_dump_last_section(p_hwfn, dump_buf, offset, dump);
474314b24e2bSVaishali Kulkarni 
474414b24e2bSVaishali Kulkarni 	*num_dumped_dwords = offset;
474514b24e2bSVaishali Kulkarni 
474614b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
474714b24e2bSVaishali Kulkarni }
474814b24e2bSVaishali Kulkarni 
474914b24e2bSVaishali Kulkarni /* Protection Override dump */
ecore_protection_override_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump,u32 * num_dumped_dwords)475014b24e2bSVaishali Kulkarni static enum dbg_status ecore_protection_override_dump(struct ecore_hwfn *p_hwfn,
475114b24e2bSVaishali Kulkarni 													  struct ecore_ptt *p_ptt,
475214b24e2bSVaishali Kulkarni 													  u32 *dump_buf,
475314b24e2bSVaishali Kulkarni 													  bool dump,
475414b24e2bSVaishali Kulkarni 													  u32 *num_dumped_dwords)
475514b24e2bSVaishali Kulkarni {
475614b24e2bSVaishali Kulkarni 	u32 size_param_offset, override_window_dwords, offset = 0;
475714b24e2bSVaishali Kulkarni 
475814b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
475914b24e2bSVaishali Kulkarni 
476014b24e2bSVaishali Kulkarni 	/* Dump global params */
476114b24e2bSVaishali Kulkarni 	offset += ecore_dump_common_global_params(p_hwfn, p_ptt, dump_buf + offset, dump, 1);
476214b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "dump-type", "protection-override");
476314b24e2bSVaishali Kulkarni 
476414b24e2bSVaishali Kulkarni 	/* Dump data section header and param. The size param is 0 for now,
476514b24e2bSVaishali Kulkarni 	 * and is overwritten after reading the data.
476614b24e2bSVaishali Kulkarni 	 */
476714b24e2bSVaishali Kulkarni 	offset += ecore_dump_section_hdr(dump_buf + offset, dump, "protection_override_data", 1);
476814b24e2bSVaishali Kulkarni 	size_param_offset = offset;
476914b24e2bSVaishali Kulkarni 	offset += ecore_dump_num_param(dump_buf + offset, dump, "size", 0);
477014b24e2bSVaishali Kulkarni 
477114b24e2bSVaishali Kulkarni 	if (dump) {
477214b24e2bSVaishali Kulkarni 		/* Add override window info to buffer */
477314b24e2bSVaishali Kulkarni 		override_window_dwords = ecore_rd(p_hwfn, p_ptt, GRC_REG_NUMBER_VALID_OVERRIDE_WINDOW) * PROTECTION_OVERRIDE_ELEMENT_DWORDS;
477414b24e2bSVaishali Kulkarni 		if (ecore_dmae_grc2host(p_hwfn, p_ptt, GRC_REG_PROTECTION_OVERRIDE_WINDOW, (u64)(osal_uintptr_t)(dump_buf + offset), override_window_dwords, 0))
477514b24e2bSVaishali Kulkarni 			return DBG_STATUS_DMAE_FAILED;
477614b24e2bSVaishali Kulkarni 		offset += override_window_dwords;
477714b24e2bSVaishali Kulkarni 		ecore_dump_num_param(dump_buf + size_param_offset, dump, "size", override_window_dwords);
477814b24e2bSVaishali Kulkarni 	}
477914b24e2bSVaishali Kulkarni 	else {
478014b24e2bSVaishali Kulkarni 		offset += PROTECTION_OVERRIDE_DEPTH_DWORDS;
478114b24e2bSVaishali Kulkarni 	}
478214b24e2bSVaishali Kulkarni 
478314b24e2bSVaishali Kulkarni 	/* Dump last section */
478414b24e2bSVaishali Kulkarni 	offset += ecore_dump_last_section(p_hwfn, dump_buf, offset, dump);
478514b24e2bSVaishali Kulkarni 
478614b24e2bSVaishali Kulkarni 	*num_dumped_dwords = offset;
478714b24e2bSVaishali Kulkarni 
478814b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
478914b24e2bSVaishali Kulkarni }
479014b24e2bSVaishali Kulkarni 
479114b24e2bSVaishali Kulkarni /* Performs FW Asserts Dump to the specified buffer.
479214b24e2bSVaishali Kulkarni  * Returns the dumped size in dwords.
479314b24e2bSVaishali Kulkarni  */
ecore_fw_asserts_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,bool dump)479414b24e2bSVaishali Kulkarni static u32 ecore_fw_asserts_dump(struct ecore_hwfn *p_hwfn,
479514b24e2bSVaishali Kulkarni 								 struct ecore_ptt *p_ptt,
479614b24e2bSVaishali Kulkarni 								 u32 *dump_buf,
479714b24e2bSVaishali Kulkarni 								 bool dump)
479814b24e2bSVaishali Kulkarni {
479914b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
480014b24e2bSVaishali Kulkarni 	struct fw_asserts_ram_section *asserts;
480114b24e2bSVaishali Kulkarni 	char storm_letter_str[2] = "?";
480214b24e2bSVaishali Kulkarni 	struct fw_info fw_info;
480314b24e2bSVaishali Kulkarni 	u32 offset = 0;
480414b24e2bSVaishali Kulkarni 	u8 storm_id;
480514b24e2bSVaishali Kulkarni 
480614b24e2bSVaishali Kulkarni 	/* Dump global params */
480714b24e2bSVaishali Kulkarni 	offset += ecore_dump_common_global_params(p_hwfn, p_ptt, dump_buf + offset, dump, 1);
480814b24e2bSVaishali Kulkarni 	offset += ecore_dump_str_param(dump_buf + offset, dump, "dump-type", "fw-asserts");
480914b24e2bSVaishali Kulkarni 
481014b24e2bSVaishali Kulkarni 	/* Find Storm dump size */
481114b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
481214b24e2bSVaishali Kulkarni 		u32 fw_asserts_section_addr, next_list_idx_addr, next_list_idx, last_list_idx, addr;
481314b24e2bSVaishali Kulkarni 		struct storm_defs *storm = &s_storm_defs[storm_id];
481414b24e2bSVaishali Kulkarni 
481514b24e2bSVaishali Kulkarni 		if (dev_data->block_in_reset[storm->block_id])
481614b24e2bSVaishali Kulkarni 			continue;
481714b24e2bSVaishali Kulkarni 
481814b24e2bSVaishali Kulkarni 		/* Read FW info for the current Storm  */
481914b24e2bSVaishali Kulkarni 		ecore_read_fw_info(p_hwfn, p_ptt, storm_id, &fw_info);
482014b24e2bSVaishali Kulkarni 
482114b24e2bSVaishali Kulkarni 		asserts = &fw_info.fw_asserts_section;
482214b24e2bSVaishali Kulkarni 
482314b24e2bSVaishali Kulkarni 		/* Dump FW Asserts section header and params */
482414b24e2bSVaishali Kulkarni 		storm_letter_str[0] = storm->letter;
482514b24e2bSVaishali Kulkarni 		offset += ecore_dump_section_hdr(dump_buf + offset, dump, "fw_asserts", 2);
482614b24e2bSVaishali Kulkarni 		offset += ecore_dump_str_param(dump_buf + offset, dump, "storm", storm_letter_str);
482714b24e2bSVaishali Kulkarni 		offset += ecore_dump_num_param(dump_buf + offset, dump, "size", asserts->list_element_dword_size);
482814b24e2bSVaishali Kulkarni 
482914b24e2bSVaishali Kulkarni 		/* Read and dump FW Asserts data */
483014b24e2bSVaishali Kulkarni 		if (!dump) {
483114b24e2bSVaishali Kulkarni 			offset += asserts->list_element_dword_size;
483214b24e2bSVaishali Kulkarni 			continue;
483314b24e2bSVaishali Kulkarni 		}
483414b24e2bSVaishali Kulkarni 
483514b24e2bSVaishali Kulkarni 		fw_asserts_section_addr = storm->sem_fast_mem_addr + SEM_FAST_REG_INT_RAM +
483614b24e2bSVaishali Kulkarni 			RAM_LINES_TO_BYTES(asserts->section_ram_line_offset);
483714b24e2bSVaishali Kulkarni 		next_list_idx_addr = fw_asserts_section_addr + DWORDS_TO_BYTES(asserts->list_next_index_dword_offset);
483814b24e2bSVaishali Kulkarni 		next_list_idx = ecore_rd(p_hwfn, p_ptt, next_list_idx_addr);
483914b24e2bSVaishali Kulkarni 		last_list_idx = (next_list_idx > 0 ? next_list_idx : asserts->list_num_elements) - 1;
484014b24e2bSVaishali Kulkarni 		addr = BYTES_TO_DWORDS(fw_asserts_section_addr) + asserts->list_dword_offset +
484114b24e2bSVaishali Kulkarni 					last_list_idx * asserts->list_element_dword_size;
484214b24e2bSVaishali Kulkarni 		offset += ecore_grc_dump_addr_range(p_hwfn, p_ptt, dump_buf + offset, dump, addr, asserts->list_element_dword_size, false);
484314b24e2bSVaishali Kulkarni 	}
484414b24e2bSVaishali Kulkarni 
484514b24e2bSVaishali Kulkarni 	/* Dump last section */
484614b24e2bSVaishali Kulkarni 	offset += ecore_dump_last_section(p_hwfn, dump_buf, offset, dump);
484714b24e2bSVaishali Kulkarni 
484814b24e2bSVaishali Kulkarni 	return offset;
484914b24e2bSVaishali Kulkarni }
485014b24e2bSVaishali Kulkarni 
485114b24e2bSVaishali Kulkarni /***************************** Public Functions *******************************/
485214b24e2bSVaishali Kulkarni 
ecore_dbg_set_bin_ptr(const u8 * const bin_ptr)485314b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_set_bin_ptr(const u8 * const bin_ptr)
485414b24e2bSVaishali Kulkarni {
485514b24e2bSVaishali Kulkarni 	struct bin_buffer_hdr *buf_array = (struct bin_buffer_hdr*)bin_ptr;
485614b24e2bSVaishali Kulkarni 	u8 buf_id;
485714b24e2bSVaishali Kulkarni 
485814b24e2bSVaishali Kulkarni 	/* convert binary data to debug arrays */
485914b24e2bSVaishali Kulkarni 	for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) {
486014b24e2bSVaishali Kulkarni 		s_dbg_arrays[buf_id].ptr = (u32*)(bin_ptr + buf_array[buf_id].offset);
486114b24e2bSVaishali Kulkarni 		s_dbg_arrays[buf_id].size_in_dwords = BYTES_TO_DWORDS(buf_array[buf_id].length);
486214b24e2bSVaishali Kulkarni 	}
486314b24e2bSVaishali Kulkarni 
486414b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
486514b24e2bSVaishali Kulkarni }
486614b24e2bSVaishali Kulkarni 
ecore_dbg_set_app_ver(u32 ver)486714b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_set_app_ver(u32 ver)
486814b24e2bSVaishali Kulkarni {
486914b24e2bSVaishali Kulkarni 	if (ver < TOOLS_VERSION)
487014b24e2bSVaishali Kulkarni 		return DBG_STATUS_UNSUPPORTED_APP_VERSION;
487114b24e2bSVaishali Kulkarni 
487214b24e2bSVaishali Kulkarni 	s_app_ver = ver;
487314b24e2bSVaishali Kulkarni 
487414b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
487514b24e2bSVaishali Kulkarni }
487614b24e2bSVaishali Kulkarni 
ecore_dbg_get_fw_func_ver(void)487714b24e2bSVaishali Kulkarni u32 ecore_dbg_get_fw_func_ver(void)
487814b24e2bSVaishali Kulkarni {
487914b24e2bSVaishali Kulkarni 	return TOOLS_VERSION;
488014b24e2bSVaishali Kulkarni }
488114b24e2bSVaishali Kulkarni 
ecore_dbg_get_chip_id(struct ecore_hwfn * p_hwfn)488214b24e2bSVaishali Kulkarni enum chip_ids ecore_dbg_get_chip_id(struct ecore_hwfn *p_hwfn)
488314b24e2bSVaishali Kulkarni {
488414b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
488514b24e2bSVaishali Kulkarni 
488614b24e2bSVaishali Kulkarni 	return (enum chip_ids)dev_data->chip_id;
488714b24e2bSVaishali Kulkarni }
488814b24e2bSVaishali Kulkarni 
ecore_dbg_bus_reset(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,bool one_shot_en,u8 force_hw_dwords,bool unify_inputs,bool grc_input_en)488914b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_reset(struct ecore_hwfn *p_hwfn,
489014b24e2bSVaishali Kulkarni 									struct ecore_ptt *p_ptt,
489114b24e2bSVaishali Kulkarni 									bool one_shot_en,
489214b24e2bSVaishali Kulkarni 									u8 force_hw_dwords,
489314b24e2bSVaishali Kulkarni 									bool unify_inputs,
489414b24e2bSVaishali Kulkarni 									bool grc_input_en)
489514b24e2bSVaishali Kulkarni {
489614b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
489714b24e2bSVaishali Kulkarni 	enum dbg_status status;
489814b24e2bSVaishali Kulkarni 
489914b24e2bSVaishali Kulkarni 	status = ecore_dbg_dev_init(p_hwfn, p_ptt);
490014b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
490114b24e2bSVaishali Kulkarni 		return status;
490214b24e2bSVaishali Kulkarni 
490314b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_reset: one_shot_en = %d, force_hw_dwords = %d, unify_inputs = %d, grc_input_en = %d\n", one_shot_en, force_hw_dwords, unify_inputs, grc_input_en);
490414b24e2bSVaishali Kulkarni 
490514b24e2bSVaishali Kulkarni 	if (force_hw_dwords &&
490614b24e2bSVaishali Kulkarni 		force_hw_dwords != 4 &&
490714b24e2bSVaishali Kulkarni 		force_hw_dwords != 8)
490814b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
490914b24e2bSVaishali Kulkarni 
491014b24e2bSVaishali Kulkarni 	if (ecore_rd(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON))
491114b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_BUS_IN_USE;
491214b24e2bSVaishali Kulkarni 
491314b24e2bSVaishali Kulkarni 	/* Update reset state of all blocks */
491414b24e2bSVaishali Kulkarni 	ecore_update_blocks_reset_state(p_hwfn, p_ptt);
491514b24e2bSVaishali Kulkarni 
491614b24e2bSVaishali Kulkarni 	/* Disable all debug inputs */
491714b24e2bSVaishali Kulkarni 	status = ecore_bus_disable_inputs(p_hwfn, p_ptt, false);
491814b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
491914b24e2bSVaishali Kulkarni 		return status;
492014b24e2bSVaishali Kulkarni 
492114b24e2bSVaishali Kulkarni 	/* Reset DBG block */
492214b24e2bSVaishali Kulkarni 	ecore_bus_reset_dbg_block(p_hwfn, p_ptt);
492314b24e2bSVaishali Kulkarni 
492414b24e2bSVaishali Kulkarni 	/* Set one-shot / wrap-around */
492514b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_FULL_MODE, one_shot_en ? 0 : 1);
492614b24e2bSVaishali Kulkarni 
492714b24e2bSVaishali Kulkarni 	/* Init state params */
492814b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&dev_data->bus, 0, sizeof(dev_data->bus));
492914b24e2bSVaishali Kulkarni 	dev_data->bus.target = DBG_BUS_TARGET_ID_INT_BUF;
493014b24e2bSVaishali Kulkarni 	dev_data->bus.state = DBG_BUS_STATE_READY;
493114b24e2bSVaishali Kulkarni 	dev_data->bus.one_shot_en = one_shot_en;
493214b24e2bSVaishali Kulkarni 	dev_data->bus.hw_dwords = force_hw_dwords;
493314b24e2bSVaishali Kulkarni 	dev_data->bus.grc_input_en = grc_input_en;
493414b24e2bSVaishali Kulkarni 	dev_data->bus.unify_inputs = unify_inputs;
493514b24e2bSVaishali Kulkarni 	dev_data->bus.num_enabled_blocks = grc_input_en ? 1 : 0;
493614b24e2bSVaishali Kulkarni 
493714b24e2bSVaishali Kulkarni 	/* Init special DBG block */
493814b24e2bSVaishali Kulkarni 	if (grc_input_en)
493914b24e2bSVaishali Kulkarni 		SET_FIELD(dev_data->bus.blocks[BLOCK_DBG].data, DBG_BUS_BLOCK_DATA_ENABLE_MASK, 0x1);
494014b24e2bSVaishali Kulkarni 
494114b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
494214b24e2bSVaishali Kulkarni }
494314b24e2bSVaishali Kulkarni 
ecore_dbg_bus_set_pci_output(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u16 buf_size_kb)494414b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_set_pci_output(struct ecore_hwfn *p_hwfn,
494514b24e2bSVaishali Kulkarni 											 struct ecore_ptt *p_ptt,
494614b24e2bSVaishali Kulkarni 											 u16 buf_size_kb)
494714b24e2bSVaishali Kulkarni {
494814b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
494914b24e2bSVaishali Kulkarni 	dma_addr_t pci_buf_phys_addr;
495014b24e2bSVaishali Kulkarni 	void *pci_buf;
495114b24e2bSVaishali Kulkarni 
495214b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_set_pci_output: buf_size_kb = %d\n", buf_size_kb);
495314b24e2bSVaishali Kulkarni 
495414b24e2bSVaishali Kulkarni 	if (dev_data->bus.target != DBG_BUS_TARGET_ID_INT_BUF)
495514b24e2bSVaishali Kulkarni 		return DBG_STATUS_OUTPUT_ALREADY_SET;
495614b24e2bSVaishali Kulkarni 	if (dev_data->bus.state != DBG_BUS_STATE_READY || dev_data->bus.pci_buf.size > 0)
495714b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_BLOCK_NOT_RESET;
495814b24e2bSVaishali Kulkarni 
495914b24e2bSVaishali Kulkarni 	dev_data->bus.target = DBG_BUS_TARGET_ID_PCI;
496014b24e2bSVaishali Kulkarni 	dev_data->bus.pci_buf.size = buf_size_kb * 1024;
496114b24e2bSVaishali Kulkarni 	if (dev_data->bus.pci_buf.size % PCI_PKT_SIZE_IN_BYTES)
496214b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
496314b24e2bSVaishali Kulkarni 
496414b24e2bSVaishali Kulkarni 	pci_buf = OSAL_DMA_ALLOC_COHERENT(p_hwfn->p_dev, &pci_buf_phys_addr, dev_data->bus.pci_buf.size);
496514b24e2bSVaishali Kulkarni 	if (!pci_buf)
496614b24e2bSVaishali Kulkarni 		return DBG_STATUS_PCI_BUF_ALLOC_FAILED;
496714b24e2bSVaishali Kulkarni 
496814b24e2bSVaishali Kulkarni 	OSAL_MEMCPY(&dev_data->bus.pci_buf.phys_addr, &pci_buf_phys_addr, sizeof(pci_buf_phys_addr));
496914b24e2bSVaishali Kulkarni 
497014b24e2bSVaishali Kulkarni 	dev_data->bus.pci_buf.virt_addr.lo = (u32)((u64)(osal_uintptr_t)pci_buf);
497114b24e2bSVaishali Kulkarni 	dev_data->bus.pci_buf.virt_addr.hi = (u32)((u64)(osal_uintptr_t)pci_buf >> 32);
497214b24e2bSVaishali Kulkarni 
497314b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_PCI_EXT_BUFFER_STRT_ADDR_LSB, dev_data->bus.pci_buf.phys_addr.lo);
497414b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_PCI_EXT_BUFFER_STRT_ADDR_MSB, dev_data->bus.pci_buf.phys_addr.hi);
497514b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TARGET_PACKET_SIZE, PCI_PKT_SIZE_IN_CHUNKS);
497614b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_PCI_EXT_BUFFER_SIZE, dev_data->bus.pci_buf.size / PCI_PKT_SIZE_IN_BYTES);
497714b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_PCI_FUNC_NUM, OPAQUE_FID(p_hwfn->rel_pf_id));
497814b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_PCI_LOGIC_ADDR, PCI_PHYS_ADDR_TYPE);
497914b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_PCI_REQ_CREDIT, PCI_REQ_CREDIT);
498014b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_DEBUG_TARGET, DBG_BUS_TARGET_ID_PCI);
498114b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_OUTPUT_ENABLE, TARGET_EN_MASK_PCI);
498214b24e2bSVaishali Kulkarni 
498314b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
498414b24e2bSVaishali Kulkarni }
498514b24e2bSVaishali Kulkarni 
ecore_dbg_bus_set_nw_output(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u8 port_id,u32 dest_addr_lo32,u16 dest_addr_hi16,u16 data_limit_size_kb,bool send_to_other_engine,bool rcv_from_other_engine)498614b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_set_nw_output(struct ecore_hwfn *p_hwfn,
498714b24e2bSVaishali Kulkarni 											struct ecore_ptt *p_ptt,
498814b24e2bSVaishali Kulkarni 											u8 port_id,
498914b24e2bSVaishali Kulkarni 											u32 dest_addr_lo32,
499014b24e2bSVaishali Kulkarni 											u16 dest_addr_hi16,
499114b24e2bSVaishali Kulkarni 											u16 data_limit_size_kb,
499214b24e2bSVaishali Kulkarni 											bool send_to_other_engine,
499314b24e2bSVaishali Kulkarni 											bool rcv_from_other_engine)
499414b24e2bSVaishali Kulkarni {
499514b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
499614b24e2bSVaishali Kulkarni 
499714b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_set_nw_output: port_id = %d, dest_addr_lo32 = 0x%x, dest_addr_hi16 = 0x%x, data_limit_size_kb = %d, send_to_other_engine = %d, rcv_from_other_engine = %d\n", port_id, dest_addr_lo32, dest_addr_hi16, data_limit_size_kb, send_to_other_engine, rcv_from_other_engine);
499814b24e2bSVaishali Kulkarni 
499914b24e2bSVaishali Kulkarni 	if (dev_data->bus.target != DBG_BUS_TARGET_ID_INT_BUF)
500014b24e2bSVaishali Kulkarni 		return DBG_STATUS_OUTPUT_ALREADY_SET;
500114b24e2bSVaishali Kulkarni 	if (dev_data->bus.state != DBG_BUS_STATE_READY)
500214b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_BLOCK_NOT_RESET;
500314b24e2bSVaishali Kulkarni 	if (port_id >= s_chip_defs[dev_data->chip_id].per_platform[dev_data->platform_id].num_ports || (send_to_other_engine && rcv_from_other_engine))
500414b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
500514b24e2bSVaishali Kulkarni 
500614b24e2bSVaishali Kulkarni 	dev_data->bus.target = DBG_BUS_TARGET_ID_NIG;
500714b24e2bSVaishali Kulkarni 	dev_data->bus.rcv_from_other_engine = rcv_from_other_engine;
500814b24e2bSVaishali Kulkarni 
500914b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_OUTPUT_ENABLE, TARGET_EN_MASK_NIG);
501014b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_DEBUG_TARGET, DBG_BUS_TARGET_ID_NIG);
501114b24e2bSVaishali Kulkarni 
501214b24e2bSVaishali Kulkarni 	if (send_to_other_engine)
501314b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_OTHER_ENGINE_MODE_BB_K2, DBG_BUS_OTHER_ENGINE_MODE_CROSS_ENGINE_TX);
501414b24e2bSVaishali Kulkarni 	else
501514b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, NIG_REG_DEBUG_PORT, port_id);
501614b24e2bSVaishali Kulkarni 
501714b24e2bSVaishali Kulkarni 	if (rcv_from_other_engine) {
501814b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_OTHER_ENGINE_MODE_BB_K2, DBG_BUS_OTHER_ENGINE_MODE_CROSS_ENGINE_RX);
501914b24e2bSVaishali Kulkarni 	}
502014b24e2bSVaishali Kulkarni 	else {
502114b24e2bSVaishali Kulkarni 
502214b24e2bSVaishali Kulkarni 		/* Configure ethernet header of 14 bytes */
502314b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_ETHERNET_HDR_WIDTH, 0);
502414b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_ETHERNET_HDR_7, dest_addr_lo32);
502514b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_ETHERNET_HDR_6, (u32)SRC_MAC_ADDR_LO16 | ((u32)dest_addr_hi16 << 16));
502614b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_ETHERNET_HDR_5, SRC_MAC_ADDR_HI32);
502714b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_ETHERNET_HDR_4, (u32)ETH_TYPE << 16);
502814b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_TARGET_PACKET_SIZE, NIG_PKT_SIZE_IN_CHUNKS);
502914b24e2bSVaishali Kulkarni 		if (data_limit_size_kb)
503014b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, DBG_REG_NIG_DATA_LIMIT_SIZE, (data_limit_size_kb * 1024) / CHUNK_SIZE_IN_BYTES);
503114b24e2bSVaishali Kulkarni 	}
503214b24e2bSVaishali Kulkarni 
503314b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
503414b24e2bSVaishali Kulkarni }
503514b24e2bSVaishali Kulkarni 
ecore_is_overlapping_enable_mask(struct ecore_hwfn * p_hwfn,u8 enable_mask,u8 right_shift)503614b24e2bSVaishali Kulkarni bool ecore_is_overlapping_enable_mask(struct ecore_hwfn *p_hwfn,
503714b24e2bSVaishali Kulkarni 									  u8 enable_mask,
503814b24e2bSVaishali Kulkarni 									  u8 right_shift)
503914b24e2bSVaishali Kulkarni {
504014b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
504114b24e2bSVaishali Kulkarni 	u8 curr_shifted_enable_mask, shifted_enable_mask;
504214b24e2bSVaishali Kulkarni 	u32 block_id;
504314b24e2bSVaishali Kulkarni 
504414b24e2bSVaishali Kulkarni 	shifted_enable_mask = SHR(enable_mask, VALUES_PER_CYCLE, right_shift);
504514b24e2bSVaishali Kulkarni 
504614b24e2bSVaishali Kulkarni 	if (dev_data->bus.num_enabled_blocks) {
504714b24e2bSVaishali Kulkarni 		for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
504814b24e2bSVaishali Kulkarni 			struct dbg_bus_block_data *block_bus = &dev_data->bus.blocks[block_id];
504914b24e2bSVaishali Kulkarni 
505014b24e2bSVaishali Kulkarni 			if (!GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK))
505114b24e2bSVaishali Kulkarni 				continue;
505214b24e2bSVaishali Kulkarni 
505314b24e2bSVaishali Kulkarni 			curr_shifted_enable_mask =
505414b24e2bSVaishali Kulkarni 				SHR(GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK),
505514b24e2bSVaishali Kulkarni 					VALUES_PER_CYCLE,
505614b24e2bSVaishali Kulkarni 					GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_RIGHT_SHIFT));
505714b24e2bSVaishali Kulkarni 			if (shifted_enable_mask & curr_shifted_enable_mask)
505814b24e2bSVaishali Kulkarni 				return true;
505914b24e2bSVaishali Kulkarni 		}
506014b24e2bSVaishali Kulkarni 	}
506114b24e2bSVaishali Kulkarni 
506214b24e2bSVaishali Kulkarni 	return false;
506314b24e2bSVaishali Kulkarni }
506414b24e2bSVaishali Kulkarni 
ecore_dbg_bus_enable_block(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,enum block_id block_id,u8 line_num,u8 enable_mask,u8 right_shift,u8 force_valid_mask,u8 force_frame_mask)506514b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_enable_block(struct ecore_hwfn *p_hwfn,
506614b24e2bSVaishali Kulkarni 										   struct ecore_ptt *p_ptt,
506714b24e2bSVaishali Kulkarni 										   enum block_id block_id,
506814b24e2bSVaishali Kulkarni 										   u8 line_num,
506914b24e2bSVaishali Kulkarni 										   u8 enable_mask,
507014b24e2bSVaishali Kulkarni 										   u8 right_shift,
507114b24e2bSVaishali Kulkarni 										   u8 force_valid_mask,
507214b24e2bSVaishali Kulkarni 										   u8 force_frame_mask)
507314b24e2bSVaishali Kulkarni {
507414b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
507514b24e2bSVaishali Kulkarni 	struct block_defs *block = s_block_defs[block_id];
507614b24e2bSVaishali Kulkarni 	struct dbg_bus_block_data *block_bus;
507714b24e2bSVaishali Kulkarni 	struct dbg_bus_block *block_desc;
507814b24e2bSVaishali Kulkarni 
507914b24e2bSVaishali Kulkarni 	block_bus = &dev_data->bus.blocks[block_id];
508014b24e2bSVaishali Kulkarni 	block_desc = get_dbg_bus_block_desc(p_hwfn, block_id);
508114b24e2bSVaishali Kulkarni 
508214b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_enable_block: block = %d, line_num = %d, enable_mask = 0x%x, right_shift = %d, force_valid_mask = 0x%x, force_frame_mask = 0x%x\n", block_id, line_num, enable_mask, right_shift, force_valid_mask, force_frame_mask);
508314b24e2bSVaishali Kulkarni 
508414b24e2bSVaishali Kulkarni 	if (dev_data->bus.state != DBG_BUS_STATE_READY)
508514b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_BLOCK_NOT_RESET;
508614b24e2bSVaishali Kulkarni 	if (block_id >= MAX_BLOCK_ID)
508714b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
508814b24e2bSVaishali Kulkarni 	if (GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK))
508914b24e2bSVaishali Kulkarni 		return DBG_STATUS_BLOCK_ALREADY_ENABLED;
509014b24e2bSVaishali Kulkarni 	if (!block->has_dbg_bus[dev_data->chip_id] ||
509114b24e2bSVaishali Kulkarni 		line_num >= NUM_DBG_LINES(block_desc) ||
509214b24e2bSVaishali Kulkarni 		!enable_mask ||
509314b24e2bSVaishali Kulkarni 		enable_mask > MAX_CYCLE_VALUES_MASK ||
509414b24e2bSVaishali Kulkarni 		force_valid_mask > MAX_CYCLE_VALUES_MASK ||
509514b24e2bSVaishali Kulkarni 		force_frame_mask > MAX_CYCLE_VALUES_MASK ||
509614b24e2bSVaishali Kulkarni 		right_shift > VALUES_PER_CYCLE - 1)
509714b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
509814b24e2bSVaishali Kulkarni 	if (dev_data->block_in_reset[block_id])
509914b24e2bSVaishali Kulkarni 		return DBG_STATUS_BLOCK_IN_RESET;
510014b24e2bSVaishali Kulkarni 	if (!dev_data->bus.unify_inputs && ecore_is_overlapping_enable_mask(p_hwfn, enable_mask, right_shift))
510114b24e2bSVaishali Kulkarni 		return DBG_STATUS_INPUT_OVERLAP;
510214b24e2bSVaishali Kulkarni 
510314b24e2bSVaishali Kulkarni 	dev_data->bus.blocks[block_id].line_num = line_num;
510414b24e2bSVaishali Kulkarni 	SET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK, enable_mask);
510514b24e2bSVaishali Kulkarni 	SET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_RIGHT_SHIFT, right_shift);
510614b24e2bSVaishali Kulkarni 	SET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_FORCE_VALID_MASK, force_valid_mask);
510714b24e2bSVaishali Kulkarni 	SET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_FORCE_FRAME_MASK, force_frame_mask);
510814b24e2bSVaishali Kulkarni 
510914b24e2bSVaishali Kulkarni 	dev_data->bus.num_enabled_blocks++;
511014b24e2bSVaishali Kulkarni 
511114b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
511214b24e2bSVaishali Kulkarni }
511314b24e2bSVaishali Kulkarni 
ecore_dbg_bus_enable_storm(struct ecore_hwfn * p_hwfn,enum dbg_storms storm,enum dbg_bus_storm_modes storm_mode)511414b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_enable_storm(struct ecore_hwfn *p_hwfn,
511514b24e2bSVaishali Kulkarni 										   enum dbg_storms storm,
511614b24e2bSVaishali Kulkarni 										   enum dbg_bus_storm_modes storm_mode)
511714b24e2bSVaishali Kulkarni {
511814b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
511914b24e2bSVaishali Kulkarni 
512014b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_enable_storm: storm = %d, storm_mode = %d\n", storm, storm_mode);
512114b24e2bSVaishali Kulkarni 
512214b24e2bSVaishali Kulkarni 	if (dev_data->bus.state != DBG_BUS_STATE_READY)
512314b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_BLOCK_NOT_RESET;
512414b24e2bSVaishali Kulkarni 	if (dev_data->bus.hw_dwords >= 4)
512514b24e2bSVaishali Kulkarni 		return DBG_STATUS_HW_ONLY_RECORDING;
512614b24e2bSVaishali Kulkarni 	if (storm >= MAX_DBG_STORMS)
512714b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
512814b24e2bSVaishali Kulkarni 	if (storm_mode >= MAX_DBG_BUS_STORM_MODES)
512914b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
513014b24e2bSVaishali Kulkarni 	if (dev_data->bus.unify_inputs)
513114b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
513214b24e2bSVaishali Kulkarni 
513314b24e2bSVaishali Kulkarni 	if (dev_data->bus.storms[storm].enabled)
513414b24e2bSVaishali Kulkarni 		return DBG_STATUS_STORM_ALREADY_ENABLED;
513514b24e2bSVaishali Kulkarni 
513614b24e2bSVaishali Kulkarni 	dev_data->bus.storms[storm].enabled = true;
513714b24e2bSVaishali Kulkarni 	dev_data->bus.storms[storm].mode = (u8)storm_mode;
513814b24e2bSVaishali Kulkarni 	dev_data->bus.storms[storm].hw_id = dev_data->bus.num_enabled_storms;
513914b24e2bSVaishali Kulkarni 
514014b24e2bSVaishali Kulkarni 	dev_data->bus.num_enabled_storms++;
514114b24e2bSVaishali Kulkarni 
514214b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
514314b24e2bSVaishali Kulkarni }
514414b24e2bSVaishali Kulkarni 
ecore_dbg_bus_enable_timestamp(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u8 valid_mask,u8 frame_mask,u32 tick_len)514514b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_enable_timestamp(struct ecore_hwfn *p_hwfn,
514614b24e2bSVaishali Kulkarni 											   struct ecore_ptt *p_ptt,
514714b24e2bSVaishali Kulkarni 											   u8 valid_mask,
514814b24e2bSVaishali Kulkarni 											   u8 frame_mask,
514914b24e2bSVaishali Kulkarni 											   u32 tick_len)
515014b24e2bSVaishali Kulkarni {
515114b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
515214b24e2bSVaishali Kulkarni 
515314b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_enable_timestamp: valid_mask = 0x%x, frame_mask = 0x%x, tick_len = %d\n", valid_mask, frame_mask, tick_len);
515414b24e2bSVaishali Kulkarni 
515514b24e2bSVaishali Kulkarni 	if (dev_data->bus.state != DBG_BUS_STATE_READY)
515614b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_BLOCK_NOT_RESET;
515714b24e2bSVaishali Kulkarni 	if (valid_mask > 0x7 || frame_mask > 0x7)
515814b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
515914b24e2bSVaishali Kulkarni 	if (!dev_data->bus.unify_inputs && ecore_is_overlapping_enable_mask(p_hwfn, 0x1, 0))
516014b24e2bSVaishali Kulkarni 		return DBG_STATUS_INPUT_OVERLAP;
516114b24e2bSVaishali Kulkarni 
516214b24e2bSVaishali Kulkarni 	dev_data->bus.timestamp_input_en = true;
516314b24e2bSVaishali Kulkarni 	dev_data->bus.num_enabled_blocks++;
516414b24e2bSVaishali Kulkarni 
516514b24e2bSVaishali Kulkarni 	SET_FIELD(dev_data->bus.blocks[BLOCK_DBG].data, DBG_BUS_BLOCK_DATA_ENABLE_MASK, 0x1);
516614b24e2bSVaishali Kulkarni 
516714b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TIMESTAMP_VALID_EN, valid_mask);
516814b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TIMESTAMP_FRAME_EN, frame_mask);
516914b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TIMESTAMP_TICK, tick_len);
517014b24e2bSVaishali Kulkarni 
517114b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
517214b24e2bSVaishali Kulkarni }
517314b24e2bSVaishali Kulkarni 
ecore_dbg_bus_add_eid_range_sem_filter(struct ecore_hwfn * p_hwfn,enum dbg_storms storm_id,u8 min_eid,u8 max_eid)517414b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_add_eid_range_sem_filter(struct ecore_hwfn *p_hwfn,
517514b24e2bSVaishali Kulkarni 													   enum dbg_storms storm_id,
517614b24e2bSVaishali Kulkarni 													   u8 min_eid,
517714b24e2bSVaishali Kulkarni 													   u8 max_eid)
517814b24e2bSVaishali Kulkarni {
517914b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
518014b24e2bSVaishali Kulkarni 	struct dbg_bus_storm_data *storm_bus;
518114b24e2bSVaishali Kulkarni 
518214b24e2bSVaishali Kulkarni 	storm_bus = &dev_data->bus.storms[storm_id];
518314b24e2bSVaishali Kulkarni 
518414b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_add_eid_range_sem_filter: storm = %d, min_eid = 0x%x, max_eid = 0x%x\n", storm_id, min_eid, max_eid);
518514b24e2bSVaishali Kulkarni 
518614b24e2bSVaishali Kulkarni 	if (storm_id >= MAX_DBG_STORMS)
518714b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
518814b24e2bSVaishali Kulkarni 	if (min_eid > max_eid)
518914b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
519014b24e2bSVaishali Kulkarni 	if (!storm_bus->enabled)
519114b24e2bSVaishali Kulkarni 		return DBG_STATUS_STORM_NOT_ENABLED;
519214b24e2bSVaishali Kulkarni 
519314b24e2bSVaishali Kulkarni 	storm_bus->eid_filter_en = 1;
519414b24e2bSVaishali Kulkarni 	storm_bus->eid_range_not_mask = 1;
519514b24e2bSVaishali Kulkarni 	storm_bus->eid_filter_params.range.min = min_eid;
519614b24e2bSVaishali Kulkarni 	storm_bus->eid_filter_params.range.max = max_eid;
519714b24e2bSVaishali Kulkarni 
519814b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
519914b24e2bSVaishali Kulkarni }
520014b24e2bSVaishali Kulkarni 
ecore_dbg_bus_add_eid_mask_sem_filter(struct ecore_hwfn * p_hwfn,enum dbg_storms storm_id,u8 eid_val,u8 eid_mask)520114b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_add_eid_mask_sem_filter(struct ecore_hwfn *p_hwfn,
520214b24e2bSVaishali Kulkarni 													  enum dbg_storms storm_id,
520314b24e2bSVaishali Kulkarni 													  u8 eid_val,
520414b24e2bSVaishali Kulkarni 													  u8 eid_mask)
520514b24e2bSVaishali Kulkarni {
520614b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
520714b24e2bSVaishali Kulkarni 	struct dbg_bus_storm_data *storm_bus;
520814b24e2bSVaishali Kulkarni 
520914b24e2bSVaishali Kulkarni 	storm_bus = &dev_data->bus.storms[storm_id];
521014b24e2bSVaishali Kulkarni 
521114b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_add_eid_mask_sem_filter: storm = %d, eid_val = 0x%x, eid_mask = 0x%x\n", storm_id, eid_val, eid_mask);
521214b24e2bSVaishali Kulkarni 
521314b24e2bSVaishali Kulkarni 	if (storm_id >= MAX_DBG_STORMS)
521414b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
521514b24e2bSVaishali Kulkarni 	if (!storm_bus->enabled)
521614b24e2bSVaishali Kulkarni 		return DBG_STATUS_STORM_NOT_ENABLED;
521714b24e2bSVaishali Kulkarni 
521814b24e2bSVaishali Kulkarni 	storm_bus->eid_filter_en = 1;
521914b24e2bSVaishali Kulkarni 	storm_bus->eid_range_not_mask = 0;
522014b24e2bSVaishali Kulkarni 	storm_bus->eid_filter_params.mask.val = eid_val;
522114b24e2bSVaishali Kulkarni 	storm_bus->eid_filter_params.mask.mask = eid_mask;
522214b24e2bSVaishali Kulkarni 
522314b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
522414b24e2bSVaishali Kulkarni }
522514b24e2bSVaishali Kulkarni 
ecore_dbg_bus_add_cid_sem_filter(struct ecore_hwfn * p_hwfn,enum dbg_storms storm_id,u32 cid)522614b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_add_cid_sem_filter(struct ecore_hwfn *p_hwfn,
522714b24e2bSVaishali Kulkarni 												 enum dbg_storms storm_id,
522814b24e2bSVaishali Kulkarni 												 u32 cid)
522914b24e2bSVaishali Kulkarni {
523014b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
523114b24e2bSVaishali Kulkarni 	struct dbg_bus_storm_data *storm_bus;
523214b24e2bSVaishali Kulkarni 
523314b24e2bSVaishali Kulkarni 	storm_bus = &dev_data->bus.storms[storm_id];
523414b24e2bSVaishali Kulkarni 
523514b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_add_cid_sem_filter: storm = %d, cid = 0x%x\n", storm_id, cid);
523614b24e2bSVaishali Kulkarni 
523714b24e2bSVaishali Kulkarni 	if (storm_id >= MAX_DBG_STORMS)
523814b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
523914b24e2bSVaishali Kulkarni 	if (!storm_bus->enabled)
524014b24e2bSVaishali Kulkarni 		return DBG_STATUS_STORM_NOT_ENABLED;
524114b24e2bSVaishali Kulkarni 
524214b24e2bSVaishali Kulkarni 	storm_bus->cid_filter_en = 1;
524314b24e2bSVaishali Kulkarni 	storm_bus->cid = cid;
524414b24e2bSVaishali Kulkarni 
524514b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
524614b24e2bSVaishali Kulkarni }
524714b24e2bSVaishali Kulkarni 
ecore_dbg_bus_enable_filter(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,enum block_id block_id,u8 const_msg_len)524814b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_enable_filter(struct ecore_hwfn *p_hwfn,
524914b24e2bSVaishali Kulkarni 											struct ecore_ptt *p_ptt,
525014b24e2bSVaishali Kulkarni 											enum block_id block_id,
525114b24e2bSVaishali Kulkarni 											u8 const_msg_len)
525214b24e2bSVaishali Kulkarni {
525314b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
525414b24e2bSVaishali Kulkarni 
525514b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_enable_filter: block = %d, const_msg_len = %d\n", block_id, const_msg_len);
525614b24e2bSVaishali Kulkarni 
525714b24e2bSVaishali Kulkarni 	if (dev_data->bus.state != DBG_BUS_STATE_READY)
525814b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_BLOCK_NOT_RESET;
525914b24e2bSVaishali Kulkarni 	if (dev_data->bus.filter_en)
526014b24e2bSVaishali Kulkarni 		return DBG_STATUS_FILTER_ALREADY_ENABLED;
526114b24e2bSVaishali Kulkarni 	if (block_id >= MAX_BLOCK_ID)
526214b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
526314b24e2bSVaishali Kulkarni 	if (!GET_FIELD(dev_data->bus.blocks[block_id].data, DBG_BUS_BLOCK_DATA_ENABLE_MASK))
526414b24e2bSVaishali Kulkarni 		return DBG_STATUS_BLOCK_NOT_ENABLED;
526514b24e2bSVaishali Kulkarni 	if (!dev_data->bus.unify_inputs)
526614b24e2bSVaishali Kulkarni 		return DBG_STATUS_FILTER_BUG;
526714b24e2bSVaishali Kulkarni 
526814b24e2bSVaishali Kulkarni 	dev_data->bus.filter_en = true;
526914b24e2bSVaishali Kulkarni 	dev_data->bus.next_constraint_id = 0;
527014b24e2bSVaishali Kulkarni 	dev_data->bus.adding_filter = true;
527114b24e2bSVaishali Kulkarni 
527214b24e2bSVaishali Kulkarni 	/* HW ID is set to 0 due to required unifyInputs */
527314b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_FILTER_ID_NUM, 0);
527414b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_FILTER_MSG_LENGTH_ENABLE, const_msg_len > 0 ? 1 : 0);
527514b24e2bSVaishali Kulkarni 	if (const_msg_len > 0)
527614b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_FILTER_MSG_LENGTH, const_msg_len - 1);
527714b24e2bSVaishali Kulkarni 
527814b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
527914b24e2bSVaishali Kulkarni }
528014b24e2bSVaishali Kulkarni 
ecore_dbg_bus_enable_trigger(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,bool rec_pre_trigger,u8 pre_chunks,bool rec_post_trigger,u32 post_cycles,bool filter_pre_trigger,bool filter_post_trigger)528114b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_enable_trigger(struct ecore_hwfn *p_hwfn,
528214b24e2bSVaishali Kulkarni 											 struct ecore_ptt *p_ptt,
528314b24e2bSVaishali Kulkarni 											 bool rec_pre_trigger,
528414b24e2bSVaishali Kulkarni 											 u8 pre_chunks,
528514b24e2bSVaishali Kulkarni 											 bool rec_post_trigger,
528614b24e2bSVaishali Kulkarni 											 u32 post_cycles,
528714b24e2bSVaishali Kulkarni 											 bool filter_pre_trigger,
528814b24e2bSVaishali Kulkarni 											 bool filter_post_trigger)
528914b24e2bSVaishali Kulkarni {
529014b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
529114b24e2bSVaishali Kulkarni 	enum dbg_bus_post_trigger_types post_trigger_type;
529214b24e2bSVaishali Kulkarni 	enum dbg_bus_pre_trigger_types pre_trigger_type;
529314b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
529414b24e2bSVaishali Kulkarni 
529514b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_enable_trigger: rec_pre_trigger = %d, pre_chunks = %d, rec_post_trigger = %d, post_cycles = %d, filter_pre_trigger = %d, filter_post_trigger = %d\n", rec_pre_trigger, pre_chunks, rec_post_trigger, post_cycles, filter_pre_trigger, filter_post_trigger);
529614b24e2bSVaishali Kulkarni 
529714b24e2bSVaishali Kulkarni 	if (bus->state != DBG_BUS_STATE_READY)
529814b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_BLOCK_NOT_RESET;
529914b24e2bSVaishali Kulkarni 	if (bus->trigger_en)
530014b24e2bSVaishali Kulkarni 		return DBG_STATUS_TRIGGER_ALREADY_ENABLED;
530114b24e2bSVaishali Kulkarni 	if (rec_pre_trigger && pre_chunks >= INT_BUF_SIZE_IN_CHUNKS)
530214b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
530314b24e2bSVaishali Kulkarni 
530414b24e2bSVaishali Kulkarni 	bus->trigger_en = true;
530514b24e2bSVaishali Kulkarni 	bus->filter_pre_trigger = filter_pre_trigger;
530614b24e2bSVaishali Kulkarni 	bus->filter_post_trigger = filter_post_trigger;
530714b24e2bSVaishali Kulkarni 
530814b24e2bSVaishali Kulkarni 	if (rec_pre_trigger) {
530914b24e2bSVaishali Kulkarni 		pre_trigger_type = pre_chunks ? DBG_BUS_PRE_TRIGGER_NUM_CHUNKS : DBG_BUS_PRE_TRIGGER_START_FROM_ZERO;
531014b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_RCRD_ON_WINDOW_PRE_NUM_CHUNKS, pre_chunks);
531114b24e2bSVaishali Kulkarni 	}
531214b24e2bSVaishali Kulkarni 	else {
531314b24e2bSVaishali Kulkarni 		pre_trigger_type = DBG_BUS_PRE_TRIGGER_DROP;
531414b24e2bSVaishali Kulkarni 	}
531514b24e2bSVaishali Kulkarni 
531614b24e2bSVaishali Kulkarni 	if (rec_post_trigger) {
531714b24e2bSVaishali Kulkarni 		post_trigger_type = DBG_BUS_POST_TRIGGER_RECORD;
531814b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_RCRD_ON_WINDOW_POST_NUM_CYCLES, post_cycles ? post_cycles : 0xffffffff);
531914b24e2bSVaishali Kulkarni 	}
532014b24e2bSVaishali Kulkarni 	else {
532114b24e2bSVaishali Kulkarni 		post_trigger_type = DBG_BUS_POST_TRIGGER_DROP;
532214b24e2bSVaishali Kulkarni 	}
532314b24e2bSVaishali Kulkarni 
532414b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_RCRD_ON_WINDOW_PRE_TRGR_EVNT_MODE, pre_trigger_type);
532514b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_RCRD_ON_WINDOW_POST_TRGR_EVNT_MODE, post_trigger_type);
532614b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TRIGGER_ENABLE, 1);
532714b24e2bSVaishali Kulkarni 
532814b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
532914b24e2bSVaishali Kulkarni }
533014b24e2bSVaishali Kulkarni 
ecore_dbg_bus_add_trigger_state(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,enum block_id block_id,u8 const_msg_len,u16 count_to_next)533114b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_add_trigger_state(struct ecore_hwfn *p_hwfn,
533214b24e2bSVaishali Kulkarni 												struct ecore_ptt *p_ptt,
533314b24e2bSVaishali Kulkarni 												enum block_id block_id,
533414b24e2bSVaishali Kulkarni 												u8 const_msg_len,
533514b24e2bSVaishali Kulkarni 												u16 count_to_next)
533614b24e2bSVaishali Kulkarni {
533714b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
533814b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
533914b24e2bSVaishali Kulkarni 	struct dbg_bus_block_data *block_bus;
534014b24e2bSVaishali Kulkarni 	u8 reg_offset;
534114b24e2bSVaishali Kulkarni 
534214b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_add_trigger_state: block = %d, const_msg_len = %d, count_to_next = %d\n", block_id, const_msg_len, count_to_next);
534314b24e2bSVaishali Kulkarni 
534414b24e2bSVaishali Kulkarni 	block_bus = &bus->blocks[block_id];
534514b24e2bSVaishali Kulkarni 
534614b24e2bSVaishali Kulkarni 	if (!bus->trigger_en)
534714b24e2bSVaishali Kulkarni 		return DBG_STATUS_TRIGGER_NOT_ENABLED;
534814b24e2bSVaishali Kulkarni 	if (bus->next_trigger_state == MAX_TRIGGER_STATES)
534914b24e2bSVaishali Kulkarni 		return DBG_STATUS_TOO_MANY_TRIGGER_STATES;
535014b24e2bSVaishali Kulkarni 	if (block_id >= MAX_BLOCK_ID)
535114b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
535214b24e2bSVaishali Kulkarni 	if (!GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK))
535314b24e2bSVaishali Kulkarni 		return DBG_STATUS_BLOCK_NOT_ENABLED;
535414b24e2bSVaishali Kulkarni 	if (!count_to_next)
535514b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
535614b24e2bSVaishali Kulkarni 
535714b24e2bSVaishali Kulkarni 	bus->next_constraint_id = 0;
535814b24e2bSVaishali Kulkarni 	bus->adding_filter = false;
535914b24e2bSVaishali Kulkarni 
536014b24e2bSVaishali Kulkarni 	/* Store block's shifted enable mask */
536114b24e2bSVaishali Kulkarni 	SET_FIELD(bus->trigger_states[dev_data->bus.next_trigger_state].data, DBG_BUS_TRIGGER_STATE_DATA_BLOCK_SHIFTED_ENABLE_MASK, SHR(GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK),
536214b24e2bSVaishali Kulkarni 					   VALUES_PER_CYCLE,
536314b24e2bSVaishali Kulkarni 					   GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_RIGHT_SHIFT)));
536414b24e2bSVaishali Kulkarni 
536514b24e2bSVaishali Kulkarni 	/* Set trigger state registers */
536614b24e2bSVaishali Kulkarni 	reg_offset = bus->next_trigger_state * BYTES_IN_DWORD;
536714b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TRIGGER_STATE_MSG_LENGTH_ENABLE_0 + reg_offset, const_msg_len > 0 ? 1 : 0);
536814b24e2bSVaishali Kulkarni 	if (const_msg_len > 0)
536914b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_TRIGGER_STATE_MSG_LENGTH_0 + reg_offset, const_msg_len - 1);
537014b24e2bSVaishali Kulkarni 
537114b24e2bSVaishali Kulkarni 	/* Set trigger set registers */
537214b24e2bSVaishali Kulkarni 	reg_offset = bus->next_trigger_state * TRIGGER_SETS_PER_STATE * BYTES_IN_DWORD;
537314b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TRIGGER_STATE_SET_COUNT_0 + reg_offset, count_to_next);
537414b24e2bSVaishali Kulkarni 
537514b24e2bSVaishali Kulkarni 	/* Set next state to final state, and overwrite previous next state
537614b24e2bSVaishali Kulkarni 	 * (if any).
537714b24e2bSVaishali Kulkarni 	 */
537814b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TRIGGER_STATE_SET_NXT_STATE_0 + reg_offset, MAX_TRIGGER_STATES);
537914b24e2bSVaishali Kulkarni 	if (bus->next_trigger_state > 0) {
538014b24e2bSVaishali Kulkarni 		reg_offset = (bus->next_trigger_state - 1) * TRIGGER_SETS_PER_STATE * BYTES_IN_DWORD;
538114b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_TRIGGER_STATE_SET_NXT_STATE_0 + reg_offset, bus->next_trigger_state);
538214b24e2bSVaishali Kulkarni 	}
538314b24e2bSVaishali Kulkarni 
538414b24e2bSVaishali Kulkarni 	bus->next_trigger_state++;
538514b24e2bSVaishali Kulkarni 
538614b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
538714b24e2bSVaishali Kulkarni }
538814b24e2bSVaishali Kulkarni 
ecore_dbg_bus_add_constraint(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,enum dbg_bus_constraint_ops constraint_op,u32 data_val,u32 data_mask,bool compare_frame,u8 frame_bit,u8 cycle_offset,u8 dword_offset_in_cycle,bool is_mandatory)538914b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_add_constraint(struct ecore_hwfn *p_hwfn,
539014b24e2bSVaishali Kulkarni 											 struct ecore_ptt *p_ptt,
539114b24e2bSVaishali Kulkarni 											 enum dbg_bus_constraint_ops constraint_op,
539214b24e2bSVaishali Kulkarni 											 u32 data_val,
539314b24e2bSVaishali Kulkarni 											 u32 data_mask,
539414b24e2bSVaishali Kulkarni 											 bool compare_frame,
539514b24e2bSVaishali Kulkarni 											 u8 frame_bit,
539614b24e2bSVaishali Kulkarni 											 u8 cycle_offset,
539714b24e2bSVaishali Kulkarni 											 u8 dword_offset_in_cycle,
539814b24e2bSVaishali Kulkarni 											 bool is_mandatory)
539914b24e2bSVaishali Kulkarni {
540014b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
540114b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
540214b24e2bSVaishali Kulkarni 	u16 dword_offset, range = 0;
540314b24e2bSVaishali Kulkarni 
540414b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_add_constraint: op = %d, data_val = 0x%x, data_mask = 0x%x, compare_frame = %d, frame_bit = %d, cycle_offset = %d, dword_offset_in_cycle = %d, is_mandatory = %d\n", constraint_op, data_val, data_mask, compare_frame, frame_bit, cycle_offset, dword_offset_in_cycle, is_mandatory);
540514b24e2bSVaishali Kulkarni 
540614b24e2bSVaishali Kulkarni 	if (!bus->filter_en && !dev_data->bus.trigger_en)
540714b24e2bSVaishali Kulkarni 		return DBG_STATUS_CANT_ADD_CONSTRAINT;
540814b24e2bSVaishali Kulkarni 	if (bus->trigger_en && !bus->adding_filter && !bus->next_trigger_state)
540914b24e2bSVaishali Kulkarni 		return DBG_STATUS_CANT_ADD_CONSTRAINT;
541014b24e2bSVaishali Kulkarni 	if (bus->next_constraint_id >= MAX_CONSTRAINTS)
541114b24e2bSVaishali Kulkarni 		return DBG_STATUS_TOO_MANY_CONSTRAINTS;
541214b24e2bSVaishali Kulkarni 	if (constraint_op >= MAX_DBG_BUS_CONSTRAINT_OPS || frame_bit > 1 || dword_offset_in_cycle > 3 || (bus->adding_filter && cycle_offset > 3))
541314b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
541414b24e2bSVaishali Kulkarni 	if (compare_frame &&
541514b24e2bSVaishali Kulkarni 		constraint_op != DBG_BUS_CONSTRAINT_OP_EQ &&
541614b24e2bSVaishali Kulkarni 		constraint_op != DBG_BUS_CONSTRAINT_OP_NE)
541714b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
541814b24e2bSVaishali Kulkarni 
541914b24e2bSVaishali Kulkarni 	dword_offset = cycle_offset * VALUES_PER_CYCLE + dword_offset_in_cycle;
542014b24e2bSVaishali Kulkarni 
542114b24e2bSVaishali Kulkarni 	if (!bus->adding_filter) {
542214b24e2bSVaishali Kulkarni 		u8 curr_trigger_state_id = bus->next_trigger_state - 1;
542314b24e2bSVaishali Kulkarni 		struct dbg_bus_trigger_state_data *trigger_state;
542414b24e2bSVaishali Kulkarni 
542514b24e2bSVaishali Kulkarni 		trigger_state = &bus->trigger_states[curr_trigger_state_id];
542614b24e2bSVaishali Kulkarni 
542714b24e2bSVaishali Kulkarni 		/* Check if the selected dword is enabled in the block */
542814b24e2bSVaishali Kulkarni 		if (!(GET_FIELD(trigger_state->data, DBG_BUS_TRIGGER_STATE_DATA_BLOCK_SHIFTED_ENABLE_MASK) & (u8)(1 << dword_offset_in_cycle)))
542914b24e2bSVaishali Kulkarni 			return DBG_STATUS_INVALID_TRIGGER_DWORD_OFFSET;
543014b24e2bSVaishali Kulkarni 
543114b24e2bSVaishali Kulkarni 		/* Add selected dword to trigger state's dword mask */
543214b24e2bSVaishali Kulkarni 		SET_FIELD(trigger_state->data, DBG_BUS_TRIGGER_STATE_DATA_CONSTRAINT_DWORD_MASK, GET_FIELD(trigger_state->data, DBG_BUS_TRIGGER_STATE_DATA_CONSTRAINT_DWORD_MASK) | (u8)(1 << dword_offset_in_cycle));
543314b24e2bSVaishali Kulkarni 	}
543414b24e2bSVaishali Kulkarni 
543514b24e2bSVaishali Kulkarni 	/* Prepare data mask and range */
543614b24e2bSVaishali Kulkarni 	if (constraint_op == DBG_BUS_CONSTRAINT_OP_EQ ||
543714b24e2bSVaishali Kulkarni 		constraint_op == DBG_BUS_CONSTRAINT_OP_NE) {
543814b24e2bSVaishali Kulkarni 		data_mask = ~data_mask;
543914b24e2bSVaishali Kulkarni 	}
544014b24e2bSVaishali Kulkarni 	else {
544114b24e2bSVaishali Kulkarni 		u8 lsb, width;
544214b24e2bSVaishali Kulkarni 
544314b24e2bSVaishali Kulkarni 		/* Extract lsb and width from mask */
544414b24e2bSVaishali Kulkarni 		if (!data_mask)
544514b24e2bSVaishali Kulkarni 			return DBG_STATUS_INVALID_ARGS;
544614b24e2bSVaishali Kulkarni 
544777b62fe4SToomas Soome 		for (lsb = 0; lsb < 32 && !(data_mask & 1); lsb++)
544877b62fe4SToomas Soome 			data_mask >>= 1;
544977b62fe4SToomas Soome 
545077b62fe4SToomas Soome 		for (width = 0; width < 32 - lsb && (data_mask & 1); width++)
545177b62fe4SToomas Soome 			data_mask >>= 1;
545277b62fe4SToomas Soome 		if (data_mask)
545377b62fe4SToomas Soome 			return DBG_STATUS_INVALID_ARGS;
545414b24e2bSVaishali Kulkarni 		range = (lsb << 5) | (width - 1);
545514b24e2bSVaishali Kulkarni 	}
545614b24e2bSVaishali Kulkarni 
545714b24e2bSVaishali Kulkarni 	/* Add constraint */
545814b24e2bSVaishali Kulkarni 	ecore_bus_set_constraint(p_hwfn, p_ptt, dev_data->bus.adding_filter ? 1 : 0,
545914b24e2bSVaishali Kulkarni 		dev_data->bus.next_constraint_id,
546014b24e2bSVaishali Kulkarni 		s_constraint_op_defs[constraint_op].hw_op_val,
546114b24e2bSVaishali Kulkarni 		data_val, data_mask, frame_bit,
546214b24e2bSVaishali Kulkarni 		compare_frame ? 0 : 1, dword_offset, range,
546314b24e2bSVaishali Kulkarni 		s_constraint_op_defs[constraint_op].is_cyclic ? 1 : 0,
546414b24e2bSVaishali Kulkarni 		is_mandatory ? 1 : 0);
546514b24e2bSVaishali Kulkarni 
546614b24e2bSVaishali Kulkarni 	/* If first constraint, fill other 3 constraints with dummy constraints
546714b24e2bSVaishali Kulkarni 	 * that always match (using the same offset).
546814b24e2bSVaishali Kulkarni 	 */
546914b24e2bSVaishali Kulkarni 	if (!dev_data->bus.next_constraint_id) {
547014b24e2bSVaishali Kulkarni 		u8 i;
547114b24e2bSVaishali Kulkarni 
547214b24e2bSVaishali Kulkarni 		for (i = 1; i < MAX_CONSTRAINTS; i++)
547314b24e2bSVaishali Kulkarni 			ecore_bus_set_constraint(p_hwfn, p_ptt, bus->adding_filter ? 1 : 0,
547414b24e2bSVaishali Kulkarni 				i, DBG_BUS_CONSTRAINT_OP_EQ, 0, 0xffffffff,
547514b24e2bSVaishali Kulkarni 				0, 1, dword_offset, 0, 0, 1);
547614b24e2bSVaishali Kulkarni 	}
547714b24e2bSVaishali Kulkarni 
547814b24e2bSVaishali Kulkarni 	bus->next_constraint_id++;
547914b24e2bSVaishali Kulkarni 
548014b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
548114b24e2bSVaishali Kulkarni }
548214b24e2bSVaishali Kulkarni 
548314b24e2bSVaishali Kulkarni /* Configure the DBG block client mask */
ecore_config_dbg_block_client_mask(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)548414b24e2bSVaishali Kulkarni void ecore_config_dbg_block_client_mask(struct ecore_hwfn *p_hwfn,
548514b24e2bSVaishali Kulkarni 										struct ecore_ptt *p_ptt)
548614b24e2bSVaishali Kulkarni {
548714b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
548814b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
548914b24e2bSVaishali Kulkarni 	u32 block_id, client_mask = 0;
549014b24e2bSVaishali Kulkarni 	u8 storm_id;
549114b24e2bSVaishali Kulkarni 
549214b24e2bSVaishali Kulkarni 	/* Update client mask for Storm inputs */
549314b24e2bSVaishali Kulkarni 	if (bus->num_enabled_storms)
549414b24e2bSVaishali Kulkarni 		for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
549514b24e2bSVaishali Kulkarni 			struct storm_defs *storm = &s_storm_defs[storm_id];
549614b24e2bSVaishali Kulkarni 
549714b24e2bSVaishali Kulkarni 			if (bus->storms[storm_id].enabled)
549814b24e2bSVaishali Kulkarni 				client_mask |= (1 << storm->dbg_client_id[dev_data->chip_id]);
549914b24e2bSVaishali Kulkarni 		}
550014b24e2bSVaishali Kulkarni 
550114b24e2bSVaishali Kulkarni 	/* Update client mask for block inputs */
550214b24e2bSVaishali Kulkarni 	if (bus->num_enabled_blocks) {
550314b24e2bSVaishali Kulkarni 		for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
550414b24e2bSVaishali Kulkarni 			struct dbg_bus_block_data *block_bus = &bus->blocks[block_id];
550514b24e2bSVaishali Kulkarni 			struct block_defs *block = s_block_defs[block_id];
550614b24e2bSVaishali Kulkarni 
550714b24e2bSVaishali Kulkarni 			if (GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK) && block_id != BLOCK_DBG)
550814b24e2bSVaishali Kulkarni 				client_mask |= (1 << block->dbg_client_id[dev_data->chip_id]);
550914b24e2bSVaishali Kulkarni 		}
551014b24e2bSVaishali Kulkarni 	}
551114b24e2bSVaishali Kulkarni 
551214b24e2bSVaishali Kulkarni 	/* Update client mask for GRC input */
551314b24e2bSVaishali Kulkarni 	if (bus->grc_input_en)
551414b24e2bSVaishali Kulkarni 		client_mask |= (1 << DBG_BUS_CLIENT_CPU);
551514b24e2bSVaishali Kulkarni 
551614b24e2bSVaishali Kulkarni 	/* Update client mask for timestamp input */
551714b24e2bSVaishali Kulkarni 	if (bus->timestamp_input_en)
551814b24e2bSVaishali Kulkarni 		client_mask |= (1 << DBG_BUS_CLIENT_TIMESTAMP);
551914b24e2bSVaishali Kulkarni 
552014b24e2bSVaishali Kulkarni 	ecore_bus_enable_clients(p_hwfn, p_ptt, client_mask);
552114b24e2bSVaishali Kulkarni }
552214b24e2bSVaishali Kulkarni 
552314b24e2bSVaishali Kulkarni /* Configure the DBG block framing mode */
ecore_config_dbg_block_framing_mode(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)552414b24e2bSVaishali Kulkarni enum dbg_status ecore_config_dbg_block_framing_mode(struct ecore_hwfn *p_hwfn,
552514b24e2bSVaishali Kulkarni 													struct ecore_ptt *p_ptt)
552614b24e2bSVaishali Kulkarni {
552714b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
552814b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
552914b24e2bSVaishali Kulkarni 	enum dbg_bus_frame_modes dbg_framing_mode;
553014b24e2bSVaishali Kulkarni 	u32 block_id;
553114b24e2bSVaishali Kulkarni 
553214b24e2bSVaishali Kulkarni 	if (!bus->hw_dwords && bus->num_enabled_blocks) {
553314b24e2bSVaishali Kulkarni 		struct dbg_bus_line *line_desc;
553414b24e2bSVaishali Kulkarni 		u8 hw_dwords;
553514b24e2bSVaishali Kulkarni 
553614b24e2bSVaishali Kulkarni 		/* Choose either 4 HW dwords (128-bit mode) or 8 HW dwords
553714b24e2bSVaishali Kulkarni 		 * (256-bit mode).
553814b24e2bSVaishali Kulkarni 		 */
553914b24e2bSVaishali Kulkarni 		for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
554014b24e2bSVaishali Kulkarni 			struct dbg_bus_block_data *block_bus = &bus->blocks[block_id];
554114b24e2bSVaishali Kulkarni 
554214b24e2bSVaishali Kulkarni 			if (!GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK))
554314b24e2bSVaishali Kulkarni 				continue;
554414b24e2bSVaishali Kulkarni 
554514b24e2bSVaishali Kulkarni 			line_desc = get_dbg_bus_line_desc(p_hwfn, (enum block_id)block_id);
554614b24e2bSVaishali Kulkarni 			hw_dwords = line_desc && GET_FIELD(line_desc->data, DBG_BUS_LINE_IS_256B) ? 8 : 4;
554714b24e2bSVaishali Kulkarni 
554814b24e2bSVaishali Kulkarni 			if (bus->hw_dwords > 0 && bus->hw_dwords != hw_dwords)
554914b24e2bSVaishali Kulkarni 				return DBG_STATUS_NON_MATCHING_LINES;
555014b24e2bSVaishali Kulkarni 
555114b24e2bSVaishali Kulkarni 			/* The DBG block doesn't support triggers and
555214b24e2bSVaishali Kulkarni 			 * filters on 256b debug lines.
555314b24e2bSVaishali Kulkarni 			 */
555414b24e2bSVaishali Kulkarni 			if (hw_dwords == 8 && (bus->trigger_en || bus->filter_en))
555514b24e2bSVaishali Kulkarni 				return DBG_STATUS_NO_FILTER_TRIGGER_64B;
555614b24e2bSVaishali Kulkarni 
555714b24e2bSVaishali Kulkarni 			bus->hw_dwords = hw_dwords;
555814b24e2bSVaishali Kulkarni 		}
555914b24e2bSVaishali Kulkarni 	}
556014b24e2bSVaishali Kulkarni 
556114b24e2bSVaishali Kulkarni 	switch (bus->hw_dwords) {
556214b24e2bSVaishali Kulkarni 	case 0: dbg_framing_mode = DBG_BUS_FRAME_MODE_0HW_4ST; break;
556314b24e2bSVaishali Kulkarni 	case 4: dbg_framing_mode = DBG_BUS_FRAME_MODE_4HW_0ST; break;
556414b24e2bSVaishali Kulkarni 	case 8: dbg_framing_mode = DBG_BUS_FRAME_MODE_8HW_0ST; break;
556514b24e2bSVaishali Kulkarni 	default: dbg_framing_mode = DBG_BUS_FRAME_MODE_0HW_4ST; break;
556614b24e2bSVaishali Kulkarni 	}
556714b24e2bSVaishali Kulkarni 	ecore_bus_set_framing_mode(p_hwfn, p_ptt, dbg_framing_mode);
556814b24e2bSVaishali Kulkarni 
556914b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
557014b24e2bSVaishali Kulkarni }
557114b24e2bSVaishali Kulkarni 
557214b24e2bSVaishali Kulkarni /* Configure the DBG block Storm data */
ecore_config_storm_inputs(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)557314b24e2bSVaishali Kulkarni enum dbg_status ecore_config_storm_inputs(struct ecore_hwfn *p_hwfn,
557414b24e2bSVaishali Kulkarni 										  struct ecore_ptt *p_ptt)
557514b24e2bSVaishali Kulkarni {
557614b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
557714b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
557814b24e2bSVaishali Kulkarni 	u8 storm_id, i, next_storm_id = 0;
557914b24e2bSVaishali Kulkarni 	u32 storm_id_mask = 0;
558014b24e2bSVaishali Kulkarni 
558114b24e2bSVaishali Kulkarni 	/* Check if SEMI sync FIFO is empty */
558214b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
558314b24e2bSVaishali Kulkarni 		struct dbg_bus_storm_data *storm_bus = &bus->storms[storm_id];
558414b24e2bSVaishali Kulkarni 		struct storm_defs *storm = &s_storm_defs[storm_id];
558514b24e2bSVaishali Kulkarni 
558614b24e2bSVaishali Kulkarni 		if (storm_bus->enabled && !ecore_rd(p_hwfn, p_ptt, storm->sem_sync_dbg_empty_addr))
558714b24e2bSVaishali Kulkarni 			return DBG_STATUS_SEMI_FIFO_NOT_EMPTY;
558814b24e2bSVaishali Kulkarni 	}
558914b24e2bSVaishali Kulkarni 
559014b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
559114b24e2bSVaishali Kulkarni 		struct dbg_bus_storm_data *storm_bus = &bus->storms[storm_id];
559214b24e2bSVaishali Kulkarni 
559314b24e2bSVaishali Kulkarni 		if (storm_bus->enabled)
559414b24e2bSVaishali Kulkarni 			storm_id_mask |= (storm_bus->hw_id << (storm_id * HW_ID_BITS));
559514b24e2bSVaishali Kulkarni 	}
559614b24e2bSVaishali Kulkarni 
559714b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_STORM_ID_NUM, storm_id_mask);
559814b24e2bSVaishali Kulkarni 
559914b24e2bSVaishali Kulkarni 	/* Disable storm stall if recording to internal buffer in one-shot */
560014b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_NO_GRANT_ON_FULL, (dev_data->bus.target == DBG_BUS_TARGET_ID_INT_BUF && bus->one_shot_en) ? 0 : 1);
560114b24e2bSVaishali Kulkarni 
560214b24e2bSVaishali Kulkarni 	/* Configure calendar */
560314b24e2bSVaishali Kulkarni 	for (i = 0; i < NUM_CALENDAR_SLOTS; i++, next_storm_id = (next_storm_id + 1) % MAX_DBG_STORMS) {
560414b24e2bSVaishali Kulkarni 
560514b24e2bSVaishali Kulkarni 		/* Find next enabled Storm */
560614b24e2bSVaishali Kulkarni 		for (; !dev_data->bus.storms[next_storm_id].enabled; next_storm_id = (next_storm_id + 1) % MAX_DBG_STORMS);
560714b24e2bSVaishali Kulkarni 
560814b24e2bSVaishali Kulkarni 		/* Configure calendar slot */
560914b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, DBG_REG_CALENDAR_SLOT0 + DWORDS_TO_BYTES(i), next_storm_id);
561014b24e2bSVaishali Kulkarni 	}
561114b24e2bSVaishali Kulkarni 
561214b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
561314b24e2bSVaishali Kulkarni }
561414b24e2bSVaishali Kulkarni 
561514b24e2bSVaishali Kulkarni /* Assign HW ID to each dword/qword:
561614b24e2bSVaishali Kulkarni  * if the inputs are unified, HW ID 0 is assigned to all dwords/qwords.
561714b24e2bSVaishali Kulkarni  * Otherwise, we would like to assign a different HW ID to each dword, to avoid
561814b24e2bSVaishali Kulkarni  * data synchronization issues. however, we need to check if there is a trigger
561914b24e2bSVaishali Kulkarni  * state for which more than one dword has a constraint. if there is, we cannot
562014b24e2bSVaishali Kulkarni  * assign a different HW ID to each dword (since a trigger state has a single
562114b24e2bSVaishali Kulkarni  * HW ID), so we assign a different HW ID to each block.
562214b24e2bSVaishali Kulkarni  */
ecore_assign_hw_ids(struct ecore_hwfn * p_hwfn,u8 hw_ids[VALUES_PER_CYCLE])562314b24e2bSVaishali Kulkarni void ecore_assign_hw_ids(struct ecore_hwfn *p_hwfn,
562414b24e2bSVaishali Kulkarni 						 u8 hw_ids[VALUES_PER_CYCLE])
562514b24e2bSVaishali Kulkarni {
562614b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
562714b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
562814b24e2bSVaishali Kulkarni 	bool hw_id_per_dword = true;
562914b24e2bSVaishali Kulkarni 	u8 val_id, state_id;
563014b24e2bSVaishali Kulkarni 	u32 block_id;
563114b24e2bSVaishali Kulkarni 
563214b24e2bSVaishali Kulkarni 	OSAL_MEMSET(hw_ids, 0, VALUES_PER_CYCLE);
563314b24e2bSVaishali Kulkarni 
563414b24e2bSVaishali Kulkarni 	if (bus->unify_inputs)
563514b24e2bSVaishali Kulkarni 		return;
563614b24e2bSVaishali Kulkarni 
563714b24e2bSVaishali Kulkarni 	if (bus->trigger_en) {
563814b24e2bSVaishali Kulkarni 		for (state_id = 0; state_id < bus->next_trigger_state && hw_id_per_dword; state_id++) {
563914b24e2bSVaishali Kulkarni 			u8 num_dwords = 0;
564014b24e2bSVaishali Kulkarni 
564114b24e2bSVaishali Kulkarni 			for (val_id = 0; val_id < VALUES_PER_CYCLE; val_id++)
564214b24e2bSVaishali Kulkarni 				if (GET_FIELD(bus->trigger_states[state_id].data, DBG_BUS_TRIGGER_STATE_DATA_CONSTRAINT_DWORD_MASK) & (1 << val_id))
564314b24e2bSVaishali Kulkarni 					num_dwords++;
564414b24e2bSVaishali Kulkarni 
564514b24e2bSVaishali Kulkarni 			if (num_dwords > 1)
564614b24e2bSVaishali Kulkarni 				hw_id_per_dword = false;
564714b24e2bSVaishali Kulkarni 		}
564814b24e2bSVaishali Kulkarni 	}
564914b24e2bSVaishali Kulkarni 
565014b24e2bSVaishali Kulkarni 	if (hw_id_per_dword) {
565114b24e2bSVaishali Kulkarni 
565214b24e2bSVaishali Kulkarni 		/* Assign a different HW ID for each dword */
565314b24e2bSVaishali Kulkarni 		for (val_id = 0; val_id < VALUES_PER_CYCLE; val_id++)
565414b24e2bSVaishali Kulkarni 			hw_ids[val_id] = val_id;
565514b24e2bSVaishali Kulkarni 	}
565614b24e2bSVaishali Kulkarni 	else {
565714b24e2bSVaishali Kulkarni 		u8 shifted_enable_mask, next_hw_id = 0;
565814b24e2bSVaishali Kulkarni 
565914b24e2bSVaishali Kulkarni 		/* Assign HW IDs according to blocks enable /  */
566014b24e2bSVaishali Kulkarni 		for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
566114b24e2bSVaishali Kulkarni 			struct dbg_bus_block_data *block_bus = &bus->blocks[block_id];
566214b24e2bSVaishali Kulkarni 
566314b24e2bSVaishali Kulkarni 			if (!GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK))
566414b24e2bSVaishali Kulkarni 				continue;
566514b24e2bSVaishali Kulkarni 
566614b24e2bSVaishali Kulkarni 			block_bus->hw_id = next_hw_id++;
566714b24e2bSVaishali Kulkarni 			if (!block_bus->hw_id)
566814b24e2bSVaishali Kulkarni 				continue;
566914b24e2bSVaishali Kulkarni 
567014b24e2bSVaishali Kulkarni 			shifted_enable_mask =
567114b24e2bSVaishali Kulkarni 				SHR(GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_ENABLE_MASK),
567214b24e2bSVaishali Kulkarni 					VALUES_PER_CYCLE,
567314b24e2bSVaishali Kulkarni 					GET_FIELD(block_bus->data, DBG_BUS_BLOCK_DATA_RIGHT_SHIFT));
567414b24e2bSVaishali Kulkarni 
567514b24e2bSVaishali Kulkarni 			for (val_id = 0; val_id < VALUES_PER_CYCLE; val_id++)
567614b24e2bSVaishali Kulkarni 				if (shifted_enable_mask & (1 << val_id))
567714b24e2bSVaishali Kulkarni 					hw_ids[val_id] = block_bus->hw_id;
567814b24e2bSVaishali Kulkarni 		}
567914b24e2bSVaishali Kulkarni 	}
568014b24e2bSVaishali Kulkarni }
568114b24e2bSVaishali Kulkarni 
568214b24e2bSVaishali Kulkarni /* Configure the DBG block HW blocks data */
ecore_config_block_inputs(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)568314b24e2bSVaishali Kulkarni void ecore_config_block_inputs(struct ecore_hwfn *p_hwfn,
568414b24e2bSVaishali Kulkarni 							   struct ecore_ptt *p_ptt)
568514b24e2bSVaishali Kulkarni {
568614b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
568714b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
568814b24e2bSVaishali Kulkarni 	u8 hw_ids[VALUES_PER_CYCLE];
568914b24e2bSVaishali Kulkarni 	u8 val_id, state_id;
569014b24e2bSVaishali Kulkarni 
569114b24e2bSVaishali Kulkarni 	ecore_assign_hw_ids(p_hwfn, hw_ids);
569214b24e2bSVaishali Kulkarni 
569314b24e2bSVaishali Kulkarni 	/* Assign a HW ID to each trigger state */
569414b24e2bSVaishali Kulkarni 	if (dev_data->bus.trigger_en) {
569514b24e2bSVaishali Kulkarni 		for (state_id = 0; state_id < bus->next_trigger_state; state_id++) {
569614b24e2bSVaishali Kulkarni 			for (val_id = 0; val_id < VALUES_PER_CYCLE; val_id++) {
569714b24e2bSVaishali Kulkarni 				u8 state_data = bus->trigger_states[state_id].data;
569814b24e2bSVaishali Kulkarni 
569914b24e2bSVaishali Kulkarni 				if (GET_FIELD(state_data, DBG_BUS_TRIGGER_STATE_DATA_CONSTRAINT_DWORD_MASK) & (1 << val_id)) {
570014b24e2bSVaishali Kulkarni 					ecore_wr(p_hwfn, p_ptt, DBG_REG_TRIGGER_STATE_ID_0 + state_id * BYTES_IN_DWORD, hw_ids[val_id]);
570114b24e2bSVaishali Kulkarni 					break;
570214b24e2bSVaishali Kulkarni 				}
570314b24e2bSVaishali Kulkarni 			}
570414b24e2bSVaishali Kulkarni 		}
570514b24e2bSVaishali Kulkarni 	}
570614b24e2bSVaishali Kulkarni 
570714b24e2bSVaishali Kulkarni 	/* Configure HW ID mask */
570814b24e2bSVaishali Kulkarni 	dev_data->bus.hw_id_mask = 0;
570914b24e2bSVaishali Kulkarni 	for (val_id = 0; val_id < VALUES_PER_CYCLE; val_id++)
571014b24e2bSVaishali Kulkarni 		bus->hw_id_mask |= (hw_ids[val_id] << (val_id * HW_ID_BITS));
571114b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_HW_ID_NUM, bus->hw_id_mask);
571214b24e2bSVaishali Kulkarni 
571314b24e2bSVaishali Kulkarni 	/* Configure additional K2 PCIE registers */
571414b24e2bSVaishali Kulkarni 	if (dev_data->chip_id == CHIP_K2 &&
571514b24e2bSVaishali Kulkarni 		(GET_FIELD(bus->blocks[BLOCK_PCIE].data, DBG_BUS_BLOCK_DATA_ENABLE_MASK) ||
571614b24e2bSVaishali Kulkarni 			GET_FIELD(bus->blocks[BLOCK_PHY_PCIE].data, DBG_BUS_BLOCK_DATA_ENABLE_MASK))) {
571714b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, PCIE_REG_DBG_REPEAT_THRESHOLD_COUNT_K2_E5, 1);
571814b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, PCIE_REG_DBG_FW_TRIGGER_ENABLE_K2_E5, 1);
571914b24e2bSVaishali Kulkarni 	}
572014b24e2bSVaishali Kulkarni }
572114b24e2bSVaishali Kulkarni 
ecore_dbg_bus_start(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)572214b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_start(struct ecore_hwfn *p_hwfn,
572314b24e2bSVaishali Kulkarni 									struct ecore_ptt *p_ptt)
572414b24e2bSVaishali Kulkarni {
572514b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
572614b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
572714b24e2bSVaishali Kulkarni 	enum dbg_bus_filter_types filter_type;
572814b24e2bSVaishali Kulkarni 	enum dbg_status status;
572914b24e2bSVaishali Kulkarni 	u32 block_id;
573014b24e2bSVaishali Kulkarni 	u8 storm_id;
573114b24e2bSVaishali Kulkarni 
573214b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_start\n");
573314b24e2bSVaishali Kulkarni 
573414b24e2bSVaishali Kulkarni 	if (bus->state != DBG_BUS_STATE_READY)
573514b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_BLOCK_NOT_RESET;
573614b24e2bSVaishali Kulkarni 
573714b24e2bSVaishali Kulkarni 	/* Check if any input was enabled */
573814b24e2bSVaishali Kulkarni 	if (!bus->num_enabled_storms &&
573914b24e2bSVaishali Kulkarni 		!bus->num_enabled_blocks &&
574014b24e2bSVaishali Kulkarni 		!bus->rcv_from_other_engine)
574114b24e2bSVaishali Kulkarni 		return DBG_STATUS_NO_INPUT_ENABLED;
574214b24e2bSVaishali Kulkarni 
574314b24e2bSVaishali Kulkarni 	/* Check if too many input types were enabled (storm+dbgmux) */
574414b24e2bSVaishali Kulkarni 	if (bus->num_enabled_storms && bus->num_enabled_blocks)
574514b24e2bSVaishali Kulkarni 		return DBG_STATUS_TOO_MANY_INPUTS;
574614b24e2bSVaishali Kulkarni 
574714b24e2bSVaishali Kulkarni 	/* Configure framing mode */
574814b24e2bSVaishali Kulkarni 	if ((status = ecore_config_dbg_block_framing_mode(p_hwfn, p_ptt)) != DBG_STATUS_OK)
574914b24e2bSVaishali Kulkarni 		return status;
575014b24e2bSVaishali Kulkarni 
575114b24e2bSVaishali Kulkarni 	/* Configure DBG block for Storm inputs */
575214b24e2bSVaishali Kulkarni 	if (bus->num_enabled_storms)
575314b24e2bSVaishali Kulkarni 		if ((status = ecore_config_storm_inputs(p_hwfn, p_ptt)) != DBG_STATUS_OK)
575414b24e2bSVaishali Kulkarni 			return status;
575514b24e2bSVaishali Kulkarni 
575614b24e2bSVaishali Kulkarni 	/* Configure DBG block for block inputs */
575714b24e2bSVaishali Kulkarni 	if (bus->num_enabled_blocks)
575814b24e2bSVaishali Kulkarni 		ecore_config_block_inputs(p_hwfn, p_ptt);
575914b24e2bSVaishali Kulkarni 
576014b24e2bSVaishali Kulkarni 	/* Configure filter type */
576114b24e2bSVaishali Kulkarni 	if (bus->filter_en) {
576214b24e2bSVaishali Kulkarni 		if (bus->trigger_en) {
576314b24e2bSVaishali Kulkarni 			if (bus->filter_pre_trigger)
576414b24e2bSVaishali Kulkarni 				filter_type = bus->filter_post_trigger ? DBG_BUS_FILTER_TYPE_ON : DBG_BUS_FILTER_TYPE_PRE;
576514b24e2bSVaishali Kulkarni 			else
576614b24e2bSVaishali Kulkarni 				filter_type = bus->filter_post_trigger ? DBG_BUS_FILTER_TYPE_POST : DBG_BUS_FILTER_TYPE_OFF;
576714b24e2bSVaishali Kulkarni 		}
576814b24e2bSVaishali Kulkarni 		else {
576914b24e2bSVaishali Kulkarni 			filter_type = DBG_BUS_FILTER_TYPE_ON;
577014b24e2bSVaishali Kulkarni 		}
577114b24e2bSVaishali Kulkarni 	}
577214b24e2bSVaishali Kulkarni 	else {
577314b24e2bSVaishali Kulkarni 		filter_type = DBG_BUS_FILTER_TYPE_OFF;
577414b24e2bSVaishali Kulkarni 	}
577514b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_FILTER_ENABLE, filter_type);
577614b24e2bSVaishali Kulkarni 
577714b24e2bSVaishali Kulkarni 	/* Restart timestamp */
577814b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_TIMESTAMP, 0);
577914b24e2bSVaishali Kulkarni 
578014b24e2bSVaishali Kulkarni 	/* Enable debug block */
578114b24e2bSVaishali Kulkarni 	ecore_bus_enable_dbg_block(p_hwfn, p_ptt, 1);
578214b24e2bSVaishali Kulkarni 
578314b24e2bSVaishali Kulkarni 	/* Configure enabled blocks - must be done before the DBG block is
578414b24e2bSVaishali Kulkarni 	 * enabled.
578514b24e2bSVaishali Kulkarni 	 */
578614b24e2bSVaishali Kulkarni 	if (dev_data->bus.num_enabled_blocks) {
578714b24e2bSVaishali Kulkarni 		for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
578814b24e2bSVaishali Kulkarni 			if (!GET_FIELD(dev_data->bus.blocks[block_id].data, DBG_BUS_BLOCK_DATA_ENABLE_MASK) || block_id == BLOCK_DBG)
578914b24e2bSVaishali Kulkarni 				continue;
579014b24e2bSVaishali Kulkarni 
579114b24e2bSVaishali Kulkarni 			ecore_config_dbg_line(p_hwfn, p_ptt, (enum block_id)block_id,
579214b24e2bSVaishali Kulkarni 				dev_data->bus.blocks[block_id].line_num,
579314b24e2bSVaishali Kulkarni 				GET_FIELD(dev_data->bus.blocks[block_id].data, DBG_BUS_BLOCK_DATA_ENABLE_MASK),
579414b24e2bSVaishali Kulkarni 				GET_FIELD(dev_data->bus.blocks[block_id].data, DBG_BUS_BLOCK_DATA_RIGHT_SHIFT),
579514b24e2bSVaishali Kulkarni 				GET_FIELD(dev_data->bus.blocks[block_id].data, DBG_BUS_BLOCK_DATA_FORCE_VALID_MASK),
579614b24e2bSVaishali Kulkarni 				GET_FIELD(dev_data->bus.blocks[block_id].data, DBG_BUS_BLOCK_DATA_FORCE_FRAME_MASK));
579714b24e2bSVaishali Kulkarni 		}
579814b24e2bSVaishali Kulkarni 	}
579914b24e2bSVaishali Kulkarni 
580014b24e2bSVaishali Kulkarni 	/* Configure client mask */
580114b24e2bSVaishali Kulkarni 	ecore_config_dbg_block_client_mask(p_hwfn, p_ptt);
580214b24e2bSVaishali Kulkarni 
580314b24e2bSVaishali Kulkarni 	/* Configure enabled Storms - must be done after the DBG block is
580414b24e2bSVaishali Kulkarni 	 * enabled.
580514b24e2bSVaishali Kulkarni 	 */
580614b24e2bSVaishali Kulkarni 	if (dev_data->bus.num_enabled_storms)
580714b24e2bSVaishali Kulkarni 		for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++)
580814b24e2bSVaishali Kulkarni 			if (dev_data->bus.storms[storm_id].enabled)
580914b24e2bSVaishali Kulkarni 				ecore_bus_enable_storm(p_hwfn, p_ptt, (enum dbg_storms)storm_id, filter_type);
581014b24e2bSVaishali Kulkarni 
581114b24e2bSVaishali Kulkarni 	dev_data->bus.state = DBG_BUS_STATE_RECORDING;
581214b24e2bSVaishali Kulkarni 
581314b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
581414b24e2bSVaishali Kulkarni }
581514b24e2bSVaishali Kulkarni 
ecore_dbg_bus_stop(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)581614b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_stop(struct ecore_hwfn *p_hwfn,
581714b24e2bSVaishali Kulkarni 								   struct ecore_ptt *p_ptt)
581814b24e2bSVaishali Kulkarni {
581914b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
582014b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
582114b24e2bSVaishali Kulkarni 	enum dbg_status status = DBG_STATUS_OK;
582214b24e2bSVaishali Kulkarni 
582314b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_stop\n");
582414b24e2bSVaishali Kulkarni 
582514b24e2bSVaishali Kulkarni 	if (bus->state != DBG_BUS_STATE_RECORDING)
582614b24e2bSVaishali Kulkarni 		return DBG_STATUS_RECORDING_NOT_STARTED;
582714b24e2bSVaishali Kulkarni 
582814b24e2bSVaishali Kulkarni 	status = ecore_bus_disable_inputs(p_hwfn, p_ptt, true);
582914b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
583014b24e2bSVaishali Kulkarni 		return status;
583114b24e2bSVaishali Kulkarni 
583214b24e2bSVaishali Kulkarni 	ecore_wr(p_hwfn, p_ptt, DBG_REG_CPU_TIMEOUT, 1);
583314b24e2bSVaishali Kulkarni 
583414b24e2bSVaishali Kulkarni 	OSAL_MSLEEP(FLUSH_DELAY_MS);
583514b24e2bSVaishali Kulkarni 
583614b24e2bSVaishali Kulkarni 	ecore_bus_enable_dbg_block(p_hwfn, p_ptt, false);
583714b24e2bSVaishali Kulkarni 
583814b24e2bSVaishali Kulkarni 	/* Check if trigger worked */
583914b24e2bSVaishali Kulkarni 	if (bus->trigger_en) {
584014b24e2bSVaishali Kulkarni 		u32 trigger_state = ecore_rd(p_hwfn, p_ptt, DBG_REG_TRIGGER_STATUS_CUR_STATE);
584114b24e2bSVaishali Kulkarni 
584214b24e2bSVaishali Kulkarni 		if (trigger_state != MAX_TRIGGER_STATES)
584314b24e2bSVaishali Kulkarni 			return DBG_STATUS_DATA_DIDNT_TRIGGER;
584414b24e2bSVaishali Kulkarni 	}
584514b24e2bSVaishali Kulkarni 
584614b24e2bSVaishali Kulkarni 	bus->state = DBG_BUS_STATE_STOPPED;
584714b24e2bSVaishali Kulkarni 
584814b24e2bSVaishali Kulkarni 	return status;
584914b24e2bSVaishali Kulkarni }
585014b24e2bSVaishali Kulkarni 
ecore_dbg_bus_get_dump_buf_size(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * buf_size)585114b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_get_dump_buf_size(struct ecore_hwfn *p_hwfn,
585214b24e2bSVaishali Kulkarni 												struct ecore_ptt *p_ptt,
585314b24e2bSVaishali Kulkarni 												u32 *buf_size)
585414b24e2bSVaishali Kulkarni {
585514b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
585614b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
585714b24e2bSVaishali Kulkarni 	enum dbg_status status;
585814b24e2bSVaishali Kulkarni 
585914b24e2bSVaishali Kulkarni 	status = ecore_dbg_dev_init(p_hwfn, p_ptt);
586014b24e2bSVaishali Kulkarni 
586114b24e2bSVaishali Kulkarni 	*buf_size = 0;
586214b24e2bSVaishali Kulkarni 
586314b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
586414b24e2bSVaishali Kulkarni 		return status;
586514b24e2bSVaishali Kulkarni 
586614b24e2bSVaishali Kulkarni 	/* Add dump header */
586714b24e2bSVaishali Kulkarni 	*buf_size = (u32)ecore_bus_dump_hdr(p_hwfn, p_ptt, OSAL_NULL, false);
586814b24e2bSVaishali Kulkarni 
586914b24e2bSVaishali Kulkarni 	switch (bus->target) {
587014b24e2bSVaishali Kulkarni 	case DBG_BUS_TARGET_ID_INT_BUF:
587114b24e2bSVaishali Kulkarni 		*buf_size += INT_BUF_SIZE_IN_DWORDS; break;
587214b24e2bSVaishali Kulkarni 	case DBG_BUS_TARGET_ID_PCI:
587314b24e2bSVaishali Kulkarni 		*buf_size += BYTES_TO_DWORDS(bus->pci_buf.size); break;
587414b24e2bSVaishali Kulkarni 	default:
587514b24e2bSVaishali Kulkarni 		break;
587614b24e2bSVaishali Kulkarni 	}
587714b24e2bSVaishali Kulkarni 
587814b24e2bSVaishali Kulkarni 	/* Dump last section */
587914b24e2bSVaishali Kulkarni 	*buf_size += ecore_dump_last_section(p_hwfn, OSAL_NULL, 0, false);
588014b24e2bSVaishali Kulkarni 
588114b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
588214b24e2bSVaishali Kulkarni }
588314b24e2bSVaishali Kulkarni 
ecore_dbg_bus_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)588414b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_bus_dump(struct ecore_hwfn *p_hwfn,
588514b24e2bSVaishali Kulkarni 								   struct ecore_ptt *p_ptt,
588614b24e2bSVaishali Kulkarni 								   u32 *dump_buf,
588714b24e2bSVaishali Kulkarni 								   u32 buf_size_in_dwords,
588814b24e2bSVaishali Kulkarni 								   u32 *num_dumped_dwords)
588914b24e2bSVaishali Kulkarni {
589014b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
589114b24e2bSVaishali Kulkarni 	u32 min_buf_size_in_dwords, block_id, offset = 0;
589214b24e2bSVaishali Kulkarni 	struct dbg_bus_data *bus = &dev_data->bus;
589314b24e2bSVaishali Kulkarni 	enum dbg_status status;
589414b24e2bSVaishali Kulkarni 	u8 storm_id;
589514b24e2bSVaishali Kulkarni 
589614b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
589714b24e2bSVaishali Kulkarni 
589814b24e2bSVaishali Kulkarni 	status = ecore_dbg_bus_get_dump_buf_size(p_hwfn, p_ptt, &min_buf_size_in_dwords);
589914b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
590014b24e2bSVaishali Kulkarni 		return status;
590114b24e2bSVaishali Kulkarni 
590214b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_bus_dump: dump_buf = 0x%p, buf_size_in_dwords = %d\n", dump_buf, buf_size_in_dwords);
590314b24e2bSVaishali Kulkarni 
590414b24e2bSVaishali Kulkarni 	if (bus->state != DBG_BUS_STATE_RECORDING && bus->state != DBG_BUS_STATE_STOPPED)
590514b24e2bSVaishali Kulkarni 		return DBG_STATUS_RECORDING_NOT_STARTED;
590614b24e2bSVaishali Kulkarni 
590714b24e2bSVaishali Kulkarni 	if (bus->state == DBG_BUS_STATE_RECORDING) {
590814b24e2bSVaishali Kulkarni 		enum dbg_status stop_state = ecore_dbg_bus_stop(p_hwfn, p_ptt);
590914b24e2bSVaishali Kulkarni 		if (stop_state != DBG_STATUS_OK)
591014b24e2bSVaishali Kulkarni 			return stop_state;
591114b24e2bSVaishali Kulkarni 	}
591214b24e2bSVaishali Kulkarni 
591314b24e2bSVaishali Kulkarni 	if (buf_size_in_dwords < min_buf_size_in_dwords)
591414b24e2bSVaishali Kulkarni 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
591514b24e2bSVaishali Kulkarni 
591614b24e2bSVaishali Kulkarni 	if (bus->target == DBG_BUS_TARGET_ID_PCI && !bus->pci_buf.size)
591714b24e2bSVaishali Kulkarni 		return DBG_STATUS_PCI_BUF_NOT_ALLOCATED;
591814b24e2bSVaishali Kulkarni 
591914b24e2bSVaishali Kulkarni 	/* Dump header */
592014b24e2bSVaishali Kulkarni 	offset += ecore_bus_dump_hdr(p_hwfn, p_ptt, dump_buf + offset, true);
592114b24e2bSVaishali Kulkarni 
592214b24e2bSVaishali Kulkarni 	/* Dump recorded data */
592314b24e2bSVaishali Kulkarni 	if (bus->target != DBG_BUS_TARGET_ID_NIG) {
592414b24e2bSVaishali Kulkarni 		u32 recorded_dwords = ecore_bus_dump_data(p_hwfn, p_ptt, dump_buf + offset, true);
592514b24e2bSVaishali Kulkarni 
592614b24e2bSVaishali Kulkarni 		if (!recorded_dwords)
592714b24e2bSVaishali Kulkarni 			return DBG_STATUS_NO_DATA_RECORDED;
592814b24e2bSVaishali Kulkarni 		if (recorded_dwords % CHUNK_SIZE_IN_DWORDS)
592914b24e2bSVaishali Kulkarni 			return DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED;
593014b24e2bSVaishali Kulkarni 		offset += recorded_dwords;
593114b24e2bSVaishali Kulkarni 	}
593214b24e2bSVaishali Kulkarni 
593314b24e2bSVaishali Kulkarni 	/* Dump last section */
593414b24e2bSVaishali Kulkarni 	offset += ecore_dump_last_section(p_hwfn, dump_buf, offset, true);
593514b24e2bSVaishali Kulkarni 
593614b24e2bSVaishali Kulkarni 	/* If recorded to PCI buffer - free the buffer */
593714b24e2bSVaishali Kulkarni 	ecore_bus_free_pci_buf(p_hwfn);
593814b24e2bSVaishali Kulkarni 
593914b24e2bSVaishali Kulkarni 	/* Clear debug bus parameters */
594014b24e2bSVaishali Kulkarni 	bus->state = DBG_BUS_STATE_IDLE;
594114b24e2bSVaishali Kulkarni 	bus->num_enabled_blocks = 0;
594214b24e2bSVaishali Kulkarni 	bus->num_enabled_storms = 0;
594314b24e2bSVaishali Kulkarni 	bus->filter_en = bus->trigger_en = 0;
594414b24e2bSVaishali Kulkarni 
594514b24e2bSVaishali Kulkarni 	for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++)
594614b24e2bSVaishali Kulkarni 		SET_FIELD(bus->blocks[BLOCK_PCIE].data, DBG_BUS_BLOCK_DATA_ENABLE_MASK, 0);
594714b24e2bSVaishali Kulkarni 
594814b24e2bSVaishali Kulkarni 	for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
594914b24e2bSVaishali Kulkarni 		struct dbg_bus_storm_data *storm_bus = &bus->storms[storm_id];
595014b24e2bSVaishali Kulkarni 
595114b24e2bSVaishali Kulkarni 		storm_bus->enabled = false;
595214b24e2bSVaishali Kulkarni 		storm_bus->eid_filter_en = storm_bus->cid_filter_en = 0;
595314b24e2bSVaishali Kulkarni 	}
595414b24e2bSVaishali Kulkarni 
595514b24e2bSVaishali Kulkarni 	*num_dumped_dwords = offset;
595614b24e2bSVaishali Kulkarni 
595714b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
595814b24e2bSVaishali Kulkarni }
595914b24e2bSVaishali Kulkarni 
ecore_dbg_grc_config(struct ecore_hwfn * p_hwfn,enum dbg_grc_params grc_param,u32 val)596014b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_grc_config(struct ecore_hwfn *p_hwfn,
596114b24e2bSVaishali Kulkarni 									 enum dbg_grc_params grc_param,
596214b24e2bSVaishali Kulkarni 									 u32 val)
596314b24e2bSVaishali Kulkarni {
596414b24e2bSVaishali Kulkarni 	int i;
596514b24e2bSVaishali Kulkarni 
596614b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_DEBUG, "dbg_grc_config: paramId = %d, val = %d\n", grc_param, val);
596714b24e2bSVaishali Kulkarni 
596814b24e2bSVaishali Kulkarni 	/* Initializes the GRC parameters (if not initialized). Needed in order
596914b24e2bSVaishali Kulkarni 	 * to set the default parameter values for the first time.
597014b24e2bSVaishali Kulkarni 	 */
597114b24e2bSVaishali Kulkarni 	ecore_dbg_grc_init_params(p_hwfn);
597214b24e2bSVaishali Kulkarni 
597314b24e2bSVaishali Kulkarni 	if (grc_param >= MAX_DBG_GRC_PARAMS)
597414b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
597514b24e2bSVaishali Kulkarni 	if (val < s_grc_param_defs[grc_param].min ||
597614b24e2bSVaishali Kulkarni 		val > s_grc_param_defs[grc_param].max)
597714b24e2bSVaishali Kulkarni 		return DBG_STATUS_INVALID_ARGS;
597814b24e2bSVaishali Kulkarni 
597914b24e2bSVaishali Kulkarni 	if (s_grc_param_defs[grc_param].is_preset) {
598014b24e2bSVaishali Kulkarni 
598114b24e2bSVaishali Kulkarni 		/* Preset param */
598214b24e2bSVaishali Kulkarni 
598314b24e2bSVaishali Kulkarni 		/* Disabling a preset is not allowed. Call
598414b24e2bSVaishali Kulkarni 		 * dbg_grc_set_params_default instead.
598514b24e2bSVaishali Kulkarni 		 */
598614b24e2bSVaishali Kulkarni 		if (!val)
598714b24e2bSVaishali Kulkarni 			return DBG_STATUS_INVALID_ARGS;
598814b24e2bSVaishali Kulkarni 
598914b24e2bSVaishali Kulkarni 		/* Update all params with the preset values */
599014b24e2bSVaishali Kulkarni 		for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) {
599114b24e2bSVaishali Kulkarni 			u32 preset_val;
599214b24e2bSVaishali Kulkarni 
599314b24e2bSVaishali Kulkarni 			if (grc_param == DBG_GRC_PARAM_EXCLUDE_ALL)
599414b24e2bSVaishali Kulkarni 				preset_val = s_grc_param_defs[i].exclude_all_preset_val;
599514b24e2bSVaishali Kulkarni 			else if (grc_param == DBG_GRC_PARAM_CRASH)
599614b24e2bSVaishali Kulkarni 				preset_val = s_grc_param_defs[i].crash_preset_val;
599714b24e2bSVaishali Kulkarni 			else
599814b24e2bSVaishali Kulkarni 				return DBG_STATUS_INVALID_ARGS;
599914b24e2bSVaishali Kulkarni 
600014b24e2bSVaishali Kulkarni 			ecore_grc_set_param(p_hwfn, (enum dbg_grc_params)i, preset_val);
600114b24e2bSVaishali Kulkarni 		}
600214b24e2bSVaishali Kulkarni 	}
600314b24e2bSVaishali Kulkarni 	else {
600414b24e2bSVaishali Kulkarni 
600514b24e2bSVaishali Kulkarni 		/* Regular param - set its value */
600614b24e2bSVaishali Kulkarni 		ecore_grc_set_param(p_hwfn, grc_param, val);
600714b24e2bSVaishali Kulkarni 	}
600814b24e2bSVaishali Kulkarni 
600914b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
601014b24e2bSVaishali Kulkarni }
601114b24e2bSVaishali Kulkarni 
601214b24e2bSVaishali Kulkarni /* Assign default GRC param values */
ecore_dbg_grc_set_params_default(struct ecore_hwfn * p_hwfn)601314b24e2bSVaishali Kulkarni void ecore_dbg_grc_set_params_default(struct ecore_hwfn *p_hwfn)
601414b24e2bSVaishali Kulkarni {
601514b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
601614b24e2bSVaishali Kulkarni 	u32 i;
601714b24e2bSVaishali Kulkarni 
601814b24e2bSVaishali Kulkarni 	for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
601914b24e2bSVaishali Kulkarni 		dev_data->grc.param_val[i] = s_grc_param_defs[i].default_val[dev_data->chip_id];
602014b24e2bSVaishali Kulkarni }
602114b24e2bSVaishali Kulkarni 
ecore_dbg_grc_get_dump_buf_size(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * buf_size)602214b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_grc_get_dump_buf_size(struct ecore_hwfn *p_hwfn,
602314b24e2bSVaishali Kulkarni 												struct ecore_ptt *p_ptt,
602414b24e2bSVaishali Kulkarni 												u32 *buf_size)
602514b24e2bSVaishali Kulkarni {
602614b24e2bSVaishali Kulkarni 	enum dbg_status status = ecore_dbg_dev_init(p_hwfn, p_ptt);
602714b24e2bSVaishali Kulkarni 
602814b24e2bSVaishali Kulkarni 	*buf_size = 0;
602914b24e2bSVaishali Kulkarni 
603014b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
603114b24e2bSVaishali Kulkarni 		return status;
603214b24e2bSVaishali Kulkarni 
603314b24e2bSVaishali Kulkarni 	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 ||
603414b24e2bSVaishali Kulkarni 		!s_dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr || !s_dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
603514b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
603614b24e2bSVaishali Kulkarni 
603714b24e2bSVaishali Kulkarni 	return ecore_grc_dump(p_hwfn, p_ptt, OSAL_NULL, false, buf_size);
603814b24e2bSVaishali Kulkarni }
603914b24e2bSVaishali Kulkarni 
ecore_dbg_grc_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)604014b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_grc_dump(struct ecore_hwfn *p_hwfn,
604114b24e2bSVaishali Kulkarni 								   struct ecore_ptt *p_ptt,
604214b24e2bSVaishali Kulkarni 								   u32 *dump_buf,
604314b24e2bSVaishali Kulkarni 								   u32 buf_size_in_dwords,
604414b24e2bSVaishali Kulkarni 								   u32 *num_dumped_dwords)
604514b24e2bSVaishali Kulkarni {
604614b24e2bSVaishali Kulkarni 	u32 needed_buf_size_in_dwords;
604714b24e2bSVaishali Kulkarni 	enum dbg_status status;
604814b24e2bSVaishali Kulkarni 
604914b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
605014b24e2bSVaishali Kulkarni 
605114b24e2bSVaishali Kulkarni 	status = ecore_dbg_grc_get_dump_buf_size(p_hwfn, p_ptt, &needed_buf_size_in_dwords);
605214b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
605314b24e2bSVaishali Kulkarni 		return status;
605414b24e2bSVaishali Kulkarni 
605514b24e2bSVaishali Kulkarni 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
605614b24e2bSVaishali Kulkarni 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
605714b24e2bSVaishali Kulkarni 
605814b24e2bSVaishali Kulkarni 	/* Doesn't do anything, needed for compile time asserts */
605914b24e2bSVaishali Kulkarni 	ecore_static_asserts();
606014b24e2bSVaishali Kulkarni 
606114b24e2bSVaishali Kulkarni 	/* GRC Dump */
606214b24e2bSVaishali Kulkarni 	status = ecore_grc_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords);
606314b24e2bSVaishali Kulkarni 
606414b24e2bSVaishali Kulkarni 	/* Reveret GRC params to their default */
606514b24e2bSVaishali Kulkarni 	ecore_dbg_grc_set_params_default(p_hwfn);
606614b24e2bSVaishali Kulkarni 
606714b24e2bSVaishali Kulkarni 	return status;
606814b24e2bSVaishali Kulkarni }
606914b24e2bSVaishali Kulkarni 
ecore_dbg_idle_chk_get_dump_buf_size(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * buf_size)607014b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_idle_chk_get_dump_buf_size(struct ecore_hwfn *p_hwfn,
607114b24e2bSVaishali Kulkarni 													 struct ecore_ptt *p_ptt,
607214b24e2bSVaishali Kulkarni 													 u32 *buf_size)
607314b24e2bSVaishali Kulkarni {
607414b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
607514b24e2bSVaishali Kulkarni 	struct idle_chk_data *idle_chk = &dev_data->idle_chk;
607614b24e2bSVaishali Kulkarni 	enum dbg_status status;
607714b24e2bSVaishali Kulkarni 
607814b24e2bSVaishali Kulkarni 	*buf_size = 0;
607914b24e2bSVaishali Kulkarni 
608014b24e2bSVaishali Kulkarni 	status = ecore_dbg_dev_init(p_hwfn, p_ptt);
608114b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
608214b24e2bSVaishali Kulkarni 		return status;
608314b24e2bSVaishali Kulkarni 
608414b24e2bSVaishali Kulkarni 	if (!s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr || !s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr ||
608514b24e2bSVaishali Kulkarni 		!s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr || !s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr)
608614b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
608714b24e2bSVaishali Kulkarni 
608814b24e2bSVaishali Kulkarni 	if (!idle_chk->buf_size_set) {
608914b24e2bSVaishali Kulkarni 		idle_chk->buf_size = ecore_idle_chk_dump(p_hwfn, p_ptt, OSAL_NULL, false);
609014b24e2bSVaishali Kulkarni 		idle_chk->buf_size_set = true;
609114b24e2bSVaishali Kulkarni 	}
609214b24e2bSVaishali Kulkarni 
609314b24e2bSVaishali Kulkarni 	*buf_size = idle_chk->buf_size;
609414b24e2bSVaishali Kulkarni 
609514b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
609614b24e2bSVaishali Kulkarni }
609714b24e2bSVaishali Kulkarni 
ecore_dbg_idle_chk_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)609814b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_idle_chk_dump(struct ecore_hwfn *p_hwfn,
609914b24e2bSVaishali Kulkarni 										struct ecore_ptt *p_ptt,
610014b24e2bSVaishali Kulkarni 										u32 *dump_buf,
610114b24e2bSVaishali Kulkarni 										u32 buf_size_in_dwords,
610214b24e2bSVaishali Kulkarni 										u32 *num_dumped_dwords)
610314b24e2bSVaishali Kulkarni {
610414b24e2bSVaishali Kulkarni 	u32 needed_buf_size_in_dwords;
610514b24e2bSVaishali Kulkarni 	enum dbg_status status;
610614b24e2bSVaishali Kulkarni 
610714b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
610814b24e2bSVaishali Kulkarni 
610914b24e2bSVaishali Kulkarni 	status = ecore_dbg_idle_chk_get_dump_buf_size(p_hwfn, p_ptt, &needed_buf_size_in_dwords);
611014b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
611114b24e2bSVaishali Kulkarni 		return status;
611214b24e2bSVaishali Kulkarni 
611314b24e2bSVaishali Kulkarni 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
611414b24e2bSVaishali Kulkarni 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
611514b24e2bSVaishali Kulkarni 
611614b24e2bSVaishali Kulkarni 	/* Update reset state */
611714b24e2bSVaishali Kulkarni 	ecore_update_blocks_reset_state(p_hwfn, p_ptt);
611814b24e2bSVaishali Kulkarni 
611914b24e2bSVaishali Kulkarni 	/* Idle Check Dump */
612014b24e2bSVaishali Kulkarni 	*num_dumped_dwords = ecore_idle_chk_dump(p_hwfn, p_ptt, dump_buf, true);
612114b24e2bSVaishali Kulkarni 
612214b24e2bSVaishali Kulkarni 	/* Reveret GRC params to their default */
612314b24e2bSVaishali Kulkarni 	ecore_dbg_grc_set_params_default(p_hwfn);
612414b24e2bSVaishali Kulkarni 
612514b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
612614b24e2bSVaishali Kulkarni }
612714b24e2bSVaishali Kulkarni 
ecore_dbg_mcp_trace_get_dump_buf_size(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * buf_size)612814b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_mcp_trace_get_dump_buf_size(struct ecore_hwfn *p_hwfn,
612914b24e2bSVaishali Kulkarni 													  struct ecore_ptt *p_ptt,
613014b24e2bSVaishali Kulkarni 													  u32 *buf_size)
613114b24e2bSVaishali Kulkarni {
613214b24e2bSVaishali Kulkarni 	enum dbg_status status = ecore_dbg_dev_init(p_hwfn, p_ptt);
613314b24e2bSVaishali Kulkarni 
613414b24e2bSVaishali Kulkarni 	*buf_size = 0;
613514b24e2bSVaishali Kulkarni 
613614b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
613714b24e2bSVaishali Kulkarni 		return status;
613814b24e2bSVaishali Kulkarni 
613914b24e2bSVaishali Kulkarni 	return ecore_mcp_trace_dump(p_hwfn, p_ptt, OSAL_NULL, false, buf_size);
614014b24e2bSVaishali Kulkarni }
614114b24e2bSVaishali Kulkarni 
ecore_dbg_mcp_trace_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)614214b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_mcp_trace_dump(struct ecore_hwfn *p_hwfn,
614314b24e2bSVaishali Kulkarni 										 struct ecore_ptt *p_ptt,
614414b24e2bSVaishali Kulkarni 										 u32 *dump_buf,
614514b24e2bSVaishali Kulkarni 										 u32 buf_size_in_dwords,
614614b24e2bSVaishali Kulkarni 										 u32 *num_dumped_dwords)
614714b24e2bSVaishali Kulkarni {
614814b24e2bSVaishali Kulkarni 	u32 needed_buf_size_in_dwords;
614914b24e2bSVaishali Kulkarni 	enum dbg_status status;
615014b24e2bSVaishali Kulkarni 
615114b24e2bSVaishali Kulkarni 	status = ecore_dbg_mcp_trace_get_dump_buf_size(p_hwfn, p_ptt, &needed_buf_size_in_dwords);
615214b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK && status != DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
615314b24e2bSVaishali Kulkarni 		return status;
615414b24e2bSVaishali Kulkarni 
615514b24e2bSVaishali Kulkarni 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
615614b24e2bSVaishali Kulkarni 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
615714b24e2bSVaishali Kulkarni 
615814b24e2bSVaishali Kulkarni 	/* Update reset state */
615914b24e2bSVaishali Kulkarni 	ecore_update_blocks_reset_state(p_hwfn, p_ptt);
616014b24e2bSVaishali Kulkarni 
616114b24e2bSVaishali Kulkarni 	/* Perform dump */
616214b24e2bSVaishali Kulkarni 	status = ecore_mcp_trace_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords);
616314b24e2bSVaishali Kulkarni 
616414b24e2bSVaishali Kulkarni 	/* Reveret GRC params to their default */
616514b24e2bSVaishali Kulkarni 	ecore_dbg_grc_set_params_default(p_hwfn);
616614b24e2bSVaishali Kulkarni 
616714b24e2bSVaishali Kulkarni 	return status;
616814b24e2bSVaishali Kulkarni }
616914b24e2bSVaishali Kulkarni 
ecore_dbg_reg_fifo_get_dump_buf_size(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * buf_size)617014b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_reg_fifo_get_dump_buf_size(struct ecore_hwfn *p_hwfn,
617114b24e2bSVaishali Kulkarni 													 struct ecore_ptt *p_ptt,
617214b24e2bSVaishali Kulkarni 													 u32 *buf_size)
617314b24e2bSVaishali Kulkarni {
617414b24e2bSVaishali Kulkarni 	enum dbg_status status = ecore_dbg_dev_init(p_hwfn, p_ptt);
617514b24e2bSVaishali Kulkarni 
617614b24e2bSVaishali Kulkarni 	*buf_size = 0;
617714b24e2bSVaishali Kulkarni 
617814b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
617914b24e2bSVaishali Kulkarni 		return status;
618014b24e2bSVaishali Kulkarni 
618114b24e2bSVaishali Kulkarni 	return ecore_reg_fifo_dump(p_hwfn, p_ptt, OSAL_NULL, false, buf_size);
618214b24e2bSVaishali Kulkarni }
618314b24e2bSVaishali Kulkarni 
ecore_dbg_reg_fifo_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)618414b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_reg_fifo_dump(struct ecore_hwfn *p_hwfn,
618514b24e2bSVaishali Kulkarni 										struct ecore_ptt *p_ptt,
618614b24e2bSVaishali Kulkarni 										u32 *dump_buf,
618714b24e2bSVaishali Kulkarni 										u32 buf_size_in_dwords,
618814b24e2bSVaishali Kulkarni 										u32 *num_dumped_dwords)
618914b24e2bSVaishali Kulkarni {
619014b24e2bSVaishali Kulkarni 	u32 needed_buf_size_in_dwords;
619114b24e2bSVaishali Kulkarni 	enum dbg_status status;
619214b24e2bSVaishali Kulkarni 
619314b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
619414b24e2bSVaishali Kulkarni 
619514b24e2bSVaishali Kulkarni 	status = ecore_dbg_reg_fifo_get_dump_buf_size(p_hwfn, p_ptt, &needed_buf_size_in_dwords);
619614b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
619714b24e2bSVaishali Kulkarni 		return status;
619814b24e2bSVaishali Kulkarni 
619914b24e2bSVaishali Kulkarni 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
620014b24e2bSVaishali Kulkarni 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
620114b24e2bSVaishali Kulkarni 
620214b24e2bSVaishali Kulkarni 	/* Update reset state */
620314b24e2bSVaishali Kulkarni 	ecore_update_blocks_reset_state(p_hwfn, p_ptt);
620414b24e2bSVaishali Kulkarni 
620514b24e2bSVaishali Kulkarni 	status = ecore_reg_fifo_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords);
620614b24e2bSVaishali Kulkarni 
620714b24e2bSVaishali Kulkarni 	/* Reveret GRC params to their default */
620814b24e2bSVaishali Kulkarni 	ecore_dbg_grc_set_params_default(p_hwfn);
620914b24e2bSVaishali Kulkarni 
621014b24e2bSVaishali Kulkarni 	return status;
621114b24e2bSVaishali Kulkarni }
621214b24e2bSVaishali Kulkarni 
ecore_dbg_igu_fifo_get_dump_buf_size(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * buf_size)621314b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_igu_fifo_get_dump_buf_size(struct ecore_hwfn *p_hwfn,
621414b24e2bSVaishali Kulkarni 													 struct ecore_ptt *p_ptt,
621514b24e2bSVaishali Kulkarni 													 u32 *buf_size)
621614b24e2bSVaishali Kulkarni {
621714b24e2bSVaishali Kulkarni 	enum dbg_status status = ecore_dbg_dev_init(p_hwfn, p_ptt);
621814b24e2bSVaishali Kulkarni 
621914b24e2bSVaishali Kulkarni 	*buf_size = 0;
622014b24e2bSVaishali Kulkarni 
622114b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
622214b24e2bSVaishali Kulkarni 		return status;
622314b24e2bSVaishali Kulkarni 
622414b24e2bSVaishali Kulkarni 	return ecore_igu_fifo_dump(p_hwfn, p_ptt, OSAL_NULL, false, buf_size);
622514b24e2bSVaishali Kulkarni }
622614b24e2bSVaishali Kulkarni 
ecore_dbg_igu_fifo_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)622714b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_igu_fifo_dump(struct ecore_hwfn *p_hwfn,
622814b24e2bSVaishali Kulkarni 										struct ecore_ptt *p_ptt,
622914b24e2bSVaishali Kulkarni 										u32 *dump_buf,
623014b24e2bSVaishali Kulkarni 										u32 buf_size_in_dwords,
623114b24e2bSVaishali Kulkarni 										u32 *num_dumped_dwords)
623214b24e2bSVaishali Kulkarni {
623314b24e2bSVaishali Kulkarni 	u32 needed_buf_size_in_dwords;
623414b24e2bSVaishali Kulkarni 	enum dbg_status status;
623514b24e2bSVaishali Kulkarni 
623614b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
623714b24e2bSVaishali Kulkarni 
623814b24e2bSVaishali Kulkarni 	status = ecore_dbg_igu_fifo_get_dump_buf_size(p_hwfn, p_ptt, &needed_buf_size_in_dwords);
623914b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
624014b24e2bSVaishali Kulkarni 		return status;
624114b24e2bSVaishali Kulkarni 
624214b24e2bSVaishali Kulkarni 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
624314b24e2bSVaishali Kulkarni 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
624414b24e2bSVaishali Kulkarni 
624514b24e2bSVaishali Kulkarni 	/* Update reset state */
624614b24e2bSVaishali Kulkarni 	ecore_update_blocks_reset_state(p_hwfn, p_ptt);
624714b24e2bSVaishali Kulkarni 
624814b24e2bSVaishali Kulkarni 	status = ecore_igu_fifo_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords);
624914b24e2bSVaishali Kulkarni 
625014b24e2bSVaishali Kulkarni 	/* Reveret GRC params to their default */
625114b24e2bSVaishali Kulkarni 	ecore_dbg_grc_set_params_default(p_hwfn);
625214b24e2bSVaishali Kulkarni 
625314b24e2bSVaishali Kulkarni 	return status;
625414b24e2bSVaishali Kulkarni }
625514b24e2bSVaishali Kulkarni 
ecore_dbg_protection_override_get_dump_buf_size(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * buf_size)625614b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_protection_override_get_dump_buf_size(struct ecore_hwfn *p_hwfn,
625714b24e2bSVaishali Kulkarni 																struct ecore_ptt *p_ptt,
625814b24e2bSVaishali Kulkarni 																u32 *buf_size)
625914b24e2bSVaishali Kulkarni {
626014b24e2bSVaishali Kulkarni 	enum dbg_status status = ecore_dbg_dev_init(p_hwfn, p_ptt);
626114b24e2bSVaishali Kulkarni 
626214b24e2bSVaishali Kulkarni 	*buf_size = 0;
626314b24e2bSVaishali Kulkarni 
626414b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
626514b24e2bSVaishali Kulkarni 		return status;
626614b24e2bSVaishali Kulkarni 
626714b24e2bSVaishali Kulkarni 	return ecore_protection_override_dump(p_hwfn, p_ptt, OSAL_NULL, false, buf_size);
626814b24e2bSVaishali Kulkarni }
626914b24e2bSVaishali Kulkarni 
ecore_dbg_protection_override_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)627014b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_protection_override_dump(struct ecore_hwfn *p_hwfn,
627114b24e2bSVaishali Kulkarni 												   struct ecore_ptt *p_ptt,
627214b24e2bSVaishali Kulkarni 												   u32 *dump_buf,
627314b24e2bSVaishali Kulkarni 												   u32 buf_size_in_dwords,
627414b24e2bSVaishali Kulkarni 												   u32 *num_dumped_dwords)
627514b24e2bSVaishali Kulkarni {
627614b24e2bSVaishali Kulkarni 	u32 needed_buf_size_in_dwords;
627714b24e2bSVaishali Kulkarni 	enum dbg_status status;
627814b24e2bSVaishali Kulkarni 
627914b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
628014b24e2bSVaishali Kulkarni 
628114b24e2bSVaishali Kulkarni 	status = ecore_dbg_protection_override_get_dump_buf_size(p_hwfn, p_ptt, &needed_buf_size_in_dwords);
628214b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
628314b24e2bSVaishali Kulkarni 		return status;
628414b24e2bSVaishali Kulkarni 
628514b24e2bSVaishali Kulkarni 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
628614b24e2bSVaishali Kulkarni 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
628714b24e2bSVaishali Kulkarni 
628814b24e2bSVaishali Kulkarni 	/* Update reset state */
628914b24e2bSVaishali Kulkarni 	ecore_update_blocks_reset_state(p_hwfn, p_ptt);
629014b24e2bSVaishali Kulkarni 
629114b24e2bSVaishali Kulkarni 	status = ecore_protection_override_dump(p_hwfn, p_ptt, dump_buf, true, num_dumped_dwords);
629214b24e2bSVaishali Kulkarni 
629314b24e2bSVaishali Kulkarni 	/* Reveret GRC params to their default */
629414b24e2bSVaishali Kulkarni 	ecore_dbg_grc_set_params_default(p_hwfn);
629514b24e2bSVaishali Kulkarni 
629614b24e2bSVaishali Kulkarni 	return status;
629714b24e2bSVaishali Kulkarni }
629814b24e2bSVaishali Kulkarni 
ecore_dbg_fw_asserts_get_dump_buf_size(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * buf_size)629914b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_fw_asserts_get_dump_buf_size(struct ecore_hwfn *p_hwfn,
630014b24e2bSVaishali Kulkarni 													   struct ecore_ptt *p_ptt,
630114b24e2bSVaishali Kulkarni 													   u32 *buf_size)
630214b24e2bSVaishali Kulkarni {
630314b24e2bSVaishali Kulkarni 	enum dbg_status status = ecore_dbg_dev_init(p_hwfn, p_ptt);
630414b24e2bSVaishali Kulkarni 
630514b24e2bSVaishali Kulkarni 	*buf_size = 0;
630614b24e2bSVaishali Kulkarni 
630714b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
630814b24e2bSVaishali Kulkarni 		return status;
630914b24e2bSVaishali Kulkarni 
631014b24e2bSVaishali Kulkarni 	/* Update reset state */
631114b24e2bSVaishali Kulkarni 	ecore_update_blocks_reset_state(p_hwfn, p_ptt);
631214b24e2bSVaishali Kulkarni 
631314b24e2bSVaishali Kulkarni 	*buf_size = ecore_fw_asserts_dump(p_hwfn, p_ptt, OSAL_NULL, false);
631414b24e2bSVaishali Kulkarni 
631514b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
631614b24e2bSVaishali Kulkarni }
631714b24e2bSVaishali Kulkarni 
ecore_dbg_fw_asserts_dump(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 * dump_buf,u32 buf_size_in_dwords,u32 * num_dumped_dwords)631814b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_fw_asserts_dump(struct ecore_hwfn *p_hwfn,
631914b24e2bSVaishali Kulkarni 										  struct ecore_ptt *p_ptt,
632014b24e2bSVaishali Kulkarni 										  u32 *dump_buf,
632114b24e2bSVaishali Kulkarni 										  u32 buf_size_in_dwords,
632214b24e2bSVaishali Kulkarni 										  u32 *num_dumped_dwords)
632314b24e2bSVaishali Kulkarni {
632414b24e2bSVaishali Kulkarni 	u32 needed_buf_size_in_dwords;
632514b24e2bSVaishali Kulkarni 	enum dbg_status status;
632614b24e2bSVaishali Kulkarni 
632714b24e2bSVaishali Kulkarni 	*num_dumped_dwords = 0;
632814b24e2bSVaishali Kulkarni 
632914b24e2bSVaishali Kulkarni 	status = ecore_dbg_fw_asserts_get_dump_buf_size(p_hwfn, p_ptt, &needed_buf_size_in_dwords);
633014b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
633114b24e2bSVaishali Kulkarni 		return status;
633214b24e2bSVaishali Kulkarni 
633314b24e2bSVaishali Kulkarni 	if (buf_size_in_dwords < needed_buf_size_in_dwords)
633414b24e2bSVaishali Kulkarni 		return DBG_STATUS_DUMP_BUF_TOO_SMALL;
633514b24e2bSVaishali Kulkarni 
633614b24e2bSVaishali Kulkarni 	*num_dumped_dwords = ecore_fw_asserts_dump(p_hwfn, p_ptt, dump_buf, true);
633714b24e2bSVaishali Kulkarni 
633814b24e2bSVaishali Kulkarni 	/* Reveret GRC params to their default */
633914b24e2bSVaishali Kulkarni 	ecore_dbg_grc_set_params_default(p_hwfn);
634014b24e2bSVaishali Kulkarni 
634114b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
634214b24e2bSVaishali Kulkarni }
634314b24e2bSVaishali Kulkarni 
ecore_dbg_read_attn(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,enum block_id block_id,enum dbg_attn_type attn_type,bool clear_status,struct dbg_attn_block_result * results)634414b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_read_attn(struct ecore_hwfn *p_hwfn,
634514b24e2bSVaishali Kulkarni 									struct ecore_ptt *p_ptt,
634614b24e2bSVaishali Kulkarni 									enum block_id block_id,
634714b24e2bSVaishali Kulkarni 									enum dbg_attn_type attn_type,
634814b24e2bSVaishali Kulkarni 									bool clear_status,
634914b24e2bSVaishali Kulkarni 									struct dbg_attn_block_result *results)
635014b24e2bSVaishali Kulkarni {
635114b24e2bSVaishali Kulkarni 	enum dbg_status status = ecore_dbg_dev_init(p_hwfn, p_ptt);
635214b24e2bSVaishali Kulkarni 	u8 reg_idx, num_attn_regs, num_result_regs = 0;
635314b24e2bSVaishali Kulkarni 	const struct dbg_attn_reg *attn_reg_arr;
635414b24e2bSVaishali Kulkarni 
635514b24e2bSVaishali Kulkarni 	if (status != DBG_STATUS_OK)
635614b24e2bSVaishali Kulkarni 		return status;
635714b24e2bSVaishali Kulkarni 
635814b24e2bSVaishali Kulkarni 	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)
635914b24e2bSVaishali Kulkarni 		return DBG_STATUS_DBG_ARRAY_NOT_SET;
636014b24e2bSVaishali Kulkarni 
636114b24e2bSVaishali Kulkarni 	attn_reg_arr = ecore_get_block_attn_regs(block_id, attn_type, &num_attn_regs);
636214b24e2bSVaishali Kulkarni 
636314b24e2bSVaishali Kulkarni 	for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
636414b24e2bSVaishali Kulkarni 		const struct dbg_attn_reg *reg_data = &attn_reg_arr[reg_idx];
636514b24e2bSVaishali Kulkarni 		struct dbg_attn_reg_result *reg_result;
636614b24e2bSVaishali Kulkarni 		u32 sts_addr, sts_val;
636714b24e2bSVaishali Kulkarni 		u16 modes_buf_offset;
636814b24e2bSVaishali Kulkarni 		bool eval_mode;
636914b24e2bSVaishali Kulkarni 
637014b24e2bSVaishali Kulkarni 		/* Check mode */
637114b24e2bSVaishali Kulkarni 		eval_mode = GET_FIELD(reg_data->mode.data, DBG_MODE_HDR_EVAL_MODE) > 0;
637214b24e2bSVaishali Kulkarni 		modes_buf_offset = GET_FIELD(reg_data->mode.data, DBG_MODE_HDR_MODES_BUF_OFFSET);
637314b24e2bSVaishali Kulkarni 		if (eval_mode && !ecore_is_mode_match(p_hwfn, &modes_buf_offset))
637414b24e2bSVaishali Kulkarni 			continue;
637514b24e2bSVaishali Kulkarni 
637614b24e2bSVaishali Kulkarni 		/* Mode match - read attention status register */
637714b24e2bSVaishali Kulkarni 		sts_addr = DWORDS_TO_BYTES(clear_status ? reg_data->sts_clr_address : GET_FIELD(reg_data->data, DBG_ATTN_REG_STS_ADDRESS));
637814b24e2bSVaishali Kulkarni 		sts_val = ecore_rd(p_hwfn, p_ptt, sts_addr);
637914b24e2bSVaishali Kulkarni 		if (!sts_val)
638014b24e2bSVaishali Kulkarni 			continue;
638114b24e2bSVaishali Kulkarni 
638214b24e2bSVaishali Kulkarni 		/* Non-zero attention status - add to results */
638314b24e2bSVaishali Kulkarni 		reg_result = &results->reg_results[num_result_regs];
638414b24e2bSVaishali Kulkarni 		SET_FIELD(reg_result->data, DBG_ATTN_REG_RESULT_STS_ADDRESS, sts_addr);
638514b24e2bSVaishali Kulkarni 		SET_FIELD(reg_result->data, DBG_ATTN_REG_RESULT_NUM_REG_ATTN, GET_FIELD(reg_data->data, DBG_ATTN_REG_NUM_REG_ATTN));
638614b24e2bSVaishali Kulkarni 		reg_result->block_attn_offset = reg_data->block_attn_offset;
638714b24e2bSVaishali Kulkarni 		reg_result->sts_val = sts_val;
638814b24e2bSVaishali Kulkarni 		reg_result->mask_val = ecore_rd(p_hwfn, p_ptt, DWORDS_TO_BYTES(reg_data->mask_address));
638914b24e2bSVaishali Kulkarni 		num_result_regs++;
639014b24e2bSVaishali Kulkarni 	}
639114b24e2bSVaishali Kulkarni 
639214b24e2bSVaishali Kulkarni 	results->block_id = (u8)block_id;
639314b24e2bSVaishali Kulkarni 	results->names_offset = ecore_get_block_attn_data(block_id, attn_type)->names_offset;
639414b24e2bSVaishali Kulkarni 	SET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE, attn_type);
639514b24e2bSVaishali Kulkarni 	SET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_NUM_REGS, num_result_regs);
639614b24e2bSVaishali Kulkarni 
639714b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
639814b24e2bSVaishali Kulkarni }
639914b24e2bSVaishali Kulkarni 
ecore_dbg_print_attn(struct ecore_hwfn * p_hwfn,struct dbg_attn_block_result * results)640014b24e2bSVaishali Kulkarni enum dbg_status ecore_dbg_print_attn(struct ecore_hwfn *p_hwfn,
640114b24e2bSVaishali Kulkarni 									 struct dbg_attn_block_result *results)
640214b24e2bSVaishali Kulkarni {
640314b24e2bSVaishali Kulkarni 	enum dbg_attn_type attn_type;
640414b24e2bSVaishali Kulkarni 	u8 num_regs, i;
640514b24e2bSVaishali Kulkarni 
640614b24e2bSVaishali Kulkarni 	num_regs = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_NUM_REGS);
640714b24e2bSVaishali Kulkarni 	attn_type = (enum dbg_attn_type)GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE);
640814b24e2bSVaishali Kulkarni 
640914b24e2bSVaishali Kulkarni 	for (i = 0; i < num_regs; i++) {
641014b24e2bSVaishali Kulkarni 		struct dbg_attn_reg_result *reg_result;
641114b24e2bSVaishali Kulkarni 		const char *attn_type_str;
641214b24e2bSVaishali Kulkarni 		u32 sts_addr;
641314b24e2bSVaishali Kulkarni 
641414b24e2bSVaishali Kulkarni 		reg_result = &results->reg_results[i];
641514b24e2bSVaishali Kulkarni 		attn_type_str = (attn_type == ATTN_TYPE_INTERRUPT ? "interrupt" : "parity");
641614b24e2bSVaishali Kulkarni 		sts_addr = GET_FIELD(reg_result->data, DBG_ATTN_REG_RESULT_STS_ADDRESS);
641714b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, false, "%s: address 0x%08x, status 0x%08x, mask 0x%08x\n", attn_type_str, sts_addr, reg_result->sts_val, reg_result->mask_val);
641814b24e2bSVaishali Kulkarni 	}
641914b24e2bSVaishali Kulkarni 
642014b24e2bSVaishali Kulkarni 	return DBG_STATUS_OK;
642114b24e2bSVaishali Kulkarni }
642214b24e2bSVaishali Kulkarni 
ecore_is_block_in_reset(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,enum block_id block_id)642314b24e2bSVaishali Kulkarni bool ecore_is_block_in_reset(struct ecore_hwfn *p_hwfn,
642414b24e2bSVaishali Kulkarni 							 struct ecore_ptt *p_ptt,
642514b24e2bSVaishali Kulkarni 							 enum block_id block_id)
642614b24e2bSVaishali Kulkarni {
642714b24e2bSVaishali Kulkarni 	struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
642814b24e2bSVaishali Kulkarni 	struct block_defs *block = s_block_defs[block_id];
642914b24e2bSVaishali Kulkarni 	u32 reset_reg;
643014b24e2bSVaishali Kulkarni 
643114b24e2bSVaishali Kulkarni 	if (!block->has_reset_bit)
643214b24e2bSVaishali Kulkarni 		return false;
643314b24e2bSVaishali Kulkarni 
643414b24e2bSVaishali Kulkarni 	reset_reg = block->reset_reg;
643514b24e2bSVaishali Kulkarni 
643614b24e2bSVaishali Kulkarni 	return s_reset_regs_defs[reset_reg].exists[dev_data->chip_id] ?
643714b24e2bSVaishali Kulkarni 		!(ecore_rd(p_hwfn, p_ptt, s_reset_regs_defs[reset_reg].addr) & (1 << block->reset_bit_offset)) :	true;
643814b24e2bSVaishali Kulkarni }
643914b24e2bSVaishali Kulkarni 
6440