From: Simon Horman <horms@verge.net.au>
To: Magnus Damm <magnus.damm@gmail.com>
Cc: Chris Ball <cjb@laptop.org>,
Yusuke Goda <yusuke.goda.sx@renesas.com>,
Guennadi Liakhovetski <g.liakhovetski@gmx.de>,
linux-mmc@vger.kernel.org, Paul Mundt <lethal@linux-sh.org>,
Cao Minh Hiep <hiepcm@gmail.com>
Subject: Re: [PATCH 2/2] mmc: sh_mmcif: mmc->f_max should be half of the bus clock
Date: Tue, 27 Mar 2012 15:01:31 +0900 [thread overview]
Message-ID: <20120327060127.GB21697@verge.net.au> (raw)
In-Reply-To: <CANqRtoQ7z3YVujA0hmiZoubpD-3vK4kemXWWtVq6DH9Fe82tyA@mail.gmail.com>
On Tue, Mar 27, 2012 at 01:02:38PM +0900, Magnus Damm wrote:
> Hi Chris,
>
> On Tue, Mar 27, 2012 at 12:20 PM, Chris Ball <cjb@laptop.org> wrote:
> > Hi,
> >
> > On Mon, Mar 26 2012, Magnus Damm wrote:
> >>> Do you have a feeling of if it it worth trying to start with a value close
> >>> to 400kHz or if it would be better to simplify the code? I can try and
> >>> measure the difference in start up time for particular hardware
> >>> combinations, but I'm not sure how far that will get us.
> >>
> >> I believe the correct way is to program the hardware to be as close to
> >> 400 kHz as possible. I may be wrong, but I guess that slower than 400
> >> kHz is also acceptable during the initial phase, but faster may mean
> >> out of spec. For optimal performance the code may need to be reworked
> >> to support both correct and slow 400 kHz as well as whatever high
> >> frequencies needed for fast transfers.
> >
> > Hm, I think I'm missing something -- you shouldn't need to optimize f_min
> > in the driver at all, because the core handles retrying at lower frequencies
> > in the init phase (before switching to the higher frequency that comes from
> > the CSD) and it always begins at 400KHz if that's above f_min. In core.c:
> >
> > void mmc_rescan(struct work_struct *work)
> > {
> > static const unsigned freqs[] = { 400000, 300000, 200000, 100000 };
> > ...
> > for (i = 0; i < ARRAY_SIZE(freqs); i++) {
> > if (!mmc_rescan_try_freq(host, max(freqs[i], host->f_min)))
> > ...
> >
> > So, why would you want f_min to be near 400KHz?
That does seem to neutralise setting f_min close to 400KHz.
> First of all, sorry to cause confusion. It is most likely me missing
> something. =)
>
> The reason we want f_min to be near 400 kHz is that this moves our
> window of allowed frequencies as high as possible. We could go lower
> than 400 kHz but due to hardware limitations that may also lower
> f_max.
>
> So thanks to your pointer I can see that a range of frequencies are
> being tried in mmc_rescan(). I can see how f_init is being set in
> mmc_rescan_try_freq() and the value is being passed down in
> mmc_power_up() which in turn sets ios.clock to f_init and calls
> mmc_set_ios(). This regardless of f_min in this case - perhaps worth
> comparing to the WARN_ON() comparison with f_min in __mmc_set_clock().
> I know too little about the MMC subsystem to say anything about that.
>
> Anyway, I was mainly wondering about the setup of the clocks in the
> driver for the MMC host hardware. I got the impression that f_min and
> f_max are supposed to be used to point out the minimum and maximum
> allowed frequencies that the hardware supports. On our SoCs this
> depends on the rate of the parent clock and the number of bits used
> for the MMC host hardware divider.
>
> So the parent clock rate may be rather high, and if it happens to be
> set too high on a board level then the MMC hardware block won't be
> able to program the frequencies as low as 400 kHz. So my point is only
> that we need to make sure that the parent clock rate is set in such a
> way that we can have some at least half-high clock frequency for
> decent general purpose throughput but if we try to increase the clock
> rate too much then we may force the lowest clock rate to go above 400
> kHz and then I suspect we may be out of spec. All this is based on
> that the parent clock is set statically to some frequency during boot
> by the SoC or board code.
The current code assumes that the maximum divisor is 512.
This may lead to f_min being greater than 400Hz if the parent
clock is greater than 200MHz. It seems to me that empirically this
has not being occurring else the WARN_ON() in __mmc_set_clock() would
be activated. Though perhaps no one notices it.
In any case, in the context of the current code it seems that changing
sh_mmcif_probe() to set f_min to host->clk / 512 will not alter the current
behaviour and will simplify the code.
> Some device drivers may set the parent clock rate in ->set_ios() but
> we do not at this point. We keep the parent rate fixed and just adjust
> the frequency in the range that the on-MMC-controller divider allows
> us to do without affecting the rest of the system. The code could be
> extended to also set the parent clock but due to clock dependencies
> related to the SoC clock topology we may not be able to change those
> frequencies during runtime.
>
> Anyway, I hope this clarifies how I see things!
>
> Thanks,
>
> / magnus
>
next prev parent reply other threads:[~2012-03-27 6:01 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-21 9:02 [PATCH 0/2] MMCIF Clock Fixes Simon Horman
2012-03-21 9:02 ` [PATCH 1/2] mmc: sh_mmcif: double clock speed Simon Horman
2012-03-24 17:56 ` Guennadi Liakhovetski
2012-03-26 2:21 ` Simon Horman
2012-03-21 9:02 ` [PATCH 2/2] mmc: sh_mmcif: mmc->f_max should be half of the bus clock Simon Horman
2012-03-24 18:06 ` Guennadi Liakhovetski
[not found] ` <20120325223033.GA6860@verge.net.au>
2012-03-26 5:45 ` Yusuke Goda
2012-03-26 5:52 ` Simon Horman
2012-03-26 6:04 ` Yusuke Goda
2012-03-26 6:17 ` Magnus Damm
2012-03-26 7:04 ` Guennadi Liakhovetski
2012-03-27 7:53 ` Guennadi Liakhovetski
2012-03-27 8:14 ` Simon Horman
2012-03-27 1:43 ` Simon Horman
2012-03-27 2:46 ` Magnus Damm
2012-03-27 3:20 ` Chris Ball
2012-03-27 4:02 ` Magnus Damm
2012-03-27 6:01 ` Simon Horman [this message]
2012-03-27 6:37 ` Magnus Damm
2012-03-27 7:12 ` Simon Horman
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=20120327060127.GB21697@verge.net.au \
--to=horms@verge.net.au \
--cc=cjb@laptop.org \
--cc=g.liakhovetski@gmx.de \
--cc=hiepcm@gmail.com \
--cc=lethal@linux-sh.org \
--cc=linux-mmc@vger.kernel.org \
--cc=magnus.damm@gmail.com \
--cc=yusuke.goda.sx@renesas.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox