/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
 /*
- * Copyright (C) 2018-2020 Intel Corporation
+ * Copyright (C) 2018-2021 Intel Corporation
  */
 #ifndef __iwl_fw_dbg_tlv_h__
 #define __iwl_fw_dbg_tlv_h__
 #define IWL_FW_INI_MAX_NAME                    32
 #define IWL_FW_INI_MAX_CFG_NAME                        64
 #define IWL_FW_INI_DOMAIN_ALWAYS_ON            0
+#define IWL_FW_INI_REGION_V2_MASK              0x0000FFFF
 
 /**
  * struct iwl_fw_ini_hcmd
 
        u32 num_of_ranges, i, size;
        void *range;
 
+       /*
+        * The higher part of the ID in version 2 is irrelevant for
+        * us, so mask it out.
+        */
+       if (le32_to_cpu(reg->hdr.version) == 2)
+               id &= IWL_FW_INI_REGION_V2_MASK;
+
        if (!ops->get_num_of_ranges || !ops->get_size || !ops->fill_mem_hdr ||
            !ops->fill_range)
                return 0;
        num_of_ranges = ops->get_num_of_ranges(fwrt, reg_data);
 
        header = (void *)tlv->data;
-       header->region_id = reg->id;
+       header->region_id = cpu_to_le32(id);
        header->num_of_ranges = cpu_to_le32(num_of_ranges);
        header->name_len = cpu_to_le32(IWL_FW_INI_MAX_NAME);
        memcpy(header->name, reg->name, IWL_FW_INI_MAX_NAME);
 
        [IWL_DBG_TLV_TYPE_DEBUG_INFO]   = {.min_ver = 1, .max_ver = 1,},
        [IWL_DBG_TLV_TYPE_BUF_ALLOC]    = {.min_ver = 1, .max_ver = 1,},
        [IWL_DBG_TLV_TYPE_HCMD]         = {.min_ver = 1, .max_ver = 1,},
-       [IWL_DBG_TLV_TYPE_REGION]       = {.min_ver = 1, .max_ver = 1,},
+       [IWL_DBG_TLV_TYPE_REGION]       = {.min_ver = 1, .max_ver = 2,},
        [IWL_DBG_TLV_TYPE_TRIGGER]      = {.min_ver = 1, .max_ver = 1,},
 };
 
        u32 type = le32_to_cpu(reg->type);
        u32 tlv_len = sizeof(*tlv) + le32_to_cpu(tlv->length);
 
+       /*
+        * The higher part of the ID in version 2 is irrelevant for
+        * us, so mask it out.
+        */
+       if (le32_to_cpu(reg->hdr.version) == 2)
+               id &= IWL_FW_INI_REGION_V2_MASK;
+
        if (le32_to_cpu(tlv->length) < sizeof(*reg))
                return -EINVAL;
 
+       /* for safe use of a string from FW, limit it to IWL_FW_INI_MAX_NAME */
+       IWL_DEBUG_FW(trans, "WRT: parsing region: %.*s\n",
+                    IWL_FW_INI_MAX_NAME, reg->name);
+
        if (id >= IWL_FW_INI_MAX_REGION_ID) {
                IWL_ERR(trans, "WRT: Invalid region id %u\n", id);
                return -EINVAL;