1. 08 10月, 2019 40 次提交
    • P
      MIPS: Check Loongson3 LL/SC errata workaround correctness · e4acfbc1
      Paul Burton 提交于
      When Loongson3 LL/SC errata workarounds are enabled (ie.
      CONFIG_CPU_LOONGSON3_WORKAROUNDS=y) run a tool to scan through the
      compiled kernel & ensure that the workaround is applied correctly. That
      is, ensure that:
      
        - Every LL or LLD instruction is preceded by a sync instruction.
      
        - Any branches from within an LL/SC loop to outside of that loop
          target a sync instruction.
      
      Reasoning for these conditions can be found by reading the comment above
      the definition of __SYNC_loongson3_war in arch/mips/include/asm/sync.h.
      
      This tool will help ensure that we don't inadvertently introduce code
      paths that miss the required workarounds.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      e4acfbc1
    • P
      MIPS: genex: Don't reload address unnecessarily · 4dee90d7
      Paul Burton 提交于
      In ejtag_debug_handler() we must reload the address of
      ejtag_debug_buffer_spinlock if an sc fails, since the address in k0 will
      have been clobbered by the result of the sc instruction. In the case
      where we simply load a non-zero value (ie. there's contention for the
      lock) the address will not be clobbered & we can simply branch back to
      repeat the load from memory without reloading the address into k0.
      
      The primary motivation for this change is that it moves the target of
      the bnez instruction to an instruction within the LL/SC loop (the LL
      itself), which we know contains no other memory accesses & therefore
      isn't affected by Loongson3 LL/SC errata.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      4dee90d7
    • P
      MIPS: genex: Add Loongson3 LL/SC workaround to ejtag_debug_handler · 12dbb04f
      Paul Burton 提交于
      In ejtag_debug_handler we use LL & SC instructions to acquire & release
      an open-coded spinlock. For Loongson3 systems affected by LL/SC errata
      this requires that we insert a sync instruction prior to the LL in order
      to ensure correct behavior of the LL/SC loop.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      12dbb04f
    • P
      MIPS: barrier: Make __smp_mb__before_atomic() a no-op for Loongson3 · ae4cd0b1
      Paul Burton 提交于
      Loongson3 systems with CONFIG_CPU_LOONGSON3_WORKAROUNDS enabled already
      emit a full completion barrier as part of the inline assembly containing
      LL/SC loops for atomic operations. As such the barrier emitted by
      __smp_mb__before_atomic() is redundant, and we can remove it.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      ae4cd0b1
    • P
      MIPS: barrier: Remove loongson_llsc_mb() · 7f56b123
      Paul Burton 提交于
      The loongson_llsc_mb() macro is no longer used - instead barriers are
      emitted as part of inline asm using the __SYNC() macro. Remove the
      now-defunct loongson_llsc_mb() macro.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      7f56b123
    • P
      MIPS: syscall: Emit Loongson3 sync workarounds within asm · e84957e6
      Paul Burton 提交于
      Generate the sync instructions required to workaround Loongson3 LL/SC
      errata within inline asm blocks, which feels a little safer than doing
      it from C where strictly speaking the compiler would be well within its
      rights to insert a memory access between the separate asm statements we
      previously had, containing sync & ll instructions respectively.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      e84957e6
    • P
      MIPS: futex: Emit Loongson3 sync workarounds within asm · 3c1d3f09
      Paul Burton 提交于
      Generate the sync instructions required to workaround Loongson3 LL/SC
      errata within inline asm blocks, which feels a little safer than doing
      it from C where strictly speaking the compiler would be well within its
      rights to insert a memory access between the separate asm statements we
      previously had, containing sync & ll instructions respectively.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      3c1d3f09
    • P
      MIPS: cmpxchg: Omit redundant barriers for Loongson3 · a91f2a1d
      Paul Burton 提交于
      When building a kernel configured to support Loongson3 LL/SC workarounds
      (ie. CONFIG_CPU_LOONGSON3_WORKAROUNDS=y) the inline assembly in
      __xchg_asm() & __cmpxchg_asm() already emits completion barriers, and as
      such we don't need to emit extra barriers from the xchg() or cmpxchg()
      macros. Add compile-time constant checks causing us to omit the
      redundant memory barriers.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      a91f2a1d
    • P
      MIPS: cmpxchg: Emit Loongson3 sync workarounds within asm · 6a57d2d1
      Paul Burton 提交于
      Generate the sync instructions required to workaround Loongson3 LL/SC
      errata within inline asm blocks, which feels a little safer than doing
      it from C where strictly speaking the compiler would be well within its
      rights to insert a memory access between the separate asm statements we
      previously had, containing sync & ll instructions respectively.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      6a57d2d1
    • P
      MIPS: bitops: Use smp_mb__before_atomic in test_* ops · 90267377
      Paul Burton 提交于
      Use smp_mb__before_atomic() rather than smp_mb__before_llsc() in
      test_and_set_bit(), test_and_clear_bit() & test_and_change_bit(). The
      _atomic() versions make semantic sense in these cases, and will allow a
      later patch to omit redundant barriers for Loongson3 systems that
      already include a barrier within __test_bit_op().
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      90267377
    • P
      MIPS: bitops: Emit Loongson3 sync workarounds within asm · 5bb29275
      Paul Burton 提交于
      Generate the sync instructions required to workaround Loongson3 LL/SC
      errata within inline asm blocks, which feels a little safer than doing
      it from C where strictly speaking the compiler would be well within its
      rights to insert a memory access between the separate asm statements we
      previously had, containing sync & ll instructions respectively.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      5bb29275
    • P
      MIPS: bitops: Use BIT_WORD() & BITS_PER_LONG · c042be02
      Paul Burton 提交于
      Rather than using custom SZLONG_LOG & SZLONG_MASK macros to shift & mask
      a bit index to form word & bit offsets respectively, make use of the
      standard BIT_WORD() & BITS_PER_LONG macros for the same purpose.
      
      volatile is added to the definition of pointers to the long-sized word
      we'll operate on, in order to prevent the compiler complaining that we
      cast away the volatile qualifier of the addr argument. This should have
      no effect on generated code, which in the LL/SC case is inline asm
      anyway & in the non-LLSC case access is constrained by compiler barriers
      provided by raw_local_irq_{save,restore}().
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      c042be02
    • P
      MIPS: bitops: Abstract LL/SC loops · cc99987c
      Paul Burton 提交于
      Introduce __bit_op() & __test_bit_op() macros which abstract away the
      implementation of LL/SC loops. This cuts down on a lot of duplicate
      boilerplate code, and also allows R10000_LLSC_WAR to be handled outside
      of the individual bitop functions.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      cc99987c
    • P
      MIPS: bitops: Avoid redundant zero-comparison for non-LLSC · aad028ca
      Paul Burton 提交于
      The IRQ-disabling non-LLSC fallbacks for bitops on UP systems already
      return a zero or one, so there's no need to perform another comparison
      against zero. Move these comparisons into the LLSC paths to avoid the
      redundant work.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      aad028ca
    • P
      MIPS: bitops: Use the BIT() macro · d6103510
      Paul Burton 提交于
      Use the BIT() macro in asm/bitops.h rather than open-coding its
      equivalent.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      d6103510
    • P
      MIPS: bitops: Allow immediates in test_and_{set,clear,change}_bit · a2e66b86
      Paul Burton 提交于
      The logical operations or & xor used in the test_and_set_bit_lock(),
      test_and_clear_bit() & test_and_change_bit() functions currently force
      the value 1<<bit to be placed in a register. If the bit is compile-time
      constant & fits within the immediate field of an or/xor instruction (ie.
      16 bits) then we can make use of the ori/xori instruction variants &
      avoid the use of an extra register. Add the extra "i" constraints in
      order to allow use of these immediate encodings.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      a2e66b86
    • P
      MIPS: bitops: Implement test_and_set_bit() in terms of _lock variant · 6bbe043b
      Paul Burton 提交于
      The only difference between test_and_set_bit() & test_and_set_bit_lock()
      is memory ordering barrier semantics - the former provides a full
      barrier whilst the latter only provides acquire semantics.
      
      We can therefore implement test_and_set_bit() in terms of
      test_and_set_bit_lock() with the addition of the extra memory barrier.
      Do this in order to avoid duplicating logic.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      6bbe043b
    • P
      MIPS: bitops: ins start position is always an immediate · 27aab272
      Paul Burton 提交于
      The start position for an ins instruction is always encoded as an
      immediate, so allowing registers to be used by the inline asm makes no
      sense. It should never happen anyway since a bit index should always be
      small enough to be treated as an immediate, but remove the nonsensical
      "r" for sanity.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      27aab272
    • P
      MIPS: bitops: Use MIPS_ISA_REV, not #ifdefs · 59361e99
      Paul Burton 提交于
      Rather than #ifdef on CONFIG_CPU_* to determine whether the ins
      instruction is supported we can simply check MIPS_ISA_REV to discover
      whether we're targeting MIPSr2 or higher. Do so in order to clean up the
      code.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      59361e99
    • P
      MIPS: bitops: Only use ins for bit 16 or higher · 3d2920cf
      Paul Burton 提交于
      set_bit() can set bits 0-15 using an ori instruction, rather than
      loading the value -1 into a register & then using an ins instruction.
      
      That is, rather than the following:
      
        li   t0, -1
        ll   t1, 0(t2)
        ins  t1, t0, 4, 1
        sc   t1, 0(t2)
      
      We can have the simpler:
      
        ll   t1, 0(t2)
        ori  t1, t1, 0x10
        sc   t1, 0(t2)
      
      The or path already allows immediates to be used, so simply restricting
      the ins path to bits that don't fit in immediates is sufficient to take
      advantage of this.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      3d2920cf
    • P
      MIPS: bitops: Handle !kernel_uses_llsc first · fe7cd97e
      Paul Burton 提交于
      Reorder conditions in our various bitops functions that check
      kernel_uses_llsc such that they handle the !kernel_uses_llsc case first.
      This allows us to avoid the need to duplicate the kernel_uses_llsc check
      in all the other cases. For functions that don't involve barriers common
      to the various implementations, we switch to returning from within each
      if block making each case easier to read in isolation.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      fe7cd97e
    • P
      MIPS: atomic: Deduplicate 32b & 64b read, set, xchg, cmpxchg · 1da7bce8
      Paul Burton 提交于
      Remove the remaining duplication between 32b & 64b in asm/atomic.h by
      making use of an ATOMIC_OPS() macro to generate:
      
        - atomic_read()/atomic64_read()
        - atomic_set()/atomic64_set()
        - atomic_cmpxchg()/atomic64_cmpxchg()
        - atomic_xchg()/atomic64_xchg()
      
      This is consistent with the way all other functions in asm/atomic.h are
      generated, and ensures consistency between the 32b & 64b functions.
      
      Of note is that this results in the above now being static inline
      functions rather than macros.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      1da7bce8
    • P
      MIPS: atomic: Unify 32b & 64b sub_if_positive · 40e784b4
      Paul Burton 提交于
      Unify the definitions of atomic_sub_if_positive() &
      atomic64_sub_if_positive() using a macro like we do for most other
      atomic functions. This allows us to share the implementation ensuring
      consistency between the two. Notably this provides the appropriate
      loongson3_war barriers in the atomic64_sub_if_positive() case which were
      previously missing.
      
      The code is rearranged a little to handle the !kernel_uses_llsc case
      first in order to de-indent the LL/SC case & allow us not to go over 80
      characters per line.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      40e784b4
    • P
      MIPS: atomic: Use _atomic barriers in atomic_sub_if_positive() · 77d281b7
      Paul Burton 提交于
      Use smp_mb__before_atomic() & smp_mb__after_atomic() in
      atomic_sub_if_positive() rather than the equivalent
      smp_mb__before_llsc() & smp_llsc_mb(). The former are more standard &
      this preps us for avoiding redundant duplicate barriers on Loongson3 in
      a later patch.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      77d281b7
    • P
      MIPS: atomic: Emit Loongson3 sync workarounds within asm · 4d1dbfe6
      Paul Burton 提交于
      Generate the sync instructions required to workaround Loongson3 LL/SC
      errata within inline asm blocks, which feels a little safer than doing
      it from C where strictly speaking the compiler would be well within its
      rights to insert a memory access between the separate asm statements we
      previously had, containing sync & ll instructions respectively.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      4d1dbfe6
    • P
      MIPS: atomic: Use one macro to generate 32b & 64b functions · a38ee6bb
      Paul Burton 提交于
      Cut down on duplication by generalizing the ATOMIC_OP(),
      ATOMIC_OP_RETURN() & ATOMIC_FETCH_OP() macros to work for both 32b &
      64b atomics, and removing the ATOMIC64_ variants. This ensures
      consistency between our atomic_* & atomic64_* functions.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      a38ee6bb
    • P
      MIPS: atomic: Handle !kernel_uses_llsc first · 9537db24
      Paul Burton 提交于
      Handle the !kernel_uses_llsc path first in our ATOMIC_OP(),
      ATOMIC_OP_RETURN() & ATOMIC_FETCH_OP() macros & return from within the
      block. This allows us to de-indent the kernel_uses_llsc path by one
      level which will be useful when making further changes.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      9537db24
    • P
      MIPS: atomic: Fix whitespace in ATOMIC_OP macros · 36d3295c
      Paul Burton 提交于
      We define macros in asm/atomic.h which end each line with space
      characters before a backslash to continue on the next line. Remove the
      space characters leaving tabs as the whitespace used for conformity with
      coding convention.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      36d3295c
    • P
      MIPS: barrier: Clean up sync_ginv() · 185d7d7a
      Paul Burton 提交于
      Use the new __SYNC() infrastructure to implement sync_ginv(), for
      consistency with much of the rest of the asm/barrier.h.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      185d7d7a
    • P
      MIPS: barrier: Clean up __sync() definition · fe0065e5
      Paul Burton 提交于
      Implement __sync() using the new __SYNC() infrastructure, which will
      take care of not emitting an instruction for old R3k CPUs that don't
      support it. The only behavioral difference is that __sync() will now
      provide a compiler barrier on these old CPUs, but that seems like
      reasonable behavior anyway.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      fe0065e5
    • P
      MIPS: barrier: Remove fast_mb() Octeon #ifdef'ery · 5c12a6ef
      Paul Burton 提交于
      The definition of fast_mb() is the same in both the Octeon & non-Octeon
      cases, so remove the duplication & define it only once.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      5c12a6ef
    • P
      MIPS: barrier: Clean up __smp_mb() definition · 05e6da74
      Paul Burton 提交于
      We #ifdef on Cavium Octeon CPUs, but emit the same sync instruction in
      both cases. Remove the #ifdef & simply expand to the __sync() macro.
      
      Whilst here indent the strong ordering case definitions to match the
      indentation of the weak ordering ones, helping readability.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      05e6da74
    • P
      MIPS: barrier: Clean up rmb() & wmb() definitions · 21e3134b
      Paul Burton 提交于
      Simplify our definitions of rmb() & wmb() using the new __SYNC()
      infrastructure.
      
      The fast_rmb() & fast_wmb() macros are removed, since they only provided
      a level of indirection that made the code less readable & weren't
      directly used anywhere in the kernel tree.
      
      The Octeon #ifdef'ery is removed, since the "syncw" instruction
      previously used is merely an alias for "sync 4" which __SYNC() will emit
      for the wmb sync type when the kernel is configured for an Octeon CPU.
      Similarly __SYNC() will emit nothing for the rmb sync type in Octeon
      configurations.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      21e3134b
    • P
      MIPS: barrier: Add __SYNC() infrastructure · bf929272
      Paul Burton 提交于
      Introduce an asm/sync.h header which provides infrastructure that can be
      used to generate sync instructions of various types, and for various
      reasons. For example if we need a sync instruction that provides a full
      completion barrier but only on systems which have weak memory ordering,
      we can generate the appropriate assembly code using:
      
        __SYNC(full, weak_ordering)
      
      When the kernel is configured to run on systems with weak memory
      ordering (ie. CONFIG_WEAK_ORDERING is selected) we'll emit a sync
      instruction. When the kernel is configured to run on systems with strong
      memory ordering (ie. CONFIG_WEAK_ORDERING is not selected) we'll emit
      nothing. The caller doesn't need to know which happened - it simply says
      what it needs & when, with no concern for checking the kernel
      configuration.
      
      There are some scenarios in which we may want to emit code only when we
      *didn't* emit a sync instruction. For example, some Loongson3 CPUs
      suffer from a bug that requires us to emit a sync instruction prior to
      each ll instruction (enabled by CONFIG_CPU_LOONGSON3_WORKAROUNDS). In
      cases where this bug workaround is enabled, it's wasteful to then have
      more generic code emit another sync instruction to provide barriers we
      need in general. A __SYNC_ELSE() macro allows for this, providing an
      extra argument that contains code to be assembled only in cases where
      the sync instruction was not emitted. For example if we have a scenario
      in which we generally want to emit a release barrier but for affected
      Loongson3 configurations upgrade that to a full completion barrier, we
      can do that like so:
      
        __SYNC_ELSE(full, loongson3_war, __SYNC(rl, always))
      
      The assembly generated by these macros can be used either as inline
      assembly or in assembly source files.
      
      Differing types of sync as provided by MIPSr6 are defined, but currently
      they all generate a full completion barrier except in kernels configured
      for Cavium Octeon systems. There the wmb sync-type is used, and rmb
      syncs are omitted, as has been the case since commit 6b07d38a
      ("MIPS: Octeon: Use optimized memory barrier primitives."). Using
      __SYNC() with the wmb or rmb types will abstract away the Octeon
      specific behavior and allow us to later clean up asm/barrier.h code that
      currently includes a plethora of #ifdef's.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      bf929272
    • P
      MIPS: Use compact branch for LL/SC loops on MIPSr6+ · ef85d057
      Paul Burton 提交于
      When targeting MIPSr6 or higher make use of a compact branch in LL/SC
      loops, preventing the insertion of a delay slot nop that only serves to
      waste space.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      ef85d057
    • P
      MIPS: Unify sc beqz definition · 878f75c7
      Paul Burton 提交于
      We currently duplicate the definition of __scbeqz in asm/atomic.h &
      asm/cmpxchg.h. Move it to asm/llsc.h & rename it to __SC_BEQZ to fit
      better with the existing __SC macro provided there.
      
      We include a tab in the string in order to avoid the need for users to
      indent code any further to include whitespace of their own after the
      instruction mnemonic.
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: linux-mips@vger.kernel.org
      Cc: Huacai Chen <chenhc@lemote.com>
      Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
      Cc: linux-kernel@vger.kernel.org
      878f75c7
    • S
      MIPS: ralink: Add GARDENA smart Gateway MT7688 board · 376357ac
      Stefan Roese 提交于
      This patch adds support for the GARDENA smart Gateway, which is based on
      the MediaTek MT7688 SoC. It is equipped with 128 MiB of DDR and 8 MiB of
      flash (SPI NOR) and additional 128MiB SPI NAND storage.
      Signed-off-by: NStefan Roese <sr@denx.de>
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: Harvey Hunt <harveyhuntnexus@gmail.com>
      Cc: John Crispin <john@phrozen.org>
      Cc: linux-mips@vger.kernel.org
      376357ac
    • S
      dt-bindings: mips: Add gardena vendor prefix and board description · 4ce8a03c
      Stefan Roese 提交于
      This patch adds the vendor prefix for gardena and a short description
      including the compatible string for the "GARDENA smart Gateway" based
      on the MT7688 SoC.
      Signed-off-by: NStefan Roese <sr@denx.de>
      Reviewed-by: NRob Herring <robh@kernel.org>
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: devicetree@vger.kernel.org
      Cc: linux-mips@vger.kernel.org
      4ce8a03c
    • S
      dt-bindings: mips: Add missing mt7688a-soc compatible · cf892abf
      Stefan Roese 提交于
      This patch adds the "ralink,mt7688a-soc" compatible to the ralink DT
      bindings documentation. This compatible is already used by some MIPS
      boards (e.g. omega2p.dts) but not yet documented. It will also be used
      by the upcoming "GARDENA smart Gateway" support.
      Signed-off-by: NStefan Roese <sr@denx.de>
      Reviewed-by: NRob Herring <robh@kernel.org>
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: devicetree@vger.kernel.org
      Cc: linux-mips@vger.kernel.org
      cf892abf
    • S
      MIPS: ralink: mt7628a.dtsi: Add I2C controller DT node · cd5f9e4f
      Stefan Roese 提交于
      This patch adds the I2C controller description to the MT7628A dtsi file.
      Signed-off-by: NStefan Roese <sr@denx.de>
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: Harvey Hunt <harveyhuntnexus@gmail.com>
      Cc: John Crispin <john@phrozen.org>
      Cc: linux-mips@vger.kernel.org
      cd5f9e4f