aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/dma-coherent.c54
1 files changed, 29 insertions, 25 deletions
diff --git a/kernel/dma-coherent.c b/kernel/dma-coherent.c
index 4bdcea822b45..8056d081609c 100644
--- a/kernel/dma-coherent.c
+++ b/kernel/dma-coherent.c
@@ -109,34 +109,38 @@ EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
109int dma_alloc_from_coherent(struct device *dev, ssize_t size, 109int dma_alloc_from_coherent(struct device *dev, ssize_t size,
110 dma_addr_t *dma_handle, void **ret) 110 dma_addr_t *dma_handle, void **ret)
111{ 111{
112 struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; 112 struct dma_coherent_mem *mem;
113 int order = get_order(size); 113 int order = get_order(size);
114 int pageno;
114 115
115 if (mem) { 116 if (!dev)
116 int page = bitmap_find_free_region(mem->bitmap, mem->size, 117 return 0;
117 order); 118 mem = dev->dma_mem;
118 if (page >= 0) { 119 if (!mem)
119 /* 120 return 0;
120 * Memory was found in the per-device arena. 121
121 */ 122 pageno = bitmap_find_free_region(mem->bitmap, mem->size, order);
122 *dma_handle = mem->device_base + (page << PAGE_SHIFT); 123 if (pageno >= 0) {
123 *ret = mem->virt_base + (page << PAGE_SHIFT); 124 /*
124 memset(*ret, 0, size); 125 * Memory was found in the per-device arena.
125 } else if (mem->flags & DMA_MEMORY_EXCLUSIVE) { 126 */
126 /* 127 *dma_handle = mem->device_base + (pageno << PAGE_SHIFT);
127 * The per-device arena is exhausted and we are not 128 *ret = mem->virt_base + (pageno << PAGE_SHIFT);
128 * permitted to fall back to generic memory. 129 memset(*ret, 0, size);
129 */ 130 } else if (mem->flags & DMA_MEMORY_EXCLUSIVE) {
130 *ret = NULL; 131 /*
131 } else { 132 * The per-device arena is exhausted and we are not
132 /* 133 * permitted to fall back to generic memory.
133 * The per-device arena is exhausted and we are 134 */
134 * permitted to fall back to generic memory. 135 *ret = NULL;
135 */ 136 } else {
136 return 0; 137 /*
137 } 138 * The per-device arena is exhausted and we are
139 * permitted to fall back to generic memory.
140 */
141 return 0;
138 } 142 }
139 return (mem != NULL); 143 return 1;
140} 144}
141EXPORT_SYMBOL(dma_alloc_from_coherent); 145EXPORT_SYMBOL(dma_alloc_from_coherent);
142 146