gfx: pvr: add force cleanup param
authorImre Deak <imre.deak@intel.com>
Fri, 4 Nov 2011 12:28:06 +0000 (14:28 +0200)
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Tue, 3 Jul 2012 09:28:30 +0000 (12:28 +0300)
Signed-off-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Pauli Nieminen <pauli.nieminen@linux.intel.com>
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
14 files changed:
drivers/staging/mrst/pvr/include4/img_defs.h
drivers/staging/mrst/pvr/services4/include/sgx_bridge.h
drivers/staging/mrst/pvr/services4/srvkm/bridged/bridged_pvr_bridge.c
drivers/staging/mrst/pvr/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c
drivers/staging/mrst/pvr/services4/srvkm/common/buffer_manager.c
drivers/staging/mrst/pvr/services4/srvkm/common/deviceclass.c
drivers/staging/mrst/pvr/services4/srvkm/common/devicemem.c
drivers/staging/mrst/pvr/services4/srvkm/common/mem.c
drivers/staging/mrst/pvr/services4/srvkm/common/resman.c
drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/pb.c
drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxutils.c
drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxutils.h
drivers/staging/mrst/pvr/services4/srvkm/env/linux/event.c
drivers/staging/mrst/pvr/services4/srvkm/include/resman.h

index bcc2a84..0cd7481 100644 (file)
@@ -109,6 +109,10 @@ typedef char                               TCHAR, *PTCHAR, *PTSTR;
 #define IMG_FORMAT_PRINTF(x,y)
 #endif
 
+#define CLEANUP_WITH_POLL              IMG_FALSE
+#define FORCE_CLEANUP                  IMG_TRUE
+
+
 #if defined (_WIN64)
 #define IMG_UNDEF      (~0ULL)
 #else
index a572ade..d9c8db9 100644 (file)
@@ -392,14 +392,15 @@ typedef struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT_TAG
 
 typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT_TAG
 {
-       IMG_UINT32 ui32BridgeFlags; 
+       IMG_UINT32 ui32BridgeFlags;
+       IMG_BOOL   bForceCleanup;
        IMG_HANDLE hDevCookie;
        IMG_HANDLE hHWRenderContext;
 }PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT;
 
 typedef struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT_TAG
 {
-       IMG_UINT32 ui32BridgeFlags; 
+       IMG_UINT32 ui32BridgeFlags;
        IMG_HANDLE hDevCookie;
        IMG_DEV_VIRTADDR sHWTransferContextDevVAddr;
 }PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT;
@@ -412,7 +413,8 @@ typedef struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT_TAG
 
 typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT_TAG
 {
-       IMG_UINT32 ui32BridgeFlags; 
+       IMG_UINT32 ui32BridgeFlags;
+       IMG_BOOL   bForceCleanup;
        IMG_HANDLE hDevCookie;
        IMG_HANDLE hHWTransferContext;
 }PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT;
@@ -441,7 +443,8 @@ typedef struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_2D_CONTEXT_TAG
 
 typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_2D_CONTEXT_TAG
 {
-       IMG_UINT32 ui32BridgeFlags; 
+       IMG_UINT32 ui32BridgeFlags;
+       IMG_BOOL   bForceCleanup;
        IMG_HANDLE hDevCookie;
        IMG_HANDLE hHW2DContext;
 }PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_2D_CONTEXT;
index 292be6a..c2a8f39 100644 (file)
@@ -3076,7 +3076,8 @@ static PVRSRV_ERROR DoModifyCompleteSyncOps(MODIFY_SYNC_OP_INFO *psModSyncOpInfo
 
 
 static PVRSRV_ERROR ModifyCompleteSyncOpsCallBack(IMG_PVOID            pvParam,
-                                                                                                       IMG_UINT32      ui32Param)
+                                               IMG_UINT32      ui32Param,
+                                               IMG_BOOL bDummy)
 {
        MODIFY_SYNC_OP_INFO             *psModSyncOpInfo;
 
@@ -3212,7 +3213,7 @@ PVRSRVDestroySyncInfoModObjBW(IMG_UINT32
                return 0;
        }
 
-       psDestroySyncInfoModObjOUT->eError = ResManFreeResByPtr(psModSyncOpInfo->hResItem);
+       psDestroySyncInfoModObjOUT->eError = ResManFreeResByPtr(psModSyncOpInfo->hResItem, CLEANUP_WITH_POLL);
        if (psDestroySyncInfoModObjOUT->eError != PVRSRV_OK)
        {
                PVR_DPF((PVR_DBG_ERROR, "PVRSRVDestroySyncInfoModObjBW: ResManFreeResByPtr failed"));
@@ -3524,7 +3525,8 @@ PVRSRVSyncOpsFlushToDeltaBW(IMG_UINT32                                         u
 
 static PVRSRV_ERROR
 FreeSyncInfoCallback(IMG_PVOID pvParam,
-                                        IMG_UINT32     ui32Param)
+                        IMG_UINT32     ui32Param,
+                        IMG_BOOL bDummy)
 {
        PVRSRV_KERNEL_SYNC_INFO *psSyncInfo;
        PVRSRV_ERROR eError;
@@ -3646,7 +3648,7 @@ PVRSRVFreeSyncInfoBW(IMG_UINT32                                          ui32Bri
                return 0;
        }
 
-       eError = ResManFreeResByPtr(psSyncInfo->hResItem);
+       eError = ResManFreeResByPtr(psSyncInfo->hResItem, CLEANUP_WITH_POLL);
        if (eError != PVRSRV_OK)
        {
                PVR_DPF((PVR_DBG_ERROR, "PVRSRVFreeSyncInfoBW: ResManFreeResByPtr failed"));
index 9bcf43a..7c2e8ee 100644 (file)
@@ -1408,7 +1408,8 @@ SGXUnregisterHWRenderContextBW(IMG_UINT32 ui32BridgeID,
                return 0;
        }
 
-       psRetOUT->eError = SGXUnregisterHWRenderContextKM(hHWRenderContextInt);
+       psRetOUT->eError = SGXUnregisterHWRenderContextKM(hHWRenderContextInt,
+                                               psSGXUnregHWRenderContextIN->bForceCleanup);
        if(psRetOUT->eError != PVRSRV_OK)
        {
                return 0;
@@ -1489,7 +1490,8 @@ SGXUnregisterHWTransferContextBW(IMG_UINT32 ui32BridgeID,
                return 0;
        }
 
-       psRetOUT->eError = SGXUnregisterHWTransferContextKM(hHWTransferContextInt);
+       psRetOUT->eError = SGXUnregisterHWTransferContextKM(hHWTransferContextInt,
+                                                       psSGXUnregHWTransferContextIN->bForceCleanup);
        if(psRetOUT->eError != PVRSRV_OK)
        {
                return 0;
@@ -1605,7 +1607,8 @@ SGXFlushHWRenderTargetBW(IMG_UINT32 ui32BridgeID,
                return 0;
        }
 
-       SGXFlushHWRenderTargetKM(hDevCookieInt, psSGXFlushHWRenderTargetIN->sHWRTDataSetDevVAddr);
+       SGXFlushHWRenderTargetKM(hDevCookieInt, psSGXFlushHWRenderTargetIN->sHWRTDataSetDevVAddr,
+                               IMG_FALSE);
 
        return 0;
 }
index 0ea9c80..456e44e 100644 (file)
@@ -732,7 +732,7 @@ BM_DestroyContext(IMG_HANDLE        hBMContext,
        else
        {
                
-               eError = ResManFreeResByPtr(pBMContext->hResItem);
+               eError = ResManFreeResByPtr(pBMContext->hResItem, CLEANUP_WITH_POLL);
                if(eError != PVRSRV_OK)
                {
                        PVR_DPF ((PVR_DBG_ERROR, "BM_DestroyContext: ResManFreeResByPtr failed %d",eError));
@@ -784,7 +784,8 @@ static PVRSRV_ERROR BM_DestroyContextCallBack_AnyVaCb(BM_HEAP *psBMHeap, va_list
 
 
 static PVRSRV_ERROR BM_DestroyContextCallBack(IMG_PVOID                pvParam,
-                                                                                         IMG_UINT32    ui32Param)
+                                                 IMG_UINT32    ui32Param,
+                                                 IMG_BOOL      bDummy)
 {
        BM_CONTEXT *pBMContext = pvParam;
        PVRSRV_DEVICE_NODE *psDeviceNode;
@@ -1004,7 +1005,7 @@ BM_CreateContext(PVRSRV_DEVICE_NODE                       *psDeviceNode,
        return (IMG_HANDLE)pBMContext;
 
 cleanup:
-       (IMG_VOID)BM_DestroyContextCallBack(pBMContext, 0);
+       (IMG_VOID)BM_DestroyContextCallBack(pBMContext, 0, CLEANUP_WITH_POLL);
 
        return IMG_NULL;
 }
index e43e8f8..4e10e77 100644 (file)
@@ -541,14 +541,16 @@ PVRSRV_ERROR PVRSRVCloseDCDeviceKM (IMG_HANDLE    hDeviceKM,
        psDCPerContextInfo = (PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *)hDeviceKM;
 
        
-       eError = ResManFreeResByPtr(psDCPerContextInfo->hResItem);
+       eError = ResManFreeResByPtr(psDCPerContextInfo->hResItem, CLEANUP_WITH_POLL);
 
        return eError;
 }
 
 
 static PVRSRV_ERROR CloseDCDeviceCallBack(IMG_PVOID            pvParam,
-                                                                                 IMG_UINT32    ui32Param)
+                                       IMG_UINT32      ui32Param,
+                                       IMG_BOOL        bDummy)
+
 {
        PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *psDCPerContextInfo;
        PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
@@ -801,7 +803,7 @@ PVRSRV_ERROR PVRSRVDestroyDCSwapChainKM(IMG_HANDLE hSwapChainRef)
 
        psSwapChainRef = hSwapChainRef;
 
-       eError = ResManFreeResByPtr(psSwapChainRef->hResItem);
+       eError = ResManFreeResByPtr(psSwapChainRef->hResItem, CLEANUP_WITH_POLL);
 
        return eError;
 }
@@ -870,7 +872,8 @@ static PVRSRV_ERROR DestroyDCSwapChain(PVRSRV_DC_SWAPCHAIN *psSwapChain)
 }
 
 
-static PVRSRV_ERROR DestroyDCSwapChainRefCallBack(IMG_PVOID pvParam, IMG_UINT32 ui32Param)
+static PVRSRV_ERROR DestroyDCSwapChainRefCallBack(IMG_PVOID pvParam, IMG_UINT32 ui32Param,
+                                                 IMG_BOOL bDummy)
 {
        PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef = (PVRSRV_DC_SWAPCHAIN_REF *) pvParam;
        PVRSRV_ERROR eError = PVRSRV_OK;
@@ -1738,14 +1741,15 @@ PVRSRV_ERROR PVRSRVCloseBCDeviceKM (IMG_HANDLE  hDeviceKM,
        psBCPerContextInfo = (PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *)hDeviceKM;
 
        
-       eError = ResManFreeResByPtr(psBCPerContextInfo->hResItem);
+       eError = ResManFreeResByPtr(psBCPerContextInfo->hResItem, CLEANUP_WITH_POLL);
 
        return eError;
 }
 
 
 static PVRSRV_ERROR CloseBCDeviceCallBack(IMG_PVOID            pvParam,
-                                                                                 IMG_UINT32    ui32Param)
+                                         IMG_UINT32    ui32Param,
+                                         IMG_BOOL      bDummy)
 {
        PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *psBCPerContextInfo;
        PVRSRV_BUFFERCLASS_INFO *psBCInfo;
index f51d632..963f577 100644 (file)
@@ -626,7 +626,8 @@ static PVRSRV_ERROR FreeMemCallBackCommon(PVRSRV_KERNEL_MEM_INFO *psMemInfo,
 }
 
 static PVRSRV_ERROR FreeDeviceMemCallBack(IMG_PVOID            pvParam,
-                                                                                 IMG_UINT32    ui32Param)
+                                         IMG_UINT32    ui32Param,
+                                         IMG_BOOL      bDummy)
 {
        PVRSRV_KERNEL_MEM_INFO  *psMemInfo = (PVRSRV_KERNEL_MEM_INFO *)pvParam;
        return FreeMemCallBackCommon(psMemInfo, ui32Param, IMG_TRUE);
@@ -648,12 +649,12 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVFreeDeviceMemKM(IMG_HANDLE                                hDevCookie,
 
        if (psMemInfo->sMemBlk.hResItem != IMG_NULL)
        {
-               eError = ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem);
+               eError = ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem, CLEANUP_WITH_POLL);
        }
        else
        {
                
-               eError = FreeDeviceMemCallBack(psMemInfo, 0);
+               eError = FreeDeviceMemCallBack(psMemInfo, 0, CLEANUP_WITH_POLL);
        }
 
        return eError;
@@ -827,12 +828,13 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVUnwrapExtMemoryKM (PVRSRV_KERNEL_MEM_INFO *psMem
                return PVRSRV_ERROR_INVALID_PARAMS;
        }
 
-       return ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem);
+       return ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem, CLEANUP_WITH_POLL);
 }
 
 
 static PVRSRV_ERROR UnwrapExtMemoryCallBack(IMG_PVOID  pvParam,
-                                                                                       IMG_UINT32      ui32Param)
+                                       IMG_UINT32      ui32Param,
+                                       IMG_BOOL        gDummy)
 {
        PVRSRV_KERNEL_MEM_INFO  *psMemInfo = (PVRSRV_KERNEL_MEM_INFO *)pvParam;
 
@@ -1072,12 +1074,13 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVUnmapDeviceMemoryKM (PVRSRV_KERNEL_MEM_INFO *psM
                return PVRSRV_ERROR_INVALID_PARAMS;
        }
 
-       return ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem);
+       return ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem, CLEANUP_WITH_POLL);
 }
 
 
 static PVRSRV_ERROR UnmapDeviceMemoryCallBack(IMG_PVOID pvParam,
-                                                                                         IMG_UINT32 ui32Param)
+                                                 IMG_UINT32 ui32Param,
+                                                 IMG_BOOL bDummy)
 {
        PVRSRV_ERROR                            eError;
        RESMAN_MAP_DEVICE_MEM_DATA      *psMapData = pvParam;
@@ -1320,12 +1323,13 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVUnmapDeviceClassMemoryKM(PVRSRV_KERNEL_MEM_INFO
                return PVRSRV_ERROR_INVALID_PARAMS;
        }
 
-       return ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem);
+       return ResManFreeResByPtr(psMemInfo->sMemBlk.hResItem, CLEANUP_WITH_POLL);
 }
 
 
 static PVRSRV_ERROR UnmapDeviceClassMemoryCallBack(IMG_PVOID   pvParam,
-                                                                                                  IMG_UINT32   ui32Param)
+                                                  IMG_UINT32   ui32Param,
+                                                  IMG_BOOL gDummy)
 {
        PVRSRV_DC_MAPINFO *psDCMapInfo = pvParam;
        PVRSRV_KERNEL_MEM_INFO *psMemInfo;
index 005a12c..670a622 100644 (file)
@@ -30,7 +30,8 @@
 
 static PVRSRV_ERROR
 FreeSharedSysMemCallBack(IMG_PVOID     pvParam,
-                                                IMG_UINT32     ui32Param)
+                        IMG_UINT32     ui32Param,
+                        IMG_BOOL       bDummy)
 {
        PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo = pvParam;
 
@@ -111,11 +112,11 @@ PVRSRVFreeSharedSysMemoryKM(PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo)
 
        if(psKernelMemInfo->sMemBlk.hResItem)
        {
-               eError = ResManFreeResByPtr(psKernelMemInfo->sMemBlk.hResItem);
+               eError = ResManFreeResByPtr(psKernelMemInfo->sMemBlk.hResItem, CLEANUP_WITH_POLL);
        }
        else
        {
-               eError = FreeSharedSysMemCallBack(psKernelMemInfo, 0);
+               eError = FreeSharedSysMemCallBack(psKernelMemInfo, 0, CLEANUP_WITH_POLL);
        }
 
        return eError;
index c477ace..672249e 100644 (file)
@@ -118,7 +118,7 @@ static IMPLEMENT_LIST_INSERT(RESMAN_CONTEXT)
 
 #define PRINT_RESLIST(x, y, z)
 
-static PVRSRV_ERROR FreeResourceByPtr(RESMAN_ITEM *psItem, IMG_BOOL bExecuteCallback);
+static PVRSRV_ERROR FreeResourceByPtr(RESMAN_ITEM *psItem, IMG_BOOL bExecuteCallback, IMG_BOOL bForceCleanup);
 
 static PVRSRV_ERROR FreeResourceByCriteria(PRESMAN_CONTEXT     psContext,
                                                                                   IMG_UINT32           ui32SearchCriteria,
@@ -372,7 +372,7 @@ PRESMAN_ITEM ResManRegisterRes(PRESMAN_CONTEXT      psResManContext,
        return(psNewResItem);
 }
 
-PVRSRV_ERROR ResManFreeResByPtr(RESMAN_ITEM    *psResItem)
+PVRSRV_ERROR ResManFreeResByPtr(RESMAN_ITEM    *psResItem, IMG_BOOL bForceCleanup)
 {
        PVRSRV_ERROR eError;
 
@@ -394,7 +394,7 @@ PVRSRV_ERROR ResManFreeResByPtr(RESMAN_ITEM *psResItem)
        VALIDATERESLIST();
 
        
-       eError = FreeResourceByPtr(psResItem, IMG_TRUE);
+       eError = FreeResourceByPtr(psResItem, IMG_TRUE, bForceCleanup);
 
        
        VALIDATERESLIST();
@@ -471,7 +471,7 @@ PVRSRV_ERROR ResManDissociateRes(RESMAN_ITEM                *psResItem,
        }
        else
        {
-               eError = FreeResourceByPtr(psResItem, IMG_FALSE);
+               eError = FreeResourceByPtr(psResItem, IMG_FALSE, CLEANUP_WITH_POLL);
                if(eError != PVRSRV_OK)
                {
                        PVR_DPF((PVR_DBG_ERROR, "ResManDissociateRes: failed to free resource by pointer"));
@@ -547,7 +547,8 @@ IMG_INTERNAL PVRSRV_ERROR ResManFindResourceByPtr(PRESMAN_CONTEXT   psResManContex
 }
 
 static PVRSRV_ERROR FreeResourceByPtr(RESMAN_ITEM      *psItem,
-                                                                         IMG_BOOL              bExecuteCallback)
+                                 IMG_BOOL              bExecuteCallback,
+                                 IMG_BOOL              bForceCleanup)
 {
        PVRSRV_ERROR eError;
 
@@ -584,7 +585,8 @@ static PVRSRV_ERROR FreeResourceByPtr(RESMAN_ITEM   *psItem,
        
        if (bExecuteCallback)
        {
-               eError = psItem->pfnFreeResource(psItem->pvParam, psItem->ui32Param);
+               eError = psItem->pfnFreeResource(psItem->pvParam, psItem->ui32Param,
+                                                bForceCleanup);
                if (eError != PVRSRV_OK)
                {
                        PVR_DPF((PVR_DBG_ERROR, "FreeResourceByPtr: ERROR calling FreeResource function"));
@@ -660,7 +662,7 @@ static PVRSRV_ERROR FreeResourceByCriteria(PRESMAN_CONTEXT  psResManContext,
                                                                                ui32Param)) != IMG_NULL
                        && eError == PVRSRV_OK)
        {
-               eError = FreeResourceByPtr(psCurItem, bExecuteCallback);
+               eError = FreeResourceByPtr(psCurItem, bExecuteCallback, CLEANUP_WITH_POLL);
        }
 
        return eError;
index 876d2e5..ffade3f 100644 (file)
@@ -47,8 +47,10 @@ static IMPLEMENT_LIST_REMOVE(PVRSRV_STUB_PBDESC)
 static PRESMAN_ITEM psResItemCreateSharedPB = IMG_NULL;
 static PVRSRV_PER_PROCESS_DATA *psPerProcCreateSharedPB = IMG_NULL;
 
-static PVRSRV_ERROR SGXCleanupSharedPBDescCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param);
-static PVRSRV_ERROR SGXCleanupSharedPBDescCreateLockCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param);
+static PVRSRV_ERROR SGXCleanupSharedPBDescCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param,
+                                               IMG_BOOL bDummy);
+static PVRSRV_ERROR SGXCleanupSharedPBDescCreateLockCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param,
+                                               IMG_BOOL bDummy);
 
 IMG_EXPORT PVRSRV_ERROR
 SGXFindSharedPBDescKM(PVRSRV_PER_PROCESS_DATA  *psPerProc,
@@ -217,13 +219,15 @@ SGXCleanupSharedPBDescKM(PVRSRV_STUB_PBDESC *psStubPBDescIn)
 
                SGXCleanupRequest(psDeviceNode,
                                                  &sHWPBDescDevVAddr,
-                                                 PVRSRV_CLEANUPCMD_PB);
+                                                 PVRSRV_CLEANUPCMD_PB,
+                                                 CLEANUP_WITH_POLL);
        }
        return PVRSRV_OK;
 
 }
 
-static PVRSRV_ERROR SGXCleanupSharedPBDescCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param)
+static PVRSRV_ERROR SGXCleanupSharedPBDescCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param,
+                                                       IMG_BOOL bDummy)
 {
        PVRSRV_STUB_PBDESC *psStubPBDesc = (PVRSRV_STUB_PBDESC *)pvParam;
 
@@ -232,7 +236,8 @@ static PVRSRV_ERROR SGXCleanupSharedPBDescCallback(IMG_PVOID pvParam, IMG_UINT32
        return SGXCleanupSharedPBDescKM(psStubPBDesc);
 }
 
-static PVRSRV_ERROR SGXCleanupSharedPBDescCreateLockCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param)
+static PVRSRV_ERROR SGXCleanupSharedPBDescCreateLockCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param,
+                                                               IMG_BOOL bDummy)
 {
 #ifdef PVR_DEBUG_EXT
        PVRSRV_PER_PROCESS_DATA *psPerProc = (PVRSRV_PER_PROCESS_DATA *)pvParam;
@@ -255,7 +260,7 @@ SGXUnrefSharedPBDescKM(IMG_HANDLE hSharedPBDesc)
 {
        PVR_ASSERT(hSharedPBDesc != IMG_NULL);
 
-       return ResManFreeResByPtr(hSharedPBDesc);
+       return ResManFreeResByPtr(hSharedPBDesc, CLEANUP_WITH_POLL);
 }
 
 
@@ -287,7 +292,7 @@ SGXAddSharedPBDescKM(PVRSRV_PER_PROCESS_DATA        *psPerProc,
        {
                PVR_ASSERT(psResItemCreateSharedPB != IMG_NULL);
 
-               ResManFreeResByPtr(psResItemCreateSharedPB);
+               ResManFreeResByPtr(psResItemCreateSharedPB, CLEANUP_WITH_POLL);
 
                PVR_ASSERT(psResItemCreateSharedPB == IMG_NULL);
                PVR_ASSERT(psPerProcCreateSharedPB == IMG_NULL);
index b583b5e..ab7a0d5 100644 (file)
@@ -533,18 +533,15 @@ PVRSRV_ERROR SGXGetInternalDevInfoKM(IMG_HANDLE hDevCookie,
 
 IMG_VOID SGXCleanupRequest(PVRSRV_DEVICE_NODE  *psDeviceNode,
                                                   IMG_DEV_VIRTADDR             *psHWDataDevVAddr,
-                                                  IMG_UINT32                   ui32CleanupType)
+                                                  IMG_UINT32                   ui32CleanupType,
+                                                  IMG_BOOL                     bForceCleanup)
 {
        PVRSRV_ERROR                    eError;
        PVRSRV_SGXDEV_INFO              *psSGXDevInfo = psDeviceNode->pvDevice;
        PVRSRV_KERNEL_MEM_INFO  *psSGXHostCtlMemInfo = psSGXDevInfo->psKernelSGXHostCtlMemInfo;
        SGXMKIF_HOST_CTL                *psSGXHostCtl = psSGXHostCtlMemInfo->pvLinAddrKM;
 
-       if ((psSGXHostCtl->ui32PowerStatus & PVRSRV_USSE_EDM_POWMAN_NO_WORK) != 0)
-       {
-               
-       }
-       else
+       if (bForceCleanup != FORCE_CLEANUP)
        {
                SGXMKIF_COMMAND         sCommand = {0};
 
@@ -585,16 +582,17 @@ IMG_VOID SGXCleanupRequest(PVRSRV_DEVICE_NODE     *psDeviceNode,
                                        MAKEUNIQUETAG(psSGXHostCtlMemInfo));
                #endif 
 
-               psSGXHostCtl->ui32CleanupStatus &= ~(PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE);
-               PDUMPMEM(IMG_NULL, psSGXHostCtlMemInfo, offsetof(SGXMKIF_HOST_CTL, ui32CleanupStatus), sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psSGXHostCtlMemInfo));
                
                
-       #if defined(SGX_FEATURE_SYSTEM_CACHE)
-               psSGXDevInfo->ui32CacheControl |= (SGXMKIF_CC_INVAL_BIF_SL | SGXMKIF_CC_INVAL_DATA);
-       #else
-               psSGXDevInfo->ui32CacheControl |= SGXMKIF_CC_INVAL_DATA;
-       #endif
        }
+       psSGXHostCtl->ui32CleanupStatus &= ~(PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE);
+       PDUMPMEM(IMG_NULL, psSGXHostCtlMemInfo, offsetof(SGXMKIF_HOST_CTL, ui32CleanupStatus), sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psSGXHostCtlMemInfo));
+
+#if defined(SGX_FEATURE_SYSTEM_CACHE)
+        psSGXDevInfo->ui32CacheControl |= (SGXMKIF_CC_INVAL_BIF_SL | SGXMKIF_CC_INVAL_DATA);
+#else
+        psSGXDevInfo->ui32CacheControl |= SGXMKIF_CC_INVAL_DATA;
+#endif
 }
 
 
@@ -608,7 +606,8 @@ typedef struct _SGX_HW_RENDER_CONTEXT_CLEANUP_
 
 
 static PVRSRV_ERROR SGXCleanupHWRenderContextCallback(IMG_PVOID                pvParam,
-                                                                                                         IMG_UINT32    ui32Param)
+                                                 IMG_UINT32    ui32Param,
+                                                 IMG_BOOL bForceCleanup)
 {
        SGX_HW_RENDER_CONTEXT_CLEANUP *psCleanup = pvParam;
 
@@ -616,7 +615,8 @@ static PVRSRV_ERROR SGXCleanupHWRenderContextCallback(IMG_PVOID             pvParam,
 
        SGXCleanupRequest(psCleanup->psDeviceNode,
                                          &psCleanup->sHWRenderContextDevVAddr,
-                                         PVRSRV_CLEANUPCMD_RC);
+                                         PVRSRV_CLEANUPCMD_RC,
+                                         bForceCleanup);
 
        OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
                          sizeof(SGX_HW_RENDER_CONTEXT_CLEANUP),
@@ -637,7 +637,8 @@ typedef struct _SGX_HW_TRANSFER_CONTEXT_CLEANUP_
 
 
 static PVRSRV_ERROR SGXCleanupHWTransferContextCallback(IMG_PVOID      pvParam,
-                                                                                                               IMG_UINT32      ui32Param)
+                                                       IMG_UINT32      ui32Param,
+                                                       IMG_BOOL        bForceCleanup)
 {
        SGX_HW_TRANSFER_CONTEXT_CLEANUP *psCleanup = (SGX_HW_TRANSFER_CONTEXT_CLEANUP *)pvParam;
 
@@ -645,7 +646,8 @@ static PVRSRV_ERROR SGXCleanupHWTransferContextCallback(IMG_PVOID   pvParam,
 
        SGXCleanupRequest(psCleanup->psDeviceNode,
                                          &psCleanup->sHWTransferContextDevVAddr,
-                                         PVRSRV_CLEANUPCMD_TC);
+                                         PVRSRV_CLEANUPCMD_TC,
+                                         bForceCleanup);
 
        OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
                          sizeof(SGX_HW_TRANSFER_CONTEXT_CLEANUP),
@@ -706,7 +708,7 @@ IMG_HANDLE SGXRegisterHWRenderContextKM(IMG_HANDLE                          psDeviceNode,
 }
 
 IMG_EXPORT
-PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext)
+PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext, IMG_BOOL bForceCleanup)
 {
        PVRSRV_ERROR eError;
        SGX_HW_RENDER_CONTEXT_CLEANUP *psCleanup;
@@ -721,7 +723,7 @@ PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext)
                return PVRSRV_ERROR_INVALID_PARAMS;
        }
 
-       eError = ResManFreeResByPtr(psCleanup->psResItem);
+       eError = ResManFreeResByPtr(psCleanup->psResItem, bForceCleanup);
 
        return eError;
 }
@@ -777,7 +779,8 @@ IMG_HANDLE SGXRegisterHWTransferContextKM(IMG_HANDLE                                psDeviceNode,
 }
 
 IMG_EXPORT
-PVRSRV_ERROR SGXUnregisterHWTransferContextKM(IMG_HANDLE hHWTransferContext)
+PVRSRV_ERROR SGXUnregisterHWTransferContextKM(IMG_HANDLE hHWTransferContext,
+                                               IMG_BOOL bForceCleanup)
 {
        PVRSRV_ERROR eError;
        SGX_HW_TRANSFER_CONTEXT_CLEANUP *psCleanup;
@@ -792,7 +795,7 @@ PVRSRV_ERROR SGXUnregisterHWTransferContextKM(IMG_HANDLE hHWTransferContext)
                return PVRSRV_ERROR_INVALID_PARAMS;
        }
 
-       eError = ResManFreeResByPtr(psCleanup->psResItem);
+       eError = ResManFreeResByPtr(psCleanup->psResItem, bForceCleanup);
 
        return eError;
 }
@@ -978,13 +981,15 @@ PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(PVRSRV_SGXDEV_INFO *psDevInfo,
 
 
 IMG_EXPORT
-IMG_VOID SGXFlushHWRenderTargetKM(IMG_HANDLE psDeviceNode, IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr)
+IMG_VOID SGXFlushHWRenderTargetKM(IMG_HANDLE psDeviceNode, IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr,
+                               IMG_BOOL bForceCleanup)
 {
        PVR_ASSERT(sHWRTDataSetDevVAddr.uiAddr != IMG_NULL);
 
        SGXCleanupRequest(psDeviceNode,
                                          &sHWRTDataSetDevVAddr,
-                                         PVRSRV_CLEANUPCMD_RT);
+                                         PVRSRV_CLEANUPCMD_RT,
+                                         bForceCleanup);
 }
 
 
index bc4c053..37fb45e 100644 (file)
@@ -70,13 +70,14 @@ IMG_HANDLE SGXRegisterHWTransferContextKM(IMG_HANDLE                                psDeviceNode,
                                                                                  PVRSRV_PER_PROCESS_DATA       *psPerProc);
 
 IMG_IMPORT
-IMG_VOID SGXFlushHWRenderTargetKM(IMG_HANDLE psSGXDevInfo, IMG_DEV_VIRTADDR psHWRTDataSetDevVAddr);
+IMG_VOID SGXFlushHWRenderTargetKM(IMG_HANDLE psSGXDevInfo, IMG_DEV_VIRTADDR psHWRTDataSetDevVAddr,
+                                       IMG_BOOL bForceCleanup);
 
 IMG_IMPORT
-PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext);
+PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext, IMG_BOOL bForceCleanup);
 
 IMG_IMPORT
-PVRSRV_ERROR SGXUnregisterHWTransferContextKM(IMG_HANDLE hHWTransferContext);
+PVRSRV_ERROR SGXUnregisterHWTransferContextKM(IMG_HANDLE hHWTransferContext, IMG_BOOL bForceCleanup);
 
 #if defined(SGX_FEATURE_2D_HARDWARE)
 IMG_IMPORT
@@ -94,6 +95,7 @@ IMG_UINT32 SGXConvertTimeStamp(PVRSRV_SGXDEV_INFO     *psDevInfo,
 
 IMG_VOID SGXCleanupRequest(PVRSRV_DEVICE_NODE  *psDeviceNode,
                                                        IMG_DEV_VIRTADDR        *psHWDataDevVAddr,
-                                                       IMG_UINT32                      ui32CleanupType);
+                                                       IMG_UINT32                      ui32CleanupType,
+                                                       IMG_BOOL                bForceCleanup);
                                                           
 
index 7bc7e94..cd0ee7d 100644 (file)
@@ -136,7 +136,7 @@ PVRSRV_ERROR LinuxEventObjectDelete(IMG_HANDLE hOSEventObjectList, IMG_HANDLE hO
 #if defined(PVR_DEBUG_EXT)
                        PVR_DPF((PVR_DBG_MESSAGE, "LinuxEventObjectListDelete: Event object waits: %u", psLinuxEventObject->ui32Stats));
 #endif
-                       if(ResManFreeResByPtr(psLinuxEventObject->hResItem) != PVRSRV_OK)
+                       if(ResManFreeResByPtr(psLinuxEventObject->hResItem, CLEANUP_WITH_POLL) != PVRSRV_OK)
                        {
                                return PVRSRV_ERROR_UNABLE_TO_DESTROY_EVENT;
                        }
@@ -148,13 +148,14 @@ PVRSRV_ERROR LinuxEventObjectDelete(IMG_HANDLE hOSEventObjectList, IMG_HANDLE hO
 
 }
 
-static PVRSRV_ERROR LinuxEventObjectDeleteCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param)
+static PVRSRV_ERROR LinuxEventObjectDeleteCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param, IMG_BOOL bForceCleanup)
 {
        PVRSRV_LINUX_EVENT_OBJECT *psLinuxEventObject = pvParam;
        PVRSRV_LINUX_EVENT_OBJECT_LIST *psLinuxEventObjectList = psLinuxEventObject->psLinuxEventObjectList;
        unsigned long ulLockFlags;
 
        PVR_UNREFERENCED_PARAMETER(ui32Param);
+       PVR_UNREFERENCED_PARAMETER(bForceCleanup);
 
        write_lock_irqsave(&psLinuxEventObjectList->sLock, ulLockFlags);
        list_del(&psLinuxEventObject->sList);
index 6e6401b..cf78607 100644 (file)
@@ -78,7 +78,8 @@ enum {
 #define RESMAN_CRITERIA_PVOID_PARAM            0x00000002      
 #define RESMAN_CRITERIA_UI32_PARAM             0x00000004      
 
-typedef PVRSRV_ERROR (*RESMAN_FREE_FN)(IMG_PVOID pvParam, IMG_UINT32 ui32Param); 
+typedef PVRSRV_ERROR (*RESMAN_FREE_FN)(IMG_PVOID pvParam, IMG_UINT32 ui32Param,
+                                       IMG_BOOL bForceCleanup);
 
 typedef struct _RESMAN_ITEM_ *PRESMAN_ITEM;
 typedef struct _RESMAN_CONTEXT_ *PRESMAN_CONTEXT;
@@ -92,7 +93,7 @@ PRESMAN_ITEM ResManRegisterRes(PRESMAN_CONTEXT        hResManContext,
                                                           IMG_UINT32           ui32Param, 
                                                           RESMAN_FREE_FN       pfnFreeResource);
 
-PVRSRV_ERROR ResManFreeResByPtr(PRESMAN_ITEM   psResItem);
+PVRSRV_ERROR ResManFreeResByPtr(PRESMAN_ITEM   psResItem, IMG_BOOL bForceCleanup);
 
 PVRSRV_ERROR ResManFreeResByCriteria(PRESMAN_CONTEXT   hResManContext,
                                                                         IMG_UINT32                     ui32SearchCriteria,