]> Pileus Git - ~andy/linux/blobdiff - drivers/iommu/dmar.c
Merge branch 'for-3.14-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj...
[~andy/linux] / drivers / iommu / dmar.c
index 726cfe296d9909197a44f3a622b5f9e6d2e435a9..1581565434106027dca83e1e7bae4c640b3febe9 100644 (file)
@@ -472,24 +472,23 @@ int __init dmar_table_init(void)
        static int dmar_table_initialized;
        int ret;
 
-       if (dmar_table_initialized)
-               return 0;
-
-       dmar_table_initialized = 1;
-
-       ret = parse_dmar_table();
-       if (ret) {
-               if (ret != -ENODEV)
-                       pr_info("parse DMAR table failure.\n");
-               return ret;
-       }
+       if (dmar_table_initialized == 0) {
+               ret = parse_dmar_table();
+               if (ret < 0) {
+                       if (ret != -ENODEV)
+                               pr_info("parse DMAR table failure.\n");
+               } else  if (list_empty(&dmar_drhd_units)) {
+                       pr_info("No DMAR devices found\n");
+                       ret = -ENODEV;
+               }
 
-       if (list_empty(&dmar_drhd_units)) {
-               pr_info("No DMAR devices found\n");
-               return -ENODEV;
+               if (ret < 0)
+                       dmar_table_initialized = ret;
+               else
+                       dmar_table_initialized = 1;
        }
 
-       return 0;
+       return dmar_table_initialized < 0 ? dmar_table_initialized : 0;
 }
 
 static void warn_invalid_dmar(u64 addr, const char *message)
@@ -573,7 +572,7 @@ int __init detect_intel_iommu(void)
                        x86_init.iommu.iommu_init = intel_iommu_init;
 #endif
        }
-       early_acpi_os_unmap_memory(dmar_tbl, dmar_tbl_size);
+       early_acpi_os_unmap_memory((void __iomem *)dmar_tbl, dmar_tbl_size);
        dmar_tbl = NULL;
 
        return ret ? 1 : -ENODEV;
@@ -1065,7 +1064,7 @@ int dmar_enable_qi(struct intel_iommu *iommu)
        desc_page = alloc_pages_node(iommu->node, GFP_ATOMIC | __GFP_ZERO, 0);
        if (!desc_page) {
                kfree(qi);
-               iommu->qi = 0;
+               iommu->qi = NULL;
                return -ENOMEM;
        }
 
@@ -1075,7 +1074,7 @@ int dmar_enable_qi(struct intel_iommu *iommu)
        if (!qi->desc_status) {
                free_page((unsigned long) qi->desc);
                kfree(qi);
-               iommu->qi = 0;
+               iommu->qi = NULL;
                return -ENOMEM;
        }