When the DMA_MEMORY_MAP flag is used, memory which can be accessed
directly should be returned, so use memremap(..., MEMREMAP_WC) to
provide a writecombine mapping.
Signed-off-by: Brian Starkey <brian.starkey@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  * Coherent per-device memory handling.
  * Borrowed from i386
  */
+#include <linux/io.h>
 #include <linux/slab.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
        if (!size)
                goto out;
 
-       mem_base = ioremap(phys_addr, size);
+       if (flags & DMA_MEMORY_MAP)
+               mem_base = memremap(phys_addr, size, MEMREMAP_WC);
+       else
+               mem_base = ioremap(phys_addr, size);
        if (!mem_base)
                goto out;
 
 
 out:
        kfree(dma_mem);
-       if (mem_base)
-               iounmap(mem_base);
+       if (mem_base) {
+               if (flags & DMA_MEMORY_MAP)
+                       memunmap(mem_base);
+               else
+                       iounmap(mem_base);
+       }
        return false;
 }
 
 {
        if (!mem)
                return;
-       iounmap(mem->virt_base);
+
+       if (mem->flags & DMA_MEMORY_MAP)
+               memunmap(mem->virt_base);
+       else
+               iounmap(mem->virt_base);
        kfree(mem->bitmap);
        kfree(mem);
 }