IMG_VOID RGXUnregisterMemoryContext(IMG_HANDLE hPrivData) { SERVER_MMU_CONTEXT *psServerMMUContext = hPrivData; PVRSRV_RGXDEV_INFO *psDevInfo = psServerMMUContext->psDevInfo; OSWRLockAcquireWrite(psDevInfo->hMemoryCtxListLock); dllist_remove_node(&psServerMMUContext->sNode); OSWRLockReleaseWrite(psDevInfo->hMemoryCtxListLock); #if defined(SUPPORT_PAGE_FAULT_DEBUG) _RecordUnregisteredMemoryContext(psDevInfo, psServerMMUContext); #endif /* * Release the page catalogue address acquired in RGXRegisterMemoryContext(). */ MMU_ReleaseBaseAddr(IMG_NULL /* FIXME */); /* * Free the firmware memory context. */ DevmemFwFree(psServerMMUContext->psFWMemContextMemDesc); OSFreeMem(psServerMMUContext); }
IMG_EXPORT PVRSRV_ERROR PVRSRVRGXDestroyComputeContextKM(RGX_SERVER_COMPUTE_CONTEXT *psComputeContext) { PVRSRV_ERROR eError = PVRSRV_OK; /* Check if the FW has finished with this resource ... */ eError = RGXFWRequestCommonContextCleanUp(psComputeContext->psDeviceNode, FWCommonContextGetFWAddress(psComputeContext->psServerCommonContext), psComputeContext->psSync, RGXFWIF_DM_CDM); if (eError == PVRSRV_ERROR_RETRY) { return eError; } else if (eError != PVRSRV_OK) { PVR_LOG(("%s: Unexpected error from RGXFWRequestCommonContextCleanUp (%s)", __FUNCTION__, PVRSRVGetErrorStringKM(eError))); } /* ... it has so we can free its resources */ dllist_remove_node(&(psComputeContext->sListNode)); FWCommonContextFree(psComputeContext->psServerCommonContext); DevmemFwFree(psComputeContext->psFWFrameworkMemDesc); DevmemFwFree(psComputeContext->psFWComputeContextStateMemDesc); SyncPrimFree(psComputeContext->psSync); OSFreeMem(psComputeContext); return PVRSRV_OK; }
IMG_VOID ServerSyncUnref(SERVER_SYNC_PRIMITIVE *psSync) { IMG_UINT32 ui32RefCount; OSLockAcquire(psSync->hLock); ui32RefCount = --psSync->ui32RefCount; OSLockRelease(psSync->hLock); if (ui32RefCount == 0) { SYNC_REFCOUNT_PRINT("%s: Server sync %p, refcount = %d", __FUNCTION__, psSync, ui32RefCount); /* Remove the sync from the global list */ OSLockAcquire(g_hListLock); dllist_remove_node(&psSync->sNode); OSLockRelease(g_hListLock); OSLockDestroy(psSync->hLock); SyncPrimFree(psSync->psSync); OSFreeMem(psSync); } else { SYNC_REFCOUNT_PRINT("%s: Server sync %p, refcount = %d", __FUNCTION__, psSync, ui32RefCount); } }
static IMG_BOOL _SyncRecordListDestroy(PDLLIST_NODE psNode, IMG_PVOID pvCallbackData) { struct SYNC_RECORD *pSyncRec; PVR_UNREFERENCED_PARAMETER(pvCallbackData); pSyncRec = IMG_CONTAINER_OF(psNode, struct SYNC_RECORD, sNode); dllist_remove_node(psNode); OSFreeMem(pSyncRec); return IMG_TRUE; }
static IMG_VOID _SyncConnectionRemoveBlock(SYNC_PRIMITIVE_BLOCK *psBlock) { SYNC_CONNECTION_DATA *psSyncConnectionData = psBlock->psSyncConnectionData; if (psBlock->psSyncConnectionData) { OSLockAcquire(psSyncConnectionData->hLock); dllist_remove_node(&psBlock->sConnectionNode); OSLockRelease(psSyncConnectionData->hLock); _SyncConnectionUnref(psBlock->psSyncConnectionData); } }
IMG_EXPORT PVRSRV_ERROR PVRSRVRGXDestroyTransferContextKM(RGX_SERVER_TQ_CONTEXT *psTransferContext) { PVRSRV_ERROR eError; if (psTransferContext->ui32Flags & RGX_SERVER_TQ_CONTEXT_FLAGS_2D) { eError = _Destroy2DTransferContext(&psTransferContext->s2DData, psTransferContext->psDeviceNode, psTransferContext->psCleanupSync); if (eError != PVRSRV_OK) { goto fail_destroy2d; } /* We've freed the 2D context, don't try to free it again */ psTransferContext->ui32Flags &= ~RGX_SERVER_TQ_CONTEXT_FLAGS_2D; } if (psTransferContext->ui32Flags & RGX_SERVER_TQ_CONTEXT_FLAGS_3D) { eError = _Destroy3DTransferContext(&psTransferContext->s3DData, psTransferContext->psDeviceNode, psTransferContext->psCleanupSync); if (eError != PVRSRV_OK) { goto fail_destroy3d; } /* We've freed the 3D context, don't try to free it again */ psTransferContext->ui32Flags &= ~RGX_SERVER_TQ_CONTEXT_FLAGS_3D; } dllist_remove_node(&(psTransferContext->sListNode)); DevmemFwFree(psTransferContext->psFWFrameworkMemDesc); SyncPrimFree(psTransferContext->psCleanupSync); OSFreeMem(psTransferContext); return PVRSRV_OK; fail_destroy2d: fail_destroy3d: PVR_ASSERT(eError != PVRSRV_OK); return eError; }
PVRSRV_ERROR PVRSRVSyncRecordRemoveByHandleKM( SYNC_RECORD_HANDLE hRecord) { struct SYNC_RECORD *pSync = (struct SYNC_RECORD*)hRecord; if ( !hRecord ) { return PVRSRV_ERROR_INVALID_PARAMS; } OSLockAcquire(g_hSyncRecordListLock); dllist_remove_node(&pSync->sNode); OSLockRelease(g_hSyncRecordListLock); OSFreeMem(pSync); return PVRSRV_OK; }
IMG_EXPORT PVRSRV_ERROR PVRSRVRGXDestroyComputeContextKM(RGX_SERVER_COMPUTE_CONTEXT *psComputeContext) { PVRSRV_ERROR eError = PVRSRV_OK; PVRSRV_RGXDEV_INFO *psDevInfo = psComputeContext->psDeviceNode->pvDevice; /* Check if the FW has finished with this resource ... */ eError = RGXFWRequestCommonContextCleanUp(psComputeContext->psDeviceNode, psComputeContext->psServerCommonContext, psComputeContext->psSync, RGXFWIF_DM_CDM); if (eError == PVRSRV_ERROR_RETRY) { return eError; } else if (eError != PVRSRV_OK) { PVR_LOG(("%s: Unexpected error from RGXFWRequestCommonContextCleanUp (%s)", __FUNCTION__, PVRSRVGetErrorStringKM(eError))); return eError; } /* ... it has so we can free its resources */ OSWRLockAcquireWrite(psDevInfo->hComputeCtxListLock); dllist_remove_node(&(psComputeContext->sListNode)); OSWRLockReleaseWrite(psDevInfo->hComputeCtxListLock); FWCommonContextFree(psComputeContext->psServerCommonContext); DevmemFwFree(psComputeContext->psFWFrameworkMemDesc); DevmemFwFree(psComputeContext->psFWComputeContextStateMemDesc); SyncPrimFree(psComputeContext->psSync); SyncAddrListDeinit(&psComputeContext->sSyncAddrListFence); SyncAddrListDeinit(&psComputeContext->sSyncAddrListUpdate); OSFreeMem(psComputeContext); return PVRSRV_OK; }