summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorXianzhong <xianzhong.li@nxp.com>2018-04-26 03:53:47 +0800
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:31:19 +0800
commitf498db11adf2a9e02d6b134c19296ff89e106754 (patch)
tree229ee538cb744cab2b7fe17fc37d9ec9e3aaf525 /drivers
parent8a0ea63778d5b9166daa52a98d7bdc36aa140d05 (diff)
MGS-3848-1 [#imx-854] refinements for pm and isr
1. slightly increate performance for interrupt handler 2. refine powerMutex lock 3. remove obsolete power management mode 4. code refinement preparing fix for bug #19216, #19230 Signed-off-by: Xianzhong <xianzhong.li@nxp.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c73
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h1
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c19
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c5
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h4
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c12
6 files changed, 33 insertions, 81 deletions
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c
index f960e7b8d6ba..eea18c56496c 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c
@@ -1842,6 +1842,9 @@ gckHARDWARE_Construct(
hardware->stallFEPrefetch = gcvTRUE;
}
+ hardware->hasAsyncFe
+ = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_ASYNC_BLIT);
+
hardware->minFscaleValue = 1;
hardware->waitCount = 200;
@@ -4416,14 +4419,8 @@ gckHARDWARE_Interrupt(
gctUINT32 dataEx;
gceSTATUS status;
- gcmkHEADER_ARG("Hardware=0x%x InterruptValid=%d", Hardware, InterruptValid);
-
- /* Verify the arguments. */
- gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
-
/* Extract gckEVENT object. */
eventObj = Hardware->kernel->eventObj;
- gcmkVERIFY_OBJECT(eventObj, gcvOBJ_EVENT);
if (InterruptValid)
{
@@ -4447,11 +4444,10 @@ gckHARDWARE_Interrupt(
#endif
/* Inform gckEVENT of the interrupt. */
- status = gckEVENT_Interrupt(eventObj,
- data);
+ status = gckEVENT_Interrupt(eventObj, data);
}
- if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_ASYNC_BLIT))
+ if (Hardware->hasAsyncFe)
{
/* Read BLT interrupt. */
gcmkONERROR(gckOS_ReadRegisterEx(
@@ -4472,26 +4468,23 @@ gckHARDWARE_Interrupt(
if (dataEx)
{
- status = gckEVENT_Interrupt(Hardware->kernel->asyncEvent,
- dataEx
- );
+ status = gckEVENT_Interrupt(Hardware->kernel->asyncEvent, dataEx);
}
}
}
else
{
- /* Handle events. */
- status = gckEVENT_Notify(eventObj, 0);
+ /* Handle events. */
+ status = gckEVENT_Notify(eventObj, 0);
- if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_ASYNC_BLIT))
- {
- status = gckEVENT_Notify(Hardware->kernel->asyncEvent, 0);
- }
+ if (Hardware->hasAsyncFe)
+ {
+ status = gckEVENT_Notify(Hardware->kernel->asyncEvent, 0);
+ }
}
OnError:
/* Return the status. */
- gcmkFOOTER();
return status;
}
@@ -7355,12 +7348,9 @@ _PowerEnum(gceCHIPPOWERSTATE State)
gcmSTRING(gcvPOWER_OFF),
gcmSTRING(gcvPOWER_IDLE),
gcmSTRING(gcvPOWER_SUSPEND),
- gcmSTRING(gcvPOWER_SUSPEND_ATPOWERON),
- gcmSTRING(gcvPOWER_OFF_ATPOWERON),
gcmSTRING(gcvPOWER_IDLE_BROADCAST),
gcmSTRING(gcvPOWER_SUSPEND_BROADCAST),
gcmSTRING(gcvPOWER_OFF_BROADCAST),
- gcmSTRING(gcvPOWER_OFF_RECOVERY),
gcmSTRING(gcvPOWER_OFF_TIMEOUT),
gcmSTRING(gcvPOWER_ON_AUTO)
};
@@ -7401,7 +7391,6 @@ gckHARDWARE_SetPowerManagementState(
gctUINT flag, clock;
gctBOOL acquired = gcvFALSE;
gctBOOL mutexAcquired = gcvFALSE;
- gctBOOL stall = gcvTRUE;
gctBOOL broadcast = gcvFALSE;
#if gcdPOWEROFF_TIMEOUT
gctBOOL timeout = gcvFALSE;
@@ -7592,18 +7581,6 @@ gckHARDWARE_SetPowerManagementState(
/* Convert the broadcast power state. */
switch (State)
{
- case gcvPOWER_SUSPEND_ATPOWERON:
- /* Convert to SUSPEND and don't wait for STALL. */
- State = gcvPOWER_SUSPEND;
- stall = gcvFALSE;
- break;
-
- case gcvPOWER_OFF_ATPOWERON:
- /* Convert to OFF and don't wait for STALL. */
- State = gcvPOWER_OFF;
- stall = gcvFALSE;
- break;
-
case gcvPOWER_IDLE_BROADCAST:
/* Convert to IDLE and note we are inside broadcast. */
State = gcvPOWER_IDLE;
@@ -7622,13 +7599,6 @@ gckHARDWARE_SetPowerManagementState(
broadcast = gcvTRUE;
break;
- case gcvPOWER_OFF_RECOVERY:
- /* Convert to OFF and note we are inside recovery. */
- State = gcvPOWER_OFF;
- stall = gcvFALSE;
- broadcast = gcvTRUE;
- break;
-
case gcvPOWER_ON_AUTO:
/* Convert to ON and note we are inside recovery. */
State = gcvPOWER_ON;
@@ -7673,7 +7643,11 @@ gckHARDWARE_SetPowerManagementState(
/* Try to acquire the power mutex. */
status = gckOS_AcquireMutex(os, Hardware->powerMutex, 0);
- if (status == gcvSTATUS_TIMEOUT)
+ if (gcmIS_SUCCESS(status))
+ {
+ mutexAcquired = gcvTRUE;
+ }
+ else if (status == gcvSTATUS_TIMEOUT)
{
/* Check if we already own this mutex. */
if ((Hardware->powerProcess == process)
@@ -7692,19 +7666,14 @@ gckHARDWARE_SetPowerManagementState(
status = gcvSTATUS_OK;
goto OnError;
}
- else
- {
- /* Acquire the power mutex. */
- gcmkONERROR(gckOS_AcquireMutex(os,
- Hardware->powerMutex,
- gcvINFINITE));
- }
}
}
- else
+
+ if (!mutexAcquired)
{
/* Acquire the power mutex. */
gcmkONERROR(gckOS_AcquireMutex(os, Hardware->powerMutex, gcvINFINITE));
+ mutexAcquired = gcvTRUE;
}
/* Get time until mtuex acquired. */
@@ -7950,7 +7919,7 @@ gckHARDWARE_SetPowerManagementState(
/* Get time until powered on. */
gcmkPROFILE_QUERY(time, onTime);
- if ((flag & gcvPOWER_FLAG_STALL) && stall)
+ if (flag & gcvPOWER_FLAG_STALL)
{
gctBOOL idle;
gctINT32 atomValue;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h
index 4711bd1c5a6c..5dd2c251c780 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h
@@ -237,6 +237,7 @@ struct _gckHARDWARE
gcsLISTHEAD mmuHead;
gctPOINTER featureDatabase;
+ gctBOOL hasAsyncFe;
gcsHARDWARE_SIGNATURE signature;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c
index 7f71b8fb39ad..a4f7f7f0a8a1 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c
@@ -1799,18 +1799,6 @@ gckVGHARDWARE_SetPowerManagementState(
/* Convert the broadcast power state. */
switch (State)
{
- case gcvPOWER_SUSPEND_ATPOWERON:
- /* Convert to SUSPEND and don't wait for STALL. */
- State = gcvPOWER_SUSPEND;
- stall = gcvFALSE;
- break;
-
- case gcvPOWER_OFF_ATPOWERON:
- /* Convert to OFF and don't wait for STALL. */
- State = gcvPOWER_OFF;
- stall = gcvFALSE;
- break;
-
case gcvPOWER_IDLE_BROADCAST:
/* Convert to IDLE and note we are inside broadcast. */
State = gcvPOWER_IDLE;
@@ -1829,13 +1817,6 @@ gckVGHARDWARE_SetPowerManagementState(
broadcast = gcvTRUE;
break;
- case gcvPOWER_OFF_RECOVERY:
- /* Convert to OFF and note we are inside recovery. */
- State = gcvPOWER_OFF;
- stall = gcvFALSE;
- broadcast = gcvTRUE;
- break;
-
case gcvPOWER_ON_AUTO:
/* Convert to ON and note we are inside recovery. */
State = gcvPOWER_ON;
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 7a3e6edb3aeb..92d43ca7aa3c 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
@@ -1845,7 +1845,10 @@ gckEVENT_Submit(
gcmkONERROR(gckCOMMAND_ExitCommit(command, FromPower));
#if !gcdNULL_DRIVER
- gcmkVERIFY_OK(_TryToIdleGPU(Event));
+ if (!FromPower)
+ {
+ gcmkVERIFY_OK(_TryToIdleGPU(Event));
+ }
#endif
}
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h
index ff8824b9133a..983cd3346e63 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h
@@ -606,12 +606,9 @@ typedef enum _gceCHIPPOWERSTATE
gcvPOWER_OFF,
gcvPOWER_IDLE,
gcvPOWER_SUSPEND,
- gcvPOWER_SUSPEND_ATPOWERON,
- gcvPOWER_OFF_ATPOWERON,
gcvPOWER_IDLE_BROADCAST,
gcvPOWER_SUSPEND_BROADCAST,
gcvPOWER_OFF_BROADCAST,
- gcvPOWER_OFF_RECOVERY,
gcvPOWER_OFF_TIMEOUT,
gcvPOWER_ON_AUTO
}
@@ -2171,3 +2168,4 @@ typedef void * gctTHREAD;
#endif
#endif /* __gc_hal_enum_h_ */
+
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
index 1a479e5957fb..4b0a2ff50ce2 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
@@ -4891,6 +4891,11 @@ gckOS_Broadcast(
)
{
gceSTATUS status;
+#if gcdPOWER_SUSPEND_WHEN_IDLE
+ gceCHIPPOWERSTATE state = gcvPOWER_SUSPEND_BROADCAST;
+#else
+ gceCHIPPOWERSTATE state = gcvPOWER_IDLE_BROADCAST;
+#endif
gcmkHEADER_ARG("Os=0x%X Hardware=0x%X Reason=%d", Os, Hardware, Reason);
@@ -4918,12 +4923,7 @@ gckOS_Broadcast(
/* Put GPU IDLE. */
gcmkONERROR(
- gckHARDWARE_SetPowerManagementState(Hardware,
-#if gcdPOWER_SUSPEND_WHEN_IDLE
- gcvPOWER_SUSPEND_BROADCAST));
-#else
- gcvPOWER_IDLE_BROADCAST));
-#endif
+ gckHARDWARE_SetPowerManagementState(Hardware, state));
/* Add idle process DB. */
gcmkONERROR(gckKERNEL_AddProcessDB(Hardware->kernel,