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"
45 #include "pvr_events.h"
47 int SGXGetClientInfoBW(u32 ui32BridgeID,
48 struct PVRSRV_BRIDGE_IN_GETCLIENTINFO *psGetClientInfoIN,
49 struct PVRSRV_BRIDGE_OUT_GETCLIENTINFO *psGetClientInfoOUT,
50 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
54 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETCLIENTINFO);
56 psGetClientInfoOUT->eError =
57 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
58 psGetClientInfoIN->hDevCookie,
59 PVRSRV_HANDLE_TYPE_DEV_NODE);
60 if (psGetClientInfoOUT->eError != PVRSRV_OK)
63 psGetClientInfoOUT->eError =
64 SGXGetClientInfoKM(hDevCookieInt, &psGetClientInfoOUT->sClientInfo);
68 int SGXReleaseClientInfoBW(u32 ui32BridgeID,
69 struct PVRSRV_BRIDGE_IN_RELEASECLIENTINFO *psReleaseClientInfoIN,
70 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
71 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
73 struct PVRSRV_SGXDEV_INFO *psDevInfo;
76 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
77 PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO);
80 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
81 psReleaseClientInfoIN->hDevCookie,
82 PVRSRV_HANDLE_TYPE_DEV_NODE);
83 if (psRetOUT->eError != PVRSRV_OK)
87 (struct PVRSRV_SGXDEV_INFO *)((struct PVRSRV_DEVICE_NODE *)
88 hDevCookieInt)->pvDevice;
90 PVR_ASSERT(psDevInfo->ui32ClientRefCount > 0);
92 psDevInfo->ui32ClientRefCount--;
94 psRetOUT->eError = PVRSRV_OK;
99 int SGXGetInternalDevInfoBW(u32 ui32BridgeID,
100 struct PVRSRV_BRIDGE_IN_GETINTERNALDEVINFO *psSGXGetInternalDevInfoIN,
101 struct PVRSRV_BRIDGE_OUT_GETINTERNALDEVINFO *psSGXGetInternalDevInfoOUT,
102 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
106 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
107 PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO);
109 psSGXGetInternalDevInfoOUT->eError =
110 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
111 psSGXGetInternalDevInfoIN->hDevCookie,
112 PVRSRV_HANDLE_TYPE_DEV_NODE);
113 if (psSGXGetInternalDevInfoOUT->eError != PVRSRV_OK)
116 psSGXGetInternalDevInfoOUT->eError =
117 SGXGetInternalDevInfoKM(hDevCookieInt,
118 &psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo);
120 psSGXGetInternalDevInfoOUT->eError =
121 PVRSRVAllocHandle(psPerProc->psHandleBase,
122 &psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.
123 hHostCtlKernelMemInfoHandle,
124 psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.
125 hHostCtlKernelMemInfoHandle,
126 PVRSRV_HANDLE_TYPE_MEM_INFO,
127 PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
132 int SGXDoKickBW(u32 ui32BridgeID,
133 struct PVRSRV_BRIDGE_IN_DOKICK *psDoKickIN,
134 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
136 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
141 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DOKICK);
143 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
145 psDoKickIN->hDevCookie,
146 PVRSRV_HANDLE_TYPE_DEV_NODE);
148 if (psRetOUT->eError != PVRSRV_OK)
151 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
152 &psDoKickIN->sCCBKick.hCCBKernelMemInfo,
153 psDoKickIN->sCCBKick.hCCBKernelMemInfo,
154 PVRSRV_HANDLE_TYPE_MEM_INFO);
156 if (psRetOUT->eError != PVRSRV_OK)
159 if (psDoKickIN->sCCBKick.hTA3DSyncInfo != NULL) {
161 PVRSRVLookupHandle(psPerProc->psHandleBase,
162 &psDoKickIN->sCCBKick.hTA3DSyncInfo,
163 psDoKickIN->sCCBKick.hTA3DSyncInfo,
164 PVRSRV_HANDLE_TYPE_SYNC_INFO);
166 if (psRetOUT->eError != PVRSRV_OK)
170 if (psDoKickIN->sCCBKick.hTASyncInfo != NULL) {
172 PVRSRVLookupHandle(psPerProc->psHandleBase,
173 &psDoKickIN->sCCBKick.hTASyncInfo,
174 psDoKickIN->sCCBKick.hTASyncInfo,
175 PVRSRV_HANDLE_TYPE_SYNC_INFO);
177 if (psRetOUT->eError != PVRSRV_OK)
181 if (psDoKickIN->sCCBKick.h3DSyncInfo != NULL) {
183 PVRSRVLookupHandle(psPerProc->psHandleBase,
184 &psDoKickIN->sCCBKick.h3DSyncInfo,
185 psDoKickIN->sCCBKick.h3DSyncInfo,
186 PVRSRV_HANDLE_TYPE_SYNC_INFO);
188 if (psRetOUT->eError != PVRSRV_OK)
192 if (psDoKickIN->sCCBKick.ui32NumSrcSyncs > SGX_MAX_SRC_SYNCS) {
193 psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
196 for (i = 0; i < psDoKickIN->sCCBKick.ui32NumSrcSyncs; i++) {
198 PVRSRVLookupHandle(psPerProc->psHandleBase,
199 &psDoKickIN->sCCBKick.
200 ahSrcKernelSyncInfo[i],
201 psDoKickIN->sCCBKick.
202 ahSrcKernelSyncInfo[i],
203 PVRSRV_HANDLE_TYPE_SYNC_INFO);
205 if (psRetOUT->eError != PVRSRV_OK)
209 if (psDoKickIN->sCCBKick.ui32NumTAStatusVals > SGX_MAX_TA_STATUS_VALS) {
210 psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
213 for (i = 0; i < psDoKickIN->sCCBKick.ui32NumTAStatusVals; i++) {
215 PVRSRVLookupHandle(psPerProc->psHandleBase,
216 &psDoKickIN->sCCBKick.ahTAStatusSyncInfo[i],
217 psDoKickIN->sCCBKick.ahTAStatusSyncInfo[i],
218 PVRSRV_HANDLE_TYPE_SYNC_INFO);
219 if (psRetOUT->eError != PVRSRV_OK)
223 if (psDoKickIN->sCCBKick.ui32Num3DStatusVals > SGX_MAX_3D_STATUS_VALS) {
224 psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
227 for (i = 0; i < psDoKickIN->sCCBKick.ui32Num3DStatusVals; i++) {
229 PVRSRVLookupHandle(psPerProc->psHandleBase,
230 &psDoKickIN->sCCBKick.ah3DStatusSyncInfo[i],
231 psDoKickIN->sCCBKick.ah3DStatusSyncInfo[i],
232 PVRSRV_HANDLE_TYPE_SYNC_INFO);
234 if (psRetOUT->eError != PVRSRV_OK)
238 if (psDoKickIN->sCCBKick.ui32NumDstSyncObjects > 0) {
239 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
240 &psDoKickIN->sCCBKick.
241 hKernelHWSyncListMemInfo,
242 psDoKickIN->sCCBKick.
243 hKernelHWSyncListMemInfo,
244 PVRSRV_HANDLE_TYPE_MEM_INFO);
246 if (psRetOUT->eError != PVRSRV_OK)
249 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
250 &psDoKickIN->sCCBKick.sDstSyncHandle,
251 psDoKickIN->sCCBKick.sDstSyncHandle,
252 PVRSRV_HANDLE_TYPE_SYNC_INFO);
254 if (psRetOUT->eError != PVRSRV_OK)
258 psRetOUT->eError = SGXDoKickKM(hDevCookieInt, &psDoKickIN->sCCBKick);
263 int SGXScheduleProcessQueuesBW(u32 ui32BridgeID,
264 struct PVRSRV_BRIDGE_IN_SGX_SCHEDULE_PROCESS_QUEUES *psScheduleProcQIN,
265 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
266 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
270 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
271 PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES);
274 PVRSRVLookupHandle(psPerProc->psHandleBase,
276 psScheduleProcQIN->hDevCookie,
277 PVRSRV_HANDLE_TYPE_DEV_NODE);
279 if (psRetOUT->eError != PVRSRV_OK)
282 psRetOUT->eError = SGXScheduleProcessQueuesKM(hDevCookieInt);
287 int SGXSubmitTransferBW(u32 ui32BridgeID,
288 struct PVRSRV_BRIDGE_IN_SUBMITTRANSFER *psSubmitTransferIN,
289 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
290 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
293 struct PVRSRV_TRANSFER_SGX_KICK *psKick;
296 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
297 PVRSRV_BRIDGE_SGX_SUBMITTRANSFER);
298 PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
300 psKick = &psSubmitTransferIN->sKick;
302 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
304 psSubmitTransferIN->hDevCookie,
305 PVRSRV_HANDLE_TYPE_DEV_NODE);
306 if (psRetOUT->eError != PVRSRV_OK)
309 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
310 &psKick->hCCBMemInfo,
312 PVRSRV_HANDLE_TYPE_MEM_INFO);
313 if (psRetOUT->eError != PVRSRV_OK)
316 if (psKick->hTASyncInfo != NULL) {
317 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
318 &psKick->hTASyncInfo,
320 PVRSRV_HANDLE_TYPE_SYNC_INFO);
321 if (psRetOUT->eError != PVRSRV_OK)
325 if (psKick->h3DSyncInfo != NULL) {
326 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
327 &psKick->h3DSyncInfo,
329 PVRSRV_HANDLE_TYPE_SYNC_INFO);
330 if (psRetOUT->eError != PVRSRV_OK)
334 if (psKick->ui32NumSrcSync > SGX_MAX_TRANSFER_SYNC_OPS) {
335 psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
338 for (i = 0; i < psKick->ui32NumSrcSync; i++) {
339 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
340 &psKick->ahSrcSyncInfo[i],
341 psKick->ahSrcSyncInfo[i],
342 PVRSRV_HANDLE_TYPE_SYNC_INFO);
343 if (psRetOUT->eError != PVRSRV_OK)
347 if (psKick->ui32NumDstSync > SGX_MAX_TRANSFER_SYNC_OPS) {
348 psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
351 for (i = 0; i < psKick->ui32NumDstSync; i++) {
352 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
353 &psKick->ahDstSyncInfo[i],
354 psKick->ahDstSyncInfo[i],
355 PVRSRV_HANDLE_TYPE_SYNC_INFO);
356 if (psRetOUT->eError != PVRSRV_OK)
360 psRetOUT->eError = SGXSubmitTransferKM(hDevCookieInt, psKick);
365 int SGXGetMiscInfoBW(u32 ui32BridgeID,
366 struct PVRSRV_BRIDGE_IN_SGXGETMISCINFO *psSGXGetMiscInfoIN,
367 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
368 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
371 struct PVRSRV_SGXDEV_INFO *psDevInfo;
372 struct SGX_MISC_INFO sMiscInfo;
373 struct PVRSRV_DEVICE_NODE *psDeviceNode;
375 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETMISCINFO);
377 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
379 psSGXGetMiscInfoIN->hDevCookie,
380 PVRSRV_HANDLE_TYPE_DEV_NODE);
382 if (psRetOUT->eError != PVRSRV_OK)
385 psDeviceNode = hDevCookieInt;
386 PVR_ASSERT(psDeviceNode != NULL);
387 if (psDeviceNode == NULL)
390 psDevInfo = psDeviceNode->pvDevice;
392 psRetOUT->eError = CopyFromUserWrapper(psPerProc, ui32BridgeID,
394 psSGXGetMiscInfoIN->psMiscInfo,
395 sizeof(struct SGX_MISC_INFO));
396 if (psRetOUT->eError != PVRSRV_OK)
399 if (sMiscInfo.eRequest == SGX_MISC_INFO_REQUEST_HWPERF_RETRIEVE_CB) {
401 void *hAllocatedHandle;
402 void __user *psTmpUserData;
406 (u32) (sMiscInfo.uData.sRetrieveCB.ui32ArraySize *
407 sizeof(struct PVRSRV_SGX_HWPERF_CBDATA));
409 ASSIGN_AND_EXIT_ON_ERROR(psRetOUT->eError,
410 OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
415 psTmpUserData = (void __force __user *)
416 sMiscInfo.uData.sRetrieveCB.psHWPerfData;
417 sMiscInfo.uData.sRetrieveCB.psHWPerfData = pAllocated;
419 psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo,
420 &sMiscInfo, psDeviceNode);
421 if (psRetOUT->eError != PVRSRV_OK) {
422 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
423 allocatedSize, pAllocated, hAllocatedHandle);
427 psRetOUT->eError = CopyToUserWrapper(psPerProc,
428 ui32BridgeID, psTmpUserData,
429 sMiscInfo.uData.sRetrieveCB.psHWPerfData,
432 sMiscInfo.uData.sRetrieveCB.psHWPerfData =
433 (void __force *)psTmpUserData;
435 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
436 allocatedSize, pAllocated, hAllocatedHandle);
438 if (psRetOUT->eError != PVRSRV_OK)
441 psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo,
442 &sMiscInfo, psDeviceNode);
444 if (psRetOUT->eError != PVRSRV_OK)
448 psRetOUT->eError = CopyToUserWrapper(psPerProc,
450 psSGXGetMiscInfoIN->psMiscInfo,
452 sizeof(struct SGX_MISC_INFO));
453 if (psRetOUT->eError != PVRSRV_OK)
458 int SGXReadDiffCountersBW(u32 ui32BridgeID,
459 struct PVRSRV_BRIDGE_IN_SGX_READ_DIFF_COUNTERS *psSGXReadDiffCountersIN,
460 struct PVRSRV_BRIDGE_OUT_SGX_READ_DIFF_COUNTERS
461 *psSGXReadDiffCountersOUT,
462 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
466 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
467 PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS);
469 psSGXReadDiffCountersOUT->eError =
470 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
471 psSGXReadDiffCountersIN->hDevCookie,
472 PVRSRV_HANDLE_TYPE_DEV_NODE);
474 if (psSGXReadDiffCountersOUT->eError != PVRSRV_OK)
477 psSGXReadDiffCountersOUT->eError = SGXReadDiffCountersKM(
479 psSGXReadDiffCountersIN->ui32Reg,
480 &psSGXReadDiffCountersOUT->ui32Old,
481 psSGXReadDiffCountersIN->bNew,
482 psSGXReadDiffCountersIN->ui32New,
483 psSGXReadDiffCountersIN->ui32NewReset,
484 psSGXReadDiffCountersIN->ui32CountersReg,
485 &psSGXReadDiffCountersOUT->ui32Time,
486 &psSGXReadDiffCountersOUT->bActive,
487 &psSGXReadDiffCountersOUT->sDiffs);
492 int SGXReadHWPerfCBBW(u32 ui32BridgeID,
493 struct PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_CB *psSGXReadHWPerfCBIN,
494 struct PVRSRV_BRIDGE_OUT_SGX_READ_HWPERF_CB *psSGXReadHWPerfCBOUT,
495 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
498 struct PVRSRV_SGX_HWPERF_CB_ENTRY *psAllocated;
499 void *hAllocatedHandle;
500 u32 ui32AllocatedSize;
502 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
503 PVRSRV_BRIDGE_SGX_READ_HWPERF_CB);
505 psSGXReadHWPerfCBOUT->eError =
506 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
507 psSGXReadHWPerfCBIN->hDevCookie,
508 PVRSRV_HANDLE_TYPE_DEV_NODE);
510 if (psSGXReadHWPerfCBOUT->eError != PVRSRV_OK)
513 ui32AllocatedSize = psSGXReadHWPerfCBIN->ui32ArraySize *
514 sizeof(psSGXReadHWPerfCBIN->psHWPerfCBData[0]);
515 ASSIGN_AND_EXIT_ON_ERROR(psSGXReadHWPerfCBOUT->eError,
516 OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
518 (void **)&psAllocated,
521 psSGXReadHWPerfCBOUT->eError = SGXReadHWPerfCBKM(hDevCookieInt,
522 psSGXReadHWPerfCBIN->ui32ArraySize,
524 &psSGXReadHWPerfCBOUT->ui32DataCount,
525 &psSGXReadHWPerfCBOUT->ui32ClockSpeed,
526 &psSGXReadHWPerfCBOUT->ui32HostTimeStamp);
527 if (psSGXReadHWPerfCBOUT->eError == PVRSRV_OK)
528 psSGXReadHWPerfCBOUT->eError = CopyToUserWrapper(
529 psPerProc, ui32BridgeID,
530 psSGXReadHWPerfCBIN->psHWPerfCBData,
531 psAllocated, ui32AllocatedSize);
533 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
534 ui32AllocatedSize, psAllocated, hAllocatedHandle);
539 int SGXDevInitPart2BW(u32 ui32BridgeID,
540 struct PVRSRV_BRIDGE_IN_SGXDEVINITPART2 *psSGXDevInitPart2IN,
541 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
542 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
545 enum PVRSRV_ERROR eError;
546 IMG_BOOL bDissociateFailed = IMG_FALSE;
547 IMG_BOOL bLookupFailed = IMG_FALSE;
548 IMG_BOOL bReleaseFailed = IMG_FALSE;
553 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DEVINITPART2);
555 if (!psPerProc->bInitProcess) {
556 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
560 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
562 psSGXDevInitPart2IN->hDevCookie,
563 PVRSRV_HANDLE_TYPE_DEV_NODE);
564 if (psRetOUT->eError != PVRSRV_OK)
567 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
568 psSGXDevInitPart2IN->sInitInfo.
570 PVRSRV_HANDLE_TYPE_MEM_INFO);
571 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
573 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
574 psSGXDevInitPart2IN->sInitInfo.
575 hKernelCCBCtlMemInfo,
576 PVRSRV_HANDLE_TYPE_MEM_INFO);
577 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
579 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
580 psSGXDevInitPart2IN->sInitInfo.
581 hKernelCCBEventKickerMemInfo,
582 PVRSRV_HANDLE_TYPE_MEM_INFO);
583 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
585 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
586 psSGXDevInitPart2IN->sInitInfo.
587 hKernelSGXHostCtlMemInfo,
588 PVRSRV_HANDLE_TYPE_MEM_INFO);
589 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
591 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
592 psSGXDevInitPart2IN->sInitInfo.
593 hKernelSGXTA3DCtlMemInfo,
594 PVRSRV_HANDLE_TYPE_MEM_INFO);
595 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
597 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
598 psSGXDevInitPart2IN->sInitInfo.
599 hKernelSGXMiscMemInfo,
600 PVRSRV_HANDLE_TYPE_MEM_INFO);
601 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
603 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
604 psSGXDevInitPart2IN->sInitInfo.
605 hKernelHWPerfCBMemInfo,
606 PVRSRV_HANDLE_TYPE_MEM_INFO);
607 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
609 edm_mi = &psSGXDevInitPart2IN->sInitInfo.hKernelEDMStatusBufferMemInfo;
611 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
612 *edm_mi, PVRSRV_HANDLE_TYPE_MEM_INFO);
613 bLookupFailed |= eError != PVRSRV_OK;
616 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
618 psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
623 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
625 PVRSRV_HANDLE_TYPE_MEM_INFO);
626 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
630 PVR_DPF(PVR_DBG_ERROR,
631 "DevInitSGXPart2BW: A handle lookup failed");
632 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
636 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
637 &psSGXDevInitPart2IN->sInitInfo.
639 psSGXDevInitPart2IN->sInitInfo.
641 PVRSRV_HANDLE_TYPE_MEM_INFO);
642 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
644 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
645 &psSGXDevInitPart2IN->sInitInfo.
646 hKernelCCBCtlMemInfo,
647 psSGXDevInitPart2IN->sInitInfo.
648 hKernelCCBCtlMemInfo,
649 PVRSRV_HANDLE_TYPE_MEM_INFO);
650 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
652 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
653 &psSGXDevInitPart2IN->sInitInfo.
654 hKernelCCBEventKickerMemInfo,
655 psSGXDevInitPart2IN->sInitInfo.
656 hKernelCCBEventKickerMemInfo,
657 PVRSRV_HANDLE_TYPE_MEM_INFO);
658 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
660 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
661 &psSGXDevInitPart2IN->sInitInfo.
662 hKernelSGXHostCtlMemInfo,
663 psSGXDevInitPart2IN->sInitInfo.
664 hKernelSGXHostCtlMemInfo,
665 PVRSRV_HANDLE_TYPE_MEM_INFO);
666 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
668 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
669 &psSGXDevInitPart2IN->sInitInfo.
670 hKernelSGXTA3DCtlMemInfo,
671 psSGXDevInitPart2IN->sInitInfo.
672 hKernelSGXTA3DCtlMemInfo,
673 PVRSRV_HANDLE_TYPE_MEM_INFO);
674 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
676 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
677 &psSGXDevInitPart2IN->sInitInfo.
678 hKernelSGXMiscMemInfo,
679 psSGXDevInitPart2IN->sInitInfo.
680 hKernelSGXMiscMemInfo,
681 PVRSRV_HANDLE_TYPE_MEM_INFO);
682 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
684 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
685 &psSGXDevInitPart2IN->sInitInfo.
686 hKernelHWPerfCBMemInfo,
687 psSGXDevInitPart2IN->sInitInfo.
688 hKernelHWPerfCBMemInfo,
689 PVRSRV_HANDLE_TYPE_MEM_INFO);
690 bReleaseFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
693 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
695 PVRSRV_HANDLE_TYPE_MEM_INFO);
696 bReleaseFailed |= eError != PVRSRV_OK;
699 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
701 &psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
703 if (*phHandle == NULL)
706 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
708 PVRSRV_HANDLE_TYPE_MEM_INFO);
709 bReleaseFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
712 if (bReleaseFailed) {
713 PVR_DPF(PVR_DBG_ERROR,
714 "DevInitSGXPart2BW: A handle release failed");
715 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
721 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
722 psSGXDevInitPart2IN->sInitInfo.
724 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
726 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
727 psSGXDevInitPart2IN->sInitInfo.
728 hKernelCCBCtlMemInfo);
729 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
731 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
732 psSGXDevInitPart2IN->sInitInfo.
733 hKernelCCBEventKickerMemInfo);
734 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
736 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
737 psSGXDevInitPart2IN->sInitInfo.
738 hKernelSGXHostCtlMemInfo);
739 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
741 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
742 psSGXDevInitPart2IN->sInitInfo.
743 hKernelSGXTA3DCtlMemInfo);
744 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
746 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
747 psSGXDevInitPart2IN->sInitInfo.
748 hKernelSGXMiscMemInfo);
749 bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
751 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
752 psSGXDevInitPart2IN->sInitInfo.
753 hKernelHWPerfCBMemInfo);
754 bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
757 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, *edm_mi);
758 bDissociateFailed |= eError != PVRSRV_OK;
761 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
763 psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
768 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, hHandle);
769 bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
772 if (bDissociateFailed) {
773 PVRSRVFreeDeviceMemKM(hDevCookieInt,
774 psSGXDevInitPart2IN->sInitInfo.
776 PVRSRVFreeDeviceMemKM(hDevCookieInt,
777 psSGXDevInitPart2IN->sInitInfo.
778 hKernelCCBCtlMemInfo);
779 PVRSRVFreeDeviceMemKM(hDevCookieInt,
780 psSGXDevInitPart2IN->sInitInfo.
781 hKernelSGXHostCtlMemInfo);
782 PVRSRVFreeDeviceMemKM(hDevCookieInt,
783 psSGXDevInitPart2IN->sInitInfo.
784 hKernelSGXTA3DCtlMemInfo);
785 PVRSRVFreeDeviceMemKM(hDevCookieInt,
786 psSGXDevInitPart2IN->sInitInfo.
787 hKernelSGXMiscMemInfo);
789 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
791 psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
796 PVRSRVFreeDeviceMemKM(hDevCookieInt,
797 (struct PVRSRV_KERNEL_MEM_INFO *)
802 PVR_DPF(PVR_DBG_ERROR,
803 "DevInitSGXPart2BW: A dissociate failed");
805 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
811 psRetOUT->eError = DevInitSGXPart2KM(psPerProc, hDevCookieInt,
812 &psSGXDevInitPart2IN->sInitInfo);
817 int SGXRegisterHWRenderContextBW(u32 ui32BridgeID,
818 struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT
819 *psSGXRegHWRenderContextIN,
820 struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT
821 *psSGXRegHWRenderContextOUT,
822 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
825 void *hHWRenderContextInt;
827 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
828 PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT);
830 NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError, psPerProc,
833 psSGXRegHWRenderContextOUT->eError =
834 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
835 psSGXRegHWRenderContextIN->hDevCookie,
836 PVRSRV_HANDLE_TYPE_DEV_NODE);
837 if (psSGXRegHWRenderContextOUT->eError != PVRSRV_OK)
840 hHWRenderContextInt =
841 SGXRegisterHWRenderContextKM(hDevCookieInt,
842 &psSGXRegHWRenderContextIN->sHWRenderContextDevVAddr,
845 if (hHWRenderContextInt == NULL) {
846 psSGXRegHWRenderContextOUT->eError = PVRSRV_ERROR_GENERIC;
850 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
851 &psSGXRegHWRenderContextOUT->hHWRenderContext,
853 PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT,
854 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
856 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError,
862 int SGXUnregisterHWRenderContextBW(u32 ui32BridgeID,
863 struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT
864 *psSGXUnregHWRenderContextIN,
865 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
866 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
868 void *hHWRenderContextInt;
870 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
871 PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT);
874 PVRSRVLookupHandle(psPerProc->psHandleBase,
875 &hHWRenderContextInt,
876 psSGXUnregHWRenderContextIN->hHWRenderContext,
877 PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
878 if (psRetOUT->eError != PVRSRV_OK)
881 psRetOUT->eError = SGXUnregisterHWRenderContextKM(hHWRenderContextInt);
882 if (psRetOUT->eError != PVRSRV_OK)
886 PVRSRVReleaseHandle(psPerProc->psHandleBase,
887 psSGXUnregHWRenderContextIN->hHWRenderContext,
888 PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
893 int SGXRegisterHWTransferContextBW(u32 ui32BridgeID,
894 struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT
895 *psSGXRegHWTransferContextIN,
896 struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT
897 *psSGXRegHWTransferContextOUT,
898 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
901 void *hHWTransferContextInt;
903 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
904 PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT);
906 NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError,
909 psSGXRegHWTransferContextOUT->eError =
910 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
911 psSGXRegHWTransferContextIN->hDevCookie,
912 PVRSRV_HANDLE_TYPE_DEV_NODE);
913 if (psSGXRegHWTransferContextOUT->eError != PVRSRV_OK)
916 hHWTransferContextInt =
917 SGXRegisterHWTransferContextKM(hDevCookieInt,
918 &psSGXRegHWTransferContextIN->
919 sHWTransferContextDevVAddr,
922 if (hHWTransferContextInt == NULL) {
923 psSGXRegHWTransferContextOUT->eError = PVRSRV_ERROR_GENERIC;
927 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
928 &psSGXRegHWTransferContextOUT->hHWTransferContext,
929 hHWTransferContextInt,
930 PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT,
931 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
933 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError,
939 int SGXUnregisterHWTransferContextBW(u32 ui32BridgeID,
940 struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT
941 *psSGXUnregHWTransferContextIN,
942 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
943 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
945 void *hHWTransferContextInt;
947 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
948 PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT);
950 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
951 &hHWTransferContextInt,
952 psSGXUnregHWTransferContextIN->
954 PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
955 if (psRetOUT->eError != PVRSRV_OK)
959 SGXUnregisterHWTransferContextKM(hHWTransferContextInt);
960 if (psRetOUT->eError != PVRSRV_OK)
964 PVRSRVReleaseHandle(psPerProc->psHandleBase,
965 psSGXUnregHWTransferContextIN->
967 PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
972 int SGXFlushHWRenderTargetBW(u32 ui32BridgeID,
973 struct PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET
974 *psSGXFlushHWRenderTargetIN,
975 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
976 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
979 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
980 PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET);
983 PVRSRVLookupHandle(psPerProc->psHandleBase,
985 psSGXFlushHWRenderTargetIN->hDevCookie,
986 PVRSRV_HANDLE_TYPE_DEV_NODE);
987 if (psRetOUT->eError != PVRSRV_OK)
990 SGXFlushHWRenderTargetKM(hDevCookieInt,
991 psSGXFlushHWRenderTargetIN->sHWRTDataSetDevVAddr);
996 int SGX2DQueryBlitsCompleteBW(struct file *filp, u32 ui32BridgeID,
997 struct PVRSRV_BRIDGE_IN_2DQUERYBLTSCOMPLETE *ps2DQueryBltsCompleteIN,
998 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
999 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1001 void *hDevCookieInt;
1003 struct PVRSRV_SGXDEV_INFO *psDevInfo;
1004 struct PVRSRV_FILE_PRIVATE_DATA *priv = filp->private_data;
1006 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1007 PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE);
1010 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
1011 ps2DQueryBltsCompleteIN->hDevCookie,
1012 PVRSRV_HANDLE_TYPE_DEV_NODE);
1013 if (psRetOUT->eError != PVRSRV_OK)
1016 if (ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_FLIP ||
1017 ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_UPDATE) {
1018 if (pvr_flip_event_req(priv,
1019 (long)ps2DQueryBltsCompleteIN->
1021 ps2DQueryBltsCompleteIN->type,
1022 ps2DQueryBltsCompleteIN->user_data))
1023 psRetOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY;
1029 PVRSRVLookupHandle(psPerProc->psHandleBase, &pvSyncInfo,
1030 ps2DQueryBltsCompleteIN->hKernSyncInfo,
1031 PVRSRV_HANDLE_TYPE_SYNC_INFO);
1032 if (psRetOUT->eError != PVRSRV_OK)
1036 (struct PVRSRV_SGXDEV_INFO *)((struct PVRSRV_DEVICE_NODE *)
1037 hDevCookieInt)->pvDevice;
1039 if (ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_EVENT) {
1040 if (pvr_sync_event_req(priv,
1041 (struct PVRSRV_KERNEL_SYNC_INFO *)pvSyncInfo,
1042 ps2DQueryBltsCompleteIN->user_data))
1043 psRetOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY;
1049 SGX2DQueryBlitsCompleteKM(psDevInfo,
1050 (struct PVRSRV_KERNEL_SYNC_INFO *)
1052 ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_BLOCK);
1057 int SGXFindSharedPBDescBW(u32 ui32BridgeID,
1058 struct PVRSRV_BRIDGE_IN_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescIN,
1059 struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescOUT,
1060 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1062 void *hDevCookieInt;
1063 struct PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
1064 struct PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
1065 struct PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
1066 struct PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescSubKernelMemInfos = NULL;
1067 u32 ui32SharedPBDescSubKernelMemInfosCount = 0;
1069 void *hSharedPBDesc = NULL;
1071 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1072 PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC);
1074 NEW_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError, psPerProc,
1075 PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS
1078 psSGXFindSharedPBDescOUT->hSharedPBDesc = NULL;
1080 psSGXFindSharedPBDescOUT->eError =
1081 PVRSRVLookupHandle(psPerProc->psHandleBase,
1083 psSGXFindSharedPBDescIN->hDevCookie,
1084 PVRSRV_HANDLE_TYPE_DEV_NODE);
1085 if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
1086 goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
1088 psSGXFindSharedPBDescOUT->eError =
1089 SGXFindSharedPBDescKM(psPerProc, hDevCookieInt,
1090 psSGXFindSharedPBDescIN->bLockOnFailure,
1091 psSGXFindSharedPBDescIN->ui32TotalPBSize,
1093 &psSharedPBDescKernelMemInfo,
1094 &psHWPBDescKernelMemInfo,
1095 &psBlockKernelMemInfo,
1096 &ppsSharedPBDescSubKernelMemInfos,
1097 &ui32SharedPBDescSubKernelMemInfosCount);
1098 if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
1099 goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
1101 PVR_ASSERT(ui32SharedPBDescSubKernelMemInfosCount <=
1102 PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
1104 psSGXFindSharedPBDescOUT->ui32SharedPBDescSubKernelMemInfoHandlesCount =
1105 ui32SharedPBDescSubKernelMemInfosCount;
1107 if (hSharedPBDesc == NULL) {
1108 psSGXFindSharedPBDescOUT->hSharedPBDescKernelMemInfoHandle =
1111 goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
1114 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1115 &psSGXFindSharedPBDescOUT->hSharedPBDesc,
1117 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
1118 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
1120 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1121 &psSGXFindSharedPBDescOUT->
1122 hSharedPBDescKernelMemInfoHandle,
1123 psSharedPBDescKernelMemInfo,
1124 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1125 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1126 psSGXFindSharedPBDescOUT->hSharedPBDesc);
1128 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1129 &psSGXFindSharedPBDescOUT->
1130 hHWPBDescKernelMemInfoHandle,
1131 psHWPBDescKernelMemInfo,
1132 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1133 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1134 psSGXFindSharedPBDescOUT->hSharedPBDesc);
1136 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1137 &psSGXFindSharedPBDescOUT->
1138 hBlockKernelMemInfoHandle,
1139 psBlockKernelMemInfo,
1140 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1141 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1142 psSGXFindSharedPBDescOUT->hSharedPBDesc);
1144 for (i = 0; i < ui32SharedPBDescSubKernelMemInfosCount; i++) {
1145 struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC
1146 *psSGXFindSharedPBDescOut = psSGXFindSharedPBDescOUT;
1148 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1149 &psSGXFindSharedPBDescOut->
1150 ahSharedPBDescSubKernelMemInfoHandles[i],
1151 ppsSharedPBDescSubKernelMemInfos[i],
1152 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1153 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1154 psSGXFindSharedPBDescOUT->
1155 hSharedPBDescKernelMemInfoHandle);
1158 PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT:
1159 if (ppsSharedPBDescSubKernelMemInfos != NULL)
1160 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
1161 sizeof(struct PVRSRV_KERNEL_MEM_INFO *) *
1162 ui32SharedPBDescSubKernelMemInfosCount,
1163 ppsSharedPBDescSubKernelMemInfos, NULL);
1165 if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK) {
1166 if (hSharedPBDesc != NULL)
1167 SGXUnrefSharedPBDescKM(hSharedPBDesc);
1169 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError,
1175 int SGXUnrefSharedPBDescBW(u32 ui32BridgeID,
1176 struct PVRSRV_BRIDGE_IN_SGXUNREFSHAREDPBDESC *psSGXUnrefSharedPBDescIN,
1177 struct PVRSRV_BRIDGE_OUT_SGXUNREFSHAREDPBDESC
1178 *psSGXUnrefSharedPBDescOUT,
1179 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1181 void *hSharedPBDesc;
1183 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1184 PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC);
1186 psSGXUnrefSharedPBDescOUT->eError =
1187 PVRSRVLookupHandle(psPerProc->psHandleBase,
1189 psSGXUnrefSharedPBDescIN->hSharedPBDesc,
1190 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
1191 if (psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
1194 psSGXUnrefSharedPBDescOUT->eError =
1195 SGXUnrefSharedPBDescKM(hSharedPBDesc);
1197 if (psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
1200 psSGXUnrefSharedPBDescOUT->eError =
1201 PVRSRVReleaseHandle(psPerProc->psHandleBase,
1202 psSGXUnrefSharedPBDescIN->hSharedPBDesc,
1203 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
1208 int SGXAddSharedPBDescBW(u32 ui32BridgeID,
1209 struct PVRSRV_BRIDGE_IN_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescIN,
1210 struct PVRSRV_BRIDGE_OUT_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescOUT,
1211 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1213 void *hDevCookieInt;
1214 struct PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
1215 struct PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
1216 struct PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
1217 u32 ui32KernelMemInfoHandlesCount =
1218 psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount;
1220 void **phKernelMemInfoHandles = NULL;
1221 struct PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfos = NULL;
1223 enum PVRSRV_ERROR eError;
1224 void *hSharedPBDesc = NULL;
1226 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1227 PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC);
1229 NEW_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError, psPerProc,
1232 psSGXAddSharedPBDescOUT->hSharedPBDesc = NULL;
1234 PVR_ASSERT(ui32KernelMemInfoHandlesCount <=
1235 PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
1237 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1239 psSGXAddSharedPBDescIN->hDevCookie,
1240 PVRSRV_HANDLE_TYPE_DEV_NODE);
1241 if (eError != PVRSRV_OK)
1242 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1244 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1245 (void **)&psSharedPBDescKernelMemInfo,
1246 psSGXAddSharedPBDescIN->
1247 hSharedPBDescKernelMemInfo,
1248 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1249 if (eError != PVRSRV_OK)
1250 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1252 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1253 (void **)&psHWPBDescKernelMemInfo,
1254 psSGXAddSharedPBDescIN->
1255 hHWPBDescKernelMemInfo,
1256 PVRSRV_HANDLE_TYPE_MEM_INFO);
1257 if (eError != PVRSRV_OK)
1258 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1260 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1261 (void **)&psBlockKernelMemInfo,
1262 psSGXAddSharedPBDescIN->hBlockKernelMemInfo,
1263 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1264 if (eError != PVRSRV_OK)
1265 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1267 if (!OSAccessOK(PVR_VERIFY_READ,
1268 psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
1269 ui32KernelMemInfoHandlesCount * sizeof(void *))) {
1270 PVR_DPF(PVR_DBG_ERROR, "%s: PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC:"
1271 " Invalid phKernelMemInfos pointer", __func__);
1273 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1276 eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1277 ui32KernelMemInfoHandlesCount * sizeof(void *),
1278 (void **)&phKernelMemInfoHandles, NULL);
1279 if (eError != PVRSRV_OK)
1280 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1282 if (CopyFromUserWrapper(psPerProc,
1284 phKernelMemInfoHandles,
1285 psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
1286 ui32KernelMemInfoHandlesCount * sizeof(void *))
1289 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1292 eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1293 ui32KernelMemInfoHandlesCount *
1294 sizeof(struct PVRSRV_KERNEL_MEM_INFO *),
1295 (void **)&ppsKernelMemInfos, NULL);
1296 if (eError != PVRSRV_OK)
1297 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1299 for (i = 0; i < ui32KernelMemInfoHandlesCount; i++) {
1300 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1301 (void **)&ppsKernelMemInfos[i],
1302 phKernelMemInfoHandles[i],
1303 PVRSRV_HANDLE_TYPE_MEM_INFO);
1304 if (eError != PVRSRV_OK)
1305 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1308 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1309 psSGXAddSharedPBDescIN->
1310 hSharedPBDescKernelMemInfo,
1311 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1312 PVR_ASSERT(eError == PVRSRV_OK);
1314 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1315 psSGXAddSharedPBDescIN->
1316 hHWPBDescKernelMemInfo,
1317 PVRSRV_HANDLE_TYPE_MEM_INFO);
1318 PVR_ASSERT(eError == PVRSRV_OK);
1320 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1321 psSGXAddSharedPBDescIN->
1322 hBlockKernelMemInfo,
1323 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1324 PVR_ASSERT(eError == PVRSRV_OK);
1326 for (i = 0; i < ui32KernelMemInfoHandlesCount; i++) {
1327 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1328 phKernelMemInfoHandles[i],
1329 PVRSRV_HANDLE_TYPE_MEM_INFO);
1330 PVR_ASSERT(eError == PVRSRV_OK);
1333 eError = SGXAddSharedPBDescKM(psPerProc, hDevCookieInt,
1334 psSharedPBDescKernelMemInfo,
1335 psHWPBDescKernelMemInfo,
1336 psBlockKernelMemInfo,
1337 psSGXAddSharedPBDescIN->ui32TotalPBSize,
1340 ui32KernelMemInfoHandlesCount);
1342 if (eError != PVRSRV_OK)
1343 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1345 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1346 &psSGXAddSharedPBDescOUT->hSharedPBDesc,
1348 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
1349 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
1351 PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT:
1353 if (phKernelMemInfoHandles)
1354 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
1355 psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount
1357 (void *)phKernelMemInfoHandles, NULL);
1358 if (ppsKernelMemInfos)
1359 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
1360 psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount
1361 * sizeof(struct PVRSRV_KERNEL_MEM_INFO *),
1362 (void *)ppsKernelMemInfos, NULL);
1364 if (ret == 0 && eError == PVRSRV_OK)
1365 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError,
1368 psSGXAddSharedPBDescOUT->eError = eError;
1373 int SGXGetInfoForSrvinitBW(u32 ui32BridgeID,
1374 struct PVRSRV_BRIDGE_IN_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitIN,
1375 struct PVRSRV_BRIDGE_OUT_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitOUT,
1376 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1378 void *hDevCookieInt;
1380 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1381 PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT);
1383 NEW_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc,
1384 PVRSRV_MAX_CLIENT_HEAPS);
1386 if (!psPerProc->bInitProcess) {
1387 psSGXInfoForSrvinitOUT->eError = PVRSRV_ERROR_GENERIC;
1391 psSGXInfoForSrvinitOUT->eError =
1392 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
1393 psSGXInfoForSrvinitIN->hDevCookie,
1394 PVRSRV_HANDLE_TYPE_DEV_NODE);
1396 if (psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
1399 psSGXInfoForSrvinitOUT->eError =
1400 SGXGetInfoForSrvinitKM(hDevCookieInt,
1401 &psSGXInfoForSrvinitOUT->sInitInfo);
1403 if (psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
1406 for (i = 0; i < PVRSRV_MAX_CLIENT_HEAPS; i++) {
1407 struct PVRSRV_HEAP_INFO *psHeapInfo;
1409 psHeapInfo = &psSGXInfoForSrvinitOUT->sInitInfo.asHeapInfo[i];
1411 if (psHeapInfo->ui32HeapID != (u32)SGX_UNDEFINED_HEAP_ID) {
1412 void *hDevMemHeapExt;
1414 if (psHeapInfo->hDevMemHeap != NULL) {
1416 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1418 psHeapInfo->hDevMemHeap,
1419 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
1420 PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
1421 psHeapInfo->hDevMemHeap = hDevMemHeapExt;
1426 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc);
1432 static void DumpBufferArray(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
1433 struct SGX_KICKTA_DUMP_BUFFER *psBufferArray,
1434 u32 ui32BufferArrayLength, IMG_BOOL bDumpPolls)
1438 for (i = 0; i < ui32BufferArrayLength; i++) {
1439 struct SGX_KICKTA_DUMP_BUFFER *psBuffer;
1440 struct PVRSRV_KERNEL_MEM_INFO *psCtrlMemInfoKM;
1445 psBuffer = &psBufferArray[i];
1446 pszName = psBuffer->pszName;
1448 pszName = "Nameless buffer";
1451 MAKEUNIQUETAG((struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1455 ((struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1456 hKernelMemInfo)->psKernelSyncInfo->psSyncDataMemInfoKM;
1458 offsetof(struct PVRSRV_SYNC_DATA, ui32ReadOpsComplete);
1460 if (psBuffer->ui32Start <= psBuffer->ui32End) {
1462 PDUMPCOMMENTWITHFLAGS(0,
1463 "Wait for %s space\r\n",
1465 PDUMPCBP(psCtrlMemInfoKM, ui32Offset,
1466 psBuffer->ui32Start,
1467 psBuffer->ui32SpaceUsed,
1468 psBuffer->ui32BufferSize, 0,
1469 MAKEUNIQUETAG(psCtrlMemInfoKM));
1472 PDUMPCOMMENTWITHFLAGS(0, "%s\r\n", pszName);
1473 PDUMPMEMUM(NULL, psBuffer->pvLinAddr,
1474 (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1476 psBuffer->ui32Start,
1477 psBuffer->ui32End - psBuffer->ui32Start, 0,
1482 PDUMPCOMMENTWITHFLAGS(0,
1483 "Wait for %s space\r\n",
1485 PDUMPCBP(psCtrlMemInfoKM, ui32Offset,
1486 psBuffer->ui32Start,
1487 psBuffer->ui32BackEndLength,
1488 psBuffer->ui32BufferSize, 0,
1489 MAKEUNIQUETAG(psCtrlMemInfoKM));
1491 PDUMPCOMMENTWITHFLAGS(0, "%s (part 1)\r\n", pszName);
1492 PDUMPMEMUM(NULL, psBuffer->pvLinAddr,
1493 (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1495 psBuffer->ui32Start,
1496 psBuffer->ui32BackEndLength, 0, hUniqueTag);
1499 PDUMPMEMPOL(psCtrlMemInfoKM, ui32Offset,
1501 PDUMP_POLL_OPERATOR_NOTEQUAL,
1502 MAKEUNIQUETAG(psCtrlMemInfoKM));
1504 PDUMPCOMMENTWITHFLAGS(0,
1505 "Wait for %s space\r\n",
1507 PDUMPCBP(psCtrlMemInfoKM, ui32Offset, 0,
1509 psBuffer->ui32BufferSize, 0,
1510 MAKEUNIQUETAG(psCtrlMemInfoKM));
1512 PDUMPCOMMENTWITHFLAGS(0, "%s (part 2)\r\n", pszName);
1513 PDUMPMEMUM(NULL, psBuffer->pvLinAddr,
1514 (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1516 0, psBuffer->ui32End, 0, hUniqueTag);
1521 int SGXPDumpBufferArrayBW(u32 ui32BridgeID,
1522 struct PVRSRV_BRIDGE_IN_PDUMP_BUFFER_ARRAY *psPDumpBufferArrayIN,
1523 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1526 struct SGX_KICKTA_DUMP_BUFFER *psKickTADumpBuffer;
1527 u32 ui32BufferArrayLength = psPDumpBufferArrayIN->ui32BufferArrayLength;
1528 u32 ui32BufferArraySize =
1529 ui32BufferArrayLength * sizeof(struct SGX_KICKTA_DUMP_BUFFER);
1530 enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
1532 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1534 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1535 PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY);
1537 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
1538 (void **)&psKickTADumpBuffer, NULL) != PVRSRV_OK)
1541 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, psKickTADumpBuffer,
1542 psPDumpBufferArrayIN->psBufferArray,
1543 ui32BufferArraySize) != PVRSRV_OK) {
1544 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
1545 psKickTADumpBuffer, NULL);
1549 for (i = 0; i < ui32BufferArrayLength; i++) {
1552 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1554 psKickTADumpBuffer[i].
1556 PVRSRV_HANDLE_TYPE_MEM_INFO);
1558 if (eError != PVRSRV_OK) {
1559 PVR_DPF(PVR_DBG_ERROR,
1560 "PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY: "
1561 "PVRSRVLookupHandle failed (%d)", eError);
1564 psKickTADumpBuffer[i].hKernelMemInfo = pvMemInfo;
1568 if (eError == PVRSRV_OK)
1569 DumpBufferArray(psPerProc, psKickTADumpBuffer,
1570 ui32BufferArrayLength,
1571 psPDumpBufferArrayIN->bDumpPolls);
1573 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
1574 psKickTADumpBuffer, NULL);
1579 int SGXPDump3DSignatureRegistersBW(u32 ui32BridgeID,
1580 struct PVRSRV_BRIDGE_IN_PDUMP_3D_SIGNATURE_REGISTERS
1581 *psPDump3DSignatureRegistersIN,
1582 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1584 u32 ui32RegisterArraySize =
1585 psPDump3DSignatureRegistersIN->ui32NumRegisters * sizeof(u32);
1586 u32 *pui32Registers = NULL;
1589 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1591 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1592 PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS);
1594 if (ui32RegisterArraySize == 0)
1597 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1598 ui32RegisterArraySize,
1599 (void **)&pui32Registers, NULL) != PVRSRV_OK) {
1600 PVR_DPF(PVR_DBG_ERROR,
1601 "PDump3DSignatureRegistersBW: OSAllocMem failed");
1605 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
1606 psPDump3DSignatureRegistersIN->pui32Registers,
1607 ui32RegisterArraySize) != PVRSRV_OK) {
1608 PVR_DPF(PVR_DBG_ERROR, "PDump3DSignatureRegistersBW: "
1609 "CopyFromUserWrapper failed");
1613 PDump3DSignatureRegisters(psPDump3DSignatureRegistersIN->
1616 psPDump3DSignatureRegistersIN->
1622 if (pui32Registers != NULL)
1623 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1624 pui32Registers, NULL);
1629 int SGXPDumpCounterRegistersBW(u32 ui32BridgeID,
1630 struct PVRSRV_BRIDGE_IN_PDUMP_COUNTER_REGISTERS
1631 *psPDumpCounterRegistersIN,
1632 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1634 u32 ui32RegisterArraySize =
1635 psPDumpCounterRegistersIN->ui32NumRegisters * sizeof(u32);
1636 u32 *pui32Registers = NULL;
1639 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1641 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1642 PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS);
1644 if (ui32RegisterArraySize == 0)
1647 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1648 (void **)&pui32Registers, NULL) != PVRSRV_OK) {
1649 PVR_DPF(PVR_DBG_ERROR,
1650 "PDumpCounterRegistersBW: OSAllocMem failed");
1655 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
1656 psPDumpCounterRegistersIN->pui32Registers,
1657 ui32RegisterArraySize) != PVRSRV_OK) {
1658 PVR_DPF(PVR_DBG_ERROR,
1659 "PDumpCounterRegistersBW: CopyFromUserWrapper failed");
1663 PDumpCounterRegisters(psPDumpCounterRegistersIN->ui32DumpFrameNum,
1665 psPDumpCounterRegistersIN->ui32NumRegisters);
1670 if (pui32Registers != NULL)
1671 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1672 pui32Registers, NULL);
1677 int SGXPDumpTASignatureRegistersBW(u32 ui32BridgeID,
1678 struct PVRSRV_BRIDGE_IN_PDUMP_TA_SIGNATURE_REGISTERS
1679 *psPDumpTASignatureRegistersIN,
1680 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1682 u32 ui32RegisterArraySize =
1683 psPDumpTASignatureRegistersIN->ui32NumRegisters * sizeof(u32);
1684 u32 *pui32Registers = NULL;
1687 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1689 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1690 PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS);
1692 if (ui32RegisterArraySize == 0)
1695 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1696 ui32RegisterArraySize,
1697 (void **)&pui32Registers, NULL) != PVRSRV_OK) {
1698 PVR_DPF(PVR_DBG_ERROR,
1699 "PDumpTASignatureRegistersBW: OSAllocMem failed");
1704 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
1705 psPDumpTASignatureRegistersIN->pui32Registers,
1706 ui32RegisterArraySize) != PVRSRV_OK) {
1707 PVR_DPF(PVR_DBG_ERROR, "PDumpTASignatureRegistersBW: "
1708 "CopyFromUserWrapper failed");
1712 PDumpTASignatureRegisters(psPDumpTASignatureRegistersIN->
1714 psPDumpTASignatureRegistersIN->
1717 psPDumpTASignatureRegistersIN->
1723 if (pui32Registers != NULL)
1724 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1725 pui32Registers, NULL);
1730 int SGXPDumpHWPerfCBBW(u32 ui32BridgeID,
1731 struct PVRSRV_BRIDGE_IN_PDUMP_HWPERFCB *psPDumpHWPerfCBIN,
1732 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1733 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1735 struct PVRSRV_SGXDEV_INFO *psDevInfo;
1736 void *hDevCookieInt;
1738 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1739 PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB);
1742 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
1743 psPDumpHWPerfCBIN->hDevCookie,
1744 PVRSRV_HANDLE_TYPE_DEV_NODE);
1745 if (psRetOUT->eError != PVRSRV_OK)
1748 psDevInfo = ((struct PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice;
1750 PDumpHWPerfCBKM(&psPDumpHWPerfCBIN->szFileName[0],
1751 psPDumpHWPerfCBIN->ui32FileOffset,
1752 psDevInfo->psKernelHWPerfCBMemInfo->sDevVAddr,
1753 psDevInfo->psKernelHWPerfCBMemInfo->ui32AllocSize,
1754 psPDumpHWPerfCBIN->ui32PDumpFlags);
1761 void SetSGXDispatchTableEntry(void)
1764 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETCLIENTINFO,
1765 SGXGetClientInfoBW);
1766 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO,
1767 SGXReleaseClientInfoBW);
1768 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO,
1769 SGXGetInternalDevInfoBW);
1770 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_DOKICK, SGXDoKickBW);
1771 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETPHYSPAGEADDR, DummyBW);
1772 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READREGISTRYDWORD, DummyBW);
1773 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SCHEDULECOMMAND, DummyBW);
1775 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE,
1776 SGX2DQueryBlitsCompleteBW);
1778 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETMMUPDADDR, DummyBW);
1780 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SUBMITTRANSFER,
1781 SGXSubmitTransferBW);
1782 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETMISCINFO, SGXGetMiscInfoBW);
1783 SetDispatchTableEntry(PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT,
1784 SGXGetInfoForSrvinitBW);
1785 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_DEVINITPART2,
1788 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC,
1789 SGXFindSharedPBDescBW);
1790 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC,
1791 SGXUnrefSharedPBDescBW);
1792 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC,
1793 SGXAddSharedPBDescBW);
1794 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT,
1795 SGXRegisterHWRenderContextBW);
1796 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET,
1797 SGXFlushHWRenderTargetBW);
1798 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT,
1799 SGXUnregisterHWRenderContextBW);
1800 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT,
1801 SGXRegisterHWTransferContextBW);
1802 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT,
1803 SGXUnregisterHWTransferContextBW);
1805 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS,
1806 SGXReadDiffCountersBW);
1807 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READ_HWPERF_CB,
1810 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES,
1811 SGXScheduleProcessQueuesBW);
1814 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY,
1815 SGXPDumpBufferArrayBW);
1816 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS,
1817 SGXPDump3DSignatureRegistersBW);
1818 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS,
1819 SGXPDumpCounterRegistersBW);
1820 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS,
1821 SGXPDumpTASignatureRegistersBW);
1822 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB,
1823 SGXPDumpHWPerfCBBW);