Message ID | 20230601182801.2622044-5-arjan@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | [1/7] intel_idle: refactor state->enter manipulation into its own function | expand |
On Thu, Jun 1, 2023 at 8:28 PM <arjan@linux.intel.com> wrote: > > From: Arjan van de Ven <arjan.van.de.ven@intel.com> > > Currently the intel_idle driver has a family of functions called > intel_idle/intel_idle_irq/intel_idle_xsave/... that use the > mwait instruction to enter into a low power state. > > x86 cpus can also use the legacy "hlt" instruction for this, > and in some cases (VM guests for example) the mwait instruction > might not be available. > > Because of this, add the basic helpers to allow 'hlt' to be used to enter > a low power state (will be used in later patches), both in the > regular and the _irq enabled variant. > > Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> I would prefer this to be combined with patch [6/7] by the rule that it's better to add helpers along with their users. > --- > drivers/idle/intel_idle.c | 37 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > > diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c > index 8415965372c7..66d262fd267e 100644 > --- a/drivers/idle/intel_idle.c > +++ b/drivers/idle/intel_idle.c > @@ -199,6 +199,43 @@ static __cpuidle int intel_idle_xstate(struct cpuidle_device *dev, > return __intel_idle(dev, drv, index); > } > > +static __always_inline int __intel_idle_hlt(struct cpuidle_device *dev, > + struct cpuidle_driver *drv, int index) > +{ > + raw_safe_halt(); > + raw_local_irq_disable(); > + return index; > +} > + > +/** > + * intel_idle_hlt - Ask the processor to enter the given idle state using hlt. > + * @dev: cpuidle device of the target CPU. > + * @drv: cpuidle driver (assumed to point to intel_idle_driver). > + * @index: Target idle state index. > + * > + * Use the HLT instruction to notify the processor that the CPU represented by > + * @dev is idle and it can try to enter the idle state corresponding to @index. > + * > + * Must be called under local_irq_disable(). > + */ > +static __cpuidle int intel_idle_hlt(struct cpuidle_device *dev, > + struct cpuidle_driver *drv, int index) > +{ > + return __intel_idle_hlt(dev, drv, index); > +} > + > +static __cpuidle int intel_idle_hlt_irq(struct cpuidle_device *dev, > + struct cpuidle_driver *drv, int index) > +{ > + int ret; > + > + raw_local_irq_enable(); > + ret = __intel_idle_hlt(dev, drv, index); > + raw_local_irq_disable(); > + > + return ret; > +} > + > /** > * intel_idle_s2idle - Ask the processor to enter the given idle state. > * @dev: cpuidle device of the target CPU. > -- > 2.40.1 >
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index 8415965372c7..66d262fd267e 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c @@ -199,6 +199,43 @@ static __cpuidle int intel_idle_xstate(struct cpuidle_device *dev, return __intel_idle(dev, drv, index); } +static __always_inline int __intel_idle_hlt(struct cpuidle_device *dev, + struct cpuidle_driver *drv, int index) +{ + raw_safe_halt(); + raw_local_irq_disable(); + return index; +} + +/** + * intel_idle_hlt - Ask the processor to enter the given idle state using hlt. + * @dev: cpuidle device of the target CPU. + * @drv: cpuidle driver (assumed to point to intel_idle_driver). + * @index: Target idle state index. + * + * Use the HLT instruction to notify the processor that the CPU represented by + * @dev is idle and it can try to enter the idle state corresponding to @index. + * + * Must be called under local_irq_disable(). + */ +static __cpuidle int intel_idle_hlt(struct cpuidle_device *dev, + struct cpuidle_driver *drv, int index) +{ + return __intel_idle_hlt(dev, drv, index); +} + +static __cpuidle int intel_idle_hlt_irq(struct cpuidle_device *dev, + struct cpuidle_driver *drv, int index) +{ + int ret; + + raw_local_irq_enable(); + ret = __intel_idle_hlt(dev, drv, index); + raw_local_irq_disable(); + + return ret; +} + /** * intel_idle_s2idle - Ask the processor to enter the given idle state. * @dev: cpuidle device of the target CPU.