Cris: convert to using generic dma-coherent mem allocator

Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Cc: Jesper Nilsson <jesper.nilsson@axis.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

authored by Dmitry Baryshkov and committed by Ingo Molnar 8fa8b9fb 9de90ac2

+6 -103
+1
arch/cris/arch-v32/drivers/Kconfig
··· 641 641 bool 642 642 depends on ETRAX_CARDBUS 643 643 default y 644 + select HAVE_GENERIC_DMA_COHERENT 644 645 645 646 config ETRAX_IOP_FW_LOAD 646 647 tristate "IO-processor hotplug firmware loading support"
+3 -103
arch/cris/arch-v32/drivers/pci/dma.c
··· 15 15 #include <linux/pci.h> 16 16 #include <asm/io.h> 17 17 18 - struct dma_coherent_mem { 19 - void *virt_base; 20 - u32 device_base; 21 - int size; 22 - int flags; 23 - unsigned long *bitmap; 24 - }; 25 - 26 18 void *dma_alloc_coherent(struct device *dev, size_t size, 27 19 dma_addr_t *dma_handle, gfp_t gfp) 28 20 { 29 21 void *ret; 30 - struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; 31 22 int order = get_order(size); 32 23 /* ignore region specifiers */ 33 24 gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); 34 25 35 - if (mem) { 36 - int page = bitmap_find_free_region(mem->bitmap, mem->size, 37 - order); 38 - if (page >= 0) { 39 - *dma_handle = mem->device_base + (page << PAGE_SHIFT); 40 - ret = mem->virt_base + (page << PAGE_SHIFT); 41 - memset(ret, 0, size); 42 - return ret; 43 - } 44 - if (mem->flags & DMA_MEMORY_EXCLUSIVE) 45 - return NULL; 46 - } 26 + if (dma_alloc_from_coherent(dev, size, dma_handle, &ret)) 27 + return ret; 47 28 48 29 if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff)) 49 30 gfp |= GFP_DMA; ··· 41 60 void dma_free_coherent(struct device *dev, size_t size, 42 61 void *vaddr, dma_addr_t dma_handle) 43 62 { 44 - struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; 45 63 int order = get_order(size); 46 64 47 - if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) { 48 - int page = (vaddr - mem->virt_base) >> PAGE_SHIFT; 49 - 50 - bitmap_release_region(mem->bitmap, page, order); 51 - } else 65 + if (!dma_release_from_coherent(dev, order, vaddr)) 52 66 free_pages((unsigned long)vaddr, order); 53 67 } 54 68 55 - int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr, 56 - dma_addr_t device_addr, size_t size, int flags) 57 - { 58 - void __iomem *mem_base; 59 - int pages = size >> PAGE_SHIFT; 60 - int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long); 61 - 62 - if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0) 63 - goto out; 64 - if (!size) 65 - goto out; 66 - if (dev->dma_mem) 67 - goto out; 68 - 69 - /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */ 70 - 71 - mem_base = ioremap(bus_addr, size); 72 - if (!mem_base) 73 - goto out; 74 - 75 - dev->dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL); 76 - if (!dev->dma_mem) 77 - goto iounmap_out; 78 - dev->dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL); 79 - if (!dev->dma_mem->bitmap) 80 - goto free1_out; 81 - 82 - dev->dma_mem->virt_base = mem_base; 83 - dev->dma_mem->device_base = device_addr; 84 - dev->dma_mem->size = pages; 85 - dev->dma_mem->flags = flags; 86 - 87 - if (flags & DMA_MEMORY_MAP) 88 - return DMA_MEMORY_MAP; 89 - 90 - return DMA_MEMORY_IO; 91 - 92 - free1_out: 93 - kfree(dev->dma_mem); 94 - iounmap_out: 95 - iounmap(mem_base); 96 - out: 97 - return 0; 98 - } 99 - EXPORT_SYMBOL(dma_declare_coherent_memory); 100 - 101 - void dma_release_declared_memory(struct device *dev) 102 - { 103 - struct dma_coherent_mem *mem = dev->dma_mem; 104 - 105 - if(!mem) 106 - return; 107 - dev->dma_mem = NULL; 108 - iounmap(mem->virt_base); 109 - kfree(mem->bitmap); 110 - kfree(mem); 111 - } 112 - EXPORT_SYMBOL(dma_release_declared_memory); 113 - 114 - void *dma_mark_declared_memory_occupied(struct device *dev, 115 - dma_addr_t device_addr, size_t size) 116 - { 117 - struct dma_coherent_mem *mem = dev->dma_mem; 118 - int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT; 119 - int pos, err; 120 - 121 - if (!mem) 122 - return ERR_PTR(-EINVAL); 123 - 124 - pos = (device_addr - mem->device_base) >> PAGE_SHIFT; 125 - err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages)); 126 - if (err != 0) 127 - return ERR_PTR(err); 128 - return mem->virt_base + (pos << PAGE_SHIFT); 129 - } 130 - EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
+2
include/asm-cris/dma-mapping.h
··· 14 14 #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) 15 15 16 16 #ifdef CONFIG_PCI 17 + #include <asm-generic/dma-coherent.h> 18 + 17 19 void *dma_alloc_coherent(struct device *dev, size_t size, 18 20 dma_addr_t *dma_handle, gfp_t flag); 19 21