From 1b41d9ccb39a443f2fb50241ff8d3752eedfef0d Mon Sep 17 00:00:00 2001 From: Xianzhong Date: Tue, 18 Mar 2014 21:54:26 +0800 Subject: [PATCH] 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 Acked-by: Jason Liu (cherry picked from commit fcde214d8c793d4dd785e47175b5833f1f3f5f1f) (cherry picked from commit 952142648d76fce2663ef649d9f988f1b7809815) (cherry picked from commit 9d7b33678f1f944f75644e958c3ceeb7f2e4bac9) --- .../mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | 14 +- .../mxc/gpu-viv/hal/kernel/gc_hal_kernel.h | 8 +- .../hal/kernel/gc_hal_kernel_command_vg.c | 5 +- .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c | 2 +- .../gpu-viv/hal/kernel/gc_hal_kernel_event.c | 2 +- .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c | 5 +- .../hal/kernel/gc_hal_kernel_video_memory.c | 127 +++++++----------- drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h | 3 + 8 files changed, 70 insertions(+), 96 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 879d467e362062..8cee145f1c15c1 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( { 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( 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, diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h index d7ff9cf16372a5..769479843436bd 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h @@ -453,6 +453,8 @@ struct _gckKERNEL #if gcdANDROID_NATIVE_FENCE_SYNC gctHANDLE timeline; #endif + + gctPOINTER vidmemMutex; }; struct _FrequencyHistory @@ -766,9 +768,6 @@ typedef union _gcuVIDMEM_NODE /* Actual physical address */ gctUINT32 addresses[gcdMAX_GPU_COUNT]; - /* Mutex. */ - gctPOINTER mutex; - /* Locked counter. */ gctINT32 lockeds[gcdMAX_GPU_COUNT]; @@ -824,9 +823,6 @@ struct _gckVIDMEM /* Allocation threshold. */ gctSIZE_T threshold; - /* The heap mutex. */ - gctPOINTER mutex; - #if gcdUSE_VIDMEM_PER_PID /* The Pid this VidMem belongs to. */ gctUINT32 pid; diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c index ce2c18a102b6df..ae12dffba3e6ee 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c @@ -1060,6 +1060,7 @@ _AllocateLinear( /* Free the command buffer. */ gcmkCHECK_STATUS(gckVIDMEM_Free( + Command->kernel->kernel, node )); } @@ -1082,7 +1083,7 @@ _FreeLinear( gcmkERR_BREAK(gckVIDMEM_Unlock(Kernel->kernel, Node, gcvSURF_TYPE_UNKNOWN, gcvNULL)); /* Free the linear buffer. */ - gcmkERR_BREAK(gckVIDMEM_Free(Node)); + gcmkERR_BREAK(gckVIDMEM_Free(Kernel->kernel, Node)); } while (gcvFALSE); @@ -1676,7 +1677,7 @@ _TaskFreeVideoMemory( = (gcsTASK_FREE_VIDEO_MEMORY_PTR) TaskHeader->task; /* Free video memory. */ - gcmkERR_BREAK(gckVIDMEM_Free(gcmUINT64_TO_PTR(task->node))); + gcmkERR_BREAK(gckVIDMEM_Free(Command->kernel->kernel, gcmUINT64_TO_PTR(task->node))); /* Update the reference counter. */ TaskHeader->container->referenceCount -= 1; diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c index b181f55ec55e71..c175067fd05f79 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c @@ -1199,7 +1199,7 @@ gckKERNEL_DestroyProcessDB( { case gcvDB_VIDEO_MEMORY: /* Free the video memory. */ - status = gckVIDMEM_Free(gcmUINT64_TO_PTR(record->data)); + status = gckVIDMEM_Free(Kernel, gcmUINT64_TO_PTR(record->data)); gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE, "DB: VIDEO_MEMORY 0x%x (status=%d)", diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c index 01f71d8e4176e0..aa066063e586ff 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c @@ -2280,7 +2280,7 @@ gckEVENT_Notify( /* Free video memory. */ status = - gckVIDMEM_Free(node); + gckVIDMEM_Free(Event->kernel, node); break; diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c index d7b8e08732522a..c1f37172d069e7 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c @@ -308,7 +308,8 @@ gckKERNEL_AllocateLinearMemory( if(*Pool == gcvPOOL_SYSTEM) Type |= gcvSURF_VG; /* Allocate memory. */ - status = gckVIDMEM_AllocateLinear(videoMemory, + status = gckVIDMEM_AllocateLinear(Kernel, + videoMemory, Bytes, Alignment, Type, @@ -599,7 +600,7 @@ gceSTATUS gckVGKERNEL_Dispatch( #endif /* __QNXNTO__ */ /* Free video memory. */ - gcmkERR_BREAK(gckVIDMEM_Free( + gcmkERR_BREAK(gckVIDMEM_Free(Kernel, node )); diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c index 5699996125cddd..740006b4d5a1b7 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c @@ -250,8 +250,6 @@ gckVIDMEM_ConstructVirtual( node->Virtual.lockKernels[i] = gcvNULL; } - node->Virtual.mutex = gcvNULL; - gcmkONERROR(gckOS_GetProcessID(&node->Virtual.processID)); #ifdef __QNXNTO__ @@ -267,10 +265,6 @@ gckVIDMEM_ConstructVirtual( gcmkONERROR(gckOS_ZeroMemory(&node->Virtual.sharedInfo, gcmSIZEOF(gcsVIDMEM_NODE_SHARED_INFO))); - /* Create the mutex. */ - gcmkONERROR( - gckOS_CreateMutex(os, &node->Virtual.mutex)); - /* Allocate the virtual memory. */ gcmkONERROR( gckOS_AllocatePagedMemoryEx(os, @@ -303,12 +297,6 @@ gckVIDMEM_ConstructVirtual( /* Roll back. */ if (node != gcvNULL) { - if (node->Virtual.mutex != gcvNULL) - { - /* Destroy the mutex. */ - gcmkVERIFY_OK(gckOS_DeleteMutex(os, node->Virtual.mutex)); - } - /* Free the structure. */ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, node)); } @@ -361,9 +349,6 @@ gckVIDMEM_DestroyVirtual( } #endif - /* Delete the mutex. */ - gcmkVERIFY_OK(gckOS_DeleteMutex(os, Node->Virtual.mutex)); - for (i = 0; i < gcdMAX_GPU_COUNT; i++) { if (Node->Virtual.pageTables[i] != gcvNULL) @@ -465,7 +450,6 @@ gckVIDMEM_Construct( memory->bytes = Bytes; memory->freeBytes = Bytes; memory->threshold = Threshold; - memory->mutex = gcvNULL; #if gcdUSE_VIDMEM_PER_PID gcmkONERROR(gckOS_GetProcessID(&memory->pid)); #endif @@ -602,9 +586,6 @@ gckVIDMEM_Construct( "[GALCORE] TILE_STATUS: bank %d", memory->mapping[gcvSURF_TILE_STATUS]); - /* Allocate the mutex. */ - gcmkONERROR(gckOS_CreateMutex(Os, &memory->mutex)); - /* Return pointer to the gckVIDMEM object. */ *Memory = memory; @@ -616,12 +597,6 @@ gckVIDMEM_Construct( /* Roll back. */ if (memory != gcvNULL) { - if (memory->mutex != gcvNULL) - { - /* Delete the mutex. */ - gcmkVERIFY_OK(gckOS_DeleteMutex(Os, memory->mutex)); - } - for (i = 0; i < banks; ++i) { /* Free the heap. */ @@ -688,9 +663,6 @@ gckVIDMEM_Destroy( } } - /* Free the mutex. */ - gcmkVERIFY_OK(gckOS_DeleteMutex(Memory->os, Memory->mutex)); - /* Mark the object as unknown. */ Memory->object.type = gcvOBJ_UNKNOWN; @@ -742,6 +714,7 @@ gckVIDMEM_Destroy( */ gceSTATUS gckVIDMEM_Allocate( + IN gckKERNEL Kernel, IN gckVIDMEM Memory, IN gctUINT Width, IN gctUINT Height, @@ -773,7 +746,7 @@ gckVIDMEM_Allocate( /* Allocate through linear function. */ gcmkONERROR( - gckVIDMEM_AllocateLinear(Memory, bytes, Alignment, Type, Node)); + gckVIDMEM_AllocateLinear(Kernel, Memory, bytes, Alignment, Type, Node)); /* Success. */ gcmkFOOTER_ARG("*Node=0x%x", *Node); @@ -989,6 +962,7 @@ _FindNode( */ gceSTATUS gckVIDMEM_AllocateLinear( + IN gckKERNEL Kernel, IN gckVIDMEM Memory, IN gctSIZE_T Bytes, IN gctUINT32 Alignment, @@ -1016,7 +990,7 @@ gckVIDMEM_AllocateLinear( gcmkVERIFY_ARGUMENT(Type < gcvSURF_NUM_TYPES); /* Acquire the mutex. */ - gcmkONERROR(gckOS_AcquireMutex(Memory->os, Memory->mutex, gcvINFINITE)); + gcmkONERROR(gckOS_AcquireMutex(Memory->os, Kernel->vidmemMutex, gcvINFINITE)); acquired = gcvTRUE; #if !gcdUSE_VIDMEM_PER_PID @@ -1203,7 +1177,7 @@ gckVIDMEM_AllocateLinear( #endif /* Release the mutex. */ - gcmkVERIFY_OK(gckOS_ReleaseMutex(Memory->os, Memory->mutex)); + gcmkVERIFY_OK(gckOS_ReleaseMutex(Memory->os, Kernel->vidmemMutex)); /* Return the pointer to the node. */ *Node = node; @@ -1220,7 +1194,7 @@ gckVIDMEM_AllocateLinear( if (acquired) { /* Release the mutex. */ - gcmkVERIFY_OK(gckOS_ReleaseMutex(Memory->os, Memory->mutex)); + gcmkVERIFY_OK(gckOS_ReleaseMutex(Memory->os, Kernel->vidmemMutex)); } /* Return the status. */ @@ -1245,6 +1219,7 @@ gckVIDMEM_AllocateLinear( */ gceSTATUS gckVIDMEM_Free( + IN gckKERNEL Kernel, IN gcuVIDMEM_NODE_PTR Node ) { @@ -1252,13 +1227,17 @@ gckVIDMEM_Free( gckKERNEL kernel = gcvNULL; gckVIDMEM memory = gcvNULL; gcuVIDMEM_NODE_PTR node; - gctBOOL mutexAcquired = gcvFALSE; gckOS os = gcvNULL; gctBOOL acquired = gcvFALSE; gctINT32 i, totalLocked; gcmkHEADER_ARG("Node=0x%x", Node); + /* Acquire the mutex. */ + gcmkONERROR( + gckOS_AcquireMutex(Kernel->os, Kernel->vidmemMutex, gcvINFINITE)); + acquired = gcvTRUE; + /* Verify the arguments. */ if ((Node == gcvNULL) || (Node->VidMem.memory == gcvNULL) @@ -1277,6 +1256,9 @@ gckVIDMEM_Free( /* Client still has a lock, defer free op 'till when lock reaches 0. */ Node->VidMem.freePending = gcvTRUE; + gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex)); + acquired = gcvFALSE; + gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM, "Node 0x%x is locked (%d)... deferring free.", Node, Node->VidMem.locked); @@ -1288,12 +1270,6 @@ gckVIDMEM_Free( /* Extract pointer to gckVIDMEM object owning the node. */ memory = Node->VidMem.memory; - /* Acquire the mutex. */ - gcmkONERROR( - gckOS_AcquireMutex(memory->os, memory->mutex, gcvINFINITE)); - - mutexAcquired = gcvTRUE; - #ifdef __QNXNTO__ #if !gcdUSE_VIDMEM_PER_PID /* Reset. */ @@ -1370,7 +1346,7 @@ gckVIDMEM_Free( } /* Release the mutex. */ - gcmkVERIFY_OK(gckOS_ReleaseMutex(memory->os, memory->mutex)); + gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex)); gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM, "Node 0x%x is freed.", @@ -1393,12 +1369,6 @@ gckVIDMEM_Free( os = kernel->os; gcmkVERIFY_OBJECT(os, gcvOBJ_OS); - /* Grab the mutex. */ - gcmkONERROR( - gckOS_AcquireMutex(os, Node->Virtual.mutex, gcvINFINITE)); - - acquired = gcvTRUE; - for (i = 0, totalLocked = 0; i < gcdMAX_GPU_COUNT; i++) { totalLocked += Node->Virtual.lockeds[i]; @@ -1412,8 +1382,6 @@ gckVIDMEM_Free( /* Set Flag */ Node->Virtual.freed = gcvTRUE; - - gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex)); } else { @@ -1422,28 +1390,20 @@ gckVIDMEM_Free( Node->Virtual.physical, Node->Virtual.bytes)); - gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex)); - /* Destroy the gcuVIDMEM_NODE union. */ gcmkVERIFY_OK(gckVIDMEM_DestroyVirtual(Node)); } + gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex)); + /* Success. */ gcmkFOOTER_NO(); return gcvSTATUS_OK; OnError: - if (mutexAcquired) - { - /* Release the mutex. */ - gcmkVERIFY_OK(gckOS_ReleaseMutex( - memory->os, memory->mutex - )); - } - if (acquired) { - gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex)); + gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex)); } /* Return the status. */ @@ -1684,6 +1644,10 @@ gckVIDMEM_Lock( /* Verify the arguments. */ gcmkVERIFY_ARGUMENT(Address != gcvNULL); + /* Grab the mutex. */ + gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->vidmemMutex, gcvINFINITE)); + acquired = gcvTRUE; + if ((Node == gcvNULL) || (Node->VidMem.memory == gcvNULL) ) @@ -1745,10 +1709,6 @@ gckVIDMEM_Lock( os = Node->Virtual.kernel->os; gcmkVERIFY_OBJECT(os, gcvOBJ_OS); - /* Grab the mutex. */ - gcmkONERROR(gckOS_AcquireMutex(os, Node->Virtual.mutex, gcvINFINITE)); - acquired = gcvTRUE; - #if gcdPAGED_MEMORY_CACHEABLE /* Force video memory cacheable. */ Cacheable = gcvTRUE; @@ -1868,11 +1828,11 @@ gckVIDMEM_Lock( /* Return hardware address. */ *Address = Node->Virtual.addresses[Kernel->core]; - - /* Release the mutex. */ - gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex)); } + /* Release the mutex. */ + gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex)); + /* Success. */ gcmkFOOTER_ARG("*Address=%08x", *Address); return gcvSTATUS_OK; @@ -1918,7 +1878,7 @@ gckVIDMEM_Lock( if (acquired) { /* Release the mutex. */ - gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex)); + gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex)); } /* Return the status. */ @@ -1976,6 +1936,11 @@ gckVIDMEM_Unlock( gcmkHEADER_ARG("Node=0x%x Type=%d *Asynchroneous=%d", Node, Type, gcmOPT_VALUE(Asynchroneous)); + /* Grab the mutex. */ + gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->vidmemMutex, gcvINFINITE)); + acquired = gcvTRUE; + + /* Verify the arguments. */ if ((Node == gcvNULL) || (Node->VidMem.memory == gcvNULL) @@ -2032,7 +1997,11 @@ gckVIDMEM_Unlock( gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM, "Deferred-freeing Node 0x%x.", Node); - gcmkONERROR(gckVIDMEM_Free(Node)); + + gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex)); + acquired = gcvFALSE; + + gcmkONERROR(gckVIDMEM_Free(Kernel, Node)); } } @@ -2052,12 +2021,6 @@ gckVIDMEM_Unlock( os = Kernel->os; gcmkVERIFY_OBJECT(os, gcvOBJ_OS); - /* Grab the mutex. */ - gcmkONERROR( - gckOS_AcquireMutex(os, Node->Virtual.mutex, gcvINFINITE)); - - acquired = gcvTRUE; - if (Asynchroneous == gcvNULL) { if (Node->Virtual.lockeds[Kernel->core] == 0) @@ -2119,14 +2082,14 @@ gckVIDMEM_Unlock( Node->Virtual.physical, Node->Virtual.bytes)); + /* Destroy the gcuVIDMEM_NODE union. */ + gcmkVERIFY_OK(gckVIDMEM_DestroyVirtual(Node)); + /* Release mutex before node is destroyed */ - gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex)); + gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex)); acquired = gcvFALSE; - /* Destroy the gcuVIDMEM_NODE union. */ - gcmkVERIFY_OK(gckVIDMEM_DestroyVirtual(Node)); - /* Node has been destroyed, so we should not touch it any more */ gcmkFOOTER(); return gcvSTATUS_OK; @@ -2234,10 +2197,12 @@ gckVIDMEM_Unlock( /* Schedule the surface to be unlocked. */ *Asynchroneous = gcvTRUE; } + } + if (acquired) + { /* Release the mutex. */ - gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex)); - + gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex)); acquired = gcvFALSE; } @@ -2255,7 +2220,7 @@ gckVIDMEM_Unlock( if (acquired) { /* Release the mutex. */ - gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Node->Virtual.mutex)); + gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidmemMutex)); } /* Return the status. */ diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h index 63d5dad3a75abc..71321d6ba164f6 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h @@ -1574,6 +1574,7 @@ gckVIDMEM_Destroy( /* Allocate rectangular memory. */ gceSTATUS gckVIDMEM_Allocate( + IN gckKERNEL Kernel, IN gckVIDMEM Memory, IN gctUINT Width, IN gctUINT Height, @@ -1587,6 +1588,7 @@ gckVIDMEM_Allocate( /* Allocate linear memory. */ gceSTATUS gckVIDMEM_AllocateLinear( + IN gckKERNEL Kernel, IN gckVIDMEM Memory, IN gctSIZE_T Bytes, IN gctUINT32 Alignment, @@ -1597,6 +1599,7 @@ gckVIDMEM_AllocateLinear( /* Free memory. */ gceSTATUS gckVIDMEM_Free( + IN gckKERNEL Kernel, IN gcuVIDMEM_NODE_PTR Node );