add gpu's suspend/resume, update gpu auto freq ctrl
author杜坤明 <dkm@rockchip.com>
Tue, 25 Jan 2011 07:23:19 +0000 (15:23 +0800)
committer杜坤明 <dkm@rockchip.com>
Tue, 25 Jan 2011 07:25:49 +0000 (15:25 +0800)
drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c [changed mode: 0644->0755]
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c [changed mode: 0644->0755]
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 55523b9..faa00f9
@@ -17,8 +17,6 @@
 *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *****************************************************************************/
-
-
 #include "gc_hal.h"
 #include "gc_hal_kernel.h"
 
 
 #if gcdENABLE_AUTO_FREQ
 #include <linux/time.h>
+#include <linux/clk.h>
 u32 usec_run = 0;
 u32 usec_idle = 0;
 gceCHIPPOWERSTATE lastState = gcvPOWER_IDLE;
 struct timeval tv_on, tv_idle;
 
+int nextfreq = 0;
+struct clk *clk_gpu = NULL;
+
 void get_run_idle(u32 *run, u32 *idle)
 {
     if(gcvPOWER_IDLE==lastState)
@@ -51,8 +53,15 @@ void get_run_idle(u32 *run, u32 *idle)
     usec_run = 0;
 }
 
+void set_nextfreq(int freq)
+{
+    nextfreq = freq;
+}
+
 inline void cal_run_idle(gceCHIPPOWERSTATE State)
 {
+    int freq = 0;
+    
     if(gcvPOWER_IDLE==lastState && gcvPOWER_ON==State)  //gcvPOWER_IDLE->gcvPOWER_ON
     {
         do_gettimeofday(&tv_on);
@@ -62,6 +71,17 @@ inline void cal_run_idle(gceCHIPPOWERSTATE State)
     {
         do_gettimeofday(&tv_idle);
         usec_run += (1000000*(tv_idle.tv_sec-tv_on.tv_sec)+(tv_idle.tv_usec-tv_on.tv_usec));
+
+        freq = nextfreq;
+        nextfreq = 0;
+        if(freq) {
+            clk_gpu = clk_get(NULL, "gpu");
+            clk_set_parent(clk_gpu, clk_get(NULL, "general_pll"));
+            clk_set_rate(clk_get(NULL, "codec_pll"), freq*1000000);
+            clk_set_rate(clk_gpu, freq*1000000);
+            clk_set_parent(clk_gpu, clk_get(NULL, "codec_pll"));
+            //printk("                                           == > gpu change freq to %d \n", freq); 
+        }
     }
     
     lastState = State;
@@ -2838,8 +2858,10 @@ gckHARDWARE_SetPowerManagementState(
     gckCOMMAND command = gcvNULL;
     gckOS os;
     gctUINT flag, clock;
+#if 0      // dkm del  
     gctPOINTER buffer;
     gctSIZE_T bytes, requested;
+#endif
     gctBOOL acquired = gcvFALSE;
     gctBOOL reserved = gcvFALSE;
     gctBOOL mutexAcquired = gcvFALSE;
@@ -3075,6 +3097,7 @@ gckHARDWARE_SetPowerManagementState(
 
         else
         {
+#if 0      // dkm del    
             /* Get the size of the flush command. */
             gcmkONERROR(gckHARDWARE_Flush(Hardware,
                                           gcvFLUSH_ALL,
@@ -3099,6 +3122,7 @@ gckHARDWARE_SetPowerManagementState(
 
             /* Wait to finish all commands. */
             gcmkONERROR(gckCOMMAND_Stall(command));
+#endif  
         }
     }
 
old mode 100644 (file)
new mode 100755 (executable)
index 07735dd..c8a9544
@@ -60,7 +60,7 @@ module_param(contiguousSize, long, 0644);
 ulong contiguousBase = 0;
 module_param(contiguousBase, ulong, 0644);
 
-long bankSize = 32 << 20;
+long bankSize = 16 << 20;
 module_param(bankSize, long, 0644);
 
 int fastClear = -1;
@@ -101,6 +101,7 @@ struct file_operations driver_fops =
 #include <linux/timer.h>
 struct timer_list gpu_timer;
 extern void get_run_idle(u32 *run, u32 *idle);
+extern void set_nextfreq(int freq);
 int power_cnt = 0;
 int last_precent = 0;
 int last_freq = 0;
@@ -108,7 +109,6 @@ void gputimer_callback(unsigned long arg)
 {
     u32 run, idle;
     int precent, freq, diff;
-    struct clk * clk_gpu = clk_get(NULL, "gpu");
     
        mod_timer(&gpu_timer, jiffies + HZ/10);
 
@@ -137,14 +137,11 @@ void gputimer_callback(unsigned long arg)
     else                    freq = 456;
 
     if(freq!=last_freq) {
-        clk_set_parent(clk_gpu, clk_get(NULL, "general_pll"));
-        clk_set_rate(clk_get(NULL, "codec_pll"), freq*1000000);
-        clk_set_rate(clk_gpu, freq*1000000);
-        clk_set_parent(clk_gpu, clk_get(NULL, "codec_pll"));
+        last_freq = freq;
+        set_nextfreq(freq);
     }
-
-    last_freq = freq;
-    printk("%8d /%8d = %3d %%, freq = %dM (%d)\n", (int)run, (int)(run+idle), precent, freq, power_cnt);
+    
+    //printk("%8d /%8d = %3d %%, needfreq = %dM (%d)\n", (int)run, (int)(run+idle), precent, freq, power_cnt);
 }
 #endif
 
@@ -779,6 +776,8 @@ static int __devinit gpu_suspend(struct platform_device *dev, pm_message_t state
 {
        gceSTATUS status;
        gckGALDEVICE device;
+    
+    printk("Enter %s \n", __func__);
 
        device = platform_get_drvdata(dev);
 
@@ -786,6 +785,7 @@ static int __devinit gpu_suspend(struct platform_device *dev, pm_message_t state
 
        if (gcmIS_ERROR(status))
        {
+           printk("%s fail!\n", __func__);
                return -1;
        }
 
@@ -796,6 +796,8 @@ static int __devinit gpu_resume(struct platform_device *dev)
 {
        gceSTATUS status;
        gckGALDEVICE device;
+    
+    printk("Enter %s \n", __func__);
 
        device = platform_get_drvdata(dev);
 
@@ -803,6 +805,7 @@ static int __devinit gpu_resume(struct platform_device *dev)
 
        if (gcmIS_ERROR(status))
        {
+           printk("%s fail!\n", __func__);
                return -1;
        }
 
old mode 100644 (file)
new mode 100755 (executable)
index 1ef05ea..0e339db
@@ -34,6 +34,8 @@
 #include <linux/dma-mapping.h>
 #endif /* NO_DMA_COHERENT */
 
+
+#include <linux/delay.h>
 #include <mach/pmu.h>
 
 #if !USE_NEW_LINUX_SIGNAL
@@ -5896,25 +5898,40 @@ gckOS_SetGPUPower(
     struct clk * clk_aclk_ddr_gpu = clk_get(NULL, "aclk_ddr_gpu");
     struct clk * clk_hclk_gpu = clk_get(NULL, "hclk_gpu");
 
+    printk("---------- Enter gckOS_SetGPUPowerOs=0x%p Clock=%d Power=%d \n", (void*)Os, Clock, Power);
+
     if(Clock) {
+        printk("---------- start gpu clk_enable...\n");
         clk_enable(clk_hclk_gpu);
         clk_enable(clk_aclk_gpu);
         clk_enable(clk_aclk_ddr_gpu);
         clk_enable(clk_gpu);
+        printk("---------- end gpu clk_enable!\n");
     } else {
+        printk("---------- start gpu clk_disable...\n");
         clk_disable(clk_gpu);
         clk_disable(clk_aclk_gpu);
         clk_disable(clk_aclk_ddr_gpu);
         clk_disable(clk_hclk_gpu);
+        printk("---------- end gpu clk_disable!\n");
     }
 
     if(Power) {
+        unsigned long flags;
+        printk("---------- start gpu power_domain on...\n");
+        mdelay(10);
+        local_irq_save(flags);
+        mdelay(5);
         pmu_set_power_domain(PD_GPU, true);
+        mdelay(10);
+        local_irq_restore(flags);
+        printk("---------- end gpu power_domain on!\n");
     } else {
-        pmu_set_power_domain(PD_GPU, false);
+        //printk("---------- start gpu power_domain off...\n");
+        //pmu_set_power_domain(PD_GPU, false);
+        //printk("---------- end gpu power_domain off!\n");
     }
-    
-    printk("gckOS_SetGPUPowerOs=0x%p Clock=%d Power=%d \n", (void*)Os, Clock, Power)
+
 #endif
 
     gcmkFOOTER_NO();