gpu : add USE_DMA_COHERENT & hack for gcvSURF_TILE_STATUS
author杜坤明 <dkm@rockchip.com>
Sat, 19 Nov 2011 13:52:44 +0000 (21:52 +0800)
committer杜坤明 <dkm@rockchip.com>
Sat, 19 Nov 2011 13:53:07 +0000 (21:53 +0800)
drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h [changed mode: 0755->0644]
drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h [changed mode: 0755->0644]
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c [changed mode: 0755->0644]
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_video_memory.c
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c [changed mode: 0755->0644]
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index fe019ca..d86bc0c
@@ -149,6 +149,7 @@ typedef struct _gcsHAL_INTERFACE
         {
             /* Physical memory address of internal memory. */
             OUT gctUINT32               baseAddress;
+            OUT gctCHAR                 fwVersion[20];
         }
         GetBaseAddress;
 
old mode 100755 (executable)
new mode 100644 (file)
index 72d8086..d98fa36
 #endif
 
 /* ============================== add by rockchip ===================================*/
+/*
+    dkm : GPU_FW_VERSION
+    
+    GPU¹Ì¼þ°æ±¾(×î´ó19¸ö×Ö·û´®)
+*/
+#define GPU_FW_VERSION                      "2.2.2"
+
+
+/*
+    dkm : BUILD_FOR_1_28
+    
+    ³ö1.28°æ±¾²¹¶¡ÓÃ
+    0: Ä¬ÈϱàÒë
+    1: ±àÒë1.28¿ÉÓõÄdriver
+*/
+#define BUILD_FOR_1_28                      0                  
+
+
 /*
     dkm : gcdENABLE_AUTO_FREQ
     0: ¹Ø±Õ×Ô¶¯µ÷Ƶ
 */
 #define gcdkUSE_MAPED_NONPAGE_CACHE         20
 
+
+/*
+    dkm : USE_DMA_COHERENT
+
+    use dma_alloc_* to alloc no page memory
+    USE_DMA_COHERENT : 
+        0  - no use  
+        1  - use
+*/
+#define USE_DMA_COHERENT                    1
+
+
 #endif /* __gc_hal_options_h_ */
 
old mode 100755 (executable)
new mode 100644 (file)
index ffb10bc..2363d83
@@ -19,8 +19,7 @@
 *****************************************************************************/
 
 
-
-
+#include <linux/string.h>
 #include "gc_hal_kernel_precomp.h"
 
 #define _GC_OBJ_ZONE    gcvZONE_KERNEL
@@ -293,7 +292,7 @@ _AllocateMemory(
     
 #if (0==gcdPAGE_ALLOC_LIMIT)
     // dkm : force gcvSURF_TILE_STATUS use contiguous memory
-    if(gcvSURF_TILE_STATUS == Type)     pool = gcvPOOL_CONTIGUOUS;
+    //if(gcvSURF_TILE_STATUS == Type)     pool = gcvPOOL_CONTIGUOUS;
 #endif
 
     do
@@ -370,7 +369,9 @@ _AllocateMemory(
             pool = gcvPOOL_SYSTEM;
         }
         else
-        if (pool == gcvPOOL_SYSTEM)
+        if ((pool == gcvPOOL_SYSTEM)
+        &&  (Type != gcvSURF_TILE_STATUS)
+        )
         {
             /* Advance to contiguous memory. */
             pool = gcvPOOL_CONTIGUOUS;
@@ -404,7 +405,7 @@ _AllocateMemory(
         /* Return pool used for allocation. */
         *Pool = pool;
     } else {
-        printk("_AllocateMemory fail! pool=%d, Bytes=%d, Type=%d\n", pool, (int)Bytes, Type);
+        printk("_AllocateMemory fail! pool=%d->%d, Bytes=%d, Type=%d\n", *Pool, pool, (int)Bytes, Type);
     }
 
     /* Return status. */
@@ -468,6 +469,10 @@ gckKERNEL_Dispatch(
         gcmkONERROR(
             gckOS_GetBaseAddress(Kernel->os,
                                  &Interface->u.GetBaseAddress.baseAddress));
+        strcpy(Interface->u.GetBaseAddress.fwVersion, GPU_FW_VERSION);
+#if BUILD_FOR_1_28
+        strcat(Interface->u.GetBaseAddress.fwVersion, "_for1.28");
+#endif
         break;
 
     case gcvHAL_QUERY_VIDEO_MEMORY:
index 0e7be33b3b820a36e8fe02b4b8c3232585ac7475..007fe56ad5710f0d313f0ea5e4165b335c87b0c5 100644 (file)
@@ -822,6 +822,7 @@ gckVIDMEM_AllocateLinear(
 
     acquired = gcvTRUE;
 
+#if 0
     // dkm: ¶ÔÓÚ»¨ÆÁËÀ»úµÄÎÊÌ⣬¸Ð¾õVVÕâô×öÖ»Êǹæ±Ü£¬»¹ÊÇûÓÐÕÒµ½ÎÊÌâµÄÔ­Òò
        if (Type == gcvSURF_TILE_STATUS
     && (Bytes + (1 << 20) > Memory->freeBytes)
@@ -830,6 +831,16 @@ gckVIDMEM_AllocateLinear(
         /* Not enough memory. */
         gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
        }
+#else
+    // dkm : ÎªgcvSURF_TILE_STATUS±£Áô2MµÄ¿Õ¼ä
+       if (Type != gcvSURF_TILE_STATUS
+    && (Bytes + (2 << 20) > Memory->freeBytes)
+       )
+    {
+        /* Not enough memory. */
+        gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+       }
+#endif
 
     // dkm: ¶àÔ¤Áô64KµÄ¿Õ¼ä£¬·ñÔòGPU»áÓзÃÎÊ·Ç·¨µØÖ·µÄ·çÏÕ
     if (Bytes + (64 << 10) > Memory->freeBytes)
old mode 100755 (executable)
new mode 100644 (file)
index 5a51e12..3e4518b
@@ -344,6 +344,9 @@ int drv_release(struct inode* inode, struct file* filp)
 
 #ifndef ANDROID
        gcmkVERIFY_OK(gckCOMMAND_Stall(device->kernel->command));
+#else
+    // dkm: ±£ÁôdelayµÄ×ö·¨
+    //gcmkVERIFY_OK(gckOS_Delay(galDevice->os, 1000));
 #endif
 
     gcmkVERIFY_OK(
@@ -352,10 +355,7 @@ int drv_release(struct inode* inode, struct file* filp)
 #if gcdkUSE_MEMORY_RECORD
        FreeAllMemoryRecord(galDevice->os, private, &private->memoryRecordList);
 
-#ifdef ANDROID
-// dkm: ±£ÁôdelayµÄ×ö·¨
-       gcmkVERIFY_OK(gckOS_Delay(galDevice->os, 1000));
-#else
+#ifndef ANDROID
        gcmkVERIFY_OK(gckCOMMAND_Stall(device->kernel->command));
 #endif
 #endif
old mode 100755 (executable)
new mode 100644 (file)
index 2581c26..dee7ef6
@@ -30,7 +30,7 @@
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <asm/atomic.h>
-#ifdef NO_DMA_COHERENT
+#if USE_DMA_COHERENT
 #include <linux/dma-mapping.h>
 #endif /* NO_DMA_COHERENT */
 
@@ -38,7 +38,6 @@
 #include <linux/delay.h>
 #include <mach/pmu.h>
 #include <mach/cru.h>
-#define IOREMAP_IN_NOPAGE           0
 
 #if !USE_NEW_LINUX_SIGNAL
 #define USER_SIGNAL_TABLE_LEN_INIT  64
@@ -146,7 +145,12 @@ struct _gckOS
     gcsMapedNonPagedCache *     cacheTail;
 
     gctINT                      pageNum;
-    struct page *               pageCache[100];
+    #if USE_DMA_COHERENT
+        gctSTRING               addr[100];
+        dma_addr_t              dmaHandle[100];
+    #else
+        struct page *           pageCache[100];
+    #endif
 #endif
 };
 
@@ -532,9 +536,17 @@ gckOS_Construct(
 
 #if gcdkUSE_MAPED_NONPAGE_CACHE
     for(os->pageNum=0; os->pageNum<50; os->pageNum++) {
+    #if USE_DMA_COHERENT
+        os->addr[os->pageNum] = 
+        #if (2==gcdENABLE_MEM_CACHE)
+            dma_alloc_writecombine(NULL, 5 * PAGE_SIZE, &os->dmaHandle[os->pageNum], GFP_ATOMIC);
+        #else
+            dma_alloc_coherent(NULL, 5 * PAGE_SIZE, &os->dmaHandle[os->pageNum], GFP_ATOMIC);
+        #endif
+    #else
         os->pageCache[os->pageNum] = alloc_pages(GFP_KERNEL | GFP_DMA, get_order(5 * PAGE_SIZE));
+    #endif
     }
-    //printk("os->pageNum = %d\n", os->pageNum);
 #endif
 
     /* Return pointer to the gckOS object. */
@@ -614,9 +626,11 @@ gckOS_Destroy(
     _FreeAllMapedNonPagedCache(Os, 0);
 
     for(i=0; i<Os->pageNum; i++) {
-        if(Os->pageCache[i]) {
-            free_pages((unsigned long)page_address(Os->pageCache[i]), get_order(5 * PAGE_SIZE));
-        }
+    #if USE_DMA_COHERENT
+        if(Os->addr[i])    dma_free_coherent(gcvNULL, 5 * PAGE_SIZE, Os->addr[i], Os->dmaHandle[i]);
+    #else
+        if(Os->pageCache[i])    free_pages((unsigned long)page_address(Os->pageCache[i]), get_order(5 * PAGE_SIZE));
+    #endif
     }
 #endif
 
@@ -1071,8 +1085,12 @@ gckOS_MapMemory(
             return gcvSTATUS_OUT_OF_RESOURCES;
         }
 
-#ifndef NO_DMA_COHERENT
+#if USE_DMA_COHERENT
+    #if (2==gcdENABLE_MEM_CACHE)
+        if (dma_mmap_writecombine(NULL,
+    #else
         if (dma_mmap_coherent(NULL,
+    #endif
                     mdlMap->vma,
                     mdl->addr,
                     mdl->dmaHandle,
@@ -1447,11 +1465,9 @@ gckOS_AllocateNonPagedMemory(
     gctINT          numPages;
     PLINUX_MDL      mdl;
     PLINUX_MDL_MAP  mdlMap = 0;
-#if IOREMAP_IN_NOPAGE
     gctSTRING       addr;
-#endif
 
-#ifdef NO_DMA_COHERENT
+#if !USE_DMA_COHERENT
     struct page *   page;
     long            size, order;
     gctPOINTER      vaddr, reserved_vaddr;
@@ -1507,11 +1523,34 @@ gckOS_AllocateNonPagedMemory(
 
     MEMORY_LOCK(Os);
 
-#ifndef NO_DMA_COHERENT
-    addr = dma_alloc_coherent(NULL,
-                mdl->numPages * PAGE_SIZE,
-                &mdl->dmaHandle,
-                GFP_ATOMIC);
+#if USE_DMA_COHERENT
+    #if gcdkUSE_MAPED_NONPAGE_CACHE
+        if(5==mdl->numPages && Os->pageNum>0 && Os->addr[Os->pageNum-1]) {
+            Os->pageNum--;
+            addr = Os->addr[Os->pageNum];
+            mdl->dmaHandle = Os->dmaHandle[Os->pageNum];
+            Os->addr[Os->pageNum] = gcvNULL;
+            Os->dmaHandle[Os->pageNum] = 0;
+        } else {
+        #if (2==gcdENABLE_MEM_CACHE)
+            addr = dma_alloc_writecombine(NULL,
+        #else
+            addr = dma_alloc_coherent(NULL,
+        #endif
+                        mdl->numPages * PAGE_SIZE,
+                        &mdl->dmaHandle,
+                        GFP_ATOMIC);
+        }
+    #else
+        #if (2==gcdENABLE_MEM_CACHE)
+            addr = dma_alloc_writecombine(NULL,
+        #else
+            addr = dma_alloc_coherent(NULL,
+        #endif
+                        mdl->numPages * PAGE_SIZE,
+                        &mdl->dmaHandle,
+                        GFP_ATOMIC);
+    #endif
 #else
     size    = mdl->numPages * PAGE_SIZE;
     order   = get_order(size);
@@ -1556,15 +1595,14 @@ gckOS_AllocateNonPagedMemory(
         reserved_size  -= PAGE_SIZE;
     }
 
-#if IOREMAP_IN_NOPAGE
-    // dkm: gcdENABLE_MEM_CACHE
-    #if (1==gcdENABLE_MEM_CACHE)
-        addr            = ioremap_cached(virt_to_phys(vaddr), size);
-    #else
-        addr            = ioremap_nocache(virt_to_phys(vaddr), size);
-    #endif
+// dkm: gcdENABLE_MEM_CACHE
+#if (1==gcdENABLE_MEM_CACHE)
+    addr            = ioremap_cached(virt_to_phys(vaddr), size);
+#else
+    addr            = ioremap_nocache(virt_to_phys(vaddr), size);
 #endif
 
+
     mdl->dmaHandle  = virt_to_phys(vaddr);
     mdl->kaddr      = vaddr;
 
@@ -1574,7 +1612,6 @@ gckOS_AllocateNonPagedMemory(
 
 #endif
 
-#if IOREMAP_IN_NOPAGE
     if (addr == gcvNULL)
     {
         gcmkTRACE_ZONE(gcvLEVEL_INFO,
@@ -1588,7 +1625,6 @@ gckOS_AllocateNonPagedMemory(
 
         return gcvSTATUS_OUT_OF_MEMORY;
     }
-#endif
 
     if ((Os->baseAddress & 0x80000000) != (mdl->dmaHandle & 0x80000000))
     {
@@ -1596,11 +1632,7 @@ gckOS_AllocateNonPagedMemory(
                        | (Os->baseAddress & 0x80000000);
     }
 
-#if IOREMAP_IN_NOPAGE
     mdl->addr = addr;
-#else
-    mdl->addr = vaddr;
-#endif
 
     /*
      * We will not do any mapping from here.
@@ -1671,8 +1703,12 @@ gckOS_AllocateNonPagedMemory(
             return gcvSTATUS_OUT_OF_RESOURCES;
         }
 
-#ifndef NO_DMA_COHERENT
+#if USE_DMA_COHERENT
+    #if (2==gcdENABLE_MEM_CACHE)
+        if (dma_mmap_writecombine(NULL,
+    #else
         if (dma_mmap_coherent(NULL,
+    #endif
                 mdlMap->vma,
                 mdl->addr,
                 mdl->dmaHandle,
@@ -1836,7 +1872,7 @@ gceSTATUS gckOS_FreeNonPagedMemoryRealy(
     // dkm: add
     struct mm_struct *      mm;
 
-#ifdef NO_DMA_COHERENT
+#if !USE_DMA_COHERENT
     unsigned                size;
     gctPOINTER              vaddr;
 #endif /* NO_DMA_COHERENT */
@@ -1856,11 +1892,24 @@ gceSTATUS gckOS_FreeNonPagedMemoryRealy(
 
     if(MemLock)     MEMORY_LOCK(Os);
 
-#ifndef NO_DMA_COHERENT
-    dma_free_coherent(gcvNULL,
-                    mdl->numPages * PAGE_SIZE,
-                    mdl->addr,
-                    mdl->dmaHandle);
+#if USE_DMA_COHERENT
+    #if gcdkUSE_MAPED_NONPAGE_CACHE
+        if(5==mdl->numPages && Os->pageNum<100 && !Os->addr[Os->pageNum]) {
+            Os->addr[Os->pageNum] = mdl->addr;
+            Os->dmaHandle[Os->pageNum] = mdl->dmaHandle;
+            Os->pageNum ++;
+        } else {
+            dma_free_coherent(gcvNULL,
+                            mdl->numPages * PAGE_SIZE,
+                            mdl->addr,
+                            mdl->dmaHandle);
+        }
+    #else
+        dma_free_coherent(gcvNULL,
+                        mdl->numPages * PAGE_SIZE,
+                        mdl->addr,
+                        mdl->dmaHandle);
+    #endif
 #else
     size    = mdl->numPages * PAGE_SIZE;
     vaddr   = mdl->kaddr;
@@ -1885,9 +1934,7 @@ gceSTATUS gckOS_FreeNonPagedMemoryRealy(
     free_pages((unsigned long)mdl->kaddr, get_order(mdl->numPages * PAGE_SIZE));
 #endif
 
-#if IOREMAP_IN_NOPAGE
     iounmap(mdl->addr);
-#endif
 #endif /* NO_DMA_COHERENT */
 
     mdlMap = mdl->maps;