gpu : add USE_DMA_COHERENT & hack for gcvSURF_TILE_STATUS

This commit is contained in:
杜坤明 2011-11-19 21:52:44 +08:00
parent 6d72cf8149
commit 1968e3b409
6 changed files with 141 additions and 47 deletions

1
drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h Executable file → Normal file
View File

@ -149,6 +149,7 @@ typedef struct _gcsHAL_INTERFACE
{
/* Physical memory address of internal memory. */
OUT gctUINT32 baseAddress;
OUT gctCHAR fwVersion[20];
}
GetBaseAddress;

30
drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h Executable file → Normal file
View File

@ -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.28driver
*/
#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_ */

15
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c Executable file → Normal file
View File

@ -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:

View 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)

View File

@ -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

View File

@ -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;