[Skiboot] [RFC PATCH 5/5] hw/slw: only enable supported STOP states

Oliver O'Halloran oohall at gmail.com
Fri Sep 16 16:45:03 AEST 2016


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 at gmail.com>
---
 hw/slw.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/hw/slw.c b/hw/slw.c
index 62822dfaefdf..00b747dd7c79 100644
--- a/hw/slw.c
+++ b/hw/slw.c
@@ -573,6 +573,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;
@@ -612,6 +613,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) {
@@ -690,6 +697,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.
-- 
2.5.5



More information about the Skiboot mailing list