Commit 3e82d012 authored by Russell King's avatar Russell King

ARM: dma-mapping: fix coherent arch dma_alloc_coherent()

The coherent architecture dma_alloc_coherent was using kmalloc/kfree to
manage the memory.  dma_alloc_coherent() is expected to work with a
granularity of a page, so this is wrong.  Fix it by using the helper
functions now provided.
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Acked-by: default avatarGreg Ungerer <gerg@uclinux.org>
parent 7a9a32a9
...@@ -246,14 +246,16 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gf ...@@ -246,14 +246,16 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gf
return memory; return memory;
if (arch_is_coherent()) { if (arch_is_coherent()) {
void *virt; struct page *page;
virt = kmalloc(size, gfp); page = __dma_alloc_buffer(dev, PAGE_ALIGN(size), gfp);
if (!virt) if (!page) {
*handle = ~0;
return NULL; return NULL;
*handle = virt_to_dma(dev, virt); }
return virt; *handle = page_to_dma(dev, page);
return page_address(page);
} }
return __dma_alloc(dev, size, handle, gfp, return __dma_alloc(dev, size, handle, gfp,
...@@ -336,13 +338,13 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr ...@@ -336,13 +338,13 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr
if (dma_release_from_coherent(dev, get_order(size), cpu_addr)) if (dma_release_from_coherent(dev, get_order(size), cpu_addr))
return; return;
size = PAGE_ALIGN(size);
if (arch_is_coherent()) { if (arch_is_coherent()) {
kfree(cpu_addr); __dma_free_buffer(dma_to_page(dev, handle), size);
return; return;
} }
size = PAGE_ALIGN(size);
c = arm_vmregion_find_remove(&consistent_head, (unsigned long)cpu_addr); c = arm_vmregion_find_remove(&consistent_head, (unsigned long)cpu_addr);
if (!c) if (!c)
goto no_area; goto no_area;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment