91 lines
3.0 KiB
Diff
91 lines
3.0 KiB
Diff
|
References: bnc#801910
|
||
|
|
||
|
# Commit 6890cebc6a987d0e896f5d23a8de11a3934101cf
|
||
|
# Date 2013-03-25 14:31:27 +0100
|
||
|
# Author Malcolm Crossley <malcolm.crossley@citrix.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
VT-d: deal with 5500/5520/X58 errata
|
||
|
|
||
|
http://www.intel.com/content/www/us/en/chipsets/5520-and-5500-chipset-ioh-specification-update.html
|
||
|
|
||
|
Stepping B-3 has two errata (#47 and #53) related to Interrupt
|
||
|
remapping, to which the workaround is for the BIOS to completely disable
|
||
|
interrupt remapping. These errata are fixed in stepping C-2.
|
||
|
|
||
|
Unfortunately this chipset stepping is very common and many BIOSes are
|
||
|
not disabling interrupt remapping on this stepping . We can detect this in
|
||
|
Xen and prevent Xen from using the problematic interrupt remapping feature.
|
||
|
|
||
|
The Intel 5500/5520/X58 chipset does not support VT-d
|
||
|
Extended Interrupt Mode(EIM). This means the iommu_supports_eim() check
|
||
|
always fails and so x2apic mode cannot be enabled in Xen before this quirk
|
||
|
disables the interrupt remapping feature.
|
||
|
|
||
|
Signed-off-by: Malcolm Crossley <malcolm.crossley@citrix.com>
|
||
|
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||
|
|
||
|
Gate the function call to check the quirk on interrupt remapping being
|
||
|
requested to get enabled, and upon failure disable the IOMMU to be in
|
||
|
line with what the changes for XSA-36 (plus follow-ups) did.
|
||
|
|
||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||
|
Acked-by: "Zhang, Xiantao" <xiantao.zhang@intel.com>
|
||
|
|
||
|
--- a/xen/drivers/passthrough/vtd/iommu.c
|
||
|
+++ b/xen/drivers/passthrough/vtd/iommu.c
|
||
|
@@ -2129,6 +2129,11 @@ int __init intel_vtd_setup(void)
|
||
|
}
|
||
|
|
||
|
platform_quirks_init();
|
||
|
+ if ( !iommu_enabled )
|
||
|
+ {
|
||
|
+ ret = -ENODEV;
|
||
|
+ goto error;
|
||
|
+ }
|
||
|
|
||
|
/* We enable the following features only if they are supported by all VT-d
|
||
|
* engines: Snoop Control, DMA passthrough, Queued Invalidation and
|
||
|
--- a/xen/drivers/passthrough/vtd/quirks.c
|
||
|
+++ b/xen/drivers/passthrough/vtd/quirks.c
|
||
|
@@ -248,6 +248,29 @@ void vtd_ops_postamble_quirk(struct iomm
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+/* 5500/5520/X58 Chipset Interrupt remapping errata, for stepping B-3.
|
||
|
+ * Fixed in stepping C-2. */
|
||
|
+static void __init tylersburg_intremap_quirk(void)
|
||
|
+{
|
||
|
+ uint32_t bus, device;
|
||
|
+ uint8_t rev;
|
||
|
+
|
||
|
+ for ( bus = 0; bus < 0x100; bus++ )
|
||
|
+ {
|
||
|
+ /* Match on System Management Registers on Device 20 Function 0 */
|
||
|
+ device = pci_conf_read32(0, bus, 20, 0, PCI_VENDOR_ID);
|
||
|
+ rev = pci_conf_read8(0, bus, 20, 0, PCI_REVISION_ID);
|
||
|
+
|
||
|
+ if ( rev == 0x13 && device == 0x342e8086 )
|
||
|
+ {
|
||
|
+ printk(XENLOG_WARNING VTDPREFIX
|
||
|
+ "Disabling IOMMU due to Intel 5500/5520/X58 Chipset errata #47, #53\n");
|
||
|
+ iommu_enabled = 0;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
/* initialize platform identification flags */
|
||
|
void __init platform_quirks_init(void)
|
||
|
{
|
||
|
@@ -268,6 +291,10 @@ void __init platform_quirks_init(void)
|
||
|
|
||
|
/* ioremap IGD MMIO+0x2000 page */
|
||
|
map_igd_reg();
|
||
|
+
|
||
|
+ /* Tylersburg interrupt remap quirk */
|
||
|
+ if ( iommu_intremap )
|
||
|
+ tylersburg_intremap_quirk();
|
||
|
}
|
||
|
|
||
|
/*
|