PageRenderTime 117ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/drivers/gpu/pvr/sgx/sgxtransfer.c

https://bitbucket.org/wisechild/galaxy-nexus
C | 741 lines | 584 code | 132 blank | 25 comment | 122 complexity | b9af1de8f1453b53df1f96356f21f588 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1. /**********************************************************************
  2. *
  3. * Copyright (C) Imagination Technologies Ltd. All rights reserved.
  4. *
  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.
  8. *
  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.
  13. *
  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.
  17. *
  18. * The full GNU General Public License is included in this distribution in
  19. * the file called "COPYING".
  20. *
  21. * Contact Information:
  22. * Imagination Technologies Ltd. <gpl-support@imgtec.com>
  23. * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
  24. *
  25. ******************************************************************************/
  26. #if defined(TRANSFER_QUEUE)
  27. #include <stddef.h>
  28. #include "sgxdefs.h"
  29. #include "services_headers.h"
  30. #include "buffer_manager.h"
  31. #include "sgxinfo.h"
  32. #include "sysconfig.h"
  33. #include "pdump_km.h"
  34. #include "mmu.h"
  35. #include "pvr_bridge.h"
  36. #include "sgx_bridge_km.h"
  37. #include "sgxinfokm.h"
  38. #include "osfunc.h"
  39. #include "pvr_debug.h"
  40. #include "sgxutils.h"
  41. #include "ttrace.h"
  42. #if defined (SUPPORT_SID_INTERFACE)
  43. IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSFER_SGX_KICK_KM *psKick)
  44. #else
  45. IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSFER_SGX_KICK *psKick)
  46. #endif
  47. {
  48. PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psKick->hCCBMemInfo;
  49. SGXMKIF_COMMAND sCommand = {0};
  50. SGXMKIF_TRANSFERCMD_SHARED *psSharedTransferCmd;
  51. PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
  52. PVRSRV_ERROR eError;
  53. IMG_UINT32 loop;
  54. IMG_HANDLE hDevMemContext = IMG_NULL;
  55. IMG_BOOL abSrcSyncEnable[SGX_MAX_TRANSFER_SYNC_OPS];
  56. IMG_UINT32 ui32RealSrcSyncNum = 0;
  57. IMG_BOOL abDstSyncEnable[SGX_MAX_TRANSFER_SYNC_OPS];
  58. IMG_UINT32 ui32RealDstSyncNum = 0;
  59. #if defined(PDUMP)
  60. IMG_BOOL bPersistentProcess = IMG_FALSE;
  61. {
  62. PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
  63. if(psPerProc != IMG_NULL)
  64. {
  65. bPersistentProcess = psPerProc->bPDumpPersistent;
  66. }
  67. }
  68. #endif
  69. #if defined(FIX_HW_BRN_31620)
  70. hDevMemContext = psKick->hDevMemContext;
  71. #endif
  72. PVR_TTRACE(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_FUNCTION_ENTER, TRANSFER_TOKEN_SUBMIT);
  73. for (loop = 0; loop < SGX_MAX_TRANSFER_SYNC_OPS; loop++)
  74. {
  75. abSrcSyncEnable[loop] = IMG_TRUE;
  76. abDstSyncEnable[loop] = IMG_TRUE;
  77. }
  78. if (!CCB_OFFSET_IS_VALID(SGXMKIF_TRANSFERCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset))
  79. {
  80. PVR_DPF((PVR_DBG_ERROR, "SGXSubmitTransferKM: Invalid CCB offset"));
  81. PVR_TTRACE(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_FUNCTION_EXIT,
  82. TRANSFER_TOKEN_SUBMIT);
  83. return PVRSRV_ERROR_INVALID_PARAMS;
  84. }
  85. psSharedTransferCmd = CCB_DATA_FROM_OFFSET(SGXMKIF_TRANSFERCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset);
  86. PVR_TTRACE(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_CMD_START, TRANSFER_TOKEN_SUBMIT);
  87. PVR_TTRACE_UI32(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_CCB,
  88. TRANSFER_TOKEN_CCB_OFFSET, psKick->ui32SharedCmdCCBOffset);
  89. if (psKick->hTASyncInfo != IMG_NULL)
  90. {
  91. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo;
  92. PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_TRANSFER, TRANSFER_TOKEN_TA_SYNC,
  93. psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
  94. psSharedTransferCmd->ui32TASyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++;
  95. psSharedTransferCmd->ui32TASyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
  96. psSharedTransferCmd->sTASyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
  97. psSharedTransferCmd->sTASyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
  98. }
  99. else
  100. {
  101. psSharedTransferCmd->sTASyncWriteOpsCompleteDevVAddr.uiAddr = 0;
  102. psSharedTransferCmd->sTASyncReadOpsCompleteDevVAddr.uiAddr = 0;
  103. }
  104. if (psKick->h3DSyncInfo != IMG_NULL)
  105. {
  106. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo;
  107. PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_TRANSFER, TRANSFER_TOKEN_3D_SYNC,
  108. psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
  109. psSharedTransferCmd->ui323DSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++;
  110. psSharedTransferCmd->ui323DSyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
  111. psSharedTransferCmd->s3DSyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
  112. psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
  113. }
  114. else
  115. {
  116. psSharedTransferCmd->s3DSyncWriteOpsCompleteDevVAddr.uiAddr = 0;
  117. psSharedTransferCmd->s3DSyncReadOpsCompleteDevVAddr.uiAddr = 0;
  118. }
  119. for (loop = 0; loop < MIN(SGX_MAX_TRANSFER_SYNC_OPS, psKick->ui32NumSrcSync); loop++)
  120. {
  121. IMG_UINT32 i;
  122. PVRSRV_KERNEL_SYNC_INFO * psMySyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop];
  123. for (i = 0; i < loop; i++)
  124. {
  125. if (abSrcSyncEnable[i])
  126. {
  127. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[i];
  128. if (psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr == psMySyncInfo->sWriteOpsCompleteDevVAddr.uiAddr)
  129. {
  130. PVR_DPF((PVR_DBG_WARNING, "SGXSubmitTransferKM : Same src synchronized multiple times!"));
  131. abSrcSyncEnable[loop] = IMG_FALSE;
  132. break;
  133. }
  134. }
  135. }
  136. if (abSrcSyncEnable[loop])
  137. {
  138. ui32RealSrcSyncNum++;
  139. }
  140. }
  141. for (loop = 0; loop < MIN(SGX_MAX_TRANSFER_SYNC_OPS, psKick->ui32NumDstSync); loop++)
  142. {
  143. IMG_UINT32 i;
  144. PVRSRV_KERNEL_SYNC_INFO * psMySyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop];
  145. for (i = 0; i < loop; i++)
  146. {
  147. if (abDstSyncEnable[i])
  148. {
  149. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[i];
  150. if (psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr == psMySyncInfo->sWriteOpsCompleteDevVAddr.uiAddr)
  151. {
  152. PVR_DPF((PVR_DBG_WARNING, "SGXSubmitTransferKM : Same dst synchronized multiple times!"));
  153. abDstSyncEnable[loop] = IMG_FALSE;
  154. break;
  155. }
  156. }
  157. }
  158. if (abDstSyncEnable[loop])
  159. {
  160. ui32RealDstSyncNum++;
  161. }
  162. }
  163. psSharedTransferCmd->ui32NumSrcSyncs = ui32RealSrcSyncNum;
  164. psSharedTransferCmd->ui32NumDstSyncs = ui32RealDstSyncNum;
  165. if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL)
  166. {
  167. IMG_UINT32 i = 0;
  168. for (loop = 0; loop < psKick->ui32NumSrcSync; loop++)
  169. {
  170. if (abSrcSyncEnable[loop])
  171. {
  172. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop];
  173. PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_TRANSFER, TRANSFER_TOKEN_SRC_SYNC,
  174. psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
  175. psSharedTransferCmd->asSrcSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
  176. psSharedTransferCmd->asSrcSyncs[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
  177. psSharedTransferCmd->asSrcSyncs[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
  178. psSharedTransferCmd->asSrcSyncs[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
  179. i++;
  180. }
  181. }
  182. PVR_ASSERT(i == ui32RealSrcSyncNum);
  183. i = 0;
  184. for (loop = 0; loop < psKick->ui32NumDstSync; loop++)
  185. {
  186. if (abDstSyncEnable[loop])
  187. {
  188. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop];
  189. PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_TRANSFER, TRANSFER_TOKEN_DST_SYNC,
  190. psSyncInfo, PVRSRV_SYNCOP_SAMPLE);
  191. psSharedTransferCmd->asDstSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
  192. psSharedTransferCmd->asDstSyncs[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
  193. psSharedTransferCmd->asDstSyncs[i].ui32ReadOps2PendingVal = psSyncInfo->psSyncData->ui32ReadOps2Pending;
  194. psSharedTransferCmd->asDstSyncs[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
  195. psSharedTransferCmd->asDstSyncs[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
  196. psSharedTransferCmd->asDstSyncs[i].sReadOps2CompleteDevVAddr = psSyncInfo->sReadOps2CompleteDevVAddr;
  197. i++;
  198. }
  199. }
  200. PVR_ASSERT(i == ui32RealDstSyncNum);
  201. for (loop = 0; loop < psKick->ui32NumSrcSync; loop++)
  202. {
  203. if (abSrcSyncEnable[loop])
  204. {
  205. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop];
  206. psSyncInfo->psSyncData->ui32ReadOpsPending++;
  207. }
  208. }
  209. for (loop = 0; loop < psKick->ui32NumDstSync; loop++)
  210. {
  211. if (abDstSyncEnable[loop])
  212. {
  213. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop];
  214. psSyncInfo->psSyncData->ui32WriteOpsPending++;
  215. }
  216. }
  217. }
  218. #if defined(PDUMP)
  219. if ((PDumpIsCaptureFrameKM()
  220. || ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0))
  221. && (bPersistentProcess == IMG_FALSE) )
  222. {
  223. PDUMPCOMMENT("Shared part of transfer command\r\n");
  224. PDUMPMEM(psSharedTransferCmd,
  225. psCCBMemInfo,
  226. psKick->ui32CCBDumpWOff,
  227. sizeof(SGXMKIF_TRANSFERCMD_SHARED),
  228. psKick->ui32PDumpFlags,
  229. MAKEUNIQUETAG(psCCBMemInfo));
  230. if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL)
  231. {
  232. IMG_UINT32 i = 0;
  233. for (loop = 0; loop < psKick->ui32NumSrcSync; loop++)
  234. {
  235. if (abSrcSyncEnable[loop])
  236. {
  237. psSyncInfo = psKick->ahSrcSyncInfo[loop];
  238. PDUMPCOMMENT("Hack src surface write op in transfer cmd\r\n");
  239. PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
  240. psCCBMemInfo,
  241. psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, asSrcSyncs) + i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal)),
  242. sizeof(psSyncInfo->psSyncData->ui32LastOpDumpVal),
  243. psKick->ui32PDumpFlags,
  244. MAKEUNIQUETAG(psCCBMemInfo));
  245. PDUMPCOMMENT("Hack src surface read op in transfer cmd\r\n");
  246. PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
  247. psCCBMemInfo,
  248. psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, asSrcSyncs) + i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOpsPendingVal)),
  249. sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal),
  250. psKick->ui32PDumpFlags,
  251. MAKEUNIQUETAG(psCCBMemInfo));
  252. i++;
  253. }
  254. }
  255. i = 0;
  256. for (loop = 0; loop < psKick->ui32NumDstSync; loop++)
  257. {
  258. if (abDstSyncEnable[i])
  259. {
  260. IMG_UINT32 ui32PDumpReadOp2 = 0;
  261. psSyncInfo = psKick->ahDstSyncInfo[loop];
  262. PDUMPCOMMENT("Hack dest surface write op in transfer cmd\r\n");
  263. PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
  264. psCCBMemInfo,
  265. psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, asDstSyncs) + i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal)),
  266. sizeof(psSyncInfo->psSyncData->ui32LastOpDumpVal),
  267. psKick->ui32PDumpFlags,
  268. MAKEUNIQUETAG(psCCBMemInfo));
  269. PDUMPCOMMENT("Hack dest surface read op in transfer cmd\r\n");
  270. PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
  271. psCCBMemInfo,
  272. psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, asDstSyncs) + i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOpsPendingVal)),
  273. sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal),
  274. psKick->ui32PDumpFlags,
  275. MAKEUNIQUETAG(psCCBMemInfo));
  276. PDUMPCOMMENT("Hack dest surface read op2 in transfer cmd\r\n");
  277. PDUMPMEM(&ui32PDumpReadOp2,
  278. psCCBMemInfo,
  279. psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, asDstSyncs) + i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOps2PendingVal)),
  280. sizeof(ui32PDumpReadOp2),
  281. psKick->ui32PDumpFlags,
  282. MAKEUNIQUETAG(psCCBMemInfo));
  283. i++;
  284. }
  285. }
  286. for (loop = 0; loop < (psKick->ui32NumSrcSync); loop++)
  287. {
  288. if (abSrcSyncEnable[loop])
  289. {
  290. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop];
  291. psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
  292. }
  293. }
  294. for (loop = 0; loop < (psKick->ui32NumDstSync); loop++)
  295. {
  296. if (abDstSyncEnable[loop])
  297. {
  298. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[0];
  299. psSyncInfo->psSyncData->ui32LastOpDumpVal++;
  300. }
  301. }
  302. }
  303. }
  304. #endif
  305. sCommand.ui32Data[1] = psKick->sHWTransferContextDevVAddr.uiAddr;
  306. PVR_TTRACE(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_CMD_END,
  307. TRANSFER_TOKEN_SUBMIT);
  308. eError = SGXScheduleCCBCommandKM(hDevHandle, SGXMKIF_CMD_TRANSFER, &sCommand, KERNEL_ID, psKick->ui32PDumpFlags, hDevMemContext, IMG_FALSE);
  309. if (eError == PVRSRV_ERROR_RETRY)
  310. {
  311. if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL)
  312. {
  313. for (loop = 0; loop < psKick->ui32NumSrcSync; loop++)
  314. {
  315. if (abSrcSyncEnable[loop])
  316. {
  317. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop];
  318. psSyncInfo->psSyncData->ui32ReadOpsPending--;
  319. #if defined(PDUMP)
  320. if (PDumpIsCaptureFrameKM()
  321. || ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0))
  322. {
  323. psSyncInfo->psSyncData->ui32LastReadOpDumpVal--;
  324. }
  325. #endif
  326. }
  327. }
  328. for (loop = 0; loop < psKick->ui32NumDstSync; loop++)
  329. {
  330. if (abDstSyncEnable[loop])
  331. {
  332. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop];
  333. psSyncInfo->psSyncData->ui32WriteOpsPending--;
  334. #if defined(PDUMP)
  335. if (PDumpIsCaptureFrameKM()
  336. || ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0))
  337. {
  338. psSyncInfo->psSyncData->ui32LastOpDumpVal--;
  339. }
  340. #endif
  341. }
  342. }
  343. }
  344. if (psKick->hTASyncInfo != IMG_NULL)
  345. {
  346. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo;
  347. psSyncInfo->psSyncData->ui32WriteOpsPending--;
  348. }
  349. if (psKick->h3DSyncInfo != IMG_NULL)
  350. {
  351. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo;
  352. psSyncInfo->psSyncData->ui32WriteOpsPending--;
  353. }
  354. }
  355. else if (PVRSRV_OK != eError)
  356. {
  357. PVR_DPF((PVR_DBG_ERROR, "SGXSubmitTransferKM: SGXScheduleCCBCommandKM failed."));
  358. PVR_TTRACE(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_FUNCTION_EXIT,
  359. TRANSFER_TOKEN_SUBMIT);
  360. return eError;
  361. }
  362. #if defined(NO_HARDWARE)
  363. if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_NOSYNCUPDATE) == 0)
  364. {
  365. for (loop = 0; loop < psKick->ui32NumSrcSync; loop++)
  366. {
  367. if (abSrcSyncEnable[loop])
  368. {
  369. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop];
  370. psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending;
  371. }
  372. }
  373. for (loop = 0; loop < psKick->ui32NumDstSync; loop++)
  374. {
  375. if (abDstSyncEnable[loop])
  376. {
  377. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop];
  378. psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending;
  379. }
  380. }
  381. if (psKick->hTASyncInfo != IMG_NULL)
  382. {
  383. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo;
  384. psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending;
  385. }
  386. if (psKick->h3DSyncInfo != IMG_NULL)
  387. {
  388. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo;
  389. psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending;
  390. }
  391. }
  392. #endif
  393. PVR_TTRACE(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_FUNCTION_EXIT,
  394. TRANSFER_TOKEN_SUBMIT);
  395. return eError;
  396. }
  397. #if defined(SGX_FEATURE_2D_HARDWARE)
  398. #if defined (SUPPORT_SID_INTERFACE)
  399. IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK_KM *psKick)
  400. #else
  401. IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK *psKick)
  402. #endif
  403. {
  404. PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psKick->hCCBMemInfo;
  405. SGXMKIF_COMMAND sCommand = {0};
  406. SGXMKIF_2DCMD_SHARED *ps2DCmd;
  407. PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
  408. PVRSRV_ERROR eError;
  409. IMG_UINT32 i;
  410. IMG_HANDLE hDevMemContext = IMG_NULL;
  411. #if defined(PDUMP)
  412. IMG_BOOL bPersistentProcess = IMG_FALSE;
  413. {
  414. PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
  415. if(psPerProc != IMG_NULL)
  416. {
  417. bPersistentProcess = psPerProc->bPDumpPersistent;
  418. }
  419. }
  420. #endif
  421. #if defined(FIX_HW_BRN_31620)
  422. hDevMemContext = psKick->hDevMemContext;
  423. #endif
  424. if (!CCB_OFFSET_IS_VALID(SGXMKIF_2DCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset))
  425. {
  426. PVR_DPF((PVR_DBG_ERROR, "SGXSubmit2DKM: Invalid CCB offset"));
  427. return PVRSRV_ERROR_INVALID_PARAMS;
  428. }
  429. ps2DCmd = CCB_DATA_FROM_OFFSET(SGXMKIF_2DCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset);
  430. OSMemSet(ps2DCmd, 0, sizeof(*ps2DCmd));
  431. if (psKick->hTASyncInfo != IMG_NULL)
  432. {
  433. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo;
  434. ps2DCmd->sTASyncData.ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++;
  435. ps2DCmd->sTASyncData.ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
  436. ps2DCmd->sTASyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
  437. ps2DCmd->sTASyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
  438. }
  439. if (psKick->h3DSyncInfo != IMG_NULL)
  440. {
  441. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo;
  442. ps2DCmd->s3DSyncData.ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++;
  443. ps2DCmd->s3DSyncData.ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
  444. ps2DCmd->s3DSyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
  445. ps2DCmd->s3DSyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
  446. }
  447. ps2DCmd->ui32NumSrcSync = psKick->ui32NumSrcSync;
  448. for (i = 0; i < psKick->ui32NumSrcSync; i++)
  449. {
  450. psSyncInfo = psKick->ahSrcSyncInfo[i];
  451. ps2DCmd->sSrcSyncData[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
  452. ps2DCmd->sSrcSyncData[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
  453. ps2DCmd->sSrcSyncData[i].sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
  454. ps2DCmd->sSrcSyncData[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
  455. }
  456. if (psKick->hDstSyncInfo != IMG_NULL)
  457. {
  458. psSyncInfo = psKick->hDstSyncInfo;
  459. ps2DCmd->sDstSyncData.ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending;
  460. ps2DCmd->sDstSyncData.ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending;
  461. ps2DCmd->sDstSyncData.ui32ReadOps2PendingVal = psSyncInfo->psSyncData->ui32ReadOps2Pending;
  462. ps2DCmd->sDstSyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr;
  463. ps2DCmd->sDstSyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr;
  464. ps2DCmd->sDstSyncData.sReadOps2CompleteDevVAddr = psSyncInfo->sReadOps2CompleteDevVAddr;
  465. }
  466. for (i = 0; i < psKick->ui32NumSrcSync; i++)
  467. {
  468. psSyncInfo = psKick->ahSrcSyncInfo[i];
  469. psSyncInfo->psSyncData->ui32ReadOpsPending++;
  470. }
  471. if (psKick->hDstSyncInfo != IMG_NULL)
  472. {
  473. psSyncInfo = psKick->hDstSyncInfo;
  474. psSyncInfo->psSyncData->ui32WriteOpsPending++;
  475. }
  476. #if defined(PDUMP)
  477. if ((PDumpIsCaptureFrameKM()
  478. || ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0))
  479. && (bPersistentProcess == IMG_FALSE) )
  480. {
  481. PDUMPCOMMENT("Shared part of 2D command\r\n");
  482. PDUMPMEM(ps2DCmd,
  483. psCCBMemInfo,
  484. psKick->ui32CCBDumpWOff,
  485. sizeof(SGXMKIF_2DCMD_SHARED),
  486. psKick->ui32PDumpFlags,
  487. MAKEUNIQUETAG(psCCBMemInfo));
  488. for (i = 0; i < psKick->ui32NumSrcSync; i++)
  489. {
  490. psSyncInfo = psKick->ahSrcSyncInfo[i];
  491. PDUMPCOMMENT("Hack src surface write op in 2D cmd\r\n");
  492. PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
  493. psCCBMemInfo,
  494. psKick->ui32CCBDumpWOff + (IMG_UINT32)offsetof(SGXMKIF_2DCMD_SHARED, sSrcSyncData[i].ui32WriteOpsPendingVal),
  495. sizeof(psSyncInfo->psSyncData->ui32LastOpDumpVal),
  496. psKick->ui32PDumpFlags,
  497. MAKEUNIQUETAG(psCCBMemInfo));
  498. PDUMPCOMMENT("Hack src surface read op in 2D cmd\r\n");
  499. PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
  500. psCCBMemInfo,
  501. psKick->ui32CCBDumpWOff + (IMG_UINT32)offsetof(SGXMKIF_2DCMD_SHARED, sSrcSyncData[i].ui32ReadOpsPendingVal),
  502. sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal),
  503. psKick->ui32PDumpFlags,
  504. MAKEUNIQUETAG(psCCBMemInfo));
  505. }
  506. if (psKick->hDstSyncInfo != IMG_NULL)
  507. {
  508. IMG_UINT32 ui32PDumpReadOp2 = 0;
  509. psSyncInfo = psKick->hDstSyncInfo;
  510. PDUMPCOMMENT("Hack dest surface write op in 2D cmd\r\n");
  511. PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal,
  512. psCCBMemInfo,
  513. psKick->ui32CCBDumpWOff + (IMG_UINT32)offsetof(SGXMKIF_2DCMD_SHARED, sDstSyncData.ui32WriteOpsPendingVal),
  514. sizeof(psSyncInfo->psSyncData->ui32LastOpDumpVal),
  515. psKick->ui32PDumpFlags,
  516. MAKEUNIQUETAG(psCCBMemInfo));
  517. PDUMPCOMMENT("Hack dest surface read op in 2D cmd\r\n");
  518. PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal,
  519. psCCBMemInfo,
  520. psKick->ui32CCBDumpWOff + (IMG_UINT32)offsetof(SGXMKIF_2DCMD_SHARED, sDstSyncData.ui32ReadOpsPendingVal),
  521. sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal),
  522. psKick->ui32PDumpFlags,
  523. MAKEUNIQUETAG(psCCBMemInfo));
  524. PDUMPCOMMENT("Hack dest surface read op2 in 2D cmd\r\n");
  525. PDUMPMEM(&ui32PDumpReadOp2,
  526. psCCBMemInfo,
  527. psKick->ui32CCBDumpWOff + (IMG_UINT32)offsetof(SGXMKIF_2DCMD_SHARED, sDstSyncData.ui32ReadOps2PendingVal),
  528. sizeof(ui32PDumpReadOp2),
  529. psKick->ui32PDumpFlags,
  530. MAKEUNIQUETAG(psCCBMemInfo));
  531. }
  532. for (i = 0; i < psKick->ui32NumSrcSync; i++)
  533. {
  534. psSyncInfo = psKick->ahSrcSyncInfo[i];
  535. psSyncInfo->psSyncData->ui32LastReadOpDumpVal++;
  536. }
  537. if (psKick->hDstSyncInfo != IMG_NULL)
  538. {
  539. psSyncInfo = psKick->hDstSyncInfo;
  540. psSyncInfo->psSyncData->ui32LastOpDumpVal++;
  541. }
  542. }
  543. #endif
  544. sCommand.ui32Data[1] = psKick->sHW2DContextDevVAddr.uiAddr;
  545. eError = SGXScheduleCCBCommandKM(hDevHandle, SGXMKIF_CMD_2D, &sCommand, KERNEL_ID, psKick->ui32PDumpFlags, hDevMemContext, IMG_FALSE);
  546. if (eError == PVRSRV_ERROR_RETRY)
  547. {
  548. #if defined(PDUMP)
  549. if (PDumpIsCaptureFrameKM())
  550. {
  551. for (i = 0; i < psKick->ui32NumSrcSync; i++)
  552. {
  553. psSyncInfo = psKick->ahSrcSyncInfo[i];
  554. psSyncInfo->psSyncData->ui32LastReadOpDumpVal--;
  555. }
  556. if (psKick->hDstSyncInfo != IMG_NULL)
  557. {
  558. psSyncInfo = psKick->hDstSyncInfo;
  559. psSyncInfo->psSyncData->ui32LastOpDumpVal--;
  560. }
  561. }
  562. #endif
  563. for (i = 0; i < psKick->ui32NumSrcSync; i++)
  564. {
  565. psSyncInfo = psKick->ahSrcSyncInfo[i];
  566. psSyncInfo->psSyncData->ui32ReadOpsPending--;
  567. }
  568. if (psKick->hDstSyncInfo != IMG_NULL)
  569. {
  570. psSyncInfo = psKick->hDstSyncInfo;
  571. psSyncInfo->psSyncData->ui32WriteOpsPending--;
  572. }
  573. if (psKick->hTASyncInfo != IMG_NULL)
  574. {
  575. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo;
  576. psSyncInfo->psSyncData->ui32WriteOpsPending--;
  577. }
  578. if (psKick->h3DSyncInfo != IMG_NULL)
  579. {
  580. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo;
  581. psSyncInfo->psSyncData->ui32WriteOpsPending--;
  582. }
  583. }
  584. #if defined(NO_HARDWARE)
  585. for(i = 0; i < psKick->ui32NumSrcSync; i++)
  586. {
  587. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[i];
  588. psSyncInfo->psSyncData->ui32ReadOpsComplete = psSyncInfo->psSyncData->ui32ReadOpsPending;
  589. }
  590. if (psKick->hDstSyncInfo != IMG_NULL)
  591. {
  592. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hDstSyncInfo;
  593. psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending;
  594. }
  595. if (psKick->hTASyncInfo != IMG_NULL)
  596. {
  597. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo;
  598. psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending;
  599. }
  600. if (psKick->h3DSyncInfo != IMG_NULL)
  601. {
  602. psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo;
  603. psSyncInfo->psSyncData->ui32WriteOpsComplete = psSyncInfo->psSyncData->ui32WriteOpsPending;
  604. }
  605. #endif
  606. return eError;
  607. }
  608. #endif
  609. #endif