/* * Copyright (c) 2023 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #include #include #include #include #include LOG_MODULE_REGISTER(pm_service, CONFIG_PM_LOG_LEVEL); /* low power modes */ #define FW_D0 0 #define FW_D0i0 1 #define FW_D0i1 2 #define FW_D0i2 3 #define FW_D0i3 4 extern void sedi_pm_enter_power_state(int state); void pm_state_set(enum pm_state state, uint8_t substate_id) { LOG_DBG(" -> SoC D0i%u, idle=%u ms", substate_id, k_ticks_to_ms_floor32(_kernel.idle)); switch (state) { case PM_STATE_RUNTIME_IDLE: sedi_pm_enter_power_state(FW_D0i0); break; case PM_STATE_SUSPEND_TO_IDLE: sedi_pm_enter_power_state(FW_D0i1); break; case PM_STATE_SUSPEND_TO_RAM: sedi_pm_enter_power_state(FW_D0i2); break; case PM_STATE_SUSPEND_TO_DISK: sedi_pm_enter_power_state(FW_D0i3); break; default: LOG_DBG("Unsupported power state %u", state); break; } LOG_DBG("SoC D0i%u ->", substate_id); } /* Handle SOC specific activity after Low Power Mode Exit */ void pm_state_exit_post_ops(enum pm_state state, uint8_t substate_id) { ARG_UNUSED(state); ARG_UNUSED(substate_id); __asm__ volatile ("sti" ::: "memory"); } #if defined(CONFIG_REBOOT) && !defined(CONFIG_REBOOT_RST_CNT) extern void sedi_pm_reset(void); void sys_arch_reboot(int type) { ARG_UNUSED(type); sedi_pm_reset(); } #endif extern void sedi_pm_init(void); static int ish_sedi_pm_init(void) { sedi_pm_init(); return 0; } SYS_INIT(ish_sedi_pm_init, PRE_KERNEL_2, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);