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: Thu, 21 Jul 2016 11:48:52 +0200 [thread overview]
Message-ID: <20160721094852.GI5993@lukather> (raw)
In-Reply-To: <085e185a-ac76-dd3f-9b0e-a7dc9c0c09f3-5qf/QAjKc83QT0dZR+AlfA@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 6394 bytes --]
On Fri, Jul 15, 2016 at 12:38:54PM +0200, Ondřej Jirman wrote:
> On 15.7.2016 10:53, Maxime Ripard wrote:
> > 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.
>
> The arisc firmware for H3 contains table of factors for frequences from
> 0 to 2GHz and, P is used below 240MHz. M is never used, BTW. (other
> datasheets specify M as for testing use only, whatever that means - not
> H3, but it seems it's the same PLL block)
Interesting. Which SoCs in particular?
> >>>> + 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?
>
> It may be, depending on the factors before and after change. I haven't
> tested what factors the mainline kernel calculates for each frequency.
> The arisc never uses M, and only uses P at frequencies that would not
> allow for this behavior.
>
> I created a test program for arisc that runs a loop on the main CPU
> using msgbox to send pings to the arisc CPU, and the vary the PLL1
> randomly from the arisc, and haven't been able to lockup the main CPU
> yet with either method.
>
> There's also AXI clock, that depends on PLL1. Arisc firmware uses the
> same method to change it while changing CPUX clock. If the clock would
> rise above certain frequency, AXI divider is increased before the PLL1
> change. If it would fall below certain frequency it is decreased after
> the PLL1 change.
If we ever need to change that, we can always rely on a clock notifier
to adjust the divider before the change happen (and support all the
scenarios, like the clock change has been aborted).
> > 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.
>
> It would need to be tested. U-boot does the change only once, while the
> kernel would be doing it all the time and between various frequencies
> and PLL settings. So the issues may show up with this solution too.
That would have the benefit of being quite easy to document, not be a
huge amount of code and it would work on all the CPUs PLLs we have so
far, so still, a pretty big win. If it doesn't, of course, we don't
really have the choice.
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-21 9:48 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
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 [this message]
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=20160721094852.GI5993@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).