PVRSRV_ERROR PVRSRVRemoveDCDeviceKM(IMG_UINT32 ui32DevIndex) { SYS_DATA *psSysData; PVRSRV_DEVICE_NODE *psDeviceNode; PVRSRV_DISPLAYCLASS_INFO *psDCInfo; SysAcquireData(&psSysData); psDeviceNode = (PVRSRV_DEVICE_NODE*) List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList, MatchDeviceKM_AnyVaCb, ui32DevIndex, IMG_FALSE, PVRSRV_DEVICE_CLASS_DISPLAY); if (!psDeviceNode) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveDCDeviceKM: requested device %d not present", ui32DevIndex)); return PVRSRV_ERROR_GENERIC; } psDCInfo = (PVRSRV_DISPLAYCLASS_INFO*)psDeviceNode->pvDevice; if(psDCInfo->ui32RefCount == 0) { List_PVRSRV_DEVICE_NODE_Remove(psDeviceNode); SysRemoveExternalDevice(psDeviceNode); PVR_ASSERT(psDCInfo->ui32RefCount == 0); (IMG_VOID)FreeDeviceID(psSysData, ui32DevIndex); (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE), psDCInfo->psFuncTable, IMG_NULL); psDCInfo->psFuncTable = IMG_NULL; (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DISPLAYCLASS_INFO), psDCInfo, IMG_NULL); (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), psDeviceNode, IMG_NULL); } else { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveDCDeviceKM: failed as %d Services DC API connections are still open", psDCInfo->ui32RefCount)); return PVRSRV_ERROR_GENERIC; } return PVRSRV_OK; }
static enum PVRSRV_ERROR PVRSRVRemoveDCDeviceKM(u32 ui32DevIndex) { struct SYS_DATA *psSysData; struct PVRSRV_DEVICE_NODE **ppsDeviceNode, *psDeviceNode; struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo; if (SysAcquireData(&psSysData) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRemoveDCDeviceKM: Failed to get SysData"); return PVRSRV_ERROR_GENERIC; } ppsDeviceNode = &psSysData->psDeviceNodeList; while (*ppsDeviceNode) { switch ((*ppsDeviceNode)->sDevId.eDeviceClass) { case PVRSRV_DEVICE_CLASS_DISPLAY: { if ((*ppsDeviceNode)->sDevId.ui32DeviceIndex == ui32DevIndex) goto FoundDevice; break; } default: { break; } } ppsDeviceNode = &((*ppsDeviceNode)->psNext); } PVR_DPF(PVR_DBG_ERROR, "PVRSRVRemoveDCDeviceKM: requested device %d not present", ui32DevIndex); return PVRSRV_ERROR_GENERIC; FoundDevice: psDeviceNode = *ppsDeviceNode; *ppsDeviceNode = psDeviceNode->psNext; SysRemoveExternalDevice(psDeviceNode); psDCInfo = (struct PVRSRV_DISPLAYCLASS_INFO *)psDeviceNode->pvDevice; PVR_ASSERT(psDCInfo->ui32RefCount == 0); FreeDeviceID(psSysData, ui32DevIndex); OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DC_SRV2DISP_KMJTABLE), psDCInfo->psFuncTable, NULL); OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DISPLAYCLASS_INFO), psDCInfo, NULL); OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DEVICE_NODE), psDeviceNode, NULL); return PVRSRV_OK; }
PVRSRV_ERROR IMG_CALLCONV PVRSRVDeinitialiseDevice(IMG_UINT32 ui32DevIndex) { PVRSRV_DEVICE_NODE *psDeviceNode; SYS_DATA *psSysData; PVRSRV_ERROR eError; SysAcquireData(&psSysData); psDeviceNode = (PVRSRV_DEVICE_NODE*) List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList, &MatchDeviceKM_AnyVaCb, ui32DevIndex, IMG_TRUE); if (!psDeviceNode) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: requested device %d is not present", ui32DevIndex)); return PVRSRV_ERROR_DEVICEID_NOT_FOUND; } eError = PVRSRVSetDevicePowerStateKM(ui32DevIndex, PVRSRV_DEV_POWER_STATE_OFF, KERNEL_ID, IMG_FALSE); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: Failed PVRSRVSetDevicePowerStateKM call")); return eError; } eError = ResManFreeResByCriteria(psDeviceNode->hResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DEVICEMEM_ALLOCATION, IMG_NULL, 0); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: Failed ResManFreeResByCriteria call")); return eError; } if(psDeviceNode->pfnDeInitDevice != IMG_NULL) { eError = psDeviceNode->pfnDeInitDevice(psDeviceNode); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: Failed DeInitDevice call")); return eError; } } PVRSRVResManDisconnect(psDeviceNode->hResManContext, IMG_TRUE); psDeviceNode->hResManContext = IMG_NULL; List_PVRSRV_DEVICE_NODE_Remove(psDeviceNode); (IMG_VOID)FreeDeviceID(psSysData, ui32DevIndex); OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), psDeviceNode, IMG_NULL); return (PVRSRV_OK); }
static enum PVRSRV_ERROR PVRSRVRemoveBCDeviceKM(u32 ui32DevIndex) { struct SYS_DATA *psSysData; struct PVRSRV_DEVICE_NODE **ppsDevNode, *psDevNode; struct PVRSRV_BUFFERCLASS_INFO *psBCInfo; if (SysAcquireData(&psSysData) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRemoveBCDeviceKM: Failed to get SysData"); return PVRSRV_ERROR_GENERIC; } ppsDevNode = &psSysData->psDeviceNodeList; while (*ppsDevNode) { switch ((*ppsDevNode)->sDevId.eDeviceClass) { case PVRSRV_DEVICE_CLASS_BUFFER: { if ((*ppsDevNode)->sDevId.ui32DeviceIndex == ui32DevIndex) goto FoundDevice; break; } default: { break; } } ppsDevNode = &(*ppsDevNode)->psNext; } PVR_DPF(PVR_DBG_ERROR, "PVRSRVRemoveBCDeviceKM: requested device %d not present", ui32DevIndex); return PVRSRV_ERROR_GENERIC; FoundDevice: psDevNode = *(ppsDevNode); psBCInfo = (struct PVRSRV_BUFFERCLASS_INFO *)psDevNode->pvDevice; if (psBCInfo->ui32RefCount == 0) { *ppsDevNode = psDevNode->psNext; FreeDeviceID(psSysData, ui32DevIndex); psBCInfo = (struct PVRSRV_BUFFERCLASS_INFO *)psDevNode->pvDevice; OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_BC_SRV2BUFFER_KMJTABLE), psBCInfo->psFuncTable, NULL); OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_BUFFERCLASS_INFO), psBCInfo, NULL); OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DEVICE_NODE), psDevNode, NULL); } else { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRemoveBCDeviceKM: " "failed as %d Services BC API " "connections are still open", psBCInfo->ui32RefCount); return PVRSRV_ERROR_GENERIC; } return PVRSRV_OK; }
/*! ****************************************************************************** @Function PVRSRVDeinitialiseDevice @Description This De-inits device @Input ui32DevIndex : Index to the required device @Return PVRSRV_ERROR : ******************************************************************************/ PVRSRV_ERROR IMG_CALLCONV PVRSRVDeinitialiseDevice(IMG_UINT32 ui32DevIndex) { PVRSRV_DEVICE_NODE *psDeviceNode; SYS_DATA *psSysData; PVRSRV_ERROR eError; SysAcquireData(&psSysData); psDeviceNode = (PVRSRV_DEVICE_NODE*) List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList, &MatchDeviceKM_AnyVaCb, ui32DevIndex, IMG_TRUE); if (!psDeviceNode) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: requested device %d is not present", ui32DevIndex)); return PVRSRV_ERROR_DEVICEID_NOT_FOUND; } eError = PVRSRVPowerLock(KERNEL_ID, IMG_FALSE); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: Failed PVRSRVPowerLock call")); return eError; } /* Power down the device if necessary. */ eError = PVRSRVSetDevicePowerStateKM(ui32DevIndex, PVRSRV_DEV_POWER_STATE_OFF); PVRSRVPowerUnlock(KERNEL_ID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: Failed PVRSRVSetDevicePowerStateKM call")); return eError; } /* Free the dissociated device memory. */ eError = ResManFreeResByCriteria(psDeviceNode->hResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DEVICEMEM_ALLOCATION, IMG_NULL, 0); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: Failed ResManFreeResByCriteria call")); return eError; } /* De-init the device. */ if(psDeviceNode->pfnDeInitDevice != IMG_NULL) { eError = psDeviceNode->pfnDeInitDevice(psDeviceNode); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeinitialiseDevice: Failed DeInitDevice call")); return eError; } } /* Close the device's resource manager context. */ PVRSRVResManDisconnect(psDeviceNode->hResManContext, IMG_TRUE); psDeviceNode->hResManContext = IMG_NULL; /* remove node from list */ List_PVRSRV_DEVICE_NODE_Remove(psDeviceNode); /* deallocate id and memory */ (IMG_VOID)FreeDeviceID(psSysData, ui32DevIndex); OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), psDeviceNode, IMG_NULL); /*not nulling pointer, out of scope*/ return (PVRSRV_OK); }
enum PVRSRV_ERROR PVRSRVDeinitialiseDevice(u32 ui32DevIndex) { struct PVRSRV_DEVICE_NODE *psDeviceNode; struct PVRSRV_DEVICE_NODE **ppsDevNode; struct SYS_DATA *psSysData; enum PVRSRV_ERROR eError; eError = SysAcquireData(&psSysData); if (eError != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVDeinitialiseDevice: Failed to get SysData"); return eError; } ppsDevNode = &psSysData->psDeviceNodeList; while (*ppsDevNode) { if ((*ppsDevNode)->sDevId.ui32DeviceIndex == ui32DevIndex) { psDeviceNode = *ppsDevNode; goto FoundDevice; } ppsDevNode = &((*ppsDevNode)->psNext); } PVR_DPF(PVR_DBG_ERROR, "PVRSRVDeinitialiseDevice: requested device %d is not present", ui32DevIndex); return PVRSRV_ERROR_GENERIC; FoundDevice: eError = PVRSRVSetDevicePowerStateKM(ui32DevIndex, PVRSRV_POWER_STATE_D3, KERNEL_ID, IMG_FALSE); if (eError != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVDeinitialiseDevice: " "Failed PVRSRVSetDevicePowerStateKM call"); return eError; } ResManFreeResByCriteria(psDeviceNode->hResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DEVICEMEM_ALLOCATION, NULL, 0); if (psDeviceNode->pfnDeInitDevice != NULL) { eError = psDeviceNode->pfnDeInitDevice(psDeviceNode); if (eError != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVDeinitialiseDevice: " "Failed DeInitDevice call"); return eError; } } PVRSRVResManDisconnect(psDeviceNode->hResManContext, IMG_TRUE); psDeviceNode->hResManContext = NULL; *ppsDevNode = psDeviceNode->psNext; FreeDeviceID(psSysData, ui32DevIndex); OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(struct PVRSRV_DEVICE_NODE), psDeviceNode, NULL); return PVRSRV_OK; }