__le32 offset;
 } __packed; /* FW_TLV_DEBUG_REGION_ERROR_TABLE_API_S_VER_1 */
 
+/**
+ * struct iwl_fw_ini_region_special_device_memory - special device memory
+ *
+ * Configuration to read a special memory
+ *
+ * @type: type of the special memory
+ * @version: version of the special memory
+ * @base_addr: base address of the error table
+ * @size: size of the error table
+ * @offset: offset to add to &base_addr
+ */
+struct iwl_fw_ini_region_special_device_memory {
+       __le16 type;
+       __le16 version;
+       __le32 base_addr;
+       __le32 size;
+       __le32 offset;
+} __packed; /* FW_TLV_DEBUG_REGION_SPECIAL_DEVICE_ADDR_API_S_VER_1 */
+
 /**
  * struct iwl_fw_ini_region_internal_buffer - internal buffer region data
  *
                struct iwl_fw_ini_region_fifos fifos;
                struct iwl_fw_ini_region_err_table err_table;
                struct iwl_fw_ini_region_internal_buffer internal_buffer;
+               struct iwl_fw_ini_region_special_device_memory special_mem;
                __le32 dram_alloc_id;
                __le32 tlv_mask;
        }; /* FW_TLV_DEBUG_REGION_CONF_PARAMS_API_U_VER_1 */
  * @IWL_FW_INI_REGION_CSR: CSR registers
  * @IWL_FW_INI_REGION_DRAM_IMR: IMR memory
  * @IWL_FW_INI_REGION_PCI_IOSF_CONFIG: PCI/IOSF config
+ * @IWL_FW_INI_REGION_SPECIAL_DEVICE_MEMORY: special device memroy
  * @IWL_FW_INI_REGION_NUM: number of region types
  */
 enum iwl_fw_ini_region_type {
        IWL_FW_INI_REGION_CSR,
        IWL_FW_INI_REGION_DRAM_IMR,
        IWL_FW_INI_REGION_PCI_IOSF_CONFIG,
+       IWL_FW_INI_REGION_SPECIAL_DEVICE_MEMORY,
        IWL_FW_INI_REGION_NUM
 }; /* FW_TLV_DEBUG_REGION_TYPE_API_E */
 
 
        return sizeof(*range) + le32_to_cpu(range->range_data_size);
 }
 
+static int
+iwl_dump_ini_special_mem_iter(struct iwl_fw_runtime *fwrt,
+                             struct iwl_dump_ini_region_data *reg_data,
+                             void *range_ptr, int idx)
+{
+       struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
+       struct iwl_fw_ini_region_special_device_memory *special_mem =
+               ®->special_mem;
+
+       struct iwl_fw_ini_error_dump_range *range = range_ptr;
+       u32 addr = le32_to_cpu(special_mem->base_addr) +
+                  le32_to_cpu(special_mem->offset);
+
+       range->internal_base_addr = cpu_to_le32(addr);
+       range->range_data_size = special_mem->size;
+       iwl_trans_read_mem_bytes(fwrt->trans, addr, range->data,
+                                le32_to_cpu(special_mem->size));
+
+       return sizeof(*range) + le32_to_cpu(range->range_data_size);
+}
+
 static int iwl_dump_ini_fw_pkt_iter(struct iwl_fw_runtime *fwrt,
                                    struct iwl_dump_ini_region_data *reg_data,
                                    void *range_ptr, int idx)
        return dump->ranges;
 }
 
+static void *
+iwl_dump_ini_special_mem_fill_header(struct iwl_fw_runtime *fwrt,
+                                    struct iwl_dump_ini_region_data *reg_data,
+                                    void *data)
+{
+       struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
+       struct iwl_fw_ini_special_device_memory *dump = data;
+
+       dump->header.version = cpu_to_le32(IWL_INI_DUMP_VER);
+       dump->type = reg->special_mem.type;
+       dump->version = reg->special_mem.version;
+
+       return dump->ranges;
+}
+
 static u32 iwl_dump_ini_mem_ranges(struct iwl_fw_runtime *fwrt,
                                   struct iwl_dump_ini_region_data *reg_data)
 {
        return size;
 }
 
+static u32
+iwl_dump_ini_special_mem_get_size(struct iwl_fw_runtime *fwrt,
+                                 struct iwl_dump_ini_region_data *reg_data)
+{
+       struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
+       u32 size = le32_to_cpu(reg->special_mem.size);
+
+       if (size)
+               size += sizeof(struct iwl_fw_ini_special_device_memory) +
+                       sizeof(struct iwl_fw_ini_error_dump_range);
+
+       return size;
+}
+
 static u32
 iwl_dump_ini_fw_pkt_get_size(struct iwl_fw_runtime *fwrt,
                             struct iwl_dump_ini_region_data *reg_data)
                .fill_mem_hdr = iwl_dump_ini_mem_fill_header,
                .fill_range = iwl_dump_ini_config_iter,
        },
+       [IWL_FW_INI_REGION_SPECIAL_DEVICE_MEMORY] = {
+               .get_num_of_ranges = iwl_dump_ini_single_range,
+               .get_size = iwl_dump_ini_special_mem_get_size,
+               .fill_mem_hdr = iwl_dump_ini_special_mem_fill_header,
+               .fill_range = iwl_dump_ini_special_mem_iter,
+       },
 };
 
 static u32 iwl_dump_ini_trigger(struct iwl_fw_runtime *fwrt,
 
        struct iwl_fw_ini_error_dump_range ranges[];
 } __packed;
 
+/**
+ * struct iwl_fw_ini_special_device_memory - special device memory
+ * @header: header of the region
+ * @type: type of special memory
+ * @version: struct special memory version
+ * @ranges: the memory ranges of this this region
+ */
+struct iwl_fw_ini_special_device_memory {
+       struct iwl_fw_ini_error_dump_header header;
+       __le16 type;
+       __le16 version;
+       struct iwl_fw_ini_error_dump_range ranges[];
+} __packed;
+
 /**
  * struct iwl_fw_error_dump_paging - content of the UMAC's image page
  *     block on DRAM