intr_remap: Call dmar_dev_scope_init() explicitly
[pandora-kernel.git] / drivers / iommu / dmar.c
index c4a0235..17adf1e 100644 (file)
@@ -557,13 +557,17 @@ dmar_find_matched_drhd_unit(struct pci_dev *dev)
 
 int __init dmar_dev_scope_init(void)
 {
+       static int dmar_dev_scope_initialized;
        struct dmar_drhd_unit *drhd, *drhd_n;
        int ret = -ENODEV;
 
+       if (dmar_dev_scope_initialized)
+               return dmar_dev_scope_initialized;
+
        list_for_each_entry_safe(drhd, drhd_n, &dmar_drhd_units, list) {
                ret = dmar_parse_dev(drhd);
                if (ret)
-                       return ret;
+                       goto fail;
        }
 
 #ifdef CONFIG_DMAR
@@ -574,17 +578,22 @@ int __init dmar_dev_scope_init(void)
                list_for_each_entry_safe(rmrr, rmrr_n, &dmar_rmrr_units, list) {
                        ret = rmrr_parse_dev(rmrr);
                        if (ret)
-                               return ret;
+                               goto fail;
                }
 
                list_for_each_entry_safe(atsr, atsr_n, &dmar_atsr_units, list) {
                        ret = atsr_parse_dev(atsr);
                        if (ret)
-                               return ret;
+                               goto fail;
                }
        }
 #endif
 
+       dmar_dev_scope_initialized = 1;
+       return 0;
+
+fail:
+       dmar_dev_scope_initialized = ret;
        return ret;
 }