aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2008-09-07 11:35:26 -0400
committerJesse Barnes <jbarnes@virtuousgeek.org>2008-09-09 14:42:43 -0400
commitcbda1ba898647aeb4ee770b803c922f595e97731 (patch)
treece58b11c014a3b85f5dcd243f30d80f2a7aba98b /drivers/pci
parent1941246dd98089dd637f44d3bd4f6cc1c61aa9e4 (diff)
PCI/iommu: blacklist DMAR on Intel G31/G33 chipsets
Some BIOSes (the Intel DG33BU, for example) wrongly claim to have DMAR when they don't. Avoid the resulting crashes when it doesn't work as expected. Signed-off-by: David Woodhouse <David.Woodhouse@intel.com> Acked-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/intel-iommu.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
index 8d0e60ac849c..c3edcdc08e72 100644
--- a/drivers/pci/intel-iommu.c
+++ b/drivers/pci/intel-iommu.c
@@ -2348,11 +2348,34 @@ static void __init iommu_exit_mempool(void)
2348 2348
2349} 2349}
2350 2350
2351static int blacklist_iommu(const struct dmi_system_id *id)
2352{
2353 printk(KERN_INFO "%s detected; disabling IOMMU\n",
2354 id->ident);
2355 dmar_disabled = 1;
2356 return 0;
2357}
2358
2359static struct dmi_system_id __initdata intel_iommu_dmi_table[] = {
2360 { /* Some DG33BU BIOS revisions advertised non-existent VT-d */
2361 .callback = blacklist_iommu,
2362 .ident = "Intel DG33BU",
2363 { DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
2364 DMI_MATCH(DMI_BOARD_NAME, "DG33BU"),
2365 }
2366 },
2367 { }
2368};
2369
2370
2351void __init detect_intel_iommu(void) 2371void __init detect_intel_iommu(void)
2352{ 2372{
2353 if (swiotlb || no_iommu || iommu_detected || dmar_disabled) 2373 if (swiotlb || no_iommu || iommu_detected || dmar_disabled)
2354 return; 2374 return;
2355 if (early_dmar_detect()) { 2375 if (early_dmar_detect()) {
2376 dmi_check_system(intel_iommu_dmi_table);
2377 if (dmar_disabled)
2378 return;
2356 iommu_detected = 1; 2379 iommu_detected = 1;
2357 } 2380 }
2358} 2381}