xref: /linux/arch/csky/include/asm/barrier.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1  /* SPDX-License-Identifier: GPL-2.0 */
2  
3  #ifndef __ASM_CSKY_BARRIER_H
4  #define __ASM_CSKY_BARRIER_H
5  
6  #ifndef __ASSEMBLY__
7  
8  #define nop()	asm volatile ("nop\n":::"memory")
9  
10  #ifdef CONFIG_SMP
11  
12  /*
13   * bar.brwarws: ordering barrier for all load/store instructions
14   *              before/after
15   *
16   * |31|30 26|25 21|20 16|15  10|9   5|4           0|
17   *  1  10000 00000 00000 100001	00001 0 bw br aw ar
18   *
19   * b: before
20   * a: after
21   * r: read
22   * w: write
23   *
24   * Here are all combinations:
25   *
26   * bar.brw
27   * bar.br
28   * bar.bw
29   * bar.arw
30   * bar.ar
31   * bar.aw
32   * bar.brwarw
33   * bar.brarw
34   * bar.bwarw
35   * bar.brwar
36   * bar.brwaw
37   * bar.brar
38   * bar.bwaw
39   */
40  #define FULL_FENCE		".long 0x842fc000\n"
41  #define ACQUIRE_FENCE		".long 0x8427c000\n"
42  #define RELEASE_FENCE		".long 0x842ec000\n"
43  
44  #define __bar_brw()	asm volatile (".long 0x842cc000\n":::"memory")
45  #define __bar_br()	asm volatile (".long 0x8424c000\n":::"memory")
46  #define __bar_bw()	asm volatile (".long 0x8428c000\n":::"memory")
47  #define __bar_arw()	asm volatile (".long 0x8423c000\n":::"memory")
48  #define __bar_ar()	asm volatile (".long 0x8421c000\n":::"memory")
49  #define __bar_aw()	asm volatile (".long 0x8422c000\n":::"memory")
50  #define __bar_brwarw()	asm volatile (FULL_FENCE:::"memory")
51  #define __bar_brarw()	asm volatile (ACQUIRE_FENCE:::"memory")
52  #define __bar_bwarw()	asm volatile (".long 0x842bc000\n":::"memory")
53  #define __bar_brwar()	asm volatile (".long 0x842dc000\n":::"memory")
54  #define __bar_brwaw()	asm volatile (RELEASE_FENCE:::"memory")
55  #define __bar_brar()	asm volatile (".long 0x8425c000\n":::"memory")
56  #define __bar_brar()	asm volatile (".long 0x8425c000\n":::"memory")
57  #define __bar_bwaw()	asm volatile (".long 0x842ac000\n":::"memory")
58  
59  #define __smp_mb()	__bar_brwarw()
60  #define __smp_rmb()	__bar_brar()
61  #define __smp_wmb()	__bar_bwaw()
62  
63  #define __smp_acquire_fence()	__bar_brarw()
64  #define __smp_release_fence()	__bar_brwaw()
65  
66  #endif /* CONFIG_SMP */
67  
68  /*
69   * sync:        completion barrier, all sync.xx instructions
70   *              guarantee the last response received by bus transaction
71   *              made by ld/st instructions before sync.s
72   * sync.s:      inherit from sync, but also shareable to other cores
73   * sync.i:      inherit from sync, but also flush cpu pipeline
74   * sync.is:     the same with sync.i + sync.s
75   */
76  #define mb()		asm volatile ("sync\n":::"memory")
77  
78  #ifdef CONFIG_CPU_HAS_CACHEV2
79  /*
80   * Using three sync.is to prevent speculative PTW
81   */
82  #define sync_is()	asm volatile ("sync.is\nsync.is\nsync.is\n":::"memory")
83  #endif
84  
85  #include <asm-generic/barrier.h>
86  
87  #endif /* __ASSEMBLY__ */
88  #endif /* __ASM_CSKY_BARRIER_H */
89