1
/**********************************************************************
3
* Copyright (C) Imagination Technologies Ltd. All rights reserved.
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms and conditions of the GNU General Public License,
7
* version 2, as published by the Free Software Foundation.
9
* This program is distributed in the hope it will be useful but, except
10
* as otherwise stated in writing, without any warranty; without even the
11
* implied warranty of merchantability or fitness for a particular purpose.
12
* See the GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License along with
15
* this program; if not, write to the Free Software Foundation, Inc.,
16
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18
* The full GNU General Public License is included in this distribution in
19
* the file called "COPYING".
21
* Contact Information:
22
* Imagination Technologies Ltd. <gpl-support@imgtec.com>
23
* Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
25
******************************************************************************/
28
#include "services_headers.h"
30
#include "sgxinfokm.h"
32
#include "sgxapi_km.h"
35
#include "sgx_bridge_km.h"
37
#include "pvr_debug.h"
42
#if defined (SUPPORT_SID_INTERFACE)
43
PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK_KM *psCCBKick)
45
PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick)
49
PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
50
PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *) psCCBKick->hCCBKernelMemInfo;
51
SGXMKIF_CMDTA_SHARED *psTACmd;
53
IMG_HANDLE hDevMemContext = IMG_NULL;
54
#if defined(FIX_HW_BRN_31620)
55
hDevMemContext = psCCBKick->hDevMemContext;
57
PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_FUNCTION_ENTER, KICK_TOKEN_DOKICK);
59
if (!CCB_OFFSET_IS_VALID(SGXMKIF_CMDTA_SHARED, psCCBMemInfo, psCCBKick, ui32CCBOffset))
61
PVR_DPF((PVR_DBG_ERROR, "SGXDoKickKM: Invalid CCB offset"));
62
PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_FUNCTION_EXIT, KICK_TOKEN_DOKICK);
63
return PVRSRV_ERROR_INVALID_PARAMS;
67
psTACmd = CCB_DATA_FROM_OFFSET(SGXMKIF_CMDTA_SHARED, psCCBMemInfo, psCCBKick, ui32CCBOffset);
69
PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_CMD_START, KICK_TOKEN_DOKICK);
70
PVR_TTRACE_UI32(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_CCB,
71
KICK_TOKEN_CCB_OFFSET, psCCBKick->ui32CCBOffset);
74
if (psCCBKick->hTA3DSyncInfo)
76
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTA3DSyncInfo;
78
PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_KICK, KICK_TOKEN_TA3D_SYNC,
79
psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
81
psTACmd->sTA3DDependency.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
83
psTACmd->sTA3DDependency.ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
85
if (psCCBKick->bTADependency)
87
psSyncInfo->psSyncData->ui32WriteOpsPending++;
91
if (psCCBKick->hTASyncInfo != IMG_NULL)
93
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTASyncInfo;
95
PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_KICK, KICK_TOKEN_TA_SYNC,
96
psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
98
psTACmd->sTATQSyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
99
psTACmd->sTATQSyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
101
psTACmd->ui32TATQSyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++;
102
psTACmd->ui32TATQSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
105
if (psCCBKick->h3DSyncInfo != IMG_NULL)
107
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->h3DSyncInfo;
109
PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_KICK, KICK_TOKEN_3D_SYNC,
110
psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
112
psTACmd->s3DTQSyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
113
psTACmd->s3DTQSyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
115
psTACmd->ui323DTQSyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++;
116
psTACmd->ui323DTQSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
119
psTACmd->ui32NumTAStatusVals = psCCBKick->ui32NumTAStatusVals;
120
if (psCCBKick->ui32NumTAStatusVals != 0)
123
for (i = 0; i < psCCBKick->ui32NumTAStatusVals; i++)
125
#if defined(SUPPORT_SGX_NEW_STATUS_VALS)
126
psTACmd->sCtlTAStatusInfo[i] = psCCBKick->asTAStatusUpdate[i].sCtlStatus;
128
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ahTAStatusSyncInfo[i];
129
psTACmd->sCtlTAStatusInfo[i].sStatusDevAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
130
psTACmd->sCtlTAStatusInfo[i].ui32StatusValue = psSyncInfo->psSyncData->ui32ReadOpsPending;
135
psTACmd->ui32Num3DStatusVals = psCCBKick->ui32Num3DStatusVals;
136
if (psCCBKick->ui32Num3DStatusVals != 0)
139
for (i = 0; i < psCCBKick->ui32Num3DStatusVals; i++)
141
#if defined(SUPPORT_SGX_NEW_STATUS_VALS)
142
psTACmd->sCtl3DStatusInfo[i] = psCCBKick->as3DStatusUpdate[i].sCtlStatus;
144
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ah3DStatusSyncInfo[i];
145
psTACmd->sCtl3DStatusInfo[i].sStatusDevAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
146
psTACmd->sCtl3DStatusInfo[i].ui32StatusValue = psSyncInfo->psSyncData->ui32ReadOpsPending;
152
#if defined(SUPPORT_SGX_GENERALISED_SYNCOBJECTS)
154
psTACmd->ui32NumTASrcSyncs = psCCBKick->ui32NumTASrcSyncs;
155
for (i=0; i<psCCBKick->ui32NumTASrcSyncs; i++)
157
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTASrcKernelSyncInfo[i];
159
psTACmd->asTASrcSyncs[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
160
psTACmd->asTASrcSyncs[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
163
psTACmd->asTASrcSyncs[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++;
165
psTACmd->asTASrcSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
168
psTACmd->ui32NumTADstSyncs = psCCBKick->ui32NumTADstSyncs;
169
for (i=0; i<psCCBKick->ui32NumTADstSyncs; i++)
171
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTADstKernelSyncInfo[i];
173
psTACmd->asTADstSyncs[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
174
psTACmd->asTADstSyncs[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
177
psTACmd->asTADstSyncs[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
179
psTACmd->asTADstSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++;
182
psTACmd->ui32Num3DSrcSyncs = psCCBKick->ui32Num3DSrcSyncs;
183
for (i=0; i<psCCBKick->ui32Num3DSrcSyncs; i++)
185
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ah3DSrcKernelSyncInfo[i];
187
psTACmd->as3DSrcSyncs[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
188
psTACmd->as3DSrcSyncs[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
191
psTACmd->as3DSrcSyncs[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++;
193
psTACmd->as3DSrcSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
197
psTACmd->ui32NumSrcSyncs = psCCBKick->ui32NumSrcSyncs;
198
for (i=0; i<psCCBKick->ui32NumSrcSyncs; i++)
200
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahSrcKernelSyncInfo[i];
202
PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_KICK, KICK_TOKEN_SRC_SYNC,
203
psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
205
psTACmd->asSrcSyncs[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
206
psTACmd->asSrcSyncs[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
209
psTACmd->asSrcSyncs[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++;
211
psTACmd->asSrcSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
215
if (psCCBKick->bFirstKickOrResume && psCCBKick->ui32NumDstSyncObjects > 0)
217
PVRSRV_KERNEL_MEM_INFO *psHWDstSyncListMemInfo =
218
(PVRSRV_KERNEL_MEM_INFO *)psCCBKick->hKernelHWSyncListMemInfo;
219
SGXMKIF_HWDEVICE_SYNC_LIST *psHWDeviceSyncList = psHWDstSyncListMemInfo->pvLinAddrKM;
220
IMG_UINT32 ui32NumDstSyncs = psCCBKick->ui32NumDstSyncObjects;
222
PVR_ASSERT(((PVRSRV_KERNEL_MEM_INFO *)psCCBKick->hKernelHWSyncListMemInfo)->uAllocSize >= (sizeof(SGXMKIF_HWDEVICE_SYNC_LIST) +
223
(sizeof(PVRSRV_DEVICE_SYNC_OBJECT) * ui32NumDstSyncs)));
225
psHWDeviceSyncList->ui32NumSyncObjects = ui32NumDstSyncs;
227
if (PDumpIsCaptureFrameKM())
229
PDUMPCOMMENT("HWDeviceSyncList for TACmd\r\n");
231
psHWDstSyncListMemInfo,
233
sizeof(SGXMKIF_HWDEVICE_SYNC_LIST),
235
MAKEUNIQUETAG(psHWDstSyncListMemInfo));
239
for (i=0; i<ui32NumDstSyncs; i++)
241
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->pahDstSyncHandles[i];
246
PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_KICK, KICK_TOKEN_DST_SYNC,
247
psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
249
psHWDeviceSyncList->asSyncData[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
250
psHWDeviceSyncList->asSyncData[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
252
psHWDeviceSyncList->asSyncData[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
253
psHWDeviceSyncList->asSyncData[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++;
256
if (PDumpIsCaptureFrameKM())
258
IMG_UINT32 ui32ModifiedValue;
259
IMG_UINT32 ui32SyncOffset = offsetof(SGXMKIF_HWDEVICE_SYNC_LIST, asSyncData)
260
+ (i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT));
261
IMG_UINT32 ui32WOpsOffset = ui32SyncOffset
262
+ offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal);
263
IMG_UINT32 ui32ROpsOffset = ui32SyncOffset
264
+ offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOpsPendingVal);
266
PDUMPCOMMENT("HWDeviceSyncObject for RT: %i\r\n", i);
269
psHWDstSyncListMemInfo,
271
sizeof(PVRSRV_DEVICE_SYNC_OBJECT),
273
MAKEUNIQUETAG(psHWDstSyncListMemInfo));
275
if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) &&
276
(psSyncInfo->psSyncData->ui32LastReadOpDumpVal == 0))
279
PDUMPCOMMENT("Init RT ROpsComplete\r\n");
280
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
281
psSyncInfo->psSyncDataMemInfoKM,
282
offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete),
283
sizeof(psSyncInfo->psSyncData->ui32ReadOpsComplete),
285
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
287
PDUMPCOMMENT("Init RT WOpsComplete\r\n");
288
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
289
psSyncInfo->psSyncDataMemInfoKM,
290
offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete),
291
sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete),
293
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
296
psSyncInfo->psSyncData->ui32LastOpDumpVal++;
298
ui32ModifiedValue = psSyncInfo->psSyncData->ui32LastOpDumpVal - 1;
300
PDUMPCOMMENT("Modify RT %d WOpPendingVal in HWDevSyncList\r\n", i);
302
PDUMPMEM(&ui32ModifiedValue,
303
psHWDstSyncListMemInfo,
307
MAKEUNIQUETAG(psHWDstSyncListMemInfo));
309
ui32ModifiedValue = 0;
310
PDUMPCOMMENT("Modify RT %d ROpsPendingVal in HWDevSyncList\r\n", i);
312
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
313
psHWDstSyncListMemInfo,
317
MAKEUNIQUETAG(psHWDstSyncListMemInfo));
323
psHWDeviceSyncList->asSyncData[i].sWriteOpsCompleteDevVAddr.uiAddr = 0;
324
psHWDeviceSyncList->asSyncData[i].sReadOpsCompleteDevVAddr.uiAddr = 0;
326
psHWDeviceSyncList->asSyncData[i].ui32ReadOpsPendingVal = 0;
327
psHWDeviceSyncList->asSyncData[i].ui32WriteOpsPendingVal = 0;
335
psTACmd->ui32CtrlFlags |= SGXMKIF_CMDTA_CTRLFLAGS_READY;
338
if (PDumpIsCaptureFrameKM())
340
PDUMPCOMMENT("Shared part of TA command\r\n");
344
psCCBKick->ui32CCBDumpWOff,
345
sizeof(SGXMKIF_CMDTA_SHARED),
347
MAKEUNIQUETAG(psCCBMemInfo));
349
#if defined(SUPPORT_SGX_GENERALISED_SYNCOBJECTS)
350
for (i=0; i<psCCBKick->ui32NumTASrcSyncs; i++)
352
IMG_UINT32 ui32ModifiedValue;
353
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTASrcKernelSyncInfo[i];
355
if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) &&
356
(psSyncInfo->psSyncData->ui32LastReadOpDumpVal == 0))
359
PDUMPCOMMENT("Init RT TA-SRC ROpsComplete\r\n", i);
360
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
361
psSyncInfo->psSyncDataMemInfoKM,
362
offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete),
363
sizeof(psSyncInfo->psSyncData->ui32ReadOpsComplete),
365
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
367
PDUMPCOMMENT("Init RT TA-SRC WOpsComplete\r\n");
368
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
369
psSyncInfo->psSyncDataMemInfoKM,
370
offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete),
371
sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete),
373
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
376
psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
378
ui32ModifiedValue = psSyncInfo->psSyncData->ui32LastReadOpDumpVal - 1;
380
PDUMPCOMMENT("Modify TA SrcSync %d ROpsPendingVal\r\n", i);
382
PDUMPMEM(&ui32ModifiedValue,
384
psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, asTASrcSyncs) +
385
(i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT)) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOpsPendingVal),
388
MAKEUNIQUETAG(psCCBMemInfo));
390
PDUMPCOMMENT("Modify TA SrcSync %d WOpPendingVal\r\n", i);
392
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
394
psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, asTASrcSyncs) +
395
(i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT)) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal),
398
MAKEUNIQUETAG(psCCBMemInfo));
401
for (i=0; i<psCCBKick->ui32NumTADstSyncs; i++)
403
IMG_UINT32 ui32ModifiedValue;
404
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTADstKernelSyncInfo[i];
406
if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) &&
407
(psSyncInfo->psSyncData->ui32LastReadOpDumpVal == 0))
410
PDUMPCOMMENT("Init RT TA-DST ROpsComplete\r\n", i);
411
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
412
psSyncInfo->psSyncDataMemInfoKM,
413
offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete),
414
sizeof(psSyncInfo->psSyncData->ui32ReadOpsComplete),
416
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
418
PDUMPCOMMENT("Init RT TA-DST WOpsComplete\r\n");
419
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
420
psSyncInfo->psSyncDataMemInfoKM,
421
offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete),
422
sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete),
424
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
427
psSyncInfo->psSyncData->ui32LastOpDumpVal++;
429
ui32ModifiedValue = psSyncInfo->psSyncData->ui32LastOpDumpVal - 1;
431
PDUMPCOMMENT("Modify TA DstSync %d WOpPendingVal\r\n", i);
433
PDUMPMEM(&ui32ModifiedValue,
435
psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, asTADstSyncs) +
436
(i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT)) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal),
439
MAKEUNIQUETAG(psCCBMemInfo));
441
PDUMPCOMMENT("Modify TA DstSync %d ROpsPendingVal\r\n", i);
443
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
445
psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, asTADstSyncs) +
446
(i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT)) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOpsPendingVal),
449
MAKEUNIQUETAG(psCCBMemInfo));
452
for (i=0; i<psCCBKick->ui32Num3DSrcSyncs; i++)
454
IMG_UINT32 ui32ModifiedValue;
455
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ah3DSrcKernelSyncInfo[i];
457
if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) &&
458
(psSyncInfo->psSyncData->ui32LastReadOpDumpVal == 0))
461
PDUMPCOMMENT("Init RT 3D-SRC ROpsComplete\r\n", i);
462
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
463
psSyncInfo->psSyncDataMemInfoKM,
464
offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete),
465
sizeof(psSyncInfo->psSyncData->ui32ReadOpsComplete),
467
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
469
PDUMPCOMMENT("Init RT 3D-SRC WOpsComplete\r\n");
470
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
471
psSyncInfo->psSyncDataMemInfoKM,
472
offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete),
473
sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete),
475
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
478
psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
480
ui32ModifiedValue = psSyncInfo->psSyncData->ui32LastReadOpDumpVal - 1;
482
PDUMPCOMMENT("Modify 3D SrcSync %d ROpsPendingVal\r\n", i);
484
PDUMPMEM(&ui32ModifiedValue,
486
psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, as3DSrcSyncs) +
487
(i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT)) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOpsPendingVal),
490
MAKEUNIQUETAG(psCCBMemInfo));
492
PDUMPCOMMENT("Modify 3D SrcSync %d WOpPendingVal\r\n", i);
494
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
496
psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, as3DSrcSyncs) +
497
(i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT)) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal),
500
MAKEUNIQUETAG(psCCBMemInfo));
503
for (i=0; i<psCCBKick->ui32NumSrcSyncs; i++)
505
IMG_UINT32 ui32ModifiedValue;
506
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahSrcKernelSyncInfo[i];
508
if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) &&
509
(psSyncInfo->psSyncData->ui32LastReadOpDumpVal == 0))
512
PDUMPCOMMENT("Init RT ROpsComplete\r\n");
513
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
514
psSyncInfo->psSyncDataMemInfoKM,
515
offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete),
516
sizeof(psSyncInfo->psSyncData->ui32ReadOpsComplete),
518
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
520
PDUMPCOMMENT("Init RT WOpsComplete\r\n");
521
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
522
psSyncInfo->psSyncDataMemInfoKM,
523
offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete),
524
sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete),
526
MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM));
529
psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
531
ui32ModifiedValue = psSyncInfo->psSyncData->ui32LastReadOpDumpVal - 1;
533
PDUMPCOMMENT("Modify SrcSync %d ROpsPendingVal\r\n", i);
535
PDUMPMEM(&ui32ModifiedValue,
537
psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, asSrcSyncs) +
538
(i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT)) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOpsPendingVal),
541
MAKEUNIQUETAG(psCCBMemInfo));
543
PDUMPCOMMENT("Modify SrcSync %d WOpPendingVal\r\n", i);
545
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
547
psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, asSrcSyncs) +
548
(i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT)) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal),
551
MAKEUNIQUETAG(psCCBMemInfo));
555
for (i = 0; i < psCCBKick->ui32NumTAStatusVals; i++)
557
#if !defined(SUPPORT_SGX_NEW_STATUS_VALS)
558
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ahTAStatusSyncInfo[i];
559
PDUMPCOMMENT("Modify TA status value in TA cmd\r\n");
560
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
562
psCCBKick->ui32CCBDumpWOff + (IMG_UINT32)offsetof(SGXMKIF_CMDTA_SHARED, sCtlTAStatusInfo[i].ui32StatusValue),
565
MAKEUNIQUETAG(psCCBMemInfo));
569
for (i = 0; i < psCCBKick->ui32Num3DStatusVals; i++)
571
#if !defined(SUPPORT_SGX_NEW_STATUS_VALS)
572
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ah3DStatusSyncInfo[i];
573
PDUMPCOMMENT("Modify 3D status value in TA cmd\r\n");
574
PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
576
psCCBKick->ui32CCBDumpWOff + (IMG_UINT32)offsetof(SGXMKIF_CMDTA_SHARED, sCtl3DStatusInfo[i].ui32StatusValue),
579
MAKEUNIQUETAG(psCCBMemInfo));
585
PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_CMD_END,
588
eError = SGXScheduleCCBCommandKM(hDevHandle, SGXMKIF_CMD_TA, &psCCBKick->sCommand, KERNEL_ID, 0, hDevMemContext, psCCBKick->bLastInScene);
589
if (eError == PVRSRV_ERROR_RETRY)
591
if (psCCBKick->bFirstKickOrResume && psCCBKick->ui32NumDstSyncObjects > 0)
593
for (i=0; i < psCCBKick->ui32NumDstSyncObjects; i++)
596
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->pahDstSyncHandles[i];
600
psSyncInfo->psSyncData->ui32WriteOpsPending--;
602
if (PDumpIsCaptureFrameKM())
604
psSyncInfo->psSyncData->ui32LastOpDumpVal--;
611
#if defined(SUPPORT_SGX_GENERALISED_SYNCOBJECTS)
612
for (i=0; i<psCCBKick->ui32NumTASrcSyncs; i++)
614
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTASrcKernelSyncInfo[i];
615
psSyncInfo->psSyncData->ui32ReadOpsPending--;
617
for (i=0; i<psCCBKick->ui32NumTADstSyncs; i++)
619
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTADstKernelSyncInfo[i];
620
psSyncInfo->psSyncData->ui32WriteOpsPending--;
622
for (i=0; i<psCCBKick->ui32Num3DSrcSyncs; i++)
624
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ah3DSrcKernelSyncInfo[i];
625
psSyncInfo->psSyncData->ui32ReadOpsPending--;
628
for (i=0; i<psCCBKick->ui32NumSrcSyncs; i++)
630
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahSrcKernelSyncInfo[i];
631
psSyncInfo->psSyncData->ui32ReadOpsPending--;
635
PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_FUNCTION_EXIT,
639
else if (PVRSRV_OK != eError)
641
PVR_DPF((PVR_DBG_ERROR, "SGXDoKickKM: SGXScheduleCCBCommandKM failed."));
642
PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_FUNCTION_EXIT,
648
#if defined(NO_HARDWARE)
652
if (psCCBKick->hTA3DSyncInfo)
654
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTA3DSyncInfo;
656
if (psCCBKick->bTADependency)
658
psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending;
662
if (psCCBKick->hTASyncInfo != IMG_NULL)
664
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTASyncInfo;
666
psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending;
669
if (psCCBKick->h3DSyncInfo != IMG_NULL)
671
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->h3DSyncInfo;
673
psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending;
677
for (i = 0; i < psCCBKick->ui32NumTAStatusVals; i++)
679
#if defined(SUPPORT_SGX_NEW_STATUS_VALS)
680
PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo = (PVRSRV_KERNEL_MEM_INFO*)psCCBKick->asTAStatusUpdate[i].hKernelMemInfo;
682
*(IMG_UINT32*)((IMG_UINTPTR_T)psKernelMemInfo->pvLinAddrKM
683
+ (psTACmd->sCtlTAStatusInfo[i].sStatusDevAddr.uiAddr
684
- psKernelMemInfo->sDevVAddr.uiAddr)) = psTACmd->sCtlTAStatusInfo[i].ui32StatusValue;
686
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ahTAStatusSyncInfo[i];
687
psSyncInfo->psSyncData->ui32ReadOpsComplete = psTACmd->sCtlTAStatusInfo[i].ui32StatusValue;
691
#if defined(SUPPORT_SGX_GENERALISED_SYNCOBJECTS)
693
for (i=0; i<psCCBKick->ui32NumTASrcSyncs; i++)
695
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTASrcKernelSyncInfo[i];
696
psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending;
698
for (i=0; i<psCCBKick->ui32NumTADstSyncs; i++)
700
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTADstKernelSyncInfo[i];
701
psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending;
703
for (i=0; i<psCCBKick->ui32Num3DSrcSyncs; i++)
705
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ah3DSrcKernelSyncInfo[i];
706
psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending;
710
for (i=0; i<psCCBKick->ui32NumSrcSyncs; i++)
712
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahSrcKernelSyncInfo[i];
713
psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending;
717
if (psCCBKick->bTerminateOrAbort)
719
if (psCCBKick->ui32NumDstSyncObjects > 0)
721
PVRSRV_KERNEL_MEM_INFO *psHWDstSyncListMemInfo =
722
(PVRSRV_KERNEL_MEM_INFO *)psCCBKick->hKernelHWSyncListMemInfo;
723
SGXMKIF_HWDEVICE_SYNC_LIST *psHWDeviceSyncList = psHWDstSyncListMemInfo->pvLinAddrKM;
725
for (i=0; i<psCCBKick->ui32NumDstSyncObjects; i++)
727
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->pahDstSyncHandles[i];
729
psSyncInfo->psSyncData->ui32WriteOpsComplete = psHWDeviceSyncList->asSyncData[i].ui32WriteOpsPendingVal+1;
734
for (i = 0; i < psCCBKick->ui32Num3DStatusVals; i++)
736
#if defined(SUPPORT_SGX_NEW_STATUS_VALS)
737
PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo = (PVRSRV_KERNEL_MEM_INFO*)psCCBKick->as3DStatusUpdate[i].hKernelMemInfo;
739
*(IMG_UINT32*)((IMG_UINTPTR_T)psKernelMemInfo->pvLinAddrKM
740
+ (psTACmd->sCtl3DStatusInfo[i].sStatusDevAddr.uiAddr
741
- psKernelMemInfo->sDevVAddr.uiAddr)) = psTACmd->sCtl3DStatusInfo[i].ui32StatusValue;
743
psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->ah3DStatusSyncInfo[i];
744
psSyncInfo->psSyncData->ui32ReadOpsComplete = psTACmd->sCtl3DStatusInfo[i].ui32StatusValue;
749
PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_FUNCTION_EXIT,