diff options
author | Magnus Damm <damm@igel.co.jp> | 2008-12-17 03:18:45 -0500 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2008-12-22 04:44:48 -0500 |
commit | da9fdc8b44c421f14a68988ae4d1fb414d5edbf0 (patch) | |
tree | 4136203d0e17012ba2aff4e6ee1568eaf77d72ba /arch/sh | |
parent | 78fb40263f34c65ade1693664db1af168d479588 (diff) |
sh: split coherent pages
Split pages returned by dma_alloc_coherent() and make sure
we free them one by one.
Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh')
-rw-r--r-- | arch/sh/mm/consistent.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index 9f8ea3ada4db..edcd5fbf9651 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
@@ -42,6 +42,8 @@ void *dma_alloc_coherent(struct device *dev, size_t size, | |||
42 | return NULL; | 42 | return NULL; |
43 | } | 43 | } |
44 | 44 | ||
45 | split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order); | ||
46 | |||
45 | *dma_handle = virt_to_phys(ret); | 47 | *dma_handle = virt_to_phys(ret); |
46 | return ret_nocache; | 48 | return ret_nocache; |
47 | } | 49 | } |
@@ -51,10 +53,13 @@ void dma_free_coherent(struct device *dev, size_t size, | |||
51 | void *vaddr, dma_addr_t dma_handle) | 53 | void *vaddr, dma_addr_t dma_handle) |
52 | { | 54 | { |
53 | int order = get_order(size); | 55 | int order = get_order(size); |
56 | unsigned long pfn = dma_handle >> PAGE_SHIFT; | ||
57 | int k; | ||
54 | 58 | ||
55 | if (!dma_release_from_coherent(dev, order, vaddr)) { | 59 | if (!dma_release_from_coherent(dev, order, vaddr)) { |
56 | WARN_ON(irqs_disabled()); /* for portability */ | 60 | WARN_ON(irqs_disabled()); /* for portability */ |
57 | free_pages((unsigned long)phys_to_virt(dma_handle), order); | 61 | for (k = 0; k < (1 << order); k++) |
62 | __free_pages(pfn_to_page(pfn + k), 0); | ||
58 | iounmap(vaddr); | 63 | iounmap(vaddr); |
59 | } | 64 | } |
60 | } | 65 | } |