mirror of
https://github.com/torvalds/linux.git
synced 2026-06-10 07:32:29 +02:00
gpu : add USE_DMA_COHERENT & hack for gcvSURF_TILE_STATUS
This commit is contained in:
parent
6d72cf8149
commit
1968e3b409
1
drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h
Executable file → Normal file
1
drivers/staging/rk29/vivante/hal/inc/gc_hal_driver.h
Executable file → Normal 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
30
drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h
Executable file → Normal 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.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_ */
|
||||
|
||||
|
|
|
|||
15
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c
Executable file → Normal file
15
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c
Executable file → Normal 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:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
8
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c
Executable file → Normal file
8
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c
Executable file → Normal 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
|
||||
|
|
|
|||
123
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c
Executable file → Normal file
123
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c
Executable file → Normal 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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user