[U-Boot] [PATCH] m68k: fix multiple memory accesses on swap operations

Angelo Dureghello angelo at sysam.it
Sun Aug 5 10:44:56 UTC 2018


On a
	u32 val = __sw32(*addr);

multiple memory accesses are not welcome, since "addr" may
be an IO peripheral register address.
This patch changes __sw16/32 to perform a single memory
access for the source value.

Signed-off-by: Angelo Dureghello <angelo at sysam.it>
---
 arch/m68k/include/asm/byteorder.h | 34 ++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/arch/m68k/include/asm/byteorder.h b/arch/m68k/include/asm/byteorder.h
index eb03b6a053..9179622250 100644
--- a/arch/m68k/include/asm/byteorder.h
+++ b/arch/m68k/include/asm/byteorder.h
@@ -10,21 +10,28 @@
 #include <asm/types.h>
 
 #ifdef __GNUC__
-#define __sw16(x) \
-	((__u16)( \
-		(((__u16)(x) & (__u16)0x00ffU) << 8) | \
-		(((__u16)(x) & (__u16)0xff00U) >> 8) ))
-#define __sw32(x) \
-	((__u32)( \
-		(((__u32)(x)) << 24) | \
-		(((__u32)(x) & (__u32)0x0000ff00UL) <<  8) | \
-		(((__u32)(x) & (__u32)0x00ff0000UL) >>  8) | \
-		(((__u32)(x)) >> 24) ))
+
+static inline __u32 __sw32(__u32 x)
+{
+	__u32 v = x;
+
+	return v << 24 |
+		(v & (__u32)0x0000ff00UL) <<  8 |
+		(v & (__u32)0x00ff0000UL) >>  8 |
+		v >> 24;
+}
+
+static inline __u16 __sw16(__u16 x)
+{
+	__u16 v = x;
+
+	return (v & (__u16)0x00ffU) << 8 |
+		(v & (__u16)0xff00U) >> 8;
+}
 
 static __inline__ unsigned ld_le16(const volatile unsigned short *addr)
 {
-	unsigned result = *addr;
-	return __sw16(result);
+	return __sw16(*addr);
 }
 
 static __inline__ void st_le16(volatile unsigned short *addr,
@@ -35,8 +42,7 @@ static __inline__ void st_le16(volatile unsigned short *addr,
 
 static __inline__ unsigned ld_le32(const volatile unsigned *addr)
 {
-	unsigned result = *addr;
-	return __sw32(result);
+	return __sw32(*addr);
 }
 
 static __inline__ void st_le32(volatile unsigned *addr, const unsigned val)
-- 
2.18.0



More information about the U-Boot mailing list