Commit 00433eae authored by Artem Bityutskiy's avatar Artem Bityutskiy Committed by Rafael J. Wysocki

intel_idle: improve C-state flags handling robustness

The following C-state flags are currently mutually-exclusive and should not
be combined:
  * IRQ_ENABLE
  * IBRS
  * XSTATE

There is a warning for the situation when the IRQ_ENABLE flag
is combined with the IBRS flag, but no warnings for other combinations.
This is inconsistent and prone to errors.

Improve the situation by adding warnings for all the unexpected
combinations. Add a couple of helpful commentaries too.
Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Reviewed-by: default avatarZhang Rui <rui.zhang@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 1abffbd8
...@@ -1896,20 +1896,28 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv) ...@@ -1896,20 +1896,28 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv)
drv->states[drv->state_count] = cpuidle_state_table[cstate]; drv->states[drv->state_count] = cpuidle_state_table[cstate];
state = &drv->states[drv->state_count]; state = &drv->states[drv->state_count];
if ((state->flags & CPUIDLE_FLAG_IRQ_ENABLE) || force_irq_on) { if (state->flags & CPUIDLE_FLAG_INIT_XSTATE) {
pr_info("forced intel_idle_irq for state %d\n", cstate); /*
state->enter = intel_idle_irq; * Combining with XSTATE with IBRS or IRQ_ENABLE flags
} * is not currently supported but this driver.
*/
if (cpu_feature_enabled(X86_FEATURE_KERNEL_IBRS) && WARN_ON_ONCE(state->flags & CPUIDLE_FLAG_IBRS);
state->flags & CPUIDLE_FLAG_IBRS) { WARN_ON_ONCE(state->flags & CPUIDLE_FLAG_IRQ_ENABLE);
state->enter = intel_idle_xstate;
} else if (cpu_feature_enabled(X86_FEATURE_KERNEL_IBRS) &&
state->flags & CPUIDLE_FLAG_IBRS) {
/*
* IBRS mitigation requires that C-states are entered
* with interrupts disabled.
*/
WARN_ON_ONCE(state->flags & CPUIDLE_FLAG_IRQ_ENABLE); WARN_ON_ONCE(state->flags & CPUIDLE_FLAG_IRQ_ENABLE);
state->enter = intel_idle_ibrs; state->enter = intel_idle_ibrs;
} else if ((state->flags & CPUIDLE_FLAG_IRQ_ENABLE) ||
force_irq_on) {
pr_info("forced intel_idle_irq for state %d\n", cstate);
state->enter = intel_idle_irq;
} }
if (state->flags & CPUIDLE_FLAG_INIT_XSTATE)
state->enter = intel_idle_xstate;
if ((disabled_states_mask & BIT(drv->state_count)) || if ((disabled_states_mask & BIT(drv->state_count)) ||
((icpu->use_acpi || force_use_acpi) && ((icpu->use_acpi || force_use_acpi) &&
intel_idle_off_by_default(mwait_hint) && intel_idle_off_by_default(mwait_hint) &&
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment