update gpu driver to 2010.2.5.3.2
author杜坤明 <dkm@rock-chips.com>
Thu, 9 Dec 2010 12:41:05 +0000 (20:41 +0800)
committer杜坤明 <dkm@rock-chips.com>
Thu, 9 Dec 2010 12:41:05 +0000 (20:41 +0800)
28 files changed:
drivers/staging/rk29/vivante/Kbuild_
drivers/staging/rk29/vivante/Makefile
drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c
drivers/staging/rk29/vivante/hal/inc/gc_hal.h
drivers/staging/rk29/vivante/hal/inc/gc_hal_base.h
drivers/staging/rk29/vivante/hal/inc/gc_hal_compiler.h
drivers/staging/rk29/vivante/hal/inc/gc_hal_engine.h
drivers/staging/rk29/vivante/hal/inc/gc_hal_profiler.h
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_heap.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_device.h
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/linux/kernel/gc_hal_kernel_os.h
drivers/staging/rk29/vivante/hal/os/qnx/inc/gc_hal_common_qnx.h
drivers/staging/rk29/vivante/hal/os/qnx/kernel/gc_hal_kernel_debug.c
drivers/staging/rk29/vivante/hal/os/qnx/kernel/gc_hal_kernel_device.c
drivers/staging/rk29/vivante/hal/os/qnx/kernel/gc_hal_kernel_device.h
drivers/staging/rk29/vivante/hal/os/qnx/kernel/gc_hal_kernel_driver.c
drivers/staging/rk29/vivante/hal/os/qnx/kernel/gc_hal_kernel_os.c
drivers/staging/rk29/vivante/hal/os/qnx/kernel/gc_hal_kernel_os.h
drivers/staging/rk29/vivante/hal/os/qnx/kernel/gc_hal_kernel_qnx.c
drivers/staging/rk29/vivante/hal/os/qnx/kernel/gc_hal_kernel_qnx.h
drivers/staging/rk29/vivante/hal/os/qnx/kernel/makefile.linux
drivers/staging/rk29/vivante/hal/os/qnx/makefile.linux

index ec0cc6c88a465b7aba2341adddf4828e55c70cd4..dc85ba141e45c519383d9b557d935114bfd4a48d 100644 (file)
@@ -158,6 +158,12 @@ else
 EXTRA_CFLAGS += -DNO_USER_DIRECT_ACCESS_FROM_KERNEL=0
 endif
 
+ifeq ($(gcdkREPORT_VIDMEM_USAGE), 1)
+EXTRA_CFLAGS += -DgcdkREPORT_VIDMEM_USAGE=1
+else
+EXTRA_CFLAGS += -DgcdkREPORT_VIDMEM_USAGE=0
+endif
+
 EXTRA_CFLAGS += -I$(AQROOT)/hal/inc
 EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel
 EXTRA_CFLAGS += -I$(AQARCH)/hal/kernel
index 9aa5dfade07e11e74bffdb8240f8fa26669f9fb9..e0b7a6b6a8eb1c60b6191525507be541f6a2c3ca 100644 (file)
@@ -50,24 +50,19 @@ else
 ABI             ?= aapcs-linux
 endif
 
-################################################################
 # Force to use dma_coherent_* stuff.
+NO_DMA_COHERENT ?= 1
 
-NO_DMA_COHERENT ?= 0
+# Enable to start GPU clock in drver.
+ENABLE_GPU_CLOCK_BY_DRIVER = 1
 
-################################################################
 # Set this value to 1 if you are using ARM L2 cache.
-
 ENABLE_ARM_L2_CACHE    = 1
 
-################################################################
 # Set this value to 1 if you are using DOVE board.
 CONFIG_DOVE_GPU = 0
 
 
-ENABLE_GPU_CLOCK_BY_DRIVER = 1
-
-
 AQROOT          ?= drivers/staging/rk29/vivante
 AQARCH          ?= $(AQROOT)/arch/XAQ2
 
@@ -191,6 +186,12 @@ else
 EXTRA_CFLAGS += -DNO_USER_DIRECT_ACCESS_FROM_KERNEL=0
 endif
 
+ifeq ($(gcdkREPORT_VIDMEM_USAGE), 1)
+EXTRA_CFLAGS += -DgcdkREPORT_VIDMEM_USAGE=1
+else
+EXTRA_CFLAGS += -DgcdkREPORT_VIDMEM_USAGE=0
+endif
+
 EXTRA_CFLAGS += -I$(AQROOT)/hal/inc
 EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel
 EXTRA_CFLAGS += -I$(AQARCH)/hal/kernel
index edf347193315ffc81d12738a20dc28fb6643eeff..d860930e830d4938e19673b6c9c6c4c515ce4e37 100644 (file)
@@ -126,6 +126,8 @@ _IdentifyHardware(
 
         /* 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)));
@@ -317,6 +319,10 @@ gckHARDWARE_Construct(
     gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
     gcmkVERIFY_ARGUMENT(Hardware != gcvNULL);
 
+    /* Enable the GPU. */
+    gcmkONERROR(gckOS_SetGPUPower(Os, gcvTRUE, gcvTRUE));
+    gcmkONERROR(gckOS_WriteRegister(Os, 0x00000, 0));
+
     /* Identify the hardware. */
     gcmkONERROR(_IdentifyHardware(Os,
                                   &chipModel,
index 01e7d36aeeeaf2d7f002a76804a476fd489a9b70..bc46f3b06aaef10e8b72562d8f48175de5d4a27f 100644 (file)
@@ -231,6 +231,21 @@ gckOS_FreeMemory(
     IN gctPOINTER Memory
     );
 
+/* Allocate paged memory. */
+gceSTATUS
+gckOS_AllocateVirtualMemory(
+    IN gckOS Os,
+    IN gctSIZE_T Bytes,
+    OUT gctPOINTER * Memory
+    );
+
+/* Wrapper for freeing virtual memory. */
+gceSTATUS
+gckOS_FreeVirtualMemory(
+    IN gckOS Os,
+    IN gctPOINTER Memory
+    );
+
 /* Allocate paged memory. */
 gceSTATUS
 gckOS_AllocatePagedMemory(
index 738d1893dbec98d8735a178784af1ac18b6b3469..3edb7f42e639014bf0d9e6d50d1942ab8ddc6ab8 100644 (file)
@@ -489,6 +489,72 @@ gcoOS_Write(
     IN gctCONST_POINTER Data
     );
 
+/* Flush data to a file. */
+gceSTATUS
+gcoOS_Flush(
+    IN gcoOS Os,
+    IN gctFILE File
+    );
+
+/* Create an endpoint for communication. */
+gceSTATUS
+gcoOS_Socket(
+    IN gcoOS Os,
+    IN gctINT Domain,
+    IN gctINT Type,
+    IN gctINT Protocol,
+    OUT gctINT *SockFd
+    );
+
+/* Close a socket. */
+gceSTATUS
+gcoOS_CloseSocket(
+    IN gcoOS Os,
+    IN gctINT SockFd
+    );
+
+/* Initiate a connection on a socket. */
+gceSTATUS
+gcoOS_Connect(
+    IN gcoOS Os,
+    IN gctINT SockFd,
+    IN gctCONST_POINTER HostName,
+    IN gctUINT Port);
+
+/* Shut down part of connection on a socket. */
+gceSTATUS
+gcoOS_Shutdown(
+    IN gcoOS Os,
+    IN gctINT SockFd,
+    IN gctINT How
+    );
+
+/* Send a message on a socket. */
+gceSTATUS
+gcoOS_Send(
+    IN gcoOS Os,
+    IN gctINT SockFd,
+    IN gctSIZE_T ByteCount,
+    IN gctCONST_POINTER Data,
+    IN gctINT Flags
+    );
+
+/* Initiate a connection on a socket. */
+gceSTATUS
+gcoOS_WaitForSend(
+    IN gcoOS Os,
+    IN gctINT SockFd,
+    IN gctINT Seconds,
+    IN gctINT MicroSeconds);
+
+/* Get environment variable value. */
+gceSTATUS
+gcoOS_GetEnv(
+    IN gcoOS Os,
+    IN gctCONST_STRING VarName,
+    OUT gctSTRING * Value
+    );
+
 typedef enum _gceFILE_WHENCE
 {
     gcvFILE_SEEK_SET,
@@ -1846,6 +1912,7 @@ gcoOS_DebugTraceZone(
 
 #define gcmOPT_VALUE(ptr)           (((ptr) == gcvNULL) ? 0 : *(ptr))
 #define gcmOPT_POINTER(ptr)         (((ptr) == gcvNULL) ? gcvNULL : *(ptr))
+#define gcmOPT_STRING(ptr)          (((ptr) == gcvNULL) ? "(nil)" : (ptr))
 
 void
 gcoOS_Print(
index 6bc96b24bd1c08337a4738798564a75d3fae1e08..1f6cf3ff82961535aa243d261cabba3f545ad7ab 100644 (file)
@@ -380,6 +380,25 @@ gcSHADER_Save(
        IN OUT gctSIZE_T * BufferSize
        );
 
+/*******************************************************************************
+**  gcSHADER_ReallocateAttributes
+**
+**  Reallocate an array of pointers to gcATTRIBUTE objects.
+**
+**  INPUT:
+**
+**      gcSHADER Shader
+**          Pointer to a gcSHADER object.
+**
+**      gctSIZE_T Count
+**          Array count to reallocate.  'Count' must be at least 1.
+*/
+gceSTATUS
+gcSHADER_ReallocateAttributes(
+    IN gcSHADER Shader,
+    IN gctSIZE_T Count
+    );
+
 /*******************************************************************************
 **                                                       gcSHADER_AddAttribute
 ********************************************************************************
@@ -494,6 +513,25 @@ gcSHADER_GetPositionAttribute(
        OUT gcATTRIBUTE * Attribute
        );
 
+/*******************************************************************************
+**  gcSHADER_ReallocateUniforms
+**
+**  Reallocate an array of pointers to gcUNIFORM objects.
+**
+**  INPUT:
+**
+**      gcSHADER Shader
+**          Pointer to a gcSHADER object.
+**
+**      gctSIZE_T Count
+**          Array count to reallocate.  'Count' must be at least 1.
+*/
+gceSTATUS
+gcSHADER_ReallocateUniforms(
+    IN gcSHADER Shader,
+    IN gctSIZE_T Count
+    );
+
 /*******************************************************************************
 **                                                        gcSHADER_AddUniform
 ********************************************************************************
@@ -576,6 +614,25 @@ gcSHADER_GetUniform(
        OUT gcUNIFORM * Uniform
        );
 
+/*******************************************************************************
+**  gcSHADER_ReallocateOutputs
+**
+**  Reallocate an array of pointers to gcOUTPUT objects.
+**
+**  INPUT:
+**
+**      gcSHADER Shader
+**          Pointer to a gcSHADER object.
+**
+**      gctSIZE_T Count
+**          Array count to reallocate.  'Count' must be at least 1.
+*/
+gceSTATUS
+gcSHADER_ReallocateOutputs(
+    IN gcSHADER Shader,
+    IN gctSIZE_T Count
+    );
+
 /*******************************************************************************
 **                                                        gcSHADER_AddOutput
 ********************************************************************************
@@ -668,6 +725,25 @@ gcSHADER_GetOutput(
        OUT gcOUTPUT * Output
        );
 
+/*******************************************************************************
+**  gcSHADER_ReallocateVariables
+**
+**  Reallocate an array of pointers to gcVARIABLE objects.
+**
+**  INPUT:
+**
+**      gcSHADER Shader
+**          Pointer to a gcSHADER object.
+**
+**      gctSIZE_T Count
+**          Array count to reallocate.  'Count' must be at least 1.
+*/
+gceSTATUS
+gcSHADER_ReallocateVariables(
+    IN gcSHADER Shader,
+    IN gctSIZE_T Count
+    );
+
 /*******************************************************************************
 **                                                        gcSHADER_AddVariable
 ********************************************************************************
@@ -1218,6 +1294,25 @@ gcSHADER_SetOptimizationOption(
        IN gctUINT OptimizationOption
        );
 
+/*******************************************************************************
+**  gcSHADER_ReallocateFunctions
+**
+**  Reallocate an array of pointers to gcFUNCTION objects.
+**
+**  INPUT:
+**
+**      gcSHADER Shader
+**          Pointer to a gcSHADER object.
+**
+**      gctSIZE_T Count
+**          Array count to reallocate.  'Count' must be at least 1.
+*/
+gceSTATUS
+gcSHADER_ReallocateFunctions(
+    IN gcSHADER Shader,
+    IN gctSIZE_T Count
+    );
+
 gceSTATUS
 gcSHADER_AddFunction(
        IN gcSHADER Shader,
@@ -1571,6 +1666,25 @@ gcOUTPUT_GetName(
 *********************************************************** F U N C T I O N S **
 *******************************************************************************/
 
+/*******************************************************************************
+**  gcFUNCTION_ReallocateArguments
+**
+**  Reallocate an array of gcsFUNCTION_ARGUMENT objects.
+**
+**  INPUT:
+**
+**      gcFUNCTION Function
+**          Pointer to a gcFUNCTION object.
+**
+**      gctSIZE_T Count
+**          Array count to reallocate.  'Count' must be at least 1.
+*/
+gceSTATUS
+gcFUNCTION_ReallocateArguments(
+    IN gcFUNCTION Function,
+    IN gctSIZE_T Count
+    );
+
 gceSTATUS
 gcFUNCTION_AddArgument(
        IN gcFUNCTION Function,
index fc43f66dfda1553dc82702c1f14f703d1e1eca4b..3cca85fd1a56f94d3f7479e4ca83d91d655457d0 100644 (file)
@@ -367,6 +367,15 @@ gcoINDEX_Load(
        IN gctPOINTER IndexBuffer
        );
 
+/* Bind an index object to the hardware, for neocore hacking*/
+gceSTATUS
+gcoINDEX_LoadHack(
+       IN gcoINDEX Index,
+       IN gceINDEX_TYPE IndexType,
+       IN gctUINT32 IndexCount,
+       IN gctPOINTER IndexBuffer
+       );
+
 /* Bind an index object to the hardware. */
 gceSTATUS
 gcoINDEX_Bind(
@@ -1130,6 +1139,29 @@ typedef enum _gceTEXTURE_FACE
 }
 gceTEXTURE_FACE;
 
+typedef struct _gcsTEXTURE
+{
+    /* Addressing modes. */
+    gceTEXTURE_ADDRESSING       s;
+    gceTEXTURE_ADDRESSING       t;
+    gceTEXTURE_ADDRESSING       r;
+
+    /* Border color. */
+    gctUINT8                    border[4];
+
+    /* Filters. */
+    gceTEXTURE_FILTER           minFilter;
+    gceTEXTURE_FILTER           magFilter;
+    gceTEXTURE_FILTER           mipFilter;
+
+    /* Level of detail. */
+    gctFIXED_POINT              lodBias;
+    gctFIXED_POINT              lodMin;
+    gctFIXED_POINT              lodMax;
+}
+gcsTEXTURE, * gcsTEXTURE_PTR;
+
+
 /* Construct a new gcoTEXTURE object. */
 gceSTATUS
 gcoTEXTURE_Construct(
@@ -1356,6 +1388,7 @@ gcoTEXTURE_Flush(
 
 gceSTATUS
 gcoTEXTURE_QueryCaps(
+       IN      gcoHAL    Hal,
        OUT gctUINT * MaxWidth,
        OUT gctUINT * MaxHeight,
        OUT gctUINT * MaxDepth,
@@ -1390,6 +1423,13 @@ gcoTEXTURE_IsComplete(
        IN gctINT MaxLevel
        );
 
+gceSTATUS
+gcoTEXTURE_BindTexture(
+    IN gcoTEXTURE Texture,
+    IN gctINT Sampler,
+    IN gcsTEXTURE_PTR Info
+    );
+
 /******************************************************************************\
 ******************************* gcoSTREAM Object ******************************
 \******************************************************************************/
@@ -1540,6 +1580,14 @@ gcoVERTEX_Bind(
        IN gcoVERTEX Vertex
        );
 
+gceSTATUS
+gcoVERTEX_BindHack(
+       IN gctUINT32 ActiveAttributeCount,
+       IN gctUINT32 TotalStride,
+    IN gcoVERTEX Vertex,
+       IN gctUINT32 Address
+    );
+
 #ifdef __cplusplus
 }
 #endif
index 8fe1f55b6d69b3d77028bf122e0ad7f55dc36507..4e283bfa8802df494734aa016e6bfe4266a67529 100644 (file)
@@ -121,43 +121,48 @@ gcsPROFILER_COUNTERS;
 /* HAL profile information. */
 typedef struct _gcsPROFILER
 {
-    gctFILE                    file;
+    gctUINT32       enable;
+
+    gctBOOL         useSocket;
+    gctINT          sockFd;
+
+    gctFILE         file;
 
     /* Aggregate Information */
 
     /* Clock Info */
-    gctUINT64                  frameStart;
-    gctUINT64                  frameEnd;
+    gctUINT64       frameStart;
+    gctUINT64       frameEnd;
 
     /* Current frame information */
-    gctUINT32                  frameNumber;
-    gctUINT64                  frameStartTimeusec;
-    gctUINT64                  frameEndTimeusec;
-    gctUINT64                  frameStartCPUTimeusec;
-    gctUINT64                  frameEndCPUTimeusec;
+    gctUINT32       frameNumber;
+    gctUINT64       frameStartTimeusec;
+    gctUINT64       frameEndTimeusec;
+    gctUINT64       frameStartCPUTimeusec;
+    gctUINT64       frameEndCPUTimeusec;
 
 #if PROFILE_HAL_COUNTERS
-    gctUINT32                  vertexBufferTotalBytesAlloc;
-    gctUINT32                  vertexBufferNewBytesAlloc;
-    int                        vertexBufferTotalObjectsAlloc;
-    int                        vertexBufferNewObjectsAlloc;
-
-    gctUINT32                  indexBufferTotalBytesAlloc;
-    gctUINT32                  indexBufferNewBytesAlloc;
-    int                        indexBufferTotalObjectsAlloc;
-    int                        indexBufferNewObjectsAlloc;
-
-    gctUINT32                  textureBufferTotalBytesAlloc;
-    gctUINT32                  textureBufferNewBytesAlloc;
-    int                        textureBufferTotalObjectsAlloc;
-    int                        textureBufferNewObjectsAlloc;
-
-    gctUINT32                  numCommits;
-    gctUINT32                  drawPointCount;
-    gctUINT32                  drawLineCount;
-    gctUINT32                  drawTriangleCount;
-    gctUINT32                  drawVertexCount;
-    gctUINT32                  redundantStateChangeCalls;
+    gctUINT32       vertexBufferTotalBytesAlloc;
+    gctUINT32       vertexBufferNewBytesAlloc;
+    int             vertexBufferTotalObjectsAlloc;
+    int             vertexBufferNewObjectsAlloc;
+
+    gctUINT32       indexBufferTotalBytesAlloc;
+    gctUINT32       indexBufferNewBytesAlloc;
+    int             indexBufferTotalObjectsAlloc;
+    int             indexBufferNewObjectsAlloc;
+
+    gctUINT32       textureBufferTotalBytesAlloc;
+    gctUINT32       textureBufferNewBytesAlloc;
+    int             textureBufferTotalObjectsAlloc;
+    int             textureBufferNewObjectsAlloc;
+
+    gctUINT32       numCommits;
+    gctUINT32       drawPointCount;
+    gctUINT32       drawLineCount;
+    gctUINT32       drawTriangleCount;
+    gctUINT32       drawVertexCount;
+    gctUINT32       redundantStateChangeCalls;
 #endif
 }
 gcsPROFILER;
@@ -187,8 +192,7 @@ struct _gcsSHADER_PROFILER
 /* Initialize the gcsProfiler. */
 gceSTATUS
 gcoPROFILER_Initialize(
-    IN gcoHAL Hal,
-    IN gctFILE File
+    IN gcoHAL Hal
     );
 
 /* Destroy the gcProfiler. */
@@ -197,12 +201,27 @@ gcoPROFILER_Destroy(
     IN gcoHAL Hal
     );
 
+/* Write data to profiler. */
+gceSTATUS
+gcoPROFILER_Write(
+    IN gcoHAL Hal,
+    IN gctSIZE_T ByteCount,
+    IN gctCONST_POINTER Data
+    );
+
+/* Flush data out. */
+gceSTATUS
+gcoPROFILER_Flush(
+    IN gcoHAL Hal
+    );
+
 /* Call to signal end of frame. */
 gceSTATUS
 gcoPROFILER_EndFrame(
     IN gcoHAL Hal
     );
 
+/* Increase profile counter Enum by Value. */
 gceSTATUS
 gcoPROFILER_Count(
        IN gcoHAL Hal,
index 08e810055af55c1d4f59bd6b204e042f8e9d2f79..da4256519d97ff838b314746b3971b91e94602cc 100644 (file)
@@ -26,7 +26,7 @@
 
 #define _GC_OBJ_ZONE    gcvZONE_EVENT
 
-#define gcdEVENT_ALLOCATION_COUNT       (4096 / gcmSIZEOF(gcsHAL_INTERFACE))
+#define gcdEVENT_ALLOCATION_COUNT       (4096 / gcmSIZEOF(gcsEVENT))
 #define gcdEVENT_MIN_THRESHOLD          4
 
 /******************************************************************************\
@@ -431,10 +431,16 @@ gckEVENT_AllocateRecord(
     /* Acquire the mutex. */
     gcmkONERROR(gckOS_AcquireMutex(Event->os, Event->freeMutex, gcvINFINITE));
     acquired = gcvTRUE;
-
-    *Record           = Event->freeList;
-    Event->freeList   = Event->freeList->next;
-    Event->freeCount -= 1;
+    if (Event->freeCount == 0)
+    {
+        gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+    }
+    else
+    {
+        *Record           = Event->freeList;
+        Event->freeList   = Event->freeList->next;
+        Event->freeCount -= 1;
+    }
 
     /* Release the mutex. */
     gcmkONERROR(gckOS_ReleaseMutex(Event->os, Event->freeMutex));
@@ -526,21 +532,8 @@ gckEVENT_AddList(
         &&  (Event->list.source != FromWhere)
         )
         {
-            /* No match - auto-submit the list. */
-            status = gckEVENT_Submit(Event, gcvFALSE);
-
-            if (status == gcvSTATUS_OUT_OF_RESOURCES)
-            {
-                /* When we are out of resources, just convert to submit from
-                ** PIXEL. */
-                Event->list.source = FromWhere = gcvKERNEL_PIXEL;
-            }
-
-            else
-            {
-                /* Check for error. */
-                gcmkONERROR(status);
-            }
+            /* Just convert to submit from PIXEL. */
+            Event->list.source = FromWhere = gcvKERNEL_PIXEL;
         }
         break;
 
index e14e1c9c1744e5632c874514e8a8dfbe951addbf..ee65306352d8b949be7eaf386adccbfb692d4df9 100644 (file)
@@ -281,7 +281,7 @@ _CompactKernelHeap(
                        gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HEAP,
                                                   "Freeing heap 0x%x (%lu bytes)",
                                                   heap, heap->size + gcmSIZEOF(gcskHEAP));
-                       gcmkVERIFY_OK(gckOS_FreeMemory(Heap->os, heap));
+                       gcmkVERIFY_OK(gckOS_FreeVirtualMemory(Heap->os, heap));
                }
 
                /* Acquire the mutex again. */
@@ -422,7 +422,7 @@ gckHEAP_Destroy(
 #endif
 
                /* Free the heap. */
-               gcmkVERIFY_OK(gckOS_FreeMemory(Heap->os, heap));
+               gcmkVERIFY_OK(gckOS_FreeVirtualMemory(Heap->os, heap));
        }
 
        /* Free the mutex. */
@@ -578,9 +578,9 @@ gckHEAP_Allocate(
 
        /* Allocate a new heap. */
        gcmkONERROR(
-               gckOS_AllocateMemory(Heap->os,
-                                                        Heap->allocationSize,
-                                                        &memory));
+               gckOS_AllocateVirtualMemory(Heap->os,
+                                                               Heap->allocationSize,
+                                                               &memory));
 
        gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HEAP,
                                   "Allocated heap 0x%x (%lu bytes)",
@@ -727,7 +727,7 @@ OnError:
        if (memory != gcvNULL)
        {
                /* Free the heap memory. */
-               gckOS_FreeMemory(Heap->os, memory);
+               gckOS_FreeVirtualMemory(Heap->os, memory);
        }
 
        /* Return the status. */
index 08596c609cfa831ed818f9602412a0728b5773b6..fde37c67e2b66669c0f715e64b78931515095caa 100644 (file)
@@ -10,7 +10,7 @@
 #  
 ##############################################################################
 #  
-#    Auto-generated file on 10/12/2010. Do not edit!!!
+#    Auto-generated file on 12/8/2010. Do not edit!!!
 #  
 ##############################################################################
 
index 1a5a8df0d3ceaf9c40c8708c0e212f8b768d0552..4661522b108c4cfb92acca2849de8cb5fbfe459f 100644 (file)
@@ -10,7 +10,7 @@
 #  
 ##############################################################################
 #  
-#    Auto-generated file on 10/12/2010. Do not edit!!!
+#    Auto-generated file on 12/8/2010. Do not edit!!!
 #  
 ##############################################################################
 
@@ -212,6 +212,7 @@ EXPORTS
        gcoINDEX_Lock
        gcoINDEX_Unlock
        gcoINDEX_Load
+       gcoINDEX_LoadHack
        gcoINDEX_Bind
        gcoINDEX_BindOffset
        gcoINDEX_Free
@@ -394,6 +395,7 @@ EXPORTS
        gcoTEXTURE_RenderIntoMipMap
        gcoTEXTURE_IsRenderable
        gcoTEXTURE_IsComplete
+       gcoTEXTURE_BindTexture
 !ENDIF
 
        ; gcsRECT
@@ -501,6 +503,7 @@ EXPORTS
        gcoVERTEX_EnableAttribute
        gcoVERTEX_DisableAttribute
        gcoVERTEX_Bind
+       gcoVERTEX_BindHack
 !ENDIF
 
 !IFNDEF VIVANTE_NO_3D
index 51ab04d06cab5d3c0b20a587c98eba19279e0997..752d858277c5c9ed7e06b5226bf581f874eacd2e 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/seq_file.h>
 #include <linux/mm.h>
 #include <linux/mman.h>
+#include <linux/slab.h>
 
 #define _GC_OBJ_ZONE    gcvZONE_DEVICE
 
@@ -176,7 +177,7 @@ gckGALDEVICE_Setup_ISR(
 
     gcmkVERIFY_ARGUMENT(Device != NULL);
 
-    if (Device->irqLine == 0)
+    if (Device->irqLine < 0)
     {
         return gcvSTATUS_GENERIC_IO;
     }
index 75c86f8ad143821e08783721e8cb435e45612077..13c70f32f2d0f0e4f9a1a646bcc9ddf81980a5b5 100644 (file)
 
 #define gcdkUSE_MEMORY_RECORD          1
 
+#ifndef gcdkREPORT_VIDMEM_USAGE
+#define gcdkREPORT_VIDMEM_USAGE                0
+#endif
+
 #ifdef ANDROID
 #define gcdkREPORT_VIDMEM_LEAK         0
 #else
@@ -83,6 +87,8 @@ typedef struct _gckGALDEVICE
 typedef struct MEMORY_RECORD
 {
        gcuVIDMEM_NODE_PTR              node;
+       gceSURF_TYPE            type;
+       gctSIZE_T                               bytes;
 
        struct MEMORY_RECORD *  prev;
        struct MEMORY_RECORD *  next;
index 47c01cde9e2f274f73177fb5f8c94be32a73d264..1d32da346c6ef544f6871fd51a7790d3af1a5885 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <linux/device.h>
 #include <linux/miscdevice.h>
+#include <linux/slab.h>
 
 
 #include "gc_hal_kernel_linux.h"
@@ -43,7 +44,7 @@ static gckGALDEVICE galDevice;
 static int major = 199;
 module_param(major, int, 0644);
 
-int irqLine = 0;
+int irqLine = -1;
 module_param(irqLine, int, 0644);
 
 long registerMemBase = 0x80000000;
@@ -76,6 +77,11 @@ module_param(baseAddress, ulong, 0644);
 int showArgs = 0;
 module_param(showArgs, int, 0644);
 
+#if ENABLE_GPU_CLOCK_BY_DRIVER
+unsigned long coreClock = 156000000;
+module_param(coreClock, ulong, 0644);
+#endif
+
 static int drv_open(struct inode *inode, struct file *filp);
 static int drv_release(struct inode *inode, struct file *filp);
 static int drv_ioctl(struct inode *inode, struct file *filp,
@@ -144,6 +150,9 @@ int drv_release(struct inode* inode, struct file* filp)
     gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_DRIVER,
                  "Entering drv_close\n");
 
+    gcmkVERIFY_OK(
+               gckOS_DestroyAllUserSignals(galDevice->os));
+
     private = filp->private_data;
     gcmkASSERT(private != gcvNULL);
 
@@ -337,15 +346,25 @@ int drv_ioctl(struct inode *inode,
 #if gcdkUSE_MEMORY_RECORD
        else if (iface.command == gcvHAL_ALLOCATE_VIDEO_MEMORY)
        {
+               gctSIZE_T bytes = (iface.u.AllocateVideoMemory.node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+                                               ? iface.u.AllocateVideoMemory.node->VidMem.bytes
+                                               : iface.u.AllocateVideoMemory.node->Virtual.bytes;
                CreateMemoryRecord(device->os,
                                                        &private->memoryRecordList,
-                                                       iface.u.AllocateVideoMemory.node);
+                                                       iface.u.AllocateVideoMemory.node,
+                                                       iface.u.AllocateVideoMemory.type & 0xFF,
+                                                       bytes);
        }
        else if (iface.command == gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY)
        {
+               gctSIZE_T bytes = (iface.u.AllocateLinearVideoMemory.node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+                                               ? iface.u.AllocateLinearVideoMemory.node->VidMem.bytes
+                                               : iface.u.AllocateLinearVideoMemory.node->Virtual.bytes;
                CreateMemoryRecord(device->os,
                                                        &private->memoryRecordList,
-                                                       iface.u.AllocateLinearVideoMemory.node);
+                                                       iface.u.AllocateLinearVideoMemory.node,
+                                                       iface.u.AllocateLinearVideoMemory.type & 0xFF,
+                                                       bytes);
        }
        else if (iface.command == gcvHAL_FREE_VIDEO_MEMORY)
        {
index bfa68b81f092556777c35a7469ca6ef548663680..7da7bec0e7262bd8e604c69ddfad89843a7e1a55 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/mm.h>
 #include <linux/mman.h>
 #include <linux/sched.h>
+#include <linux/slab.h>
 #include <asm/atomic.h>
 #ifdef NO_DMA_COHERENT
 #include <linux/dma-mapping.h>
 #define MEMORY_MAP_UNLOCK(os) \
     gcmkVERIFY_OK(gckOS_ReleaseMutex((os), (os)->memoryMapLock))
 
+#if gcdkREPORT_VIDMEM_USAGE
+static gctUINT64  AllocatedSurfaceTotal[12] = {0};
+/*
+ * AllocatedSurfaceMax[12]: Current total memory
+ * AllocatedSurfaceMax[13]: Current total memory in history
+ */
+static gctUINT64  AllocatedSurfaceMax[12 + 2] = {0};
+static char *pszSurfaceType[12] = {"UNKNOWN", "INDEX", "VERTEX", "TEXTURE", "RENDER_TARGET", \
+                                "DEPTH", "BITMAP", "TILE_STATUS", "MASK", "SCISSOR", "HIERARCHICAL_DEPTH", \
+                                "NUM_TYPES"};
+#endif
+
 /******************************************************************************\
 ********************************** Structures **********************************
 \******************************************************************************/
@@ -134,6 +147,7 @@ typedef struct _gcsPageInfo
 }
 gcsPageInfo;
 
+
 static PLINUX_MDL
 _CreateMdl(
     IN gctINT PID
@@ -785,6 +799,93 @@ gckOS_FreeMemory(
     return gcvSTATUS_OK;
 }
 
+/*******************************************************************************
+**
+**  gckOS_AllocateVirtualMemory
+**
+**  Allocate virtual memory wrapper.
+**
+**  INPUT:
+**
+**      gctSIZE_T Bytes
+**          Number of bytes to allocate.
+**
+**  OUTPUT:
+**
+**      gctPOINTER * Memory
+**          Pointer to a variable that will hold the allocated memory location.
+*/
+gceSTATUS
+gckOS_AllocateVirtualMemory(
+    IN gckOS Os,
+    IN gctSIZE_T Bytes,
+    OUT gctPOINTER * Memory
+    )
+{
+    gctPOINTER memory;
+    gceSTATUS status;
+
+    gcmkHEADER_ARG("Os=0x%x Bytes=%lu", Os, Bytes);
+
+    /* Verify the arguments. */
+    gcmkVERIFY_ARGUMENT(Bytes > 0);
+    gcmkVERIFY_ARGUMENT(Memory != NULL);
+
+    memory = (gctPOINTER) vmalloc(Bytes);
+
+    if (memory == NULL)
+    {
+        /* Out of memory. */
+        gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+    }
+
+    /* Return pointer to the memory allocation. */
+    *Memory = memory;
+
+    /* Success. */
+    gcmkFOOTER_ARG("*Memory=%p", *Memory);
+    return gcvSTATUS_OK;
+
+OnError:
+    /* Return the status. */
+    gcmkFOOTER();
+    return status;
+}
+
+/*******************************************************************************
+**
+**  gckOS_FreeVirtualMemory
+**
+**  Free allocated virtual memory wrapper.
+**
+**  INPUT:
+**
+**      gctPOINTER Memory
+**          Pointer to memory allocation to free.
+**
+**  OUTPUT:
+**
+**      Nothing.
+*/
+gceSTATUS
+gckOS_FreeVirtualMemory(
+    IN gckOS Os,
+    IN gctPOINTER Memory
+    )
+{
+    gcmkHEADER_ARG("Memory=%p", Memory);
+
+    /* Verify the arguments. */
+    gcmkVERIFY_ARGUMENT(Memory != NULL);
+
+    /* Free the memory from the OS pool. */
+    vfree(Memory);
+
+    /* Success. */
+    gcmkFOOTER_NO();
+    return gcvSTATUS_OK;
+}
+
 /*******************************************************************************
 **
 **  gckOS_MapMemory
@@ -4434,9 +4535,8 @@ OnError:
 }
 
 gceSTATUS
-gckOS_CleanProcessSignal(
-    gckOS Os,
-    gctHANDLE Process
+gckOS_DestroyAllUserSignals(
+    IN gckOS Os
     )
 {
     gctINT signal;
@@ -4460,7 +4560,7 @@ gckOS_CleanProcessSignal(
     for (signal = 0; signal < Os->signal.tableLen; signal++)
     {
         if (Os->signal.table[signal] != gcvNULL &&
-            ((gcsSIGNAL_PTR)Os->signal.table[signal])->process == Process)
+            ((gcsSIGNAL_PTR)Os->signal.table[signal])->process == (gctHANDLE) current->tgid)
         {
             gckOS_DestroySignal(Os, Os->signal.table[signal]);
 
@@ -5062,7 +5162,9 @@ MEMORY_RECORD_PTR
 CreateMemoryRecord(
     gckOS Os,
     MEMORY_RECORD_PTR List,
-    gcuVIDMEM_NODE_PTR Node
+    gcuVIDMEM_NODE_PTR Node,
+    gceSURF_TYPE Type,
+    gctSIZE_T Bytes
     )
 {
     MEMORY_RECORD_PTR   mr;
@@ -5073,6 +5175,19 @@ CreateMemoryRecord(
     MEMORY_LOCK(Os);
 
     mr->node            = Node;
+    mr->type            = Type;
+    mr->bytes           = Bytes;
+
+#if gcdkREPORT_VIDMEM_USAGE
+    AllocatedSurfaceTotal[Type] += Bytes;
+    AllocatedSurfaceMax[Type] = (AllocatedSurfaceMax[Type] > AllocatedSurfaceTotal[Type])
+                       ? AllocatedSurfaceMax[Type] : AllocatedSurfaceTotal[Type];
+    AllocatedSurfaceMax[12] += Bytes;
+    if(AllocatedSurfaceMax[12] > AllocatedSurfaceMax[13])
+    {
+        AllocatedSurfaceMax[13] = AllocatedSurfaceMax[12];
+    }
+#endif
 
     mr->prev            = List->prev;
     mr->next            = List;
@@ -5092,6 +5207,11 @@ DestoryMemoryRecord(
 {
     MEMORY_LOCK(Os);
 
+#if gcdkREPORT_VIDMEM_USAGE
+    AllocatedSurfaceTotal[Mr->type] -= Mr->bytes;
+    AllocatedSurfaceMax[12] -= Mr->bytes;
+#endif
+
     Mr->prev->next      = Mr->next;
     Mr->next->prev      = Mr->prev;
 
@@ -5141,6 +5261,21 @@ FreeAllMemoryRecord(
 
     MEMORY_LOCK(Os);
 
+#if gcdkREPORT_VIDMEM_USAGE
+    for (; i < 12; i++) {
+        printk("AllocatedSurfaceTotal[%s]:\t %12lluK, AllocatedSurfaceMax[%s]:\t %12lluK\n",
+                pszSurfaceType[i], AllocatedSurfaceTotal[i]/1024,
+                pszSurfaceType[i], AllocatedSurfaceMax[i]/1024);
+
+        AllocatedSurfaceTotal[i] = 0;
+        AllocatedSurfaceMax[i] = 0;
+    }
+    printk("AllocatedSurfaceMax[unfreed]:\t %12lluK\n", AllocatedSurfaceMax[12]/1024);
+    printk("AllocatedSurfaceMax[total]:\t %12lluK\n", AllocatedSurfaceMax[13]/1024);
+    AllocatedSurfaceMax[12] = AllocatedSurfaceMax[13] = 0;
+    i = 0;
+#endif
+
     while (List->next != List)
     {
         mr = List->next;
@@ -5310,6 +5445,9 @@ gckOS_Broadcast(
 {
     gceSTATUS status;
     gctUINT32 idle = 0, dma = 0, axi = 0, read0 = 0, read1 = 0, write = 0;
+    gctUINT32 debugState = 0, memoryDebug = 0;
+    gctUINT32 debugCmdLow = 0, debugCmdHi = 0;
+    gctUINT32 i, debugSignalsPe, debugSignalsMc;
 
     gcmkHEADER_ARG("Os=0x%x Hardware=0x%x Reason=%d", Os, Hardware, Reason);
 
@@ -5365,6 +5503,39 @@ gckOS_Broadcast(
                       read0, read1, write);
         }
 
+        gcmkONERROR(gckOS_ReadRegister(Os, 0x660, &debugState));
+        gcmkONERROR(gckOS_ReadRegister(Os, 0x414, &memoryDebug));
+        gcmkPRINT("  debugState(0x660)=0x%08X memoryDebug(0x414)=0x%08X",
+                  debugState, memoryDebug);
+
+        gcmkONERROR(gckOS_ReadRegister(Os, 0x668, &debugCmdLow));
+        gcmkONERROR(gckOS_ReadRegister(Os, 0x66C, &debugCmdHi));
+        gcmkPRINT("  debugCmdLow(0x668)=0x%08X debugCmdHi(0x66C)=0x%08X",
+                  debugCmdLow, debugCmdHi);
+
+        for (i = 0; i < 16; i++)
+        {
+            gcmkONERROR(gckOS_WriteRegister(Os, 0x470, i << 16));
+            gcmkPRINT("%d: Write 0x%08X to DebugControl0(0x470)", i, i << 16);
+
+            gcmkONERROR(gckOS_ReadRegister(Os, 0x454, &debugSignalsPe));
+            gcmkPRINT("%d: debugSignalsPe(0x454)=0x%08X", i, debugSignalsPe);
+
+            gcmkPRINT("");
+        }
+
+        for (i = 0; i < 16; i++)
+        {
+            gcmkONERROR(gckOS_WriteRegister(Os, 0x478, i));
+            gcmkPRINT("%d: Write 0x%08X to DebugControl2(0x478)", i, i);
+
+            gcmkONERROR(gckOS_ReadRegister(Os, 0x468, &debugSignalsMc));
+            gcmkPRINT("%d: debugSignalsMc(0x468)=0x%08X", i, debugSignalsMc);
+
+            gcmkPRINT("");
+        }
+
+
         gcmkONERROR(gckKERNEL_Recovery(Hardware->kernel));
         break;
 
index 087b55e5ced8c5ebcf38d80adb01b084a6612a76..aedeef628f5ce7501dfdcc4e4acbbf9567028444 100644 (file)
@@ -67,19 +67,20 @@ typedef struct _DRIVER_ARGS
 }
 DRIVER_ARGS;
 
-/* Cleanup the signal table. */
+/* Destroy all user signals of the current process */
 gceSTATUS
-gckOS_CleanProcessSignal(
-       gckOS Os,
-       gctHANDLE Process
-       );
+gckOS_DestroyAllUserSignals(
+     IN gckOS Os
+     );
 
 #ifdef gcdkUSE_MEMORY_RECORD
 MEMORY_RECORD_PTR
 CreateMemoryRecord(
        gckOS Os,
        MEMORY_RECORD_PTR List,
-       gcuVIDMEM_NODE_PTR Node
+       gcuVIDMEM_NODE_PTR Node,
+       gceSURF_TYPE Type,
+       gctSIZE_T Bytes
        );
 
 void
index a5d1bfe368c6fc6856792cbae0fb4b0422a6f7fd..0f514b2f0de4c472481e87a8ffb3f08f2bee95c9 100644 (file)
@@ -10,7 +10,7 @@
 *
 *****************************************************************************
 *
-*    Auto-generated file on 10/12/2010. Do not edit!!!
+*    Auto-generated file on 12/8/2010. Do not edit!!!
 *
 *****************************************************************************/
 
index e8ca7e688c135bc21c5f35445119a38e08a8ee8c..c382c1299341e50da9f34bab489daa521fac01d2 100644 (file)
@@ -10,7 +10,7 @@
 *
 *****************************************************************************
 *
-*    Auto-generated file on 10/12/2010. Do not edit!!!
+*    Auto-generated file on 12/8/2010. Do not edit!!!
 *
 *****************************************************************************/
 
index 0ca6f4fab43268a5e79ed56f57f674c96c1de95a..80f0818cf56a863cfa7cdf6f06af35aea7705851 100644 (file)
@@ -10,7 +10,7 @@
 *
 *****************************************************************************
 *
-*    Auto-generated file on 10/12/2010. Do not edit!!!
+*    Auto-generated file on 12/8/2010. Do not edit!!!
 *
 *****************************************************************************/
 
index fea415745289dd3340387623f08fbe68143889c4..bb5835f0dfea763f4e92cb6e46d3dd0f48e3608e 100644 (file)
@@ -10,7 +10,7 @@
 *
 *****************************************************************************
 *
-*    Auto-generated file on 10/12/2010. Do not edit!!!
+*    Auto-generated file on 12/8/2010. Do not edit!!!
 *
 *****************************************************************************/
 
index 0b279925d68fbcafcd380b1c107d0ff6b950b1b1..f3bb021eb52858121220286982d39d88923e6c99 100644 (file)
@@ -10,7 +10,7 @@
 *
 *****************************************************************************
 *
-*    Auto-generated file on 10/12/2010. Do not edit!!!
+*    Auto-generated file on 12/8/2010. Do not edit!!!
 *
 *****************************************************************************/
 
index 0416ca802c27355ff0fbc0c60759125067f43437..bf7e5c923e05a85ac32f54488ebe648e2c0ef8b9 100644 (file)
@@ -10,7 +10,7 @@
 *
 *****************************************************************************
 *
-*    Auto-generated file on 10/12/2010. Do not edit!!!
+*    Auto-generated file on 12/8/2010. Do not edit!!!
 *
 *****************************************************************************/
 
index 92791d926d690957575d6594a5af099a1ff79286..3f112ecc0af0338e2193b806570b7fa5434e187e 100644 (file)
@@ -10,7 +10,7 @@
 *
 *****************************************************************************
 *
-*    Auto-generated file on 10/12/2010. Do not edit!!!
+*    Auto-generated file on 12/8/2010. Do not edit!!!
 *
 *****************************************************************************/
 
index 7c848dea66c170fe310b1a9c6a1aa1ff00d0cb33..837500429d630505961469feda46827dd39d7fee 100644 (file)
@@ -10,7 +10,7 @@
 *
 *****************************************************************************
 *
-*    Auto-generated file on 10/12/2010. Do not edit!!!
+*    Auto-generated file on 12/8/2010. Do not edit!!!
 *
 *****************************************************************************/
 
index 79f7619dff4c46307f5d1d3bf1fce9a03770dab0..ef541d493b7133e04eda4b5726ef0e7efde56496 100644 (file)
@@ -10,7 +10,7 @@
 *
 *****************************************************************************
 *
-*    Auto-generated file on 10/12/2010. Do not edit!!!
+*    Auto-generated file on 12/8/2010. Do not edit!!!
 *
 *****************************************************************************/
 
index 59c5c482b1e8451e074e15247739fc77fde8d0b4..d6006781e1f83159d1f0959d25c478c8000cf050 100644 (file)
@@ -10,7 +10,7 @@
 #  
 ##############################################################################
 #  
-#    Auto-generated file on 10/12/2010. Do not edit!!!
+#    Auto-generated file on 12/8/2010. Do not edit!!!
 #  
 ##############################################################################
 
index 0c0cd889624d211fecb6189f286f609c3d46afad..7614d4983c616ced1812a7ac6de3090137ab24d5 100644 (file)
@@ -10,7 +10,7 @@
 #  
 ##############################################################################
 #  
-#    Auto-generated file on 10/12/2010. Do not edit!!!
+#    Auto-generated file on 12/8/2010. Do not edit!!!
 #  
 ##############################################################################