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)))))))
)
{
IN gcoSURF Surface
);
+/* Wait for a signal from GPU. */
+gceSTATUS
+gcoHAL_WaitSignalFromGPU(
+ IN gcoHAL Hal,
+ IN gctSIGNAL Signal
+ );
+
/******************************************************************************\
********************************** gcoOS Object *********************************
\******************************************************************************/
/* Cache stuff. */
gcvHAL_CACHE,
+
+#if gcdGPU_TIMEOUT
+ /* Broadcast GPU stuck */
+ gcvHAL_BROADCAST_GPU_STUCK,
+#endif
}
gceHAL_COMMAND_CODES;
}
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);
}
#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
#endif
gcmkONERROR(
- gckOS_WaitSignal(Command->os,
- Command->queues[newIndex].signal,
- gcvINFINITE));
+ _WaitSignalFromGPU(Command->os,
+ Command->kernel->hardware,
+ Command->queues[newIndex].signal));
if (currentIndex >= 0)
{
#
##############################################################################
#
-# Auto-generated file on 12/8/2010. Do not edit!!!
+# Auto-generated file on 12/17/2010. Do not edit!!!
#
##############################################################################
#
##############################################################################
#
-# Auto-generated file on 12/8/2010. Do not edit!!!
+# Auto-generated file on 12/17/2010. Do not edit!!!
#
##############################################################################
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)
{
#if USE_PLATFORM_DRIVER
#include <linux/platform_device.h>
#endif
+#include <mach/rk29_iomap.h>
MODULE_DESCRIPTION("Vivante Graphics Driver");
MODULE_LICENSE("GPL");
return -EAGAIN;
}
clk_enable(clk_gpu);
+
+ // enable ram clock gate
+ writel(readl(RK29_GRF_BASE+0xc0) & ~0x100000, RK29_GRF_BASE+0xc0);
#endif
if (showArgs)
#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;
//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
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;
#
##############################################################################
#
-# Auto-generated file on 12/8/2010. Do not edit!!!
+# Auto-generated file on 12/17/2010. Do not edit!!!
#
##############################################################################
#
##############################################################################
#
-# Auto-generated file on 12/8/2010. Do not edit!!!
+# Auto-generated file on 12/17/2010. Do not edit!!!
#
##############################################################################