From: Wolfram Sang <w.sang@pengutronix.de>
To: Mikko Vinni <mmvinni@yahoo.com>
Cc: linux-mmc@vger.kernel.org, mikko.vinni@gmail.com
Subject: Re: [PATCH resend] sdhci: work around broken dma boundary behaviour
Date: Mon, 14 Mar 2011 11:18:29 +0100 [thread overview]
Message-ID: <20110314101829.GB2206@pengutronix.de> (raw)
In-Reply-To: <423716.64271.qm@web161805.mail.bf1.yahoo.com>
[-- Attachment #1: Type: text/plain, Size: 3921 bytes --]
> > But we can't guarantee that. Transfer could be up to 65535 * 2K.
>
> In sdhci.c function sdhci_prepare_data there are these checks:
>
> /* Sanity checks */
> BUG_ON(data->blksz * data->blocks > 524288);
> BUG_ON(data->blksz > host->mmc->max_blk_size);
> BUG_ON(data->blocks > 65535);
>
> I thought the first BUG_ON makes sure that the transfer doesn't go too big.
> Then again, I might be missing something. Is 524288 not in bytes?
Sorry, I simply missed that. Hmmm, another hard coded value :(
> > > Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=28462
> > >
> > > Signed-off-by: Mikko Vinni <mmvinni <at> yahoo.com>
> >
> > Proper EMail please.
>
> Hm, @gmail.com? (cc added for further emails)
I was just referring to using "<at>" instead of "@". The provider
doesn't really matter :)
> > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> > > index a25db42..8651731 100644
> > > --- a/drivers/mmc/host/sdhci.c
> > > +++ b/drivers/mmc/host/sdhci.c
> > > @@ -1537,9 +1537,27 @@ static void sdhci_data_irq(struct sdhci_host *host,
> >u32 intmask)
> > > * boundaries, but as we can't disable the feature
> > > * we need to at least restart the transfer.
> > > */
> > > - if (intmask & SDHCI_INT_DMA_END)
> > > - sdhci_writel(host, sdhci_readl(host, SDHCI_DMA_ADDRESS),
> > > - SDHCI_DMA_ADDRESS);
> > > + if (intmask & SDHCI_INT_DMA_END) {
> > > + u32 dmastart, dmanow;
> > > + dmastart = sg_dma_address(host->data->sg);
> >
> > This will only work for the first 512K, right?
>
> True. If a transfer can cross more than one boundary, I suppose an
> additional variable is needed to keep track of the current state.
Yeah, thought that, too. I also wondered if we then just could not
always write our own value to DMA_ADDRESS. This is redundant on working
hardware, but the the check is not much cheaper than just doing it.
Would that change also be beyond your comfort zone?
> > > + dmanow = sdhci_readl(host, SDHCI_DMA_ADDRESS);
> > > + if (dmanow == dmastart) {
> > > + /*
> > > + * HW failed to increase the address.
> > > + * Update to the next 512KB block boundary.
> > > + */
> > > + dmanow = (dmanow & ~0x7ffff) + 0x80000;
> >
> > Hmm, hardcoding these values is probably not a good idea. They should be
> > dependent on what is written to MAKE_BLKSIZE. Maybe a common define?
>
> Sorry, implementing that goes beyond my comfort zone. I would be happy to
> test patches, though.
I was imagining something like:
#define SDHCI_DEFAULT_BOUNDARY_SIZE (512 * 1024)
which could be used directly in your code and later like
SDHCI_MAKE_BLKSZ(ilog2(SDHCI_DEFAULT_BOUNDARY_SIZE) - 12, ...);
(Maybe the ilog2-thingie could be another macro)
> > > + if (dmanow > dmastart + host->data->blksz *
> > > + host->data->blocks) {
> > > + WARN_ON(1);
> > > + dmanow = dmastart;
> > > + }
> >
> > Did this happen?
>
> No, but I though it brings some protection in case somebody *does*
> change the boundary value without checking the code first (and happens
> to be running on flawed hardware).
So, it could go if we make that dependent if I understand correctly.
Oh, and what I forgot to say last time:
Thanks a lot for your debugging efforts! I read the bugzilla entry and
your persistency for nailing the cause is greatly appreciated. Good
work.
All the best,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
next prev parent reply other threads:[~2011-03-14 10:18 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-07 20:40 [PATCH resend] sdhci: work around broken dma boundary behaviour Mikko Vinni
2011-03-08 20:12 ` Chris Ball
2011-03-08 22:12 ` Wolfram Sang
2011-03-12 21:43 ` Wolfram Sang
2011-03-14 9:23 ` Mikko Vinni
2011-03-14 10:18 ` Wolfram Sang [this message]
2011-03-14 13:00 ` Mikko Vinni
2011-03-14 15:28 ` Wolfram Sang
2011-03-14 15:58 ` Mikko Vinni
2011-03-14 17:21 ` Wolfram Sang
2011-03-29 8:53 ` [RFC] mmc: sdhci: work around broken dma boundary behavior Mikko Vinni
2011-04-11 21:05 ` Chris Ball
2011-04-12 4:56 ` Wolfram Sang
2011-04-12 17:29 ` Chris Ball
2011-04-13 7:04 ` Mikko Vinni
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=20110314101829.GB2206@pengutronix.de \
--to=w.sang@pengutronix.de \
--cc=linux-mmc@vger.kernel.org \
--cc=mikko.vinni@gmail.com \
--cc=mmvinni@yahoo.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;
as well as URLs for NNTP newsgroup(s).