IMG_BOOL IMG_CALLCONV PVRSRVSystemLISR(IMG_VOID *pvSysData) { SYS_DATA *psSysData = pvSysData; IMG_BOOL bStatus = IMG_FALSE; IMG_UINT32 ui32InterruptSource; IMG_UINT32 ui32ClearInterrupts = 0; if(!psSysData) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVSystemLISR: Invalid params\n")); } else { ui32InterruptSource = SysGetInterruptSource(psSysData, IMG_NULL); if(ui32InterruptSource) { List_PVRSRV_DEVICE_NODE_ForEach_va(psSysData->psDeviceNodeList, &PVRSRVSystemLISR_ForEachVaCb, &bStatus, &ui32InterruptSource, &ui32ClearInterrupts); SysClearInterrupts(psSysData, ui32ClearInterrupts); } } return bStatus; }
/*! ****************************************************************************** @Function PVRSRVSystemLISR @Description OS-independent System Low-level Interrupt Service Routine @Input pvSysData @Return IMG_BOOL : Whether any interrupts were serviced ******************************************************************************/ IMG_BOOL IMG_CALLCONV PVRSRVSystemLISR(IMG_VOID *pvSysData) { SYS_DATA *psSysData = pvSysData; IMG_BOOL bStatus = IMG_FALSE; IMG_UINT32 ui32InterruptSource; IMG_UINT32 ui32ClearInterrupts = 0; /* PVRSRV_DEVICE_NODE *psDeviceNode;*/ if(!psSysData) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVSystemLISR: Invalid params\n")); /* goto out; */ } else { /* query SOC for source of interrupts */ ui32InterruptSource = SysGetInterruptSource(psSysData, IMG_NULL); /* only proceed if PVR interrupts */ if(ui32InterruptSource) { /* traverse the devices' ISR handlers */ List_PVRSRV_DEVICE_NODE_ForEach_va(psSysData->psDeviceNodeList, &PVRSRVSystemLISR_ForEachVaCb, &bStatus, &ui32InterruptSource, &ui32ClearInterrupts); SysClearInterrupts(psSysData, ui32ClearInterrupts); } /*out:*/ } return bStatus; }
IMG_EXPORT PVRSRV_ERROR PVRSRVEnumerateDCKM (PVRSRV_DEVICE_CLASS DeviceClass, IMG_UINT32 *pui32DevCount, IMG_UINT32 *pui32DevID ) { IMG_UINT ui32DevCount = 0; SYS_DATA *psSysData; SysAcquireData(&psSysData); List_PVRSRV_DEVICE_NODE_ForEach_va(psSysData->psDeviceNodeList, PVRSRVEnumerateDCKM_ForEachVaCb, &ui32DevCount, &pui32DevID, DeviceClass); if(pui32DevCount) { *pui32DevCount = ui32DevCount; } else if(pui32DevID == IMG_NULL) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVEnumerateDCKM: Invalid parameters")); return (PVRSRV_ERROR_INVALID_PARAMS); } return PVRSRV_OK; }
IMG_VOID IMG_CALLCONV PVRSRVSetDCState(IMG_UINT32 ui32State) { SYS_DATA *psSysData; SysAcquireData(&psSysData); List_PVRSRV_DEVICE_NODE_ForEach_va(psSysData->psDeviceNodeList, PVRSRVSetDCState_ForEachVaCb, ui32State); }
/*! ****************************************************************************** @Function PVRSRVEnumerateDevicesKM @Description This function will enumerate all the devices supported by the PowerVR services within the target system. The function returns a list of the device ID strcutres stored either in the services or constructed in the user mode glue component in certain environments. The number of devices in the list is also returned. In a binary layered component which does not support dynamic runtime selection, the glue code should compile to return the supported devices statically, e.g. multiple instances of the same device if multiple devices are supported, or the target combination of MBX and display device. In the case of an environment (for instance) where one MBX1 may connect to two display devices this code would enumerate all three devices and even non-dynamic MBX1 selection code should retain the facility to parse the list to find the index of the MBX device @output pui32NumDevices : On success, contains the number of devices present in the system @output psDevIdList : Pointer to called supplied buffer to receive the list of PVRSRV_DEVICE_IDENTIFIER @return PVRSRV_ERROR : PVRSRV_NO_ERROR ******************************************************************************/ IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVEnumerateDevicesKM(IMG_UINT32 *pui32NumDevices, PVRSRV_DEVICE_IDENTIFIER *psDevIdList) { SYS_DATA *psSysData; /* PVRSRV_DEVICE_NODE *psDeviceNode; */ IMG_UINT32 i; if (!pui32NumDevices || !psDevIdList) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVEnumerateDevicesKM: Invalid params")); return PVRSRV_ERROR_INVALID_PARAMS; } SysAcquireData(&psSysData); /* setup input buffer to be `empty' */ for (i=0; i<PVRSRV_MAX_DEVICES; i++) { psDevIdList[i].eDeviceType = PVRSRV_DEVICE_TYPE_UNKNOWN; } /* and zero device count */ *pui32NumDevices = 0; /* Search through the device list for services managed devices return id info for each device and the number of devices available */ List_PVRSRV_DEVICE_NODE_ForEach_va(psSysData->psDeviceNodeList, &PVRSRVEnumerateDevicesKM_ForEachVaCb, pui32NumDevices, &psDevIdList); return PVRSRV_OK; }
IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVEnumerateDevicesKM(IMG_UINT32 *pui32NumDevices, PVRSRV_DEVICE_IDENTIFIER *psDevIdList) { SYS_DATA *psSysData; IMG_UINT32 i; if (!pui32NumDevices || !psDevIdList) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVEnumerateDevicesKM: Invalid params")); return PVRSRV_ERROR_INVALID_PARAMS; } SysAcquireData(&psSysData); for (i=0; i<PVRSRV_MAX_DEVICES; i++) { psDevIdList[i].eDeviceType = PVRSRV_DEVICE_TYPE_UNKNOWN; } *pui32NumDevices = 0; List_PVRSRV_DEVICE_NODE_ForEach_va(psSysData->psDeviceNodeList, &PVRSRVEnumerateDevicesKM_ForEachVaCb, pui32NumDevices, &psDevIdList); return PVRSRV_OK; }