Re: How to write portable MMIO code?

José Fonseca
2002-04-30T19:02:09Z

Kai,

On 2002.04.30 17:19 Kai Germaschewski wrote:
> On Tue, 30 Apr 2002, José Fonseca wrote:
> > - should one in general (i.e., assuming the worst case) do wmb() on
> > writes, and mb() on reads?
>
> I don't think mb() will help you. You're probably experiencing PCI
> posting
> problems - when a writel() has executed, that doesn't necessarily mean
> that the transaction has actually happened it may (and will) be buffered
> for a potentially long time.
>
> However, PCI won't reorder reads vs. writes, so you when you want to be
> sure that a write() actually reached the hardware, do a dummy read()
> afterwards, that'll flush the write buffer.

Unfortunately one of the problems occurs in a idle wait loop, when a
register is being sucessively read.

And if so, how the wmb() example in "Linux Device Drivers"
(http://www.xml.com/ldd/chapter/book/ch08.html#t1) can be explained? The
"Bus-Independent Device Accesses"
(http://www.kernelnewbies.org/documents/kdoc/deviceiobook/x44.html) also
refers what you suggested, but it also mentions the use of memory
barriers. So how and when should they be used?

Regards,

José Fonseca