aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/emgd/pvr/services4/srvkm/common/deviceclass.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/emgd/pvr/services4/srvkm/common/deviceclass.c')
-rw-r--r--drivers/gpu/drm/emgd/pvr/services4/srvkm/common/deviceclass.c2003
1 files changed, 0 insertions, 2003 deletions
diff --git a/drivers/gpu/drm/emgd/pvr/services4/srvkm/common/deviceclass.c b/drivers/gpu/drm/emgd/pvr/services4/srvkm/common/deviceclass.c
deleted file mode 100644
index c964c0000ab9..000000000000
--- a/drivers/gpu/drm/emgd/pvr/services4/srvkm/common/deviceclass.c
+++ /dev/null
@@ -1,2003 +0,0 @@
-/**********************************************************************
- *
- * Copyright(c) 2008 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 "services_headers.h"
-#include "buffer_manager.h"
-#include "kernelbuffer.h"
-#include "pvr_bridge_km.h"
-
-#include "lists.h"
-DECLARE_LIST_ANY_VA(PVRSRV_DEVICE_NODE);
-DECLARE_LIST_FOR_EACH_VA(PVRSRV_DEVICE_NODE);
-DECLARE_LIST_INSERT(PVRSRV_DEVICE_NODE);
-DECLARE_LIST_REMOVE(PVRSRV_DEVICE_NODE);
-
-IMG_VOID* MatchDeviceKM_AnyVaCb(PVRSRV_DEVICE_NODE* psDeviceNode, va_list va);
-
-PVRSRV_ERROR AllocateDeviceID(SYS_DATA *psSysData, IMG_UINT32 *pui32DevID);
-PVRSRV_ERROR FreeDeviceID(SYS_DATA *psSysData, IMG_UINT32 ui32DevID);
-
-#if defined(SUPPORT_MISR_IN_THREAD)
-void OSVSyncMISR(IMG_HANDLE, IMG_BOOL);
-#endif
-
-#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS)
-IMG_VOID PVRSRVFreeCommandCompletePacketKM(IMG_HANDLE hCmdCookie,
- IMG_BOOL bScheduleMISR);
-#endif
-typedef struct PVRSRV_DC_SRV2DISP_KMJTABLE_TAG *PPVRSRV_DC_SRV2DISP_KMJTABLE;
-
-typedef struct PVRSRV_DC_BUFFER_TAG
-{
-
- PVRSRV_DEVICECLASS_BUFFER sDeviceClassBuffer;
-
- struct PVRSRV_DISPLAYCLASS_INFO_TAG *psDCInfo;
- struct PVRSRV_DC_SWAPCHAIN_TAG *psSwapChain;
-} PVRSRV_DC_BUFFER;
-
-typedef struct PVRSRV_DC_SWAPCHAIN_TAG
-{
- IMG_HANDLE hExtSwapChain;
- IMG_UINT32 ui32SwapChainID;
- IMG_UINT32 ui32Flags;
- IMG_UINT32 ui32RefCount;
- PVRSRV_QUEUE_INFO *psQueue;
- PVRSRV_DC_BUFFER asBuffer[PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS];
- IMG_UINT32 ui32BufferCount;
- PVRSRV_DC_BUFFER *psLastFlipBuffer;
- struct PVRSRV_DC_SWAPCHAIN_TAG *psNext;
- struct PVRSRV_DISPLAYCLASS_INFO_TAG *psDCInfo;
-} PVRSRV_DC_SWAPCHAIN;
-
-typedef struct PVRSRV_DC_SWAPCHAIN_REF_TAG
-{
- struct PVRSRV_DC_SWAPCHAIN_TAG *psSwapChain;
- IMG_HANDLE hResItem;
-} PVRSRV_DC_SWAPCHAIN_REF;
-
-
-typedef struct PVRSRV_DISPLAYCLASS_INFO_TAG
-{
- IMG_UINT32 ui32RefCount;
- IMG_UINT32 ui32DeviceID;
- IMG_HANDLE hExtDevice;
- PPVRSRV_DC_SRV2DISP_KMJTABLE psFuncTable;
- IMG_HANDLE hDevMemContext;
- PVRSRV_DC_BUFFER sSystemBuffer;
- struct PVRSRV_DC_SWAPCHAIN_TAG *psDCSwapChainShared;
-} PVRSRV_DISPLAYCLASS_INFO;
-
-
-typedef struct PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO_TAG
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PRESMAN_ITEM hResItem;
-} PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO;
-
-
-typedef struct PVRSRV_BC_SRV2BUFFER_KMJTABLE_TAG *PPVRSRV_BC_SRV2BUFFER_KMJTABLE;
-
-typedef struct PVRSRV_BC_BUFFER_TAG
-{
-
- PVRSRV_DEVICECLASS_BUFFER sDeviceClassBuffer;
-
- struct PVRSRV_BUFFERCLASS_INFO_TAG *psBCInfo;
-} PVRSRV_BC_BUFFER;
-
-
-typedef struct PVRSRV_BUFFERCLASS_INFO_TAG
-{
- IMG_UINT32 ui32RefCount;
- IMG_UINT32 ui32DeviceID;
- IMG_HANDLE hExtDevice;
- PPVRSRV_BC_SRV2BUFFER_KMJTABLE psFuncTable;
- IMG_HANDLE hDevMemContext;
-
- IMG_UINT32 ui32BufferCount;
- PVRSRV_BC_BUFFER *psBuffer;
-
-} PVRSRV_BUFFERCLASS_INFO;
-
-
-typedef struct PVRSRV_BUFFERCLASS_PERCONTEXT_INFO_TAG
-{
- PVRSRV_BUFFERCLASS_INFO *psBCInfo;
- IMG_HANDLE hResItem;
-} PVRSRV_BUFFERCLASS_PERCONTEXT_INFO;
-
-
-static PVRSRV_DISPLAYCLASS_INFO* DCDeviceHandleToDCInfo (IMG_HANDLE hDeviceKM)
-{
- PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *psDCPerContextInfo;
-
- psDCPerContextInfo = (PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *)hDeviceKM;
-
- return psDCPerContextInfo->psDCInfo;
-}
-
-
-static PVRSRV_BUFFERCLASS_INFO* BCDeviceHandleToBCInfo (IMG_HANDLE hDeviceKM)
-{
- PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *psBCPerContextInfo;
-
- psBCPerContextInfo = (PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *)hDeviceKM;
-
- return psBCPerContextInfo->psBCInfo;
-}
-
-IMG_VOID PVRSRVEnumerateDCKM_ForEachVaCb(PVRSRV_DEVICE_NODE *psDeviceNode, va_list va)
-{
- IMG_UINT *pui32DevCount;
- IMG_UINT32 **ppui32DevID;
- PVRSRV_DEVICE_CLASS peDeviceClass;
-
- pui32DevCount = va_arg(va, IMG_UINT*);
- ppui32DevID = va_arg(va, IMG_UINT32**);
- peDeviceClass = va_arg(va, PVRSRV_DEVICE_CLASS);
-
- if ((psDeviceNode->sDevId.eDeviceClass == peDeviceClass)
- && (psDeviceNode->sDevId.eDeviceType == PVRSRV_DEVICE_TYPE_EXT))
- {
- (*pui32DevCount)++;
- if(*ppui32DevID)
- {
- *(*ppui32DevID)++ = psDeviceNode->sDevId.ui32DeviceIndex;
- }
- }
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVEnumerateDCKM (PVRSRV_DEVICE_CLASS DeviceClass,
- IMG_UINT32 *pui32DevCount,
- IMG_UINT32 *pui32DevID )
-{
-
- IMG_UINT ui32DevCount = 0;
- SYS_DATA *psSysData;
- IMG_UINT32 pui32Temp[PVRSRV_MAX_DEVICES];
- int i;
-
- SysAcquireData(&psSysData);
-
-
- List_PVRSRV_DEVICE_NODE_ForEach_va(psSysData->psDeviceNodeList,
- PVRSRVEnumerateDCKM_ForEachVaCb,
- &ui32DevCount,
- &pui32DevID,
- DeviceClass);
-
- if(pui32DevCount)
- {
- *pui32DevCount = ui32DevCount;
- }
- else if(pui32DevID == IMG_NULL)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVEnumerateDCKM: Invalid parameters"));
- return (PVRSRV_ERROR_INVALID_PARAMS);
- }
-
-
-
- /* Note: The above macro returns the device IDs in the opposite order that
- * they were registered in, which messes up EMGD's DIH (dual independant
- * head) code. To fix that, we need to reverse the order of the device
- * IDs:
- */
- /* 1st) make a temporary copy of the array, in the correct order: */
- for (i=0; i<ui32DevCount; i++) {
- pui32Temp[i] = *(--pui32DevID);
- }
- /* 2nd) make a final version of the array, in the correct order: */
- for (i=0; i<ui32DevCount; i++) {
- pui32DevID[i] = pui32Temp[i];
- }
-
- return PVRSRV_OK;
-}
-
-
-PVRSRV_ERROR PVRSRVRegisterDCDeviceKM (PVRSRV_DC_SRV2DISP_KMJTABLE *psFuncTable,
- IMG_UINT32 *pui32DeviceID)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo = IMG_NULL;
- PVRSRV_DEVICE_NODE *psDeviceNode;
- SYS_DATA *psSysData;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SysAcquireData(&psSysData);
-
-
-
-
-
-
- if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(*psDCInfo),
- (IMG_VOID **)&psDCInfo, IMG_NULL,
- "Display Class Info") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDCDeviceKM: Failed psDCInfo alloc"));
- return PVRSRV_ERROR_OUT_OF_MEMORY;
- }
- OSMemSet (psDCInfo, 0, sizeof(*psDCInfo));
-
-
- if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE),
- (IMG_VOID **)&psDCInfo->psFuncTable, IMG_NULL,
- "Function table for SRVKM->DISPLAY") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDCDeviceKM: Failed psFuncTable alloc"));
- goto ErrorExit;
- }
- OSMemSet (psDCInfo->psFuncTable, 0, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE));
-
-
- *psDCInfo->psFuncTable = *psFuncTable;
-
-
- if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(PVRSRV_DEVICE_NODE),
- (IMG_VOID **)&psDeviceNode, IMG_NULL,
- "Device Node") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDCDeviceKM: Failed psDeviceNode alloc"));
- goto ErrorExit;
- }
- OSMemSet (psDeviceNode, 0, sizeof(PVRSRV_DEVICE_NODE));
-
- psDeviceNode->pvDevice = (IMG_VOID*)psDCInfo;
- psDeviceNode->ui32pvDeviceSize = sizeof(*psDCInfo);
- psDeviceNode->ui32RefCount = 1;
- psDeviceNode->sDevId.eDeviceType = PVRSRV_DEVICE_TYPE_EXT;
- psDeviceNode->sDevId.eDeviceClass = PVRSRV_DEVICE_CLASS_DISPLAY;
- psDeviceNode->psSysData = psSysData;
-
-
- if (AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex) != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed to allocate Device ID"));
- goto ErrorExit;
- }
- psDCInfo->ui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex;
- if (pui32DeviceID)
- {
- *pui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex;
- }
-
-
- SysRegisterExternalDevice(psDeviceNode);
-
-
- List_PVRSRV_DEVICE_NODE_Insert(&psSysData->psDeviceNodeList, psDeviceNode);
-
- return PVRSRV_OK;
-
-ErrorExit:
-
- if(psDCInfo->psFuncTable)
- {
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE), psDCInfo->psFuncTable, IMG_NULL);
- psDCInfo->psFuncTable = IMG_NULL;
- }
-
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DISPLAYCLASS_INFO), psDCInfo, IMG_NULL);
-
-
- return PVRSRV_ERROR_OUT_OF_MEMORY;
-}
-
-PVRSRV_ERROR PVRSRVRemoveDCDeviceKM(IMG_UINT32 ui32DevIndex)
-{
- SYS_DATA *psSysData;
- PVRSRV_DEVICE_NODE *psDeviceNode;
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
-
- SysAcquireData(&psSysData);
-
-
- psDeviceNode = (PVRSRV_DEVICE_NODE*)
- List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
- MatchDeviceKM_AnyVaCb,
- ui32DevIndex,
- IMG_FALSE,
- PVRSRV_DEVICE_CLASS_DISPLAY);
- if (!psDeviceNode)
- {
-
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveDCDeviceKM: requested device %d not present", ui32DevIndex));
- return PVRSRV_ERROR_GENERIC;
- }
-
-
- psDCInfo = (PVRSRV_DISPLAYCLASS_INFO*)psDeviceNode->pvDevice;
-
-
-
-
- if(psDCInfo->ui32RefCount == 0)
- {
-
-
- List_PVRSRV_DEVICE_NODE_Remove(psDeviceNode);
-
-
- SysRemoveExternalDevice(psDeviceNode);
-
-
-
-
- PVR_ASSERT(psDCInfo->ui32RefCount == 0);
- (IMG_VOID)FreeDeviceID(psSysData, ui32DevIndex);
- (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE), psDCInfo->psFuncTable, IMG_NULL);
- psDCInfo->psFuncTable = IMG_NULL;
- (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DISPLAYCLASS_INFO), psDCInfo, IMG_NULL);
-
- (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), psDeviceNode, IMG_NULL);
-
- }
- else
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveDCDeviceKM: failed as %d Services DC API connections are still open", psDCInfo->ui32RefCount));
- return PVRSRV_ERROR_GENERIC;
- }
-
- return PVRSRV_OK;
-}
-
-
-PVRSRV_ERROR PVRSRVRegisterBCDeviceKM (PVRSRV_BC_SRV2BUFFER_KMJTABLE *psFuncTable,
- IMG_UINT32 *pui32DeviceID)
-{
- PVRSRV_BUFFERCLASS_INFO *psBCInfo = IMG_NULL;
- PVRSRV_DEVICE_NODE *psDeviceNode;
- SYS_DATA *psSysData;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SysAcquireData(&psSysData);
-
-
-
-
-
- if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(*psBCInfo),
- (IMG_VOID **)&psBCInfo, IMG_NULL,
- "Buffer Class Info") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed psBCInfo alloc"));
- return PVRSRV_ERROR_OUT_OF_MEMORY;
- }
- OSMemSet (psBCInfo, 0, sizeof(*psBCInfo));
-
-
- if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE),
- (IMG_VOID **)&psBCInfo->psFuncTable, IMG_NULL,
- "Function table for SRVKM->BUFFER") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed psFuncTable alloc"));
- goto ErrorExit;
- }
- OSMemSet (psBCInfo->psFuncTable, 0, sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE));
-
-
- *psBCInfo->psFuncTable = *psFuncTable;
-
-
- if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(PVRSRV_DEVICE_NODE),
- (IMG_VOID **)&psDeviceNode, IMG_NULL,
- "Device Node") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed psDeviceNode alloc"));
- goto ErrorExit;
- }
- OSMemSet (psDeviceNode, 0, sizeof(PVRSRV_DEVICE_NODE));
-
- psDeviceNode->pvDevice = (IMG_VOID*)psBCInfo;
- psDeviceNode->ui32pvDeviceSize = sizeof(*psBCInfo);
- psDeviceNode->ui32RefCount = 1;
- psDeviceNode->sDevId.eDeviceType = PVRSRV_DEVICE_TYPE_EXT;
- psDeviceNode->sDevId.eDeviceClass = PVRSRV_DEVICE_CLASS_BUFFER;
- psDeviceNode->psSysData = psSysData;
-
-
- if (AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex) != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed to allocate Device ID"));
- goto ErrorExit;
- }
- psBCInfo->ui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex;
- if (pui32DeviceID)
- {
- *pui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex;
- }
-
-
- List_PVRSRV_DEVICE_NODE_Insert(&psSysData->psDeviceNodeList, psDeviceNode);
-
- return PVRSRV_OK;
-
-ErrorExit:
-
- if(psBCInfo->psFuncTable)
- {
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PPVRSRV_BC_SRV2BUFFER_KMJTABLE), psBCInfo->psFuncTable, IMG_NULL);
- psBCInfo->psFuncTable = IMG_NULL;
- }
-
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BUFFERCLASS_INFO), psBCInfo, IMG_NULL);
-
-
- return PVRSRV_ERROR_OUT_OF_MEMORY;
-}
-
-
-PVRSRV_ERROR PVRSRVRemoveBCDeviceKM(IMG_UINT32 ui32DevIndex)
-{
- SYS_DATA *psSysData;
- PVRSRV_DEVICE_NODE *psDevNode;
- PVRSRV_BUFFERCLASS_INFO *psBCInfo;
-
- SysAcquireData(&psSysData);
-
-
- psDevNode = (PVRSRV_DEVICE_NODE*)
- List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
- MatchDeviceKM_AnyVaCb,
- ui32DevIndex,
- IMG_FALSE,
- PVRSRV_DEVICE_CLASS_BUFFER);
-
- if (!psDevNode)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveBCDeviceKM: requested device %d not present", ui32DevIndex));
- return PVRSRV_ERROR_GENERIC;
- }
-
-
-
- psBCInfo = (PVRSRV_BUFFERCLASS_INFO*)psDevNode->pvDevice;
-
-
-
-
- if(psBCInfo->ui32RefCount == 0)
- {
-
-
- List_PVRSRV_DEVICE_NODE_Remove(psDevNode);
-
-
-
-
- (IMG_VOID)FreeDeviceID(psSysData, ui32DevIndex);
-
-
- (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE), psBCInfo->psFuncTable, IMG_NULL);
- psBCInfo->psFuncTable = IMG_NULL;
- (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BUFFERCLASS_INFO), psBCInfo, IMG_NULL);
-
- (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), psDevNode, IMG_NULL);
-
- }
- else
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveBCDeviceKM: failed as %d Services BC API connections are still open", psBCInfo->ui32RefCount));
- return PVRSRV_ERROR_GENERIC;
- }
-
- return PVRSRV_OK;
-}
-
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVCloseDCDeviceKM (IMG_HANDLE hDeviceKM,
- IMG_BOOL bResManCallback)
-{
- PVRSRV_ERROR eError;
- PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *psDCPerContextInfo;
-
- PVR_UNREFERENCED_PARAMETER(bResManCallback);
-
- psDCPerContextInfo = (PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *)hDeviceKM;
-
-
- eError = ResManFreeResByPtr(psDCPerContextInfo->hResItem);
-
- return eError;
-}
-
-
-static PVRSRV_ERROR CloseDCDeviceCallBack(IMG_PVOID pvParam,
- IMG_UINT32 ui32Param)
-{
- PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *psDCPerContextInfo;
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
-
- PVR_UNREFERENCED_PARAMETER(ui32Param);
-
- psDCPerContextInfo = (PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *)pvParam;
- psDCInfo = psDCPerContextInfo->psDCInfo;
-
- psDCInfo->ui32RefCount--;
- if(psDCInfo->ui32RefCount == 0)
- {
-
- psDCInfo->psFuncTable->pfnCloseDCDevice(psDCInfo->hExtDevice);
-
- if (--psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount == 0)
- {
- PVRSRVFreeSyncInfoKM(psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo);
- }
-
- psDCInfo->hDevMemContext = IMG_NULL;
- psDCInfo->hExtDevice = IMG_NULL;
- }
-
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO), psDCPerContextInfo, IMG_NULL);
-
-
- return PVRSRV_OK;
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVOpenDCDeviceKM (PVRSRV_PER_PROCESS_DATA *psPerProc,
- IMG_UINT32 ui32DeviceID,
- IMG_HANDLE hDevCookie,
- IMG_HANDLE *phDeviceKM)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *psDCPerContextInfo;
- PVRSRV_DEVICE_NODE *psDeviceNode;
- SYS_DATA *psSysData;
- PVRSRV_ERROR eError;
-
- if(!phDeviceKM || !hDevCookie)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenDCDeviceKM: Invalid params"));
- return PVRSRV_ERROR_GENERIC;
- }
-
- SysAcquireData(&psSysData);
-
-
- psDeviceNode = (PVRSRV_DEVICE_NODE*)
- List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
- MatchDeviceKM_AnyVaCb,
- ui32DeviceID,
- IMG_FALSE,
- PVRSRV_DEVICE_CLASS_DISPLAY);
- if (!psDeviceNode)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenDCDeviceKM: no devnode matching index %d", ui32DeviceID));
- return PVRSRV_ERROR_GENERIC;
- }
- psDCInfo = (PVRSRV_DISPLAYCLASS_INFO*)psDeviceNode->pvDevice;
-
-
-
-
- if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(*psDCPerContextInfo),
- (IMG_VOID **)&psDCPerContextInfo, IMG_NULL,
- "Display Class per Context Info") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenDCDeviceKM: Failed psDCPerContextInfo alloc"));
- return PVRSRV_ERROR_OUT_OF_MEMORY;
- }
- OSMemSet(psDCPerContextInfo, 0, sizeof(*psDCPerContextInfo));
-
- if(psDCInfo->ui32RefCount++ == 0)
- {
-
- psDeviceNode = (PVRSRV_DEVICE_NODE *)hDevCookie;
-
-
- psDCInfo->hDevMemContext = (IMG_HANDLE)psDeviceNode->sDevMemoryInfo.pBMKernelContext;
-
-
- eError = PVRSRVAllocSyncInfoKM(IMG_NULL,
- (IMG_HANDLE)psDeviceNode->sDevMemoryInfo.pBMKernelContext,
- &psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo);
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenDCDeviceKM: Failed sync info alloc"));
- psDCInfo->ui32RefCount--;
- return eError;
- }
-
-
- eError = psDCInfo->psFuncTable->pfnOpenDCDevice(ui32DeviceID,
- &psDCInfo->hExtDevice,
- (PVRSRV_SYNC_DATA*)psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo->psSyncDataMemInfoKM->pvLinAddrKM);
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenDCDeviceKM: Failed to open external DC device"));
- psDCInfo->ui32RefCount--;
- PVRSRVFreeSyncInfoKM(psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo);
- return eError;
- }
-
- psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount++;
- }
-
- psDCPerContextInfo->psDCInfo = psDCInfo;
- psDCPerContextInfo->hResItem = ResManRegisterRes(psPerProc->hResManContext,
- RESMAN_TYPE_DISPLAYCLASS_DEVICE,
- psDCPerContextInfo,
- 0,
- CloseDCDeviceCallBack);
-
-
- *phDeviceKM = (IMG_HANDLE)psDCPerContextInfo;
-
- return PVRSRV_OK;
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVEnumDCFormatsKM (IMG_HANDLE hDeviceKM,
- IMG_UINT32 *pui32Count,
- DISPLAY_FORMAT *psFormat)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
-
- /* Note: It is acceptable for psFormat to be NULL. In fact, this is the
- * desired way in which to find out the number of pixel formats, so that
- * memory can be allocated before a second call to this function, in order
- * to get the pixel formats.
- */
- /* if(!hDeviceKM || !pui32Count || !psFormat)*/
- if(!hDeviceKM || !pui32Count)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVEnumDCFormatsKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
-
-
- return psDCInfo->psFuncTable->pfnEnumDCFormats(psDCInfo->hExtDevice, pui32Count, psFormat);
-}
-
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVEnumDCDimsKM (IMG_HANDLE hDeviceKM,
- DISPLAY_FORMAT *psFormat,
- IMG_UINT32 *pui32Count,
- DISPLAY_DIMS *psDim)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
-
- if(!hDeviceKM || !pui32Count || !psFormat)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVEnumDCDimsKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
-
-
- return psDCInfo->psFuncTable->pfnEnumDCDims(psDCInfo->hExtDevice, psFormat, pui32Count, psDim);
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVGetDCSystemBufferKM (IMG_HANDLE hDeviceKM,
- IMG_HANDLE *phBuffer)
-{
- PVRSRV_ERROR eError;
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- IMG_HANDLE hExtBuffer;
-
- if(!hDeviceKM || !phBuffer)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetDCSystemBufferKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
-
-
- eError = psDCInfo->psFuncTable->pfnGetDCSystemBuffer(psDCInfo->hExtDevice, &hExtBuffer);
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetDCSystemBufferKM: Failed to get valid buffer handle from external driver"));
- return eError;
- }
-
-
- psDCInfo->sSystemBuffer.sDeviceClassBuffer.pfnGetBufferAddr = psDCInfo->psFuncTable->pfnGetBufferAddr;
- psDCInfo->sSystemBuffer.sDeviceClassBuffer.hDevMemContext = psDCInfo->hDevMemContext;
- psDCInfo->sSystemBuffer.sDeviceClassBuffer.hExtDevice = psDCInfo->hExtDevice;
- psDCInfo->sSystemBuffer.sDeviceClassBuffer.hExtBuffer = hExtBuffer;
-
- psDCInfo->sSystemBuffer.psDCInfo = psDCInfo;
-
-
- *phBuffer = (IMG_HANDLE)&(psDCInfo->sSystemBuffer);
-
- return PVRSRV_OK;
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVGetDCInfoKM (IMG_HANDLE hDeviceKM,
- DISPLAY_INFO *psDisplayInfo)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PVRSRV_ERROR eError;
-
- if(!hDeviceKM || !psDisplayInfo)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetDCInfoKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
-
-
- eError = psDCInfo->psFuncTable->pfnGetDCInfo(psDCInfo->hExtDevice, psDisplayInfo);
- if (eError != PVRSRV_OK)
- {
- return eError;
- }
-
- if (psDisplayInfo->ui32MaxSwapChainBuffers > PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS)
- {
- psDisplayInfo->ui32MaxSwapChainBuffers = PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS;
- }
-
- return PVRSRV_OK;
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVDestroyDCSwapChainKM(IMG_HANDLE hSwapChainRef)
-{
- PVRSRV_ERROR eError;
- PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef;
-
- if(!hSwapChainRef)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVDestroyDCSwapChainKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psSwapChainRef = hSwapChainRef;
-
- eError = ResManFreeResByPtr(psSwapChainRef->hResItem);
-
- return eError;
-}
-
-
-static PVRSRV_ERROR DestroyDCSwapChain(PVRSRV_DC_SWAPCHAIN *psSwapChain)
-{
- PVRSRV_ERROR eError;
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo = psSwapChain->psDCInfo;
- IMG_UINT32 i;
-
-
-
- if( psDCInfo->psDCSwapChainShared )
- {
- if( psDCInfo->psDCSwapChainShared == psSwapChain )
- {
- psDCInfo->psDCSwapChainShared = psSwapChain->psNext;
- }
- else
- {
- PVRSRV_DC_SWAPCHAIN *psCurrentSwapChain;
- psCurrentSwapChain = psDCInfo->psDCSwapChainShared;
- while( psCurrentSwapChain->psNext )
- {
- if( psCurrentSwapChain->psNext != psSwapChain )
- {
- psCurrentSwapChain = psCurrentSwapChain->psNext;
- continue;
- }
- psCurrentSwapChain->psNext = psSwapChain->psNext;
- break;
- }
- }
- }
-
-
- PVRSRVDestroyCommandQueueKM(psSwapChain->psQueue);
-
-
- eError = psDCInfo->psFuncTable->pfnDestroyDCSwapChain(psDCInfo->hExtDevice,
- psSwapChain->hExtSwapChain);
-
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"DestroyDCSwapChainCallBack: Failed to destroy DC swap chain"));
- return eError;
- }
-
-
- for(i=0; i<psSwapChain->ui32BufferCount; i++)
- {
- if(psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo)
- {
- if (--psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount == 0)
- {
- PVRSRVFreeSyncInfoKM(psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
- }
- }
- }
-
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SWAPCHAIN), psSwapChain, IMG_NULL);
-
-
- return eError;
-}
-
-
-static PVRSRV_ERROR DestroyDCSwapChainRefCallBack(IMG_PVOID pvParam, IMG_UINT32 ui32Param)
-{
- PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef = (PVRSRV_DC_SWAPCHAIN_REF *) pvParam;
- PVRSRV_ERROR eError = PVRSRV_OK;
-
- PVR_UNREFERENCED_PARAMETER(ui32Param);
-
- if(--psSwapChainRef->psSwapChain->ui32RefCount == 0)
- {
- eError = DestroyDCSwapChain(psSwapChainRef->psSwapChain);
- }
-
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SWAPCHAIN_REF), psSwapChainRef, IMG_NULL);
- return eError;
-}
-
-static PVRSRV_DC_SWAPCHAIN* PVRSRVFindSharedDCSwapChainKM(PVRSRV_DISPLAYCLASS_INFO *psDCInfo,
- IMG_UINT32 ui32SwapChainID)
-{
- PVRSRV_DC_SWAPCHAIN *psCurrentSwapChain;
-
- for(psCurrentSwapChain = psDCInfo->psDCSwapChainShared;
- psCurrentSwapChain;
- psCurrentSwapChain = psCurrentSwapChain->psNext)
- {
- if(psCurrentSwapChain->ui32SwapChainID == ui32SwapChainID)
- return psCurrentSwapChain;
- }
- return IMG_NULL;
-}
-
-static PVRSRV_ERROR PVRSRVCreateDCSwapChainRefKM(PVRSRV_PER_PROCESS_DATA *psPerProc,
- PVRSRV_DC_SWAPCHAIN *psSwapChain,
- PVRSRV_DC_SWAPCHAIN_REF **ppsSwapChainRef)
-{
- PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef = IMG_NULL;
-
-
- if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(PVRSRV_DC_SWAPCHAIN_REF),
- (IMG_VOID **)&psSwapChainRef, IMG_NULL,
- "Display Class Swapchain Reference") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainRefKM: Failed psSwapChainRef alloc"));
- return PVRSRV_ERROR_OUT_OF_MEMORY;
- }
- OSMemSet (psSwapChainRef, 0, sizeof(PVRSRV_DC_SWAPCHAIN_REF));
-
-
- psSwapChain->ui32RefCount++;
-
-
- psSwapChainRef->psSwapChain = psSwapChain;
- psSwapChainRef->hResItem = ResManRegisterRes(psPerProc->hResManContext,
- RESMAN_TYPE_DISPLAYCLASS_SWAPCHAIN_REF,
- psSwapChainRef,
- 0,
- &DestroyDCSwapChainRefCallBack);
- *ppsSwapChainRef = psSwapChainRef;
-
- return PVRSRV_OK;
-}
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVCreateDCSwapChainKM (PVRSRV_PER_PROCESS_DATA *psPerProc,
- IMG_HANDLE hDeviceKM,
- IMG_UINT32 ui32Flags,
- DISPLAY_SURF_ATTRIBUTES *psDstSurfAttrib,
- DISPLAY_SURF_ATTRIBUTES *psSrcSurfAttrib,
- IMG_UINT32 ui32BufferCount,
- IMG_UINT32 ui32OEMFlags,
- IMG_HANDLE *phSwapChainRef,
- IMG_UINT32 *pui32SwapChainID)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PVRSRV_DC_SWAPCHAIN *psSwapChain = IMG_NULL;
- PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef = IMG_NULL;
- PVRSRV_SYNC_DATA *apsSyncData[PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS];
- PVRSRV_QUEUE_INFO *psQueue = IMG_NULL;
- PVRSRV_ERROR eError;
- IMG_UINT32 i;
- DISPLAY_INFO sDisplayInfo;
-
-
- if(!hDeviceKM
- || !psDstSurfAttrib
- || !psSrcSurfAttrib
- || !phSwapChainRef
- || !pui32SwapChainID)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- if (ui32BufferCount > PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Too many buffers"));
- return PVRSRV_ERROR_TOOMANYBUFFERS;
- }
-
-#if 0 /* BOB: Removing limiation to allow 1 buffer allocations */
- if (ui32BufferCount < 2)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Too few buffers"));
- return PVRSRV_ERROR_TOO_FEW_BUFFERS;
- }
-#endif
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
-
- if( ui32Flags & PVRSRV_CREATE_SWAPCHAIN_QUERY )
- {
-
- psSwapChain = PVRSRVFindSharedDCSwapChainKM(psDCInfo, *pui32SwapChainID );
- if( psSwapChain )
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: found query"));
-
- eError = PVRSRVCreateDCSwapChainRefKM(psPerProc,
- psSwapChain,
- &psSwapChainRef);
- if( eError != PVRSRV_OK )
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Couldn't create swap chain reference"));
- return eError;
- }
-
- *phSwapChainRef = (IMG_HANDLE)psSwapChainRef;
- return PVRSRV_OK;
- }
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: No shared SwapChain found for query"));
- return PVRSRV_ERROR_FLIP_CHAIN_EXISTS;
- }
-
-
- if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(PVRSRV_DC_SWAPCHAIN),
- (IMG_VOID **)&psSwapChain, IMG_NULL,
- "Display Class Swapchain") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Failed psSwapChain alloc"));
- eError = PVRSRV_ERROR_OUT_OF_MEMORY;
- goto ErrorExit;
- }
- OSMemSet (psSwapChain, 0, sizeof(PVRSRV_DC_SWAPCHAIN));
-
-
- eError = PVRSRVCreateCommandQueueKM(1024, &psQueue);
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Failed to create CmdQueue"));
- goto ErrorExit;
- }
-
-
- psSwapChain->psQueue = psQueue;
-
-
- for(i=0; i<ui32BufferCount; i++)
- {
- eError = PVRSRVAllocSyncInfoKM(IMG_NULL,
- psDCInfo->hDevMemContext,
- &psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Failed to alloc syninfo for psSwapChain"));
- goto ErrorExit;
- }
-
- psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount++;
-
-
- psSwapChain->asBuffer[i].sDeviceClassBuffer.pfnGetBufferAddr = psDCInfo->psFuncTable->pfnGetBufferAddr;
- psSwapChain->asBuffer[i].sDeviceClassBuffer.hDevMemContext = psDCInfo->hDevMemContext;
- psSwapChain->asBuffer[i].sDeviceClassBuffer.hExtDevice = psDCInfo->hExtDevice;
-
-
- psSwapChain->asBuffer[i].psDCInfo = psDCInfo;
- psSwapChain->asBuffer[i].psSwapChain = psSwapChain;
-
-
- apsSyncData[i] = (PVRSRV_SYNC_DATA*)psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->psSyncDataMemInfoKM->pvLinAddrKM;
- }
-
- psSwapChain->ui32BufferCount = ui32BufferCount;
- psSwapChain->psDCInfo = psDCInfo;
-
- eError = psDCInfo->psFuncTable->pfnGetDCInfo(psDCInfo->hExtDevice, &sDisplayInfo);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Failed to get DC info"));
- return eError;
- }
-
-
- eError = psDCInfo->psFuncTable->pfnCreateDCSwapChain(psDCInfo->hExtDevice,
- ui32Flags,
- psDstSurfAttrib,
- psSrcSurfAttrib,
- ui32BufferCount,
- apsSyncData,
- ui32OEMFlags,
- &psSwapChain->hExtSwapChain,
- &psSwapChain->ui32SwapChainID);
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Failed to create 3rd party SwapChain"));
- goto ErrorExit;
- }
-
-
- eError = PVRSRVCreateDCSwapChainRefKM(psPerProc,
- psSwapChain,
- &psSwapChainRef);
- if( eError != PVRSRV_OK )
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Couldn't create swap chain reference"));
- goto ErrorExit;
- }
-
- psSwapChain->ui32RefCount = 1;
- psSwapChain->ui32Flags = ui32Flags;
-
-
- if( ui32Flags & PVRSRV_CREATE_SWAPCHAIN_SHARED )
- {
- if(! psDCInfo->psDCSwapChainShared )
- {
- psDCInfo->psDCSwapChainShared = psSwapChain;
- }
- else
- {
- PVRSRV_DC_SWAPCHAIN *psOldHead = psDCInfo->psDCSwapChainShared;
- psDCInfo->psDCSwapChainShared = psSwapChain;
- psSwapChain->psNext = psOldHead;
- }
- }
-
-
- *pui32SwapChainID = psSwapChain->ui32SwapChainID;
-
-
- *phSwapChainRef= (IMG_HANDLE)psSwapChainRef;
-
- return eError;
-
-ErrorExit:
-
- for(i=0; i<ui32BufferCount; i++)
- {
- if(psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo)
- {
- if (--psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount == 0)
- {
- PVRSRVFreeSyncInfoKM(psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
- }
- }
- }
-
- if(psQueue)
- {
- PVRSRVDestroyCommandQueueKM(psQueue);
- }
-
- if(psSwapChain)
- {
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SWAPCHAIN), psSwapChain, IMG_NULL);
-
- }
-
- return eError;
-}
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSetDCDstRectKM(IMG_HANDLE hDeviceKM,
- IMG_HANDLE hSwapChainRef,
- IMG_RECT *psRect)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PVRSRV_DC_SWAPCHAIN *psSwapChain;
-
- if(!hDeviceKM || !hSwapChainRef)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSetDCDstRectKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
- psSwapChain = ((PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef)->psSwapChain;
-
- return psDCInfo->psFuncTable->pfnSetDCDstRect(psDCInfo->hExtDevice,
- psSwapChain->hExtSwapChain,
- psRect);
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSetDCSrcRectKM(IMG_HANDLE hDeviceKM,
- IMG_HANDLE hSwapChainRef,
- IMG_RECT *psRect)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PVRSRV_DC_SWAPCHAIN *psSwapChain;
-
- if(!hDeviceKM || !hSwapChainRef)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSetDCSrcRectKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
- psSwapChain = ((PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef)->psSwapChain;
-
- return psDCInfo->psFuncTable->pfnSetDCSrcRect(psDCInfo->hExtDevice,
- psSwapChain->hExtSwapChain,
- psRect);
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSetDCDstColourKeyKM(IMG_HANDLE hDeviceKM,
- IMG_HANDLE hSwapChainRef,
- IMG_UINT32 ui32CKColour)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PVRSRV_DC_SWAPCHAIN *psSwapChain;
-
- if(!hDeviceKM || !hSwapChainRef)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSetDCDstColourKeyKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
- psSwapChain = ((PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef)->psSwapChain;
-
- return psDCInfo->psFuncTable->pfnSetDCDstColourKey(psDCInfo->hExtDevice,
- psSwapChain->hExtSwapChain,
- ui32CKColour);
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSetDCSrcColourKeyKM(IMG_HANDLE hDeviceKM,
- IMG_HANDLE hSwapChainRef,
- IMG_UINT32 ui32CKColour)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PVRSRV_DC_SWAPCHAIN *psSwapChain;
-
- if(!hDeviceKM || !hSwapChainRef)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSetDCSrcColourKeyKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
- psSwapChain = ((PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef)->psSwapChain;
-
- return psDCInfo->psFuncTable->pfnSetDCSrcColourKey(psDCInfo->hExtDevice,
- psSwapChain->hExtSwapChain,
- ui32CKColour);
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVGetDCBuffersKM(IMG_HANDLE hDeviceKM,
- IMG_HANDLE hSwapChainRef,
- IMG_UINT32 *pui32BufferCount,
- IMG_HANDLE *phBuffer)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PVRSRV_DC_SWAPCHAIN *psSwapChain;
- IMG_HANDLE ahExtBuffer[PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS];
- PVRSRV_ERROR eError;
- IMG_UINT32 i;
-
- if(!hDeviceKM || !hSwapChainRef || !phBuffer)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetDCBuffersKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
- psSwapChain = ((PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef)->psSwapChain;
-
-
- eError = psDCInfo->psFuncTable->pfnGetDCBuffers(psDCInfo->hExtDevice,
- psSwapChain->hExtSwapChain,
- pui32BufferCount,
- ahExtBuffer);
-
- PVR_ASSERT(*pui32BufferCount <= PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS);
-
-
-
-
- for(i=0; i<*pui32BufferCount; i++)
- {
- psSwapChain->asBuffer[i].sDeviceClassBuffer.hExtBuffer = ahExtBuffer[i];
- phBuffer[i] = (IMG_HANDLE)&psSwapChain->asBuffer[i];
- }
-
- return eError;
-}
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSwapToDCBufferKM(IMG_HANDLE hDeviceKM,
- IMG_HANDLE hBuffer,
- IMG_UINT32 ui32SwapInterval,
- IMG_HANDLE hPrivateTag,
- IMG_UINT32 ui32ClipRectCount,
- IMG_RECT *psClipRect)
-{
- PVRSRV_ERROR eError;
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PVRSRV_DC_BUFFER *psBuffer;
- PVRSRV_QUEUE_INFO *psQueue;
- DISPLAYCLASS_FLIP_COMMAND *psFlipCmd;
- IMG_UINT32 i;
- IMG_BOOL bAddReferenceToLast = IMG_TRUE;
- IMG_UINT16 ui16SwapCommandID = DC_FLIP_COMMAND;
- IMG_UINT32 ui32NumSrcSyncs = 1;
- PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[2];
- PVRSRV_COMMAND *psCommand;
-
- if(!hDeviceKM || !hBuffer || !psClipRect)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBufferKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
-#if defined(SUPPORT_LMA)
- eError = PVRSRVPowerLock(KERNEL_ID, IMG_FALSE);
- if(eError != PVRSRV_OK)
- {
- return eError;
- }
-#endif
-
- psBuffer = (PVRSRV_DC_BUFFER*)hBuffer;
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
-
-#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS)
-
- if(psDCInfo->psFuncTable->pfnQuerySwapCommandID != IMG_NULL)
- {
- psDCInfo->psFuncTable->pfnQuerySwapCommandID(psDCInfo->hExtDevice,
- psBuffer->psSwapChain->hExtSwapChain,
- psBuffer->sDeviceClassBuffer.hExtBuffer,
- hPrivateTag,
- &ui16SwapCommandID,
- &bAddReferenceToLast);
-
- }
-
-#endif
-
- psQueue = psBuffer->psSwapChain->psQueue;
-
-
- apsSrcSync[0] = psBuffer->sDeviceClassBuffer.psKernelSyncInfo;
-
-
-
- if(bAddReferenceToLast && psBuffer->psSwapChain->psLastFlipBuffer &&
- psBuffer != psBuffer->psSwapChain->psLastFlipBuffer)
- {
- apsSrcSync[1] = psBuffer->psSwapChain->psLastFlipBuffer->sDeviceClassBuffer.psKernelSyncInfo;
-
-
-
- ui32NumSrcSyncs++;
- }
-
-
- eError = PVRSRVInsertCommandKM (psQueue,
- &psCommand,
- psDCInfo->ui32DeviceID,
- ui16SwapCommandID,
- 0,
- IMG_NULL,
- ui32NumSrcSyncs,
- apsSrcSync,
- sizeof(DISPLAYCLASS_FLIP_COMMAND) + (sizeof(IMG_RECT) * ui32ClipRectCount));
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBufferKM: Failed to get space in queue"));
- goto Exit;
- }
-
-
- psFlipCmd = (DISPLAYCLASS_FLIP_COMMAND*)psCommand->pvData;
-
-
- psFlipCmd->hExtDevice = psDCInfo->hExtDevice;
-
-
- psFlipCmd->hExtSwapChain = psBuffer->psSwapChain->hExtSwapChain;
-
-
- psFlipCmd->hExtBuffer = psBuffer->sDeviceClassBuffer.hExtBuffer;
-
-
- psFlipCmd->hPrivateTag = hPrivateTag;
-
-
- psFlipCmd->ui32ClipRectCount = ui32ClipRectCount;
-
- psFlipCmd->psClipRect = (IMG_RECT*)((IMG_UINT8*)psFlipCmd + sizeof(DISPLAYCLASS_FLIP_COMMAND));
-
- for(i=0; i<ui32ClipRectCount; i++)
- {
- psFlipCmd->psClipRect[i] = psClipRect[i];
- }
-
-
- psFlipCmd->ui32SwapInterval = ui32SwapInterval;
-
-
- eError = PVRSRVSubmitCommandKM (psQueue, psCommand);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBufferKM: Failed to submit command"));
- goto Exit;
- }
-
-
-
-
-
-
-
-
-
-
- LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US)
- {
- if(PVRSRVProcessQueues(KERNEL_ID, IMG_FALSE) != PVRSRV_ERROR_PROCESSING_BLOCKED)
- {
- goto ProcessedQueues;
- }
- OSWaitus(MAX_HW_TIME_US/WAIT_TRY_COUNT);
- } END_LOOP_UNTIL_TIMEOUT();
-
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBufferKM: Failed to process queues"));
-
- eError = PVRSRV_ERROR_GENERIC;
- goto Exit;
-
-ProcessedQueues:
-
- psBuffer->psSwapChain->psLastFlipBuffer = psBuffer;
-
-Exit:
-
- if(eError == PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE)
- {
- eError = PVRSRV_ERROR_RETRY;
- }
-
-#if defined(SUPPORT_LMA)
- PVRSRVPowerUnlock(KERNEL_ID);
-#endif
- return eError;
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSwapToDCSystemKM(IMG_HANDLE hDeviceKM,
- IMG_HANDLE hSwapChainRef)
-{
- PVRSRV_ERROR eError;
- PVRSRV_QUEUE_INFO *psQueue;
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- PVRSRV_DC_SWAPCHAIN *psSwapChain;
- PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef;
- DISPLAYCLASS_FLIP_COMMAND *psFlipCmd;
- IMG_UINT32 ui32NumSrcSyncs = 1;
- PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[2];
- PVRSRV_COMMAND *psCommand;
- IMG_BOOL bAddReferenceToLast = IMG_TRUE;
- IMG_UINT16 ui16SwapCommandID = DC_FLIP_COMMAND;
-
- if(!hDeviceKM || !hSwapChainRef)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCSystemKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
-#if defined(SUPPORT_LMA)
- eError = PVRSRVPowerLock(KERNEL_ID, IMG_FALSE);
- if(eError != PVRSRV_OK)
- {
- return eError;
- }
-#endif
-
- psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
- psSwapChainRef = (PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef;
- psSwapChain = psSwapChainRef->psSwapChain;
-
-
- psQueue = psSwapChain->psQueue;
-
-#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS)
-
- if(psDCInfo->psFuncTable->pfnQuerySwapCommandID != IMG_NULL)
- {
- psDCInfo->psFuncTable->pfnQuerySwapCommandID(psDCInfo->hExtDevice,
- psSwapChain->hExtSwapChain,
- psDCInfo->sSystemBuffer.sDeviceClassBuffer.hExtBuffer,
- 0,
- &ui16SwapCommandID,
- &bAddReferenceToLast);
-
- }
-
-#endif
-
-
- apsSrcSync[0] = psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo;
-
-
-
- if(bAddReferenceToLast && psSwapChain->psLastFlipBuffer)
- {
-
- if (apsSrcSync[0] != psSwapChain->psLastFlipBuffer->sDeviceClassBuffer.psKernelSyncInfo)
- {
- apsSrcSync[1] = psSwapChain->psLastFlipBuffer->sDeviceClassBuffer.psKernelSyncInfo;
-
-
-
- ui32NumSrcSyncs++;
- }
- }
-
-
- eError = PVRSRVInsertCommandKM (psQueue,
- &psCommand,
- psDCInfo->ui32DeviceID,
- ui16SwapCommandID,
- 0,
- IMG_NULL,
- ui32NumSrcSyncs,
- apsSrcSync,
- sizeof(DISPLAYCLASS_FLIP_COMMAND));
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCSystemKM: Failed to get space in queue"));
- goto Exit;
- }
-
-
- psFlipCmd = (DISPLAYCLASS_FLIP_COMMAND*)psCommand->pvData;
-
-
- psFlipCmd->hExtDevice = psDCInfo->hExtDevice;
-
-
- psFlipCmd->hExtSwapChain = psSwapChain->hExtSwapChain;
-
-
- psFlipCmd->hExtBuffer = psDCInfo->sSystemBuffer.sDeviceClassBuffer.hExtBuffer;
-
-
- psFlipCmd->hPrivateTag = IMG_NULL;
-
-
- psFlipCmd->ui32ClipRectCount = 0;
-
- psFlipCmd->ui32SwapInterval = 1;
-
-
- eError = PVRSRVSubmitCommandKM (psQueue, psCommand);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCSystemKM: Failed to submit command"));
- goto Exit;
- }
-
-
-
-
-
-
-
-
-
- LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US)
- {
- if(PVRSRVProcessQueues(KERNEL_ID, IMG_FALSE) != PVRSRV_ERROR_PROCESSING_BLOCKED)
- {
- goto ProcessedQueues;
- }
-
- OSWaitus(MAX_HW_TIME_US/WAIT_TRY_COUNT);
- } END_LOOP_UNTIL_TIMEOUT();
-
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCSystemKM: Failed to process queues"));
- eError = PVRSRV_ERROR_GENERIC;
- goto Exit;
-
-ProcessedQueues:
-
- psSwapChain->psLastFlipBuffer = &psDCInfo->sSystemBuffer;
-
- eError = PVRSRV_OK;
-
-Exit:
-
- if(eError == PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE)
- {
- eError = PVRSRV_ERROR_RETRY;
- }
-
-#if defined(SUPPORT_LMA)
- PVRSRVPowerUnlock(KERNEL_ID);
-#endif
- return eError;
-}
-
-
-PVRSRV_ERROR PVRSRVRegisterSystemISRHandler (PFN_ISR_HANDLER pfnISRHandler,
- IMG_VOID *pvISRHandlerData,
- IMG_UINT32 ui32ISRSourceMask,
- IMG_UINT32 ui32DeviceID)
-{
- SYS_DATA *psSysData;
- PVRSRV_DEVICE_NODE *psDevNode;
-
- PVR_UNREFERENCED_PARAMETER(ui32ISRSourceMask);
-
- SysAcquireData(&psSysData);
-
-
- psDevNode = (PVRSRV_DEVICE_NODE*)
- List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
- MatchDeviceKM_AnyVaCb,
- ui32DeviceID,
- IMG_TRUE);
-
- if (psDevNode == IMG_NULL)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterSystemISRHandler: Failed to get psDevNode"));
- PVR_DBG_BREAK;
- return PVRSRV_ERROR_GENERIC;
- }
-
-
- psDevNode->pvISRData = (IMG_VOID*) pvISRHandlerData;
-
-
- psDevNode->pfnDeviceISR = pfnISRHandler;
-
- return PVRSRV_OK;
-}
-
-IMG_VOID PVRSRVSetDCState_ForEachVaCb(PVRSRV_DEVICE_NODE *psDeviceNode, va_list va)
-{
- PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
- IMG_UINT32 ui32State;
- ui32State = va_arg(va, IMG_UINT32);
-
- if (psDeviceNode->sDevId.eDeviceClass == PVRSRV_DEVICE_CLASS_DISPLAY)
- {
- psDCInfo = (PVRSRV_DISPLAYCLASS_INFO *)psDeviceNode->pvDevice;
- if (psDCInfo->psFuncTable->pfnSetDCState && psDCInfo->hExtDevice)
- {
- psDCInfo->psFuncTable->pfnSetDCState(psDCInfo->hExtDevice, ui32State);
- }
- }
-}
-
-
-IMG_VOID IMG_CALLCONV PVRSRVSetDCState(IMG_UINT32 ui32State)
-{
- SYS_DATA *psSysData;
-
- SysAcquireData(&psSysData);
-
- List_PVRSRV_DEVICE_NODE_ForEach_va(psSysData->psDeviceNodeList,
- PVRSRVSetDCState_ForEachVaCb,
- ui32State);
-}
-
-
-IMG_EXPORT
-IMG_BOOL PVRGetDisplayClassJTable(PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable)
-{
- psJTable->ui32TableSize = sizeof(PVRSRV_DC_DISP2SRV_KMJTABLE);
- psJTable->pfnPVRSRVRegisterDCDevice = PVRSRVRegisterDCDeviceKM;
- psJTable->pfnPVRSRVRemoveDCDevice = PVRSRVRemoveDCDeviceKM;
- psJTable->pfnPVRSRVOEMFunction = SysOEMFunction;
- psJTable->pfnPVRSRVRegisterCmdProcList = PVRSRVRegisterCmdProcListKM;
- psJTable->pfnPVRSRVRemoveCmdProcList = PVRSRVRemoveCmdProcListKM;
-#if defined(SUPPORT_MISR_IN_THREAD)
- psJTable->pfnPVRSRVCmdComplete = OSVSyncMISR;
-#else
- psJTable->pfnPVRSRVCmdComplete = PVRSRVCommandCompleteKM;
-#endif
- psJTable->pfnPVRSRVRegisterSystemISRHandler = PVRSRVRegisterSystemISRHandler;
- psJTable->pfnPVRSRVRegisterPowerDevice = PVRSRVRegisterPowerDevice;
-#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS)
- psJTable->pfnPVRSRVFreeCmdCompletePacket = &PVRSRVFreeCommandCompletePacketKM;
-#endif
-
- return IMG_TRUE;
-}
-
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVCloseBCDeviceKM (IMG_HANDLE hDeviceKM,
- IMG_BOOL bResManCallback)
-{
- PVRSRV_ERROR eError;
- PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *psBCPerContextInfo;
-
- PVR_UNREFERENCED_PARAMETER(bResManCallback);
-
- psBCPerContextInfo = (PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *)hDeviceKM;
-
-
- eError = ResManFreeResByPtr(psBCPerContextInfo->hResItem);
-
- return eError;
-}
-
-
-static PVRSRV_ERROR CloseBCDeviceCallBack(IMG_PVOID pvParam,
- IMG_UINT32 ui32Param)
-{
- PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *psBCPerContextInfo;
- PVRSRV_BUFFERCLASS_INFO *psBCInfo;
-
- PVR_UNREFERENCED_PARAMETER(ui32Param);
-
- psBCPerContextInfo = (PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *)pvParam;
- psBCInfo = psBCPerContextInfo->psBCInfo;
-
- psBCInfo->ui32RefCount--;
- if(psBCInfo->ui32RefCount == 0)
- {
- IMG_UINT32 i;
-
-
- psBCInfo->psFuncTable->pfnCloseBCDevice(psBCInfo->hExtDevice);
-
-
- for(i=0; i<psBCInfo->ui32BufferCount; i++)
- {
- if(psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo)
- {
- if (--psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount == 0)
- {
- PVRSRVFreeSyncInfoKM(psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
- }
- }
- }
-
-
- if(psBCInfo->psBuffer)
- {
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BC_BUFFER), psBCInfo->psBuffer, IMG_NULL);
- psBCInfo->psBuffer = IMG_NULL;
- }
- }
-
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BUFFERCLASS_PERCONTEXT_INFO), psBCPerContextInfo, IMG_NULL);
-
-
- return PVRSRV_OK;
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVOpenBCDeviceKM (PVRSRV_PER_PROCESS_DATA *psPerProc,
- IMG_UINT32 ui32DeviceID,
- IMG_HANDLE hDevCookie,
- IMG_HANDLE *phDeviceKM)
-{
- PVRSRV_BUFFERCLASS_INFO *psBCInfo;
- PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *psBCPerContextInfo;
- PVRSRV_DEVICE_NODE *psDeviceNode;
- SYS_DATA *psSysData;
- IMG_UINT32 i;
- PVRSRV_ERROR eError;
-
- if(!phDeviceKM || !hDevCookie)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Invalid params"));
- return PVRSRV_ERROR_GENERIC;
- }
-
- SysAcquireData(&psSysData);
-
-
- psDeviceNode = (PVRSRV_DEVICE_NODE*)
- List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
- MatchDeviceKM_AnyVaCb,
- ui32DeviceID,
- IMG_FALSE,
- PVRSRV_DEVICE_CLASS_BUFFER);
- if (!psDeviceNode)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: No devnode matching index %d", ui32DeviceID));
- return PVRSRV_ERROR_GENERIC;
- }
- psBCInfo = (PVRSRV_BUFFERCLASS_INFO*)psDeviceNode->pvDevice;
-
-
-
-
- if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(*psBCPerContextInfo),
- (IMG_VOID **)&psBCPerContextInfo, IMG_NULL,
- "Buffer Class per Context Info") != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Failed psBCPerContextInfo alloc"));
- return PVRSRV_ERROR_OUT_OF_MEMORY;
- }
- OSMemSet(psBCPerContextInfo, 0, sizeof(*psBCPerContextInfo));
-
- if(psBCInfo->ui32RefCount++ == 0)
- {
- BUFFER_INFO sBufferInfo;
-
- psDeviceNode = (PVRSRV_DEVICE_NODE *)hDevCookie;
-
-
- psBCInfo->hDevMemContext = (IMG_HANDLE)psDeviceNode->sDevMemoryInfo.pBMKernelContext;
-
-
- eError = psBCInfo->psFuncTable->pfnOpenBCDevice(&psBCInfo->hExtDevice);
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Failed to open external BC device"));
- return eError;
- }
-
-
- eError = psBCInfo->psFuncTable->pfnGetBCInfo(psBCInfo->hExtDevice, &sBufferInfo);
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM : Failed to get BC Info"));
- return eError;
- }
-
-
- psBCInfo->ui32BufferCount = sBufferInfo.ui32BufferCount;
-
-
-
- eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- sizeof(PVRSRV_BC_BUFFER) * sBufferInfo.ui32BufferCount,
- (IMG_VOID **)&psBCInfo->psBuffer,
- IMG_NULL,
- "Array of Buffer Class Buffer");
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Failed to allocate BC buffers"));
- return eError;
- }
- OSMemSet (psBCInfo->psBuffer,
- 0,
- sizeof(PVRSRV_BC_BUFFER) * sBufferInfo.ui32BufferCount);
-
- for(i=0; i<psBCInfo->ui32BufferCount; i++)
- {
-
- eError = PVRSRVAllocSyncInfoKM(IMG_NULL,
- psBCInfo->hDevMemContext,
- &psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Failed sync info alloc"));
- goto ErrorExit;
- }
-
- psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount++;
-
-
-
-
- eError = psBCInfo->psFuncTable->pfnGetBCBuffer(psBCInfo->hExtDevice,
- i,
- psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->psSyncData,
- &psBCInfo->psBuffer[i].sDeviceClassBuffer.hExtBuffer);
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Failed to get BC buffers"));
- goto ErrorExit;
- }
-
-
- psBCInfo->psBuffer[i].sDeviceClassBuffer.pfnGetBufferAddr = psBCInfo->psFuncTable->pfnGetBufferAddr;
- psBCInfo->psBuffer[i].sDeviceClassBuffer.hDevMemContext = psBCInfo->hDevMemContext;
- psBCInfo->psBuffer[i].sDeviceClassBuffer.hExtDevice = psBCInfo->hExtDevice;
- }
- }
-
- psBCPerContextInfo->psBCInfo = psBCInfo;
- psBCPerContextInfo->hResItem = ResManRegisterRes(psPerProc->hResManContext,
- RESMAN_TYPE_BUFFERCLASS_DEVICE,
- psBCPerContextInfo,
- 0,
- CloseBCDeviceCallBack);
-
-
- *phDeviceKM = (IMG_HANDLE)psBCPerContextInfo;
-
- return PVRSRV_OK;
-
-ErrorExit:
-
-
- for(i=0; i<psBCInfo->ui32BufferCount; i++)
- {
- if(psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo)
- {
- if (--psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount == 0)
- {
- PVRSRVFreeSyncInfoKM(psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
- }
- }
- }
-
-
- if(psBCInfo->psBuffer)
- {
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BC_BUFFER), psBCInfo->psBuffer, IMG_NULL);
- psBCInfo->psBuffer = IMG_NULL;
- }
-
- return eError;
-}
-
-
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVGetBCInfoKM (IMG_HANDLE hDeviceKM,
- BUFFER_INFO *psBufferInfo)
-{
- PVRSRV_BUFFERCLASS_INFO *psBCInfo;
- PVRSRV_ERROR eError;
-
- if(!hDeviceKM || !psBufferInfo)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetBCInfoKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psBCInfo = BCDeviceHandleToBCInfo(hDeviceKM);
-
- eError = psBCInfo->psFuncTable->pfnGetBCInfo(psBCInfo->hExtDevice, psBufferInfo);
-
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetBCInfoKM : Failed to get BC Info"));
- return eError;
- }
-
- return PVRSRV_OK;
-}
-
-
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVGetBCBufferKM (IMG_HANDLE hDeviceKM,
- IMG_UINT32 ui32BufferIndex,
- IMG_HANDLE *phBuffer)
-{
- PVRSRV_BUFFERCLASS_INFO *psBCInfo;
-
- if(!hDeviceKM || !phBuffer)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetBCBufferKM: Invalid parameters"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- psBCInfo = BCDeviceHandleToBCInfo(hDeviceKM);
-
- if(ui32BufferIndex < psBCInfo->ui32BufferCount)
- {
- *phBuffer = (IMG_HANDLE)&psBCInfo->psBuffer[ui32BufferIndex];
- }
- else
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetBCBufferKM: Buffer index %d out of range (%d)", ui32BufferIndex,psBCInfo->ui32BufferCount));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- return PVRSRV_OK;
-}
-
-
-IMG_EXPORT
-IMG_BOOL PVRGetBufferClassJTable(PVRSRV_BC_BUFFER2SRV_KMJTABLE *psJTable)
-{
- psJTable->ui32TableSize = sizeof(PVRSRV_BC_BUFFER2SRV_KMJTABLE);
-
- psJTable->pfnPVRSRVRegisterBCDevice = PVRSRVRegisterBCDeviceKM;
- psJTable->pfnPVRSRVRemoveBCDevice = PVRSRVRemoveBCDeviceKM;
-
- return IMG_TRUE;
-}
-