From: Stephen Boyd <sboyd@codeaurora.org>
To: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Mike Turquette <mturquette@linaro.org>,
Viresh Kumar <viresh.kumar@linaro.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Jason Cooper <jason@lakedaemon.net>, Andrew Lunn <andrew@lunn.ch>,
Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>,
Gregory Clement <gregory.clement@free-electrons.com>,
Lior Amsalem <alior@marvell.com>,
Tawfik Bayouk <tawfik@marvell.com>,
linux-pm@vger.kernel.org, Nadav Haklai <nadavh@marvell.com>,
Ezequiel Garcia <ezequiel.garcia@free-electrons.com>,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCHv2 1/8] clk: add an APPLY_RATE_CHANGE notifier event during clk_set_rate()
Date: Mon, 07 Jul 2014 16:44:18 -0700 [thread overview]
Message-ID: <53BB30D2.3010908@codeaurora.org> (raw)
In-Reply-To: <1404744702-32010-2-git-send-email-thomas.petazzoni@free-electrons.com>
On 07/07/14 07:51, Thomas Petazzoni wrote:
> The current clk_set_rate() logic allows notifiers to be notified of
> three different events:
>
> * PRE_RATE_CHANGE: before the clock driver ->set_rate() function is
> called.
> * ABORT_RATE_CHANGE: called if the rate change failed
> * POST_RATE_CHANGE: called after the rate change has been
> successfully done, but after ->recalc_rate() has been called, and
> only if the rate of the clock has actually changed.
>
> This commit adds an additional APPLY_RATE_CHANGE, which we require on
> Armada XP to implement dynamic frequency scaling of the CPU
> clocks. The problem is as follows.
>
> On Armada XP, there are three hardware blocks involved in the dynamic
> frequency scaling of the CPU clocks:
>
> - The CPU clocks hardware block itself, whose registers are already
> "managed" by drivers/clk/mvebu/clk-cpu.c (compatible string:
> marvell,armada-xp-cpu-clock). The driver currently only supports
> changing the rate of the CPU clock when the clock is off (i.e
> before we boot the secondary CPUs).
>
> - The PMU DFS registers, which are used to configure the target
> frequency for a dynamic rate change. Those registers are relatively
> well isolated from other PMU registers, so they can also be
> "managed" by the drivers/clk/mvebu/clk-cpu.c.
>
> - The PMSU registers, which are used to actually trigger the dynamic
> frequency change procedure, which consists in programming a bunch
> of PMSU registers, entering the idle state on the CPU we want to
> change the frequency, and then again reprogram a bunch of PMSU
> registers.
>
> The procedure to change the frequency is:
>
> 1/ Reset some clocks using the CPU clocks hardware block.
> 2/ Define the target frequency using the PMU DFS registers.
> 3/ Do the actual frequency change using the PMSU registers.
>
> However, the PMSU registers are already "managed" by a driver in
> arch/arm/mach-mvebu/pmsu.c, and the code there is needed for a wide
> variety of power management activities: booting of secondary CPUs, CPU
> hotplug, cpuidle, cpufreq, and soon suspend/resume. The same registers
> in the PMSU are used for several of those activities.
>
> So, what we need to do is to have steps (1) and (2) above done in the
> CPU clocks driver, and then step (3) done through a clk notifier.
>
> However, the current POST_RATE_CHANGE notifier is called too late
> (after ->recalc_rate) and only if the rate has changed. So it works
> fine for a pure notification of a frequency change, but it doesn't
> work if the notified code is actually involved in the frequency
> change, which is exactly the case we have here. Until the sequence
> that uses the PMSU registers has been executed, the rate of the CPU
> clock has not changed.
>
> In order to solve this problem, we propose to add an APPLY_RATE_CHANGE
> notifier event, which gets called right after ->set_rate(), but before
> ->recalc_rate(), and therefore regardless of whether there was an
> actualy frequency change or not.
Is there any reason why we can't call the pmsu code (part #3) directly
from the cpu clock driver? It seems like if we just called the
.set_rate() op we wouldn't actually have changed the clock's rate. That
doesn't seem very intuitive and it really makes the code flow hard to
follow.
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
WARNING: multiple messages have this Message-ID (diff)
From: sboyd@codeaurora.org (Stephen Boyd)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCHv2 1/8] clk: add an APPLY_RATE_CHANGE notifier event during clk_set_rate()
Date: Mon, 07 Jul 2014 16:44:18 -0700 [thread overview]
Message-ID: <53BB30D2.3010908@codeaurora.org> (raw)
In-Reply-To: <1404744702-32010-2-git-send-email-thomas.petazzoni@free-electrons.com>
On 07/07/14 07:51, Thomas Petazzoni wrote:
> The current clk_set_rate() logic allows notifiers to be notified of
> three different events:
>
> * PRE_RATE_CHANGE: before the clock driver ->set_rate() function is
> called.
> * ABORT_RATE_CHANGE: called if the rate change failed
> * POST_RATE_CHANGE: called after the rate change has been
> successfully done, but after ->recalc_rate() has been called, and
> only if the rate of the clock has actually changed.
>
> This commit adds an additional APPLY_RATE_CHANGE, which we require on
> Armada XP to implement dynamic frequency scaling of the CPU
> clocks. The problem is as follows.
>
> On Armada XP, there are three hardware blocks involved in the dynamic
> frequency scaling of the CPU clocks:
>
> - The CPU clocks hardware block itself, whose registers are already
> "managed" by drivers/clk/mvebu/clk-cpu.c (compatible string:
> marvell,armada-xp-cpu-clock). The driver currently only supports
> changing the rate of the CPU clock when the clock is off (i.e
> before we boot the secondary CPUs).
>
> - The PMU DFS registers, which are used to configure the target
> frequency for a dynamic rate change. Those registers are relatively
> well isolated from other PMU registers, so they can also be
> "managed" by the drivers/clk/mvebu/clk-cpu.c.
>
> - The PMSU registers, which are used to actually trigger the dynamic
> frequency change procedure, which consists in programming a bunch
> of PMSU registers, entering the idle state on the CPU we want to
> change the frequency, and then again reprogram a bunch of PMSU
> registers.
>
> The procedure to change the frequency is:
>
> 1/ Reset some clocks using the CPU clocks hardware block.
> 2/ Define the target frequency using the PMU DFS registers.
> 3/ Do the actual frequency change using the PMSU registers.
>
> However, the PMSU registers are already "managed" by a driver in
> arch/arm/mach-mvebu/pmsu.c, and the code there is needed for a wide
> variety of power management activities: booting of secondary CPUs, CPU
> hotplug, cpuidle, cpufreq, and soon suspend/resume. The same registers
> in the PMSU are used for several of those activities.
>
> So, what we need to do is to have steps (1) and (2) above done in the
> CPU clocks driver, and then step (3) done through a clk notifier.
>
> However, the current POST_RATE_CHANGE notifier is called too late
> (after ->recalc_rate) and only if the rate has changed. So it works
> fine for a pure notification of a frequency change, but it doesn't
> work if the notified code is actually involved in the frequency
> change, which is exactly the case we have here. Until the sequence
> that uses the PMSU registers has been executed, the rate of the CPU
> clock has not changed.
>
> In order to solve this problem, we propose to add an APPLY_RATE_CHANGE
> notifier event, which gets called right after ->set_rate(), but before
> ->recalc_rate(), and therefore regardless of whether there was an
> actualy frequency change or not.
Is there any reason why we can't call the pmsu code (part #3) directly
from the cpu clock driver? It seems like if we just called the
.set_rate() op we wouldn't actually have changed the clock's rate. That
doesn't seem very intuitive and it really makes the code flow hard to
follow.
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
next prev parent reply other threads:[~2014-07-07 23:44 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-07 14:51 [PATCHv2 0/8] cpufreq support for Marvell Armada XP Thomas Petazzoni
2014-07-07 14:51 ` Thomas Petazzoni
2014-07-07 14:51 ` [PATCHv2 1/8] clk: add an APPLY_RATE_CHANGE notifier event during clk_set_rate() Thomas Petazzoni
2014-07-07 14:51 ` Thomas Petazzoni
2014-07-07 23:44 ` Stephen Boyd [this message]
2014-07-07 23:44 ` Stephen Boyd
2014-07-08 7:15 ` Thomas Petazzoni
2014-07-08 7:15 ` Thomas Petazzoni
2014-07-08 20:18 ` Stephen Boyd
2014-07-08 20:18 ` Stephen Boyd
2014-07-08 20:25 ` Thomas Petazzoni
2014-07-08 20:25 ` Thomas Petazzoni
2014-07-07 14:51 ` [PATCHv2 2/8] clk: mvebu: extend clk-cpu for dynamic frequency scaling Thomas Petazzoni
2014-07-07 14:51 ` Thomas Petazzoni
2014-07-07 14:51 ` [PATCHv2 3/8] ARM: mvebu: ensure CPU clocks are enabled Thomas Petazzoni
2014-07-07 14:51 ` Thomas Petazzoni
2014-07-07 14:51 ` [PATCHv2 4/8] ARM: mvebu: extend PMSU code to support dynamic frequency scaling Thomas Petazzoni
2014-07-07 14:51 ` Thomas Petazzoni
2014-07-08 13:05 ` Ezequiel Garcia
2014-07-08 13:05 ` Ezequiel Garcia
2014-07-07 14:51 ` [PATCHv2 5/8] ARM: mvebu: update Armada XP DT for " Thomas Petazzoni
2014-07-07 14:51 ` Thomas Petazzoni
2014-07-07 14:51 ` [PATCHv2 6/8] ARM: mvebu: allow enabling of cpufreq on Armada XP Thomas Petazzoni
2014-07-07 14:51 ` Thomas Petazzoni
2014-07-07 14:51 ` [PATCHv2 7/8] ARM: mvebu: update mvebu_v7_defconfig with cpufreq support Thomas Petazzoni
2014-07-07 14:51 ` Thomas Petazzoni
2014-07-07 14:51 ` [PATCHv2 8/8] ARM: configs: add cpufreq-generic in multi_v7_defconfig Thomas Petazzoni
2014-07-07 14:51 ` Thomas Petazzoni
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=53BB30D2.3010908@codeaurora.org \
--to=sboyd@codeaurora.org \
--cc=alior@marvell.com \
--cc=andrew@lunn.ch \
--cc=ezequiel.garcia@free-electrons.com \
--cc=gregory.clement@free-electrons.com \
--cc=jason@lakedaemon.net \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-pm@vger.kernel.org \
--cc=mturquette@linaro.org \
--cc=nadavh@marvell.com \
--cc=rjw@rjwysocki.net \
--cc=sebastian.hesselbarth@gmail.com \
--cc=tawfik@marvell.com \
--cc=thomas.petazzoni@free-electrons.com \
--cc=viresh.kumar@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 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.