Sh: use generic per-device coherent dma allocator

Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

authored by Dmitry Baryshkov and committed by Ingo Molnar 9de90ac2 1fe53268

+5 -95
+1
arch/sh/Kconfig
··· 10 10 select EMBEDDED 11 11 select HAVE_IDE 12 12 select HAVE_OPROFILE 13 + select HAVE_GENERIC_DMA_COHERENT 13 14 help 14 15 The SuperH is a RISC processor targeted for use in embedded systems 15 16 and consumer electronics; it was also used in the Sega Dreamcast
+3 -95
arch/sh/mm/consistent.c
··· 27 27 dma_addr_t *dma_handle, gfp_t gfp) 28 28 { 29 29 void *ret, *ret_nocache; 30 - struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; 31 30 int order = get_order(size); 32 31 33 - if (mem) { 34 - int page = bitmap_find_free_region(mem->bitmap, mem->size, 35 - order); 36 - if (page >= 0) { 37 - *dma_handle = mem->device_base + (page << PAGE_SHIFT); 38 - ret = mem->virt_base + (page << PAGE_SHIFT); 39 - memset(ret, 0, size); 40 - return ret; 41 - } 42 - if (mem->flags & DMA_MEMORY_EXCLUSIVE) 43 - return NULL; 44 - } 32 + if (dma_alloc_from_coherent(dev, size, dma_handle, &ret)) 33 + return ret; 45 34 46 35 ret = (void *)__get_free_pages(gfp, order); 47 36 if (!ret) ··· 60 71 struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; 61 72 int order = get_order(size); 62 73 63 - if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) { 64 - int page = (vaddr - mem->virt_base) >> PAGE_SHIFT; 65 - 66 - bitmap_release_region(mem->bitmap, page, order); 67 - } else { 74 + if (!dma_release_from_coherent(dev, order, vaddr)) { 68 75 WARN_ON(irqs_disabled()); /* for portability */ 69 76 BUG_ON(mem && mem->flags & DMA_MEMORY_EXCLUSIVE); 70 77 free_pages((unsigned long)phys_to_virt(dma_handle), order); ··· 68 83 } 69 84 } 70 85 EXPORT_SYMBOL(dma_free_coherent); 71 - 72 - int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr, 73 - dma_addr_t device_addr, size_t size, int flags) 74 - { 75 - void __iomem *mem_base = NULL; 76 - int pages = size >> PAGE_SHIFT; 77 - int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long); 78 - 79 - if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0) 80 - goto out; 81 - if (!size) 82 - goto out; 83 - if (dev->dma_mem) 84 - goto out; 85 - 86 - /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */ 87 - 88 - mem_base = ioremap_nocache(bus_addr, size); 89 - if (!mem_base) 90 - goto out; 91 - 92 - dev->dma_mem = kmalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL); 93 - if (!dev->dma_mem) 94 - goto out; 95 - dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL); 96 - if (!dev->dma_mem->bitmap) 97 - goto free1_out; 98 - 99 - dev->dma_mem->virt_base = mem_base; 100 - dev->dma_mem->device_base = device_addr; 101 - dev->dma_mem->size = pages; 102 - dev->dma_mem->flags = flags; 103 - 104 - if (flags & DMA_MEMORY_MAP) 105 - return DMA_MEMORY_MAP; 106 - 107 - return DMA_MEMORY_IO; 108 - 109 - free1_out: 110 - kfree(dev->dma_mem); 111 - out: 112 - if (mem_base) 113 - iounmap(mem_base); 114 - return 0; 115 - } 116 - EXPORT_SYMBOL(dma_declare_coherent_memory); 117 - 118 - void dma_release_declared_memory(struct device *dev) 119 - { 120 - struct dma_coherent_mem *mem = dev->dma_mem; 121 - 122 - if (!mem) 123 - return; 124 - dev->dma_mem = NULL; 125 - iounmap(mem->virt_base); 126 - kfree(mem->bitmap); 127 - kfree(mem); 128 - } 129 - EXPORT_SYMBOL(dma_release_declared_memory); 130 - 131 - void *dma_mark_declared_memory_occupied(struct device *dev, 132 - dma_addr_t device_addr, size_t size) 133 - { 134 - struct dma_coherent_mem *mem = dev->dma_mem; 135 - int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT; 136 - int pos, err; 137 - 138 - if (!mem) 139 - return ERR_PTR(-EINVAL); 140 - 141 - pos = (device_addr - mem->device_base) >> PAGE_SHIFT; 142 - err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages)); 143 - if (err != 0) 144 - return ERR_PTR(err); 145 - return mem->virt_base + (pos << PAGE_SHIFT); 146 - } 147 - EXPORT_SYMBOL(dma_mark_declared_memory_occupied); 148 86 149 87 void dma_cache_sync(struct device *dev, void *vaddr, size_t size, 150 88 enum dma_data_direction direction)
+1
include/asm-sh/dma-mapping.h
··· 5 5 #include <linux/scatterlist.h> 6 6 #include <asm/cacheflush.h> 7 7 #include <asm/io.h> 8 + #include <asm-generic/dma-coherent.h> 8 9 9 10 extern struct bus_type pci_bus_type; 10 11