Exemplo n.º 1
0
static PVRSRV_ERROR
SGXCleanupSharedPBDescKM(PVRSRV_STUB_PBDESC *psStubPBDescIn)
{

	IMG_UINT32 i;
	PVRSRV_DEVICE_NODE *psDeviceNode;

	psDeviceNode = (PVRSRV_DEVICE_NODE*)psStubPBDescIn->hDevCookie;




	psStubPBDescIn->ui32RefCount--;
	if (psStubPBDescIn->ui32RefCount == 0)
	{
		IMG_DEV_VIRTADDR sHWPBDescDevVAddr = psStubPBDescIn->sHWPBDescDevVAddr;
		List_PVRSRV_STUB_PBDESC_Remove(psStubPBDescIn);
		for(i=0 ; i<psStubPBDescIn->ui32SubKernelMemInfosCount; i++)
		{

			PVRSRVFreeDeviceMemKM(psStubPBDescIn->hDevCookie,
								  psStubPBDescIn->ppsSubKernelMemInfos[i]);
		}

		OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
				  sizeof(PVRSRV_KERNEL_MEM_INFO *) * psStubPBDescIn->ui32SubKernelMemInfosCount,
				  psStubPBDescIn->ppsSubKernelMemInfos,
				  0);
		psStubPBDescIn->ppsSubKernelMemInfos = IMG_NULL;

		PVRSRVFreeSharedSysMemoryKM(psStubPBDescIn->psBlockKernelMemInfo);

		PVRSRVFreeDeviceMemKM(psStubPBDescIn->hDevCookie, psStubPBDescIn->psHWBlockKernelMemInfo);

		PVRSRVFreeDeviceMemKM(psStubPBDescIn->hDevCookie, psStubPBDescIn->psHWPBDescKernelMemInfo);

		PVRSRVFreeSharedSysMemoryKM(psStubPBDescIn->psSharedPBDescKernelMemInfo);

		OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
				  sizeof(PVRSRV_STUB_PBDESC),
				  psStubPBDescIn,
				  0);



		SGXCleanupRequest(psDeviceNode,
						  &sHWPBDescDevVAddr,
						  PVRSRV_CLEANUPCMD_PB,
						  CLEANUP_WITH_POLL);
	}
	return PVRSRV_OK;

}
Exemplo n.º 2
0
static enum PVRSRV_ERROR SGXCleanupSharedPBDescKM(
				struct PVRSRV_STUB_PBDESC *psStubPBDescIn)
{
	struct PVRSRV_STUB_PBDESC **ppsStubPBDesc;
	u32 i;
	struct PVRSRV_DEVICE_NODE *psDeviceNode;
	struct PVRSRV_SGXDEV_INFO *psSGXDevInfo;

	psDeviceNode = (struct PVRSRV_DEVICE_NODE *)psStubPBDescIn->hDevCookie;
	psSGXDevInfo = (struct PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice;

	for (ppsStubPBDesc = (struct PVRSRV_STUB_PBDESC **)
			&psSGXDevInfo->psStubPBDescListKM;
	     *ppsStubPBDesc != NULL;
	     ppsStubPBDesc = &(*ppsStubPBDesc)->psNext) {
		struct PVRSRV_STUB_PBDESC *psStubPBDesc = *ppsStubPBDesc;

		if (psStubPBDesc == psStubPBDescIn) {
			psStubPBDesc->ui32RefCount--;
			PVR_ASSERT((s32) psStubPBDesc->ui32RefCount >= 0);

			if (psStubPBDesc->ui32RefCount == 0) {
				*ppsStubPBDesc = psStubPBDesc->psNext;

				for (i = 0;
				   i < psStubPBDesc->ui32SubKernelMemInfosCount;
				   i++)
					PVRSRVFreeDeviceMemKM(psStubPBDesc->
								   hDevCookie,
					 psStubPBDesc->ppsSubKernelMemInfos[i]);

				OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
					sizeof(struct PVRSRV_KERNEL_MEM_INFO *)*
					  psStubPBDesc->
						ui32SubKernelMemInfosCount,
					  psStubPBDesc->ppsSubKernelMemInfos,
					  NULL);

				PVRSRVFreeSharedSysMemoryKM(psStubPBDesc->
						psBlockKernelMemInfo);

				PVRSRVFreeDeviceMemKM(psStubPBDesc->hDevCookie,
						psStubPBDesc->
						psHWPBDescKernelMemInfo);

				PVRSRVFreeSharedSysMemoryKM(psStubPBDesc->
						psSharedPBDescKernelMemInfo);

				OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
					     sizeof(struct PVRSRV_STUB_PBDESC),
					     psStubPBDesc, NULL);

				SGXCleanupRequest(psDeviceNode, NULL,
				   PVRSRV_USSE_EDM_RESMAN_CLEANUP_SHAREDPBDESC);
			}
			return PVRSRV_OK;
		}
	}

	return PVRSRV_ERROR_INVALID_PARAMS;
}