[PATCH v2 3/4] arm64: Add IOMMU dma_ops
Yong Wu
yong.wu at mediatek.com
Thu Jun 18 08:00:50 PDT 2015
On Thu, 2015-06-11 at 16:54 +0100, Robin Murphy wrote:
> Taking some inspiration from the arch/arm code, implement the
> arch-specific side of the DMA mapping ops using the new IOMMU-DMA layer.
>
> Whilst proliferating per-device private IOMMU data via dev->archdata is
> less than ideal, it will do the job for now, especially since we can't
> easily handle the kind of problematic system topologies in the current
> IOMMU API anyway.
>
> Signed-off-by: Robin Murphy <robin.murphy at arm.com>
> ---
> arch/arm64/include/asm/device.h | 3 +
> arch/arm64/include/asm/dma-mapping.h | 14 ++
> arch/arm64/mm/dma-mapping.c | 342 +++++++++++++++++++++++++++++++++++
> include/linux/dma-iommu.h | 4 +-
> 4 files changed, 361 insertions(+), 2 deletions(-)
[snip]
> +static int __iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma,
> + void *cpu_addr, dma_addr_t dma_addr, size_t size,
> + struct dma_attrs *attrs)
> +{
> + struct vm_struct *area;
> + int ret;
> +
> + vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot,
> + is_device_dma_coherent(dev));
> +
> + if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret))
> + return ret;
> +
> + area = find_vm_area(cpu_addr);
> + if (WARN_ON(!area || area->pages))
Is it: if (WARN_ON(!area || !area->pages))
> + return -ENXIO;
> +
> + return iommu_dma_mmap(area->pages, size, vma);
> +}
[snip]
> #endif /* __KERNEL__ */
> #endif /* __DMA_IOMMU_H */
More information about the linux-arm-kernel
mailing list