]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
OF: Simplify of_iommu_configure()
authorRobin Murphy <robin.murphy@arm.com>
Tue, 2 Jul 2024 11:40:50 +0000 (12:40 +0100)
committerWill Deacon <will@kernel.org>
Thu, 4 Jul 2024 13:36:04 +0000 (14:36 +0100)
We no longer have a notion of partially-initialised fwspecs existing,
and we also no longer need to use an iommu_ops pointer to return status
to of_dma_configure(). Clean up the remains of those, which lends itself
to clarifying the logic around the dma_range_map allocation as well.

Acked-by: Rob Herring (Arm) <robh@kernel.org>
Tested-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/61972f88e31a6eda8bf5852f0853951164279a3c.1719919669.git.robin.murphy@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/of_iommu.c
drivers/of/device.c

index 08c523ad55ad81d40e0b30168118df91ed0d7020..c946521a5906efd54e416e1b46159969dd84081e 100644 (file)
@@ -108,7 +108,6 @@ static int of_iommu_configure_device(struct device_node *master_np,
 int of_iommu_configure(struct device *dev, struct device_node *master_np,
                       const u32 *id)
 {
-       struct iommu_fwspec *fwspec;
        int err;
 
        if (!master_np)
@@ -116,14 +115,9 @@ int of_iommu_configure(struct device *dev, struct device_node *master_np,
 
        /* Serialise to make dev->iommu stable under our potential fwspec */
        mutex_lock(&iommu_probe_device_lock);
-       fwspec = dev_iommu_fwspec_get(dev);
-       if (fwspec) {
-               if (fwspec->ops) {
-                       mutex_unlock(&iommu_probe_device_lock);
-                       return 0;
-               }
-               /* In the deferred case, start again from scratch */
-               iommu_fwspec_free(dev);
+       if (dev_iommu_fwspec_get(dev)) {
+               mutex_unlock(&iommu_probe_device_lock);
+               return 0;
        }
 
        /*
@@ -143,20 +137,17 @@ int of_iommu_configure(struct device *dev, struct device_node *master_np,
        } else {
                err = of_iommu_configure_device(master_np, dev, id);
        }
-       mutex_unlock(&iommu_probe_device_lock);
 
-       if (err == -ENODEV || err == -EPROBE_DEFER)
-               return err;
        if (err)
-               goto err_log;
+               iommu_fwspec_free(dev);
+       mutex_unlock(&iommu_probe_device_lock);
 
-       err = iommu_probe_device(dev);
-       if (err)
-               goto err_log;
-       return 0;
+       if (!err && dev->bus)
+               err = iommu_probe_device(dev);
+
+       if (err && err != -EPROBE_DEFER)
+               dev_dbg(dev, "Adding to IOMMU failed: %d\n", err);
 
-err_log:
-       dev_dbg(dev, "Adding to IOMMU failed: %pe\n", ERR_PTR(err));
        return err;
 }
 
index 312c6336121120f0c700e0e26b27006df7e8bee8..edf3be1972658f6dc165f577da53b10c7eebc116 100644 (file)
@@ -96,8 +96,7 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
        const struct bus_dma_region *map = NULL;
        struct device_node *bus_np;
        u64 mask, end = 0;
-       bool coherent;
-       int iommu_ret;
+       bool coherent, set_map = false;
        int ret;
 
        if (np == dev->of_node)
@@ -118,6 +117,7 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
        } else {
                /* Determine the overall bounds of all DMA regions */
                end = dma_range_map_max(map);
+               set_map = true;
        }
 
        /*
@@ -144,7 +144,7 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
        dev->coherent_dma_mask &= mask;
        *dev->dma_mask &= mask;
        /* ...but only set bus limit and range map if we found valid dma-ranges earlier */
-       if (!ret) {
+       if (set_map) {
                dev->bus_dma_limit = end;
                dev->dma_range_map = map;
        }
@@ -153,29 +153,21 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
        dev_dbg(dev, "device is%sdma coherent\n",
                coherent ? " " : " not ");
 
-       iommu_ret = of_iommu_configure(dev, np, id);
-       if (iommu_ret == -EPROBE_DEFER) {
+       ret = of_iommu_configure(dev, np, id);
+       if (ret == -EPROBE_DEFER) {
                /* Don't touch range map if it wasn't set from a valid dma-ranges */
-               if (!ret)
+               if (set_map)
                        dev->dma_range_map = NULL;
                kfree(map);
                return -EPROBE_DEFER;
-       } else if (iommu_ret == -ENODEV) {
-               dev_dbg(dev, "device is not behind an iommu\n");
-       } else if (iommu_ret) {
-               dev_err(dev, "iommu configuration for device failed with %pe\n",
-                       ERR_PTR(iommu_ret));
-
-               /*
-                * Historically this routine doesn't fail driver probing
-                * due to errors in of_iommu_configure()
-                */
-       } else
-               dev_dbg(dev, "device is behind an iommu\n");
+       }
+       /* Take all other IOMMU errors to mean we'll just carry on without it */
+       dev_dbg(dev, "device is%sbehind an iommu\n",
+               !ret ? " " : " not ");
 
        arch_setup_dma_ops(dev, coherent);
 
-       if (iommu_ret)
+       if (ret)
                of_dma_set_restricted_buffer(dev, np);
 
        return 0;