56 lines
2.1 KiB
Diff
56 lines
2.1 KiB
Diff
|
# HG changeset patch
|
||
|
# User Jan Beulich <jbeulich@novell.com>
|
||
|
# Date 1313226769 -3600
|
||
|
# Node ID 8f647d409196f1d018f6284af03d1625cf8f93af
|
||
|
# Parent 537ed3b74b3f13267cfb3eb0e1483f432f3685cd
|
||
|
VT-d: don't reject valid DMAR/ATSR tables on systems with multiple PCI segments
|
||
|
|
||
|
On multi-PCI-segment systems, each segment has to be expected to have
|
||
|
an include-all DRHD and an all-ports ATSR, so the firmware consistency
|
||
|
check incorrectly rejects valid configurations there (which is
|
||
|
particularly problematic when the firmware also pre-enabled x2apic
|
||
|
mode, as the system will panic in that case due to being unable to
|
||
|
enable interrupt remapping). Thus constrain the check to just segment
|
||
|
0 for now; once full multi-segment support is there (which I'm working
|
||
|
on), it can be revisited whether we'd want to track this per segment,
|
||
|
or whether we trust the firmware of such large systems.
|
||
|
|
||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||
|
|
||
|
--- a/xen/drivers/passthrough/vtd/dmar.c
|
||
|
+++ b/xen/drivers/passthrough/vtd/dmar.c
|
||
|
@@ -427,13 +427,14 @@ acpi_parse_one_drhd(struct acpi_dmar_ent
|
||
|
if ( iommu_verbose )
|
||
|
dprintk(VTDPREFIX, " flags: INCLUDE_ALL\n");
|
||
|
/* Only allow one INCLUDE_ALL */
|
||
|
- if ( include_all )
|
||
|
+ if ( drhd->segment == 0 && include_all )
|
||
|
{
|
||
|
dprintk(XENLOG_WARNING VTDPREFIX,
|
||
|
"Only one INCLUDE_ALL device scope is allowed\n");
|
||
|
ret = -EINVAL;
|
||
|
}
|
||
|
- include_all = 1;
|
||
|
+ if ( drhd->segment == 0 )
|
||
|
+ include_all = 1;
|
||
|
}
|
||
|
|
||
|
if ( ret )
|
||
|
@@ -633,13 +634,14 @@ acpi_parse_one_atsr(struct acpi_dmar_ent
|
||
|
if ( iommu_verbose )
|
||
|
dprintk(VTDPREFIX, " flags: ALL_PORTS\n");
|
||
|
/* Only allow one ALL_PORTS */
|
||
|
- if ( all_ports )
|
||
|
+ if ( atsr->segment == 0 && all_ports )
|
||
|
{
|
||
|
dprintk(XENLOG_WARNING VTDPREFIX,
|
||
|
"Only one ALL_PORTS device scope is allowed\n");
|
||
|
ret = -EINVAL;
|
||
|
}
|
||
|
- all_ports = 1;
|
||
|
+ if ( atsr->segment == 0 )
|
||
|
+ all_ports = 1;
|
||
|
}
|
||
|
|
||
|
if ( ret )
|