From: arnd@arndb.de (Arnd Bergmann)
To: linux-arm-kernel@lists.infradead.org
Subject: dma_alloc_coherent and cache?
Date: Tue, 15 Apr 2014 10:43:09 +0200 [thread overview]
Message-ID: <4356499.vN3lxjGqPZ@wuerfel> (raw)
In-Reply-To: <45E047AA-4C3B-4645-A590-5B75A1729ADA@nowonline.co.uk>
On Tuesday 15 April 2014 09:43:38 Lee Essen wrote:
>
>
> At a high level I have it working, however I get regular (reproducible)
> hangs and I suspect it's to do with the writes to the descriptiors
> (from dma_alloc_coherent) being buffered or cached and not making it
> to the device when dma is triggered.
dma_alloc_coherent() is a wrapper around a device-specific allocator,
based on the dma_map_ops implementation. The default allocator
from arm_dma_ops gives you uncached, buffered memory. It is expected
that the driver uses a barrier (which is implied by readl/writel
but not __raw_readl/__raw_writel or readl_relaxed/writel_relaxed)
to ensure the write buffers are flushed.
If the machine sets arm_coherent_dma_ops rather than arm_dma_ops,
the memory will be cacheable, as it's assumed that the hardware
is set up for cache-coherent DMAs.
> My theory is based on the fact that the hang always seems to happen
> at the point of enabling dma for transmit, and occasionally I get a
> packet out which is corrupt ... and if I add lots of debug printk's
> or delay loops then it happens less frequently.
>
> The original GPL code has some functions in to invalidate/clear the
> L2 cache, but no other driver seems to do this, so it doesn't feel
> like it's a good solution.
Correct, drivers should never do cache management by hand, they
should rely on dma_alloc_coherent, dma_map_* and dma_unmap_* to
do the right thing.
> It's a feroceon cpu, and I've tried disabling the L2 controller and
> also the d-cache - neither of which made any difference.
>
> So I'm now completely out of ideas and way out of my depth
>
> Any suggestions would be greatly appreciated.
Can you post a link to the source code?
Arnd
next prev parent reply other threads:[~2014-04-15 8:43 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-15 5:43 dma_alloc_coherent and cache? Lee Essen
2014-04-15 8:10 ` Andrew Lunn
2014-04-17 14:35 ` Valentin Longchamp
2014-04-15 8:43 ` Arnd Bergmann [this message]
2014-04-15 10:01 ` Lee Essen
2014-04-15 10:49 ` Arnd Bergmann
2014-04-15 16:22 ` Lee Essen
2014-04-15 16:49 ` Andrew Lunn
2014-04-15 21:54 ` Troy Kisky
2014-04-16 15:55 ` Lee Essen
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=4356499.vN3lxjGqPZ@wuerfel \
--to=arnd@arndb.de \
--cc=linux-arm-kernel@lists.infradead.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