Thread (24 messages) 24 messages, 7 authors, 2015-12-17

Re: [PATCH v6 4/5] iommu/mediatek: Add mt8173 IOMMU driver

From: Joerg Roedel <hidden>
Date: 2015-12-14 14:17:02
Also in: linux-arm-kernel, linux-iommu, linux-mediatek, lkml

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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help