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; }
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; }