summaryrefslogtreecommitdiff
path: root/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
diff options
context:
space:
mode:
authorYa Zhou <ya.zhou@nxp.com>2018-10-24 02:08:48 +0800
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:34:45 +0800
commitccad629ec9a445c552a095b5c957fdc1140f6c77 (patch)
treee3e68deca864da044862bdac6220bfe075895970 /drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
parent27094c3354216734c507472fd428d33342290bf5 (diff)
MGS-4010 [#imx-919] Vulkan test met gpu hang on wayland
These case will generate a huge command object, which was divided into 33 Command Buffers to commit. It will introduce a context switch within a command object. So add a mutex to avoid the Context switch. Date: 23th Otc,2018 Signed-off-by Ya Zhou <ya.zhou@nxp.com>
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.c54
1 files changed, 40 insertions, 14 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 7ad5956e2598..97f012849da5 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
@@ -2558,12 +2558,15 @@ gckKERNEL_Dispatch(
break;
case gcvHAL_EVENT_COMMIT:
- gcmkONERROR(gckOS_AcquireMutex(Kernel->os,
- Kernel->device->commitMutex,
- gcvINFINITE
- ));
+ if (!Interface->commitMutex)
+ {
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os,
+ Kernel->device->commitMutex,
+ gcvINFINITE
+ ));
- commitMutexAcquired = gcvTRUE;
+ commitMutexAcquired = gcvTRUE;
+ }
/* Commit an event queue. */
if (Interface->engine == gcvENGINE_BLT)
{
@@ -2581,16 +2584,22 @@ gckKERNEL_Dispatch(
Kernel->eventObj, gcmUINT64_TO_PTR(Interface->u.Event.queue), gcvFALSE));
}
- gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex));
- commitMutexAcquired = gcvFALSE;
+ if (!Interface->commitMutex)
+ {
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex));
+ commitMutexAcquired = gcvFALSE;
+ }
break;
case gcvHAL_COMMIT:
- gcmkONERROR(gckOS_AcquireMutex(Kernel->os,
- Kernel->device->commitMutex,
- gcvINFINITE
- ));
- commitMutexAcquired = gcvTRUE;
+ if (!Interface->commitMutex)
+ {
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os,
+ Kernel->device->commitMutex,
+ gcvINFINITE
+ ));
+ commitMutexAcquired = gcvTRUE;
+ }
/* Commit a command and context buffer. */
if (Interface->engine == gcvENGINE_BLT)
@@ -2715,9 +2724,12 @@ gckKERNEL_Dispatch(
}
}
}
- gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex));
- commitMutexAcquired = gcvFALSE;
+ if (!Interface->commitMutex)
+ {
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex));
+ commitMutexAcquired = gcvFALSE;
+ }
break;
case gcvHAL_STALL:
@@ -3439,6 +3451,20 @@ gckKERNEL_Dispatch(
));
break;
+ case gcvHAL_DEVICE_MUTEX:
+ if (Interface->u.DeviceMutex.isMutexLocked)
+ {
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os,
+ Kernel->device->commitMutex,
+ gcvINFINITE
+ ));
+ }
+ else
+ {
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex));
+ }
+ break;
+
#if gcdDEC_ENABLE_AHB
case gcvHAL_DEC300_READ:
gcmkONERROR(viv_dec300_read(