From 955f852d648f8f82847a8d03355ad40b3325c8fa Mon Sep 17 00:00:00 2001 From: Jeremy Gebben Date: Mon, 24 Sep 2012 13:05:39 -0600 Subject: [PATCH] msm: kgsl: set userspace memory type on each memdesc Userspace passes a set of values indicating how it uses each buffer it allocates, which were previously ignored. These are useful hints for debugging and profiling applications. These flags will be exposed through ftrace and debugfs in later patches. Change-Id: Ie26c26e413c074dcd5dfa24d355443ee47c3cd6a Signed-off-by: Shubhraprakash Das Signed-off-by: Jeremy Gebben --- drivers/gpu/msm/kgsl.c | 2 ++ drivers/gpu/msm/kgsl_mmu.c | 3 ++- drivers/gpu/msm/kgsl_sharedmem.c | 1 - drivers/gpu/msm/kgsl_sharedmem.h | 14 ++++++++++---- include/linux/msm_kgsl.h | 32 +++++++++++++++++++++++++++++--- 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 664d5193a31..5ba844a2da9 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1752,6 +1752,8 @@ static long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv, if (result) goto error; + entry->memdesc.priv |= param->flags & KGSL_MEMTYPE_MASK; + result = kgsl_mmu_map(private->pagetable, &entry->memdesc, GSL_PT_PAGE_RV | GSL_PT_PAGE_WV); diff --git a/drivers/gpu/msm/kgsl_mmu.c b/drivers/gpu/msm/kgsl_mmu.c index 0e1e1008b8b..54ba5adabd9 100644 --- a/drivers/gpu/msm/kgsl_mmu.c +++ b/drivers/gpu/msm/kgsl_mmu.c @@ -729,7 +729,8 @@ int kgsl_mmu_map_global(struct kgsl_pagetable *pagetable, return 0; gpuaddr = memdesc->gpuaddr; - memdesc->priv |= KGSL_MEMFLAGS_GLOBAL; + memdesc->priv |= KGSL_MEMFLAGS_GLOBAL + | (KGSL_MEMTYPE_KERNEL << KGSL_MEMTYPE_SHIFT); result = kgsl_mmu_map(pagetable, memdesc, protflags); if (result) diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index c2ce5c77669..bdc568638a5 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -540,7 +540,6 @@ _kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc, memdesc->size = size; memdesc->pagetable = pagetable; - memdesc->priv = KGSL_MEMFLAGS_CACHED; memdesc->ops = &kgsl_page_alloc_ops; memdesc->sg = kgsl_sg_alloc(sglen); diff --git a/drivers/gpu/msm/kgsl_sharedmem.h b/drivers/gpu/msm/kgsl_sharedmem.h index de89ac1f77f..5a6c4c21ef6 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.h +++ b/drivers/gpu/msm/kgsl_sharedmem.h @@ -27,8 +27,6 @@ struct kgsl_process_private; #define KGSL_CACHE_OP_FLUSH 0x02 #define KGSL_CACHE_OP_CLEAN 0x03 -/** Set if the memdesc describes cached memory */ -#define KGSL_MEMFLAGS_CACHED 0x00000001 /** Set if the memdesc is mapped into all pagetables */ #define KGSL_MEMFLAGS_GLOBAL 0x00000002 @@ -136,6 +134,7 @@ kgsl_allocate(struct kgsl_memdesc *memdesc, { if (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_NONE) return kgsl_sharedmem_ebimem(memdesc, pagetable, size); + memdesc->priv |= (KGSL_MEMTYPE_KERNEL << KGSL_MEMTYPE_SHIFT); return kgsl_sharedmem_page_alloc(memdesc, pagetable, size); } @@ -144,10 +143,17 @@ kgsl_allocate_user(struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, size_t size, unsigned int flags) { + int ret; + unsigned int mask = (KGSL_MEMTYPE_MASK | KGSL_MEMFLAGS_GPUREADONLY); if (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_NONE) - return kgsl_sharedmem_ebimem_user(memdesc, pagetable, size, + ret = kgsl_sharedmem_ebimem_user(memdesc, pagetable, size, flags); - return kgsl_sharedmem_page_alloc_user(memdesc, pagetable, size, flags); + else + ret = kgsl_sharedmem_page_alloc_user(memdesc, pagetable, size, + flags); + if (ret == 0) + memdesc->priv |= flags & mask; + return ret; } static inline int diff --git a/include/linux/msm_kgsl.h b/include/linux/msm_kgsl.h index 71ff6399021..5e1395e519f 100644 --- a/include/linux/msm_kgsl.h +++ b/include/linux/msm_kgsl.h @@ -2,7 +2,7 @@ #define _MSM_KGSL_H #define KGSL_VERSION_MAJOR 3 -#define KGSL_VERSION_MINOR 12 +#define KGSL_VERSION_MINOR 13 /*context flags */ #define KGSL_CONTEXT_SAVE_GMEM 0x00000001 @@ -18,6 +18,33 @@ /* Memory allocayion flags */ #define KGSL_MEMFLAGS_GPUREADONLY 0x01000000 +#define KGSL_MEMTYPE_MASK 0x0000FF00 +#define KGSL_MEMTYPE_SHIFT 8 + +/* Memory types for which allocations are made */ +#define KGSL_MEMTYPE_OBJECTANY 0 +#define KGSL_MEMTYPE_FRAMEBUFFER 1 +#define KGSL_MEMTYPE_RENDERBUFFER 2 +#define KGSL_MEMTYPE_ARRAYBUFFER 3 +#define KGSL_MEMTYPE_ELEMENTARRAYBUFFER 4 +#define KGSL_MEMTYPE_VERTEXARRAYBUFFER 5 +#define KGSL_MEMTYPE_TEXTURE 6 +#define KGSL_MEMTYPE_SURFACE 7 +#define KGSL_MEMTYPE_EGL_SURFACE 8 +#define KGSL_MEMTYPE_GL 9 +#define KGSL_MEMTYPE_CL 10 +#define KGSL_MEMTYPE_CL_BUFFER_MAP 11 +#define KGSL_MEMTYPE_CL_BUFFER_NOMAP 12 +#define KGSL_MEMTYPE_CL_IMAGE_MAP 13 +#define KGSL_MEMTYPE_CL_IMAGE_NOMAP 14 +#define KGSL_MEMTYPE_CL_KERNEL_STACK 15 +#define KGSL_MEMTYPE_COMMAND 16 +#define KGSL_MEMTYPE_2D 17 +#define KGSL_MEMTYPE_EGL_IMAGE 18 +#define KGSL_MEMTYPE_EGL_SHADOW 19 +#define KGSL_MEMTYPE_MULTISAMPLE 20 +#define KGSL_MEMTYPE_KERNEL 255 + /* generic flag values */ #define KGSL_FLAGS_NORMALMODE 0x00000000 #define KGSL_FLAGS_SAFEMODE 0x00000001 @@ -278,8 +305,7 @@ struct kgsl_map_user_mem { unsigned int offset; unsigned int hostptr; /*input param */ enum kgsl_user_mem_type memtype; - unsigned int reserved; /* May be required to add - params for another mem type */ + unsigned int flags; }; #define IOCTL_KGSL_MAP_USER_MEM \