blob: 3ad15eee36b385bcbd468815c4f173fa753bac76 [file] [log] [blame]
/*
* Copyright (c) 2023 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/pm/pm.h>
#include <zephyr/pm/policy.h>
#include <zephyr/device.h>
#include <zephyr/init.h>
#include <zephyr/irq.h>
#include <zephyr/logging/log_core.h>
#include <stdio.h>
#include <zephyr/drivers/interrupt_controller/ioapic.h>
#include <zephyr/logging/log.h>
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);