iommu: Ignore -ENODEV errors from add_device call-back
authorJoerg Roedel <jroedel@suse.de>
Mon, 29 Jun 2015 08:16:08 +0000 (10:16 +0200)
committerJoerg Roedel <jroedel@suse.de>
Mon, 29 Jun 2015 19:57:19 +0000 (21:57 +0200)
The -ENODEV error just means that the device is not
translated by an IOMMU. We shouldn't bail out of iommu
driver initialization when that happens, as this is a common
scenario on ARM.

Not returning -ENODEV in the drivers would be a bad idea, as
the IOMMU core would have no indication whether a device is
translated or not. This indication is not used at the
moment, but will probably be in the future.

Fixes: 19762d7 ("iommu: Propagate error in add_iommu_group")
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Eric Auger <eric.auger@linaro.org>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/iommu.c

index 49e7542..f286090 100644 (file)
@@ -847,13 +847,24 @@ static int add_iommu_group(struct device *dev, void *data)
 {
        struct iommu_callback_data *cb = data;
        const struct iommu_ops *ops = cb->ops;
+       int ret;
 
        if (!ops->add_device)
                return 0;
 
        WARN_ON(dev->iommu_group);
 
-       return ops->add_device(dev);
+       ret = ops->add_device(dev);
+
+       /*
+        * We ignore -ENODEV errors for now, as they just mean that the
+        * device is not translated by an IOMMU. We still care about
+        * other errors and fail to initialize when they happen.
+        */
+       if (ret == -ENODEV)
+               ret = 0;
+
+       return ret;
 }
 
 static int remove_iommu_group(struct device *dev, void *data)