Message ID | 20241204140828.11699-4-patryk.wlazlyn@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | SRF: Fix offline CPU preventing pc6 entry | expand |
On Wed, Dec 4, 2024 at 3:08 PM Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com> wrote: > > Recent Intel platforms require idle driver to provide information about > the MWAIT hint used to enter the deepest idle state in the play_dead > code. > > Provide the default enter_dead() handler for all of the platforms and > allow overwriting with a custom handler for each platform if needed. My changelog for this patch: "A subsequent change is going to make native_play_dead() rely on the idle driver to put CPUs going offline into appropriate idle states. For this reason, provide the default :enter_dead() handler for all of the idle states on all platforms supported by intel_idle with an option to override it with a custom handler if needed." > Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com> > --- > drivers/idle/intel_idle.c | 18 ++++++++++++++++-- > 1 file changed, 16 insertions(+), 2 deletions(-) > > diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c > index ac4d8faa3886..c6874a6dbe95 100644 > --- a/drivers/idle/intel_idle.c > +++ b/drivers/idle/intel_idle.c > @@ -56,6 +56,7 @@ > #include <asm/mwait.h> > #include <asm/spec-ctrl.h> > #include <asm/fpu/api.h> > +#include <asm/smp.h> > > #define INTEL_IDLE_VERSION "0.5.1" > > @@ -227,6 +228,16 @@ static __cpuidle int intel_idle_s2idle(struct cpuidle_device *dev, > return 0; > } > > +static __cpuidle void intel_idle_enter_dead(struct cpuidle_device *dev, > + int index) > +{ > + struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev); > + struct cpuidle_state *state = &drv->states[index]; > + unsigned long eax = flg2MWAIT(state->flags); > + > + mwait_play_dead(eax); > +} > + > /* > * States are indexed by the cstate number, > * which is also the index into the MWAIT hint array. > @@ -1798,6 +1809,7 @@ static void __init intel_idle_init_cstates_acpi(struct cpuidle_driver *drv) > state->flags |= CPUIDLE_FLAG_TIMER_STOP; > > state->enter = intel_idle; > + state->enter_dead = intel_idle_enter_dead; > state->enter_s2idle = intel_idle_s2idle; > } > } > @@ -2143,10 +2155,12 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv) > if (intel_idle_max_cstate_reached(cstate)) > break; > > - if (!cpuidle_state_table[cstate].enter && > - !cpuidle_state_table[cstate].enter_s2idle) > + if (!cpuidle_state_table[cstate].enter) I don't think that the above change belongs to this patch. If I'm mistaken, it should be mentioned in the changelog and the reason for making it should be explained. > break; > > + if (!cpuidle_state_table[cstate].enter_dead) > + cpuidle_state_table[cstate].enter_dead = intel_idle_enter_dead; > + > /* If marked as unusable, skip this state. */ > if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_UNUSABLE) { > pr_debug("state %s is disabled\n", > --
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index ac4d8faa3886..c6874a6dbe95 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c @@ -56,6 +56,7 @@ #include <asm/mwait.h> #include <asm/spec-ctrl.h> #include <asm/fpu/api.h> +#include <asm/smp.h> #define INTEL_IDLE_VERSION "0.5.1" @@ -227,6 +228,16 @@ static __cpuidle int intel_idle_s2idle(struct cpuidle_device *dev, return 0; } +static __cpuidle void intel_idle_enter_dead(struct cpuidle_device *dev, + int index) +{ + struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev); + struct cpuidle_state *state = &drv->states[index]; + unsigned long eax = flg2MWAIT(state->flags); + + mwait_play_dead(eax); +} + /* * States are indexed by the cstate number, * which is also the index into the MWAIT hint array. @@ -1798,6 +1809,7 @@ static void __init intel_idle_init_cstates_acpi(struct cpuidle_driver *drv) state->flags |= CPUIDLE_FLAG_TIMER_STOP; state->enter = intel_idle; + state->enter_dead = intel_idle_enter_dead; state->enter_s2idle = intel_idle_s2idle; } } @@ -2143,10 +2155,12 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv) if (intel_idle_max_cstate_reached(cstate)) break; - if (!cpuidle_state_table[cstate].enter && - !cpuidle_state_table[cstate].enter_s2idle) + if (!cpuidle_state_table[cstate].enter) break; + if (!cpuidle_state_table[cstate].enter_dead) + cpuidle_state_table[cstate].enter_dead = intel_idle_enter_dead; + /* If marked as unusable, skip this state. */ if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_UNUSABLE) { pr_debug("state %s is disabled\n",
Recent Intel platforms require idle driver to provide information about the MWAIT hint used to enter the deepest idle state in the play_dead code. Provide the default enter_dead() handler for all of the platforms and allow overwriting with a custom handler for each platform if needed. Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com> --- drivers/idle/intel_idle.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)