Commit 755bd04a authored by Sinan Kaya's avatar Sinan Kaya Committed by Arnd Bergmann

io: define stronger ordering for the default writeX() implementation

The default implementation of mapping writeX() to __raw_writeX() is wrong.
writeX() has stronger ordering semantics. Compiler is allowed to reorder
memory writes against __raw_writeX().

Use the previously defined __io_aw() and __io_bw() macros to harden
code generation according to architecture support.
Signed-off-by: default avatarSinan Kaya <okaya@codeaurora.org>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent 032d59e1
...@@ -208,7 +208,9 @@ static inline u64 readq(const volatile void __iomem *addr) ...@@ -208,7 +208,9 @@ static inline u64 readq(const volatile void __iomem *addr)
#define writeb writeb #define writeb writeb
static inline void writeb(u8 value, volatile void __iomem *addr) static inline void writeb(u8 value, volatile void __iomem *addr)
{ {
__io_bw();
__raw_writeb(value, addr); __raw_writeb(value, addr);
__io_aw();
} }
#endif #endif
...@@ -216,7 +218,9 @@ static inline void writeb(u8 value, volatile void __iomem *addr) ...@@ -216,7 +218,9 @@ static inline void writeb(u8 value, volatile void __iomem *addr)
#define writew writew #define writew writew
static inline void writew(u16 value, volatile void __iomem *addr) static inline void writew(u16 value, volatile void __iomem *addr)
{ {
__io_bw();
__raw_writew(cpu_to_le16(value), addr); __raw_writew(cpu_to_le16(value), addr);
__io_aw();
} }
#endif #endif
...@@ -224,7 +228,9 @@ static inline void writew(u16 value, volatile void __iomem *addr) ...@@ -224,7 +228,9 @@ static inline void writew(u16 value, volatile void __iomem *addr)
#define writel writel #define writel writel
static inline void writel(u32 value, volatile void __iomem *addr) static inline void writel(u32 value, volatile void __iomem *addr)
{ {
__io_bw();
__raw_writel(__cpu_to_le32(value), addr); __raw_writel(__cpu_to_le32(value), addr);
__io_aw();
} }
#endif #endif
...@@ -233,7 +239,9 @@ static inline void writel(u32 value, volatile void __iomem *addr) ...@@ -233,7 +239,9 @@ static inline void writel(u32 value, volatile void __iomem *addr)
#define writeq writeq #define writeq writeq
static inline void writeq(u64 value, volatile void __iomem *addr) static inline void writeq(u64 value, volatile void __iomem *addr)
{ {
__io_bw();
__raw_writeq(__cpu_to_le64(value), addr); __raw_writeq(__cpu_to_le64(value), addr);
__io_aw();
} }
#endif #endif
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment