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;
556 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DEVINITPART2);
558 if (!psPerProc->bInitProcess) {
559 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
563 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
565 psSGXDevInitPart2IN->hDevCookie,
566 PVRSRV_HANDLE_TYPE_DEV_NODE);
567 if (psRetOUT->eError != PVRSRV_OK)
570 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
571 psSGXDevInitPart2IN->sInitInfo.
573 PVRSRV_HANDLE_TYPE_MEM_INFO);
574 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
576 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
577 psSGXDevInitPart2IN->sInitInfo.
578 hKernelCCBCtlMemInfo,
579 PVRSRV_HANDLE_TYPE_MEM_INFO);
580 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
582 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
583 psSGXDevInitPart2IN->sInitInfo.
584 hKernelCCBEventKickerMemInfo,
585 PVRSRV_HANDLE_TYPE_MEM_INFO);
586 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
588 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
589 psSGXDevInitPart2IN->sInitInfo.
590 hKernelSGXHostCtlMemInfo,
591 PVRSRV_HANDLE_TYPE_MEM_INFO);
592 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
594 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
595 psSGXDevInitPart2IN->sInitInfo.
596 hKernelSGXTA3DCtlMemInfo,
597 PVRSRV_HANDLE_TYPE_MEM_INFO);
598 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
600 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
601 psSGXDevInitPart2IN->sInitInfo.
602 hKernelSGXMiscMemInfo,
603 PVRSRV_HANDLE_TYPE_MEM_INFO);
604 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
606 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
607 psSGXDevInitPart2IN->sInitInfo.
608 hKernelHWPerfCBMemInfo,
609 PVRSRV_HANDLE_TYPE_MEM_INFO);
610 bLookupFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
612 edm_mi = &psSGXDevInitPart2IN->sInitInfo.hKernelEDMStatusBufferMemInfo;
614 eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy,
615 *edm_mi, PVRSRV_HANDLE_TYPE_MEM_INFO);
616 bLookupFailed |= 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);
696 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
698 PVRSRV_HANDLE_TYPE_MEM_INFO);
699 bReleaseFailed |= eError != PVRSRV_OK;
702 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
704 &psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
706 if (*phHandle == NULL)
709 eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
711 PVRSRV_HANDLE_TYPE_MEM_INFO);
712 bReleaseFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
715 if (bReleaseFailed) {
716 PVR_DPF(PVR_DBG_ERROR,
717 "DevInitSGXPart2BW: A handle release failed");
718 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
724 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
725 psSGXDevInitPart2IN->sInitInfo.
727 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
729 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
730 psSGXDevInitPart2IN->sInitInfo.
731 hKernelCCBCtlMemInfo);
732 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
734 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
735 psSGXDevInitPart2IN->sInitInfo.
736 hKernelCCBEventKickerMemInfo);
737 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
739 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
740 psSGXDevInitPart2IN->sInitInfo.
741 hKernelSGXHostCtlMemInfo);
742 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
744 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
745 psSGXDevInitPart2IN->sInitInfo.
746 hKernelSGXTA3DCtlMemInfo);
747 bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
749 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
750 psSGXDevInitPart2IN->sInitInfo.
751 hKernelSGXMiscMemInfo);
752 bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
754 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt,
755 psSGXDevInitPart2IN->sInitInfo.
756 hKernelHWPerfCBMemInfo);
757 bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
760 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, *edm_mi);
761 bDissociateFailed |= eError != PVRSRV_OK;
764 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
766 psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
771 eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, hHandle);
772 bDissociateFailed |= (IMG_BOOL) (eError != PVRSRV_OK);
775 if (bDissociateFailed) {
776 PVRSRVFreeDeviceMemKM(hDevCookieInt,
777 psSGXDevInitPart2IN->sInitInfo.
779 PVRSRVFreeDeviceMemKM(hDevCookieInt,
780 psSGXDevInitPart2IN->sInitInfo.
781 hKernelCCBCtlMemInfo);
782 PVRSRVFreeDeviceMemKM(hDevCookieInt,
783 psSGXDevInitPart2IN->sInitInfo.
784 hKernelSGXHostCtlMemInfo);
785 PVRSRVFreeDeviceMemKM(hDevCookieInt,
786 psSGXDevInitPart2IN->sInitInfo.
787 hKernelSGXTA3DCtlMemInfo);
788 PVRSRVFreeDeviceMemKM(hDevCookieInt,
789 psSGXDevInitPart2IN->sInitInfo.
790 hKernelSGXMiscMemInfo);
792 for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) {
794 psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
799 PVRSRVFreeDeviceMemKM(hDevCookieInt,
800 (struct PVRSRV_KERNEL_MEM_INFO *)
805 PVR_DPF(PVR_DBG_ERROR,
806 "DevInitSGXPart2BW: A dissociate failed");
808 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
814 psRetOUT->eError = DevInitSGXPart2KM(psPerProc, hDevCookieInt,
815 &psSGXDevInitPart2IN->sInitInfo);
820 int SGXRegisterHWRenderContextBW(u32 ui32BridgeID,
821 struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT
822 *psSGXRegHWRenderContextIN,
823 struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT
824 *psSGXRegHWRenderContextOUT,
825 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
828 void *hHWRenderContextInt;
830 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
831 PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT);
833 NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError, psPerProc,
836 psSGXRegHWRenderContextOUT->eError =
837 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
838 psSGXRegHWRenderContextIN->hDevCookie,
839 PVRSRV_HANDLE_TYPE_DEV_NODE);
840 if (psSGXRegHWRenderContextOUT->eError != PVRSRV_OK)
843 hHWRenderContextInt =
844 SGXRegisterHWRenderContextKM(hDevCookieInt,
845 &psSGXRegHWRenderContextIN->sHWRenderContextDevVAddr,
848 if (hHWRenderContextInt == NULL) {
849 psSGXRegHWRenderContextOUT->eError = PVRSRV_ERROR_GENERIC;
853 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
854 &psSGXRegHWRenderContextOUT->hHWRenderContext,
856 PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT,
857 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
859 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError,
865 int SGXUnregisterHWRenderContextBW(u32 ui32BridgeID,
866 struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT
867 *psSGXUnregHWRenderContextIN,
868 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
869 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
871 void *hHWRenderContextInt;
873 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
874 PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT);
877 PVRSRVLookupHandle(psPerProc->psHandleBase,
878 &hHWRenderContextInt,
879 psSGXUnregHWRenderContextIN->hHWRenderContext,
880 PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
881 if (psRetOUT->eError != PVRSRV_OK)
884 psRetOUT->eError = SGXUnregisterHWRenderContextKM(hHWRenderContextInt);
885 if (psRetOUT->eError != PVRSRV_OK)
889 PVRSRVReleaseHandle(psPerProc->psHandleBase,
890 psSGXUnregHWRenderContextIN->hHWRenderContext,
891 PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
896 int SGXRegisterHWTransferContextBW(u32 ui32BridgeID,
897 struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT
898 *psSGXRegHWTransferContextIN,
899 struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT
900 *psSGXRegHWTransferContextOUT,
901 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
904 void *hHWTransferContextInt;
906 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
907 PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT);
909 NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError,
912 psSGXRegHWTransferContextOUT->eError =
913 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
914 psSGXRegHWTransferContextIN->hDevCookie,
915 PVRSRV_HANDLE_TYPE_DEV_NODE);
916 if (psSGXRegHWTransferContextOUT->eError != PVRSRV_OK)
919 hHWTransferContextInt =
920 SGXRegisterHWTransferContextKM(hDevCookieInt,
921 &psSGXRegHWTransferContextIN->
922 sHWTransferContextDevVAddr,
925 if (hHWTransferContextInt == NULL) {
926 psSGXRegHWTransferContextOUT->eError = PVRSRV_ERROR_GENERIC;
930 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
931 &psSGXRegHWTransferContextOUT->hHWTransferContext,
932 hHWTransferContextInt,
933 PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT,
934 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
936 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError,
942 int SGXUnregisterHWTransferContextBW(u32 ui32BridgeID,
943 struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT
944 *psSGXUnregHWTransferContextIN,
945 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
946 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
948 void *hHWTransferContextInt;
950 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
951 PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT);
953 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
954 &hHWTransferContextInt,
955 psSGXUnregHWTransferContextIN->
957 PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
958 if (psRetOUT->eError != PVRSRV_OK)
962 SGXUnregisterHWTransferContextKM(hHWTransferContextInt);
963 if (psRetOUT->eError != PVRSRV_OK)
967 PVRSRVReleaseHandle(psPerProc->psHandleBase,
968 psSGXUnregHWTransferContextIN->
970 PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
975 int SGXFlushHWRenderTargetBW(u32 ui32BridgeID,
976 struct PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET
977 *psSGXFlushHWRenderTargetIN,
978 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
979 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
982 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
983 PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET);
986 PVRSRVLookupHandle(psPerProc->psHandleBase,
988 psSGXFlushHWRenderTargetIN->hDevCookie,
989 PVRSRV_HANDLE_TYPE_DEV_NODE);
990 if (psRetOUT->eError != PVRSRV_OK)
993 SGXFlushHWRenderTargetKM(hDevCookieInt,
994 psSGXFlushHWRenderTargetIN->sHWRTDataSetDevVAddr);
999 static void trace_query_cmd(struct PVRSRV_PER_PROCESS_DATA *proc, int type,
1000 struct PVRSRV_KERNEL_SYNC_INFO *si)
1002 struct pvr_trcmd_syn *ts;
1005 size = si ? sizeof(*ts) : 0;
1008 ts = pvr_trcmd_alloc(type, proc->ui32PID, proc->name, size);
1010 pvr_trcmd_set_syn(ts, si);
1015 int SGX2DQueryBlitsCompleteBW(struct file *filp, u32 ui32BridgeID,
1016 struct PVRSRV_BRIDGE_IN_2DQUERYBLTSCOMPLETE *ps2DQueryBltsCompleteIN,
1017 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1018 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1020 void *hDevCookieInt;
1022 struct PVRSRV_SGXDEV_INFO *psDevInfo;
1023 struct PVRSRV_FILE_PRIVATE_DATA *priv = filp->private_data;
1025 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1026 PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE);
1029 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
1030 ps2DQueryBltsCompleteIN->hDevCookie,
1031 PVRSRV_HANDLE_TYPE_DEV_NODE);
1032 if (psRetOUT->eError != PVRSRV_OK)
1035 if (ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_FLIP ||
1036 ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_UPDATE) {
1039 if (ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_FLIP)
1040 cmd_type = PVR_TRCMD_SGX_QBLT_FLPREQ;
1042 cmd_type = PVR_TRCMD_SGX_QBLT_UPDREQ;
1044 trace_query_cmd(psPerProc, cmd_type, NULL);
1046 if (pvr_flip_event_req(priv,
1047 (long)ps2DQueryBltsCompleteIN->
1049 ps2DQueryBltsCompleteIN->type,
1050 ps2DQueryBltsCompleteIN->user_data))
1051 psRetOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY;
1057 PVRSRVLookupHandle(psPerProc->psHandleBase, &pvSyncInfo,
1058 ps2DQueryBltsCompleteIN->hKernSyncInfo,
1059 PVRSRV_HANDLE_TYPE_SYNC_INFO);
1060 if (psRetOUT->eError != PVRSRV_OK)
1064 (struct PVRSRV_SGXDEV_INFO *)((struct PVRSRV_DEVICE_NODE *)
1065 hDevCookieInt)->pvDevice;
1067 if (ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_EVENT) {
1068 if (pvr_sync_event_req(priv,
1069 (struct PVRSRV_KERNEL_SYNC_INFO *)pvSyncInfo,
1070 ps2DQueryBltsCompleteIN->user_data))
1071 psRetOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY;
1073 trace_query_cmd(psPerProc,
1074 PVR_TRCMD_SGX_QBLT_SYNREQ,
1081 SGX2DQueryBlitsCompleteKM(psDevInfo,
1082 (struct PVRSRV_KERNEL_SYNC_INFO *)
1084 ps2DQueryBltsCompleteIN->type == _PVR_SYNC_WAIT_BLOCK);
1086 trace_query_cmd(psPerProc, PVR_TRCMD_SGX_QBLT_SYNCHK, pvSyncInfo);
1091 int SGXFindSharedPBDescBW(u32 ui32BridgeID,
1092 struct PVRSRV_BRIDGE_IN_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescIN,
1093 struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescOUT,
1094 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1096 void *hDevCookieInt;
1097 struct PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
1098 struct PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
1099 struct PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
1100 struct PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescSubKernelMemInfos = NULL;
1101 u32 ui32SharedPBDescSubKernelMemInfosCount = 0;
1103 void *hSharedPBDesc = NULL;
1105 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1106 PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC);
1108 NEW_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError, psPerProc,
1109 PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS
1112 psSGXFindSharedPBDescOUT->hSharedPBDesc = NULL;
1114 psSGXFindSharedPBDescOUT->eError =
1115 PVRSRVLookupHandle(psPerProc->psHandleBase,
1117 psSGXFindSharedPBDescIN->hDevCookie,
1118 PVRSRV_HANDLE_TYPE_DEV_NODE);
1119 if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
1120 goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
1122 psSGXFindSharedPBDescOUT->eError =
1123 SGXFindSharedPBDescKM(psPerProc, hDevCookieInt,
1124 psSGXFindSharedPBDescIN->bLockOnFailure,
1125 psSGXFindSharedPBDescIN->ui32TotalPBSize,
1127 &psSharedPBDescKernelMemInfo,
1128 &psHWPBDescKernelMemInfo,
1129 &psBlockKernelMemInfo,
1130 &ppsSharedPBDescSubKernelMemInfos,
1131 &ui32SharedPBDescSubKernelMemInfosCount);
1132 if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
1133 goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
1135 PVR_ASSERT(ui32SharedPBDescSubKernelMemInfosCount <=
1136 PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
1138 psSGXFindSharedPBDescOUT->ui32SharedPBDescSubKernelMemInfoHandlesCount =
1139 ui32SharedPBDescSubKernelMemInfosCount;
1141 if (hSharedPBDesc == NULL) {
1142 psSGXFindSharedPBDescOUT->hSharedPBDescKernelMemInfoHandle =
1145 goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
1148 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1149 &psSGXFindSharedPBDescOUT->hSharedPBDesc,
1151 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
1152 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
1154 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1155 &psSGXFindSharedPBDescOUT->
1156 hSharedPBDescKernelMemInfoHandle,
1157 psSharedPBDescKernelMemInfo,
1158 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1159 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1160 psSGXFindSharedPBDescOUT->hSharedPBDesc);
1162 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1163 &psSGXFindSharedPBDescOUT->
1164 hHWPBDescKernelMemInfoHandle,
1165 psHWPBDescKernelMemInfo,
1166 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1167 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1168 psSGXFindSharedPBDescOUT->hSharedPBDesc);
1170 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1171 &psSGXFindSharedPBDescOUT->
1172 hBlockKernelMemInfoHandle,
1173 psBlockKernelMemInfo,
1174 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1175 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1176 psSGXFindSharedPBDescOUT->hSharedPBDesc);
1178 for (i = 0; i < ui32SharedPBDescSubKernelMemInfosCount; i++) {
1179 struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC
1180 *psSGXFindSharedPBDescOut = psSGXFindSharedPBDescOUT;
1182 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1183 &psSGXFindSharedPBDescOut->
1184 ahSharedPBDescSubKernelMemInfoHandles[i],
1185 ppsSharedPBDescSubKernelMemInfos[i],
1186 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
1187 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1188 psSGXFindSharedPBDescOUT->
1189 hSharedPBDescKernelMemInfoHandle);
1192 PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT:
1193 if (ppsSharedPBDescSubKernelMemInfos != NULL)
1194 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
1195 sizeof(struct PVRSRV_KERNEL_MEM_INFO *) *
1196 ui32SharedPBDescSubKernelMemInfosCount,
1197 ppsSharedPBDescSubKernelMemInfos, NULL);
1199 if (psSGXFindSharedPBDescOUT->eError != PVRSRV_OK) {
1200 if (hSharedPBDesc != NULL)
1201 SGXUnrefSharedPBDescKM(hSharedPBDesc);
1203 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError,
1209 int SGXUnrefSharedPBDescBW(u32 ui32BridgeID,
1210 struct PVRSRV_BRIDGE_IN_SGXUNREFSHAREDPBDESC *psSGXUnrefSharedPBDescIN,
1211 struct PVRSRV_BRIDGE_OUT_SGXUNREFSHAREDPBDESC
1212 *psSGXUnrefSharedPBDescOUT,
1213 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1215 void *hSharedPBDesc;
1217 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1218 PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC);
1220 psSGXUnrefSharedPBDescOUT->eError =
1221 PVRSRVLookupHandle(psPerProc->psHandleBase,
1223 psSGXUnrefSharedPBDescIN->hSharedPBDesc,
1224 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
1225 if (psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
1228 psSGXUnrefSharedPBDescOUT->eError =
1229 SGXUnrefSharedPBDescKM(hSharedPBDesc);
1231 if (psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
1234 psSGXUnrefSharedPBDescOUT->eError =
1235 PVRSRVReleaseHandle(psPerProc->psHandleBase,
1236 psSGXUnrefSharedPBDescIN->hSharedPBDesc,
1237 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
1242 int SGXAddSharedPBDescBW(u32 ui32BridgeID,
1243 struct PVRSRV_BRIDGE_IN_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescIN,
1244 struct PVRSRV_BRIDGE_OUT_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescOUT,
1245 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1247 void *hDevCookieInt;
1248 struct PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
1249 struct PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
1250 struct PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
1251 u32 ui32KernelMemInfoHandlesCount =
1252 psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount;
1254 void **phKernelMemInfoHandles = NULL;
1255 struct PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfos = NULL;
1257 enum PVRSRV_ERROR eError;
1258 void *hSharedPBDesc = NULL;
1260 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1261 PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC);
1263 NEW_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError, psPerProc,
1266 psSGXAddSharedPBDescOUT->hSharedPBDesc = NULL;
1268 PVR_ASSERT(ui32KernelMemInfoHandlesCount <=
1269 PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
1271 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1273 psSGXAddSharedPBDescIN->hDevCookie,
1274 PVRSRV_HANDLE_TYPE_DEV_NODE);
1275 if (eError != PVRSRV_OK)
1276 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1278 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1279 (void **)&psSharedPBDescKernelMemInfo,
1280 psSGXAddSharedPBDescIN->
1281 hSharedPBDescKernelMemInfo,
1282 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1283 if (eError != PVRSRV_OK)
1284 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1286 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1287 (void **)&psHWPBDescKernelMemInfo,
1288 psSGXAddSharedPBDescIN->
1289 hHWPBDescKernelMemInfo,
1290 PVRSRV_HANDLE_TYPE_MEM_INFO);
1291 if (eError != PVRSRV_OK)
1292 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1294 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1295 (void **)&psBlockKernelMemInfo,
1296 psSGXAddSharedPBDescIN->hBlockKernelMemInfo,
1297 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1298 if (eError != PVRSRV_OK)
1299 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1301 if (!OSAccessOK(PVR_VERIFY_READ,
1302 psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
1303 ui32KernelMemInfoHandlesCount * sizeof(void *))) {
1304 PVR_DPF(PVR_DBG_ERROR, "%s: PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC:"
1305 " Invalid phKernelMemInfos pointer", __func__);
1307 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1310 eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1311 ui32KernelMemInfoHandlesCount * sizeof(void *),
1312 (void **)&phKernelMemInfoHandles, NULL);
1313 if (eError != PVRSRV_OK)
1314 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1316 if (CopyFromUserWrapper(psPerProc,
1318 phKernelMemInfoHandles,
1319 psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
1320 ui32KernelMemInfoHandlesCount * sizeof(void *))
1323 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1326 eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1327 ui32KernelMemInfoHandlesCount *
1328 sizeof(struct PVRSRV_KERNEL_MEM_INFO *),
1329 (void **)&ppsKernelMemInfos, NULL);
1330 if (eError != PVRSRV_OK)
1331 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1333 for (i = 0; i < ui32KernelMemInfoHandlesCount; i++) {
1334 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1335 (void **)&ppsKernelMemInfos[i],
1336 phKernelMemInfoHandles[i],
1337 PVRSRV_HANDLE_TYPE_MEM_INFO);
1338 if (eError != PVRSRV_OK)
1339 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1342 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1343 psSGXAddSharedPBDescIN->
1344 hSharedPBDescKernelMemInfo,
1345 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1346 PVR_ASSERT(eError == PVRSRV_OK);
1348 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1349 psSGXAddSharedPBDescIN->
1350 hHWPBDescKernelMemInfo,
1351 PVRSRV_HANDLE_TYPE_MEM_INFO);
1352 PVR_ASSERT(eError == PVRSRV_OK);
1354 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1355 psSGXAddSharedPBDescIN->
1356 hBlockKernelMemInfo,
1357 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
1358 PVR_ASSERT(eError == PVRSRV_OK);
1360 for (i = 0; i < ui32KernelMemInfoHandlesCount; i++) {
1361 eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
1362 phKernelMemInfoHandles[i],
1363 PVRSRV_HANDLE_TYPE_MEM_INFO);
1364 PVR_ASSERT(eError == PVRSRV_OK);
1367 eError = SGXAddSharedPBDescKM(psPerProc, hDevCookieInt,
1368 psSharedPBDescKernelMemInfo,
1369 psHWPBDescKernelMemInfo,
1370 psBlockKernelMemInfo,
1371 psSGXAddSharedPBDescIN->ui32TotalPBSize,
1374 ui32KernelMemInfoHandlesCount);
1376 if (eError != PVRSRV_OK)
1377 goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
1379 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1380 &psSGXAddSharedPBDescOUT->hSharedPBDesc,
1382 PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
1383 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
1385 PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT:
1387 if (phKernelMemInfoHandles)
1388 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
1389 psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount
1391 (void *)phKernelMemInfoHandles, NULL);
1392 if (ppsKernelMemInfos)
1393 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
1394 psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount
1395 * sizeof(struct PVRSRV_KERNEL_MEM_INFO *),
1396 (void *)ppsKernelMemInfos, NULL);
1398 if (ret == 0 && eError == PVRSRV_OK)
1399 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError,
1402 psSGXAddSharedPBDescOUT->eError = eError;
1407 int SGXGetInfoForSrvinitBW(u32 ui32BridgeID,
1408 struct PVRSRV_BRIDGE_IN_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitIN,
1409 struct PVRSRV_BRIDGE_OUT_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitOUT,
1410 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1412 void *hDevCookieInt;
1414 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1415 PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT);
1417 NEW_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc,
1418 PVRSRV_MAX_CLIENT_HEAPS);
1420 if (!psPerProc->bInitProcess) {
1421 psSGXInfoForSrvinitOUT->eError = PVRSRV_ERROR_GENERIC;
1425 psSGXInfoForSrvinitOUT->eError =
1426 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
1427 psSGXInfoForSrvinitIN->hDevCookie,
1428 PVRSRV_HANDLE_TYPE_DEV_NODE);
1430 if (psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
1433 psSGXInfoForSrvinitOUT->eError =
1434 SGXGetInfoForSrvinitKM(hDevCookieInt,
1435 &psSGXInfoForSrvinitOUT->sInitInfo);
1437 if (psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
1440 for (i = 0; i < PVRSRV_MAX_CLIENT_HEAPS; i++) {
1441 struct PVRSRV_HEAP_INFO *psHeapInfo;
1443 psHeapInfo = &psSGXInfoForSrvinitOUT->sInitInfo.asHeapInfo[i];
1445 if (psHeapInfo->ui32HeapID != (u32)SGX_UNDEFINED_HEAP_ID) {
1446 void *hDevMemHeapExt;
1448 if (psHeapInfo->hDevMemHeap != NULL) {
1450 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1452 psHeapInfo->hDevMemHeap,
1453 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
1454 PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
1455 psHeapInfo->hDevMemHeap = hDevMemHeapExt;
1460 COMMIT_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc);
1466 static void DumpBufferArray(struct PVRSRV_PER_PROCESS_DATA *psPerProc,
1467 struct SGX_KICKTA_DUMP_BUFFER *psBufferArray,
1468 u32 ui32BufferArrayLength, IMG_BOOL bDumpPolls)
1472 for (i = 0; i < ui32BufferArrayLength; i++) {
1473 struct SGX_KICKTA_DUMP_BUFFER *psBuffer;
1474 struct PVRSRV_KERNEL_MEM_INFO *psCtrlMemInfoKM;
1479 psBuffer = &psBufferArray[i];
1480 pszName = psBuffer->pszName;
1482 pszName = "Nameless buffer";
1485 MAKEUNIQUETAG((struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1489 ((struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1490 hKernelMemInfo)->psKernelSyncInfo->psSyncDataMemInfoKM;
1492 offsetof(struct PVRSRV_SYNC_DATA, ui32ReadOpsComplete);
1494 if (psBuffer->ui32Start <= psBuffer->ui32End) {
1496 PDUMPCOMMENTWITHFLAGS(0,
1497 "Wait for %s space\r\n",
1499 PDUMPCBP(psCtrlMemInfoKM, ui32Offset,
1500 psBuffer->ui32Start,
1501 psBuffer->ui32SpaceUsed,
1502 psBuffer->ui32BufferSize,
1503 MAKEUNIQUETAG(psCtrlMemInfoKM));
1506 PDUMPCOMMENTWITHFLAGS(0, "%s\r\n", pszName);
1507 PDUMPMEMUM(NULL, psBuffer->pvLinAddr,
1508 (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1510 psBuffer->ui32Start,
1511 psBuffer->ui32End - psBuffer->ui32Start, 0,
1516 PDUMPCOMMENTWITHFLAGS(0,
1517 "Wait for %s space\r\n",
1519 PDUMPCBP(psCtrlMemInfoKM, ui32Offset,
1520 psBuffer->ui32Start,
1521 psBuffer->ui32BackEndLength,
1522 psBuffer->ui32BufferSize,
1523 MAKEUNIQUETAG(psCtrlMemInfoKM));
1525 PDUMPCOMMENTWITHFLAGS(0, "%s (part 1)\r\n", pszName);
1526 PDUMPMEMUM(NULL, psBuffer->pvLinAddr,
1527 (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1529 psBuffer->ui32Start,
1530 psBuffer->ui32BackEndLength, 0, hUniqueTag);
1533 PDUMPMEMPOL(psCtrlMemInfoKM, ui32Offset,
1535 PDUMP_POLL_OPERATOR_NOTEQUAL,
1536 MAKEUNIQUETAG(psCtrlMemInfoKM));
1538 PDUMPCOMMENTWITHFLAGS(0,
1539 "Wait for %s space\r\n",
1541 PDUMPCBP(psCtrlMemInfoKM, ui32Offset, 0,
1543 psBuffer->ui32BufferSize,
1544 MAKEUNIQUETAG(psCtrlMemInfoKM));
1546 PDUMPCOMMENTWITHFLAGS(0, "%s (part 2)\r\n", pszName);
1547 PDUMPMEMUM(NULL, psBuffer->pvLinAddr,
1548 (struct PVRSRV_KERNEL_MEM_INFO *)psBuffer->
1550 0, psBuffer->ui32End, 0, hUniqueTag);
1555 int SGXPDumpBufferArrayBW(u32 ui32BridgeID,
1556 struct PVRSRV_BRIDGE_IN_PDUMP_BUFFER_ARRAY *psPDumpBufferArrayIN,
1557 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1560 struct SGX_KICKTA_DUMP_BUFFER *psKickTADumpBuffer;
1561 u32 ui32BufferArrayLength = psPDumpBufferArrayIN->ui32BufferArrayLength;
1562 u32 ui32BufferArraySize =
1563 ui32BufferArrayLength * sizeof(struct SGX_KICKTA_DUMP_BUFFER);
1564 enum PVRSRV_ERROR eError = PVRSRV_ERROR_GENERIC;
1566 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1568 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1569 PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY);
1571 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
1572 (void **)&psKickTADumpBuffer, NULL) != PVRSRV_OK)
1575 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, psKickTADumpBuffer,
1576 psPDumpBufferArrayIN->psBufferArray,
1577 ui32BufferArraySize) != PVRSRV_OK) {
1578 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
1579 psKickTADumpBuffer, NULL);
1583 for (i = 0; i < ui32BufferArrayLength; i++) {
1586 eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1588 psKickTADumpBuffer[i].
1590 PVRSRV_HANDLE_TYPE_MEM_INFO);
1592 if (eError != PVRSRV_OK) {
1593 PVR_DPF(PVR_DBG_ERROR,
1594 "PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY: "
1595 "PVRSRVLookupHandle failed (%d)", eError);
1598 psKickTADumpBuffer[i].hKernelMemInfo = pvMemInfo;
1602 if (eError == PVRSRV_OK)
1603 DumpBufferArray(psPerProc, psKickTADumpBuffer,
1604 ui32BufferArrayLength,
1605 psPDumpBufferArrayIN->bDumpPolls);
1607 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize,
1608 psKickTADumpBuffer, NULL);
1613 int SGXPDump3DSignatureRegistersBW(u32 ui32BridgeID,
1614 struct PVRSRV_BRIDGE_IN_PDUMP_3D_SIGNATURE_REGISTERS
1615 *psPDump3DSignatureRegistersIN,
1616 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1618 u32 ui32RegisterArraySize =
1619 psPDump3DSignatureRegistersIN->ui32NumRegisters * sizeof(u32);
1620 u32 *pui32Registers = NULL;
1623 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1625 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1626 PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS);
1628 if (ui32RegisterArraySize == 0)
1631 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1632 ui32RegisterArraySize,
1633 (void **)&pui32Registers, NULL) != PVRSRV_OK) {
1634 PVR_DPF(PVR_DBG_ERROR,
1635 "PDump3DSignatureRegistersBW: OSAllocMem failed");
1639 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
1640 psPDump3DSignatureRegistersIN->pui32Registers,
1641 ui32RegisterArraySize) != PVRSRV_OK) {
1642 PVR_DPF(PVR_DBG_ERROR, "PDump3DSignatureRegistersBW: "
1643 "CopyFromUserWrapper failed");
1647 PDump3DSignatureRegisters(psPDump3DSignatureRegistersIN->
1650 psPDump3DSignatureRegistersIN->
1656 if (pui32Registers != NULL)
1657 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1658 pui32Registers, NULL);
1663 int SGXPDumpCounterRegistersBW(u32 ui32BridgeID,
1664 struct PVRSRV_BRIDGE_IN_PDUMP_COUNTER_REGISTERS
1665 *psPDumpCounterRegistersIN,
1666 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1668 u32 ui32RegisterArraySize =
1669 psPDumpCounterRegistersIN->ui32NumRegisters * sizeof(u32);
1670 u32 *pui32Registers = NULL;
1673 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1675 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1676 PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS);
1678 if (ui32RegisterArraySize == 0)
1681 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1682 (void **)&pui32Registers, NULL) != PVRSRV_OK) {
1683 PVR_DPF(PVR_DBG_ERROR,
1684 "PDumpCounterRegistersBW: OSAllocMem failed");
1689 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
1690 psPDumpCounterRegistersIN->pui32Registers,
1691 ui32RegisterArraySize) != PVRSRV_OK) {
1692 PVR_DPF(PVR_DBG_ERROR,
1693 "PDumpCounterRegistersBW: CopyFromUserWrapper failed");
1697 PDumpCounterRegisters(psPDumpCounterRegistersIN->ui32DumpFrameNum,
1699 psPDumpCounterRegistersIN->ui32NumRegisters);
1704 if (pui32Registers != NULL)
1705 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1706 pui32Registers, NULL);
1711 int SGXPDumpTASignatureRegistersBW(u32 ui32BridgeID,
1712 struct PVRSRV_BRIDGE_IN_PDUMP_TA_SIGNATURE_REGISTERS
1713 *psPDumpTASignatureRegistersIN,
1714 void *psBridgeOut, struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1716 u32 ui32RegisterArraySize =
1717 psPDumpTASignatureRegistersIN->ui32NumRegisters * sizeof(u32);
1718 u32 *pui32Registers = NULL;
1721 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
1723 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1724 PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS);
1726 if (ui32RegisterArraySize == 0)
1729 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1730 ui32RegisterArraySize,
1731 (void **)&pui32Registers, NULL) != PVRSRV_OK) {
1732 PVR_DPF(PVR_DBG_ERROR,
1733 "PDumpTASignatureRegistersBW: OSAllocMem failed");
1738 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, pui32Registers,
1739 psPDumpTASignatureRegistersIN->pui32Registers,
1740 ui32RegisterArraySize) != PVRSRV_OK) {
1741 PVR_DPF(PVR_DBG_ERROR, "PDumpTASignatureRegistersBW: "
1742 "CopyFromUserWrapper failed");
1746 PDumpTASignatureRegisters(psPDumpTASignatureRegistersIN->
1748 psPDumpTASignatureRegistersIN->
1751 psPDumpTASignatureRegistersIN->
1757 if (pui32Registers != NULL)
1758 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize,
1759 pui32Registers, NULL);
1764 int SGXPDumpHWPerfCBBW(u32 ui32BridgeID,
1765 struct PVRSRV_BRIDGE_IN_PDUMP_HWPERFCB *psPDumpHWPerfCBIN,
1766 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1767 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1769 struct PVRSRV_SGXDEV_INFO *psDevInfo;
1770 void *hDevCookieInt;
1772 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1773 PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB);
1776 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
1777 psPDumpHWPerfCBIN->hDevCookie,
1778 PVRSRV_HANDLE_TYPE_DEV_NODE);
1779 if (psRetOUT->eError != PVRSRV_OK)
1782 psDevInfo = ((struct PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice;
1784 PDumpHWPerfCBKM(&psPDumpHWPerfCBIN->szFileName[0],
1785 psPDumpHWPerfCBIN->ui32FileOffset,
1786 psDevInfo->psKernelHWPerfCBMemInfo->sDevVAddr,
1787 psDevInfo->psKernelHWPerfCBMemInfo->ui32AllocSize,
1788 psPDumpHWPerfCBIN->ui32PDumpFlags);
1795 void SetSGXDispatchTableEntry(void)
1798 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETCLIENTINFO,
1799 SGXGetClientInfoBW);
1800 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO,
1801 SGXReleaseClientInfoBW);
1802 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO,
1803 SGXGetInternalDevInfoBW);
1804 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_DOKICK, SGXDoKickBW);
1805 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETPHYSPAGEADDR, DummyBW);
1806 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READREGISTRYDWORD, DummyBW);
1807 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SCHEDULECOMMAND, DummyBW);
1809 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE,
1810 SGX2DQueryBlitsCompleteBW);
1812 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETMMUPDADDR, DummyBW);
1814 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SUBMITTRANSFER,
1815 SGXSubmitTransferBW);
1816 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETMISCINFO, SGXGetMiscInfoBW);
1817 SetDispatchTableEntry(PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT,
1818 SGXGetInfoForSrvinitBW);
1819 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_DEVINITPART2,
1822 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC,
1823 SGXFindSharedPBDescBW);
1824 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC,
1825 SGXUnrefSharedPBDescBW);
1826 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC,
1827 SGXAddSharedPBDescBW);
1828 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT,
1829 SGXRegisterHWRenderContextBW);
1830 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET,
1831 SGXFlushHWRenderTargetBW);
1832 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT,
1833 SGXUnregisterHWRenderContextBW);
1834 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT,
1835 SGXRegisterHWTransferContextBW);
1836 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT,
1837 SGXUnregisterHWTransferContextBW);
1839 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS,
1840 SGXReadDiffCountersBW);
1841 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READ_HWPERF_CB,
1844 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES,
1845 SGXScheduleProcessQueuesBW);
1848 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY,
1849 SGXPDumpBufferArrayBW);
1850 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS,
1851 SGXPDump3DSignatureRegistersBW);
1852 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS,
1853 SGXPDumpCounterRegistersBW);
1854 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS,
1855 SGXPDumpTASignatureRegistersBW);
1856 SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB,
1857 SGXPDumpHWPerfCBBW);