update gpu driver
author杜坤明 <dkm@rockchip.com>
Tue, 21 Dec 2010 14:25:34 +0000 (22:25 +0800)
committer杜坤明 <dkm@rockchip.com>
Tue, 21 Dec 2010 14:25:34 +0000 (22:25 +0800)
12 files changed:
drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c
drivers/staging/rk29/vivante/hal/inc/gc_hal_base.h
drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_command.c
drivers/staging/rk29/vivante/hal/makefile.linux
drivers/staging/rk29/vivante/hal/os/libGAL.def.mak
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_device.c
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c
drivers/staging/rk29/vivante/hal/os/qnx/kernel/makefile.linux
drivers/staging/rk29/vivante/hal/os/qnx/makefile.linux

index d860930e830d4938e19673b6c9c6c4c515ce4e37..ec451ae665adf3872a087aa477dc366926e24e9b 100644 (file)
@@ -124,15 +124,6 @@ _IdentifyHardware(
                                0x00034,
                                ChipMinorFeatures0));
 
-        /* Disable fast clear flush on some specific cores. */
-        if (((*ChipModel == gcv600) && (*ChipRevision == 0x4302))
-/*        ||  ((*ChipModel == gcv530) && (*ChipRevision == 0x4303))
-               ||      ((*ChipModel == gcv800) && (*ChipRevision == 0x4301)) */
-        )
-        {
-            *ChipMinorFeatures0 = ((((gctUINT32) (*ChipMinorFeatures0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 6:6) - (0 ? 6:6) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? 6:6) - (0 ? 6:6) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)));
-        }
-
         if (((((gctUINT32) (*ChipMinorFeatures0)) >> (0 ? 21:21) & ((gctUINT32) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:21) - (0 ? 21:21) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:21) - (0 ? 21:21) + 1)))))))
         )
         {
index 3edb7f42e639014bf0d9e6d50d1942ab8ddc6ab8..7d6714f64cb6c94666d40af9d1185757a936cee3 100644 (file)
@@ -322,6 +322,13 @@ gcoHAL_DestroySurface(
     IN gcoSURF Surface
     );
 
+/* Wait for a signal from GPU. */
+gceSTATUS
+gcoHAL_WaitSignalFromGPU(
+    IN gcoHAL Hal,
+    IN gctSIGNAL Signal
+    );
+
 /******************************************************************************\
 ********************************** gcoOS Object *********************************
 \******************************************************************************/
index 7943e03ed2f42fac84fd047ad28254c5089644ca..c1a983514b87e860040119cb3217562834f18e97 100644 (file)
@@ -113,6 +113,11 @@ typedef enum _gceHAL_COMMAND_CODES
 
     /* Cache stuff. */
     gcvHAL_CACHE,
+
+#if gcdGPU_TIMEOUT
+    /* Broadcast GPU stuck */
+    gcvHAL_BROADCAST_GPU_STUCK,
+#endif
 }
 gceHAL_COMMAND_CODES;
 
index 0e5d0bb9aee774580de2e0afae38b9785a35f491..e795ecdc1ced3f5df4e32f352aa0f56668a974bd 100644 (file)
@@ -968,6 +968,15 @@ gckKERNEL_Dispatch(
         }
         break;
 
+#if gcdGPU_TIMEOUT
+    case gcvHAL_BROADCAST_GPU_STUCK:
+        /* Broadcast GPU stuck */
+        status = gckOS_Broadcast(Kernel->os,
+                                 Kernel->hardware,
+                                 gcvBROADCAST_GPU_STUCK);
+        break;
+#endif
+
     default:
         /* Invalid command. */
         gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
index f0a9cf8b683bbcf1eff5659f71bd2c221770ec70..0f45f26de705c7f57a6e1c547459d0b722e61a87 100644 (file)
@@ -96,6 +96,72 @@ _DumpCommand(
 }
 #endif
 
+gceSTATUS
+_WaitSignalFromGPU(
+    IN gckOS Os,
+    IN gckHARDWARE Hardware,
+    IN gctSIGNAL Signal
+    )
+{
+    gceSTATUS status;
+
+#if gcdGPU_TIMEOUT
+    gctUINT timer = 0;
+
+    do
+    {
+        /* Wait for the signal. */
+        status = gckOS_WaitSignal(Os, Signal, 250);
+
+        if (status == gcvSTATUS_TIMEOUT)
+        {
+#if gcdDEBUG
+            gctUINT32 idle;
+
+            /* Read idle register. */
+            gcmkVERIFY_OK(
+                gckHARDWARE_GetIdle(Hardware,
+                                    gcvFALSE,
+                                    &idle));
+
+            gcmkTRACE(gcvLEVEL_ERROR,
+                      "%s(%d): idle=%08x",
+                      __FUNCTION__, __LINE__, idle);
+#endif
+
+            /* Advance timer. */
+            timer += 250;
+        }
+        else
+        {
+            gcmkONERROR(status);
+        }
+    }
+    while (gcmIS_ERROR(status) && (timer < gcdGPU_TIMEOUT));
+
+    /* Bail out on timeout. */
+    if (gcmIS_ERROR(status))
+    {
+        /* Broadcast the stuck GPU. */
+        gcmkONERROR(gckOS_Broadcast(Os,
+                                    Hardware,
+                                    gcvBROADCAST_GPU_STUCK));
+
+        gcmkONERROR(gcvSTATUS_GPU_NOT_RESPONDING);
+    }
+
+#else
+    gcmkONERROR(gckOS_WaitSignal(Os, Signal, gcvINFINITE));
+#endif
+
+    /* Success. */
+    return gcvSTATUS_OK;
+
+OnError:
+    /* Return the status. */
+    return status;
+}
+
 /*******************************************************************************
 **
 **  _NewQueue
@@ -132,9 +198,9 @@ _NewQueue(
 #endif
 
     gcmkONERROR(
-        gckOS_WaitSignal(Command->os,
-                         Command->queues[newIndex].signal,
-                         gcvINFINITE));
+        _WaitSignalFromGPU(Command->os,
+                           Command->kernel->hardware,
+                           Command->queues[newIndex].signal));
 
     if (currentIndex >= 0)
     {
index fde37c67e2b66669c0f715e64b78931515095caa..5d4112255130140ce5e14e8e02164e5d30293f79 100644 (file)
@@ -10,7 +10,7 @@
 #  
 ##############################################################################
 #  
-#    Auto-generated file on 12/8/2010. Do not edit!!!
+#    Auto-generated file on 12/17/2010. Do not edit!!!
 #  
 ##############################################################################
 
index 4661522b108c4cfb92acca2849de8cb5fbfe459f..f8f4563c80bafa0047f7b90ae37641d581442e18 100644 (file)
@@ -10,7 +10,7 @@
 #  
 ##############################################################################
 #  
-#    Auto-generated file on 12/8/2010. Do not edit!!!
+#    Auto-generated file on 12/17/2010. Do not edit!!!
 #  
 ##############################################################################
 
index d0056060205d5b091858aecfc8bf333ae1158f85..752d858277c5c9ed7e06b5226bf581f874eacd2e 100644 (file)
@@ -721,8 +721,6 @@ gckGALDEVICE_Construct(
             device->contiguousSize     = ContiguousSize;
             device->contiguousBase     = (gctPOINTER) ioremap_nocache(ContiguousBase, ContiguousSize);
             device->contiguousMapped   = gcvTRUE;
-            printk(">>>> gckGALDEVICE_Construct  device (contiguousBase=0x%08x, contiguousSize=0x%08x) \n", 
-                (u32)device->contiguousBase, (u32)device->contiguousSize);
 
             if (device->contiguousBase == gcvNULL)
             {
index 107605296d4ef0371364e82321b800879b09e314..b95716a44e3f2d9eef79dd8f717afa2fcefd5374 100644 (file)
@@ -33,6 +33,7 @@
 #if USE_PLATFORM_DRIVER
 #include <linux/platform_device.h>
 #endif
+#include <mach/rk29_iomap.h>
 
 MODULE_DESCRIPTION("Vivante Graphics Driver");
 MODULE_LICENSE("GPL");
@@ -505,6 +506,9 @@ static int drv_init(void)
         return -EAGAIN;
     }
     clk_enable(clk_gpu);
+
+    // enable ram clock gate
+    writel(readl(RK29_GRF_BASE+0xc0) & ~0x100000, RK29_GRF_BASE+0xc0);
 #endif
 
        if (showArgs)
index 582cb7dd2e6dd45eee3dab51c33bec709c183dc0..0c9a55cf67ec351e90696035b308a1808879911f 100644 (file)
 #include <linux/dma-mapping.h>
 #endif /* NO_DMA_COHERENT */
 
+#include <mach/pmu.h>
+
 #if !USE_NEW_LINUX_SIGNAL
 #define USER_SIGNAL_TABLE_LEN_INIT  64
 #endif
 
 #define _GC_OBJ_ZONE    gcvZONE_OS
 
-#define PAGE_ALLOC_LIMIT        1   // ÏÞÖÆPageÉêÇëÊý
+#define PAGE_ALLOC_LIMIT        0   // ÏÞÖÆPageÉêÇëÊý
 
 #if PAGE_ALLOC_LIMIT
 int g_pages_alloced = 0;
@@ -2667,14 +2669,14 @@ gceSTATUS gckOS_AllocatePagedMemoryEx(
             //printk("full %d! \n", g_pages_alloced);
             addr = NULL;
         } else {
-            addr = (char *)__get_free_pages(GFP_ATOMIC | GFP_DMA, GetOrder(numPages));
+            addr = (char *)__get_free_pages(GFP_ATOMIC | GFP_DMA | __GFP_NOWARN, GetOrder(numPages));
             if(addr) {
                 g_pages_alloced += numPages;
                 //printk("alloc %d / %d \n", numPages, g_pages_alloced);
             }
         }
 #else
-        addr = (char *)__get_free_pages(GFP_ATOMIC | GFP_DMA, GetOrder(numPages));
+        addr = (char *)__get_free_pages(GFP_ATOMIC | GFP_DMA | __GFP_NOWARN, GetOrder(numPages));
 #endif
     }
     else
@@ -5881,9 +5883,33 @@ gckOS_SetGPUPower(
     IN gctBOOL Power
     )
 {
-    gcmkHEADER_ARG("Os=0x%x Clock=%d Power=%d", Os, Clock, Power);
+    //gcmkHEADER_ARG("Os=0x%x Clock=%d Power=%d", Os, Clock, Power);
 
     /* TODO: Put your code here. */
+#if ENABLE_GPU_CLOCK_BY_DRIVER && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28)
+
+    struct clk * clk_gpu = clk_get(NULL, "gpu");
+    struct clk * clk_aclk_gpu = clk_get(NULL, "aclk_gpu");
+    struct clk * clk_gpu_ahb = clk_get(NULL, "gpu_ahb");
+
+    if(Clock) {
+        if(!IS_ERR(clk_gpu_ahb))    clk_enable(clk_gpu_ahb);
+        if(!IS_ERR(clk_aclk_gpu))   clk_enable(clk_aclk_gpu);
+        if(!IS_ERR(clk_gpu))        clk_enable(clk_gpu);
+    } else {
+        if(!IS_ERR(clk_gpu))        clk_disable(clk_gpu);
+        if(!IS_ERR(clk_aclk_gpu))   clk_disable(clk_aclk_gpu);
+        if(!IS_ERR(clk_gpu_ahb))    clk_disable(clk_gpu_ahb);
+    }
+
+    if(Power) {
+        pmu_set_power_domain(PD_GPU, true);
+    } else {
+        pmu_set_power_domain(PD_GPU, false);
+    }
+    
+    printk("gckOS_SetGPUPowerOs=0x%p Clock=%d Power=%d \n", (void*)Os, Clock, Power)
+#endif
 
     gcmkFOOTER_NO();
     return gcvSTATUS_OK;
index d6006781e1f83159d1f0959d25c478c8000cf050..64ac375518040968a1c82eedb6411dcd9c9571ec 100644 (file)
@@ -10,7 +10,7 @@
 #  
 ##############################################################################
 #  
-#    Auto-generated file on 12/8/2010. Do not edit!!!
+#    Auto-generated file on 12/17/2010. Do not edit!!!
 #  
 ##############################################################################
 
index 7614d4983c616ced1812a7ac6de3090137ab24d5..75a7a4e4fab304bcade12a528dea3d73a07ae536 100644 (file)
@@ -10,7 +10,7 @@
 #  
 ##############################################################################
 #  
-#    Auto-generated file on 12/8/2010. Do not edit!!!
+#    Auto-generated file on 12/17/2010. Do not edit!!!
 #  
 ##############################################################################