[U-Boot] [PATCH] [v2] powerpc: fix implementation of out_8 to match the other out_XX functions
Timur Tabi
timur at freescale.com
Mon Apr 4 23:21:04 CEST 2011
For some reason, the implementation of out_8() does not match the other
output accessors, nor does it match equivalent Linux accessor. This can
cause a problem in a situation like this:
__raw_readb(p1);
out_8(p2, x);
In this case, there is no barrier between the read and the write.
If the out_8() is changed to out_be16(), then there is a barrier.
Signed-off-by: Timur Tabi <timur at freescale.com>
---
arch/powerpc/include/asm/io.h | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/arch/powerpc/include/asm/io.h b/arch/powerpc/include/asm/io.h
index 4ddad26..56ac9fe 100644
--- a/arch/powerpc/include/asm/io.h
+++ b/arch/powerpc/include/asm/io.h
@@ -175,7 +175,10 @@ extern inline int in_8(const volatile unsigned char __iomem *addr)
extern inline void out_8(volatile unsigned char __iomem *addr, int val)
{
- __asm__ __volatile__("stb%U0%X0 %1,%0; eieio" : "=m" (*addr) : "r" (val));
+ __asm__ __volatile__("sync;\n"
+ "stb%U0%X0 %1,%0;\n"
+ : "=m" (*addr)
+ : "r" (val));
}
extern inline int in_le16(const volatile unsigned short __iomem *addr)
--
1.7.3.4
More information about the U-Boot
mailing list