On Tue, Dec 08, 2015 at 05:49:12PM +0800, Yong Wu wrote: > +static int mtk_iommu_attach_device(struct iommu_domain *domain, > + struct device *dev) > +{ > + struct mtk_iommu_domain *dom = to_mtk_domain(domain); > + struct mtk_iommu_client_priv *priv = dev->archdata.iommu; > + struct mtk_iommu_data *data; > + int ret; > + > + if (!priv) > + return -ENODEV; > + > + data = dev_get_drvdata(priv->m4udev); > + if (!data) { > + /* > + * The DMA core will run earlier than this probe, and it will > + * create a default iommu domain for each a iommu device. > + * But here there is only one domain called the m4u domain > + * which all the multimedia HW share. > + * The default domain isn't needed here. > + */ The iommu core creates one domain per iommu-group. In your case this means one default domain per iommu in the system. > + iommu_domain_free(domain); This function is not supposed to free the domain passed to it. > +static int mtk_iommu_add_device(struct device *dev) > +{ > + struct iommu_group *group; > + > + if (!dev->archdata.iommu) /* Not a iommu client device */ > + return -ENODEV; > + > + group = iommu_group_get_for_dev(dev); > + if (IS_ERR(group)) > + return PTR_ERR(group); > + > + iommu_group_put(group); > + return 0; > +} [...] > +static struct iommu_group *mtk_iommu_device_group(struct device *dev) > +{ > + struct mtk_iommu_data *data; > + struct mtk_iommu_client_priv *priv; > + > + priv = dev->archdata.iommu; > + if (!priv) > + return ERR_PTR(-ENODEV); > + > + /* All the client devices are in the same m4u iommu-group */ > + data = dev_get_drvdata(priv->m4udev); > + if (!data->m4u_group) { > + data->m4u_group = iommu_group_alloc(); > + if (IS_ERR(data->m4u_group)) > + dev_err(dev, "Failed to allocate M4U IOMMU group\n"); > + } > + return data->m4u_group; > +} This looks much better than before, thanks. -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html