aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iommu
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-06-08 12:37:23 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-06-08 12:37:23 -0400
commit181e505952c5e4b4beb287d0022ea3cd20f23e74 (patch)
treef0b3ab951cd0681ee772bc01ce6deae3983d3d1c /drivers/iommu
parent86579aa470dee9c6038ac4adf0f8c4863a215865 (diff)
parent4ed6a540fab8ea4388c1703b73ecfed68a2009d1 (diff)
Merge git://git.infradead.org/intel-iommu
Pull Intel IOMMU fix from David Woodhouse: "This fixes an oops when attempting to enable 1:1 passthrough mode for devices on which VT-d translation was disabled anyway. It's actually a long-standing bug but recent changes (commit 18436afdc11a: "iommu/vt-d: Allow RMRR on graphics devices too") have made it much easier to trigger with 'iommu=pt intel_iommu=igfx_off' on the command line" * git://git.infradead.org/intel-iommu: iommu/vt-d: Fix passthrough mode with translation-disabled devices
Diffstat (limited to 'drivers/iommu')
-rw-r--r--drivers/iommu/intel-iommu.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 68d43beccb7e..2ffe58969944 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -696,6 +696,11 @@ static inline struct context_entry *iommu_context_addr(struct intel_iommu *iommu
696 return &context[devfn]; 696 return &context[devfn];
697} 697}
698 698
699static int iommu_dummy(struct device *dev)
700{
701 return dev->archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO;
702}
703
699static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn) 704static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn)
700{ 705{
701 struct dmar_drhd_unit *drhd = NULL; 706 struct dmar_drhd_unit *drhd = NULL;
@@ -705,6 +710,9 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
705 u16 segment = 0; 710 u16 segment = 0;
706 int i; 711 int i;
707 712
713 if (iommu_dummy(dev))
714 return NULL;
715
708 if (dev_is_pci(dev)) { 716 if (dev_is_pci(dev)) {
709 pdev = to_pci_dev(dev); 717 pdev = to_pci_dev(dev);
710 segment = pci_domain_nr(pdev->bus); 718 segment = pci_domain_nr(pdev->bus);
@@ -2969,11 +2977,6 @@ static inline struct dmar_domain *get_valid_domain_for_dev(struct device *dev)
2969 return __get_valid_domain_for_dev(dev); 2977 return __get_valid_domain_for_dev(dev);
2970} 2978}
2971 2979
2972static int iommu_dummy(struct device *dev)
2973{
2974 return dev->archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO;
2975}
2976
2977/* Check if the dev needs to go through non-identity map and unmap process.*/ 2980/* Check if the dev needs to go through non-identity map and unmap process.*/
2978static int iommu_no_mapping(struct device *dev) 2981static int iommu_no_mapping(struct device *dev)
2979{ 2982{