summaryrefslogtreecommitdiffstats
path: root/pvr-source/services4/srvkm/common/power.c
diff options
context:
space:
mode:
Diffstat (limited to 'pvr-source/services4/srvkm/common/power.c')
-rwxr-xr-xpvr-source/services4/srvkm/common/power.c996
1 files changed, 0 insertions, 996 deletions
diff --git a/pvr-source/services4/srvkm/common/power.c b/pvr-source/services4/srvkm/common/power.c
deleted file mode 100755
index 511a690..0000000
--- a/pvr-source/services4/srvkm/common/power.c
+++ /dev/null
@@ -1,996 +0,0 @@
-/*************************************************************************/ /*!
-@Title Power management functions
-@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
-@Description Main APIs for power management functions
-@License Dual MIT/GPLv2
-
-The contents of this file are subject to the MIT license as set out below.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-Alternatively, the contents of this file may be used under the terms of
-the GNU General Public License Version 2 ("GPL") in which case the provisions
-of GPL are applicable instead of those above.
-
-If you wish to allow use of your version of this file only under the terms of
-GPL, and not to allow others to use your version of this file under the terms
-of the MIT license, indicate your decision by deleting the provisions above
-and replace them with the notice and other provisions required by GPL as set
-out in the file called "GPL-COPYING" included in this distribution. If you do
-not delete the provisions above, a recipient may use your version of this file
-under the terms of either the MIT license or GPL.
-
-This License is also included in this distribution in the file called
-"MIT-COPYING".
-
-EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
-PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/ /**************************************************************************/
-
-#include "services_headers.h"
-#include "pdump_km.h"
-
-#include "lists.h"
-
-static IMG_BOOL gbInitServerRunning = IMG_FALSE;
-static IMG_BOOL gbInitServerRan = IMG_FALSE;
-static IMG_BOOL gbInitSuccessful = IMG_FALSE;
-
-/*!
-******************************************************************************
-
- @Function PVRSRVSetInitServerState
-
- @Description Sets given services init state.
-
- @Input eInitServerState : a services init state
- @Input bState : a state to set
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSetInitServerState(PVRSRV_INIT_SERVER_STATE eInitServerState, IMG_BOOL bState)
-{
-
- switch(eInitServerState)
- {
- case PVRSRV_INIT_SERVER_RUNNING:
- gbInitServerRunning = bState;
- break;
- case PVRSRV_INIT_SERVER_RAN:
- gbInitServerRan = bState;
- break;
- case PVRSRV_INIT_SERVER_SUCCESSFUL:
- gbInitSuccessful = bState;
- break;
- default:
- PVR_DPF((PVR_DBG_ERROR,
- "PVRSRVSetInitServerState : Unknown state %x", eInitServerState));
- return PVRSRV_ERROR_UNKNOWN_INIT_SERVER_STATE;
- }
-
- return PVRSRV_OK;
-}
-
-/*!
-******************************************************************************
-
- @Function PVRSRVGetInitServerState
-
- @Description Tests whether a given services init state was run.
-
- @Input eInitServerState : a services init state
-
- @Return IMG_BOOL
-
-******************************************************************************/
-IMG_EXPORT
-IMG_BOOL PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_STATE eInitServerState)
-{
- IMG_BOOL bReturnVal;
-
- switch(eInitServerState)
- {
- case PVRSRV_INIT_SERVER_RUNNING:
- bReturnVal = gbInitServerRunning;
- break;
- case PVRSRV_INIT_SERVER_RAN:
- bReturnVal = gbInitServerRan;
- break;
- case PVRSRV_INIT_SERVER_SUCCESSFUL:
- bReturnVal = gbInitSuccessful;
- break;
- default:
- PVR_DPF((PVR_DBG_ERROR,
- "PVRSRVGetInitServerState : Unknown state %x", eInitServerState));
- bReturnVal = IMG_FALSE;
- }
-
- return bReturnVal;
-}
-
-/*!
-******************************************************************************
-
- @Function _IsSystemStatePowered
-
- @Description Tests whether a given system state represents powered-up.
-
- @Input eSystemPowerState : a system power state
-
- @Return IMG_BOOL
-
-******************************************************************************/
-static IMG_BOOL _IsSystemStatePowered(PVRSRV_SYS_POWER_STATE eSystemPowerState)
-{
- return (IMG_BOOL)(eSystemPowerState < PVRSRV_SYS_POWER_STATE_D2);
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVPowerLock
-
- @Description Obtain the mutex for power transitions
-
- @Input ui32CallerID : KERNEL_ID or ISR_ID
- @Input bSystemPowerEvent : Only pass IMG_TRUE if the lock is for a
- system power state change
-
- @Return PVRSRV_ERROR IMG_CALLCONV
-
-******************************************************************************/
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVPowerLock(IMG_UINT32 ui32CallerID,
- IMG_BOOL bSystemPowerEvent)
-{
- PVRSRV_ERROR eError;
- SYS_DATA *psSysData;
- IMG_UINT32 ui32Timeout = 1000000;
- IMG_BOOL bTryLock = (ui32CallerID == ISR_ID);
-
- SysAcquireData(&psSysData);
-
- eError = OSPowerLockWrap(bTryLock);
- if (eError != PVRSRV_OK)
- {
- return eError;
- }
-
- do
- {
- eError = OSLockResource(&psSysData->sPowerStateChangeResource,
- ui32CallerID);
- if (eError == PVRSRV_OK)
- {
- break;
- }
- else if (bTryLock)
- {
- /*
- ISR failed to acquire lock so it must be held by a kernel thread.
- */
- eError = PVRSRV_ERROR_RETRY;
- break;
- }
-
- OSWaitus(1);
- ui32Timeout--;
- } while (ui32Timeout > 0);
-
- if (eError != PVRSRV_OK)
- {
- OSPowerLockUnwrap();
- }
-
- /* PRQA S 3415 3 */ /* side effects desired */
- if ((eError == PVRSRV_OK) &&
- !bSystemPowerEvent &&
- !_IsSystemStatePowered(psSysData->eCurrentPowerState))
- {
- /* Reject device power state change due to system power state. */
- PVRSRVPowerUnlock(ui32CallerID);
- eError = PVRSRV_ERROR_RETRY;
- }
-
- return eError;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVPowerUnlock
-
- @Description Release the mutex for power transitions
-
- @Input ui32CallerID : KERNEL_ID or ISR_ID
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-IMG_EXPORT
-IMG_VOID PVRSRVPowerUnlock(IMG_UINT32 ui32CallerID)
-{
- OSUnlockResource(&gpsSysData->sPowerStateChangeResource, ui32CallerID);
- OSPowerLockUnwrap();
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVDevicePrePowerStateKM_AnyVaCb
-
- @Description
-
- Perform device-specific processing required before a power transition
-
- @Input psPowerDevice : the device
- @Input va : variable argument list with:
- bAllDevices : IMG_TRUE - All devices
- IMG_FALSE - Use ui32DeviceIndex
- ui32DeviceIndex : device index
- eNewPowerState : New power state
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-static PVRSRV_ERROR PVRSRVDevicePrePowerStateKM_AnyVaCb(PVRSRV_POWER_DEV *psPowerDevice, va_list va)
-{
- PVRSRV_DEV_POWER_STATE eNewDevicePowerState;
- PVRSRV_ERROR eError;
-
- /*Variable Argument variables*/
- IMG_BOOL bAllDevices;
- IMG_UINT32 ui32DeviceIndex;
- PVRSRV_DEV_POWER_STATE eNewPowerState;
-
- /* WARNING: if types were not aligned to 4 bytes, this could be dangerous. */
- bAllDevices = va_arg(va, IMG_BOOL);
- ui32DeviceIndex = va_arg(va, IMG_UINT32);
- eNewPowerState = va_arg(va, PVRSRV_DEV_POWER_STATE);
-
- if (bAllDevices || (ui32DeviceIndex == psPowerDevice->ui32DeviceIndex))
- {
- eNewDevicePowerState = (eNewPowerState == PVRSRV_DEV_POWER_STATE_DEFAULT) ?
- psPowerDevice->eDefaultPowerState : eNewPowerState;
-
- if (psPowerDevice->eCurrentPowerState != eNewDevicePowerState)
- {
- if (psPowerDevice->pfnPrePower != IMG_NULL)
- {
- /* Call the device's power callback. */
- eError = psPowerDevice->pfnPrePower(psPowerDevice->hDevCookie,
- eNewDevicePowerState,
- psPowerDevice->eCurrentPowerState);
- if (eError != PVRSRV_OK)
- {
- return eError;
- }
- }
-
- /* Do any required system-layer processing. */
- eError = SysDevicePrePowerState(psPowerDevice->ui32DeviceIndex,
- eNewDevicePowerState,
- psPowerDevice->eCurrentPowerState);
- if (eError != PVRSRV_OK)
- {
- return eError;
- }
- }
- }
-
- return PVRSRV_OK;
-}
-
-/*!
-******************************************************************************
-
- @Function PVRSRVDevicePrePowerStateKM
-
- @Description
-
- Perform device-specific processing required before a power transition
-
- @Input bAllDevices : IMG_TRUE - All devices
- IMG_FALSE - Use ui32DeviceIndex
- @Input ui32DeviceIndex : device index
- @Input eNewPowerState : New power state
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-static
-PVRSRV_ERROR PVRSRVDevicePrePowerStateKM(IMG_BOOL bAllDevices,
- IMG_UINT32 ui32DeviceIndex,
- PVRSRV_DEV_POWER_STATE eNewPowerState)
-{
- PVRSRV_ERROR eError;
- SYS_DATA *psSysData;
-
- SysAcquireData(&psSysData);
-
- /* Loop through the power devices. */
- eError = List_PVRSRV_POWER_DEV_PVRSRV_ERROR_Any_va(psSysData->psPowerDeviceList,
- &PVRSRVDevicePrePowerStateKM_AnyVaCb,
- bAllDevices,
- ui32DeviceIndex,
- eNewPowerState);
-
- return eError;
-}
-
-/*!
-******************************************************************************
-
- @Function PVRSRVDevicePostPowerStateKM_AnyVaCb
-
- @Description
-
- Perform device-specific processing required after a power transition
-
- @Input psPowerDevice : the device
- @Input va : variable argument list with:
- bAllDevices : IMG_TRUE - All devices
- IMG_FALSE - Use ui32DeviceIndex
- ui32DeviceIndex : device index
- eNewPowerState : New power state
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-static PVRSRV_ERROR PVRSRVDevicePostPowerStateKM_AnyVaCb(PVRSRV_POWER_DEV *psPowerDevice, va_list va)
-{
- PVRSRV_DEV_POWER_STATE eNewDevicePowerState;
- PVRSRV_ERROR eError;
-
- /*Variable Argument variables*/
- IMG_BOOL bAllDevices;
- IMG_UINT32 ui32DeviceIndex;
- PVRSRV_DEV_POWER_STATE eNewPowerState;
-
- /* WARNING: if types were not aligned to 4 bytes, this could be dangerous. */
- bAllDevices = va_arg(va, IMG_BOOL);
- ui32DeviceIndex = va_arg(va, IMG_UINT32);
- eNewPowerState = va_arg(va, PVRSRV_DEV_POWER_STATE);
-
- if (bAllDevices || (ui32DeviceIndex == psPowerDevice->ui32DeviceIndex))
- {
- eNewDevicePowerState = (eNewPowerState == PVRSRV_DEV_POWER_STATE_DEFAULT) ?
- psPowerDevice->eDefaultPowerState : eNewPowerState;
-
- if (psPowerDevice->eCurrentPowerState != eNewDevicePowerState)
- {
- /* Do any required system-layer processing. */
- eError = SysDevicePostPowerState(psPowerDevice->ui32DeviceIndex,
- eNewDevicePowerState,
- psPowerDevice->eCurrentPowerState);
- if (eError != PVRSRV_OK)
- {
- return eError;
- }
-
- if (psPowerDevice->pfnPostPower != IMG_NULL)
- {
- /* Call the device's power callback. */
- eError = psPowerDevice->pfnPostPower(psPowerDevice->hDevCookie,
- eNewDevicePowerState,
- psPowerDevice->eCurrentPowerState);
- if (eError != PVRSRV_OK)
- {
- return eError;
- }
- }
-
- psPowerDevice->eCurrentPowerState = eNewDevicePowerState;
- }
- }
- return PVRSRV_OK;
-}
-
-/*!
-******************************************************************************
-
- @Function PVRSRVDevicePostPowerStateKM
-
- @Description
-
- Perform device-specific processing required after a power transition
-
- @Input bAllDevices : IMG_TRUE - All devices
- IMG_FALSE - Use ui32DeviceIndex
- @Input ui32DeviceIndex : device index
- @Input eNewPowerState : New power state
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-static
-PVRSRV_ERROR PVRSRVDevicePostPowerStateKM(IMG_BOOL bAllDevices,
- IMG_UINT32 ui32DeviceIndex,
- PVRSRV_DEV_POWER_STATE eNewPowerState)
-{
- PVRSRV_ERROR eError;
- SYS_DATA *psSysData;
-
- SysAcquireData(&psSysData);
-
- /* Loop through the power devices. */
- eError = List_PVRSRV_POWER_DEV_PVRSRV_ERROR_Any_va(psSysData->psPowerDeviceList,
- &PVRSRVDevicePostPowerStateKM_AnyVaCb,
- bAllDevices,
- ui32DeviceIndex,
- eNewPowerState);
-
- return eError;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVSetDevicePowerStateKM
-
- @Description Set the Device into a new state
-
- @Input ui32DeviceIndex : device index
- @Input eNewPowerState : New power state
- @Input ui32CallerID : KERNEL_ID or ISR_ID
- @Input bRetainMutex : If true, the power mutex is retained on exit
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSetDevicePowerStateKM(IMG_UINT32 ui32DeviceIndex,
- PVRSRV_DEV_POWER_STATE eNewPowerState)
-{
- PVRSRV_ERROR eError;
- SYS_DATA *psSysData;
-
- SysAcquireData(&psSysData);
-
- #if defined(PDUMP)
- if (eNewPowerState == PVRSRV_DEV_POWER_STATE_DEFAULT)
- {
- /*
- Pdump a power-up regardless of the default state.
- Then disable pdump and transition to the default power state.
- This ensures that a power-up is always present in the pdump when necessary.
- */
- eError = PVRSRVDevicePrePowerStateKM(IMG_FALSE, ui32DeviceIndex, PVRSRV_DEV_POWER_STATE_ON);
- if(eError != PVRSRV_OK)
- {
- goto Exit;
- }
-
- eError = PVRSRVDevicePostPowerStateKM(IMG_FALSE, ui32DeviceIndex, PVRSRV_DEV_POWER_STATE_ON);
-
- if (eError != PVRSRV_OK)
- {
- goto Exit;
- }
-
- PDUMPSUSPEND();
- }
- #endif /* PDUMP */
-
- eError = PVRSRVDevicePrePowerStateKM(IMG_FALSE, ui32DeviceIndex, eNewPowerState);
- if(eError != PVRSRV_OK)
- {
- if (eNewPowerState == PVRSRV_DEV_POWER_STATE_DEFAULT)
- {
- PDUMPRESUME();
- }
- goto Exit;
- }
-
- eError = PVRSRVDevicePostPowerStateKM(IMG_FALSE, ui32DeviceIndex, eNewPowerState);
-
- if (eNewPowerState == PVRSRV_DEV_POWER_STATE_DEFAULT)
- {
- PDUMPRESUME();
- }
-
-Exit:
-
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,
- "PVRSRVSetDevicePowerStateKM : Transition to %d FAILED 0x%x", eNewPowerState, eError));
- }
-
- return eError;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVSystemPrePowerStateKM
-
- @Description Perform processing required before a system power transition
-
- @Input eNewSysPowerState :
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSystemPrePowerStateKM(PVRSRV_SYS_POWER_STATE eNewSysPowerState)
-{
- PVRSRV_ERROR eError;
- SYS_DATA *psSysData;
- PVRSRV_DEV_POWER_STATE eNewDevicePowerState;
-
- SysAcquireData(&psSysData);
-
- /* This mutex is unlocked in PVRSRVSystemPostPowerStateKM() */
- eError = PVRSRVPowerLock(KERNEL_ID, IMG_TRUE);
- if(eError != PVRSRV_OK)
- {
- return eError;
- }
-
- if (_IsSystemStatePowered(eNewSysPowerState) !=
- _IsSystemStatePowered(psSysData->eCurrentPowerState))
- {
- if (_IsSystemStatePowered(eNewSysPowerState))
- {
- /* Return device back to its default state. */
- eNewDevicePowerState = PVRSRV_DEV_POWER_STATE_DEFAULT;
- }
- else
- {
- eNewDevicePowerState = PVRSRV_DEV_POWER_STATE_OFF;
- }
-
- /* Perform device-specific transitions. */
- eError = PVRSRVDevicePrePowerStateKM(IMG_TRUE, 0, eNewDevicePowerState);
- if (eError != PVRSRV_OK)
- {
- goto ErrorExit;
- }
- }
-
- if (eNewSysPowerState != psSysData->eCurrentPowerState)
- {
- /* Perform system-specific power transitions. */
- eError = SysSystemPrePowerState(eNewSysPowerState);
- if (eError != PVRSRV_OK)
- {
- goto ErrorExit;
- }
- }
-
- return eError;
-
-ErrorExit:
-
- PVR_DPF((PVR_DBG_ERROR,
- "PVRSRVSystemPrePowerStateKM: Transition from %d to %d FAILED 0x%x",
- psSysData->eCurrentPowerState, eNewSysPowerState, eError));
-
- /* save the power state for the re-attempt */
- psSysData->eFailedPowerState = eNewSysPowerState;
-
- PVRSRVPowerUnlock(KERNEL_ID);
-
- return eError;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVSystemPostPowerStateKM
-
- @Description Perform processing required after a system power transition
-
- @Input eNewSysPowerState :
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSystemPostPowerStateKM(PVRSRV_SYS_POWER_STATE eNewSysPowerState)
-{
- PVRSRV_ERROR eError = PVRSRV_OK;
- SYS_DATA *psSysData;
- PVRSRV_DEV_POWER_STATE eNewDevicePowerState;
-
- SysAcquireData(&psSysData);
-
- if (eNewSysPowerState != psSysData->eCurrentPowerState)
- {
- /* Perform system-specific power transitions. */
- eError = SysSystemPostPowerState(eNewSysPowerState);
- if (eError != PVRSRV_OK)
- {
- goto Exit;
- }
- }
-
- if (_IsSystemStatePowered(eNewSysPowerState) !=
- _IsSystemStatePowered(psSysData->eCurrentPowerState))
- {
- if (_IsSystemStatePowered(eNewSysPowerState))
- {
- /* Return device back to its default state. */
- eNewDevicePowerState = PVRSRV_DEV_POWER_STATE_DEFAULT;
- }
- else
- {
- eNewDevicePowerState = PVRSRV_DEV_POWER_STATE_OFF;
- }
-
- /* Perform device-specific power transitions. */
- eError = PVRSRVDevicePostPowerStateKM(IMG_TRUE, 0, eNewDevicePowerState);
- if (eError != PVRSRV_OK)
- {
- goto Exit;
- }
- }
-
- PVR_DPF((PVR_DBG_MESSAGE,
- "PVRSRVSystemPostPowerStateKM: System Power Transition from %d to %d OK",
- psSysData->eCurrentPowerState, eNewSysPowerState));
-
- psSysData->eCurrentPowerState = eNewSysPowerState;
-
-Exit:
-
- PVRSRVPowerUnlock(KERNEL_ID);
-
- /* PRQA S 3415 2 */ /* side effects desired */
- if (_IsSystemStatePowered(eNewSysPowerState) &&
- PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL))
- {
- /*
- Reprocess the devices' queues in case commands were blocked during
- the power transition.
- */
- PVRSRVScheduleDeviceCallbacks();
- }
-
- return eError;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVSetPowerStateKM
-
- @Description Set the system into a new state
-
- @Input eNewPowerState :
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-IMG_EXPORT
-PVRSRV_ERROR PVRSRVSetPowerStateKM(PVRSRV_SYS_POWER_STATE eNewSysPowerState)
-{
- PVRSRV_ERROR eError;
- SYS_DATA *psSysData;
-
- SysAcquireData(&psSysData);
-
- eError = PVRSRVSystemPrePowerStateKM(eNewSysPowerState);
- if(eError != PVRSRV_OK)
- {
- goto ErrorExit;
- }
-
- eError = PVRSRVSystemPostPowerStateKM(eNewSysPowerState);
- if(eError != PVRSRV_OK)
- {
- goto ErrorExit;
- }
-
- /* save new power state */
- psSysData->eFailedPowerState = PVRSRV_SYS_POWER_STATE_Unspecified;
-
- return PVRSRV_OK;
-
-ErrorExit:
-
- PVR_DPF((PVR_DBG_ERROR,
- "PVRSRVSetPowerStateKM: Transition from %d to %d FAILED 0x%x",
- psSysData->eCurrentPowerState, eNewSysPowerState, eError));
-
- /* save the power state for the re-attempt */
- psSysData->eFailedPowerState = eNewSysPowerState;
-
- return eError;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVRegisterPowerDevice
-
- @Description
-
- Registers a device with the power manager. Passes Pre/Post Power handlers
- and private device handle to be passed to power handlers
-
- @Input ui32DeviceIndex : device index
- @Input pfnPrePower : Pre power transition handler
- @Input pfnPostPower : Post power transition handler
- @Input pfnPreClockSpeedChange : Pre clock speed transition handler (if required)
- @Input pfnPostClockSpeedChange : Post clock speed transition handler (if required)
- @Input hDevCookie : Dev cookie for dev power handlers
- @Input eCurrentPowerState : Current power state of the device
- @Input eDefaultPowerState : Default power state of the device
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-PVRSRV_ERROR PVRSRVRegisterPowerDevice(IMG_UINT32 ui32DeviceIndex,
- PFN_PRE_POWER pfnPrePower,
- PFN_POST_POWER pfnPostPower,
- PFN_PRE_CLOCKSPEED_CHANGE pfnPreClockSpeedChange,
- PFN_POST_CLOCKSPEED_CHANGE pfnPostClockSpeedChange,
- IMG_HANDLE hDevCookie,
- PVRSRV_DEV_POWER_STATE eCurrentPowerState,
- PVRSRV_DEV_POWER_STATE eDefaultPowerState)
-{
- PVRSRV_ERROR eError;
- SYS_DATA *psSysData;
- PVRSRV_POWER_DEV *psPowerDevice;
-
- if (pfnPrePower == IMG_NULL &&
- pfnPostPower == IMG_NULL)
- {
- return PVRSRVRemovePowerDevice(ui32DeviceIndex);
- }
-
- SysAcquireData(&psSysData);
-
- eError = OSAllocMem( PVRSRV_OS_NON_PAGEABLE_HEAP,
- sizeof(PVRSRV_POWER_DEV),
- (IMG_VOID **)&psPowerDevice, IMG_NULL,
- "Power Device");
- if(eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterPowerDevice: Failed to alloc PVRSRV_POWER_DEV"));
- return eError;
- }
-
- /* setup device for power manager */
- psPowerDevice->pfnPrePower = pfnPrePower;
- psPowerDevice->pfnPostPower = pfnPostPower;
- psPowerDevice->pfnPreClockSpeedChange = pfnPreClockSpeedChange;
- psPowerDevice->pfnPostClockSpeedChange = pfnPostClockSpeedChange;
- psPowerDevice->hDevCookie = hDevCookie;
- psPowerDevice->ui32DeviceIndex = ui32DeviceIndex;
- psPowerDevice->eCurrentPowerState = eCurrentPowerState;
- psPowerDevice->eDefaultPowerState = eDefaultPowerState;
-
- /* insert into power device list */
- List_PVRSRV_POWER_DEV_Insert(&(psSysData->psPowerDeviceList), psPowerDevice);
-
- return (PVRSRV_OK);
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVRemovePowerDevice
-
- @Description
-
- Removes device from power management register. Device is located by Device Index
-
- @Input ui32DeviceIndex : device index
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-PVRSRV_ERROR PVRSRVRemovePowerDevice (IMG_UINT32 ui32DeviceIndex)
-{
- SYS_DATA *psSysData;
- PVRSRV_POWER_DEV *psPowerDev;
-
- SysAcquireData(&psSysData);
-
- /* find device in list and remove it */
- psPowerDev = (PVRSRV_POWER_DEV*)
- List_PVRSRV_POWER_DEV_Any_va(psSysData->psPowerDeviceList,
- &MatchPowerDeviceIndex_AnyVaCb,
- ui32DeviceIndex);
-
- if (psPowerDev)
- {
- List_PVRSRV_POWER_DEV_Remove(psPowerDev);
- OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_POWER_DEV), psPowerDev, IMG_NULL);
- /*not nulling pointer, copy on stack*/
- }
-
- return (PVRSRV_OK);
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVIsDevicePowered
-
- @Description
-
- Whether the device is powered, for the purposes of lockup detection.
-
- @Input ui32DeviceIndex : device index
-
- @Return IMG_BOOL
-
-******************************************************************************/
-IMG_EXPORT
-IMG_BOOL PVRSRVIsDevicePowered(IMG_UINT32 ui32DeviceIndex)
-{
- SYS_DATA *psSysData;
- PVRSRV_POWER_DEV *psPowerDevice;
-
- SysAcquireData(&psSysData);
-
- /* PRQA S 3415 2 */ /* order not important */
- if (OSIsResourceLocked(&psSysData->sPowerStateChangeResource, KERNEL_ID) ||
- OSIsResourceLocked(&psSysData->sPowerStateChangeResource, ISR_ID))
- {
- return IMG_FALSE;
- }
-
- psPowerDevice = (PVRSRV_POWER_DEV*)
- List_PVRSRV_POWER_DEV_Any_va(psSysData->psPowerDeviceList,
- &MatchPowerDeviceIndex_AnyVaCb,
- ui32DeviceIndex);
- return (psPowerDevice && (psPowerDevice->eCurrentPowerState == PVRSRV_DEV_POWER_STATE_ON))
- ? IMG_TRUE : IMG_FALSE;
-}
-
-
-/*!
-******************************************************************************
-
- @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;
- SYS_DATA *psSysData;
- PVRSRV_POWER_DEV *psPowerDevice;
-
- PVR_UNREFERENCED_PARAMETER(pvInfo);
-
- SysAcquireData(&psSysData);
-
- if (bIdleDevice)
- {
- /* This mutex is released in PVRSRVDevicePostClockSpeedChange. */
- eError = PVRSRVPowerLock(KERNEL_ID, IMG_FALSE);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PVRSRVDevicePreClockSpeedChange : failed to acquire lock, error:0x%x", eError));
- return eError;
- }
- }
-
- /*search the device and then do the pre clock speed change*/
- psPowerDevice = (PVRSRV_POWER_DEV*)
- List_PVRSRV_POWER_DEV_Any_va(psSysData->psPowerDeviceList,
- &MatchPowerDeviceIndex_AnyVaCb,
- ui32DeviceIndex);
-
- if (psPowerDevice && psPowerDevice->pfnPostClockSpeedChange)
- {
- eError = psPowerDevice->pfnPreClockSpeedChange(psPowerDevice->hDevCookie,
- bIdleDevice,
- psPowerDevice->eCurrentPowerState);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,
- "PVRSRVDevicePreClockSpeedChange : Device %u failed, error:0x%x",
- ui32DeviceIndex, eError));
- }
- }
-
- if (bIdleDevice && eError != PVRSRV_OK)
- {
- PVRSRVPowerUnlock(KERNEL_ID);
- }
-
- return eError;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PVRSRVDevicePostClockSpeedChange
-
- @Description
-
- Notification from system layer that a device clock speed change has just happened.
-
- @Input ui32DeviceIndex : device index
- @Input bIdleDevice : whether the device had been idled
- @Input pvInfo
-
- @Return IMG_VOID
-
-******************************************************************************/
-IMG_VOID PVRSRVDevicePostClockSpeedChange(IMG_UINT32 ui32DeviceIndex,
- IMG_BOOL bIdleDevice,
- IMG_VOID *pvInfo)
-{
- PVRSRV_ERROR eError;
- SYS_DATA *psSysData;
- PVRSRV_POWER_DEV *psPowerDevice;
-
- PVR_UNREFERENCED_PARAMETER(pvInfo);
-
- SysAcquireData(&psSysData);
-
- /*search the device and then do the post clock speed change*/
- psPowerDevice = (PVRSRV_POWER_DEV*)
- List_PVRSRV_POWER_DEV_Any_va(psSysData->psPowerDeviceList,
- &MatchPowerDeviceIndex_AnyVaCb,
- ui32DeviceIndex);
-
- if (psPowerDevice && psPowerDevice->pfnPostClockSpeedChange)
- {
- eError = psPowerDevice->pfnPostClockSpeedChange(psPowerDevice->hDevCookie,
- bIdleDevice,
- psPowerDevice->eCurrentPowerState);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR,
- "PVRSRVDevicePostClockSpeedChange : Device %u failed, error:0x%x",
- ui32DeviceIndex, eError));
- }
- }
-
-
- if (bIdleDevice)
- {
- /* This mutex was acquired in PVRSRVDevicePreClockSpeedChange. */
- PVRSRVPowerUnlock(KERNEL_ID);
- }
-}
-
-/******************************************************************************
- End of file (power.c)
-******************************************************************************/