]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - drivers/of/device.c
Merge tag 'iommu-updates-v6.8' of git://git.kernel.org/pub/scm/linux/kernel/git/joro...
[thirdparty/linux.git] / drivers / of / device.c
index 6e9572c4af83b9b0dbe06c2945ca380f274d4445..de89f99063758a84d30cf2a8346925feddcc84ca 100644 (file)
@@ -93,12 +93,12 @@ of_dma_set_restricted_buffer(struct device *dev, struct device_node *np)
 int of_dma_configure_id(struct device *dev, struct device_node *np,
                        bool force_dma, const u32 *id)
 {
-       const struct iommu_ops *iommu;
        const struct bus_dma_region *map = NULL;
        struct device_node *bus_np;
        u64 dma_start = 0;
        u64 mask, end, size = 0;
        bool coherent;
+       int iommu_ret;
        int ret;
 
        if (np == dev->of_node)
@@ -181,21 +181,29 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
        dev_dbg(dev, "device is%sdma coherent\n",
                coherent ? " " : " not ");
 
-       iommu = of_iommu_configure(dev, np, id);
-       if (PTR_ERR(iommu) == -EPROBE_DEFER) {
+       iommu_ret = of_iommu_configure(dev, np, id);
+       if (iommu_ret == -EPROBE_DEFER) {
                /* Don't touch range map if it wasn't set from a valid dma-ranges */
                if (!ret)
                        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));
 
-       dev_dbg(dev, "device is%sbehind an iommu\n",
-               iommu ? " " : " not ");
+               /*
+                * 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");
 
-       arch_setup_dma_ops(dev, dma_start, size, iommu, coherent);
+       arch_setup_dma_ops(dev, dma_start, size, coherent);
 
-       if (!iommu)
+       if (iommu_ret)
                of_dma_set_restricted_buffer(dev, np);
 
        return 0;