fixes for bc_cat
[sgx.git] / pvr / sgxtransfer.c
index df8d84a..7cfb829 100644 (file)
@@ -1,30 +1,29 @@
 /**********************************************************************
  *
  * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
- * 
+ *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
  * version 2, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope it will be useful but, except 
- * as otherwise stated in writing, without any warranty; without even the 
- * implied warranty of merchantability or fitness for a particular purpose. 
+ *
+ * This program is distributed in the hope it will be useful but, except
+ * as otherwise stated in writing, without any warranty; without even the
+ * implied warranty of merchantability or fitness for a particular purpose.
  * See the GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License along with
  * this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- * 
+ *
  * The full GNU General Public License is included in this distribution in
  * the file called "COPYING".
  *
  * Contact Information:
  * Imagination Technologies Ltd. <gpl-support@imgtec.com>
- * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK 
+ * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
  *
  ******************************************************************************/
 
-#if defined(TRANSFER_QUEUE)
 
 #include <stddef.h>
 
@@ -33,8 +32,7 @@
 #include "buffer_manager.h"
 #include "sgxinfo.h"
 #include "sysconfig.h"
-#include "regpaths.h"
-#include "pdump_km.h"
+#include "pvr_pdump.h"
 #include "mmu.h"
 #include "pvr_bridge.h"
 #include "sgx_bridge_km.h"
 #include "osfunc.h"
 #include "pvr_debug.h"
 #include "sgxutils.h"
+#include "perproc.h"
+#include "pvr_trace_cmd.h"
 
-IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle,
-                                           PVRSRV_TRANSFER_SGX_KICK * psKick)
+enum PVRSRV_ERROR SGXSubmitTransferKM(void *hDevHandle,
+                                       struct PVRSRV_TRANSFER_SGX_KICK *psKick,
+                                       struct PVRSRV_PER_PROCESS_DATA *proc)
 {
-       PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo =
-           (PVRSRV_KERNEL_MEM_INFO *) psKick->hCCBMemInfo;
-       PVRSRV_SGX_COMMAND sCommand = { 0 };
-       PVR3DIF4_TRANSFERCMD_SHARED *psTransferCmd;
-       PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
-       IMG_UINT32 i;
-       PVRSRV_ERROR eError;
+       struct PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo =
+           (struct PVRSRV_KERNEL_MEM_INFO *)psKick->hCCBMemInfo;
+       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
-           (PVR3DIF4_TRANSFERCMD_SHARED, psCCBMemInfo, psKick,
+           (struct SGXMKIF_TRANSFERCMD_SHARED, psCCBMemInfo, psKick,
             ui32SharedCmdCCBOffset)) {
-               PVR_DPF((PVR_DBG_ERROR,
-                        "SGXSubmitTransferKM: Invalid CCB offset"));
+               PVR_DPF(PVR_DBG_ERROR,
+                        "SGXSubmitTransferKM: Invalid CCB offset");
                return PVRSRV_ERROR_INVALID_PARAMS;
        }
-       psTransferCmd =
-           CCB_DATA_FROM_OFFSET(PVR3DIF4_TRANSFERCMD_SHARED, psCCBMemInfo,
-                                psKick, ui32SharedCmdCCBOffset);
 
-       if (psTransferCmd->ui32NumStatusVals > SGXTQ_MAX_STATUS) {
-               return PVRSRV_ERROR_INVALID_PARAMS;
-       }
+       psSharedTransferCmd =
+           CCB_DATA_FROM_OFFSET(struct SGXMKIF_TRANSFERCMD_SHARED,
+                                psCCBMemInfo, psKick, ui32SharedCmdCCBOffset);
 
-       if (psKick->ui32StatusFirstSync +
-           (psKick->ui32NumSrcSync ? (psKick->ui32NumSrcSync - 1) : 0) +
-           (psKick->ui32NumDstSync ? (psKick->ui32NumDstSync - 1) : 0) >
-           psTransferCmd->ui32NumStatusVals) {
-               return PVRSRV_ERROR_INVALID_PARAMS;
-       }
+       pvr_trcmd_lock();
+       ttrace = pvr_trcmd_alloc(PVR_TRCMD_TFER_KICK, proc->ui32PID, proc->name,
+                                sizeof(*ttrace));
 
-       if (psKick->hTASyncInfo != IMG_NULL) {
-               psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psKick->hTASyncInfo;
+       if (psKick->hTASyncInfo != NULL) {
+               psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
+                       psKick->hTASyncInfo;
 
-               psTransferCmd->ui32TASyncWriteOpsPendingVal =
+               psSharedTransferCmd->ui32TASyncWriteOpsPendingVal =
                    psSyncInfo->psSyncData->ui32WriteOpsPending++;
-               psTransferCmd->ui32TASyncReadOpsPendingVal =
+               psSharedTransferCmd->ui32TASyncReadOpsPendingVal =
                    psSyncInfo->psSyncData->ui32ReadOpsPending;
 
-               psTransferCmd->sTASyncWriteOpsCompleteDevVAddr =
+               psSharedTransferCmd->sTASyncWriteOpsCompleteDevVAddr =
                    psSyncInfo->sWriteOpsCompleteDevVAddr;
-               psTransferCmd->sTASyncReadOpsCompleteDevVAddr =
+               psSharedTransferCmd->sTASyncReadOpsCompleteDevVAddr =
                    psSyncInfo->sReadOpsCompleteDevVAddr;
-       } else {
-               psTransferCmd->sTASyncWriteOpsCompleteDevVAddr.uiAddr = 0;
-               psTransferCmd->sTASyncReadOpsCompleteDevVAddr.uiAddr = 0;
-       }
 
-       if (psKick->h3DSyncInfo != IMG_NULL) {
-               psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psKick->h3DSyncInfo;
-
-               psTransferCmd->ui323DSyncWriteOpsPendingVal =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending++;
-               psTransferCmd->ui323DSyncReadOpsPendingVal =
-                   psSyncInfo->psSyncData->ui32ReadOpsPending;
-
-               psTransferCmd->s3DSyncWriteOpsCompleteDevVAddr =
-                   psSyncInfo->sWriteOpsCompleteDevVAddr;
-               psTransferCmd->s3DSyncReadOpsCompleteDevVAddr =
-                   psSyncInfo->sReadOpsCompleteDevVAddr;
+               pvr_trcmd_set_syn(&ttrace->ta_syn, psSyncInfo);
        } else {
-               psTransferCmd->s3DSyncWriteOpsCompleteDevVAddr.uiAddr = 0;
-               psTransferCmd->s3DSyncReadOpsCompleteDevVAddr.uiAddr = 0;
-       }
-
-       psTransferCmd->ui32NumSrcSync = psKick->ui32NumSrcSync;
-       psTransferCmd->ui32NumDstSync = psKick->ui32NumDstSync;
-
-       if (psKick->ui32NumSrcSync > 0) {
-               psSyncInfo =
-                   (PVRSRV_KERNEL_SYNC_INFO *) psKick->ahSrcSyncInfo[0];
-
-               psTransferCmd->ui32SrcWriteOpPendingVal =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending;
-               psTransferCmd->ui32SrcReadOpPendingVal =
-                   psSyncInfo->psSyncData->ui32ReadOpsPending;
+               psSharedTransferCmd->sTASyncWriteOpsCompleteDevVAddr.uiAddr = 0;
+               psSharedTransferCmd->sTASyncReadOpsCompleteDevVAddr.uiAddr = 0;
 
-               psTransferCmd->sSrcWriteOpsCompleteDevAddr =
-                   psSyncInfo->sWriteOpsCompleteDevVAddr;
-               psTransferCmd->sSrcReadOpsCompleteDevAddr =
-                   psSyncInfo->sReadOpsCompleteDevVAddr;
+               pvr_trcmd_clear_syn(&ttrace->ta_syn);
        }
-       if (psKick->ui32NumDstSync > 0) {
-               psSyncInfo =
-                   (PVRSRV_KERNEL_SYNC_INFO *) psKick->ahDstSyncInfo[0];
 
-               psTransferCmd->ui32DstWriteOpPendingVal =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending;
-               psTransferCmd->ui32DstReadOpPendingVal =
+       if (psKick->h3DSyncInfo != NULL) {
+               psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
+                                                       psKick->h3DSyncInfo;
+
+               psSharedTransferCmd->ui323DSyncWriteOpsPendingVal =
+                   psSyncInfo->psSyncData->ui32WriteOpsPending++;
+               psSharedTransferCmd->ui323DSyncReadOpsPendingVal =
                    psSyncInfo->psSyncData->ui32ReadOpsPending;
 
-               psTransferCmd->sDstWriteOpsCompleteDevAddr =
+               psSharedTransferCmd->s3DSyncWriteOpsCompleteDevVAddr =
                    psSyncInfo->sWriteOpsCompleteDevVAddr;
-               psTransferCmd->sDstReadOpsCompleteDevAddr =
+               psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr =
                    psSyncInfo->sReadOpsCompleteDevVAddr;
-       }
 
-       if (psKick->ui32NumSrcSync > 0) {
-               psSyncInfo =
-                   (PVRSRV_KERNEL_SYNC_INFO *) psKick->ahSrcSyncInfo[0];
-               psSyncInfo->psSyncData->ui32ReadOpsPending++;
+               pvr_trcmd_set_syn(&ttrace->_3d_syn, psSyncInfo);
+       } else {
+               psSharedTransferCmd->s3DSyncWriteOpsCompleteDevVAddr.uiAddr = 0;
+               psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr.uiAddr = 0;
 
-       }
-       if (psKick->ui32NumDstSync > 0) {
-               psSyncInfo =
-                   (PVRSRV_KERNEL_SYNC_INFO *) psKick->ahDstSyncInfo[0];
-               psSyncInfo->psSyncData->ui32WriteOpsPending++;
+               pvr_trcmd_clear_syn(&ttrace->_3d_syn);
        }
 
-       if (psKick->ui32NumSrcSync > 1) {
-               for (i = 1; i < psKick->ui32NumSrcSync; i++) {
+       if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL) {
+               if (psKick->ui32NumSrcSync > 0) {
                        psSyncInfo =
-                           (PVRSRV_KERNEL_SYNC_INFO *) psKick->
-                           ahSrcSyncInfo[i];
+                           (struct PVRSRV_KERNEL_SYNC_INFO *)
+                                               psKick->ahSrcSyncInfo[0];
 
-                       psTransferCmd->sCtlStatusInfo[psKick->
-                                                     ui32StatusFirstSync].
-                           ui32StatusValue =
-                           psSyncInfo->psSyncData->ui32ReadOpsPending++;
+                       psSharedTransferCmd->ui32SrcWriteOpPendingVal =
+                           psSyncInfo->psSyncData->ui32WriteOpsPending;
+                       psSharedTransferCmd->ui32SrcReadOpPendingVal =
+                           psSyncInfo->psSyncData->ui32ReadOpsPending;
 
-                       psTransferCmd->sCtlStatusInfo[psKick->
-                                                     ui32StatusFirstSync].
-                           sStatusDevAddr =
+                       psSharedTransferCmd->sSrcWriteOpsCompleteDevAddr =
+                           psSyncInfo->sWriteOpsCompleteDevVAddr;
+                       psSharedTransferCmd->sSrcReadOpsCompleteDevAddr =
+                           psSyncInfo->sReadOpsCompleteDevVAddr;
+               }
+               if (psKick->ui32NumDstSync > 0) {
+                       psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
+                                               psKick->ahDstSyncInfo[0];
+                       psSharedTransferCmd->ui32DstWriteOpPendingVal =
+                           psSyncInfo->psSyncData->ui32WriteOpsPending;
+                       psSharedTransferCmd->ui32DstReadOpPendingVal =
+                           psSyncInfo->psSyncData->ui32ReadOpsPending;
+                       psSharedTransferCmd->sDstWriteOpsCompleteDevAddr =
+                           psSyncInfo->sWriteOpsCompleteDevVAddr;
+                       psSharedTransferCmd->sDstReadOpsCompleteDevAddr =
                            psSyncInfo->sReadOpsCompleteDevVAddr;
-
-                       psKick->ui32StatusFirstSync++;
                }
-       }
 
-       if (psKick->ui32NumDstSync > 1) {
-               for (i = 1; i < psKick->ui32NumDstSync; i++) {
-                       psSyncInfo =
-                           (PVRSRV_KERNEL_SYNC_INFO *) psKick->
-                           ahDstSyncInfo[i];
+               if (psKick->ui32NumSrcSync > 0) {
+                       psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)
+                                               psKick->ahSrcSyncInfo[0];
+                       psSyncInfo->psSyncData->ui32ReadOpsPending++;
 
-                       psTransferCmd->sCtlStatusInfo[psKick->
-                                                     ui32StatusFirstSync].
-                           ui32StatusValue =
-                           psSyncInfo->psSyncData->ui32WriteOpsPending++;
+                       pvr_trcmd_set_syn(&ttrace->src_syn, psSyncInfo);
+               } else {
+                       pvr_trcmd_clear_syn(&ttrace->src_syn);
+               }
 
-                       psTransferCmd->sCtlStatusInfo[psKick->
-                                                     ui32StatusFirstSync].
-                           sStatusDevAddr =
-                           psSyncInfo->sWriteOpsCompleteDevVAddr;
+               if (psKick->ui32NumDstSync > 0) {
+                       psSyncInfo =
+                           (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+                                                           ahDstSyncInfo[0];
+                       psSyncInfo->psSyncData->ui32WriteOpsPending++;
 
-                       psKick->ui32StatusFirstSync++;
+                       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) {
+               PVR_DPF(PVR_DBG_ERROR,
+                       "Transfer command doesn't support "
+                       "more than 1 sync object per src/dst\ndst: %d, src: %d",
+                        psKick->ui32NumDstSync, psKick->ui32NumSrcSync);
        }
 #if defined(PDUMP)
-       if (PDumpIsCaptureFrameKM()) {
+       if (PDumpIsCaptureFrameKM() ||
+           ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0)) {
                PDUMPCOMMENT("Shared part of transfer command\r\n");
-               PDUMPMEM(psTransferCmd,
+               PDUMPMEM(psSharedTransferCmd,
                         psCCBMemInfo,
                         psKick->ui32CCBDumpWOff,
-                        sizeof(PVR3DIF4_TRANSFERCMD_SHARED),
-                        0, MAKEUNIQUETAG(psCCBMemInfo));
+                        sizeof(struct SGXMKIF_TRANSFERCMD_SHARED),
+                        psKick->ui32PDumpFlags, MAKEUNIQUETAG(psCCBMemInfo));
 
-               if (psKick->ui32NumSrcSync > 0) {
+               if ((psKick->ui32NumSrcSync > 0) &&
+                   ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) ==
+                    0UL)) {
                        psSyncInfo = psKick->ahSrcSyncInfo[0];
 
                        PDUMPCOMMENT
@@ -210,10 +195,11 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle,
                        PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
                                 psCCBMemInfo,
                                 psKick->ui32CCBDumpWOff +
-                                offsetof(PVR3DIF4_TRANSFERCMD_SHARED,
-                                         ui32SrcWriteOpPendingVal),
+                                offsetof(struct SGXMKIF_TRANSFERCMD_SHARED,
+                                           ui32SrcWriteOpPendingVal),
                                 sizeof(psSyncInfo->psSyncData->
-                                       ui32LastOpDumpVal), 0,
+                                       ui32LastOpDumpVal),
+                                psKick->ui32PDumpFlags,
                                 MAKEUNIQUETAG(psCCBMemInfo));
 
                        PDUMPCOMMENT
@@ -221,13 +207,16 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle,
                        PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
                                 psCCBMemInfo,
                                 psKick->ui32CCBDumpWOff +
-                                offsetof(PVR3DIF4_TRANSFERCMD_SHARED,
+                                offsetof(struct SGXMKIF_TRANSFERCMD_SHARED,
                                          ui32SrcReadOpPendingVal),
                                 sizeof(psSyncInfo->psSyncData->
-                                       ui32LastReadOpDumpVal), 0,
+                                       ui32LastReadOpDumpVal),
+                                psKick->ui32PDumpFlags,
                                 MAKEUNIQUETAG(psCCBMemInfo));
                }
-               if (psKick->ui32NumDstSync > 0) {
+               if ((psKick->ui32NumDstSync > 0) &&
+                   ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) ==
+                     0UL)) {
                        psSyncInfo = psKick->ahDstSyncInfo[0];
 
                        PDUMPCOMMENT
@@ -235,10 +224,11 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle,
                        PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
                                 psCCBMemInfo,
                                 psKick->ui32CCBDumpWOff +
-                                offsetof(PVR3DIF4_TRANSFERCMD_SHARED,
+                                offsetof(struct SGXMKIF_TRANSFERCMD_SHARED,
                                          ui32DstWriteOpPendingVal),
                                 sizeof(psSyncInfo->psSyncData->
-                                       ui32LastOpDumpVal), 0,
+                                       ui32LastOpDumpVal),
+                                psKick->ui32PDumpFlags,
                                 MAKEUNIQUETAG(psCCBMemInfo));
 
                        PDUMPCOMMENT
@@ -246,24 +236,30 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle,
                        PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
                                 psCCBMemInfo,
                                 psKick->ui32CCBDumpWOff +
-                                offsetof(PVR3DIF4_TRANSFERCMD_SHARED,
+                                offsetof(struct SGXMKIF_TRANSFERCMD_SHARED,
                                          ui32DstReadOpPendingVal),
                                 sizeof(psSyncInfo->psSyncData->
-                                       ui32LastReadOpDumpVal), 0,
+                                       ui32LastReadOpDumpVal),
+                                psKick->ui32PDumpFlags,
                                 MAKEUNIQUETAG(psCCBMemInfo));
                }
 
-               if (psKick->ui32NumSrcSync > 0) {
+               if ((psKick->ui32NumSrcSync > 0) &&
+                   ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) ==
+                    0UL)) {
                        psSyncInfo =
-                           (PVRSRV_KERNEL_SYNC_INFO *) psKick->
-                           ahSrcSyncInfo[0];
+                           (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+                                                           ahSrcSyncInfo[0];
                        psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
 
                }
-               if (psKick->ui32NumDstSync > 0) {
+
+               if ((psKick->ui32NumDstSync > 0) &&
+                   ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) ==
+                    0UL)) {
                        psSyncInfo =
-                           (PVRSRV_KERNEL_SYNC_INFO *) psKick->
-                           ahDstSyncInfo[0];
+                           (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+                                                           ahDstSyncInfo[0];
                        psSyncInfo->psSyncData->ui32LastOpDumpVal++;
                }
        }
@@ -272,243 +268,57 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle,
        sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_TRANSFERCMD;
        sCommand.ui32Data[1] = psKick->sHWTransferContextDevVAddr.uiAddr;
 
-       eError =
-           SGXScheduleCCBCommandKM(hDevHandle, PVRSRV_SGX_COMMAND_EDM_KICK,
-                                   &sCommand, KERNEL_ID);
-
-#if defined(NO_HARDWARE)
-
-       for (i = 0; i < psKick->ui32NumSrcSync; i++) {
-               psSyncInfo =
-                   (PVRSRV_KERNEL_SYNC_INFO *) psKick->ahSrcSyncInfo[i];
-               psSyncInfo->psSyncData->ui32ReadOpsComplete =
-                   psSyncInfo->psSyncData->ui32ReadOpsPending;
-       }
-
-       for (i = 0; i < psKick->ui32NumDstSync; i++) {
-               psSyncInfo =
-                   (PVRSRV_KERNEL_SYNC_INFO *) psKick->ahDstSyncInfo[i];
-               psSyncInfo->psSyncData->ui32WriteOpsComplete =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending;
-
-       }
-
-       if (psKick->hTASyncInfo != IMG_NULL) {
-               psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psKick->hTASyncInfo;
-
-               psSyncInfo->psSyncData->ui32WriteOpsComplete =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending;
-       }
-
-       if (psKick->h3DSyncInfo != IMG_NULL) {
-               psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psKick->h3DSyncInfo;
-
-               psSyncInfo->psSyncData->ui32WriteOpsComplete =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending;
-       }
-#endif
-
-       return eError;
-}
-
-#if defined(SGX_FEATURE_2D_HARDWARE)
-IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle,
-                                     PVRSRV_2D_SGX_KICK * psKick)
-{
-       PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo =
-           (PVRSRV_KERNEL_MEM_INFO *) psKick->hCCBMemInfo;
-       PVRSRV_SGX_COMMAND sCommand = { 0 };
-       PVR3DIF4_2DCMD_SHARED *ps2DCmd;
-       PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
-       PVRSRV_ERROR eError;
-       IMG_UINT32 i;
-
-       if (!CCB_OFFSET_IS_VALID
-           (PVR3DIF4_2DCMD_SHARED, psCCBMemInfo, psKick,
-            ui32SharedCmdCCBOffset)) {
-               PVR_DPF((PVR_DBG_ERROR, "SGXSubmit2DKM: Invalid CCB offset"));
-               return PVRSRV_ERROR_INVALID_PARAMS;
-       }
-       ps2DCmd =
-           CCB_DATA_FROM_OFFSET(PVR3DIF4_2DCMD_SHARED, psCCBMemInfo, psKick,
-                                ui32SharedCmdCCBOffset);
-
-       OSMemSet(ps2DCmd, 0, sizeof(*ps2DCmd));
-
-       if (psKick->hTASyncInfo != IMG_NULL) {
-               psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psKick->hTASyncInfo;
-
-               ps2DCmd->sTASyncData.ui32WriteOpPendingVal =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending++;
-               ps2DCmd->sTASyncData.ui32ReadOpPendingVal =
-                   psSyncInfo->psSyncData->ui32ReadOpsPending;
-
-               ps2DCmd->sTASyncData.sWriteOpsCompleteDevVAddr =
-                   psSyncInfo->sWriteOpsCompleteDevVAddr;
-               ps2DCmd->sTASyncData.sReadOpsCompleteDevVAddr =
-                   psSyncInfo->sReadOpsCompleteDevVAddr;
-       }
-
-       if (psKick->h3DSyncInfo != IMG_NULL) {
-               psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psKick->h3DSyncInfo;
-
-               ps2DCmd->s3DSyncData.ui32WriteOpPendingVal =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending++;
-               ps2DCmd->s3DSyncData.ui32ReadOpPendingVal =
-                   psSyncInfo->psSyncData->ui32ReadOpsPending;
-
-               ps2DCmd->s3DSyncData.sWriteOpsCompleteDevVAddr =
-                   psSyncInfo->sWriteOpsCompleteDevVAddr;
-               ps2DCmd->s3DSyncData.sReadOpsCompleteDevVAddr =
-                   psSyncInfo->sReadOpsCompleteDevVAddr;
-       }
-
-       ps2DCmd->ui32NumSrcSync = psKick->ui32NumSrcSync;
-       for (i = 0; i < psKick->ui32NumSrcSync; i++) {
-               psSyncInfo = psKick->ahSrcSyncInfo[i];
-
-               ps2DCmd->sSrcSyncData[i].ui32WriteOpPendingVal =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending;
-               ps2DCmd->sSrcSyncData[i].ui32ReadOpPendingVal =
-                   psSyncInfo->psSyncData->ui32ReadOpsPending;
-
-               ps2DCmd->sSrcSyncData[i].sWriteOpsCompleteDevVAddr =
-                   psSyncInfo->sWriteOpsCompleteDevVAddr;
-               ps2DCmd->sSrcSyncData[i].sReadOpsCompleteDevVAddr =
-                   psSyncInfo->sReadOpsCompleteDevVAddr;
-       }
-
-       if (psKick->hDstSyncInfo != IMG_NULL) {
-               psSyncInfo = psKick->hDstSyncInfo;
+       pvr_trcmd_set_data(&ttrace->ctx,
+                          psKick->sHWTransferContextDevVAddr.uiAddr);
+       pvr_trcmd_unlock();
 
-               ps2DCmd->sDstSyncData.ui32WriteOpPendingVal =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending;
-               ps2DCmd->sDstSyncData.ui32ReadOpPendingVal =
-                   psSyncInfo->psSyncData->ui32ReadOpsPending;
-
-               ps2DCmd->sDstSyncData.sWriteOpsCompleteDevVAddr =
-                   psSyncInfo->sWriteOpsCompleteDevVAddr;
-               ps2DCmd->sDstSyncData.sReadOpsCompleteDevVAddr =
-                   psSyncInfo->sReadOpsCompleteDevVAddr;
-       }
+       /* To aid in determining the next power down delay */
+       sgx_mark_new_command(hDevHandle);
 
-       for (i = 0; i < psKick->ui32NumSrcSync; i++) {
-               psSyncInfo = psKick->ahSrcSyncInfo[i];
-               psSyncInfo->psSyncData->ui32ReadOpsPending++;
-       }
+       eError = SGXScheduleCCBCommandKM(hDevHandle, SGXMKIF_COMMAND_EDM_KICK,
+                                   &sCommand, KERNEL_ID,
+                                   psKick->ui32PDumpFlags);
 
-       if (psKick->hDstSyncInfo != IMG_NULL) {
-               psSyncInfo = psKick->hDstSyncInfo;
-               psSyncInfo->psSyncData->ui32WriteOpsPending++;
-       }
-#if defined(PDUMP)
-       if (PDumpIsCaptureFrameKM()) {
-
-               PDUMPCOMMENT("Shared part of 2D command\r\n");
-               PDUMPMEM(ps2DCmd,
-                        psCCBMemInfo,
-                        psKick->ui32CCBDumpWOff,
-                        sizeof(PVR3DIF4_2DCMD_SHARED),
-                        0, MAKEUNIQUETAG(psCCBMemInfo));
+#if defined(NO_HARDWARE)
+       if (!(psKick->ui32Flags & SGXMKIF_TQFLAGS_NOSYNCUPDATE)) {
+               u32 i;
 
                for (i = 0; i < psKick->ui32NumSrcSync; i++) {
-                       psSyncInfo = psKick->ahSrcSyncInfo[i];
-
-                       PDUMPCOMMENT("Hack src surface write op in 2D cmd\r\n");
-                       PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
-                                psCCBMemInfo,
-                                psKick->ui32CCBDumpWOff +
-                                offsetof(PVR3DIF4_2DCMD_SHARED,
-                                         sSrcSyncData[i].
-                                         ui32WriteOpPendingVal),
-                                sizeof(psSyncInfo->psSyncData->
-                                       ui32LastOpDumpVal), 0,
-                                MAKEUNIQUETAG(psCCBMemInfo));
-
-                       PDUMPCOMMENT("Hack src surface read op in 2D cmd\r\n");
-                       PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
-                                psCCBMemInfo,
-                                psKick->ui32CCBDumpWOff +
-                                offsetof(PVR3DIF4_2DCMD_SHARED,
-                                         sSrcSyncData[i].ui32ReadOpPendingVal),
-                                sizeof(psSyncInfo->psSyncData->
-                                       ui32LastReadOpDumpVal), 0,
-                                MAKEUNIQUETAG(psCCBMemInfo));
+                       psSyncInfo =
+                           (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+                                                           ahSrcSyncInfo[i];
+                       psSyncInfo->psSyncData->ui32ReadOpsComplete =
+                           psSyncInfo->psSyncData->ui32ReadOpsPending;
                }
 
-               if (psKick->hDstSyncInfo != IMG_NULL) {
-                       psSyncInfo = psKick->hDstSyncInfo;
-
-                       PDUMPCOMMENT
-                           ("Hack dest surface write op in 2D cmd\r\n");
-                       PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
-                                psCCBMemInfo,
-                                psKick->ui32CCBDumpWOff +
-                                offsetof(PVR3DIF4_2DCMD_SHARED,
-                                         sDstSyncData.ui32WriteOpPendingVal),
-                                sizeof(psSyncInfo->psSyncData->
-                                       ui32LastOpDumpVal), 0,
-                                MAKEUNIQUETAG(psCCBMemInfo));
+               for (i = 0; i < psKick->ui32NumDstSync; i++) {
+                       psSyncInfo =
+                           (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+                                                           ahDstSyncInfo[i];
+                       psSyncInfo->psSyncData->ui32WriteOpsComplete =
+                           psSyncInfo->psSyncData->ui32WriteOpsPending;
 
-                       PDUMPCOMMENT("Hack dest surface read op in 2D cmd\r\n");
-                       PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
-                                psCCBMemInfo,
-                                psKick->ui32CCBDumpWOff +
-                                offsetof(PVR3DIF4_2DCMD_SHARED,
-                                         sDstSyncData.ui32ReadOpPendingVal),
-                                sizeof(psSyncInfo->psSyncData->
-                                       ui32LastReadOpDumpVal), 0,
-                                MAKEUNIQUETAG(psCCBMemInfo));
                }
 
-               for (i = 0; i < psKick->ui32NumSrcSync; i++) {
-                       psSyncInfo = psKick->ahSrcSyncInfo[i];
-                       psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
-               }
+               if (psKick->hTASyncInfo != NULL) {
+                       psSyncInfo =
+                           (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+                                                           hTASyncInfo;
 
-               if (psKick->hDstSyncInfo != IMG_NULL) {
-                       psSyncInfo = psKick->hDstSyncInfo;
-                       psSyncInfo->psSyncData->ui32LastOpDumpVal++;
+                       psSyncInfo->psSyncData->ui32WriteOpsComplete =
+                           psSyncInfo->psSyncData->ui32WriteOpsPending;
                }
-       }
-#endif
-
-       sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_2DCMD;
-       sCommand.ui32Data[1] = psKick->sHW2DContextDevVAddr.uiAddr;
-
-       eError =
-           SGXScheduleCCBCommandKM(hDevHandle, PVRSRV_SGX_COMMAND_EDM_KICK,
-                                   &sCommand, KERNEL_ID);
-
-#if defined(NO_HARDWARE)
-
-       for (i = 0; i < psKick->ui32NumSrcSync; i++) {
-               psSyncInfo =
-                   (PVRSRV_KERNEL_SYNC_INFO *) psKick->ahSrcSyncInfo[i];
-               psSyncInfo->psSyncData->ui32ReadOpsComplete =
-                   psSyncInfo->psSyncData->ui32ReadOpsPending;
-       }
-
-       psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psKick->hDstSyncInfo;
-       psSyncInfo->psSyncData->ui32WriteOpsComplete =
-           psSyncInfo->psSyncData->ui32WriteOpsPending;
-
-       if (psKick->hTASyncInfo != IMG_NULL) {
-               psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psKick->hTASyncInfo;
-
-               psSyncInfo->psSyncData->ui32WriteOpsComplete =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending;
-       }
 
-       if (psKick->h3DSyncInfo != IMG_NULL) {
-               psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psKick->h3DSyncInfo;
+               if (psKick->h3DSyncInfo != NULL) {
+                       psSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)psKick->
+                                                   h3DSyncInfo;
 
-               psSyncInfo->psSyncData->ui32WriteOpsComplete =
-                   psSyncInfo->psSyncData->ui32WriteOpsPending;
+                       psSyncInfo->psSyncData->ui32WriteOpsComplete =
+                           psSyncInfo->psSyncData->ui32WriteOpsPending;
+               }
        }
 #endif
 
        return eError;
 }
-#endif
-#endif
+