From c03df8e9ca0df1a5a2785f6a660db792ad9ee860 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E6=9D=9C=E5=9D=A4=E6=98=8E?= Date: Mon, 4 Jul 2011 16:02:31 +0800 Subject: [PATCH] gpu: optimize for gckHEAP_Allocate & FindVideoMemoryRecord --- drivers/staging/rk29/vivante/Makefile | 2 +- .../rk29/vivante/hal/inc/gc_hal_options.h | 10 +++++- .../vivante/hal/kernel/gc_hal_kernel_heap.c | 31 ++++++++++++++++--- .../hal/os/linux/kernel/gc_hal_kernel_os.c | 16 +++++----- 4 files changed, 44 insertions(+), 15 deletions(-) mode change 100644 => 100755 drivers/staging/rk29/vivante/Makefile mode change 100644 => 100755 drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h mode change 100644 => 100755 drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_heap.c mode change 100644 => 100755 drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c diff --git a/drivers/staging/rk29/vivante/Makefile b/drivers/staging/rk29/vivante/Makefile old mode 100644 new mode 100755 index 1bec4a3a706d..02e93fc06654 --- a/drivers/staging/rk29/vivante/Makefile +++ b/drivers/staging/rk29/vivante/Makefile @@ -57,7 +57,7 @@ NO_DMA_COHERENT ?= 1 ENABLE_GPU_CLOCK_BY_DRIVER = 1 # Set this value to 1 if you are using ARM L2 cache. -ENABLE_ARM_L2_CACHE = 1 +ENABLE_ARM_L2_CACHE = 0 # Set this value to 1 if you are using DOVE board. CONFIG_DOVE_GPU = 0 diff --git a/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h b/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h old mode 100644 new mode 100755 index 9260467964a0..e33db7b2e772 --- a/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h +++ b/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h @@ -260,7 +260,7 @@ # define gcdGPU_TIMEOUT 0 #endif - +/*=============================== add by dkm ==================================== */ /* dkm: gcdENABLE_AUTO_FREQ 0: ¹Ø±Õ×Ô¶¯µ÷Ƶ @@ -302,5 +302,13 @@ */ #define gcdENABLE_LONG_IDLE_POWEROFF 1 + +/* + dkm: gcdOPTIMIZE_HEAP_SAMESIZE + + optimize for heap alloc when alloc the same size +*/ +#define gcdOPTIMIZE_HEAP_SAMESIZE 1 + #endif /* __gc_hal_options_h_ */ diff --git a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_heap.c b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_heap.c old mode 100644 new mode 100755 index cb5fb91851c0..47cf74568396 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_heap.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_heap.c @@ -473,6 +473,11 @@ 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); @@ -511,12 +516,19 @@ gckHEAP_Allocate( if (bytes < heap->size) { prevFree = gcvNULL; +// dkm : gcdOPTIMIZE_HEAP_SAMESIZE +#if gcdOPTIMIZE_HEAP_SAMESIZE + if(bytes>=lastbytes && heap==Heap->heap && lastnode) { + node = lastnode; + } else { + node = heap->freeList; + } /* Walk the chain of free nodes. */ - for (node = heap->freeList; - node != gcvNULL; - node = node->next - ) + for ( ; node != gcvNULL; node = node->next) +#else + for (node = heap->freeList; node != gcvNULL; node = node->next) +#endif { gcmkASSERT(node->next != gcdIN_USE); @@ -672,6 +684,11 @@ UseNode: /* Adjust the number of free bytes. */ node->bytes -= bytes; gcmkASSERT(node->bytes >= gcmSIZEOF(gcskNODE)); +// dkm : gcdOPTIMIZE_HEAP_SAMESIZE +#if gcdOPTIMIZE_HEAP_SAMESIZE + lastbytes = bytes; + lastnode = node; +#endif } else { @@ -684,7 +701,11 @@ UseNode: { prevFree->next = node->next; } - +// dkm : gcdOPTIMIZE_HEAP_SAMESIZE +#if gcdOPTIMIZE_HEAP_SAMESIZE + lastbytes = bytes; + lastnode = node->next; +#endif /* Consume the entire free node. */ used = (gcskNODE_PTR) node; bytes = node->bytes; 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 old mode 100644 new mode 100755 index 9518f76df844..7b6bc77494e3 --- 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 @@ -6126,10 +6126,10 @@ CreateMemoryRecord( mr->u.Memory.physical = Physical; mr->u.Memory.logical = Logical; - mr->prev = List->prev; - mr->next = List; - List->prev->next = mr; - List->prev = mr; + mr->prev = List; + mr->next = List->next; + List->next->prev = mr; + List->next = mr; MEMORY_UNLOCK(Os); @@ -6228,10 +6228,10 @@ CreateVideoMemoryRecord( ? private->maxTotalAllocatedMem : private->totalAllocatedMem; #endif - mr->prev = List->prev; - mr->next = List; - List->prev->next = mr; - List->prev = mr; + mr->prev = List; + mr->next = List->next; + List->next->prev = mr; + List->next = mr; MEMORY_UNLOCK(Os); -- 2.34.1