diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2009-04-03 19:39:25 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-04-04 05:43:29 -0400 |
commit | 924b6231edfaf1e764ffb4f97ea382bf4facff58 (patch) | |
tree | b51226e356c458d58c20a4c0dd1cb17c12b67086 /drivers/pci/intel-iommu.c | |
parent | d0b03bd1c6725a3463290d7f9626e4b583518a5a (diff) |
intel-iommu: Fix device-to-iommu mapping for PCI-PCI bridges.
When the DMAR table identifies that a PCI-PCI bridge belongs to a given
IOMMU, that means that the bridge and all devices behind it should be
associated with the IOMMU. Not just the bridge itself.
This fixes the device_to_iommu() function accordingly.
(It's broken if you have the same PCI bus numbers in multiple domains,
but this function was always broken in that way; I'll be dealing with
that later).
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/pci/intel-iommu.c')
-rw-r--r-- | drivers/pci/intel-iommu.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index f3eebd2b2d72..6262c198e56e 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
@@ -477,11 +477,16 @@ static struct intel_iommu *device_to_iommu(u8 bus, u8 devfn) | |||
477 | if (drhd->ignored) | 477 | if (drhd->ignored) |
478 | continue; | 478 | continue; |
479 | 479 | ||
480 | for (i = 0; i < drhd->devices_cnt; i++) | 480 | for (i = 0; i < drhd->devices_cnt; i++) { |
481 | if (drhd->devices[i] && | 481 | if (drhd->devices[i] && |
482 | drhd->devices[i]->bus->number == bus && | 482 | drhd->devices[i]->bus->number == bus && |
483 | drhd->devices[i]->devfn == devfn) | 483 | drhd->devices[i]->devfn == devfn) |
484 | return drhd->iommu; | 484 | return drhd->iommu; |
485 | if (drhd->devices[i]->subordinate && | ||
486 | drhd->devices[i]->subordinate->number <= bus && | ||
487 | drhd->devices[i]->subordinate->subordinate >= bus) | ||
488 | return drhd->iommu; | ||
489 | } | ||
485 | 490 | ||
486 | if (drhd->include_all) | 491 | if (drhd->include_all) |
487 | return drhd->iommu; | 492 | return drhd->iommu; |