From: 杜坤明 Date: Tue, 21 Dec 2010 14:25:34 +0000 (+0800) Subject: update gpu driver X-Git-Tag: firefly_0821_release~10899^2~18 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f0199ef011d775914c6976f2b98cc9ebadce09bb;p=firefly-linux-kernel-4.4.55.git update gpu driver --- 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 index d860930e830d..ec451ae665ad 100644 --- 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 @@ -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))))))) ) { diff --git a/drivers/staging/rk29/vivante/hal/inc/gc_hal_base.h b/drivers/staging/rk29/vivante/hal/inc/gc_hal_base.h index 3edb7f42e639..7d6714f64cb6 100644 --- a/drivers/staging/rk29/vivante/hal/inc/gc_hal_base.h +++ b/drivers/staging/rk29/vivante/hal/inc/gc_hal_base.h @@ -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 ********************************* \******************************************************************************/ diff --git a/drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h b/drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h index 7943e03ed2f4..c1a983514b87 100644 --- a/drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h +++ b/drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h @@ -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; diff --git a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c index 0e5d0bb9aee7..e795ecdc1ced 100644 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c @@ -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); diff --git a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_command.c b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_command.c index f0a9cf8b683b..0f45f26de705 100644 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_command.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_command.c @@ -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) { diff --git a/drivers/staging/rk29/vivante/hal/makefile.linux b/drivers/staging/rk29/vivante/hal/makefile.linux index fde37c67e2b6..5d4112255130 100644 --- a/drivers/staging/rk29/vivante/hal/makefile.linux +++ b/drivers/staging/rk29/vivante/hal/makefile.linux @@ -10,7 +10,7 @@ # ############################################################################## # -# Auto-generated file on 12/8/2010. Do not edit!!! +# Auto-generated file on 12/17/2010. Do not edit!!! # ############################################################################## diff --git a/drivers/staging/rk29/vivante/hal/os/libGAL.def.mak b/drivers/staging/rk29/vivante/hal/os/libGAL.def.mak index 4661522b108c..f8f4563c80ba 100644 --- a/drivers/staging/rk29/vivante/hal/os/libGAL.def.mak +++ b/drivers/staging/rk29/vivante/hal/os/libGAL.def.mak @@ -10,7 +10,7 @@ # ############################################################################## # -# Auto-generated file on 12/8/2010. Do not edit!!! +# Auto-generated file on 12/17/2010. Do not edit!!! # ############################################################################## diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_device.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_device.c index d0056060205d..752d858277c5 100644 --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_device.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_device.c @@ -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) { 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 index 107605296d4e..b95716a44e3f 100644 --- 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 @@ -33,6 +33,7 @@ #if USE_PLATFORM_DRIVER #include #endif +#include 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) 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 index 582cb7dd2e6d..0c9a55cf67ec 100644 --- 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,13 +34,15 @@ #include #endif /* NO_DMA_COHERENT */ +#include + #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; diff --git a/drivers/staging/rk29/vivante/hal/os/qnx/kernel/makefile.linux b/drivers/staging/rk29/vivante/hal/os/qnx/kernel/makefile.linux index d6006781e1f8..64ac37551804 100644 --- a/drivers/staging/rk29/vivante/hal/os/qnx/kernel/makefile.linux +++ b/drivers/staging/rk29/vivante/hal/os/qnx/kernel/makefile.linux @@ -10,7 +10,7 @@ # ############################################################################## # -# Auto-generated file on 12/8/2010. Do not edit!!! +# Auto-generated file on 12/17/2010. Do not edit!!! # ############################################################################## diff --git a/drivers/staging/rk29/vivante/hal/os/qnx/makefile.linux b/drivers/staging/rk29/vivante/hal/os/qnx/makefile.linux index 7614d4983c61..75a7a4e4fab3 100644 --- a/drivers/staging/rk29/vivante/hal/os/qnx/makefile.linux +++ b/drivers/staging/rk29/vivante/hal/os/qnx/makefile.linux @@ -10,7 +10,7 @@ # ############################################################################## # -# Auto-generated file on 12/8/2010. Do not edit!!! +# Auto-generated file on 12/17/2010. Do not edit!!! # ##############################################################################