@@ -125,3 +125,16 @@ int of_get_dma_window(struct device_node *dn, const char *prefix, int index,
return 0;
}
EXPORT_SYMBOL_GPL(of_get_dma_window);
+
+int of_iommu_attach(struct device *dev)
+{
+ struct of_phandle_iter iter;
+
+ of_property_for_each_phandle_with_args(iter, dev->of_node, "iommus",
+ "iommu-cells", 0) {
+ if (!of_find_iommu_by_node(iter.out_args.np))
+ return -EPROBE_DEFER;
+ }
+
+ return 0;
+}
@@ -14,6 +14,7 @@ extern int of_get_dma_window(struct device_node *dn, const char *prefix,
void iommu_add(struct iommu *iommu);
void iommu_del(struct iommu *iommu);
+int of_iommu_attach(struct device *dev);
#else
@@ -32,6 +33,11 @@ static inline void iommu_del(struct iommu *iommu)
{
}
+static inline int of_iommu_attach(struct device *dev)
+{
+ return 0;
+}
+
#endif /* CONFIG_OF_IOMMU */
#endif /* __OF_IOMMU_H */
IOMMU devices on the bus need to be poplulated first, then iommu master devices are done later. With CONFIG_OF_IOMMU, "iommus=" DT binding would be used to identify whether a device can be an iommu msater or not. If a device can, we'll defer to populate that device till an depending iommu device is populated. Signed-off-by: Hiroshi Doyu <hdoyu@nvidia.com> --- drivers/iommu/of_iommu.c | 13 +++++++++++++ include/linux/of_iommu.h | 6 ++++++ 2 files changed, 19 insertions(+)