Message ID | 1485333389-5752-4-git-send-email-ego@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
"Gautham R. Shenoy" <ego@linux.vnet.ibm.com> writes: > From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> > > In the current code for powernv_add_idle_states, there is a lot of code > duplication while initializing an idle state in powernv_states table. > > Add an inline helper function to populate the powernv_states[] table > for a given idle state. Invoke this for populating the "Nap", > "Fastsleep" and the stop states in powernv_add_idle_states. > > Acked-by: Balbir Singh <bsingharora@gmail.com> > Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> > --- > drivers/cpuidle/cpuidle-powernv.c | 89 +++++++++++++++++++++++---------------- > include/linux/cpuidle.h | 1 + I was going to merge this, but I see you've touched cpuidle.h, so I feel like I should get an ACK from the cpuidle folks. It's a fairly uncontroversial change, but it's their API. cheers > diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h > index da346f2..fc1e5d7 100644 > --- a/include/linux/cpuidle.h > +++ b/include/linux/cpuidle.h > @@ -62,6 +62,7 @@ struct cpuidle_state { > }; > > /* Idle State Flags */ > +#define CPUIDLE_FLAG_NONE (0x00) > #define CPUIDLE_FLAG_COUPLED (0x02) /* state applies to multiple cpus */ > #define CPUIDLE_FLAG_TIMER_STOP (0x04) /* timer is stopped on this state */ > > -- > 1.9.4 -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Jan 30, 2017 at 4:47 AM, Michael Ellerman <mpe@ellerman.id.au> wrote: > "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> writes: > >> From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> >> >> In the current code for powernv_add_idle_states, there is a lot of code >> duplication while initializing an idle state in powernv_states table. >> >> Add an inline helper function to populate the powernv_states[] table >> for a given idle state. Invoke this for populating the "Nap", >> "Fastsleep" and the stop states in powernv_add_idle_states. >> >> Acked-by: Balbir Singh <bsingharora@gmail.com> >> Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> >> --- >> drivers/cpuidle/cpuidle-powernv.c | 89 +++++++++++++++++++++++---------------- >> include/linux/cpuidle.h | 1 + > > I was going to merge this, but I see you've touched cpuidle.h, so I feel > like I should get an ACK from the cpuidle folks. > > It's a fairly uncontroversial change, but it's their API. OK, please add an ACK from me to it then. Thanks, Rafael -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
"Rafael J. Wysocki" <rafael@kernel.org> writes: > On Mon, Jan 30, 2017 at 4:47 AM, Michael Ellerman <mpe@ellerman.id.au> wrote: >> "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> writes: >> >>> From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> >>> >>> In the current code for powernv_add_idle_states, there is a lot of code >>> duplication while initializing an idle state in powernv_states table. >>> >>> Add an inline helper function to populate the powernv_states[] table >>> for a given idle state. Invoke this for populating the "Nap", >>> "Fastsleep" and the stop states in powernv_add_idle_states. >>> >>> Acked-by: Balbir Singh <bsingharora@gmail.com> >>> Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> >>> --- >>> drivers/cpuidle/cpuidle-powernv.c | 89 +++++++++++++++++++++++---------------- >>> include/linux/cpuidle.h | 1 + >> >> I was going to merge this, but I see you've touched cpuidle.h, so I feel >> like I should get an ACK from the cpuidle folks. >> >> It's a fairly uncontroversial change, but it's their API. > > OK, please add an ACK from me to it then. Thanks. cheers -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Jan 30, 2017 at 10:17:50PM +1100, Michael Ellerman wrote: > "Rafael J. Wysocki" <rafael@kernel.org> writes: > > > On Mon, Jan 30, 2017 at 4:47 AM, Michael Ellerman <mpe@ellerman.id.au> wrote: > >> "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> writes: > >> > >>> From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> > >>> > >>> In the current code for powernv_add_idle_states, there is a lot of code > >>> duplication while initializing an idle state in powernv_states table. > >>> > >>> Add an inline helper function to populate the powernv_states[] table > >>> for a given idle state. Invoke this for populating the "Nap", > >>> "Fastsleep" and the stop states in powernv_add_idle_states. > >>> > >>> Acked-by: Balbir Singh <bsingharora@gmail.com> > >>> Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> > >>> --- > >>> drivers/cpuidle/cpuidle-powernv.c | 89 +++++++++++++++++++++++---------------- > >>> include/linux/cpuidle.h | 1 + > >> > >> I was going to merge this, but I see you've touched cpuidle.h, so I feel > >> like I should get an ACK from the cpuidle folks. > >> > >> It's a fairly uncontroversial change, but it's their API. > > > > OK, please add an ACK from me to it then. > > Thanks. Thanks Rafael and Michal. > > cheers > -- Thanks and Regards gautham. -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/cpuidle/cpuidle-powernv.c b/drivers/cpuidle/cpuidle-powernv.c index 0835a37..6871b7f 100644 --- a/drivers/cpuidle/cpuidle-powernv.c +++ b/drivers/cpuidle/cpuidle-powernv.c @@ -20,6 +20,10 @@ #include <asm/opal.h> #include <asm/runlatch.h> +/* + * Expose only those Hardware idle states via the cpuidle framework + * that have latency value below POWERNV_THRESHOLD_LATENCY_NS. + */ #define POWERNV_THRESHOLD_LATENCY_NS 200000 static struct cpuidle_driver powernv_idle_driver = { @@ -167,6 +171,24 @@ static int powernv_cpuidle_driver_init(void) return 0; } +static inline void add_powernv_state(int index, const char *name, + unsigned int flags, + int (*idle_fn)(struct cpuidle_device *, + struct cpuidle_driver *, + int), + unsigned int target_residency, + unsigned int exit_latency, + u64 psscr_val) +{ + strlcpy(powernv_states[index].name, name, CPUIDLE_NAME_LEN); + strlcpy(powernv_states[index].desc, name, CPUIDLE_NAME_LEN); + powernv_states[index].flags = flags; + powernv_states[index].target_residency = target_residency; + powernv_states[index].exit_latency = exit_latency; + powernv_states[index].enter = idle_fn; + stop_psscr_table[index] = psscr_val; +} + static int powernv_add_idle_states(void) { struct device_node *power_mgt; @@ -236,6 +258,7 @@ static int powernv_add_idle_states(void) "ibm,cpu-idle-state-residency-ns", residency_ns, dt_idle_states); for (i = 0; i < dt_idle_states; i++) { + unsigned int exit_latency, target_residency; /* * If an idle state has exit latency beyond * POWERNV_THRESHOLD_LATENCY_NS then don't use it @@ -243,28 +266,33 @@ static int powernv_add_idle_states(void) */ if (latency_ns[i] > POWERNV_THRESHOLD_LATENCY_NS) continue; + /* + * Firmware passes residency and latency values in ns. + * cpuidle expects it in us. + */ + exit_latency = latency_ns[i] / 1000; + if (!rc) + target_residency = residency_ns[i] / 1000; + else + target_residency = 0; /* - * Cpuidle accepts exit_latency and target_residency in us. - * Use default target_residency values if f/w does not expose it. + * For nap and fastsleep, use default target_residency + * values if f/w does not expose it. */ if (flags[i] & OPAL_PM_NAP_ENABLED) { + if (!rc) + target_residency = 100; /* Add NAP state */ - strcpy(powernv_states[nr_idle_states].name, "Nap"); - strcpy(powernv_states[nr_idle_states].desc, "Nap"); - powernv_states[nr_idle_states].flags = 0; - powernv_states[nr_idle_states].target_residency = 100; - powernv_states[nr_idle_states].enter = nap_loop; + add_powernv_state(nr_idle_states, "Nap", + CPUIDLE_FLAG_NONE, nap_loop, + target_residency, exit_latency, 0); } else if ((flags[i] & OPAL_PM_STOP_INST_FAST) && !(flags[i] & OPAL_PM_TIMEBASE_STOP)) { - strncpy(powernv_states[nr_idle_states].name, - names[i], CPUIDLE_NAME_LEN); - strncpy(powernv_states[nr_idle_states].desc, - names[i], CPUIDLE_NAME_LEN); - powernv_states[nr_idle_states].flags = 0; - - powernv_states[nr_idle_states].enter = stop_loop; - stop_psscr_table[nr_idle_states] = psscr_val[i]; + add_powernv_state(nr_idle_states, names[i], + CPUIDLE_FLAG_NONE, stop_loop, + target_residency, exit_latency, + psscr_val[i]); } /* @@ -274,32 +302,21 @@ static int powernv_add_idle_states(void) #ifdef CONFIG_TICK_ONESHOT if (flags[i] & OPAL_PM_SLEEP_ENABLED || flags[i] & OPAL_PM_SLEEP_ENABLED_ER1) { + if (!rc) + target_residency = 300000; /* Add FASTSLEEP state */ - strcpy(powernv_states[nr_idle_states].name, "FastSleep"); - strcpy(powernv_states[nr_idle_states].desc, "FastSleep"); - powernv_states[nr_idle_states].flags = CPUIDLE_FLAG_TIMER_STOP; - powernv_states[nr_idle_states].target_residency = 300000; - powernv_states[nr_idle_states].enter = fastsleep_loop; + add_powernv_state(nr_idle_states, "FastSleep", + CPUIDLE_FLAG_TIMER_STOP, + fastsleep_loop, + target_residency, exit_latency, 0); } else if ((flags[i] & OPAL_PM_STOP_INST_DEEP) && (flags[i] & OPAL_PM_TIMEBASE_STOP)) { - strncpy(powernv_states[nr_idle_states].name, - names[i], CPUIDLE_NAME_LEN); - strncpy(powernv_states[nr_idle_states].desc, - names[i], CPUIDLE_NAME_LEN); - - powernv_states[nr_idle_states].flags = CPUIDLE_FLAG_TIMER_STOP; - powernv_states[nr_idle_states].enter = stop_loop; - stop_psscr_table[nr_idle_states] = psscr_val[i]; + add_powernv_state(nr_idle_states, names[i], + CPUIDLE_FLAG_TIMER_STOP, stop_loop, + target_residency, exit_latency, + psscr_val[i]); } #endif - powernv_states[nr_idle_states].exit_latency = - ((unsigned int)latency_ns[i]) / 1000; - - if (!rc) { - powernv_states[nr_idle_states].target_residency = - ((unsigned int)residency_ns[i]) / 1000; - } - nr_idle_states++; } out: diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index da346f2..fc1e5d7 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h @@ -62,6 +62,7 @@ struct cpuidle_state { }; /* Idle State Flags */ +#define CPUIDLE_FLAG_NONE (0x00) #define CPUIDLE_FLAG_COUPLED (0x02) /* state applies to multiple cpus */ #define CPUIDLE_FLAG_TIMER_STOP (0x04) /* timer is stopped on this state */