USB mass storage and ARM cache coherency
From: benh@kernel.crashing.org (Benjamin Herrenschmidt)
Date: 2010-02-17 10:07:40
Also in:
lkml
From: benh@kernel.crashing.org (Benjamin Herrenschmidt)
Date: 2010-02-17 10:07:40
Also in:
lkml
On Wed, 2010-02-17 at 09:55 +0000, Russell King - ARM Linux wrote:
Nope. It's to do with mapping a buffer for DMA, and then doing PIO reads/writes to it. With speculative prefetches, you have to deal with cache coherency with hardware DMA on DMA unmap. If you've written to the buffer in violation of the DMA API buffer ownership rules, then your writes get thrown away resulting in immediate data corruption.
Right, and this exact same problem will bite some embedded powerpc too I suppose :-) Hrm... actually not :-) We don't do the invalidate at unmap time today because we know 44x have such a broken prefetcher that we disable it ... interesting considering that there are machines around that do non-coherent DMA with 750's style chips who -do- have a prefetcher... damn, we have a bug :-) In any case, same problem here. See my reply to Oliver. Basically, the problem boils down to the dma_map/unmap being done at the wrong layer. The driver should simply not do these if it's going to do PIO over that range. Cheers, Ben.