MEM_GROUP_BRB_RAM,
        MEM_GROUP_BRB_MEM,
        MEM_GROUP_PRS_MEM,
+       MEM_GROUP_SDM_MEM,
+       MEM_GROUP_PBUF,
        MEM_GROUP_IOR,
+       MEM_GROUP_RAM,
        MEM_GROUP_BTB_RAM,
+       MEM_GROUP_RDIF_CTX,
+       MEM_GROUP_TDIF_CTX,
+       MEM_GROUP_CFC_MEM,
        MEM_GROUP_CONN_CFC_MEM,
-       MEM_GROUP_TASK_CFC_MEM,
        MEM_GROUP_CAU_PI,
        MEM_GROUP_CAU_MEM,
+       MEM_GROUP_CAU_MEM_EXT,
        MEM_GROUP_PXP_ILT,
-       MEM_GROUP_TM_MEM,
-       MEM_GROUP_SDM_MEM,
-       MEM_GROUP_PBUF,
-       MEM_GROUP_RAM,
        MEM_GROUP_MULD_MEM,
        MEM_GROUP_BTB_MEM,
-       MEM_GROUP_RDIF_CTX,
-       MEM_GROUP_TDIF_CTX,
-       MEM_GROUP_CFC_MEM,
        MEM_GROUP_IGU_MEM,
        MEM_GROUP_IGU_MSIX,
        MEM_GROUP_CAU_SB,
        MEM_GROUP_BMB_RAM,
        MEM_GROUP_BMB_MEM,
+       MEM_GROUP_TM_MEM,
+       MEM_GROUP_TASK_CFC_MEM,
        MEM_GROUPS_NUM
 };
 
        "BRB_RAM",
        "BRB_MEM",
        "PRS_MEM",
+       "SDM_MEM",
+       "PBUF",
        "IOR",
+       "RAM",
        "BTB_RAM",
+       "RDIF_CTX",
+       "TDIF_CTX",
+       "CFC_MEM",
        "CONN_CFC_MEM",
-       "TASK_CFC_MEM",
        "CAU_PI",
        "CAU_MEM",
+       "CAU_MEM_EXT",
        "PXP_ILT",
-       "TM_MEM",
-       "SDM_MEM",
-       "PBUF",
-       "RAM",
        "MULD_MEM",
        "BTB_MEM",
-       "RDIF_CTX",
-       "TDIF_CTX",
-       "CFC_MEM",
        "IGU_MEM",
        "IGU_MSIX",
        "CAU_SB",
        "BMB_RAM",
        "BMB_MEM",
+       "TM_MEM",
+       "TASK_CFC_MEM",
 };
 
 /* Idle check conditions */
        cond13,
 };
 
+#define NUM_PHYS_BLOCKS 84
+
+#define NUM_DBG_RESET_REGS 8
+
 /******************************* Data Types **********************************/
 
-enum platform_ids {
-       PLATFORM_ASIC,
+enum hw_types {
+       HW_TYPE_ASIC,
        PLATFORM_RESERVED,
        PLATFORM_RESERVED2,
        PLATFORM_RESERVED3,
-       MAX_PLATFORM_IDS
+       PLATFORM_RESERVED4,
+       MAX_HW_TYPES
+};
+
+/* CM context types */
+enum cm_ctx_types {
+       CM_CTX_CONN_AG,
+       CM_CTX_CONN_ST,
+       CM_CTX_TASK_AG,
+       CM_CTX_TASK_ST,
+       NUM_CM_CTX_TYPES
+};
+
+/* Debug bus frame modes */
+enum dbg_bus_frame_modes {
+       DBG_BUS_FRAME_MODE_4ST = 0,     /* 4 Storm dwords (no HW) */
+       DBG_BUS_FRAME_MODE_2ST_2HW = 1, /* 2 Storm dwords, 2 HW dwords */
+       DBG_BUS_FRAME_MODE_1ST_3HW = 2, /* 1 Storm dwords, 3 HW dwords */
+       DBG_BUS_FRAME_MODE_4HW = 3,     /* 4 HW dwords (no Storms) */
+       DBG_BUS_FRAME_MODE_8HW = 4,     /* 8 HW dwords (no Storms) */
+       DBG_BUS_NUM_FRAME_MODES
 };
 
 /* Chip constant definitions */
        u32 num_ilt_pages;
 };
 
-/* Platform constant definitions */
-struct platform_defs {
+/* HW type constant definitions */
+struct hw_type_defs {
        const char *name;
        u32 delay_factor;
        u32 dmae_thresh;
        u32 log_thresh;
 };
 
+/* RBC reset definitions */
+struct rbc_reset_defs {
+       u32 reset_reg_addr;
+       u32 reset_val[MAX_CHIP_IDS];
+};
+
 /* Storm constant definitions.
  * Addresses are in bytes, sizes are in quad-regs.
  */
 struct storm_defs {
        char letter;
-       enum block_id block_id;
+       enum block_id sem_block_id;
        enum dbg_bus_clients dbg_client_id[MAX_CHIP_IDS];
        bool has_vfc;
        u32 sem_fast_mem_addr;
        u32 sem_slow_mode_addr;
        u32 sem_slow_mode1_conf_addr;
        u32 sem_sync_dbg_empty_addr;
-       u32 sem_slow_dbg_empty_addr;
+       u32 sem_gpre_vect_addr;
        u32 cm_ctx_wr_addr;
-       u32 cm_conn_ag_ctx_lid_size;
-       u32 cm_conn_ag_ctx_rd_addr;
-       u32 cm_conn_st_ctx_lid_size;
-       u32 cm_conn_st_ctx_rd_addr;
-       u32 cm_task_ag_ctx_lid_size;
-       u32 cm_task_ag_ctx_rd_addr;
-       u32 cm_task_st_ctx_lid_size;
-       u32 cm_task_st_ctx_rd_addr;
+       u32 cm_ctx_rd_addr[NUM_CM_CTX_TYPES];
+       u32 cm_ctx_lid_sizes[MAX_CHIP_IDS][NUM_CM_CTX_TYPES];
 };
 
-/* Block constant definitions */
-struct block_defs {
-       const char *name;
-       bool exists[MAX_CHIP_IDS];
-       bool associated_to_storm;
-
-       /* Valid only if associated_to_storm is true */
-       u32 storm_id;
-       enum dbg_bus_clients dbg_client_id[MAX_CHIP_IDS];
-       u32 dbg_select_addr;
-       u32 dbg_enable_addr;
-       u32 dbg_shift_addr;
-       u32 dbg_force_valid_addr;
-       u32 dbg_force_frame_addr;
-       bool has_reset_bit;
-
-       /* If true, block is taken out of reset before dump */
-       bool unreset;
-       enum dbg_reset_regs reset_reg;
-
-       /* Bit offset in reset register */
-       u8 reset_bit_offset;
+/* Debug Bus Constraint operation constant definitions */
+struct dbg_bus_constraint_op_defs {
+       u8 hw_op_val;
+       bool is_cyclic;
 };
 
-/* Reset register definitions */
-struct reset_reg_defs {
-       u32 addr;
+/* Storm Mode definitions */
+struct storm_mode_defs {
+       const char *name;
+       bool is_fast_dbg;
+       u8 id_in_hw;
+       u32 src_disable_reg_addr;
+       u32 src_enable_val;
        bool exists[MAX_CHIP_IDS];
-       u32 unreset_val[MAX_CHIP_IDS];
 };
 
 struct grc_param_defs {
        bool is_preset;
        bool is_persistent;
        u32 exclude_all_preset_val;
-       u32 crash_preset_val;
+       u32 crash_preset_val[MAX_CHIP_IDS];
 };
 
 /* Address is in 128b units. Width is in bits. */
 
 /******************************** Constants **********************************/
 
-#define MAX_LCIDS                      320
-#define MAX_LTIDS                      320
-
-#define NUM_IOR_SETS                   2
-#define IORS_PER_SET                   176
-#define IOR_SET_OFFSET(set_id)         ((set_id) * 256)
-
 #define BYTES_IN_DWORD                 sizeof(u32)
-
 /* In the macros below, size and offset are specified in bits */
 #define CEIL_DWORDS(size)              DIV_ROUND_UP(size, 32)
 #define FIELD_BIT_OFFSET(type, field)  type ## _ ## field ## _ ## OFFSET
                        qed_wr(dev, ptt, addr,  (arr)[i]); \
        } while (0)
 
-#define ARR_REG_RD(dev, ptt, addr, arr, arr_size) \
-       do { \
-               for (i = 0; i < (arr_size); i++) \
-                       (arr)[i] = qed_rd(dev, ptt, addr); \
-       } while (0)
-
 #define DWORDS_TO_BYTES(dwords)                ((dwords) * BYTES_IN_DWORD)
 #define BYTES_TO_DWORDS(bytes)         ((bytes) / BYTES_IN_DWORD)
 
-/* Extra lines include a signature line + optional latency events line */
-#define NUM_EXTRA_DBG_LINES(block_desc) \
-       (1 + ((block_desc)->has_latency_events ? 1 : 0))
-#define NUM_DBG_LINES(block_desc) \
-       ((block_desc)->num_of_lines + NUM_EXTRA_DBG_LINES(block_desc))
+/* extra lines include a signature line + optional latency events line */
+#define NUM_EXTRA_DBG_LINES(block) \
+       (GET_FIELD((block)->flags, DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS) ? 2 : 1)
+#define NUM_DBG_LINES(block) \
+       ((block)->num_of_dbg_bus_lines + NUM_EXTRA_DBG_LINES(block))
+
+#define USE_DMAE                       true
+#define PROTECT_WIDE_BUS               true
 
 #define RAM_LINES_TO_DWORDS(lines)     ((lines) * 2)
 #define RAM_LINES_TO_BYTES(lines) \
 
 #define STATIC_DEBUG_LINE_DWORDS       9
 
-#define NUM_COMMON_GLOBAL_PARAMS       8
+#define NUM_COMMON_GLOBAL_PARAMS       9
+
+#define MAX_RECURSION_DEPTH            10
 
 #define FW_IMG_MAIN                    1
 
        (MCP_REG_SCRATCH + \
         offsetof(struct static_init, sections[SPAD_SECTION_TRACE]))
 
+#define MAX_SW_PLTAFORM_STR_SIZE       64
+
 #define EMPTY_FW_VERSION_STR           "???_???_???_???"
 #define EMPTY_FW_IMAGE_STR             "???????????????"
 
 /***************************** Constant Arrays *******************************/
 
-struct dbg_array {
-       const u32 *ptr;
-       u32 size_in_dwords;
-};
-
-/* Debug arrays */
-static struct dbg_array s_dbg_arrays[MAX_BIN_DBG_BUFFER_TYPE] = { {NULL} };
-
 /* Chip constant definitions array */
 static struct chip_defs s_chip_defs[MAX_CHIP_IDS] = {
        {"bb", PSWRQ2_REG_ILT_MEMORY_SIZE_BB / 2},
 static struct storm_defs s_storm_defs[] = {
        /* Tstorm */
        {'T', BLOCK_TSEM,
-        {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT,
-         DBG_BUS_CLIENT_RBCT}, true,
-        TSEM_REG_FAST_MEMORY,
-        TSEM_REG_DBG_FRAME_MODE_BB_K2, TSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
-        TSEM_REG_SLOW_DBG_MODE_BB_K2, TSEM_REG_DBG_MODE1_CFG_BB_K2,
-        TSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_SLOW_DBG_EMPTY_BB_K2,
-        TCM_REG_CTX_RBC_ACCS,
-        4, TCM_REG_AGG_CON_CTX,
-        16, TCM_REG_SM_CON_CTX,
-        2, TCM_REG_AGG_TASK_CTX,
-        4, TCM_REG_SM_TASK_CTX},
+               {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT},
+               true,
+               TSEM_REG_FAST_MEMORY,
+               TSEM_REG_DBG_FRAME_MODE_BB_K2, TSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
+               TSEM_REG_SLOW_DBG_MODE_BB_K2, TSEM_REG_DBG_MODE1_CFG_BB_K2,
+               TSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_DBG_GPRE_VECT,
+               TCM_REG_CTX_RBC_ACCS,
+               {TCM_REG_AGG_CON_CTX, TCM_REG_SM_CON_CTX, TCM_REG_AGG_TASK_CTX,
+                TCM_REG_SM_TASK_CTX},
+               {{4, 16, 2, 4}, {4, 16, 2, 4}} /* {bb} {k2} */
+       },
 
        /* Mstorm */
        {'M', BLOCK_MSEM,
-        {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM,
-         DBG_BUS_CLIENT_RBCM}, false,
-        MSEM_REG_FAST_MEMORY,
-        MSEM_REG_DBG_FRAME_MODE_BB_K2, MSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
-        MSEM_REG_SLOW_DBG_MODE_BB_K2, MSEM_REG_DBG_MODE1_CFG_BB_K2,
-        MSEM_REG_SYNC_DBG_EMPTY, MSEM_REG_SLOW_DBG_EMPTY_BB_K2,
-        MCM_REG_CTX_RBC_ACCS,
-        1, MCM_REG_AGG_CON_CTX,
-        10, MCM_REG_SM_CON_CTX,
-        2, MCM_REG_AGG_TASK_CTX,
-        7, MCM_REG_SM_TASK_CTX},
+               {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM},
+               false,
+               MSEM_REG_FAST_MEMORY,
+               MSEM_REG_DBG_FRAME_MODE_BB_K2,
+               MSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
+               MSEM_REG_SLOW_DBG_MODE_BB_K2,
+               MSEM_REG_DBG_MODE1_CFG_BB_K2,
+               MSEM_REG_SYNC_DBG_EMPTY,
+               MSEM_REG_DBG_GPRE_VECT,
+               MCM_REG_CTX_RBC_ACCS,
+               {MCM_REG_AGG_CON_CTX, MCM_REG_SM_CON_CTX, MCM_REG_AGG_TASK_CTX,
+                MCM_REG_SM_TASK_CTX },
+               {{1, 10, 2, 7}, {1, 10, 2, 7}} /* {bb} {k2}*/
+       },
 
        /* Ustorm */
        {'U', BLOCK_USEM,
-        {DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU,
-         DBG_BUS_CLIENT_RBCU}, false,
-        USEM_REG_FAST_MEMORY,
-        USEM_REG_DBG_FRAME_MODE_BB_K2, USEM_REG_SLOW_DBG_ACTIVE_BB_K2,
-        USEM_REG_SLOW_DBG_MODE_BB_K2, USEM_REG_DBG_MODE1_CFG_BB_K2,
-        USEM_REG_SYNC_DBG_EMPTY, USEM_REG_SLOW_DBG_EMPTY_BB_K2,
-        UCM_REG_CTX_RBC_ACCS,
-        2, UCM_REG_AGG_CON_CTX,
-        13, UCM_REG_SM_CON_CTX,
-        3, UCM_REG_AGG_TASK_CTX,
-        3, UCM_REG_SM_TASK_CTX},
+               {DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU},
+               false,
+               USEM_REG_FAST_MEMORY,
+               USEM_REG_DBG_FRAME_MODE_BB_K2,
+               USEM_REG_SLOW_DBG_ACTIVE_BB_K2,
+               USEM_REG_SLOW_DBG_MODE_BB_K2,
+               USEM_REG_DBG_MODE1_CFG_BB_K2,
+               USEM_REG_SYNC_DBG_EMPTY,
+               USEM_REG_DBG_GPRE_VECT,
+               UCM_REG_CTX_RBC_ACCS,
+               {UCM_REG_AGG_CON_CTX, UCM_REG_SM_CON_CTX, UCM_REG_AGG_TASK_CTX,
+                UCM_REG_SM_TASK_CTX},
+               {{2, 13, 3, 3}, {2, 13, 3, 3}} /* {bb} {k2} */
+       },
 
        /* Xstorm */
        {'X', BLOCK_XSEM,
-        {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX,
-         DBG_BUS_CLIENT_RBCX}, false,
-        XSEM_REG_FAST_MEMORY,
-        XSEM_REG_DBG_FRAME_MODE_BB_K2, XSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
-        XSEM_REG_SLOW_DBG_MODE_BB_K2, XSEM_REG_DBG_MODE1_CFG_BB_K2,
-        XSEM_REG_SYNC_DBG_EMPTY, XSEM_REG_SLOW_DBG_EMPTY_BB_K2,
-        XCM_REG_CTX_RBC_ACCS,
-        9, XCM_REG_AGG_CON_CTX,
-        15, XCM_REG_SM_CON_CTX,
-        0, 0,
-        0, 0},
+               {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX},
+               false,
+               XSEM_REG_FAST_MEMORY,
+               XSEM_REG_DBG_FRAME_MODE_BB_K2,
+               XSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
+               XSEM_REG_SLOW_DBG_MODE_BB_K2,
+               XSEM_REG_DBG_MODE1_CFG_BB_K2,
+               XSEM_REG_SYNC_DBG_EMPTY,
+               XSEM_REG_DBG_GPRE_VECT,
+               XCM_REG_CTX_RBC_ACCS,
+               {XCM_REG_AGG_CON_CTX, XCM_REG_SM_CON_CTX, 0, 0},
+               {{9, 15, 0, 0}, {9, 15, 0, 0}} /* {bb} {k2} */
+       },
 
        /* Ystorm */
        {'Y', BLOCK_YSEM,
-        {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY,
-         DBG_BUS_CLIENT_RBCY}, false,
-        YSEM_REG_FAST_MEMORY,
-        YSEM_REG_DBG_FRAME_MODE_BB_K2, YSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
-        YSEM_REG_SLOW_DBG_MODE_BB_K2, YSEM_REG_DBG_MODE1_CFG_BB_K2,
-        YSEM_REG_SYNC_DBG_EMPTY, TSEM_REG_SLOW_DBG_EMPTY_BB_K2,
-        YCM_REG_CTX_RBC_ACCS,
-        2, YCM_REG_AGG_CON_CTX,
-        3, YCM_REG_SM_CON_CTX,
-        2, YCM_REG_AGG_TASK_CTX,
-        12, YCM_REG_SM_TASK_CTX},
+               {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY},
+               false,
+               YSEM_REG_FAST_MEMORY,
+               YSEM_REG_DBG_FRAME_MODE_BB_K2,
+               YSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
+               YSEM_REG_SLOW_DBG_MODE_BB_K2,
+               YSEM_REG_DBG_MODE1_CFG_BB_K2,
+               YSEM_REG_SYNC_DBG_EMPTY,
+               YSEM_REG_DBG_GPRE_VECT,
+               YCM_REG_CTX_RBC_ACCS,
+               {YCM_REG_AGG_CON_CTX, YCM_REG_SM_CON_CTX, YCM_REG_AGG_TASK_CTX,
+                YCM_REG_SM_TASK_CTX},
+               {{2, 3, 2, 12}, {2, 3, 2, 12}} /* {bb} {k2} */
+       },
 
        /* Pstorm */
        {'P', BLOCK_PSEM,
-        {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS,
-         DBG_BUS_CLIENT_RBCS}, true,
-        PSEM_REG_FAST_MEMORY,
-        PSEM_REG_DBG_FRAME_MODE_BB_K2, PSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
-        PSEM_REG_SLOW_DBG_MODE_BB_K2, PSEM_REG_DBG_MODE1_CFG_BB_K2,
-        PSEM_REG_SYNC_DBG_EMPTY, PSEM_REG_SLOW_DBG_EMPTY_BB_K2,
-        PCM_REG_CTX_RBC_ACCS,
-        0, 0,
-        10, PCM_REG_SM_CON_CTX,
-        0, 0,
-        0, 0}
-};
-
-/* Block definitions array */
-
-static struct block_defs block_grc_defs = {
-       "grc",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCN, DBG_BUS_CLIENT_RBCN, DBG_BUS_CLIENT_RBCN},
-       GRC_REG_DBG_SELECT, GRC_REG_DBG_DWORD_ENABLE,
-       GRC_REG_DBG_SHIFT, GRC_REG_DBG_FORCE_VALID,
-       GRC_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISC_PL_UA, 1
-};
-
-static struct block_defs block_miscs_defs = {
-       "miscs", {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_misc_defs = {
-       "misc", {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_dbu_defs = {
-       "dbu", {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_pglue_b_defs = {
-       "pglue_b",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCH, DBG_BUS_CLIENT_RBCH, DBG_BUS_CLIENT_RBCH},
-       PGLUE_B_REG_DBG_SELECT, PGLUE_B_REG_DBG_DWORD_ENABLE,
-       PGLUE_B_REG_DBG_SHIFT, PGLUE_B_REG_DBG_FORCE_VALID,
-       PGLUE_B_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISCS_PL_HV, 1
-};
-
-static struct block_defs block_cnig_defs = {
-       "cnig",
-       {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCW,
-        DBG_BUS_CLIENT_RBCW},
-       CNIG_REG_DBG_SELECT_K2_E5, CNIG_REG_DBG_DWORD_ENABLE_K2_E5,
-       CNIG_REG_DBG_SHIFT_K2_E5, CNIG_REG_DBG_FORCE_VALID_K2_E5,
-       CNIG_REG_DBG_FORCE_FRAME_K2_E5,
-       true, false, DBG_RESET_REG_MISCS_PL_HV, 0
-};
-
-static struct block_defs block_cpmu_defs = {
-       "cpmu", {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       true, false, DBG_RESET_REG_MISCS_PL_HV, 8
-};
-
-static struct block_defs block_ncsi_defs = {
-       "ncsi",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCZ, DBG_BUS_CLIENT_RBCZ, DBG_BUS_CLIENT_RBCZ},
-       NCSI_REG_DBG_SELECT, NCSI_REG_DBG_DWORD_ENABLE,
-       NCSI_REG_DBG_SHIFT, NCSI_REG_DBG_FORCE_VALID,
-       NCSI_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISCS_PL_HV, 5
-};
-
-static struct block_defs block_opte_defs = {
-       "opte", {true, true, false}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       true, false, DBG_RESET_REG_MISCS_PL_HV, 4
-};
-
-static struct block_defs block_bmb_defs = {
-       "bmb",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCZ, DBG_BUS_CLIENT_RBCB, DBG_BUS_CLIENT_RBCB},
-       BMB_REG_DBG_SELECT, BMB_REG_DBG_DWORD_ENABLE,
-       BMB_REG_DBG_SHIFT, BMB_REG_DBG_FORCE_VALID,
-       BMB_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISCS_PL_UA, 7
-};
-
-static struct block_defs block_pcie_defs = {
-       "pcie",
-       {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCH,
-        DBG_BUS_CLIENT_RBCH},
-       PCIE_REG_DBG_COMMON_SELECT_K2_E5,
-       PCIE_REG_DBG_COMMON_DWORD_ENABLE_K2_E5,
-       PCIE_REG_DBG_COMMON_SHIFT_K2_E5,
-       PCIE_REG_DBG_COMMON_FORCE_VALID_K2_E5,
-       PCIE_REG_DBG_COMMON_FORCE_FRAME_K2_E5,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_mcp_defs = {
-       "mcp", {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_mcp2_defs = {
-       "mcp2",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCZ, DBG_BUS_CLIENT_RBCZ, DBG_BUS_CLIENT_RBCZ},
-       MCP2_REG_DBG_SELECT, MCP2_REG_DBG_DWORD_ENABLE,
-       MCP2_REG_DBG_SHIFT, MCP2_REG_DBG_FORCE_VALID,
-       MCP2_REG_DBG_FORCE_FRAME,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_pswhst_defs = {
-       "pswhst",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       PSWHST_REG_DBG_SELECT, PSWHST_REG_DBG_DWORD_ENABLE,
-       PSWHST_REG_DBG_SHIFT, PSWHST_REG_DBG_FORCE_VALID,
-       PSWHST_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISC_PL_HV, 0
-};
-
-static struct block_defs block_pswhst2_defs = {
-       "pswhst2",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       PSWHST2_REG_DBG_SELECT, PSWHST2_REG_DBG_DWORD_ENABLE,
-       PSWHST2_REG_DBG_SHIFT, PSWHST2_REG_DBG_FORCE_VALID,
-       PSWHST2_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISC_PL_HV, 0
-};
-
-static struct block_defs block_pswrd_defs = {
-       "pswrd",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       PSWRD_REG_DBG_SELECT, PSWRD_REG_DBG_DWORD_ENABLE,
-       PSWRD_REG_DBG_SHIFT, PSWRD_REG_DBG_FORCE_VALID,
-       PSWRD_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISC_PL_HV, 2
-};
-
-static struct block_defs block_pswrd2_defs = {
-       "pswrd2",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       PSWRD2_REG_DBG_SELECT, PSWRD2_REG_DBG_DWORD_ENABLE,
-       PSWRD2_REG_DBG_SHIFT, PSWRD2_REG_DBG_FORCE_VALID,
-       PSWRD2_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISC_PL_HV, 2
-};
-
-static struct block_defs block_pswwr_defs = {
-       "pswwr",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       PSWWR_REG_DBG_SELECT, PSWWR_REG_DBG_DWORD_ENABLE,
-       PSWWR_REG_DBG_SHIFT, PSWWR_REG_DBG_FORCE_VALID,
-       PSWWR_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISC_PL_HV, 3
-};
-
-static struct block_defs block_pswwr2_defs = {
-       "pswwr2", {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       true, false, DBG_RESET_REG_MISC_PL_HV, 3
-};
-
-static struct block_defs block_pswrq_defs = {
-       "pswrq",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       PSWRQ_REG_DBG_SELECT, PSWRQ_REG_DBG_DWORD_ENABLE,
-       PSWRQ_REG_DBG_SHIFT, PSWRQ_REG_DBG_FORCE_VALID,
-       PSWRQ_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISC_PL_HV, 1
-};
-
-static struct block_defs block_pswrq2_defs = {
-       "pswrq2",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       PSWRQ2_REG_DBG_SELECT, PSWRQ2_REG_DBG_DWORD_ENABLE,
-       PSWRQ2_REG_DBG_SHIFT, PSWRQ2_REG_DBG_FORCE_VALID,
-       PSWRQ2_REG_DBG_FORCE_FRAME,
-       true, false, DBG_RESET_REG_MISC_PL_HV, 1
-};
-
-static struct block_defs block_pglcs_defs = {
-       "pglcs",
-       {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCH,
-        DBG_BUS_CLIENT_RBCH},
-       PGLCS_REG_DBG_SELECT_K2_E5, PGLCS_REG_DBG_DWORD_ENABLE_K2_E5,
-       PGLCS_REG_DBG_SHIFT_K2_E5, PGLCS_REG_DBG_FORCE_VALID_K2_E5,
-       PGLCS_REG_DBG_FORCE_FRAME_K2_E5,
-       true, false, DBG_RESET_REG_MISCS_PL_HV, 2
-};
-
-static struct block_defs block_ptu_defs = {
-       "ptu",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       PTU_REG_DBG_SELECT, PTU_REG_DBG_DWORD_ENABLE,
-       PTU_REG_DBG_SHIFT, PTU_REG_DBG_FORCE_VALID,
-       PTU_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 20
-};
-
-static struct block_defs block_dmae_defs = {
-       "dmae",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       DMAE_REG_DBG_SELECT, DMAE_REG_DBG_DWORD_ENABLE,
-       DMAE_REG_DBG_SHIFT, DMAE_REG_DBG_FORCE_VALID,
-       DMAE_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 28
-};
-
-static struct block_defs block_tcm_defs = {
-       "tcm",
-       {true, true, true}, true, DBG_TSTORM_ID,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT},
-       TCM_REG_DBG_SELECT, TCM_REG_DBG_DWORD_ENABLE,
-       TCM_REG_DBG_SHIFT, TCM_REG_DBG_FORCE_VALID,
-       TCM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 5
-};
-
-static struct block_defs block_mcm_defs = {
-       "mcm",
-       {true, true, true}, true, DBG_MSTORM_ID,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM, DBG_BUS_CLIENT_RBCM},
-       MCM_REG_DBG_SELECT, MCM_REG_DBG_DWORD_ENABLE,
-       MCM_REG_DBG_SHIFT, MCM_REG_DBG_FORCE_VALID,
-       MCM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 3
-};
-
-static struct block_defs block_ucm_defs = {
-       "ucm",
-       {true, true, true}, true, DBG_USTORM_ID,
-       {DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU},
-       UCM_REG_DBG_SELECT, UCM_REG_DBG_DWORD_ENABLE,
-       UCM_REG_DBG_SHIFT, UCM_REG_DBG_FORCE_VALID,
-       UCM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 8
-};
-
-static struct block_defs block_xcm_defs = {
-       "xcm",
-       {true, true, true}, true, DBG_XSTORM_ID,
-       {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX},
-       XCM_REG_DBG_SELECT, XCM_REG_DBG_DWORD_ENABLE,
-       XCM_REG_DBG_SHIFT, XCM_REG_DBG_FORCE_VALID,
-       XCM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 19
-};
-
-static struct block_defs block_ycm_defs = {
-       "ycm",
-       {true, true, true}, true, DBG_YSTORM_ID,
-       {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY, DBG_BUS_CLIENT_RBCY},
-       YCM_REG_DBG_SELECT, YCM_REG_DBG_DWORD_ENABLE,
-       YCM_REG_DBG_SHIFT, YCM_REG_DBG_FORCE_VALID,
-       YCM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 5
-};
-
-static struct block_defs block_pcm_defs = {
-       "pcm",
-       {true, true, true}, true, DBG_PSTORM_ID,
-       {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS},
-       PCM_REG_DBG_SELECT, PCM_REG_DBG_DWORD_ENABLE,
-       PCM_REG_DBG_SHIFT, PCM_REG_DBG_FORCE_VALID,
-       PCM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 4
-};
-
-static struct block_defs block_qm_defs = {
-       "qm",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCQ, DBG_BUS_CLIENT_RBCQ},
-       QM_REG_DBG_SELECT, QM_REG_DBG_DWORD_ENABLE,
-       QM_REG_DBG_SHIFT, QM_REG_DBG_FORCE_VALID,
-       QM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 16
-};
-
-static struct block_defs block_tm_defs = {
-       "tm",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS},
-       TM_REG_DBG_SELECT, TM_REG_DBG_DWORD_ENABLE,
-       TM_REG_DBG_SHIFT, TM_REG_DBG_FORCE_VALID,
-       TM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 17
-};
-
-static struct block_defs block_dorq_defs = {
-       "dorq",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY, DBG_BUS_CLIENT_RBCY},
-       DORQ_REG_DBG_SELECT, DORQ_REG_DBG_DWORD_ENABLE,
-       DORQ_REG_DBG_SHIFT, DORQ_REG_DBG_FORCE_VALID,
-       DORQ_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 18
-};
-
-static struct block_defs block_brb_defs = {
-       "brb",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCR, DBG_BUS_CLIENT_RBCR, DBG_BUS_CLIENT_RBCR},
-       BRB_REG_DBG_SELECT, BRB_REG_DBG_DWORD_ENABLE,
-       BRB_REG_DBG_SHIFT, BRB_REG_DBG_FORCE_VALID,
-       BRB_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 0
-};
-
-static struct block_defs block_src_defs = {
-       "src",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF},
-       SRC_REG_DBG_SELECT, SRC_REG_DBG_DWORD_ENABLE,
-       SRC_REG_DBG_SHIFT, SRC_REG_DBG_FORCE_VALID,
-       SRC_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 2
-};
-
-static struct block_defs block_prs_defs = {
-       "prs",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCR, DBG_BUS_CLIENT_RBCR, DBG_BUS_CLIENT_RBCR},
-       PRS_REG_DBG_SELECT, PRS_REG_DBG_DWORD_ENABLE,
-       PRS_REG_DBG_SHIFT, PRS_REG_DBG_FORCE_VALID,
-       PRS_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 1
-};
-
-static struct block_defs block_tsdm_defs = {
-       "tsdm",
-       {true, true, true}, true, DBG_TSTORM_ID,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT},
-       TSDM_REG_DBG_SELECT, TSDM_REG_DBG_DWORD_ENABLE,
-       TSDM_REG_DBG_SHIFT, TSDM_REG_DBG_FORCE_VALID,
-       TSDM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 3
-};
-
-static struct block_defs block_msdm_defs = {
-       "msdm",
-       {true, true, true}, true, DBG_MSTORM_ID,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM, DBG_BUS_CLIENT_RBCM},
-       MSDM_REG_DBG_SELECT, MSDM_REG_DBG_DWORD_ENABLE,
-       MSDM_REG_DBG_SHIFT, MSDM_REG_DBG_FORCE_VALID,
-       MSDM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 6
-};
-
-static struct block_defs block_usdm_defs = {
-       "usdm",
-       {true, true, true}, true, DBG_USTORM_ID,
-       {DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU},
-       USDM_REG_DBG_SELECT, USDM_REG_DBG_DWORD_ENABLE,
-       USDM_REG_DBG_SHIFT, USDM_REG_DBG_FORCE_VALID,
-       USDM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 7
-};
-
-static struct block_defs block_xsdm_defs = {
-       "xsdm",
-       {true, true, true}, true, DBG_XSTORM_ID,
-       {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX},
-       XSDM_REG_DBG_SELECT, XSDM_REG_DBG_DWORD_ENABLE,
-       XSDM_REG_DBG_SHIFT, XSDM_REG_DBG_FORCE_VALID,
-       XSDM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 20
-};
-
-static struct block_defs block_ysdm_defs = {
-       "ysdm",
-       {true, true, true}, true, DBG_YSTORM_ID,
-       {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY, DBG_BUS_CLIENT_RBCY},
-       YSDM_REG_DBG_SELECT, YSDM_REG_DBG_DWORD_ENABLE,
-       YSDM_REG_DBG_SHIFT, YSDM_REG_DBG_FORCE_VALID,
-       YSDM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 8
-};
-
-static struct block_defs block_psdm_defs = {
-       "psdm",
-       {true, true, true}, true, DBG_PSTORM_ID,
-       {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS},
-       PSDM_REG_DBG_SELECT, PSDM_REG_DBG_DWORD_ENABLE,
-       PSDM_REG_DBG_SHIFT, PSDM_REG_DBG_FORCE_VALID,
-       PSDM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 7
-};
-
-static struct block_defs block_tsem_defs = {
-       "tsem",
-       {true, true, true}, true, DBG_TSTORM_ID,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT},
-       TSEM_REG_DBG_SELECT, TSEM_REG_DBG_DWORD_ENABLE,
-       TSEM_REG_DBG_SHIFT, TSEM_REG_DBG_FORCE_VALID,
-       TSEM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 4
-};
-
-static struct block_defs block_msem_defs = {
-       "msem",
-       {true, true, true}, true, DBG_MSTORM_ID,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM, DBG_BUS_CLIENT_RBCM},
-       MSEM_REG_DBG_SELECT, MSEM_REG_DBG_DWORD_ENABLE,
-       MSEM_REG_DBG_SHIFT, MSEM_REG_DBG_FORCE_VALID,
-       MSEM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 9
-};
-
-static struct block_defs block_usem_defs = {
-       "usem",
-       {true, true, true}, true, DBG_USTORM_ID,
-       {DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU},
-       USEM_REG_DBG_SELECT, USEM_REG_DBG_DWORD_ENABLE,
-       USEM_REG_DBG_SHIFT, USEM_REG_DBG_FORCE_VALID,
-       USEM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 9
-};
-
-static struct block_defs block_xsem_defs = {
-       "xsem",
-       {true, true, true}, true, DBG_XSTORM_ID,
-       {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX},
-       XSEM_REG_DBG_SELECT, XSEM_REG_DBG_DWORD_ENABLE,
-       XSEM_REG_DBG_SHIFT, XSEM_REG_DBG_FORCE_VALID,
-       XSEM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 21
-};
-
-static struct block_defs block_ysem_defs = {
-       "ysem",
-       {true, true, true}, true, DBG_YSTORM_ID,
-       {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCY, DBG_BUS_CLIENT_RBCY},
-       YSEM_REG_DBG_SELECT, YSEM_REG_DBG_DWORD_ENABLE,
-       YSEM_REG_DBG_SHIFT, YSEM_REG_DBG_FORCE_VALID,
-       YSEM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 11
-};
-
-static struct block_defs block_psem_defs = {
-       "psem",
-       {true, true, true}, true, DBG_PSTORM_ID,
-       {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS},
-       PSEM_REG_DBG_SELECT, PSEM_REG_DBG_DWORD_ENABLE,
-       PSEM_REG_DBG_SHIFT, PSEM_REG_DBG_FORCE_VALID,
-       PSEM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 10
-};
-
-static struct block_defs block_rss_defs = {
-       "rss",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCT},
-       RSS_REG_DBG_SELECT, RSS_REG_DBG_DWORD_ENABLE,
-       RSS_REG_DBG_SHIFT, RSS_REG_DBG_FORCE_VALID,
-       RSS_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 18
-};
-
-static struct block_defs block_tmld_defs = {
-       "tmld",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM, DBG_BUS_CLIENT_RBCM},
-       TMLD_REG_DBG_SELECT, TMLD_REG_DBG_DWORD_ENABLE,
-       TMLD_REG_DBG_SHIFT, TMLD_REG_DBG_FORCE_VALID,
-       TMLD_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 13
-};
-
-static struct block_defs block_muld_defs = {
-       "muld",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU},
-       MULD_REG_DBG_SELECT, MULD_REG_DBG_DWORD_ENABLE,
-       MULD_REG_DBG_SHIFT, MULD_REG_DBG_FORCE_VALID,
-       MULD_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 14
-};
-
-static struct block_defs block_yuld_defs = {
-       "yuld",
-       {true, true, false}, false, 0,
-       {DBG_BUS_CLIENT_RBCU, DBG_BUS_CLIENT_RBCU,
-        MAX_DBG_BUS_CLIENTS},
-       YULD_REG_DBG_SELECT_BB_K2, YULD_REG_DBG_DWORD_ENABLE_BB_K2,
-       YULD_REG_DBG_SHIFT_BB_K2, YULD_REG_DBG_FORCE_VALID_BB_K2,
-       YULD_REG_DBG_FORCE_FRAME_BB_K2,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2,
-       15
-};
-
-static struct block_defs block_xyld_defs = {
-       "xyld",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX, DBG_BUS_CLIENT_RBCX},
-       XYLD_REG_DBG_SELECT, XYLD_REG_DBG_DWORD_ENABLE,
-       XYLD_REG_DBG_SHIFT, XYLD_REG_DBG_FORCE_VALID,
-       XYLD_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 12
-};
-
-static struct block_defs block_ptld_defs = {
-       "ptld",
-       {false, false, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCT},
-       PTLD_REG_DBG_SELECT_E5, PTLD_REG_DBG_DWORD_ENABLE_E5,
-       PTLD_REG_DBG_SHIFT_E5, PTLD_REG_DBG_FORCE_VALID_E5,
-       PTLD_REG_DBG_FORCE_FRAME_E5,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2,
-       28
-};
-
-static struct block_defs block_ypld_defs = {
-       "ypld",
-       {false, false, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCS},
-       YPLD_REG_DBG_SELECT_E5, YPLD_REG_DBG_DWORD_ENABLE_E5,
-       YPLD_REG_DBG_SHIFT_E5, YPLD_REG_DBG_FORCE_VALID_E5,
-       YPLD_REG_DBG_FORCE_FRAME_E5,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2,
-       27
-};
-
-static struct block_defs block_prm_defs = {
-       "prm",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM, DBG_BUS_CLIENT_RBCM},
-       PRM_REG_DBG_SELECT, PRM_REG_DBG_DWORD_ENABLE,
-       PRM_REG_DBG_SHIFT, PRM_REG_DBG_FORCE_VALID,
-       PRM_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 21
-};
-
-static struct block_defs block_pbf_pb1_defs = {
-       "pbf_pb1",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCV, DBG_BUS_CLIENT_RBCV},
-       PBF_PB1_REG_DBG_SELECT, PBF_PB1_REG_DBG_DWORD_ENABLE,
-       PBF_PB1_REG_DBG_SHIFT, PBF_PB1_REG_DBG_FORCE_VALID,
-       PBF_PB1_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1,
-       11
-};
-
-static struct block_defs block_pbf_pb2_defs = {
-       "pbf_pb2",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCV, DBG_BUS_CLIENT_RBCV},
-       PBF_PB2_REG_DBG_SELECT, PBF_PB2_REG_DBG_DWORD_ENABLE,
-       PBF_PB2_REG_DBG_SHIFT, PBF_PB2_REG_DBG_FORCE_VALID,
-       PBF_PB2_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1,
-       12
-};
-
-static struct block_defs block_rpb_defs = {
-       "rpb",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM, DBG_BUS_CLIENT_RBCM},
-       RPB_REG_DBG_SELECT, RPB_REG_DBG_DWORD_ENABLE,
-       RPB_REG_DBG_SHIFT, RPB_REG_DBG_FORCE_VALID,
-       RPB_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 13
-};
-
-static struct block_defs block_btb_defs = {
-       "btb",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCR, DBG_BUS_CLIENT_RBCV, DBG_BUS_CLIENT_RBCV},
-       BTB_REG_DBG_SELECT, BTB_REG_DBG_DWORD_ENABLE,
-       BTB_REG_DBG_SHIFT, BTB_REG_DBG_FORCE_VALID,
-       BTB_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 10
-};
-
-static struct block_defs block_pbf_defs = {
-       "pbf",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCV, DBG_BUS_CLIENT_RBCV},
-       PBF_REG_DBG_SELECT, PBF_REG_DBG_DWORD_ENABLE,
-       PBF_REG_DBG_SHIFT, PBF_REG_DBG_FORCE_VALID,
-       PBF_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 15
-};
-
-static struct block_defs block_rdif_defs = {
-       "rdif",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCT, DBG_BUS_CLIENT_RBCM, DBG_BUS_CLIENT_RBCM},
-       RDIF_REG_DBG_SELECT, RDIF_REG_DBG_DWORD_ENABLE,
-       RDIF_REG_DBG_SHIFT, RDIF_REG_DBG_FORCE_VALID,
-       RDIF_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 16
-};
-
-static struct block_defs block_tdif_defs = {
-       "tdif",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS},
-       TDIF_REG_DBG_SELECT, TDIF_REG_DBG_DWORD_ENABLE,
-       TDIF_REG_DBG_SHIFT, TDIF_REG_DBG_FORCE_VALID,
-       TDIF_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 17
-};
-
-static struct block_defs block_cdu_defs = {
-       "cdu",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF},
-       CDU_REG_DBG_SELECT, CDU_REG_DBG_DWORD_ENABLE,
-       CDU_REG_DBG_SHIFT, CDU_REG_DBG_FORCE_VALID,
-       CDU_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 23
-};
-
-static struct block_defs block_ccfc_defs = {
-       "ccfc",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF},
-       CCFC_REG_DBG_SELECT, CCFC_REG_DBG_DWORD_ENABLE,
-       CCFC_REG_DBG_SHIFT, CCFC_REG_DBG_FORCE_VALID,
-       CCFC_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 24
-};
-
-static struct block_defs block_tcfc_defs = {
-       "tcfc",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF, DBG_BUS_CLIENT_RBCF},
-       TCFC_REG_DBG_SELECT, TCFC_REG_DBG_DWORD_ENABLE,
-       TCFC_REG_DBG_SHIFT, TCFC_REG_DBG_FORCE_VALID,
-       TCFC_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 25
-};
-
-static struct block_defs block_igu_defs = {
-       "igu",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       IGU_REG_DBG_SELECT, IGU_REG_DBG_DWORD_ENABLE,
-       IGU_REG_DBG_SHIFT, IGU_REG_DBG_FORCE_VALID,
-       IGU_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1, 27
-};
-
-static struct block_defs block_cau_defs = {
-       "cau",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP, DBG_BUS_CLIENT_RBCP},
-       CAU_REG_DBG_SELECT, CAU_REG_DBG_DWORD_ENABLE,
-       CAU_REG_DBG_SHIFT, CAU_REG_DBG_FORCE_VALID,
-       CAU_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 19
-};
-
-static struct block_defs block_rgfs_defs = {
-       "rgfs", {false, false, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 29
-};
-
-static struct block_defs block_rgsrc_defs = {
-       "rgsrc",
-       {false, false, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCH},
-       RGSRC_REG_DBG_SELECT_E5, RGSRC_REG_DBG_DWORD_ENABLE_E5,
-       RGSRC_REG_DBG_SHIFT_E5, RGSRC_REG_DBG_FORCE_VALID_E5,
-       RGSRC_REG_DBG_FORCE_FRAME_E5,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1,
-       30
-};
-
-static struct block_defs block_tgfs_defs = {
-       "tgfs", {false, false, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_2, 30
-};
-
-static struct block_defs block_tgsrc_defs = {
-       "tgsrc",
-       {false, false, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCV},
-       TGSRC_REG_DBG_SELECT_E5, TGSRC_REG_DBG_DWORD_ENABLE_E5,
-       TGSRC_REG_DBG_SHIFT_E5, TGSRC_REG_DBG_FORCE_VALID_E5,
-       TGSRC_REG_DBG_FORCE_FRAME_E5,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VMAIN_1,
-       31
-};
-
-static struct block_defs block_umac_defs = {
-       "umac",
-       {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCZ,
-        DBG_BUS_CLIENT_RBCZ},
-       UMAC_REG_DBG_SELECT_K2_E5, UMAC_REG_DBG_DWORD_ENABLE_K2_E5,
-       UMAC_REG_DBG_SHIFT_K2_E5, UMAC_REG_DBG_FORCE_VALID_K2_E5,
-       UMAC_REG_DBG_FORCE_FRAME_K2_E5,
-       true, false, DBG_RESET_REG_MISCS_PL_HV, 6
-};
-
-static struct block_defs block_xmac_defs = {
-       "xmac", {true, false, false}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_dbg_defs = {
-       "dbg", {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VAUX, 3
-};
-
-static struct block_defs block_nig_defs = {
-       "nig",
-       {true, true, true}, false, 0,
-       {DBG_BUS_CLIENT_RBCN, DBG_BUS_CLIENT_RBCN, DBG_BUS_CLIENT_RBCN},
-       NIG_REG_DBG_SELECT, NIG_REG_DBG_DWORD_ENABLE,
-       NIG_REG_DBG_SHIFT, NIG_REG_DBG_FORCE_VALID,
-       NIG_REG_DBG_FORCE_FRAME,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VAUX, 0
-};
-
-static struct block_defs block_wol_defs = {
-       "wol",
-       {false, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCZ, DBG_BUS_CLIENT_RBCZ},
-       WOL_REG_DBG_SELECT_K2_E5, WOL_REG_DBG_DWORD_ENABLE_K2_E5,
-       WOL_REG_DBG_SHIFT_K2_E5, WOL_REG_DBG_FORCE_VALID_K2_E5,
-       WOL_REG_DBG_FORCE_FRAME_K2_E5,
-       true, true, DBG_RESET_REG_MISC_PL_PDA_VAUX, 7
-};
-
-static struct block_defs block_bmbn_defs = {
-       "bmbn",
-       {false, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCB,
-        DBG_BUS_CLIENT_RBCB},
-       BMBN_REG_DBG_SELECT_K2_E5, BMBN_REG_DBG_DWORD_ENABLE_K2_E5,
-       BMBN_REG_DBG_SHIFT_K2_E5, BMBN_REG_DBG_FORCE_VALID_K2_E5,
-       BMBN_REG_DBG_FORCE_FRAME_K2_E5,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_ipc_defs = {
-       "ipc", {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       true, false, DBG_RESET_REG_MISCS_PL_UA, 8
-};
-
-static struct block_defs block_nwm_defs = {
-       "nwm",
-       {false, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCW, DBG_BUS_CLIENT_RBCW},
-       NWM_REG_DBG_SELECT_K2_E5, NWM_REG_DBG_DWORD_ENABLE_K2_E5,
-       NWM_REG_DBG_SHIFT_K2_E5, NWM_REG_DBG_FORCE_VALID_K2_E5,
-       NWM_REG_DBG_FORCE_FRAME_K2_E5,
-       true, false, DBG_RESET_REG_MISCS_PL_HV_2, 0
-};
-
-static struct block_defs block_nws_defs = {
-       "nws",
-       {false, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCW, DBG_BUS_CLIENT_RBCW},
-       NWS_REG_DBG_SELECT_K2_E5, NWS_REG_DBG_DWORD_ENABLE_K2_E5,
-       NWS_REG_DBG_SHIFT_K2_E5, NWS_REG_DBG_FORCE_VALID_K2_E5,
-       NWS_REG_DBG_FORCE_FRAME_K2_E5,
-       true, false, DBG_RESET_REG_MISCS_PL_HV, 12
-};
-
-static struct block_defs block_ms_defs = {
-       "ms",
-       {false, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCZ, DBG_BUS_CLIENT_RBCZ},
-       MS_REG_DBG_SELECT_K2_E5, MS_REG_DBG_DWORD_ENABLE_K2_E5,
-       MS_REG_DBG_SHIFT_K2_E5, MS_REG_DBG_FORCE_VALID_K2_E5,
-       MS_REG_DBG_FORCE_FRAME_K2_E5,
-       true, false, DBG_RESET_REG_MISCS_PL_HV, 13
-};
-
-static struct block_defs block_phy_pcie_defs = {
-       "phy_pcie",
-       {false, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, DBG_BUS_CLIENT_RBCH,
-        DBG_BUS_CLIENT_RBCH},
-       PCIE_REG_DBG_COMMON_SELECT_K2_E5,
-       PCIE_REG_DBG_COMMON_DWORD_ENABLE_K2_E5,
-       PCIE_REG_DBG_COMMON_SHIFT_K2_E5,
-       PCIE_REG_DBG_COMMON_FORCE_VALID_K2_E5,
-       PCIE_REG_DBG_COMMON_FORCE_FRAME_K2_E5,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_led_defs = {
-       "led", {false, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       true, false, DBG_RESET_REG_MISCS_PL_HV, 14
-};
-
-static struct block_defs block_avs_wrap_defs = {
-       "avs_wrap", {false, true, false}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       true, false, DBG_RESET_REG_MISCS_PL_UA, 11
-};
-
-static struct block_defs block_pxpreqbus_defs = {
-       "pxpreqbus", {false, false, false}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_misc_aeu_defs = {
-       "misc_aeu", {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs block_bar0_map_defs = {
-       "bar0_map", {true, true, true}, false, 0,
-       {MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS, MAX_DBG_BUS_CLIENTS},
-       0, 0, 0, 0, 0,
-       false, false, MAX_DBG_RESET_REGS, 0
-};
-
-static struct block_defs *s_block_defs[MAX_BLOCK_ID] = {
-       &block_grc_defs,
-       &block_miscs_defs,
-       &block_misc_defs,
-       &block_dbu_defs,
-       &block_pglue_b_defs,
-       &block_cnig_defs,
-       &block_cpmu_defs,
-       &block_ncsi_defs,
-       &block_opte_defs,
-       &block_bmb_defs,
-       &block_pcie_defs,
-       &block_mcp_defs,
-       &block_mcp2_defs,
-       &block_pswhst_defs,
-       &block_pswhst2_defs,
-       &block_pswrd_defs,
-       &block_pswrd2_defs,
-       &block_pswwr_defs,
-       &block_pswwr2_defs,
-       &block_pswrq_defs,
-       &block_pswrq2_defs,
-       &block_pglcs_defs,
-       &block_dmae_defs,
-       &block_ptu_defs,
-       &block_tcm_defs,
-       &block_mcm_defs,
-       &block_ucm_defs,
-       &block_xcm_defs,
-       &block_ycm_defs,
-       &block_pcm_defs,
-       &block_qm_defs,
-       &block_tm_defs,
-       &block_dorq_defs,
-       &block_brb_defs,
-       &block_src_defs,
-       &block_prs_defs,
-       &block_tsdm_defs,
-       &block_msdm_defs,
-       &block_usdm_defs,
-       &block_xsdm_defs,
-       &block_ysdm_defs,
-       &block_psdm_defs,
-       &block_tsem_defs,
-       &block_msem_defs,
-       &block_usem_defs,
-       &block_xsem_defs,
-       &block_ysem_defs,
-       &block_psem_defs,
-       &block_rss_defs,
-       &block_tmld_defs,
-       &block_muld_defs,
-       &block_yuld_defs,
-       &block_xyld_defs,
-       &block_ptld_defs,
-       &block_ypld_defs,
-       &block_prm_defs,
-       &block_pbf_pb1_defs,
-       &block_pbf_pb2_defs,
-       &block_rpb_defs,
-       &block_btb_defs,
-       &block_pbf_defs,
-       &block_rdif_defs,
-       &block_tdif_defs,
-       &block_cdu_defs,
-       &block_ccfc_defs,
-       &block_tcfc_defs,
-       &block_igu_defs,
-       &block_cau_defs,
-       &block_rgfs_defs,
-       &block_rgsrc_defs,
-       &block_tgfs_defs,
-       &block_tgsrc_defs,
-       &block_umac_defs,
-       &block_xmac_defs,
-       &block_dbg_defs,
-       &block_nig_defs,
-       &block_wol_defs,
-       &block_bmbn_defs,
-       &block_ipc_defs,
-       &block_nwm_defs,
-       &block_nws_defs,
-       &block_ms_defs,
-       &block_phy_pcie_defs,
-       &block_led_defs,
-       &block_avs_wrap_defs,
-       &block_pxpreqbus_defs,
-       &block_misc_aeu_defs,
-       &block_bar0_map_defs,
-};
-
-static struct platform_defs s_platform_defs[] = {
+               {DBG_BUS_CLIENT_RBCS, DBG_BUS_CLIENT_RBCS},
+               true,
+               PSEM_REG_FAST_MEMORY,
+               PSEM_REG_DBG_FRAME_MODE_BB_K2,
+               PSEM_REG_SLOW_DBG_ACTIVE_BB_K2,
+               PSEM_REG_SLOW_DBG_MODE_BB_K2,
+               PSEM_REG_DBG_MODE1_CFG_BB_K2,
+               PSEM_REG_SYNC_DBG_EMPTY,
+               PSEM_REG_DBG_GPRE_VECT,
+               PCM_REG_CTX_RBC_ACCS,
+               {0, PCM_REG_SM_CON_CTX, 0, 0},
+               {{0, 10, 0, 0}, {0, 10, 0, 0}} /* {bb} {k2} */
+       },
+};
+
+static struct hw_type_defs s_hw_type_defs[] = {
+       /* HW_TYPE_ASIC */
        {"asic", 1, 256, 32768},
        {"reserved", 0, 0, 0},
        {"reserved2", 0, 0, 0},
 
 static struct grc_param_defs s_grc_param_defs[] = {
        /* DBG_GRC_PARAM_DUMP_TSTORM */
-       {{1, 1, 1}, 0, 1, false, false, 1, 1},
+       {{1, 1}, 0, 1, false, false, 1, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_MSTORM */
-       {{1, 1, 1}, 0, 1, false, false, 1, 1},
+       {{1, 1}, 0, 1, false, false, 1, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_USTORM */
-       {{1, 1, 1}, 0, 1, false, false, 1, 1},
+       {{1, 1}, 0, 1, false, false, 1, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_XSTORM */
-       {{1, 1, 1}, 0, 1, false, false, 1, 1},
+       {{1, 1}, 0, 1, false, false, 1, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_YSTORM */
-       {{1, 1, 1}, 0, 1, false, false, 1, 1},
+       {{1, 1}, 0, 1, false, false, 1, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_PSTORM */
-       {{1, 1, 1}, 0, 1, false, false, 1, 1},
+       {{1, 1}, 0, 1, false, false, 1, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_REGS */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_RAM */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_PBUF */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_IOR */
-       {{0, 0, 0}, 0, 1, false, false, 0, 1},
+       {{0, 0}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_VFC */
-       {{0, 0, 0}, 0, 1, false, false, 0, 1},
+       {{0, 0}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_CM_CTX */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_ILT */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_RSS */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_CAU */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_QM */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_MCP */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
-       /* DBG_GRC_PARAM_MCP_TRACE_META_SIZE */
-       {{1, 1, 1}, 1, 0xffffffff, false, true, 0, 1},
+       /* DBG_GRC_PARAM_DUMP_DORQ */
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_CFC */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_IGU */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_BRB */
-       {{0, 0, 0}, 0, 1, false, false, 0, 1},
+       {{0, 0}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_BTB */
-       {{0, 0, 0}, 0, 1, false, false, 0, 1},
+       {{0, 0}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_BMB */
-       {{0, 0, 0}, 0, 1, false, false, 0, 0},
+       {{0, 0}, 0, 1, false, false, 0, {0, 0}},
 
-       /* DBG_GRC_PARAM_DUMP_NIG */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       /* DBG_GRC_PARAM_RESERVED1 */
+       {{0, 0}, 0, 1, false, false, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_DUMP_MULD */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_PRS */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_DMAE */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_TM */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_SDM */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_DIF */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_STATIC */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_UNSTALL */
-       {{0, 0, 0}, 0, 1, false, false, 0, 0},
+       {{0, 0}, 0, 1, false, false, 0, {0, 0}},
 
-       /* DBG_GRC_PARAM_NUM_LCIDS */
-       {{MAX_LCIDS, MAX_LCIDS, MAX_LCIDS}, 1, MAX_LCIDS, false, false,
-        MAX_LCIDS, MAX_LCIDS},
+       /* DBG_GRC_PARAM_RESERVED2 */
+       {{0, 0}, 0, 1, false, false, 0, {0, 0}},
 
-       /* DBG_GRC_PARAM_NUM_LTIDS */
-       {{MAX_LTIDS, MAX_LTIDS, MAX_LTIDS}, 1, MAX_LTIDS, false, false,
-        MAX_LTIDS, MAX_LTIDS},
+       /* DBG_GRC_PARAM_MCP_TRACE_META_SIZE */
+       {{0, 0}, 1, 0xffffffff, false, true, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_EXCLUDE_ALL */
-       {{0, 0, 0}, 0, 1, true, false, 0, 0},
+       {{0, 0}, 0, 1, true, false, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_CRASH */
-       {{0, 0, 0}, 0, 1, true, false, 0, 0},
+       {{0, 0}, 0, 1, true, false, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_PARITY_SAFE */
-       {{0, 0, 0}, 0, 1, false, false, 1, 0},
+       {{0, 0}, 0, 1, false, false, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_DUMP_CM */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{1, 1}, 0, 1, false, false, 0, {1, 1}},
 
        /* DBG_GRC_PARAM_DUMP_PHY */
-       {{1, 1, 1}, 0, 1, false, false, 0, 1},
+       {{0, 0}, 0, 1, false, false, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_NO_MCP */
-       {{0, 0, 0}, 0, 1, false, false, 0, 0},
+       {{0, 0}, 0, 1, false, false, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_NO_FW_VER */
-       {{0, 0, 0}, 0, 1, false, false, 0, 0},
+       {{0, 0}, 0, 1, false, false, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_RESERVED3 */
-       {{0, 0, 0}, 0, 1, false, false, 0, 0},
+       {{0, 0}, 0, 1, false, false, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_DUMP_MCP_HW_DUMP */
-       {{0, 1, 1}, 0, 1, false, false, 0, 0},
+       {{0, 1}, 0, 1, false, false, 0, {0, 1}},
 
        /* DBG_GRC_PARAM_DUMP_ILT_CDUC */
-       {{1, 1, 1}, 0, 1, false, false, 0, 0},
+       {{1, 1}, 0, 1, false, false, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_DUMP_ILT_CDUT */
-       {{1, 1, 1}, 0, 1, false, false, 0, 0},
+       {{1, 1}, 0, 1, false, false, 0, {0, 0}},
 
        /* DBG_GRC_PARAM_DUMP_CAU_EXT */
-       {{0, 0, 0}, 0, 1, false, false, 0, 1}
+       {{0, 0}, 0, 1, false, false, 0, {1, 1}}
 };
 
 static struct rss_mem_defs s_rss_mem_defs[] = {
-       { "rss_mem_cid", "rss_cid", 0, 32,
-         {256, 320, 512} },
+       {"rss_mem_cid", "rss_cid", 0, 32,
+        {256, 320}},
 
-       { "rss_mem_key_msb", "rss_key", 1024, 256,
-         {128, 208, 257} },
+       {"rss_mem_key_msb", "rss_key", 1024, 256,
+        {128, 208}},
 
-       { "rss_mem_key_lsb", "rss_key", 2048, 64,
-         {128, 208, 257} },
+       {"rss_mem_key_lsb", "rss_key", 2048, 64,
+        {128, 208}},
 
-       { "rss_mem_info", "rss_info", 3072, 16,
-         {128, 208, 256} },
+       {"rss_mem_info", "rss_info", 3072, 16,
+        {128, 208}},
 
-       { "rss_mem_ind", "rss_ind", 4096, 16,
-         {16384, 26624, 32768} }
+       {"rss_mem_ind", "rss_ind", 4096, 16,
+        {16384, 26624}}
 };
 
 static struct vfc_ram_defs s_vfc_ram_defs[] = {
 };
 
 static struct big_ram_defs s_big_ram_defs[] = {
-       { "BRB", MEM_GROUP_BRB_MEM, MEM_GROUP_BRB_RAM, DBG_GRC_PARAM_DUMP_BRB,
-         BRB_REG_BIG_RAM_ADDRESS, BRB_REG_BIG_RAM_DATA,
-         MISC_REG_BLOCK_256B_EN, {0, 0, 0},
-         {153600, 180224, 282624} },
-
-       { "BTB", MEM_GROUP_BTB_MEM, MEM_GROUP_BTB_RAM, DBG_GRC_PARAM_DUMP_BTB,
-         BTB_REG_BIG_RAM_ADDRESS, BTB_REG_BIG_RAM_DATA,
-         MISC_REG_BLOCK_256B_EN, {0, 1, 1},
-         {92160, 117760, 168960} },
-
-       { "BMB", MEM_GROUP_BMB_MEM, MEM_GROUP_BMB_RAM, DBG_GRC_PARAM_DUMP_BMB,
-         BMB_REG_BIG_RAM_ADDRESS, BMB_REG_BIG_RAM_DATA,
-         MISCS_REG_BLOCK_256B_EN, {0, 0, 0},
-         {36864, 36864, 36864} }
-};
-
-static struct reset_reg_defs s_reset_regs_defs[] = {
-       /* DBG_RESET_REG_MISCS_PL_UA */
-       { MISCS_REG_RESET_PL_UA,
-         {true, true, true}, {0x0, 0x0, 0x0} },
-
-       /* DBG_RESET_REG_MISCS_PL_HV */
-       { MISCS_REG_RESET_PL_HV,
-         {true, true, true}, {0x0, 0x400, 0x600} },
+       {"BRB", MEM_GROUP_BRB_MEM, MEM_GROUP_BRB_RAM, DBG_GRC_PARAM_DUMP_BRB,
+        BRB_REG_BIG_RAM_ADDRESS, BRB_REG_BIG_RAM_DATA,
+        MISC_REG_BLOCK_256B_EN, {0, 0},
+        {153600, 180224}},
 
-       /* DBG_RESET_REG_MISCS_PL_HV_2 */
-       { MISCS_REG_RESET_PL_HV_2_K2_E5,
-         {false, true, true}, {0x0, 0x0, 0x0} },
+       {"BTB", MEM_GROUP_BTB_MEM, MEM_GROUP_BTB_RAM, DBG_GRC_PARAM_DUMP_BTB,
+        BTB_REG_BIG_RAM_ADDRESS, BTB_REG_BIG_RAM_DATA,
+        MISC_REG_BLOCK_256B_EN, {0, 1},
+        {92160, 117760}},
 
-       /* DBG_RESET_REG_MISC_PL_UA */
-       { MISC_REG_RESET_PL_UA,
-         {true, true, true}, {0x0, 0x0, 0x0} },
-
-       /* DBG_RESET_REG_MISC_PL_HV */
-       { MISC_REG_RESET_PL_HV,
-         {true, true, true}, {0x0, 0x0, 0x0} },
-
-       /* DBG_RESET_REG_MISC_PL_PDA_VMAIN_1 */
-       { MISC_REG_RESET_PL_PDA_VMAIN_1,
-         {true, true, true}, {0x4404040, 0x4404040, 0x404040} },
-
-       /* DBG_RESET_REG_MISC_PL_PDA_VMAIN_2 */
-       { MISC_REG_RESET_PL_PDA_VMAIN_2,
-         {true, true, true}, {0x7, 0x7c00007, 0x5c08007} },
+       {"BMB", MEM_GROUP_BMB_MEM, MEM_GROUP_BMB_RAM, DBG_GRC_PARAM_DUMP_BMB,
+        BMB_REG_BIG_RAM_ADDRESS, BMB_REG_BIG_RAM_DATA,
+        MISCS_REG_BLOCK_256B_EN, {0, 0},
+        {36864, 36864}}
+};
 
-       /* DBG_RESET_REG_MISC_PL_PDA_VAUX */
-       { MISC_REG_RESET_PL_PDA_VAUX,
-         {true, true, true}, {0x2, 0x2, 0x2} },
+static struct rbc_reset_defs s_rbc_reset_defs[] = {
+       {MISCS_REG_RESET_PL_HV,
+        {0x0, 0x400}},
+       {MISC_REG_RESET_PL_PDA_VMAIN_1,
+        {0x4404040, 0x4404040}},
+       {MISC_REG_RESET_PL_PDA_VMAIN_2,
+        {0x7, 0x7c00007}},
+       {MISC_REG_RESET_PL_PDA_VAUX,
+        {0x2, 0x2}},
 };
 
 static struct phy_defs s_phy_defs[] = {
        }
 }
 
+/* Sets pointer and size for the specified binary buffer type */
+static void qed_set_dbg_bin_buf(struct qed_hwfn *p_hwfn,
+                               enum bin_dbg_buffer_type buf_type,
+                               const u32 *ptr, u32 size)
+{
+       struct virt_mem_desc *buf = &p_hwfn->dbg_arrays[buf_type];
+
+       buf->ptr = (void *)ptr;
+       buf->size = size;
+}
+
 /* Initializes debug data for the specified device */
-static enum dbg_status qed_dbg_dev_init(struct qed_hwfn *p_hwfn,
-                                       struct qed_ptt *p_ptt)
+static enum dbg_status qed_dbg_dev_init(struct qed_hwfn *p_hwfn)
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
        u8 num_pfs = 0, max_pfs_per_port = 0;
                return DBG_STATUS_UNKNOWN_CHIP;
        }
 
-       /* Set platofrm */
-       dev_data->platform_id = PLATFORM_ASIC;
+       /* Set HW type */
+       dev_data->hw_type = HW_TYPE_ASIC;
        dev_data->mode_enable[MODE_ASIC] = 1;
 
        /* Set port mode */
-       switch (qed_rd(p_hwfn, p_ptt, MISC_REG_PORT_MODE)) {
-       case 0:
+       switch (p_hwfn->cdev->num_ports_in_engine) {
+       case 1:
                dev_data->mode_enable[MODE_PORTS_PER_ENG_1] = 1;
                break;
-       case 1:
+       case 2:
                dev_data->mode_enable[MODE_PORTS_PER_ENG_2] = 1;
                break;
-       case 2:
+       case 4:
                dev_data->mode_enable[MODE_PORTS_PER_ENG_4] = 1;
                break;
        }
 
        /* Set 100G mode */
-       if (dev_data->chip_id == CHIP_BB &&
-           qed_rd(p_hwfn, p_ptt, CNIG_REG_NW_PORT_MODE_BB) == 2)
+       if (QED_IS_CMT(p_hwfn->cdev))
                dev_data->mode_enable[MODE_100G] = 1;
 
        /* Set number of ports */
        return DBG_STATUS_OK;
 }
 
-static struct dbg_bus_block *get_dbg_bus_block_desc(struct qed_hwfn *p_hwfn,
-                                                   enum block_id block_id)
+static const struct dbg_block *get_dbg_block(struct qed_hwfn *p_hwfn,
+                                            enum block_id block_id)
+{
+       const struct dbg_block *dbg_block;
+
+       dbg_block = p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS].ptr;
+       return dbg_block + block_id;
+}
+
+static const struct dbg_block_chip *qed_get_dbg_block_per_chip(struct qed_hwfn
+                                                              *p_hwfn,
+                                                              enum block_id
+                                                              block_id)
+{
+       struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
+
+       return (const struct dbg_block_chip *)
+           p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_CHIP_DATA].ptr +
+           block_id * MAX_CHIP_IDS + dev_data->chip_id;
+}
+
+static const struct dbg_reset_reg *qed_get_dbg_reset_reg(struct qed_hwfn
+                                                        *p_hwfn,
+                                                        u8 reset_reg_id)
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
 
-       return (struct dbg_bus_block *)&dbg_bus_blocks[block_id *
-                                                      MAX_CHIP_IDS +
-                                                      dev_data->chip_id];
+       return (const struct dbg_reset_reg *)
+           p_hwfn->dbg_arrays[BIN_BUF_DBG_RESET_REGS].ptr +
+           reset_reg_id * MAX_CHIP_IDS + dev_data->chip_id;
 }
 
 /* Reads the FW info structure for the specified Storm from the chip,
         * The address is located in the last line of the Storm RAM.
         */
        addr = storm->sem_fast_mem_addr + SEM_FAST_REG_INT_RAM +
-              DWORDS_TO_BYTES(SEM_FAST_REG_INT_RAM_SIZE_BB_K2) -
-              sizeof(fw_info_location);
+           DWORDS_TO_BYTES(SEM_FAST_REG_INT_RAM_SIZE) -
+           sizeof(fw_info_location);
+
        dest = (u32 *)&fw_info_location;
 
        for (i = 0; i < BYTES_TO_DWORDS(sizeof(fw_info_location));
        return qed_dump_str_param(dump_buf, dump, "mfw-version", mfw_ver_str);
 }
 
+/* Reads the chip revision from the chip and writes it as a param to the
+ * specified buffer. Returns the dumped size in dwords.
+ */
+static u32 qed_dump_chip_revision_param(struct qed_hwfn *p_hwfn,
+                                       struct qed_ptt *p_ptt,
+                                       u32 *dump_buf, bool dump)
+{
+       struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
+       char param_str[3] = "??";
+
+       if (dev_data->hw_type == HW_TYPE_ASIC) {
+               u32 chip_rev, chip_metal;
+
+               chip_rev = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_REV);
+               chip_metal = qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_METAL);
+
+               param_str[0] = 'a' + (u8)chip_rev;
+               param_str[1] = '0' + (u8)chip_metal;
+       }
+
+       return qed_dump_str_param(dump_buf, dump, "chip-revision", param_str);
+}
+
 /* Writes a section header to the specified buffer.
  * Returns the dumped size in dwords.
  */
        u8 num_params;
 
        /* Dump global params section header */
-       num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params;
+       num_params = NUM_COMMON_GLOBAL_PARAMS + num_specific_global_params +
+               (dev_data->chip_id == CHIP_BB ? 1 : 0);
        offset += qed_dump_section_hdr(dump_buf + offset,
                                       dump, "global_params", num_params);
 
        offset += qed_dump_fw_ver_param(p_hwfn, p_ptt, dump_buf + offset, dump);
        offset += qed_dump_mfw_ver_param(p_hwfn,
                                         p_ptt, dump_buf + offset, dump);
+       offset += qed_dump_chip_revision_param(p_hwfn,
+                                              p_ptt, dump_buf + offset, dump);
        offset += qed_dump_num_param(dump_buf + offset,
                                     dump, "tools-version", TOOLS_VERSION);
        offset += qed_dump_str_param(dump_buf + offset,
        offset += qed_dump_str_param(dump_buf + offset,
                                     dump,
                                     "platform",
-                                    s_platform_defs[dev_data->platform_id].
-                                    name);
-       offset +=
-           qed_dump_num_param(dump_buf + offset, dump, "pci-func",
-                              p_hwfn->abs_pf_id);
+                                    s_hw_type_defs[dev_data->hw_type].name);
+       offset += qed_dump_num_param(dump_buf + offset,
+                                    dump, "pci-func", p_hwfn->abs_pf_id);
+       if (dev_data->chip_id == CHIP_BB)
+               offset += qed_dump_num_param(dump_buf + offset,
+                                            dump, "path", QED_PATH_ID(p_hwfn));
 
        return offset;
 }
                                          struct qed_ptt *p_ptt)
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
-       u32 reg_val[MAX_DBG_RESET_REGS] = { 0 };
-       u32 i;
+       u32 reg_val[NUM_DBG_RESET_REGS] = { 0 };
+       u8 rst_reg_id;
+       u32 blk_id;
 
        /* Read reset registers */
-       for (i = 0; i < MAX_DBG_RESET_REGS; i++)
-               if (s_reset_regs_defs[i].exists[dev_data->chip_id])
-                       reg_val[i] = qed_rd(p_hwfn,
-                                           p_ptt, s_reset_regs_defs[i].addr);
+       for (rst_reg_id = 0; rst_reg_id < NUM_DBG_RESET_REGS; rst_reg_id++) {
+               const struct dbg_reset_reg *rst_reg;
+               bool rst_reg_removed;
+               u32 rst_reg_addr;
+
+               rst_reg = qed_get_dbg_reset_reg(p_hwfn, rst_reg_id);
+               rst_reg_removed = GET_FIELD(rst_reg->data,
+                                           DBG_RESET_REG_IS_REMOVED);
+               rst_reg_addr = DWORDS_TO_BYTES(GET_FIELD(rst_reg->data,
+                                                        DBG_RESET_REG_ADDR));
+
+               if (!rst_reg_removed)
+                       reg_val[rst_reg_id] = qed_rd(p_hwfn, p_ptt,
+                                                    rst_reg_addr);
+       }
 
        /* Check if blocks are in reset */
-       for (i = 0; i < MAX_BLOCK_ID; i++) {
-               struct block_defs *block = s_block_defs[i];
+       for (blk_id = 0; blk_id < NUM_PHYS_BLOCKS; blk_id++) {
+               const struct dbg_block_chip *blk;
+               bool has_rst_reg;
+               bool is_removed;
+
+               blk = qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)blk_id);
+               is_removed = GET_FIELD(blk->flags, DBG_BLOCK_CHIP_IS_REMOVED);
+               has_rst_reg = GET_FIELD(blk->flags,
+                                       DBG_BLOCK_CHIP_HAS_RESET_REG);
+
+               if (!is_removed && has_rst_reg)
+                       dev_data->block_in_reset[blk_id] =
+                           !(reg_val[blk->reset_reg_id] &
+                             BIT(blk->reset_reg_bit_offset));
+       }
+}
+
+/* is_mode_match recursive function */
+static bool qed_is_mode_match_rec(struct qed_hwfn *p_hwfn,
+                                 u16 *modes_buf_offset, u8 rec_depth)
+{
+       struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
+       u8 *dbg_array;
+       bool arg1, arg2;
+       u8 tree_val;
+
+       if (rec_depth > MAX_RECURSION_DEPTH) {
+               DP_NOTICE(p_hwfn,
+                         "Unexpected error: is_mode_match_rec exceeded the max recursion depth. This is probably due to a corrupt init/debug buffer.\n");
+               return false;
+       }
+
+       /* Get next element from modes tree buffer */
+       dbg_array = p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr;
+       tree_val = dbg_array[(*modes_buf_offset)++];
 
-               dev_data->block_in_reset[i] = block->has_reset_bit &&
-                   !(reg_val[block->reset_reg] & BIT(block->reset_bit_offset));
+       switch (tree_val) {
+       case INIT_MODE_OP_NOT:
+               return !qed_is_mode_match_rec(p_hwfn,
+                                             modes_buf_offset, rec_depth + 1);
+       case INIT_MODE_OP_OR:
+       case INIT_MODE_OP_AND:
+               arg1 = qed_is_mode_match_rec(p_hwfn,
+                                            modes_buf_offset, rec_depth + 1);
+               arg2 = qed_is_mode_match_rec(p_hwfn,
+                                            modes_buf_offset, rec_depth + 1);
+               return (tree_val == INIT_MODE_OP_OR) ? (arg1 ||
+                                                       arg2) : (arg1 && arg2);
+       default:
+               return dev_data->mode_enable[tree_val - MAX_INIT_MODE_OPS] > 0;
        }
 }
 
+/* Returns true if the mode (specified using modes_buf_offset) is enabled */
+static bool qed_is_mode_match(struct qed_hwfn *p_hwfn, u16 *modes_buf_offset)
+{
+       return qed_is_mode_match_rec(p_hwfn, modes_buf_offset, 0);
+}
+
 /* Enable / disable the Debug block */
 static void qed_bus_enable_dbg_block(struct qed_hwfn *p_hwfn,
                                     struct qed_ptt *p_ptt, bool enable)
 static void qed_bus_reset_dbg_block(struct qed_hwfn *p_hwfn,
                                    struct qed_ptt *p_ptt)
 {
-       u32 dbg_reset_reg_addr, old_reset_reg_val, new_reset_reg_val;
-       struct block_defs *dbg_block = s_block_defs[BLOCK_DBG];
+       u32 reset_reg_addr, old_reset_reg_val, new_reset_reg_val;
+       const struct dbg_reset_reg *reset_reg;
+       const struct dbg_block_chip *block;
 
-       dbg_reset_reg_addr = s_reset_regs_defs[dbg_block->reset_reg].addr;
-       old_reset_reg_val = qed_rd(p_hwfn, p_ptt, dbg_reset_reg_addr);
-       new_reset_reg_val =
-           old_reset_reg_val & ~BIT(dbg_block->reset_bit_offset);
+       block = qed_get_dbg_block_per_chip(p_hwfn, BLOCK_DBG);
+       reset_reg = qed_get_dbg_reset_reg(p_hwfn, block->reset_reg_id);
+       reset_reg_addr =
+           DWORDS_TO_BYTES(GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR));
 
-       qed_wr(p_hwfn, p_ptt, dbg_reset_reg_addr, new_reset_reg_val);
-       qed_wr(p_hwfn, p_ptt, dbg_reset_reg_addr, old_reset_reg_val);
-}
+       old_reset_reg_val = qed_rd(p_hwfn, p_ptt, reset_reg_addr);
+       new_reset_reg_val =
+           old_reset_reg_val & ~BIT(block->reset_reg_bit_offset);
 
-static void qed_bus_set_framing_mode(struct qed_hwfn *p_hwfn,
-                                    struct qed_ptt *p_ptt,
-                                    enum dbg_bus_frame_modes mode)
-{
-       qed_wr(p_hwfn, p_ptt, DBG_REG_FRAMING_MODE, (u8)mode);
+       qed_wr(p_hwfn, p_ptt, reset_reg_addr, new_reset_reg_val);
+       qed_wr(p_hwfn, p_ptt, reset_reg_addr, old_reset_reg_val);
 }
 
 /* Enable / disable Debug Bus clients according to the specified mask
        qed_wr(p_hwfn, p_ptt, DBG_REG_CLIENT_ENABLE, client_mask);
 }
 
-static bool qed_is_mode_match(struct qed_hwfn *p_hwfn, u16 *modes_buf_offset)
+static void qed_bus_config_dbg_line(struct qed_hwfn *p_hwfn,
+                                   struct qed_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)
+{
+       const struct dbg_block_chip *block =
+               qed_get_dbg_block_per_chip(p_hwfn, block_id);
+
+       qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_select_reg_addr),
+              line_id);
+       qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_dword_enable_reg_addr),
+              enable_mask);
+       qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_shift_reg_addr),
+              right_shift);
+       qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_valid_reg_addr),
+              force_valid_mask);
+       qed_wr(p_hwfn, p_ptt, DWORDS_TO_BYTES(block->dbg_force_frame_reg_addr),
+              force_frame_mask);
+}
+
+/* Disable debug bus in all blocks */
+static void qed_bus_disable_blocks(struct qed_hwfn *p_hwfn,
+                                  struct qed_ptt *p_ptt)
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
-       bool arg1, arg2;
-       const u32 *ptr;
-       u8 tree_val;
+       u32 block_id;
 
-       /* Get next element from modes tree buffer */
-       ptr = s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr;
-       tree_val = ((u8 *)ptr)[(*modes_buf_offset)++];
+       /* Disable all blocks */
+       for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
+               const struct dbg_block_chip *block_per_chip =
+                   qed_get_dbg_block_per_chip(p_hwfn,
+                                              (enum block_id)block_id);
 
-       switch (tree_val) {
-       case INIT_MODE_OP_NOT:
-               return !qed_is_mode_match(p_hwfn, modes_buf_offset);
-       case INIT_MODE_OP_OR:
-       case INIT_MODE_OP_AND:
-               arg1 = qed_is_mode_match(p_hwfn, modes_buf_offset);
-               arg2 = qed_is_mode_match(p_hwfn, modes_buf_offset);
-               return (tree_val == INIT_MODE_OP_OR) ? (arg1 ||
-                                                       arg2) : (arg1 && arg2);
-       default:
-               return dev_data->mode_enable[tree_val - MAX_INIT_MODE_OPS] > 0;
+               if (GET_FIELD(block_per_chip->flags,
+                             DBG_BLOCK_CHIP_IS_REMOVED) ||
+                   dev_data->block_in_reset[block_id])
+                       continue;
+
+               /* Disable debug bus */
+               if (GET_FIELD(block_per_chip->flags,
+                             DBG_BLOCK_CHIP_HAS_DBG_BUS)) {
+                       u32 dbg_en_addr =
+                               block_per_chip->dbg_dword_enable_reg_addr;
+                       u16 modes_buf_offset =
+                           GET_FIELD(block_per_chip->dbg_bus_mode.data,
+                                     DBG_MODE_HDR_MODES_BUF_OFFSET);
+                       bool eval_mode =
+                           GET_FIELD(block_per_chip->dbg_bus_mode.data,
+                                     DBG_MODE_HDR_EVAL_MODE) > 0;
+
+                       if (!eval_mode ||
+                           qed_is_mode_match(p_hwfn, &modes_buf_offset))
+                               qed_wr(p_hwfn, p_ptt,
+                                      DWORDS_TO_BYTES(dbg_en_addr),
+                                      0);
+               }
        }
 }
 
        return qed_grc_get_param(p_hwfn, grc_param) > 0;
 }
 
+/* Returns the storm_id that matches the specified Storm letter,
+ * or MAX_DBG_STORMS if invalid storm letter.
+ */
+static enum dbg_storms qed_get_id_from_letter(char storm_letter)
+{
+       u8 storm_id;
+
+       for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++)
+               if (s_storm_defs[storm_id].letter == storm_letter)
+                       return (enum dbg_storms)storm_id;
+
+       return MAX_DBG_STORMS;
+}
+
 /* Returns true of the specified Storm should be included in the dump, false
  * otherwise.
  */
 static bool qed_grc_is_mem_included(struct qed_hwfn *p_hwfn,
                                    enum block_id block_id, u8 mem_group_id)
 {
-       struct block_defs *block = s_block_defs[block_id];
+       const struct dbg_block *block;
        u8 i;
 
-       /* Check Storm match */
-       if (block->associated_to_storm &&
-           !qed_grc_is_storm_included(p_hwfn,
-                                      (enum dbg_storms)block->storm_id))
-               return false;
+       block = get_dbg_block(p_hwfn, block_id);
+
+       /* If the block is associated with a Storm, check Storm match */
+       if (block->associated_storm_letter) {
+               enum dbg_storms associated_storm_id =
+                   qed_get_id_from_letter(block->associated_storm_letter);
+
+               if (associated_storm_id == MAX_DBG_STORMS ||
+                   !qed_grc_is_storm_included(p_hwfn, associated_storm_id))
+                       return false;
+       }
 
        for (i = 0; i < NUM_BIG_RAM_TYPES; i++) {
                struct big_ram_defs *big_ram = &s_big_ram_defs[i];
        case MEM_GROUP_CAU_SB:
        case MEM_GROUP_CAU_PI:
                return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU);
+       case MEM_GROUP_CAU_MEM_EXT:
+               return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CAU_EXT);
        case MEM_GROUP_QM_MEM:
                return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_QM);
        case MEM_GROUP_CFC_MEM:
        case MEM_GROUP_TASK_CFC_MEM:
                return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CFC) ||
                       qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_CM_CTX);
+       case MEM_GROUP_DORQ_MEM:
+               return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_DORQ);
        case MEM_GROUP_IGU_MEM:
        case MEM_GROUP_IGU_MSIX:
                return qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IGU);
        msleep(STALL_DELAY_MS);
 }
 
-/* Takes all blocks out of reset */
+/* Takes all blocks out of reset. If rbc_only is true, only RBC clients are
+ * taken out of reset.
+ */
 static void qed_grc_unreset_blocks(struct qed_hwfn *p_hwfn,
-                                  struct qed_ptt *p_ptt)
+                                  struct qed_ptt *p_ptt, bool rbc_only)
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
-       u32 reg_val[MAX_DBG_RESET_REGS] = { 0 };
-       u32 block_id, i;
+       u8 chip_id = dev_data->chip_id;
+       u32 i;
 
-       /* Fill reset regs values */
-       for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
-               struct block_defs *block = s_block_defs[block_id];
+       /* Take RBCs out of reset */
+       for (i = 0; i < ARRAY_SIZE(s_rbc_reset_defs); i++)
+               if (s_rbc_reset_defs[i].reset_val[dev_data->chip_id])
+                       qed_wr(p_hwfn,
+                              p_ptt,
+                              s_rbc_reset_defs[i].reset_reg_addr +
+                              RESET_REG_UNRESET_OFFSET,
+                              s_rbc_reset_defs[i].reset_val[chip_id]);
 
-               if (block->exists[dev_data->chip_id] && block->has_reset_bit &&
-                   block->unreset)
-                       reg_val[block->reset_reg] |=
-                           BIT(block->reset_bit_offset);
-       }
+       if (!rbc_only) {
+               u32 reg_val[NUM_DBG_RESET_REGS] = { 0 };
+               u8 reset_reg_id;
+               u32 block_id;
 
-       /* Write reset registers */
-       for (i = 0; i < MAX_DBG_RESET_REGS; i++) {
-               if (!s_reset_regs_defs[i].exists[dev_data->chip_id])
-                       continue;
+               /* Fill reset regs values */
+               for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
+                       bool is_removed, has_reset_reg, unreset_before_dump;
+                       const struct dbg_block_chip *block;
+
+                       block = qed_get_dbg_block_per_chip(p_hwfn,
+                                                          (enum block_id)
+                                                          block_id);
+                       is_removed =
+                           GET_FIELD(block->flags, DBG_BLOCK_CHIP_IS_REMOVED);
+                       has_reset_reg =
+                           GET_FIELD(block->flags,
+                                     DBG_BLOCK_CHIP_HAS_RESET_REG);
+                       unreset_before_dump =
+                           GET_FIELD(block->flags,
+                                     DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP);
+
+                       if (!is_removed && has_reset_reg && unreset_before_dump)
+                               reg_val[block->reset_reg_id] |=
+                                   BIT(block->reset_reg_bit_offset);
+               }
 
-               reg_val[i] |=
-                       s_reset_regs_defs[i].unreset_val[dev_data->chip_id];
+               /* Write reset registers */
+               for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS;
+                    reset_reg_id++) {
+                       const struct dbg_reset_reg *reset_reg;
+                       u32 reset_reg_addr;
 
-               if (reg_val[i])
-                       qed_wr(p_hwfn,
-                              p_ptt,
-                              s_reset_regs_defs[i].addr +
-                              RESET_REG_UNRESET_OFFSET, reg_val[i]);
+                       reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id);
+
+                       if (GET_FIELD
+                           (reset_reg->data, DBG_RESET_REG_IS_REMOVED))
+                               continue;
+
+                       if (reg_val[reset_reg_id]) {
+                               reset_reg_addr =
+                                   GET_FIELD(reset_reg->data,
+                                             DBG_RESET_REG_ADDR);
+                               qed_wr(p_hwfn,
+                                      p_ptt,
+                                      DWORDS_TO_BYTES(reset_reg_addr) +
+                                      RESET_REG_UNRESET_OFFSET,
+                                      reg_val[reset_reg_id]);
+                       }
+               }
        }
 }
 
 /* Returns the attention block data of the specified block */
 static const struct dbg_attn_block_type_data *
-qed_get_block_attn_data(enum block_id block_id, enum dbg_attn_type attn_type)
+qed_get_block_attn_data(struct qed_hwfn *p_hwfn,
+                       enum block_id block_id, enum dbg_attn_type attn_type)
 {
        const struct dbg_attn_block *base_attn_block_arr =
-               (const struct dbg_attn_block *)
-               s_dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr;
+           (const struct dbg_attn_block *)
+           p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr;
 
        return &base_attn_block_arr[block_id].per_type_data[attn_type];
 }
 
 /* Returns the attention registers of the specified block */
 static const struct dbg_attn_reg *
-qed_get_block_attn_regs(enum block_id block_id, enum dbg_attn_type attn_type,
+qed_get_block_attn_regs(struct qed_hwfn *p_hwfn,
+                       enum block_id block_id, enum dbg_attn_type attn_type,
                        u8 *num_attn_regs)
 {
        const struct dbg_attn_block_type_data *block_type_data =
-               qed_get_block_attn_data(block_id, attn_type);
+           qed_get_block_attn_data(p_hwfn, block_id, attn_type);
 
        *num_attn_regs = block_type_data->num_regs;
 
-       return &((const struct dbg_attn_reg *)
-                s_dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)[block_type_data->
-                                                         regs_offset];
+       return (const struct dbg_attn_reg *)
+               p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr +
+               block_type_data->regs_offset;
 }
 
 /* For each block, clear the status of all parities */
        u8 reg_idx, num_attn_regs;
        u32 block_id;
 
-       for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
+       for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
                if (dev_data->block_in_reset[block_id])
                        continue;
 
-               attn_reg_arr = qed_get_block_attn_regs((enum block_id)block_id,
+               attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
+                                                      (enum block_id)block_id,
                                                       ATTN_TYPE_PARITY,
                                                       &num_attn_regs);
 
 }
 
 /* Dumps GRC registers section header. Returns the dumped size in dwords.
- * The following parameters are dumped:
+ * the following parameters are dumped:
  * - count: no. of dumped entries
  * - split_type: split type
  * - split_id: split ID (dumped only if split_id != SPLIT_TYPE_NONE)
- * - param_name: user parameter value (dumped only if param_name != NULL
- *              and param_val != NULL).
+ * - reg_type_name: register type name (dumped only if reg_type_name != NULL)
  */
 static u32 qed_grc_dump_regs_hdr(u32 *dump_buf,
                                 bool dump,
                                 u32 num_reg_entries,
                                 enum init_split_types split_type,
-                                u8 split_id,
-                                const char *param_name, const char *param_val)
+                                u8 split_id, const char *reg_type_name)
 {
        u8 num_params = 2 +
-           (split_type != SPLIT_TYPE_NONE ? 1 : 0) + (param_name ? 1 : 0);
+           (split_type != SPLIT_TYPE_NONE ? 1 : 0) + (reg_type_name ? 1 : 0);
        u32 offset = 0;
 
        offset += qed_dump_section_hdr(dump_buf + offset,
        if (split_type != SPLIT_TYPE_NONE)
                offset += qed_dump_num_param(dump_buf + offset,
                                             dump, "id", split_id);
-       if (param_name && param_val)
+       if (reg_type_name)
                offset += qed_dump_str_param(dump_buf + offset,
-                                            dump, param_name, param_val);
+                                            dump, "type", reg_type_name);
 
        return offset;
 }
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
        u8 port_id = 0, pf_id = 0, vf_id = 0, fid = 0;
+       bool read_using_dmae = false;
+       u32 thresh;
 
-       if (!dump)
-               return len;
-
-       /* Print log if needed */
-       dev_data->num_regs_read += len;
-       if (dev_data->num_regs_read >=
-           s_platform_defs[dev_data->platform_id].log_thresh) {
-               DP_VERBOSE(p_hwfn,
-                          QED_MSG_DEBUG,
-                          "Dumping %d registers...\n",
-                          dev_data->num_regs_read);
-               dev_data->num_regs_read = 0;
-       }
+       if (!dump)
+               return len;
 
        switch (split_type) {
        case SPLIT_TYPE_PORT:
        }
 
        /* Try reading using DMAE */
-       if (dev_data->use_dmae && split_type == SPLIT_TYPE_NONE &&
-           (len >= s_platform_defs[dev_data->platform_id].dmae_thresh ||
-            wide_bus)) {
-               if (!qed_dmae_grc2host(p_hwfn, p_ptt, DWORDS_TO_BYTES(addr),
-                                      (u64)(uintptr_t)(dump_buf), len, NULL))
-                       return len;
-               dev_data->use_dmae = 0;
-               DP_VERBOSE(p_hwfn,
-                          QED_MSG_DEBUG,
-                          "Failed reading from chip using DMAE, using GRC instead\n");
+       if (dev_data->use_dmae && split_type != SPLIT_TYPE_VF &&
+           (len >= s_hw_type_defs[dev_data->hw_type].dmae_thresh ||
+            (PROTECT_WIDE_BUS && wide_bus))) {
+               struct qed_dmae_params dmae_params;
+
+               /* Set DMAE params */
+               memset(&dmae_params, 0, sizeof(dmae_params));
+               SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_COMPLETION_DST, 1);
+               switch (split_type) {
+               case SPLIT_TYPE_PORT:
+                       SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID,
+                                 1);
+                       dmae_params.port_id = port_id;
+                       break;
+               case SPLIT_TYPE_PF:
+                       SET_FIELD(dmae_params.flags,
+                                 QED_DMAE_PARAMS_SRC_PF_VALID, 1);
+                       dmae_params.src_pfid = pf_id;
+                       break;
+               case SPLIT_TYPE_PORT_PF:
+                       SET_FIELD(dmae_params.flags, QED_DMAE_PARAMS_PORT_VALID,
+                                 1);
+                       SET_FIELD(dmae_params.flags,
+                                 QED_DMAE_PARAMS_SRC_PF_VALID, 1);
+                       dmae_params.port_id = port_id;
+                       dmae_params.src_pfid = pf_id;
+                       break;
+               default:
+                       break;
+               }
+
+               /* Execute DMAE command */
+               read_using_dmae = !qed_dmae_grc2host(p_hwfn,
+                                                    p_ptt,
+                                                    DWORDS_TO_BYTES(addr),
+                                                    (u64)(uintptr_t)(dump_buf),
+                                                    len, &dmae_params);
+               if (!read_using_dmae) {
+                       dev_data->use_dmae = 0;
+                       DP_VERBOSE(p_hwfn,
+                                  QED_MSG_DEBUG,
+                                  "Failed reading from chip using DMAE, using GRC instead\n");
+               }
        }
 
+       if (read_using_dmae)
+               goto print_log;
+
        /* If not read using DMAE, read using GRC */
 
        /* Set pretend */
-       if (split_type != dev_data->pretend.split_type || split_id !=
-           dev_data->pretend.split_id) {
+       if (split_type != dev_data->pretend.split_type ||
+           split_id != dev_data->pretend.split_id) {
                switch (split_type) {
                case SPLIT_TYPE_PORT:
                        qed_port_pretend(p_hwfn, p_ptt, port_id);
                        break;
                case SPLIT_TYPE_PF:
-                       fid = pf_id << PXP_PRETEND_CONCRETE_FID_PFID_SHIFT;
+                       fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
+                                         pf_id);
                        qed_fid_pretend(p_hwfn, p_ptt, fid);
                        break;
                case SPLIT_TYPE_PORT_PF:
-                       fid = pf_id << PXP_PRETEND_CONCRETE_FID_PFID_SHIFT;
+                       fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
+                                         pf_id);
                        qed_port_fid_pretend(p_hwfn, p_ptt, port_id, fid);
                        break;
                case SPLIT_TYPE_VF:
-                       fid = BIT(PXP_PRETEND_CONCRETE_FID_VFVALID_SHIFT) |
-                             (vf_id << PXP_PRETEND_CONCRETE_FID_VFID_SHIFT);
+                       fid = FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFVALID, 1)
+                             | FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_VFID,
+                                         vf_id);
                        qed_fid_pretend(p_hwfn, p_ptt, fid);
                        break;
                default:
        /* Read registers using GRC */
        qed_read_regs(p_hwfn, p_ptt, dump_buf, addr, len);
 
+print_log:
+       /* Print log */
+       dev_data->num_regs_read += len;
+       thresh = s_hw_type_defs[dev_data->hw_type].log_thresh;
+       if ((dev_data->num_regs_read / thresh) >
+           ((dev_data->num_regs_read - len) / thresh))
+               DP_VERBOSE(p_hwfn,
+                          QED_MSG_DEBUG,
+                          "Dumped %d registers...\n", dev_data->num_regs_read);
+
        return len;
 }
 
 /* Dumps GRC registers entries. Returns the dumped size in dwords. */
 static u32 qed_grc_dump_regs_entries(struct qed_hwfn *p_hwfn,
                                     struct qed_ptt *p_ptt,
-                                    struct dbg_array input_regs_arr,
+                                    struct virt_mem_desc input_regs_arr,
                                     u32 *dump_buf,
                                     bool dump,
                                     enum init_split_types split_type,
 
        *num_dumped_reg_entries = 0;
 
-       while (input_offset < input_regs_arr.size_in_dwords) {
+       while (input_offset < BYTES_TO_DWORDS(input_regs_arr.size)) {
                const struct dbg_dump_cond_hdr *cond_hdr =
                    (const struct dbg_dump_cond_hdr *)
-                   &input_regs_arr.ptr[input_offset++];
+                   input_regs_arr.ptr + input_offset++;
                u16 modes_buf_offset;
                bool eval_mode;
 
                for (i = 0; i < cond_hdr->data_size; i++, input_offset++) {
                        const struct dbg_dump_reg *reg =
                            (const struct dbg_dump_reg *)
-                           &input_regs_arr.ptr[input_offset];
+                           input_regs_arr.ptr + input_offset;
                        u32 addr, len;
                        bool wide_bus;
 
 /* Dumps GRC registers entries. Returns the dumped size in dwords. */
 static u32 qed_grc_dump_split_data(struct qed_hwfn *p_hwfn,
                                   struct qed_ptt *p_ptt,
-                                  struct dbg_array input_regs_arr,
+                                  struct virt_mem_desc input_regs_arr,
                                   u32 *dump_buf,
                                   bool dump,
                                   bool block_enable[MAX_BLOCK_ID],
                                   enum init_split_types split_type,
-                                  u8 split_id,
-                                  const char *param_name,
-                                  const char *param_val)
+                                  u8 split_id, const char *reg_type_name)
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
        enum init_split_types hdr_split_type = split_type;
                                       false,
                                       0,
                                       hdr_split_type,
-                                      hdr_split_id, param_name, param_val);
+                                      hdr_split_id, reg_type_name);
 
        /* Dump registers */
        offset += qed_grc_dump_regs_entries(p_hwfn,
                                      dump,
                                      num_dumped_reg_entries,
                                      hdr_split_type,
-                                     hdr_split_id, param_name, param_val);
+                                     hdr_split_id, reg_type_name);
 
        return num_dumped_reg_entries > 0 ? offset : 0;
 }
                                  u32 *dump_buf,
                                  bool dump,
                                  bool block_enable[MAX_BLOCK_ID],
-                                 const char *param_name, const char *param_val)
+                                 const char *reg_type_name)
 {
+       struct virt_mem_desc *dbg_buf =
+           &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG];
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
        u32 offset = 0, input_offset = 0;
-       u16 fid;
-       while (input_offset <
-              s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].size_in_dwords) {
+
+       while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
                const struct dbg_dump_split_hdr *split_hdr;
-               struct dbg_array curr_input_regs_arr;
+               struct virt_mem_desc curr_input_regs_arr;
                enum init_split_types split_type;
                u16 split_count = 0;
                u32 split_data_size;
                u8 split_id;
 
                split_hdr =
-                       (const struct dbg_dump_split_hdr *)
-                       &s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr[input_offset++];
+                   (const struct dbg_dump_split_hdr *)
+                   dbg_buf->ptr + input_offset++;
                split_type =
-                       GET_FIELD(split_hdr->hdr,
-                                 DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
-               split_data_size =
-                       GET_FIELD(split_hdr->hdr,
-                                 DBG_DUMP_SPLIT_HDR_DATA_SIZE);
+                   GET_FIELD(split_hdr->hdr,
+                             DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
+               split_data_size = GET_FIELD(split_hdr->hdr,
+                                           DBG_DUMP_SPLIT_HDR_DATA_SIZE);
                curr_input_regs_arr.ptr =
-                       &s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr[input_offset];
-               curr_input_regs_arr.size_in_dwords = split_data_size;
+                   (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr +
+                   input_offset;
+               curr_input_regs_arr.size = DWORDS_TO_BYTES(split_data_size);
 
                switch (split_type) {
                case SPLIT_TYPE_NONE:
                                                          dump, block_enable,
                                                          split_type,
                                                          split_id,
-                                                         param_name,
-                                                         param_val);
+                                                         reg_type_name);
 
                input_offset += split_data_size;
        }
 
        /* Cancel pretends (pretend to original PF) */
        if (dump) {
-               fid = p_hwfn->rel_pf_id << PXP_PRETEND_CONCRETE_FID_PFID_SHIFT;
-               qed_fid_pretend(p_hwfn, p_ptt, fid);
+               qed_fid_pretend(p_hwfn, p_ptt,
+                               FIELD_VALUE(PXP_PRETEND_CONCRETE_FID_PFID,
+                                           p_hwfn->rel_pf_id));
                dev_data->pretend.split_type = SPLIT_TYPE_NONE;
                dev_data->pretend.split_id = 0;
        }
                                   struct qed_ptt *p_ptt,
                                   u32 *dump_buf, bool dump)
 {
-       struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
-       u32 i, offset = 0, num_regs = 0;
+       u32 offset = 0, num_regs = 0;
+       u8 reset_reg_id;
 
        /* Calculate header size */
        offset += qed_grc_dump_regs_hdr(dump_buf,
-                                       false, 0,
-                                       SPLIT_TYPE_NONE, 0, NULL, NULL);
+                                       false,
+                                       0, SPLIT_TYPE_NONE, 0, "RESET_REGS");
 
        /* Write reset registers */
-       for (i = 0; i < MAX_DBG_RESET_REGS; i++) {
-               if (!s_reset_regs_defs[i].exists[dev_data->chip_id])
+       for (reset_reg_id = 0; reset_reg_id < NUM_DBG_RESET_REGS;
+            reset_reg_id++) {
+               const struct dbg_reset_reg *reset_reg;
+               u32 reset_reg_addr;
+
+               reset_reg = qed_get_dbg_reset_reg(p_hwfn, reset_reg_id);
+
+               if (GET_FIELD(reset_reg->data, DBG_RESET_REG_IS_REMOVED))
                        continue;
 
+               reset_reg_addr = GET_FIELD(reset_reg->data, DBG_RESET_REG_ADDR);
                offset += qed_grc_dump_reg_entry(p_hwfn,
                                                 p_ptt,
                                                 dump_buf + offset,
                                                 dump,
-                                                BYTES_TO_DWORDS
-                                                (s_reset_regs_defs[i].addr), 1,
-                                                false, SPLIT_TYPE_NONE, 0);
+                                                reset_reg_addr,
+                                                1, false, SPLIT_TYPE_NONE, 0);
                num_regs++;
        }
 
        if (dump)
                qed_grc_dump_regs_hdr(dump_buf,
                                      true, num_regs, SPLIT_TYPE_NONE,
-                                     0, NULL, NULL);
+                                     0, "RESET_REGS");
 
        return offset;
 }
                                      u32 *dump_buf, bool dump)
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
-       u32 block_id, offset = 0, num_reg_entries = 0;
+       u32 block_id, offset = 0, stall_regs_offset;
        const struct dbg_attn_reg *attn_reg_arr;
        u8 storm_id, reg_idx, num_attn_regs;
+       u32 num_reg_entries = 0;
 
-       /* Calculate header size */
+       /* Write empty header for attention registers */
        offset += qed_grc_dump_regs_hdr(dump_buf,
-                                       false, 0, SPLIT_TYPE_NONE,
-                                       0, NULL, NULL);
+                                       false,
+                                       0, SPLIT_TYPE_NONE, 0, "ATTN_REGS");
 
        /* Write parity registers */
-       for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
+       for (block_id = 0; block_id < NUM_PHYS_BLOCKS; block_id++) {
                if (dev_data->block_in_reset[block_id] && dump)
                        continue;
 
-               attn_reg_arr = qed_get_block_attn_regs((enum block_id)block_id,
+               attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
+                                                      (enum block_id)block_id,
                                                       ATTN_TYPE_PARITY,
                                                       &num_attn_regs);
 
                }
        }
 
+       /* Overwrite header for attention registers */
+       if (dump)
+               qed_grc_dump_regs_hdr(dump_buf,
+                                     true,
+                                     num_reg_entries,
+                                     SPLIT_TYPE_NONE, 0, "ATTN_REGS");
+
+       /* Write empty header for stall registers */
+       stall_regs_offset = offset;
+       offset += qed_grc_dump_regs_hdr(dump_buf,
+                                       false, 0, SPLIT_TYPE_NONE, 0, "REGS");
+
        /* Write Storm stall status registers */
-       for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
+       for (storm_id = 0, num_reg_entries = 0; storm_id < MAX_DBG_STORMS;
+            storm_id++) {
                struct storm_defs *storm = &s_storm_defs[storm_id];
                u32 addr;
 
-               if (dev_data->block_in_reset[storm->block_id] && dump)
+               if (dev_data->block_in_reset[storm->sem_block_id] && dump)
                        continue;
 
                addr =
-                   BYTES_TO_DWORDS(s_storm_defs[storm_id].sem_fast_mem_addr +
+                   BYTES_TO_DWORDS(storm->sem_fast_mem_addr +
                                    SEM_FAST_REG_STALLED);
                offset += qed_grc_dump_reg_entry(p_hwfn,
                                                 p_ptt,
                num_reg_entries++;
        }
 
-       /* Write header */
+       /* Overwrite header for stall registers */
        if (dump)
-               qed_grc_dump_regs_hdr(dump_buf,
+               qed_grc_dump_regs_hdr(dump_buf + stall_regs_offset,
                                      true,
-                                     num_reg_entries, SPLIT_TYPE_NONE,
-                                     0, NULL, NULL);
+                                     num_reg_entries,
+                                     SPLIT_TYPE_NONE, 0, "REGS");
 
        return offset;
 }
        u32 offset = 0, addr;
 
        offset += qed_grc_dump_regs_hdr(dump_buf,
-                                       dump, 2, SPLIT_TYPE_NONE, 0,
-                                       NULL, NULL);
+                                       dump, 2, SPLIT_TYPE_NONE, 0, "REGS");
 
        /* Dump R/TDIF_REG_DEBUG_ERROR_INFO_SIZE (every 8'th register should be
         * skipped).
                                u32 len,
                                u32 bit_width,
                                bool packed,
-                               const char *mem_group,
-                               bool is_storm, char storm_letter)
+                               const char *mem_group, char storm_letter)
 {
        u8 num_params = 3;
        u32 offset = 0;
 
        if (name) {
                /* Dump name */
-               if (is_storm) {
+               if (storm_letter) {
                        strcpy(buf, "?STORM_");
                        buf[0] = storm_letter;
                        strcpy(buf + strlen(buf), name);
                                             dump, "packed", 1);
 
        /* Dump reg type */
-       if (is_storm) {
+       if (storm_letter) {
                strcpy(buf, "?STORM_");
                buf[0] = storm_letter;
                strcpy(buf + strlen(buf), mem_group);
                            bool wide_bus,
                            u32 bit_width,
                            bool packed,
-                           const char *mem_group,
-                           bool is_storm, char storm_letter)
+                           const char *mem_group, char storm_letter)
 {
        u32 offset = 0;
 
                                       addr,
                                       len,
                                       bit_width,
-                                      packed,
-                                      mem_group, is_storm, storm_letter);
+                                      packed, mem_group, storm_letter);
        offset += qed_grc_dump_addr_range(p_hwfn,
                                          p_ptt,
                                          dump_buf + offset,
 /* Dumps GRC memories entries. Returns the dumped size in dwords. */
 static u32 qed_grc_dump_mem_entries(struct qed_hwfn *p_hwfn,
                                    struct qed_ptt *p_ptt,
-                                   struct dbg_array input_mems_arr,
+                                   struct virt_mem_desc input_mems_arr,
                                    u32 *dump_buf, bool dump)
 {
        u32 i, offset = 0, input_offset = 0;
        bool mode_match = true;
 
-       while (input_offset < input_mems_arr.size_in_dwords) {
+       while (input_offset < BYTES_TO_DWORDS(input_mems_arr.size)) {
                const struct dbg_dump_cond_hdr *cond_hdr;
                u16 modes_buf_offset;
                u32 num_entries;
                bool eval_mode;
 
-               cond_hdr = (const struct dbg_dump_cond_hdr *)
-                          &input_mems_arr.ptr[input_offset++];
+               cond_hdr =
+                   (const struct dbg_dump_cond_hdr *)input_mems_arr.ptr +
+                   input_offset++;
                num_entries = cond_hdr->data_size / MEM_DUMP_ENTRY_SIZE_DWORDS;
 
                /* Check required mode */
                for (i = 0; i < num_entries;
                     i++, input_offset += MEM_DUMP_ENTRY_SIZE_DWORDS) {
                        const struct dbg_dump_mem *mem =
-                               (const struct dbg_dump_mem *)
-                               &input_mems_arr.ptr[input_offset];
-                       u8 mem_group_id = GET_FIELD(mem->dword0,
-                                                   DBG_DUMP_MEM_MEM_GROUP_ID);
-                       bool is_storm = false, mem_wide_bus;
-                       enum dbg_grc_params grc_param;
-                       char storm_letter = 'a';
-                       enum block_id block_id;
+                           (const struct dbg_dump_mem *)((u32 *)
+                                                         input_mems_arr.ptr
+                                                         + input_offset);
+                       const struct dbg_block *block;
+                       char storm_letter = 0;
                        u32 mem_addr, mem_len;
+                       bool mem_wide_bus;
+                       u8 mem_group_id;
 
+                       mem_group_id = GET_FIELD(mem->dword0,
+                                                DBG_DUMP_MEM_MEM_GROUP_ID);
                        if (mem_group_id >= MEM_GROUPS_NUM) {
                                DP_NOTICE(p_hwfn, "Invalid mem_group_id\n");
                                return 0;
                        }
 
-                       block_id = (enum block_id)cond_hdr->block_id;
                        if (!qed_grc_is_mem_included(p_hwfn,
-                                                    block_id,
+                                                    (enum block_id)
+                                                    cond_hdr->block_id,
                                                     mem_group_id))
                                continue;
 
                        mem_wide_bus = GET_FIELD(mem->dword1,
                                                 DBG_DUMP_MEM_WIDE_BUS);
 
-                       /* Update memory length for CCFC/TCFC memories
-                        * according to number of LCIDs/LTIDs.
-                        */
-                       if (mem_group_id == MEM_GROUP_CONN_CFC_MEM) {
-                               if (mem_len % MAX_LCIDS) {
-                                       DP_NOTICE(p_hwfn,
-                                                 "Invalid CCFC connection memory size\n");
-                                       return 0;
-                               }
-
-                               grc_param = DBG_GRC_PARAM_NUM_LCIDS;
-                               mem_len = qed_grc_get_param(p_hwfn, grc_param) *
-                                         (mem_len / MAX_LCIDS);
-                       } else if (mem_group_id == MEM_GROUP_TASK_CFC_MEM) {
-                               if (mem_len % MAX_LTIDS) {
-                                       DP_NOTICE(p_hwfn,
-                                                 "Invalid TCFC task memory size\n");
-                                       return 0;
-                               }
-
-                               grc_param = DBG_GRC_PARAM_NUM_LTIDS;
-                               mem_len = qed_grc_get_param(p_hwfn, grc_param) *
-                                         (mem_len / MAX_LTIDS);
-                       }
+                       block = get_dbg_block(p_hwfn,
+                                             cond_hdr->block_id);
 
-                       /* If memory is associated with Storm, update Storm
-                        * details.
+                       /* If memory is associated with Storm,
+                        * update storm details
                         */
-                       if (s_block_defs
-                           [cond_hdr->block_id]->associated_to_storm) {
-                               is_storm = true;
-                               storm_letter =
-                                   s_storm_defs[s_block_defs
-                                                [cond_hdr->block_id]->
-                                                storm_id].letter;
-                       }
+                       if (block->associated_storm_letter)
+                               storm_letter = block->associated_storm_letter;
 
                        /* Dump memory */
                        offset += qed_grc_dump_mem(p_hwfn,
                                                0,
                                                false,
                                                s_mem_group_names[mem_group_id],
-                                               is_storm,
                                                storm_letter);
                }
        }
                                 struct qed_ptt *p_ptt,
                                 u32 *dump_buf, bool dump)
 {
+       struct virt_mem_desc *dbg_buf =
+           &p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM];
        u32 offset = 0, input_offset = 0;
 
-       while (input_offset <
-              s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].size_in_dwords) {
+       while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
                const struct dbg_dump_split_hdr *split_hdr;
-               struct dbg_array curr_input_mems_arr;
+               struct virt_mem_desc curr_input_mems_arr;
                enum init_split_types split_type;
                u32 split_data_size;
 
-               split_hdr = (const struct dbg_dump_split_hdr *)
-                       &s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr[input_offset++];
-               split_type =
-                       GET_FIELD(split_hdr->hdr,
-                                 DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
-               split_data_size =
-                       GET_FIELD(split_hdr->hdr,
-                                 DBG_DUMP_SPLIT_HDR_DATA_SIZE);
-               curr_input_mems_arr.ptr =
-                       &s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr[input_offset];
-               curr_input_mems_arr.size_in_dwords = split_data_size;
+               split_hdr =
+                   (const struct dbg_dump_split_hdr *)dbg_buf->ptr +
+                   input_offset++;
+               split_type = GET_FIELD(split_hdr->hdr,
+                                      DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID);
+               split_data_size = GET_FIELD(split_hdr->hdr,
+                                           DBG_DUMP_SPLIT_HDR_DATA_SIZE);
+               curr_input_mems_arr.ptr = (u32 *)dbg_buf->ptr + input_offset;
+               curr_input_mems_arr.size = DWORDS_TO_BYTES(split_data_size);
 
                if (split_type == SPLIT_TYPE_NONE)
                        offset += qed_grc_dump_mem_entries(p_hwfn,
                                 bool dump,
                                 const char *name,
                                 u32 num_lids,
-                                u32 lid_size,
-                                u32 rd_reg_addr,
-                                u8 storm_id)
+                                enum cm_ctx_types ctx_type, u8 storm_id)
 {
+       struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
        struct storm_defs *storm = &s_storm_defs[storm_id];
-       u32 i, lid, total_size, offset = 0;
+       u32 i, lid, lid_size, total_size;
+       u32 rd_reg_addr, offset = 0;
+
+       /* Convert quad-regs to dwords */
+       lid_size = storm->cm_ctx_lid_sizes[dev_data->chip_id][ctx_type] * 4;
 
        if (!lid_size)
                return 0;
 
-       lid_size *= BYTES_IN_DWORD;
        total_size = num_lids * lid_size;
 
        offset += qed_grc_dump_mem_hdr(p_hwfn,
                                       0,
                                       total_size,
                                       lid_size * 32,
-                                      false, name, true, storm->letter);
+                                      false, name, storm->letter);
 
        if (!dump)
                return offset + total_size;
 
+       rd_reg_addr = BYTES_TO_DWORDS(storm->cm_ctx_rd_addr[ctx_type]);
+
        /* Dump context data */
        for (lid = 0; lid < num_lids; lid++) {
-               for (i = 0; i < lid_size; i++, offset++) {
+               for (i = 0; i < lid_size; i++) {
                        qed_wr(p_hwfn,
                               p_ptt, storm->cm_ctx_wr_addr, (i << 9) | lid);
-                       *(dump_buf + offset) = qed_rd(p_hwfn,
-                                                     p_ptt, rd_reg_addr);
+                       offset += qed_grc_dump_addr_range(p_hwfn,
+                                                         p_ptt,
+                                                         dump_buf + offset,
+                                                         dump,
+                                                         rd_reg_addr,
+                                                         1,
+                                                         false,
+                                                         SPLIT_TYPE_NONE, 0);
                }
        }
 
 static u32 qed_grc_dump_ctx(struct qed_hwfn *p_hwfn,
                            struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
 {
-       enum dbg_grc_params grc_param;
        u32 offset = 0;
        u8 storm_id;
 
        for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
-               struct storm_defs *storm = &s_storm_defs[storm_id];
-
                if (!qed_grc_is_storm_included(p_hwfn,
                                               (enum dbg_storms)storm_id))
                        continue;
 
                /* Dump Conn AG context size */
-               grc_param = DBG_GRC_PARAM_NUM_LCIDS;
-               offset +=
-                       qed_grc_dump_ctx_data(p_hwfn,
-                                             p_ptt,
-                                             dump_buf + offset,
-                                             dump,
-                                             "CONN_AG_CTX",
-                                             qed_grc_get_param(p_hwfn,
-                                                               grc_param),
-                                             storm->cm_conn_ag_ctx_lid_size,
-                                             storm->cm_conn_ag_ctx_rd_addr,
-                                             storm_id);
+               offset += qed_grc_dump_ctx_data(p_hwfn,
+                                               p_ptt,
+                                               dump_buf + offset,
+                                               dump,
+                                               "CONN_AG_CTX",
+                                               NUM_OF_LCIDS,
+                                               CM_CTX_CONN_AG, storm_id);
 
                /* Dump Conn ST context size */
-               grc_param = DBG_GRC_PARAM_NUM_LCIDS;
-               offset +=
-                       qed_grc_dump_ctx_data(p_hwfn,
-                                             p_ptt,
-                                             dump_buf + offset,
-                                             dump,
-                                             "CONN_ST_CTX",
-                                             qed_grc_get_param(p_hwfn,
-                                                               grc_param),
-                                             storm->cm_conn_st_ctx_lid_size,
-                                             storm->cm_conn_st_ctx_rd_addr,
-                                             storm_id);
+               offset += qed_grc_dump_ctx_data(p_hwfn,
+                                               p_ptt,
+                                               dump_buf + offset,
+                                               dump,
+                                               "CONN_ST_CTX",
+                                               NUM_OF_LCIDS,
+                                               CM_CTX_CONN_ST, storm_id);
 
                /* Dump Task AG context size */
-               grc_param = DBG_GRC_PARAM_NUM_LTIDS;
-               offset +=
-                       qed_grc_dump_ctx_data(p_hwfn,
-                                             p_ptt,
-                                             dump_buf + offset,
-                                             dump,
-                                             "TASK_AG_CTX",
-                                             qed_grc_get_param(p_hwfn,
-                                                               grc_param),
-                                             storm->cm_task_ag_ctx_lid_size,
-                                             storm->cm_task_ag_ctx_rd_addr,
-                                             storm_id);
+               offset += qed_grc_dump_ctx_data(p_hwfn,
+                                               p_ptt,
+                                               dump_buf + offset,
+                                               dump,
+                                               "TASK_AG_CTX",
+                                               NUM_OF_LTIDS,
+                                               CM_CTX_TASK_AG, storm_id);
 
                /* Dump Task ST context size */
-               grc_param = DBG_GRC_PARAM_NUM_LTIDS;
-               offset +=
-                       qed_grc_dump_ctx_data(p_hwfn,
-                                             p_ptt,
-                                             dump_buf + offset,
-                                             dump,
-                                             "TASK_ST_CTX",
-                                             qed_grc_get_param(p_hwfn,
-                                                               grc_param),
-                                             storm->cm_task_st_ctx_lid_size,
-                                             storm->cm_task_st_ctx_rd_addr,
-                                             storm_id);
+               offset += qed_grc_dump_ctx_data(p_hwfn,
+                                               p_ptt,
+                                               dump_buf + offset,
+                                               dump,
+                                               "TASK_ST_CTX",
+                                               NUM_OF_LTIDS,
+                                               CM_CTX_TASK_ST, storm_id);
        }
 
        return offset;
 }
 
-/* Dumps GRC IORs data. Returns the dumped size in dwords. */
-static u32 qed_grc_dump_iors(struct qed_hwfn *p_hwfn,
-                            struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
-{
-       char buf[10] = "IOR_SET_?";
-       u32 addr, offset = 0;
-       u8 storm_id, set_id;
+#define VFC_STATUS_RESP_READY_BIT      0
+#define VFC_STATUS_BUSY_BIT            1
+#define VFC_STATUS_SENDING_CMD_BIT     2
 
-       for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
-               struct storm_defs *storm = &s_storm_defs[storm_id];
+#define VFC_POLLING_DELAY_MS   1
+#define VFC_POLLING_COUNT              20
 
-               if (!qed_grc_is_storm_included(p_hwfn,
-                                              (enum dbg_storms)storm_id))
-                       continue;
+/* Reads data from VFC. Returns the number of dwords read (0 on error).
+ * Sizes are specified in dwords.
+ */
+static u32 qed_grc_dump_read_from_vfc(struct qed_hwfn *p_hwfn,
+                                     struct qed_ptt *p_ptt,
+                                     struct storm_defs *storm,
+                                     u32 *cmd_data,
+                                     u32 cmd_size,
+                                     u32 *addr_data,
+                                     u32 addr_size,
+                                     u32 resp_size, u32 *dump_buf)
+{
+       struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
+       u32 vfc_status, polling_ms, polling_count = 0, i;
+       u32 reg_addr, sem_base;
+       bool is_ready = false;
+
+       sem_base = storm->sem_fast_mem_addr;
+       polling_ms = VFC_POLLING_DELAY_MS *
+           s_hw_type_defs[dev_data->hw_type].delay_factor;
+
+       /* Write VFC command */
+       ARR_REG_WR(p_hwfn,
+                  p_ptt,
+                  sem_base + SEM_FAST_REG_VFC_DATA_WR,
+                  cmd_data, cmd_size);
+
+       /* Write VFC address */
+       ARR_REG_WR(p_hwfn,
+                  p_ptt,
+                  sem_base + SEM_FAST_REG_VFC_ADDR,
+                  addr_data, addr_size);
+
+       /* Read response */
+       for (i = 0; i < resp_size; i++) {
+               /* Poll until ready */
+               do {
+                       reg_addr = sem_base + SEM_FAST_REG_VFC_STATUS;
+                       qed_grc_dump_addr_range(p_hwfn,
+                                               p_ptt,
+                                               &vfc_status,
+                                               true,
+                                               BYTES_TO_DWORDS(reg_addr),
+                                               1,
+                                               false, SPLIT_TYPE_NONE, 0);
+                       is_ready = vfc_status & BIT(VFC_STATUS_RESP_READY_BIT);
+
+                       if (!is_ready) {
+                               if (polling_count++ == VFC_POLLING_COUNT)
+                                       return 0;
 
-               for (set_id = 0; set_id < NUM_IOR_SETS; set_id++) {
-                       addr = BYTES_TO_DWORDS(storm->sem_fast_mem_addr +
-                                              SEM_FAST_REG_STORM_REG_FILE) +
-                              IOR_SET_OFFSET(set_id);
-                       if (strlen(buf) > 0)
-                               buf[strlen(buf) - 1] = '0' + set_id;
-                       offset += qed_grc_dump_mem(p_hwfn,
-                                                  p_ptt,
-                                                  dump_buf + offset,
-                                                  dump,
-                                                  buf,
-                                                  addr,
-                                                  IORS_PER_SET,
-                                                  false,
-                                                  32,
-                                                  false,
-                                                  "ior",
-                                                  true,
-                                                  storm->letter);
-               }
+                               msleep(polling_ms);
+                       }
+               } while (!is_ready);
+
+               reg_addr = sem_base + SEM_FAST_REG_VFC_DATA_RD;
+               qed_grc_dump_addr_range(p_hwfn,
+                                       p_ptt,
+                                       dump_buf + i,
+                                       true,
+                                       BYTES_TO_DWORDS(reg_addr),
+                                       1, false, SPLIT_TYPE_NONE, 0);
        }
 
-       return offset;
+       return resp_size;
 }
 
 /* Dump VFC CAM. Returns the dumped size in dwords. */
        struct storm_defs *storm = &s_storm_defs[storm_id];
        u32 cam_addr[VFC_CAM_ADDR_DWORDS] = { 0 };
        u32 cam_cmd[VFC_CAM_CMD_DWORDS] = { 0 };
-       u32 row, i, offset = 0;
+       u32 row, offset = 0;
 
        offset += qed_grc_dump_mem_hdr(p_hwfn,
                                       dump_buf + offset,
                                       0,
                                       total_size,
                                       256,
-                                      false, "vfc_cam", true, storm->letter);
+                                      false, "vfc_cam", storm->letter);
 
        if (!dump)
                return offset + total_size;
        /* Prepare CAM address */
        SET_VAR_FIELD(cam_addr, VFC_CAM_ADDR, OP, VFC_OPCODE_CAM_RD);
 
-       for (row = 0; row < VFC_CAM_NUM_ROWS;
-            row++, offset += VFC_CAM_RESP_DWORDS) {
-               /* Write VFC CAM command */
+       /* Read VFC CAM data */
+       for (row = 0; row < VFC_CAM_NUM_ROWS; row++) {
                SET_VAR_FIELD(cam_cmd, VFC_CAM_CMD, ROW, row);
-               ARR_REG_WR(p_hwfn,
-                          p_ptt,
-                          storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_WR,
-                          cam_cmd, VFC_CAM_CMD_DWORDS);
-
-               /* Write VFC CAM address */
-               ARR_REG_WR(p_hwfn,
-                          p_ptt,
-                          storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_ADDR,
-                          cam_addr, VFC_CAM_ADDR_DWORDS);
-
-               /* Read VFC CAM read response */
-               ARR_REG_RD(p_hwfn,
-                          p_ptt,
-                          storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_RD,
-                          dump_buf + offset, VFC_CAM_RESP_DWORDS);
+               offset += qed_grc_dump_read_from_vfc(p_hwfn,
+                                                    p_ptt,
+                                                    storm,
+                                                    cam_cmd,
+                                                    VFC_CAM_CMD_DWORDS,
+                                                    cam_addr,
+                                                    VFC_CAM_ADDR_DWORDS,
+                                                    VFC_CAM_RESP_DWORDS,
+                                                    dump_buf + offset);
        }
 
        return offset;
        struct storm_defs *storm = &s_storm_defs[storm_id];
        u32 ram_addr[VFC_RAM_ADDR_DWORDS] = { 0 };
        u32 ram_cmd[VFC_RAM_CMD_DWORDS] = { 0 };
-       u32 row, i, offset = 0;
+       u32 row, offset = 0;
 
        offset += qed_grc_dump_mem_hdr(p_hwfn,
                                       dump_buf + offset,
                                       256,
                                       false,
                                       ram_defs->type_name,
-                                      true, storm->letter);
-
-       /* Prepare RAM address */
-       SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, OP, VFC_OPCODE_RAM_RD);
+                                      storm->letter);
 
        if (!dump)
                return offset + total_size;
 
+       /* Prepare RAM address */
+       SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, OP, VFC_OPCODE_RAM_RD);
+
+       /* Read VFC RAM data */
        for (row = ram_defs->base_row;
-            row < ram_defs->base_row + ram_defs->num_rows;
-            row++, offset += VFC_RAM_RESP_DWORDS) {
-               /* Write VFC RAM command */
-               ARR_REG_WR(p_hwfn,
-                          p_ptt,
-                          storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_WR,
-                          ram_cmd, VFC_RAM_CMD_DWORDS);
-
-               /* Write VFC RAM address */
+            row < ram_defs->base_row + ram_defs->num_rows; row++) {
                SET_VAR_FIELD(ram_addr, VFC_RAM_ADDR, ROW, row);
-               ARR_REG_WR(p_hwfn,
-                          p_ptt,
-                          storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_ADDR,
-                          ram_addr, VFC_RAM_ADDR_DWORDS);
-
-               /* Read VFC RAM read response */
-               ARR_REG_RD(p_hwfn,
-                          p_ptt,
-                          storm->sem_fast_mem_addr + SEM_FAST_REG_VFC_DATA_RD,
-                          dump_buf + offset, VFC_RAM_RESP_DWORDS);
+               offset += qed_grc_dump_read_from_vfc(p_hwfn,
+                                                    p_ptt,
+                                                    storm,
+                                                    ram_cmd,
+                                                    VFC_RAM_CMD_DWORDS,
+                                                    ram_addr,
+                                                    VFC_RAM_ADDR_DWORDS,
+                                                    VFC_RAM_RESP_DWORDS,
+                                                    dump_buf + offset);
        }
 
        return offset;
 static u32 qed_grc_dump_vfc(struct qed_hwfn *p_hwfn,
                            struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
 {
-       struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
        u8 storm_id, i;
        u32 offset = 0;
 
        for (storm_id = 0; storm_id < MAX_DBG_STORMS; storm_id++) {
                if (!qed_grc_is_storm_included(p_hwfn,
                                               (enum dbg_storms)storm_id) ||
-                   !s_storm_defs[storm_id].has_vfc ||
-                   (storm_id == DBG_PSTORM_ID && dev_data->platform_id !=
-                    PLATFORM_ASIC))
+                   !s_storm_defs[storm_id].has_vfc)
                        continue;
 
                /* Read CAM */
                                               total_dwords,
                                               rss_defs->entry_width,
                                               packed,
-                                              rss_defs->type_name, false, 0);
+                                              rss_defs->type_name, 0);
 
                /* Dump RSS data */
                if (!dump) {
                                       0,
                                       ram_size,
                                       block_size * 8,
-                                      false, type_name, false, 0);
+                                      false, type_name, 0);
 
        /* Read and dump Big RAM data */
        if (!dump)
        return offset;
 }
 
+/* Dumps MCP scratchpad. Returns the dumped size in dwords. */
 static u32 qed_grc_dump_mcp(struct qed_hwfn *p_hwfn,
                            struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
 {
                                   dump,
                                   NULL,
                                   BYTES_TO_DWORDS(MCP_REG_SCRATCH),
-                                  MCP_REG_SCRATCH_SIZE_BB_K2,
-                                  false, 0, false, "MCP", false, 0);
+                                  MCP_REG_SCRATCH_SIZE,
+                                  false, 0, false, "MCP", 0);
 
        /* Dump MCP cpu_reg_file */
        offset += qed_grc_dump_mem(p_hwfn,
                                   NULL,
                                   BYTES_TO_DWORDS(MCP_REG_CPU_REG_FILE),
                                   MCP_REG_CPU_REG_FILE_SIZE,
-                                  false, 0, false, "MCP", false, 0);
+                                  false, 0, false, "MCP", 0);
 
        /* Dump MCP registers */
        block_enable[BLOCK_MCP] = true;
        offset += qed_grc_dump_registers(p_hwfn,
                                         p_ptt,
                                         dump_buf + offset,
-                                        dump, block_enable, "block", "MCP");
+                                        dump, block_enable, "MCP");
 
        /* Dump required non-MCP registers */
        offset += qed_grc_dump_regs_hdr(dump_buf + offset,
                                        dump, 1, SPLIT_TYPE_NONE, 0,
-                                       "block", "MCP");
+                                       "MCP");
        addr = BYTES_TO_DWORDS(MISC_REG_SHARED_MEM_ADDR);
        offset += qed_grc_dump_reg_entry(p_hwfn,
                                         p_ptt,
        return offset;
 }
 
-/* Dumps the tbus indirect memory for all PHYs. */
+/* Dumps the tbus indirect memory for all PHYs.
+ * Returns the dumped size in dwords.
+ */
 static u32 qed_grc_dump_phy(struct qed_hwfn *p_hwfn,
                            struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
 {
                                               mem_name,
                                               0,
                                               PHY_DUMP_SIZE_DWORDS,
-                                              16, true, mem_name, false, 0);
+                                              16, true, mem_name, 0);
 
                if (!dump) {
                        offset += PHY_DUMP_SIZE_DWORDS;
        return offset;
 }
 
-static void qed_config_dbg_line(struct qed_hwfn *p_hwfn,
-                               struct qed_ptt *p_ptt,
-                               enum block_id block_id,
-                               u8 line_id,
-                               u8 enable_mask,
-                               u8 right_shift,
-                               u8 force_valid_mask, u8 force_frame_mask)
+static enum dbg_status qed_find_nvram_image(struct qed_hwfn *p_hwfn,
+                                           struct qed_ptt *p_ptt,
+                                           u32 image_type,
+                                           u32 *nvram_offset_bytes,
+                                           u32 *nvram_size_bytes);
+
+static enum dbg_status qed_nvram_read(struct qed_hwfn *p_hwfn,
+                                     struct qed_ptt *p_ptt,
+                                     u32 nvram_offset_bytes,
+                                     u32 nvram_size_bytes, u32 *ret_buf);
+
+/* Dumps the MCP HW dump from NVRAM. Returns the dumped size in dwords. */
+static u32 qed_grc_dump_mcp_hw_dump(struct qed_hwfn *p_hwfn,
+                                   struct qed_ptt *p_ptt,
+                                   u32 *dump_buf, bool dump)
 {
-       struct block_defs *block = s_block_defs[block_id];
+       u32 hw_dump_offset_bytes = 0, hw_dump_size_bytes = 0;
+       u32 hw_dump_size_dwords = 0, offset = 0;
+       enum dbg_status status;
+
+       /* Read HW dump image from NVRAM */
+       status = qed_find_nvram_image(p_hwfn,
+                                     p_ptt,
+                                     NVM_TYPE_HW_DUMP_OUT,
+                                     &hw_dump_offset_bytes,
+                                     &hw_dump_size_bytes);
+       if (status != DBG_STATUS_OK)
+               return 0;
+
+       hw_dump_size_dwords = BYTES_TO_DWORDS(hw_dump_size_bytes);
+
+       /* Dump HW dump image section */
+       offset += qed_dump_section_hdr(dump_buf + offset,
+                                      dump, "mcp_hw_dump", 1);
+       offset += qed_dump_num_param(dump_buf + offset,
+                                    dump, "size", hw_dump_size_dwords);
+
+       /* Read MCP HW dump image into dump buffer */
+       if (dump && hw_dump_size_dwords) {
+               status = qed_nvram_read(p_hwfn,
+                                       p_ptt,
+                                       hw_dump_offset_bytes,
+                                       hw_dump_size_bytes, dump_buf + offset);
+               if (status != DBG_STATUS_OK) {
+                       DP_NOTICE(p_hwfn,
+                                 "Failed to read MCP HW Dump image from NVRAM\n");
+                       return 0;
+               }
+       }
+       offset += hw_dump_size_dwords;
 
-       qed_wr(p_hwfn, p_ptt, block->dbg_select_addr, line_id);
-       qed_wr(p_hwfn, p_ptt, block->dbg_enable_addr, enable_mask);
-       qed_wr(p_hwfn, p_ptt, block->dbg_shift_addr, right_shift);
-       qed_wr(p_hwfn, p_ptt, block->dbg_force_valid_addr, force_valid_mask);
-       qed_wr(p_hwfn, p_ptt, block->dbg_force_frame_addr, force_frame_mask);
+       return offset;
 }
 
 /* Dumps Static Debug data. Returns the dumped size in dwords. */
                                     u32 *dump_buf, bool dump)
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
-       u32 block_id, line_id, offset = 0;
+       u32 block_id, line_id, offset = 0, addr, len;
 
        /* Don't dump static debug if a debug bus recording is in progress */
        if (dump && qed_rd(p_hwfn, p_ptt, DBG_REG_DBG_BLOCK_ON))
                return 0;
 
        if (dump) {
-               /* Disable all blocks debug output */
-               for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
-                       struct block_defs *block = s_block_defs[block_id];
-
-                       if (block->dbg_client_id[dev_data->chip_id] !=
-                           MAX_DBG_BUS_CLIENTS)
-                               qed_wr(p_hwfn, p_ptt, block->dbg_enable_addr,
-                                      0);
-               }
+               /* Disable debug bus in all blocks */
+               qed_bus_disable_blocks(p_hwfn, p_ptt);
 
                qed_bus_reset_dbg_block(p_hwfn, p_ptt);
-               qed_bus_set_framing_mode(p_hwfn,
-                                        p_ptt, DBG_BUS_FRAME_MODE_8HW_0ST);
+               qed_wr(p_hwfn,
+                      p_ptt, DBG_REG_FRAMING_MODE, DBG_BUS_FRAME_MODE_8HW);
                qed_wr(p_hwfn,
                       p_ptt, DBG_REG_DEBUG_TARGET, DBG_BUS_TARGET_ID_INT_BUF);
                qed_wr(p_hwfn, p_ptt, DBG_REG_FULL_MODE, 1);
 
        /* Dump all static debug lines for each relevant block */
        for (block_id = 0; block_id < MAX_BLOCK_ID; block_id++) {
-               struct block_defs *block = s_block_defs[block_id];
-               struct dbg_bus_block *block_desc;
-               u32 block_dwords, addr, len;
-               u8 dbg_client_id;
+               const struct dbg_block_chip *block_per_chip;
+               const struct dbg_block *block;
+               bool is_removed, has_dbg_bus;
+               u16 modes_buf_offset;
+               u32 block_dwords;
+
+               block_per_chip =
+                   qed_get_dbg_block_per_chip(p_hwfn, (enum block_id)block_id);
+               is_removed = GET_FIELD(block_per_chip->flags,
+                                      DBG_BLOCK_CHIP_IS_REMOVED);
+               has_dbg_bus = GET_FIELD(block_per_chip->flags,
+                                       DBG_BLOCK_CHIP_HAS_DBG_BUS);
+
+               /* read+clear for NWS parity is not working, skip NWS block */
+               if (block_id == BLOCK_NWS)
+                       continue;
+
+               if (!is_removed && has_dbg_bus &&
+                   GET_FIELD(block_per_chip->dbg_bus_mode.data,
+                             DBG_MODE_HDR_EVAL_MODE) > 0) {
+                       modes_buf_offset =
+                           GET_FIELD(block_per_chip->dbg_bus_mode.data,
+                                     DBG_MODE_HDR_MODES_BUF_OFFSET);
+                       if (!qed_is_mode_match(p_hwfn, &modes_buf_offset))
+                               has_dbg_bus = false;
+               }
 
-               if (block->dbg_client_id[dev_data->chip_id] ==
-                   MAX_DBG_BUS_CLIENTS)
+               if (is_removed || !has_dbg_bus)
                        continue;
 
-               block_desc = get_dbg_bus_block_desc(p_hwfn,
-                                                   (enum block_id)block_id);
-               block_dwords = NUM_DBG_LINES(block_desc) *
+               block_dwords = NUM_DBG_LINES(block_per_chip) *
                               STATIC_DEBUG_LINE_DWORDS;
 
                /* Dump static section params */
+               block = get_dbg_block(p_hwfn, (enum block_id)block_id);
                offset += qed_grc_dump_mem_hdr(p_hwfn,
                                               dump_buf + offset,
                                               dump,
                                               block->name,
                                               0,
                                               block_dwords,
-                                              32, false, "STATIC", false, 0);
+                                              32, false, "STATIC", 0);
 
                if (!dump) {
                        offset += block_dwords;
                }
 
                /* Enable block's client */
-               dbg_client_id = block->dbg_client_id[dev_data->chip_id];
                qed_bus_enable_clients(p_hwfn,
                                       p_ptt,
-                                      BIT(dbg_client_id));
+                                      BIT(block_per_chip->dbg_client_id));
 
                addr = BYTES_TO_DWORDS(DBG_REG_CALENDAR_OUT_DATA);
                len = STATIC_DEBUG_LINE_DWORDS;
-               for (line_id = 0; line_id < (u32)NUM_DBG_LINES(block_desc);
+               for (line_id = 0; line_id < (u32)NUM_DBG_LINES(block_per_chip);
                     line_id++) {
                        /* Configure debug line ID */
-                       qed_config_dbg_line(p_hwfn,
-                                           p_ptt,
-                                           (enum block_id)block_id,
-                                           (u8)line_id, 0xf, 0, 0, 0);
+                       qed_bus_config_dbg_line(p_hwfn,
+                                               p_ptt,
+                                               (enum block_id)block_id,
+                                               (u8)line_id, 0xf, 0, 0, 0);
 
                        /* Read debug line info */
                        offset += qed_grc_dump_addr_range(p_hwfn,
 
                /* Disable block's client and debug output */
                qed_bus_enable_clients(p_hwfn, p_ptt, 0);
-               qed_wr(p_hwfn, p_ptt, block->dbg_enable_addr, 0);
+               qed_bus_config_dbg_line(p_hwfn, p_ptt,
+                                       (enum block_id)block_id, 0, 0, 0, 0, 0);
        }
 
        if (dump) {
                                    bool dump, u32 *num_dumped_dwords)
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
+       u32 dwords_read, offset = 0;
        bool parities_masked = false;
-       u32 offset = 0;
        u8 i;
 
        *num_dumped_dwords = 0;
        offset += qed_dump_num_param(dump_buf + offset,
                                     dump,
                                     "num-lcids",
-                                    qed_grc_get_param(p_hwfn,
-                                               DBG_GRC_PARAM_NUM_LCIDS));
+                                    NUM_OF_LCIDS);
        offset += qed_dump_num_param(dump_buf + offset,
                                     dump,
                                     "num-ltids",
-                                    qed_grc_get_param(p_hwfn,
-                                               DBG_GRC_PARAM_NUM_LTIDS));
+                                    NUM_OF_LTIDS);
        offset += qed_dump_num_param(dump_buf + offset,
                                     dump, "num-ports", dev_data->num_ports);
 
 
        /* Take all blocks out of reset (using reset registers) */
        if (dump) {
-               qed_grc_unreset_blocks(p_hwfn, p_ptt);
+               qed_grc_unreset_blocks(p_hwfn, p_ptt, false);
                qed_update_blocks_reset_state(p_hwfn, p_ptt);
        }
 
                                                 dump_buf +
                                                 offset,
                                                 dump,
-                                                block_enable, NULL, NULL);
+                                                block_enable, NULL);
 
                /* Dump special registers */
                offset += qed_grc_dump_special_regs(p_hwfn,
                                                       dump_buf + offset,
                                                       dump, i);
 
-       /* Dump IORs */
-       if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_IOR))
-               offset += qed_grc_dump_iors(p_hwfn,
-                                           p_ptt, dump_buf + offset, dump);
-
        /* Dump VFC */
-       if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC))
-               offset += qed_grc_dump_vfc(p_hwfn,
-                                          p_ptt, dump_buf + offset, dump);
+       if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_VFC)) {
+               dwords_read = qed_grc_dump_vfc(p_hwfn,
+                                              p_ptt, dump_buf + offset, dump);
+               offset += dwords_read;
+               if (!dwords_read)
+                       return DBG_STATUS_VFC_READ_ERROR;
+       }
 
        /* Dump PHY tbus */
        if (qed_grc_is_included(p_hwfn,
                                DBG_GRC_PARAM_DUMP_PHY) && dev_data->chip_id ==
-           CHIP_K2 && dev_data->platform_id == PLATFORM_ASIC)
+           CHIP_K2 && dev_data->hw_type == HW_TYPE_ASIC)
                offset += qed_grc_dump_phy(p_hwfn,
                                           p_ptt, dump_buf + offset, dump);
 
+       /* Dump MCP HW Dump */
+       if (qed_grc_is_included(p_hwfn, DBG_GRC_PARAM_DUMP_MCP_HW_DUMP) &&
+           !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP) && 1)
+               offset += qed_grc_dump_mcp_hw_dump(p_hwfn,
+                                                  p_ptt,
+                                                  dump_buf + offset, dump);
+
        /* Dump static debug data (only if not during debug bus recording) */
        if (qed_grc_is_included(p_hwfn,
                                DBG_GRC_PARAM_DUMP_STATIC) &&
        u8 reg_id;
 
        hdr = (struct dbg_idle_chk_result_hdr *)dump_buf;
-       regs = &((const union dbg_idle_chk_reg *)
-                s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr)[rule->reg_offset];
+       regs = (const union dbg_idle_chk_reg *)
+               p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr +
+               rule->reg_offset;
        cond_regs = ®s[0].cond_reg;
        info_regs = ®s[rule->num_cond_regs].info_reg;
 
                const struct dbg_idle_chk_cond_reg *reg = &cond_regs[reg_id];
                struct dbg_idle_chk_result_reg_hdr *reg_hdr;
 
-               reg_hdr = (struct dbg_idle_chk_result_reg_hdr *)
-                         (dump_buf + offset);
+               reg_hdr =
+                   (struct dbg_idle_chk_result_reg_hdr *)(dump_buf + offset);
 
                /* Write register header */
                if (!dump) {
                const u32 *imm_values;
 
                rule = &input_rules[i];
-               regs = &((const union dbg_idle_chk_reg *)
-                        s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr)
-                       [rule->reg_offset];
+               regs = (const union dbg_idle_chk_reg *)
+                       p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr +
+                       rule->reg_offset;
                cond_regs = ®s[0].cond_reg;
-               imm_values = &s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr
-                            [rule->imm_offset];
+               imm_values =
+                   (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr +
+                   rule->imm_offset;
 
                /* Check if all condition register blocks are out of reset, and
                 * find maximal number of entries (all condition registers that
 static u32 qed_idle_chk_dump(struct qed_hwfn *p_hwfn,
                             struct qed_ptt *p_ptt, u32 *dump_buf, bool dump)
 {
-       u32 num_failing_rules_offset, offset = 0, input_offset = 0;
-       u32 num_failing_rules = 0;
+       struct virt_mem_desc *dbg_buf =
+           &p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES];
+       u32 num_failing_rules_offset, offset = 0,
+           input_offset = 0, num_failing_rules = 0;
 
-       /* Dump global params */
+       /* Dump global params  - 1 must match below amount of params */
        offset += qed_dump_common_global_params(p_hwfn,
                                                p_ptt,
                                                dump_buf + offset, dump, 1);
        num_failing_rules_offset = offset;
        offset += qed_dump_num_param(dump_buf + offset, dump, "num_rules", 0);
 
-       while (input_offset <
-              s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].size_in_dwords) {
+       while (input_offset < BYTES_TO_DWORDS(dbg_buf->size)) {
                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++];
+                   (const struct dbg_idle_chk_cond_hdr *)dbg_buf->ptr +
+                   input_offset++;
                bool eval_mode, mode_match = true;
                u32 curr_failing_rules;
                u16 modes_buf_offset;
                }
 
                if (mode_match) {
+                       const struct dbg_idle_chk_rule *rule =
+                           (const struct dbg_idle_chk_rule *)((u32 *)
+                                                              dbg_buf->ptr
+                                                              + input_offset);
+                       u32 num_input_rules =
+                               cond_hdr->data_size / IDLE_CHK_RULE_SIZE_DWORDS;
                        offset +=
                            qed_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);
+                                                          p_ptt,
+                                                          dump_buf +
+                                                          offset,
+                                                          dump,
+                                                          rule,
+                                                          num_input_rules,
+                                                          &curr_failing_rules);
                        num_failing_rules += curr_failing_rules;
                }
 
 {
        u32 ret_mcp_resp, ret_mcp_param, ret_read_size, bytes_to_copy;
        s32 bytes_left = nvram_size_bytes;
-       u32 read_offset = 0;
+       u32 read_offset = 0, param = 0;
 
        DP_VERBOSE(p_hwfn,
                   QED_MSG_DEBUG,
                     MCP_DRV_NVM_BUF_LEN) ? MCP_DRV_NVM_BUF_LEN : bytes_left;
 
                /* Call NVRAM read command */
+               SET_MFW_FIELD(param,
+                             DRV_MB_PARAM_NVM_OFFSET,
+                             nvram_offset_bytes + read_offset);
+               SET_MFW_FIELD(param, DRV_MB_PARAM_NVM_LEN, bytes_to_copy);
                if (qed_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_OFFSET),
-                                      &ret_mcp_resp, &ret_mcp_param,
-                                      &ret_read_size,
+                                      DRV_MSG_CODE_NVM_READ_NVRAM, param,
+                                      &ret_mcp_resp,
+                                      &ret_mcp_param, &ret_read_size,
                                       (u32 *)((u8 *)ret_buf + read_offset)))
                        return DBG_STATUS_NVRAM_READ_FAILED;
 
        u32 trace_meta_size_dwords = 0, running_bundle_id, offset = 0;
        u32 trace_meta_offset_bytes = 0, trace_meta_size_bytes = 0;
        enum dbg_status status;
-       bool mcp_access;
        int halted = 0;
+       bool use_mfw;
 
        *num_dumped_dwords = 0;
 
-       mcp_access = !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP);
+       use_mfw = !qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_NO_MCP);
 
        /* Get trace data info */
        status = qed_mcp_trace_get_data_info(p_hwfn,
         * consistent. if halt fails, MCP trace is taken anyway, with a small
         * risk that it may be corrupt.
         */
-       if (dump && mcp_access) {
+       if (dump && use_mfw) {
                halted = !qed_mcp_halt(p_hwfn, p_ptt);
                if (!halted)
                        DP_NOTICE(p_hwfn, "MCP halt failed!\n");
         */
        trace_meta_size_bytes =
                qed_grc_get_param(p_hwfn, DBG_GRC_PARAM_MCP_TRACE_META_SIZE);
-       if ((!trace_meta_size_bytes || dump) && mcp_access) {
+       if ((!trace_meta_size_bytes || dump) && use_mfw)
                status = qed_mcp_trace_get_meta_info(p_hwfn,
                                                     p_ptt,
                                                     trace_data_size_bytes,
                                                     &running_bundle_id,
                                                     &trace_meta_offset_bytes,
                                                     &trace_meta_size_bytes);
-               if (status == DBG_STATUS_OK)
-                       trace_meta_size_dwords =
-                               BYTES_TO_DWORDS(trace_meta_size_bytes);
-       }
+       if (status == DBG_STATUS_OK)
+               trace_meta_size_dwords = BYTES_TO_DWORDS(trace_meta_size_bytes);
 
        /* Dump trace meta size param */
        offset += qed_dump_num_param(dump_buf + offset,
        /* If no mcp access, indicate that the dump doesn't contain the meta
         * data from NVRAM.
         */
-       return mcp_access ? status : DBG_STATUS_NVRAM_GET_IMAGE_FAILED;
+       return use_mfw ? status : DBG_STATUS_NVRAM_GET_IMAGE_FAILED;
 }
 
 /* Dump GRC FIFO */
                struct storm_defs *storm = &s_storm_defs[storm_id];
                u32 last_list_idx, addr;
 
-               if (dev_data->block_in_reset[storm->block_id])
+               if (dev_data->block_in_reset[storm->sem_block_id])
                        continue;
 
                /* Read FW info for the current Storm */
 
 /***************************** Public Functions *******************************/
 
-enum dbg_status qed_dbg_set_bin_ptr(const u8 * const bin_ptr)
+enum dbg_status qed_dbg_set_bin_ptr(struct qed_hwfn *p_hwfn,
+                                   const u8 * const bin_ptr)
 {
-       struct bin_buffer_hdr *buf_array = (struct bin_buffer_hdr *)bin_ptr;
+       struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr;
        u8 buf_id;
 
-       /* convert binary data to debug arrays */
-       for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) {
-               s_dbg_arrays[buf_id].ptr =
-                   (u32 *)(bin_ptr + buf_array[buf_id].offset);
-               s_dbg_arrays[buf_id].size_in_dwords =
-                   BYTES_TO_DWORDS(buf_array[buf_id].length);
-       }
+       /* Convert binary data to debug arrays */
+       for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++)
+               qed_set_dbg_bin_buf(p_hwfn,
+                                   buf_id,
+                                   (u32 *)(bin_ptr + buf_hdrs[buf_id].offset),
+                                   buf_hdrs[buf_id].length);
 
        return DBG_STATUS_OK;
 }
                struct storm_defs *storm = &s_storm_defs[storm_id];
 
                /* Skip Storm if it's in reset */
-               if (dev_data->block_in_reset[storm->block_id])
+               if (dev_data->block_in_reset[storm->sem_block_id])
                        continue;
 
                /* Read FW info for the current Storm */
 }
 
 enum dbg_status qed_dbg_grc_config(struct qed_hwfn *p_hwfn,
-                                  struct qed_ptt *p_ptt,
                                   enum dbg_grc_params grc_param, u32 val)
 {
+       struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
        enum dbg_status status;
        int i;
 
-       DP_VERBOSE(p_hwfn, QED_MSG_DEBUG,
+       DP_VERBOSE(p_hwfn,
+                  QED_MSG_DEBUG,
                   "dbg_grc_config: paramId = %d, val = %d\n", grc_param, val);
 
-       status = qed_dbg_dev_init(p_hwfn, p_ptt);
+       status = qed_dbg_dev_init(p_hwfn);
        if (status != DBG_STATUS_OK)
                return status;
 
 
                /* Update all params with the preset values */
                for (i = 0; i < MAX_DBG_GRC_PARAMS; i++) {
+                       struct grc_param_defs *defs = &s_grc_param_defs[i];
                        u32 preset_val;
-
                        /* Skip persistent params */
-                       if (s_grc_param_defs[i].is_persistent)
+                       if (defs->is_persistent)
                                continue;
 
                        /* Find preset value */
                        if (grc_param == DBG_GRC_PARAM_EXCLUDE_ALL)
                                preset_val =
-                                   s_grc_param_defs[i].exclude_all_preset_val;
+                                   defs->exclude_all_preset_val;
                        else if (grc_param == DBG_GRC_PARAM_CRASH)
                                preset_val =
-                                   s_grc_param_defs[i].crash_preset_val;
+                                   defs->crash_preset_val[dev_data->chip_id];
                        else
                                return DBG_STATUS_INVALID_ARGS;
 
-                       qed_grc_set_param(p_hwfn,
-                                         (enum dbg_grc_params)i, preset_val);
+                       qed_grc_set_param(p_hwfn, i, preset_val);
                }
        } else {
                /* Regular param - set its value */
                                              struct qed_ptt *p_ptt,
                                              u32 *buf_size)
 {
-       enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
+       enum dbg_status status = qed_dbg_dev_init(p_hwfn);
 
        *buf_size = 0;
 
        if (status != DBG_STATUS_OK)
                return status;
 
-       if (!s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
-           !s_dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr ||
-           !s_dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr ||
-           !s_dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
-           !s_dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
+       if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_REG].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_DUMP_MEM].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
                return DBG_STATUS_DBG_ARRAY_NOT_SET;
 
        return qed_grc_dump(p_hwfn, p_ptt, NULL, false, buf_size);
                                                   u32 *buf_size)
 {
        struct dbg_tools_data *dev_data = &p_hwfn->dbg_info;
-       struct idle_chk_data *idle_chk;
+       struct idle_chk_data *idle_chk = &dev_data->idle_chk;
        enum dbg_status status;
 
-       idle_chk = &dev_data->idle_chk;
        *buf_size = 0;
 
-       status = qed_dbg_dev_init(p_hwfn, p_ptt);
+       status = qed_dbg_dev_init(p_hwfn);
        if (status != DBG_STATUS_OK)
                return status;
 
-       if (!s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
-           !s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr ||
-           !s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr ||
-           !s_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr)
+       if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_REGS].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_IMMS].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_RULES].ptr)
                return DBG_STATUS_DBG_ARRAY_NOT_SET;
 
        if (!idle_chk->buf_size_set) {
                return DBG_STATUS_DUMP_BUF_TOO_SMALL;
 
        /* Update reset state */
+       qed_grc_unreset_blocks(p_hwfn, p_ptt, true);
        qed_update_blocks_reset_state(p_hwfn, p_ptt);
 
        /* Idle Check Dump */
                                                    struct qed_ptt *p_ptt,
                                                    u32 *buf_size)
 {
-       enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
+       enum dbg_status status = qed_dbg_dev_init(p_hwfn);
 
        *buf_size = 0;
 
                                                   struct qed_ptt *p_ptt,
                                                   u32 *buf_size)
 {
-       enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
+       enum dbg_status status = qed_dbg_dev_init(p_hwfn);
 
        *buf_size = 0;
 
                                                   struct qed_ptt *p_ptt,
                                                   u32 *buf_size)
 {
-       enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
+       enum dbg_status status = qed_dbg_dev_init(p_hwfn);
 
        *buf_size = 0;
 
                                              struct qed_ptt *p_ptt,
                                              u32 *buf_size)
 {
-       enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
+       enum dbg_status status = qed_dbg_dev_init(p_hwfn);
 
        *buf_size = 0;
 
                                                     struct qed_ptt *p_ptt,
                                                     u32 *buf_size)
 {
-       enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
+       enum dbg_status status = qed_dbg_dev_init(p_hwfn);
 
        *buf_size = 0;
 
                                                     struct qed_ptt *p_ptt,
                                                     u32 *buf_size)
 {
-       enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
+       enum dbg_status status = qed_dbg_dev_init(p_hwfn);
 
        *buf_size = 0;
 
                                  bool clear_status,
                                  struct dbg_attn_block_result *results)
 {
-       enum dbg_status status = qed_dbg_dev_init(p_hwfn, p_ptt);
+       enum dbg_status status = qed_dbg_dev_init(p_hwfn);
        u8 reg_idx, num_attn_regs, num_result_regs = 0;
        const struct dbg_attn_reg *attn_reg_arr;
 
        if (status != DBG_STATUS_OK)
                return status;
 
-       if (!s_dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
-           !s_dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
-           !s_dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
+       if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_MODE_TREE].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_BLOCKS].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_REGS].ptr)
                return DBG_STATUS_DBG_ARRAY_NOT_SET;
 
-       attn_reg_arr = qed_get_block_attn_regs(block_id,
+       attn_reg_arr = qed_get_block_attn_regs(p_hwfn,
+                                              block_id,
                                               attn_type, &num_attn_regs);
 
        for (reg_idx = 0; reg_idx < num_attn_regs; reg_idx++) {
 
        results->block_id = (u8)block_id;
        results->names_offset =
-           qed_get_block_attn_data(block_id, attn_type)->names_offset;
+           qed_get_block_attn_data(p_hwfn, block_id, attn_type)->names_offset;
        SET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE, attn_type);
        SET_FIELD(results->data,
                  DBG_ATTN_BLOCK_RESULT_NUM_REGS, num_result_regs);
 
 /******************************* Data Types **********************************/
 
-struct block_info {
-       const char *name;
-       enum block_id id;
-};
-
 /* REG fifo element */
 struct reg_fifo_element {
        u64 data;
 #define REG_FIFO_ELEMENT_ERROR_MASK            0x1f
 };
 
+/* REG fifo error element */
+struct reg_fifo_err {
+       u32 err_code;
+       const char *err_msg;
+};
+
 /* IGU fifo element */
 struct igu_fifo_element {
        u32 dword0;
        enum igu_fifo_addr_types type;
 };
 
-struct mcp_trace_meta {
-       u32 modules_num;
-       char **modules;
-       u32 formats_num;
-       struct mcp_trace_format *formats;
-       bool is_allocated;
-};
-
-/* Debug Tools user data */
-struct dbg_tools_user_data {
-       struct mcp_trace_meta mcp_trace_meta;
-       const u32 *mcp_trace_user_meta_buf;
-};
-
 /******************************** Constants **********************************/
 
 #define MAX_MSG_LEN                            1024
 #define MCP_TRACE_MAX_MODULE_LEN               8
 #define MCP_TRACE_FORMAT_MAX_PARAMS            3
 #define MCP_TRACE_FORMAT_PARAM_WIDTH \
-       (MCP_TRACE_FORMAT_P2_SIZE_SHIFT - MCP_TRACE_FORMAT_P1_SIZE_SHIFT)
+       (MCP_TRACE_FORMAT_P2_SIZE_OFFSET - MCP_TRACE_FORMAT_P1_SIZE_OFFSET)
 
 #define REG_FIFO_ELEMENT_ADDR_FACTOR           4
 #define REG_FIFO_ELEMENT_IS_PF_VF_VAL          127
 
 /***************************** Constant Arrays *******************************/
 
-struct user_dbg_array {
-       const u32 *ptr;
-       u32 size_in_dwords;
-};
-
-/* Debug arrays */
-static struct user_dbg_array
-s_user_dbg_arrays[MAX_BIN_DBG_BUFFER_TYPE] = { {NULL} };
-
-/* Block names array */
-static struct block_info s_block_info_arr[] = {
-       {"grc", BLOCK_GRC},
-       {"miscs", BLOCK_MISCS},
-       {"misc", BLOCK_MISC},
-       {"dbu", BLOCK_DBU},
-       {"pglue_b", BLOCK_PGLUE_B},
-       {"cnig", BLOCK_CNIG},
-       {"cpmu", BLOCK_CPMU},
-       {"ncsi", BLOCK_NCSI},
-       {"opte", BLOCK_OPTE},
-       {"bmb", BLOCK_BMB},
-       {"pcie", BLOCK_PCIE},
-       {"mcp", BLOCK_MCP},
-       {"mcp2", BLOCK_MCP2},
-       {"pswhst", BLOCK_PSWHST},
-       {"pswhst2", BLOCK_PSWHST2},
-       {"pswrd", BLOCK_PSWRD},
-       {"pswrd2", BLOCK_PSWRD2},
-       {"pswwr", BLOCK_PSWWR},
-       {"pswwr2", BLOCK_PSWWR2},
-       {"pswrq", BLOCK_PSWRQ},
-       {"pswrq2", BLOCK_PSWRQ2},
-       {"pglcs", BLOCK_PGLCS},
-       {"ptu", BLOCK_PTU},
-       {"dmae", BLOCK_DMAE},
-       {"tcm", BLOCK_TCM},
-       {"mcm", BLOCK_MCM},
-       {"ucm", BLOCK_UCM},
-       {"xcm", BLOCK_XCM},
-       {"ycm", BLOCK_YCM},
-       {"pcm", BLOCK_PCM},
-       {"qm", BLOCK_QM},
-       {"tm", BLOCK_TM},
-       {"dorq", BLOCK_DORQ},
-       {"brb", BLOCK_BRB},
-       {"src", BLOCK_SRC},
-       {"prs", BLOCK_PRS},
-       {"tsdm", BLOCK_TSDM},
-       {"msdm", BLOCK_MSDM},
-       {"usdm", BLOCK_USDM},
-       {"xsdm", BLOCK_XSDM},
-       {"ysdm", BLOCK_YSDM},
-       {"psdm", BLOCK_PSDM},
-       {"tsem", BLOCK_TSEM},
-       {"msem", BLOCK_MSEM},
-       {"usem", BLOCK_USEM},
-       {"xsem", BLOCK_XSEM},
-       {"ysem", BLOCK_YSEM},
-       {"psem", BLOCK_PSEM},
-       {"rss", BLOCK_RSS},
-       {"tmld", BLOCK_TMLD},
-       {"muld", BLOCK_MULD},
-       {"yuld", BLOCK_YULD},
-       {"xyld", BLOCK_XYLD},
-       {"ptld", BLOCK_PTLD},
-       {"ypld", BLOCK_YPLD},
-       {"prm", BLOCK_PRM},
-       {"pbf_pb1", BLOCK_PBF_PB1},
-       {"pbf_pb2", BLOCK_PBF_PB2},
-       {"rpb", BLOCK_RPB},
-       {"btb", BLOCK_BTB},
-       {"pbf", BLOCK_PBF},
-       {"rdif", BLOCK_RDIF},
-       {"tdif", BLOCK_TDIF},
-       {"cdu", BLOCK_CDU},
-       {"ccfc", BLOCK_CCFC},
-       {"tcfc", BLOCK_TCFC},
-       {"igu", BLOCK_IGU},
-       {"cau", BLOCK_CAU},
-       {"rgfs", BLOCK_RGFS},
-       {"rgsrc", BLOCK_RGSRC},
-       {"tgfs", BLOCK_TGFS},
-       {"tgsrc", BLOCK_TGSRC},
-       {"umac", BLOCK_UMAC},
-       {"xmac", BLOCK_XMAC},
-       {"dbg", BLOCK_DBG},
-       {"nig", BLOCK_NIG},
-       {"wol", BLOCK_WOL},
-       {"bmbn", BLOCK_BMBN},
-       {"ipc", BLOCK_IPC},
-       {"nwm", BLOCK_NWM},
-       {"nws", BLOCK_NWS},
-       {"ms", BLOCK_MS},
-       {"phy_pcie", BLOCK_PHY_PCIE},
-       {"led", BLOCK_LED},
-       {"avs_wrap", BLOCK_AVS_WRAP},
-       {"pxpreqbus", BLOCK_PXPREQBUS},
-       {"misc_aeu", BLOCK_MISC_AEU},
-       {"bar0_map", BLOCK_BAR0_MAP}
-};
-
 /* Status string array */
 static const char * const s_status_str[] = {
        /* DBG_STATUS_OK */
        /* DBG_STATUS_PCI_BUF_NOT_ALLOCATED */
        "A PCI buffer wasn't allocated",
 
-       /* DBG_STATUS_TOO_MANY_INPUTS */
-       "Too many inputs were enabled. Enabled less inputs, or set 'unifyInputs' to true",
+       /* DBG_STATUS_INVALID_FILTER_TRIGGER_DWORDS */
+       "The filter/trigger constraint dword offsets are not enabled for recording",
 
-       /* DBG_STATUS_INPUT_OVERLAP */
-       "Overlapping debug bus inputs",
 
-       /* DBG_STATUS_HW_ONLY_RECORDING */
-       "Cannot record Storm data since the entire recording cycle is used by HW",
+       /* DBG_STATUS_VFC_READ_ERROR */
+       "Error reading from VFC",
 
        /* DBG_STATUS_STORM_ALREADY_ENABLED */
        "The Storm was already enabled",
        /* DBG_STATUS_NO_INPUT_ENABLED */
        "No input was enabled for recording",
 
-       /* DBG_STATUS_NO_FILTER_TRIGGER_64B */
-       "Filters and triggers are not allowed when recording in 64b units",
+       /* DBG_STATUS_NO_FILTER_TRIGGER_256B */
+       "Filters and triggers are not allowed in E4 256-bit mode",
 
        /* DBG_STATUS_FILTER_ALREADY_ENABLED */
        "The filter was already enabled",
        /* DBG_STATUS_MCP_COULD_NOT_RESUME */
        "Failed to resume MCP after halt",
 
-       /* DBG_STATUS_RESERVED2 */
-       "Reserved debug status - shouldn't be returned",
+       /* DBG_STATUS_RESERVED0 */
+       "",
 
        /* DBG_STATUS_SEMI_FIFO_NOT_EMPTY */
        "Failed to empty SEMI sync FIFO",
        /* DBG_STATUS_DBG_ARRAY_NOT_SET */
        "Debug arrays were not set (when using binary files, dbg_set_bin_ptr must be called)",
 
-       /* DBG_STATUS_FILTER_BUG */
-       "Debug Bus filtering requires the -unifyInputs option (due to a HW bug)",
+       /* DBG_STATUS_RESERVED1 */
+       "",
 
        /* DBG_STATUS_NON_MATCHING_LINES */
-       "Non-matching debug lines - all lines must be of the same type (either 128b or 256b)",
+       "Non-matching debug lines - in E4, all lines must be of the same type (either 128b or 256b)",
 
-       /* DBG_STATUS_INVALID_TRIGGER_DWORD_OFFSET */
-       "The selected trigger dword offset wasn't enabled in the recorded HW block",
+       /* DBG_STATUS_INSUFFICIENT_HW_IDS */
+       "Insufficient HW IDs. Try to record less Storms/blocks",
 
        /* DBG_STATUS_DBG_BUS_IN_USE */
-       "The debug bus is in use"
+       "The debug bus is in use",
+
+       /* DBG_STATUS_INVALID_STORM_DBG_MODE */
+       "The storm debug mode is not supported in the current chip",
+
+       /* DBG_STATUS_OTHER_ENGINE_BB_ONLY */
+       "Other engine is supported only in BB",
+
+       /* DBG_STATUS_FILTER_SINGLE_HW_ID */
+       "The configured filter mode requires a single Storm/block input",
+
+       /* DBG_STATUS_TRIGGER_SINGLE_HW_ID */
+       "The configured filter mode requires that all the constraints of a single trigger state will be defined on a single Storm/block input",
+
+       /* DBG_STATUS_MISSING_TRIGGER_STATE_STORM */
+       "When triggering on Storm data, the Storm to trigger on must be specified"
 };
 
 /* Idle check severity names array */
        "xsdm",
        "dbu",
        "dmae",
-       "???",
+       "jdap",
        "???",
        "???",
        "???",
 };
 
 /* REG FIFO error messages array */
-static const char * const s_reg_fifo_error_strs[] = {
-       "grc timeout",
-       "address doesn't belong to any block",
-       "reserved address in block or write to read-only address",
-       "privilege/protection mismatch",
-       "path isolation error"
+static struct reg_fifo_err s_reg_fifo_errors[] = {
+       {1, "grc timeout"},
+       {2, "address doesn't belong to any block"},
+       {4, "reserved address in block or write to read-only address"},
+       {8, "privilege/protection mismatch"},
+       {16, "path isolation error"},
+       {17, "RSL error"}
 };
 
 /* IGU FIFO sources array */
        return dump_offset;
 }
 
-static struct dbg_tools_user_data *
-qed_dbg_get_user_data(struct qed_hwfn *p_hwfn)
+/* Returns the block name that matches the specified block ID,
+ * or NULL if not found.
+ */
+static const char *qed_dbg_get_block_name(struct qed_hwfn *p_hwfn,
+                                         enum block_id block_id)
+{
+       const struct dbg_block_user *block =
+           (const struct dbg_block_user *)
+           p_hwfn->dbg_arrays[BIN_BUF_DBG_BLOCKS_USER_DATA].ptr + block_id;
+
+       return (const char *)block->name;
+}
+
+static struct dbg_tools_user_data *qed_dbg_get_user_data(struct qed_hwfn
+                                                        *p_hwfn)
 {
        return (struct dbg_tools_user_data *)p_hwfn->dbg_user_info;
 }
 /* Parses the idle check rules and returns the number of characters printed.
  * In case of parsing error, returns 0.
  */
-static u32 qed_parse_idle_chk_dump_rules(u32 *dump_buf,
+static u32 qed_parse_idle_chk_dump_rules(struct qed_hwfn *p_hwfn,
+                                        u32 *dump_buf,
                                         u32 *dump_buf_end,
                                         u32 num_rules,
                                         bool print_fw_idle_chk,
 
                hdr = (struct dbg_idle_chk_result_hdr *)dump_buf;
                rule_parsing_data =
-                       (const struct dbg_idle_chk_rule_parsing_data *)
-                       &s_user_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].
-                       ptr[hdr->rule_id];
+                   (const struct dbg_idle_chk_rule_parsing_data *)
+                   p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr +
+                   hdr->rule_id;
                parsing_str_offset =
-                       GET_FIELD(rule_parsing_data->data,
-                                 DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET);
+                   GET_FIELD(rule_parsing_data->data,
+                             DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET);
                has_fw_msg =
-                       GET_FIELD(rule_parsing_data->data,
-                               DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG) > 0;
-               parsing_str =
-                       &((const char *)
-                       s_user_dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr)
-                       [parsing_str_offset];
+                   GET_FIELD(rule_parsing_data->data,
+                             DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG) > 0;
+               parsing_str = (const char *)
+                   p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr +
+                   parsing_str_offset;
                lsi_msg = parsing_str;
                curr_reg_id = 0;
 
  * parsed_results_bytes.
  * The parsing status is returned.
  */
-static enum dbg_status qed_parse_idle_chk_dump(u32 *dump_buf,
+static enum dbg_status qed_parse_idle_chk_dump(struct qed_hwfn *p_hwfn,
+                                              u32 *dump_buf,
                                               u32 num_dumped_dwords,
                                               char *results_buf,
                                               u32 *parsed_results_bytes,
        *num_errors = 0;
        *num_warnings = 0;
 
-       if (!s_user_dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr ||
-           !s_user_dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr)
+       if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_IDLE_CHK_PARSING_DATA].ptr)
                return DBG_STATUS_DBG_ARRAY_NOT_SET;
 
        /* Read global_params section */
                                            results_offset),
                            "FW_IDLE_CHECK:\n");
                rules_print_size =
-                       qed_parse_idle_chk_dump_rules(dump_buf,
+                       qed_parse_idle_chk_dump_rules(p_hwfn,
+                                                     dump_buf,
                                                      dump_buf_end,
                                                      num_rules,
                                                      true,
                                            results_offset),
                            "\nLSI_IDLE_CHECK:\n");
                rules_print_size =
-                       qed_parse_idle_chk_dump_rules(dump_buf,
+                       qed_parse_idle_chk_dump_rules(p_hwfn,
+                                                     dump_buf,
                                                      dump_buf_end,
                                                      num_rules,
                                                      false,
 
                format_ptr->data = qed_read_dword_from_buf(meta_buf_bytes,
                                                           &offset);
-               format_len =
-                   (format_ptr->data &
-                    MCP_TRACE_FORMAT_LEN_MASK) >> MCP_TRACE_FORMAT_LEN_SHIFT;
+               format_len = GET_MFW_FIELD(format_ptr->data,
+                                          MCP_TRACE_FORMAT_LEN);
                format_ptr->format_str = kzalloc(format_len, GFP_KERNEL);
                if (!format_ptr->format_str) {
                        /* Update number of modules to be released */
  * trace_buf - MCP trace cyclic buffer
  * trace_buf_size - MCP trace cyclic buffer size in bytes
  * data_offset - offset in bytes of the data to parse in the MCP trace cyclic
- *               buffer.
+ *              buffer.
  * data_size - size in bytes of data to parse.
  * parsed_buf - destination buffer for parsed data.
  * parsed_results_bytes - size of parsed data in bytes.
 
                /* Skip message if its index doesn't exist in the meta data */
                if (format_idx >= meta->formats_num) {
-                       u8 format_size =
-                               (u8)((header & MFW_TRACE_PRM_SIZE_MASK) >>
-                                    MFW_TRACE_PRM_SIZE_SHIFT);
+                       u8 format_size = (u8)GET_MFW_FIELD(header,
+                                                          MFW_TRACE_PRM_SIZE);
 
                        if (data_size < format_size)
                                return DBG_STATUS_MCP_TRACE_BAD_DATA;
                format_ptr = &meta->formats[format_idx];
 
                for (i = 0,
-                    param_mask = MCP_TRACE_FORMAT_P1_SIZE_MASK,
-                    param_shift = MCP_TRACE_FORMAT_P1_SIZE_SHIFT;
+                    param_mask = MCP_TRACE_FORMAT_P1_SIZE_MASK, param_shift =
+                    MCP_TRACE_FORMAT_P1_SIZE_OFFSET;
                     i < MCP_TRACE_FORMAT_MAX_PARAMS;
-                    i++,
-                    param_mask <<= MCP_TRACE_FORMAT_PARAM_WIDTH,
+                    i++, param_mask <<= MCP_TRACE_FORMAT_PARAM_WIDTH,
                     param_shift += MCP_TRACE_FORMAT_PARAM_WIDTH) {
                        /* Extract param size (0..3) */
                        u8 param_size = (u8)((format_ptr->data & param_mask) >>
                        data_size -= param_size;
                }
 
-               format_level = (u8)((format_ptr->data &
-                                    MCP_TRACE_FORMAT_LEVEL_MASK) >>
-                                   MCP_TRACE_FORMAT_LEVEL_SHIFT);
-               format_module = (u8)((format_ptr->data &
-                                     MCP_TRACE_FORMAT_MODULE_MASK) >>
-                                    MCP_TRACE_FORMAT_MODULE_SHIFT);
+               format_level = (u8)GET_MFW_FIELD(format_ptr->data,
+                                                MCP_TRACE_FORMAT_LEVEL);
+               format_module = (u8)GET_MFW_FIELD(format_ptr->data,
+                                                 MCP_TRACE_FORMAT_MODULE);
                if (format_level >= ARRAY_SIZE(s_mcp_trace_level_str))
                        return DBG_STATUS_MCP_TRACE_BAD_DATA;
 
        const char *section_name, *param_name, *param_str_val;
        u32 param_num_val, num_section_params, num_elements;
        struct reg_fifo_element *elements;
-       u8 i, j, err_val, vf_val;
+       u8 i, j, err_code, vf_val;
        u32 results_offset = 0;
        char vf_str[4];
 
 
        /* Decode elements */
        for (i = 0; i < num_elements; i++) {
-               bool err_printed = false;
+               const char *err_msg = NULL;
 
                /* Discover if element belongs to a VF or a PF */
                vf_val = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_VF);
                else
                        sprintf(vf_str, "%d", vf_val);
 
+               /* Find error message */
+               err_code = GET_FIELD(elements[i].data, REG_FIFO_ELEMENT_ERROR);
+               for (j = 0; j < ARRAY_SIZE(s_reg_fifo_errors) && !err_msg; j++)
+                       if (err_code == s_reg_fifo_errors[j].err_code)
+                               err_msg = s_reg_fifo_errors[j].err_msg;
+
                /* Add parsed element to parsed buffer */
                results_offset +=
                    sprintf(qed_get_buf_ptr(results_buf,
                                            results_offset),
-                           "raw: 0x%016llx, address: 0x%07x, access: %-5s, pf: %2d, vf: %s, port: %d, privilege: %-3s, protection: %-12s, master: %-4s, errors: ",
+                           "raw: 0x%016llx, address: 0x%07x, access: %-5s, pf: %2d, vf: %s, port: %d, privilege: %-3s, protection: %-12s, master: %-4s, error: %s\n",
                            elements[i].data,
                            (u32)GET_FIELD(elements[i].data,
                                           REG_FIFO_ELEMENT_ADDRESS) *
                            s_protection_strs[GET_FIELD(elements[i].data,
                                                REG_FIFO_ELEMENT_PROTECTION)],
                            s_master_strs[GET_FIELD(elements[i].data,
-                                               REG_FIFO_ELEMENT_MASTER)]);
-
-               /* Print errors */
-               for (j = 0,
-                    err_val = GET_FIELD(elements[i].data,
-                                        REG_FIFO_ELEMENT_ERROR);
-                    j < ARRAY_SIZE(s_reg_fifo_error_strs);
-                    j++, err_val >>= 1) {
-                       if (err_val & 0x1) {
-                               if (err_printed)
-                                       results_offset +=
-                                           sprintf(qed_get_buf_ptr
-                                                   (results_buf,
-                                                    results_offset), ", ");
-                               results_offset +=
-                                   sprintf(qed_get_buf_ptr
-                                           (results_buf, results_offset), "%s",
-                                           s_reg_fifo_error_strs[j]);
-                               err_printed = true;
-                       }
-               }
-
-               results_offset +=
-                   sprintf(qed_get_buf_ptr(results_buf, results_offset), "\n");
+                                                   REG_FIFO_ELEMENT_MASTER)],
+                           err_msg ? err_msg : "unknown error code");
        }
 
        results_offset += sprintf(qed_get_buf_ptr(results_buf,
 
 /***************************** Public Functions *******************************/
 
-enum dbg_status qed_dbg_user_set_bin_ptr(const u8 * const bin_ptr)
+enum dbg_status qed_dbg_user_set_bin_ptr(struct qed_hwfn *p_hwfn,
+                                        const u8 * const bin_ptr)
 {
-       struct bin_buffer_hdr *buf_array = (struct bin_buffer_hdr *)bin_ptr;
+       struct bin_buffer_hdr *buf_hdrs = (struct bin_buffer_hdr *)bin_ptr;
        u8 buf_id;
 
        /* Convert binary data to debug arrays */
-       for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++) {
-               s_user_dbg_arrays[buf_id].ptr =
-                       (u32 *)(bin_ptr + buf_array[buf_id].offset);
-               s_user_dbg_arrays[buf_id].size_in_dwords =
-                       BYTES_TO_DWORDS(buf_array[buf_id].length);
-       }
+       for (buf_id = 0; buf_id < MAX_BIN_DBG_BUFFER_TYPE; buf_id++)
+               qed_set_dbg_bin_buf(p_hwfn,
+                                   (enum bin_dbg_buffer_type)buf_id,
+                                   (u32 *)(bin_ptr + buf_hdrs[buf_id].offset),
+                                   buf_hdrs[buf_id].length);
 
        return DBG_STATUS_OK;
 }
 
-enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn)
+enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn,
+                                       void **user_data_ptr)
 {
-       p_hwfn->dbg_user_info = kzalloc(sizeof(struct dbg_tools_user_data),
-                                       GFP_KERNEL);
-       if (!p_hwfn->dbg_user_info)
+       *user_data_ptr = kzalloc(sizeof(struct dbg_tools_user_data),
+                                GFP_KERNEL);
+       if (!(*user_data_ptr))
                return DBG_STATUS_VIRT_MEM_ALLOC_FAILED;
 
        return DBG_STATUS_OK;
 {
        u32 num_errors, num_warnings;
 
-       return qed_parse_idle_chk_dump(dump_buf,
+       return qed_parse_idle_chk_dump(p_hwfn,
+                                      dump_buf,
                                       num_dumped_dwords,
                                       NULL,
                                       results_buf_size,
 {
        u32 parsed_buf_size;
 
-       return qed_parse_idle_chk_dump(dump_buf,
+       return qed_parse_idle_chk_dump(p_hwfn,
+                                      dump_buf,
                                       num_dumped_dwords,
                                       results_buf,
                                       &parsed_buf_size,
 enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn,
                                   struct dbg_attn_block_result *results)
 {
-       struct user_dbg_array *block_attn, *pstrings;
        const u32 *block_attn_name_offsets;
-       enum dbg_attn_type attn_type;
+       const char *attn_name_base;
        const char *block_name;
+       enum dbg_attn_type attn_type;
        u8 num_regs, i, j;
 
        num_regs = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_NUM_REGS);
-       attn_type = (enum dbg_attn_type)
-                   GET_FIELD(results->data,
-                             DBG_ATTN_BLOCK_RESULT_ATTN_TYPE);
-       block_name = s_block_info_arr[results->block_id].name;
-
-       if (!s_user_dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr ||
-           !s_user_dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr ||
-           !s_user_dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr)
+       attn_type = GET_FIELD(results->data, DBG_ATTN_BLOCK_RESULT_ATTN_TYPE);
+       block_name = qed_dbg_get_block_name(p_hwfn, results->block_id);
+       if (!block_name)
+               return DBG_STATUS_INVALID_ARGS;
+
+       if (!p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr ||
+           !p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr)
                return DBG_STATUS_DBG_ARRAY_NOT_SET;
 
-       block_attn = &s_user_dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS];
-       block_attn_name_offsets = &block_attn->ptr[results->names_offset];
+       block_attn_name_offsets =
+           (u32 *)p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_NAME_OFFSETS].ptr +
+           results->names_offset;
+
+       attn_name_base = p_hwfn->dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS].ptr;
 
        /* Go over registers with a non-zero attention status */
        for (i = 0; i < num_regs; i++) {
                reg_result = &results->reg_results[i];
                num_reg_attn = GET_FIELD(reg_result->data,
                                         DBG_ATTN_REG_RESULT_NUM_REG_ATTN);
-               block_attn = &s_user_dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES];
-               bit_mapping = &((struct dbg_attn_bit_mapping *)
-                               block_attn->ptr)[reg_result->block_attn_offset];
-
-               pstrings = &s_user_dbg_arrays[BIN_BUF_DBG_PARSING_STRINGS];
+               bit_mapping = (struct dbg_attn_bit_mapping *)
+                   p_hwfn->dbg_arrays[BIN_BUF_DBG_ATTN_INDEXES].ptr +
+                   reg_result->block_attn_offset;
 
                /* Go over attention status bits */
-               for (j = 0; j < num_reg_attn; j++) {
+               for (j = 0; j < num_reg_attn; j++, bit_idx++) {
                        u16 attn_idx_val = GET_FIELD(bit_mapping[j].data,
                                                     DBG_ATTN_BIT_MAPPING_VAL);
                        const char *attn_name, *attn_type_str, *masked_str;
-                       u32 attn_name_offset, sts_addr;
+                       u32 attn_name_offset;
+                       u32 sts_addr;
 
                        /* Check if bit mask should be advanced (due to unused
                         * bits).
                        }
 
                        /* Check current bit index */
-                       if (!(reg_result->sts_val & BIT(bit_idx))) {
-                               bit_idx++;
+                       if (!(reg_result->sts_val & BIT(bit_idx)))
                                continue;
-                       }
 
-                       /* Find attention name */
+                       /* An attention bit with value=1 was found
+                        * Find attention name
+                        */
                        attn_name_offset =
                                block_attn_name_offsets[attn_idx_val];
-                       attn_name = &((const char *)
-                                     pstrings->ptr)[attn_name_offset];
-                       attn_type_str = attn_type == ATTN_TYPE_INTERRUPT ?
-                                       "Interrupt" : "Parity";
+                       attn_name = attn_name_base + attn_name_offset;
+                       attn_type_str =
+                               (attn_type ==
+                                ATTN_TYPE_INTERRUPT ? "Interrupt" :
+                                "Parity");
                        masked_str = reg_result->mask_val & BIT(bit_idx) ?
                                     " [masked]" : "";
                        sts_addr = GET_FIELD(reg_result->data,
                        DP_NOTICE(p_hwfn,
                                  "%s (%s) : %s [address 0x%08x, bit %d]%s\n",
                                  block_name, attn_type_str, attn_name,
-                                 sts_addr, bit_idx, masked_str);
-
-                       bit_idx++;
+                                 sts_addr * 4, bit_idx, masked_str);
                }
        }
 
        return DBG_STATUS_OK;
 }
 
+static DEFINE_MUTEX(qed_dbg_lock);
+
 /* Wrapper for unifying the idle_chk and mcp_trace api */
 static enum dbg_status
 qed_print_idle_chk_results_wrapper(struct qed_hwfn *p_hwfn,
                                                       &buf_size_dwords);
        if (rc != DBG_STATUS_OK && rc != DBG_STATUS_NVRAM_GET_IMAGE_FAILED)
                return rc;
+
+       if (buf_size_dwords > MAX_DBG_FEATURE_SIZE_DWORDS) {
+               feature->buf_size = 0;
+               DP_NOTICE(p_hwfn->cdev,
+                         "Debug feature [\"%s\"] size (0x%x dwords) exceeds maximum size (0x%x dwords)\n",
+                         qed_features_lookup[feature_idx].name,
+                         buf_size_dwords, MAX_DBG_FEATURE_SIZE_DWORDS);
+
+               return DBG_STATUS_OK;
+       }
+
        feature->buf_size = buf_size_dwords * sizeof(u32);
        feature->dump_buf = vmalloc(feature->buf_size);
        if (!feature->dump_buf)
        ILT_DUMP = 13,
 };
 
-static u32 qed_calc_regdump_header(enum debug_print_features feature,
+static u32 qed_calc_regdump_header(struct qed_dev *cdev,
+                                  enum debug_print_features feature,
                                   int engine, u32 feature_size, u8 omit_engine)
 {
-       /* Insert the engine, feature and mode inside the header and combine it
-        * with feature size.
-        */
-       return feature_size | (feature << REGDUMP_HEADER_FEATURE_SHIFT) |
-              (omit_engine << REGDUMP_HEADER_OMIT_ENGINE_SHIFT) |
-              (engine << REGDUMP_HEADER_ENGINE_SHIFT);
+       u32 res = 0;
+
+       SET_FIELD(res, REGDUMP_HEADER_SIZE, feature_size);
+       if (res != feature_size)
+               DP_NOTICE(cdev,
+                         "Feature %d is too large (size 0x%x) and will corrupt the dump\n",
+                         feature, feature_size);
+
+       SET_FIELD(res, REGDUMP_HEADER_FEATURE, feature);
+       SET_FIELD(res, REGDUMP_HEADER_OMIT_ENGINE, omit_engine);
+       SET_FIELD(res, REGDUMP_HEADER_ENGINE, engine);
+
+       return res;
 }
 
 int qed_dbg_all_data(struct qed_dev *cdev, void *buffer)
        for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
                grc_params[i] = dev_data->grc.param_val[i];
 
-       if (cdev->num_hwfns == 1)
+       if (!QED_IS_CMT(cdev))
                omit_engine = 1;
 
+       mutex_lock(&qed_dbg_lock);
+
        org_engine = qed_get_debug_engine(cdev);
        for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) {
                /* Collect idle_chks and grcDump for each hw function */
                                      REGDUMP_HEADER_SIZE, &feature_size);
                if (!rc) {
                        *(u32 *)((u8 *)buffer + offset) =
-                           qed_calc_regdump_header(IDLE_CHK, cur_engine,
+                           qed_calc_regdump_header(cdev, IDLE_CHK, cur_engine,
                                                    feature_size, omit_engine);
                        offset += (feature_size + REGDUMP_HEADER_SIZE);
                } else {
                                      REGDUMP_HEADER_SIZE, &feature_size);
                if (!rc) {
                        *(u32 *)((u8 *)buffer + offset) =
-                           qed_calc_regdump_header(IDLE_CHK, cur_engine,
+                           qed_calc_regdump_header(cdev, IDLE_CHK, cur_engine,
                                                    feature_size, omit_engine);
                        offset += (feature_size + REGDUMP_HEADER_SIZE);
                } else {
                                      REGDUMP_HEADER_SIZE, &feature_size);
                if (!rc) {
                        *(u32 *)((u8 *)buffer + offset) =
-                           qed_calc_regdump_header(REG_FIFO, cur_engine,
+                           qed_calc_regdump_header(cdev, REG_FIFO, cur_engine,
                                                    feature_size, omit_engine);
                        offset += (feature_size + REGDUMP_HEADER_SIZE);
                } else {
                                      REGDUMP_HEADER_SIZE, &feature_size);
                if (!rc) {
                        *(u32 *)((u8 *)buffer + offset) =
-                           qed_calc_regdump_header(IGU_FIFO, cur_engine,
+                           qed_calc_regdump_header(cdev, IGU_FIFO, cur_engine,
                                                    feature_size, omit_engine);
                        offset += (feature_size + REGDUMP_HEADER_SIZE);
                } else {
                                                 &feature_size);
                if (!rc) {
                        *(u32 *)((u8 *)buffer + offset) =
-                           qed_calc_regdump_header(PROTECTION_OVERRIDE,
+                           qed_calc_regdump_header(cdev, PROTECTION_OVERRIDE,
                                                    cur_engine,
                                                    feature_size, omit_engine);
                        offset += (feature_size + REGDUMP_HEADER_SIZE);
                                        REGDUMP_HEADER_SIZE, &feature_size);
                if (!rc) {
                        *(u32 *)((u8 *)buffer + offset) =
-                           qed_calc_regdump_header(FW_ASSERTS, cur_engine,
-                                                   feature_size, omit_engine);
+                           qed_calc_regdump_header(cdev, FW_ASSERTS,
+                                                   cur_engine, feature_size,
+                                                   omit_engine);
                        offset += (feature_size + REGDUMP_HEADER_SIZE);
                } else {
                        DP_ERR(cdev, "qed_dbg_fw_asserts failed. rc = %d\n",
                                         REGDUMP_HEADER_SIZE, &feature_size);
                        if (!rc) {
                                *(u32 *)((u8 *)buffer + offset) =
-                                   qed_calc_regdump_header(ILT_DUMP,
+                                   qed_calc_regdump_header(cdev, ILT_DUMP,
                                                            cur_engine,
                                                            feature_size,
                                                            omit_engine);
                /* GRC dump - must be last because when mcp stuck it will
                 * clutter idle_chk, reg_fifo, ...
                 */
+               for (i = 0; i < MAX_DBG_GRC_PARAMS; i++)
+                       dev_data->grc.param_val[i] = grc_params[i];
+
                rc = qed_dbg_grc(cdev, (u8 *)buffer + offset +
                                 REGDUMP_HEADER_SIZE, &feature_size);
                if (!rc) {
                        *(u32 *)((u8 *)buffer + offset) =
-                           qed_calc_regdump_header(GRC_DUMP, cur_engine,
+                           qed_calc_regdump_header(cdev, GRC_DUMP,
+                                                   cur_engine,
                                                    feature_size, omit_engine);
                        offset += (feature_size + REGDUMP_HEADER_SIZE);
                } else {
        }
 
        qed_set_debug_engine(cdev, org_engine);
+
        /* mcp_trace */
        rc = qed_dbg_mcp_trace(cdev, (u8 *)buffer + offset +
                               REGDUMP_HEADER_SIZE, &feature_size);
        if (!rc) {
                *(u32 *)((u8 *)buffer + offset) =
-                   qed_calc_regdump_header(MCP_TRACE, cur_engine,
+                   qed_calc_regdump_header(cdev, MCP_TRACE, cur_engine,
                                            feature_size, omit_engine);
                offset += (feature_size + REGDUMP_HEADER_SIZE);
        } else {
 
        /* nvm cfg1 */
        rc = qed_dbg_nvm_image(cdev,
-                              (u8 *)buffer + offset + REGDUMP_HEADER_SIZE,
-                              &feature_size, QED_NVM_IMAGE_NVM_CFG1);
+                              (u8 *)buffer + offset +
+                              REGDUMP_HEADER_SIZE, &feature_size,
+                              QED_NVM_IMAGE_NVM_CFG1);
        if (!rc) {
                *(u32 *)((u8 *)buffer + offset) =
-                   qed_calc_regdump_header(NVM_CFG1, cur_engine,
+                   qed_calc_regdump_header(cdev, NVM_CFG1, cur_engine,
                                            feature_size, omit_engine);
                offset += (feature_size + REGDUMP_HEADER_SIZE);
        } else if (rc != -ENOENT) {
                               &feature_size, QED_NVM_IMAGE_DEFAULT_CFG);
        if (!rc) {
                *(u32 *)((u8 *)buffer + offset) =
-                   qed_calc_regdump_header(DEFAULT_CFG, cur_engine,
+                   qed_calc_regdump_header(cdev, DEFAULT_CFG, cur_engine,
                                            feature_size, omit_engine);
                offset += (feature_size + REGDUMP_HEADER_SIZE);
        } else if (rc != -ENOENT) {
                               &feature_size, QED_NVM_IMAGE_NVM_META);
        if (!rc) {
                *(u32 *)((u8 *)buffer + offset) =
-                   qed_calc_regdump_header(NVM_META, cur_engine,
-                                           feature_size, omit_engine);
+                       qed_calc_regdump_header(cdev, NVM_META, cur_engine,
+                                               feature_size, omit_engine);
                offset += (feature_size + REGDUMP_HEADER_SIZE);
        } else if (rc != -ENOENT) {
                DP_ERR(cdev,
                               QED_NVM_IMAGE_MDUMP);
        if (!rc) {
                *(u32 *)((u8 *)buffer + offset) =
-                       qed_calc_regdump_header(MDUMP, cur_engine,
+                       qed_calc_regdump_header(cdev, MDUMP, cur_engine,
                                                feature_size, omit_engine);
                offset += (feature_size + REGDUMP_HEADER_SIZE);
        } else if (rc != -ENOENT) {
                       QED_NVM_IMAGE_MDUMP, "QED_NVM_IMAGE_MDUMP", rc);
        }
 
+       mutex_unlock(&qed_dbg_lock);
+
        return 0;
 }
 
        u32 regs_len = 0, image_len = 0, ilt_len = 0, total_ilt_len = 0;
        u8 cur_engine, org_engine;
 
+       cdev->disable_ilt_dump = false;
        org_engine = qed_get_debug_engine(cdev);
        for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) {
                /* Engine specific */
 {
        struct qed_hwfn *p_hwfn =
                &cdev->hwfns[cdev->dbg_params.engine_for_debug];
+       struct qed_dbg_feature *qed_feature = &cdev->dbg_features[feature];
        struct qed_ptt *p_ptt = qed_ptt_acquire(p_hwfn);
-       struct qed_dbg_feature *qed_feature =
-               &cdev->dbg_params.features[feature];
        u32 buf_size_dwords;
        enum dbg_status rc;
 
 
 void qed_dbg_pf_init(struct qed_dev *cdev)
 {
-       const u8 *dbg_values;
+       const u8 *dbg_values = NULL;
+       int i;
 
        /* Debug values are after init values.
         * The offset is the first dword of the file.
         */
        dbg_values = cdev->firmware->data + *(u32 *)cdev->firmware->data;
-       qed_dbg_set_bin_ptr((u8 *)dbg_values);
-       qed_dbg_user_set_bin_ptr((u8 *)dbg_values);
+
+       for_each_hwfn(cdev, i) {
+               qed_dbg_set_bin_ptr(&cdev->hwfns[i], dbg_values);
+               qed_dbg_user_set_bin_ptr(&cdev->hwfns[i], dbg_values);
+       }
+
+       /* Set the hwfn to be 0 as default */
+       cdev->dbg_params.engine_for_debug = 0;
 }
 
 void qed_dbg_pf_exit(struct qed_dev *cdev)
        struct qed_dbg_feature *feature = NULL;
        enum qed_dbg_features feature_idx;
 
-       /* Debug features' buffers may be allocated if debug feature was used
-        * but dump wasn't called.
+       /* debug features' buffers may be allocated if debug feature was used
+        * but dump wasn't called
         */
        for (feature_idx = 0; feature_idx < DBG_FEATURE_NUM; feature_idx++) {
-               feature = &cdev->dbg_params.features[feature_idx];
+               feature = &cdev->dbg_features[feature_idx];
                if (feature->dump_buf) {
                        vfree(feature->dump_buf);
                        feature->dump_buf = NULL;