diff options
-rw-r--r-- | hw/slw.c | 16 | ||||
-rw-r--r-- | include/skiboot.h | 1 |
2 files changed, 16 insertions, 1 deletions
@@ -41,6 +41,7 @@ static uint32_t slw_saved_reset[MAX_RESET_PATCH_SIZE]; static bool slw_current_le = false; enum wakeup_engine_states wakeup_engine_state = WAKEUP_ENGINE_NOT_PRESENT; +bool has_deep_states = false; /* SLW timer related stuff */ static bool slw_has_timer; @@ -908,8 +909,21 @@ void add_cpu_idle_state_properties(void) has_stop_inst = true; stop_levels = dt_prop_get_u32_def(power_mgt, "ibm,enabled-stop-levels", 0); - if (!stop_levels) + if (!stop_levels) { prerror("SLW: No stop levels available. Power saving is disabled!\n"); + has_deep_states = false; + } else { + /* Iterate to see if we have deep states enabled */ + for (i = 0; i < nr_states; i++) { + u32 level = 31 - (states[i].pm_ctrl_reg_val & + OPAL_PM_PSSCR_RL_MASK); + + if ((stop_levels & (1ul << level)) && + (states[i].flags & OPAL_PM_STOP_INST_DEEP)) + has_deep_states = true; + } + } + } else if (chip->type == PROC_CHIP_P8_MURANO || chip->type == PROC_CHIP_P8_VENICE || chip->type == PROC_CHIP_P8_NAPLES) { diff --git a/include/skiboot.h b/include/skiboot.h index 689bbb1..a81198c 100644 --- a/include/skiboot.h +++ b/include/skiboot.h @@ -309,6 +309,7 @@ enum wakeup_engine_states { WAKEUP_ENGINE_FAILED }; extern enum wakeup_engine_states wakeup_engine_state; +extern bool has_deep_states; /* SLW reinit function for switching core settings */ extern int64_t slw_reinit(uint64_t flags); |