All of lore.kernel.org
 help / color / mirror / Atom feed
From: srinivas pandruvada <srinivas.pandruvada@linux.intel.com>
To: david.e.box@linux.intel.com, hdegoede@redhat.com,
	 ilpo.jarvinen@linux.intel.com, rjw@rjwysocki.net,
	 platform-driver-x86@vger.kernel.org,
	linux-kernel@vger.kernel.org,  linux-pm@vger.kernel.org
Subject: Re: [PATCH V2 2/2] platform/x86/intel/pmc: Disable C1 auto-demotion during suspend
Date: Fri, 11 Oct 2024 09:36:52 -0700	[thread overview]
Message-ID: <462d0bd9eb9c461e01ef27a8da9cd02f92ce8f9f.camel@linux.intel.com> (raw)
In-Reply-To: <c9410dd42e01c1ba26fbb43f97a8777f1c95b9af.camel@linux.intel.com>

On Thu, 2024-10-10 at 20:50 -0700, David E. Box wrote:
> On Thu, 2024-10-10 at 19:09 -0700, srinivas pandruvada wrote:
> > On Thu, 2024-10-10 at 17:36 -0700, David E. Box wrote:
> > > On some platforms, aggressive C1 auto-demotion may lead to
> > > failure to
> > > enter
> > > the deepest C-state during suspend-to-idle, causing high power
> > > consumption.
> > > To prevent this, disable C1 auto-demotion during suspend and re-
> > > enable on
> > > resume.
> > > 
> > > Signed-off-by: David E. Box <david.e.box@linux.intel.com>
> > > ---
> > > 
> > > V2 - Remove #define DEBUG
> > >    - Move refactor of cnl_resume() to separate patch
> > >    - Use smp_call_function() to disable and restore
> > > C1_AUTO_DEMOTE
> > >    - Add comment that the MSR is per core, not per package.
> > >    - Add comment that the online cpu mask remains unchanged
> > > during
> > >      suspend due to frozen userspace.
> > > 
> > >  drivers/platform/x86/intel/pmc/cnp.c | 53
> > > ++++++++++++++++++++++++++++
> > >  1 file changed, 53 insertions(+)
> > > 
> > > diff --git a/drivers/platform/x86/intel/pmc/cnp.c
> > > b/drivers/platform/x86/intel/pmc/cnp.c
> > > index 513c02670c5a..f12d4f0f9e93 100644
> > > --- a/drivers/platform/x86/intel/pmc/cnp.c
> > > +++ b/drivers/platform/x86/intel/pmc/cnp.c
> > > @@ -8,6 +8,8 @@
> > >   *
> > >   */
> > >  
> > > +#include <linux/smp.h>
> > > +#include <linux/suspend.h>
> > >  #include "core.h"
> > >  
> > >  /* Cannon Lake: PGD PFET Enable Ack Status Register(s) bitmap */
> > > @@ -206,8 +208,52 @@ const struct pmc_reg_map cnp_reg_map = {
> > >  	.etr3_offset = ETR3_OFFSET,
> > >  };
> > >  
> > > +
> > > +/*
> > > + * Disable C1 auto-demotion
> > > + *
> > > + * Aggressive C1 auto-demotion may lead to failure to enter the
> > > deepest C-state
> > > + * during suspend-to-idle, causing high power consumption. To
> > > prevent this, we
> > > + * disable C1 auto-demotion during suspend and re-enable on
> > > resume.
> > > + *
> > > + * Note that, although MSR_PKG_CST_CONFIG_CONTROL has 'package'
> > > in
> > > its name, it
> > > + * is actually a per-core MSR on client platforms, affecting
> > > only a
> > > single CPU.
> > > + * Therefore, it must be configured on all online CPUs. The
> > > online
> > > cpu mask is
> > > + * unchanged during the phase of suspend/resume as user space is
> > > frozen.
> > > + */
> > > +
> > > +static DEFINE_PER_CPU(u64, pkg_cst_config);
> > > +
> > > +static void disable_c1_auto_demote(void *unused)
> > > +{
> > > +	int cpunum = smp_processor_id();
> > > +	u64 val;
> > > +
> > > +	rdmsrl(MSR_PKG_CST_CONFIG_CONTROL, val);
> > > +	per_cpu(pkg_cst_config, cpunum) = val;
> > > +	val &= ~NHM_C1_AUTO_DEMOTE;
> > > +	wrmsrl(MSR_PKG_CST_CONFIG_CONTROL, val);
> > > +	pr_debug("%s: cpu:%d cst %llx\n", __func__, cpunum,
> > > val);
> > Do you want to leave pr_debug?
> 
> Thought it could be useful but it can be removed.
> 
> > 
> > > +}
> > > +
> > > +static void restore_c1_auto_demote(void *unused)
> > > +{
> > > +	int cpunum = smp_processor_id();
> > > +
> > > +	pr_debug("%s: cpu:%d cst %llx\n", __func__, cpunum,
> > > +		 per_cpu(pkg_cst_config, cpunum));
> > > +	wrmsrl(MSR_PKG_CST_CONFIG_CONTROL,
> > > per_cpu(pkg_cst_config,
> > > cpunum));
> > > +}
> > > +
> > >  void cnl_suspend(struct pmc_dev *pmcdev)
> > >  {
> > > +	if (!pm_suspend_via_firmware()) {
> > > +		preempt_disable();
> > Why do you need this?
> 
> To ensure that the cpu doesn't change between the next two calls.

Correct. You need for smp_processor_id()

Generally for this avoiding issue with smp_processor_id(), you can use
get_cpu(), which gives current cpu as return value and also disable
preemption.

Something like this

                this_cpu = get_cpu();
                disable_c1_auto_demote(&this_cpu);
smp_call_function_many(cpu_online_mask, disable_c1_auto_demote, NULL,
0);
                put_cpu();


But fine, this makes your code more complex as you have to pass now a
param and use for local_cpu and use smp_procesor_id() for remote call
via smp_call..


Thanks,
Srinivas

> 
> David
> 
> > 
> > 
> > Thanks,
> > Srinivas
> > 
> > > +		disable_c1_auto_demote(NULL);
> > > +		smp_call_function(disable_c1_auto_demote, NULL,
> > > 0);
> > > +		preempt_enable();
> > > +	}
> > > +
> > >  	/*
> > >  	 * Due to a hardware limitation, the GBE LTR blocks PC10
> > >  	 * when a cable is attached. To unblock PC10 during
> > > suspend,
> > > @@ -218,6 +264,13 @@ void cnl_suspend(struct pmc_dev *pmcdev)
> > >  
> > >  int cnl_resume(struct pmc_dev *pmcdev)
> > >  {
> > > +	if (!pm_suspend_via_firmware()) {
> > > +		preempt_disable();
> > > +		restore_c1_auto_demote(NULL);
> > > +		smp_call_function(restore_c1_auto_demote, NULL,
> > > 0);
> > > +		preempt_enable();
> > > +	}
> > > +
> > >  	pmc_core_send_ltr_ignore(pmcdev, 3, 0);
> > >  
> > >  	return pmc_core_resume_common(pmcdev);
> > 
> 
> 


  reply	other threads:[~2024-10-11 16:36 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-11  0:36 [PATCH V2 1/2] platform/x86/intel/pmc: Refactor platform resume functions to use cnl_resume() David E. Box
2024-10-11  0:36 ` [PATCH V2 2/2] platform/x86/intel/pmc: Disable C1 auto-demotion during suspend David E. Box
2024-10-11  2:09   ` srinivas pandruvada
2024-10-11  3:50     ` David E. Box
2024-10-11 16:36       ` srinivas pandruvada [this message]
2024-10-11 11:05   ` Rafael J. Wysocki
2024-10-13  0:40   ` srinivas pandruvada

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=462d0bd9eb9c461e01ef27a8da9cd02f92ce8f9f.camel@linux.intel.com \
    --to=srinivas.pandruvada@linux.intel.com \
    --cc=david.e.box@linux.intel.com \
    --cc=hdegoede@redhat.com \
    --cc=ilpo.jarvinen@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.