/*! ****************************************************************************** @Function PVRSRVDevicePreClockSpeedChange @Description Notification from system layer that a device clock speed change is about to happen. @Input ui32DeviceIndex : device index @Input bIdleDevice : whether the device should be idled @Input pvInfo @Return IMG_VOID ******************************************************************************/ PVRSRV_ERROR PVRSRVDevicePreClockSpeedChange(IMG_UINT32 ui32DeviceIndex, IMG_BOOL bIdleDevice, IMG_VOID *pvInfo) { PVRSRV_ERROR eError = PVRSRV_OK; PVRSRV_DATA *psPVRSRVData = PVRSRVGetPVRSRVData(); PVRSRV_POWER_DEV *psPowerDevice; PVR_UNREFERENCED_PARAMETER(pvInfo); /*search the device and then do the pre clock speed change*/ psPowerDevice = (PVRSRV_POWER_DEV*) List_PVRSRV_POWER_DEV_Any_va(psPVRSRVData->psPowerDeviceList, &MatchPowerDeviceIndex_AnyVaCb, ui32DeviceIndex); do { /* This mutex is released in PVRSRVDevicePostClockSpeedChange. */ eError = PVRSRVPowerLock(); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVDevicePreClockSpeedChange : failed to acquire lock, error:0x%x", eError)); return eError; } if (psPowerDevice && psPowerDevice->pfnPostClockSpeedChange) { eError = psPowerDevice->pfnPreClockSpeedChange(psPowerDevice->hDevCookie, bIdleDevice, psPowerDevice->eCurrentPowerState); if ((eError != PVRSRV_OK) && (eError != PVRSRV_ERROR_DEVICE_POWER_CHANGE_DENIED)) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVDevicePreClockSpeedChange : Device %u failed, error:0x%x", ui32DeviceIndex, eError)); } else if (eError == PVRSRV_ERROR_DEVICE_POWER_CHANGE_DENIED) { PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVDevicePreClockSpeedChange : Device %u denied transition to IDLE", ui32DeviceIndex)); PVRSRVPowerUnlock(); OSSleepms(1); } } } while (eError == PVRSRV_ERROR_DEVICE_POWER_CHANGE_DENIED); if (eError != PVRSRV_OK) { PVRSRVPowerUnlock(); } return eError; }
IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PollForValueKM (volatile IMG_UINT32* pui32LinMemAddr, IMG_UINT32 ui32Value, IMG_UINT32 ui32Mask, IMG_UINT32 ui32Timeoutus, IMG_UINT32 ui32PollPeriodus, IMG_BOOL bAllowPreemption) { { IMG_UINT32 ui32ActualValue = 0xFFFFFFFFU; if (bAllowPreemption) { PVR_ASSERT(ui32PollPeriodus >= 1000); } LOOP_UNTIL_TIMEOUT(ui32Timeoutus) { ui32ActualValue = (*pui32LinMemAddr & ui32Mask); if(ui32ActualValue == ui32Value) { return PVRSRV_OK; } if (bAllowPreemption) { OSSleepms(ui32PollPeriodus / 1000); } else { OSWaitus(ui32PollPeriodus); } } END_LOOP_UNTIL_TIMEOUT(); PVR_DPF((PVR_DBG_ERROR,"PollForValueKM: Timeout. Expected 0x%x but found 0x%x (mask 0x%x).", ui32Value, ui32ActualValue, ui32Mask)); } return PVRSRV_ERROR_TIMEOUT; }
IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PollForValueKM (volatile IMG_UINT32* pui32LinMemAddr, IMG_UINT32 ui32Value, IMG_UINT32 ui32Mask, IMG_UINT32 ui32Timeoutus, IMG_UINT32 ui32PollPeriodus, IMG_BOOL bAllowPreemption) { #if defined (EMULATOR) { PVR_UNREFERENCED_PARAMETER(bAllowPreemption); #if !defined(__linux__) PVR_UNREFERENCED_PARAMETER(ui32PollPeriodus); #endif do { if((*pui32LinMemAddr & ui32Mask) == ui32Value) { return PVRSRV_OK; } #if defined(__linux__) OSWaitus(ui32PollPeriodus); #else OSReleaseThreadQuanta(); #endif } while (ui32Timeoutus); } #else { IMG_UINT32 ui32ActualValue = 0xFFFFFFFFU; if (bAllowPreemption) { PVR_ASSERT(ui32PollPeriodus >= 1000); } LOOP_UNTIL_TIMEOUT(ui32Timeoutus) { ui32ActualValue = (*pui32LinMemAddr & ui32Mask); if(ui32ActualValue == ui32Value) { return PVRSRV_OK; } if (bAllowPreemption) { OSSleepms(ui32PollPeriodus / 1000); } else { OSWaitus(ui32PollPeriodus); } } END_LOOP_UNTIL_TIMEOUT(); PVR_DPF((PVR_DBG_ERROR,"PollForValueKM: Timeout. Expected 0x%x but found 0x%x (mask 0x%x).", ui32Value, ui32ActualValue, ui32Mask)); } #endif return PVRSRV_ERROR_TIMEOUT; }
IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PollForValueKM (volatile IMG_UINT32* pui32LinMemAddr, IMG_UINT32 ui32Value, IMG_UINT32 ui32Mask, IMG_UINT32 ui32Timeoutus, IMG_UINT32 ui32PollPeriodus, IMG_BOOL bAllowPreemption) { #if defined (EMULATOR) { PVR_UNREFERENCED_PARAMETER(bAllowPreemption); #if !defined(__linux__) PVR_UNREFERENCED_PARAMETER(ui32PollPeriodus); #endif /* For the Emulator we want the system to stop when a lock-up is detected so the state can be analysed. * Also the Emulator is much slower than real silicon so timeouts are not valid. */ do { if((*pui32LinMemAddr & ui32Mask) == ui32Value) { return PVRSRV_OK; } #if defined(__linux__) OSWaitus(ui32PollPeriodus); #else OSReleaseThreadQuanta(); #endif } while (ui32Timeoutus); /* Endless loop only for the Emulator */ } #else { IMG_UINT32 ui32ActualValue = 0xFFFFFFFFU; /* Initialiser only required to prevent incorrect warning */ if (bAllowPreemption) { PVR_ASSERT(ui32PollPeriodus >= 1000); } /* PRQA S 3415,4109 1 */ /* macro format critical - leave alone */ LOOP_UNTIL_TIMEOUT(ui32Timeoutus) { ui32ActualValue = (*pui32LinMemAddr & ui32Mask); if(ui32ActualValue == ui32Value) { return PVRSRV_OK; } if (bAllowPreemption) { OSSleepms(ui32PollPeriodus / 1000); } else { OSWaitus(ui32PollPeriodus); } } END_LOOP_UNTIL_TIMEOUT(); PVR_DPF((PVR_DBG_ERROR,"PollForValueKM: Timeout. Expected 0x%x but found 0x%x (mask 0x%x).", ui32Value, ui32ActualValue, ui32Mask)); } #endif /* #if defined (EMULATOR) */ return PVRSRV_ERROR_TIMEOUT; }