287ca6da2e
23725-pci-add-device.patch 23762-iommu-fault-bm-off.patch 23763-pci-multi-seg-x2apic-vtd-no-crash.patch 23765-x86-irq-vector-leak.patch 23766-x86-msi-vf-bars.patch 23771-x86-ioapic-clear-pin.patch 23772-x86-trampoline.patch 23774-x86_64-EFI-EDD.patch 23776-x86-kexec-hpet-legacy-bcast-disable.patch 23781-pm-wide-ACPI-ids.patch 23782-x86-ioapic-clear-irr.patch 23783-ACPI-set-_PDC-bits.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=140
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 )
|