From 1968e3b409ef31142d9b4278ba3daeed802c8ff1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E6=9D=9C=E5=9D=A4=E6=98=8E?= Date: Sat, 19 Nov 2011 21:52:44 +0800 Subject: [PATCH] gpu : add USE_DMA_COHERENT & hack for gcvSURF_TILE_STATUS --- .../rk29/vivante/hal/inc/gc_hal_driver.h | 1 + .../rk29/vivante/hal/inc/gc_hal_options.h | 30 +++++ .../rk29/vivante/hal/kernel/gc_hal_kernel.c | 15 ++- .../hal/kernel/gc_hal_kernel_video_memory.c | 11 ++ .../os/linux/kernel/gc_hal_kernel_driver.c | 8 +- .../hal/os/linux/kernel/gc_hal_kernel_os.c | 123 ++++++++++++------ 6 files changed, 141 insertions(+), 47 deletions(-) mode change 100755 => 100644 drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h mode change 100755 => 100644 drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h mode change 100755 => 100644 drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c mode change 100755 => 100644 drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c mode change 100755 => 100644 drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c diff --git a/drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h b/drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h old mode 100755 new mode 100644 index fe019ca7e43c..d86bc0c857da --- a/drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h +++ b/drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h @@ -149,6 +149,7 @@ typedef struct _gcsHAL_INTERFACE { /* Physical memory address of internal memory. */ OUT gctUINT32 baseAddress; + OUT gctCHAR fwVersion[20]; } GetBaseAddress; 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 100755 new mode 100644 index 72d8086fcf2c..d98fa36a0b34 --- a/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h +++ b/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h @@ -261,6 +261,24 @@ #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: ¹Ø±Õ×Ô¶¯µ÷Ƶ @@ -330,5 +348,17 @@ */ #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_ */ diff --git a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c old mode 100755 new mode 100644 index ffb10bca4d1f..2363d831fe57 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c @@ -19,8 +19,7 @@ *****************************************************************************/ - - +#include #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: diff --git a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_video_memory.c b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_video_memory.c index 0e7be33b3b82..007fe56ad571 100644 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_video_memory.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_video_memory.c @@ -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) diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c old mode 100755 new mode 100644 index 5a51e129b1cb..3e4518bd9363 --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c @@ -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 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 100755 new mode 100644 index 2581c269ad9d..dee7ef6ac269 --- 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 @@ -30,7 +30,7 @@ #include #include #include -#ifdef NO_DMA_COHERENT +#if USE_DMA_COHERENT #include #endif /* NO_DMA_COHERENT */ @@ -38,7 +38,6 @@ #include #include #include -#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; ipageNum; 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; -- 2.34.1