[Skiboot] [PATCH 6/9] SLW: Detect if deep states are enabled
Akshay Adiga
akshay.adiga at linux.vnet.ibm.com
Thu Jan 4 22:28:03 AEDT 2018
Patch adds a global variable which indicates if the deep states are enabled
through stop-enabled-bits. Only applies to POWER9.
Signed-off-by: Akshay Adiga <akshay.adiga at linux.vnet.ibm.com>
---
hw/slw.c | 16 +++++++++++++++-
include/skiboot.h | 1 +
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/hw/slw.c b/hw/slw.c
index a2004c60..5548226b 100644
--- a/hw/slw.c
+++ b/hw/slw.c
@@ -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;
@@ -892,8 +893,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 90deff78..859db56d 100644
--- a/include/skiboot.h
+++ b/include/skiboot.h
@@ -304,6 +304,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);
--
2.14.3
More information about the Skiboot
mailing list