config GENERIC_CSUM
        bool
+       default y if !CPU_HAS_LOAD_STORE_LR
 
 config GENERIC_ISA_DMA
        bool
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        select CPU_SUPPORTS_HUGEPAGES
+       select CPU_HAS_LOAD_STORE_LR
        select WEAK_ORDERING
        select WEAK_REORDERING_BEYOND_LLSC
        select MIPS_PGD_C0_CONTEXT
        bool "MIPS32 Release 1"
        depends on SYS_HAS_CPU_MIPS32_R1
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        help
        bool "MIPS32 Release 2"
        depends on SYS_HAS_CPU_MIPS32_R2
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        select CPU_SUPPORTS_MSA
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        select CPU_SUPPORTS_MSA
-       select GENERIC_CSUM
        select HAVE_KVM
        select MIPS_O32_FP64_SUPPORT
        help
        bool "MIPS64 Release 1"
        depends on SYS_HAS_CPU_MIPS64_R1
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        bool "MIPS64 Release 2"
        depends on SYS_HAS_CPU_MIPS64_R2
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        select CPU_SUPPORTS_MSA
-       select GENERIC_CSUM
        select MIPS_O32_FP64_SUPPORT if 32BIT || MIPS32_O32
        select HAVE_KVM
        help
        bool "R3000"
        depends on SYS_HAS_CPU_R3000
        select CPU_HAS_WB
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        help
        bool "R39XX"
        depends on SYS_HAS_CPU_TX39XX
        select CPU_SUPPORTS_32BIT_KERNEL
+       select CPU_HAS_LOAD_STORE_LR
 
 config CPU_VR41XX
        bool "R41xx"
        depends on SYS_HAS_CPU_VR41XX
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
+       select CPU_HAS_LOAD_STORE_LR
        help
          The options selects support for the NEC VR4100 series of processors.
          Only choose this option if you have one of these processors as a
        depends on SYS_HAS_CPU_R4300
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
+       select CPU_HAS_LOAD_STORE_LR
        help
          MIPS Technologies R4300-series processors.
 
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HUGEPAGES
+       select CPU_HAS_LOAD_STORE_LR
        help
          MIPS Technologies R4000-series processors other than 4300, including
          the R4000, R4400, R4600, and 4700.
        bool "R49XX"
        depends on SYS_HAS_CPU_TX49XX
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HUGEPAGES
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HUGEPAGES
+       select CPU_HAS_LOAD_STORE_LR
        help
          MIPS Technologies R5000-series processors other than the Nevada.
 
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HUGEPAGES
+       select CPU_HAS_LOAD_STORE_LR
 
 config CPU_R5500
        bool "R5500"
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HUGEPAGES
+       select CPU_HAS_LOAD_STORE_LR
        help
          NEC VR5500 and VR5500A series processors implement 64-bit MIPS IV
          instruction set.
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HUGEPAGES
+       select CPU_HAS_LOAD_STORE_LR
        help
          QED / PMC-Sierra RM52xx-series ("Nevada") processors.
 
        bool "R8000"
        depends on SYS_HAS_CPU_R8000
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_64BIT_KERNEL
        help
          MIPS Technologies R8000 processors.  Note these processors are
        bool "R10000"
        depends on SYS_HAS_CPU_R10000
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        bool "RM7000"
        depends on SYS_HAS_CPU_RM7000
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
 config CPU_SB1
        bool "SB1"
        depends on SYS_HAS_CPU_SB1
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        bool "Cavium Octeon processor"
        depends on SYS_HAS_CPU_CAVIUM_OCTEON
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_64BIT_KERNEL
        select WEAK_ORDERING
        select CPU_SUPPORTS_HIGHMEM
        select WEAK_ORDERING
        select CPU_SUPPORTS_HIGHMEM
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_CPUFREQ
        select MIPS_EXTERNAL_TIMER
        help
 config CPU_XLR
        bool "Netlogic XLR SoC"
        depends on SYS_HAS_CPU_XLR
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        select WEAK_ORDERING
        select WEAK_REORDERING_BEYOND_LLSC
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_MIPSR2
        select CPU_SUPPORTS_HUGEPAGES
        select MIPS_ASID_BITS_VARIABLE
        select CPU_SUPPORTS_HIGHMEM
        select CPU_SUPPORTS_HUGEPAGES
        select ARCH_HAS_PHYS_TO_DMA
+       select CPU_HAS_LOAD_STORE_LR
 
 config CPU_LOONGSON1
        bool
        select CPU_MIPS32
        select CPU_MIPSR1
        select CPU_HAS_PREFETCH
+       select CPU_HAS_LOAD_STORE_LR
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
        select CPU_SUPPORTS_CPUFREQ
 config CPU_HAS_RIXI
        bool
 
+config CPU_HAS_LOAD_STORE_LR
+       bool
+       help
+         CPU has support for unaligned load and store instructions:
+         LWL, LWR, SWL, SWR (Load/store word left/right).
+         LDL, LDR, SDL, SDR (Load/store doubleword left/right, for 64bit systems).
+
 #
 # Vectored interrupt mode is an R2 feature
 #
 
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#ifndef CONFIG_CPU_MIPSR6
+#ifdef CONFIG_CPU_HAS_LOAD_STORE_LR
 #define     _LoadW(addr, value, res, type)   \
 do {                                                        \
                __asm__ __volatile__ (                      \
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#else
-/* MIPSR6 has no lwl instruction */
+#else /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
+/* For CPUs without lwl instruction */
 #define     _LoadW(addr, value, res, type) \
 do {                                                        \
                __asm__ __volatile__ (                      \
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#endif /* CONFIG_CPU_MIPSR6 */
+#endif /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
 
 #define     _LoadHWU(addr, value, res, type) \
 do {                                                        \
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#ifndef CONFIG_CPU_MIPSR6
+#ifdef CONFIG_CPU_HAS_LOAD_STORE_LR
 #define     _LoadWU(addr, value, res, type)  \
 do {                                                        \
                __asm__ __volatile__ (                      \
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#else
-/* MIPSR6 has not lwl and ldl instructions */
+#else /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
+/* For CPUs without lwl and ldl instructions */
 #define            _LoadWU(addr, value, res, type) \
 do {                                                        \
                __asm__ __volatile__ (                      \
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#endif /* CONFIG_CPU_MIPSR6 */
+#endif /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
 
 
 #define     _StoreHW(addr, value, res, type) \
                        : "r" (value), "r" (addr), "i" (-EFAULT));\
 } while(0)
 
-#ifndef CONFIG_CPU_MIPSR6
+#ifdef CONFIG_CPU_HAS_LOAD_STORE_LR
 #define     _StoreW(addr, value, res, type)  \
 do {                                                        \
                __asm__ __volatile__ (                      \
                : "r" (value), "r" (addr), "i" (-EFAULT));  \
 } while(0)
 
-#else
-/* MIPSR6 has no swl and sdl instructions */
+#else /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
 #define     _StoreW(addr, value, res, type)  \
 do {                                                        \
                __asm__ __volatile__ (                      \
                : "memory");                                \
 } while(0)
 
-#endif /* CONFIG_CPU_MIPSR6 */
+#endif /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
 
 #else /* __BIG_ENDIAN */
 
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#ifndef CONFIG_CPU_MIPSR6
+#ifdef CONFIG_CPU_HAS_LOAD_STORE_LR
 #define     _LoadW(addr, value, res, type)   \
 do {                                                        \
                __asm__ __volatile__ (                      \
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#else
-/* MIPSR6 has no lwl instruction */
+#else  /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
+/* For CPUs without lwl instruction */
 #define     _LoadW(addr, value, res, type) \
 do {                                                        \
                __asm__ __volatile__ (                      \
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#endif /* CONFIG_CPU_MIPSR6 */
+#endif /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
 
 
 #define     _LoadHWU(addr, value, res, type) \
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#ifndef CONFIG_CPU_MIPSR6
+#ifdef CONFIG_CPU_HAS_LOAD_STORE_LR
 #define     _LoadWU(addr, value, res, type)  \
 do {                                                        \
                __asm__ __volatile__ (                      \
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
 
-#else
-/* MIPSR6 has not lwl and ldl instructions */
+#else /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
+/* For CPUs without lwl and ldl instructions */
 #define            _LoadWU(addr, value, res, type) \
 do {                                                        \
                __asm__ __volatile__ (                      \
                        : "=&r" (value), "=r" (res)         \
                        : "r" (addr), "i" (-EFAULT));       \
 } while(0)
-#endif /* CONFIG_CPU_MIPSR6 */
+#endif /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
 
 #define     _StoreHW(addr, value, res, type) \
 do {                                                        \
                        : "r" (value), "r" (addr), "i" (-EFAULT));\
 } while(0)
 
-#ifndef CONFIG_CPU_MIPSR6
+#ifdef CONFIG_CPU_HAS_LOAD_STORE_LR
 #define     _StoreW(addr, value, res, type)  \
 do {                                                        \
                __asm__ __volatile__ (                      \
                : "r" (value), "r" (addr), "i" (-EFAULT));  \
 } while(0)
 
-#else
-/* MIPSR6 has no swl and sdl instructions */
+#else /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
+/* For CPUs without swl and sdl instructions */
 #define     _StoreW(addr, value, res, type)  \
 do {                                                        \
                __asm__ __volatile__ (                      \
                : "memory");                                \
 } while(0)
 
-#endif /* CONFIG_CPU_MIPSR6 */
+#endif /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
 #endif
 
 #define LoadHWU(addr, value, res)      _LoadHWU(addr, value, res, kernel)
 
         and    t0, src, ADDRMASK
        PREFS(  0, 2*32(src) )
        PREFD(  1, 2*32(dst) )
-#ifndef CONFIG_CPU_MIPSR6
+#ifdef CONFIG_CPU_HAS_LOAD_STORE_LR
        bnez    t1, .Ldst_unaligned\@
         nop
        bnez    t0, .Lsrc_unaligned_dst_aligned\@
        bne     rem, len, 1b
        .set    noreorder
 
-#ifndef CONFIG_CPU_MIPSR6
+#ifdef CONFIG_CPU_HAS_LOAD_STORE_LR
        /*
         * src and dst are aligned, need to copy rem bytes (rem < NBYTES)
         * A loop would do only a byte at a time with possible branch
        bne     len, rem, 1b
        .set    noreorder
 
-#endif /* !CONFIG_CPU_MIPSR6 */
+#endif /* CONFIG_CPU_HAS_LOAD_STORE_LR */
 .Lcopy_bytes_checklen\@:
        beqz    len, .Ldone\@
         nop
        jr      ra
         nop
 
-#ifdef CONFIG_CPU_MIPSR6
+#ifndef CONFIG_CPU_HAS_LOAD_STORE_LR
 .Lcopy_unaligned_bytes\@:
 1:
        COPY_BYTE(0)
        ADD     src, src, 8
        b       1b
         ADD    dst, dst, 8
-#endif /* CONFIG_CPU_MIPSR6 */
+#endif /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
        .if __memcpy == 1
        END(memcpy)
        .set __memcpy, 0
 
        .set            at
 #endif
 
-#ifndef CONFIG_CPU_MIPSR6
+#ifdef CONFIG_CPU_HAS_LOAD_STORE_LR
        R10KCBARRIER(0(ra))
 #ifdef __MIPSEB__
        EX(LONG_S_L, a1, (a0), .Lfirst_fixup\@) /* make word/dword aligned */
        PTR_SUBU        a0, t0                  /* long align ptr */
        PTR_ADDU        a2, t0                  /* correct size */
 
-#else /* CONFIG_CPU_MIPSR6 */
+#else /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
 #define STORE_BYTE(N)                          \
        EX(sb, a1, N(a0), .Lbyte_fixup\@);      \
        beqz            t0, 0f;                 \
        ori             a0, STORMASK
        xori            a0, STORMASK
        PTR_ADDIU       a0, STORSIZE
-#endif /* CONFIG_CPU_MIPSR6 */
+#endif /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
 1:     ori             t1, a2, 0x3f            /* # of full blocks */
        xori            t1, 0x3f
        beqz            t1, .Lmemset_partial\@  /* no block to fill */
        andi            a2, STORMASK            /* At most one long to go */
 
        beqz            a2, 1f
-#ifndef CONFIG_CPU_MIPSR6
+#ifdef CONFIG_CPU_HAS_LOAD_STORE_LR
         PTR_ADDU       a0, a2                  /* What's left */
        R10KCBARRIER(0(ra))
 #ifdef __MIPSEB__
        .hidden __memset
        .endif
 
-#ifdef CONFIG_CPU_MIPSR6
+#ifndef CONFIG_CPU_HAS_LOAD_STORE_LR
 .Lbyte_fixup\@:
        /*
         * unset_bytes = (#bytes - (#unaligned bytes)) - (-#unaligned bytes remaining + 1) + 1
        PTR_SUBU        a2, t0
        jr              ra
         PTR_ADDIU      a2, 1
-#endif /* CONFIG_CPU_MIPSR6 */
+#endif /* !CONFIG_CPU_HAS_LOAD_STORE_LR */
 
 .Lfirst_fixup\@:
        /* unset_bytes already in a2 */