Re: Yosemite/440EP why are readl()/ioread32() setup to readlittle-endian?
From: David Hawkins <hidden>
Date: 2006-02-01 17:51:52
The book implicitly focuses on x86 driver developers, that's why you don't get an explicit statement about this... "everything" is PCI in that world. read*/write* and ioread*/iowrite* generate outbound little endian cycles on ALL arches, period. They are intended only for PCI use and have generic names only because of the assumption that "all the world is a PC". Now, what it takes to to generate outbound little endian cycles varies. On some arches, it's just a store (native LE) on other arches, it's a reversed store (PPC), others still configure their PCI bridge hardware to do byte swapping in hardware (typically if their arch doesn't have a simple byte-swapping store like PPC). The example you cite on pg. 453 of Rubini looks broken for BE systems. It works on LE systems since cpu_to_le32() does nothing and writel is a simply dereference. That's pure luck. On PPC, for example, that would write a big endian bus_addr to the fictitious PCI device which is not what they want.
Great! An authoritive answer! Re: endianness, even cooler on the 440EP, in your mmap() implementation you can set the _PAGE_ENDIAN flag, and user-space will see the PCI device in little endian format. Fun stuff! Thanks Matt. Dave