blob: fd1976c93f7cf6f7b03630aa14323ccd39971e36 [file] [log] [blame]
/*
* Copyright (c) 2018 Intel Corporation.
* Copyright (c) 2022 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/pm/policy.h>
#include <zephyr/sys_clock.h>
#include <zephyr/pm/device.h>
const struct pm_state_info *pm_policy_next_state(uint8_t cpu, int32_t ticks)
{
uint8_t num_cpu_states;
const struct pm_state_info *cpu_states;
const struct pm_state_info *out_state = NULL;
#ifdef CONFIG_PM_NEED_ALL_DEVICES_IDLE
if (pm_device_is_any_busy()) {
return NULL;
}
#endif
num_cpu_states = pm_state_cpu_get_all(cpu, &cpu_states);
for (uint32_t i = 0; i < num_cpu_states; i++) {
const struct pm_state_info *state = &cpu_states[i];
uint32_t min_residency_ticks = 0;
uint32_t min_residency_us = state->min_residency_us + state->exit_latency_us;
/* If the input is zero, avoid 64-bit conversion from microseconds to ticks. */
if (min_residency_us > 0) {
min_residency_ticks = k_us_to_ticks_ceil32(min_residency_us);
}
if (ticks < min_residency_ticks) {
/* If current state has higher residency then use the previous state; */
break;
}
/* check if state is available. */
if (!pm_policy_state_is_available(state->state, state->substate_id)) {
continue;
}
out_state = state;
}
return out_state;
}