MGS-3848-1 [#imx-854] refinements for pm and isr
authorXianzhong <xianzhong.li@nxp.com>
Wed, 25 Apr 2018 19:53:47 +0000 (03:53 +0800)
committerXianzhong <xianzhong.li@nxp.com>
Thu, 26 Apr 2018 15:38:57 +0000 (23:38 +0800)
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>
(cherry picked from commit e002022c3143b3e266af893b02bb913e3d156c54)

drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c
drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h
drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c

index f960e7b..eea18c5 100644 (file)
@@ -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;
index 4711bd1..5dd2c25 100644 (file)
@@ -237,6 +237,7 @@ struct _gckHARDWARE
     gcsLISTHEAD                 mmuHead;
 
     gctPOINTER                  featureDatabase;
+    gctBOOL                     hasAsyncFe;
 
     gcsHARDWARE_SIGNATURE       signature;
 
index 7f71b8f..a4f7f7f 100644 (file)
@@ -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;
index 7a3e6ed..92d43ca 100644 (file)
@@ -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
     }
 
index ff8824b..983cd33 100644 (file)
@@ -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_ */
+
index c6a5d24..9263a94 100644 (file)
@@ -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,