static IMG_BOOL _SyncRecordPrint(PDLLIST_NODE psNode, IMG_PVOID pvCallbackData) { struct SYNC_RECORD *psSyncRec; SYNC_PRIMITIVE_BLOCK *psSyncBlock; DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf = IMG_NULL; pfnDumpDebugPrintf = g_pfnDumpDebugPrintf; psSyncRec = IMG_CONTAINER_OF(psNode, struct SYNC_RECORD, sNode); psSyncBlock = psSyncRec->psServerSyncPrimBlock; if (SYNC_RECORD_TYPE_UNKNOWN != psSyncRec->eRecordType) { if (psSyncBlock->pui32LinAddr) { IMG_VOID *pSyncAddr; pSyncAddr = psSyncBlock->pui32LinAddr + psSyncRec->ui32SyncOffset; PVR_DUMPDEBUG_LOG(("\t%s sync FWAddr=0x%08x Val=0x%08x (%s)", ((SYNC_RECORD_TYPE_SERVER==psSyncRec->eRecordType)?"Server":"Client"), (psSyncRec->ui32FwBlockAddr+psSyncRec->ui32SyncOffset), *(IMG_UINT32*)pSyncAddr, psSyncRec->szClassName)); } else { PVR_DUMPDEBUG_LOG(("\t%s sync FWAddr=0x%08x Val=<null ptr> (%s)", ((SYNC_RECORD_TYPE_SERVER==psSyncRec->eRecordType)?"Server":"Client"), (psSyncRec->ui32FwBlockAddr+psSyncRec->ui32SyncOffset), psSyncRec->szClassName)); } } return IMG_TRUE; }
static IMG_VOID _SyncRecordRequest(PVRSRV_DBGREQ_HANDLE hDebugRequestHandle, IMG_UINT32 ui32VerbLevel) { DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf = IMG_NULL; PVR_UNREFERENCED_PARAMETER(hDebugRequestHandle); pfnDumpDebugPrintf = g_pfnDumpDebugPrintf; if (ui32VerbLevel == DEBUG_REQUEST_VERBOSITY_HIGH) { PVR_DUMPDEBUG_LOG(("Dumping all sync records")); OSLockAcquire(g_hSyncRecordListLock); dllist_foreach_node(&g_sSyncRecordList, _SyncRecordPrint, IMG_NULL); OSLockRelease(g_hSyncRecordListLock); } }
static IMG_BOOL _ServerSyncState(PDLLIST_NODE psNode, IMG_PVOID pvCallbackData) { SERVER_SYNC_PRIMITIVE *psSync = IMG_CONTAINER_OF(psNode, SERVER_SYNC_PRIMITIVE, sNode); DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf = IMG_NULL; pfnDumpDebugPrintf = g_pfnDumpDebugPrintf; if (*psSync->psSync->pui32LinAddr != psSync->ui32NextOp) { PVR_DUMPDEBUG_LOG(("\tPending server sync (ID = %d, FWAddr = 0x%08x): Current = 0x%08x, NextOp = 0x%08x (%s)", psSync->ui32UID, ServerSyncGetFWAddr(psSync), ServerSyncGetValue(psSync), psSync->ui32NextOp, psSync->szClassName)); } return IMG_TRUE; }
IMG_VOID DumpStalledCCBCommand(PRGXFWIF_FWCOMMONCONTEXT sFWCommonContext, RGX_CLIENT_CCB *psCurrentClientCCB, DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf) { volatile RGXFWIF_CCCB_CTL *psClientCCBCtrl = psCurrentClientCCB->psClientCCBCtrl; IMG_UINT8 *pui8ClientCCBBuff = psCurrentClientCCB->pui8ClientCCB; volatile IMG_UINT8 *pui8Ptr; IMG_UINT32 ui32SampledRdOff = psClientCCBCtrl->ui32ReadOffset; IMG_UINT32 ui32SampledDepOff = psClientCCBCtrl->ui32DepOffset; IMG_UINT32 ui32SampledWrOff = psCurrentClientCCB->ui32HostWriteOffset; pui8Ptr = pui8ClientCCBBuff + ui32SampledRdOff; if ((ui32SampledRdOff == ui32SampledDepOff) && (ui32SampledRdOff != ui32SampledWrOff)) { volatile RGXFWIF_CCB_CMD_HEADER *psCommandHeader = (RGXFWIF_CCB_CMD_HEADER *)(pui8ClientCCBBuff + ui32SampledRdOff); RGXFWIF_CCB_CMD_TYPE eCommandType = psCommandHeader->eCmdType; volatile IMG_UINT8 *pui8Ptr = (IMG_UINT8 *)psCommandHeader; /* CCB is stalled on a fence... */ if ((eCommandType == RGXFWIF_CCB_CMD_TYPE_FENCE) || (eCommandType == RGXFWIF_CCB_CMD_TYPE_FENCE_PR)) { RGXFWIF_UFO *psUFOPtr = (RGXFWIF_UFO *)(pui8Ptr + sizeof(*psCommandHeader)); IMG_UINT32 jj; /* Display details of the fence object on which the context is pending */ PVR_DUMPDEBUG_LOG(("FWCtx 0x%08X @ %d (%s) pending on %s:", sFWCommonContext.ui32Addr, ui32SampledRdOff, (IMG_PCHAR)&psCurrentClientCCB->szName, _CCBCmdTypename(eCommandType))); for (jj=0; jj<psCommandHeader->ui32CmdSize/sizeof(RGXFWIF_UFO); jj++) { PVR_DUMPDEBUG_LOG((" Addr:0x%08x Value=0x%08x",psUFOPtr[jj].puiAddrUFO.ui32Addr, psUFOPtr[jj].ui32Value)); } /* Advance psCommandHeader past the FENCE to the next command header (this will be the TA/3D command that is fenced) */ pui8Ptr = (IMG_UINT8 *)psUFOPtr + psCommandHeader->ui32CmdSize; psCommandHeader = (RGXFWIF_CCB_CMD_HEADER *)pui8Ptr; if( (IMG_UINTPTR_T)psCommandHeader != ((IMG_UINTPTR_T)pui8ClientCCBBuff + ui32SampledWrOff)) { PVR_DUMPDEBUG_LOG((" FWCtx 0x%08X fenced command is of type %s",sFWCommonContext.ui32Addr, _CCBCmdTypename(psCommandHeader->eCmdType))); /* Advance psCommandHeader past the TA/3D to the next command header (this will possibly be an UPDATE) */ pui8Ptr += sizeof(*psCommandHeader) + psCommandHeader->ui32CmdSize; psCommandHeader = (RGXFWIF_CCB_CMD_HEADER *)pui8Ptr; /* If the next command is an update, display details of that so we can see what would then become unblocked */ if( (IMG_UINTPTR_T)psCommandHeader != ((IMG_UINTPTR_T)pui8ClientCCBBuff + ui32SampledWrOff)) { eCommandType = psCommandHeader->eCmdType; if (eCommandType == RGXFWIF_CCB_CMD_TYPE_UPDATE) { psUFOPtr = (RGXFWIF_UFO *)((IMG_UINT8 *)psCommandHeader + sizeof(*psCommandHeader)); PVR_DUMPDEBUG_LOG((" preventing %s:",_CCBCmdTypename(eCommandType))); for (jj=0; jj<psCommandHeader->ui32CmdSize/sizeof(RGXFWIF_UFO); jj++) { PVR_DUMPDEBUG_LOG((" Addr:0x%08x Value=0x%08x",psUFOPtr[jj].puiAddrUFO.ui32Addr, psUFOPtr[jj].ui32Value)); } } } else { PVR_DUMPDEBUG_LOG((" FWCtx 0x%08X has no further commands",sFWCommonContext.ui32Addr)); } } else { PVR_DUMPDEBUG_LOG((" FWCtx 0x%08X has no further commands",sFWCommonContext.ui32Addr)); } } } }