Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1335829 > unrolled thread

[PATCH v4 0/8] dmaengine: rcar-dmac: add iommu support for slave transfers

Started byNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
First post2016-02-16 21:50 +0100
Last post2016-02-16 21:50 +0100
Articles 3 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCH v4 0/8] dmaengine: rcar-dmac: add iommu support for slave transfers Niklas Söderlund   <niklas.soderlund+renesas@ragnatech.se> - 2016-02-16 21:50 +0100
    [PATCH v4 2/8] dma-mapping: add {map,unmap}_resource to dma_map_ops Niklas Söderlund   <niklas.soderlund+renesas@ragnatech.se> - 2016-02-16 21:50 +0100
    [PATCH v4 3/8] dma-mapping: add dma_{map,unmap}_resource Niklas Söderlund   <niklas.soderlund+renesas@ragnatech.se> - 2016-02-16 21:50 +0100

#1335829 — [PATCH v4 0/8] dmaengine: rcar-dmac: add iommu support for slave transfers

FromNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Date2016-02-16 21:50 +0100
Subject[PATCH v4 0/8] dmaengine: rcar-dmac: add iommu support for slave transfers
Message-ID<r2UJj-4va-7@gated-at.bofh.it>
Hi,

This series add iommu support to rcar-dmac. It's tested on Koelsch with
CONFIG_IPMMU_VMSA and by enabling the ipmmu_ds node in r8a7791.dtsi. I verified
operation by interacting with /dev/mmcblk1  which is a device behind the iommu.

The series depends on out of tree patch '[PATCH] dmaengine: use phys_addr_t for
slave configuration' which Vinod now have moved forward whit, thanks!

* Changes since v3
- Folded in a fix from Robin to his patch.
- Added a check to make sure dma_map_resource can not be used to map RAM as
  pointed out by Robin. I use BUG_ON to enforce this. It might not be the best
  method but I saw no other good way since DMA_ERROR_CODE might not be defined
  on all platforms.
- Added comment about that DTS changes will disable 2 DMA channels due to a HW
  (?) but in the DMAC.
- Dropped the use of dma_attrs, no longer needed.
- Collected Acked-by and Reviewed-by from Laurent.
- Various indentation fix ups.

* Changes since v2
- Drop patch to add dma_{map,unmap}_page_attrs.
- Add dma_{map,unmap}_resource to handle the mapping without involving a
  'struct page'. Thanks Laurent and Robin for pointing this out.
- Use size instead of address to keep track of if a mapping exist or not
  since addr == 0 is valid. Thanks Laurent.
- Pick up patch from Robin with Laurents ack (hope it's OK for me to
  attach the ack?) to add IOMMU_MMIO.
- Fix bug in rcar_dmac_device_config where the error check where
  inverted.
- Use DMA_BIDIRECTIONAL in rcar_dmac_device_config since we at that
  point can't be sure what direction the mapping is going to be used.

* Changes since v1
- Add and use a dma_{map,unmap}_page_attrs to be able to map the page
  using attributes DMA_ATTR_NO_KERNEL_MAPPING and
  DMA_ATTR_SKIP_CPU_SYNC. Thanks Laurent.
- Drop check if dmac is part of a iommu group or not, let the DMA
  mapping api handle it.
- Move slave configuration data around in rcar-dmac to avoid code
  duplication.
- Fix build issue reported by 'kbuild test robot' regarding phys_to_page
  not availability on some configurations.
- Add DT information for r8a7791.

* Changes since RFC
- Switch to use the dma-mapping api instead of using the iommu_map()
  directly. Turns out the dma-mapper is much smarter then me...
- Dropped the patch to expose domain->ops->pgsize_bitmap from within the
  iommu api.
- Dropped the patch showing how I tested the RFC.


Niklas Söderlund (7):
  dma-mapping: add {map,unmap}_resource to dma_map_ops
  dma-mapping: add dma_{map,unmap}_resource
  arm: dma-mapping: add {map,unmap}_resource for iommu ops
  dmaengine: rcar-dmac: group slave configuration
  dmaengine: rcar-dmac: add iommu support for slave transfers
  ARM: dts: r8a7790: add iommus to dmac0 and dmac1
  ARM: dts: r8a7791: add iommus to dmac0 and dmac1

Robin Murphy (1):
  iommu: Add MMIO mapping type

 arch/arm/boot/dts/r8a7790.dtsi | 30 ++++++++++++++++
 arch/arm/boot/dts/r8a7791.dtsi | 30 ++++++++++++++++
 arch/arm/mm/dma-mapping.c      | 63 ++++++++++++++++++++++++++++++++
 drivers/dma/sh/rcar-dmac.c     | 81 +++++++++++++++++++++++++++++++++---------
 drivers/iommu/io-pgtable-arm.c |  9 +++--
 include/linux/dma-mapping.h    | 38 ++++++++++++++++++++
 include/linux/iommu.h          |  1 +
 7 files changed, 233 insertions(+), 19 deletions(-)

--
2.7.1

[toc] | [next] | [standalone]


#1335830 — [PATCH v4 2/8] dma-mapping: add {map,unmap}_resource to dma_map_ops

FromNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Date2016-02-16 21:50 +0100
Subject[PATCH v4 2/8] dma-mapping: add {map,unmap}_resource to dma_map_ops
Message-ID<r2UJk-4va-31@gated-at.bofh.it>
In reply to#1335829
Add methods to handle mapping of device resources from a physical
address. This is needed for example to be able to map MMIO FIFO
registers to a IOMMU.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 include/linux/dma-mapping.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index 75857cd..e3aba4e 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -49,6 +49,12 @@ struct dma_map_ops {
 			 struct scatterlist *sg, int nents,
 			 enum dma_data_direction dir,
 			 struct dma_attrs *attrs);
+	dma_addr_t (*map_resource)(struct device *dev, phys_addr_t phys_addr,
+			       size_t size, enum dma_data_direction dir,
+			       struct dma_attrs *attrs);
+	void (*unmap_resource)(struct device *dev, dma_addr_t dma_handle,
+			   size_t size, enum dma_data_direction dir,
+			   struct dma_attrs *attrs);
 	void (*sync_single_for_cpu)(struct device *dev,
 				    dma_addr_t dma_handle, size_t size,
 				    enum dma_data_direction dir);
-- 
2.7.1

[toc] | [prev] | [next] | [standalone]


#1335831 — [PATCH v4 3/8] dma-mapping: add dma_{map,unmap}_resource

FromNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Date2016-02-16 21:50 +0100
Subject[PATCH v4 3/8] dma-mapping: add dma_{map,unmap}_resource
Message-ID<r2UJk-4va-33@gated-at.bofh.it>
In reply to#1335829
Map/Unmap a device resource from a physical address. If no dma_map_ops
method is available the operation is a no-op.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
---
 include/linux/dma-mapping.h | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index e3aba4e..cc305d1 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -216,6 +216,38 @@ static inline void dma_unmap_page(struct device *dev, dma_addr_t addr,
 	debug_dma_unmap_page(dev, addr, size, dir, false);
 }
 
+static inline dma_addr_t dma_map_resource(struct device *dev,
+					  phys_addr_t phys_addr,
+					  size_t size,
+					  enum dma_data_direction dir,
+					  struct dma_attrs *attrs)
+{
+	struct dma_map_ops *ops = get_dma_ops(dev);
+	unsigned long pfn = __phys_to_pfn(phys_addr);
+
+	BUG_ON(!valid_dma_direction(dir));
+
+	/* Don't allow RAM to be mapped */
+	BUG_ON(pfn_valid(pfn));
+
+	if (ops->map_resource)
+		return ops->map_resource(dev, phys_addr, size, dir, attrs);
+
+	return phys_addr;
+}
+
+static inline void dma_unmap_resource(struct device *dev, dma_addr_t addr,
+				      size_t size, enum dma_data_direction dir,
+				      struct dma_attrs *attrs)
+{
+	struct dma_map_ops *ops = get_dma_ops(dev);
+
+	BUG_ON(!valid_dma_direction(dir));
+	if (ops->unmap_resource)
+		ops->unmap_resource(dev, addr, size, dir, attrs);
+
+}
+
 static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr,
 					   size_t size,
 					   enum dma_data_direction dir)
-- 
2.7.1

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web