diff options
author | Richard Liu <r66033@freescale.com> | 2014-04-01 09:58:49 +0800 |
---|---|---|
committer | Richard Liu <r66033@freescale.com> | 2014-04-22 10:15:57 +0800 |
commit | a661cf042510ded8fe8801d476994ad915985693 (patch) | |
tree | 67cec6fd02760e102abaf7d9596b5e277c43fe15 /drivers/mxc | |
parent | 8e02e5dabf55df2163014ece8e1cbf960df84226 (diff) |
ENGR00306257 [#1027]fix system hang up issue caused by GPU
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
Diffstat (limited to 'drivers/mxc')
-rw-r--r-- | drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c | 29 |
1 files changed, 6 insertions, 23 deletions
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 94593d8e9968..01f71d8e4176 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 @@ -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)); |