xen/23763-pci-multi-seg-x2apic-vtd-no-crash.patch
Charles Arnold 287ca6da2e - Upstream patches from Jan
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
2011-08-26 16:49:33 +00:00

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 )