diff options
author | Loren Huang <b02279@freescale.com> | 2012-09-10 00:00:13 +0800 |
---|---|---|
committer | Loren Huang <b02279@freescale.com> | 2012-09-12 16:07:37 +0800 |
commit | c672fadbfe66e900048fcc04d6252fb842414433 (patch) | |
tree | 04f0660ecd1adddbf97da8812933e8271a174a08 /drivers/mxc/gpu-viv/arch/XAQ2 | |
parent | 259aba4f7149dcea2651b8a7ca153a898fa6a774 (diff) |
ENGR00222253 Merge vivante 4.6.9_p7 kernel part code
Merge vivante 4.6.9 p7 kernel part code.
Signed-off-by: Loren Huang <b02279@freescale.com>
Acked-by: Lily Zhang
Diffstat (limited to 'drivers/mxc/gpu-viv/arch/XAQ2')
-rw-r--r-- | drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c index 07c549e8f784..e29a17528c01 100644 --- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c +++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c @@ -603,6 +603,8 @@ gckHARDWARE_Construct( gcmkONERROR(gckOS_CreateMutex(Os, &hardware->powerMutex)); gcmkONERROR(gckOS_CreateSemaphore(Os, &hardware->globalSemaphore)); + hardware->startIsr = gcvNULL; + hardware->stopIsr = gcvNULL; #if gcdPOWEROFF_TIMEOUT hardware->powerOffTimeout = gcdPOWEROFF_TIMEOUT; @@ -4011,12 +4013,11 @@ gckHARDWARE_SetPowerManagementState( /* Stop the command parser. */ gcmkONERROR(gckCOMMAND_Stop(command, gcvFALSE)); -#ifndef __QNXNTO__ /* Stop the Isr. */ - gcmkONERROR(Hardware->stopIsr(Hardware->isrContext)); -#else - /* QNX does not need to attach-dettach ISP that often */ -#endif + if (Hardware->stopIsr) + { + gcmkONERROR(Hardware->stopIsr(Hardware->isrContext)); + } } /* Get time until stopped. */ @@ -4102,13 +4103,11 @@ gckHARDWARE_SetPowerManagementState( /* Start the command processor. */ gcmkONERROR(gckCOMMAND_Start(command)); -#ifndef __QNXNTO__ - /* Start the Isr. */ - gcmkONERROR(Hardware->startIsr(Hardware->isrContext)); -#else - /* XSUN: QNX does not need to attach-dettach ISP that often - * with the current release */ -#endif + if (Hardware->startIsr) + { + /* Start the Isr. */ + gcmkONERROR(Hardware->startIsr(Hardware->isrContext)); + } /* Set NEW MMU. */ if (Hardware->mmuVersion != 0 && configMmu) @@ -4889,6 +4888,8 @@ gckHARDWARE_Reset( gceSTATUS status; gckCOMMAND command; gctBOOL acquired = gcvFALSE; + gctBOOL mutexAcquired = gcvFALSE; + gctUINT32 process, thread; gcmkHEADER_ARG("Hardware=0x%x", Hardware); @@ -4904,6 +4905,25 @@ gckHARDWARE_Reset( gcmkONERROR(gcvSTATUS_NOT_SUPPORTED); } + status = gckOS_AcquireMutex(Hardware->os, Hardware->powerMutex, 0); + if (status == gcvSTATUS_TIMEOUT) + { + gcmkONERROR(gckOS_GetProcessID(&process)); + gcmkONERROR(gckOS_GetThreadID(&thread)); + + if ((Hardware->powerProcess == process) + && (Hardware->powerThread == thread)) + { + /* No way to recovery from a error in power management. */ + gcmkFOOTER_NO(); + return gcvSTATUS_OK; + } + } + else + { + mutexAcquired = gcvTRUE; + } + if (Hardware->chipPowerState == gcvPOWER_ON) { /* Acquire the power management semaphore. */ @@ -4920,10 +4940,11 @@ gckHARDWARE_Reset( gcmkONERROR(gckCOMMAND_Stop(command, gcvTRUE)); } -#ifndef __QNXNTO__ /* Stop isr, we will start it again when power on GPU. */ - gcmkONERROR(Hardware->stopIsr(Hardware->isrContext)); -#endif + if (Hardware->stopIsr) + { + gcmkONERROR(Hardware->stopIsr(Hardware->isrContext)); + } /* Hardware reset. */ status = gckOS_ResetGPU(Hardware->os, Hardware->core); @@ -4936,7 +4957,9 @@ gckHARDWARE_Reset( /* Force an OFF to ON power switch. */ Hardware->chipPowerState = gcvPOWER_OFF; - gcmkONERROR(gckHARDWARE_SetPowerManagementState(Hardware, gcvPOWER_ON)); + + gcmkONERROR(gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex)); + mutexAcquired = gcvFALSE; /* Success. */ gcmkFOOTER_NO(); @@ -4950,6 +4973,11 @@ OnError: gckOS_ReleaseSemaphore(Hardware->os, command->powerSemaphore)); } + if (mutexAcquired) + { + gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex); + } + /* Return the error. */ gcmkFOOTER(); return status; |