All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joerg Roedel <joro@8bytes.org>
To: Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org>,
	Robin Murphy <robin.murphy@arm.com>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Kukjin Kim <kgene@kernel.org>,
	Krzysztof Kozlowski <krzk@kernel.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Lu Baolu <baolu.lu@linux.intel.com>,
	Andy Gross <agross@kernel.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Rob Clark <robdclark@gmail.com>, Heiko Stuebner <heiko@sntech.de>,
	Gerald Schaefer <gerald.schaefer@de.ibm.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	Jonathan Hunter <jonathanh@nvidia.com>,
	Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: linux-s390@vger.kernel.org, linux-samsung-soc@vger.kernel.org,
	linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	linux-rockchip@lists.infradead.org,
	iommu@lists.linux-foundation.org, Joerg Roedel <jroedel@suse.de>,
	linux-mediatek@lists.infradead.org, linux-tegra@vger.kernel.org
Subject: [PATCH v2 07/33] iommu: Add probe_device() and remove_device() call-backs
Date: Tue, 14 Apr 2020 15:15:16 +0200	[thread overview]
Message-ID: <20200414131542.25608-8-joro@8bytes.org> (raw)
In-Reply-To: <20200414131542.25608-1-joro@8bytes.org>

From: Joerg Roedel <jroedel@suse.de>

Add call-backs to 'struct iommu_ops' as an alternative to the
add_device() and remove_device() call-backs, which will be removed when
all drivers are converted.

The new call-backs will not setupt IOMMU groups and domains anymore,
so also add a probe_finalize() call-back where the IOMMU driver can do
per-device setup work which require the device to be set up with a
group and a domain.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
 drivers/iommu/iommu.c | 63 ++++++++++++++++++++++++++++++++++++++-----
 include/linux/iommu.h |  9 +++++++
 2 files changed, 66 insertions(+), 6 deletions(-)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 5877abd9b693..6cfe7799dc8c 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -174,6 +174,36 @@ static void dev_iommu_free(struct device *dev)
 	dev->iommu = NULL;
 }
 
+static int __iommu_probe_device(struct device *dev)
+{
+	const struct iommu_ops *ops = dev->bus->iommu_ops;
+	struct iommu_device *iommu_dev;
+	struct iommu_group *group;
+	int ret;
+
+	iommu_dev = ops->probe_device(dev);
+	if (IS_ERR(iommu_dev))
+		return PTR_ERR(iommu_dev);
+
+	dev->iommu->iommu_dev = iommu_dev;
+
+	group = iommu_group_get_for_dev(dev);
+	if (!IS_ERR(group)) {
+		ret = PTR_ERR(group);
+		goto out_release;
+	}
+	iommu_group_put(group);
+
+	iommu_device_link(iommu_dev, dev);
+
+	return 0;
+
+out_release:
+	ops->release_device(dev);
+
+	return ret;
+}
+
 int iommu_probe_device(struct device *dev)
 {
 	const struct iommu_ops *ops = dev->bus->iommu_ops;
@@ -191,10 +221,17 @@ int iommu_probe_device(struct device *dev)
 		goto err_free_dev_param;
 	}
 
-	ret = ops->add_device(dev);
+	if (ops->probe_device)
+		ret = __iommu_probe_device(dev);
+	else
+		ret = ops->add_device(dev);
+
 	if (ret)
 		goto err_module_put;
 
+	if (ops->probe_finalize)
+		ops->probe_finalize(dev);
+
 	return 0;
 
 err_module_put:
@@ -204,17 +241,31 @@ int iommu_probe_device(struct device *dev)
 	return ret;
 }
 
+static void __iommu_release_device(struct device *dev)
+{
+	const struct iommu_ops *ops = dev->bus->iommu_ops;
+
+	iommu_device_unlink(dev->iommu->iommu_dev, dev);
+
+	iommu_group_remove_device(dev);
+
+	ops->release_device(dev);
+}
+
 void iommu_release_device(struct device *dev)
 {
 	const struct iommu_ops *ops = dev->bus->iommu_ops;
 
-	if (dev->iommu_group)
+	if (!dev->iommu)
+		return;
+
+	if (ops->release_device)
+		__iommu_release_device(dev);
+	else if (dev->iommu_group)
 		ops->remove_device(dev);
 
-	if (dev->iommu) {
-		module_put(ops->owner);
-		dev_iommu_free(dev);
-	}
+	module_put(ops->owner);
+	dev_iommu_free(dev);
 }
 
 static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 1f027b07e499..30170d191e5e 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -225,6 +225,10 @@ struct iommu_iotlb_gather {
  * @iova_to_phys: translate iova to physical address
  * @add_device: add device to iommu grouping
  * @remove_device: remove device from iommu grouping
+ * @probe_device: Add device to iommu driver handling
+ * @release_device: Remove device from iommu driver handling
+ * @probe_finalize: Do final setup work after the device is added to an IOMMU
+ *                  group and attached to the groups domain
  * @device_group: find iommu group for a particular device
  * @domain_get_attr: Query domain attributes
  * @domain_set_attr: Change domain attributes
@@ -275,6 +279,9 @@ struct iommu_ops {
 	phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova);
 	int (*add_device)(struct device *dev);
 	void (*remove_device)(struct device *dev);
+	struct iommu_device *(*probe_device)(struct device *dev);
+	void (*release_device)(struct device *dev);
+	void (*probe_finalize)(struct device *dev);
 	struct iommu_group *(*device_group)(struct device *dev);
 	int (*domain_get_attr)(struct iommu_domain *domain,
 			       enum iommu_attr attr, void *data);
@@ -375,6 +382,7 @@ struct iommu_fault_param {
  *
  * @fault_param: IOMMU detected device fault reporting data
  * @fwspec:	 IOMMU fwspec data
+ * @iommu_dev:	 IOMMU device this device is linked to
  * @priv:	 IOMMU Driver private data
  *
  * TODO: migrate other per device data pointers under iommu_dev_data, e.g.
@@ -384,6 +392,7 @@ struct dev_iommu {
 	struct mutex lock;
 	struct iommu_fault_param	*fault_param;
 	struct iommu_fwspec		*fwspec;
+	struct iommu_device		*iommu_dev;
 	void				*priv;
 };
 
-- 
2.17.1

WARNING: multiple messages have this Message-ID (diff)
From: Joerg Roedel <joro@8bytes.org>
To: Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org>,
	Robin Murphy <robin.murphy@arm.com>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Kukjin Kim <kgene@kernel.org>,
	Krzysztof Kozlowski <krzk@kernel.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Lu Baolu <baolu.lu@linux.intel.com>,
	Andy Gross <agross@kernel.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Rob Clark <robdclark@gmail.com>, Heiko Stuebner <heiko@sntech.de>,
	Gerald Schaefer <gerald.schaefer@de.ibm.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	Jonathan Hunter <jonathanh@nvidia.com>,
	Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org,
	linux-samsung-soc@vger.kernel.org, linux-arm-msm@vger.kernel.org,
	linux-mediatek@lists.infradead.org,
	linux-rockchip@lists.infradead.org, linux-s390@vger.kernel.org,
	linux-tegra@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	Joerg Roedel <jroedel@suse.de>
Subject: [PATCH v2 07/33] iommu: Add probe_device() and remove_device() call-backs
Date: Tue, 14 Apr 2020 15:15:16 +0200	[thread overview]
Message-ID: <20200414131542.25608-8-joro@8bytes.org> (raw)
In-Reply-To: <20200414131542.25608-1-joro@8bytes.org>

From: Joerg Roedel <jroedel@suse.de>

Add call-backs to 'struct iommu_ops' as an alternative to the
add_device() and remove_device() call-backs, which will be removed when
all drivers are converted.

The new call-backs will not setupt IOMMU groups and domains anymore,
so also add a probe_finalize() call-back where the IOMMU driver can do
per-device setup work which require the device to be set up with a
group and a domain.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
 drivers/iommu/iommu.c | 63 ++++++++++++++++++++++++++++++++++++++-----
 include/linux/iommu.h |  9 +++++++
 2 files changed, 66 insertions(+), 6 deletions(-)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 5877abd9b693..6cfe7799dc8c 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -174,6 +174,36 @@ static void dev_iommu_free(struct device *dev)
 	dev->iommu = NULL;
 }
 
+static int __iommu_probe_device(struct device *dev)
+{
+	const struct iommu_ops *ops = dev->bus->iommu_ops;
+	struct iommu_device *iommu_dev;
+	struct iommu_group *group;
+	int ret;
+
+	iommu_dev = ops->probe_device(dev);
+	if (IS_ERR(iommu_dev))
+		return PTR_ERR(iommu_dev);
+
+	dev->iommu->iommu_dev = iommu_dev;
+
+	group = iommu_group_get_for_dev(dev);
+	if (!IS_ERR(group)) {
+		ret = PTR_ERR(group);
+		goto out_release;
+	}
+	iommu_group_put(group);
+
+	iommu_device_link(iommu_dev, dev);
+
+	return 0;
+
+out_release:
+	ops->release_device(dev);
+
+	return ret;
+}
+
 int iommu_probe_device(struct device *dev)
 {
 	const struct iommu_ops *ops = dev->bus->iommu_ops;
@@ -191,10 +221,17 @@ int iommu_probe_device(struct device *dev)
 		goto err_free_dev_param;
 	}
 
-	ret = ops->add_device(dev);
+	if (ops->probe_device)
+		ret = __iommu_probe_device(dev);
+	else
+		ret = ops->add_device(dev);
+
 	if (ret)
 		goto err_module_put;
 
+	if (ops->probe_finalize)
+		ops->probe_finalize(dev);
+
 	return 0;
 
 err_module_put:
@@ -204,17 +241,31 @@ int iommu_probe_device(struct device *dev)
 	return ret;
 }
 
+static void __iommu_release_device(struct device *dev)
+{
+	const struct iommu_ops *ops = dev->bus->iommu_ops;
+
+	iommu_device_unlink(dev->iommu->iommu_dev, dev);
+
+	iommu_group_remove_device(dev);
+
+	ops->release_device(dev);
+}
+
 void iommu_release_device(struct device *dev)
 {
 	const struct iommu_ops *ops = dev->bus->iommu_ops;
 
-	if (dev->iommu_group)
+	if (!dev->iommu)
+		return;
+
+	if (ops->release_device)
+		__iommu_release_device(dev);
+	else if (dev->iommu_group)
 		ops->remove_device(dev);
 
-	if (dev->iommu) {
-		module_put(ops->owner);
-		dev_iommu_free(dev);
-	}
+	module_put(ops->owner);
+	dev_iommu_free(dev);
 }
 
 static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 1f027b07e499..30170d191e5e 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -225,6 +225,10 @@ struct iommu_iotlb_gather {
  * @iova_to_phys: translate iova to physical address
  * @add_device: add device to iommu grouping
  * @remove_device: remove device from iommu grouping
+ * @probe_device: Add device to iommu driver handling
+ * @release_device: Remove device from iommu driver handling
+ * @probe_finalize: Do final setup work after the device is added to an IOMMU
+ *                  group and attached to the groups domain
  * @device_group: find iommu group for a particular device
  * @domain_get_attr: Query domain attributes
  * @domain_set_attr: Change domain attributes
@@ -275,6 +279,9 @@ struct iommu_ops {
 	phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova);
 	int (*add_device)(struct device *dev);
 	void (*remove_device)(struct device *dev);
+	struct iommu_device *(*probe_device)(struct device *dev);
+	void (*release_device)(struct device *dev);
+	void (*probe_finalize)(struct device *dev);
 	struct iommu_group *(*device_group)(struct device *dev);
 	int (*domain_get_attr)(struct iommu_domain *domain,
 			       enum iommu_attr attr, void *data);
@@ -375,6 +382,7 @@ struct iommu_fault_param {
  *
  * @fault_param: IOMMU detected device fault reporting data
  * @fwspec:	 IOMMU fwspec data
+ * @iommu_dev:	 IOMMU device this device is linked to
  * @priv:	 IOMMU Driver private data
  *
  * TODO: migrate other per device data pointers under iommu_dev_data, e.g.
@@ -384,6 +392,7 @@ struct dev_iommu {
 	struct mutex lock;
 	struct iommu_fault_param	*fault_param;
 	struct iommu_fwspec		*fwspec;
+	struct iommu_device		*iommu_dev;
 	void				*priv;
 };
 
-- 
2.17.1


WARNING: multiple messages have this Message-ID (diff)
From: Joerg Roedel <joro@8bytes.org>
To: Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org>,
	Robin Murphy <robin.murphy@arm.com>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Kukjin Kim <kgene@kernel.org>,
	Krzysztof Kozlowski <krzk@kernel.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Lu Baolu <baolu.lu@linux.intel.com>,
	Andy Gross <agross@kernel.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Rob Clark <robdclark@gmail.com>, Heiko Stuebner <heiko@sntech.de>,
	Gerald Schaefer <gerald.schaefer@de.ibm.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	Jonathan Hunter <jonathanh@nvidia.com>,
	Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: linux-s390@vger.kernel.org, linux-samsung-soc@vger.kernel.org,
	linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	linux-rockchip@lists.infradead.org,
	iommu@lists.linux-foundation.org, Joerg Roedel <jroedel@suse.de>,
	linux-mediatek@lists.infradead.org, linux-tegra@vger.kernel.org
Subject: [PATCH v2 07/33] iommu: Add probe_device() and remove_device() call-backs
Date: Tue, 14 Apr 2020 15:15:16 +0200	[thread overview]
Message-ID: <20200414131542.25608-8-joro@8bytes.org> (raw)
In-Reply-To: <20200414131542.25608-1-joro@8bytes.org>

From: Joerg Roedel <jroedel@suse.de>

Add call-backs to 'struct iommu_ops' as an alternative to the
add_device() and remove_device() call-backs, which will be removed when
all drivers are converted.

The new call-backs will not setupt IOMMU groups and domains anymore,
so also add a probe_finalize() call-back where the IOMMU driver can do
per-device setup work which require the device to be set up with a
group and a domain.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
 drivers/iommu/iommu.c | 63 ++++++++++++++++++++++++++++++++++++++-----
 include/linux/iommu.h |  9 +++++++
 2 files changed, 66 insertions(+), 6 deletions(-)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 5877abd9b693..6cfe7799dc8c 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -174,6 +174,36 @@ static void dev_iommu_free(struct device *dev)
 	dev->iommu = NULL;
 }
 
+static int __iommu_probe_device(struct device *dev)
+{
+	const struct iommu_ops *ops = dev->bus->iommu_ops;
+	struct iommu_device *iommu_dev;
+	struct iommu_group *group;
+	int ret;
+
+	iommu_dev = ops->probe_device(dev);
+	if (IS_ERR(iommu_dev))
+		return PTR_ERR(iommu_dev);
+
+	dev->iommu->iommu_dev = iommu_dev;
+
+	group = iommu_group_get_for_dev(dev);
+	if (!IS_ERR(group)) {
+		ret = PTR_ERR(group);
+		goto out_release;
+	}
+	iommu_group_put(group);
+
+	iommu_device_link(iommu_dev, dev);
+
+	return 0;
+
+out_release:
+	ops->release_device(dev);
+
+	return ret;
+}
+
 int iommu_probe_device(struct device *dev)
 {
 	const struct iommu_ops *ops = dev->bus->iommu_ops;
@@ -191,10 +221,17 @@ int iommu_probe_device(struct device *dev)
 		goto err_free_dev_param;
 	}
 
-	ret = ops->add_device(dev);
+	if (ops->probe_device)
+		ret = __iommu_probe_device(dev);
+	else
+		ret = ops->add_device(dev);
+
 	if (ret)
 		goto err_module_put;
 
+	if (ops->probe_finalize)
+		ops->probe_finalize(dev);
+
 	return 0;
 
 err_module_put:
@@ -204,17 +241,31 @@ int iommu_probe_device(struct device *dev)
 	return ret;
 }
 
+static void __iommu_release_device(struct device *dev)
+{
+	const struct iommu_ops *ops = dev->bus->iommu_ops;
+
+	iommu_device_unlink(dev->iommu->iommu_dev, dev);
+
+	iommu_group_remove_device(dev);
+
+	ops->release_device(dev);
+}
+
 void iommu_release_device(struct device *dev)
 {
 	const struct iommu_ops *ops = dev->bus->iommu_ops;
 
-	if (dev->iommu_group)
+	if (!dev->iommu)
+		return;
+
+	if (ops->release_device)
+		__iommu_release_device(dev);
+	else if (dev->iommu_group)
 		ops->remove_device(dev);
 
-	if (dev->iommu) {
-		module_put(ops->owner);
-		dev_iommu_free(dev);
-	}
+	module_put(ops->owner);
+	dev_iommu_free(dev);
 }
 
 static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 1f027b07e499..30170d191e5e 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -225,6 +225,10 @@ struct iommu_iotlb_gather {
  * @iova_to_phys: translate iova to physical address
  * @add_device: add device to iommu grouping
  * @remove_device: remove device from iommu grouping
+ * @probe_device: Add device to iommu driver handling
+ * @release_device: Remove device from iommu driver handling
+ * @probe_finalize: Do final setup work after the device is added to an IOMMU
+ *                  group and attached to the groups domain
  * @device_group: find iommu group for a particular device
  * @domain_get_attr: Query domain attributes
  * @domain_set_attr: Change domain attributes
@@ -275,6 +279,9 @@ struct iommu_ops {
 	phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova);
 	int (*add_device)(struct device *dev);
 	void (*remove_device)(struct device *dev);
+	struct iommu_device *(*probe_device)(struct device *dev);
+	void (*release_device)(struct device *dev);
+	void (*probe_finalize)(struct device *dev);
 	struct iommu_group *(*device_group)(struct device *dev);
 	int (*domain_get_attr)(struct iommu_domain *domain,
 			       enum iommu_attr attr, void *data);
@@ -375,6 +382,7 @@ struct iommu_fault_param {
  *
  * @fault_param: IOMMU detected device fault reporting data
  * @fwspec:	 IOMMU fwspec data
+ * @iommu_dev:	 IOMMU device this device is linked to
  * @priv:	 IOMMU Driver private data
  *
  * TODO: migrate other per device data pointers under iommu_dev_data, e.g.
@@ -384,6 +392,7 @@ struct dev_iommu {
 	struct mutex lock;
 	struct iommu_fault_param	*fault_param;
 	struct iommu_fwspec		*fwspec;
+	struct iommu_device		*iommu_dev;
 	void				*priv;
 };
 
-- 
2.17.1

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

WARNING: multiple messages have this Message-ID (diff)
From: Joerg Roedel <joro@8bytes.org>
To: Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org>,
	Robin Murphy <robin.murphy@arm.com>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Kukjin Kim <kgene@kernel.org>,
	Krzysztof Kozlowski <krzk@kernel.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Lu Baolu <baolu.lu@linux.intel.com>,
	Andy Gross <agross@kernel.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Rob Clark <robdclark@gmail.com>, Heiko Stuebner <heiko@sntech.de>,
	Gerald Schaefer <gerald.schaefer@de.ibm.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	Jonathan Hunter <jonathanh@nvidia.com>,
	Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: linux-s390@vger.kernel.org, linux-samsung-soc@vger.kernel.org,
	linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	linux-rockchip@lists.infradead.org,
	iommu@lists.linux-foundation.org, Joerg Roedel <jroedel@suse.de>,
	linux-mediatek@lists.infradead.org, linux-tegra@vger.kernel.org
Subject: [PATCH v2 07/33] iommu: Add probe_device() and remove_device() call-backs
Date: Tue, 14 Apr 2020 15:15:16 +0200	[thread overview]
Message-ID: <20200414131542.25608-8-joro@8bytes.org> (raw)
In-Reply-To: <20200414131542.25608-1-joro@8bytes.org>

From: Joerg Roedel <jroedel@suse.de>

Add call-backs to 'struct iommu_ops' as an alternative to the
add_device() and remove_device() call-backs, which will be removed when
all drivers are converted.

The new call-backs will not setupt IOMMU groups and domains anymore,
so also add a probe_finalize() call-back where the IOMMU driver can do
per-device setup work which require the device to be set up with a
group and a domain.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
 drivers/iommu/iommu.c | 63 ++++++++++++++++++++++++++++++++++++++-----
 include/linux/iommu.h |  9 +++++++
 2 files changed, 66 insertions(+), 6 deletions(-)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 5877abd9b693..6cfe7799dc8c 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -174,6 +174,36 @@ static void dev_iommu_free(struct device *dev)
 	dev->iommu = NULL;
 }
 
+static int __iommu_probe_device(struct device *dev)
+{
+	const struct iommu_ops *ops = dev->bus->iommu_ops;
+	struct iommu_device *iommu_dev;
+	struct iommu_group *group;
+	int ret;
+
+	iommu_dev = ops->probe_device(dev);
+	if (IS_ERR(iommu_dev))
+		return PTR_ERR(iommu_dev);
+
+	dev->iommu->iommu_dev = iommu_dev;
+
+	group = iommu_group_get_for_dev(dev);
+	if (!IS_ERR(group)) {
+		ret = PTR_ERR(group);
+		goto out_release;
+	}
+	iommu_group_put(group);
+
+	iommu_device_link(iommu_dev, dev);
+
+	return 0;
+
+out_release:
+	ops->release_device(dev);
+
+	return ret;
+}
+
 int iommu_probe_device(struct device *dev)
 {
 	const struct iommu_ops *ops = dev->bus->iommu_ops;
@@ -191,10 +221,17 @@ int iommu_probe_device(struct device *dev)
 		goto err_free_dev_param;
 	}
 
-	ret = ops->add_device(dev);
+	if (ops->probe_device)
+		ret = __iommu_probe_device(dev);
+	else
+		ret = ops->add_device(dev);
+
 	if (ret)
 		goto err_module_put;
 
+	if (ops->probe_finalize)
+		ops->probe_finalize(dev);
+
 	return 0;
 
 err_module_put:
@@ -204,17 +241,31 @@ int iommu_probe_device(struct device *dev)
 	return ret;
 }
 
+static void __iommu_release_device(struct device *dev)
+{
+	const struct iommu_ops *ops = dev->bus->iommu_ops;
+
+	iommu_device_unlink(dev->iommu->iommu_dev, dev);
+
+	iommu_group_remove_device(dev);
+
+	ops->release_device(dev);
+}
+
 void iommu_release_device(struct device *dev)
 {
 	const struct iommu_ops *ops = dev->bus->iommu_ops;
 
-	if (dev->iommu_group)
+	if (!dev->iommu)
+		return;
+
+	if (ops->release_device)
+		__iommu_release_device(dev);
+	else if (dev->iommu_group)
 		ops->remove_device(dev);
 
-	if (dev->iommu) {
-		module_put(ops->owner);
-		dev_iommu_free(dev);
-	}
+	module_put(ops->owner);
+	dev_iommu_free(dev);
 }
 
 static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 1f027b07e499..30170d191e5e 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -225,6 +225,10 @@ struct iommu_iotlb_gather {
  * @iova_to_phys: translate iova to physical address
  * @add_device: add device to iommu grouping
  * @remove_device: remove device from iommu grouping
+ * @probe_device: Add device to iommu driver handling
+ * @release_device: Remove device from iommu driver handling
+ * @probe_finalize: Do final setup work after the device is added to an IOMMU
+ *                  group and attached to the groups domain
  * @device_group: find iommu group for a particular device
  * @domain_get_attr: Query domain attributes
  * @domain_set_attr: Change domain attributes
@@ -275,6 +279,9 @@ struct iommu_ops {
 	phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova);
 	int (*add_device)(struct device *dev);
 	void (*remove_device)(struct device *dev);
+	struct iommu_device *(*probe_device)(struct device *dev);
+	void (*release_device)(struct device *dev);
+	void (*probe_finalize)(struct device *dev);
 	struct iommu_group *(*device_group)(struct device *dev);
 	int (*domain_get_attr)(struct iommu_domain *domain,
 			       enum iommu_attr attr, void *data);
@@ -375,6 +382,7 @@ struct iommu_fault_param {
  *
  * @fault_param: IOMMU detected device fault reporting data
  * @fwspec:	 IOMMU fwspec data
+ * @iommu_dev:	 IOMMU device this device is linked to
  * @priv:	 IOMMU Driver private data
  *
  * TODO: migrate other per device data pointers under iommu_dev_data, e.g.
@@ -384,6 +392,7 @@ struct dev_iommu {
 	struct mutex lock;
 	struct iommu_fault_param	*fault_param;
 	struct iommu_fwspec		*fwspec;
+	struct iommu_device		*iommu_dev;
 	void				*priv;
 };
 
-- 
2.17.1


_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

  parent reply	other threads:[~2020-04-14 13:15 UTC|newest]

Thread overview: 233+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20200414131600eucas1p16f1ff6aedb780eb795a770dc08e5dec5@eucas1p1.samsung.com>
2020-04-14 13:15 ` [PATCH v2 00/33] iommu: Move iommu_group setup to IOMMU core code Joerg Roedel
2020-04-14 13:15   ` Joerg Roedel
2020-04-14 13:15   ` Joerg Roedel
2020-04-14 13:15   ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 01/33] iommu: Move default domain allocation to separate function Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 02/33] iommu: Add def_domain_type() callback in iommu_ops Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 04/33] iommu/vt-d: Wire up iommu_ops->def_domain_type Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 05/33] iommu/amd: Remove dma_mask check from check_device() Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` Joerg Roedel [this message]
2020-04-14 13:15     ` [PATCH v2 07/33] iommu: Add probe_device() and remove_device() call-backs Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
     [not found]     ` <20200414131542.25608-8-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2020-04-15  6:36       ` Lu Baolu
2020-04-15  6:36         ` Lu Baolu
2020-04-15  6:36         ` Lu Baolu
2020-04-15  6:36         ` Lu Baolu
     [not found]         ` <0ad37581-b464-30ac-c503-4c0daaf43867-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2020-04-15 12:31           ` Joerg Roedel
2020-04-15 12:31             ` Joerg Roedel
2020-04-15 12:31             ` Joerg Roedel
2020-04-15 12:31             ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 13/33] iommu: Export bus_iommu_probe() and make is safe for re-probing Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
     [not found]     ` <20200414131542.25608-14-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2020-04-15  6:10       ` Lu Baolu
2020-04-15  6:10         ` Lu Baolu
2020-04-15  6:10         ` Lu Baolu
2020-04-15  6:10         ` Lu Baolu
     [not found]         ` <1853992c-47a6-3724-812c-a52558c13732-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2020-04-15 12:29           ` Joerg Roedel
2020-04-15 12:29             ` Joerg Roedel
2020-04-15 12:29             ` Joerg Roedel
2020-04-15 12:29             ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 14/33] iommu/amd: Remove dev_data->passthrough Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 16/33] iommu/vt-d: Convert to probe/release_device() call-backs Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 17/33] iommu/arm-smmu: " Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 18/33] iommu/pamu: " Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 19/33] iommu/s390: " Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 21/33] iommu/msm: " Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 24/33] iommu/qcom: " Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
     [not found]   ` <20200414131542.25608-1-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2020-04-14 13:15     ` [PATCH v2 03/33] iommu/amd: Implement iommu_ops->def_domain_type call-back Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 06/33] iommu/amd: Return -ENODEV in add_device when device is not handled by IOMMU Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 08/33] iommu: Move default domain allocation to iommu_probe_device() Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 09/33] iommu: Keep a list of allocated groups in __iommu_probe_device() Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 10/33] iommu: Move new probe_device path to separate function Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 11/33] iommu: Split off default domain allocation from group assignment Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 12/33] iommu: Move iommu_group_create_direct_mappings() out of iommu_group_add_device() Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 15/33] iommu/amd: Convert to probe/release_device() call-backs Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 20/33] iommu/virtio: " Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 22/33] iommu/mediatek: " Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 23/33] iommu/mediatek-v1 " Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-05-15  7:44       ` Yong Wu
2020-05-15  7:44         ` Yong Wu
2020-05-15  7:44         ` Yong Wu
2020-05-15  7:44         ` Yong Wu
2020-05-15 10:07         ` Joerg Roedel
2020-05-15 10:07           ` Joerg Roedel
2020-05-15 10:07           ` Joerg Roedel
2020-05-18  6:51           ` Yong Wu
2020-05-18  6:51             ` Yong Wu
2020-05-18  6:51             ` Yong Wu
2020-05-18  6:51             ` Yong Wu
2020-05-18 13:55             ` Joerg Roedel
2020-05-18 13:55               ` Joerg Roedel
2020-05-18 13:55               ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 25/33] iommu/rockchip: " Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 28/33] iommu/omap: Remove orphan_dev tracking Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 30/33] iommu/exynos: Use first SYSMMU in controllers list for IOMMU core Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 31/33] iommu/exynos: Convert to probe/release_device() call-backs Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 32/33] iommu: Remove add_device()/remove_device() code-paths Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15     ` [PATCH v2 33/33] iommu: Unexport iommu_group_get_for_dev() Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-14 13:15       ` Joerg Roedel
2020-04-16 11:48     ` [PATCH v2 00/33] iommu: Move iommu_group setup to IOMMU core code Marek Szyprowski
2020-04-16 11:48       ` Marek Szyprowski
2020-04-16 11:48       ` Marek Szyprowski
2020-04-16 11:48       ` Marek Szyprowski
2020-04-17  1:03     ` Daniel Drake
2020-04-17  1:03       ` Daniel Drake
2020-04-17  1:03       ` Daniel Drake
2020-04-17  1:03       ` Daniel Drake
     [not found]       ` <20200417010335.31739-1-drake-6IF/jdPJHihWk0Htik3J/w@public.gmane.org>
2020-04-17  1:14         ` Derrick, Jonathan
2020-04-17  1:14           ` Derrick, Jonathan
2020-04-17  1:14           ` Derrick, Jonathan
2020-04-17  1:14           ` Derrick, Jonathan
2020-04-17  1:14           ` Derrick, Jonathan
     [not found]           ` <aafed865c0254934986528b3ce9c4d34ff2fccad.camel-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2020-04-18 12:44             ` joro-zLv9SwRftAIdnm+yROfE0A
2020-04-18 12:44               ` joro
2020-04-18 12:44               ` joro
2020-04-18 12:44               ` joro
2020-04-18 12:44               ` joro
2020-05-29 22:16     ` Jerry Snitselaar
2020-05-29 22:16       ` Jerry Snitselaar
2020-05-29 22:16       ` Jerry Snitselaar
2020-05-29 22:16       ` Jerry Snitselaar
2020-06-01 10:42       ` Jerry Snitselaar
2020-06-01 10:42         ` Jerry Snitselaar
2020-06-01 10:42         ` Jerry Snitselaar
2020-06-01 10:42         ` Jerry Snitselaar
2020-06-01 13:17         ` Jerry Snitselaar
2020-06-01 13:17         ` Jerry Snitselaar
2020-06-01 13:17         ` Jerry Snitselaar
2020-06-01 13:17         ` Jerry Snitselaar
2020-06-01 13:17           ` Jerry Snitselaar
2020-06-01 13:17           ` Jerry Snitselaar
2020-06-01 13:17           ` Jerry Snitselaar
2020-06-01 23:20           ` Lu Baolu
2020-06-01 23:20             ` Lu Baolu
2020-06-01 23:20             ` Lu Baolu
2020-06-01 23:20             ` Lu Baolu
2020-06-01 23:20           ` Lu Baolu
2020-06-01 23:20           ` Lu Baolu
2020-06-01 23:20           ` Lu Baolu
2020-06-01 23:16         ` Lu Baolu
2020-06-01 23:16           ` Lu Baolu
2020-06-01 23:16           ` Lu Baolu
2020-06-01 23:16           ` Lu Baolu
2020-06-02  0:02           ` Jerry Snitselaar
2020-06-02  0:02             ` Jerry Snitselaar
2020-06-02  0:02             ` Jerry Snitselaar
2020-06-02  0:02             ` Jerry Snitselaar
2020-06-02 14:23             ` Joerg Roedel
2020-06-02 14:23               ` Joerg Roedel
2020-06-02 14:23               ` Joerg Roedel
2020-06-02 14:23               ` Joerg Roedel
2020-06-02 16:38               ` Jerry Snitselaar
2020-06-02 16:38                 ` Jerry Snitselaar
2020-06-02 16:38                 ` Jerry Snitselaar
2020-06-02 16:38                 ` Jerry Snitselaar
2020-06-02 21:17                 ` Jerry Snitselaar
2020-06-02 21:17                   ` Jerry Snitselaar
2020-06-02 21:17                   ` Jerry Snitselaar
2020-06-02 21:17                   ` Jerry Snitselaar
2020-06-02 21:17                 ` Jerry Snitselaar
2020-06-02 21:17                 ` Jerry Snitselaar
2020-06-02 21:17                 ` Jerry Snitselaar
2020-06-02 21:17                 ` Jerry Snitselaar
2020-06-02 14:23             ` Joerg Roedel
2020-06-02 14:23             ` Joerg Roedel
2020-06-02 14:23             ` Joerg Roedel
2020-06-01 10:42       ` Jerry Snitselaar
2020-06-01 10:42       ` Jerry Snitselaar
2020-06-01 10:42       ` Jerry Snitselaar
2020-06-01 10:42       ` Jerry Snitselaar
2020-04-14 13:15   ` [PATCH v2 26/33] iommu/tegra: Convert to probe/release_device() call-backs Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 27/33] iommu/renesas: " Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15   ` [PATCH v2 29/33] iommu/omap: " Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel
2020-04-14 13:15     ` Joerg Roedel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200414131542.25608-8-joro@8bytes.org \
    --to=joro@8bytes.org \
    --cc=agross@kernel.org \
    --cc=baolu.lu@linux.intel.com \
    --cc=bjorn.andersson@linaro.org \
    --cc=dwmw2@infradead.org \
    --cc=gerald.schaefer@de.ibm.com \
    --cc=heiko@sntech.de \
    --cc=iommu@lists.linux-foundation.org \
    --cc=jean-philippe@linaro.org \
    --cc=jonathanh@nvidia.com \
    --cc=jroedel@suse.de \
    --cc=kgene@kernel.org \
    --cc=krzk@kernel.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=matthias.bgg@gmail.com \
    --cc=robdclark@gmail.com \
    --cc=robin.murphy@arm.com \
    --cc=thierry.reding@gmail.com \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.