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 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.