[PATCH 1/7] iommu/omap: Do bus_set_iommu() only if probe() succeeds
From: Florian Vaussard <hidden>
Date: 2013-12-23 21:38:51
Also in:
linux-devicetree, linux-iommu, linux-omap, lkml
Hi Suman, On 12/23/2013 08:02 PM, Anna, Suman wrote:
Hi Florian, On 12/17/2013 06:53 AM, Florian Vaussard wrote:quoted
Currently, bus_set_iommu() is done in omap_iommu_init(). However, omap_iommu_probe() can fail in a number of ways, leaving the platform bus with a dangling reference to a non-initialized iommu. Perform bus_set_iommu() only if omap_iommu_probe() succeed.Can you clarify a bit more on what kind of issues you were seeing specifically? In general, there can be multiple instances of the iommu, so setting it in probe may not be fixing whatever issue you were seeing. The current OMAP3 code has only the ISP MMU enabled, but there is also another one for the IVA MMU (currently not configured by default). Moving the bus_set_iommu to probe makes sense if only one iommu is present, so this patch may not be needed at all.
If omap_iommu_probe() fails, the init will have called bus_set_iommu() anyways. Thus, when a driver request the iommu by calling iommu_domain_alloc(), it will succeed (but iommu_attach_device() will fail if I remember). Leaving a driver with a dangling reference to a phantom iommu is not good IMHO. It will lead to strange behaviours one day or another. As for the multiple iommu case, as I do not think it is currently possible, as bus_type (in this case &platform_bus_type) has only one struct iommu_ops. bus_set_iommu() will return EBUSY on the second call. Am I missing something?
Also, the main change in this patch is moving the bus_set_iommu from omap_iommu_init to omap_iommu_probe, so you should probably leave out moving the function. The omap_iommu_probe function would anyway need conversion to using devm_ functions.
This was my first try also, but as bus_set_iommu() needs omap_iommu_ops (itself depending on several functions), its call must come after the declaration of omap_iommu_ops. Thus I moved omap_iommu_probe() after the declaration of omap_iommu_ops. But I can probably use a forward declaration for omap_iommu_ops, this would be better. Indeed, we can also convert to devm_. Regards, Florian