From 8842de0418a82093f01662ed84ad8f9441b934ef Mon Sep 17 00:00:00 2001 From: Imre Deak Date: Fri, 4 Nov 2011 14:28:06 +0200 Subject: [PATCH] gfx: pvr: add force cleanup param Signed-off-by: Imre Deak Signed-off-by: Pauli Nieminen Signed-off-by: Kirill A. Shutemov --- drivers/staging/mrst/pvr/include4/img_defs.h | 4 ++ .../mrst/pvr/services4/include/sgx_bridge.h | 11 +++-- .../services4/srvkm/bridged/bridged_pvr_bridge.c | 10 +++-- .../srvkm/bridged/sgx/bridged_sgx_bridge.c | 9 ++-- .../pvr/services4/srvkm/common/buffer_manager.c | 7 +-- .../mrst/pvr/services4/srvkm/common/deviceclass.c | 16 ++++--- .../mrst/pvr/services4/srvkm/common/devicemem.c | 22 ++++++---- .../staging/mrst/pvr/services4/srvkm/common/mem.c | 7 +-- .../mrst/pvr/services4/srvkm/common/resman.c | 16 ++++--- .../mrst/pvr/services4/srvkm/devices/sgx/pb.c | 19 +++++--- .../pvr/services4/srvkm/devices/sgx/sgxutils.c | 51 ++++++++++++---------- .../pvr/services4/srvkm/devices/sgx/sgxutils.h | 10 +++-- .../mrst/pvr/services4/srvkm/env/linux/event.c | 5 ++- .../mrst/pvr/services4/srvkm/include/resman.h | 5 ++- 14 files changed, 115 insertions(+), 77 deletions(-) diff --git a/drivers/staging/mrst/pvr/include4/img_defs.h b/drivers/staging/mrst/pvr/include4/img_defs.h index bcc2a84..0cd7481 100644 --- a/drivers/staging/mrst/pvr/include4/img_defs.h +++ b/drivers/staging/mrst/pvr/include4/img_defs.h @@ -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 diff --git a/drivers/staging/mrst/pvr/services4/include/sgx_bridge.h b/drivers/staging/mrst/pvr/services4/include/sgx_bridge.h index a572ade..d9c8db9 100644 --- a/drivers/staging/mrst/pvr/services4/include/sgx_bridge.h +++ b/drivers/staging/mrst/pvr/services4/include/sgx_bridge.h @@ -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; diff --git a/drivers/staging/mrst/pvr/services4/srvkm/bridged/bridged_pvr_bridge.c b/drivers/staging/mrst/pvr/services4/srvkm/bridged/bridged_pvr_bridge.c index 292be6a..c2a8f39 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/bridged/bridged_pvr_bridge.c +++ b/drivers/staging/mrst/pvr/services4/srvkm/bridged/bridged_pvr_bridge.c @@ -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")); diff --git a/drivers/staging/mrst/pvr/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c b/drivers/staging/mrst/pvr/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c index 9bcf43a..7c2e8ee 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c +++ b/drivers/staging/mrst/pvr/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c @@ -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; } diff --git a/drivers/staging/mrst/pvr/services4/srvkm/common/buffer_manager.c b/drivers/staging/mrst/pvr/services4/srvkm/common/buffer_manager.c index 0ea9c80..456e44e 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/common/buffer_manager.c +++ b/drivers/staging/mrst/pvr/services4/srvkm/common/buffer_manager.c @@ -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; } diff --git a/drivers/staging/mrst/pvr/services4/srvkm/common/deviceclass.c b/drivers/staging/mrst/pvr/services4/srvkm/common/deviceclass.c index e43e8f8..4e10e77 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/common/deviceclass.c +++ b/drivers/staging/mrst/pvr/services4/srvkm/common/deviceclass.c @@ -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; diff --git a/drivers/staging/mrst/pvr/services4/srvkm/common/devicemem.c b/drivers/staging/mrst/pvr/services4/srvkm/common/devicemem.c index f51d632..963f577 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/common/devicemem.c +++ b/drivers/staging/mrst/pvr/services4/srvkm/common/devicemem.c @@ -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; diff --git a/drivers/staging/mrst/pvr/services4/srvkm/common/mem.c b/drivers/staging/mrst/pvr/services4/srvkm/common/mem.c index 005a12c..670a622 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/common/mem.c +++ b/drivers/staging/mrst/pvr/services4/srvkm/common/mem.c @@ -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; diff --git a/drivers/staging/mrst/pvr/services4/srvkm/common/resman.c b/drivers/staging/mrst/pvr/services4/srvkm/common/resman.c index c477ace..672249e 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/common/resman.c +++ b/drivers/staging/mrst/pvr/services4/srvkm/common/resman.c @@ -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; diff --git a/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/pb.c b/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/pb.c index 876d2e5..ffade3f 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/pb.c +++ b/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/pb.c @@ -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); diff --git a/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxutils.c b/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxutils.c index b583b5e..ab7a0d5 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxutils.c +++ b/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxutils.c @@ -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); } diff --git a/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxutils.h b/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxutils.h index bc4c053..37fb45e 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxutils.h +++ b/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxutils.h @@ -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); diff --git a/drivers/staging/mrst/pvr/services4/srvkm/env/linux/event.c b/drivers/staging/mrst/pvr/services4/srvkm/env/linux/event.c index 7bc7e94..cd0ee7d 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/env/linux/event.c +++ b/drivers/staging/mrst/pvr/services4/srvkm/env/linux/event.c @@ -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); diff --git a/drivers/staging/mrst/pvr/services4/srvkm/include/resman.h b/drivers/staging/mrst/pvr/services4/srvkm/include/resman.h index 6e6401b..cf78607 100644 --- a/drivers/staging/mrst/pvr/services4/srvkm/include/resman.h +++ b/drivers/staging/mrst/pvr/services4/srvkm/include/resman.h @@ -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, -- 2.7.4