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.

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to