diff mbox series

[v2,1/3] ARC: IO: add volatile to accessors

Message ID 20200330194445.5923-2-Eugeniy.Paltsev@synopsys.com
State Accepted, archived
Commit 7e5702282374138507ab3c08dfc1b28dd9ec2bd7
Delegated to: Alexey Brodkin
Headers show
Series ARC: IO: rework IO accessors | expand

Commit Message

Eugeniy Paltsev March 30, 2020, 7:44 p.m. UTC
We must use 'volatile' in C-version read/write IO accessors
implementation to avoid merging several reads (writes) into
one read (write), or optimizing them out by compiler.

Fixes commit 07906b3dad15 ("ARC: Switch to generic accessors")

Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
---
 arch/arc/include/asm/io.h | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)
diff mbox series

Patch

diff --git a/arch/arc/include/asm/io.h b/arch/arc/include/asm/io.h
index 70d050590de..1f1ae889f3a 100644
--- a/arch/arc/include/asm/io.h
+++ b/arch/arc/include/asm/io.h
@@ -54,15 +54,21 @@  static inline void sync(void)
 	/* Not yet implemented */
 }
 
-#define __arch_getb(a)		(*(unsigned char *)(a))
-#define __arch_getw(a)		(*(unsigned short *)(a))
-#define __arch_getl(a)		(*(unsigned int *)(a))
-#define __arch_getq(a)		(*(unsigned long long *)(a))
-
-#define __arch_putb(v, a)	(*(unsigned char *)(a) = (v))
-#define __arch_putw(v, a)	(*(unsigned short *)(a) = (v))
-#define __arch_putl(v, a)	(*(unsigned int *)(a) = (v))
-#define __arch_putq(v, a)	(*(unsigned long long *)(a) = (v))
+/*
+ * We must use 'volatile' in C-version read/write IO accessors implementation
+ * to avoid merging several reads (writes) into one read (write), or optimizing
+ * them out by compiler.
+ */
+#define __arch_getb(a)		(*(volatile u8 *)(a))
+#define __arch_getw(a)		(*(volatile u16 *)(a))
+#define __arch_getl(a)		(*(volatile u32 *)(a))
+#define __arch_getq(a)		(*(volatile u64 *)(a))
+
+#define __arch_putb(v, a)	(*(volatile u8 *)(a) = (v))
+#define __arch_putw(v, a)	(*(volatile u16 *)(a) = (v))
+#define __arch_putl(v, a)	(*(volatile u32 *)(a) = (v))
+#define __arch_putq(v, a)	(*(volatile u64 *)(a) = (v))
+
 
 #define __raw_writeb(v, a)	__arch_putb(v, a)
 #define __raw_writew(v, a)	__arch_putw(v, a)