gpu: pvr: add tracing to the SGX kick and transfer commands
authorImre Deak <imre.deak@nokia.com>
Fri, 1 Apr 2011 15:23:30 +0000 (18:23 +0300)
committerGrazvydas Ignotas <notasas@gmail.com>
Sun, 20 May 2012 18:43:05 +0000 (21:43 +0300)
Signed-off-by: Imre Deak <imre.deak@nokia.com>
Reviewed-by: Luc Verhaegen <libv@codethink.co.uk>
pvr/sgxkick.c
pvr/sgxtransfer.c

index ef4154b..0a951e0 100644 (file)
@@ -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);
 
index 0890921..7cfb829 100644 (file)
@@ -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);