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
From: Robin Murphy <robin.murphy@arm.com>
On some platforms, MMIO regions might need slightly different treatment
compared to mapping regular memory; add the notion of MMIO mappings to
the IOMMU API's memory type flags, so that callers can let the IOMMU
drivers know to do the right thing.
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Niklas S?derlund <niklas.soderlund+renesas@ragnatech.se>
---
drivers/iommu/io-pgtable-arm.c | 9 +++++++--
include/linux/iommu.h | 1 +
2 files changed, 8 insertions(+), 2 deletions(-)
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(+)
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(+)
A unconfirmed hardware bug prevents channel 0 and 15 to be used by the
DMAC together with the IPMMU. The DMAC driver will disable the channels
reducing the effective number of channels to 14 per DMAC.
Signed-off-by: Niklas S?derlund <niklas.soderlund+renesas@ragnatech.se>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
arch/arm/boot/dts/r8a7791.dtsi | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
A unconfirmed hardware bug prevents channel 0 and 15 to be used by the
DMAC together with the IPMMU. The DMAC driver will disable the channels
reducing the effective number of channels to 14 per DMAC.
Signed-off-by: Niklas S?derlund <niklas.soderlund+renesas@ragnatech.se>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
arch/arm/boot/dts/r8a7790.dtsi | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
Group slave address and transfer size in own structs for source and
destination. This is in preparation for hooking up the dma-mapping API
to the slave addresses.
Signed-off-by: Niklas S?derlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
drivers/dma/sh/rcar-dmac.c | 37 +++++++++++++++++++++----------------
1 file changed, 21 insertions(+), 16 deletions(-)
Add methods to map/unmap device resources addresses for dma_map_ops that
are IOMMU aware. This is needed to map a device MMIO register from a
physical address.
Signed-off-by: Niklas S?derlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
arch/arm/mm/dma-mapping.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+)