From 0ef971df7ecc393b62a75c76a94731a4fd7251b0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E6=9D=9C=E5=9D=A4=E6=98=8E?= Date: Tue, 25 Jan 2011 15:23:19 +0800 Subject: [PATCH] add gpu's suspend/resume, update gpu auto freq ctrl --- .../XAQ2/hal/kernel/gc_hal_kernel_hardware.c | 28 +++++++++++++++++-- .../os/linux/kernel/gc_hal_kernel_driver.c | 21 ++++++++------ .../hal/os/linux/kernel/gc_hal_kernel_os.c | 23 +++++++++++++-- 3 files changed, 58 insertions(+), 14 deletions(-) mode change 100644 => 100755 drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c mode change 100644 => 100755 drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c mode change 100644 => 100755 drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c diff --git a/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c b/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c old mode 100644 new mode 100755 index 55523b990ee7..faa00f92cf6f --- a/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c +++ b/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c @@ -17,8 +17,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ - - #include "gc_hal.h" #include "gc_hal_kernel.h" @@ -26,11 +24,15 @@ #if gcdENABLE_AUTO_FREQ #include +#include 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 } } diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c old mode 100644 new mode 100755 index 07735ddefc0b..c8a95446946b --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c @@ -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 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; } diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c old mode 100644 new mode 100755 index 1ef05ea5557a..0e339dbab1a7 --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c @@ -34,6 +34,8 @@ #include #endif /* NO_DMA_COHERENT */ + +#include #include #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(); -- 2.34.1