struct iwl_dump_ini_region_data reg_data = {
                .dump_data = dump_data,
        };
+       struct iwl_dump_ini_region_data imr_reg_data = {
+               .dump_data = dump_data,
+       };
        int i;
        u32 size = 0;
        u64 regions_mask = le64_to_cpu(trigger->regions_mask) &
                                 tp_id);
                        continue;
                }
+               /*
+                * DRAM_IMR can be collected only for FW/HW error timepoint
+                * when fw is not alive. In addition, it must be collected
+                * lastly as it overwrites SRAM that can possibly contain
+                * debug data which also need to be collected.
+                */
+               if (reg_type == IWL_FW_INI_REGION_DRAM_IMR) {
+                       if (tp_id == IWL_FW_INI_TIME_POINT_FW_ASSERT ||
+                           tp_id == IWL_FW_INI_TIME_POINT_FW_HW_ERROR)
+                               imr_reg_data.reg_tlv = fwrt->trans->dbg.active_regions[i];
+                       else
+                               IWL_INFO(fwrt,
+                                        "WRT: trying to collect DRAM_IMR at time point: %d, skipping\n",
+                                        tp_id);
+               /* continue to next region */
+                       continue;
+               }
+
 
                size += iwl_dump_ini_mem(fwrt, list, ®_data,
                                         &iwl_dump_ini_region_ops[reg_type]);
        }
+       /* collect DRAM_IMR region in the last */
+       if (imr_reg_data.reg_tlv)
+               size += iwl_dump_ini_mem(fwrt, list, ®_data,
+                                        &iwl_dump_ini_region_ops[IWL_FW_INI_REGION_DRAM_IMR]);
 
        if (size)
                size += iwl_dump_ini_info(fwrt, trigger, list);