linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource()
@ 2016-11-11 18:27 Robin Murphy
  2016-11-11 18:27 ` [PATCH v3 2/2] arm64: Wire up iommu_dma_{map, unmap}_resource() Robin Murphy
  2016-11-13 11:41 ` [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource() Catalin Marinas
  0 siblings, 2 replies; 4+ messages in thread
From: Robin Murphy @ 2016-11-11 18:27 UTC (permalink / raw)
  To: linux-arm-kernel

With the new dma_{map,unmap}_resource() functions added to the DMA API
for the benefit of cases like slave DMA, add suitable implementations to
the arsenal of our generic layer. Since cache maintenance should not be
a concern, these can both be standalone callback implementations without
the need for arch code wrappers.

CC: Joerg Roedel <joro@8bytes.org>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
---

v3: Don't misuse phys_to_page()

 drivers/iommu/dma-iommu.c | 24 +++++++++++++++++++++---
 include/linux/dma-iommu.h |  4 ++++
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
index c5ab8667e6f2..8b745260b3bc 100644
--- a/drivers/iommu/dma-iommu.c
+++ b/drivers/iommu/dma-iommu.c
@@ -432,13 +432,12 @@ int iommu_dma_mmap(struct page **pages, size_t size, struct vm_area_struct *vma)
 	return ret;
 }
 
-dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page,
-		unsigned long offset, size_t size, int prot)
+dma_addr_t __iommu_dma_map(struct device *dev, phys_addr_t phys,
+		size_t size, int prot)
 {
 	dma_addr_t dma_addr;
 	struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
 	struct iova_domain *iovad = cookie_iovad(domain);
-	phys_addr_t phys = page_to_phys(page) + offset;
 	size_t iova_off = iova_offset(iovad, phys);
 	size_t len = iova_align(iovad, size + iova_off);
 	struct iova *iova = __alloc_iova(domain, len, dma_get_mask(dev));
@@ -454,6 +453,12 @@ dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page,
 	return dma_addr + iova_off;
 }
 
+dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page,
+		unsigned long offset, size_t size, int prot)
+{
+	return __iommu_dma_map(dev, page_to_phys(page) + offset, size, prot);
+}
+
 void iommu_dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size,
 		enum dma_data_direction dir, unsigned long attrs)
 {
@@ -624,6 +629,19 @@ void iommu_dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
 	__iommu_dma_unmap(iommu_get_domain_for_dev(dev), sg_dma_address(sg));
 }
 
+dma_addr_t iommu_dma_map_resource(struct device *dev, phys_addr_t phys,
+		size_t size, enum dma_data_direction dir, unsigned long attrs)
+{
+	return __iommu_dma_map(dev, phys, size,
+			dma_direction_to_prot(dir, false) | IOMMU_MMIO);
+}
+
+void iommu_dma_unmap_resource(struct device *dev, dma_addr_t handle,
+		size_t size, enum dma_data_direction dir, unsigned long attrs)
+{
+	__iommu_dma_unmap(iommu_get_domain_for_dev(dev), handle);
+}
+
 int iommu_dma_supported(struct device *dev, u64 mask)
 {
 	/*
diff --git a/include/linux/dma-iommu.h b/include/linux/dma-iommu.h
index 32c589062bd9..7f7e9a7e3839 100644
--- a/include/linux/dma-iommu.h
+++ b/include/linux/dma-iommu.h
@@ -61,6 +61,10 @@ void iommu_dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size,
 		enum dma_data_direction dir, unsigned long attrs);
 void iommu_dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
 		enum dma_data_direction dir, unsigned long attrs);
+dma_addr_t iommu_dma_map_resource(struct device *dev, phys_addr_t phys,
+		size_t size, enum dma_data_direction dir, unsigned long attrs);
+void iommu_dma_unmap_resource(struct device *dev, dma_addr_t handle,
+		size_t size, enum dma_data_direction dir, unsigned long attrs);
 int iommu_dma_supported(struct device *dev, u64 mask);
 int iommu_dma_mapping_error(struct device *dev, dma_addr_t dma_addr);
 
-- 
2.10.2.dirty

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 2/2] arm64: Wire up iommu_dma_{map, unmap}_resource()
  2016-11-11 18:27 [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource() Robin Murphy
@ 2016-11-11 18:27 ` Robin Murphy
  2016-11-13 11:42   ` Catalin Marinas
  2016-11-13 11:41 ` [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource() Catalin Marinas
  1 sibling, 1 reply; 4+ messages in thread
From: Robin Murphy @ 2016-11-11 18:27 UTC (permalink / raw)
  To: linux-arm-kernel

With no coherency to worry about, just plug'em straight in.

CC: Catalin Marinas <catalin.marinas@arm.com>
CC: Will Deacon <will.deacon@arm.com>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
---
 arch/arm64/mm/dma-mapping.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
index 3f74d0d98de6..5cd0a383b14b 100644
--- a/arch/arm64/mm/dma-mapping.c
+++ b/arch/arm64/mm/dma-mapping.c
@@ -796,6 +796,8 @@ static struct dma_map_ops iommu_dma_ops = {
 	.sync_single_for_device = __iommu_sync_single_for_device,
 	.sync_sg_for_cpu = __iommu_sync_sg_for_cpu,
 	.sync_sg_for_device = __iommu_sync_sg_for_device,
+	.map_resource = iommu_dma_map_resource,
+	.unmap_resource = iommu_dma_unmap_resource,
 	.dma_supported = iommu_dma_supported,
 	.mapping_error = iommu_dma_mapping_error,
 };
-- 
2.10.2.dirty

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource()
  2016-11-11 18:27 [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource() Robin Murphy
  2016-11-11 18:27 ` [PATCH v3 2/2] arm64: Wire up iommu_dma_{map, unmap}_resource() Robin Murphy
@ 2016-11-13 11:41 ` Catalin Marinas
  1 sibling, 0 replies; 4+ messages in thread
From: Catalin Marinas @ 2016-11-13 11:41 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Nov 11, 2016 at 06:27:34PM +0000, Robin Murphy wrote:
> diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
> index c5ab8667e6f2..8b745260b3bc 100644
> --- a/drivers/iommu/dma-iommu.c
> +++ b/drivers/iommu/dma-iommu.c
> @@ -432,13 +432,12 @@ int iommu_dma_mmap(struct page **pages, size_t size, struct vm_area_struct *vma)
>  	return ret;
>  }
>  
> -dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page,
> -		unsigned long offset, size_t size, int prot)
> +dma_addr_t __iommu_dma_map(struct device *dev, phys_addr_t phys,
> +		size_t size, int prot)

This should be static.

-- 
Catalin

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v3 2/2] arm64: Wire up iommu_dma_{map, unmap}_resource()
  2016-11-11 18:27 ` [PATCH v3 2/2] arm64: Wire up iommu_dma_{map, unmap}_resource() Robin Murphy
@ 2016-11-13 11:42   ` Catalin Marinas
  0 siblings, 0 replies; 4+ messages in thread
From: Catalin Marinas @ 2016-11-13 11:42 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Nov 11, 2016 at 06:27:35PM +0000, Robin Murphy wrote:
> With no coherency to worry about, just plug'em straight in.
> 
> CC: Catalin Marinas <catalin.marinas@arm.com>
> CC: Will Deacon <will.deacon@arm.com>
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
> ---
>  arch/arm64/mm/dma-mapping.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> index 3f74d0d98de6..5cd0a383b14b 100644
> --- a/arch/arm64/mm/dma-mapping.c
> +++ b/arch/arm64/mm/dma-mapping.c
> @@ -796,6 +796,8 @@ static struct dma_map_ops iommu_dma_ops = {
>  	.sync_single_for_device = __iommu_sync_single_for_device,
>  	.sync_sg_for_cpu = __iommu_sync_sg_for_cpu,
>  	.sync_sg_for_device = __iommu_sync_sg_for_device,
> +	.map_resource = iommu_dma_map_resource,
> +	.unmap_resource = iommu_dma_unmap_resource,
>  	.dma_supported = iommu_dma_supported,
>  	.mapping_error = iommu_dma_mapping_error,

Acked-by: Catalin Marinas <catalin.marinas@arm.com>

I guess these two patches would go in via the iommu tree.

-- 
Catalin

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-11-13 11:42 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-11 18:27 [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource() Robin Murphy
2016-11-11 18:27 ` [PATCH v3 2/2] arm64: Wire up iommu_dma_{map, unmap}_resource() Robin Murphy
2016-11-13 11:42   ` Catalin Marinas
2016-11-13 11:41 ` [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource() Catalin Marinas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).