1 /**********************************************************************
3 * Copyright(c) 2008 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 ******************************************************************************/
27 #include <linux/errno.h>
34 #include "pvr_debug.h"
35 #include "pvr_bridge.h"
36 #include "sgx_bridge.h"
39 #include "pvr_bridge_km.h"
40 #include "sgx_bridge_km.h"
41 #include "bridged_pvr_bridge.h"
42 #include "bridged_sgx_bridge.h"
44 #include "pvr_pdump.h"
45 #include "pvr_events.h"
46 #include "pvr_trace_cmd.h"
48 int SGXGetClientInfoBW(u32 ui32BridgeID,
49 struct PVRSRV_BRIDGE_IN_GETCLIENTINFO *psGetClientInfoIN,
50 struct PVRSRV_BRIDGE_OUT_GETCLIENTINFO *psGetClientInfoOUT,
51 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
55 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETCLIENTINFO);
57 psGetClientInfoOUT->eError =
58 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
59 psGetClientInfoIN->hDevCookie,
60 PVRSRV_HANDLE_TYPE_DEV_NODE);
61 if (psGetClientInfoOUT->eError != PVRSRV_OK)
64 psGetClientInfoOUT->eError =
65 SGXGetClientInfoKM(hDevCookieInt, &psGetClientInfoOUT->sClientInfo);
69 int SGXReleaseClientInfoBW(u32 ui32BridgeID,
70 struct PVRSRV_BRIDGE_IN_RELEASECLIENTINFO *psReleaseClientInfoIN,
71 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
72 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
74 struct PVRSRV_SGXDEV_INFO *psDevInfo;
77 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
78 PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO);
81 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
82 psReleaseClientInfoIN->hDevCookie,
83 PVRSRV_HANDLE_TYPE_DEV_NODE);
84 if (psRetOUT->eError != PVRSRV_OK)
88 (struct PVRSRV_SGXDEV_INFO *)((struct PVRSRV_DEVICE_NODE *)
89 hDevCookieInt)->pvDevice;
91 PVR_ASSERT(psDevInfo->ui32ClientRefCount > 0);
93 psDevInfo->ui32ClientRefCount--;
95 psRetOUT->eError = PVRSRV_OK;
100 int SGXGetInternalDevInfoBW(u32 ui32BridgeID,
101 struct PVRSRV_BRIDGE_IN_GETINTERNALDEVINFO *psSGXGetInternalDevInfoIN,
102 struct PVRSRV_BRIDGE_OUT_GETINTERNALDEVINFO *psSGXGetInternalDevInfoOUT,
103 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
107 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
108 PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO);
110 psSGXGetInternalDevInfoOUT->eError =
111 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
112 psSGXGetInternalDevInfoIN->hDevCookie,
113 PVRSRV_HANDLE_TYPE_DEV_NODE);
114 if (psSGXGetInternalDevInfoOUT->eError != PVRSRV_OK)
117 psSGXGetInternalDevInfoOUT->eError =
118 SGXGetInternalDevInfoKM(hDevCookieInt,
119 &psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo);
121 psSGXGetInternalDevInfoOUT->eError =
122 PVRSRVAllocHandle(psPerProc->psHandleBase,
123 &psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.
124 hHostCtlKernelMemInfoHandle,
125 psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.
126 hHostCtlKernelMemInfoHandle,
127 PVRSRV_HANDLE_TYPE_MEM_INFO,
128 PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
133 int SGXDoKickBW(u32 ui32BridgeID,
134 struct PVRSRV_BRIDGE_IN_DOKICK *psDoKickIN,
135 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
137 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
142 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DOKICK);
144 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
146 psDoKickIN->hDevCookie,
147 PVRSRV_HANDLE_TYPE_DEV_NODE);
149 if (psRetOUT->eError != PVRSRV_OK)
152 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
153 &psDoKickIN->sCCBKick.hCCBKernelMemInfo,
154 psDoKickIN->sCCBKick.hCCBKernelMemInfo,
155 PVRSRV_HANDLE_TYPE_MEM_INFO);
157 if (psRetOUT->eError != PVRSRV_OK)
160 if (psDoKickIN->sCCBKick.hTA3DSyncInfo != NULL) {
162 PVRSRVLookupHandle(psPerProc->psHandleBase,
163 &psDoKickIN->sCCBKick.hTA3DSyncInfo,
164 psDoKickIN->sCCBKick.hTA3DSyncInfo,
165 PVRSRV_HANDLE_TYPE_SYNC_INFO);
167 if (psRetOUT->eError != PVRSRV_OK)
171 if (psDoKickIN->sCCBKick.hTASyncInfo != NULL) {
173 PVRSRVLookupHandle(psPerProc->psHandleBase,
174 &psDoKickIN->sCCBKick.hTASyncInfo,
175 psDoKickIN->sCCBKick.hTASyncInfo,
176 PVRSRV_HANDLE_TYPE_SYNC_INFO);
178 if (psRetOUT->eError != PVRSRV_OK)
182 if (psDoKickIN->sCCBKick.h3DSyncInfo != NULL) {
184 PVRSRVLookupHandle(psPerProc->psHandleBase,
185 &psDoKickIN->sCCBKick.h3DSyncInfo,
186 psDoKickIN->sCCBKick.h3DSyncInfo,
187 PVRSRV_HANDLE_TYPE_SYNC_INFO);
189 if (psRetOUT->eError != PVRSRV_OK)
193 if (psDoKickIN->sCCBKick.ui32NumSrcSyncs > SGX_MAX_SRC_SYNCS) {
194 psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
197 for (i = 0; i < psDoKickIN->sCCBKick.ui32NumSrcSyncs; i++) {
199 PVRSRVLookupHandle(psPerProc->psHandleBase,
200 &psDoKickIN->sCCBKick.
201 ahSrcKernelSyncInfo[i],
202 psDoKickIN->sCCBKick.
203 ahSrcKernelSyncInfo[i],
204 PVRSRV_HANDLE_TYPE_SYNC_INFO);
206 if (psRetOUT->eError != PVRSRV_OK)
210 if (psDoKickIN->sCCBKick.ui32NumTAStatusVals > SGX_MAX_TA_STATUS_VALS) {
211 psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
214 for (i = 0; i < psDoKickIN->sCCBKick.ui32NumTAStatusVals; i++) {
216 PVRSRVLookupHandle(psPerProc->psHandleBase,
217 &psDoKickIN->sCCBKick.ahTAStatusSyncInfo[i],
218 psDoKickIN->sCCBKick.ahTAStatusSyncInfo[i],
219 PVRSRV_HANDLE_TYPE_SYNC_INFO);
220 if (psRetOUT->eError != PVRSRV_OK)
224 if (psDoKickIN->sCCBKick.ui32Num3DStatusVals > SGX_MAX_3D_STATUS_VALS) {
225 psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
228 for (i = 0; i < psDoKickIN->sCCBKick.ui32Num3DStatusVals; i++) {
230 PVRSRVLookupHandle(psPerProc->psHandleBase,
231 &psDoKickIN->sCCBKick.ah3DStatusSyncInfo[i],
232 psDoKickIN->sCCBKick.ah3DStatusSyncInfo[i],
233 PVRSRV_HANDLE_TYPE_SYNC_INFO);
235 if (psRetOUT->eError != PVRSRV_OK)
239 if (psDoKickIN->sCCBKick.ui32NumDstSyncObjects > 0) {
240 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
241 &psDoKickIN->sCCBKick.
242 hKernelHWSyncListMemInfo,
243 psDoKickIN->sCCBKick.
244 hKernelHWSyncListMemInfo,
245 PVRSRV_HANDLE_TYPE_MEM_INFO);
247 if (psRetOUT->eError != PVRSRV_OK)
250 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
251 &psDoKickIN->sCCBKick.sDstSyncHandle,
252 psDoKickIN->sCCBKick.sDstSyncHandle,
253 PVRSRV_HANDLE_TYPE_SYNC_INFO);
255 if (psRetOUT->eError != PVRSRV_OK)
259 psRetOUT->eError = SGXDoKickKM(hDevCookieInt, &psDoKickIN->sCCBKick,
265 int SGXScheduleProcessQueuesBW(u32 ui32BridgeID,
266 struct PVRSRV_BRIDGE_IN_SGX_SCHEDULE_PROCESS_QUEUES *psScheduleProcQIN,
267 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
268 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
272 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
273 PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES);
276 PVRSRVLookupHandle(psPerProc->psHandleBase,
278 psScheduleProcQIN->hDevCookie,
279 PVRSRV_HANDLE_TYPE_DEV_NODE);
281 if (psRetOUT->eError != PVRSRV_OK)
284 psRetOUT->eError = SGXScheduleProcessQueuesKM(hDevCookieInt);
289 int SGXSubmitTransferBW(u32 ui32BridgeID,
290 struct PVRSRV_BRIDGE_IN_SUBMITTRANSFER *psSubmitTransferIN,
291 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
292 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
295 struct PVRSRV_TRANSFER_SGX_KICK *psKick;
298 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
299 PVRSRV_BRIDGE_SGX_SUBMITTRANSFER);
300 PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
302 psKick = &psSubmitTransferIN->sKick;
304 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
306 psSubmitTransferIN->hDevCookie,
307 PVRSRV_HANDLE_TYPE_DEV_NODE);
308 if (psRetOUT->eError != PVRSRV_OK)
311 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
312 &psKick->hCCBMemInfo,
314 PVRSRV_HANDLE_TYPE_MEM_INFO);
315 if (psRetOUT->eError != PVRSRV_OK)
318 if (psKick->hTASyncInfo != NULL) {
319 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
320 &psKick->hTASyncInfo,
322 PVRSRV_HANDLE_TYPE_SYNC_INFO);
323 if (psRetOUT->eError != PVRSRV_OK)
327 if (psKick->h3DSyncInfo != NULL) {
328 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
329 &psKick->h3DSyncInfo,
331 PVRSRV_HANDLE_TYPE_SYNC_INFO);
332 if (psRetOUT->eError != PVRSRV_OK)
336 if (psKick->ui32NumSrcSync > SGX_MAX_TRANSFER_SYNC_OPS) {
337 psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
340 for (i = 0; i < psKick->ui32NumSrcSync; i++) {
341 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
342 &psKick->ahSrcSyncInfo[i],
343 psKick->ahSrcSyncInfo[i],
344 PVRSRV_HANDLE_TYPE_SYNC_INFO);
345 if (psRetOUT->eError != PVRSRV_OK)
349 if (psKick->ui32NumDstSync > SGX_MAX_TRANSFER_SYNC_OPS) {
350 psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
353 for (i = 0; i < psKick->ui32NumDstSync; i++) {
354 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
355 &psKick->ahDstSyncInfo[i],
356 psKick->ahDstSyncInfo[i],
357 PVRSRV_HANDLE_TYPE_SYNC_INFO);
358 if (psRetOUT->eError != PVRSRV_OK)
362 psRetOUT->eError = SGXSubmitTransferKM(hDevCookieInt, psKick,
368 int SGXGetMiscInfoBW(u32 ui32BridgeID,
369 struct PVRSRV_BRIDGE_IN_SGXGETMISCINFO *psSGXGetMiscInfoIN,
370 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
371 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
374 struct PVRSRV_SGXDEV_INFO *psDevInfo;
375 struct SGX_MISC_INFO sMiscInfo;
376 struct PVRSRV_DEVICE_NODE *psDeviceNode;
378 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETMISCINFO);
380 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
382 psSGXGetMiscInfoIN->hDevCookie,
383 PVRSRV_HANDLE_TYPE_DEV_NODE);
385 if (psRetOUT->eError != PVRSRV_OK)
388 psDeviceNode = hDevCookieInt;
389 PVR_ASSERT(psDeviceNode != NULL);
390 if (psDeviceNode == NULL)
393 psDevInfo = psDeviceNode->pvDevice;
395 psRetOUT->eError = CopyFromUserWrapper(psPerProc, ui32BridgeID,
397 psSGXGetMiscInfoIN->psMiscInfo,
398 sizeof(struct SGX_MISC_INFO));
399 if (psRetOUT->eError != PVRSRV_OK)
402 if (sMiscInfo.eRequest == SGX_MISC_INFO_REQUEST_HWPERF_RETRIEVE_CB) {
404 void *hAllocatedHandle;
405 void __user *psTmpUserData;
409 (u32) (sMiscInfo.uData.sRetrieveCB.ui32ArraySize *
410 sizeof(struct PVRSRV_SGX_HWPERF_CBDATA));
412 ASSIGN_AND_EXIT_ON_ERROR(psRetOUT->eError,
413 OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
418 psTmpUserData = (void __force __user *)
419 sMiscInfo.uData.sRetrieveCB.psHWPerfData;
420 sMiscInfo.uData.sRetrieveCB.psHWPerfData = pAllocated;
422 psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo,
423 &sMiscInfo, psDeviceNode);
424 if (psRetOUT->eError != PVRSRV_OK) {
425 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
426 allocatedSize, pAllocated, hAllocatedHandle);
430 psRetOUT->eError = CopyToUserWrapper(psPerProc,
431 ui32BridgeID, psTmpUserData,
432 sMiscInfo.uData.sRetrieveCB.psHWPerfData,
435 sMiscInfo.uData.sRetrieveCB.psHWPerfData =
436 (void __force *)psTmpUserData;
438 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
439 allocatedSize, pAllocated, hAllocatedHandle);
441 if (psRetOUT->eError != PVRSRV_OK)
444 psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo,
445 &sMiscInfo, psDeviceNode);
447 if (psRetOUT->eError != PVRSRV_OK)
451 psRetOUT->eError = CopyToUserWrapper(psPerProc,
453 psSGXGetMiscInfoIN->psMiscInfo,
455 sizeof(struct SGX_MISC_INFO));
456 if (psRetOUT->eError != PVRSRV_OK)
461 int SGXReadDiffCountersBW(u32 ui32BridgeID,
462 struct PVRSRV_BRIDGE_IN_SGX_READ_DIFF_COUNTERS *psSGXReadDiffCountersIN,
463 struct PVRSRV_BRIDGE_OUT_SGX_READ_DIFF_COUNTERS
464 *psSGXReadDiffCountersOUT,
465 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
469 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
470 PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS);
472 psSGXReadDiffCountersOUT->eError =
473 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
474 psSGXReadDiffCountersIN->hDevCookie,
475 PVRSRV_HANDLE_TYPE_DEV_NODE);
477 if (psSGXReadDiffCountersOUT->eError != PVRSRV_OK)
480 psSGXReadDiffCountersOUT->eError = SGXReadDiffCountersKM(
482 psSGXReadDiffCountersIN->ui32Reg,
483 &psSGXReadDiffCountersOUT->ui32Old,
484 psSGXReadDiffCountersIN->bNew,
485 psSGXReadDiffCountersIN->ui32New,
486 psSGXReadDiffCountersIN->ui32NewReset,
487 psSGXReadDiffCountersIN->ui32CountersReg,
488 &psSGXReadDiffCountersOUT->ui32Time,
489 &psSGXReadDiffCountersOUT->bActive,
490 &psSGXReadDiffCountersOUT->sDiffs);
495 int SGXReadHWPerfCBBW(u32 ui32BridgeID,
496 struct PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_CB *psSGXReadHWPerfCBIN,
497 struct PVRSRV_BRIDGE_OUT_SGX_READ_HWPERF_CB *psSGXReadHWPerfCBOUT,
498 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
501 struct PVRSRV_SGX_HWPERF_CB_ENTRY *psAllocated;
502 void *hAllocatedHandle;
503 u32 ui32AllocatedSize;
505 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
506 PVRSRV_BRIDGE_SGX_READ_HWPERF_CB);
508 psSGXReadHWPerfCBOUT->eError =
509 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
510 psSGXReadHWPerfCBIN->hDevCookie,
511 PVRSRV_HANDLE_TYPE_DEV_NODE);
513 if (psSGXReadHWPerfCBOUT->eError != PVRSRV_OK)
516 ui32AllocatedSize = psSGXReadHWPerfCBIN->ui32ArraySize *
517 sizeof(psSGXReadHWPerfCBIN->psHWPerfCBData[0]);
518 ASSIGN_AND_EXIT_ON_ERROR(psSGXReadHWPerfCBOUT->eError,
519 OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
521 (void **)&psAllocated,
524 psSGXReadHWPerfCBOUT->eError = SGXReadHWPerfCBKM(hDevCookieInt,
525 psSGXReadHWPerfCBIN->ui32ArraySize,
527 &psSGXReadHWPerfCBOUT->ui32DataCount,
528 &psSGXReadHWPerfCBOUT->ui32ClockSpeed,
529 &psSGXReadHWPerfCBOUT->ui32HostTimeStamp);
530 if (psSGXReadHWPerfCBOUT->eError == PVRSRV_OK)
531 psSGXReadHWPerfCBOUT->eError = CopyToUserWrapper(
532 psPerProc, ui32BridgeID,
533 psSGXReadHWPerfCBIN->psHWPerfCBData,
534 psAllocated, ui32AllocatedSize);
536 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
537 ui32AllocatedSize, psAllocated, hAllocatedHandle);
542 int SGXDevInitPart2BW(u32 ui32BridgeID,
543 struct PVRSRV_BRIDGE_IN_SGXDEVINITPART2 *psSGXDevInitPart2IN,
544 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
545 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
548 enum PVRSRV_ERROR eError;
549 IMG_BOOL bDissociateFailed = IMG_FALSE;
550 IMG_BOOL bLookupFailed = IMG_FALSE;
551 IMG_BOOL bReleaseFailed = IMG_FALSE;
555 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DEVINITPART2);
557 if (!psPerProc->bInitProcess) {
558 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
562 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
564 psSGXDevInitPart2IN->hDevCookie,
565 PVRSRV_HANDLE_TYPE_DEV_NODE);
566 if (psRetOUT->eError != PVRSRV_OK)
569 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
570 psSGXDevInitPart2IN->sInitInfo.
572 PVRSRV_HANDLE_TYPE_MEM_INFO);
573 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
575 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
576 psSGXDevInitPart2IN->sInitInfo.
577 hKernelCCBCtlMemInfo,
578 PVRSRV_HANDLE_TYPE_MEM_INFO);
579 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
581 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
582 psSGXDevInitPart2IN->sInitInfo.
583 hKernelCCBEventKickerMemInfo,
584 PVRSRV_HANDLE_TYPE_MEM_INFO);
585 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
587 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
588 psSGXDevInitPart2IN->sInitInfo.
589 hKernelSGXHostCtlMemInfo,
590 PVRSRV_HANDLE_TYPE_MEM_INFO);
591 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
593 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
594 psSGXDevInitPart2IN->sInitInfo.
595 hKernelSGXTA3DCtlMemInfo,
596 PVRSRV_HANDLE_TYPE_MEM_INFO);
597 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
599 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
600 psSGXDevInitPart2IN->sInitInfo.
601 hKernelSGXMiscMemInfo,
602 PVRSRV_HANDLE_TYPE_MEM_INFO);
603 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
605 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
606 psSGXDevInitPart2IN->sInitInfo.
607 hKernelHWPerfCBMemInfo,
608 PVRSRV_HANDLE_TYPE_MEM_INFO);
609 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
611 #if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
612 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
613 psSGXDevInitPart2IN->sInitInfo.
614 hKernelEDMStatusBufferMemInfo,
615 PVRSRV_HANDLE_TYPE_MEM_INFO);
616 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
619 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
621 psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
626 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
628 PVRSRV_HANDLE_TYPE_MEM_INFO);
629 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
633 PVR_DPF(PVR_DBG_ERROR,
634 "DevInitSGXPart2BW: A handle lookup failed");
635 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
639 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
640 &psSGXDevInitPart2IN->sInitInfo.
642 psSGXDevInitPart2IN->sInitInfo.
644 PVRSRV_HANDLE_TYPE_MEM_INFO);
645 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
647 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
648 &psSGXDevInitPart2IN->sInitInfo.
649 hKernelCCBCtlMemInfo,
650 psSGXDevInitPart2IN->sInitInfo.
651 hKernelCCBCtlMemInfo,
652 PVRSRV_HANDLE_TYPE_MEM_INFO);
653 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
655 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
656 &psSGXDevInitPart2IN->sInitInfo.
657 hKernelCCBEventKickerMemInfo,
658 psSGXDevInitPart2IN->sInitInfo.
659 hKernelCCBEventKickerMemInfo,
660 PVRSRV_HANDLE_TYPE_MEM_INFO);
661 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
663 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
664 &psSGXDevInitPart2IN->sInitInfo.
665 hKernelSGXHostCtlMemInfo,
666 psSGXDevInitPart2IN->sInitInfo.
667 hKernelSGXHostCtlMemInfo,
668 PVRSRV_HANDLE_TYPE_MEM_INFO);
669 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
671 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
672 &psSGXDevInitPart2IN->sInitInfo.
673 hKernelSGXTA3DCtlMemInfo,
674 psSGXDevInitPart2IN->sInitInfo.
675 hKernelSGXTA3DCtlMemInfo,
676 PVRSRV_HANDLE_TYPE_MEM_INFO);
677 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
679 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
680 &psSGXDevInitPart2IN->sInitInfo.
681 hKernelSGXMiscMemInfo,
682 psSGXDevInitPart2IN->sInitInfo.
683 hKernelSGXMiscMemInfo,
684 PVRSRV_HANDLE_TYPE_MEM_INFO);
685 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
687 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
688 &psSGXDevInitPart2IN->sInitInfo.
689 hKernelHWPerfCBMemInfo,
690 psSGXDevInitPart2IN->sInitInfo.
691 hKernelHWPerfCBMemInfo,
692 PVRSRV_HANDLE_TYPE_MEM_INFO);
693 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
695 #if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
696 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
697 &psSGXDevInitPart2IN->sInitInfo.
698 hKernelEDMStatusBufferMemInfo,
699 psSGXDevInitPart2IN->sInitInfo.
700 hKernelEDMStatusBufferMemInfo,
701 PVRSRV_HANDLE_TYPE_MEM_INFO);
702 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
705 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
707 &psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
709 if (*phHandle == NULL)
712 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
714 PVRSRV_HANDLE_TYPE_MEM_INFO);
715 bReleaseFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
718 if (bReleaseFailed) {
719 PVR_DPF(PVR_DBG_ERROR,
720 "DevInitSGXPart2BW: A handle release failed");
721 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
727 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
728 psSGXDevInitPart2IN->sInitInfo.
730 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
732 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
733 psSGXDevInitPart2IN->sInitInfo.
734 hKernelCCBCtlMemInfo);
735 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
737 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
738 psSGXDevInitPart2IN->sInitInfo.
739 hKernelCCBEventKickerMemInfo);
740 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
742 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
743 psSGXDevInitPart2IN->sInitInfo.
744 hKernelSGXHostCtlMemInfo);
745 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
747 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
748 psSGXDevInitPart2IN->sInitInfo.
749 hKernelSGXTA3DCtlMemInfo);
750 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
752 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
753 psSGXDevInitPart2IN->sInitInfo.
754 hKernelSGXMiscMemInfo);
755 bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
757 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
758 psSGXDevInitPart2IN->sInitInfo.
759 hKernelHWPerfCBMemInfo);
760 bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
762 #if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
763 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
764 psSGXDevInitPart2IN->sInitInfo.
765 hKernelEDMStatusBufferMemInfo);
766 bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
769 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
771 psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
776 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, hHandle);
777 bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
780 if (bDissociateFailed) {
781 PVRSRVFreeDeviceMemKM(hDevCookieInt,
782 psSGXDevInitPart2IN->sInitInfo.
784 PVRSRVFreeDeviceMemKM(hDevCookieInt,
785 psSGXDevInitPart2IN->sInitInfo.
786 hKernelCCBCtlMemInfo);
787 PVRSRVFreeDeviceMemKM(hDevCookieInt,
788 psSGXDevInitPart2IN->sInitInfo.
789 hKernelSGXHostCtlMemInfo);
790 PVRSRVFreeDeviceMemKM(hDevCookieInt,
791 psSGXDevInitPart2IN->sInitInfo.
792 hKernelSGXTA3DCtlMemInfo);
793 PVRSRVFreeDeviceMemKM(hDevCookieInt,
794 psSGXDevInitPart2IN->sInitInfo.
795 hKernelSGXMiscMemInfo);
797 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
799 psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
804 PVRSRVFreeDeviceMemKM(hDevCookieInt,
805 (struct PVRSRV_KERNEL_MEM_INFO *)
810 PVR_DPF(PVR_DBG_ERROR,
811 "DevInitSGXPart2BW: A dissociate failed");
813 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
819 psRetOUT->eError = DevInitSGXPart2KM(psPerProc, hDevCookieInt,
820 &psSGXDevInitPart2IN->sInitInfo);
825 int SGXRegisterHWRenderContextBW(u32 ui32BridgeID,
826 struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT
827 *psSGXRegHWRenderContextIN,
828 struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT
829 *psSGXRegHWRenderContextOUT,
830 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
833 void *hHWRenderContextInt;
835 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
836 PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT);
838 NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError, psPerProc,
841 psSGXRegHWRenderContextOUT->eError =
842 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
843 psSGXRegHWRenderContextIN->hDevCookie,
844 PVRSRV_HANDLE_TYPE_DEV_NODE);
845 if (psSGXRegHWRenderContextOUT->eError != PVRSRV_OK)
848 hHWRenderContextInt =
849 SGXRegisterHWRenderContextKM(hDevCookieInt,
850 &psSGXRegHWRenderContextIN->sHWRenderContextDevVAddr,
853 if (hHWRenderContextInt == NULL) {
854 psSGXRegHWRenderContextOUT->eError = PVRSRV_ERROR_GENERIC;
858 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
859 &psSGXRegHWRenderContextOUT->hHWRenderContext,
861 PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT,
862 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
864 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError,
870 int SGXUnregisterHWRenderContextBW(u32 ui32BridgeID,
871 struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT
872 *psSGXUnregHWRenderContextIN,
873 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
874 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
876 void *hHWRenderContextInt;
878 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
879 PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT);
882 PVRSRVLookupHandle(psPerProc->psHandleBase,
883 &hHWRenderContextInt,
884 psSGXUnregHWRenderContextIN->hHWRenderContext,
885 PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
886 if (psRetOUT->eError != PVRSRV_OK)
889 psRetOUT->eError = SGXUnregisterHWRenderContextKM(hHWRenderContextInt);
890 if (psRetOUT->eError != PVRSRV_OK)
894 PVRSRVReleaseHandle(psPerProc->psHandleBase,
895 psSGXUnregHWRenderContextIN->hHWRenderContext,
896 PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
901 int SGXRegisterHWTransferContextBW(u32 ui32BridgeID,
902 struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT
903 *psSGXRegHWTransferContextIN,
904 struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT
905 *psSGXRegHWTransferContextOUT,
906 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
909 void *hHWTransferContextInt;
911 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
912 PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT);
914 NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError,
917 psSGXRegHWTransferContextOUT->eError =
918 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
919 psSGXRegHWTransferContextIN->hDevCookie,
920 PVRSRV_HANDLE_TYPE_DEV_NODE);
921 if (psSGXRegHWTransferContextOUT->eError != PVRSRV_OK)
924 hHWTransferContextInt =
925 SGXRegisterHWTransferContextKM(hDevCookieInt,
926 &psSGXRegHWTransferContextIN->
927 sHWTransferContextDevVAddr,
930 if (hHWTransferContextInt == NULL) {
931 psSGXRegHWTransferContextOUT->eError = PVRSRV_ERROR_GENERIC;
935 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
936 &psSGXRegHWTransferContextOUT->hHWTransferContext,
937 hHWTransferContextInt,
938 PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT,
939 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
941 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError,
947 int SGXUnregisterHWTransferContextBW(u32 ui32BridgeID,
948 struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT
949 *psSGXUnregHWTransferContextIN,
950 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
951 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
953 void *hHWTransferContextInt;
955 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
956 PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT);
958 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
959 &hHWTransferContextInt,
960 psSGXUnregHWTransferContextIN->
962 PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
963 if (psRetOUT->eError != PVRSRV_OK)
967 SGXUnregisterHWTransferContextKM(hHWTransferContextInt);
968 if (psRetOUT->eError != PVRSRV_OK)
972 PVRSRVReleaseHandle(psPerProc->psHandleBase,
973 psSGXUnregHWTransferContextIN->
975 PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
980 int SGXFlushHWRenderTargetBW(u32 ui32BridgeID,
981 struct PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET
982 *psSGXFlushHWRenderTargetIN,
983 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
984 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
987 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
988 PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET);
991 PVRSRVLookupHandle(psPerProc->psHandleBase,
993 psSGXFlushHWRenderTargetIN->hDevCookie,
994 PVRSRV_HANDLE_TYPE_DEV_NODE);
995 if (psRetOUT->eError != PVRSRV_OK)
998 SGXFlushHWRenderTargetKM(hDevCookieInt,
999 psSGXFlushHWRenderTargetIN->sHWRTDataSetDevVAddr);
1004 static void trace_query_cmd(struct PVRSRV_PER_PROCESS_DATA *proc, int type,
1005 struct PVRSRV_KERNEL_SYNC_INFO *si)
1007 struct pvr_trcmd_syn *ts;
1010 size = si ? sizeof(*ts) : 0;
1013 ts = pvr_trcmd_alloc(type, proc->ui32PID, proc->name, size);
1015 pvr_trcmd_set_syn(ts, si);
1020 int SGX2DQueryBlitsCompleteBW(struct file *filp, u32 ui32BridgeID,
1021 struct PVRSRV_BRIDGE_IN_2DQUERYBLTSCOMPLETE *ps2DQueryBltsCompleteIN,
1022 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1023 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1025 void *hDevCookieInt;
1027 struct PVRSRV_SGXDEV_INFO *psDevInfo;
1028 struct PVRSRV_FILE_PRIVATE_DATA *priv = filp->private_data;
1030 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1031 PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE);
1034 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
1035 ps2DQueryBltsCompleteIN->hDevCookie,
1036 PVRSRV_HANDLE_TYPE_DEV_NODE);
1037 if (psRetOUT->eError != PVRSRV_OK)
1040 if (ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_FLIP ||
1041 ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_UPDATE) {
1044 if (ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_FLIP)
1045 cmd_type = PVR_TRCMD_SGX_QBLT_FLPREQ;
1047 cmd_type = PVR_TRCMD_SGX_QBLT_UPDREQ;
1049 trace_query_cmd(psPerProc, cmd_type, NULL);
1051 if (pvr_flip_event_req(priv,
1052 (long)ps2DQueryBltsCompleteIN->
1054 ps2DQueryBltsCompleteIN->type,
1055 ps2DQueryBltsCompleteIN->user_data))
1056 psRetOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY;
1062 PVRSRVLookupHandle(psPerProc->psHandleBase, &pvSyncInfo,
1063 ps2DQueryBltsCompleteIN->hKernSyncInfo,
1064 PVRSRV_HANDLE_TYPE_SYNC_INFO);
1065 if (psRetOUT->eError != PVRSRV_OK)
1069 (struct PVRSRV_SGXDEV_INFO *)((struct PVRSRV_DEVICE_NODE *)
1070 hDevCookieInt)->pvDevice;
1072 if (ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_EVENT) {
1073 if (pvr_sync_event_req(priv,
1074 (struct PVRSRV_KERNEL_SYNC_INFO *)pvSyncInfo,
1075 ps2DQueryBltsCompleteIN->user_data))
1076 psRetOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY;
1078 trace_query_cmd(psPerProc,
1079 PVR_TRCMD_SGX_QBLT_SYNREQ,
1086 SGX2DQueryBlitsCompleteKM(psDevInfo,
1087 (struct PVRSRV_KERNEL_SYNC_INFO *)
1089 ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_BLOCK);
1091 trace_query_cmd(psPerProc, PVR_TRCMD_SGX_QBLT_SYNCHK, pvSyncInfo);
1096 int SGXFindSharedPBDescBW(u32 ui32BridgeID,
1097 struct PVRSRV_BRIDGE_IN_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescIN,
1098 struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescOUT,
1099 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1101 void *hDevCookieInt;
1102 struct PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
1103 struct PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
1104 struct PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
1105 struct PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescSubKernelMemInfos = NULL;
1106 u32 ui32SharedPBDescSubKernelMemInfosCount = 0;
1108 void *hSharedPBDesc = NULL;
1110 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1111 PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC);
1113 NEW_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError, psPerProc,
1114 PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS
1117 psSGXFindSharedPBDescOUT->hSharedPBDesc = NULL;
1119 psSGXFindSharedPBDescOUT->eError =
1120 PVRSRVLookupHandle(psPerProc->psHandleBase,
1122 psSGXFindSharedPBDescIN->hDevCookie,
1123 PVRSRV_HANDLE_TYPE_DEV_NODE);
1124 if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
1125 goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
1127 psSGXFindSharedPBDescOUT->eError =
1128 SGXFindSharedPBDescKM(psPerProc, hDevCookieInt,
1129 psSGXFindSharedPBDescIN->bLockOnFailure,
1130 psSGXFindSharedPBDescIN->ui32TotalPBSize,
1132 &psSharedPBDescKernelMemInfo,
1133 &psHWPBDescKernelMemInfo,
1134 &psBlockKernelMemInfo,
1135 &ppsSharedPBDescSubKernelMemInfos,
1136 &ui32SharedPBDescSubKernelMemInfosCount);
1137 if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
1138 goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
1140 PVR_ASSERT(ui32SharedPBDescSubKernelMemInfosCount <=
1141 PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
1143 psSGXFindSharedPBDescOUT->ui32SharedPBDescSubKernelMemInfoHandlesCount =
1144 ui32SharedPBDescSubKernelMemInfosCount;
1146 if (hSharedPBDesc == NULL) {
1147 psSGXFindSharedPBDescOUT->hSharedPBDescKernelMemInfoHandle =
1150 goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
1153 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1154 &psSGXFindSharedPBDescOUT->hSharedPBDesc,
1156 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
1157 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
1159 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1160 &psSGXFindSharedPBDescOUT->
1161 hSharedPBDescKernelMemInfoHandle,
1162 psSharedPBDescKernelMemInfo,
1163 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1164 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1165 psSGXFindSharedPBDescOUT->hSharedPBDesc);
1167 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1168 &psSGXFindSharedPBDescOUT->
1169 hHWPBDescKernelMemInfoHandle,
1170 psHWPBDescKernelMemInfo,
1171 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1172 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1173 psSGXFindSharedPBDescOUT->hSharedPBDesc);
1175 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1176 &psSGXFindSharedPBDescOUT->
1177 hBlockKernelMemInfoHandle,
1178 psBlockKernelMemInfo,
1179 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1180 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1181 psSGXFindSharedPBDescOUT->hSharedPBDesc);
1183 for (i = 0; i < ui32SharedPBDescSubKernelMemInfosCount; i++) {
1184 struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC
1185 *psSGXFindSharedPBDescOut = psSGXFindSharedPBDescOUT;
1187 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1188 &psSGXFindSharedPBDescOut->
1189 ahSharedPBDescSubKernelMemInfoHandles[i],
1190 ppsSharedPBDescSubKernelMemInfos[i],
1191 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1192 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1193 psSGXFindSharedPBDescOUT->
1194 hSharedPBDescKernelMemInfoHandle);
1197 PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT:
1198 if (ppsSharedPBDescSubKernelMemInfos != NULL)
1199 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
1200 sizeof(struct PVRSRV_KERNEL_MEM_INFO *) *
1201 ui32SharedPBDescSubKernelMemInfosCount,
1202 ppsSharedPBDescSubKernelMemInfos, NULL);
1204 if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK) {
1205 if (hSharedPBDesc != NULL)
1206 SGXUnrefSharedPBDescKM(hSharedPBDesc);
1208 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError,
1214 int SGXUnrefSharedPBDescBW(u32 ui32BridgeID,
1215 struct PVRSRV_BRIDGE_IN_SGXUNREFSHAREDPBDESC *psSGXUnrefSharedPBDescIN,
1216 struct PVRSRV_BRIDGE_OUT_SGXUNREFSHAREDPBDESC
1217 *psSGXUnrefSharedPBDescOUT,
1218 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1220 void *hSharedPBDesc;
1222 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1223 PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC);
1225 psSGXUnrefSharedPBDescOUT->eError =
1226 PVRSRVLookupHandle(psPerProc->psHandleBase,
1228 psSGXUnrefSharedPBDescIN->hSharedPBDesc,
1229 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
1230 if (psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
1233 psSGXUnrefSharedPBDescOUT->eError =
1234 SGXUnrefSharedPBDescKM(hSharedPBDesc);
1236 if (psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
1239 psSGXUnrefSharedPBDescOUT->eError =
1240 PVRSRVReleaseHandle(psPerProc->psHandleBase,
1241 psSGXUnrefSharedPBDescIN->hSharedPBDesc,
1242 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
1247 int SGXAddSharedPBDescBW(u32 ui32BridgeID,
1248 struct PVRSRV_BRIDGE_IN_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescIN,
1249 struct PVRSRV_BRIDGE_OUT_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescOUT,
1250 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1252 void *hDevCookieInt;
1253 struct PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
1254 struct PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
1255 struct PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
1256 u32 ui32KernelMemInfoHandlesCount =
1257 psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount;
1259 void **phKernelMemInfoHandles = NULL;
1260 struct PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfos = NULL;
1262 enum PVRSRV_ERROR eError;
1263 void *hSharedPBDesc = NULL;
1265 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1266 PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC);
1268 NEW_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError, psPerProc,
1271 psSGXAddSharedPBDescOUT->hSharedPBDesc = NULL;
1273 PVR_ASSERT(ui32KernelMemInfoHandlesCount <=
1274 PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
1276 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1278 psSGXAddSharedPBDescIN->hDevCookie,
1279 PVRSRV_HANDLE_TYPE_DEV_NODE);
1280 if (eError != PVRSRV_OK)
1281 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1283 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1284 (void **)&psSharedPBDescKernelMemInfo,
1285 psSGXAddSharedPBDescIN->
1286 hSharedPBDescKernelMemInfo,
1287 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1288 if (eError != PVRSRV_OK)
1289 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1291 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1292 (void **)&psHWPBDescKernelMemInfo,
1293 psSGXAddSharedPBDescIN->
1294 hHWPBDescKernelMemInfo,
1295 PVRSRV_HANDLE_TYPE_MEM_INFO);
1296 if (eError != PVRSRV_OK)
1297 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1299 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1300 (void **)&psBlockKernelMemInfo,
1301 psSGXAddSharedPBDescIN->hBlockKernelMemInfo,
1302 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1303 if (eError != PVRSRV_OK)
1304 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1306 if (!OSAccessOK(PVR_VERIFY_READ,
1307 psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
1308 ui32KernelMemInfoHandlesCount * sizeof(void *))) {
1309 PVR_DPF(PVR_DBG_ERROR, "%s: PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC:"
1310 " Invalid phKernelMemInfos pointer", __func__);
1312 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1315 eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1316 ui32KernelMemInfoHandlesCount * sizeof(void *),
1317 (void **)&phKernelMemInfoHandles, NULL);
1318 if (eError != PVRSRV_OK)
1319 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1321 if (CopyFromUserWrapper(psPerProc,
1323 phKernelMemInfoHandles,
1324 psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
1325 ui32KernelMemInfoHandlesCount * sizeof(void *))
1328 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1331 eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1332 ui32KernelMemInfoHandlesCount *
1333 sizeof(struct PVRSRV_KERNEL_MEM_INFO *),
1334 (void **)&ppsKernelMemInfos, NULL);
1335 if (eError != PVRSRV_OK)
1336 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1338 for (i = 0; i < ui32KernelMemInfoHandlesCount; i++) {
1339 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1340 (void **)&ppsKernelMemInfos[i],
1341 phKernelMemInfoHandles[i],
1342 PVRSRV_HANDLE_TYPE_MEM_INFO);
1343 if (eError != PVRSRV_OK)
1344 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1347 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1348 psSGXAddSharedPBDescIN->
1349 hSharedPBDescKernelMemInfo,
1350 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1351 PVR_ASSERT(eError == PVRSRV_OK);
1353 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1354 psSGXAddSharedPBDescIN->
1355 hHWPBDescKernelMemInfo,
1356 PVRSRV_HANDLE_TYPE_MEM_INFO);
1357 PVR_ASSERT(eError == PVRSRV_OK);
1359 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1360 psSGXAddSharedPBDescIN->
1361 hBlockKernelMemInfo,
1362 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1363 PVR_ASSERT(eError == PVRSRV_OK);
1365 for (i = 0; i < ui32KernelMemInfoHandlesCount; i++) {
1366 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1367 phKernelMemInfoHandles[i],
1368 PVRSRV_HANDLE_TYPE_MEM_INFO);
1369 PVR_ASSERT(eError == PVRSRV_OK);
1372 eError = SGXAddSharedPBDescKM(psPerProc, hDevCookieInt,
1373 psSharedPBDescKernelMemInfo,
1374 psHWPBDescKernelMemInfo,
1375 psBlockKernelMemInfo,
1376 psSGXAddSharedPBDescIN->ui32TotalPBSize,
1379 ui32KernelMemInfoHandlesCount);
1381 if (eError != PVRSRV_OK)
1382 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1384 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1385 &psSGXAddSharedPBDescOUT->hSharedPBDesc,
1387 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
1388 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
1390 PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT:
1392 if (phKernelMemInfoHandles)
1393 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
1394 psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount
1396 (void *)phKernelMemInfoHandles, NULL);
1397 if (ppsKernelMemInfos)
1398 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
1399 psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount
1400 * sizeof(struct PVRSRV_KERNEL_MEM_INFO *),
1401 (void *)ppsKernelMemInfos, NULL);
1403 if (ret == 0 && eError == PVRSRV_OK)
1404 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError,
1407 psSGXAddSharedPBDescOUT->eError = eError;
1412 int SGXGetInfoForSrvinitBW(u32 ui32BridgeID,
1413 struct PVRSRV_BRIDGE_IN_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitIN,
1414 struct PVRSRV_BRIDGE_OUT_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitOUT,
1415 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1417 void *hDevCookieInt;
1419 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1420 PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT);
1422 NEW_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc,
1423 PVRSRV_MAX_CLIENT_HEAPS);
1425 if (!psPerProc->bInitProcess) {
1426 psSGXInfoForSrvinitOUT->eError = PVRSRV_ERROR_GENERIC;
1430 psSGXInfoForSrvinitOUT->eError =
1431 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
1432 psSGXInfoForSrvinitIN->hDevCookie,
1433 PVRSRV_HANDLE_TYPE_DEV_NODE);
1435 if (psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
1438 psSGXInfoForSrvinitOUT->eError =
1439 SGXGetInfoForSrvinitKM(hDevCookieInt,
1440 &psSGXInfoForSrvinitOUT->sInitInfo);
1442 if (psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
1445 for (i = 0; i < PVRSRV_MAX_CLIENT_HEAPS; i++) {
1446 struct PVRSRV_HEAP_INFO *psHeapInfo;
1448 psHeapInfo = &psSGXInfoForSrvinitOUT->sInitInfo.asHeapInfo[i];
1450 if (psHeapInfo->ui32HeapID != (u32)SGX_UNDEFINED_HEAP_ID) {
1451 void *hDevMemHeapExt;
1453 if (psHeapInfo->hDevMemHeap != NULL) {
1455 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1457 psHeapInfo->hDevMemHeap,
1458 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
1459 PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
1460 psHeapInfo->hDevMemHeap = hDevMemHeapExt;
1465 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc);
1471 static void DumpBufferArray(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
1472 struct SGX_KICKTA_DUMP_BUFFER *psBufferArray,
1473 u32 ui32BufferArrayLength, IMG_BOOL bDumpPolls)
1477 for (i = 0; i < ui32BufferArrayLength; i++) {
1478 struct SGX_KICKTA_DUMP_BUFFER *psBuffer;
1479 struct PVRSRV_KERNEL_MEM_INFO *psCtrlMemInfoKM;
1484 psBuffer = &psBufferArray[i];
1485 pszName = psBuffer->pszName;
1487 pszName = "Nameless buffer";
1490 MAKEUNIQUETAG((struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1494 ((struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1495 hKernelMemInfo)->psKernelSyncInfo->psSyncDataMemInfoKM;
1497 offsetof(struct PVRSRV_SYNC_DATA, ui32ReadOpsComplete);
1499 if (psBuffer->ui32Start <= psBuffer->ui32End) {
1501 PDUMPCOMMENTWITHFLAGS(0,
1502 "Wait for %s space\r\n",
1504 PDUMPCBP(psCtrlMemInfoKM, ui32Offset,
1505 psBuffer->ui32Start,
1506 psBuffer->ui32SpaceUsed,
1507 psBuffer->ui32BufferSize,
1508 MAKEUNIQUETAG(psCtrlMemInfoKM));
1511 PDUMPCOMMENTWITHFLAGS(0, "%s\r\n", pszName);
1512 PDUMPMEMUM(NULL, psBuffer->pvLinAddr,
1513 (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1515 psBuffer->ui32Start,
1516 psBuffer->ui32End - psBuffer->ui32Start, 0,
1521 PDUMPCOMMENTWITHFLAGS(0,
1522 "Wait for %s space\r\n",
1524 PDUMPCBP(psCtrlMemInfoKM, ui32Offset,
1525 psBuffer->ui32Start,
1526 psBuffer->ui32BackEndLength,
1527 psBuffer->ui32BufferSize,
1528 MAKEUNIQUETAG(psCtrlMemInfoKM));
1530 PDUMPCOMMENTWITHFLAGS(0, "%s (part 1)\r\n", pszName);
1531 PDUMPMEMUM(NULL, psBuffer->pvLinAddr,
1532 (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1534 psBuffer->ui32Start,
1535 psBuffer->ui32BackEndLength, 0, hUniqueTag);
1538 PDUMPMEMPOL(psCtrlMemInfoKM, ui32Offset,
1540 PDUMP_POLL_OPERATOR_NOTEQUAL,
1541 MAKEUNIQUETAG(psCtrlMemInfoKM));
1543 PDUMPCOMMENTWITHFLAGS(0,
1544 "Wait for %s space\r\n",
1546 PDUMPCBP(psCtrlMemInfoKM, ui32Offset, 0,
1548 psBuffer->ui32BufferSize,
1549 MAKEUNIQUETAG(psCtrlMemInfoKM));
1551 PDUMPCOMMENTWITHFLAGS(0, "%s (part 2)\r\n", pszName);
1552 PDUMPMEMUM(NULL, psBuffer->pvLinAddr,
1553 (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1555 0, psBuffer->ui32End, 0, hUniqueTag);
1560 int SGXPDumpBufferArrayBW(u32 ui32BridgeID,
1561 struct PVRSRV_BRIDGE_IN_PDUMP_BUFFER_ARRAY *psPDumpBufferArrayIN,
1562 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1565 struct SGX_KICKTA_DUMP_BUFFER *psKickTADumpBuffer;
1566 u32 ui32BufferArrayLength = psPDumpBufferArrayIN->ui32BufferArrayLength;
1567 u32 ui32BufferArraySize =
1568 ui32BufferArrayLength * sizeof(struct SGX_KICKTA_DUMP_BUFFER);
1569 enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
1571 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1573 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1574 PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY);
1576 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
1577 (void **)&psKickTADumpBuffer, NULL) != PVRSRV_OK)
1580 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, psKickTADumpBuffer,
1581 psPDumpBufferArrayIN->psBufferArray,
1582 ui32BufferArraySize) != PVRSRV_OK) {
1583 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
1584 psKickTADumpBuffer, NULL);
1588 for (i = 0; i < ui32BufferArrayLength; i++) {
1591 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1593 psKickTADumpBuffer[i].
1595 PVRSRV_HANDLE_TYPE_MEM_INFO);
1597 if (eError != PVRSRV_OK) {
1598 PVR_DPF(PVR_DBG_ERROR,
1599 "PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY: "
1600 "PVRSRVLookupHandle failed (%d)", eError);
1603 psKickTADumpBuffer[i].hKernelMemInfo = pvMemInfo;
1607 if (eError == PVRSRV_OK)
1608 DumpBufferArray(psPerProc, psKickTADumpBuffer,
1609 ui32BufferArrayLength,
1610 psPDumpBufferArrayIN->bDumpPolls);
1612 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
1613 psKickTADumpBuffer, NULL);
1618 int SGXPDump3DSignatureRegistersBW(u32 ui32BridgeID,
1619 struct PVRSRV_BRIDGE_IN_PDUMP_3D_SIGNATURE_REGISTERS
1620 *psPDump3DSignatureRegistersIN,
1621 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1623 u32 ui32RegisterArraySize =
1624 psPDump3DSignatureRegistersIN->ui32NumRegisters * sizeof(u32);
1625 u32 *pui32Registers = NULL;
1628 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1630 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1631 PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS);
1633 if (ui32RegisterArraySize == 0)
1636 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1637 ui32RegisterArraySize,
1638 (void **)&pui32Registers, NULL) != PVRSRV_OK) {
1639 PVR_DPF(PVR_DBG_ERROR,
1640 "PDump3DSignatureRegistersBW: OSAllocMem failed");
1644 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
1645 psPDump3DSignatureRegistersIN->pui32Registers,
1646 ui32RegisterArraySize) != PVRSRV_OK) {
1647 PVR_DPF(PVR_DBG_ERROR, "PDump3DSignatureRegistersBW: "
1648 "CopyFromUserWrapper failed");
1652 PDump3DSignatureRegisters(psPDump3DSignatureRegistersIN->
1655 psPDump3DSignatureRegistersIN->
1661 if (pui32Registers != NULL)
1662 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1663 pui32Registers, NULL);
1668 int SGXPDumpCounterRegistersBW(u32 ui32BridgeID,
1669 struct PVRSRV_BRIDGE_IN_PDUMP_COUNTER_REGISTERS
1670 *psPDumpCounterRegistersIN,
1671 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1673 u32 ui32RegisterArraySize =
1674 psPDumpCounterRegistersIN->ui32NumRegisters * sizeof(u32);
1675 u32 *pui32Registers = NULL;
1678 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1680 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1681 PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS);
1683 if (ui32RegisterArraySize == 0)
1686 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1687 (void **)&pui32Registers, NULL) != PVRSRV_OK) {
1688 PVR_DPF(PVR_DBG_ERROR,
1689 "PDumpCounterRegistersBW: OSAllocMem failed");
1694 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
1695 psPDumpCounterRegistersIN->pui32Registers,
1696 ui32RegisterArraySize) != PVRSRV_OK) {
1697 PVR_DPF(PVR_DBG_ERROR,
1698 "PDumpCounterRegistersBW: CopyFromUserWrapper failed");
1702 PDumpCounterRegisters(psPDumpCounterRegistersIN->ui32DumpFrameNum,
1704 psPDumpCounterRegistersIN->ui32NumRegisters);
1709 if (pui32Registers != NULL)
1710 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1711 pui32Registers, NULL);
1716 int SGXPDumpTASignatureRegistersBW(u32 ui32BridgeID,
1717 struct PVRSRV_BRIDGE_IN_PDUMP_TA_SIGNATURE_REGISTERS
1718 *psPDumpTASignatureRegistersIN,
1719 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1721 u32 ui32RegisterArraySize =
1722 psPDumpTASignatureRegistersIN->ui32NumRegisters * sizeof(u32);
1723 u32 *pui32Registers = NULL;
1726 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1728 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1729 PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS);
1731 if (ui32RegisterArraySize == 0)
1734 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1735 ui32RegisterArraySize,
1736 (void **)&pui32Registers, NULL) != PVRSRV_OK) {
1737 PVR_DPF(PVR_DBG_ERROR,
1738 "PDumpTASignatureRegistersBW: OSAllocMem failed");
1743 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
1744 psPDumpTASignatureRegistersIN->pui32Registers,
1745 ui32RegisterArraySize) != PVRSRV_OK) {
1746 PVR_DPF(PVR_DBG_ERROR, "PDumpTASignatureRegistersBW: "
1747 "CopyFromUserWrapper failed");
1751 PDumpTASignatureRegisters(psPDumpTASignatureRegistersIN->
1753 psPDumpTASignatureRegistersIN->
1756 psPDumpTASignatureRegistersIN->
1762 if (pui32Registers != NULL)
1763 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1764 pui32Registers, NULL);
1769 int SGXPDumpHWPerfCBBW(u32 ui32BridgeID,
1770 struct PVRSRV_BRIDGE_IN_PDUMP_HWPERFCB *psPDumpHWPerfCBIN,
1771 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1772 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1774 struct PVRSRV_SGXDEV_INFO *psDevInfo;
1775 void *hDevCookieInt;
1777 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1778 PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB);
1781 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
1782 psPDumpHWPerfCBIN->hDevCookie,
1783 PVRSRV_HANDLE_TYPE_DEV_NODE);
1784 if (psRetOUT->eError != PVRSRV_OK)
1787 psDevInfo = ((struct PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice;
1789 PDumpHWPerfCBKM(&psPDumpHWPerfCBIN->szFileName[0],
1790 psPDumpHWPerfCBIN->ui32FileOffset,
1791 psDevInfo->psKernelHWPerfCBMemInfo->sDevVAddr,
1792 psDevInfo->psKernelHWPerfCBMemInfo->ui32AllocSize,
1793 psPDumpHWPerfCBIN->ui32PDumpFlags);