/********************************************************************** * * Copyright (C) Imagination Technologies Ltd. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful but, except * as otherwise stated in writing, without any warranty; without even the * implied warranty of merchantability or fitness for a particular purpose. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * * The full GNU General Public License is included in this distribution in * the file called "COPYING". * * Contact Information: * Imagination Technologies Ltd. * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK * ******************************************************************************/ #ifndef __BRIDGED_PVR_BRIDGE_H__ #define __BRIDGED_PVR_BRIDGE_H__ #include "pvr_bridge.h" #if defined(__cplusplus) extern "C" { #endif #if defined(__linux__) #define PVRSRV_GET_BRIDGE_ID(X) _IOC_NR(X) #else #define PVRSRV_GET_BRIDGE_ID(X) ((X) - PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST)) #endif #ifndef ENOMEM #define ENOMEM 12 #endif #ifndef EFAULT #define EFAULT 14 #endif #ifndef ENOTTY #define ENOTTY 25 #endif #if defined(DEBUG_BRIDGE_KM) PVRSRV_ERROR CopyFromUserWrapper(PVRSRV_PER_PROCESS_DATA *pProcData, IMG_UINT32 ui32BridgeID, IMG_VOID *pvDest, IMG_VOID *pvSrc, IMG_UINT32 ui32Size); PVRSRV_ERROR CopyToUserWrapper(PVRSRV_PER_PROCESS_DATA *pProcData, IMG_UINT32 ui32BridgeID, IMG_VOID *pvDest, IMG_VOID *pvSrc, IMG_UINT32 ui32Size); #else #define CopyFromUserWrapper(pProcData, ui32BridgeID, pvDest, pvSrc, ui32Size) \ OSCopyFromUser(pProcData, pvDest, pvSrc, ui32Size) #define CopyToUserWrapper(pProcData, ui32BridgeID, pvDest, pvSrc, ui32Size) \ OSCopyToUser(pProcData, pvDest, pvSrc, ui32Size) #endif #define ASSIGN_AND_RETURN_ON_ERROR(error, src, res) \ do \ { \ (error) = (src); \ if ((error) != PVRSRV_OK) \ { \ return (res); \ } \ } while ((error) != PVRSRV_OK); #define ASSIGN_AND_EXIT_ON_ERROR(error, src) \ ASSIGN_AND_RETURN_ON_ERROR(error, src, 0) #if defined (PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) #ifdef INLINE_IS_PRAGMA #pragma inline(NewHandleBatch) #endif static INLINE PVRSRV_ERROR NewHandleBatch(PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_UINT32 ui32BatchSize) { PVRSRV_ERROR eError; PVR_ASSERT(!psPerProc->bHandlesBatched); eError = PVRSRVNewHandleBatch(psPerProc->psHandleBase, ui32BatchSize); if (eError == PVRSRV_OK) { psPerProc->bHandlesBatched = IMG_TRUE; } return eError; } #define NEW_HANDLE_BATCH_OR_ERROR(error, psPerProc, ui32BatchSize) \ ASSIGN_AND_EXIT_ON_ERROR(error, NewHandleBatch(psPerProc, ui32BatchSize)) #ifdef INLINE_IS_PRAGMA #pragma inline(CommitHandleBatch) #endif static INLINE PVRSRV_ERROR CommitHandleBatch(PVRSRV_PER_PROCESS_DATA *psPerProc) { PVR_ASSERT(psPerProc->bHandlesBatched); psPerProc->bHandlesBatched = IMG_FALSE; return PVRSRVCommitHandleBatch(psPerProc->psHandleBase); } #define COMMIT_HANDLE_BATCH_OR_ERROR(error, psPerProc) \ ASSIGN_AND_EXIT_ON_ERROR(error, CommitHandleBatch(psPerProc)) #ifdef INLINE_IS_PRAGMA #pragma inline(ReleaseHandleBatch) #endif static INLINE IMG_VOID ReleaseHandleBatch(PVRSRV_PER_PROCESS_DATA *psPerProc) { if (psPerProc->bHandlesBatched) { psPerProc->bHandlesBatched = IMG_FALSE; PVRSRVReleaseHandleBatch(psPerProc->psHandleBase); } } #else #define NEW_HANDLE_BATCH_OR_ERROR(error, psPerProc, ui32BatchSize) #define COMMIT_HANDLE_BATCH_OR_ERROR(error, psPerProc) #define ReleaseHandleBatch(psPerProc) #endif IMG_INT DummyBW(IMG_UINT32 ui32BridgeID, IMG_VOID *psBridgeIn, IMG_VOID *psBridgeOut, PVRSRV_PER_PROCESS_DATA *psPerProc); typedef IMG_INT (*BridgeWrapperFunction)(IMG_UINT32 ui32BridgeID, IMG_VOID *psBridgeIn, IMG_VOID *psBridgeOut, PVRSRV_PER_PROCESS_DATA *psPerProc); typedef struct _PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY { BridgeWrapperFunction pfFunction; #if defined(DEBUG_BRIDGE_KM) const IMG_CHAR *pszIOCName; const IMG_CHAR *pszFunctionName; IMG_UINT32 ui32CallCount; IMG_UINT32 ui32CopyFromUserTotalBytes; IMG_UINT32 ui32CopyToUserTotalBytes; #endif }PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY; #if defined(SUPPORT_VGX) || defined(SUPPORT_MSVDX) #if defined(SUPPORT_VGX) #define BRIDGE_DISPATCH_TABLE_ENTRY_COUNT (PVRSRV_BRIDGE_LAST_VGX_CMD+1) #define PVRSRV_BRIDGE_LAST_DEVICE_CMD PVRSRV_BRIDGE_LAST_VGX_CMD #else #define BRIDGE_DISPATCH_TABLE_ENTRY_COUNT (PVRSRV_BRIDGE_LAST_MSVDX_CMD+1) #define PVRSRV_BRIDGE_LAST_DEVICE_CMD PVRSRV_BRIDGE_LAST_MSVDX_CMD #endif #else #if defined(SUPPORT_SGX) #define BRIDGE_DISPATCH_TABLE_ENTRY_COUNT (PVRSRV_BRIDGE_LAST_SGX_CMD+1) #define PVRSRV_BRIDGE_LAST_DEVICE_CMD PVRSRV_BRIDGE_LAST_SGX_CMD #else #define BRIDGE_DISPATCH_TABLE_ENTRY_COUNT (PVRSRV_BRIDGE_LAST_NON_DEVICE_CMD+1) #define PVRSRV_BRIDGE_LAST_DEVICE_CMD PVRSRV_BRIDGE_LAST_NON_DEVICE_CMD #endif #endif extern PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY g_BridgeDispatchTable[BRIDGE_DISPATCH_TABLE_ENTRY_COUNT]; IMG_VOID _SetDispatchTableEntry(IMG_UINT32 ui32Index, const IMG_CHAR *pszIOCName, BridgeWrapperFunction pfFunction, const IMG_CHAR *pszFunctionName); #define SetDispatchTableEntry(ui32Index, pfFunction) \ _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, (BridgeWrapperFunction)pfFunction, #pfFunction) #define DISPATCH_TABLE_GAP_THRESHOLD 5 #if defined(DEBUG) #define PVRSRV_BRIDGE_ASSERT_CMD(X, Y) PVR_ASSERT(X == PVRSRV_GET_BRIDGE_ID(Y)) #else #define PVRSRV_BRIDGE_ASSERT_CMD(X, Y) PVR_UNREFERENCED_PARAMETER(X) #endif #if defined(DEBUG_BRIDGE_KM) typedef struct _PVRSRV_BRIDGE_GLOBAL_STATS { IMG_UINT32 ui32IOCTLCount; IMG_UINT32 ui32TotalCopyFromUserBytes; IMG_UINT32 ui32TotalCopyToUserBytes; }PVRSRV_BRIDGE_GLOBAL_STATS; extern PVRSRV_BRIDGE_GLOBAL_STATS g_BridgeGlobalStats; #endif PVRSRV_ERROR CommonBridgeInit(IMG_VOID); IMG_INT BridgedDispatchKM(PVRSRV_PER_PROCESS_DATA * psPerProc, PVRSRV_BRIDGE_PACKAGE * psBridgePackageKM); #if defined (__cplusplus) } #endif #endif