On some systems, dma address differs from physical one due to various reasons.
dma_init_coherent_memory is aware of it, it takes both phys_addr_t and dma_addt_t arguments for memory block. However, rmem_dma_device_init passes physical address for DMA one. Fix this, using phys_to_dma(). This assumes the whole buffer has same offset between physical and dma addresses. Signed-off-by: Vladimir Kondratiev <[email protected]> --- drivers/base/dma-coherent.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/base/dma-coherent.c b/drivers/base/dma-coherent.c index 640a7e63c453..5371cb19c918 100644 --- a/drivers/base/dma-coherent.c +++ b/drivers/base/dma-coherent.c @@ -292,7 +292,8 @@ static int rmem_dma_device_init(struct reserved_mem *rmem, struct device *dev) struct dma_coherent_mem *mem = rmem->priv; if (!mem && - !dma_init_coherent_memory(rmem->base, rmem->base, rmem->size, + !dma_init_coherent_memory(rmem->base, phys_to_dma(dev, rmem->base), + rmem->size, DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE, &mem)) { pr_err("Reserved memory: failed to init DMA memory pool at %pa, size %ld MiB\n", -- 2.11.0

