aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/android/ion/ion.c23
-rw-r--r--drivers/staging/android/ion/ion_carveout_heap.c17
-rw-r--r--drivers/staging/android/ion/ion_chunk_heap.c17
-rw-r--r--drivers/staging/android/ion/ion_cma_heap.c16
-rw-r--r--drivers/staging/android/ion/ion_priv.h5
-rw-r--r--drivers/staging/android/ion/ion_system_heap.c32
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
263err:
264 heap->ops->unmap_dma(heap, buffer);
265err1: 260err1:
266 heap->ops->free(buffer); 261 heap->ops->free(buffer);
267err2: 262err2:
@@ -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:
96static void ion_carveout_heap_free(struct ion_buffer *buffer) 96static 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
114static 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
120static void ion_carveout_heap_unmap_dma(struct ion_heap *heap,
121 struct ion_buffer *buffer)
122{
123}
124
125static struct ion_heap_ops carveout_heap_ops = { 114static 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;
81err: 81err:
@@ -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
120static 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
126static void ion_chunk_heap_unmap_dma(struct ion_heap *heap,
127 struct ion_buffer *buffer)
128{
129}
130
131static struct ion_heap_ops chunk_heap_ops = { 120static 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
108static 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
116static void ion_cma_heap_unmap_dma(struct ion_heap *heap,
117 struct ion_buffer *buffer)
118{
119}
120
121static int ion_cma_mmap(struct ion_heap *mapper, struct ion_buffer *buffer, 109static 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,
145static struct ion_heap_ops ion_cma_ops = { 133static 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
170free_table: 170free_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
202static 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
208static void ion_system_heap_unmap_dma(struct ion_heap *heap,
209 struct ion_buffer *buffer)
210{
211}
212
213static int ion_system_heap_shrink(struct ion_heap *heap, gfp_t gfp_mask, 202static 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,
243static struct ion_heap_ops system_heap_ops = { 232static 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
376static void ion_system_contig_heap_free(struct ion_buffer *buffer) 363static 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
389static 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
395static void ion_system_contig_heap_unmap_dma(struct ion_heap *heap,
396 struct ion_buffer *buffer)
397{
398}
399
400static struct ion_heap_ops kmalloc_ops = { 376static 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,