summaryrefslogtreecommitdiff
path: root/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
diff options
context:
space:
mode:
authorXianzhong <b07117@freescale.com>2014-03-18 21:54:26 +0800
committerLoren Huang <b02279@freescale.com>2014-08-15 11:25:00 +0800
commit1b41d9ccb39a443f2fb50241ff8d3752eedfef0d (patch)
tree8a027f782f91aa7b7da120ce5ff12a0879fd4a42 /drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
parentee7c962b5ef2840fe5df7ef31c0b27e270eaa96a (diff)
ENGR00309915 [#1087] enhanced video memory mutex
this patch can fix NULL pointer issue in GPU kernel driver with the following log [<7f240438>] (gckEVENT_AddList+0x0/0x810 [galcore]) from [<7f239ebc>] (gckCOMMAND_Commit+0xf28/0x118c [galcore]) [<7f238f94>] (gckCOMMAND_Commit+0x0/0x118c [galcore]) from [<7f2362dc>] (gckKERNEL_Dispatch+0x120c/0x24e4 [galcore]) [<7f2350d0>] (gckKERNEL_Dispatch+0x0/0x24e4 [galcore]) from [<7f222280>] (drv_ioctl+0x390/0x540 [galcore]) [<7f221ef0>] (drv_ioctl+0x0/0x540 [galcore]) from [<800facd0>] (vfs_ioctl+0x30/0x44) The false code is at 0x217bc where the 0-pointer happens (r3 = 0) gcuVIDMEM_NODE_PTR node = (gcuVIDMEM_NODE_PTR)(gcmUINT64_TO_PTR(Record->info.u.FreeVideoMemory.node)); 217b8: e5953028 ldr r3, [r5, #40] ; 0x28 if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM) 217bc: e5932000 ldr r2, [r3] 217c0: e5922000 ldr r2, [r2] 217c4: e152000a cmp r2, sl { gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(Event->kernel, Date: Apr 23, 2014 Signed-off-by: Xianzhong <b07117@freescale.com> Acked-by: Jason Liu (cherry picked from commit fcde214d8c793d4dd785e47175b5833f1f3f5f1f) (cherry picked from commit 952142648d76fce2663ef649d9f988f1b7809815) (cherry picked from commit 9d7b33678f1f944f75644e958c3ceeb7f2e4bac9)
Diffstat (limited to 'drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c')
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
index 879d467e3620..8cee145f1c15 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
@@ -165,6 +165,8 @@ gckKERNEL_Construct(
kernel->dvfs = gcvNULL;
#endif
+ kernel->vidmemMutex = gcvNULL;
+
/* Initialize the gckKERNEL object. */
kernel->object.type = gcvOBJ_KERNEL;
kernel->os = Os;
@@ -297,6 +299,9 @@ gckKERNEL_Construct(
gcmkONERROR(gckOS_CreateSyncTimeline(Os, &kernel->timeline));
#endif
+ /* Construct a video memory mutex. */
+ gcmkONERROR(gckOS_CreateMutex(Os, &kernel->vidmemMutex));
+
/* Return pointer to the gckKERNEL object. */
*Kernel = kernel;
@@ -518,6 +523,8 @@ gckKERNEL_Destroy(
gcmkVERIFY_OK(gckOS_DestroySyncTimeline(Kernel->os, Kernel->timeline));
#endif
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->vidmemMutex));
+
/* Mark the gckKERNEL object as unknown. */
Kernel->object.type = gcvOBJ_UNKNOWN;
@@ -767,7 +774,7 @@ _AllocateMemory_Retry:
{
gckOS_Print("gpu virtual memory 0x%x cannot be allocated in force contiguous request!\n", physAddr);
- gcmkONERROR(gckVIDMEM_Free(node));
+ gcmkONERROR(gckVIDMEM_Free(Kernel, node));
node = gcvNULL;
}
@@ -797,7 +804,8 @@ _AllocateMemory_Retry:
if (gcmIS_SUCCESS(status))
{
/* Allocate memory. */
- status = gckVIDMEM_AllocateLinear(videoMemory,
+ status = gckVIDMEM_AllocateLinear(Kernel,
+ videoMemory,
Bytes,
Alignment,
Type,
@@ -1251,7 +1259,7 @@ gckKERNEL_Dispatch(
#endif
/* Free video memory. */
gcmkONERROR(
- gckVIDMEM_Free(node));
+ gckVIDMEM_Free(Kernel, node));
gcmkONERROR(
gckKERNEL_RemoveProcessDB(Kernel,