]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ENGR00284988 gpu:Sync gpu kernel driver code
authorLoren Huang <b02279@freescale.com>
Thu, 9 Jan 2014 09:03:08 +0000 (17:03 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Wed, 20 Aug 2014 08:06:53 +0000 (10:06 +0200)
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
15 files changed:
drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c
drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h
drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h
drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h
drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h
drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h

index bdf9e13e7ca788bb82fd5428552c44026214fbd6..e8ad2ea3e0318624140abafbc852ef640999127d 100644 (file)
@@ -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. */
index e8563b771ff135cf2c16816b328c077108161bea..88535488b9164e06a1850fc3aeb1680d225f92df 100644 (file)
@@ -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;
index 1c40df2fe563cf446386f4d6ae0e64f9a1bf66c2..6126bae3201d52c4eb246143792c71bb21654c88 100644 (file)
@@ -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;
index 134351a48ca9a21330156aff029725015f30deec..b181f55ec55e71039ae8cdd69f003ebdb5a40fc2 100644 (file)
@@ -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;
     }
index a689bc3e323af3304b855fa10872d94032266c41..a36de6ec7dc0268cd63e0751230829247798ddc7 100644 (file)
@@ -2399,10 +2399,10 @@ gckOS_SetDebugZones(
 
 void
 gckOS_Verify(
-    IN gceSTATUS Status
+    IN gceSTATUS status
     )
 {
-    _lastError = Status;
+    _lastError = status;
 }
 
 /*******************************************************************************
index 2d81a5675d273eb07e9d71587758b25314ece15b..94593d8e9968de3f6950b4287e5c155ad9b646fd 100644 (file)
@@ -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,
index 9c1711404c4c6101fa7a73f5cd1ffc88b2b318fe..375a8f5b03d1fc8cad2e7f1e18728ae00d40e842 100755 (executable)
@@ -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)
index 062224c741c489c5fd2dcb7910996e8bdc44f02d..f8413700031a6f14aea0efee0c87530601c3be95 100644 (file)
@@ -18,7 +18,6 @@
 *
 *****************************************************************************/
 
-
 /*
 **     Include file the defines the front- and back-end compilers, as well as the
 **     objects they use.
@@ -711,6 +710,27 @@ gcSHADER_CheckClipW(
     IN gctCONST_STRING FragmentSource,
     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
 *******************************************************************************/
index fc8c39539972eac5dca25e767e1b17f6de7cdb2d..ea86349dcf97f1f5014c1d75cda5541fa4611168 100644 (file)
@@ -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
         {
index 06eea79447bc6ad0bbf813351f443c5355c7bc08..c4347e1e0bbc1dbf9bb49b873153a00604c275a8 100644 (file)
@@ -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__)
index 14801aae46db5efcd5e56f7491217eccd04f5b06..b44652944c922e72844534077f91b5d23ffd742d 100644 (file)
@@ -1047,6 +1047,7 @@ typedef enum _gcePATCH_ID
     gcePATCH_CHORME,
     gcePATCH_DUOKANTV,
     gcePATCH_TESTAPP,
+    gcePATCH_GOOGLEEARTH,
 
     /* Count enum*/
     gcePATCH_COUNT,
index ea0dc22f9375f87d2971896c9682968d8918f99b..bff85a0e9bf4baee008135ff7d041cfbf27d0e67 100644 (file)
@@ -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)
     {
index 88a7e4e625b227ddbb7f63426e4fd14bb79ad931..3822f37a44e2cb3f80dde4ca61d05a8bb64fb68d 100644 (file)
@@ -19,7 +19,6 @@
 *
 *****************************************************************************/
 
-
 #include <linux/device.h>
 #include <linux/slab.h>
 #include <linux/notifier.h>
index 7f41087f62a1364c79333f1805ceab7497d7873f..39c90f270cf550d1aeb12ea90e79943f4ffcb28e 100644 (file)
@@ -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));
index 501cf30e9273c368827897b36e006108109ac63d..b22081740fdbd3b1b7e8471974e4c4d1b1b2e503 100644 (file)
@@ -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;