f091e93306
The dma_base, size and iommu arguments are only used by ARM, and can now easily be deduced from the device itself, so there's no need to pass them through the callchain as well. Acked-by: Rob Herring <robh@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Michael Kelley <mhklinux@outlook.com> # For Hyper-V Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Tested-by: Hanjun Guo <guohanjun@huawei.com> Signed-off-by: Robin Murphy <robin.murphy@arm.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Link: https://lore.kernel.org/r/5291c2326eab405b1aa7693aa964e8d3cb7193de.1713523152.git.robin.murphy@arm.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
53 lines
1.3 KiB
C
53 lines
1.3 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Based on linux/arch/arm/mm/dma-mapping.c
|
|
*
|
|
* Copyright (C) 2000-2004 Russell King
|
|
*/
|
|
|
|
#include <linux/dma-map-ops.h>
|
|
#include <asm/cachetype.h>
|
|
#include <asm/cacheflush.h>
|
|
#include <asm/outercache.h>
|
|
#include <asm/cp15.h>
|
|
|
|
#include "dma.h"
|
|
|
|
void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
|
|
enum dma_data_direction dir)
|
|
{
|
|
dmac_map_area(__va(paddr), size, dir);
|
|
|
|
if (dir == DMA_FROM_DEVICE)
|
|
outer_inv_range(paddr, paddr + size);
|
|
else
|
|
outer_clean_range(paddr, paddr + size);
|
|
}
|
|
|
|
void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
|
|
enum dma_data_direction dir)
|
|
{
|
|
if (dir != DMA_TO_DEVICE) {
|
|
outer_inv_range(paddr, paddr + size);
|
|
dmac_unmap_area(__va(paddr), size, dir);
|
|
}
|
|
}
|
|
|
|
void arch_setup_dma_ops(struct device *dev, bool coherent)
|
|
{
|
|
if (IS_ENABLED(CONFIG_CPU_V7M)) {
|
|
/*
|
|
* Cache support for v7m is optional, so can be treated as
|
|
* coherent if no cache has been detected. Note that it is not
|
|
* enough to check if MPU is in use or not since in absense of
|
|
* MPU system memory map is used.
|
|
*/
|
|
dev->dma_coherent = cacheid ? coherent : true;
|
|
} else {
|
|
/*
|
|
* Assume coherent DMA in case MMU/MPU has not been set up.
|
|
*/
|
|
dev->dma_coherent = (get_cr() & CR_M) ? coherent : true;
|
|
}
|
|
}
|