summaryrefslogtreecommitdiff
path: root/drivers/mxc/gpu-viv/arch/XAQ2
diff options
context:
space:
mode:
authorLoren Huang <b02279@freescale.com>2012-09-10 00:00:13 +0800
committerLoren Huang <b02279@freescale.com>2012-09-12 16:07:37 +0800
commitc672fadbfe66e900048fcc04d6252fb842414433 (patch)
tree04f0660ecd1adddbf97da8812933e8271a174a08 /drivers/mxc/gpu-viv/arch/XAQ2
parent259aba4f7149dcea2651b8a7ca153a898fa6a774 (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.c60
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;