MIPS: io: fix sparse flood on asm/io.h
authorAlexander Lobakin <alobakin@pm.me>
Sat, 20 Jun 2020 09:34:51 +0000 (09:34 +0000)
committerThomas Bogendoerfer <tsbogend@alpha.franken.de>
Thu, 25 Jun 2020 08:36:39 +0000 (10:36 +0200)
MIPS MMIO macros for byteswapping from/to hardware endianness are a bit
tricky because they use cpu_to_le{16,32,64}() in both directions.
This generates a lot of questions from sparse as __le{16,32,64} types
are 'restricted' and direct cast is forbidden in order to prevent messing
up the byteorder.
As MMIO ops are used in almost every single driver, this leads to console
flooding and complicates bug hunting.

We could fix it in a more proper way, i.e. separate from device /
to device byteswap macros and expand __BUILD_MEMORY_*(), but this seems
redundant and will produce code duplication.
Instead, just expand the existing *ioswab*() macros with forced
typecasting to stop floods.

Signed-off-by: Alexander Lobakin <alobakin@pm.me>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
arch/mips/include/asm/mach-cavium-octeon/mangle-port.h
arch/mips/include/asm/mach-generic/mangle-port.h
arch/mips/include/asm/mach-ip27/mangle-port.h
arch/mips/include/asm/mach-ip30/mangle-port.h
arch/mips/include/asm/mach-ip32/mangle-port.h
arch/mips/include/asm/mach-tx39xx/mangle-port.h
arch/mips/include/asm/mach-tx49xx/mangle-port.h

index 8ff2cbdf2c3ee8f74a4b3e9df6c7369c1f39dee8..239fcc874b99045aa9e27e664190ae15ce862f57 100644 (file)
@@ -48,11 +48,17 @@ static inline bool __should_swizzle_addr(u64 p)
 
 # define ioswabb(a, x)         (x)
 # define __mem_ioswabb(a, x)   (x)
-# define ioswabw(a, x)         (__should_swizzle_bits(a) ? le16_to_cpu(x) : x)
+# define ioswabw(a, x)         (__should_swizzle_bits(a) ?             \
+                                le16_to_cpu((__force __le16)(x)) :     \
+                                (x))
 # define __mem_ioswabw(a, x)   (x)
-# define ioswabl(a, x)         (__should_swizzle_bits(a) ? le32_to_cpu(x) : x)
+# define ioswabl(a, x)         (__should_swizzle_bits(a) ?             \
+                                le32_to_cpu((__force __le32)(x)) :     \
+                                (x))
 # define __mem_ioswabl(a, x)   (x)
-# define ioswabq(a, x)         (__should_swizzle_bits(a) ? le64_to_cpu(x) : x)
+# define ioswabq(a, x)         (__should_swizzle_bits(a) ?             \
+                                le64_to_cpu((__force __le64)(x)) :     \
+                                (x))
 # define __mem_ioswabq(a, x)   (x)
 
 #endif /* __ASM_MACH_GENERIC_MANGLE_PORT_H */
index e4daf163706c0b69f9d47f2a76f43068a67ce0c4..77c65c294db6a63925f64cb8f7ccc14fdd3ce57e 100644 (file)
 
 # define ioswabb(a, x)         (x)
 # define __mem_ioswabb(a, x)   (x)
-# define ioswabw(a, x)         le16_to_cpu(x)
+# define ioswabw(a, x)         le16_to_cpu((__force __le16)(x))
 # define __mem_ioswabw(a, x)   (x)
-# define ioswabl(a, x)         le32_to_cpu(x)
+# define ioswabl(a, x)         le32_to_cpu((__force __le32)(x))
 # define __mem_ioswabl(a, x)   (x)
-# define ioswabq(a, x)         le64_to_cpu(x)
+# define ioswabq(a, x)         le64_to_cpu((__force __le64)(x))
 # define __mem_ioswabq(a, x)   (x)
 
 #else
 # define ioswabb(a, x)         (x)
 # define __mem_ioswabb(a, x)   (x)
 # define ioswabw(a, x)         (x)
-# define __mem_ioswabw(a, x)   cpu_to_le16(x)
+# define __mem_ioswabw(a, x)   ((__force u16)cpu_to_le16(x))
 # define ioswabl(a, x)         (x)
-# define __mem_ioswabl(a, x)   cpu_to_le32(x)
+# define __mem_ioswabl(a, x)   ((__force u32)cpu_to_le32(x))
 # define ioswabq(a, x)         (x)
-# define __mem_ioswabq(a, x)   cpu_to_le64(x)
+# define __mem_ioswabq(a, x)   ((__force u64)cpu_to_le64(x))
 
 #endif
 
index 27c56efa519fb02009c5acb744c540bfcf416ca0..f71c38bbfc2f4ec04330dda771a8c530389c7068 100644 (file)
 # define ioswabb(a, x)         (x)
 # define __mem_ioswabb(a, x)   (x)
 # define ioswabw(a, x)         (x)
-# define __mem_ioswabw(a, x)   cpu_to_le16(x)
+# define __mem_ioswabw(a, x)   ((__force u16)cpu_to_le16(x))
 # define ioswabl(a, x)         (x)
-# define __mem_ioswabl(a, x)   cpu_to_le32(x)
+# define __mem_ioswabl(a, x)   ((__force u32)cpu_to_le32(x))
 # define ioswabq(a, x)         (x)
-# define __mem_ioswabq(a, x)   cpu_to_le64(x)
+# define __mem_ioswabq(a, x)   ((__force u64)cpu_to_le64(x))
 
 #endif /* __ASM_MACH_IP27_MANGLE_PORT_H */
index f3e1262a2d5efb0d7a2ccc5334bf0ea18630f838..439c6a6018304cf095da81bb481bf8d0454b046a 100644 (file)
 #define ioswabb(a, x)          (x)
 #define __mem_ioswabb(a, x)    (x)
 #define ioswabw(a, x)          (x)
-#define __mem_ioswabw(a, x)    cpu_to_le16(x)
+#define __mem_ioswabw(a, x)    ((__force u16)cpu_to_le16(x))
 #define ioswabl(a, x)          (x)
-#define __mem_ioswabl(a, x)    cpu_to_le32(x)
+#define __mem_ioswabl(a, x)    ((__force u32)cpu_to_le32(x))
 #define ioswabq(a, x)          (x)
-#define __mem_ioswabq(a, x)    cpu_to_le64(x)
+#define __mem_ioswabq(a, x)    ((__force u64)cpu_to_le64(x))
 
 #endif /* __ASM_MACH_IP30_MANGLE_PORT_H */
index c5ef72ccb0d5b883829db9ab10398b94774ae2bd..4bc3d20e8293bcddebb876f1ce16edf54df0c5fe 100644 (file)
 # define ioswabb(a, x)         (x)
 # define __mem_ioswabb(a, x)   (x)
 # define ioswabw(a, x)         (x)
-# define __mem_ioswabw(a, x)   cpu_to_le16(x)
+# define __mem_ioswabw(a, x)   ((__force u16)cpu_to_le16(x))
 # define ioswabl(a, x)         (x)
-# define __mem_ioswabl(a, x)   cpu_to_le32(x)
+# define __mem_ioswabl(a, x)   ((__force u32)cpu_to_le32(x))
 # define ioswabq(a, x)         (x)
-# define __mem_ioswabq(a, x)   cpu_to_le64(x)
+# define __mem_ioswabq(a, x)   ((__force u64)cpu_to_le64(x))
 
 #endif /* __ASM_MACH_IP32_MANGLE_PORT_H */
index ab7a70bd895e03955c66cc5f87bd53b68ff1bb7d..95be459950f7ef7f20bec237ba5d1104bfcff598 100644 (file)
@@ -14,11 +14,11 @@ extern unsigned long (*__swizzle_addr_b)(unsigned long port);
 
 #define ioswabb(a, x)          (x)
 #define __mem_ioswabb(a, x)    (x)
-#define ioswabw(a, x)          le16_to_cpu(x)
+#define ioswabw(a, x)          le16_to_cpu((__force __le16)(x))
 #define __mem_ioswabw(a, x)    (x)
-#define ioswabl(a, x)          le32_to_cpu(x)
+#define ioswabl(a, x)          le32_to_cpu((__force __le32)(x))
 #define __mem_ioswabl(a, x)    (x)
-#define ioswabq(a, x)          le64_to_cpu(x)
+#define ioswabq(a, x)          le64_to_cpu((__force __le64)(x))
 #define __mem_ioswabq(a, x)    (x)
 
 #endif /* __ASM_MACH_TX39XX_MANGLE_PORT_H */
index e061ef38fb5fb8733b861c426d34e7c15e219c50..98c7abf4484a03fb3592d8601e93674b54657a08 100644 (file)
 extern u16 (*ioswabw)(volatile u16 *a, u16 x);
 extern u16 (*__mem_ioswabw)(volatile u16 *a, u16 x);
 #else
-#define ioswabw(a, x)          le16_to_cpu(x)
+#define ioswabw(a, x)          le16_to_cpu((__force __le16)(x))
 #define __mem_ioswabw(a, x)    (x)
 #endif
-#define ioswabl(a, x)          le32_to_cpu(x)
+#define ioswabl(a, x)          le32_to_cpu((__force __le32)(x))
 #define __mem_ioswabl(a, x)    (x)
-#define ioswabq(a, x)          le64_to_cpu(x)
+#define ioswabq(a, x)          le64_to_cpu((__force __le64)(x))
 #define __mem_ioswabq(a, x)    (x)
 
 #endif /* __ASM_MACH_TX49XX_MANGLE_PORT_H */