From: Imre Deak Date: Fri, 1 Apr 2011 15:23:30 +0000 (+0300) Subject: gpu: pvr: add tracing to the SGX kick and transfer commands X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ccfe2371927bab687b8ee4e2680be27487f01f05;p=sgx.git gpu: pvr: add tracing to the SGX kick and transfer commands Signed-off-by: Imre Deak Reviewed-by: Luc Verhaegen --- diff --git a/pvr/sgxkick.c b/pvr/sgxkick.c index ef4154b..0a951e0 100644 --- a/pvr/sgxkick.c +++ b/pvr/sgxkick.c @@ -37,6 +37,7 @@ #include "pvr_debug.h" #include "sgxutils.h" #include "perproc.h" +#include "pvr_trace_cmd.h" enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, struct PVRSRV_PER_PROCESS_DATA *proc) @@ -49,6 +50,8 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, u32 i; struct PVRSRV_DEVICE_NODE *psDeviceNode; struct PVRSRV_SGXDEV_INFO *psDevInfo; + struct pvr_trcmd_sgxkick *ktrace; + int trcmd_type; psDeviceNode = (struct PVRSRV_DEVICE_NODE *)hDevHandle; psDevInfo = (struct PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice; @@ -67,6 +70,12 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, CCB_DATA_FROM_OFFSET(struct SGXMKIF_CMDTA_SHARED, psCCBMemInfo, psCCBKick, ui32CCBOffset); + trcmd_type = psCCBKick->bFirstKickOrResume ? + PVR_TRCMD_SGX_FIRSTKICK : PVR_TRCMD_SGX_KICK; + pvr_trcmd_lock(); + ktrace = pvr_trcmd_alloc(trcmd_type, proc->ui32PID, proc->name, + sizeof(*ktrace)); + if (psCCBKick->hTA3DSyncInfo) { psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTA3DSyncInfo; @@ -78,6 +87,10 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, if (psCCBKick->bTADependency) psSyncInfo->psSyncData->ui32WriteOpsPending++; + + pvr_trcmd_set_syn(&ktrace->ta3d_syn, psSyncInfo); + } else { + pvr_trcmd_clear_syn(&ktrace->ta3d_syn); } if (psCCBKick->hTASyncInfo != NULL) { @@ -93,6 +106,10 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, psSyncInfo->psSyncData->ui32ReadOpsPending++; psTACmd->ui32TATQSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; + + pvr_trcmd_set_syn(&ktrace->tatq_syn, psSyncInfo); + } else { + pvr_trcmd_clear_syn(&ktrace->tatq_syn); } if (psCCBKick->h3DSyncInfo != NULL) { @@ -108,6 +125,10 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, psSyncInfo->psSyncData->ui32ReadOpsPending++; psTACmd->ui323DTQSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; + + pvr_trcmd_set_syn(&ktrace->_3dtq_syn, psSyncInfo); + } else { + pvr_trcmd_clear_syn(&ktrace->_3dtq_syn); } psTACmd->ui32NumTAStatusVals = psCCBKick->ui32NumTAStatusVals; @@ -140,7 +161,12 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, } psTACmd->ui32NumSrcSyncs = psCCBKick->ui32NumSrcSyncs; - for (i = 0; i < psCCBKick->ui32NumSrcSyncs; i++) { + for (i = 0; i < SGX_MAX_SRC_SYNCS; i++) { + if (i >= psCCBKick->ui32NumSrcSyncs) { + pvr_trcmd_clear_syn(&ktrace->src_syn[i]); + continue; + } + psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)psCCBKick-> ahSrcKernelSyncInfo[i]; @@ -156,6 +182,7 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, psTACmd->asSrcSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; + pvr_trcmd_set_syn(&ktrace->src_syn[i], psSyncInfo); } if (psCCBKick->bFirstKickOrResume && @@ -204,6 +231,8 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, psSyncInfo->psSyncData-> ui32WriteOpsPending++; + pvr_trcmd_set_syn(&ktrace->dst_syn, psSyncInfo); + #if defined(PDUMP) if (PDumpIsCaptureFrameKM()) { u32 ui32ModifiedValue; @@ -294,7 +323,11 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, ui32ReadOpsPendingVal = 0; psHWDeviceSyncList->asSyncData[i]. ui32WriteOpsPendingVal = 0; + + pvr_trcmd_clear_syn(&ktrace->dst_syn); } + } else { + pvr_trcmd_clear_syn(&ktrace->dst_syn); } #if defined(PDUMP) if (PDumpIsCaptureFrameKM()) { @@ -397,6 +430,9 @@ enum PVRSRV_ERROR SGXDoKickKM(void *hDevHandle, struct SGX_CCB_KICK *psCCBKick, } #endif + pvr_trcmd_set_data(&ktrace->ctx, psCCBKick->sCommand.ui32Data[1]); + pvr_trcmd_unlock(); + /* to aid in determining the next power down delay */ sgx_mark_new_command(psDeviceNode); diff --git a/pvr/sgxtransfer.c b/pvr/sgxtransfer.c index 0890921..7cfb829 100644 --- a/pvr/sgxtransfer.c +++ b/pvr/sgxtransfer.c @@ -41,6 +41,7 @@ #include "pvr_debug.h" #include "sgxutils.h" #include "perproc.h" +#include "pvr_trace_cmd.h" enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle, struct PVRSRV_TRANSFER_SGX_KICK *psKick, @@ -51,6 +52,7 @@ enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle, struct SGXMKIF_COMMAND sCommand = { 0 }; struct SGXMKIF_TRANSFERCMD_SHARED *psSharedTransferCmd; struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo; + struct pvr_trcmd_sgxtransfer *ttrace; enum PVRSRV_ERROR eError; if (!CCB_OFFSET_IS_VALID @@ -65,6 +67,10 @@ enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle, CCB_DATA_FROM_OFFSET(struct SGXMKIF_TRANSFERCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset); + pvr_trcmd_lock(); + ttrace = pvr_trcmd_alloc(PVR_TRCMD_TFER_KICK, proc->ui32PID, proc->name, + sizeof(*ttrace)); + if (psKick->hTASyncInfo != NULL) { psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *) psKick->hTASyncInfo; @@ -78,9 +84,13 @@ enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle, psSyncInfo->sWriteOpsCompleteDevVAddr; psSharedTransferCmd->sTASyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; + + pvr_trcmd_set_syn(&ttrace->ta_syn, psSyncInfo); } else { psSharedTransferCmd->sTASyncWriteOpsCompleteDevVAddr.uiAddr = 0; psSharedTransferCmd->sTASyncReadOpsCompleteDevVAddr.uiAddr = 0; + + pvr_trcmd_clear_syn(&ttrace->ta_syn); } if (psKick->h3DSyncInfo != NULL) { @@ -96,9 +106,13 @@ enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle, psSyncInfo->sWriteOpsCompleteDevVAddr; psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; + + pvr_trcmd_set_syn(&ttrace->_3d_syn, psSyncInfo); } else { psSharedTransferCmd->s3DSyncWriteOpsCompleteDevVAddr.uiAddr = 0; psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr.uiAddr = 0; + + pvr_trcmd_clear_syn(&ttrace->_3d_syn); } if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL) { @@ -135,13 +149,24 @@ enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle, psKick->ahSrcSyncInfo[0]; psSyncInfo->psSyncData->ui32ReadOpsPending++; + pvr_trcmd_set_syn(&ttrace->src_syn, psSyncInfo); + } else { + pvr_trcmd_clear_syn(&ttrace->src_syn); } + if (psKick->ui32NumDstSync > 0) { psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)psKick-> ahDstSyncInfo[0]; psSyncInfo->psSyncData->ui32WriteOpsPending++; + + pvr_trcmd_set_syn(&ttrace->dst_syn, psSyncInfo); + } else { + pvr_trcmd_clear_syn(&ttrace->dst_syn); } + } else { + pvr_trcmd_clear_syn(&ttrace->src_syn); + pvr_trcmd_clear_syn(&ttrace->dst_syn); } if (psKick->ui32NumDstSync > 1 || psKick->ui32NumSrcSync > 1) { @@ -243,6 +268,10 @@ enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle, sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_TRANSFERCMD; sCommand.ui32Data[1] = psKick->sHWTransferContextDevVAddr.uiAddr; + pvr_trcmd_set_data(&ttrace->ctx, + psKick->sHWTransferContextDevVAddr.uiAddr); + pvr_trcmd_unlock(); + /* To aid in determining the next power down delay */ sgx_mark_new_command(hDevHandle);