|
@@ -2,6 +2,7 @@
|
|
|
* Coherent per-device memory handling.
|
|
|
* Borrowed from i386
|
|
|
*/
|
|
|
+#include <linux/io.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/kernel.h>
|
|
|
#include <linux/module.h>
|
|
@@ -31,7 +32,10 @@ static bool dma_init_coherent_memory(
|
|
|
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;
|
|
|
|
|
@@ -54,8 +58,12 @@ static bool dma_init_coherent_memory(
|
|
|
|
|
|
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;
|
|
|
}
|
|
|
|
|
@@ -63,7 +71,11 @@ static void dma_release_coherent_memory(struct dma_coherent_mem *mem)
|
|
|
{
|
|
|
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);
|
|
|
}
|