summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoren Huang <b02279@freescale.com>2014-01-09 17:03:08 +0800
committerLoren Huang <b02279@freescale.com>2014-01-09 19:04:43 +0800
commit59bbee0949709f1f136c2f7296805d5d8920ce5b (patch)
tree61096bcf65c0a27b876a6c05f5a6f0da9e1c2948
parentcc31ffb1157ea7a4f8a8ca5d7c1c30218c4c413f (diff)
ENGR00284988 gpu:Sync gpu kernel driver code
Sync the code with commit 255ee1de in gpu-viv git. Mainly covered tickets: ENGR00288588 fixed system reboot when run webGL test ENGR00284988 Camera recording kernel crash on WFD source ENGR00283494 Modify Status to status to avoid build error ENGR00278179-1 query video memory with seperate types Signed-off-by: Loren Huang <b02279@freescale.com> Acked-by: Shawn Guo
-rw-r--r--drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c17
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c80
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h6
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c56
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c4
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c31
-rwxr-xr-xdrivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h4
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h22
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h20
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h3
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h1
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c2
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c1
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c42
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h2
15 files changed, 254 insertions, 37 deletions
diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c
index bdf9e13e7ca7..e8ad2ea3e031 100644
--- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c
+++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c
@@ -4163,6 +4163,23 @@ gckHARDWARE_SetPowerManagementState(
** if lock holder call gckCOMMAND_Stall() */
gcmkONERROR(gcvSTATUS_INVALID_REQUEST);
}
+#if gcdPOWEROFF_TIMEOUT
+ else if(State == gcvPOWER_OFF && timeout == gcvTRUE)
+ {
+ /*
+ ** try to aqcuire the mutex with more milliseconds,
+ ** flush_delayed_work should be running with timeout,
+ ** so waiting here will cause deadlock */
+ status = gckOS_AcquireMutex(os, Hardware->powerMutex, gcdPOWEROFF_TIMEOUT);
+
+ if (status == gcvSTATUS_TIMEOUT)
+ {
+ gckOS_Print("GPU Timer deadlock, exit by timeout!!!!\n");
+
+ gcmkONERROR(gcvSTATUS_INVALID_REQUEST);
+ }
+ }
+#endif
else
{
/* Acquire the power mutex. */
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
index e8563b771ff1..88535488b916 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
@@ -1181,10 +1181,37 @@ gckKERNEL_Dispatch(
if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
{
bytes = node->VidMem.bytes;
+
+ gcmkONERROR(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID, gcvDB_VIDEO_MEMORY_RESERVED,
+ node,
+ gcvNULL,
+ bytes));
}
else
{
bytes = node->Virtual.bytes;
+
+ if(node->Virtual.contiguous)
+ {
+ gcmkONERROR(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID, gcvDB_VIDEO_MEMORY_CONTIGUOUS,
+ node,
+ gcvNULL,
+ bytes));
+ }
+ else
+ {
+ gcmkONERROR(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID, gcvDB_VIDEO_MEMORY_VIRTUAL,
+ node,
+ gcvNULL,
+ bytes));
+ }
+
}
gcmkONERROR(
@@ -1221,6 +1248,28 @@ gckKERNEL_Dispatch(
processID, gcvDB_VIDEO_MEMORY,
node));
+ if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+ {
+ gcmkONERROR(
+ gckKERNEL_RemoveProcessDB(Kernel,
+ processID, gcvDB_VIDEO_MEMORY_RESERVED,
+ node));
+ }
+ else if(node->Virtual.contiguous)
+ {
+ gcmkONERROR(
+ gckKERNEL_RemoveProcessDB(Kernel,
+ processID, gcvDB_VIDEO_MEMORY_CONTIGUOUS,
+ node));
+ }
+ else
+ {
+ gcmkONERROR(
+ gckKERNEL_RemoveProcessDB(Kernel,
+ processID, gcvDB_VIDEO_MEMORY_VIRTUAL,
+ node));
+ }
+
break;
case gcvHAL_LOCK_VIDEO_MEMORY:
@@ -1467,12 +1516,12 @@ gckKERNEL_Dispatch(
if (hardware)
{
/* This signal is bound to a hardware,
- ** so the timeout is limited by gcdGPU_TIMEOUT.
+ ** so the timeout is limited by Kernel->timeOut.
*/
timer += gcdGPU_ADVANCETIMER;
}
- if (timer >= gcdGPU_TIMEOUT)
+ if (timer >= Kernel->timeOut)
{
gcmkONERROR(
gckOS_Broadcast(Kernel->os,
@@ -1898,6 +1947,33 @@ gckKERNEL_Dispatch(
&Interface->u.Database.gpuIdle));
break;
+ case gcvHAL_VIDMEM_DATABASE:
+ /* Query reserved video memory. */
+ gcmkONERROR(
+ gckKERNEL_QueryProcessDB(Kernel,
+ Interface->u.VidMemDatabase.processID,
+ !Interface->u.VidMemDatabase.validProcessID,
+ gcvDB_VIDEO_MEMORY_RESERVED,
+ &Interface->u.VidMemDatabase.vidMemResv));
+
+ /* Query contiguous video memory. */
+ gcmkONERROR(
+ gckKERNEL_QueryProcessDB(Kernel,
+ Interface->u.VidMemDatabase.processID,
+ !Interface->u.VidMemDatabase.validProcessID,
+ gcvDB_VIDEO_MEMORY_CONTIGUOUS,
+ &Interface->u.VidMemDatabase.vidMemCont));
+
+ /* Query virtual video memory. */
+ gcmkONERROR(
+ gckKERNEL_QueryProcessDB(Kernel,
+ Interface->u.VidMemDatabase.processID,
+ !Interface->u.VidMemDatabase.validProcessID,
+ gcvDB_VIDEO_MEMORY_VIRTUAL,
+ &Interface->u.VidMemDatabase.vidMemVirt));
+
+ break;
+
case gcvHAL_VERSION:
Interface->u.Version.major = gcvVERSION_MAJOR;
Interface->u.Version.minor = gcvVERSION_MINOR;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
index 1c40df2fe563..6126bae3201d 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
@@ -143,6 +143,9 @@ typedef enum _gceDATABASE_TYPE
gcvDB_SHARED_INFO, /* Private data */
gcvDB_MAP_USER_MEMORY, /* Map user memory */
gcvDB_SYNC_POINT, /* Sync point. */
+ gcvDB_VIDEO_MEMORY_RESERVED, /* Reserved video memory */
+ gcvDB_VIDEO_MEMORY_CONTIGUOUS, /* Contiguous video memory */
+ gcvDB_VIDEO_MEMORY_VIRTUAL, /* Virtual video memory */
}
gceDATABASE_TYPE;
@@ -181,6 +184,9 @@ typedef struct _gcsDATABASE
gcsDATABASE_COUNTERS contiguous;
gcsDATABASE_COUNTERS mapUserMemory;
gcsDATABASE_COUNTERS mapMemory;
+ gcsDATABASE_COUNTERS vidMemResv;
+ gcsDATABASE_COUNTERS vidMemCont;
+ gcsDATABASE_COUNTERS vidMemVirt;
/* Idle time management. */
gctUINT64 lastIdle;
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
index 134351a48ca9..b181f55ec55e 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
@@ -689,6 +689,15 @@ gckKERNEL_CreateProcessDB(
database->mapUserMemory.bytes = 0;
database->mapUserMemory.maxBytes = 0;
database->mapUserMemory.totalBytes = 0;
+ database->vidMemResv.bytes = 0;
+ database->vidMemResv.maxBytes = 0;
+ database->vidMemResv.totalBytes = 0;
+ database->vidMemCont.bytes = 0;
+ database->vidMemCont.maxBytes = 0;
+ database->vidMemCont.totalBytes = 0;
+ database->vidMemVirt.bytes = 0;
+ database->vidMemVirt.maxBytes = 0;
+ database->vidMemVirt.totalBytes = 0;
for (i = 0; i < gcmCOUNTOF(database->list); i++)
{
@@ -905,6 +914,18 @@ gckKERNEL_AddProcessDB(
count = &database->mapUserMemory;
break;
+ case gcvDB_VIDEO_MEMORY_RESERVED:
+ count = &database->vidMemResv;
+ break;
+
+ case gcvDB_VIDEO_MEMORY_CONTIGUOUS:
+ count = &database->vidMemCont;
+ break;
+
+ case gcvDB_VIDEO_MEMORY_VIRTUAL:
+ count = &database->vidMemVirt;
+ break;
+
default:
count = gcvNULL;
break;
@@ -1004,6 +1025,18 @@ gckKERNEL_RemoveProcessDB(
database->mapUserMemory.bytes -= bytes;
break;
+ case gcvDB_VIDEO_MEMORY_RESERVED:
+ database->vidMemResv.bytes -= bytes;
+ break;
+
+ case gcvDB_VIDEO_MEMORY_CONTIGUOUS:
+ database->vidMemCont.bytes -= bytes;
+ break;
+
+ case gcvDB_VIDEO_MEMORY_VIRTUAL:
+ database->vidMemVirt.bytes -= bytes;
+ break;
+
default:
break;
}
@@ -1319,6 +1352,11 @@ gckKERNEL_DestroyProcessDB(
break;
#endif
+ case gcvDB_VIDEO_MEMORY_RESERVED:
+ case gcvDB_VIDEO_MEMORY_CONTIGUOUS:
+ case gcvDB_VIDEO_MEMORY_VIRTUAL:
+ break;//Nothing to do
+
default:
gcmkTRACE_ZONE(gcvLEVEL_ERROR, gcvZONE_DATABASE,
"DB: Correcupted record=0x%08x type=%d",
@@ -1436,6 +1474,24 @@ gckKERNEL_QueryProcessDB(
gcmSIZEOF(database->mapUserMemory));
break;
+ case gcvDB_VIDEO_MEMORY_RESERVED:
+ gckOS_MemCopy(&Info->counters,
+ &database->vidMemResv,
+ gcmSIZEOF(database->vidMemResv));
+ break;
+
+ case gcvDB_VIDEO_MEMORY_CONTIGUOUS:
+ gckOS_MemCopy(&Info->counters,
+ &database->vidMemCont,
+ gcmSIZEOF(database->vidMemCont));
+ break;
+
+ case gcvDB_VIDEO_MEMORY_VIRTUAL:
+ gckOS_MemCopy(&Info->counters,
+ &database->vidMemVirt,
+ gcmSIZEOF(database->vidMemVirt));
+ break;
+
default:
break;
}
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c
index a689bc3e323a..a36de6ec7dc0 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c
@@ -2399,10 +2399,10 @@ gckOS_SetDebugZones(
void
gckOS_Verify(
- IN gceSTATUS Status
+ IN gceSTATUS status
)
{
- _lastError = Status;
+ _lastError = status;
}
/*******************************************************************************
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 2d81a5675d27..94593d8e9968 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
@@ -323,6 +323,33 @@ __RemoveRecordFromProcessDB(
Record->processID,
gcvDB_VIDEO_MEMORY,
gcmUINT64_TO_PTR(Record->info.u.FreeVideoMemory.node)));
+
+ {
+ gcuVIDMEM_NODE_PTR node = (gcuVIDMEM_NODE_PTR)(gcmUINT64_TO_PTR(Record->info.u.FreeVideoMemory.node));
+
+ if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+ {
+ gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(Event->kernel,
+ Record->processID,
+ gcvDB_VIDEO_MEMORY_RESERVED,
+ node));
+ }
+ else if(node->Virtual.contiguous)
+ {
+ gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(Event->kernel,
+ Record->processID,
+ gcvDB_VIDEO_MEMORY_CONTIGUOUS,
+ node));
+ }
+ else
+ {
+ gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(Event->kernel,
+ Record->processID,
+ gcvDB_VIDEO_MEMORY_VIRTUAL,
+ node));
+ }
+ }
+
break;
case gcvHAL_UNLOCK_VIDEO_MEMORY:
@@ -749,13 +776,13 @@ gckEVENT_GetEvent(
/* Increment the wait timer. */
timer += 1;
- if (timer == gcdGPU_TIMEOUT)
+ if (timer == Event->kernel->timeOut)
{
/* Try to call any outstanding events. */
gcmkONERROR(gckHARDWARE_Interrupt(Event->kernel->hardware,
gcvTRUE));
}
- else if (timer > gcdGPU_TIMEOUT)
+ else if (timer > Event->kernel->timeOut)
{
gcmkTRACE_N(
gcvLEVEL_ERROR,
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h
index 9c1711404c4c..375a8f5b03d1 100755
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h
@@ -3485,12 +3485,12 @@ gckOS_DebugBreak(
void
gcoOS_Verify(
- IN gceSTATUS Status
+ IN gceSTATUS status
);
void
gckOS_Verify(
- IN gceSTATUS Status
+ IN gceSTATUS status
);
#if gcmIS_DEBUG(gcdDEBUG_ASSERT)
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h
index 062224c741c4..f8413700031a 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h
@@ -18,7 +18,6 @@
*
*****************************************************************************/
-
/*
** Include file the defines the front- and back-end compilers, as well as the
** objects they use.
@@ -712,6 +711,27 @@ gcSHADER_CheckClipW(
OUT gctBOOL * clipW);
/*******************************************************************************
+** gcSHADER_GetUniformVectorCount
+**
+** Get the number of vectors used by uniforms for this shader.
+**
+** INPUT:
+**
+** gcSHADER Shader
+** Pointer to a gcSHADER object.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Count
+** Pointer to a variable receiving the number of vectors.
+*/
+gceSTATUS
+gcSHADER_GetUniformVectorCount(
+ IN gcSHADER Shader,
+ OUT gctSIZE_T * Count
+ );
+
+/*******************************************************************************
** gcOptimizer Data Structures
*******************************************************************************/
typedef enum _gceSHADER_OPTIMIZATION
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h
index fc8c39539972..ea86349dcf97 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h
@@ -172,6 +172,9 @@ typedef enum _gceHAL_COMMAND_CODES
/* Create native fence and return its fd. */
gcvHAL_CREATE_NATIVE_FENCE,
+
+ /* Video memory database */
+ gcvHAL_VIDMEM_DATABASE,
}
gceHAL_COMMAND_CODES;
@@ -847,6 +850,23 @@ typedef struct _gcsHAL_INTERFACE
}
Database;
+ /* gcvHAL_VIDMEM_DATABASE */
+ struct _gcsHAL_VIDMEM_DATABASE
+ {
+ /* Set to gcvTRUE if you want to query a particular process ID.
+ ** Set to gcvFALSE to query the last detached process. */
+ IN gctBOOL validProcessID;
+
+ /* Process ID to query. */
+ IN gctUINT32 processID;
+
+ /* Information. */
+ OUT gcuDATABASE_INFO vidMemResv;
+ OUT gcuDATABASE_INFO vidMemCont;
+ OUT gcuDATABASE_INFO vidMemVirt;
+ }
+ VidMemDatabase;
+
/* gcvHAL_VERSION */
struct _gcsHAL_VERSION
{
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h
index 06eea79447bc..c4347e1e0bbc 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h
@@ -18,7 +18,6 @@
*
*****************************************************************************/
-
#ifndef __gc_hal_eglplatform_h_
#define __gc_hal_eglplatform_h_
@@ -46,7 +45,7 @@ typedef struct __BITFIELDINFO{
#elif defined(LINUX) && defined(EGL_API_DFB) && !defined(__APPLE__)
#include <directfb.h>
typedef struct _DFBDisplay * HALNativeDisplayType;
-typedef IDirectFBWindow * HALNativeWindowType;
+typedef struct _DFBWindow * HALNativeWindowType;
typedef struct _DFBPixmap * HALNativePixmapType;
#elif defined(LINUX) && defined(EGL_API_FB) && !defined(__APPLE__)
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h
index 14801aae46db..b44652944c92 100644
--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h
@@ -1047,6 +1047,7 @@ typedef enum _gcePATCH_ID
gcePATCH_CHORME,
gcePATCH_DUOKANTV,
gcePATCH_TESTAPP,
+ gcePATCH_GOOGLEEARTH,
/* Count enum*/
gcePATCH_COUNT,
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 ea0dc22f9375..bff85a0e9bf4 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
@@ -336,7 +336,7 @@ gckGALDEVICE_Construct(
PhysBaseAddr, PhysSize, Signal);
/* Allocate device structure. */
- device = kmalloc(sizeof(struct _gckGALDEVICE), GFP_KERNEL | __GFP_NOWARN);
+ device = kmalloc(sizeof(struct _gckGALDEVICE), GFP_KERNEL);
if (!device)
{
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c
index 4fcf45ac4a64..ebd316e24c5b 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c
@@ -19,7 +19,6 @@
*
*****************************************************************************/
-
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/notifier.h>
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 7f41087f62a1..39c90f270cf5 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
@@ -375,10 +375,10 @@ _CreateMdlMap(
return gcvNULL;
}
- mdlMap->pid = ProcessID;
- mdlMap->vmaAddr = gcvNULL;
- mdlMap->vma = gcvNULL;
- mdlMap->reference = 0;
+ mdlMap->pid = ProcessID;
+ mdlMap->vmaAddr = gcvNULL;
+ mdlMap->vma = gcvNULL;
+ mdlMap->count = 0;
mdlMap->next = Mdl->maps;
Mdl->maps = mdlMap;
@@ -4433,16 +4433,7 @@ gckOS_LockPages(
up_write(&current->mm->mmap_sem);
}
-#if 0
- else
- {
- /* mdlMap->vmaAddr != gcvNULL means current process has already locked this node. */
- MEMORY_UNLOCK(Os);
-
- gcmkFOOTER_ARG("*status=%d, mdlMap->vmaAddr=%x", gcvSTATUS_MEMORY_LOCKED, mdlMap->vmaAddr);
- return gcvSTATUS_MEMORY_LOCKED;
- }
-#endif
+ mdlMap->count++;
/* Convert pointer to MDL. */
*Logical = mdlMap->vmaAddr;
@@ -4453,9 +4444,6 @@ gckOS_LockPages(
*PageCount = mdl->numPages * (PAGE_SIZE / 4096);
- /* Increase reference count. */
- mdlMap->reference++;
-
MEMORY_UNLOCK(Os);
gcmkVERIFY_OK(gckOS_CacheFlush(
@@ -4722,13 +4710,11 @@ gckOS_UnlockPages(
{
if ((mdlMap->vmaAddr != gcvNULL) && (_GetProcessID() == mdlMap->pid))
{
- if (--mdlMap->reference > 0)
+ if (--mdlMap->count == 0)
{
- continue;
+ _UnmapUserLogical(mdlMap->pid, mdlMap->vmaAddr, mdl->numPages * PAGE_SIZE);
+ mdlMap->vmaAddr = gcvNULL;
}
-
- _UnmapUserLogical(mdlMap->pid, mdlMap->vmaAddr, mdl->numPages * PAGE_SIZE);
- mdlMap->vmaAddr = gcvNULL;
}
mdlMap = mdlMap->next;
@@ -8593,7 +8579,17 @@ gckOS_StartTimer(
if (unlikely(delayed_work_pending(&timer->work)))
{
- cancel_delayed_work(&timer->work);
+ if (unlikely(!cancel_delayed_work(&timer->work)))
+ {
+ cancel_work_sync(&timer->work.work);
+
+ if (unlikely(delayed_work_pending(&timer->work)))
+ {
+ gckOS_Print("gckOS_StartTimer error, the pending worker cannot complete!!!! \n");
+
+ return gcvSTATUS_INVALID_REQUEST;
+ }
+ }
}
queue_delayed_work(Os->workqueue, &timer->work, msecs_to_jiffies(Delay));
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
index 501cf30e9273..b22081740fdb 100644
--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
@@ -26,8 +26,8 @@ typedef struct _LINUX_MDL_MAP
{
gctINT pid;
gctPOINTER vmaAddr;
+ gctUINT32 count;
struct vm_area_struct * vma;
- gctINT reference;
struct _LINUX_MDL_MAP * next;
}
LINUX_MDL_MAP;