Lines Matching +full:idle +full:- +full:state +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0
3 * cpuidle-powernv - idle state cpuidle driver.
4 * Adapted from drivers/cpuidle/cpuidle-pseries
26 * Expose only those Hardware idle states via the cpuidle framework
32 .name = "powernv_idle",
58 for (i = index + 1; i < drv->state_count; i++) { in get_snooze_timeout()
59 if (dev->states_usage[i].disable) in get_snooze_timeout()
62 return drv->states[i].target_residency * tb_ticks_per_usec; in get_snooze_timeout()
154 .name = "snooze",
193 drv->state_count = 0; in powernv_cpuidle_driver_init()
196 /* Is the state not enabled? */ in powernv_cpuidle_driver_init()
200 drv->states[drv->state_count] = /* structure copy */ in powernv_cpuidle_driver_init()
203 drv->state_count += 1; in powernv_cpuidle_driver_init()
213 * drv->cpumask defaults to cpu_possible_mask in in powernv_cpuidle_driver_init()
216 * cannot be hot-added later at run time. in powernv_cpuidle_driver_init()
222 drv->cpumask = (struct cpumask *)cpu_present_mask; in powernv_cpuidle_driver_init()
227 static inline void add_powernv_state(int index, const char *name, in add_powernv_state() argument
236 strlcpy(powernv_states[index].name, name, CPUIDLE_NAME_LEN); in add_powernv_state()
237 strlcpy(powernv_states[index].desc, name, CPUIDLE_NAME_LEN); in add_powernv_state()
259 pr_warn("cpuidle-powernv : Only Snooze is available\n"); in powernv_add_idle_states()
267 * Since snooze is used as first idle state, max idle states allowed is in powernv_add_idle_states()
268 * CPUIDLE_STATE_MAX -1 in powernv_add_idle_states()
270 if (nr_pnv_idle_states > CPUIDLE_STATE_MAX - 1) { in powernv_add_idle_states()
271 pr_warn("cpuidle-powernv: discovered idle states more than allowed"); in powernv_add_idle_states()
272 dt_idle_states = CPUIDLE_STATE_MAX - 1; in powernv_add_idle_states()
276 * If the idle states use stop instruction, probe for psscr values in powernv_add_idle_states()
285 struct pnv_idle_states_t *state = &pnv_idle_states[i]; in powernv_add_idle_states() local
288 * Skip the platform idle state whose flag isn't in in powernv_add_idle_states()
291 if ((state->flags & supported_flags) != state->flags) in powernv_add_idle_states()
294 * If an idle state has exit latency beyond in powernv_add_idle_states()
296 * in cpu-idle. in powernv_add_idle_states()
298 if (state->latency_ns > POWERNV_THRESHOLD_LATENCY_NS) in powernv_add_idle_states()
304 exit_latency = DIV_ROUND_UP(state->latency_ns, 1000); in powernv_add_idle_states()
305 target_residency = DIV_ROUND_UP(state->residency_ns, 1000); in powernv_add_idle_states()
307 if (has_stop_states && !(state->valid)) in powernv_add_idle_states()
310 if (state->flags & OPAL_PM_TIMEBASE_STOP) in powernv_add_idle_states()
313 if (state->flags & OPAL_PM_NAP_ENABLED) { in powernv_add_idle_states()
314 /* Add NAP state */ in powernv_add_idle_states()
319 add_powernv_state(nr_idle_states, state->name, in powernv_add_idle_states()
322 state->psscr_val, in powernv_add_idle_states()
323 state->psscr_mask); in powernv_add_idle_states()
331 else if (state->flags & OPAL_PM_SLEEP_ENABLED || in powernv_add_idle_states()
332 state->flags & OPAL_PM_SLEEP_ENABLED_ER1) { in powernv_add_idle_states()
333 /* Add FASTSLEEP state */ in powernv_add_idle_states()
339 add_powernv_state(nr_idle_states, state->name, in powernv_add_idle_states()
342 state->psscr_val, in powernv_add_idle_states()
343 state->psscr_mask); in powernv_add_idle_states()
356 * Choose state table for shared versus dedicated partition
361 return -ENODEV; in powernv_idle_probe()
365 /* Device tree can indicate more idle states */ in powernv_idle_probe()
371 return -ENODEV; in powernv_idle_probe()