diff options
-rw-r--r-- | drivers/staging/android/ion/ion.c | 23 | ||||
-rw-r--r-- | drivers/staging/android/ion/ion_carveout_heap.c | 17 | ||||
-rw-r--r-- | drivers/staging/android/ion/ion_chunk_heap.c | 17 | ||||
-rw-r--r-- | drivers/staging/android/ion/ion_cma_heap.c | 16 | ||||
-rw-r--r-- | drivers/staging/android/ion/ion_priv.h | 5 | ||||
-rw-r--r-- | drivers/staging/android/ion/ion_system_heap.c | 32 |
6 files changed, 16 insertions, 94 deletions
diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index bcf113f60fb2..cd730821cd6e 100644 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c | |||
@@ -205,19 +205,16 @@ static struct ion_buffer *ion_buffer_create(struct ion_heap *heap, | |||
205 | goto err2; | 205 | goto err2; |
206 | } | 206 | } |
207 | 207 | ||
208 | buffer->dev = dev; | 208 | if (buffer->sg_table == NULL) { |
209 | buffer->size = len; | 209 | WARN_ONCE(1, "This heap needs to set the sgtable"); |
210 | |||
211 | table = heap->ops->map_dma(heap, buffer); | ||
212 | if (WARN_ONCE(table == NULL, | ||
213 | "heap->ops->map_dma should return ERR_PTR on error")) | ||
214 | table = ERR_PTR(-EINVAL); | ||
215 | if (IS_ERR(table)) { | ||
216 | ret = -EINVAL; | 210 | ret = -EINVAL; |
217 | goto err1; | 211 | goto err1; |
218 | } | 212 | } |
219 | 213 | ||
220 | buffer->sg_table = table; | 214 | table = buffer->sg_table; |
215 | buffer->dev = dev; | ||
216 | buffer->size = len; | ||
217 | |||
221 | if (ion_buffer_fault_user_mappings(buffer)) { | 218 | if (ion_buffer_fault_user_mappings(buffer)) { |
222 | int num_pages = PAGE_ALIGN(buffer->size) / PAGE_SIZE; | 219 | int num_pages = PAGE_ALIGN(buffer->size) / PAGE_SIZE; |
223 | struct scatterlist *sg; | 220 | struct scatterlist *sg; |
@@ -226,7 +223,7 @@ static struct ion_buffer *ion_buffer_create(struct ion_heap *heap, | |||
226 | buffer->pages = vmalloc(sizeof(struct page *) * num_pages); | 223 | buffer->pages = vmalloc(sizeof(struct page *) * num_pages); |
227 | if (!buffer->pages) { | 224 | if (!buffer->pages) { |
228 | ret = -ENOMEM; | 225 | ret = -ENOMEM; |
229 | goto err; | 226 | goto err1; |
230 | } | 227 | } |
231 | 228 | ||
232 | for_each_sg(table->sgl, sg, table->nents, i) { | 229 | for_each_sg(table->sgl, sg, table->nents, i) { |
@@ -260,8 +257,6 @@ static struct ion_buffer *ion_buffer_create(struct ion_heap *heap, | |||
260 | mutex_unlock(&dev->buffer_lock); | 257 | mutex_unlock(&dev->buffer_lock); |
261 | return buffer; | 258 | return buffer; |
262 | 259 | ||
263 | err: | ||
264 | heap->ops->unmap_dma(heap, buffer); | ||
265 | err1: | 260 | err1: |
266 | heap->ops->free(buffer); | 261 | heap->ops->free(buffer); |
267 | err2: | 262 | err2: |
@@ -273,7 +268,6 @@ void ion_buffer_destroy(struct ion_buffer *buffer) | |||
273 | { | 268 | { |
274 | if (WARN_ON(buffer->kmap_cnt > 0)) | 269 | if (WARN_ON(buffer->kmap_cnt > 0)) |
275 | buffer->heap->ops->unmap_kernel(buffer->heap, buffer); | 270 | buffer->heap->ops->unmap_kernel(buffer->heap, buffer); |
276 | buffer->heap->ops->unmap_dma(buffer->heap, buffer); | ||
277 | buffer->heap->ops->free(buffer); | 271 | buffer->heap->ops->free(buffer); |
278 | vfree(buffer->pages); | 272 | vfree(buffer->pages); |
279 | kfree(buffer); | 273 | kfree(buffer); |
@@ -1542,8 +1536,7 @@ void ion_device_add_heap(struct ion_device *dev, struct ion_heap *heap) | |||
1542 | { | 1536 | { |
1543 | struct dentry *debug_file; | 1537 | struct dentry *debug_file; |
1544 | 1538 | ||
1545 | if (!heap->ops->allocate || !heap->ops->free || !heap->ops->map_dma || | 1539 | if (!heap->ops->allocate || !heap->ops->free) |
1546 | !heap->ops->unmap_dma) | ||
1547 | pr_err("%s: can not add heap with invalid ops struct.\n", | 1540 | pr_err("%s: can not add heap with invalid ops struct.\n", |
1548 | __func__); | 1541 | __func__); |
1549 | 1542 | ||
diff --git a/drivers/staging/android/ion/ion_carveout_heap.c b/drivers/staging/android/ion/ion_carveout_heap.c index 25b969bc140d..cc2a3b8160bc 100644 --- a/drivers/staging/android/ion/ion_carveout_heap.c +++ b/drivers/staging/android/ion/ion_carveout_heap.c | |||
@@ -82,7 +82,7 @@ static int ion_carveout_heap_allocate(struct ion_heap *heap, | |||
82 | } | 82 | } |
83 | 83 | ||
84 | sg_set_page(table->sgl, pfn_to_page(PFN_DOWN(paddr)), size, 0); | 84 | sg_set_page(table->sgl, pfn_to_page(PFN_DOWN(paddr)), size, 0); |
85 | buffer->priv_virt = table; | 85 | buffer->sg_table = table; |
86 | 86 | ||
87 | return 0; | 87 | return 0; |
88 | 88 | ||
@@ -96,7 +96,7 @@ err_free: | |||
96 | static void ion_carveout_heap_free(struct ion_buffer *buffer) | 96 | static void ion_carveout_heap_free(struct ion_buffer *buffer) |
97 | { | 97 | { |
98 | struct ion_heap *heap = buffer->heap; | 98 | struct ion_heap *heap = buffer->heap; |
99 | struct sg_table *table = buffer->priv_virt; | 99 | struct sg_table *table = buffer->sg_table; |
100 | struct page *page = sg_page(table->sgl); | 100 | struct page *page = sg_page(table->sgl); |
101 | ion_phys_addr_t paddr = PFN_PHYS(page_to_pfn(page)); | 101 | ion_phys_addr_t paddr = PFN_PHYS(page_to_pfn(page)); |
102 | 102 | ||
@@ -111,22 +111,9 @@ static void ion_carveout_heap_free(struct ion_buffer *buffer) | |||
111 | kfree(table); | 111 | kfree(table); |
112 | } | 112 | } |
113 | 113 | ||
114 | static struct sg_table *ion_carveout_heap_map_dma(struct ion_heap *heap, | ||
115 | struct ion_buffer *buffer) | ||
116 | { | ||
117 | return buffer->priv_virt; | ||
118 | } | ||
119 | |||
120 | static void ion_carveout_heap_unmap_dma(struct ion_heap *heap, | ||
121 | struct ion_buffer *buffer) | ||
122 | { | ||
123 | } | ||
124 | |||
125 | static struct ion_heap_ops carveout_heap_ops = { | 114 | static struct ion_heap_ops carveout_heap_ops = { |
126 | .allocate = ion_carveout_heap_allocate, | 115 | .allocate = ion_carveout_heap_allocate, |
127 | .free = ion_carveout_heap_free, | 116 | .free = ion_carveout_heap_free, |
128 | .map_dma = ion_carveout_heap_map_dma, | ||
129 | .unmap_dma = ion_carveout_heap_unmap_dma, | ||
130 | .map_user = ion_heap_map_user, | 117 | .map_user = ion_heap_map_user, |
131 | .map_kernel = ion_heap_map_kernel, | 118 | .map_kernel = ion_heap_map_kernel, |
132 | .unmap_kernel = ion_heap_unmap_kernel, | 119 | .unmap_kernel = ion_heap_unmap_kernel, |
diff --git a/drivers/staging/android/ion/ion_chunk_heap.c b/drivers/staging/android/ion/ion_chunk_heap.c index e0553fee9b8a..560cf907aed5 100644 --- a/drivers/staging/android/ion/ion_chunk_heap.c +++ b/drivers/staging/android/ion/ion_chunk_heap.c | |||
@@ -75,7 +75,7 @@ static int ion_chunk_heap_allocate(struct ion_heap *heap, | |||
75 | sg = sg_next(sg); | 75 | sg = sg_next(sg); |
76 | } | 76 | } |
77 | 77 | ||
78 | buffer->priv_virt = table; | 78 | buffer->sg_table = table; |
79 | chunk_heap->allocated += allocated_size; | 79 | chunk_heap->allocated += allocated_size; |
80 | return 0; | 80 | return 0; |
81 | err: | 81 | err: |
@@ -95,7 +95,7 @@ static void ion_chunk_heap_free(struct ion_buffer *buffer) | |||
95 | struct ion_heap *heap = buffer->heap; | 95 | struct ion_heap *heap = buffer->heap; |
96 | struct ion_chunk_heap *chunk_heap = | 96 | struct ion_chunk_heap *chunk_heap = |
97 | container_of(heap, struct ion_chunk_heap, heap); | 97 | container_of(heap, struct ion_chunk_heap, heap); |
98 | struct sg_table *table = buffer->priv_virt; | 98 | struct sg_table *table = buffer->sg_table; |
99 | struct scatterlist *sg; | 99 | struct scatterlist *sg; |
100 | int i; | 100 | int i; |
101 | unsigned long allocated_size; | 101 | unsigned long allocated_size; |
@@ -117,22 +117,9 @@ static void ion_chunk_heap_free(struct ion_buffer *buffer) | |||
117 | kfree(table); | 117 | kfree(table); |
118 | } | 118 | } |
119 | 119 | ||
120 | static struct sg_table *ion_chunk_heap_map_dma(struct ion_heap *heap, | ||
121 | struct ion_buffer *buffer) | ||
122 | { | ||
123 | return buffer->priv_virt; | ||
124 | } | ||
125 | |||
126 | static void ion_chunk_heap_unmap_dma(struct ion_heap *heap, | ||
127 | struct ion_buffer *buffer) | ||
128 | { | ||
129 | } | ||
130 | |||
131 | static struct ion_heap_ops chunk_heap_ops = { | 120 | static struct ion_heap_ops chunk_heap_ops = { |
132 | .allocate = ion_chunk_heap_allocate, | 121 | .allocate = ion_chunk_heap_allocate, |
133 | .free = ion_chunk_heap_free, | 122 | .free = ion_chunk_heap_free, |
134 | .map_dma = ion_chunk_heap_map_dma, | ||
135 | .unmap_dma = ion_chunk_heap_unmap_dma, | ||
136 | .map_user = ion_heap_map_user, | 123 | .map_user = ion_heap_map_user, |
137 | .map_kernel = ion_heap_map_kernel, | 124 | .map_kernel = ion_heap_map_kernel, |
138 | .unmap_kernel = ion_heap_unmap_kernel, | 125 | .unmap_kernel = ion_heap_unmap_kernel, |
diff --git a/drivers/staging/android/ion/ion_cma_heap.c b/drivers/staging/android/ion/ion_cma_heap.c index 0828e333f2e7..d5ff3a282dfd 100644 --- a/drivers/staging/android/ion/ion_cma_heap.c +++ b/drivers/staging/android/ion/ion_cma_heap.c | |||
@@ -78,6 +78,7 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer, | |||
78 | goto free_table; | 78 | goto free_table; |
79 | /* keep this for memory release */ | 79 | /* keep this for memory release */ |
80 | buffer->priv_virt = info; | 80 | buffer->priv_virt = info; |
81 | buffer->sg_table = info->table; | ||
81 | dev_dbg(dev, "Allocate buffer %p\n", buffer); | 82 | dev_dbg(dev, "Allocate buffer %p\n", buffer); |
82 | return 0; | 83 | return 0; |
83 | 84 | ||
@@ -105,19 +106,6 @@ static void ion_cma_free(struct ion_buffer *buffer) | |||
105 | kfree(info); | 106 | kfree(info); |
106 | } | 107 | } |
107 | 108 | ||
108 | static struct sg_table *ion_cma_heap_map_dma(struct ion_heap *heap, | ||
109 | struct ion_buffer *buffer) | ||
110 | { | ||
111 | struct ion_cma_buffer_info *info = buffer->priv_virt; | ||
112 | |||
113 | return info->table; | ||
114 | } | ||
115 | |||
116 | static void ion_cma_heap_unmap_dma(struct ion_heap *heap, | ||
117 | struct ion_buffer *buffer) | ||
118 | { | ||
119 | } | ||
120 | |||
121 | static int ion_cma_mmap(struct ion_heap *mapper, struct ion_buffer *buffer, | 109 | static int ion_cma_mmap(struct ion_heap *mapper, struct ion_buffer *buffer, |
122 | struct vm_area_struct *vma) | 110 | struct vm_area_struct *vma) |
123 | { | 111 | { |
@@ -145,8 +133,6 @@ static void ion_cma_unmap_kernel(struct ion_heap *heap, | |||
145 | static struct ion_heap_ops ion_cma_ops = { | 133 | static struct ion_heap_ops ion_cma_ops = { |
146 | .allocate = ion_cma_allocate, | 134 | .allocate = ion_cma_allocate, |
147 | .free = ion_cma_free, | 135 | .free = ion_cma_free, |
148 | .map_dma = ion_cma_heap_map_dma, | ||
149 | .unmap_dma = ion_cma_heap_unmap_dma, | ||
150 | .map_user = ion_cma_mmap, | 136 | .map_user = ion_cma_mmap, |
151 | .map_kernel = ion_cma_map_kernel, | 137 | .map_kernel = ion_cma_map_kernel, |
152 | .unmap_kernel = ion_cma_unmap_kernel, | 138 | .unmap_kernel = ion_cma_unmap_kernel, |
diff --git a/drivers/staging/android/ion/ion_priv.h b/drivers/staging/android/ion/ion_priv.h index 141fb0d7b4cd..3dd91172540b 100644 --- a/drivers/staging/android/ion/ion_priv.h +++ b/drivers/staging/android/ion/ion_priv.h | |||
@@ -86,8 +86,6 @@ void ion_buffer_destroy(struct ion_buffer *buffer); | |||
86 | * struct ion_heap_ops - ops to operate on a given heap | 86 | * struct ion_heap_ops - ops to operate on a given heap |
87 | * @allocate: allocate memory | 87 | * @allocate: allocate memory |
88 | * @free: free memory | 88 | * @free: free memory |
89 | * @map_dma map the memory for dma to a scatterlist | ||
90 | * @unmap_dma unmap the memory for dma | ||
91 | * @map_kernel map memory to the kernel | 89 | * @map_kernel map memory to the kernel |
92 | * @unmap_kernel unmap memory to the kernel | 90 | * @unmap_kernel unmap memory to the kernel |
93 | * @map_user map memory to userspace | 91 | * @map_user map memory to userspace |
@@ -104,9 +102,6 @@ struct ion_heap_ops { | |||
104 | struct ion_buffer *buffer, unsigned long len, | 102 | struct ion_buffer *buffer, unsigned long len, |
105 | unsigned long align, unsigned long flags); | 103 | unsigned long align, unsigned long flags); |
106 | void (*free)(struct ion_buffer *buffer); | 104 | void (*free)(struct ion_buffer *buffer); |
107 | struct sg_table * (*map_dma)(struct ion_heap *heap, | ||
108 | struct ion_buffer *buffer); | ||
109 | void (*unmap_dma)(struct ion_heap *heap, struct ion_buffer *buffer); | ||
110 | void * (*map_kernel)(struct ion_heap *heap, struct ion_buffer *buffer); | 105 | void * (*map_kernel)(struct ion_heap *heap, struct ion_buffer *buffer); |
111 | void (*unmap_kernel)(struct ion_heap *heap, struct ion_buffer *buffer); | 106 | void (*unmap_kernel)(struct ion_heap *heap, struct ion_buffer *buffer); |
112 | int (*map_user)(struct ion_heap *mapper, struct ion_buffer *buffer, | 107 | int (*map_user)(struct ion_heap *mapper, struct ion_buffer *buffer, |
diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c index 02bae94018af..b697c6da0c3a 100644 --- a/drivers/staging/android/ion/ion_system_heap.c +++ b/drivers/staging/android/ion/ion_system_heap.c | |||
@@ -164,7 +164,7 @@ static int ion_system_heap_allocate(struct ion_heap *heap, | |||
164 | list_del(&page->lru); | 164 | list_del(&page->lru); |
165 | } | 165 | } |
166 | 166 | ||
167 | buffer->priv_virt = table; | 167 | buffer->sg_table = table; |
168 | return 0; | 168 | return 0; |
169 | 169 | ||
170 | free_table: | 170 | free_table: |
@@ -199,17 +199,6 @@ static void ion_system_heap_free(struct ion_buffer *buffer) | |||
199 | kfree(table); | 199 | kfree(table); |
200 | } | 200 | } |
201 | 201 | ||
202 | static struct sg_table *ion_system_heap_map_dma(struct ion_heap *heap, | ||
203 | struct ion_buffer *buffer) | ||
204 | { | ||
205 | return buffer->priv_virt; | ||
206 | } | ||
207 | |||
208 | static void ion_system_heap_unmap_dma(struct ion_heap *heap, | ||
209 | struct ion_buffer *buffer) | ||
210 | { | ||
211 | } | ||
212 | |||
213 | static int ion_system_heap_shrink(struct ion_heap *heap, gfp_t gfp_mask, | 202 | static int ion_system_heap_shrink(struct ion_heap *heap, gfp_t gfp_mask, |
214 | int nr_to_scan) | 203 | int nr_to_scan) |
215 | { | 204 | { |
@@ -243,8 +232,6 @@ static int ion_system_heap_shrink(struct ion_heap *heap, gfp_t gfp_mask, | |||
243 | static struct ion_heap_ops system_heap_ops = { | 232 | static struct ion_heap_ops system_heap_ops = { |
244 | .allocate = ion_system_heap_allocate, | 233 | .allocate = ion_system_heap_allocate, |
245 | .free = ion_system_heap_free, | 234 | .free = ion_system_heap_free, |
246 | .map_dma = ion_system_heap_map_dma, | ||
247 | .unmap_dma = ion_system_heap_unmap_dma, | ||
248 | .map_kernel = ion_heap_map_kernel, | 235 | .map_kernel = ion_heap_map_kernel, |
249 | .unmap_kernel = ion_heap_unmap_kernel, | 236 | .unmap_kernel = ion_heap_unmap_kernel, |
250 | .map_user = ion_heap_map_user, | 237 | .map_user = ion_heap_map_user, |
@@ -358,7 +345,7 @@ static int ion_system_contig_heap_allocate(struct ion_heap *heap, | |||
358 | 345 | ||
359 | sg_set_page(table->sgl, page, len, 0); | 346 | sg_set_page(table->sgl, page, len, 0); |
360 | 347 | ||
361 | buffer->priv_virt = table; | 348 | buffer->sg_table = table; |
362 | 349 | ||
363 | ion_pages_sync_for_device(NULL, page, len, DMA_BIDIRECTIONAL); | 350 | ion_pages_sync_for_device(NULL, page, len, DMA_BIDIRECTIONAL); |
364 | 351 | ||
@@ -375,7 +362,7 @@ free_pages: | |||
375 | 362 | ||
376 | static void ion_system_contig_heap_free(struct ion_buffer *buffer) | 363 | static void ion_system_contig_heap_free(struct ion_buffer *buffer) |
377 | { | 364 | { |
378 | struct sg_table *table = buffer->priv_virt; | 365 | struct sg_table *table = buffer->sg_table; |
379 | struct page *page = sg_page(table->sgl); | 366 | struct page *page = sg_page(table->sgl); |
380 | unsigned long pages = PAGE_ALIGN(buffer->size) >> PAGE_SHIFT; | 367 | unsigned long pages = PAGE_ALIGN(buffer->size) >> PAGE_SHIFT; |
381 | unsigned long i; | 368 | unsigned long i; |
@@ -386,22 +373,9 @@ static void ion_system_contig_heap_free(struct ion_buffer *buffer) | |||
386 | kfree(table); | 373 | kfree(table); |
387 | } | 374 | } |
388 | 375 | ||
389 | static struct sg_table *ion_system_contig_heap_map_dma(struct ion_heap *heap, | ||
390 | struct ion_buffer *buffer) | ||
391 | { | ||
392 | return buffer->priv_virt; | ||
393 | } | ||
394 | |||
395 | static void ion_system_contig_heap_unmap_dma(struct ion_heap *heap, | ||
396 | struct ion_buffer *buffer) | ||
397 | { | ||
398 | } | ||
399 | |||
400 | static struct ion_heap_ops kmalloc_ops = { | 376 | static struct ion_heap_ops kmalloc_ops = { |
401 | .allocate = ion_system_contig_heap_allocate, | 377 | .allocate = ion_system_contig_heap_allocate, |
402 | .free = ion_system_contig_heap_free, | 378 | .free = ion_system_contig_heap_free, |
403 | .map_dma = ion_system_contig_heap_map_dma, | ||
404 | .unmap_dma = ion_system_contig_heap_unmap_dma, | ||
405 | .map_kernel = ion_heap_map_kernel, | 379 | .map_kernel = ion_heap_map_kernel, |
406 | .unmap_kernel = ion_heap_unmap_kernel, | 380 | .unmap_kernel = ion_heap_unmap_kernel, |
407 | .map_user = ion_heap_map_user, | 381 | .map_user = ion_heap_map_user, |