summaryrefslogtreecommitdiff
path: root/drivers/gpu/msm/kgsl_sharedmem.c
diff options
context:
space:
mode:
authorCarter Cooper <ccooper@codeaurora.org>2015-09-15 14:13:35 -0600
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:13:39 -0700
commit048fc95836a4fd0509a5a378b59b24bffb7c3b6c (patch)
tree4286b5d539331356de7b8d8d14da4ece9ffa2301 /drivers/gpu/msm/kgsl_sharedmem.c
parenteaa62a6847a4a26f53cf371a04c3671fcd802bab (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.c54
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