summaryrefslogtreecommitdiff
path: root/drivers/mxc/gpu-viv
diff options
context:
space:
mode:
authorXianzhong <b07117@freescale.com>2013-08-23 20:36:45 +0800
committerLoren HUANG <b02279@freescale.com>2013-10-31 13:59:27 +0800
commit9ac20c8edb8660c19198d278bf74183ef4bab5d3 (patch)
tree50fa401b493aad6b39d63cb6a81dfc01d81364af /drivers/mxc/gpu-viv
parent02adf1cf9cdd823c18bbafbd78fabc2b5cb81d5d (diff)
ENGR00274478 fix gpu memory multi-lock failure
this issue cause system boot with multi-user switch on JB4.3, root cause is gpu memory cannot be multi-locked in same process, gpu memory lock reference is added to allow multi-lock in kernel driver. Signed-off-by: Xianzhong <b07117@freescale.com> Acked-by: Jason Liu
Diffstat (limited to 'drivers/mxc/gpu-viv')
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c18
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h1
2 files changed, 16 insertions, 3 deletions
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
index 331c73f8d3ad..7f41087f62a1 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
@@ -375,9 +375,10 @@ _CreateMdlMap(
return gcvNULL;
}
- mdlMap->pid = ProcessID;
- mdlMap->vmaAddr = gcvNULL;
- mdlMap->vma = gcvNULL;
+ mdlMap->pid = ProcessID;
+ mdlMap->vmaAddr = gcvNULL;
+ mdlMap->vma = gcvNULL;
+ mdlMap->reference = 0;
mdlMap->next = Mdl->maps;
Mdl->maps = mdlMap;
@@ -4431,6 +4432,8 @@ gckOS_LockPages(
up_write(&current->mm->mmap_sem);
}
+
+#if 0
else
{
/* mdlMap->vmaAddr != gcvNULL means current process has already locked this node. */
@@ -4439,6 +4442,7 @@ gckOS_LockPages(
gcmkFOOTER_ARG("*status=%d, mdlMap->vmaAddr=%x", gcvSTATUS_MEMORY_LOCKED, mdlMap->vmaAddr);
return gcvSTATUS_MEMORY_LOCKED;
}
+#endif
/* Convert pointer to MDL. */
*Logical = mdlMap->vmaAddr;
@@ -4449,6 +4453,9 @@ gckOS_LockPages(
*PageCount = mdl->numPages * (PAGE_SIZE / 4096);
+ /* Increase reference count. */
+ mdlMap->reference++;
+
MEMORY_UNLOCK(Os);
gcmkVERIFY_OK(gckOS_CacheFlush(
@@ -4715,6 +4722,11 @@ gckOS_UnlockPages(
{
if ((mdlMap->vmaAddr != gcvNULL) && (_GetProcessID() == mdlMap->pid))
{
+ if (--mdlMap->reference > 0)
+ {
+ continue;
+ }
+
_UnmapUserLogical(mdlMap->pid, mdlMap->vmaAddr, mdl->numPages * PAGE_SIZE);
mdlMap->vmaAddr = gcvNULL;
}
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
index 006632c642e2..501cf30e9273 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
@@ -27,6 +27,7 @@ typedef struct _LINUX_MDL_MAP
gctINT pid;
gctPOINTER vmaAddr;
struct vm_area_struct * vma;
+ gctINT reference;
struct _LINUX_MDL_MAP * next;
}
LINUX_MDL_MAP;