Messages in this thread | | | Date | Tue, 30 Apr 2002 11:19:14 -0500 (CDT) | From | Kai Germaschewski <> | Subject | Re: How to write portable MMIO code? |
| |
On Tue, 30 Apr 2002, José Fonseca wrote:
> I'm currently trying to get the Mach64 DRI driver to run on PowerPC. It's > mostly working but there are some strange behaviors (DMA works, MMIO not > really unless you make long waits when submiting, etc.). This is most > likely related with the MMIO programming macros in the kernel module. > > My question is: How to code MMIO to be portable across all platforms, > i.e., taking in consideration the endian format and memory caches? > > I've search thorougly the answer to this question but found > incomplete/contraditory answers: > > - should one use readl/writel or dereference the address directly?
Use readl/writel, that's why they exist.
> - is the use of readl/writel macros suficient to account for endian > correctness or it's also needed to use the cpu_to_le32/le32_to_cpu macros?
They'll give you little endian always (i.e. they byteswap on big endian archs), so normally (register accesses) you shouldn't need additional swapping.
> - 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.
--Kai
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |