return NULL;
 }
 
+#ifndef ACPI_IORT_SMMU_V3_DEVICEID_VALID
+#define ACPI_IORT_SMMU_V3_DEVICEID_VALID (1 << 4)
+#endif
+
 static int iort_get_id_mapping_index(struct acpi_iort_node *node)
 {
        struct acpi_iort_smmu_v3 *smmu;
 
                smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
                /*
-                * ID mapping index is only ignored if all interrupts are
-                * GSIV based
+                * Until IORT E.e (node rev. 5), the ID mapping index was
+                * defined to be valid unless all interrupts are GSIV-based.
                 */
-               if (smmu->event_gsiv && smmu->pri_gsiv && smmu->gerr_gsiv
-                   && smmu->sync_gsiv)
+               if (node->revision < 5) {
+                       if (smmu->event_gsiv && smmu->pri_gsiv &&
+                           smmu->gerr_gsiv && smmu->sync_gsiv)
+                               return -EINVAL;
+               } else if (!(smmu->flags & ACPI_IORT_SMMU_V3_DEVICEID_VALID)) {
                        return -EINVAL;
+               }
 
                if (smmu->id_mapping_index >= node->mapping_count) {
                        pr_err(FW_BUG "[node %p type %d] ID mapping index overflows valid mappings\n",