/drivers/gpu/pvr/bridged_pvr_bridge.h
C++ Header | 232 lines | 165 code | 42 blank | 25 comment | 10 complexity | 3268c9263c6e299b6432857bb086cf0c MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
- /**********************************************************************
- *
- * 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