MIPS: Convert R10000_LLSC_WAR info a config option
authorThomas Bogendoerfer <tsbogend@alpha.franken.de>
Mon, 24 Aug 2020 16:32:49 +0000 (18:32 +0200)
committerThomas Bogendoerfer <tsbogend@alpha.franken.de>
Mon, 7 Sep 2020 20:24:27 +0000 (22:24 +0200)
Use a new config option to enabel R1000_LLSC workaound and remove
define from different war.h files.

Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
19 files changed:
arch/mips/Kconfig
arch/mips/include/asm/futex.h
arch/mips/include/asm/llsc.h
arch/mips/include/asm/local.h
arch/mips/include/asm/mach-cavium-octeon/war.h
arch/mips/include/asm/mach-generic/war.h
arch/mips/include/asm/mach-ip22/war.h
arch/mips/include/asm/mach-ip27/war.h
arch/mips/include/asm/mach-ip28/war.h
arch/mips/include/asm/mach-ip30/war.h
arch/mips/include/asm/mach-ip32/war.h
arch/mips/include/asm/mach-malta/war.h
arch/mips/include/asm/mach-rc32434/war.h
arch/mips/include/asm/mach-rm/war.h
arch/mips/include/asm/mach-sibyte/war.h
arch/mips/include/asm/mach-tx49xx/war.h
arch/mips/include/asm/war.h
arch/mips/kernel/syscall.c
arch/mips/mm/tlbex.c

index 5df92ae935d4368d757784bc2106490c5a4979d3..87ef000d1aecc2e0cf3fd8c7023d7ee76950e113 100644 (file)
@@ -669,6 +669,7 @@ config SGI_IP27
        select SYS_SUPPORTS_BIG_ENDIAN
        select SYS_SUPPORTS_NUMA
        select SYS_SUPPORTS_SMP
+       select WAR_R10000_LLSC
        select MIPS_L1_CACHE_SHIFT_7
        select NUMA
        help
@@ -704,6 +705,7 @@ config SGI_IP28
        select SYS_HAS_EARLY_PRINTK
        select SYS_SUPPORTS_64BIT_KERNEL
        select SYS_SUPPORTS_BIG_ENDIAN
+       select WAR_R10000_LLSC
        select MIPS_L1_CACHE_SHIFT_7
        help
          This is the SGI Indigo2 with R10000 processor.  To compile a Linux
@@ -730,6 +732,7 @@ config SGI_IP30
        select SYS_SUPPORTS_64BIT_KERNEL
        select SYS_SUPPORTS_BIG_ENDIAN
        select SYS_SUPPORTS_SMP
+       select WAR_R10000_LLSC
        select MIPS_L1_CACHE_SHIFT_7
        select ARC_MEMORY
        help
@@ -2675,6 +2678,11 @@ config WAR_TX49XX_ICACHE_INDEX_INV
 config WAR_ICACHE_REFILLS
        bool
 
+# On the R10000 up to version 2.6 (not sure about 2.7) there is a bug that
+# may cause ll / sc and lld / scd sequences to execute non-atomically.
+config WAR_R10000_LLSC
+       bool
+
 #
 # - Highmem only makes sense for the 32-bit kernel.
 # - The current highmem code will only work properly on physically indexed
index 2bf8f6014579896130346c017e68fdac88288926..d85248404c52c0f3d4cf19747bd6f43c069e8076 100644 (file)
@@ -21,7 +21,7 @@
 
 #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg)             \
 {                                                                      \
-       if (cpu_has_llsc && R10000_LLSC_WAR) {                          \
+       if (cpu_has_llsc && IS_ENABLED(CONFIG_WAR_R10000_LLSC)) {       \
                __asm__ __volatile__(                                   \
                "       .set    push                            \n"     \
                "       .set    noat                            \n"     \
@@ -133,7 +133,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
        if (!access_ok(uaddr, sizeof(u32)))
                return -EFAULT;
 
-       if (cpu_has_llsc && R10000_LLSC_WAR) {
+       if (cpu_has_llsc && IS_ENABLED(CONFIG_WAR_R10000_LLSC)) {
                __asm__ __volatile__(
                "# futex_atomic_cmpxchg_inatomic                        \n"
                "       .set    push                                    \n"
index c49738bc3bda2dca4e9c3c6b89dc5870dae58623..ec09fe5d6d6c36b429c8c6606fbb248d5c06f13d 100644 (file)
@@ -28,7 +28,7 @@
  * works around a bug present in R10000 CPUs prior to revision 3.0 that could
  * cause ll-sc sequences to execute non-atomically.
  */
-#if R10000_LLSC_WAR
+#ifdef CONFIG_WAR_R10000_LLSC
 # define __SC_BEQZ "beqzl      "
 #elif MIPS_ISA_REV >= 6
 # define __SC_BEQZ "beqzc      "
index fef0fda8f82fe8d94bdb999621e651044c53f22f..ecda7295ddcd1750429f866bb0a6b2f003bb2e17 100644 (file)
@@ -31,7 +31,7 @@ static __inline__ long local_add_return(long i, local_t * l)
 {
        unsigned long result;
 
-       if (kernel_uses_llsc && R10000_LLSC_WAR) {
+       if (kernel_uses_llsc && IS_ENABLED(CONFIG_WAR_R10000_LLSC)) {
                unsigned long temp;
 
                __asm__ __volatile__(
@@ -80,7 +80,7 @@ static __inline__ long local_sub_return(long i, local_t * l)
 {
        unsigned long result;
 
-       if (kernel_uses_llsc && R10000_LLSC_WAR) {
+       if (kernel_uses_llsc && IS_ENABLED(CONFIG_WAR_R10000_LLSC)) {
                unsigned long temp;
 
                __asm__ __volatile__(
index 1061917152c678ad73e45a2fc1c28ba15ac50953..52be3785e3e21a23328e6ba1fe0cff7fc7e88e87 100644 (file)
@@ -11,7 +11,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#define R10000_LLSC_WAR                        0
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #define CAVIUM_OCTEON_DCACHE_PREFETCH_WAR      \
index 966f40aedf169e80e69c10a625edc88cb6059e92..2229c83772889e70c26908806fbb2ddf8488d3bc 100644 (file)
@@ -10,7 +10,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#define R10000_LLSC_WAR                        0
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MACH_GENERIC_WAR_H */
index 99f6531e5b9ba82982ced81e8bbfbb65bb6ed1f3..f10efe589f93e74f7ef47d046bee5ed28a5cba29 100644 (file)
@@ -10,7 +10,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#define R10000_LLSC_WAR                        0
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MIPS_MACH_IP22_WAR_H */
index d8dfa7258bea218e1b9153d6fcb85b03af4acd38..0a07cf6731c0d5ecfa261c2dd3fe958bb4b0962c 100644 (file)
@@ -10,7 +10,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#define R10000_LLSC_WAR                        1
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MIPS_MACH_IP27_WAR_H */
index f252df761ec878de269f30bee0782b08e2fdeaac..9fdc6425c22c00cba7387dc98c8b0dd7c2bddfe9 100644 (file)
@@ -10,7 +10,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#define R10000_LLSC_WAR                        1
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MIPS_MACH_IP28_WAR_H */
index 58ff9ca345b748a9fa80848c75f499388924d1b5..8a8ec55780834f982e96473f00f16de762d2a52f 100644 (file)
@@ -7,11 +7,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#ifdef CONFIG_CPU_R10000
-#define R10000_LLSC_WAR                        1
-#else
-#define R10000_LLSC_WAR                        0
-#endif
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MIPS_MACH_IP30_WAR_H */
index ca3efe457ae035098ddabfbc257be4010f542410..9e8c0c2a4c265fce11b00066ec385fa2d624c98b 100644 (file)
@@ -10,7 +10,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#define R10000_LLSC_WAR                        0
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MIPS_MACH_IP32_WAR_H */
index b7827eb09375c399b9929c363db00f7f69d6a7d9..76f7de21b7dd7e3e4ddd272911a9a76e6853a786 100644 (file)
@@ -10,7 +10,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#define R10000_LLSC_WAR                        0
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MIPS_MACH_MIPS_WAR_H */
index b7827eb09375c399b9929c363db00f7f69d6a7d9..76f7de21b7dd7e3e4ddd272911a9a76e6853a786 100644 (file)
@@ -10,7 +10,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#define R10000_LLSC_WAR                        0
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MIPS_MACH_MIPS_WAR_H */
index fe04d059dd0cee9b6e223ac1e84c332b551f715e..dcb80b558321c9b1ed8fb03b9efe87e81e624c19 100644 (file)
@@ -10,7 +10,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#define R10000_LLSC_WAR                        0
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MIPS_MACH_RM_WAR_H */
index 7c376f6eee9bb3fbcc97a4aa4eb8a3d96bb656ea..0cf25eea846f014b89cb502236d012938cf7e0be 100644 (file)
@@ -24,7 +24,6 @@ extern int sb1250_m3_workaround_needed(void);
 
 #endif
 
-#define R10000_LLSC_WAR                        0
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MIPS_MACH_SIBYTE_WAR_H */
index 5768889c20a71f89486cb5b96883fe716d520ad3..8e572d7d2b6ec064eaf25938c5e5f5d026ad290c 100644 (file)
@@ -10,7 +10,6 @@
 
 #define BCM1250_M3_WAR                 0
 #define SIBYTE_1956_WAR                        0
-#define R10000_LLSC_WAR                        0
 #define MIPS34K_MISSED_ITLB_WAR                0
 
 #endif /* __ASM_MIPS_MACH_TX49XX_WAR_H */
index a0942821d67dc2ea5278ac891ded08ba9e130b3d..d405ecb78cbdd064b46bb9bf258ff38804c1a769 100644 (file)
 #error Check setting of SIBYTE_1956_WAR for your platform
 #endif
 
-/*
- * On the R10000 up to version 2.6 (not sure about 2.7) there is a bug that
- * may cause ll / sc and lld / scd sequences to execute non-atomically.
- */
-#ifndef R10000_LLSC_WAR
-#error Check setting of R10000_LLSC_WAR for your platform
-#endif
-
 /*
  * 34K core erratum: "Problems Executing the TLBR Instruction"
  */
index c333e578866425dc790f998780ae8f51635528d6..2afa3eef486a92e0536e98046202bc0fa9b89217 100644 (file)
@@ -106,7 +106,7 @@ static inline int mips_atomic_set(unsigned long addr, unsigned long new)
        if (unlikely(!access_ok((const void __user *)addr, 4)))
                return -EINVAL;
 
-       if (cpu_has_llsc && R10000_LLSC_WAR) {
+       if (cpu_has_llsc && IS_ENABLED(CONFIG_WAR_R10000_LLSC)) {
                __asm__ __volatile__ (
                "       .set    push                                    \n"
                "       .set    arch=r4000                              \n"
index 14f8ba93367fd279b41a72f3e0d5fd4ade0c0760..e931eb06af5791f963ed5c904cbc10e9400a92a8 100644 (file)
@@ -90,7 +90,7 @@ static inline int __maybe_unused bcm1250_m3_war(void)
 
 static inline int __maybe_unused r10000_llsc_war(void)
 {
-       return R10000_LLSC_WAR;
+       return IS_ENABLED(CONFIG_WAR_R10000_LLSC);
 }
 
 static int use_bbit_insns(void)