From c649eacc2157407200a632e6a75c3739dbd372e1 Mon Sep 17 00:00:00 2001 From: Xianzhong Date: Thu, 27 Apr 2017 19:44:33 +0800 Subject: [PATCH] MGS-2832: gpu: integrate partial changes for 6.2.2 - gpu hang when enable the vprofiler on imx6qp - gpu axi bus error with user surface mapping - OpenCL driver issue for initialier failure - GL benchmark performance optimization - X11 and Android critical bug-fixing Signed-off-by: Xianzhong --- .../hal/kernel/arch/gc_hal_kernel_hardware.c | 15 ++++++++++++ .../hal/kernel/gc_hal_kernel_command.c | 18 ++++++++++---- .../gpu-viv/hal/kernel/gc_hal_kernel_event.c | 14 ----------- .../os/linux/kernel/gc_hal_kernel_allocator.c | 7 +++--- .../os/linux/kernel/gc_hal_kernel_device.c | 2 -- .../hal/os/linux/kernel/gc_hal_kernel_linux.h | 4 ++-- .../hal/os/linux/kernel/gc_hal_kernel_os.c | 24 +++++++++---------- .../gc_hal_kernel_platform_imx6.config | 1 + 8 files changed, 47 insertions(+), 38 deletions(-) diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c index bc02e02798ed..e98cd907654d 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c +++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c @@ -10765,6 +10765,7 @@ gckHARDWARE_UpdateContextNewProfile( gctUINT32 totalRead, totalWrite; gctUINT32 mc_axi_max_min_latency; gctUINT32 temp; + gckCOMMAND command = Hardware->kernel->command; gcmkHEADER_ARG("Hardware=0x%x Context=0x%x", Hardware, Context); @@ -10772,6 +10773,11 @@ gckHARDWARE_UpdateContextNewProfile( gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); gcmkVERIFY_OBJECT(Context, gcvOBJ_CONTEXT); + /* Acquire the context sequnence mutex. */ + gcmkONERROR(gckOS_AcquireMutex( + command->os, command->mutexContextSeq, gcvINFINITE + )); + chipModel = Hardware->identity.chipModel; chipRevision = Hardware->identity.chipRevision; if ((chipModel == gcv5000 && chipRevision == 0x5434) || (chipModel == gcv3000 && chipRevision == 0x5435)) @@ -11932,11 +11938,20 @@ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((g gcmkUPDATE_PROFILE_DATA_PART2(l2_axi1_total_latency); gcmkUPDATE_PROFILE_DATA_PART2(l2_axi1_total_request_count); + gcmkVERIFY_OK(gckOS_ReleaseMutex( + command->os, command->mutexContextSeq + )); + /* Success. */ gcmkFOOTER_NO(); return gcvSTATUS_OK; OnError: + + gckOS_ReleaseMutex( + command->os, command->mutexContextSeq + ); + /* Return the status. */ gcmkFOOTER(); return status; diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c index 51b4274cf6ec..59a4fcc306c5 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c @@ -2553,6 +2553,19 @@ gckCOMMAND_Commit( gcmkONERROR(gckCOMMAND_ExitCommit(Command, gcvFALSE)); commitEntered = gcvFALSE; + if ((Command->kernel->hardware->gpuProfiler == gcvTRUE) && + (Command->kernel->profileEnable == gcvTRUE) && + (Command->kernel->profileSyncMode == gcvTRUE)) + { + gcmkONERROR(gckCOMMAND_Stall(Command, gcvTRUE)); + + if (Command->currContext) + { + gcmkONERROR(gckHARDWARE_UpdateContextNewProfile( + hardware, + Command->currContext)); + } + } /* Loop while there are records in the queue. */ while (EventQueue != gcvNULL) @@ -2599,11 +2612,8 @@ gckCOMMAND_Commit( EventQueue = nextEventRecord; } - if ((Command->kernel->eventObj->queueHead == gcvNULL + if (Command->kernel->eventObj->queueHead == gcvNULL && Command->kernel->hardware->powerManagement == gcvTRUE) - || (Command->kernel->hardware->gpuProfiler == gcvTRUE - && Command->kernel->profileEnable == gcvTRUE) - ) { /* Commit done event by which work thread knows all jobs done. */ gcmkVERIFY_OK( diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c index 5927434f26ec..a848eb3743ca 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c @@ -2777,20 +2777,6 @@ gckEVENT_Notify( #endif case gcvHAL_COMMIT_DONE: - if (kernel->hardware->gpuProfiler == gcvTRUE - && kernel->profileEnable == gcvTRUE - && kernel->profileSyncMode == gcvTRUE - ) - { - /*gckHARDWARE_UpdateContextProfile( - kernel->hardware, - gcmUINT64_TO_PTR(record->info.u.CommitDone.context) - );*/ - gckHARDWARE_UpdateContextNewProfile( - kernel->hardware, - gcmUINT64_TO_PTR(record->info.u.CommitDone.context) - ); - } break; default: diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c index f855a9ef2eec..1e62d8742079 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c @@ -502,7 +502,6 @@ static const struct file_operations default_fops = { /***************************************************************************\ ************************ Default Allocator ********************************** \***************************************************************************/ -#define C_MAX_PAGENUM (50*1024) static gceSTATUS _DefaultAlloc( IN gckALLOCATOR Allocator, @@ -514,7 +513,7 @@ _DefaultAlloc( gceSTATUS status; gctUINT i; gctBOOL contiguous = Flags & gcvALLOC_FLAG_CONTIGUOUS; -#ifdef CONFIG_GPU_LOW_MEMORY_KILLER +#ifdef gcdSYS_FREE_MEMORY_LIMIT struct sysinfo temsysinfo; #endif @@ -523,12 +522,12 @@ _DefaultAlloc( gcmkHEADER_ARG("Mdl=%p NumPages=%zu Flags=0x%x", Mdl, NumPages, Flags); -#ifdef CONFIG_GPU_LOW_MEMORY_KILLER +#ifdef gcdSYS_FREE_MEMORY_LIMIT si_meminfo(&temsysinfo); if (Flags & gcvALLOC_FLAG_MEMLIMIT) { - if ( (temsysinfo.freeram < NumPages) || ((temsysinfo.freeram-NumPages) < C_MAX_PAGENUM) ) + if ( (temsysinfo.freeram < NumPages) || ((temsysinfo.freeram-NumPages) < gcdSYS_FREE_MEMORY_LIMIT) ) { gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c index 718fa86ec2ee..f192e22fe258 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c @@ -907,8 +907,6 @@ _SetupVidMem( } } - printk(" requested contiguousBase = 0x%08X\n", device->requestedContiguousBase); - return gcvSTATUS_OK; OnError: return status; diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h index 92fb2e5d5d7d..32233cc3418e 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h @@ -266,9 +266,9 @@ typedef struct _gcsSIGNAL #if LINUX_VERSION_CODE < KERNEL_VERSION(4,9,0) /* Parent timeline. */ struct sync_timeline * timeline; -#else +# else struct fence *fence; -#endif +# endif #endif } gcsSIGNAL; diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c index e5c13d5d432f..b348ac1ac2aa 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c @@ -74,8 +74,8 @@ #endif #if gcdANDROID_NATIVE_FENCE_SYNC -#include -#include "gc_hal_kernel_sync.h" +# include +# include "gc_hal_kernel_sync.h" #endif #if defined(CONFIG_ARM) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) @@ -5682,9 +5682,9 @@ gckOS_CreateSignal( #if gcdANDROID_NATIVE_FENCE_SYNC #if LINUX_VERSION_CODE < KERNEL_VERSION(4,9,0) signal->timeline = gcvNULL; -#else +# else signal->fence = gcvNULL; -#endif +# endif #endif gcmkONERROR(_AllocateIntegerId(&Os->signalDB, signal, &signal->id)); @@ -5806,9 +5806,9 @@ gckOS_Signal( #if gcdANDROID_NATIVE_FENCE_SYNC #if LINUX_VERSION_CODE < KERNEL_VERSION(4,9,0) struct sync_timeline * timeline = gcvNULL; -#else +# else struct fence * fence = gcvNULL; -#endif +# endif #endif gcmkHEADER_ARG("Os=0x%X Signal=0x%X State=%d", Os, Signal, State); @@ -5832,10 +5832,10 @@ gckOS_Signal( #if gcdANDROID_NATIVE_FENCE_SYNC #if LINUX_VERSION_CODE < KERNEL_VERSION(4,9,0) timeline = signal->timeline; -#else +# else fence = signal->fence; signal->fence = NULL; -#endif +# endif #endif } else @@ -5858,13 +5858,13 @@ gckOS_Signal( { sync_timeline_signal(timeline); } -#else +# else if (fence) { fence_signal(fence); fence_put(fence); } -#endif +# endif #endif /* Success. */ @@ -7211,7 +7211,7 @@ OnError: return status; } -#else /* v4.9.0 */ +# else /* v4.9.0 */ gceSTATUS gckOS_CreateSyncTimeline( @@ -7398,7 +7398,7 @@ OnError: return status; } -#endif /* v4.9.0 */ +# endif /* v4.9.0 */ #endif #if gcdSECURITY diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6.config b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6.config index 481bc5f4226a..edbabab4dfe3 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6.config +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6.config @@ -22,5 +22,6 @@ CUSTOMER_ALLOCATOR_OBJS := $(ALLOCATOR_ARRAY_H_LOCATION)/gc_hal_kernel_allocator EXTRA_CFLAGS += -DCLASS_NAME=\"gpu_class\" EXTRA_CFLAGS += -DgcdGPU_2D_TIMEOUT=20000 +EXTRA_CFLAGS += -DgcdSYS_FREE_MEMORY_LIMIT=51200 EXTRA_CFLAGS += -DNO_DMA_COHERENT=1 -- 2.17.1