gpu : fix the gcdOPTIMIZE_HEAP_SAMESIZE for heap alloc.
author杜坤明 <dkm@rockchip.com>
Tue, 19 Jul 2011 08:02:03 +0000 (16:02 +0800)
committer杜坤明 <dkm@rockchip.com>
Tue, 19 Jul 2011 08:02:03 +0000 (16:02 +0800)
drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c
drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_heap.c
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c

index 1d3a2c2f13cba243209acd8b6816f9b841544ba8..841a39b183a896d1c5116b709defd811b9bf0b78 100755 (executable)
@@ -3429,9 +3429,13 @@ gckHARDWARE_QueryPowerManagementState(
     gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
     gcmkVERIFY_ARGUMENT(State != gcvNULL);
 
+    gckOS_AcquireMutex(Hardware->os, Hardware->powerMutex, gcvINFINITE);
+
     /* Return the statue. */
     *State = Hardware->chipPowerState;
 
+    gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex);
+
     /* Success. */
     gcmkFOOTER_ARG("*State=%d", *State);
     return gcvSTATUS_OK;
index e33db7b2e7723cb8d5ce8cbbeaa64824da539c00..0178666080730bb022e7313485fca0469a46cab2 100755 (executable)
 #   define gcdGPU_TIMEOUT                   0
 #endif
 
-/*=============================== add by dkm ==================================== */
+/* ============================== add by rockchip ===================================*/
 /*
-    dkm: gcdENABLE_AUTO_FREQ
+    dkm : gcdENABLE_AUTO_FREQ
     0: ¹Ø±Õ×Ô¶¯µ÷Ƶ
     1: ¸ù¾ÝGPU¸ººÉ×Ô¶¯µ÷½ÚGPUµÄCOREƵÂÊ
     2: ¸ù¾ÝÊÇ·ñÓÐ3DÓ¦ÓÃ×Ô¶¯µ÷Ƶ(ÓÐ3DÓ¦ÓÃÔÚÅÜʱ¸ßƵ£¬·ñÔòµÍƵ)
 
 
 /*
-    dkm: gcdENABLE_MEM_CACHE
+    dkm : gcdENABLE_MEM_CACHE
 
     ÅäÖÃGPUËùʹÓõÄmemoryÊÇ·ñ±»ARM Cache»òWriteCombineס
     1: Cached
 
 
 /*
-    dkm: gcdENABLE_DELAY_EARLY_SUSPEND
+    dkm : gcdENABLE_DELAY_EARLY_SUSPEND
 
     ÔÚgpu_early_suspendÖÐʹÓÃÑÓʱ¹¤×÷¶ÓÁÐÀ´Ö´ÐÐsuspend,
     ±ÜÃâgpu_early_suspend¹ýÔçÖ´Ðе¼ÖÂÓû§Ï̵߳ÄÊÂÇ黹´¦Àí¸É¾»
 
 
 /*
-    dkm: gcdENABLE_LONG_IDLE_POWEROFF
+    dkm : gcdENABLE_LONG_IDLE_POWEROFF
 
     ³¤Ê±¼äIDLEºó½øÈëPowerOff, ¸Ã¹¦ÄÜ¿ªÆôºóÐèÒª°ÑEarlySuspend¹¦Äܹصô
     ÕâÑù¿ÉÒÔʹijЩ²»Ê¹ÓÃGPUµÄ³¡¾°µÄ¹¦ºÄ½øÒ»²½½µµÍ£¬ÈçÊÓÆµ²¥·Åʱ£¬Ò»¼¶´ý»úʱ£¬
 
 
 /*
-    dkm: gcdOPTIMIZE_HEAP_SAMESIZE
+    dkm : gcdPAGE_ALLOC_LIMIT & gcdPAGE_ALLOC_LIMIT_SIZE
+
+    ÏÞÖÆgckOS_AllocatePagedMemoryExÏòϵͳÉêÇëpageµÄ´óС£¬±ÜÃâϵͳpage²»×ãʱ»áµ¼ÖÂϵͳ¿¨¶Ù
+    gcdPAGE_ALLOC_LIMIT         ÏÞÖÆPageÉêÇë
+    gcdPAGE_ALLOC_LIMIT_SIZE    ÏÞÖÆPageÉêÇëµÄ´óС,µ¥Î»ÎªM
+*/
+#define gcdPAGE_ALLOC_LIMIT                 1
+#define gcdPAGE_ALLOC_LIMIT_SIZE            0
+
+
+/*
+    dkm : gcdOPTIMIZE_HEAP_SAMESIZE
 
     optimize for heap alloc when alloc the same size 
 */
-#define gcdOPTIMIZE_HEAP_SAMESIZE              1
+#define gcdOPTIMIZE_HEAP_SAMESIZE           1
+
+
+/*
+    dkm : gcdkUSE_MAPED_NONPAGE_CACHE
+
+    use cache to avoid alloc & map & free frequently for non page memory.
+    gcdkUSE_MAPED_NONPAGE_CACHE : 
+        0  - no use cache 
+        m  - The maximum number of cache unit
+*/
+#define gcdkUSE_MAPED_NONPAGE_CACHE         100
 
 #endif /* __gc_hal_options_h_ */
 
index 47cf7456839611f0fbc3d5510a5331b2171f2b51..d4ec38325e26ffb5281a095d41002a927446ad76 100755 (executable)
@@ -86,6 +86,13 @@ struct _gckHEAP
 
        /* Heap list. */
        gcskHEAP_PTR                            heap;
+
+// dkm : gcdOPTIMIZE_HEAP_SAMESIZE
+#if gcdOPTIMIZE_HEAP_SAMESIZE
+    gctSIZE_T                   lastbytes;
+    gcskNODE_PTR                lastnode;
+#endif
+
 #if gcdDEBUG
        gctUINT64                                       timeStamp;
 #endif
@@ -182,6 +189,7 @@ _CompactKernelHeap(
                {
                        /* Convert the pointer. */
                        gcskNODE_PTR node = (gcskNODE_PTR) p;
+                       gctSIZE_T bytes  = node->bytes;
 
                        gcmkASSERT(p <= (gctPOINTER) ((gctUINT8_PTR) (heap + 1) + heap->size));
 
@@ -189,7 +197,7 @@ _CompactKernelHeap(
                        if (node->next != gcdIN_USE)
                        {
                                /* Test if this is the end of the heap. */
-                               if (node->bytes == 0)
+                               if (bytes == 0)
                                {
                                        break;
                                }
@@ -209,7 +217,7 @@ _CompactKernelHeap(
                                        if ((gctUINT8_PTR) lastFree + lastFree->bytes == p)
                                        {
                                                /* Just increase the size of the previous free node. */
-                                               lastFree->bytes += node->bytes;
+                                               lastFree->bytes += bytes;
                                        }
                                        else
                                        {
@@ -220,8 +228,19 @@ _CompactKernelHeap(
                                }
                        }
 
+// dkm : add check bytes for loop            
+#if gcdOPTIMIZE_HEAP_SAMESIZE
+            else {
+                /* Test if this is the end of the heap. */
+                               if (bytes == 0)
+                               {
+                                       break;
+                               }
+            }
+#endif
+
                        /* Move to next node. */
-                       p = (gctUINT8_PTR) node + node->bytes;
+                       p = (gctUINT8_PTR) node + bytes;
                }
 
                /* Mark the end of the chain. */
@@ -345,6 +364,13 @@ gckHEAP_Construct(
        heap->os             = Os;
        heap->allocationSize = AllocationSize;
        heap->heap           = gcvNULL;
+
+// dkm : gcdOPTIMIZE_HEAP_SAMESIZE
+#if gcdOPTIMIZE_HEAP_SAMESIZE
+    heap->lastbytes = 0;
+    heap->lastnode = gcvNULL;
+#endif
+
 #if gcdDEBUG
        heap->timeStamp      = 0;
 #endif
@@ -473,11 +499,6 @@ gckHEAP_Allocate(
        gctSIZE_T bytes;
        gcskNODE_PTR node, used, prevFree = gcvNULL;
        gctPOINTER memory = gcvNULL;
-// dkm : gcdOPTIMIZE_HEAP_SAMESIZE
-#if gcdOPTIMIZE_HEAP_SAMESIZE
-    static gctSIZE_T lastbytes = 0;
-    static gcskNODE_PTR lastnode = gcvNULL;
-#endif
 
        gcmkHEADER_ARG("Heap=0x%x Bytes=%lu", Heap, Bytes);
 
@@ -518,8 +539,8 @@ gckHEAP_Allocate(
                                        prevFree = gcvNULL;
 // dkm : gcdOPTIMIZE_HEAP_SAMESIZE         
 #if gcdOPTIMIZE_HEAP_SAMESIZE
-                    if(bytes>=lastbytes && heap==Heap->heap && lastnode) {
-                        node = lastnode;
+                    if(heap==Heap->heap && bytes>=Heap->lastbytes && Heap->lastnode) {
+                        node = Heap->lastnode;
                     } else {
                         node = heap->freeList;
                     }
@@ -547,6 +568,11 @@ gckHEAP_Allocate(
 
                        if (i == 0)
                        {
+// dkm : gcdOPTIMIZE_HEAP_SAMESIZE
+#if gcdOPTIMIZE_HEAP_SAMESIZE
+                Heap->lastbytes = 0;
+                Heap->lastnode = gcvNULL;
+#endif
                                /* Compact the heap. */
                                gcmkVERIFY_OK(_CompactKernelHeap(Heap));
                                
@@ -686,8 +712,8 @@ UseNode:
                gcmkASSERT(node->bytes >= gcmSIZEOF(gcskNODE));
 // dkm : gcdOPTIMIZE_HEAP_SAMESIZE
 #if gcdOPTIMIZE_HEAP_SAMESIZE
-        lastbytes = bytes;
-        lastnode = node;
+        Heap->lastbytes = bytes;
+        Heap->lastnode = node;
 #endif
        }
        else
@@ -703,8 +729,8 @@ UseNode:
                }
 // dkm : gcdOPTIMIZE_HEAP_SAMESIZE
 #if gcdOPTIMIZE_HEAP_SAMESIZE
-        lastbytes = bytes;
-        lastnode = node->next;
+        Heap->lastbytes = bytes;
+        Heap->lastnode = node->next;
 #endif
                /* Consume the entire free node. */
                used  = (gcskNODE_PTR) node;
index a5cb36938a60b0f3ea1272beaf2a719370af4f7d..2c193751b7c41b3d9e24b53526be9b4dede5c6ce 100755 (executable)
 
 #define _GC_OBJ_ZONE    gcvZONE_OS
 
-// dkm: add
-#define PAGE_ALLOC_LIMIT                    1   // ÏÞÖÆPageÉêÇë
-#define PAGE_ALLOC_LIMIT_SIZE               0   // ÏÞÖÆPageÉêÇëµÄ´óС,µ¥Î»ÎªM
-
-// dkm: PAGE_ALLOC_LIMIT
-#if PAGE_ALLOC_LIMIT
+// dkm: gcdPAGE_ALLOC_LIMIT
+#if gcdPAGE_ALLOC_LIMIT
 int g_pages_alloced = 0;
 #endif
 
@@ -72,11 +68,6 @@ int g_pages_alloced = 0;
 #define MEMORY_MAP_UNLOCK(os) \
     gcmkVERIFY_OK(gckOS_ReleaseMutex((os), (os)->memoryMapLock))
 
-// dkm : use cache to avoid alloc & map & free frequently for non page memory.
-// gcdkUSE_MAPED_NONPAGE_CACHE : 
-//    0  - no use cache 
-//    m  - The maximum number of cache unit
-#define gcdkUSE_MAPED_NONPAGE_CACHE         100
 
 // dkm : gcdkUSE_MAPED_NONPAGE_CACHE
 #if gcdkUSE_MAPED_NONPAGE_CACHE
@@ -88,6 +79,9 @@ typedef struct _gcsMapedNonPagedCache
 }
 gcsMapedNonPagedCache;
 
+static void _FreeAllMapedNonPagedCache(gckOS Os, gctINT pid);
+#endif
+
 gceSTATUS gckOS_FreeNonPagedMemoryRealy(
     IN gckOS Os,
     IN gctSIZE_T Bytes,
@@ -95,9 +89,6 @@ gceSTATUS gckOS_FreeNonPagedMemoryRealy(
     IN gctPOINTER Logical
     );
 
-static void _FreeAllMapedNonPagedCache(gckOS Os, gctINT pid);
-#endif
-
 
 /******************************************************************************\
 ********************************** Structures **********************************
@@ -2964,9 +2955,9 @@ gceSTATUS gckOS_AllocatePagedMemoryEx(
 
     if (Contiguous)
     {
-// dkm: PAGE_ALLOC_LIMIT
-#if PAGE_ALLOC_LIMIT
-        if( (g_pages_alloced + numPages) > (256*PAGE_ALLOC_LIMIT_SIZE) ) {
+// dkm: gcdPAGE_ALLOC_LIMIT
+#if gcdPAGE_ALLOC_LIMIT
+        if( (g_pages_alloced + numPages) > (256*gcdPAGE_ALLOC_LIMIT_SIZE) ) {
             //printk("full %d! \n", g_pages_alloced);
             addr = NULL;
         } else {
@@ -2975,7 +2966,7 @@ gceSTATUS gckOS_AllocatePagedMemoryEx(
                 g_pages_alloced += numPages;
                 //printk("alloc %d / %d \n", numPages, g_pages_alloced);
             } else {
-                printk("gpu : alloc %d fail! (%d/%d)\n", numPages,  g_pages_alloced, (256*PAGE_ALLOC_LIMIT_SIZE) );
+                printk("gpu : alloc %d fail! (%d/%d)\n", numPages,  g_pages_alloced, (256*gcdPAGE_ALLOC_LIMIT_SIZE) );
             }
         }
 #else
@@ -3133,8 +3124,8 @@ gceSTATUS gckOS_FreePagedMemory(
     if (mdl->contiguous)
     {
         free_pages((unsigned long)mdl->addr, GetOrder(mdl->numPages));
-// dkm: PAGE_ALLOC_LIMIT
-#if PAGE_ALLOC_LIMIT
+// dkm: gcdPAGE_ALLOC_LIMIT
+#if gcdPAGE_ALLOC_LIMIT
         g_pages_alloced -= mdl->numPages;
         //printk("free %d / %d \n", mdl->numPages, g_pages_alloced);
         if(g_pages_alloced<0)    g_pages_alloced = 0;