From: Maxime Ripard <maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
To: "Ondřej Jirman" <megous-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
Cc: dev-3kdeTeqwOZ9EV1b7eY7vFQ@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
"Michael Turquette"
<mturquette-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>,
"Stephen Boyd" <sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
"Rob Herring" <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
"Mark Rutland" <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
"Chen-Yu Tsai" <wens-jdAy2FN1RRM@public.gmane.org>,
"Emilio López" <emilio-0Z03zUJReD5OxF6Tv1QG9Q@public.gmane.org>,
"open list:COMMON CLK FRAMEWORK"
<linux-clk-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
"open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS"
<devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
"open list"
<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH v2 06/14] ARM: sun8i: clk: Add clk-factor rate application method
Date: Fri, 15 Jul 2016 10:53:56 +0200 [thread overview]
Message-ID: <20160715085356.GR4761@lukather> (raw)
In-Reply-To: <0b71ed7e-98c9-109e-85e6-ceb95131d88a-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 5795 bytes --]
On Fri, Jul 01, 2016 at 02:50:57AM +0200, Ondřej Jirman wrote:
> >> /**
> >> + * sun8i_h3_apply_pll1_factors() - applies n, k, m, p factors to the
> >> + * register using an algorithm that tries to reserve the PLL lock
> >> + */
> >> +
> >> +static void sun8i_h3_apply_pll1_factors(struct clk_factors *factors, struct factors_request *req)
> >> +{
> >> + const struct clk_factors_config *config = factors->config;
> >> + u32 reg;
> >> +
> >> + /* Fetch the register value */
> >> + reg = readl(factors->reg);
> >> +
> >> + if (FACTOR_GET(config->pshift, config->pwidth, reg) < req->p) {
> >> + reg = FACTOR_SET(config->pshift, config->pwidth, reg, req->p);
> >> +
> >> + writel(reg, factors->reg);
> >> + __delay(2000);
> >> + }
> >
> > So there was some doubts about the fact that P was being used, or at
> > least that it was useful.
>
> p is necessary to reduce frequencies below 288 MHz according to the
> datasheet.
Yes, but you could reach those frequencies without P, too, and it's
not part of any OPP provided by Allwinner.
> >> + if (FACTOR_GET(config->mshift, config->mwidth, reg) < req->m) {
> >> + reg = FACTOR_SET(config->mshift, config->mwidth, reg, req->m);
> >> +
> >> + writel(reg, factors->reg);
> >> + __delay(2000);
> >> + }
> >> +
> >> + reg = FACTOR_SET(config->nshift, config->nwidth, reg, req->n);
> >> + reg = FACTOR_SET(config->kshift, config->kwidth, reg, req->k);
> >> +
> >> + writel(reg, factors->reg);
> >> + __delay(20);
> >> +
> >> + while (!(readl(factors->reg) & (1 << config->lock)));
> >
> > So, they are applying the dividers first, and then applying the
> > multipliers, and then wait for the PLL to stabilize.
>
> Not exactly, first we are increasing dividers if the new dividers are
> higher that that what's already set. This ensures that because
> application of dividers is immediate by the design of the PLL, the
> application of multipliers isn't. So the VCO would still run at the same
> frequency for a while gradually rising to a new value for example,
> while the dividers would be reduced immediately. Leading to crash.
>
> PLL
> --------------------------
> PRE DIV(f0) -> VCO(f1) -> POST DIV(f2)
> P K,N M
>
> Example: (we set all factors at once, reducing dividers and multipliers
> at the same time at 0ms - this should lead to no change in the output
> frequency, but...)
>
> -1ms: f0 = 24MHz, f1 = 2GHz, f2 = 1GHz
> 0ms: f0 = 24MHz, f1 = 2GHz, f2 = 2GHz - boom
> 1ms: f0 = 24MHz, f1 = 1.5GHz, f2 = 1.5GHz
> 2ms: f0 = 24MHz, f1 = 1GHz, f2 = 1GHz
>
> The current code crashes exactly at boom, you don't get any more
> instructions to execute.
>
> See.
>
> So this patch first increases dividers (only if necessary), changes
> multipliers and waits for change to happen (takes around 2000 cycles),
> and then decreases dividers (only if necessary).
>
> So we get:
>
> -1ms: f0 = 24MHz, f1 = 2GHz, f2 = 1GHz
> 0ms: f0 = 24MHz, f1 = 2GHz, f2 = 1GHz - no boom, multiplier
> reduced
> 1ms: f0 = 24MHz, f1 = 1.5GHz, f2 = 0.75GHz
> 1.9ms: f0 = 24MHz, f1 = 1GHz, f2 = 0.5GHz - we got PLL sync
> 2ms: f0 = 24MHz, f1 = 1GHz, f2 = 1GHz - and here we reduce divider
> at last
Awesome explanation, thanks!
So I guess it really all boils down to the fact that the CPU is
clocked way outside of it's operating frequency while the PLL
stabilizes, right?
If so, then yes, trying to switch to the 24MHz oscillator before
applying the factors, and then switching back when the PLL is stable
would be a nice solution.
I just checked, and all the SoCs we've had so far have that
possibility, so if it works, for now, I'd like to stick to that.
> >> +
> >> + if (FACTOR_GET(config->mshift, config->mwidth, reg) > req->m) {
> >> + reg = FACTOR_SET(config->mshift, config->mwidth, reg, req->m);
> >> +
> >> + writel(reg, factors->reg);
> >> + __delay(2000);
> >> + }
> >> +
> >> + if (FACTOR_GET(config->pshift, config->pwidth, reg) > req->p) {
> >> + reg = FACTOR_SET(config->pshift, config->pwidth, reg, req->p);
> >> +
> >> + writel(reg, factors->reg);
> >> + __delay(2000);
> >> + }
> >
> > However, this is kind of weird, why would you need to re-apply the
> > dividers? Nothing really changes. Have you tried without that part?
>
> See above, we either increase before PLL change, or reduce dividers
> after the change. Nothing is re-applied.
>
> > Since this is really specific, I guess you could simply make the
> > clk_ops for the nkmp clocks public, and just re-implement set_rate
> > using that logic.
>
> I would argue that this may be necessary for other PLL clocks too, if
> you can get out of bounds output frequency, by changing the dividers too
> early or too late. So perhaps this code should be generalized for other
> PLL clocks too, instead.
We can scale down the problem a bit. The only PLL we modify are the
CPU, audio and video ones.
The CPU should definitely be addressed, but what would be the outcome
of an out of bounds audio pll for example? Is it just taking more time
to stabilize, or would it hurt the system?
In the former case, then we can just wait. In the latter, we of course
need to come up with a solution.
Maxime
--
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
--
You received this message because you are subscribed to the Google Groups "linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit https://groups.google.com/d/optout.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2016-07-15 8:53 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20160625034511.7966-1-megous@megous.com>
[not found] ` <20160625034511.7966-1-megous-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-06-25 3:44 ` [PATCH v2 01/14] ARM: clk: sunxi: Add driver for the H3 THS clock megous-5qf/QAjKc83QT0dZR+AlfA
[not found] ` <20160625034511.7966-2-megous-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-06-25 7:13 ` Maxime Ripard
2016-06-25 15:23 ` Ondřej Jirman
[not found] ` <6a37450f-35fe-3296-da4b-10f7d645e2b9-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-06-28 11:52 ` Maxime Ripard
2016-06-25 3:45 ` [PATCH v2 03/14] dt-bindings: document sun8i_ths - H3 thermal sensor driver megous-5qf/QAjKc83QT0dZR+AlfA
[not found] ` <20160625034511.7966-4-megous-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-06-28 20:56 ` Rob Herring
2016-06-25 3:45 ` [PATCH v2 05/14] dt-bindings: document SY8106A regulator driver megous-5qf/QAjKc83QT0dZR+AlfA
[not found] ` <20160625034511.7966-6-megous-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-06-26 11:27 ` Mark Brown
[not found] ` <20160626112720.GL28202-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2016-06-26 15:10 ` Ondřej Jirman
[not found] ` <e8508fa7-bd98-9171-0c9a-59e059573692-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-06-26 18:52 ` Mark Brown
2016-06-25 3:45 ` [PATCH v2 06/14] ARM: sun8i: clk: Add clk-factor rate application method megous-5qf/QAjKc83QT0dZR+AlfA
[not found] ` <20160625034511.7966-7-megous-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-06-30 20:40 ` Maxime Ripard
2016-07-01 0:50 ` Ondřej Jirman
2016-07-01 5:37 ` Jean-Francois Moine
[not found] ` <20160701073710.1a1fc684ae448577bad5b0db-GANU6spQydw@public.gmane.org>
2016-07-01 6:34 ` Ondřej Jirman
[not found] ` <643c2648-ddd6-700a-68c0-2981134965c0-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-07-01 7:47 ` Jean-Francois Moine
[not found] ` <0b71ed7e-98c9-109e-85e6-ceb95131d88a-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-07-15 8:53 ` Maxime Ripard [this message]
2016-07-15 10:38 ` Ondřej Jirman
2016-07-15 13:27 ` Jean-Francois Moine
[not found] ` <20160715152756.db7375a7109fed18c2fbf43a-GANU6spQydw@public.gmane.org>
2016-07-15 13:48 ` Ondřej Jirman
2016-07-15 14:22 ` [linux-sunxi] " Michal Suchanek
2016-07-15 16:33 ` Ondřej Jirman
2016-07-21 9:51 ` Maxime Ripard
[not found] ` <085e185a-ac76-dd3f-9b0e-a7dc9c0c09f3-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-07-21 9:48 ` Maxime Ripard
2016-07-21 9:52 ` Ondřej Jirman
2016-07-26 6:32 ` Maxime Ripard
2016-07-28 11:27 ` Changed: sunxi-ng clock code - NKMP clock implementation is wrong Ondřej Jirman
2016-07-28 11:38 ` [linux-sunxi] " Chen-Yu Tsai
[not found] ` <e1b8127f-c422-46ab-384b-aeee85aa940b-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-07-28 21:00 ` Maxime Ripard
2016-07-28 22:01 ` Ondřej Jirman
[not found] ` <7c5f2835-f044-7c18-def9-52af5ce4afc3-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-07-31 10:31 ` Maxime Ripard
2016-07-31 22:01 ` Ondřej Jirman
[not found] ` <9175af7e-e1b1-df88-de2b-16f0e8d719c1-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-08-31 20:25 ` Maxime Ripard
2016-07-01 0:53 ` [PATCH v2 06/14] ARM: sun8i: clk: Add clk-factor rate application method Ondřej Jirman
[not found] ` <64d0c1e2-d818-0806-7c92-c10603b4f6f5-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-07-15 8:19 ` Maxime Ripard
2016-06-25 3:45 ` [PATCH v2 07/14] ARM: dts: sun8i: Use sun8i-h3-pll1-clk for pll1 in H3 megous-5qf/QAjKc83QT0dZR+AlfA
2016-06-25 3:45 ` [PATCH v2 08/14] ARM: dts: sun8i: Add thermal sensor node to the sun8i-h3.dtsi megous-5qf/QAjKc83QT0dZR+AlfA
2016-06-25 3:45 ` [PATCH v2 09/14] ARM: dts: sun8i: Add cpu0 label to sun8i-h3.dtsi megous-5qf/QAjKc83QT0dZR+AlfA
2016-06-25 3:45 ` [PATCH v2 10/14] ARM: dts: sun8i: Add r_twi I2C controller megous-5qf/QAjKc83QT0dZR+AlfA
[not found] ` <20160625034511.7966-11-megous-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-06-25 7:16 ` Maxime Ripard
2016-06-25 3:45 ` [PATCH v2 11/14] ARM: dts: sun8i: Add sy8106a regulator to Orange Pi PC megous-5qf/QAjKc83QT0dZR+AlfA
2016-06-25 3:45 ` [PATCH v2 12/14] ARM: dts: sun8i: Setup CPU operating points for Onrage PI PC megous-5qf/QAjKc83QT0dZR+AlfA
2016-06-25 3:45 ` [PATCH v2 13/14] ARM: dts: sun8i: Add gpio-regulator used on Orange Pi One megous-5qf/QAjKc83QT0dZR+AlfA
[not found] ` <20160625034511.7966-14-megous-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-06-25 7:18 ` Maxime Ripard
2016-06-25 3:45 ` [PATCH v2 14/14] ARM: dts: sun8i: Enable DVFS " megous-5qf/QAjKc83QT0dZR+AlfA
2016-06-30 11:13 ` [linux-sunxi] " Michal Suchanek
[not found] ` <CAOMqctTe==M1SXxbdR8y33yh51fiFGn+oSaKJXhbnpLVTn-New-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-06-30 14:19 ` Ondřej Jirman
[not found] ` <834b8045-d99f-74a3-0353-aa84b897351d-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
2016-06-30 15:16 ` Michal Suchanek
[not found] ` <CAOMqctSbJOB67a=LiCZVUb-wUMCpeJPd81OL5epYkC2p5X1T-g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-06-30 15:32 ` Ondřej Jirman
2016-06-30 15:50 ` Michal Suchanek
[not found] ` <CAOMqctR+SBfo9UZxXuACz858ehXpa2jGHZw_-70dbUFX3Q_0CQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-06-30 15:53 ` Ondřej Jirman
2016-07-01 10:54 ` Michal Suchanek
2016-06-30 14:23 ` Siarhei Siamashka
2016-07-01 1:17 ` Ondřej Jirman
2016-07-22 0:41 ` Ondřej Jirman
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=20160715085356.GR4761@lukather \
--to=maxime.ripard-wi1+55scjutkeb57/3fjtnbpr1lh4cv8@public.gmane.org \
--cc=dev-3kdeTeqwOZ9EV1b7eY7vFQ@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=emilio-0Z03zUJReD5OxF6Tv1QG9Q@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-clk-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
--cc=megous-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org \
--cc=mturquette-rdvid1DuHRBWk0Htik3J/w@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=wens-jdAy2FN1RRM@public.gmane.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;
as well as URLs for NNTP newsgroup(s).