IWL_FW_INI_REGION_NUM
 }; /* FW_TLV_DEBUG_REGION_TYPE_API_E */
 
-#define IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_HW_SMEM        1
+enum iwl_fw_ini_region_device_memory_subtype {
+       IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_HW_SMEM = 1,
+       IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_UMAC_ERROR_TABLE = 5,
+       IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_LMAC_1_ERROR_TABLE = 7,
+       IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_LMAC_2_ERROR_TABLE = 10,
+       IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_TCM_1_ERROR_TABLE = 14,
+       IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_TCM_2_ERROR_TABLE = 16,
+       IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_RCM_1_ERROR_TABLE = 18,
+       IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_RCM_2_ERROR_TABLE = 20,
+}; /* FW_TLV_DEBUG_REGION_DEVICE_MEMORY_SUBTYPE_API_E */
 
 /**
  * enum iwl_fw_ini_time_point
 
        excl->size = le32_to_cpu(fw->size);
 }
 
+static void iwl_parse_dbg_tlv_assert_tables(struct iwl_drv *drv,
+                                           const struct iwl_ucode_tlv *tlv)
+{
+       const struct iwl_fw_ini_region_tlv *region;
+       u32 length = le32_to_cpu(tlv->length);
+       u32 addr;
+
+       if (length < offsetof(typeof(*region), special_mem) +
+                    sizeof(region->special_mem))
+               return;
+
+       region = (void *)tlv->data;
+       addr = le32_to_cpu(region->special_mem.base_addr);
+       addr += le32_to_cpu(region->special_mem.offset);
+       addr &= ~FW_ADDR_CACHE_CONTROL;
+
+       if (region->type != IWL_FW_INI_REGION_SPECIAL_DEVICE_MEMORY)
+               return;
+
+       switch (region->sub_type) {
+       case IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_UMAC_ERROR_TABLE:
+               drv->trans->dbg.umac_error_event_table = addr;
+               drv->trans->dbg.error_event_table_tlv_status |=
+                       IWL_ERROR_EVENT_TABLE_UMAC;
+               break;
+       case IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_LMAC_1_ERROR_TABLE:
+               drv->trans->dbg.lmac_error_event_table[0] = addr;
+               drv->trans->dbg.error_event_table_tlv_status |=
+                       IWL_ERROR_EVENT_TABLE_LMAC1;
+               break;
+       case IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_LMAC_2_ERROR_TABLE:
+               drv->trans->dbg.lmac_error_event_table[1] = addr;
+               drv->trans->dbg.error_event_table_tlv_status |=
+                       IWL_ERROR_EVENT_TABLE_LMAC2;
+               break;
+       case IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_TCM_1_ERROR_TABLE:
+               drv->trans->dbg.tcm_error_event_table = addr;
+               drv->trans->dbg.error_event_table_tlv_status |=
+                       IWL_ERROR_EVENT_TABLE_TCM;
+               break;
+       default:
+               break;
+       }
+}
+
 static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
                                const struct firmware *ucode_raw,
                                struct iwl_firmware_pieces *pieces,
                                IWL_ERROR_EVENT_TABLE_LMAC1;
                        break;
                        }
-               case IWL_UCODE_TLV_TCM_DEBUG_ADDRS: {
-                       struct iwl_fw_tcm_error_addr *ptr = (void *)tlv_data;
-
-                       if (tlv_len != sizeof(*ptr))
-                               goto invalid_tlv_len;
-                       drv->trans->dbg.tcm_error_event_table =
-                               le32_to_cpu(ptr->addr) & ~FW_ADDR_CACHE_CONTROL;
-                       drv->trans->dbg.error_event_table_tlv_status |=
-                               IWL_ERROR_EVENT_TABLE_TCM;
-                       break;
-                       }
+               case IWL_UCODE_TLV_TYPE_REGIONS:
+                       iwl_parse_dbg_tlv_assert_tables(drv, tlv);
+                       fallthrough;
                case IWL_UCODE_TLV_TYPE_DEBUG_INFO:
                case IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION:
                case IWL_UCODE_TLV_TYPE_HCMD:
-               case IWL_UCODE_TLV_TYPE_REGIONS:
                case IWL_UCODE_TLV_TYPE_TRIGGERS:
                case IWL_UCODE_TLV_TYPE_CONF_SET:
                        if (iwlwifi_mod_params.enable_ini)