aboutsummaryrefslogtreecommitdiff
path: root/drivers/pci
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2013-01-23 19:16:04 -0500
committerSteven Rostedt <rostedt@goodmis.org>2013-01-23 19:16:04 -0500
commit50d6980bad935e2d799122d61b4a84073aaf781a (patch)
tree1824de187d7b5f042581ff617f032ba96b65cf28 /drivers/pci
parent01cf8d0d7bc27901437ae2421367598ce05ae34f (diff)
parentd4184347012fbe705671037a4a0e4c7021ea4329 (diff)
Merge tag 'v3.0.60' into v3.0-rt
This is the 3.0.60 stable release
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/intel-iommu.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
index ea2beb7ba7b1..50ba5e1f58ae 100644
--- a/drivers/pci/intel-iommu.c
+++ b/drivers/pci/intel-iommu.c
@@ -2289,8 +2289,39 @@ static int domain_add_dev_info(struct dmar_domain *domain,
return 0;
}
+static bool device_has_rmrr(struct pci_dev *dev)
+{
+ struct dmar_rmrr_unit *rmrr;
+ int i;
+
+ for_each_rmrr_units(rmrr) {
+ for (i = 0; i < rmrr->devices_cnt; i++) {
+ /*
+ * Return TRUE if this RMRR contains the device that
+ * is passed in.
+ */
+ if (rmrr->devices[i] == dev)
+ return true;
+ }
+ }
+ return false;
+}
+
static int iommu_should_identity_map(struct pci_dev *pdev, int startup)
{
+
+ /*
+ * We want to prevent any device associated with an RMRR from
+ * getting placed into the SI Domain. This is done because
+ * problems exist when devices are moved in and out of domains
+ * and their respective RMRR info is lost. We exempt USB devices
+ * from this process due to their usage of RMRRs that are known
+ * to not be needed after BIOS hand-off to OS.
+ */
+ if (device_has_rmrr(pdev) &&
+ (pdev->class >> 8) != PCI_CLASS_SERIAL_USB)
+ return 0;
+
if ((iommu_identity_mapping & IDENTMAP_AZALIA) && IS_AZALIA(pdev))
return 1;