| /********************************************************************** |
| * |
| * 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. <gpl-support@imgtec.com> |
| * 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 |
| |