iommu/vt-d: Refactor device_to_iommu() helper
authorLu Baolu <baolu.lu@linux.intel.com>
Fri, 24 Jul 2020 01:49:21 +0000 (09:49 +0800)
committerJoerg Roedel <jroedel@suse.de>
Fri, 24 Jul 2020 08:51:21 +0000 (10:51 +0200)
It is refactored in two ways:

- Make it global so that it could be used in other files.

- Make bus/devfn optional so that callers could ignore these two returned
values when they only want to get the coresponding iommu pointer.

Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/20200724014925.15523-9-baolu.lu@linux.intel.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/intel/iommu.c
drivers/iommu/intel/svm.c
include/linux/intel-iommu.h

index 0a48315..ce8458e 100644 (file)
@@ -778,16 +778,16 @@ is_downstream_to_pci_bridge(struct device *dev, struct device *bridge)
        return false;
 }
 
-static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn)
+struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn)
 {
        struct dmar_drhd_unit *drhd = NULL;
+       struct pci_dev *pdev = NULL;
        struct intel_iommu *iommu;
        struct device *tmp;
-       struct pci_dev *pdev = NULL;
        u16 segment = 0;
        int i;
 
-       if (iommu_dummy(dev))
+       if (!dev || iommu_dummy(dev))
                return NULL;
 
        if (dev_is_pci(dev)) {
@@ -818,8 +818,10 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
                                if (pdev && pdev->is_virtfn)
                                        goto got_pdev;
 
-                               *bus = drhd->devices[i].bus;
-                               *devfn = drhd->devices[i].devfn;
+                               if (bus && devfn) {
+                                       *bus = drhd->devices[i].bus;
+                                       *devfn = drhd->devices[i].devfn;
+                               }
                                goto out;
                        }
 
@@ -829,8 +831,10 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
 
                if (pdev && drhd->include_all) {
                got_pdev:
-                       *bus = pdev->bus->number;
-                       *devfn = pdev->devfn;
+                       if (bus && devfn) {
+                               *bus = pdev->bus->number;
+                               *devfn = pdev->devfn;
+                       }
                        goto out;
                }
        }
@@ -5146,11 +5150,10 @@ static int aux_domain_add_dev(struct dmar_domain *domain,
                              struct device *dev)
 {
        int ret;
-       u8 bus, devfn;
        unsigned long flags;
        struct intel_iommu *iommu;
 
-       iommu = device_to_iommu(dev, &bus, &devfn);
+       iommu = device_to_iommu(dev, NULL, NULL);
        if (!iommu)
                return -ENODEV;
 
@@ -5236,9 +5239,8 @@ static int prepare_domain_attach_device(struct iommu_domain *domain,
        struct dmar_domain *dmar_domain = to_dmar_domain(domain);
        struct intel_iommu *iommu;
        int addr_width;
-       u8 bus, devfn;
 
-       iommu = device_to_iommu(dev, &bus, &devfn);
+       iommu = device_to_iommu(dev, NULL, NULL);
        if (!iommu)
                return -ENODEV;
 
@@ -5668,9 +5670,8 @@ static bool intel_iommu_capable(enum iommu_cap cap)
 static struct iommu_device *intel_iommu_probe_device(struct device *dev)
 {
        struct intel_iommu *iommu;
-       u8 bus, devfn;
 
-       iommu = device_to_iommu(dev, &bus, &devfn);
+       iommu = device_to_iommu(dev, NULL, NULL);
        if (!iommu)
                return ERR_PTR(-ENODEV);
 
@@ -5683,9 +5684,8 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)
 static void intel_iommu_release_device(struct device *dev)
 {
        struct intel_iommu *iommu;
-       u8 bus, devfn;
 
-       iommu = device_to_iommu(dev, &bus, &devfn);
+       iommu = device_to_iommu(dev, NULL, NULL);
        if (!iommu)
                return;
 
@@ -5835,37 +5835,14 @@ static struct iommu_group *intel_iommu_device_group(struct device *dev)
        return generic_device_group(dev);
 }
 
-#ifdef CONFIG_INTEL_IOMMU_SVM
-struct intel_iommu *intel_svm_device_to_iommu(struct device *dev)
-{
-       struct intel_iommu *iommu;
-       u8 bus, devfn;
-
-       if (iommu_dummy(dev)) {
-               dev_warn(dev,
-                        "No IOMMU translation for device; cannot enable SVM\n");
-               return NULL;
-       }
-
-       iommu = device_to_iommu(dev, &bus, &devfn);
-       if ((!iommu)) {
-               dev_err(dev, "No IOMMU for device; cannot enable SVM\n");
-               return NULL;
-       }
-
-       return iommu;
-}
-#endif /* CONFIG_INTEL_IOMMU_SVM */
-
 static int intel_iommu_enable_auxd(struct device *dev)
 {
        struct device_domain_info *info;
        struct intel_iommu *iommu;
        unsigned long flags;
-       u8 bus, devfn;
        int ret;
 
-       iommu = device_to_iommu(dev, &bus, &devfn);
+       iommu = device_to_iommu(dev, NULL, NULL);
        if (!iommu || dmar_disabled)
                return -EINVAL;
 
index d386853..65d2327 100644 (file)
@@ -231,7 +231,7 @@ static LIST_HEAD(global_svm_list);
 int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,
                          struct iommu_gpasid_bind_data *data)
 {
-       struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
+       struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
        struct dmar_domain *dmar_domain;
        struct intel_svm_dev *sdev;
        struct intel_svm *svm;
@@ -369,7 +369,7 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,
 
 int intel_svm_unbind_gpasid(struct device *dev, int pasid)
 {
-       struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
+       struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
        struct intel_svm_dev *sdev;
        struct intel_svm *svm;
        int ret = -EINVAL;
@@ -426,7 +426,7 @@ static int
 intel_svm_bind_mm(struct device *dev, int flags, struct svm_dev_ops *ops,
                  struct mm_struct *mm, struct intel_svm_dev **sd)
 {
-       struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
+       struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
        struct device_domain_info *info;
        struct intel_svm_dev *sdev;
        struct intel_svm *svm = NULL;
@@ -604,7 +604,7 @@ static int intel_svm_unbind_mm(struct device *dev, int pasid)
        struct intel_svm *svm;
        int ret = -EINVAL;
 
-       iommu = intel_svm_device_to_iommu(dev);
+       iommu = device_to_iommu(dev, NULL, NULL);
        if (!iommu)
                goto out;
 
index c7a8aae..a57ffbc 100644 (file)
@@ -727,6 +727,7 @@ void iommu_flush_write_buffer(struct intel_iommu *iommu);
 int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct device *dev);
 struct dmar_domain *find_domain(struct device *dev);
 struct device_domain_info *get_domain_info(struct device *dev);
+struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn);
 
 #ifdef CONFIG_INTEL_IOMMU_SVM
 extern void intel_svm_check(struct intel_iommu *iommu);
@@ -765,8 +766,6 @@ struct intel_svm {
        struct list_head devs;
        struct list_head list;
 };
-
-extern struct intel_iommu *intel_svm_device_to_iommu(struct device *dev);
 #else
 static inline void intel_svm_check(struct intel_iommu *iommu) {}
 #endif