From: Maxime Ripard <maxime@cerno.tech>
To: Samuel Holland <samuel@sholland.org>
Cc: Stephen Boyd <sboyd@kernel.org>,
Michael Turquette <mturquette@baylibre.com>,
Andy Gross <agross@kernel.org>,
Bjorn Andersson <bjorn.andersson@linaro.org>,
linux-arm-msm@vger.kernel.org, linux-clk@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH RESEND 1/2] clk: Implement protected-clocks for all OF clock providers
Date: Thu, 3 Sep 2020 09:31:59 +0200 [thread overview]
Message-ID: <20200903073159.2tabexowuo7wgdnh@gilmour.lan> (raw)
In-Reply-To: <20200903040015.5627-2-samuel@sholland.org>
[-- Attachment #1: Type: text/plain, Size: 2899 bytes --]
On Wed, Sep 02, 2020 at 11:00:14PM -0500, Samuel Holland wrote:
> This is a generic implementation of the "protected-clocks" property from
> the common clock binding. It allows firmware to inform the OS about
> clocks that must not be disabled while the OS is running.
>
> This implementation comes with some caveats:
>
> 1) Clocks that have CLK_IS_CRITICAL in their init data are prepared/
> enabled before they are attached to the clock tree. protected-clocks are
> only protected once the clock provider is added, which is generally
> after all of the clocks it provides have been registered. This leaves a
> window of opportunity where something could disable or modify the clock,
> such as a driver running on another CPU, or the clock core itself. There
> is a comment to this effect in __clk_core_init():
>
> /*
> * Enable CLK_IS_CRITICAL clocks so newly added critical clocks
> * don't get accidentally disabled when walking the orphan tree and
> * reparenting clocks
> */
>
> Similarly, these clocks will be enabled after they are first reparented,
> unlike other CLK_IS_CRITICAL clocks. See the comment in
> clk_core_reparent_orphans_nolock():
>
> /*
> * We need to use __clk_set_parent_before() and _after() to
> * to properly migrate any prepare/enable count of the orphan
> * clock. This is important for CLK_IS_CRITICAL clocks, which
> * are enabled during init but might not have a parent yet.
> */
>
> Ideally we could detect protected clocks before they are reparented, but
> there are two problems with that:
>
> a) From the clock core's perspective, hw->init is const.
>
> b) The clock core doesn't see the device_node until __clk_register is
> called on the first clock.
>
> So the only "race-free" way to detect protected-clocks is to do it in
> the middle of __clk_register, between when core->flags is initialized
> and calling __clk_core_init(). That requires scanning the device tree
> again for each clock, which is part of why I didn't do it that way.
>
> 2) __clk_protect needs to be idempotent, for two reasons:
>
> a) Clocks with CLK_IS_CRITICAL in their init data are already
> prepared/enabled, and we don't want to prepare/enable them again.
>
> b) of_clk_set_defaults() is called twice for (at least some) clock
> controllers registered with CLK_OF_DECLARE. It is called first in
> of_clk_add_provider()/of_clk_add_hw_provider() inside clk_init_cb,
> and again afterward in of_clk_init(). The second call in
> of_clk_init() may be unnecessary, but verifying that would require
> auditing all users of CLK_OF_DECLARE to ensure they called one of
> the of_clk_add{,_hw}_provider functions.
>
> Signed-off-by: Samuel Holland <samuel@sholland.org>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
next prev parent reply other threads:[~2020-09-03 7:32 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-03 4:00 [PATCH RESEND 0/2] Common protected-clocks implementation Samuel Holland
2020-09-03 4:00 ` [PATCH RESEND 1/2] clk: Implement protected-clocks for all OF clock providers Samuel Holland
2020-09-03 7:31 ` Maxime Ripard [this message]
2020-09-03 4:00 ` [PATCH RESEND 2/2] Revert "clk: qcom: Support 'protected-clocks' property" Samuel Holland
2021-03-09 8:03 ` [PATCH RESEND 0/2] Common protected-clocks implementation Rasmus Villemoes
2021-03-10 8:56 ` Maxime Ripard
2021-03-10 14:12 ` Samuel Holland
2021-03-10 20:13 ` 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=20200903073159.2tabexowuo7wgdnh@gilmour.lan \
--to=maxime@cerno.tech \
--cc=agross@kernel.org \
--cc=bjorn.andersson@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mturquette@baylibre.com \
--cc=samuel@sholland.org \
--cc=sboyd@kernel.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