Messages in this thread Patch in this message | | | Subject | Re: BUG in drivers/dma/ioat/dma_v2.c:314 | From | David Woodhouse <> | Date | Thu, 01 Jul 2010 09:15:36 +0100 |
| |
On Thu, 2010-07-01 at 08:26 +0100, Williams, Dan J wrote: > On 7/1/2010 12:12 AM, Woodhouse, David wrote: > > On Thu, 2010-07-01 at 07:51 +0100, Williams, Dan J wrote: > >> This version of the device only exists on the 5400 chipset and always > >> has its own iommu, but since other platforms get the DMAR entry right I > >> think this hammer is too big? Wouldn't this break VT-d operation on > >> non-busted platforms? > > > > That just means we have to get the quirk right. Does 'this version' of > > the device have its own PCI ID? We can always fall back to checking the > > ID of the device at 0000:00:00.0 to check which chipset we're on. > > > > PCI_DEVICE_ID_INTEL_IOAT_SNB only exists on this chipset
Something like this, then?
diff --git a/drivers/pci/dmar.c b/drivers/pci/dmar.c index 0a19708..24ac178 100644 --- a/drivers/pci/dmar.c +++ b/drivers/pci/dmar.c @@ -543,8 +543,20 @@ dmar_find_matched_drhd_unit(struct pci_dev *dev) header); if (dmaru->include_all && - drhd->segment == pci_domain_nr(dev->bus)) + drhd->segment == pci_domain_nr(dev->bus)) { + /* We know that this device on this chipset has its own + IOMMU. If we find it under the catch-all IOMMU, then + the BIOS is lying to us. Hope that the IOMMU for + this device is actually disabled, and it needs no + translation... */ + if (dev->vendor == PCI_VENDOR_ID_INTEL && + dev->device == PCI_DEVICE_ID_INTEL_IOAT_SNB) { + WARN_TAINT_ONCE(1, TAINT_FIRMWARE_WORKAROUND, + "BIOS wrongly included I/OAT device under catch-all VT-d unit\n"); + return NULL; + } return dmaru; + } if (dmar_pci_device_match(dmaru->devices, dmaru->devices_cnt, dev))
-- David Woodhouse Open Source Technology Centre David.Woodhouse@intel.com Intel Corporation
| |