static enum PVRSRV_ERROR PVRSRVRegisterDCDeviceKM( struct PVRSRV_DC_SRV2DISP_KMJTABLE *psFuncTable, u32 *pui32DeviceID) { struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo = NULL; struct PVRSRV_DEVICE_NODE *psDeviceNode; struct SYS_DATA *psSysData; if (SysAcquireData(&psSysData) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterDCDeviceKM: Failed to get SysData"); return PVRSRV_ERROR_GENERIC; } if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(*psDCInfo), (void **) &psDCInfo, NULL) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterDCDeviceKM: Failed psDCInfo alloc"); return PVRSRV_ERROR_OUT_OF_MEMORY; } OSMemSet(psDCInfo, 0, sizeof(*psDCInfo)); if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DC_SRV2DISP_KMJTABLE), (void **)&psDCInfo->psFuncTable, NULL) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterDCDeviceKM: Failed psFuncTable alloc"); goto ErrorExit; } OSMemSet(psDCInfo->psFuncTable, 0, sizeof(struct PVRSRV_DC_SRV2DISP_KMJTABLE)); *psDCInfo->psFuncTable = *psFuncTable; if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DEVICE_NODE), (void **) &psDeviceNode, NULL) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterDCDeviceKM: Failed psDeviceNode alloc"); goto ErrorExit; } OSMemSet(psDeviceNode, 0, sizeof(struct PVRSRV_DEVICE_NODE)); psDeviceNode->pvDevice = (void *) psDCInfo; psDeviceNode->ui32pvDeviceSize = sizeof(*psDCInfo); psDeviceNode->ui32RefCount = 1; psDeviceNode->sDevId.eDeviceType = PVRSRV_DEVICE_TYPE_EXT; psDeviceNode->sDevId.eDeviceClass = PVRSRV_DEVICE_CLASS_DISPLAY; psDeviceNode->psSysData = psSysData; AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex); psDCInfo->ui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex; if (pui32DeviceID) *pui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex; SysRegisterExternalDevice(psDeviceNode); psDeviceNode->psNext = psSysData->psDeviceNodeList; psSysData->psDeviceNodeList = psDeviceNode; return PVRSRV_OK; ErrorExit: if (psDCInfo->psFuncTable) 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); return PVRSRV_ERROR_OUT_OF_MEMORY; }
PVRSRV_ERROR PVRSRVRegisterDCDeviceKM (PVRSRV_DC_SRV2DISP_KMJTABLE *psFuncTable, IMG_UINT32 *pui32DeviceID) { PVRSRV_DISPLAYCLASS_INFO *psDCInfo = IMG_NULL; PVRSRV_DEVICE_NODE *psDeviceNode; SYS_DATA *psSysData; SysAcquireData(&psSysData); if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP, sizeof(*psDCInfo), (IMG_VOID **)&psDCInfo, IMG_NULL, "Display Class Info") != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDCDeviceKM: Failed psDCInfo alloc")); return PVRSRV_ERROR_OUT_OF_MEMORY; } OSMemSet (psDCInfo, 0, sizeof(*psDCInfo)); if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE), (IMG_VOID **)&psDCInfo->psFuncTable, IMG_NULL, "Function table for SRVKM->DISPLAY") != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDCDeviceKM: Failed psFuncTable alloc")); goto ErrorExit; } OSMemSet (psDCInfo->psFuncTable, 0, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE)); *psDCInfo->psFuncTable = *psFuncTable; if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), (IMG_VOID **)&psDeviceNode, IMG_NULL, "Device Node") != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDCDeviceKM: Failed psDeviceNode alloc")); goto ErrorExit; } OSMemSet (psDeviceNode, 0, sizeof(PVRSRV_DEVICE_NODE)); psDeviceNode->pvDevice = (IMG_VOID*)psDCInfo; psDeviceNode->ui32pvDeviceSize = sizeof(*psDCInfo); psDeviceNode->ui32RefCount = 1; psDeviceNode->sDevId.eDeviceType = PVRSRV_DEVICE_TYPE_EXT; psDeviceNode->sDevId.eDeviceClass = PVRSRV_DEVICE_CLASS_DISPLAY; psDeviceNode->psSysData = psSysData; if (AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex) != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed to allocate Device ID")); goto ErrorExit; } psDCInfo->ui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex; if (pui32DeviceID) { *pui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex; } SysRegisterExternalDevice(psDeviceNode); List_PVRSRV_DEVICE_NODE_Insert(&psSysData->psDeviceNodeList, psDeviceNode); return PVRSRV_OK; ErrorExit: if(psDCInfo->psFuncTable) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE), psDCInfo->psFuncTable, IMG_NULL); psDCInfo->psFuncTable = IMG_NULL; } OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DISPLAYCLASS_INFO), psDCInfo, IMG_NULL); return PVRSRV_ERROR_OUT_OF_MEMORY; }