/*! ****************************************************************************** @Function PVRSRVRegisterDevice @Description registers a device with the system @Input psSysData : sysdata structure @Input pfnRegisterDevice : device registration function @Input ui32SOCInterruptBit : SoC interrupt bit for this device @Output pui32DeviceIndex : unique device key (for case of multiple identical devices) @Return PVRSRV_ERROR : ******************************************************************************/ PVRSRV_ERROR IMG_CALLCONV PVRSRVRegisterDevice(PSYS_DATA psSysData, PVRSRV_ERROR (*pfnRegisterDevice)(PVRSRV_DEVICE_NODE*), IMG_UINT32 ui32SOCInterruptBit, IMG_UINT32 *pui32DeviceIndex) { PVRSRV_ERROR eError; PVRSRV_DEVICE_NODE *psDeviceNode; /* Allocate device node */ if(OSAllocMem( PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), (IMG_VOID **)&psDeviceNode, IMG_NULL, "Device Node") != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDevice : Failed to alloc memory for psDeviceNode")); return (PVRSRV_ERROR_OUT_OF_MEMORY); } OSMemSet (psDeviceNode, 0, sizeof(PVRSRV_DEVICE_NODE)); eError = pfnRegisterDevice(psDeviceNode); if (eError != PVRSRV_OK) { OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), psDeviceNode, IMG_NULL); /*not nulling pointer, out of scope*/ PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDevice : Failed to register device")); return (PVRSRV_ERROR_DEVICE_REGISTER_FAILED); } /* make the refcount 1 and test on this to initialise device at acquiredevinfo. On release if refcount is 1, deinitialise and when refcount is 0 (sysdata de-alloc) deallocate the device structures */ psDeviceNode->ui32RefCount = 1; psDeviceNode->psSysData = psSysData; psDeviceNode->ui32SOCInterruptBit = ui32SOCInterruptBit; /* all devices need a unique identifier */ AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex); /* and finally insert the device into the dev-list */ List_PVRSRV_DEVICE_NODE_Insert(&psSysData->psDeviceNodeList, psDeviceNode); /* and copy back index */ *pui32DeviceIndex = psDeviceNode->sDevId.ui32DeviceIndex; return PVRSRV_OK; }
PVRSRV_ERROR IMG_CALLCONV PVRSRVRegisterDevice(PSYS_DATA psSysData, PVRSRV_ERROR (*pfnRegisterDevice)(PVRSRV_DEVICE_NODE*), IMG_UINT32 ui32SOCInterruptBit, IMG_UINT32 *pui32DeviceIndex) { PVRSRV_ERROR eError; PVRSRV_DEVICE_NODE *psDeviceNode; if(OSAllocMem( PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), (IMG_VOID **)&psDeviceNode, IMG_NULL, "Device Node") != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDevice : Failed to alloc memory for psDeviceNode")); return (PVRSRV_ERROR_OUT_OF_MEMORY); } OSMemSet (psDeviceNode, 0, sizeof(PVRSRV_DEVICE_NODE)); eError = pfnRegisterDevice(psDeviceNode); if (eError != PVRSRV_OK) { OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), psDeviceNode, IMG_NULL); PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDevice : Failed to register device")); return (PVRSRV_ERROR_DEVICE_REGISTER_FAILED); } psDeviceNode->ui32RefCount = 1; psDeviceNode->psSysData = psSysData; psDeviceNode->ui32SOCInterruptBit = ui32SOCInterruptBit; AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex); List_PVRSRV_DEVICE_NODE_Insert(&psSysData->psDeviceNodeList, psDeviceNode); *pui32DeviceIndex = psDeviceNode->sDevId.ui32DeviceIndex; return PVRSRV_OK; }
enum PVRSRV_ERROR PVRSRVRegisterDevice(struct SYS_DATA *psSysData, enum PVRSRV_ERROR(*pfnRegisterDevice) (struct PVRSRV_DEVICE_NODE *), u32 ui32SOCInterruptBit, u32 *pui32DeviceIndex) { enum PVRSRV_ERROR eError; struct PVRSRV_DEVICE_NODE *psDeviceNode; if (OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(struct PVRSRV_DEVICE_NODE), (void **) &psDeviceNode, NULL) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterDevice : " "Failed to alloc memory for psDeviceNode"); return PVRSRV_ERROR_OUT_OF_MEMORY; } OSMemSet(psDeviceNode, 0, sizeof(struct PVRSRV_DEVICE_NODE)); eError = pfnRegisterDevice(psDeviceNode); if (eError != PVRSRV_OK) { OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(struct PVRSRV_DEVICE_NODE), psDeviceNode, NULL); PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterDevice : " "Failed to register device"); return PVRSRV_ERROR_DEVICE_REGISTER_FAILED; } psDeviceNode->ui32RefCount = 1; psDeviceNode->psSysData = psSysData; psDeviceNode->ui32SOCInterruptBit = ui32SOCInterruptBit; AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex); psDeviceNode->psNext = psSysData->psDeviceNodeList; psSysData->psDeviceNodeList = psDeviceNode; *pui32DeviceIndex = psDeviceNode->sDevId.ui32DeviceIndex; return PVRSRV_OK; }
static enum PVRSRV_ERROR PVRSRVRegisterBCDeviceKM( struct PVRSRV_BC_SRV2BUFFER_KMJTABLE *psFuncTable, u32 *pui32DeviceID) { struct PVRSRV_BUFFERCLASS_INFO *psBCInfo = NULL; struct PVRSRV_DEVICE_NODE *psDeviceNode; struct SYS_DATA *psSysData; if (SysAcquireData(&psSysData) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterBCDeviceKM: Failed to get SysData"); return PVRSRV_ERROR_GENERIC; } if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(*psBCInfo), (void **) &psBCInfo, NULL) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterBCDeviceKM: Failed psBCInfo alloc"); return PVRSRV_ERROR_OUT_OF_MEMORY; } OSMemSet(psBCInfo, 0, sizeof(*psBCInfo)); if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_BC_SRV2BUFFER_KMJTABLE), (void **) &psBCInfo->psFuncTable, NULL) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterBCDeviceKM: Failed psFuncTable alloc"); goto ErrorExit; } OSMemSet(psBCInfo->psFuncTable, 0, sizeof(struct PVRSRV_BC_SRV2BUFFER_KMJTABLE)); *psBCInfo->psFuncTable = *psFuncTable; if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DEVICE_NODE), (void **) &psDeviceNode, NULL) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRegisterBCDeviceKM: Failed psDeviceNode alloc"); goto ErrorExit; } OSMemSet(psDeviceNode, 0, sizeof(struct PVRSRV_DEVICE_NODE)); psDeviceNode->pvDevice = (void *) psBCInfo; psDeviceNode->ui32pvDeviceSize = sizeof(*psBCInfo); psDeviceNode->ui32RefCount = 1; psDeviceNode->sDevId.eDeviceType = PVRSRV_DEVICE_TYPE_EXT; psDeviceNode->sDevId.eDeviceClass = PVRSRV_DEVICE_CLASS_BUFFER; psDeviceNode->psSysData = psSysData; AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex); psBCInfo->ui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex; if (pui32DeviceID) *pui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex; psDeviceNode->psNext = psSysData->psDeviceNodeList; psSysData->psDeviceNodeList = psDeviceNode; return PVRSRV_OK; ErrorExit: if (psBCInfo->psFuncTable) 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); return PVRSRV_ERROR_OUT_OF_MEMORY; }
PVRSRV_ERROR PVRSRVRegisterBCDeviceKM (PVRSRV_BC_SRV2BUFFER_KMJTABLE *psFuncTable, IMG_UINT32 *pui32DeviceID) { PVRSRV_BUFFERCLASS_INFO *psBCInfo = IMG_NULL; PVRSRV_DEVICE_NODE *psDeviceNode; SYS_DATA *psSysData; SysAcquireData(&psSysData); if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP, sizeof(*psBCInfo), (IMG_VOID **)&psBCInfo, IMG_NULL, "Buffer Class Info") != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed psBCInfo alloc")); return PVRSRV_ERROR_OUT_OF_MEMORY; } OSMemSet (psBCInfo, 0, sizeof(*psBCInfo)); if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE), (IMG_VOID **)&psBCInfo->psFuncTable, IMG_NULL, "Function table for SRVKM->BUFFER") != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed psFuncTable alloc")); goto ErrorExit; } OSMemSet (psBCInfo->psFuncTable, 0, sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE)); *psBCInfo->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,"PVRSRVRegisterBCDeviceKM: Failed psDeviceNode alloc")); goto ErrorExit; } OSMemSet (psDeviceNode, 0, sizeof(PVRSRV_DEVICE_NODE)); psDeviceNode->pvDevice = (IMG_VOID*)psBCInfo; psDeviceNode->ui32pvDeviceSize = sizeof(*psBCInfo); psDeviceNode->ui32RefCount = 1; psDeviceNode->sDevId.eDeviceType = PVRSRV_DEVICE_TYPE_EXT; psDeviceNode->sDevId.eDeviceClass = PVRSRV_DEVICE_CLASS_BUFFER; psDeviceNode->psSysData = psSysData; if (AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex) != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed to allocate Device ID")); goto ErrorExit; } psBCInfo->ui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex; if (pui32DeviceID) { *pui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex; } List_PVRSRV_DEVICE_NODE_Insert(&psSysData->psDeviceNodeList, psDeviceNode); return PVRSRV_OK; ErrorExit: if(psBCInfo->psFuncTable) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PPVRSRV_BC_SRV2BUFFER_KMJTABLE), psBCInfo->psFuncTable, IMG_NULL); psBCInfo->psFuncTable = IMG_NULL; } OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BUFFERCLASS_INFO), psBCInfo, IMG_NULL); return PVRSRV_ERROR_OUT_OF_MEMORY; }