|
@@ -3215,6 +3215,33 @@ static int __init init_iommu_sysfs(void)
|
|
}
|
|
}
|
|
#endif /* CONFIG_PM */
|
|
#endif /* CONFIG_PM */
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Here we only respond to action of unbound device from driver.
|
|
|
|
+ *
|
|
|
|
+ * Added device is not attached to its DMAR domain here yet. That will happen
|
|
|
|
+ * when mapping the device to iova.
|
|
|
|
+ */
|
|
|
|
+static int device_notifier(struct notifier_block *nb,
|
|
|
|
+ unsigned long action, void *data)
|
|
|
|
+{
|
|
|
|
+ struct device *dev = data;
|
|
|
|
+ struct pci_dev *pdev = to_pci_dev(dev);
|
|
|
|
+ struct dmar_domain *domain;
|
|
|
|
+
|
|
|
|
+ domain = find_domain(pdev);
|
|
|
|
+ if (!domain)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ if (action == BUS_NOTIFY_UNBOUND_DRIVER && !iommu_pass_through)
|
|
|
|
+ domain_remove_one_dev_info(domain, pdev);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct notifier_block device_nb = {
|
|
|
|
+ .notifier_call = device_notifier,
|
|
|
|
+};
|
|
|
|
+
|
|
int __init intel_iommu_init(void)
|
|
int __init intel_iommu_init(void)
|
|
{
|
|
{
|
|
int ret = 0;
|
|
int ret = 0;
|
|
@@ -3267,6 +3294,8 @@ int __init intel_iommu_init(void)
|
|
|
|
|
|
register_iommu(&intel_iommu_ops);
|
|
register_iommu(&intel_iommu_ops);
|
|
|
|
|
|
|
|
+ bus_register_notifier(&pci_bus_type, &device_nb);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|