]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ENGR00306257 [#1027]fix system hang up issue caused by GPU
authorRichard Liu <r66033@freescale.com>
Tue, 1 Apr 2014 01:58:49 +0000 (09:58 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Wed, 20 Aug 2014 08:07:00 +0000 (10:07 +0200)
This issue happens when multiple thread is trying to idle GPU at the
same time, root cause is some wrong logic related with powerMutex which
cause cpu still access GPU AHB register after GPU is suspend(clock off),
that cause the bus lockup and make the whole system hang.

Signed-off-by: Richard Liu <r66033@freescale.com>
Acked-by: Jason Liu
(cherry picked from commit d48e52700c4177e94695cdbdb480cb38a88a5ddc)

drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c

index 94593d8e9968de3f6950b4287e5c155ad9b646fd..01f71d8e4176e0c2bfe96d6180bf99f70602dfee 100644 (file)
@@ -201,11 +201,9 @@ _TryToIdleGPU(
 {
     gceSTATUS status;
     gctBOOL empty = gcvFALSE, idle = gcvFALSE;
-    gctUINT32 process, thread;
     gctBOOL powerLocked = gcvFALSE;
     gckHARDWARE hardware;
 
-
     gcmkHEADER_ARG("Event=0x%x", Event);
 
     /* Verify the arguments. */
@@ -215,7 +213,6 @@ _TryToIdleGPU(
     hardware = Event->kernel->hardware;
     gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
 
-
     /* Check whether the event queue is empty. */
     gcmkONERROR(gckEVENT_IsEmpty(Event, &empty));
 
@@ -224,30 +221,17 @@ _TryToIdleGPU(
         status = gckOS_AcquireMutex(hardware->os, hardware->powerMutex, 0);
         if (status == gcvSTATUS_TIMEOUT)
         {
-            gcmkONERROR(gckOS_GetProcessID(&process));
-            gcmkONERROR(gckOS_GetThreadID(&thread));
-
-            /* Just return to prevent deadlock. */
-            if ((hardware->powerProcess != process)
-            ||  (hardware->powerThread  != thread))
-            {
-                gcmkFOOTER_NO();
-                return gcvSTATUS_OK;
-            }
-        }
-        else
-        {
-            powerLocked = gcvTRUE;
+            gcmkFOOTER_NO();
+            return gcvSTATUS_OK;
         }
 
+        powerLocked = gcvTRUE;
+
         /* Query whether the hardware is idle. */
         gcmkONERROR(gckHARDWARE_QueryIdle(Event->kernel->hardware, &idle));
 
-        if (powerLocked)
-        {
-            gcmkONERROR(gckOS_ReleaseMutex(hardware->os, hardware->powerMutex));
-            powerLocked = gcvFALSE;
-        }
+        gcmkONERROR(gckOS_ReleaseMutex(hardware->os, hardware->powerMutex));
+        powerLocked = gcvFALSE;
 
         if (idle)
         {
@@ -262,7 +246,6 @@ _TryToIdleGPU(
     return gcvSTATUS_OK;
 
 OnError:
-
     if (powerLocked)
     {
         gcmkONERROR(gckOS_ReleaseMutex(hardware->os, hardware->powerMutex));