All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Boyd <sboyd@kernel.org>
To: Abel Vesa <abel.vesa@linaro.org>
Cc: Andy Gross <agross@kernel.org>,
	Bjorn Andersson <andersson@kernel.org>,
	Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
	Konrad Dybcio <konrad.dybcio@linaro.org>,
	Mike Turquette <mturquette@baylibre.com>,
	linux-clk@vger.kernel.org,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	linux-arm-msm@vger.kernel.org, mka@chromium.org,
	Saravana Kannan <saravanak@google.com>
Subject: Re: [PATCH v3 1/2] clk: Add generic sync_state callback for disabling unused clocks
Date: Tue, 21 Feb 2023 10:44:19 -0800	[thread overview]
Message-ID: <0cbf23f481ebb50f955001d6e845a165.sboyd@kernel.org> (raw)
In-Reply-To: <Y/OV3CF0ootyooDJ@linaro.org>

Quoting Abel Vesa (2023-02-20 07:46:36)
> On 23-02-17 21:38:22, Stephen Boyd wrote:
> > Quoting Abel Vesa (2022-12-27 12:45:27)
> > > There are unused clocks that need to remain untouched by clk_disable_unused,
> > > and most likely could be disabled later on sync_state. So provide a generic
> > > sync_state callback for the clock providers that register such clocks.
> > > Then, use the same mechanism as clk_disable_unused from that generic
> > > callback, but pass the device to make sure only the clocks belonging to
> > > the current clock provider get disabled, if unused. Also, during the
> > > default clk_disable_unused, if the driver that registered the clock has
> > > the generic clk_sync_state_disable_unused callback set for sync_state,
> > > skip disabling its clocks.
> > 
> > How does that avoid disabling clks randomly in the clk tree? I'm
> > concerned about disabling an unused clk in the middle of the tree
> > because it doesn't have a driver using sync state, while the clk is the
> > parent of an unused clk that is backed by sync state.
> > 
> >    clk A -->  clk B 
> > 
> > clk A: No sync state
> > clk B: sync state
> > 
> > clk B is left on by the bootloader. __clk_disable_unused(NULL) is called
> > from late init. Imagine clk A is the root of the tree.
> > 
> >       clk_disable_unused_subtree(clk_core A)
> >         clk_disable_unused_subtree(clk_core B)
> >           if (from_sync_state && core->dev != dev)
> >             return;
> >         ...
> >         clk core A->ops->disable()
> > 
> > clk core B is off now?
> 
> Yes, that is correct. But the same thing is happening currently if the
> clk_ignore_unused in not specified.

The existing code traverses the clk tree in depth-first order, disabling
clks from the leaves up to the root. This breaks that tree walk. It is
not the same thing.

> At least with this new approach, we
> get to leave unused clocks enabled either until sync_state is called or forever.
> All the provider has to do is to implement a sync_state callback (or use
> the generic one provided). So the provider of clk A would obviously need
> a sync state callback registered.

Sure.

> 
> > 
> > Also sync_state seems broken right now. I saw mka mentioned that if you
> > have a device node enabled in your DT but never enable a driver for it
> > in the kernel we'll never get sync_state called. This is another
> > problem, but it concerns me that sync_state would make the unused clk
> > disabling happen at some random time or not at all.
> 
> Well, the fact that the sync state not being called because a driver for
> a consumer device doesn't probe does not really mean it is broken. Just
> because the consumer driver hasn't probed yet, doesn't mean it will
> not probe later on.
> 
> That aside, rather than going with clk_ignore_unused all the time on
> qcom platforms, at least in a perfect scenario (where sync state is
> reached for all providers) the clocks get disabled.

The clks will get disabled in some random order though even if every clk
provider has sync_state.

> 
> > 
> > Can the problem be approached more directly? If this is about fixing
> > continuous splash screen, then I wonder why we can't list out the clks
> > that we know are enabled by the bootloader in some new DT binding, e.g.:
> > 
> >       clock-controller {
> >               #clock-cells = <1>;
> >               boot-handoff-clocks = <&consumer_device "clock cells for this clk provider">;
> >       };
> > 
> > Then mark those as "critical/don't turn off" all the way up the clk tree
> > when the clk driver probes by essentially incrementing the
> > prepare/enable count but not actually touching the hardware, and when
> > the clks are acquired by clk_get() for that device that's using them
> > from boot we make the first clk_prepare_enable() do nothing and not
> > increment the count at all. We can probably stick some flag into the
> > 'struct clk' for this when we create the handle in clk_get() so that the
> > prepare and enable functions can special case and skip over.
> 
> Well, that means we need to play whack-a-mole by alsways adding such clocks to
> devicetree.

I don't think the bootloader is constantly changing. Either we want to
hand off the enable state to devices that are using them from boot, or
we don't. I doubt that is changing outside of bootloader development
time.

> 
> > 
> > The sync_state hook operates on a driver level, which is too large when
> > you consider that a single clk driver may register hundreds of clks that
> > are not related. We want to target a solution at the clk level so that
> > any damage from keeping on all the clks provided by the controller is
> > limited to just the drivers that aren't probed and ready to handle their
> > clks. If sync_state could be called whenever a clk consumer consumes a
> > clk it may work? Technically we already have that by the clk_hw_provider
> > function but there isn't enough information being passed there, like the
> > getting device.
> 
> Actually, from the multitude of clocks registered by one provider, the
> ones already explicitely enabled (and obvisously their parents) by thier
> consumer are safe. The only ones we need to worry about are the ones that
> might be enabled by bootloader and need to remain on. With the sync state
> approach, the latter mentioned clocks will either remain on indefinitely
> or will be disabled on sync state. The provider driver is the only level
> that has a registered sync state callback.
> 

The driver has sync_state callback, yes. I'm saying that it is too wide
of a scope to implement disabling unused clks via the sync_state
callback.

  parent reply	other threads:[~2023-02-21 18:44 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-27 20:45 [PATCH v3 1/2] clk: Add generic sync_state callback for disabling unused clocks Abel Vesa
2022-12-27 20:45 ` [PATCH v3 2/2] clk: qcom: sdm845: Use generic clk_sync_state_disable_unused callback Abel Vesa
2023-01-05 14:03   ` Dmitry Baryshkov
2023-01-05 14:03 ` [PATCH v3 1/2] clk: Add generic sync_state callback for disabling unused clocks Dmitry Baryshkov
2023-01-06 17:22 ` Bjorn Andersson
2023-01-10 17:17 ` (subset) " Bjorn Andersson
2023-02-18  5:38 ` Stephen Boyd
2023-02-20 15:46   ` Abel Vesa
2023-02-20 16:27     ` Abel Vesa
2023-02-20 17:51       ` Saravana Kannan
2023-02-20 18:47         ` Abel Vesa
2023-02-21 19:58           ` Saravana Kannan
2023-02-22  7:57             ` Abel Vesa
2023-05-11 12:58             ` Abel Vesa
2023-05-12  0:46               ` Saravana Kannan
2023-05-12 10:30                 ` Abel Vesa
2023-05-27  0:13                   ` Saravana Kannan
2023-02-20 16:33     ` Bjorn Andersson
2023-02-21 18:44     ` Stephen Boyd [this message]
2023-02-20 16:21   ` Bjorn Andersson
2023-02-21 19:24     ` Stephen Boyd
2023-02-22 15:34       ` 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=0cbf23f481ebb50f955001d6e845a165.sboyd@kernel.org \
    --to=sboyd@kernel.org \
    --cc=abel.vesa@linaro.org \
    --cc=agross@kernel.org \
    --cc=andersson@kernel.org \
    --cc=dmitry.baryshkov@linaro.org \
    --cc=konrad.dybcio@linaro.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mka@chromium.org \
    --cc=mturquette@baylibre.com \
    --cc=saravanak@google.com \
    /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.