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 ******************************************************************************/
31 #include "pvr_bridge_km.h"
32 #include "pvr_debug.h"
34 #include "pvr_bridge.h"
35 #include "sgx_bridge.h"
38 #include "buffer_manager.h"
40 #include "pvr_pdump.h"
41 #include "syscommon.h"
43 #include "bridged_pvr_bridge.h"
44 #include "bridged_sgx_bridge.h"
49 #include <linux/kernel.h>
50 #include <linux/pagemap.h> /* for cache flush */
52 #include <linux/sched.h>
54 struct PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY
55 g_BridgeDispatchTable[BRIDGE_DISPATCH_TABLE_ENTRY_COUNT];
57 #if defined(DEBUG_BRIDGE_KM)
58 struct PVRSRV_BRIDGE_GLOBAL_STATS g_BridgeGlobalStats;
61 static IMG_BOOL abSharedDeviceMemHeap[PVRSRV_MAX_CLIENT_HEAPS];
62 static IMG_BOOL *pbSharedDeviceMemHeap = abSharedDeviceMemHeap;
64 #if defined(DEBUG_BRIDGE_KM)
66 CopyFromUserWrapper(struct PVRSRV_PER_PROCESS_DATA *pProcData,
67 u32 ui32BridgeID, void *pvDest, void __user *pvSrc,
70 g_BridgeDispatchTable[ui32BridgeID].ui32CopyFromUserTotalBytes +=
72 g_BridgeGlobalStats.ui32TotalCopyFromUserBytes += ui32Size;
73 return OSCopyFromUser(pProcData, pvDest, pvSrc, ui32Size);
76 enum PVRSRV_ERROR CopyToUserWrapper(struct PVRSRV_PER_PROCESS_DATA *pProcData,
77 u32 ui32BridgeID, void __user *pvDest, void *pvSrc,
80 g_BridgeDispatchTable[ui32BridgeID].ui32CopyToUserTotalBytes +=
82 g_BridgeGlobalStats.ui32TotalCopyToUserBytes += ui32Size;
83 return OSCopyToUser(pProcData, pvDest, pvSrc, ui32Size);
87 static int PVRSRVEnumerateDevicesBW(u32 ui32BridgeID, void *psBridgeIn,
88 struct PVRSRV_BRIDGE_OUT_ENUMDEVICE *psEnumDeviceOUT,
89 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
91 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_ENUM_DEVICES);
93 PVR_UNREFERENCED_PARAMETER(psPerProc);
94 PVR_UNREFERENCED_PARAMETER(psBridgeIn);
96 psEnumDeviceOUT->eError =
97 PVRSRVEnumerateDevicesKM(&psEnumDeviceOUT->ui32NumDevices,
98 psEnumDeviceOUT->asDeviceIdentifier);
103 static int PVRSRVAcquireDeviceDataBW(u32 ui32BridgeID,
104 struct PVRSRV_BRIDGE_IN_ACQUIRE_DEVICEINFO *psAcquireDevInfoIN,
105 struct PVRSRV_BRIDGE_OUT_ACQUIRE_DEVICEINFO *psAcquireDevInfoOUT,
106 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
110 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
111 PVRSRV_BRIDGE_ACQUIRE_DEVICEINFO);
113 psAcquireDevInfoOUT->eError =
114 PVRSRVAcquireDeviceDataKM(psAcquireDevInfoIN->uiDevIndex,
115 psAcquireDevInfoIN->eDeviceType,
117 if (psAcquireDevInfoOUT->eError != PVRSRV_OK)
120 psAcquireDevInfoOUT->eError = PVRSRVAllocHandle(psPerProc->psHandleBase,
121 &psAcquireDevInfoOUT->hDevCookie,
123 PVRSRV_HANDLE_TYPE_DEV_NODE,
124 PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
129 static int PVRSRVCreateDeviceMemContextBW(u32 ui32BridgeID,
130 struct PVRSRV_BRIDGE_IN_CREATE_DEVMEMCONTEXT *psCreateDevMemContextIN,
131 struct PVRSRV_BRIDGE_OUT_CREATE_DEVMEMCONTEXT *psCreateDevMemContextOUT,
132 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
135 void *hDevMemContextInt;
139 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
140 PVRSRV_BRIDGE_CREATE_DEVMEMCONTEXT);
142 NEW_HANDLE_BATCH_OR_ERROR(psCreateDevMemContextOUT->eError, psPerProc,
143 PVRSRV_MAX_CLIENT_HEAPS + 1);
145 psCreateDevMemContextOUT->eError = PVRSRVLookupHandle(
146 psPerProc->psHandleBase, &hDevCookieInt,
147 psCreateDevMemContextIN->hDevCookie,
148 PVRSRV_HANDLE_TYPE_DEV_NODE);
150 if (psCreateDevMemContextOUT->eError != PVRSRV_OK)
153 psCreateDevMemContextOUT->eError = PVRSRVCreateDeviceMemContextKM(
154 hDevCookieInt, psPerProc,
156 &psCreateDevMemContextOUT->ui32ClientHeapCount,
157 &psCreateDevMemContextOUT->sHeapInfo[0],
158 &bCreated, pbSharedDeviceMemHeap);
160 if (psCreateDevMemContextOUT->eError != PVRSRV_OK)
164 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
165 &psCreateDevMemContextOUT->hDevMemContext,
167 PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT,
168 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
170 psCreateDevMemContextOUT->eError =
171 PVRSRVFindHandle(psPerProc->psHandleBase,
172 &psCreateDevMemContextOUT->hDevMemContext,
174 PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
175 if (psCreateDevMemContextOUT->eError != PVRSRV_OK)
179 for (i = 0; i < psCreateDevMemContextOUT->ui32ClientHeapCount; i++) {
180 void *hDevMemHeapExt;
182 if (abSharedDeviceMemHeap[i]) {
183 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
185 psCreateDevMemContextOUT->
186 sHeapInfo[i].hDevMemHeap,
187 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
188 PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
191 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
193 psCreateDevMemContextOUT->sHeapInfo[i].
195 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
196 PVRSRV_HANDLE_ALLOC_FLAG_NONE,
197 psCreateDevMemContextOUT->
200 psCreateDevMemContextOUT->eError =
202 psPerProc->psHandleBase,
204 psCreateDevMemContextOUT->
205 sHeapInfo[i].hDevMemHeap,
206 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP);
207 if (psCreateDevMemContextOUT->eError !=
212 psCreateDevMemContextOUT->sHeapInfo[i].hDevMemHeap =
216 COMMIT_HANDLE_BATCH_OR_ERROR(psCreateDevMemContextOUT->eError,
222 static int PVRSRVDestroyDeviceMemContextBW(u32 ui32BridgeID,
223 struct PVRSRV_BRIDGE_IN_DESTROY_DEVMEMCONTEXT *psDestroyDevMemContextIN,
224 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
225 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
228 void *hDevMemContextInt;
231 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
232 PVRSRV_BRIDGE_DESTROY_DEVMEMCONTEXT);
234 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
236 psDestroyDevMemContextIN->hDevCookie,
237 PVRSRV_HANDLE_TYPE_DEV_NODE);
239 if (psRetOUT->eError != PVRSRV_OK)
242 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
244 psDestroyDevMemContextIN->hDevMemContext,
245 PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
247 if (psRetOUT->eError != PVRSRV_OK)
250 psRetOUT->eError = PVRSRVDestroyDeviceMemContextKM(hDevCookieInt,
251 hDevMemContextInt, &bDestroyed);
253 if (psRetOUT->eError != PVRSRV_OK)
257 psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
258 psDestroyDevMemContextIN->
260 PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
265 static int PVRSRVGetDeviceMemHeapInfoBW(u32 ui32BridgeID,
266 struct PVRSRV_BRIDGE_IN_GET_DEVMEM_HEAPINFO *psGetDevMemHeapInfoIN,
267 struct PVRSRV_BRIDGE_OUT_GET_DEVMEM_HEAPINFO *psGetDevMemHeapInfoOUT,
268 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
271 void *hDevMemContextInt;
274 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
275 PVRSRV_BRIDGE_GET_DEVMEM_HEAPINFO);
277 NEW_HANDLE_BATCH_OR_ERROR(psGetDevMemHeapInfoOUT->eError, psPerProc,
278 PVRSRV_MAX_CLIENT_HEAPS);
280 psGetDevMemHeapInfoOUT->eError =
281 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
282 psGetDevMemHeapInfoIN->hDevCookie,
283 PVRSRV_HANDLE_TYPE_DEV_NODE);
285 if (psGetDevMemHeapInfoOUT->eError != PVRSRV_OK)
288 psGetDevMemHeapInfoOUT->eError =
289 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevMemContextInt,
290 psGetDevMemHeapInfoIN->hDevMemContext,
291 PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
293 if (psGetDevMemHeapInfoOUT->eError != PVRSRV_OK)
296 psGetDevMemHeapInfoOUT->eError =
297 PVRSRVGetDeviceMemHeapInfoKM(hDevCookieInt,
299 &psGetDevMemHeapInfoOUT->ui32ClientHeapCount,
300 &psGetDevMemHeapInfoOUT->sHeapInfo[0],
301 pbSharedDeviceMemHeap);
303 if (psGetDevMemHeapInfoOUT->eError != PVRSRV_OK)
306 for (i = 0; i < psGetDevMemHeapInfoOUT->ui32ClientHeapCount; i++) {
307 void *hDevMemHeapExt;
308 if (abSharedDeviceMemHeap[i]) {
309 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
311 psGetDevMemHeapInfoOUT->sHeapInfo[i].hDevMemHeap,
312 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
313 PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
315 psGetDevMemHeapInfoOUT->eError =
316 PVRSRVFindHandle(psPerProc->psHandleBase,
318 psGetDevMemHeapInfoOUT->
319 sHeapInfo[i].hDevMemHeap,
320 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP);
321 if (psGetDevMemHeapInfoOUT->eError != PVRSRV_OK)
324 psGetDevMemHeapInfoOUT->sHeapInfo[i].hDevMemHeap =
328 COMMIT_HANDLE_BATCH_OR_ERROR(psGetDevMemHeapInfoOUT->eError, psPerProc);
333 static int PVRSRVAllocDeviceMemBW(u32 ui32BridgeID,
334 struct PVRSRV_BRIDGE_IN_ALLOCDEVICEMEM *psAllocDeviceMemIN,
335 struct PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM *psAllocDeviceMemOUT,
336 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
338 struct PVRSRV_KERNEL_MEM_INFO *psMemInfo;
340 void *hDevMemHeapInt;
342 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_ALLOC_DEVICEMEM);
344 NEW_HANDLE_BATCH_OR_ERROR(psAllocDeviceMemOUT->eError, psPerProc, 2);
346 psAllocDeviceMemOUT->eError =
347 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
348 psAllocDeviceMemIN->hDevCookie,
349 PVRSRV_HANDLE_TYPE_DEV_NODE);
351 if (psAllocDeviceMemOUT->eError != PVRSRV_OK)
354 psAllocDeviceMemOUT->eError =
355 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevMemHeapInt,
356 psAllocDeviceMemIN->hDevMemHeap,
357 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP);
359 if (psAllocDeviceMemOUT->eError != PVRSRV_OK)
362 psAllocDeviceMemOUT->eError =
363 PVRSRVAllocDeviceMemKM(hDevCookieInt, psPerProc, hDevMemHeapInt,
364 psAllocDeviceMemIN->ui32Attribs,
365 psAllocDeviceMemIN->ui32Size,
366 psAllocDeviceMemIN->ui32Alignment,
369 if (psAllocDeviceMemOUT->eError != PVRSRV_OK)
372 OSMemSet(&psAllocDeviceMemOUT->sClientMemInfo, 0,
373 sizeof(psAllocDeviceMemOUT->sClientMemInfo));
375 psAllocDeviceMemOUT->sClientMemInfo.pvLinAddrKM =
376 psMemInfo->pvLinAddrKM;
378 psAllocDeviceMemOUT->sClientMemInfo.pvLinAddr = NULL;
379 psAllocDeviceMemOUT->sClientMemInfo.sDevVAddr = psMemInfo->sDevVAddr;
380 psAllocDeviceMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags;
381 psAllocDeviceMemOUT->sClientMemInfo.ui32AllocSize =
382 psMemInfo->ui32AllocSize;
383 psAllocDeviceMemOUT->sClientMemInfo.hMappingInfo =
384 psMemInfo->sMemBlk.hOSMemHandle;
386 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
387 &psAllocDeviceMemOUT->sClientMemInfo.hKernelMemInfo,
389 PVRSRV_HANDLE_TYPE_MEM_INFO,
390 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
392 if (psAllocDeviceMemIN->ui32Attribs & PVRSRV_MEM_NO_SYNCOBJ) {
393 OSMemSet(&psAllocDeviceMemOUT->sClientSyncInfo, 0,
394 sizeof(struct PVRSRV_CLIENT_SYNC_INFO));
395 psAllocDeviceMemOUT->sClientMemInfo.psClientSyncInfo = NULL;
396 psAllocDeviceMemOUT->psKernelSyncInfo = NULL;
399 psAllocDeviceMemOUT->psKernelSyncInfo =
400 psMemInfo->psKernelSyncInfo;
402 psAllocDeviceMemOUT->sClientSyncInfo.psSyncData =
403 psMemInfo->psKernelSyncInfo->psSyncData;
404 psAllocDeviceMemOUT->sClientSyncInfo.sWriteOpsCompleteDevVAddr =
405 psMemInfo->psKernelSyncInfo->sWriteOpsCompleteDevVAddr;
406 psAllocDeviceMemOUT->sClientSyncInfo.sReadOpsCompleteDevVAddr =
407 psMemInfo->psKernelSyncInfo->sReadOpsCompleteDevVAddr;
409 psAllocDeviceMemOUT->sClientSyncInfo.hMappingInfo =
410 psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.
413 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
414 &psAllocDeviceMemOUT->sClientSyncInfo.
416 psMemInfo->psKernelSyncInfo,
417 PVRSRV_HANDLE_TYPE_SYNC_INFO,
418 PVRSRV_HANDLE_ALLOC_FLAG_NONE,
419 psAllocDeviceMemOUT->sClientMemInfo.
422 psAllocDeviceMemOUT->sClientMemInfo.psClientSyncInfo =
423 &psAllocDeviceMemOUT->sClientSyncInfo;
427 COMMIT_HANDLE_BATCH_OR_ERROR(psAllocDeviceMemOUT->eError, psPerProc);
433 static int PVRSRVFreeDeviceMemBW(u32 ui32BridgeID,
434 struct PVRSRV_BRIDGE_IN_FREEDEVICEMEM *psFreeDeviceMemIN,
435 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
436 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
439 void *pvKernelMemInfo;
440 struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
442 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_FREE_DEVICEMEM);
445 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
446 psFreeDeviceMemIN->hDevCookie,
447 PVRSRV_HANDLE_TYPE_DEV_NODE);
449 if (psRetOUT->eError != PVRSRV_OK)
453 PVRSRVLookupHandle(psPerProc->psHandleBase, &pvKernelMemInfo,
454 psFreeDeviceMemIN->psKernelMemInfo,
455 PVRSRV_HANDLE_TYPE_MEM_INFO);
457 if (psRetOUT->eError != PVRSRV_OK)
460 psKernelMemInfo = (struct PVRSRV_KERNEL_MEM_INFO *)pvKernelMemInfo;
461 if (psKernelMemInfo->ui32RefCount != 1) {
462 PVR_DPF(PVR_DBG_ERROR, "PVRSRVFreeDeviceMemBW: "
463 "mappings are open in other processes");
464 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
468 psRetOUT->eError = PVRSRVFreeDeviceMemKM(hDevCookieInt,
471 if (psRetOUT->eError != PVRSRV_OK)
474 psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
475 psFreeDeviceMemIN->psKernelMemInfo,
476 PVRSRV_HANDLE_TYPE_MEM_INFO);
481 static int PVRSRVExportDeviceMemBW(u32 ui32BridgeID,
482 struct PVRSRV_BRIDGE_IN_EXPORTDEVICEMEM *psExportDeviceMemIN,
483 struct PVRSRV_BRIDGE_OUT_EXPORTDEVICEMEM *psExportDeviceMemOUT,
484 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
487 struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
489 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EXPORT_DEVICEMEM);
491 psExportDeviceMemOUT->eError =
492 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
493 psExportDeviceMemIN->hDevCookie,
494 PVRSRV_HANDLE_TYPE_DEV_NODE);
496 if (psExportDeviceMemOUT->eError != PVRSRV_OK) {
497 PVR_DPF(PVR_DBG_ERROR,
498 "PVRSRVExportDeviceMemBW: can't find devcookie");
502 psExportDeviceMemOUT->eError =
503 PVRSRVLookupHandle(psPerProc->psHandleBase,
504 (void **)&psKernelMemInfo,
505 psExportDeviceMemIN->psKernelMemInfo,
506 PVRSRV_HANDLE_TYPE_MEM_INFO);
508 if (psExportDeviceMemOUT->eError != PVRSRV_OK) {
509 PVR_DPF(PVR_DBG_ERROR,
510 "PVRSRVExportDeviceMemBW: can't find kernel meminfo");
514 psExportDeviceMemOUT->eError =
515 PVRSRVFindHandle(KERNEL_HANDLE_BASE,
516 &psExportDeviceMemOUT->hMemInfo,
517 psKernelMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO);
518 if (psExportDeviceMemOUT->eError == PVRSRV_OK) {
519 PVR_DPF(PVR_DBG_MESSAGE, "PVRSRVExportDeviceMemBW: "
520 "allocation is already exported");
524 psExportDeviceMemOUT->eError = PVRSRVAllocHandle(KERNEL_HANDLE_BASE,
525 &psExportDeviceMemOUT->hMemInfo,
527 PVRSRV_HANDLE_TYPE_MEM_INFO,
528 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
529 if (psExportDeviceMemOUT->eError != PVRSRV_OK) {
530 PVR_DPF(PVR_DBG_ERROR, "PVRSRVExportDeviceMemBW: "
531 "failed to allocate handle from global handle list");
535 psKernelMemInfo->ui32Flags |= PVRSRV_MEM_EXPORTED;
540 static int PVRSRVMapDeviceMemoryBW(u32 ui32BridgeID,
541 struct PVRSRV_BRIDGE_IN_MAP_DEV_MEMORY *psMapDevMemIN,
542 struct PVRSRV_BRIDGE_OUT_MAP_DEV_MEMORY *psMapDevMemOUT,
543 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
545 struct PVRSRV_KERNEL_MEM_INFO *psSrcKernelMemInfo = NULL;
546 struct PVRSRV_KERNEL_MEM_INFO *psDstKernelMemInfo = NULL;
547 void *hDstDevMemHeap = NULL;
549 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_MAP_DEV_MEMORY);
551 NEW_HANDLE_BATCH_OR_ERROR(psMapDevMemOUT->eError, psPerProc, 2);
553 psMapDevMemOUT->eError = PVRSRVLookupHandle(KERNEL_HANDLE_BASE,
554 (void **)&psSrcKernelMemInfo,
555 psMapDevMemIN->hKernelMemInfo,
556 PVRSRV_HANDLE_TYPE_MEM_INFO);
557 if (psMapDevMemOUT->eError != PVRSRV_OK)
560 psMapDevMemOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
562 psMapDevMemIN->hDstDevMemHeap,
563 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP);
564 if (psMapDevMemOUT->eError != PVRSRV_OK)
567 psMapDevMemOUT->eError = PVRSRVMapDeviceMemoryKM(psPerProc,
570 &psDstKernelMemInfo);
571 if (psMapDevMemOUT->eError != PVRSRV_OK)
574 OSMemSet(&psMapDevMemOUT->sDstClientMemInfo, 0,
575 sizeof(psMapDevMemOUT->sDstClientMemInfo));
576 OSMemSet(&psMapDevMemOUT->sDstClientSyncInfo, 0,
577 sizeof(psMapDevMemOUT->sDstClientSyncInfo));
579 psMapDevMemOUT->sDstClientMemInfo.pvLinAddrKM =
580 psDstKernelMemInfo->pvLinAddrKM;
582 psMapDevMemOUT->sDstClientMemInfo.pvLinAddr = NULL;
583 psMapDevMemOUT->sDstClientMemInfo.sDevVAddr =
584 psDstKernelMemInfo->sDevVAddr;
585 psMapDevMemOUT->sDstClientMemInfo.ui32Flags =
586 psDstKernelMemInfo->ui32Flags;
587 psMapDevMemOUT->sDstClientMemInfo.ui32AllocSize =
588 psDstKernelMemInfo->ui32AllocSize;
589 psMapDevMemOUT->sDstClientMemInfo.hMappingInfo =
590 psDstKernelMemInfo->sMemBlk.hOSMemHandle;
592 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
593 &psMapDevMemOUT->sDstClientMemInfo.hKernelMemInfo,
595 PVRSRV_HANDLE_TYPE_MEM_INFO,
596 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
597 psMapDevMemOUT->sDstClientSyncInfo.hKernelSyncInfo = NULL;
598 psMapDevMemOUT->psDstKernelSyncInfo = NULL;
600 if (psDstKernelMemInfo->psKernelSyncInfo) {
601 psMapDevMemOUT->psDstKernelSyncInfo =
602 psDstKernelMemInfo->psKernelSyncInfo;
604 psMapDevMemOUT->sDstClientSyncInfo.psSyncData =
605 psDstKernelMemInfo->psKernelSyncInfo->psSyncData;
606 psMapDevMemOUT->sDstClientSyncInfo.sWriteOpsCompleteDevVAddr =
607 psDstKernelMemInfo->psKernelSyncInfo->
608 sWriteOpsCompleteDevVAddr;
609 psMapDevMemOUT->sDstClientSyncInfo.sReadOpsCompleteDevVAddr =
610 psDstKernelMemInfo->psKernelSyncInfo->
611 sReadOpsCompleteDevVAddr;
613 psMapDevMemOUT->sDstClientSyncInfo.hMappingInfo =
614 psDstKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->
615 sMemBlk.hOSMemHandle;
617 psMapDevMemOUT->sDstClientMemInfo.psClientSyncInfo =
618 &psMapDevMemOUT->sDstClientSyncInfo;
620 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
621 &psMapDevMemOUT->sDstClientSyncInfo.
623 psDstKernelMemInfo->psKernelSyncInfo,
624 PVRSRV_HANDLE_TYPE_SYNC_INFO,
625 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
626 psMapDevMemOUT->sDstClientMemInfo.
630 COMMIT_HANDLE_BATCH_OR_ERROR(psMapDevMemOUT->eError, psPerProc);
635 static int PVRSRVUnmapDeviceMemoryBW(u32 ui32BridgeID,
636 struct PVRSRV_BRIDGE_IN_UNMAP_DEV_MEMORY *psUnmapDevMemIN,
637 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
638 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
640 struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo = NULL;
642 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_UNMAP_DEV_MEMORY);
644 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
645 (void **) &psKernelMemInfo,
646 psUnmapDevMemIN->psKernelMemInfo,
647 PVRSRV_HANDLE_TYPE_MEM_INFO);
648 if (psRetOUT->eError != PVRSRV_OK)
651 psRetOUT->eError = PVRSRVUnmapDeviceMemoryKM(psKernelMemInfo);
652 if (psRetOUT->eError != PVRSRV_OK)
655 psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
656 psUnmapDevMemIN->psKernelMemInfo,
657 PVRSRV_HANDLE_TYPE_MEM_INFO);
662 static int FlushCacheDRI(u32 ui32Type, u32 ui32Virt, u32 ui32Length)
665 case DRM_PVR2D_CFLUSH_FROM_GPU:
666 PVR_DPF(PVR_DBG_MESSAGE,
667 "DRM_PVR2D_CFLUSH_FROM_GPU 0x%08x, length 0x%08x\n",
668 ui32Virt, ui32Length);
670 dmac_map_area((const void *)ui32Virt, ui32Length, DMA_FROM_DEVICE);
673 case DRM_PVR2D_CFLUSH_TO_GPU:
674 PVR_DPF(PVR_DBG_MESSAGE,
675 "DRM_PVR2D_CFLUSH_TO_GPU 0x%08x, length 0x%08x\n",
676 ui32Virt, ui32Length);
678 dmac_map_area((const void *)ui32Virt, ui32Length, DMA_TO_DEVICE);
682 PVR_DPF(PVR_DBG_ERROR, "Invalid cflush type 0x%x\n",
690 static int PVRSRVCacheFlushDRIBW(u32 ui32BridgeID,
691 struct PVRSRV_BRIDGE_IN_CACHEFLUSHDRMFROMUSER *psCacheFlushIN,
692 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
693 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
695 struct vm_area_struct *vma;
699 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_CACHE_FLUSH_DRM);
701 start = psCacheFlushIN->ui32Virt;
702 len = psCacheFlushIN->ui32Length;
703 type = psCacheFlushIN->ui32Type;
705 down_read(¤t->mm->mmap_sem);
706 vma = find_vma(current->mm, start);
707 if (vma == NULL || vma->vm_start > start ||
708 vma->vm_end < start + len)
709 pr_err("PVR: %s: invalid address %08lx %zu %c\n",
710 __func__, start, len,
711 type == DRM_PVR2D_CFLUSH_TO_GPU ? 'c' :
712 type == DRM_PVR2D_CFLUSH_FROM_GPU ? 'i' :
715 psRetOUT->eError = FlushCacheDRI(type, start, len);
717 up_read(¤t->mm->mmap_sem);
722 static int PVRSRVMapDeviceClassMemoryBW(u32 ui32BridgeID,
723 struct PVRSRV_BRIDGE_IN_MAP_DEVICECLASS_MEMORY *psMapDevClassMemIN,
724 struct PVRSRV_BRIDGE_OUT_MAP_DEVICECLASS_MEMORY *psMapDevClassMemOUT,
725 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
727 struct PVRSRV_KERNEL_MEM_INFO *psMemInfo;
729 void *hDeviceClassBufferInt;
730 void *hDevMemContextInt;
731 enum PVRSRV_HANDLE_TYPE eHandleType;
733 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
734 PVRSRV_BRIDGE_MAP_DEVICECLASS_MEMORY);
736 NEW_HANDLE_BATCH_OR_ERROR(psMapDevClassMemOUT->eError, psPerProc, 2);
738 psMapDevClassMemOUT->eError =
739 PVRSRVLookupHandleAnyType(psPerProc->psHandleBase,
740 &hDeviceClassBufferInt, &eHandleType,
741 psMapDevClassMemIN->hDeviceClassBuffer);
743 if (psMapDevClassMemOUT->eError != PVRSRV_OK)
746 psMapDevClassMemOUT->eError =
747 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevMemContextInt,
748 psMapDevClassMemIN->hDevMemContext,
749 PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
751 if (psMapDevClassMemOUT->eError != PVRSRV_OK)
754 switch (eHandleType) {
755 case PVRSRV_HANDLE_TYPE_DISP_BUFFER:
756 case PVRSRV_HANDLE_TYPE_BUF_BUFFER:
759 psMapDevClassMemOUT->eError = PVRSRV_ERROR_GENERIC;
763 psMapDevClassMemOUT->eError =
764 PVRSRVMapDeviceClassMemoryKM(psPerProc, hDevMemContextInt,
765 hDeviceClassBufferInt, &psMemInfo, &hOSMapInfo);
767 if (psMapDevClassMemOUT->eError != PVRSRV_OK)
770 OSMemSet(&psMapDevClassMemOUT->sClientMemInfo, 0,
771 sizeof(psMapDevClassMemOUT->sClientMemInfo));
772 OSMemSet(&psMapDevClassMemOUT->sClientSyncInfo, 0,
773 sizeof(psMapDevClassMemOUT->sClientSyncInfo));
775 psMapDevClassMemOUT->sClientMemInfo.pvLinAddrKM =
776 psMemInfo->pvLinAddrKM;
778 psMapDevClassMemOUT->sClientMemInfo.pvLinAddr = NULL;
779 psMapDevClassMemOUT->sClientMemInfo.sDevVAddr = psMemInfo->sDevVAddr;
780 psMapDevClassMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags;
781 psMapDevClassMemOUT->sClientMemInfo.ui32AllocSize =
782 psMemInfo->ui32AllocSize;
783 psMapDevClassMemOUT->sClientMemInfo.hMappingInfo =
784 psMemInfo->sMemBlk.hOSMemHandle;
786 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
787 &psMapDevClassMemOUT->sClientMemInfo.hKernelMemInfo,
789 PVRSRV_HANDLE_TYPE_MEM_INFO,
790 PVRSRV_HANDLE_ALLOC_FLAG_NONE,
791 psMapDevClassMemIN->hDeviceClassBuffer);
793 psMapDevClassMemOUT->sClientSyncInfo.hKernelSyncInfo = NULL;
794 psMapDevClassMemOUT->psKernelSyncInfo = NULL;
796 if (psMemInfo->psKernelSyncInfo) {
797 psMapDevClassMemOUT->psKernelSyncInfo =
798 psMemInfo->psKernelSyncInfo;
800 psMapDevClassMemOUT->sClientSyncInfo.psSyncData =
801 psMemInfo->psKernelSyncInfo->psSyncData;
802 psMapDevClassMemOUT->sClientSyncInfo.sWriteOpsCompleteDevVAddr =
803 psMemInfo->psKernelSyncInfo->sWriteOpsCompleteDevVAddr;
804 psMapDevClassMemOUT->sClientSyncInfo.sReadOpsCompleteDevVAddr =
805 psMemInfo->psKernelSyncInfo->sReadOpsCompleteDevVAddr;
807 psMapDevClassMemOUT->sClientSyncInfo.hMappingInfo =
808 psMemInfo->psKernelSyncInfo->
809 psSyncDataMemInfoKM->sMemBlk.hOSMemHandle;
811 psMapDevClassMemOUT->sClientMemInfo.psClientSyncInfo =
812 &psMapDevClassMemOUT->sClientSyncInfo;
814 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
815 &psMapDevClassMemOUT->sClientSyncInfo.
817 psMemInfo->psKernelSyncInfo,
818 PVRSRV_HANDLE_TYPE_SYNC_INFO,
819 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
820 psMapDevClassMemOUT->sClientMemInfo.
824 COMMIT_HANDLE_BATCH_OR_ERROR(psMapDevClassMemOUT->eError, psPerProc);
829 static int PVRSRVUnmapDeviceClassMemoryBW(u32 ui32BridgeID,
830 struct PVRSRV_BRIDGE_IN_UNMAP_DEVICECLASS_MEMORY *psUnmapDevClassMemIN,
831 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
832 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
834 void *pvKernelMemInfo;
836 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
837 PVRSRV_BRIDGE_UNMAP_DEVICECLASS_MEMORY);
840 PVRSRVLookupHandle(psPerProc->psHandleBase, &pvKernelMemInfo,
841 psUnmapDevClassMemIN->psKernelMemInfo,
842 PVRSRV_HANDLE_TYPE_MEM_INFO);
843 if (psRetOUT->eError != PVRSRV_OK)
846 psRetOUT->eError = PVRSRVUnmapDeviceClassMemoryKM(pvKernelMemInfo);
848 if (psRetOUT->eError != PVRSRV_OK)
852 PVRSRVReleaseHandle(psPerProc->psHandleBase,
853 psUnmapDevClassMemIN->psKernelMemInfo,
854 PVRSRV_HANDLE_TYPE_MEM_INFO);
859 static int PVRSRVWrapExtMemoryBW(u32 ui32BridgeID,
860 struct PVRSRV_BRIDGE_IN_WRAP_EXT_MEMORY *psWrapExtMemIN,
861 struct PVRSRV_BRIDGE_OUT_WRAP_EXT_MEMORY *psWrapExtMemOUT,
862 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
865 void *hDevMemContextInt;
866 struct PVRSRV_KERNEL_MEM_INFO *psMemInfo;
867 u32 ui32PageTableSize = 0;
868 struct IMG_SYS_PHYADDR *psSysPAddr = NULL;
870 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_WRAP_EXT_MEMORY);
872 NEW_HANDLE_BATCH_OR_ERROR(psWrapExtMemOUT->eError, psPerProc, 2);
874 psWrapExtMemOUT->eError =
875 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
876 psWrapExtMemIN->hDevCookie,
877 PVRSRV_HANDLE_TYPE_DEV_NODE);
878 if (psWrapExtMemOUT->eError != PVRSRV_OK)
881 psWrapExtMemOUT->eError =
882 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevMemContextInt,
883 psWrapExtMemIN->hDevMemContext,
884 PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
886 if (psWrapExtMemOUT->eError != PVRSRV_OK)
889 if (psWrapExtMemIN->ui32NumPageTableEntries) {
890 ui32PageTableSize = psWrapExtMemIN->ui32NumPageTableEntries
891 * sizeof(struct IMG_SYS_PHYADDR);
893 ASSIGN_AND_EXIT_ON_ERROR(psWrapExtMemOUT->eError,
894 OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
896 (void **)&psSysPAddr, NULL));
898 if (CopyFromUserWrapper(psPerProc, ui32BridgeID, psSysPAddr,
899 psWrapExtMemIN->psSysPAddr,
900 ui32PageTableSize) != PVRSRV_OK) {
901 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32PageTableSize,
902 (void *) psSysPAddr, NULL);
907 psWrapExtMemOUT->eError = PVRSRVWrapExtMemoryKM(hDevCookieInt,
908 psPerProc, hDevMemContextInt,
909 psWrapExtMemIN->ui32ByteSize,
910 psWrapExtMemIN->ui32PageOffset,
911 psWrapExtMemIN->bPhysContig,
912 psSysPAddr, psWrapExtMemIN->pvLinAddr,
914 if (psWrapExtMemIN->ui32NumPageTableEntries)
915 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32PageTableSize,
916 (void *)psSysPAddr, NULL);
917 if (psWrapExtMemOUT->eError != PVRSRV_OK)
920 psWrapExtMemOUT->sClientMemInfo.pvLinAddrKM = psMemInfo->pvLinAddrKM;
922 psWrapExtMemOUT->sClientMemInfo.pvLinAddr = NULL;
923 psWrapExtMemOUT->sClientMemInfo.sDevVAddr = psMemInfo->sDevVAddr;
924 psWrapExtMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags;
925 psWrapExtMemOUT->sClientMemInfo.ui32AllocSize =
926 psMemInfo->ui32AllocSize;
927 psWrapExtMemOUT->sClientMemInfo.hMappingInfo =
928 psMemInfo->sMemBlk.hOSMemHandle;
930 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
931 &psWrapExtMemOUT->sClientMemInfo.hKernelMemInfo,
932 psMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO,
933 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
935 psWrapExtMemOUT->sClientSyncInfo.psSyncData =
936 psMemInfo->psKernelSyncInfo->psSyncData;
937 psWrapExtMemOUT->sClientSyncInfo.sWriteOpsCompleteDevVAddr =
938 psMemInfo->psKernelSyncInfo->sWriteOpsCompleteDevVAddr;
939 psWrapExtMemOUT->sClientSyncInfo.sReadOpsCompleteDevVAddr =
940 psMemInfo->psKernelSyncInfo->sReadOpsCompleteDevVAddr;
942 psWrapExtMemOUT->sClientSyncInfo.hMappingInfo =
943 psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.
946 psWrapExtMemOUT->sClientMemInfo.psClientSyncInfo =
947 &psWrapExtMemOUT->sClientSyncInfo;
949 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
950 &psWrapExtMemOUT->sClientSyncInfo.
952 (void *)psMemInfo->psKernelSyncInfo,
953 PVRSRV_HANDLE_TYPE_SYNC_INFO,
954 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
955 psWrapExtMemOUT->sClientMemInfo.hKernelMemInfo);
957 COMMIT_HANDLE_BATCH_OR_ERROR(psWrapExtMemOUT->eError, psPerProc);
962 static int PVRSRVUnwrapExtMemoryBW(u32 ui32BridgeID,
963 struct PVRSRV_BRIDGE_IN_UNWRAP_EXT_MEMORY *psUnwrapExtMemIN,
964 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
965 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
969 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_UNWRAP_EXT_MEMORY);
971 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
972 &pvMemInfo, psUnwrapExtMemIN->hKernelMemInfo,
973 PVRSRV_HANDLE_TYPE_MEM_INFO);
974 if (psRetOUT->eError != PVRSRV_OK)
978 PVRSRVUnwrapExtMemoryKM((struct PVRSRV_KERNEL_MEM_INFO *)pvMemInfo);
979 if (psRetOUT->eError != PVRSRV_OK)
982 psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
983 psUnwrapExtMemIN->hKernelMemInfo,
984 PVRSRV_HANDLE_TYPE_MEM_INFO);
989 static int PVRSRVGetFreeDeviceMemBW(u32 ui32BridgeID,
990 struct PVRSRV_BRIDGE_IN_GETFREEDEVICEMEM *psGetFreeDeviceMemIN,
991 struct PVRSRV_BRIDGE_OUT_GETFREEDEVICEMEM *psGetFreeDeviceMemOUT,
992 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
994 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_GETFREE_DEVICEMEM);
996 PVR_UNREFERENCED_PARAMETER(psPerProc);
998 psGetFreeDeviceMemOUT->eError =
999 PVRSRVGetFreeDeviceMemKM(psGetFreeDeviceMemIN->ui32Flags,
1000 &psGetFreeDeviceMemOUT->ui32Total,
1001 &psGetFreeDeviceMemOUT->ui32Free,
1002 &psGetFreeDeviceMemOUT->ui32LargestBlock);
1007 static int PVRMMapOSMemHandleToMMapDataBW(u32 ui32BridgeID,
1008 struct PVRSRV_BRIDGE_IN_MHANDLE_TO_MMAP_DATA *psMMapDataIN,
1009 struct PVRSRV_BRIDGE_OUT_MHANDLE_TO_MMAP_DATA *psMMapDataOUT,
1010 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1012 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1013 PVRSRV_BRIDGE_MHANDLE_TO_MMAP_DATA);
1015 psMMapDataOUT->eError =
1016 PVRMMapOSMemHandleToMMapData(psPerProc, psMMapDataIN->hMHandle,
1017 &psMMapDataOUT->ui32MMapOffset,
1018 &psMMapDataOUT->ui32ByteOffset,
1019 &psMMapDataOUT->ui32RealByteSize,
1020 &psMMapDataOUT->ui32UserVAddr);
1024 static int PVRMMapReleaseMMapDataBW(u32 ui32BridgeID,
1025 struct PVRSRV_BRIDGE_IN_RELEASE_MMAP_DATA *psMMapDataIN,
1026 struct PVRSRV_BRIDGE_OUT_RELEASE_MMAP_DATA *psMMapDataOUT,
1027 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1029 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_RELEASE_MMAP_DATA);
1031 psMMapDataOUT->eError = PVRMMapReleaseMMapData(psPerProc,
1032 psMMapDataIN->hMHandle,
1033 &psMMapDataOUT->bMUnmap,
1034 &psMMapDataOUT->ui32RealByteSize,
1035 &psMMapDataOUT->ui32UserVAddr);
1040 static int PDumpIsCaptureFrameBW(u32 ui32BridgeID, void *psBridgeIn,
1041 struct PVRSRV_BRIDGE_OUT_PDUMP_ISCAPTURING *psPDumpIsCapturingOUT,
1042 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1044 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_ISCAPTURING);
1045 PVR_UNREFERENCED_PARAMETER(psBridgeIn);
1046 PVR_UNREFERENCED_PARAMETER(psPerProc);
1048 psPDumpIsCapturingOUT->bIsCapturing = PDumpIsCaptureFrameKM();
1049 psPDumpIsCapturingOUT->eError = PVRSRV_OK;
1054 static int PDumpCommentBW(u32 ui32BridgeID,
1055 struct PVRSRV_BRIDGE_IN_PDUMP_COMMENT *psPDumpCommentIN,
1056 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1057 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1059 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_COMMENT);
1060 PVR_UNREFERENCED_PARAMETER(psPerProc);
1062 PDumpCommentKM(&psPDumpCommentIN->szComment[0],
1063 psPDumpCommentIN->ui32Flags);
1065 psRetOUT->eError = PVRSRV_OK;
1070 static int PDumpSetFrameBW(u32 ui32BridgeID,
1071 struct PVRSRV_BRIDGE_IN_PDUMP_SETFRAME *psPDumpSetFrameIN,
1072 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1073 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1075 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_SETFRAME);
1076 PVR_UNREFERENCED_PARAMETER(psPerProc);
1078 PDumpSetFrameKM(psPDumpSetFrameIN->ui32Frame);
1080 psRetOUT->eError = PVRSRV_OK;
1085 static int PDumpRegWithFlagsBW(u32 ui32BridgeID,
1086 struct PVRSRV_BRIDGE_IN_PDUMP_DUMPREG *psPDumpRegDumpIN,
1087 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1088 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1090 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_REG);
1091 PVR_UNREFERENCED_PARAMETER(psPerProc);
1093 PDumpRegWithFlagsKM(psPDumpRegDumpIN->sHWReg.ui32RegAddr,
1094 psPDumpRegDumpIN->sHWReg.ui32RegVal,
1095 psPDumpRegDumpIN->ui32Flags);
1097 psRetOUT->eError = PVRSRV_OK;
1102 static int PDumpRegPolBW(u32 ui32BridgeID,
1103 struct PVRSRV_BRIDGE_IN_PDUMP_REGPOL *psPDumpRegPolIN,
1104 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1105 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1107 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_REGPOL);
1108 PVR_UNREFERENCED_PARAMETER(psPerProc);
1110 PDumpRegPolWithFlagsKM(psPDumpRegPolIN->sHWReg.ui32RegAddr,
1111 psPDumpRegPolIN->sHWReg.ui32RegVal,
1112 psPDumpRegPolIN->ui32Mask,
1113 psPDumpRegPolIN->ui32Flags);
1115 psRetOUT->eError = PVRSRV_OK;
1120 static int PDumpMemPolBW(u32 ui32BridgeID,
1121 struct PVRSRV_BRIDGE_IN_PDUMP_MEMPOL *psPDumpMemPolIN,
1122 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1123 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1127 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_MEMPOL);
1129 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1131 psPDumpMemPolIN->psKernelMemInfo,
1132 PVRSRV_HANDLE_TYPE_MEM_INFO);
1133 if (psRetOUT->eError != PVRSRV_OK)
1136 PDumpMemPolKM(((struct PVRSRV_KERNEL_MEM_INFO *)pvMemInfo),
1137 psPDumpMemPolIN->ui32Offset,
1138 psPDumpMemPolIN->ui32Value,
1139 psPDumpMemPolIN->ui32Mask,
1140 PDUMP_POLL_OPERATOR_EQUAL,
1141 MAKEUNIQUETAG(pvMemInfo));
1146 static int PDumpMemBW(u32 ui32BridgeID,
1147 struct PVRSRV_BRIDGE_IN_PDUMP_DUMPMEM *psPDumpMemDumpIN,
1148 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1149 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1153 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_DUMPMEM);
1155 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1157 psPDumpMemDumpIN->psKernelMemInfo,
1158 PVRSRV_HANDLE_TYPE_MEM_INFO);
1159 if (psRetOUT->eError != PVRSRV_OK)
1162 psRetOUT->eError = PDumpMemUM(psPDumpMemDumpIN->pvAltLinAddr,
1163 psPDumpMemDumpIN->pvLinAddr,
1164 pvMemInfo, psPDumpMemDumpIN->ui32Offset,
1165 psPDumpMemDumpIN->ui32Bytes,
1166 psPDumpMemDumpIN->ui32Flags,
1167 MAKEUNIQUETAG(pvMemInfo));
1172 static int PDumpBitmapBW(u32 ui32BridgeID,
1173 struct PVRSRV_BRIDGE_IN_PDUMP_BITMAP *psPDumpBitmapIN,
1174 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1175 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1177 PVR_UNREFERENCED_PARAMETER(psPerProc);
1178 PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
1180 PDumpBitmapKM(&psPDumpBitmapIN->szFileName[0],
1181 psPDumpBitmapIN->ui32FileOffset,
1182 psPDumpBitmapIN->ui32Width,
1183 psPDumpBitmapIN->ui32Height,
1184 psPDumpBitmapIN->ui32StrideInBytes,
1185 psPDumpBitmapIN->sDevBaseAddr,
1186 psPDumpBitmapIN->ui32Size,
1187 psPDumpBitmapIN->ePixelFormat,
1188 psPDumpBitmapIN->eMemFormat,
1189 psPDumpBitmapIN->ui32Flags);
1191 psRetOUT->eError = PVRSRV_OK;
1196 static int PDumpSyncDumpBW(u32 ui32BridgeID,
1197 struct PVRSRV_BRIDGE_IN_PDUMP_DUMPSYNC *psPDumpSyncDumpIN,
1198 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1199 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1201 u32 ui32Bytes = psPDumpSyncDumpIN->ui32Bytes;
1204 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_DUMPSYNC);
1207 PVRSRVLookupHandle(psPerProc->psHandleBase, &pvSyncInfo,
1208 psPDumpSyncDumpIN->psKernelSyncInfo,
1209 PVRSRV_HANDLE_TYPE_SYNC_INFO);
1210 if (psRetOUT->eError != PVRSRV_OK)
1214 PDumpMemUM(psPDumpSyncDumpIN->pvAltLinAddr, NULL,
1215 ((struct PVRSRV_KERNEL_SYNC_INFO *)pvSyncInfo)->
1216 psSyncDataMemInfoKM,
1217 psPDumpSyncDumpIN->ui32Offset, ui32Bytes, 0,
1218 MAKEUNIQUETAG(((struct PVRSRV_KERNEL_SYNC_INFO *)
1219 pvSyncInfo)->psSyncDataMemInfoKM));
1224 static int PDumpSyncPolBW(u32 ui32BridgeID,
1225 struct PVRSRV_BRIDGE_IN_PDUMP_SYNCPOL *psPDumpSyncPolIN,
1226 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1227 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1232 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_SYNCPOL);
1235 PVRSRVLookupHandle(psPerProc->psHandleBase, &pvSyncInfo,
1236 psPDumpSyncPolIN->psKernelSyncInfo,
1237 PVRSRV_HANDLE_TYPE_SYNC_INFO);
1238 if (psRetOUT->eError != PVRSRV_OK)
1241 if (psPDumpSyncPolIN->bIsRead)
1242 ui32Offset = offsetof(struct PVRSRV_SYNC_DATA,
1243 ui32ReadOpsComplete);
1245 ui32Offset = offsetof(struct PVRSRV_SYNC_DATA,
1246 ui32WriteOpsComplete);
1248 PDumpMemPolKM(((struct PVRSRV_KERNEL_SYNC_INFO *)pvSyncInfo)->
1249 psSyncDataMemInfoKM, ui32Offset,
1250 psPDumpSyncPolIN->ui32Value,
1251 psPDumpSyncPolIN->ui32Mask, PDUMP_POLL_OPERATOR_EQUAL,
1252 MAKEUNIQUETAG(((struct PVRSRV_KERNEL_SYNC_INFO *)
1253 pvSyncInfo)->psSyncDataMemInfoKM));
1258 static int PDumpPDRegBW(u32 ui32BridgeID,
1259 struct PVRSRV_BRIDGE_IN_PDUMP_DUMPPDREG *psPDumpPDRegDumpIN,
1260 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1261 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1263 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_PDUMP_PDREG);
1264 PVR_UNREFERENCED_PARAMETER(psPerProc);
1266 PDumpPDReg(psPDumpPDRegDumpIN->sHWReg.ui32RegAddr,
1267 psPDumpPDRegDumpIN->sHWReg.ui32RegVal);
1269 psRetOUT->eError = PVRSRV_OK;
1273 static int PDumpCycleCountRegReadBW(u32 ui32BridgeID,
1274 struct PVRSRV_BRIDGE_IN_PDUMP_CYCLE_COUNT_REG_READ
1275 *psPDumpCycleCountRegReadIN,
1276 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1277 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1279 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1280 PVRSRV_BRIDGE_PDUMP_CYCLE_COUNT_REG_READ);
1281 PVR_UNREFERENCED_PARAMETER(psPerProc);
1283 PDumpCycleCountRegRead(psPDumpCycleCountRegReadIN->ui32RegOffset);
1285 psRetOUT->eError = PVRSRV_OK;
1290 static int PDumpPDDevPAddrBW(u32 ui32BridgeID,
1291 struct PVRSRV_BRIDGE_IN_PDUMP_DUMPPDDEVPADDR *psPDumpPDDevPAddrIN,
1292 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1293 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1297 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1298 PVRSRV_BRIDGE_PDUMP_DUMPPDDEVPADDR);
1301 PVRSRVLookupHandle(psPerProc->psHandleBase, &pvMemInfo,
1302 psPDumpPDDevPAddrIN->hKernelMemInfo,
1303 PVRSRV_HANDLE_TYPE_MEM_INFO);
1304 if (psRetOUT->eError != PVRSRV_OK)
1307 PDumpPDDevPAddrKM((struct PVRSRV_KERNEL_MEM_INFO *)pvMemInfo,
1308 psPDumpPDDevPAddrIN->ui32Offset,
1309 psPDumpPDDevPAddrIN->sPDDevPAddr,
1310 MAKEUNIQUETAG(pvMemInfo), PDUMP_PD_UNIQUETAG);
1317 static int PVRSRVGetMiscInfoBW(u32 ui32BridgeID,
1318 struct PVRSRV_BRIDGE_IN_GET_MISC_INFO *psGetMiscInfoIN,
1319 struct PVRSRV_BRIDGE_OUT_GET_MISC_INFO *psGetMiscInfoOUT,
1320 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1322 enum PVRSRV_ERROR eError;
1324 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_GET_MISC_INFO);
1326 OSMemCopy(&psGetMiscInfoOUT->sMiscInfo, &psGetMiscInfoIN->sMiscInfo,
1327 sizeof(struct PVRSRV_MISC_INFO));
1329 if (((psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
1330 PVRSRV_MISC_INFO_MEMSTATS_PRESENT) != 0) &&
1331 ((psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
1332 PVRSRV_MISC_INFO_DDKVERSION_PRESENT) != 0)) {
1334 psGetMiscInfoOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1338 if (((psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
1339 PVRSRV_MISC_INFO_MEMSTATS_PRESENT) != 0) ||
1340 ((psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
1341 PVRSRV_MISC_INFO_DDKVERSION_PRESENT) != 0)) {
1343 ASSIGN_AND_EXIT_ON_ERROR(
1344 psGetMiscInfoOUT->eError,
1345 OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1346 psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen,
1347 (void **)&psGetMiscInfoOUT->sMiscInfo.pszMemoryStr,
1350 psGetMiscInfoOUT->eError =
1351 PVRSRVGetMiscInfoKM(&psGetMiscInfoOUT->sMiscInfo);
1353 eError = CopyToUserWrapper(psPerProc, ui32BridgeID,
1354 (void __force __user *)
1355 psGetMiscInfoIN->sMiscInfo.pszMemoryStr,
1356 psGetMiscInfoOUT->sMiscInfo.pszMemoryStr,
1357 psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen);
1359 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
1360 psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen,
1361 (void *)psGetMiscInfoOUT->sMiscInfo.pszMemoryStr,
1364 psGetMiscInfoOUT->sMiscInfo.pszMemoryStr =
1365 psGetMiscInfoIN->sMiscInfo.pszMemoryStr;
1367 if (eError != PVRSRV_OK) {
1368 PVR_DPF(PVR_DBG_ERROR,
1369 "PVRSRVGetMiscInfoBW Error copy to user");
1373 psGetMiscInfoOUT->eError =
1374 PVRSRVGetMiscInfoKM(&psGetMiscInfoOUT->sMiscInfo);
1377 if (psGetMiscInfoOUT->eError != PVRSRV_OK)
1380 if (psGetMiscInfoIN->sMiscInfo.ui32StateRequest &
1381 PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT) {
1382 psGetMiscInfoOUT->eError =
1383 PVRSRVAllocHandle(psPerProc->psHandleBase,
1384 &psGetMiscInfoOUT->sMiscInfo.
1385 sGlobalEventObject.hOSEventKM,
1386 psGetMiscInfoOUT->sMiscInfo.
1387 sGlobalEventObject.hOSEventKM,
1388 PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT,
1389 PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
1391 if (psGetMiscInfoOUT->eError != PVRSRV_OK)
1395 if (psGetMiscInfoOUT->sMiscInfo.hSOCTimerRegisterOSMemHandle) {
1396 psGetMiscInfoOUT->eError =
1397 PVRSRVAllocHandle(psPerProc->psHandleBase,
1398 &psGetMiscInfoOUT->sMiscInfo.
1399 hSOCTimerRegisterOSMemHandle,
1400 psGetMiscInfoOUT->sMiscInfo.
1401 hSOCTimerRegisterOSMemHandle,
1402 PVRSRV_HANDLE_TYPE_SOC_TIMER,
1403 PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
1405 if (psGetMiscInfoOUT->eError != PVRSRV_OK)
1412 static int PVRSRVConnectBW(u32 ui32BridgeID, void *psBridgeIn,
1413 struct PVRSRV_BRIDGE_OUT_CONNECT_SERVICES *psConnectServicesOUT,
1414 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1416 PVR_UNREFERENCED_PARAMETER(psBridgeIn);
1418 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_CONNECT_SERVICES);
1420 psConnectServicesOUT->hKernelServices = psPerProc->hPerProcData;
1421 psConnectServicesOUT->eError = PVRSRV_OK;
1426 static int PVRSRVDisconnectBW(u32 ui32BridgeID, void *psBridgeIn,
1427 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1428 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1430 PVR_UNREFERENCED_PARAMETER(psPerProc);
1431 PVR_UNREFERENCED_PARAMETER(psBridgeIn);
1433 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1434 PVRSRV_BRIDGE_DISCONNECT_SERVICES);
1436 psRetOUT->eError = PVRSRV_OK;
1441 static int PVRSRVEnumerateDCBW(u32 ui32BridgeID,
1442 struct PVRSRV_BRIDGE_IN_ENUMCLASS *psEnumDispClassIN,
1443 struct PVRSRV_BRIDGE_OUT_ENUMCLASS *psEnumDispClassOUT,
1444 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1446 PVR_UNREFERENCED_PARAMETER(psPerProc);
1448 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_ENUM_CLASS);
1450 psEnumDispClassOUT->eError =
1451 PVRSRVEnumerateDCKM(psEnumDispClassIN->sDeviceClass,
1452 &psEnumDispClassOUT->ui32NumDevices,
1453 &psEnumDispClassOUT->ui32DevID[0]);
1458 static int PVRSRVOpenDCDeviceBW(u32 ui32BridgeID,
1459 struct PVRSRV_BRIDGE_IN_OPEN_DISPCLASS_DEVICE *psOpenDispClassDeviceIN,
1460 struct PVRSRV_BRIDGE_OUT_OPEN_DISPCLASS_DEVICE *psOpenDispClassDeviceOUT,
1461 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1463 void *hDevCookieInt;
1464 void *hDispClassInfoInt;
1466 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1467 PVRSRV_BRIDGE_OPEN_DISPCLASS_DEVICE);
1469 NEW_HANDLE_BATCH_OR_ERROR(psOpenDispClassDeviceOUT->eError, psPerProc,
1472 psOpenDispClassDeviceOUT->eError =
1473 PVRSRVLookupHandle(psPerProc->psHandleBase,
1475 psOpenDispClassDeviceIN->hDevCookie,
1476 PVRSRV_HANDLE_TYPE_DEV_NODE);
1477 if (psOpenDispClassDeviceOUT->eError != PVRSRV_OK)
1480 psOpenDispClassDeviceOUT->eError = PVRSRVOpenDCDeviceKM(psPerProc,
1481 psOpenDispClassDeviceIN->ui32DeviceID,
1482 hDevCookieInt, &hDispClassInfoInt);
1484 if (psOpenDispClassDeviceOUT->eError != PVRSRV_OK)
1487 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1488 &psOpenDispClassDeviceOUT->hDeviceKM,
1490 PVRSRV_HANDLE_TYPE_DISP_INFO,
1491 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
1492 COMMIT_HANDLE_BATCH_OR_ERROR(psOpenDispClassDeviceOUT->eError,
1498 static int PVRSRVCloseDCDeviceBW(u32 ui32BridgeID,
1499 struct PVRSRV_BRIDGE_IN_CLOSE_DISPCLASS_DEVICE *psCloseDispClassDeviceIN,
1500 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1501 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1503 void *pvDispClassInfoInt;
1505 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1506 PVRSRV_BRIDGE_CLOSE_DISPCLASS_DEVICE);
1509 PVRSRVLookupHandle(psPerProc->psHandleBase,
1510 &pvDispClassInfoInt,
1511 psCloseDispClassDeviceIN->hDeviceKM,
1512 PVRSRV_HANDLE_TYPE_DISP_INFO);
1514 if (psRetOUT->eError != PVRSRV_OK)
1517 psRetOUT->eError = PVRSRVCloseDCDeviceKM(pvDispClassInfoInt, IMG_FALSE);
1518 if (psRetOUT->eError != PVRSRV_OK)
1522 PVRSRVReleaseHandle(psPerProc->psHandleBase,
1523 psCloseDispClassDeviceIN->hDeviceKM,
1524 PVRSRV_HANDLE_TYPE_DISP_INFO);
1528 static int PVRSRVEnumDCFormatsBW(u32 ui32BridgeID,
1529 struct PVRSRV_BRIDGE_IN_ENUM_DISPCLASS_FORMATS *psEnumDispClassFormatsIN,
1530 struct PVRSRV_BRIDGE_OUT_ENUM_DISPCLASS_FORMATS *psEnumDispClassFormatsOUT,
1531 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1533 void *pvDispClassInfoInt;
1535 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1536 PVRSRV_BRIDGE_ENUM_DISPCLASS_FORMATS);
1538 psEnumDispClassFormatsOUT->eError =
1539 PVRSRVLookupHandle(psPerProc->psHandleBase,
1540 &pvDispClassInfoInt,
1541 psEnumDispClassFormatsIN->hDeviceKM,
1542 PVRSRV_HANDLE_TYPE_DISP_INFO);
1543 if (psEnumDispClassFormatsOUT->eError != PVRSRV_OK)
1546 psEnumDispClassFormatsOUT->eError =
1547 PVRSRVEnumDCFormatsKM(pvDispClassInfoInt,
1548 &psEnumDispClassFormatsOUT->ui32Count,
1549 psEnumDispClassFormatsOUT->asFormat);
1554 static int PVRSRVEnumDCDimsBW(u32 ui32BridgeID,
1555 struct PVRSRV_BRIDGE_IN_ENUM_DISPCLASS_DIMS *psEnumDispClassDimsIN,
1556 struct PVRSRV_BRIDGE_OUT_ENUM_DISPCLASS_DIMS *psEnumDispClassDimsOUT,
1557 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1559 void *pvDispClassInfoInt;
1561 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1562 PVRSRV_BRIDGE_ENUM_DISPCLASS_DIMS);
1564 psEnumDispClassDimsOUT->eError =
1565 PVRSRVLookupHandle(psPerProc->psHandleBase,
1566 &pvDispClassInfoInt,
1567 psEnumDispClassDimsIN->hDeviceKM,
1568 PVRSRV_HANDLE_TYPE_DISP_INFO);
1570 if (psEnumDispClassDimsOUT->eError != PVRSRV_OK)
1573 psEnumDispClassDimsOUT->eError =
1574 PVRSRVEnumDCDimsKM(pvDispClassInfoInt,
1575 &psEnumDispClassDimsIN->sFormat,
1576 &psEnumDispClassDimsOUT->ui32Count,
1577 psEnumDispClassDimsOUT->asDim);
1582 static int PVRSRVGetDCSystemBufferBW(u32 ui32BridgeID,
1583 struct PVRSRV_BRIDGE_IN_GET_DISPCLASS_SYSBUFFER *psGetDispClassSysBufferIN,
1584 struct PVRSRV_BRIDGE_OUT_GET_DISPCLASS_SYSBUFFER *psGetDispClassSysBufferOUT,
1585 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1588 void *pvDispClassInfoInt;
1590 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1591 PVRSRV_BRIDGE_GET_DISPCLASS_SYSBUFFER);
1593 NEW_HANDLE_BATCH_OR_ERROR(psGetDispClassSysBufferOUT->eError, psPerProc,
1596 psGetDispClassSysBufferOUT->eError =
1597 PVRSRVLookupHandle(psPerProc->psHandleBase,
1598 &pvDispClassInfoInt,
1599 psGetDispClassSysBufferIN->hDeviceKM,
1600 PVRSRV_HANDLE_TYPE_DISP_INFO);
1601 if (psGetDispClassSysBufferOUT->eError != PVRSRV_OK)
1604 psGetDispClassSysBufferOUT->eError =
1605 PVRSRVGetDCSystemBufferKM(pvDispClassInfoInt, &hBufferInt);
1607 if (psGetDispClassSysBufferOUT->eError != PVRSRV_OK)
1610 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1611 &psGetDispClassSysBufferOUT->hBuffer,
1613 PVRSRV_HANDLE_TYPE_DISP_BUFFER,
1614 (enum PVRSRV_HANDLE_ALLOC_FLAG)
1615 (PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE |
1616 PVRSRV_HANDLE_ALLOC_FLAG_SHARED),
1617 psGetDispClassSysBufferIN->hDeviceKM);
1619 COMMIT_HANDLE_BATCH_OR_ERROR(psGetDispClassSysBufferOUT->eError,
1625 static int PVRSRVGetDCInfoBW(u32 ui32BridgeID,
1626 struct PVRSRV_BRIDGE_IN_GET_DISPCLASS_INFO *psGetDispClassInfoIN,
1627 struct PVRSRV_BRIDGE_OUT_GET_DISPCLASS_INFO *psGetDispClassInfoOUT,
1628 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1630 void *pvDispClassInfo;
1632 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1633 PVRSRV_BRIDGE_GET_DISPCLASS_INFO);
1635 psGetDispClassInfoOUT->eError =
1636 PVRSRVLookupHandle(psPerProc->psHandleBase,
1638 psGetDispClassInfoIN->hDeviceKM,
1639 PVRSRV_HANDLE_TYPE_DISP_INFO);
1640 if (psGetDispClassInfoOUT->eError != PVRSRV_OK)
1643 psGetDispClassInfoOUT->eError =
1644 PVRSRVGetDCInfoKM(pvDispClassInfo,
1645 &psGetDispClassInfoOUT->sDisplayInfo);
1650 static int PVRSRVCreateDCSwapChainBW(u32 ui32BridgeID,
1651 struct PVRSRV_BRIDGE_IN_CREATE_DISPCLASS_SWAPCHAIN
1652 *psCreateDispClassSwapChainIN,
1653 struct PVRSRV_BRIDGE_OUT_CREATE_DISPCLASS_SWAPCHAIN
1654 *psCreateDispClassSwapChainOUT,
1655 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1657 void *pvDispClassInfo;
1658 void *hSwapChainInt;
1660 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1661 PVRSRV_BRIDGE_CREATE_DISPCLASS_SWAPCHAIN);
1663 NEW_HANDLE_BATCH_OR_ERROR(psCreateDispClassSwapChainOUT->eError,
1666 psCreateDispClassSwapChainOUT->eError =
1667 PVRSRVLookupHandle(psPerProc->psHandleBase,
1669 psCreateDispClassSwapChainIN->hDeviceKM,
1670 PVRSRV_HANDLE_TYPE_DISP_INFO);
1672 if (psCreateDispClassSwapChainOUT->eError != PVRSRV_OK)
1675 psCreateDispClassSwapChainOUT->eError =
1676 PVRSRVCreateDCSwapChainKM(psPerProc, pvDispClassInfo,
1677 psCreateDispClassSwapChainIN->ui32Flags,
1678 &psCreateDispClassSwapChainIN->sDstSurfAttrib,
1679 &psCreateDispClassSwapChainIN->sSrcSurfAttrib,
1680 psCreateDispClassSwapChainIN->ui32BufferCount,
1681 psCreateDispClassSwapChainIN->ui32OEMFlags,
1683 &psCreateDispClassSwapChainOUT->ui32SwapChainID);
1685 if (psCreateDispClassSwapChainOUT->eError != PVRSRV_OK)
1688 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1689 &psCreateDispClassSwapChainOUT->hSwapChain,
1691 PVRSRV_HANDLE_TYPE_DISP_SWAP_CHAIN,
1692 PVRSRV_HANDLE_ALLOC_FLAG_NONE,
1693 psCreateDispClassSwapChainIN->hDeviceKM);
1695 COMMIT_HANDLE_BATCH_OR_ERROR(psCreateDispClassSwapChainOUT->eError,
1701 static int PVRSRVDestroyDCSwapChainBW(u32 ui32BridgeID,
1702 struct PVRSRV_BRIDGE_IN_DESTROY_DISPCLASS_SWAPCHAIN
1703 *psDestroyDispClassSwapChainIN,
1704 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1705 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1709 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1710 PVRSRV_BRIDGE_DESTROY_DISPCLASS_SWAPCHAIN);
1713 PVRSRVLookupHandle(psPerProc->psHandleBase, &pvSwapChain,
1714 psDestroyDispClassSwapChainIN->hSwapChain,
1715 PVRSRV_HANDLE_TYPE_DISP_SWAP_CHAIN);
1716 if (psRetOUT->eError != PVRSRV_OK)
1719 psRetOUT->eError = PVRSRVDestroyDCSwapChainKM(pvSwapChain);
1721 if (psRetOUT->eError != PVRSRV_OK)
1725 PVRSRVReleaseHandle(psPerProc->psHandleBase,
1726 psDestroyDispClassSwapChainIN->hSwapChain,
1727 PVRSRV_HANDLE_TYPE_DISP_SWAP_CHAIN);
1732 static int PVRSRVSetDCDstRectBW(u32 ui32BridgeID,
1733 struct PVRSRV_BRIDGE_IN_SET_DISPCLASS_RECT *psSetDispClassDstRectIN,
1734 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1735 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1737 void *pvDispClassInfo;
1740 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1741 PVRSRV_BRIDGE_SET_DISPCLASS_DSTRECT);
1744 PVRSRVLookupHandle(psPerProc->psHandleBase,
1746 psSetDispClassDstRectIN->hDeviceKM,
1747 PVRSRV_HANDLE_TYPE_DISP_INFO);
1748 if (psRetOUT->eError != PVRSRV_OK)
1752 PVRSRVLookupHandle(psPerProc->psHandleBase,
1754 psSetDispClassDstRectIN->hSwapChain,
1755 PVRSRV_HANDLE_TYPE_DISP_SWAP_CHAIN);
1757 if (psRetOUT->eError != PVRSRV_OK)
1761 PVRSRVSetDCDstRectKM(pvDispClassInfo,
1762 pvSwapChain, &psSetDispClassDstRectIN->sRect);
1767 static int PVRSRVSetDCSrcRectBW(u32 ui32BridgeID,
1768 struct PVRSRV_BRIDGE_IN_SET_DISPCLASS_RECT *psSetDispClassSrcRectIN,
1769 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1770 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1772 void *pvDispClassInfo;
1775 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1776 PVRSRV_BRIDGE_SET_DISPCLASS_SRCRECT);
1779 PVRSRVLookupHandle(psPerProc->psHandleBase,
1781 psSetDispClassSrcRectIN->hDeviceKM,
1782 PVRSRV_HANDLE_TYPE_DISP_INFO);
1783 if (psRetOUT->eError != PVRSRV_OK)
1787 PVRSRVLookupHandle(psPerProc->psHandleBase,
1789 psSetDispClassSrcRectIN->hSwapChain,
1790 PVRSRV_HANDLE_TYPE_DISP_SWAP_CHAIN);
1791 if (psRetOUT->eError != PVRSRV_OK)
1795 PVRSRVSetDCSrcRectKM(pvDispClassInfo,
1796 pvSwapChain, &psSetDispClassSrcRectIN->sRect);
1801 static int PVRSRVSetDCDstColourKeyBW(u32 ui32BridgeID,
1802 struct PVRSRV_BRIDGE_IN_SET_DISPCLASS_COLOURKEY *psSetDispClassColKeyIN,
1803 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1804 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1806 void *pvDispClassInfo;
1809 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1810 PVRSRV_BRIDGE_SET_DISPCLASS_DSTCOLOURKEY);
1813 PVRSRVLookupHandle(psPerProc->psHandleBase,
1815 psSetDispClassColKeyIN->hDeviceKM,
1816 PVRSRV_HANDLE_TYPE_DISP_INFO);
1817 if (psRetOUT->eError != PVRSRV_OK)
1821 PVRSRVLookupHandle(psPerProc->psHandleBase,
1823 psSetDispClassColKeyIN->hSwapChain,
1824 PVRSRV_HANDLE_TYPE_DISP_SWAP_CHAIN);
1825 if (psRetOUT->eError != PVRSRV_OK)
1829 PVRSRVSetDCDstColourKeyKM(pvDispClassInfo,
1831 psSetDispClassColKeyIN->ui32CKColour);
1836 static int PVRSRVSetDCSrcColourKeyBW(u32 ui32BridgeID,
1837 struct PVRSRV_BRIDGE_IN_SET_DISPCLASS_COLOURKEY *psSetDispClassColKeyIN,
1838 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1839 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1841 void *pvDispClassInfo;
1844 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1845 PVRSRV_BRIDGE_SET_DISPCLASS_SRCCOLOURKEY);
1848 PVRSRVLookupHandle(psPerProc->psHandleBase,
1850 psSetDispClassColKeyIN->hDeviceKM,
1851 PVRSRV_HANDLE_TYPE_DISP_INFO);
1852 if (psRetOUT->eError != PVRSRV_OK)
1856 PVRSRVLookupHandle(psPerProc->psHandleBase,
1858 psSetDispClassColKeyIN->hSwapChain,
1859 PVRSRV_HANDLE_TYPE_DISP_SWAP_CHAIN);
1860 if (psRetOUT->eError != PVRSRV_OK)
1864 PVRSRVSetDCSrcColourKeyKM(pvDispClassInfo,
1866 psSetDispClassColKeyIN->ui32CKColour);
1871 static int PVRSRVGetDCBuffersBW(u32 ui32BridgeID,
1872 struct PVRSRV_BRIDGE_IN_GET_DISPCLASS_BUFFERS *psGetDispClassBuffersIN,
1873 struct PVRSRV_BRIDGE_OUT_GET_DISPCLASS_BUFFERS *psGetDispClassBuffersOUT,
1874 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1876 void *pvDispClassInfo;
1880 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1881 PVRSRV_BRIDGE_GET_DISPCLASS_BUFFERS);
1883 NEW_HANDLE_BATCH_OR_ERROR(psGetDispClassBuffersOUT->eError, psPerProc,
1884 PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS);
1886 psGetDispClassBuffersOUT->eError =
1887 PVRSRVLookupHandle(psPerProc->psHandleBase,
1889 psGetDispClassBuffersIN->hDeviceKM,
1890 PVRSRV_HANDLE_TYPE_DISP_INFO);
1891 if (psGetDispClassBuffersOUT->eError != PVRSRV_OK)
1894 psGetDispClassBuffersOUT->eError =
1895 PVRSRVLookupHandle(psPerProc->psHandleBase,
1897 psGetDispClassBuffersIN->hSwapChain,
1898 PVRSRV_HANDLE_TYPE_DISP_SWAP_CHAIN);
1899 if (psGetDispClassBuffersOUT->eError != PVRSRV_OK)
1902 psGetDispClassBuffersOUT->eError =
1903 PVRSRVGetDCBuffersKM(pvDispClassInfo,
1905 &psGetDispClassBuffersOUT->ui32BufferCount,
1906 psGetDispClassBuffersOUT->ahBuffer);
1907 if (psGetDispClassBuffersOUT->eError != PVRSRV_OK)
1910 PVR_ASSERT(psGetDispClassBuffersOUT->ui32BufferCount <=
1911 PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS);
1913 for (i = 0; i < psGetDispClassBuffersOUT->ui32BufferCount; i++) {
1916 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1918 psGetDispClassBuffersOUT->ahBuffer[i],
1919 PVRSRV_HANDLE_TYPE_DISP_BUFFER,
1920 (enum PVRSRV_HANDLE_ALLOC_FLAG)
1921 (PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE |
1922 PVRSRV_HANDLE_ALLOC_FLAG_SHARED),
1923 psGetDispClassBuffersIN->hSwapChain);
1925 psGetDispClassBuffersOUT->ahBuffer[i] = hBufferExt;
1928 COMMIT_HANDLE_BATCH_OR_ERROR(psGetDispClassBuffersOUT->eError,
1934 static int PVRSRVSwapToDCBufferBW(u32 ui32BridgeID,
1935 struct PVRSRV_BRIDGE_IN_SWAP_DISPCLASS_TO_BUFFER *psSwapDispClassBufferIN,
1936 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1937 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1939 void *pvDispClassInfo;
1940 void *pvSwapChainBuf;
1942 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1943 PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER);
1945 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1947 psSwapDispClassBufferIN->hDeviceKM,
1948 PVRSRV_HANDLE_TYPE_DISP_INFO);
1949 if (psRetOUT->eError != PVRSRV_OK)
1953 PVRSRVLookupSubHandle(psPerProc->psHandleBase,
1955 psSwapDispClassBufferIN->hBuffer,
1956 PVRSRV_HANDLE_TYPE_DISP_BUFFER,
1957 psSwapDispClassBufferIN->hDeviceKM);
1958 if (psRetOUT->eError != PVRSRV_OK)
1962 PVRSRVSwapToDCBufferKM(pvDispClassInfo,
1964 psSwapDispClassBufferIN->ui32SwapInterval,
1965 psSwapDispClassBufferIN->hPrivateTag,
1966 psSwapDispClassBufferIN->ui32ClipRectCount,
1967 psSwapDispClassBufferIN->sClipRect);
1972 static int PVRSRVSwapToDCSystemBW(u32 ui32BridgeID,
1973 struct PVRSRV_BRIDGE_IN_SWAP_DISPCLASS_TO_SYSTEM *psSwapDispClassSystemIN,
1974 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
1975 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
1977 void *pvDispClassInfo;
1980 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
1981 PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_SYSTEM);
1984 PVRSRVLookupHandle(psPerProc->psHandleBase,
1986 psSwapDispClassSystemIN->hDeviceKM,
1987 PVRSRV_HANDLE_TYPE_DISP_INFO);
1988 if (psRetOUT->eError != PVRSRV_OK)
1992 PVRSRVLookupSubHandle(psPerProc->psHandleBase,
1994 psSwapDispClassSystemIN->hSwapChain,
1995 PVRSRV_HANDLE_TYPE_DISP_SWAP_CHAIN,
1996 psSwapDispClassSystemIN->hDeviceKM);
1997 if (psRetOUT->eError != PVRSRV_OK)
1999 psRetOUT->eError = PVRSRVSwapToDCSystemKM(pvDispClassInfo, pvSwapChain);
2004 static int PVRSRVOpenBCDeviceBW(u32 ui32BridgeID,
2005 struct PVRSRV_BRIDGE_IN_OPEN_BUFFERCLASS_DEVICE *psOpenBufferClassDeviceIN,
2006 struct PVRSRV_BRIDGE_OUT_OPEN_BUFFERCLASS_DEVICE *psOpenBufferClassDeviceOUT,
2007 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2009 void *hDevCookieInt;
2010 void *hBufClassInfo;
2012 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
2013 PVRSRV_BRIDGE_OPEN_BUFFERCLASS_DEVICE);
2015 NEW_HANDLE_BATCH_OR_ERROR(psOpenBufferClassDeviceOUT->eError, psPerProc,
2018 psOpenBufferClassDeviceOUT->eError =
2019 PVRSRVLookupHandle(psPerProc->psHandleBase,
2021 psOpenBufferClassDeviceIN->hDevCookie,
2022 PVRSRV_HANDLE_TYPE_DEV_NODE);
2023 if (psOpenBufferClassDeviceOUT->eError != PVRSRV_OK)
2026 psOpenBufferClassDeviceOUT->eError =
2027 PVRSRVOpenBCDeviceKM(psPerProc,
2028 psOpenBufferClassDeviceIN->ui32DeviceID,
2029 hDevCookieInt, &hBufClassInfo);
2030 if (psOpenBufferClassDeviceOUT->eError != PVRSRV_OK)
2033 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
2034 &psOpenBufferClassDeviceOUT->hDeviceKM,
2036 PVRSRV_HANDLE_TYPE_BUF_INFO,
2037 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
2039 COMMIT_HANDLE_BATCH_OR_ERROR(psOpenBufferClassDeviceOUT->eError,
2045 static int PVRSRVCloseBCDeviceBW(u32 ui32BridgeID,
2046 struct PVRSRV_BRIDGE_IN_CLOSE_BUFFERCLASS_DEVICE *psCloseBufferClassDeviceIN,
2047 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
2048 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2050 void *pvBufClassInfo;
2052 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
2053 PVRSRV_BRIDGE_CLOSE_BUFFERCLASS_DEVICE);
2055 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
2057 psCloseBufferClassDeviceIN->hDeviceKM,
2058 PVRSRV_HANDLE_TYPE_BUF_INFO);
2059 if (psRetOUT->eError != PVRSRV_OK)
2062 psRetOUT->eError = PVRSRVCloseBCDeviceKM(pvBufClassInfo, IMG_FALSE);
2064 if (psRetOUT->eError != PVRSRV_OK)
2067 psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
2068 psCloseBufferClassDeviceIN->
2070 PVRSRV_HANDLE_TYPE_BUF_INFO);
2075 static int PVRSRVGetBCInfoBW(u32 ui32BridgeID,
2076 struct PVRSRV_BRIDGE_IN_GET_BUFFERCLASS_INFO *psGetBufferClassInfoIN,
2077 struct PVRSRV_BRIDGE_OUT_GET_BUFFERCLASS_INFO *psGetBufferClassInfoOUT,
2078 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2080 void *pvBufClassInfo;
2082 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
2083 PVRSRV_BRIDGE_GET_BUFFERCLASS_INFO);
2085 psGetBufferClassInfoOUT->eError =
2086 PVRSRVLookupHandle(psPerProc->psHandleBase,
2088 psGetBufferClassInfoIN->hDeviceKM,
2089 PVRSRV_HANDLE_TYPE_BUF_INFO);
2090 if (psGetBufferClassInfoOUT->eError != PVRSRV_OK)
2093 psGetBufferClassInfoOUT->eError =
2094 PVRSRVGetBCInfoKM(pvBufClassInfo,
2095 &psGetBufferClassInfoOUT->sBufferInfo);
2099 static int PVRSRVGetBCBufferBW(u32 ui32BridgeID,
2100 struct PVRSRV_BRIDGE_IN_GET_BUFFERCLASS_BUFFER *psGetBufferClassBufferIN,
2101 struct PVRSRV_BRIDGE_OUT_GET_BUFFERCLASS_BUFFER *psGetBufferClassBufferOUT,
2102 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2104 void *pvBufClassInfo;
2107 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
2108 PVRSRV_BRIDGE_GET_BUFFERCLASS_BUFFER);
2110 NEW_HANDLE_BATCH_OR_ERROR(psGetBufferClassBufferOUT->eError, psPerProc,
2113 psGetBufferClassBufferOUT->eError =
2114 PVRSRVLookupHandle(psPerProc->psHandleBase,
2116 psGetBufferClassBufferIN->hDeviceKM,
2117 PVRSRV_HANDLE_TYPE_BUF_INFO);
2118 if (psGetBufferClassBufferOUT->eError != PVRSRV_OK)
2121 psGetBufferClassBufferOUT->eError =
2122 PVRSRVGetBCBufferKM(pvBufClassInfo,
2123 psGetBufferClassBufferIN->ui32BufferIndex,
2126 if (psGetBufferClassBufferOUT->eError != PVRSRV_OK)
2129 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
2130 &psGetBufferClassBufferOUT->hBuffer,
2132 PVRSRV_HANDLE_TYPE_BUF_BUFFER,
2133 (enum PVRSRV_HANDLE_ALLOC_FLAG)
2134 (PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE |
2135 PVRSRV_HANDLE_ALLOC_FLAG_SHARED),
2136 psGetBufferClassBufferIN->hDeviceKM);
2138 COMMIT_HANDLE_BATCH_OR_ERROR(psGetBufferClassBufferOUT->eError,
2144 static int PVRSRVAllocSharedSysMemoryBW(u32 ui32BridgeID,
2145 struct PVRSRV_BRIDGE_IN_ALLOC_SHARED_SYS_MEM *psAllocSharedSysMemIN,
2146 struct PVRSRV_BRIDGE_OUT_ALLOC_SHARED_SYS_MEM *psAllocSharedSysMemOUT,
2147 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2149 struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
2151 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
2152 PVRSRV_BRIDGE_ALLOC_SHARED_SYS_MEM);
2154 NEW_HANDLE_BATCH_OR_ERROR(psAllocSharedSysMemOUT->eError, psPerProc, 1);
2156 psAllocSharedSysMemOUT->eError =
2157 PVRSRVAllocSharedSysMemoryKM(psPerProc,
2158 psAllocSharedSysMemIN->ui32Flags,
2159 psAllocSharedSysMemIN->ui32Size,
2161 if (psAllocSharedSysMemOUT->eError != PVRSRV_OK)
2164 OSMemSet(&psAllocSharedSysMemOUT->sClientMemInfo,
2165 0, sizeof(psAllocSharedSysMemOUT->sClientMemInfo));
2167 psAllocSharedSysMemOUT->sClientMemInfo.pvLinAddrKM =
2168 psKernelMemInfo->pvLinAddrKM;
2170 psAllocSharedSysMemOUT->sClientMemInfo.pvLinAddr = NULL;
2171 psAllocSharedSysMemOUT->sClientMemInfo.ui32Flags =
2172 psKernelMemInfo->ui32Flags;
2173 psAllocSharedSysMemOUT->sClientMemInfo.ui32AllocSize =
2174 psKernelMemInfo->ui32AllocSize;
2175 psAllocSharedSysMemOUT->sClientMemInfo.hMappingInfo =
2176 psKernelMemInfo->sMemBlk.hOSMemHandle;
2178 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
2179 &psAllocSharedSysMemOUT->sClientMemInfo.hKernelMemInfo,
2181 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO,
2182 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
2184 COMMIT_HANDLE_BATCH_OR_ERROR(psAllocSharedSysMemOUT->eError, psPerProc);
2189 static int PVRSRVFreeSharedSysMemoryBW(u32 ui32BridgeID,
2190 struct PVRSRV_BRIDGE_IN_FREE_SHARED_SYS_MEM *psFreeSharedSysMemIN,
2191 struct PVRSRV_BRIDGE_OUT_FREE_SHARED_SYS_MEM *psFreeSharedSysMemOUT,
2192 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2194 struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
2196 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
2197 PVRSRV_BRIDGE_FREE_SHARED_SYS_MEM);
2199 psFreeSharedSysMemOUT->eError =
2200 PVRSRVLookupHandle(psPerProc->psHandleBase,
2201 (void **)&psKernelMemInfo,
2202 psFreeSharedSysMemIN->psKernelMemInfo,
2203 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
2205 if (psFreeSharedSysMemOUT->eError != PVRSRV_OK)
2208 psFreeSharedSysMemOUT->eError =
2209 PVRSRVFreeSharedSysMemoryKM(psKernelMemInfo);
2210 if (psFreeSharedSysMemOUT->eError != PVRSRV_OK)
2213 psFreeSharedSysMemOUT->eError =
2214 PVRSRVReleaseHandle(psPerProc->psHandleBase,
2215 psFreeSharedSysMemIN->psKernelMemInfo,
2216 PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
2220 static int PVRSRVMapMemInfoMemBW(u32 ui32BridgeID,
2221 struct PVRSRV_BRIDGE_IN_MAP_MEMINFO_MEM *psMapMemInfoMemIN,
2222 struct PVRSRV_BRIDGE_OUT_MAP_MEMINFO_MEM *psMapMemInfoMemOUT,
2223 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2225 struct PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
2226 enum PVRSRV_HANDLE_TYPE eHandleType;
2228 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_MAP_MEMINFO_MEM);
2230 NEW_HANDLE_BATCH_OR_ERROR(psMapMemInfoMemOUT->eError, psPerProc, 2);
2232 psMapMemInfoMemOUT->eError =
2233 PVRSRVLookupHandleAnyType(psPerProc->psHandleBase,
2234 (void **)&psKernelMemInfo, &eHandleType,
2235 psMapMemInfoMemIN->hKernelMemInfo);
2236 if (psMapMemInfoMemOUT->eError != PVRSRV_OK)
2239 switch (eHandleType) {
2240 case PVRSRV_HANDLE_TYPE_MEM_INFO:
2241 case PVRSRV_HANDLE_TYPE_MEM_INFO_REF:
2242 case PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO:
2245 psMapMemInfoMemOUT->eError = PVRSRV_ERROR_GENERIC;
2249 psMapMemInfoMemOUT->eError =
2250 PVRSRVGetParentHandle(psPerProc->psHandleBase, &hParent,
2251 psMapMemInfoMemIN->hKernelMemInfo,
2253 if (psMapMemInfoMemOUT->eError != PVRSRV_OK)
2255 if (hParent == NULL)
2256 hParent = psMapMemInfoMemIN->hKernelMemInfo;
2258 OSMemSet(&psMapMemInfoMemOUT->sClientMemInfo,
2259 0, sizeof(psMapMemInfoMemOUT->sClientMemInfo));
2261 psMapMemInfoMemOUT->sClientMemInfo.pvLinAddrKM =
2262 psKernelMemInfo->pvLinAddrKM;
2264 psMapMemInfoMemOUT->sClientMemInfo.pvLinAddr = NULL;
2265 psMapMemInfoMemOUT->sClientMemInfo.sDevVAddr =
2266 psKernelMemInfo->sDevVAddr;
2267 psMapMemInfoMemOUT->sClientMemInfo.ui32Flags =
2268 psKernelMemInfo->ui32Flags;
2269 psMapMemInfoMemOUT->sClientMemInfo.ui32AllocSize =
2270 psKernelMemInfo->ui32AllocSize;
2271 psMapMemInfoMemOUT->sClientMemInfo.hMappingInfo =
2272 psKernelMemInfo->sMemBlk.hOSMemHandle;
2274 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
2275 &psMapMemInfoMemOUT->sClientMemInfo.hKernelMemInfo,
2277 PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
2278 PVRSRV_HANDLE_ALLOC_FLAG_MULTI, hParent);
2280 if (psKernelMemInfo->ui32Flags & PVRSRV_MEM_NO_SYNCOBJ) {
2281 OSMemSet(&psMapMemInfoMemOUT->sClientSyncInfo, 0,
2282 sizeof(struct PVRSRV_CLIENT_SYNC_INFO));
2283 psMapMemInfoMemOUT->psKernelSyncInfo = NULL;
2285 psMapMemInfoMemOUT->sClientSyncInfo.psSyncData =
2286 psKernelMemInfo->psKernelSyncInfo->psSyncData;
2287 psMapMemInfoMemOUT->sClientSyncInfo.sWriteOpsCompleteDevVAddr =
2288 psKernelMemInfo->psKernelSyncInfo->
2289 sWriteOpsCompleteDevVAddr;
2290 psMapMemInfoMemOUT->sClientSyncInfo.sReadOpsCompleteDevVAddr =
2291 psKernelMemInfo->psKernelSyncInfo->sReadOpsCompleteDevVAddr;
2293 psMapMemInfoMemOUT->sClientSyncInfo.hMappingInfo =
2294 psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->
2295 sMemBlk.hOSMemHandle;
2297 psMapMemInfoMemOUT->sClientMemInfo.psClientSyncInfo =
2298 &psMapMemInfoMemOUT->sClientSyncInfo;
2300 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
2301 &psMapMemInfoMemOUT->sClientSyncInfo.hKernelSyncInfo,
2302 psKernelMemInfo->psKernelSyncInfo,
2303 PVRSRV_HANDLE_TYPE_SYNC_INFO,
2304 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
2305 psMapMemInfoMemOUT->sClientMemInfo.hKernelMemInfo);
2308 COMMIT_HANDLE_BATCH_OR_ERROR(psMapMemInfoMemOUT->eError, psPerProc);
2313 static int PVRSRVModifySyncOpsBW(u32 ui32BridgeID,
2314 struct PVRSRV_BRIDGE_IN_MODIFY_SYNC_OPS *psModifySyncOpsIN,
2315 struct PVRSRV_BRIDGE_OUT_MODIFY_SYNC_OPS *psModifySyncOpsOUT,
2316 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2318 void *hKernelSyncInfo;
2319 struct PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo;
2321 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_MODIFY_SYNC_OPS);
2323 psModifySyncOpsOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
2325 psModifySyncOpsIN->hKernelSyncInfo,
2326 PVRSRV_HANDLE_TYPE_SYNC_INFO);
2327 if (psModifySyncOpsOUT->eError != PVRSRV_OK)
2330 psKernelSyncInfo = (struct PVRSRV_KERNEL_SYNC_INFO *)hKernelSyncInfo;
2332 /* We return PRE-INCREMENTED versions of all sync Op Values */
2334 psModifySyncOpsOUT->ui32ReadOpsPending =
2335 psKernelSyncInfo->psSyncData->ui32ReadOpsPending;
2337 psModifySyncOpsOUT->ui32WriteOpsPending =
2338 psKernelSyncInfo->psSyncData->ui32WriteOpsPending;
2340 psModifySyncOpsOUT->ui32ReadOpsComplete =
2341 psKernelSyncInfo->psSyncData->ui32ReadOpsComplete;
2343 psModifySyncOpsOUT->ui32WriteOpsComplete =
2344 psKernelSyncInfo->psSyncData->ui32WriteOpsComplete;
2346 if (psModifySyncOpsIN->ui32ModifyFlags &
2347 PVRSRV_MODIFYSYNCOPS_FLAGS_WOP_INC)
2348 psKernelSyncInfo->psSyncData->ui32WriteOpsPending++;
2350 if (psModifySyncOpsIN->ui32ModifyFlags &
2351 PVRSRV_MODIFYSYNCOPS_FLAGS_ROP_INC)
2352 psKernelSyncInfo->psSyncData->ui32ReadOpsPending++;
2354 if (psModifySyncOpsIN->ui32ModifyFlags &
2355 PVRSRV_MODIFYSYNCOPS_FLAGS_WOC_INC)
2356 psKernelSyncInfo->psSyncData->ui32WriteOpsComplete++;
2358 if (psModifySyncOpsIN->ui32ModifyFlags &
2359 PVRSRV_MODIFYSYNCOPS_FLAGS_ROC_INC)
2360 psKernelSyncInfo->psSyncData->ui32ReadOpsComplete++;
2365 static int MMU_GetPDDevPAddrBW(u32 ui32BridgeID,
2366 struct PVRSRV_BRIDGE_IN_GETMMU_PD_DEVPADDR *psGetMmuPDDevPAddrIN,
2367 struct PVRSRV_BRIDGE_OUT_GETMMU_PD_DEVPADDR *psGetMmuPDDevPAddrOUT,
2368 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2370 void *hDevMemContextInt;
2372 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
2373 PVRSRV_BRIDGE_GETMMU_PD_DEVPADDR);
2375 psGetMmuPDDevPAddrOUT->eError =
2376 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevMemContextInt,
2377 psGetMmuPDDevPAddrIN->hDevMemContext,
2378 PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
2379 if (psGetMmuPDDevPAddrOUT->eError != PVRSRV_OK)
2382 psGetMmuPDDevPAddrOUT->sPDDevPAddr =
2383 BM_GetDeviceNode(hDevMemContextInt)->
2384 pfnMMUGetPDDevPAddr(BM_GetMMUContextFromMemContext
2385 (hDevMemContextInt));
2386 if (psGetMmuPDDevPAddrOUT->sPDDevPAddr.uiAddr)
2387 psGetMmuPDDevPAddrOUT->eError = PVRSRV_OK;
2389 psGetMmuPDDevPAddrOUT->eError = PVRSRV_ERROR_GENERIC;
2393 int DummyBW(u32 ui32BridgeID, void *psBridgeIn, void *psBridgeOut,
2394 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2396 #if !defined(CONFIG_PVR_DEBUG_EXTRA)
2397 PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
2399 PVR_UNREFERENCED_PARAMETER(psBridgeIn);
2400 PVR_UNREFERENCED_PARAMETER(psBridgeOut);
2401 PVR_UNREFERENCED_PARAMETER(psPerProc);
2403 #if defined(DEBUG_BRIDGE_KM)
2404 PVR_DPF(PVR_DBG_ERROR, "%s: BRIDGE ERROR: BridgeID %lu (%s) mapped to "
2405 "Dummy Wrapper (probably not what you want!)",
2406 __func__, ui32BridgeID,
2407 g_BridgeDispatchTable[ui32BridgeID].pszIOCName);
2409 PVR_DPF(PVR_DBG_ERROR, "%s: BRIDGE ERROR: BridgeID %lu mapped to "
2410 "Dummy Wrapper (probably not what you want!)",
2411 __func__, ui32BridgeID);
2416 void _SetDispatchTableEntry(u32 ui32Index, const char *pszIOCName,
2417 int (*pfFunction)(u32 ui32BridgeID,
2420 struct PVRSRV_PER_PROCESS_DATA
2422 const char *pszFunctionName)
2424 static u32 ui32PrevIndex = ~0UL;
2425 #if !defined(CONFIG_PVR_DEBUG_EXTRA)
2426 PVR_UNREFERENCED_PARAMETER(pszIOCName);
2428 #if !defined(DEBUG_BRIDGE_KM_DISPATCH_TABLE) && !defined(DEBUG_BRIDGE_KM)
2429 PVR_UNREFERENCED_PARAMETER(pszFunctionName);
2433 if (g_BridgeDispatchTable[ui32Index].pfFunction) {
2434 #if defined(DEBUG_BRIDGE_KM)
2435 PVR_DPF(PVR_DBG_ERROR, "%s: BUG!: "
2436 "Adding dispatch table entry for %s "
2437 "clobbers an existing entry for %s",
2438 __func__, pszIOCName,
2439 g_BridgeDispatchTable[ui32Index].pszIOCName);
2441 PVR_DPF(PVR_DBG_ERROR, "%s: BUG!: "
2442 "Adding dispatch table entry for %s "
2443 "clobbers an existing entry (index=%lu)",
2444 __func__, pszIOCName, ui32Index);
2446 PVR_DPF(PVR_DBG_ERROR,
2447 "NOTE: Enabling DEBUG_BRIDGE_KM_DISPATCH_TABLE may help debug this issue.",
2451 if ((ui32PrevIndex != ~0UL) &&
2452 ((ui32Index >= ui32PrevIndex + DISPATCH_TABLE_GAP_THRESHOLD) ||
2453 (ui32Index <= ui32PrevIndex))) {
2454 #if defined(DEBUG_BRIDGE_KM)
2455 PVR_DPF(PVR_DBG_WARNING,
2456 "%s: There is a gap in the dispatch table "
2457 "between indices %lu (%s) and %lu (%s)",
2458 __func__, ui32PrevIndex,
2459 g_BridgeDispatchTable[ui32PrevIndex].pszIOCName,
2460 ui32Index, pszIOCName);
2462 PVR_DPF(PVR_DBG_WARNING,
2463 "%s: There is a gap in the dispatch table "
2464 "between indices %u and %u (%s)",
2465 __func__, (unsigned)ui32PrevIndex, (unsigned)ui32Index,
2468 PVR_DPF(PVR_DBG_ERROR,
2469 "NOTE: Enabling DEBUG_BRIDGE_KM_DISPATCH_TABLE "
2470 "may help debug this issue.",
2474 g_BridgeDispatchTable[ui32Index].pfFunction = pfFunction;
2475 #if defined(DEBUG_BRIDGE_KM)
2476 g_BridgeDispatchTable[ui32Index].pszIOCName = pszIOCName;
2477 g_BridgeDispatchTable[ui32Index].pszFunctionName = pszFunctionName;
2478 g_BridgeDispatchTable[ui32Index].ui32CallCount = 0;
2479 g_BridgeDispatchTable[ui32Index].ui32CopyFromUserTotalBytes = 0;
2482 ui32PrevIndex = ui32Index;
2485 static int PVRSRVInitSrvConnectBW(u32 ui32BridgeID, void *psBridgeIn,
2486 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
2487 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2489 PVR_UNREFERENCED_PARAMETER(psBridgeIn);
2491 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_INITSRV_CONNECT);
2492 PVR_UNREFERENCED_PARAMETER(psBridgeIn);
2494 if (!OSProcHasPrivSrvInit() ||
2495 PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RUNNING) ||
2496 PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RAN)) {
2497 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
2501 PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_RUNNING, IMG_TRUE);
2502 psPerProc->bInitProcess = IMG_TRUE;
2504 psRetOUT->eError = PVRSRV_OK;
2509 static int PVRSRVInitSrvDisconnectBW(u32 ui32BridgeID,
2510 struct PVRSRV_BRIDGE_IN_INITSRV_DISCONNECT *psInitSrvDisconnectIN,
2511 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
2512 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2514 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
2515 PVRSRV_BRIDGE_INITSRV_DISCONNECT);
2517 if (!psPerProc->bInitProcess) {
2518 psRetOUT->eError = PVRSRV_ERROR_GENERIC;
2522 psPerProc->bInitProcess = IMG_FALSE;
2524 PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_RUNNING, IMG_FALSE);
2525 PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_RAN, IMG_TRUE);
2528 PVRSRVFinaliseSystem(psInitSrvDisconnectIN->bInitSuccesful);
2530 PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL,
2531 (IMG_BOOL)(((psRetOUT->eError == PVRSRV_OK) &&
2532 (psInitSrvDisconnectIN->
2538 static int PVRSRVEventObjectWaitBW(u32 ui32BridgeID,
2539 struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_WAIT *psEventObjectWaitIN,
2540 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
2541 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2545 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EVENT_OBJECT_WAIT);
2547 psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
2549 psEventObjectWaitIN->hOSEventKM,
2550 PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT);
2552 if (psRetOUT->eError != PVRSRV_OK)
2555 psRetOUT->eError = OSEventObjectWait(hOSEventKM);
2560 static int PVRSRVEventObjectOpenBW(u32 ui32BridgeID,
2561 struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_OPEN *psEventObjectOpenIN,
2562 struct PVRSRV_BRIDGE_OUT_EVENT_OBJECT_OPEN *psEventObjectOpenOUT,
2563 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2566 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EVENT_OBJECT_OPEN);
2568 NEW_HANDLE_BATCH_OR_ERROR(psEventObjectOpenOUT->eError, psPerProc, 1);
2570 psEventObjectOpenOUT->eError =
2571 PVRSRVLookupHandle(psPerProc->psHandleBase,
2572 &psEventObjectOpenIN->sEventObject.hOSEventKM,
2573 psEventObjectOpenIN->sEventObject.hOSEventKM,
2574 PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT);
2576 if (psEventObjectOpenOUT->eError != PVRSRV_OK)
2579 psEventObjectOpenOUT->eError =
2580 OSEventObjectOpen(&psEventObjectOpenIN->sEventObject,
2581 &psEventObjectOpenOUT->hOSEvent);
2583 if (psEventObjectOpenOUT->eError != PVRSRV_OK)
2586 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
2587 &psEventObjectOpenOUT->hOSEvent,
2588 psEventObjectOpenOUT->hOSEvent,
2589 PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT,
2590 PVRSRV_HANDLE_ALLOC_FLAG_MULTI);
2592 COMMIT_HANDLE_BATCH_OR_ERROR(psEventObjectOpenOUT->eError, psPerProc);
2597 static int PVRSRVEventObjectCloseBW(u32 ui32BridgeID,
2598 struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_CLOSE *psEventObjectCloseIN,
2599 struct PVRSRV_BRIDGE_RETURN *psRetOUT,
2600 struct PVRSRV_PER_PROCESS_DATA *psPerProc)
2604 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
2605 PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE);
2608 PVRSRVLookupHandle(psPerProc->psHandleBase,
2609 &psEventObjectCloseIN->sEventObject.hOSEventKM,
2610 psEventObjectCloseIN->sEventObject.hOSEventKM,
2611 PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT);
2612 if (psRetOUT->eError != PVRSRV_OK)
2615 psRetOUT->eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
2617 psEventObjectCloseIN->hOSEventKM,
2618 PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT);
2620 if (psRetOUT->eError != PVRSRV_OK)
2624 OSEventObjectClose(&psEventObjectCloseIN->sEventObject, hOSEventKM);
2629 enum PVRSRV_ERROR CommonBridgeInit(void)
2633 SetDispatchTableEntry(PVRSRV_BRIDGE_ENUM_DEVICES,
2634 PVRSRVEnumerateDevicesBW);
2635 SetDispatchTableEntry(PVRSRV_BRIDGE_ACQUIRE_DEVICEINFO,
2636 PVRSRVAcquireDeviceDataBW);
2637 SetDispatchTableEntry(PVRSRV_BRIDGE_RELEASE_DEVICEINFO, DummyBW);
2638 SetDispatchTableEntry(PVRSRV_BRIDGE_CREATE_DEVMEMCONTEXT,
2639 PVRSRVCreateDeviceMemContextBW);
2640 SetDispatchTableEntry(PVRSRV_BRIDGE_DESTROY_DEVMEMCONTEXT,
2641 PVRSRVDestroyDeviceMemContextBW);
2642 SetDispatchTableEntry(PVRSRV_BRIDGE_GET_DEVMEM_HEAPINFO,
2643 PVRSRVGetDeviceMemHeapInfoBW);
2644 SetDispatchTableEntry(PVRSRV_BRIDGE_ALLOC_DEVICEMEM,
2645 PVRSRVAllocDeviceMemBW);
2646 SetDispatchTableEntry(PVRSRV_BRIDGE_FREE_DEVICEMEM,
2647 PVRSRVFreeDeviceMemBW);
2648 SetDispatchTableEntry(PVRSRV_BRIDGE_GETFREE_DEVICEMEM,
2649 PVRSRVGetFreeDeviceMemBW);
2650 SetDispatchTableEntry(PVRSRV_BRIDGE_CREATE_COMMANDQUEUE, DummyBW);
2651 SetDispatchTableEntry(PVRSRV_BRIDGE_DESTROY_COMMANDQUEUE, DummyBW);
2652 SetDispatchTableEntry(PVRSRV_BRIDGE_MHANDLE_TO_MMAP_DATA,
2653 PVRMMapOSMemHandleToMMapDataBW);
2654 SetDispatchTableEntry(PVRSRV_BRIDGE_CONNECT_SERVICES, PVRSRVConnectBW);
2655 SetDispatchTableEntry(PVRSRV_BRIDGE_DISCONNECT_SERVICES,
2656 PVRSRVDisconnectBW);
2657 SetDispatchTableEntry(PVRSRV_BRIDGE_WRAP_DEVICE_MEM, DummyBW);
2658 SetDispatchTableEntry(PVRSRV_BRIDGE_GET_DEVICEMEMINFO, DummyBW);
2659 SetDispatchTableEntry(PVRSRV_BRIDGE_RESERVE_DEV_VIRTMEM, DummyBW);
2660 SetDispatchTableEntry(PVRSRV_BRIDGE_FREE_DEV_VIRTMEM, DummyBW);
2661 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_EXT_MEMORY, DummyBW);
2662 SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_EXT_MEMORY, DummyBW);
2663 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DEV_MEMORY,
2664 PVRSRVMapDeviceMemoryBW);
2665 SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_DEV_MEMORY,
2666 PVRSRVUnmapDeviceMemoryBW);
2667 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DEVICECLASS_MEMORY,
2668 PVRSRVMapDeviceClassMemoryBW);
2669 SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_DEVICECLASS_MEMORY,
2670 PVRSRVUnmapDeviceClassMemoryBW);
2671 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_MEM_INFO_TO_USER, DummyBW);
2672 SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_MEM_INFO_FROM_USER, DummyBW);
2673 SetDispatchTableEntry(PVRSRV_BRIDGE_EXPORT_DEVICEMEM,
2674 PVRSRVExportDeviceMemBW);
2675 SetDispatchTableEntry(PVRSRV_BRIDGE_RELEASE_MMAP_DATA,
2676 PVRMMapReleaseMMapDataBW);
2677 SetDispatchTableEntry(PVRSRV_BRIDGE_CACHE_FLUSH_DRM,
2678 PVRSRVCacheFlushDRIBW);
2680 SetDispatchTableEntry(PVRSRV_BRIDGE_PROCESS_SIMISR_EVENT, DummyBW);
2681 SetDispatchTableEntry(PVRSRV_BRIDGE_REGISTER_SIM_PROCESS, DummyBW);
2682 SetDispatchTableEntry(PVRSRV_BRIDGE_UNREGISTER_SIM_PROCESS, DummyBW);
2684 SetDispatchTableEntry(PVRSRV_BRIDGE_MAPPHYSTOUSERSPACE, DummyBW);
2685 SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAPPHYSTOUSERSPACE, DummyBW);
2686 SetDispatchTableEntry(PVRSRV_BRIDGE_GETPHYSTOUSERSPACEMAP, DummyBW);
2688 SetDispatchTableEntry(PVRSRV_BRIDGE_GET_FB_STATS, DummyBW);
2690 SetDispatchTableEntry(PVRSRV_BRIDGE_GET_MISC_INFO, PVRSRVGetMiscInfoBW);
2691 SetDispatchTableEntry(PVRSRV_BRIDGE_RELEASE_MISC_INFO, DummyBW);
2695 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_INIT, DummyBW);
2696 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_MEMPOL, PDumpMemPolBW);
2697 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_DUMPMEM, PDumpMemBW);
2698 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_REG, PDumpRegWithFlagsBW);
2699 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_REGPOL, PDumpRegPolBW);
2700 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_COMMENT, PDumpCommentBW);
2701 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_SETFRAME, PDumpSetFrameBW);
2702 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_ISCAPTURING,
2703 PDumpIsCaptureFrameBW);
2704 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_DUMPBITMAP, PDumpBitmapBW);
2705 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_DUMPREADREG, DummyBW);
2706 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_SYNCPOL, PDumpSyncPolBW);
2707 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_DUMPSYNC, PDumpSyncDumpBW);
2708 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_DRIVERINFO, DummyBW);
2709 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_PDREG, PDumpPDRegBW);
2710 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_DUMPPDDEVPADDR,
2712 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_CYCLE_COUNT_REG_READ,
2713 PDumpCycleCountRegReadBW);
2714 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_STARTINITPHASE, DummyBW);
2715 SetDispatchTableEntry(PVRSRV_BRIDGE_PDUMP_STOPINITPHASE, DummyBW);
2718 SetDispatchTableEntry(PVRSRV_BRIDGE_GET_OEMJTABLE, DummyBW);
2720 SetDispatchTableEntry(PVRSRV_BRIDGE_ENUM_CLASS, PVRSRVEnumerateDCBW);
2722 SetDispatchTableEntry(PVRSRV_BRIDGE_OPEN_DISPCLASS_DEVICE,
2723 PVRSRVOpenDCDeviceBW);
2724 SetDispatchTableEntry(PVRSRV_BRIDGE_CLOSE_DISPCLASS_DEVICE,
2725 PVRSRVCloseDCDeviceBW);
2726 SetDispatchTableEntry(PVRSRV_BRIDGE_ENUM_DISPCLASS_FORMATS,
2727 PVRSRVEnumDCFormatsBW);
2728 SetDispatchTableEntry(PVRSRV_BRIDGE_ENUM_DISPCLASS_DIMS,
2729 PVRSRVEnumDCDimsBW);
2730 SetDispatchTableEntry(PVRSRV_BRIDGE_GET_DISPCLASS_SYSBUFFER,
2731 PVRSRVGetDCSystemBufferBW);
2732 SetDispatchTableEntry(PVRSRV_BRIDGE_GET_DISPCLASS_INFO,
2734 SetDispatchTableEntry(PVRSRV_BRIDGE_CREATE_DISPCLASS_SWAPCHAIN,
2735 PVRSRVCreateDCSwapChainBW);
2736 SetDispatchTableEntry(PVRSRV_BRIDGE_DESTROY_DISPCLASS_SWAPCHAIN,
2737 PVRSRVDestroyDCSwapChainBW);
2738 SetDispatchTableEntry(PVRSRV_BRIDGE_SET_DISPCLASS_DSTRECT,
2739 PVRSRVSetDCDstRectBW);
2740 SetDispatchTableEntry(PVRSRV_BRIDGE_SET_DISPCLASS_SRCRECT,
2741 PVRSRVSetDCSrcRectBW);
2742 SetDispatchTableEntry(PVRSRV_BRIDGE_SET_DISPCLASS_DSTCOLOURKEY,
2743 PVRSRVSetDCDstColourKeyBW);
2744 SetDispatchTableEntry(PVRSRV_BRIDGE_SET_DISPCLASS_SRCCOLOURKEY,
2745 PVRSRVSetDCSrcColourKeyBW);
2746 SetDispatchTableEntry(PVRSRV_BRIDGE_GET_DISPCLASS_BUFFERS,
2747 PVRSRVGetDCBuffersBW);
2748 SetDispatchTableEntry(PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER,
2749 PVRSRVSwapToDCBufferBW);
2750 SetDispatchTableEntry(PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_SYSTEM,
2751 PVRSRVSwapToDCSystemBW);
2753 SetDispatchTableEntry(PVRSRV_BRIDGE_OPEN_BUFFERCLASS_DEVICE,
2754 PVRSRVOpenBCDeviceBW);
2755 SetDispatchTableEntry(PVRSRV_BRIDGE_CLOSE_BUFFERCLASS_DEVICE,
2756 PVRSRVCloseBCDeviceBW);
2757 SetDispatchTableEntry(PVRSRV_BRIDGE_GET_BUFFERCLASS_INFO,
2759 SetDispatchTableEntry(PVRSRV_BRIDGE_GET_BUFFERCLASS_BUFFER,
2760 PVRSRVGetBCBufferBW);
2762 SetDispatchTableEntry(PVRSRV_BRIDGE_WRAP_EXT_MEMORY,
2763 PVRSRVWrapExtMemoryBW);
2764 SetDispatchTableEntry(PVRSRV_BRIDGE_UNWRAP_EXT_MEMORY,
2765 PVRSRVUnwrapExtMemoryBW);
2767 SetDispatchTableEntry(PVRSRV_BRIDGE_ALLOC_SHARED_SYS_MEM,
2768 PVRSRVAllocSharedSysMemoryBW);
2769 SetDispatchTableEntry(PVRSRV_BRIDGE_FREE_SHARED_SYS_MEM,
2770 PVRSRVFreeSharedSysMemoryBW);
2771 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_MEMINFO_MEM,
2772 PVRSRVMapMemInfoMemBW);
2774 SetDispatchTableEntry(PVRSRV_BRIDGE_GETMMU_PD_DEVPADDR,
2775 MMU_GetPDDevPAddrBW);
2777 SetDispatchTableEntry(PVRSRV_BRIDGE_INITSRV_CONNECT,
2778 PVRSRVInitSrvConnectBW);
2779 SetDispatchTableEntry(PVRSRV_BRIDGE_INITSRV_DISCONNECT,
2780 PVRSRVInitSrvDisconnectBW);
2782 SetDispatchTableEntry(PVRSRV_BRIDGE_EVENT_OBJECT_WAIT,
2783 PVRSRVEventObjectWaitBW);
2784 SetDispatchTableEntry(PVRSRV_BRIDGE_EVENT_OBJECT_OPEN,
2785 PVRSRVEventObjectOpenBW);
2786 SetDispatchTableEntry(PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE,
2787 PVRSRVEventObjectCloseBW);
2789 SetDispatchTableEntry(PVRSRV_BRIDGE_MODIFY_SYNC_OPS,
2790 PVRSRVModifySyncOpsBW);
2792 SetSGXDispatchTableEntry();
2794 for (i = 0; i < BRIDGE_DISPATCH_TABLE_ENTRY_COUNT; i++)
2795 if (!g_BridgeDispatchTable[i].pfFunction) {
2796 g_BridgeDispatchTable[i].pfFunction = DummyBW;
2797 #if defined(DEBUG_BRIDGE_KM)
2798 g_BridgeDispatchTable[i].pszIOCName =
2799 "_PVRSRV_BRIDGE_DUMMY";
2800 g_BridgeDispatchTable[i].pszFunctionName = "DummyBW";
2801 g_BridgeDispatchTable[i].ui32CallCount = 0;
2802 g_BridgeDispatchTable[i].ui32CopyFromUserTotalBytes = 0;
2803 g_BridgeDispatchTable[i].ui32CopyToUserTotalBytes = 0;
2810 static int bridged_check_cmd(u32 cmd_id)
2812 if (PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RAN)) {
2813 if (!PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL)) {
2814 PVR_DPF(PVR_DBG_ERROR,
2815 "%s: Initialisation failed. Driver unusable.",
2820 if (PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_RUNNING)) {
2821 PVR_DPF(PVR_DBG_ERROR,
2822 "%s: Initialisation is in progress",
2827 case PVRSRV_GET_BRIDGE_ID(
2828 PVRSRV_BRIDGE_CONNECT_SERVICES):
2829 case PVRSRV_GET_BRIDGE_ID(
2830 PVRSRV_BRIDGE_DISCONNECT_SERVICES):
2831 case PVRSRV_GET_BRIDGE_ID(
2832 PVRSRV_BRIDGE_INITSRV_CONNECT):
2833 case PVRSRV_GET_BRIDGE_ID(
2834 PVRSRV_BRIDGE_INITSRV_DISCONNECT):
2837 PVR_DPF(PVR_DBG_ERROR,
2838 "%s: Driver initialisation not completed yet.",
2848 static int bridged_ioctl(struct file *filp, u32 cmd, void *in, void *out,
2850 struct PVRSRV_PER_PROCESS_DATA *per_proc)
2854 switch (PVRSRV_IOWR(cmd)) {
2855 case PVRSRV_BRIDGE_ENUM_DEVICES:
2856 err = PVRSRVEnumerateDevicesBW(cmd, in, out, per_proc);
2858 case PVRSRV_BRIDGE_ACQUIRE_DEVICEINFO:
2859 err = PVRSRVAcquireDeviceDataBW(cmd, in, out, per_proc);
2861 case PVRSRV_BRIDGE_RELEASE_DEVICEINFO:
2862 err = DummyBW(cmd, in, out, per_proc);
2864 case PVRSRV_BRIDGE_CREATE_DEVMEMCONTEXT:
2865 err = PVRSRVCreateDeviceMemContextBW(cmd, in, out, per_proc);
2867 case PVRSRV_BRIDGE_DESTROY_DEVMEMCONTEXT:
2868 err = PVRSRVDestroyDeviceMemContextBW(cmd, in, out, per_proc);
2870 case PVRSRV_BRIDGE_GET_DEVMEM_HEAPINFO:
2871 err = PVRSRVGetDeviceMemHeapInfoBW(cmd, in, out, per_proc);
2873 case PVRSRV_BRIDGE_ALLOC_DEVICEMEM:
2874 err = PVRSRVAllocDeviceMemBW(cmd, in, out, per_proc);
2876 case PVRSRV_BRIDGE_FREE_DEVICEMEM:
2877 err = PVRSRVFreeDeviceMemBW(cmd, in, out, per_proc);
2879 case PVRSRV_BRIDGE_GETFREE_DEVICEMEM:
2880 err = PVRSRVGetFreeDeviceMemBW(cmd, in, out, per_proc);
2883 case PVRSRV_BRIDGE_CREATE_COMMANDQUEUE:
2884 case PVRSRV_BRIDGE_DESTROY_COMMANDQUEUE:
2885 err = DummyBW(cmd, in, out, per_proc);
2888 case PVRSRV_BRIDGE_MHANDLE_TO_MMAP_DATA:
2889 err = PVRMMapOSMemHandleToMMapDataBW(cmd, in, out, per_proc);
2891 case PVRSRV_BRIDGE_CONNECT_SERVICES:
2892 err = PVRSRVConnectBW(cmd, in, out, per_proc);
2894 case PVRSRV_BRIDGE_DISCONNECT_SERVICES:
2895 err = PVRSRVDisconnectBW(cmd, in, out, per_proc);
2898 case PVRSRV_BRIDGE_WRAP_DEVICE_MEM:
2899 case PVRSRV_BRIDGE_GET_DEVICEMEMINFO:
2900 case PVRSRV_BRIDGE_RESERVE_DEV_VIRTMEM:
2901 case PVRSRV_BRIDGE_FREE_DEV_VIRTMEM:
2902 case PVRSRV_BRIDGE_MAP_EXT_MEMORY:
2903 case PVRSRV_BRIDGE_UNMAP_EXT_MEMORY:
2904 err = DummyBW(cmd, in, out, per_proc);
2907 case PVRSRV_BRIDGE_MAP_DEV_MEMORY:
2908 err = PVRSRVMapDeviceMemoryBW(cmd, in, out, per_proc);
2910 case PVRSRV_BRIDGE_UNMAP_DEV_MEMORY:
2911 err = PVRSRVUnmapDeviceMemoryBW(cmd, in, out, per_proc);
2913 case PVRSRV_BRIDGE_MAP_DEVICECLASS_MEMORY:
2914 err = PVRSRVMapDeviceClassMemoryBW(cmd, in, out, per_proc);
2916 case PVRSRV_BRIDGE_UNMAP_DEVICECLASS_MEMORY:
2917 err = PVRSRVUnmapDeviceClassMemoryBW(cmd, in, out, per_proc);
2920 case PVRSRV_BRIDGE_MAP_MEM_INFO_TO_USER:
2921 case PVRSRV_BRIDGE_UNMAP_MEM_INFO_FROM_USER:
2922 err = DummyBW(cmd, in, out, per_proc);
2925 case PVRSRV_BRIDGE_EXPORT_DEVICEMEM:
2926 err = PVRSRVExportDeviceMemBW(cmd, in, out, per_proc);
2928 case PVRSRV_BRIDGE_RELEASE_MMAP_DATA:
2929 err = PVRMMapReleaseMMapDataBW(cmd, in, out, per_proc);
2931 case PVRSRV_BRIDGE_CACHE_FLUSH_DRM:
2932 err = PVRSRVCacheFlushDRIBW(cmd, in, out, per_proc);
2935 case PVRSRV_BRIDGE_PROCESS_SIMISR_EVENT:
2936 case PVRSRV_BRIDGE_REGISTER_SIM_PROCESS:
2937 case PVRSRV_BRIDGE_UNREGISTER_SIM_PROCESS:
2938 case PVRSRV_BRIDGE_MAPPHYSTOUSERSPACE:
2939 case PVRSRV_BRIDGE_UNMAPPHYSTOUSERSPACE:
2940 case PVRSRV_BRIDGE_GETPHYSTOUSERSPACEMAP:
2941 case PVRSRV_BRIDGE_GET_FB_STATS:
2942 err = DummyBW(cmd, in, out, per_proc);
2945 case PVRSRV_BRIDGE_GET_MISC_INFO:
2946 err = PVRSRVGetMiscInfoBW(cmd, in, out, per_proc);
2948 case PVRSRV_BRIDGE_RELEASE_MISC_INFO:
2949 err = DummyBW(cmd, in, out, per_proc);
2953 case PVRSRV_BRIDGE_PDUMP_INIT:
2954 err = DummyBW(cmd, in, out, per_proc);
2956 case PVRSRV_BRIDGE_PDUMP_MEMPOL:
2957 err = PDumpMemPolBW(cmd, in, out, per_proc);
2959 case PVRSRV_BRIDGE_PDUMP_DUMPMEM:
2960 err = PDumpMemBW(cmd, in, out, per_proc);
2962 case PVRSRV_BRIDGE_PDUMP_REG:
2963 err = PDumpRegWithFlagsBW(cmd, in, out, per_proc);
2965 case PVRSRV_BRIDGE_PDUMP_REGPOL:
2966 err = PDumpRegPolBW(cmd, in, out, per_proc);
2968 case PVRSRV_BRIDGE_PDUMP_COMMENT:
2969 err = PDumpCommentBW(cmd, in, out, per_proc);
2971 case PVRSRV_BRIDGE_PDUMP_SETFRAME:
2972 err = PDumpSetFrameBW(cmd, in, out, per_proc);
2974 case PVRSRV_BRIDGE_PDUMP_ISCAPTURING:
2975 err = PDumpIsCaptureFrameBW(cmd, in, out, per_proc);
2977 case PVRSRV_BRIDGE_PDUMP_DUMPBITMAP:
2978 err = PDumpBitmapBW(cmd, in, out, per_proc);
2980 case PVRSRV_BRIDGE_PDUMP_DUMPREADREG:
2981 err = DummyBW(cmd, in, out, per_proc);
2983 case PVRSRV_BRIDGE_PDUMP_SYNCPOL:
2984 err = PDumpSyncPolBW(cmd, in, out, per_proc);
2986 case PVRSRV_BRIDGE_PDUMP_DUMPSYNC:
2987 err = PDumpSyncDumpBW(cmd, in, out, per_proc);
2989 case PVRSRV_BRIDGE_PDUMP_DRIVERINFO:
2990 err = DummyBW(cmd, in, out, per_proc);
2992 case PVRSRV_BRIDGE_PDUMP_PDREG:
2993 err = PDumpPDRegBW(cmd, in, out, per_proc);
2995 case PVRSRV_BRIDGE_PDUMP_DUMPPDDEVPADDR:
2996 err = PDumpPDDevPAddrBW(cmd, in, out, per_proc);
2998 case PVRSRV_BRIDGE_PDUMP_CYCLE_COUNT_REG_READ:
2999 err = PDumpCycleCountRegReadBW(cmd, in, out, per_proc);
3001 case PVRSRV_BRIDGE_PDUMP_STARTINITPHASE:
3002 case PVRSRV_BRIDGE_PDUMP_STOPINITPHASE:
3003 err = DummyBW(cmd, in, out, per_proc);
3007 case PVRSRV_BRIDGE_GET_OEMJTABLE:
3008 err = DummyBW(cmd, in, out, per_proc);
3011 case PVRSRV_BRIDGE_ENUM_CLASS:
3012 err = PVRSRVEnumerateDCBW(cmd, in, out, per_proc);
3015 case PVRSRV_BRIDGE_OPEN_DISPCLASS_DEVICE:
3016 err = PVRSRVOpenDCDeviceBW(cmd, in, out, per_proc);
3018 case PVRSRV_BRIDGE_CLOSE_DISPCLASS_DEVICE:
3019 err = PVRSRVCloseDCDeviceBW(cmd, in, out, per_proc);
3021 case PVRSRV_BRIDGE_ENUM_DISPCLASS_FORMATS:
3022 err = PVRSRVEnumDCFormatsBW(cmd, in, out, per_proc);
3024 case PVRSRV_BRIDGE_ENUM_DISPCLASS_DIMS:
3025 err = PVRSRVEnumDCDimsBW(cmd, in, out, per_proc);
3027 case PVRSRV_BRIDGE_GET_DISPCLASS_SYSBUFFER:
3028 err = PVRSRVGetDCSystemBufferBW(cmd, in, out, per_proc);
3030 case PVRSRV_BRIDGE_GET_DISPCLASS_INFO:
3031 err = PVRSRVGetDCInfoBW(cmd, in, out, per_proc);
3033 case PVRSRV_BRIDGE_CREATE_DISPCLASS_SWAPCHAIN:
3034 err = PVRSRVCreateDCSwapChainBW(cmd, in, out, per_proc);
3036 case PVRSRV_BRIDGE_DESTROY_DISPCLASS_SWAPCHAIN:
3037 err = PVRSRVDestroyDCSwapChainBW(cmd, in, out, per_proc);
3039 case PVRSRV_BRIDGE_SET_DISPCLASS_DSTRECT:
3040 err = PVRSRVSetDCDstRectBW(cmd, in, out, per_proc);
3042 case PVRSRV_BRIDGE_SET_DISPCLASS_SRCRECT:
3043 err = PVRSRVSetDCSrcRectBW(cmd, in, out, per_proc);
3045 case PVRSRV_BRIDGE_SET_DISPCLASS_DSTCOLOURKEY:
3046 err = PVRSRVSetDCDstColourKeyBW(cmd, in, out, per_proc);
3048 case PVRSRV_BRIDGE_SET_DISPCLASS_SRCCOLOURKEY:
3049 err = PVRSRVSetDCSrcColourKeyBW(cmd, in, out, per_proc);
3051 case PVRSRV_BRIDGE_GET_DISPCLASS_BUFFERS:
3052 err = PVRSRVGetDCBuffersBW(cmd, in, out, per_proc);
3054 case PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER:
3055 err = PVRSRVSwapToDCBufferBW(cmd, in, out, per_proc);
3057 case PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_SYSTEM:
3058 err = PVRSRVSwapToDCSystemBW(cmd, in, out, per_proc);
3061 case PVRSRV_BRIDGE_OPEN_BUFFERCLASS_DEVICE:
3062 err = PVRSRVOpenBCDeviceBW(cmd, in, out, per_proc);
3064 case PVRSRV_BRIDGE_CLOSE_BUFFERCLASS_DEVICE:
3065 err = PVRSRVCloseBCDeviceBW(cmd, in, out, per_proc);
3067 case PVRSRV_BRIDGE_GET_BUFFERCLASS_INFO:
3068 err = PVRSRVGetBCInfoBW(cmd, in, out, per_proc);
3070 case PVRSRV_BRIDGE_GET_BUFFERCLASS_BUFFER:
3071 err = PVRSRVGetBCBufferBW(cmd, in, out, per_proc);
3074 case PVRSRV_BRIDGE_WRAP_EXT_MEMORY:
3075 err = PVRSRVWrapExtMemoryBW(cmd, in, out, per_proc);
3077 case PVRSRV_BRIDGE_UNWRAP_EXT_MEMORY:
3078 err = PVRSRVUnwrapExtMemoryBW(cmd, in, out, per_proc);
3081 case PVRSRV_BRIDGE_ALLOC_SHARED_SYS_MEM:
3082 err = PVRSRVAllocSharedSysMemoryBW(cmd, in, out, per_proc);
3084 case PVRSRV_BRIDGE_FREE_SHARED_SYS_MEM:
3085 err = PVRSRVFreeSharedSysMemoryBW(cmd, in, out, per_proc);
3087 case PVRSRV_BRIDGE_MAP_MEMINFO_MEM:
3088 err = PVRSRVMapMemInfoMemBW(cmd, in, out, per_proc);
3091 case PVRSRV_BRIDGE_GETMMU_PD_DEVPADDR:
3092 err = MMU_GetPDDevPAddrBW(cmd, in, out, per_proc);
3095 case PVRSRV_BRIDGE_INITSRV_CONNECT:
3096 err = PVRSRVInitSrvConnectBW(cmd, in, out, per_proc);
3098 case PVRSRV_BRIDGE_INITSRV_DISCONNECT:
3099 err = PVRSRVInitSrvDisconnectBW(cmd, in, out, per_proc);
3102 case PVRSRV_BRIDGE_EVENT_OBJECT_WAIT:
3103 err = PVRSRVEventObjectWaitBW(cmd, in, out, per_proc);
3105 case PVRSRV_BRIDGE_EVENT_OBJECT_OPEN:
3106 err = PVRSRVEventObjectOpenBW(cmd, in, out, per_proc);
3108 case PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE:
3109 err = PVRSRVEventObjectCloseBW(cmd, in, out, per_proc);
3112 case PVRSRV_BRIDGE_MODIFY_SYNC_OPS:
3113 err = PVRSRVModifySyncOpsBW(cmd, in, out, per_proc);
3116 case PVRSRV_BRIDGE_SGX_GETCLIENTINFO:
3117 err = SGXGetClientInfoBW(cmd, in, out, per_proc);
3119 case PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO:
3120 err = SGXReleaseClientInfoBW(cmd, in, out, per_proc);
3122 case PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO:
3123 err = SGXGetInternalDevInfoBW(cmd, in, out, per_proc);
3125 case PVRSRV_BRIDGE_SGX_DOKICK:
3126 err = SGXDoKickBW(cmd, in, out, in_size, per_proc);
3129 case PVRSRV_BRIDGE_SGX_GETPHYSPAGEADDR:
3130 case PVRSRV_BRIDGE_SGX_READREGISTRYDWORD:
3131 case PVRSRV_BRIDGE_SGX_SCHEDULECOMMAND:
3132 err = DummyBW(cmd, in, out, per_proc);
3135 case PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE:
3136 err = SGX2DQueryBlitsCompleteBW(filp, cmd, in, out, per_proc);
3139 case PVRSRV_BRIDGE_SGX_GETMMUPDADDR:
3140 err = DummyBW(cmd, in, out, per_proc);
3143 case PVRSRV_BRIDGE_SGX_SUBMITTRANSFER:
3144 err = SGXSubmitTransferBW(cmd, in, out, per_proc);
3146 case PVRSRV_BRIDGE_SGX_GETMISCINFO:
3147 err = SGXGetMiscInfoBW(cmd, in, out, per_proc);
3149 case PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT:
3150 err = SGXGetInfoForSrvinitBW(cmd, in, out, per_proc);
3152 case PVRSRV_BRIDGE_SGX_DEVINITPART2:
3153 err = SGXDevInitPart2BW(cmd, in, out, per_proc);
3156 case PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC:
3157 err = SGXFindSharedPBDescBW(cmd, in, out, per_proc);
3159 case PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC:
3160 err = SGXUnrefSharedPBDescBW(cmd, in, out, per_proc);
3162 case PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC:
3163 err = SGXAddSharedPBDescBW(cmd, in, out, per_proc);
3165 case PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT:
3166 err = SGXRegisterHWRenderContextBW(cmd, in, out, per_proc);
3168 case PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET:
3169 err = SGXFlushHWRenderTargetBW(cmd, in, out, per_proc);
3171 case PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT:
3172 err = SGXUnregisterHWRenderContextBW(cmd, in, out, per_proc);
3174 case PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT:
3175 err = SGXRegisterHWTransferContextBW(cmd, in, out, per_proc);
3177 case PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT:
3178 err = SGXUnregisterHWTransferContextBW(cmd, in, out, per_proc);
3181 case PVRSRV_BRIDGE_SGX_READ_DIFF_COUNTERS:
3182 err = SGXReadDiffCountersBW(cmd, in, out, per_proc);
3184 case PVRSRV_BRIDGE_SGX_READ_HWPERF_CB:
3185 err = SGXReadHWPerfCBBW(cmd, in, out, per_proc);
3188 case PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES:
3189 err = SGXScheduleProcessQueuesBW(cmd, in, out, per_proc);
3193 case PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY:
3194 err = SGXPDumpBufferArrayBW(cmd, in, out, per_proc);
3196 case PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS:
3197 err = SGXPDump3DSignatureRegistersBW(cmd, in, out, per_proc);
3199 case PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS:
3200 err = SGXPDumpCounterRegistersBW(cmd, in, out, per_proc);
3202 case PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS:
3203 err = SGXPDumpTASignatureRegistersBW(cmd, in, out, per_proc);
3205 case PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB:
3206 err = SGXPDumpHWPerfCBBW(cmd, in, out, per_proc);
3211 PVR_DPF(PVR_DBG_ERROR, "%s: cmd = %d is out if range!",
3218 int BridgedDispatchKM(struct file *filp, struct PVRSRV_PER_PROCESS_DATA *pd,
3219 struct PVRSRV_BRIDGE_PACKAGE *pkg)
3224 u32 bid = pkg->ui32BridgeID;
3226 struct SYS_DATA *psSysData;
3228 #if defined(DEBUG_BRIDGE_KM)
3229 g_BridgeDispatchTable[bid].ui32CallCount++;
3230 g_BridgeGlobalStats.ui32IOCTLCount++;
3232 if (!pd->bInitProcess && bridged_check_cmd(bid))
3235 if (SysAcquireData(&psSysData) != PVRSRV_OK)
3238 in = ((struct ENV_DATA *)psSysData->pvEnvSpecificData)->pvBridgeData;
3239 out = (void *)((u8 *)in + PVRSRV_MAX_BRIDGE_IN_SIZE);
3241 if (pkg->ui32InBufferSize > 0 &&
3242 CopyFromUserWrapper(pd, bid, in, pkg->pvParamIn,
3243 pkg->ui32InBufferSize) != PVRSRV_OK)
3246 if (bid >= (BRIDGE_DISPATCH_TABLE_ENTRY_COUNT)) {
3247 PVR_DPF(PVR_DBG_ERROR,
3248 "%s: ui32BridgeID = %d is out if range!", __func__,
3253 err = bridged_ioctl(filp, bid, in, out, pkg->ui32InBufferSize, pd);
3258 if (CopyToUserWrapper(pd, bid, pkg->pvParamOut, out,
3259 pkg->ui32OutBufferSize) != PVRSRV_OK)
3264 ReleaseHandleBatch(pd);