diff options
author | Carter Cooper <ccooper@codeaurora.org> | 2015-09-15 14:13:35 -0600 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:13:39 -0700 |
commit | 048fc95836a4fd0509a5a378b59b24bffb7c3b6c (patch) | |
tree | 4286b5d539331356de7b8d8d14da4ece9ffa2301 /drivers/gpu/msm/kgsl_sharedmem.c | |
parent | eaa62a6847a4a26f53cf371a04c3671fcd802bab (diff) |
msm: kgsl: Rework page allocation sizes
Alignment checks only need to be done once and can be moved down to
the lower layers.
Change-Id: Ia4683cf9db08506db810e80854c006d94dc80310
Signed-off-by: Carter Cooper <ccooper@codeaurora.org>
Diffstat (limited to 'drivers/gpu/msm/kgsl_sharedmem.c')
-rw-r--r-- | drivers/gpu/msm/kgsl_sharedmem.c | 54 |
1 files changed, 23 insertions, 31 deletions
diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 9032035fe966..3ee782e96f6c 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -26,6 +26,7 @@ #include "kgsl_cffdump.h" #include "kgsl_device.h" #include "kgsl_log.h" +#include "kgsl_mmu.h" /* * The user can set this from debugfs to force failed memory allocations to @@ -311,6 +312,13 @@ kgsl_sharedmem_init_sysfs(void) drv_attr_list); } +static int kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, + struct kgsl_pagetable *pagetable, + uint64_t size); + +static int kgsl_cma_alloc_secure(struct kgsl_device *device, + struct kgsl_memdesc *memdesc, uint64_t size); + static int kgsl_allocate_secure(struct kgsl_device *device, struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, @@ -332,13 +340,11 @@ int kgsl_allocate_user(struct kgsl_device *device, { int ret; - if (size == 0) - return -EINVAL; - memdesc->flags = flags; if (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_NONE) - ret = kgsl_cma_alloc_coherent(device, memdesc, pagetable, size); + ret = kgsl_sharedmem_alloc_contig(device, memdesc, + pagetable, size); else if (flags & KGSL_MEMFLAGS_SECURE) ret = kgsl_allocate_secure(device, memdesc, pagetable, size); else @@ -672,7 +678,7 @@ static inline int get_page_size(size_t size, unsigned int align) #endif static int -_kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc, +kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, uint64_t size) { @@ -685,6 +691,10 @@ _kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc, unsigned int align; unsigned int step = ((VMALLOC_END - VMALLOC_START)/8) >> PAGE_SHIFT; + size = PAGE_ALIGN(size); + if (size == 0 || size > UINT_MAX) + return -EINVAL; + align = (memdesc->flags & KGSL_MEMALIGN_MASK) >> KGSL_MEMALIGN_SHIFT; page_size = get_page_size(size, align); @@ -697,9 +707,6 @@ _kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc, if (align < ilog2(page_size)) kgsl_memdesc_set_align(memdesc, ilog2(page_size)); - if (size > SIZE_MAX) - return -EINVAL; - /* * There needs to be enough room in the page array to be able to * service the allocation entirely with PAGE_SIZE sized chunks @@ -874,19 +881,6 @@ done: return ret; } -int -kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, - uint64_t size) -{ - size = PAGE_ALIGN(size); - if (size == 0) - return -EINVAL; - - return _kgsl_sharedmem_page_alloc(memdesc, pagetable, size); -} -EXPORT_SYMBOL(kgsl_sharedmem_page_alloc_user); - void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc) { if (memdesc == NULL || memdesc->size == 0) @@ -1071,14 +1065,13 @@ void kgsl_get_memory_usage(char *name, size_t name_size, uint64_t memflags) } EXPORT_SYMBOL(kgsl_get_memory_usage); -int kgsl_cma_alloc_coherent(struct kgsl_device *device, +int kgsl_sharedmem_alloc_contig(struct kgsl_device *device, struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, uint64_t size) { int result = 0; - size = ALIGN(size, PAGE_SIZE); - + size = PAGE_ALIGN(size); if (size == 0 || size > SIZE_MAX) return -EINVAL; @@ -1101,6 +1094,9 @@ int kgsl_cma_alloc_coherent(struct kgsl_device *device, /* Record statistics */ + if (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_NONE) + memdesc->gpuaddr = memdesc->physaddr; + KGSL_STATS_ADD(size, &kgsl_driver.stats.coherent, &kgsl_driver.stats.coherent_max); @@ -1110,7 +1106,7 @@ err: return result; } -EXPORT_SYMBOL(kgsl_cma_alloc_coherent); +EXPORT_SYMBOL(kgsl_sharedmem_alloc_contig); static int scm_lock_chunk(struct kgsl_memdesc *memdesc, int lock) { @@ -1166,7 +1162,7 @@ static int scm_lock_chunk(struct kgsl_memdesc *memdesc, int lock) return result; } -int kgsl_cma_alloc_secure(struct kgsl_device *device, +static int kgsl_cma_alloc_secure(struct kgsl_device *device, struct kgsl_memdesc *memdesc, uint64_t size) { struct kgsl_iommu *iommu = device->mmu.priv; @@ -1174,14 +1170,11 @@ int kgsl_cma_alloc_secure(struct kgsl_device *device, struct kgsl_pagetable *pagetable = device->mmu.securepagetable; size_t aligned; - if (size == 0) - return -EINVAL; - /* Align size to 1M boundaries */ aligned = ALIGN(size, SZ_1M); /* The SCM call uses an unsigned int for the size */ - if (aligned > UINT_MAX) + if (aligned == 0 || aligned > UINT_MAX) return -EINVAL; /* @@ -1232,7 +1225,6 @@ err: return result; } -EXPORT_SYMBOL(kgsl_cma_alloc_secure); /** * kgsl_cma_unlock_secure() - Unlock secure memory by calling TZ |