From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joerg Roedel Subject: Re: [PATCH v6 4/5] iommu/mediatek: Add mt8173 IOMMU driver Date: Mon, 14 Dec 2015 15:16:57 +0100 Message-ID: <20151214141656.GG18805@8bytes.org> References: <1449568153-15643-1-git-send-email-yong.wu@mediatek.com> <1449568153-15643-5-git-send-email-yong.wu@mediatek.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1449568153-15643-5-git-send-email-yong.wu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Errors-To: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org To: Yong Wu Cc: Mark Rutland , Catalin Marinas , Will Deacon , yingjoe.chen-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org, Thierry Reding , devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Sasha Hauer , arnd-r2nGTMty4D4@public.gmane.org, Tomasz Figa , Rob Herring , linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Matthias Brugger , linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, pebolle-IWqWACnzNjzz+pZb47iToQ@public.gmane.org, srv_heupstream-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, Daniel Kurtz , p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org, Lucas Stach List-Id: devicetree@vger.kernel.org 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.