mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-09-11 04:42:30 +00:00
Simplified some documentation, removing inconsistencies and making it easier to understand by separating PM infrastructure areas and soc specific components that implement the hooks. Removed the DEVICE_SUSPEND_ONLY policy as it is redundant and causes high complexity in the flow. It is also not practical to use it because it was meant to be used without doing CPU or SOC low power state operations. This means it would do device PM operations in the ISR of the system timer used by the scheduler. This can disrupt the scheduler time. Added a check of a flag around the notification sent from the ISR of the wake event and created APIs to set/clear it. This will allow disabling the notification when not needed from _sys_soc_suspend(). Jira: ZEP-972 Change-Id: Id7aa7d2683384eabed518d4efac446ecc84c3498 Signed-off-by: Ramesh Thomas <ramesh.thomas@intel.com>
126 lines
4.3 KiB
C
126 lines
4.3 KiB
C
/*
|
|
* Copyright (c) 2012-2014 Wind River Systems, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef __INCpower
|
|
#define __INCpower
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifdef CONFIG_SYS_POWER_MANAGEMENT
|
|
|
|
/* Constants identifying power state categories */
|
|
#define SYS_PM_ACTIVE_STATE 0 /* SOC and CPU are in active state */
|
|
#define SYS_PM_LOW_POWER_STATE 1 /* CPU low power state */
|
|
#define SYS_PM_DEEP_SLEEP 2 /* SOC low power state */
|
|
|
|
#define SYS_PM_NOT_HANDLED SYS_PM_ACTIVE_STATE
|
|
|
|
extern unsigned char _sys_soc_notify_wake_event;
|
|
|
|
/**
|
|
* @brief Power Management Hook Interface
|
|
*
|
|
* @defgroup power_management_hook_interface Power Management Hook Interface
|
|
* @ingroup power_management_api
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Function to disable wake event notification
|
|
*
|
|
* _sys_soc_resume() would be called from the ISR that caused exit from
|
|
* low power state. This function can be called at _sys_soc_suspend to disable
|
|
* this notification.
|
|
*/
|
|
static inline void _sys_soc_disable_wake_event_notification(void)
|
|
{
|
|
_sys_soc_notify_wake_event = 0;
|
|
}
|
|
|
|
/**
|
|
* @brief Hook function to notify exit from low power state
|
|
*
|
|
* The purpose of this function is to notify exit from
|
|
* low power states. The implementation of this function can vary
|
|
* depending on the soc specific boot flow.
|
|
*
|
|
* In the case of recovery from soc low power states like deep sleep,
|
|
* this function would switch cpu context to the execution point at the time
|
|
* system entered the soc low power state.
|
|
*
|
|
* In boot flows where this function gets called even at cold boot, the
|
|
* function should return immediately.
|
|
*
|
|
* Wake event notification:
|
|
* This function would also be called from the ISR context of the event
|
|
* that caused exit from the low power state. This will be called immediately
|
|
* after interrupts are enabled. This is called to give a chance to do
|
|
* any operations before the kernel would switch tasks or processes nested
|
|
* interrupts. This is required for cpu low power states that would require
|
|
* interrupts to be enabled while entering low power states. e.g. C1 in x86. In
|
|
* those cases, the ISR would be invoked immediately after the event wakes up
|
|
* the CPU, before code following the CPU wait, gets a chance to execute. This
|
|
* can be ignored if no operation needs to be done at the wake event
|
|
* notification. Alternatively _sys_soc_disable_wake_event_notification() can
|
|
* be called in _sys_soc_suspend to disable this notification.
|
|
*
|
|
* @note A dedicated function may be created in future to notify wake
|
|
* events, instead of overloading this one.
|
|
*/
|
|
extern void _sys_soc_resume(void);
|
|
|
|
/**
|
|
* @brief Hook function to allow entry to low power state
|
|
*
|
|
* This function is called by the kernel when it is about to idle.
|
|
* It is passed the number of clock ticks that the kernel calculated
|
|
* as available time to idle.
|
|
*
|
|
* The implementation of this function is dependent on the soc specific
|
|
* components and the various schemes they support. Some implementations
|
|
* may choose to do device PM operations in this function, while others
|
|
* would not need to, because they would have done it at other places.
|
|
*
|
|
* Typically a wake event is set and the soc or cpu is put to any of the
|
|
* supported low power states. The wake event should be set to wake up
|
|
* the soc or cpu before the available idle time expires to avoid disrupting
|
|
* the kernel's scheduling.
|
|
*
|
|
* This function is entered with interrupts disabled. It should
|
|
* re-enable interrupts if it had entered a low power state.
|
|
*
|
|
* @param ticks the upcoming kernel idle time
|
|
*
|
|
* @retval SYS_PM_NOT_HANDLED If low power state was not entered.
|
|
* @retval SYS_PM_LOW_POWER_STATE If CPU low power state was entered.
|
|
* @retval SYS_PM_DEEP_SLEEP If SOC low power state was entered.
|
|
*/
|
|
extern int _sys_soc_suspend(int32_t ticks);
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* CONFIG_SYS_POWER_MANAGEMENT */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCpower */
|