Graphics: Dump the Commands in Queue when SGX timeout
authorgwang23 <gang.a.wang@intel.com>
Thu, 17 May 2012 03:47:05 +0000 (11:47 +0800)
committerbuildbot <buildbot@intel.com>
Mon, 21 May 2012 07:48:08 +0000 (00:48 -0700)
BZ: 32306

Add command dump remained in Queue when SGX timeout. Help to debug
SGX timeout/recovery issues.

Change-Id: I13e913b9fd1d4d9f7db1077b35fce35ddc814325
Signed-off-by: gwang23 <gang.a.wang@intel.com>
Reviewed-on: http://android.intel.com:8080/49157
Tested-by: Tong, BoX <box.tong@intel.com>
Reviewed-by: Xu, Randy <randy.xu@intel.com>
Tested-by: Xu, Randy <randy.xu@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/staging/mrst/pvr/services4/srvkm/common/queue.c

index f1e39e9..0af800a 100644 (file)
@@ -214,6 +214,69 @@ static IMG_VOID QueueDumpCmdComplete(COMMAND_COMPLETE_DATA *psCmdCompleteData,
 }
 
 
+static IMG_VOID QueueDumpCommand(SYS_DATA *psSysData)
+{
+       PVRSRV_QUEUE_INFO       *psQueue;
+       PVRSRV_COMMAND          *psCommand;
+       PVRSRV_SYNC_OBJECT      *psSyncWalker;
+       PVRSRV_SYNC_OBJECT      *psSyncEnd;
+       PVRSRV_SYNC_DATA        *psSyncData;
+       IMG_UINT32              start;
+
+       psQueue = psSysData->psQueueList;
+
+       while (psQueue)
+       {
+               start = psQueue->ui32ReadOffset;
+
+               PVR_LOG(("Queue Size:%d  ProcessID:0X%X", psQueue->ui32QueueSize, psQueue->ui32ProcessID));
+
+               while (start != psQueue->ui32WriteOffset)
+               {
+                       psCommand = (PVRSRV_COMMAND *)((unsigned int)psQueue->pvLinQueueKM + start);
+
+                       PVR_LOG(("CmdType:%d CmdSize:%d SrcCnt:%d DstCnt:%d", psCommand->CommandType,
+                               psCommand->uCmdSize, psCommand->ui32SrcSyncCount, psCommand->ui32DstSyncCount));
+
+                       psSyncWalker = psCommand->psDstSync;
+                       psSyncEnd = psSyncWalker + psCommand->ui32DstSyncCount;
+                       while (psSyncWalker < psSyncEnd)
+                       {
+                               psSyncData = psSyncWalker->psKernelSyncInfoKM->psSyncData;
+                               PVR_LOG(("\tDst Sync Object: Write[%X](%X:%X) Read[%X](%X:%X) Read2[%X](%X:%X)",
+                                       psSyncWalker->psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr,
+                                       psSyncData->ui32WriteOpsComplete, psSyncData->ui32WriteOpsPending,
+                                       psSyncWalker->psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr,
+                                       psSyncData->ui32ReadOpsComplete,  psSyncData->ui32ReadOpsPending,
+                                       psSyncWalker->psKernelSyncInfoKM->sReadOps2CompleteDevVAddr.uiAddr,
+                                       psSyncData->ui32ReadOps2Complete, psSyncData->ui32ReadOps2Pending));
+                               psSyncWalker++;
+                       }
+
+                       psSyncWalker = psCommand->psSrcSync;
+                       psSyncEnd = psSyncWalker + psCommand->ui32SrcSyncCount;
+                       while (psSyncWalker < psSyncEnd)
+                       {
+                               psSyncData = psSyncWalker->psKernelSyncInfoKM->psSyncData;
+                               PVR_LOG(("\tSrc Sync Object: Write[%X](%X:%X) Read[%X](%X:%X) Read2[%X](%X:%X)",
+                                       psSyncWalker->psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr,
+                                       psSyncData->ui32WriteOpsComplete, psSyncData->ui32WriteOpsPending,
+                                       psSyncWalker->psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr,
+                                       psSyncData->ui32ReadOpsComplete,  psSyncData->ui32ReadOpsPending,
+                                       psSyncWalker->psKernelSyncInfoKM->sReadOps2CompleteDevVAddr.uiAddr,
+                                       psSyncData->ui32ReadOps2Complete, psSyncData->ui32ReadOps2Pending));
+                               psSyncWalker++;
+                       }
+
+                       start += psCommand->uCmdSize;
+                       start &= (psQueue->ui32QueueSize - 1);
+               }
+
+               psQueue = psQueue->psNextKM;
+       }
+}
+
+
 static IMG_VOID QueueDumpDebugInfo_ForEachCb(PVRSRV_DEVICE_NODE *psDeviceNode)
 {
        if (psDeviceNode->sDevId.eDeviceClass == PVRSRV_DEVICE_CLASS_DISPLAY)
@@ -225,6 +288,7 @@ static IMG_VOID QueueDumpDebugInfo_ForEachCb(PVRSRV_DEVICE_NODE *psDeviceNode)
 
                SysAcquireData(&psSysData);
 
+
                psDeviceCommandData = psSysData->apsDeviceCommandData[psDeviceNode->sDevId.ui32DeviceIndex];
 
                if (psDeviceCommandData != IMG_NULL)
@@ -263,6 +327,7 @@ IMG_VOID QueueDumpDebugInfo(IMG_VOID)
 {
        SYS_DATA        *psSysData;
        SysAcquireData(&psSysData);
+       QueueDumpCommand(psSysData);
        List_PVRSRV_DEVICE_NODE_ForEach(psSysData->psDeviceNodeList, &QueueDumpDebugInfo_ForEachCb);
 }