From: 杜坤明 Date: Tue, 13 Dec 2011 02:47:26 +0000 (+0800) Subject: gpu : modify the number of pre-alloc pages for gckOS_AllocateNonPagedMemory & add... X-Git-Tag: firefly_0821_release~9712^2~9 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=eeeecef1fdb448214fcdac21d9e7e0c157000e55;p=firefly-linux-kernel-4.4.55.git gpu : modify the number of pre-alloc pages for gckOS_AllocateNonPagedMemory & add some debug code --- diff --git a/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c b/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c index 1d5c8db7774b..552ab0893a9b 100755 --- a/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c +++ b/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c @@ -26,6 +26,9 @@ #define _GC_OBJ_ZONE gcvZONE_HARDWARE +static uint gpu_state = 0; +module_param(gpu_state, uint, 0644); + // dkm: gcdENABLE_AUTO_FREQ #if (1==gcdENABLE_AUTO_FREQ) #include @@ -3367,6 +3370,8 @@ gckHARDWARE_SetPowerManagementState( /* Release the power mutex. */ gcmkONERROR(gckOS_ReleaseMutex(os, Hardware->powerMutex)); + gpu_state = State; + /* Success. */ gcmkFOOTER_NO(); return gcvSTATUS_OK; diff --git a/drivers/staging/rk29/vivante/hal/inc/gc_hal.h b/drivers/staging/rk29/vivante/hal/inc/gc_hal.h old mode 100644 new mode 100755 index f1a37bda0ff9..1e9e4d9da2b9 --- a/drivers/staging/rk29/vivante/hal/inc/gc_hal.h +++ b/drivers/staging/rk29/vivante/hal/inc/gc_hal.h @@ -26,11 +26,21 @@ // dkm: ·½±ãµ÷ÓÃϵͳµÄº¯Êý #include +#include #include "gc_hal_types.h" #include "gc_hal_enum.h" #include "gc_hal_base.h" #include "gc_hal_profiler.h" +enum { + D_ERROR = 1U << 0, + D_IOCTL = 1U << 1, + D_IRQ = 1U << 2, +}; +extern uint gpu_dmask; +#define dprintk(mask, fmt, ...) do { if (mask & gpu_dmask) printk("gpu: " fmt, ##__VA_ARGS__); } while (0) +//#define dprintk(mask, fmt, ...) do { if (mask & gpu_dmask) printk(fmt, ##__VA_ARGS__); } while (0) + #ifdef __cplusplus extern "C" { #endif 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 100644 new mode 100755 index 2363d831fe57..00e59d23bdb2 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c @@ -18,6 +18,11 @@ * *****************************************************************************/ +#include +#include + +#define GetPageCount(size, offset) ((((size) + ((offset) & ~PAGE_CACHE_MASK)) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT) + #include #include "gc_hal_kernel_precomp.h" @@ -396,13 +401,14 @@ _AllocateMemory( || (*Pool == gcvPOOL_UNIFIED) #if (0==gcdPAGE_ALLOC_LIMIT) // dkm : let gcvPOOL_SYSTEM can use contiguous memory - || ((*Pool == gcvPOOL_SYSTEM) && (pool==gcvPOOL_CONTIGUOUS)) + //|| ((*Pool == gcvPOOL_SYSTEM) && (pool==gcvPOOL_CONTIGUOUS)) #endif ); if (gcmIS_SUCCESS(status)) { /* Return pool used for allocation. */ + //if(pool == gcvPOOL_VIRTUAL) printk(" pool=%d->%d, Bytes=%d, Type=%d\n", *Pool, pool, (int)Bytes, Type); *Pool = pool; } else { printk("_AllocateMemory fail! pool=%d->%d, Bytes=%d, Type=%d\n", *Pool, pool, (int)Bytes, Type); @@ -621,6 +627,13 @@ gckKERNEL_Dispatch( bytes = Interface->u.AllocateVideoMemory.width * bitsPerPixel * Interface->u.AllocateVideoMemory.height * Interface->u.AllocateVideoMemory.depth / 8; + /* + printk(" VM-> %d (%d) : %d (%d)\n", + Interface->u.AllocateVideoMemory.pool, + Interface->u.AllocateVideoMemory.type, + (int)GetPageCount(gcmALIGN(bytes, PAGE_SIZE), 0), + (int)bytes); + */ /* Allocate memory. */ #ifdef __QNXNTO__ @@ -644,6 +657,13 @@ gckKERNEL_Dispatch( break; case gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY: + /* + printk(" LVM-> %d (%d) : %d (%d)\n", + Interface->u.AllocateLinearVideoMemory.pool, + Interface->u.AllocateLinearVideoMemory.type, + (int)GetPageCount(gcmALIGN(Interface->u.AllocateLinearVideoMemory.bytes, PAGE_SIZE), 0), + (int)Interface->u.AllocateLinearVideoMemory.bytes); + */ /* Allocate memory. */ #ifdef __QNXNTO__ gcmkONERROR( diff --git a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c old mode 100644 new mode 100755 index 213f4f527cf1..f7164e2fb520 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c @@ -1007,6 +1007,8 @@ gckEVENT_Notify( /* Verify the arguments. */ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT); + dprintk(D_IRQ, "irq "); + for (;;) { /* Suspend interrupts. */ @@ -1352,6 +1354,7 @@ gckEVENT_Submit( if (Wait && (status == gcvSTATUS_OUT_OF_RESOURCES)) { /* Delay a while. */ + printk("gpu : gckEVENT_Submit -> _GetEvent fail! Delay 1ms!\n"); gcmkONERROR(gckOS_Delay(Event->os, 1)); #if gcdGPU_TIMEOUT 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 index d4ec38325e26..24f7fd4f8d49 100755 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_heap.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_heap.c @@ -824,6 +824,9 @@ gckHEAP_Free( /* Mark the node as freed. */ node->next = gcvNULL; + + // dkm : clear the buffer for safe + //memset(Memory, 0, node->bytes - sizeof(gcskNODE)); #if VIVANTE_PROFILER || gcdDEBUG /* Update profile counters. */ 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 old mode 100644 new mode 100755 index 007fe56ad571..927a57bd4e1c --- 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,15 +822,16 @@ gckVIDMEM_AllocateLinear( acquired = gcvTRUE; -#if 0 +#if 1 // dkm: ¶ÔÓÚ»¨ÆÁËÀ»úµÄÎÊÌ⣬¸Ð¾õVVÕâô×öÖ»Êǹæ±Ü£¬»¹ÊÇûÓÐÕÒµ½ÎÊÌâµÄÔ­Òò if (Type == gcvSURF_TILE_STATUS - && (Bytes + (1 << 20) > Memory->freeBytes) - ) + && (Bytes + (1 << 20) > Memory->freeBytes)) { + //printk("alloc = %d, freeBytes = %d!, return OUT_OF_MEMORY!\n", (int)Bytes, (int)Memory->freeBytes); /* Not enough memory. */ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } + //printk("alloc = %d, freeBytes = %d!\n", (int)Bytes, (int)Memory->freeBytes); #else // dkm : ΪgcvSURF_TILE_STATUS±£Áô2MµÄ¿Õ¼ä if (Type != gcvSURF_TILE_STATUS @@ -909,6 +910,9 @@ gckVIDMEM_AllocateLinear( /* Remove alignment. */ alignment = 0; + } else { + // dkm : Out of memory + gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } } @@ -916,7 +920,10 @@ gckVIDMEM_AllocateLinear( if (node->VidMem.bytes - Bytes > Memory->threshold) { /* Adjust the node size. */ - _Split(Memory->os, node, Bytes); + if(!_Split(Memory->os, node, Bytes)) { + // dkm : Out of memory + gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); + } } /* Remove the node from the free list. */ diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_debug.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_debug.c old mode 100644 new mode 100755 index 4f1cd0cd34ec..e4f899f0a373 --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_debug.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_debug.c @@ -74,7 +74,9 @@ OutputDebugString( #else if (String != gcvNULL) { - printk(String); +//#define ddprintk(args...) printk(KERN_DEBUG args) + printk(KERN_DEBUG "%s", String); + //printk(String); } #endif } diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_device.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_device.c old mode 100644 new mode 100755 index 9440eed8271e..5bfdab33993e --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_device.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_device.c @@ -28,6 +28,8 @@ #include #include +extern unsigned int regAddress; + #define _GC_OBJ_ZONE gcvZONE_DEVICE #ifdef FLAREON @@ -498,6 +500,7 @@ gckGALDEVICE_Construct( } // dkm: print te regbase printk("---- gpu regbase: 0x%08x ---- \n", (unsigned int)device->registerBase); + regAddress = (unsigned int)device->registerBase; physical += RegisterMemSize; @@ -619,7 +622,7 @@ gckGALDEVICE_Construct( { /* map internal memory */ device->externalPhysical = (gctPHYS_ADDR)physical; -// dkm: gcdENABLE_MEM_CACHE +// dkm: gcdENABLE_MEM_CACHE #if (1==gcdENABLE_MEM_CACHE) device->externalLogical = (gctPOINTER)ioremap_cached( physical, device->externalSize); @@ -738,7 +741,7 @@ gckGALDEVICE_Construct( device->contiguousPhysical = (gctPHYS_ADDR) ContiguousBase; device->contiguousSize = ContiguousSize; -// dkm: gcdENABLE_MEM_CACHE +// dkm: gcdENABLE_MEM_CACHE #if (1==gcdENABLE_MEM_CACHE) device->contiguousBase = (gctPOINTER) ioremap_cached(ContiguousBase, ContiguousSize); #else 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 index e386343e9f32..240340c2b8fc 100755 --- 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 @@ -91,6 +91,11 @@ unsigned long coreClock = 552*1000000; module_param(coreClock, ulong, 0644); #endif +uint gpu_dmask = D_ERROR; +module_param(gpu_dmask, uint, 0644); + +unsigned int regAddress = 0; + // gcdkREPORT_VIDMEM_USAGE add by vv #if gcdkREPORT_VIDMEM_USAGE #include @@ -547,6 +552,8 @@ long drv_ioctl(struct file *filp, } #endif + dprintk(D_IOCTL, "gckKERNEL_Dispatch(FromUser %d, Cmd %d)\n", (ioctlCode == IOCTL_GCHAL_INTERFACE), iface.command); + status = gckKERNEL_Dispatch(device->kernel, (ioctlCode == IOCTL_GCHAL_INTERFACE) , &iface); @@ -1299,5 +1306,142 @@ static void __exit gpu_exit(void) module_init(gpu_init); module_exit(gpu_exit); + +#ifdef CONFIG_PROC_FS +#include +#include + +struct RegDefine { + char regname[35]; + uint offset; +}; + +struct RegDefine reg_def[] = +{ + {"AQHiClockControl", 0x0000}, + {"AQHiIdle", 0x0001}, + {"AQAxiConfig", 0x0002}, + {"AQAxiStatus", 0x0003}, + {"AQIntrAcknowledge", 0x0004}, + {"AQIntrEnbl", 0x0005}, + {"AQIdent", 0x0006}, + {"GCFeatures", 0x0007}, + {"GCChipId", 0x0008}, + {"GCChipRev", 0x0009}, + {"GCChipDate", 0x000A}, + {"GCChipTime", 0x000B}, + {"GCChipCustomer", 0x000C}, + {"GCMinorFeatures0", 0x000D}, + {"GCCacheControl", 0x000E}, + {"GCResetMemCounters", 0x000F}, + {"gcTotalReads", 0x0010}, + {"gcTotalWrites", 0x0011}, + {"gcChipSpecs", 0x0012}, + {"gcTotalWriteBursts", 0x0013}, + {"gcTotalWriteReqs", 0x0014}, + {"gcTotalWriteLasts", 0x0015}, + {"gcTotalReadBursts", 0x0016}, + {"gcTotalReadReqs", 0x0017}, + {"gcTotalReadLasts", 0x0018}, + {"gcGpOut0", 0x0019}, + {"gcGpOut1", 0x001A}, + {"gcGpOut2", 0x001B}, + {"gcAxiControl", 0x001C}, + {"GCMinorFeatures1", 0x001D}, + {"gcTotalCycles", 0x001E}, + {"gcTotalIdleCycles", 0x001F}, + + {"AQMemoryFePageTable", 0x0100}, + {"AQMemoryTxPageTable", 0x0101}, + {"AQMemoryPePageTable", 0x0102}, + {"AQMemoryPezPageTable", 0x0103}, + {"AQMemoryRaPageTable", 0x0104}, + {"AQMemoryDebug", 0x0105}, + {"AQMemoryRa", 0x0106}, + {"AQMemoryFe", 0x0107}, + {"AQMemoryTx", 0x0108}, + {"AQMemoryPez", 0x0109}, + {"AQMemoryPec", 0x010A}, + {"AQRegisterTimingControl", 0x010B}, + {"gcMemoryReserved", 0x010C}, + {"gcDisplayPriority", 0x010D}, + {"gcDbgCycleCounter", 0x010E}, + {"gcOutstandingReads0", 0x010F}, + {"gcOutstandingReads1", 0x0110}, + {"gcOutstandingWrites", 0x0111}, + {"gcDebugSignalsRa", 0x0112}, + {"gcDebugSignalsTx", 0x0113}, + {"gcDebugSignalsFe", 0x0114}, + {"gcDebugSignalsPe", 0x0115}, + {"gcDebugSignalsDe", 0x0116}, + {"gcDebugSignalsSh", 0x0117}, + {"gcDebugSignalsPa", 0x0118}, + {"gcDebugSignalsSe", 0x0119}, + {"gcDebugSignalsMc", 0x011A}, + {"gcDebugSignalsHi", 0x011B}, + {"gcDebugControl0", 0x011C}, + {"gcDebugControl1", 0x011D}, + {"gcDebugControl2", 0x011E}, + {"gcDebugControl3", 0x011F}, + {"gcBusControl", 0x0120}, + {"gcregEndianness0", 0x0121}, + {"gcregEndianness1", 0x0122}, + {"gcregEndianness2", 0x0123}, + {"gcregDrawPrimitiveStartTimeStamp", 0x0124}, + {"gcregDrawPrimitiveEndTimeStamp", 0x0125}, + {"gcregReqBankAddrMask", 0x0126}, + {"gcregReqRowAddrMask", 0x0127}, + + //{"gcregReqWeight", 0x0025}, + //{"gcregRdReqAgingThresh", 0x0013}, + //{"gcregWrReqAgingThresh", 0x0014}, + + {"AQCmdBufferAddr", 0x0195}, + {"AQCmdBufferCtrl", 0x0196}, + {"AQFEDebugState", 0x0198}, + {"AQFEDebugCurCmdAdr", 0x0199}, + {"AQFEDebugCmdLowReg", 0x019A}, + {"AQFEDebugCmdHiReg", 0x019B}, + + {"gcModulePowerControls", 0x0040}, + {"gcModulePowerModuleControl", 0x0041}, + {"gcModulePowerModuleStatus", 0x0042}, +}; + +#define gpu_readl(offset) readl(regAddress + offset*4) + +static int proc_gpu_show(struct seq_file *s, void *v) +{ + int i = 0; + seq_printf(s, "gpu regs:\n"); + + for(i=0; ipageNum8=0; os->pageNum8<40; os->pageNum8++) { + for(os->pageNum8=0; os->pageNum8<55; os->pageNum8++) { #if USE_DMA_COHERENT os->addr8[os->pageNum8] = #if (2==gcdENABLE_MEM_CACHE) @@ -3096,6 +3096,9 @@ gckOS_AllocatePagedMemory( ** Pointer to a variable that receives the physical address of the ** memory allocation. */ + +//static int alloc_page = 0; + gceSTATUS gckOS_AllocatePagedMemoryEx( IN gckOS Os, IN gctBOOL Contiguous, @@ -3162,6 +3165,9 @@ gceSTATUS gckOS_AllocatePagedMemoryEx( return gcvSTATUS_OUT_OF_MEMORY; } + //alloc_page += numPages; + //printk("+ %d / %d addr=%p\n", numPages , alloc_page, addr); + mdl = _CreateMdl(current->tgid); if (mdl == gcvNULL) @@ -3306,6 +3312,9 @@ gceSTATUS gckOS_FreePagedMemory( vfree(mdl->addr); } + //alloc_page -= mdl->numPages; + //printk("- %d / %d\n", mdl->numPages , alloc_page); + /* Remove the node from global list. */ if (mdl == Os->mdlHead) {