Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbda1ba8 authored by David Woodhouse's avatar David Woodhouse Committed by Jesse Barnes
Browse files

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: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
Acked-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent 1941246d
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -2348,11 +2348,34 @@ static void __init iommu_exit_mempool(void)

}

static int blacklist_iommu(const struct dmi_system_id *id)
{
	printk(KERN_INFO "%s detected; disabling IOMMU\n",
	       id->ident);
	dmar_disabled = 1;
	return 0;
}

static struct dmi_system_id __initdata intel_iommu_dmi_table[] = {
	{	/* Some DG33BU BIOS revisions advertised non-existent VT-d */
		.callback = blacklist_iommu,
		.ident = "Intel DG33BU",
		{	DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
			DMI_MATCH(DMI_BOARD_NAME, "DG33BU"),
		}
	},
	{ }
};


void __init detect_intel_iommu(void)
{
	if (swiotlb || no_iommu || iommu_detected || dmar_disabled)
		return;
	if (early_dmar_detect()) {
		dmi_check_system(intel_iommu_dmi_table);
		if (dmar_disabled)
			return;
		iommu_detected = 1;
	}
}