blob: 0d6f2029802024291c9dfb5ef4ffd91c953af6cb [file] [log] [blame]
Steve Kondikf7652b32013-11-26 15:20:51 -08001/* Copyright (c) 2002,2007-2013, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/export.h>
15#include <linux/vmalloc.h>
16#include <linux/memory_alloc.h>
17#include <asm/cacheflush.h>
18#include <linux/slab.h>
19#include <linux/kmemleak.h>
20#include <linux/highmem.h>
21
22#include "kgsl.h"
23#include "kgsl_sharedmem.h"
24#include "kgsl_cffdump.h"
25#include "kgsl_device.h"
26
27DEFINE_MUTEX(kernel_map_global_lock);
28
29/* An attribute for showing per-process memory statistics */
30struct kgsl_mem_entry_attribute {
31 struct attribute attr;
32 int memtype;
33 ssize_t (*show)(struct kgsl_process_private *priv,
34 int type, char *buf);
35};
36
37#define to_mem_entry_attr(a) \
38container_of(a, struct kgsl_mem_entry_attribute, attr)
39
40#define __MEM_ENTRY_ATTR(_type, _name, _show) \
41{ \
42 .attr = { .name = __stringify(_name), .mode = 0444 }, \
43 .memtype = _type, \
44 .show = _show, \
45}
46
47/*
48 * A structure to hold the attributes for a particular memory type.
49 * For each memory type in each process we store the current and maximum
50 * memory usage and display the counts in sysfs. This structure and
51 * the following macro allow us to simplify the definition for those
52 * adding new memory types
53 */
54
55struct mem_entry_stats {
56 int memtype;
57 struct kgsl_mem_entry_attribute attr;
58 struct kgsl_mem_entry_attribute max_attr;
59};
60
61
62#define MEM_ENTRY_STAT(_type, _name) \
63{ \
64 .memtype = _type, \
65 .attr = __MEM_ENTRY_ATTR(_type, _name, mem_entry_show), \
66 .max_attr = __MEM_ENTRY_ATTR(_type, _name##_max, \
67 mem_entry_max_show), \
68}
69
70/**
71 * Given a kobj, find the process structure attached to it
72 */
73
74static struct kgsl_process_private *
75_get_priv_from_kobj(struct kobject *kobj)
76{
77 struct kgsl_process_private *private;
78 unsigned long name;
79
80 if (!kobj)
81 return NULL;
82
83 if (sscanf(kobj->name, "%ld", &name) != 1)
84 return NULL;
85
86 list_for_each_entry(private, &kgsl_driver.process_list, list) {
87 if (private->pid == name)
88 return private;
89 }
90
91 return NULL;
92}
93
94/**
95 * Show the current amount of memory allocated for the given memtype
96 */
97
98static ssize_t
99mem_entry_show(struct kgsl_process_private *priv, int type, char *buf)
100{
101 return snprintf(buf, PAGE_SIZE, "%d\n", priv->stats[type].cur);
102}
103
104/**
105 * Show the maximum memory allocated for the given memtype through the life of
106 * the process
107 */
108
109static ssize_t
110mem_entry_max_show(struct kgsl_process_private *priv, int type, char *buf)
111{
112 return snprintf(buf, PAGE_SIZE, "%d\n", priv->stats[type].max);
113}
114
115
116static void mem_entry_sysfs_release(struct kobject *kobj)
117{
118}
119
120static ssize_t mem_entry_sysfs_show(struct kobject *kobj,
121 struct attribute *attr, char *buf)
122{
123 struct kgsl_mem_entry_attribute *pattr = to_mem_entry_attr(attr);
124 struct kgsl_process_private *priv;
125 ssize_t ret;
126
127 mutex_lock(&kgsl_driver.process_mutex);
128 priv = _get_priv_from_kobj(kobj);
129
130 if (priv && pattr->show)
131 ret = pattr->show(priv, pattr->memtype, buf);
132 else
133 ret = -EIO;
134
135 mutex_unlock(&kgsl_driver.process_mutex);
136 return ret;
137}
138
139static const struct sysfs_ops mem_entry_sysfs_ops = {
140 .show = mem_entry_sysfs_show,
141};
142
143static struct kobj_type ktype_mem_entry = {
144 .sysfs_ops = &mem_entry_sysfs_ops,
145 .default_attrs = NULL,
146 .release = mem_entry_sysfs_release
147};
148
149static struct mem_entry_stats mem_stats[] = {
150 MEM_ENTRY_STAT(KGSL_MEM_ENTRY_KERNEL, kernel),
151 MEM_ENTRY_STAT(KGSL_MEM_ENTRY_PMEM, pmem),
152#ifdef CONFIG_ASHMEM
153 MEM_ENTRY_STAT(KGSL_MEM_ENTRY_ASHMEM, ashmem),
154#endif
155 MEM_ENTRY_STAT(KGSL_MEM_ENTRY_USER, user),
156#ifdef CONFIG_ION
157 MEM_ENTRY_STAT(KGSL_MEM_ENTRY_ION, ion),
158#endif
159};
160
161void
162kgsl_process_uninit_sysfs(struct kgsl_process_private *private)
163{
164 int i;
165
166 for (i = 0; i < ARRAY_SIZE(mem_stats); i++) {
167 sysfs_remove_file(&private->kobj, &mem_stats[i].attr.attr);
168 sysfs_remove_file(&private->kobj,
169 &mem_stats[i].max_attr.attr);
170 }
171
172 kobject_put(&private->kobj);
173}
174
175/**
176 * kgsl_process_init_sysfs() - Initialize and create sysfs files for a process
177 *
178 * @device: Pointer to kgsl device struct
179 * @private: Pointer to the structure for the process
180 *
181 * @returns: 0 on success, error code otherwise
182 *
183 * kgsl_process_init_sysfs() is called at the time of creating the
184 * process struct when a process opens the kgsl device for the first time.
185 * This function creates the sysfs files for the process.
186 */
187int
188kgsl_process_init_sysfs(struct kgsl_device *device,
189 struct kgsl_process_private *private)
190{
191 unsigned char name[16];
192 int i, ret = 0;
193
194 snprintf(name, sizeof(name), "%d", private->pid);
195
196 ret = kobject_init_and_add(&private->kobj, &ktype_mem_entry,
197 kgsl_driver.prockobj, name);
198
199 if (ret)
200 return ret;
201
202 for (i = 0; i < ARRAY_SIZE(mem_stats); i++) {
203 /* We need to check the value of sysfs_create_file, but we
204 * don't really care if it passed or not */
205
206 ret = sysfs_create_file(&private->kobj,
207 &mem_stats[i].attr.attr);
208 ret = sysfs_create_file(&private->kobj,
209 &mem_stats[i].max_attr.attr);
210 }
211 return ret;
212}
213
214static int kgsl_drv_memstat_show(struct device *dev,
215 struct device_attribute *attr,
216 char *buf)
217{
218 unsigned int val = 0;
219
220 if (!strncmp(attr->attr.name, "vmalloc", 7))
221 val = kgsl_driver.stats.vmalloc;
222 else if (!strncmp(attr->attr.name, "vmalloc_max", 11))
223 val = kgsl_driver.stats.vmalloc_max;
224 else if (!strncmp(attr->attr.name, "page_alloc", 10))
225 val = kgsl_driver.stats.page_alloc;
226 else if (!strncmp(attr->attr.name, "page_alloc_max", 14))
227 val = kgsl_driver.stats.page_alloc_max;
228 else if (!strncmp(attr->attr.name, "coherent", 8))
229 val = kgsl_driver.stats.coherent;
230 else if (!strncmp(attr->attr.name, "coherent_max", 12))
231 val = kgsl_driver.stats.coherent_max;
232 else if (!strncmp(attr->attr.name, "mapped", 6))
233 val = kgsl_driver.stats.mapped;
234 else if (!strncmp(attr->attr.name, "mapped_max", 10))
235 val = kgsl_driver.stats.mapped_max;
236
237 return snprintf(buf, PAGE_SIZE, "%u\n", val);
238}
239
240static int kgsl_drv_histogram_show(struct device *dev,
241 struct device_attribute *attr,
242 char *buf)
243{
244 int len = 0;
245 int i;
246
247 for (i = 0; i < 16; i++)
248 len += snprintf(buf + len, PAGE_SIZE - len, "%d ",
249 kgsl_driver.stats.histogram[i]);
250
251 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
252 return len;
253}
254
255static int kgsl_drv_full_cache_threshold_store(struct device *dev,
256 struct device_attribute *attr,
257 const char *buf, size_t count)
258{
259 int ret;
260 unsigned int thresh;
261 ret = sscanf(buf, "%d", &thresh);
262 if (ret != 1)
263 return count;
264
265 kgsl_driver.full_cache_threshold = thresh;
266
267 return count;
268}
269
270static int kgsl_drv_full_cache_threshold_show(struct device *dev,
271 struct device_attribute *attr,
272 char *buf)
273{
274 return snprintf(buf, PAGE_SIZE, "%d\n",
275 kgsl_driver.full_cache_threshold);
276}
277
278DEVICE_ATTR(vmalloc, 0444, kgsl_drv_memstat_show, NULL);
279DEVICE_ATTR(vmalloc_max, 0444, kgsl_drv_memstat_show, NULL);
280DEVICE_ATTR(page_alloc, 0444, kgsl_drv_memstat_show, NULL);
281DEVICE_ATTR(page_alloc_max, 0444, kgsl_drv_memstat_show, NULL);
282DEVICE_ATTR(coherent, 0444, kgsl_drv_memstat_show, NULL);
283DEVICE_ATTR(coherent_max, 0444, kgsl_drv_memstat_show, NULL);
284DEVICE_ATTR(mapped, 0444, kgsl_drv_memstat_show, NULL);
285DEVICE_ATTR(mapped_max, 0444, kgsl_drv_memstat_show, NULL);
286DEVICE_ATTR(histogram, 0444, kgsl_drv_histogram_show, NULL);
287DEVICE_ATTR(full_cache_threshold, 0644,
288 kgsl_drv_full_cache_threshold_show,
289 kgsl_drv_full_cache_threshold_store);
290
291static const struct device_attribute *drv_attr_list[] = {
292 &dev_attr_vmalloc,
293 &dev_attr_vmalloc_max,
294 &dev_attr_page_alloc,
295 &dev_attr_page_alloc_max,
296 &dev_attr_coherent,
297 &dev_attr_coherent_max,
298 &dev_attr_mapped,
299 &dev_attr_mapped_max,
300 &dev_attr_histogram,
301 &dev_attr_full_cache_threshold,
302 NULL
303};
304
305void
306kgsl_sharedmem_uninit_sysfs(void)
307{
308 kgsl_remove_device_sysfs_files(&kgsl_driver.virtdev, drv_attr_list);
309}
310
311int
312kgsl_sharedmem_init_sysfs(void)
313{
314 return kgsl_create_device_sysfs_files(&kgsl_driver.virtdev,
315 drv_attr_list);
316}
317
318#ifdef CONFIG_OUTER_CACHE
319static void _outer_cache_range_op(int op, unsigned long addr, size_t size)
320{
321 switch (op) {
322 case KGSL_CACHE_OP_FLUSH:
323 outer_flush_range(addr, addr + size);
324 break;
325 case KGSL_CACHE_OP_CLEAN:
326 outer_clean_range(addr, addr + size);
327 break;
328 case KGSL_CACHE_OP_INV:
329 outer_inv_range(addr, addr + size);
330 break;
331 }
332}
333
334static void outer_cache_range_op_sg(struct scatterlist *sg, int sglen, int op)
335{
336 struct scatterlist *s;
337 int i;
338
339 for_each_sg(sg, s, sglen, i) {
340 unsigned int paddr = kgsl_get_sg_pa(s);
341 _outer_cache_range_op(op, paddr, s->length);
342 }
343}
344
345#else
346static void outer_cache_range_op_sg(struct scatterlist *sg, int sglen, int op)
347{
348}
349#endif
350
351static int kgsl_page_alloc_vmfault(struct kgsl_memdesc *memdesc,
352 struct vm_area_struct *vma,
353 struct vm_fault *vmf)
354{
355 int i, pgoff;
356 struct scatterlist *s = memdesc->sg;
357 unsigned int offset;
358
359 offset = ((unsigned long) vmf->virtual_address - vma->vm_start);
360
361 if (offset >= memdesc->size)
362 return VM_FAULT_SIGBUS;
363
364 pgoff = offset >> PAGE_SHIFT;
365
366 /*
367 * The sglist might be comprised of mixed blocks of memory depending
368 * on how many 64K pages were allocated. This means we have to do math
369 * to find the actual 4K page to map in user space
370 */
371
372 for (i = 0; i < memdesc->sglen; i++) {
373 int npages = s->length >> PAGE_SHIFT;
374
375 if (pgoff < npages) {
376 struct page *page = sg_page(s);
377
378 page = nth_page(page, pgoff);
379
380 get_page(page);
381 vmf->page = page;
382
383 return 0;
384 }
385
386 pgoff -= npages;
387 s = sg_next(s);
388 }
389
390 return VM_FAULT_SIGBUS;
391}
392
393static int kgsl_page_alloc_vmflags(struct kgsl_memdesc *memdesc)
394{
395 return VM_RESERVED | VM_DONTEXPAND;
396}
397
398static int kgsl_contiguous_vmflags(struct kgsl_memdesc *memdesc)
399{
400 return VM_RESERVED | VM_IO | VM_PFNMAP | VM_DONTEXPAND;
401}
402
403/*
404 * kgsl_page_alloc_unmap_kernel() - Unmap the memory in memdesc
405 *
406 * @memdesc: The memory descriptor which contains information about the memory
407 *
408 * Unmaps the memory mapped into kernel address space
409 */
410static void kgsl_page_alloc_unmap_kernel(struct kgsl_memdesc *memdesc)
411{
412 mutex_lock(&kernel_map_global_lock);
413 if (!memdesc->hostptr) {
414 BUG_ON(memdesc->hostptr_count);
415 goto done;
416 }
417 memdesc->hostptr_count--;
418 if (memdesc->hostptr_count)
419 goto done;
420 vunmap(memdesc->hostptr);
421 kgsl_driver.stats.vmalloc -= memdesc->size;
422 memdesc->hostptr = NULL;
423done:
424 mutex_unlock(&kernel_map_global_lock);
425}
426
427static void kgsl_page_alloc_free(struct kgsl_memdesc *memdesc)
428{
429 int i = 0;
430 struct scatterlist *sg;
431 int sglen = memdesc->sglen;
432
433 kgsl_driver.stats.page_alloc -= memdesc->size;
434
435 kgsl_page_alloc_unmap_kernel(memdesc);
436 /* we certainly do not expect the hostptr to still be mapped */
437 BUG_ON(memdesc->hostptr);
438
439 if (memdesc->sg)
440 for_each_sg(memdesc->sg, sg, sglen, i)
441 __free_pages(sg_page(sg), get_order(sg->length));
442}
443
444/*
445 * kgsl_page_alloc_map_kernel - Map the memory in memdesc to kernel address
446 * space
447 *
448 * @memdesc - The memory descriptor which contains information about the memory
449 *
450 * Return: 0 on success else error code
451 */
452static int kgsl_page_alloc_map_kernel(struct kgsl_memdesc *memdesc)
453{
454 int ret = 0;
455
456 mutex_lock(&kernel_map_global_lock);
457 if (!memdesc->hostptr) {
458 pgprot_t page_prot = pgprot_writecombine(PAGE_KERNEL);
459 struct page **pages = NULL;
460 struct scatterlist *sg;
461 int npages = PAGE_ALIGN(memdesc->size) >> PAGE_SHIFT;
462 int sglen = memdesc->sglen;
463 int i, count = 0;
464
465 /* create a list of pages to call vmap */
466 pages = vmalloc(npages * sizeof(struct page *));
467 if (!pages) {
468 KGSL_CORE_ERR("vmalloc(%d) failed\n",
469 npages * sizeof(struct page *));
470 ret = -ENOMEM;
471 goto done;
472 }
473
474 for_each_sg(memdesc->sg, sg, sglen, i) {
475 struct page *page = sg_page(sg);
476 int j;
477
478 for (j = 0; j < sg->length >> PAGE_SHIFT; j++)
479 pages[count++] = page++;
480 }
481
482
483 memdesc->hostptr = vmap(pages, count,
484 VM_IOREMAP, page_prot);
485 if (memdesc->hostptr)
486 KGSL_STATS_ADD(memdesc->size, kgsl_driver.stats.vmalloc,
487 kgsl_driver.stats.vmalloc_max);
488 else
489 ret = -ENOMEM;
490 vfree(pages);
491 }
492 if (memdesc->hostptr)
493 memdesc->hostptr_count++;
494done:
495 mutex_unlock(&kernel_map_global_lock);
496
497 return ret;
498}
499
500static int kgsl_contiguous_vmfault(struct kgsl_memdesc *memdesc,
501 struct vm_area_struct *vma,
502 struct vm_fault *vmf)
503{
504 unsigned long offset, pfn;
505 int ret;
506
507 offset = ((unsigned long) vmf->virtual_address - vma->vm_start) >>
508 PAGE_SHIFT;
509
510 pfn = (memdesc->physaddr >> PAGE_SHIFT) + offset;
511 ret = vm_insert_pfn(vma, (unsigned long) vmf->virtual_address, pfn);
512
513 if (ret == -ENOMEM || ret == -EAGAIN)
514 return VM_FAULT_OOM;
515 else if (ret == -EFAULT)
516 return VM_FAULT_SIGBUS;
517
518 return VM_FAULT_NOPAGE;
519}
520
521static void kgsl_ebimem_unmap_kernel(struct kgsl_memdesc *memdesc)
522{
523 mutex_lock(&kernel_map_global_lock);
524 if (!memdesc->hostptr) {
525 BUG_ON(memdesc->hostptr_count);
526 goto done;
527 }
528 memdesc->hostptr_count--;
529 if (memdesc->hostptr_count)
530 goto done;
531
532 iounmap(memdesc->hostptr);
533 memdesc->hostptr = NULL;
534done:
535 mutex_unlock(&kernel_map_global_lock);
536}
537
538static void kgsl_ebimem_free(struct kgsl_memdesc *memdesc)
539
540{
541 kgsl_driver.stats.coherent -= memdesc->size;
542 kgsl_ebimem_unmap_kernel(memdesc);
543 /* we certainly do not expect the hostptr to still be mapped */
544 BUG_ON(memdesc->hostptr);
545
546 free_contiguous_memory_by_paddr(memdesc->physaddr);
547}
548
549static int kgsl_ebimem_map_kernel(struct kgsl_memdesc *memdesc)
550{
551 int ret = 0;
552 mutex_lock(&kernel_map_global_lock);
553 if (!memdesc->hostptr) {
554 memdesc->hostptr = ioremap(memdesc->physaddr, memdesc->size);
555 if (!memdesc->hostptr) {
556 KGSL_CORE_ERR("ioremap failed, addr:0x%p, size:0x%x\n",
557 memdesc->hostptr, memdesc->size);
558 ret = -ENOMEM;
559 goto done;
560 }
561 }
562 memdesc->hostptr_count++;
563done:
564 mutex_unlock(&kernel_map_global_lock);
565 return ret;
566}
567
568static void kgsl_coherent_free(struct kgsl_memdesc *memdesc)
569{
570 kgsl_driver.stats.coherent -= memdesc->size;
571 dma_free_coherent(NULL, memdesc->size,
572 memdesc->hostptr, memdesc->physaddr);
573}
574
575/* Global - also used by kgsl_drm.c */
576struct kgsl_memdesc_ops kgsl_page_alloc_ops = {
577 .free = kgsl_page_alloc_free,
578 .vmflags = kgsl_page_alloc_vmflags,
579 .vmfault = kgsl_page_alloc_vmfault,
580 .map_kernel = kgsl_page_alloc_map_kernel,
581 .unmap_kernel = kgsl_page_alloc_unmap_kernel,
582};
583EXPORT_SYMBOL(kgsl_page_alloc_ops);
584
585static struct kgsl_memdesc_ops kgsl_ebimem_ops = {
586 .free = kgsl_ebimem_free,
587 .vmflags = kgsl_contiguous_vmflags,
588 .vmfault = kgsl_contiguous_vmfault,
589 .map_kernel = kgsl_ebimem_map_kernel,
590 .unmap_kernel = kgsl_ebimem_unmap_kernel,
591};
592
593static struct kgsl_memdesc_ops kgsl_coherent_ops = {
594 .free = kgsl_coherent_free,
595};
596
597void kgsl_cache_range_op(struct kgsl_memdesc *memdesc, int op)
598{
599 /*
600 * If the buffer is mapped in the kernel operate on that address
601 * otherwise use the user address
602 */
603
604 void *addr = (memdesc->hostptr) ?
605 memdesc->hostptr : (void *) memdesc->useraddr;
606
607 int size = memdesc->size;
608
609 if (addr != NULL) {
610 switch (op) {
611 case KGSL_CACHE_OP_FLUSH:
612 dmac_flush_range(addr, addr + size);
613 break;
614 case KGSL_CACHE_OP_CLEAN:
615 dmac_clean_range(addr, addr + size);
616 break;
617 case KGSL_CACHE_OP_INV:
618 dmac_inv_range(addr, addr + size);
619 break;
620 }
621 }
622 outer_cache_range_op_sg(memdesc->sg, memdesc->sglen, op);
623}
624EXPORT_SYMBOL(kgsl_cache_range_op);
625
626static int
627_kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc,
628 struct kgsl_pagetable *pagetable,
629 size_t size)
630{
631 int pcount = 0, order, ret = 0;
632 int j, len, page_size, sglen_alloc, sglen = 0;
633 struct page **pages = NULL;
634 pgprot_t page_prot = pgprot_writecombine(PAGE_KERNEL);
635 void *ptr;
636 unsigned int align;
637 int step = ((VMALLOC_END - VMALLOC_START)/8) >> PAGE_SHIFT;
638
639 align = (memdesc->flags & KGSL_MEMALIGN_MASK) >> KGSL_MEMALIGN_SHIFT;
640
641 page_size = (align >= ilog2(SZ_64K) && size >= SZ_64K)
642 ? SZ_64K : PAGE_SIZE;
643 /* update align flags for what we actually use */
644 if (page_size != PAGE_SIZE)
645 kgsl_memdesc_set_align(memdesc, ilog2(page_size));
646
647 /*
648 * There needs to be enough room in the sg structure to be able to
649 * service the allocation entirely with PAGE_SIZE sized chunks
650 */
651
652 sglen_alloc = PAGE_ALIGN(size) >> PAGE_SHIFT;
653
654 memdesc->size = size;
655 memdesc->pagetable = pagetable;
656 memdesc->ops = &kgsl_page_alloc_ops;
657
658 memdesc->sglen_alloc = sglen_alloc;
659 memdesc->sg = kgsl_sg_alloc(memdesc->sglen_alloc);
660
661 if (memdesc->sg == NULL) {
662 ret = -ENOMEM;
663 goto done;
664 }
665
666 /*
667 * Allocate space to store the list of pages to send to vmap.
668 * This is an array of pointers so we can t rack 1024 pages per page
669 * of allocation. Since allocations can be as large as the user dares,
670 * we have to use the kmalloc/vmalloc trick here to make sure we can
671 * get the memory we need.
672 */
673
674 if ((memdesc->sglen_alloc * sizeof(struct page *)) > PAGE_SIZE)
675 pages = vmalloc(memdesc->sglen_alloc * sizeof(struct page *));
676 else
677 pages = kmalloc(PAGE_SIZE, GFP_KERNEL);
678
679 if (pages == NULL) {
680 ret = -ENOMEM;
681 goto done;
682 }
683
684 kmemleak_not_leak(memdesc->sg);
685
686 sg_init_table(memdesc->sg, memdesc->sglen_alloc);
687
688 len = size;
689
690 while (len > 0) {
691 struct page *page;
692 unsigned int gfp_mask = __GFP_HIGHMEM;
693 int j;
694
695 /* don't waste space at the end of the allocation*/
696 if (len < page_size)
697 page_size = PAGE_SIZE;
698
699 /*
700 * Don't do some of the more aggressive memory recovery
701 * techniques for large order allocations
702 */
703 if (page_size != PAGE_SIZE)
704 gfp_mask |= __GFP_COMP | __GFP_NORETRY |
705 __GFP_NO_KSWAPD | __GFP_NOWARN;
706 else
707 gfp_mask |= GFP_KERNEL;
708
709 page = alloc_pages(gfp_mask, get_order(page_size));
710
711 if (page == NULL) {
712 if (page_size != PAGE_SIZE) {
713 page_size = PAGE_SIZE;
714 continue;
715 }
716
717 KGSL_CORE_ERR(
718 "Out of memory: only allocated %dKB of %dKB requested\n",
719 (size - len) >> 10, size >> 10);
720
721 ret = -ENOMEM;
722 goto done;
723 }
724
725 for (j = 0; j < page_size >> PAGE_SHIFT; j++)
726 pages[pcount++] = nth_page(page, j);
727
728 sg_set_page(&memdesc->sg[sglen++], page, page_size, 0);
729 len -= page_size;
730 }
731
732 memdesc->sglen = sglen;
733
734 /*
735 * All memory that goes to the user has to be zeroed out before it gets
736 * exposed to userspace. This means that the memory has to be mapped in
737 * the kernel, zeroed (memset) and then unmapped. This also means that
738 * the dcache has to be flushed to ensure coherency between the kernel
739 * and user pages. We used to pass __GFP_ZERO to alloc_page which mapped
740 * zeroed and unmaped each individual page, and then we had to turn
741 * around and call flush_dcache_page() on that page to clear the caches.
742 * This was killing us for performance. Instead, we found it is much
743 * faster to allocate the pages without GFP_ZERO, map a chunk of the
744 * range ('step' pages), memset it, flush it and then unmap
745 * - this results in a factor of 4 improvement for speed for large
746 * buffers. There is a small decrease in speed for small buffers,
747 * but only on the order of a few microseconds at best. The 'step'
748 * size is based on a guess at the amount of free vmalloc space, but
749 * will scale down if there's not enough free space.
750 */
751 for (j = 0; j < pcount; j += step) {
752 step = min(step, pcount - j);
753
754 ptr = vmap(&pages[j], step, VM_IOREMAP, page_prot);
755
756 if (ptr != NULL) {
757 memset(ptr, 0, step * PAGE_SIZE);
758 dmac_flush_range(ptr, ptr + step * PAGE_SIZE);
759 vunmap(ptr);
760 } else {
761 int k;
762 /* Very, very, very slow path */
763
764 for (k = j; k < j + step; k++) {
765 ptr = kmap_atomic(pages[k]);
766 memset(ptr, 0, PAGE_SIZE);
767 dmac_flush_range(ptr, ptr + PAGE_SIZE);
768 kunmap_atomic(ptr);
769 }
770 /* scale down the step size to avoid this path */
771 if (step > 1)
772 step >>= 1;
773 }
774 }
775
776 outer_cache_range_op_sg(memdesc->sg, memdesc->sglen,
777 KGSL_CACHE_OP_FLUSH);
778
779 KGSL_STATS_ADD(size, kgsl_driver.stats.page_alloc,
780 kgsl_driver.stats.page_alloc_max);
781
782 order = get_order(size);
783
784 if (order < 16)
785 kgsl_driver.stats.histogram[order]++;
786
787done:
788 if ((memdesc->sglen_alloc * sizeof(struct page *)) > PAGE_SIZE)
789 vfree(pages);
790 else
791 kfree(pages);
792
793 if (ret)
794 kgsl_sharedmem_free(memdesc);
795
796 return ret;
797}
798
799int
800kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc,
801 struct kgsl_pagetable *pagetable, size_t size)
802{
803 int ret = 0;
804 BUG_ON(size == 0);
805
806 size = ALIGN(size, PAGE_SIZE * 2);
807 if (size == 0)
808 return -EINVAL;
809
810 ret = _kgsl_sharedmem_page_alloc(memdesc, pagetable, size);
811 if (!ret)
812 ret = kgsl_page_alloc_map_kernel(memdesc);
813 if (ret)
814 kgsl_sharedmem_free(memdesc);
815 return ret;
816}
817EXPORT_SYMBOL(kgsl_sharedmem_page_alloc);
818
819int
820kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc,
821 struct kgsl_pagetable *pagetable,
822 size_t size)
823{
824 size = PAGE_ALIGN(size);
825 if (size == 0)
826 return -EINVAL;
827
828 return _kgsl_sharedmem_page_alloc(memdesc, pagetable, size);
829}
830EXPORT_SYMBOL(kgsl_sharedmem_page_alloc_user);
831
832int
833kgsl_sharedmem_alloc_coherent(struct kgsl_memdesc *memdesc, size_t size)
834{
835 int result = 0;
836
837 size = ALIGN(size, PAGE_SIZE);
838 if (size == 0)
839 return -EINVAL;
840
841 memdesc->size = size;
842 memdesc->ops = &kgsl_coherent_ops;
843
844 memdesc->hostptr = dma_alloc_coherent(NULL, size, &memdesc->physaddr,
845 GFP_KERNEL);
846 if (memdesc->hostptr == NULL) {
847 KGSL_CORE_ERR("dma_alloc_coherent(%d) failed\n", size);
848 result = -ENOMEM;
849 goto err;
850 }
851
852 result = memdesc_sg_phys(memdesc, memdesc->physaddr, size);
853 if (result)
854 goto err;
855
856 /* Record statistics */
857
858 KGSL_STATS_ADD(size, kgsl_driver.stats.coherent,
859 kgsl_driver.stats.coherent_max);
860
861err:
862 if (result)
863 kgsl_sharedmem_free(memdesc);
864
865 return result;
866}
867EXPORT_SYMBOL(kgsl_sharedmem_alloc_coherent);
868
869void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc)
870{
871 if (memdesc == NULL || memdesc->size == 0)
872 return;
873
874 if (memdesc->gpuaddr) {
875 kgsl_mmu_unmap(memdesc->pagetable, memdesc);
876 kgsl_mmu_put_gpuaddr(memdesc->pagetable, memdesc);
877 }
878
879 if (memdesc->ops && memdesc->ops->free)
880 memdesc->ops->free(memdesc);
881
882 kgsl_sg_free(memdesc->sg, memdesc->sglen_alloc);
883
884 memset(memdesc, 0, sizeof(*memdesc));
885}
886EXPORT_SYMBOL(kgsl_sharedmem_free);
887
888static int
889_kgsl_sharedmem_ebimem(struct kgsl_memdesc *memdesc,
890 struct kgsl_pagetable *pagetable, size_t size)
891{
892 int result = 0;
893
894 memdesc->size = size;
895 memdesc->pagetable = pagetable;
896 memdesc->ops = &kgsl_ebimem_ops;
897 memdesc->physaddr = allocate_contiguous_ebi_nomap(size, SZ_8K);
898
899 if (memdesc->physaddr == 0) {
900 KGSL_CORE_ERR("allocate_contiguous_ebi_nomap(%d) failed\n",
901 size);
902 return -ENOMEM;
903 }
904
905 result = memdesc_sg_phys(memdesc, memdesc->physaddr, size);
906
907 if (result)
908 goto err;
909
910 KGSL_STATS_ADD(size, kgsl_driver.stats.coherent,
911 kgsl_driver.stats.coherent_max);
912
913err:
914 if (result)
915 kgsl_sharedmem_free(memdesc);
916
917 return result;
918}
919
920int
921kgsl_sharedmem_ebimem_user(struct kgsl_memdesc *memdesc,
922 struct kgsl_pagetable *pagetable,
923 size_t size)
924{
925 size = ALIGN(size, PAGE_SIZE);
926 if (size == 0)
927 return -EINVAL;
928
929 return _kgsl_sharedmem_ebimem(memdesc, pagetable, size);
930}
931EXPORT_SYMBOL(kgsl_sharedmem_ebimem_user);
932
933int
934kgsl_sharedmem_ebimem(struct kgsl_memdesc *memdesc,
935 struct kgsl_pagetable *pagetable, size_t size)
936{
937 int result;
938 size = ALIGN(size, 8192);
939 if (size == 0)
940 return -EINVAL;
941
942 result = _kgsl_sharedmem_ebimem(memdesc, pagetable, size);
943
944 if (result)
945 return result;
946
947 result = kgsl_ebimem_map_kernel(memdesc);
948
949 if (result) {
950 KGSL_CORE_ERR("hostptr mapping failed\n");
951 kgsl_sharedmem_free(memdesc);
952 return result;
953 }
954
955 return 0;
956}
957EXPORT_SYMBOL(kgsl_sharedmem_ebimem);
958
959int
960kgsl_sharedmem_readl(const struct kgsl_memdesc *memdesc,
961 uint32_t *dst,
962 unsigned int offsetbytes)
963{
964 uint32_t *src;
965 BUG_ON(memdesc == NULL || memdesc->hostptr == NULL || dst == NULL);
966 WARN_ON(offsetbytes % sizeof(uint32_t) != 0);
967 if (offsetbytes % sizeof(uint32_t) != 0)
968 return -EINVAL;
969
970 WARN_ON(offsetbytes + sizeof(uint32_t) > memdesc->size);
971 if (offsetbytes + sizeof(uint32_t) > memdesc->size)
972 return -ERANGE;
973 src = (uint32_t *)(memdesc->hostptr + offsetbytes);
974 *dst = *src;
975 return 0;
976}
977EXPORT_SYMBOL(kgsl_sharedmem_readl);
978
979int
980kgsl_sharedmem_writel(struct kgsl_device *device,
981 const struct kgsl_memdesc *memdesc,
982 unsigned int offsetbytes,
983 uint32_t src)
984{
985 uint32_t *dst;
986 BUG_ON(memdesc == NULL || memdesc->hostptr == NULL);
987 WARN_ON(offsetbytes % sizeof(uint32_t) != 0);
988 if (offsetbytes % sizeof(uint32_t) != 0)
989 return -EINVAL;
990
991 WARN_ON(offsetbytes + sizeof(uint32_t) > memdesc->size);
992 if (offsetbytes + sizeof(uint32_t) > memdesc->size)
993 return -ERANGE;
994 kgsl_cffdump_setmem(device,
995 memdesc->gpuaddr + offsetbytes,
996 src, sizeof(uint32_t));
997 dst = (uint32_t *)(memdesc->hostptr + offsetbytes);
998 *dst = src;
999 return 0;
1000}
1001EXPORT_SYMBOL(kgsl_sharedmem_writel);
1002
1003int
1004kgsl_sharedmem_set(struct kgsl_device *device,
1005 const struct kgsl_memdesc *memdesc, unsigned int offsetbytes,
1006 unsigned int value, unsigned int sizebytes)
1007{
1008 BUG_ON(memdesc == NULL || memdesc->hostptr == NULL);
1009 BUG_ON(offsetbytes + sizebytes > memdesc->size);
1010
1011 kgsl_cffdump_setmem(device,
1012 memdesc->gpuaddr + offsetbytes, value,
1013 sizebytes);
1014 memset(memdesc->hostptr + offsetbytes, value, sizebytes);
1015 return 0;
1016}
1017EXPORT_SYMBOL(kgsl_sharedmem_set);
1018
1019/*
1020 * kgsl_sharedmem_map_vma - Map a user vma to physical memory
1021 *
1022 * @vma - The user vma to map
1023 * @memdesc - The memory descriptor which contains information about the
1024 * physical memory
1025 *
1026 * Return: 0 on success else error code
1027 */
1028int
1029kgsl_sharedmem_map_vma(struct vm_area_struct *vma,
1030 const struct kgsl_memdesc *memdesc)
1031{
1032 unsigned long addr = vma->vm_start;
1033 unsigned long size = vma->vm_end - vma->vm_start;
1034 int ret, i = 0;
1035
1036 if (!memdesc->sg || (size != memdesc->size) ||
1037 (memdesc->sglen != (size / PAGE_SIZE)))
1038 return -EINVAL;
1039
1040 for (; addr < vma->vm_end; addr += PAGE_SIZE, i++) {
1041 ret = vm_insert_page(vma, addr, sg_page(&memdesc->sg[i]));
1042 if (ret)
1043 return ret;
1044 }
1045 return 0;
1046}
1047EXPORT_SYMBOL(kgsl_sharedmem_map_vma);
1048
1049static const char * const memtype_str[] = {
1050 [KGSL_MEMTYPE_OBJECTANY] = "any(0)",
1051 [KGSL_MEMTYPE_FRAMEBUFFER] = "framebuffer",
1052 [KGSL_MEMTYPE_RENDERBUFFER] = "renderbuffer",
1053 [KGSL_MEMTYPE_ARRAYBUFFER] = "arraybuffer",
1054 [KGSL_MEMTYPE_ELEMENTARRAYBUFFER] = "elementarraybuffer",
1055 [KGSL_MEMTYPE_VERTEXARRAYBUFFER] = "vertexarraybuffer",
1056 [KGSL_MEMTYPE_TEXTURE] = "texture",
1057 [KGSL_MEMTYPE_SURFACE] = "surface",
1058 [KGSL_MEMTYPE_EGL_SURFACE] = "egl_surface",
1059 [KGSL_MEMTYPE_GL] = "gl",
1060 [KGSL_MEMTYPE_CL] = "cl",
1061 [KGSL_MEMTYPE_CL_BUFFER_MAP] = "cl_buffer_map",
1062 [KGSL_MEMTYPE_CL_BUFFER_NOMAP] = "cl_buffer_nomap",
1063 [KGSL_MEMTYPE_CL_IMAGE_MAP] = "cl_image_map",
1064 [KGSL_MEMTYPE_CL_IMAGE_NOMAP] = "cl_image_nomap",
1065 [KGSL_MEMTYPE_CL_KERNEL_STACK] = "cl_kernel_stack",
1066 [KGSL_MEMTYPE_COMMAND] = "command",
1067 [KGSL_MEMTYPE_2D] = "2d",
1068 [KGSL_MEMTYPE_EGL_IMAGE] = "egl_image",
1069 [KGSL_MEMTYPE_EGL_SHADOW] = "egl_shadow",
1070 [KGSL_MEMTYPE_MULTISAMPLE] = "egl_multisample",
1071 /* KGSL_MEMTYPE_KERNEL handled below, to avoid huge array */
1072};
1073
1074void kgsl_get_memory_usage(char *name, size_t name_size, unsigned int memflags)
1075{
1076 unsigned char type;
1077
1078 type = (memflags & KGSL_MEMTYPE_MASK) >> KGSL_MEMTYPE_SHIFT;
1079 if (type == KGSL_MEMTYPE_KERNEL)
1080 strlcpy(name, "kernel", name_size);
1081 else if (type < ARRAY_SIZE(memtype_str) && memtype_str[type] != NULL)
1082 strlcpy(name, memtype_str[type], name_size);
1083 else
1084 snprintf(name, name_size, "unknown(%3d)", type);
1085}
1086EXPORT_SYMBOL(kgsl_get_memory_usage);