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_BOOL IMG_CALLCONV PVRSRVDeviceLISR(PVRSRV_DEVICE_NODE *psDeviceNode) { SYS_DATA *psSysData; IMG_BOOL bStatus = IMG_FALSE; IMG_UINT32 ui32InterruptSource; if(!psDeviceNode) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVDeviceLISR: Invalid params\n")); goto out; } psSysData = psDeviceNode->psSysData; ui32InterruptSource = SysGetInterruptSource(psSysData, psDeviceNode); if(ui32InterruptSource & psDeviceNode->ui32SOCInterruptBit) { if(psDeviceNode->pfnDeviceISR != IMG_NULL) { bStatus = (*psDeviceNode->pfnDeviceISR)(psDeviceNode->pvISRData); } SysClearInterrupts(psSysData, psDeviceNode->ui32SOCInterruptBit); } out: return bStatus; }
IMG_BOOL PVRSRVSystemLISR(void *pvSysData) { struct SYS_DATA *psSysData = pvSysData; IMG_BOOL bStatus = IMG_FALSE; u32 ui32InterruptSource; u32 ui32ClearInterrupts = 0; struct PVRSRV_DEVICE_NODE *psDeviceNode; if (!psSysData) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVSystemLISR: Invalid params\n"); goto out; } ui32InterruptSource = SysGetInterruptSource(psSysData, NULL); if (ui32InterruptSource == 0) goto out; psDeviceNode = psSysData->psDeviceNodeList; while (psDeviceNode != NULL) { if (psDeviceNode->pfnDeviceISR != NULL) if (ui32InterruptSource & psDeviceNode-> ui32SOCInterruptBit) { if ((*psDeviceNode->pfnDeviceISR) (psDeviceNode->pvISRData)) bStatus = IMG_TRUE; ui32ClearInterrupts |= psDeviceNode->ui32SOCInterruptBit; } psDeviceNode = psDeviceNode->psNext; } SysClearInterrupts(psSysData, ui32ClearInterrupts); out: return bStatus; }