|
@@ -3001,6 +3001,7 @@ static int __init init_dmars(void)
|
|
|
{
|
|
|
struct dmar_drhd_unit *drhd;
|
|
|
struct dmar_rmrr_unit *rmrr;
|
|
|
+ bool copied_tables = false;
|
|
|
struct device *dev;
|
|
|
struct intel_iommu *iommu;
|
|
|
int i, ret;
|
|
@@ -3091,6 +3092,7 @@ static int __init init_dmars(void)
|
|
|
} else {
|
|
|
pr_info("Copied translation tables from previous kernel for %s\n",
|
|
|
iommu->name);
|
|
|
+ copied_tables = true;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3118,6 +3120,15 @@ static int __init init_dmars(void)
|
|
|
|
|
|
check_tylersburg_isoch();
|
|
|
|
|
|
+ /*
|
|
|
+ * If we copied translations from a previous kernel in the kdump
|
|
|
+ * case, we can not assign the devices to domains now, as that
|
|
|
+ * would eliminate the old mappings. So skip this part and defer
|
|
|
+ * the assignment to device driver initialization time.
|
|
|
+ */
|
|
|
+ if (copied_tables)
|
|
|
+ goto domains_done;
|
|
|
+
|
|
|
/*
|
|
|
* If pass through is not set or not enabled, setup context entries for
|
|
|
* identity mappings for rmrr, gfx, and isa and may fall back to static
|
|
@@ -3157,6 +3168,8 @@ static int __init init_dmars(void)
|
|
|
|
|
|
iommu_prepare_isa();
|
|
|
|
|
|
+domains_done:
|
|
|
+
|
|
|
/*
|
|
|
* for each drhd
|
|
|
* enable fault log
|