| From: Arnd Bergmann [arnd@xxxxxxxx] | Sent: Thursday, June 25, 2015 1:44 PM | | On Thursday 25 June 2015 15:01:56 Casey Leedom wrote: | > | > Is there a reference I can read on this so I can understand | > when and where we can use the __raw_*() APIs? Can these | > Raw Read/Write operations be reordered with respect to | > each other or are the use of the various flavors of SYNC | > instructions just to maintain order between Cached Memory | > Accesses and I/O Instructions? | | The interpretation is not consistent across architectures. | | My best description would be that the __raw_*() accessors should | only be used for accessing RAM areas that are known to have no | side-effects and can be read in any size (8-bit to 64-bit wide), | any alignment, and do not have a specific endianess. | | If you are dealing with MMIO registers that have a fixed endianess | and size, the correct accessor would be readl_relaxed(), which | is like readl() but lacks the barriers on certain architectures. Ah, thanks. I see now that the __raw_*() APIs don't do any of the Endian Swizzling. Unfortunately the *_relaxed() APIs on PowerPC are just defined as the normal *() routines. From arch/powerpc/include/asm/io.h: /* * We don't do relaxed operations yet, at least not with this semantic */ #define readb_relaxed(addr) readb(addr) #define readw_relaxed(addr) readw(addr) #define readl_relaxed(addr) readl(addr) #define readq_relaxed(addr) readq(addr) #define writeb_relaxed(v, addr) writeb(v, addr) #define writew_relaxed(v, addr) writew(v, addr) #define writel_relaxed(v, addr) writel(v, addr) #define writeq_relaxed(v, addr) writeq(v, addr) (And in fact, this is true for most of the architectures.) So we could go ahead and use these but for now there wouldn't be any effect. Hhmmm, so what do PowerPC Drivers do when they want to take advantage of Write Combining? Do their own Endian Swizzling with the __raw_*() APIs? Casey-- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html