public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Abel Vesa <abel.vesa@linaro.org>
To: Matthias Kaehlcke <mka@chromium.org>
Cc: Bjorn Andersson <andersson@kernel.org>,
	"Rafael J . Wysocki" <rafael@kernel.org>,
	Kevin Hilman <khilman@kernel.org>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	Len Brown <len.brown@intel.com>, Pavel Machek <pavel@ucw.cz>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Andy Gross <agross@kernel.org>,
	Konrad Dybcio <konrad.dybcio@linaro.org>,
	linux-pm@vger.kernel.org,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	linux-arm-msm@vger.kernel.org,
	Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
	Stephen Boyd <sboyd@kernel.org>,
	Doug Anderson <dianders@chromium.org>
Subject: Re: [RFC PATCH v2 1/2] PM: domains: Skip disabling unused domains if provider has sync_state
Date: Mon, 6 Feb 2023 18:31:21 +0200	[thread overview]
Message-ID: <Y+ErWTyV8CnE3Hl+@linaro.org> (raw)
In-Reply-To: <Y9v/z8CYik3faHh7@google.com>

On 23-02-02 18:24:15, Matthias Kaehlcke wrote:
> Hi Abel,
> 
> On Fri, Jan 27, 2023 at 12:40:53PM +0200, Abel Vesa wrote:
> > Currently, there are cases when a domain needs to remain enabled until
> > the consumer driver probes. Sometimes such consumer drivers may be built
> > as modules. Since the genpd_power_off_unused is called too early for
> > such consumer driver modules to get a chance to probe, the domain, since
> > it is unused, will get disabled. On the other hand, the best time for
> > an unused domain to be disabled is on the provider's sync_state
> > callback. So, if the provider has registered a sync_state callback,
> > assume the unused domains for that provider will be disabled on its
> > sync_state callback. Also provide a generic sync_state callback which
> > disables all the domains unused for the provider that registers it.
> > 
> > Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
> > ---
> > 
> > This approach has been applied for unused clocks as well.
> > With this patch merged in, all the providers that have sync_state
> > callback registered will leave the domains enabled unless the provider's
> > sync_state callback explicitly disables them. So those providers will
> > need to add the disabling part to their sync_state callback. On the
> > other hand, the platforms that have cases where domains need to remain
> > enabled (even if unused) until the consumer driver probes, will be able,
> > with this patch in, to run without the pd_ignore_unused kernel argument,
> > which seems to be the case for most Qualcomm platforms, at this moment.
> 
> I recently encountered a related issue on a Qualcomm platform with a
> v6.2-rc kernel, which includes 3a39049f88e4 ("soc: qcom: rpmhpd: Use
> highest corner until sync_state"). The issue involves a DT node with a
> rpmhpd, the DT node is enabled, however the corresponding device driver
> is not enabled in the kernel. In such a scenario the sync_state callback
> is never called, because the genpd consumer never probes. As a result
> the Always-on subsystem (AOSS) of the SoC doesn't enter sleep mode during
> system suspend, which results in a substantially higher power consumption
> in S3.

If I get this correctly, one of the providers is missing (doesn't matter
the reason), in which case, your kernel needs that driver, period. There
is no reason why you would expect the consumer to work without the
provider. Or, you could just remove the property in the devicetree node,
the property that makes the consumer wait for that provider. Anyway, you
should never end up with a consumer provider relationship in devicetree
without providing the provider driver.

> 
> I wonder if genpd (and some other frameworks) needs something like
> regulator_init_complete(), which turns off unused regulators 30s after
> system boot. That's conceptually similar to the current
> genpd_power_off_unused(), but would provide time for modules being loaded.

NACK, timeouts are just another hack in this case, specially when we
have a pretty reliable mechanism like sync_state.

> 
> > The v1 is here:
> > https://lore.kernel.org/all/20230126234013.3638425-1-abel.vesa@linaro.org/
> > 
> > Changes since v1:
> >  * added a generic sync state callback to be registered by providers in
> >    order to disable the unused domains on their sync state. Also
> >    mentioned this in the commit message.
> > 
> >  drivers/base/power/domain.c | 17 ++++++++++++++++-
> >  include/linux/pm_domain.h   |  3 +++
> >  2 files changed, 19 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
> > index 84662d338188..c2a5f77c01f3 100644
> > --- a/drivers/base/power/domain.c
> > +++ b/drivers/base/power/domain.c
> > @@ -1099,7 +1099,8 @@ static int __init genpd_power_off_unused(void)
> >  	mutex_lock(&gpd_list_lock);
> >  
> >  	list_for_each_entry(genpd, &gpd_list, gpd_list_node)
> > -		genpd_queue_power_off_work(genpd);
> > +		if (!dev_has_sync_state(genpd->provider->dev))
> > +			genpd_queue_power_off_work(genpd);
> >  
> >  	mutex_unlock(&gpd_list_lock);
> >  
> > @@ -1107,6 +1108,20 @@ static int __init genpd_power_off_unused(void)
> >  }
> >  late_initcall(genpd_power_off_unused);
> >  
> > +void genpd_power_off_unused_sync_state(struct device *dev)
> > +{
> > +	struct generic_pm_domain *genpd;
> > +
> > +	mutex_lock(&gpd_list_lock);
> > +
> > +	list_for_each_entry(genpd, &gpd_list, gpd_list_node)
> > +		if (genpd->provider->dev == dev)
> > +			genpd_queue_power_off_work(genpd);
> > +
> > +	mutex_unlock(&gpd_list_lock);
> > +}
> > +EXPORT_SYMBOL_GPL(genpd_power_off_unused_sync_state);
> > +
> >  #ifdef CONFIG_PM_SLEEP
> >  
> >  /**
> > diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
> > index f776fb93eaa0..1fd5aa500c81 100644
> > --- a/include/linux/pm_domain.h
> > +++ b/include/linux/pm_domain.h
> > @@ -351,6 +351,7 @@ struct device *genpd_dev_pm_attach_by_id(struct device *dev,
> >  					 unsigned int index);
> >  struct device *genpd_dev_pm_attach_by_name(struct device *dev,
> >  					   const char *name);
> > +void genpd_power_off_unused_sync_state(struct device *dev);
> >  #else /* !CONFIG_PM_GENERIC_DOMAINS_OF */
> >  static inline int of_genpd_add_provider_simple(struct device_node *np,
> >  					struct generic_pm_domain *genpd)
> > @@ -419,6 +420,8 @@ struct generic_pm_domain *of_genpd_remove_last(struct device_node *np)
> >  {
> >  	return ERR_PTR(-EOPNOTSUPP);
> >  }
> > +
> > +static inline genpd_power_off_unused_sync_state(struct device *dev) {}
> >  #endif /* CONFIG_PM_GENERIC_DOMAINS_OF */
> >  
> >  #ifdef CONFIG_PM
> > -- 
> > 2.34.1
> > 

  parent reply	other threads:[~2023-02-06 16:31 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-27 10:40 [RFC PATCH v2 1/2] PM: domains: Skip disabling unused domains if provider has sync_state Abel Vesa
2023-01-27 10:40 ` [RFC PATCH v2 2/2] soc: qcom: rmphpd: Call the genpd unused power off sync state callback Abel Vesa
2023-02-02 18:24 ` [RFC PATCH v2 1/2] PM: domains: Skip disabling unused domains if provider has sync_state Matthias Kaehlcke
2023-02-02 19:20   ` Doug Anderson
2023-02-02 19:53   ` Dmitry Baryshkov
2023-02-02 22:20     ` Doug Anderson
2023-02-06 16:24       ` Abel Vesa
2023-02-06 17:37         ` Matthias Kaehlcke
2023-02-03  1:20     ` Matthias Kaehlcke
2023-02-03 20:00       ` Dmitry Baryshkov
2023-02-03 21:18         ` Matthias Kaehlcke
2023-02-06 16:21         ` Abel Vesa
2023-02-06 16:39           ` Abel Vesa
2023-02-06 16:31   ` Abel Vesa [this message]
2023-02-06 17:22     ` Matthias Kaehlcke
2023-02-06 17:48       ` Abel Vesa
2023-02-06 18:36         ` Matthias Kaehlcke
2023-02-06 19:32         ` Saravana Kannan
2023-02-06 21:10           ` Doug Anderson
2023-02-06 21:35             ` Saravana Kannan
2023-02-07 23:45               ` Doug Anderson
2023-02-20 17:15                 ` Bjorn Andersson
2023-02-21 18:32                   ` Matthias Kaehlcke
2023-02-22 18:51                     ` Bjorn Andersson
2023-02-23 23:20                       ` Matthias Kaehlcke
2023-03-01 22:40                   ` Doug Anderson
2023-02-15 11:57 ` Ulf Hansson
2023-02-15 12:21   ` Abel Vesa
2023-02-20 16:43     ` Bjorn Andersson

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=Y+ErWTyV8CnE3Hl+@linaro.org \
    --to=abel.vesa@linaro.org \
    --cc=agross@kernel.org \
    --cc=andersson@kernel.org \
    --cc=dianders@chromium.org \
    --cc=dmitry.baryshkov@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=khilman@kernel.org \
    --cc=konrad.dybcio@linaro.org \
    --cc=len.brown@intel.com \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mka@chromium.org \
    --cc=pavel@ucw.cz \
    --cc=rafael@kernel.org \
    --cc=sboyd@kernel.org \
    --cc=ulf.hansson@linaro.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox