diff options
author | Oliver O'Halloran <oohall@gmail.com> | 2017-01-12 14:54:12 +1100 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2017-01-16 09:18:05 +1100 |
commit | c3ea33f173ec3dc021d84372b50f1c13dd4b07ed (patch) | |
tree | 603631de4c62585b5cfe10ff95ef2a3435d2e664 | |
parent | a78ea5d59cc698757ffcd65e4ac78240f9b7e389 (diff) | |
download | skiboot-c3ea33f173ec3dc021d84372b50f1c13dd4b07ed.zip skiboot-c3ea33f173ec3dc021d84372b50f1c13dd4b07ed.tar.gz skiboot-c3ea33f173ec3dc021d84372b50f1c13dd4b07ed.tar.bz2 |
hw/slw: only enable supported STOP states
This patch adds parsing the ibm,enabled-stop-levels field when building
the /ibm,opal/power-mgt/ node so that only the STOP levels that have
been advertised by firmware are used.
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r-- | hw/slw.c | 14 |
1 files changed, 14 insertions, 0 deletions
@@ -637,6 +637,7 @@ void add_cpu_idle_state_properties(void) u64 *pm_ctrl_reg_val_buf; u64 *pm_ctrl_reg_mask_buf; u32 supported_states_mask; + u32 stop_levels; /* Variables to track buffer length */ u8 name_buf_len; @@ -676,6 +677,12 @@ void add_cpu_idle_state_properties(void) states = power9_cpu_idle_states; nr_states = ARRAY_SIZE(power9_cpu_idle_states); has_stop_inst = true; + + stop_levels = dt_prop_get_u32_def(power_mgt, + "ibm,enabled-stop-levels", 0); + if (!stop_levels) + prerror("SLW: No stop levels available. Power saving is disabled!\n"); + } else if (chip->type == PROC_CHIP_P8_MURANO || chip->type == PROC_CHIP_P8_VENICE || chip->type == PROC_CHIP_P8_NAPLES) { @@ -754,6 +761,13 @@ void add_cpu_idle_state_properties(void) if (!(states[i].flags & supported_states_mask)) continue; + /* We can only use the stop levels that HB has made available */ + if (has_stop_inst) { + u32 level = 1ul << states[i].pm_ctrl_reg_val; + if (!(stop_levels & level)) + continue; + } + /* * If a state is supported add each of its property * to its corresponding property buffer. |