blob: 4e4cf248cbe053b91e199af619c62bd2ebb96a2e [file] [log] [blame]
/**********************************************************************
*
* 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
*
******************************************************************************/
#include <stddef.h>
#include "img_defs.h"
#if defined(SUPPORT_SGX)
#include "services.h"
#include "pvr_debug.h"
#include "pvr_bridge.h"
#include "sgx_bridge.h"
#include "perproc.h"
#include "power.h"
#include "pvr_bridge_km.h"
#include "sgx_bridge_km.h"
#include "sgx_options.h"
#if defined(SUPPORT_MSVDX)
#include "msvdx_bridge.h"
#endif
#include "bridged_pvr_bridge.h"
#include "bridged_sgx_bridge.h"
#include "sgxutils.h"
#include "buffer_manager.h"
#include "pdump_km.h"
static IMG_INT
SGXGetClientInfoBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_GETCLIENTINFO *psGetClientInfoIN,
PVRSRV_BRIDGE_OUT_GETCLIENTINFO *psGetClientInfoOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETCLIENTINFO);
psGetClientInfoOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psGetClientInfoIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psGetClientInfoOUT->eError != PVRSRV_OK)
{
return 0;
}
psGetClientInfoOUT->eError =
SGXGetClientInfoKM(hDevCookieInt,
&psGetClientInfoOUT->sClientInfo);
return 0;
}
static IMG_INT
SGXReleaseClientInfoBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_RELEASECLIENTINFO *psReleaseClientInfoIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
PVRSRV_SGXDEV_INFO *psDevInfo;
IMG_HANDLE hDevCookieInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psReleaseClientInfoIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psDevInfo = (PVRSRV_SGXDEV_INFO *)((PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice;
PVR_ASSERT(psDevInfo->ui32ClientRefCount > 0);
if (psDevInfo->ui32ClientRefCount > 0)
{
psDevInfo->ui32ClientRefCount--;
}
psRetOUT->eError = PVRSRV_OK;
return 0;
}
static IMG_INT
SGXGetInternalDevInfoBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_GETINTERNALDEVINFO *psSGXGetInternalDevInfoIN,
PVRSRV_BRIDGE_OUT_GETINTERNALDEVINFO *psSGXGetInternalDevInfoOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
#if defined (SUPPORT_SID_INTERFACE)
SGX_INTERNAL_DEVINFO_KM sSGXInternalDevInfo;
#endif
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO);
psSGXGetInternalDevInfoOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXGetInternalDevInfoIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psSGXGetInternalDevInfoOUT->eError != PVRSRV_OK)
{
return 0;
}
psSGXGetInternalDevInfoOUT->eError =
SGXGetInternalDevInfoKM(hDevCookieInt,
#if defined (SUPPORT_SID_INTERFACE)
&sSGXInternalDevInfo);
#else
&psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo);
#endif
psSGXGetInternalDevInfoOUT->eError =
PVRSRVAllocHandle(psPerProc->psHandleBase,
&psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.hHostCtlKernelMemInfoHandle,
#if defined (SUPPORT_SID_INTERFACE)
sSGXInternalDevInfo.hHostCtlKernelMemInfoHandle,
#else
psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.hHostCtlKernelMemInfoHandle,
#endif
PVRSRV_HANDLE_TYPE_MEM_INFO,
PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
return 0;
}
static IMG_INT
SGXDoKickBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_DOKICK *psDoKickIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
IMG_UINT32 i;
IMG_INT ret = 0;
IMG_UINT32 ui32NumDstSyncs;
#if defined (SUPPORT_SID_INTERFACE)
SGX_CCB_KICK_KM sCCBKickKM = {{0}};
IMG_HANDLE ahSyncInfoHandles[16];
#else
IMG_HANDLE *phKernelSyncInfoHandles = IMG_NULL;
#endif
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DOKICK);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psDoKickIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.hCCBKernelMemInfo,
#else
&psDoKickIN->sCCBKick.hCCBKernelMemInfo,
#endif
psDoKickIN->sCCBKick.hCCBKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
#if defined (SUPPORT_SID_INTERFACE)
if (psDoKickIN->sCCBKick.ui32NumDstSyncObjects > 16)
{
return 0;
}
if(psDoKickIN->sCCBKick.hTA3DSyncInfo != 0)
#else
if(psDoKickIN->sCCBKick.hTA3DSyncInfo != IMG_NULL)
#endif
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.hTA3DSyncInfo,
#else
&psDoKickIN->sCCBKick.hTA3DSyncInfo,
#endif
psDoKickIN->sCCBKick.hTA3DSyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#if defined (SUPPORT_SID_INTERFACE)
if(psDoKickIN->sCCBKick.hTASyncInfo != 0)
#else
if(psDoKickIN->sCCBKick.hTASyncInfo != IMG_NULL)
#endif
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.hTASyncInfo,
#else
&psDoKickIN->sCCBKick.hTASyncInfo,
#endif
psDoKickIN->sCCBKick.hTASyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#if defined(FIX_HW_BRN_31620)
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&psDoKickIN->sCCBKick.hDevMemContext,
psDoKickIN->sCCBKick.hDevMemContext,
PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
#endif
#if defined (SUPPORT_SID_INTERFACE)
if(psDoKickIN->sCCBKick.h3DSyncInfo != 0)
#else
if(psDoKickIN->sCCBKick.h3DSyncInfo != IMG_NULL)
#endif
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.h3DSyncInfo,
#else
&psDoKickIN->sCCBKick.h3DSyncInfo,
#endif
psDoKickIN->sCCBKick.h3DSyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#if defined(SUPPORT_SGX_GENERALISED_SYNCOBJECTS)
if (psDoKickIN->sCCBKick.ui32NumTASrcSyncs > SGX_MAX_TA_SRC_SYNCS)
{
psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
return 0;
}
#if defined (SUPPORT_SID_INTERFACE)
sCCBKickKM.ui32NumTASrcSyncs = psDoKickIN->sCCBKick.ui32NumTASrcSyncs;
#endif
for(i=0; i<psDoKickIN->sCCBKick.ui32NumTASrcSyncs; i++)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.ahTASrcKernelSyncInfo[i],
#else
&psDoKickIN->sCCBKick.ahTASrcKernelSyncInfo[i],
#endif
psDoKickIN->sCCBKick.ahTASrcKernelSyncInfo[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
if (psDoKickIN->sCCBKick.ui32NumTADstSyncs > SGX_MAX_TA_DST_SYNCS)
{
psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
return 0;
}
#if defined (SUPPORT_SID_INTERFACE)
sCCBKickKM.ui32NumTADstSyncs = psDoKickIN->sCCBKick.ui32NumTADstSyncs;
#endif
for(i=0; i<psDoKickIN->sCCBKick.ui32NumTADstSyncs; i++)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.ahTADstKernelSyncInfo[i],
#else
&psDoKickIN->sCCBKick.ahTADstKernelSyncInfo[i],
#endif
psDoKickIN->sCCBKick.ahTADstKernelSyncInfo[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
if (psDoKickIN->sCCBKick.ui32Num3DSrcSyncs > SGX_MAX_3D_SRC_SYNCS)
{
psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
return 0;
}
#if defined (SUPPORT_SID_INTERFACE)
sCCBKickKM.ui32Num3DSrcSyncs = psDoKickIN->sCCBKick.ui32Num3DSrcSyncs;
#endif
for(i=0; i<psDoKickIN->sCCBKick.ui32Num3DSrcSyncs; i++)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.ah3DSrcKernelSyncInfo[i],
#else
&psDoKickIN->sCCBKick.ah3DSrcKernelSyncInfo[i],
#endif
psDoKickIN->sCCBKick.ah3DSrcKernelSyncInfo[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#else
if (psDoKickIN->sCCBKick.ui32NumSrcSyncs > SGX_MAX_SRC_SYNCS_TA)
{
psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
return 0;
}
#if defined (SUPPORT_SID_INTERFACE)
sCCBKickKM.ui32NumSrcSyncs = psDoKickIN->sCCBKick.ui32NumSrcSyncs;
#endif
for(i=0; i<psDoKickIN->sCCBKick.ui32NumSrcSyncs; i++)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.ahSrcKernelSyncInfo[i],
#else
&psDoKickIN->sCCBKick.ahSrcKernelSyncInfo[i],
#endif
psDoKickIN->sCCBKick.ahSrcKernelSyncInfo[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#endif
if (psDoKickIN->sCCBKick.ui32NumTAStatusVals > SGX_MAX_TA_STATUS_VALS)
{
psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
return 0;
}
for (i = 0; i < psDoKickIN->sCCBKick.ui32NumTAStatusVals; i++)
{
psRetOUT->eError =
#if defined(SUPPORT_SGX_NEW_STATUS_VALS)
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.asTAStatusUpdate[i].hKernelMemInfo,
#else
&psDoKickIN->sCCBKick.asTAStatusUpdate[i].hKernelMemInfo,
#endif
psDoKickIN->sCCBKick.asTAStatusUpdate[i].hKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
#if defined (SUPPORT_SID_INTERFACE)
sCCBKickKM.asTAStatusUpdate[i].sCtlStatus = psDoKickIN->sCCBKick.asTAStatusUpdate[i].sCtlStatus;
#endif
#else
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.ahTAStatusSyncInfo[i],
#else
&psDoKickIN->sCCBKick.ahTAStatusSyncInfo[i],
#endif
psDoKickIN->sCCBKick.ahTAStatusSyncInfo[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
#endif
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
if (psDoKickIN->sCCBKick.ui32Num3DStatusVals > SGX_MAX_3D_STATUS_VALS)
{
psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
return 0;
}
for(i = 0; i < psDoKickIN->sCCBKick.ui32Num3DStatusVals; i++)
{
psRetOUT->eError =
#if defined(SUPPORT_SGX_NEW_STATUS_VALS)
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.as3DStatusUpdate[i].hKernelMemInfo,
#else
&psDoKickIN->sCCBKick.as3DStatusUpdate[i].hKernelMemInfo,
#endif
psDoKickIN->sCCBKick.as3DStatusUpdate[i].hKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
#if defined (SUPPORT_SID_INTERFACE)
sCCBKickKM.as3DStatusUpdate[i].sCtlStatus = psDoKickIN->sCCBKick.as3DStatusUpdate[i].sCtlStatus;
#endif
#else
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.ah3DStatusSyncInfo[i],
#else
&psDoKickIN->sCCBKick.ah3DStatusSyncInfo[i],
#endif
psDoKickIN->sCCBKick.ah3DStatusSyncInfo[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
#endif
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
ui32NumDstSyncs = psDoKickIN->sCCBKick.ui32NumDstSyncObjects;
if(ui32NumDstSyncs > 0)
{
if(!OSAccessOK(PVR_VERIFY_READ,
psDoKickIN->sCCBKick.pahDstSyncHandles,
ui32NumDstSyncs * sizeof(IMG_HANDLE)))
{
PVR_DPF((PVR_DBG_ERROR, "%s: SGXDoKickBW:"
" Invalid pasDstSyncHandles pointer", __FUNCTION__));
return -EFAULT;
}
psRetOUT->eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32NumDstSyncs * sizeof(IMG_HANDLE),
(IMG_VOID **)&phKernelSyncInfoHandles,
0,
"Array of Synchronization Info Handles");
if (psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
#if defined (SUPPORT_SID_INTERFACE)
sCCBKickKM.pahDstSyncHandles = phKernelSyncInfoHandles;
#else
if(CopyFromUserWrapper(psPerProc,
ui32BridgeID,
phKernelSyncInfoHandles,
psDoKickIN->sCCBKick.pahDstSyncHandles,
ui32NumDstSyncs * sizeof(IMG_HANDLE)) != PVRSRV_OK)
{
ret = -EFAULT;
goto PVRSRV_BRIDGE_SGX_DOKICK_RETURN_RESULT;
}
psDoKickIN->sCCBKick.pahDstSyncHandles = phKernelSyncInfoHandles;
#endif
for( i = 0; i < ui32NumDstSyncs; i++)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.pahDstSyncHandles[i],
#else
&psDoKickIN->sCCBKick.pahDstSyncHandles[i],
#endif
psDoKickIN->sCCBKick.pahDstSyncHandles[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_DOKICK_RETURN_RESULT;
}
}
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM.hKernelHWSyncListMemInfo,
#else
&psDoKickIN->sCCBKick.hKernelHWSyncListMemInfo,
#endif
psDoKickIN->sCCBKick.hKernelHWSyncListMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_DOKICK_RETURN_RESULT;
}
}
#if defined (SUPPORT_SID_INTERFACE)
OSMemCopy(&sCCBKickKM.sCommand, &psDoKickIN->sCCBKick.sCommand, sizeof(sCCBKickKM.sCommand));
sCCBKickKM.ui32NumDstSyncObjects = psDoKickIN->sCCBKick.ui32NumDstSyncObjects;
sCCBKickKM.ui32NumTAStatusVals = psDoKickIN->sCCBKick.ui32NumTAStatusVals;
sCCBKickKM.ui32Num3DStatusVals = psDoKickIN->sCCBKick.ui32Num3DStatusVals;
sCCBKickKM.bFirstKickOrResume = psDoKickIN->sCCBKick.bFirstKickOrResume;
sCCBKickKM.ui32CCBOffset = psDoKickIN->sCCBKick.ui32CCBOffset;
sCCBKickKM.bTADependency = psDoKickIN->sCCBKick.bTADependency;
#if (defined(NO_HARDWARE) || defined(PDUMP))
sCCBKickKM.bTerminateOrAbort = psDoKickIN->sCCBKick.bTerminateOrAbort;
#endif
#if defined(PDUMP)
sCCBKickKM.ui32CCBDumpWOff = psDoKickIN->sCCBKick.ui32CCBDumpWOff;
#endif
#if defined(NO_HARDWARE)
sCCBKickKM.ui32WriteOpsPendingVal = psDoKickIN->sCCBKick.ui32WriteOpsPendingVal;
#endif
#endif
psRetOUT->eError =
SGXDoKickKM(hDevCookieInt,
#if defined (SUPPORT_SID_INTERFACE)
&sCCBKickKM);
#else
&psDoKickIN->sCCBKick);
#endif
PVRSRV_BRIDGE_SGX_DOKICK_RETURN_RESULT:
if(phKernelSyncInfoHandles)
{
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32NumDstSyncs * sizeof(IMG_HANDLE),
(IMG_VOID *)phKernelSyncInfoHandles,
0);
}
return ret;
}
static IMG_INT
SGXScheduleProcessQueuesBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_SCHEDULE_PROCESS_QUEUES *psScheduleProcQIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psScheduleProcQIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError = SGXScheduleProcessQueuesKM(hDevCookieInt);
return 0;
}
#if defined(TRANSFER_QUEUE)
static IMG_INT
SGXSubmitTransferBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SUBMITTRANSFER *psSubmitTransferIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
PVRSRV_TRANSFER_SGX_KICK *psKick;
#if defined (SUPPORT_SID_INTERFACE)
PVRSRV_TRANSFER_SGX_KICK_KM sKickKM = {0};
#endif
IMG_UINT32 i;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_SUBMITTRANSFER);
PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
psKick = &psSubmitTransferIN->sKick;
#if defined(FIX_HW_BRN_31620)
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&psKick->hDevMemContext,
psKick->hDevMemContext,
PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
#endif
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSubmitTransferIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sKickKM.hCCBMemInfo,
#else
&psKick->hCCBMemInfo,
#endif
psKick->hCCBMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
if (psKick->hTASyncInfo != IMG_NULL)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sKickKM.hTASyncInfo,
#else
&psKick->hTASyncInfo,
#endif
psKick->hTASyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
if (psKick->h3DSyncInfo != IMG_NULL)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sKickKM.h3DSyncInfo,
#else
&psKick->h3DSyncInfo,
#endif
psKick->h3DSyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
if (psKick->ui32NumSrcSync > SGX_MAX_TRANSFER_SYNC_OPS)
{
psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
return 0;
}
for (i = 0; i < psKick->ui32NumSrcSync; i++)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sKickKM.ahSrcSyncInfo[i],
#else
&psKick->ahSrcSyncInfo[i],
#endif
psKick->ahSrcSyncInfo[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
if (psKick->ui32NumDstSync > SGX_MAX_TRANSFER_SYNC_OPS)
{
psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
return 0;
}
for (i = 0; i < psKick->ui32NumDstSync; i++)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sKickKM.ahDstSyncInfo[i],
#else
&psKick->ahDstSyncInfo[i],
#endif
psKick->ahDstSyncInfo[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#if defined (SUPPORT_SID_INTERFACE)
sKickKM.sHWTransferContextDevVAddr = psKick->sHWTransferContextDevVAddr;
sKickKM.ui32SharedCmdCCBOffset = psKick->ui32SharedCmdCCBOffset;
sKickKM.ui32NumSrcSync = psKick->ui32NumSrcSync;
sKickKM.ui32NumDstSync = psKick->ui32NumDstSync;
sKickKM.ui32Flags = psKick->ui32Flags;
sKickKM.ui32PDumpFlags = psKick->ui32PDumpFlags;
#if defined(PDUMP)
sKickKM.ui32CCBDumpWOff = psKick->ui32CCBDumpWOff;
#endif
psRetOUT->eError = SGXSubmitTransferKM(hDevCookieInt, &sKickKM);
#else
psRetOUT->eError = SGXSubmitTransferKM(hDevCookieInt, psKick);
#endif
return 0;
}
static IMG_INT
SGXSetTransferContextPriorityBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_SET_TRANSFER_CONTEXT_PRIORITY *psSGXSetTransferContextPriorityIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
IMG_HANDLE hTransferContextInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_SET_TRANSFER_CONTEXT_PRIORITY);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXSetTransferContextPriorityIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hTransferContextInt,
psSGXSetTransferContextPriorityIN->hHWTransferContext,
PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError = SGXSetTransferContextPriorityKM(
hDevCookieInt,
hTransferContextInt,
psSGXSetTransferContextPriorityIN->ui32Priority,
psSGXSetTransferContextPriorityIN->ui32OffsetOfPriorityField);
return 0;
}
static IMG_INT
SGXSetRenderContextPriorityBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_SET_RENDER_CONTEXT_PRIORITY *psSGXSetRenderContextPriorityIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
IMG_HANDLE hRenderContextInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_SET_RENDER_CONTEXT_PRIORITY);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXSetRenderContextPriorityIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hRenderContextInt,
psSGXSetRenderContextPriorityIN->hHWRenderContext,
PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError = SGXSetRenderContextPriorityKM(
hDevCookieInt,
hRenderContextInt,
psSGXSetRenderContextPriorityIN->ui32Priority,
psSGXSetRenderContextPriorityIN->ui32OffsetOfPriorityField);
return 0;
}
#if defined(SGX_FEATURE_2D_HARDWARE)
static IMG_INT
SGXSubmit2DBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SUBMIT2D *psSubmit2DIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
PVRSRV_2D_SGX_KICK *psKick;
#if defined (SUPPORT_SID_INTERFACE)
PVRSRV_2D_SGX_KICK_KM sKickKM;
#endif
IMG_UINT32 i;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_SUBMIT2D);
PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
psKick = &psSubmit2DIN->sKick;
#if defined(FIX_HW_BRN_31620)
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&psKick->hDevMemContext,
psKick->hDevMemContext,
PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
#endif
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSubmit2DIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sKickKM.hCCBMemInfo,
#else
&psKick->hCCBMemInfo,
#endif
psKick->hCCBMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
#if defined (SUPPORT_SID_INTERFACE)
if (psKick->hTASyncInfo != 0)
#else
if (psKick->hTASyncInfo != IMG_NULL)
#endif
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sKickKM.hTASyncInfo,
#else
&psKick->hTASyncInfo,
#endif
psKick->hTASyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#if defined (SUPPORT_SID_INTERFACE)
else
{
sKickKM.hTASyncInfo = IMG_NULL;
}
#endif
if (psKick->h3DSyncInfo != IMG_NULL)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sKickKM.h3DSyncInfo,
#else
&psKick->h3DSyncInfo,
#endif
psKick->h3DSyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#if defined (SUPPORT_SID_INTERFACE)
else
{
sKickKM.h3DSyncInfo = IMG_NULL;
}
#endif
if (psKick->ui32NumSrcSync > SGX_MAX_2D_SRC_SYNC_OPS)
{
psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
return 0;
}
#if defined (SUPPORT_SID_INTERFACE)
for (i = 0; i < SGX_MAX_2D_SRC_SYNC_OPS; i++)
{
if (i < psKick->ui32NumSrcSync)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&sKickKM.ahSrcSyncInfo[i],
psKick->ahSrcSyncInfo[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
else
{
sKickKM.ahSrcSyncInfo[i] = IMG_NULL;
}
}
#else
for (i = 0; i < psKick->ui32NumSrcSync; i++)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&psKick->ahSrcSyncInfo[i],
psKick->ahSrcSyncInfo[i],
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#endif
if (psKick->hDstSyncInfo != IMG_NULL)
{
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&sKickKM.hDstSyncInfo,
#else
&psKick->hDstSyncInfo,
#endif
psKick->hDstSyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#if defined (SUPPORT_SID_INTERFACE)
else
{
sKickKM.hDstSyncInfo = IMG_NULL;
}
sKickKM.ui32SharedCmdCCBOffset = psKick->ui32SharedCmdCCBOffset;
sKickKM.ui32NumSrcSync = psKick->ui32NumSrcSync;
sKickKM.ui32PDumpFlags = psKick->ui32PDumpFlags;
sKickKM.sHW2DContextDevVAddr = psKick->sHW2DContextDevVAddr;
#if defined(PDUMP)
sKickKM.ui32CCBDumpWOff = psKick->ui32CCBDumpWOff;
#endif
#endif
psRetOUT->eError =
#if defined (SUPPORT_SID_INTERFACE)
SGXSubmit2DKM(hDevCookieInt, &sKickKM);
#else
SGXSubmit2DKM(hDevCookieInt, psKick);
#endif
return 0;
}
#endif
#endif
static IMG_INT
SGXGetMiscInfoBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGXGETMISCINFO *psSGXGetMiscInfoIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
IMG_HANDLE hDevMemContextInt = 0;
PVRSRV_SGXDEV_INFO *psDevInfo;
SGX_MISC_INFO sMiscInfo;
PVRSRV_DEVICE_NODE *psDeviceNode;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID,
PVRSRV_BRIDGE_SGX_GETMISCINFO);
psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXGetMiscInfoIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
#if defined(SUPPORT_SGX_EDM_MEMORY_DEBUG)
if (psSGXGetMiscInfoIN->psMiscInfo->eRequest == SGX_MISC_INFO_REQUEST_MEMREAD)
{
psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevMemContextInt,
psSGXGetMiscInfoIN->psMiscInfo->hDevMemContext,
PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
#endif
psDeviceNode = hDevCookieInt;
PVR_ASSERT(psDeviceNode != IMG_NULL);
if (psDeviceNode == IMG_NULL)
{
return -EFAULT;
}
psDevInfo = psDeviceNode->pvDevice;
psRetOUT->eError = CopyFromUserWrapper(psPerProc,
ui32BridgeID,
&sMiscInfo,
psSGXGetMiscInfoIN->psMiscInfo,
sizeof(SGX_MISC_INFO));
if (psRetOUT->eError != PVRSRV_OK)
{
return -EFAULT;
}
{
psRetOUT->eError = SGXGetMiscInfoKM(psDevInfo, &sMiscInfo, psDeviceNode, hDevMemContextInt);
if (psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
}
psRetOUT->eError = CopyToUserWrapper(psPerProc,
ui32BridgeID,
psSGXGetMiscInfoIN->psMiscInfo,
&sMiscInfo,
sizeof(SGX_MISC_INFO));
if (psRetOUT->eError != PVRSRV_OK)
{
return -EFAULT;
}
return 0;
}
static IMG_INT
SGXReadHWPerfCBBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_CB *psSGXReadHWPerfCBIN,
PVRSRV_BRIDGE_OUT_SGX_READ_HWPERF_CB *psSGXReadHWPerfCBOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
PVRSRV_SGX_HWPERF_CB_ENTRY *psAllocated;
IMG_HANDLE hAllocatedHandle;
IMG_UINT32 ui32AllocatedSize;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_READ_HWPERF_CB);
psSGXReadHWPerfCBOUT->eError =PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXReadHWPerfCBIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psSGXReadHWPerfCBOUT->eError != PVRSRV_OK)
{
return 0;
}
ui32AllocatedSize = psSGXReadHWPerfCBIN->ui32ArraySize *
sizeof(psSGXReadHWPerfCBIN->psHWPerfCBData[0]);
ASSIGN_AND_EXIT_ON_ERROR(psSGXReadHWPerfCBOUT->eError,
OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32AllocatedSize,
(IMG_VOID **)&psAllocated,
&hAllocatedHandle,
"Array of Hardware Performance Circular Buffer Data"));
psSGXReadHWPerfCBOUT->eError = SGXReadHWPerfCBKM(hDevCookieInt,
psSGXReadHWPerfCBIN->ui32ArraySize,
psAllocated,
&psSGXReadHWPerfCBOUT->ui32DataCount,
&psSGXReadHWPerfCBOUT->ui32ClockSpeed,
&psSGXReadHWPerfCBOUT->ui32HostTimeStamp);
if (psSGXReadHWPerfCBOUT->eError == PVRSRV_OK)
{
psSGXReadHWPerfCBOUT->eError = CopyToUserWrapper(psPerProc,
ui32BridgeID,
psSGXReadHWPerfCBIN->psHWPerfCBData,
psAllocated,
ui32AllocatedSize);
}
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32AllocatedSize,
psAllocated,
hAllocatedHandle);
return 0;
}
static IMG_INT
SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGXDEVINITPART2 *psSGXDevInitPart2IN,
PVRSRV_BRIDGE_OUT_SGXDEVINITPART2 *psSGXDevInitPart2OUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
#if defined (SUPPORT_SID_INTERFACE)
PVRSRV_ERROR eError = PVRSRV_OK;
#else
PVRSRV_ERROR eError;
#endif
IMG_BOOL bDissociateFailed = IMG_FALSE;
IMG_BOOL bLookupFailed = IMG_FALSE;
IMG_BOOL bReleaseFailed = IMG_FALSE;
IMG_HANDLE hDummy;
IMG_UINT32 i;
#if defined (SUPPORT_SID_INTERFACE)
SGX_BRIDGE_INIT_INFO_KM asInitInfoKM = {0};
#endif
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DEVINITPART2);
psSGXDevInitPart2OUT->ui32KMBuildOptions = SGX_BUILD_OPTIONS;
if(!psPerProc->bInitProcess)
{
psSGXDevInitPart2OUT->eError = PVRSRV_ERROR_PROCESS_NOT_INITIALISED;
return 0;
}
psSGXDevInitPart2OUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXDevInitPart2IN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psSGXDevInitPart2OUT->eError != PVRSRV_OK)
{
return 0;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelCCBMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelCCBCtlMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelCCBEventKickerMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelSGXHostCtlMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelSGXTA3DCtlMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#if defined(FIX_HW_BRN_31272) || defined(FIX_HW_BRN_31780) || defined(FIX_HW_BRN_33920)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelSGXPTLAWriteBackMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#endif
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelSGXMiscMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#if defined(SGX_SUPPORT_HWPROFILING)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelHWProfilingMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#endif
#if defined(SUPPORT_SGX_HWPERF)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#endif
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelTASigBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernel3DSigBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#if defined(FIX_HW_BRN_29702)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelCFIMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#endif
#if defined(FIX_HW_BRN_29823)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelDummyTermStreamMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#endif
#if defined(FIX_HW_BRN_31542) || defined(FIX_HW_BRN_36513)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAVDMStreamMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAIndexStreamMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPDSMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAUSEMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAParamMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPMPTMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWATPCMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPSGRgnHdrMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#endif
#if defined(SGX_FEATURE_VDM_CONTEXT_SWITCH) && defined(FIX_HW_BRN_31559)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelVDMSnapShotBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelVDMCtrlStreamBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#endif
#if defined(SGX_FEATURE_VDM_CONTEXT_SWITCH) && \
defined(FIX_HW_BRN_33657) && defined(SUPPORT_SECURE_33657_FIX)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelVDMStateUpdateBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#endif
#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
psSGXDevInitPart2IN->sInitInfo.hKernelEDMStatusBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#endif
for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++)
{
#if defined (SUPPORT_SID_INTERFACE)
IMG_SID hHandle = psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
#else
IMG_HANDLE hHandle = psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
#endif
#if defined (SUPPORT_SID_INTERFACE)
if (hHandle == 0)
#else
if (hHandle == IMG_NULL)
#endif
{
continue;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDummy,
hHandle,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
}
if (bLookupFailed)
{
PVR_DPF((PVR_DBG_ERROR, "DevInitSGXPart2BW: A handle lookup failed"));
psSGXDevInitPart2OUT->eError = PVRSRV_ERROR_INIT2_PHASE_FAILED;
return 0;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelCCBMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelCCBMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelCCBMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelCCBCtlMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelCCBCtlMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelCCBCtlMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelCCBEventKickerMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelCCBEventKickerMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelCCBEventKickerMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelSGXHostCtlMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelSGXHostCtlMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelSGXHostCtlMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelSGXTA3DCtlMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelSGXTA3DCtlMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelSGXTA3DCtlMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#if defined(FIX_HW_BRN_31272) || defined(FIX_HW_BRN_31780) || defined(FIX_HW_BRN_33920)
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelSGXPTLAWriteBackMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelSGXPTLAWriteBackMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelSGXPTLAWriteBackMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#endif
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelSGXMiscMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelSGXMiscMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelSGXMiscMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#if defined(SGX_SUPPORT_HWPROFILING)
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelHWProfilingMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelHWProfilingMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelHWProfilingMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#endif
#if defined(SUPPORT_SGX_HWPERF)
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelHWPerfCBMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#endif
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelTASigBufferMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelTASigBufferMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelTASigBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernel3DSigBufferMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernel3DSigBufferMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernel3DSigBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#if defined(FIX_HW_BRN_29702)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelCFIMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelCFIMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelCFIMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bLookupFailed = IMG_TRUE;
}
#endif
#if defined(FIX_HW_BRN_29823)
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelDummyTermStreamMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelDummyTermStreamMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelDummyTermStreamMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#endif
#if defined(FIX_HW_BRN_31542) || defined(FIX_HW_BRN_36513)
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelClearClipWAVDMStreamMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAVDMStreamMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAVDMStreamMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelClearClipWAIndexStreamMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAIndexStreamMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAIndexStreamMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelClearClipWAPDSMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPDSMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPDSMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelClearClipWAUSEMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAUSEMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAUSEMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelClearClipWAParamMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAParamMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAParamMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelClearClipWAPMPTMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPMPTMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPMPTMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelClearClipWATPCMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWATPCMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWATPCMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelClearClipWAPSGRgnHdrMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPSGRgnHdrMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPSGRgnHdrMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#endif
#if defined(SGX_FEATURE_VDM_CONTEXT_SWITCH) && defined(FIX_HW_BRN_31559)
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
&psSGXDevInitPart2IN->sInitInfo.hKernelVDMSnapShotBufferMemInfo,
psSGXDevInitPart2IN->sInitInfo.hKernelVDMSnapShotBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
&psSGXDevInitPart2IN->sInitInfo.hKernelVDMCtrlStreamBufferMemInfo,
psSGXDevInitPart2IN->sInitInfo.hKernelVDMCtrlStreamBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#endif
#if defined(SGX_FEATURE_VDM_CONTEXT_SWITCH) && \
defined(FIX_HW_BRN_33657) && defined(SUPPORT_SECURE_33657_FIX)
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
&psSGXDevInitPart2IN->sInitInfo.hKernelVDMStateUpdateBufferMemInfo,
psSGXDevInitPart2IN->sInitInfo.hKernelVDMStateUpdateBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#endif
#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
&asInitInfoKM.hKernelEDMStatusBufferMemInfo,
#else
&psSGXDevInitPart2IN->sInitInfo.hKernelEDMStatusBufferMemInfo,
#endif
psSGXDevInitPart2IN->sInitInfo.hKernelEDMStatusBufferMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
#endif
for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++)
{
#if defined (SUPPORT_SID_INTERFACE)
IMG_SID hHandle = psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
IMG_HANDLE *phHandleKM = &asInitInfoKM.asInitMemHandles[i];
if (hHandle == 0)
#else
IMG_HANDLE *phHandle = &psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
if (*phHandle == IMG_NULL)
#endif
continue;
eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase,
#if defined (SUPPORT_SID_INTERFACE)
phHandleKM,
hHandle,
#else
phHandle,
*phHandle,
#endif
PVRSRV_HANDLE_TYPE_MEM_INFO);
if (eError != PVRSRV_OK)
{
bReleaseFailed = IMG_TRUE;
}
}
if (bReleaseFailed)
{
PVR_DPF((PVR_DBG_ERROR, "DevInitSGXPart2BW: A handle release failed"));
psSGXDevInitPart2OUT->eError = PVRSRV_ERROR_INIT2_PHASE_FAILED;
PVR_DBG_BREAK;
return 0;
}
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCCBMemInfo);
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCCBMemInfo);
#endif
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCCBCtlMemInfo);
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCCBCtlMemInfo);
#endif
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCCBEventKickerMemInfo);
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCCBEventKickerMemInfo);
#endif
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXHostCtlMemInfo);
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXHostCtlMemInfo);
#endif
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXTA3DCtlMemInfo);
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXTA3DCtlMemInfo);
#endif
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#if defined(FIX_HW_BRN_31272) || defined(FIX_HW_BRN_31780) || defined(FIX_HW_BRN_33920)
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXPTLAWriteBackMemInfo);
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXPTLAWriteBackMemInfo);
#endif
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#endif
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXMiscMemInfo);
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXMiscMemInfo);
#endif
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#if defined(SGX_SUPPORT_HWPROFILING)
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelHWProfilingMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelHWProfilingMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#endif
#if defined(SUPPORT_SGX_HWPERF)
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelHWPerfCBMemInfo);
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo);
#endif
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#endif
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelTASigBufferMemInfo);
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelTASigBufferMemInfo);
#endif
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernel3DSigBufferMemInfo);
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernel3DSigBufferMemInfo);
#endif
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#if defined(FIX_HW_BRN_29702)
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCFIMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCFIMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#endif
#if defined(FIX_HW_BRN_29823)
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelDummyTermStreamMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelDummyTermStreamMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#endif
#if defined(FIX_HW_BRN_31542) || defined(FIX_HW_BRN_36513)
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAVDMStreamMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAVDMStreamMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAIndexStreamMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAIndexStreamMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAPDSMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPDSMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAUSEMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAUSEMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAParamMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAParamMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAPMPTMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPMPTMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWATPCMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWATPCMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAPSGRgnHdrMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPSGRgnHdrMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#endif
#if defined(SGX_FEATURE_VDM_CONTEXT_SWITCH) && defined(FIX_HW_BRN_31559)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelVDMSnapShotBufferMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelVDMCtrlStreamBufferMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#if defined(SGX_FEATURE_VDM_CONTEXT_SWITCH) && \
defined(FIX_HW_BRN_33657) && defined(SUPPORT_SECURE_33657_FIX)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelVDMStateUpdateBufferMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG)
#if defined (SUPPORT_SID_INTERFACE)
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelEDMStatusBufferMemInfo);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
#else
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelEDMStatusBufferMemInfo);
bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK);
#endif
#endif
for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++)
{
#if defined (SUPPORT_SID_INTERFACE)
IMG_HANDLE hHandle = asInitInfoKM.asInitMemHandles[i];
#else
IMG_HANDLE hHandle = psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
#endif
if (hHandle == IMG_NULL)
continue;
eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, hHandle);
if (eError != PVRSRV_OK)
{
bDissociateFailed = IMG_TRUE;
}
}
if(bDissociateFailed)
{
#if defined (SUPPORT_SID_INTERFACE)
PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCCBMemInfo);
PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCCBCtlMemInfo);
PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXHostCtlMemInfo);
PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXTA3DCtlMemInfo);
#if defined(FIX_HW_BRN_31272) || defined(FIX_HW_BRN_31780) || defined(FIX_HW_BRN_33920)
PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXPTLAWriteBackMemInfo);
#endif
PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXMiscMemInfo);
#else
PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCCBMemInfo);
PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCCBCtlMemInfo);
PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXHostCtlMemInfo);
PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXTA3DCtlMemInfo);
#if defined(FIX_HW_BRN_31272) || defined(FIX_HW_BRN_31780) || defined(FIX_HW_BRN_33920)
PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXPTLAWriteBackMemInfo);
#endif
PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXMiscMemInfo);
#endif
for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++)
{
#if defined (SUPPORT_SID_INTERFACE)
IMG_HANDLE hHandle = asInitInfoKM.asInitMemHandles[i];
if (hHandle == 0)
#else
IMG_HANDLE hHandle = psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i];
if (hHandle == IMG_NULL)
#endif
continue;
PVRSRVFreeDeviceMemKM(hDevCookieInt, (PVRSRV_KERNEL_MEM_INFO *)hHandle);
}
PVR_DPF((PVR_DBG_ERROR, "DevInitSGXPart2BW: A dissociate failed"));
psSGXDevInitPart2OUT->eError = PVRSRV_ERROR_INIT2_PHASE_FAILED;
PVR_DBG_BREAK;
return 0;
}
#if defined (SUPPORT_SID_INTERFACE)
asInitInfoKM.sScripts = psSGXDevInitPart2IN->sInitInfo.sScripts;
asInitInfoKM.ui32ClientBuildOptions = psSGXDevInitPart2IN->sInitInfo.ui32ClientBuildOptions;
asInitInfoKM.sSGXStructSizes = psSGXDevInitPart2IN->sInitInfo.sSGXStructSizes;
asInitInfoKM.ui32CacheControl = psSGXDevInitPart2IN->sInitInfo.ui32CacheControl;
asInitInfoKM.ui32EDMTaskReg0 = psSGXDevInitPart2IN->sInitInfo.ui32EDMTaskReg0;
asInitInfoKM.ui32EDMTaskReg1 = psSGXDevInitPart2IN->sInitInfo.ui32EDMTaskReg1;
asInitInfoKM.ui32ClkGateStatusReg = psSGXDevInitPart2IN->sInitInfo.ui32ClkGateStatusReg;
asInitInfoKM.ui32ClkGateStatusMask = psSGXDevInitPart2IN->sInitInfo.ui32ClkGateStatusMask;
OSMemCopy(&asInitInfoKM.asInitDevData ,
&psSGXDevInitPart2IN->sInitInfo.asInitDevData,
sizeof(asInitInfoKM.asInitDevData));
OSMemCopy(&asInitInfoKM.aui32HostKickAddr,
&psSGXDevInitPart2IN->sInitInfo.aui32HostKickAddr,
sizeof(asInitInfoKM.aui32HostKickAddr));
psSGXDevInitPart2OUT->eError =
DevInitSGXPart2KM(psPerProc,
hDevCookieInt,
&asInitInfoKM);
#else
psSGXDevInitPart2OUT->eError =
DevInitSGXPart2KM(psPerProc,
hDevCookieInt,
&psSGXDevInitPart2IN->sInitInfo);
#endif
return 0;
}
static IMG_INT
SGXRegisterHWRenderContextBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT *psSGXRegHWRenderContextIN,
PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT *psSGXRegHWRenderContextOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
IMG_HANDLE hHWRenderContextInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT);
NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError, psPerProc, 1);
psSGXRegHWRenderContextOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXRegHWRenderContextIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psSGXRegHWRenderContextOUT->eError != PVRSRV_OK)
{
return 0;
}
hHWRenderContextInt =
SGXRegisterHWRenderContextKM(hDevCookieInt,
psSGXRegHWRenderContextIN->pHWRenderContextCpuVAddr,
psSGXRegHWRenderContextIN->ui32HWRenderContextSize,
psSGXRegHWRenderContextIN->ui32OffsetToPDDevPAddr,
psSGXRegHWRenderContextIN->hDevMemContext,
&psSGXRegHWRenderContextOUT->sHWRenderContextDevVAddr,
psPerProc);
if (hHWRenderContextInt == IMG_NULL)
{
psSGXRegHWRenderContextOUT->eError = PVRSRV_ERROR_UNABLE_TO_REGISTER_CONTEXT;
return 0;
}
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&psSGXRegHWRenderContextOUT->hHWRenderContext,
hHWRenderContextInt,
PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT,
PVRSRV_HANDLE_ALLOC_FLAG_NONE);
COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWRenderContextOUT->eError, psPerProc);
return 0;
}
static IMG_INT
SGXUnregisterHWRenderContextBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT *psSGXUnregHWRenderContextIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hHWRenderContextInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hHWRenderContextInt,
psSGXUnregHWRenderContextIN->hHWRenderContext,
PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError = SGXUnregisterHWRenderContextKM(hHWRenderContextInt,
psSGXUnregHWRenderContextIN->bForceCleanup);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError =
PVRSRVReleaseHandle(psPerProc->psHandleBase,
psSGXUnregHWRenderContextIN->hHWRenderContext,
PVRSRV_HANDLE_TYPE_SGX_HW_RENDER_CONTEXT);
return 0;
}
static IMG_INT
SGXRegisterHWTransferContextBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT *psSGXRegHWTransferContextIN,
PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT *psSGXRegHWTransferContextOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
IMG_HANDLE hHWTransferContextInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT);
NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError, psPerProc, 1);
psSGXRegHWTransferContextOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXRegHWTransferContextIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psSGXRegHWTransferContextOUT->eError != PVRSRV_OK)
{
return 0;
}
hHWTransferContextInt =
SGXRegisterHWTransferContextKM(hDevCookieInt,
psSGXRegHWTransferContextIN->pHWTransferContextCpuVAddr,
psSGXRegHWTransferContextIN->ui32HWTransferContextSize,
psSGXRegHWTransferContextIN->ui32OffsetToPDDevPAddr,
psSGXRegHWTransferContextIN->hDevMemContext,
&psSGXRegHWTransferContextOUT->sHWTransferContextDevVAddr,
psPerProc);
if (hHWTransferContextInt == IMG_NULL)
{
psSGXRegHWTransferContextOUT->eError = PVRSRV_ERROR_UNABLE_TO_REGISTER_CONTEXT;
return 0;
}
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&psSGXRegHWTransferContextOUT->hHWTransferContext,
hHWTransferContextInt,
PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT,
PVRSRV_HANDLE_ALLOC_FLAG_NONE);
COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHWTransferContextOUT->eError, psPerProc);
return 0;
}
static IMG_INT
SGXUnregisterHWTransferContextBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT *psSGXUnregHWTransferContextIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
#if defined (SUPPORT_SID_INTERFACE)
IMG_HANDLE hHWTransferContextInt = 0;
#else
IMG_HANDLE hHWTransferContextInt;
#endif
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hHWTransferContextInt,
psSGXUnregHWTransferContextIN->hHWTransferContext,
PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError = SGXUnregisterHWTransferContextKM(hHWTransferContextInt,
psSGXUnregHWTransferContextIN->bForceCleanup);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError =
PVRSRVReleaseHandle(psPerProc->psHandleBase,
psSGXUnregHWTransferContextIN->hHWTransferContext,
PVRSRV_HANDLE_TYPE_SGX_HW_TRANSFER_CONTEXT);
return 0;
}
#if defined(SGX_FEATURE_2D_HARDWARE)
static IMG_INT
SGXRegisterHW2DContextBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_2D_CONTEXT *psSGXRegHW2DContextIN,
PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_2D_CONTEXT *psSGXRegHW2DContextOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
IMG_HANDLE hHW2DContextInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_REGISTER_HW_2D_CONTEXT);
NEW_HANDLE_BATCH_OR_ERROR(psSGXRegHW2DContextOUT->eError, psPerProc, 1);
psSGXRegHW2DContextOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXRegHW2DContextIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psSGXRegHW2DContextOUT->eError != PVRSRV_OK)
{
return 0;
}
hHW2DContextInt =
SGXRegisterHW2DContextKM(hDevCookieInt,
psSGXRegHW2DContextIN->pHW2DContextCpuVAddr,
psSGXRegHW2DContextIN->ui32HW2DContextSize,
psSGXRegHW2DContextIN->ui32OffsetToPDDevPAddr,
psSGXRegHW2DContextIN->hDevMemContext,
&psSGXRegHW2DContextOUT->sHW2DContextDevVAddr,
psPerProc);
if (hHW2DContextInt == IMG_NULL)
{
psSGXRegHW2DContextOUT->eError = PVRSRV_ERROR_UNABLE_TO_REGISTER_CONTEXT;
return 0;
}
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&psSGXRegHW2DContextOUT->hHW2DContext,
hHW2DContextInt,
PVRSRV_HANDLE_TYPE_SGX_HW_2D_CONTEXT,
PVRSRV_HANDLE_ALLOC_FLAG_NONE);
COMMIT_HANDLE_BATCH_OR_ERROR(psSGXRegHW2DContextOUT->eError, psPerProc);
return 0;
}
static IMG_INT
SGXUnregisterHW2DContextBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_2D_CONTEXT *psSGXUnregHW2DContextIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hHW2DContextInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_UNREGISTER_HW_2D_CONTEXT);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hHW2DContextInt,
psSGXUnregHW2DContextIN->hHW2DContext,
PVRSRV_HANDLE_TYPE_SGX_HW_2D_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError = SGXUnregisterHW2DContextKM(hHW2DContextInt,
psSGXUnregHW2DContextIN->bForceCleanup);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError =
PVRSRVReleaseHandle(psPerProc->psHandleBase,
psSGXUnregHW2DContextIN->hHW2DContext,
PVRSRV_HANDLE_TYPE_SGX_HW_2D_CONTEXT);
return 0;
}
#endif
static IMG_INT
SGXFlushHWRenderTargetBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET *psSGXFlushHWRenderTargetIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXFlushHWRenderTargetIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError = SGXFlushHWRenderTargetKM(hDevCookieInt, psSGXFlushHWRenderTargetIN->sHWRTDataSetDevVAddr, IMG_FALSE);
return 0;
}
static IMG_INT
SGX2DQueryBlitsCompleteBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_2DQUERYBLTSCOMPLETE *ps2DQueryBltsCompleteIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
IMG_VOID *pvSyncInfo;
PVRSRV_SGXDEV_INFO *psDevInfo;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
ps2DQueryBltsCompleteIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&pvSyncInfo,
ps2DQueryBltsCompleteIN->hKernSyncInfo,
PVRSRV_HANDLE_TYPE_SYNC_INFO);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psDevInfo = (PVRSRV_SGXDEV_INFO *)((PVRSRV_DEVICE_NODE *)hDevCookieInt)->pvDevice;
psRetOUT->eError =
SGX2DQueryBlitsCompleteKM(psDevInfo,
(PVRSRV_KERNEL_SYNC_INFO *)pvSyncInfo,
ps2DQueryBltsCompleteIN->bWaitForComplete);
return 0;
}
static IMG_INT
SGXFindSharedPBDescBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescIN,
PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
PVRSRV_KERNEL_MEM_INFO *psHWBlockKernelMemInfo;
PVRSRV_KERNEL_MEM_INFO **ppsSharedPBDescSubKernelMemInfos = IMG_NULL;
IMG_UINT32 ui32SharedPBDescSubKernelMemInfosCount = 0;
IMG_UINT32 i;
IMG_HANDLE hSharedPBDesc = IMG_NULL;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC);
NEW_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError, psPerProc, PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS + 4);
psSGXFindSharedPBDescOUT->hSharedPBDesc = IMG_NULL;
psSGXFindSharedPBDescOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXFindSharedPBDescIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
psSGXFindSharedPBDescOUT->eError =
SGXFindSharedPBDescKM(psPerProc, hDevCookieInt,
psSGXFindSharedPBDescIN->bLockOnFailure,
psSGXFindSharedPBDescIN->ui32TotalPBSize,
&hSharedPBDesc,
&psSharedPBDescKernelMemInfo,
&psHWPBDescKernelMemInfo,
&psBlockKernelMemInfo,
&psHWBlockKernelMemInfo,
&ppsSharedPBDescSubKernelMemInfos,
&ui32SharedPBDescSubKernelMemInfosCount);
if(psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
PVR_ASSERT(ui32SharedPBDescSubKernelMemInfosCount
<= PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
psSGXFindSharedPBDescOUT->ui32SharedPBDescSubKernelMemInfoHandlesCount =
ui32SharedPBDescSubKernelMemInfosCount;
if(hSharedPBDesc == IMG_NULL)
{
psSGXFindSharedPBDescOUT->hSharedPBDescKernelMemInfoHandle = 0;
goto PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT;
}
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&psSGXFindSharedPBDescOUT->hSharedPBDesc,
hSharedPBDesc,
PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
PVRSRV_HANDLE_ALLOC_FLAG_NONE);
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
&psSGXFindSharedPBDescOUT->hSharedPBDescKernelMemInfoHandle,
psSharedPBDescKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
psSGXFindSharedPBDescOUT->hSharedPBDesc);
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
&psSGXFindSharedPBDescOUT->hHWPBDescKernelMemInfoHandle,
psHWPBDescKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
psSGXFindSharedPBDescOUT->hSharedPBDesc);
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
&psSGXFindSharedPBDescOUT->hBlockKernelMemInfoHandle,
psBlockKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
psSGXFindSharedPBDescOUT->hSharedPBDesc);
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
&psSGXFindSharedPBDescOUT->hHWBlockKernelMemInfoHandle,
psHWBlockKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
psSGXFindSharedPBDescOUT->hSharedPBDesc);
for(i=0; i<ui32SharedPBDescSubKernelMemInfosCount; i++)
{
PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC *psSGXFindSharedPBDescOut =
psSGXFindSharedPBDescOUT;
PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
&psSGXFindSharedPBDescOut->ahSharedPBDescSubKernelMemInfoHandles[i],
ppsSharedPBDescSubKernelMemInfos[i],
PVRSRV_HANDLE_TYPE_MEM_INFO_REF,
PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
psSGXFindSharedPBDescOUT->hSharedPBDescKernelMemInfoHandle);
}
PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC_EXIT:
if (ppsSharedPBDescSubKernelMemInfos != IMG_NULL)
{
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
sizeof(PVRSRV_KERNEL_MEM_INFO *) * ui32SharedPBDescSubKernelMemInfosCount,
ppsSharedPBDescSubKernelMemInfos,
IMG_NULL);
}
if(psSGXFindSharedPBDescOUT->eError != PVRSRV_OK)
{
if(hSharedPBDesc != IMG_NULL)
{
SGXUnrefSharedPBDescKM(hSharedPBDesc);
}
}
else
{
COMMIT_HANDLE_BATCH_OR_ERROR(psSGXFindSharedPBDescOUT->eError, psPerProc);
}
return 0;
}
static IMG_INT
SGXUnrefSharedPBDescBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGXUNREFSHAREDPBDESC *psSGXUnrefSharedPBDescIN,
PVRSRV_BRIDGE_OUT_SGXUNREFSHAREDPBDESC *psSGXUnrefSharedPBDescOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hSharedPBDesc;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC);
psSGXUnrefSharedPBDescOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
&hSharedPBDesc,
psSGXUnrefSharedPBDescIN->hSharedPBDesc,
PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
if(psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
{
return 0;
}
psSGXUnrefSharedPBDescOUT->eError =
SGXUnrefSharedPBDescKM(hSharedPBDesc);
if(psSGXUnrefSharedPBDescOUT->eError != PVRSRV_OK)
{
return 0;
}
psSGXUnrefSharedPBDescOUT->eError =
PVRSRVReleaseHandle(psPerProc->psHandleBase,
psSGXUnrefSharedPBDescIN->hSharedPBDesc,
PVRSRV_HANDLE_TYPE_SHARED_PB_DESC);
return 0;
}
static IMG_INT
SGXAddSharedPBDescBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescIN,
PVRSRV_BRIDGE_OUT_SGXADDSHAREDPBDESC *psSGXAddSharedPBDescOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
PVRSRV_KERNEL_MEM_INFO *psSharedPBDescKernelMemInfo;
PVRSRV_KERNEL_MEM_INFO *psHWPBDescKernelMemInfo;
PVRSRV_KERNEL_MEM_INFO *psBlockKernelMemInfo;
PVRSRV_KERNEL_MEM_INFO *psHWBlockKernelMemInfo;
IMG_UINT32 ui32KernelMemInfoHandlesCount =
psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount;
IMG_INT ret = 0;
#if defined (SUPPORT_SID_INTERFACE)
IMG_SID *phKernelMemInfoHandles = 0;
#else
IMG_HANDLE *phKernelMemInfoHandles = IMG_NULL;
#endif
PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfos = IMG_NULL;
IMG_UINT32 i;
PVRSRV_ERROR eError;
IMG_HANDLE hSharedPBDesc = IMG_NULL;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC);
NEW_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError, psPerProc, 1);
psSGXAddSharedPBDescOUT->hSharedPBDesc = IMG_NULL;
PVR_ASSERT(ui32KernelMemInfoHandlesCount
<= PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS);
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&hDevCookieInt,
psSGXAddSharedPBDescIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
(IMG_VOID **)&psSharedPBDescKernelMemInfo,
psSGXAddSharedPBDescIN->hSharedPBDescKernelMemInfo,
PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
if(eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
(IMG_VOID **)&psHWPBDescKernelMemInfo,
psSGXAddSharedPBDescIN->hHWPBDescKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if(eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
(IMG_VOID **)&psBlockKernelMemInfo,
psSGXAddSharedPBDescIN->hBlockKernelMemInfo,
PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
if(eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
(IMG_VOID **)&psHWBlockKernelMemInfo,
psSGXAddSharedPBDescIN->hHWBlockKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
if(eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
if(!OSAccessOK(PVR_VERIFY_READ,
psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
ui32KernelMemInfoHandlesCount * sizeof(IMG_HANDLE)))
{
PVR_DPF((PVR_DBG_ERROR, "%s: PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC:"
" Invalid phKernelMemInfos pointer", __FUNCTION__));
ret = -EFAULT;
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32KernelMemInfoHandlesCount * sizeof(IMG_HANDLE),
(IMG_VOID **)&phKernelMemInfoHandles,
0,
"Array of Handles");
if (eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
if(CopyFromUserWrapper(psPerProc,
ui32BridgeID,
phKernelMemInfoHandles,
psSGXAddSharedPBDescIN->phKernelMemInfoHandles,
ui32KernelMemInfoHandlesCount * sizeof(IMG_HANDLE))
!= PVRSRV_OK)
{
ret = -EFAULT;
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32KernelMemInfoHandlesCount * sizeof(PVRSRV_KERNEL_MEM_INFO *),
(IMG_VOID **)&ppsKernelMemInfos,
0,
"Array of pointers to Kernel Memory Info");
if (eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
for(i=0; i<ui32KernelMemInfoHandlesCount; i++)
{
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
(IMG_VOID **)&ppsKernelMemInfos[i],
phKernelMemInfoHandles[i],
PVRSRV_HANDLE_TYPE_MEM_INFO);
if(eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
}
eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
psSGXAddSharedPBDescIN->hSharedPBDescKernelMemInfo,
PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
PVR_ASSERT(eError == PVRSRV_OK);
eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
psSGXAddSharedPBDescIN->hHWPBDescKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
PVR_ASSERT(eError == PVRSRV_OK);
eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
psSGXAddSharedPBDescIN->hBlockKernelMemInfo,
PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO);
PVR_ASSERT(eError == PVRSRV_OK);
eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
psSGXAddSharedPBDescIN->hHWBlockKernelMemInfo,
PVRSRV_HANDLE_TYPE_MEM_INFO);
PVR_ASSERT(eError == PVRSRV_OK);
for(i=0; i<ui32KernelMemInfoHandlesCount; i++)
{
eError = PVRSRVReleaseHandle(psPerProc->psHandleBase,
phKernelMemInfoHandles[i],
PVRSRV_HANDLE_TYPE_MEM_INFO);
PVR_ASSERT(eError == PVRSRV_OK);
}
eError = SGXAddSharedPBDescKM(psPerProc, hDevCookieInt,
psSharedPBDescKernelMemInfo,
psHWPBDescKernelMemInfo,
psBlockKernelMemInfo,
psHWBlockKernelMemInfo,
psSGXAddSharedPBDescIN->ui32TotalPBSize,
&hSharedPBDesc,
ppsKernelMemInfos,
ui32KernelMemInfoHandlesCount,
psSGXAddSharedPBDescIN->sHWPBDescDevVAddr);
if (eError != PVRSRV_OK)
{
goto PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT;
}
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&psSGXAddSharedPBDescOUT->hSharedPBDesc,
hSharedPBDesc,
PVRSRV_HANDLE_TYPE_SHARED_PB_DESC,
PVRSRV_HANDLE_ALLOC_FLAG_NONE);
PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC_RETURN_RESULT:
if(phKernelMemInfoHandles)
{
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount * sizeof(IMG_HANDLE),
(IMG_VOID *)phKernelMemInfoHandles,
0);
}
if(ppsKernelMemInfos)
{
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount * sizeof(PVRSRV_KERNEL_MEM_INFO *),
(IMG_VOID *)ppsKernelMemInfos,
0);
}
if(ret == 0 && eError == PVRSRV_OK)
{
COMMIT_HANDLE_BATCH_OR_ERROR(psSGXAddSharedPBDescOUT->eError, psPerProc);
}
psSGXAddSharedPBDescOUT->eError = eError;
return ret;
}
static IMG_INT
SGXGetInfoForSrvinitBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitIN,
PVRSRV_BRIDGE_OUT_SGXINFO_FOR_SRVINIT *psSGXInfoForSrvinitOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_HANDLE hDevCookieInt;
IMG_UINT32 i;
#if defined (SUPPORT_SID_INTERFACE)
PVRSRV_HEAP_INFO_KM asHeapInfo[PVRSRV_MAX_CLIENT_HEAPS];
#endif
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT);
NEW_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc, PVRSRV_MAX_CLIENT_HEAPS);
if(!psPerProc->bInitProcess)
{
psSGXInfoForSrvinitOUT->eError = PVRSRV_ERROR_PROCESS_NOT_INITIALISED;
return 0;
}
psSGXInfoForSrvinitOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
psSGXInfoForSrvinitIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
{
return 0;
}
psSGXInfoForSrvinitOUT->eError =
SGXGetInfoForSrvinitKM(hDevCookieInt,
#if defined (SUPPORT_SID_INTERFACE)
&asHeapInfo[0],
&psSGXInfoForSrvinitOUT->sInitInfo.sPDDevPAddr);
#else
&psSGXInfoForSrvinitOUT->sInitInfo);
#endif
if(psSGXInfoForSrvinitOUT->eError != PVRSRV_OK)
{
return 0;
}
for(i = 0; i < PVRSRV_MAX_CLIENT_HEAPS; i++)
{
PVRSRV_HEAP_INFO *psHeapInfo;
psHeapInfo = &psSGXInfoForSrvinitOUT->sInitInfo.asHeapInfo[i];
#if defined (SUPPORT_SID_INTERFACE)
if ((asHeapInfo[i].ui32HeapID != (IMG_UINT32)SGX_UNDEFINED_HEAP_ID) &&
(asHeapInfo[i].hDevMemHeap != IMG_NULL))
{
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&psHeapInfo->hDevMemHeap,
asHeapInfo[i].hDevMemHeap,
PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
}
else
{
psHeapInfo->hDevMemHeap = 0;
}
psHeapInfo->ui32HeapID = asHeapInfo[i].ui32HeapID;
psHeapInfo->sDevVAddrBase = asHeapInfo[i].sDevVAddrBase;
psHeapInfo->ui32HeapByteSize = asHeapInfo[i].ui32HeapByteSize;
psHeapInfo->ui32Attribs = asHeapInfo[i].ui32Attribs;
psHeapInfo->ui32XTileStride = asHeapInfo[i].ui32XTileStride;
#else
if (psHeapInfo->ui32HeapID != (IMG_UINT32)SGX_UNDEFINED_HEAP_ID)
{
IMG_HANDLE hDevMemHeapExt;
if (psHeapInfo->hDevMemHeap != IMG_NULL)
{
PVRSRVAllocHandleNR(psPerProc->psHandleBase,
&hDevMemHeapExt,
psHeapInfo->hDevMemHeap,
PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP,
PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
psHeapInfo->hDevMemHeap = hDevMemHeapExt;
}
}
#endif
}
COMMIT_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc);
return 0;
}
#if defined(PDUMP)
static IMG_VOID
DumpBufferArray(PVRSRV_PER_PROCESS_DATA *psPerProc,
#if defined (SUPPORT_SID_INTERFACE)
PSGX_KICKTA_DUMP_BUFFER_KM psBufferArray,
#else
PSGX_KICKTA_DUMP_BUFFER psBufferArray,
#endif
IMG_UINT32 ui32BufferArrayLength,
IMG_BOOL bDumpPolls)
{
IMG_UINT32 i;
for (i=0; i<ui32BufferArrayLength; i++)
{
#if defined (SUPPORT_SID_INTERFACE)
PSGX_KICKTA_DUMP_BUFFER_KM psBuffer;
#else
PSGX_KICKTA_DUMP_BUFFER psBuffer;
#endif
PVRSRV_KERNEL_MEM_INFO *psCtrlMemInfoKM;
IMG_CHAR * pszName;
IMG_HANDLE hUniqueTag;
IMG_UINT32 ui32Offset;
psBuffer = &psBufferArray[i];
pszName = psBuffer->pszName;
if (!pszName)
{
pszName = "Nameless buffer";
}
hUniqueTag = MAKEUNIQUETAG((PVRSRV_KERNEL_MEM_INFO *)psBuffer->hKernelMemInfo);
#if defined(SUPPORT_SGX_NEW_STATUS_VALS)
psCtrlMemInfoKM = ((PVRSRV_KERNEL_MEM_INFO *)psBuffer->hCtrlKernelMemInfo);
ui32Offset = psBuffer->sCtrlDevVAddr.uiAddr - psCtrlMemInfoKM->sDevVAddr.uiAddr;
#else
psCtrlMemInfoKM = ((PVRSRV_KERNEL_MEM_INFO *)psBuffer->hKernelMemInfo)->psKernelSyncInfo->psSyncDataMemInfoKM;
ui32Offset = offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete);
#endif
if (psBuffer->ui32Start <= psBuffer->ui32End)
{
if (bDumpPolls)
{
PDUMPCOMMENTWITHFLAGS(0, "Wait for %s space\r\n", pszName);
PDUMPCBP(psCtrlMemInfoKM,
ui32Offset,
psBuffer->ui32Start,
psBuffer->ui32SpaceUsed,
psBuffer->ui32BufferSize,
0,
MAKEUNIQUETAG(psCtrlMemInfoKM));
}
PDUMPCOMMENTWITHFLAGS(0, "%s\r\n", pszName);
PDUMPMEMUM(psPerProc,
IMG_NULL,
psBuffer->pvLinAddr,
(PVRSRV_KERNEL_MEM_INFO*)psBuffer->hKernelMemInfo,
psBuffer->ui32Start,
psBuffer->ui32End - psBuffer->ui32Start,
0,
hUniqueTag);
}
else
{
if (bDumpPolls)
{
PDUMPCOMMENTWITHFLAGS(0, "Wait for %s space\r\n", pszName);
PDUMPCBP(psCtrlMemInfoKM,
ui32Offset,
psBuffer->ui32Start,
psBuffer->ui32BackEndLength,
psBuffer->ui32BufferSize,
0,
MAKEUNIQUETAG(psCtrlMemInfoKM));
}
PDUMPCOMMENTWITHFLAGS(0, "%s (part 1)\r\n", pszName);
PDUMPMEMUM(psPerProc,
IMG_NULL,
psBuffer->pvLinAddr,
(PVRSRV_KERNEL_MEM_INFO*)psBuffer->hKernelMemInfo,
psBuffer->ui32Start,
psBuffer->ui32BackEndLength,
0,
hUniqueTag);
if (bDumpPolls)
{
PDUMPMEMPOL(psCtrlMemInfoKM,
ui32Offset,
0,
0xFFFFFFFF,
PDUMP_POLL_OPERATOR_NOTEQUAL,
0,
MAKEUNIQUETAG(psCtrlMemInfoKM));
PDUMPCOMMENTWITHFLAGS(0, "Wait for %s space\r\n", pszName);
PDUMPCBP(psCtrlMemInfoKM,
ui32Offset,
0,
psBuffer->ui32End,
psBuffer->ui32BufferSize,
0,
MAKEUNIQUETAG(psCtrlMemInfoKM));
}
PDUMPCOMMENTWITHFLAGS(0, "%s (part 2)\r\n", pszName);
PDUMPMEMUM(psPerProc,
IMG_NULL,
psBuffer->pvLinAddr,
(PVRSRV_KERNEL_MEM_INFO*)psBuffer->hKernelMemInfo,
0,
psBuffer->ui32End,
0,
hUniqueTag);
}
}
}
static IMG_INT
SGXPDumpBufferArrayBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_PDUMP_BUFFER_ARRAY *psPDumpBufferArrayIN,
IMG_VOID *psBridgeOut,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_UINT32 i;
#if defined (SUPPORT_SID_INTERFACE)
SGX_KICKTA_DUMP_BUFFER *psUMPtr;
SGX_KICKTA_DUMP_BUFFER_KM *psKickTADumpBufferKM, *psKMPtr;
#else
SGX_KICKTA_DUMP_BUFFER *psKickTADumpBuffer;
#endif
IMG_UINT32 ui32BufferArrayLength =
psPDumpBufferArrayIN->ui32BufferArrayLength;
IMG_UINT32 ui32BufferArraySize =
ui32BufferArrayLength * sizeof(SGX_KICKTA_DUMP_BUFFER);
PVRSRV_ERROR eError = PVRSRV_ERROR_TOO_FEW_BUFFERS;
PVR_UNREFERENCED_PARAMETER(psBridgeOut);
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY);
#if defined (SUPPORT_SID_INTERFACE)
if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32BufferArraySize,
(IMG_PVOID *)&psKickTADumpBufferKM, 0,
"Array of Kick Tile Accelerator Dump Buffer") != PVRSRV_OK)
#else
if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32BufferArraySize,
(IMG_PVOID *)&psKickTADumpBuffer, 0,
"Array of Kick Tile Accelerator Dump Buffer") != PVRSRV_OK)
#endif
{
return -ENOMEM;
}
#if !defined (SUPPORT_SID_INTERFACE)
if(CopyFromUserWrapper(psPerProc,
ui32BridgeID,
psKickTADumpBuffer,
psPDumpBufferArrayIN->psBufferArray,
ui32BufferArraySize) != PVRSRV_OK)
{
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize, psKickTADumpBuffer, 0);
return -EFAULT;
}
#endif
for(i = 0; i < ui32BufferArrayLength; i++)
{
#if defined (SUPPORT_SID_INTERFACE)
IMG_VOID *pvMemInfo = IMG_NULL;
psUMPtr = &psPDumpBufferArrayIN->psBufferArray[i];
psKMPtr = &psKickTADumpBufferKM[i];
#else
IMG_VOID *pvMemInfo;
#endif
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&pvMemInfo,
#if defined (SUPPORT_SID_INTERFACE)
psUMPtr->hKernelMemInfo,
#else
psKickTADumpBuffer[i].hKernelMemInfo,
#endif
PVRSRV_HANDLE_TYPE_MEM_INFO);
if(eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY: "
"PVRSRVLookupHandle failed (%d)", eError));
break;
}
#if defined (SUPPORT_SID_INTERFACE)
psKMPtr->hKernelMemInfo = pvMemInfo;
#else
psKickTADumpBuffer[i].hKernelMemInfo = pvMemInfo;
#endif
#if defined(SUPPORT_SGX_NEW_STATUS_VALS)
eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
&pvMemInfo,
#if defined (SUPPORT_SID_INTERFACE)
psUMPtr->hCtrlKernelMemInfo,
#else
psKickTADumpBuffer[i].hCtrlKernelMemInfo,
#endif
PVRSRV_HANDLE_TYPE_MEM_INFO);
if(eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY: "
"PVRSRVLookupHandle failed (%d)", eError));
break;
}
#if defined (SUPPORT_SID_INTERFACE)
psKMPtr->hCtrlKernelMemInfo = pvMemInfo;
psKMPtr->sCtrlDevVAddr = psUMPtr->sCtrlDevVAddr;
#else
psKickTADumpBuffer[i].hCtrlKernelMemInfo = pvMemInfo;
#endif
#endif
#if defined (SUPPORT_SID_INTERFACE)
psKMPtr->ui32SpaceUsed = psUMPtr->ui32SpaceUsed;
psKMPtr->ui32Start = psUMPtr->ui32Start;
psKMPtr->ui32End = psUMPtr->ui32End;
psKMPtr->ui32BufferSize = psUMPtr->ui32BufferSize;
psKMPtr->ui32BackEndLength = psUMPtr->ui32BackEndLength;
psKMPtr->uiAllocIndex = psUMPtr->uiAllocIndex;
psKMPtr->pvLinAddr = psUMPtr->pvLinAddr;
psKMPtr->pszName = psUMPtr->pszName;
#endif
}
if(eError == PVRSRV_OK)
{
DumpBufferArray(psPerProc,
#if defined (SUPPORT_SID_INTERFACE)
psKickTADumpBufferKM,
#else
psKickTADumpBuffer,
#endif
ui32BufferArrayLength,
psPDumpBufferArrayIN->bDumpPolls);
}
#if defined (SUPPORT_SID_INTERFACE)
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize, psKickTADumpBufferKM, 0);
#else
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize, psKickTADumpBuffer, 0);
#endif
return 0;
}
static IMG_INT
SGXPDump3DSignatureRegistersBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_PDUMP_3D_SIGNATURE_REGISTERS *psPDump3DSignatureRegistersIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_UINT32 ui32RegisterArraySize = psPDump3DSignatureRegistersIN->ui32NumRegisters * sizeof(IMG_UINT32);
IMG_UINT32 *pui32Registers = IMG_NULL;
PVRSRV_SGXDEV_INFO *psDevInfo;
#if defined(SGX_FEATURE_MP) && defined(FIX_HW_BRN_27270)
IMG_UINT32 ui32RegVal = 0;
#endif
PVRSRV_DEVICE_NODE *psDeviceNode;
IMG_HANDLE hDevMemContextInt = 0;
IMG_UINT32 ui32MMUContextID;
IMG_INT ret = -EFAULT;
PVR_UNREFERENCED_PARAMETER(psRetOUT);
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS);
if (ui32RegisterArraySize == 0)
{
goto ExitNoError;
}
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
(IMG_VOID**)&psDeviceNode,
psPDump3DSignatureRegistersIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "PDumpTASignatureRegistersBW: hDevCookie lookup failed"));
goto Exit;
}
psDevInfo = (PVRSRV_SGXDEV_INFO*)psDeviceNode->pvDevice;
#if defined(SGX_FEATURE_MP) && defined(FIX_HW_BRN_27270)
ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_CORE);
OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_CORE, (SGX_FEATURE_MP_CORE_COUNT - 1) << EUR_CR_MASTER_CORE_ENABLE_SHIFT);
#if defined(PDUMP)
PDUMPREGWITHFLAGS(SGX_PDUMPREG_NAME, EUR_CR_MASTER_CORE, (SGX_FEATURE_MP_CORE_COUNT - 1) << EUR_CR_MASTER_CORE_ENABLE_SHIFT,
psPDump3DSignatureRegistersIN->bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0);
#endif
#endif
if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32RegisterArraySize,
(IMG_PVOID *)&pui32Registers, 0,
"Array of Registers") != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "PDump3DSignatureRegistersBW: OSAllocMem failed"));
goto Exit;
}
if(CopyFromUserWrapper(psPerProc,
ui32BridgeID,
pui32Registers,
psPDump3DSignatureRegistersIN->pui32Registers,
ui32RegisterArraySize) != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "PDump3DSignatureRegistersBW: CopyFromUserWrapper failed"));
goto Exit;
}
PDump3DSignatureRegisters(&psDeviceNode->sDevId,
psPDump3DSignatureRegistersIN->ui32DumpFrameNum,
psPDump3DSignatureRegistersIN->bLastFrame,
pui32Registers,
psPDump3DSignatureRegistersIN->ui32NumRegisters);
psRetOUT->eError =
PVRSRVLookupHandle( psPerProc->psHandleBase,
&hDevMemContextInt,
psPDump3DSignatureRegistersIN->hDevMemContext,
PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
PVR_ASSERT(psDeviceNode->pfnMMUGetContextID != IMG_NULL)
ui32MMUContextID = psDeviceNode->pfnMMUGetContextID((IMG_HANDLE)psDeviceNode->sDevMemoryInfo.pBMKernelContext);
PDumpSignatureBuffer(&psDeviceNode->sDevId,
"out.tasig", "TA", 0,
psDevInfo->psKernelTASigBufferMemInfo->sDevVAddr,
(IMG_UINT32)psDevInfo->psKernelTASigBufferMemInfo->uAllocSize,
ui32MMUContextID,
0 );
PDumpSignatureBuffer(&psDeviceNode->sDevId,
"out.3dsig", "3D", 0,
psDevInfo->psKernel3DSigBufferMemInfo->sDevVAddr,
(IMG_UINT32)psDevInfo->psKernel3DSigBufferMemInfo->uAllocSize,
ui32MMUContextID,
0 );
ExitNoError:
psRetOUT->eError = PVRSRV_OK;
ret = 0;
Exit:
if (pui32Registers != IMG_NULL)
{
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize, pui32Registers, 0);
}
#if defined(SGX_FEATURE_MP) && defined(FIX_HW_BRN_27270)
if (psDevInfo != IMG_NULL)
{
OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_CORE, ui32RegVal);
#if defined(PDUMP)
PDUMPREGWITHFLAGS(SGX_PDUMPREG_NAME, EUR_CR_MASTER_CORE, ui32RegVal,
psPDump3DSignatureRegistersIN->bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0);
#endif
}
#endif
return ret;
}
static IMG_INT
SGXPDumpCounterRegistersBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_PDUMP_COUNTER_REGISTERS *psPDumpCounterRegistersIN,
IMG_VOID *psBridgeOut,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_UINT32 ui32RegisterArraySize = psPDumpCounterRegistersIN->ui32NumRegisters * sizeof(IMG_UINT32);
IMG_UINT32 *pui32Registers = IMG_NULL;
PVRSRV_DEVICE_NODE *psDeviceNode ;
IMG_INT ret = -EFAULT;
PVR_UNREFERENCED_PARAMETER(psBridgeOut);
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS);
if (ui32RegisterArraySize == 0)
{
goto ExitNoError;
}
if(PVRSRVLookupHandle(psPerProc->psHandleBase,
(IMG_VOID**)&psDeviceNode,
psPDumpCounterRegistersIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE) != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "SGXPDumpCounterRegistersBW: hDevCookie lookup failed"));
ret = -ENOMEM;
goto Exit;
}
if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32RegisterArraySize,
(IMG_PVOID *)&pui32Registers, 0,
"Array of Registers") != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "PDumpCounterRegistersBW: OSAllocMem failed"));
ret = -ENOMEM;
goto Exit;
}
if(CopyFromUserWrapper(psPerProc,
ui32BridgeID,
pui32Registers,
psPDumpCounterRegistersIN->pui32Registers,
ui32RegisterArraySize) != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "PDumpCounterRegistersBW: CopyFromUserWrapper failed"));
goto Exit;
}
PDumpCounterRegisters(&psDeviceNode->sDevId,
psPDumpCounterRegistersIN->ui32DumpFrameNum,
psPDumpCounterRegistersIN->bLastFrame,
pui32Registers,
psPDumpCounterRegistersIN->ui32NumRegisters);
ExitNoError:
ret = 0;
Exit:
if (pui32Registers != IMG_NULL)
{
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize, pui32Registers, 0);
}
return ret;
}
static IMG_INT
SGXPDumpTASignatureRegistersBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_PDUMP_TA_SIGNATURE_REGISTERS *psPDumpTASignatureRegistersIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
IMG_UINT32 ui32RegisterArraySize = psPDumpTASignatureRegistersIN->ui32NumRegisters * sizeof(IMG_UINT32);
IMG_UINT32 *pui32Registers = IMG_NULL;
#if defined(SGX_FEATURE_MP) && defined(FIX_HW_BRN_27270)
PVRSRV_SGXDEV_INFO *psDevInfo = IMG_NULL;
IMG_UINT32 ui32RegVal = 0;
#endif
PVRSRV_DEVICE_NODE *psDeviceNode;
IMG_INT ret = -EFAULT;
PVR_UNREFERENCED_PARAMETER(psRetOUT);
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS);
if (ui32RegisterArraySize == 0)
{
goto ExitNoError;
}
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase, (IMG_VOID**)&psDeviceNode,
psPDumpTASignatureRegistersIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "PDumpTASignatureRegistersBW: hDevCookie lookup failed"));
goto Exit;
}
#if defined(SGX_FEATURE_MP) && defined(FIX_HW_BRN_27270)
psDevInfo = (PVRSRV_SGXDEV_INFO*)psDeviceNode->pvDevice;
ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_CORE);
OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_CORE, (SGX_FEATURE_MP_CORE_COUNT - 1) << EUR_CR_MASTER_CORE_ENABLE_SHIFT);
#if defined(PDUMP)
PDUMPREGWITHFLAGS(SGX_PDUMPREG_NAME, EUR_CR_MASTER_CORE, (SGX_FEATURE_MP_CORE_COUNT - 1) << EUR_CR_MASTER_CORE_ENABLE_SHIFT,
psPDumpTASignatureRegistersIN->bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0);
#endif
#endif
if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
ui32RegisterArraySize,
(IMG_PVOID *)&pui32Registers, 0,
"Array of Registers") != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "PDumpTASignatureRegistersBW: OSAllocMem failed"));
ret = -ENOMEM;
goto Exit;
}
if(CopyFromUserWrapper(psPerProc,
ui32BridgeID,
pui32Registers,
psPDumpTASignatureRegistersIN->pui32Registers,
ui32RegisterArraySize) != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_ERROR, "PDumpTASignatureRegistersBW: CopyFromUserWrapper failed"));
goto Exit;
}
PDumpTASignatureRegisters(&psDeviceNode->sDevId,
psPDumpTASignatureRegistersIN->ui32DumpFrameNum,
psPDumpTASignatureRegistersIN->ui32TAKickCount,
psPDumpTASignatureRegistersIN->bLastFrame,
pui32Registers,
psPDumpTASignatureRegistersIN->ui32NumRegisters);
ExitNoError:
psRetOUT->eError = PVRSRV_OK;
ret = 0;
Exit:
if (pui32Registers != IMG_NULL)
{
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32RegisterArraySize, pui32Registers, 0);
}
#if defined(SGX_FEATURE_MP) && defined(FIX_HW_BRN_27270)
if (psDevInfo != IMG_NULL)
{
OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_CORE, ui32RegVal);
#if defined(PDUMP)
PDUMPREGWITHFLAGS(SGX_PDUMPREG_NAME, EUR_CR_MASTER_CORE, ui32RegVal,
psPDumpTASignatureRegistersIN->bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0);
#endif
}
#endif
return ret;
}
static IMG_INT
SGXPDumpHWPerfCBBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_PDUMP_HWPERFCB *psPDumpHWPerfCBIN,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
#if defined(SUPPORT_SGX_HWPERF)
#if defined(__linux__)
PVRSRV_SGXDEV_INFO *psDevInfo;
PVRSRV_DEVICE_NODE *psDeviceNode;
IMG_HANDLE hDevMemContextInt = 0;
IMG_UINT32 ui32MMUContextID = 0;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase, (IMG_VOID**)&psDeviceNode,
psPDumpHWPerfCBIN->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psDevInfo = psDeviceNode->pvDevice;
psRetOUT->eError =
PVRSRVLookupHandle( psPerProc->psHandleBase,
&hDevMemContextInt,
psPDumpHWPerfCBIN->hDevMemContext,
PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
PVR_ASSERT(psDeviceNode->pfnMMUGetContextID != IMG_NULL)
ui32MMUContextID = psDeviceNode->pfnMMUGetContextID(hDevMemContextInt);
PDumpHWPerfCBKM(&psDeviceNode->sDevId,
&psPDumpHWPerfCBIN->szFileName[0],
psPDumpHWPerfCBIN->ui32FileOffset,
psDevInfo->psKernelHWPerfCBMemInfo->sDevVAddr,
psDevInfo->psKernelHWPerfCBMemInfo->uAllocSize,
ui32MMUContextID,
psPDumpHWPerfCBIN->ui32PDumpFlags);
return 0;
#else
PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
PVR_UNREFERENCED_PARAMETER(psPDumpHWPerfCBIN);
PVR_UNREFERENCED_PARAMETER(psRetOUT);
PVR_UNREFERENCED_PARAMETER(psPerProc);
return 0;
#endif
#else
PVR_UNREFERENCED_PARAMETER(ui32BridgeID);
PVR_UNREFERENCED_PARAMETER(psPDumpHWPerfCBIN);
PVR_UNREFERENCED_PARAMETER(psRetOUT);
PVR_UNREFERENCED_PARAMETER(psPerProc);
return -EFAULT;
#endif
}
static IMG_INT
SGXPDumpSaveMemBW(IMG_UINT32 ui32BridgeID,
PVRSRV_BRIDGE_IN_PDUMP_SAVEMEM *psPDumpSaveMem,
PVRSRV_BRIDGE_RETURN *psRetOUT,
PVRSRV_PER_PROCESS_DATA *psPerProc)
{
PVRSRV_DEVICE_NODE *psDeviceNode;
IMG_HANDLE hDevMemContextInt = 0;
IMG_UINT32 ui32MMUContextID;
PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_PDUMP_SAVEMEM);
psRetOUT->eError =
PVRSRVLookupHandle(psPerProc->psHandleBase,
(IMG_VOID**)&psDeviceNode,
psPDumpSaveMem->hDevCookie,
PVRSRV_HANDLE_TYPE_DEV_NODE);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
psRetOUT->eError =
PVRSRVLookupHandle( psPerProc->psHandleBase,
&hDevMemContextInt,
psPDumpSaveMem->hDevMemContext,
PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT);
if(psRetOUT->eError != PVRSRV_OK)
{
return 0;
}
PVR_ASSERT(psDeviceNode->pfnMMUGetContextID != IMG_NULL)
ui32MMUContextID = psDeviceNode->pfnMMUGetContextID(hDevMemContextInt);
PDumpSaveMemKM(&psDeviceNode->sDevId,
&psPDumpSaveMem->szFileName[0],
psPDumpSaveMem->ui32FileOffset,
psPDumpSaveMem->sDevVAddr,
psPDumpSaveMem->ui32Size,
ui32MMUContextID,
psPDumpSaveMem->ui32PDumpFlags);
return 0;
}
#endif
IMG_VOID SetSGXDispatchTableEntry(IMG_VOID)
{
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETCLIENTINFO, SGXGetClientInfoBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_RELEASECLIENTINFO, SGXReleaseClientInfoBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO, SGXGetInternalDevInfoBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_DOKICK, SGXDoKickBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETPHYSPAGEADDR, DummyBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READREGISTRYDWORD, DummyBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_2DQUERYBLTSCOMPLETE, SGX2DQueryBlitsCompleteBW);
#if defined(TRANSFER_QUEUE)
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SUBMITTRANSFER, SGXSubmitTransferBW);
#endif
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_GETMISCINFO, SGXGetMiscInfoBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT , SGXGetInfoForSrvinitBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_DEVINITPART2, SGXDevInitPart2BW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_FINDSHAREDPBDESC, SGXFindSharedPBDescBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREFSHAREDPBDESC, SGXUnrefSharedPBDescBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_ADDSHAREDPBDESC, SGXAddSharedPBDescBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_RENDER_CONTEXT, SGXRegisterHWRenderContextBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_FLUSH_HW_RENDER_TARGET, SGXFlushHWRenderTargetBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_RENDER_CONTEXT, SGXUnregisterHWRenderContextBW);
#if defined(SGX_FEATURE_2D_HARDWARE)
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SUBMIT2D, SGXSubmit2DBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_2D_CONTEXT, SGXRegisterHW2DContextBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_2D_CONTEXT, SGXUnregisterHW2DContextBW);
#endif
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_REGISTER_HW_TRANSFER_CONTEXT, SGXRegisterHWTransferContextBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT, SGXUnregisterHWTransferContextBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SCHEDULE_PROCESS_QUEUES, SGXScheduleProcessQueuesBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_READ_HWPERF_CB, SGXReadHWPerfCBBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SET_RENDER_CONTEXT_PRIORITY, SGXSetRenderContextPriorityBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_SET_TRANSFER_CONTEXT_PRIORITY, SGXSetTransferContextPriorityBW);
#if defined(PDUMP)
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY, SGXPDumpBufferArrayBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_3D_SIGNATURE_REGISTERS, SGXPDump3DSignatureRegistersBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_COUNTER_REGISTERS, SGXPDumpCounterRegistersBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_TA_SIGNATURE_REGISTERS, SGXPDumpTASignatureRegistersBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_HWPERFCB, SGXPDumpHWPerfCBBW);
SetDispatchTableEntry(PVRSRV_BRIDGE_SGX_PDUMP_SAVEMEM, SGXPDumpSaveMemBW);
#endif
}
#endif