aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/parisc/include/asm/barrier.h32
-rw-r--r--arch/parisc/kernel/entry.S2
-rw-r--r--arch/parisc/kernel/pacache.S1
-rw-r--r--arch/parisc/kernel/syscall.S4
4 files changed, 39 insertions, 0 deletions
diff --git a/arch/parisc/include/asm/barrier.h b/arch/parisc/include/asm/barrier.h
new file mode 100644
index 000000000000..dbaaca84f27f
--- /dev/null
+++ b/arch/parisc/include/asm/barrier.h
@@ -0,0 +1,32 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_BARRIER_H
3#define __ASM_BARRIER_H
4
5#ifndef __ASSEMBLY__
6
7/* The synchronize caches instruction executes as a nop on systems in
8 which all memory references are performed in order. */
9#define synchronize_caches() __asm__ __volatile__ ("sync" : : : "memory")
10
11#if defined(CONFIG_SMP)
12#define mb() do { synchronize_caches(); } while (0)
13#define rmb() mb()
14#define wmb() mb()
15#define dma_rmb() mb()
16#define dma_wmb() mb()
17#else
18#define mb() barrier()
19#define rmb() barrier()
20#define wmb() barrier()
21#define dma_rmb() barrier()
22#define dma_wmb() barrier()
23#endif
24
25#define __smp_mb() mb()
26#define __smp_rmb() mb()
27#define __smp_wmb() mb()
28
29#include <asm-generic/barrier.h>
30
31#endif /* !__ASSEMBLY__ */
32#endif /* __ASM_BARRIER_H */
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
index e95207c0565e..1b4732e20137 100644
--- a/arch/parisc/kernel/entry.S
+++ b/arch/parisc/kernel/entry.S
@@ -482,6 +482,8 @@
482 .macro tlb_unlock0 spc,tmp 482 .macro tlb_unlock0 spc,tmp
483#ifdef CONFIG_SMP 483#ifdef CONFIG_SMP
484 or,COND(=) %r0,\spc,%r0 484 or,COND(=) %r0,\spc,%r0
485 sync
486 or,COND(=) %r0,\spc,%r0
485 stw \spc,0(\tmp) 487 stw \spc,0(\tmp)
486#endif 488#endif
487 .endm 489 .endm
diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S
index 22e6374ece44..97451e67d35b 100644
--- a/arch/parisc/kernel/pacache.S
+++ b/arch/parisc/kernel/pacache.S
@@ -353,6 +353,7 @@ ENDPROC_CFI(flush_data_cache_local)
353 .macro tlb_unlock la,flags,tmp 353 .macro tlb_unlock la,flags,tmp
354#ifdef CONFIG_SMP 354#ifdef CONFIG_SMP
355 ldi 1,\tmp 355 ldi 1,\tmp
356 sync
356 stw \tmp,0(\la) 357 stw \tmp,0(\la)
357 mtsm \flags 358 mtsm \flags
358#endif 359#endif
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S
index e775f80ae28c..4886a6db42e9 100644
--- a/arch/parisc/kernel/syscall.S
+++ b/arch/parisc/kernel/syscall.S
@@ -633,6 +633,7 @@ cas_action:
633 sub,<> %r28, %r25, %r0 633 sub,<> %r28, %r25, %r0
6342: stw,ma %r24, 0(%r26) 6342: stw,ma %r24, 0(%r26)
635 /* Free lock */ 635 /* Free lock */
636 sync
636 stw,ma %r20, 0(%sr2,%r20) 637 stw,ma %r20, 0(%sr2,%r20)
637#if ENABLE_LWS_DEBUG 638#if ENABLE_LWS_DEBUG
638 /* Clear thread register indicator */ 639 /* Clear thread register indicator */
@@ -647,6 +648,7 @@ cas_action:
6473: 6483:
648 /* Error occurred on load or store */ 649 /* Error occurred on load or store */
649 /* Free lock */ 650 /* Free lock */
651 sync
650 stw %r20, 0(%sr2,%r20) 652 stw %r20, 0(%sr2,%r20)
651#if ENABLE_LWS_DEBUG 653#if ENABLE_LWS_DEBUG
652 stw %r0, 4(%sr2,%r20) 654 stw %r0, 4(%sr2,%r20)
@@ -848,6 +850,7 @@ cas2_action:
848 850
849cas2_end: 851cas2_end:
850 /* Free lock */ 852 /* Free lock */
853 sync
851 stw,ma %r20, 0(%sr2,%r20) 854 stw,ma %r20, 0(%sr2,%r20)
852 /* Enable interrupts */ 855 /* Enable interrupts */
853 ssm PSW_SM_I, %r0 856 ssm PSW_SM_I, %r0
@@ -858,6 +861,7 @@ cas2_end:
85822: 86122:
859 /* Error occurred on load or store */ 862 /* Error occurred on load or store */
860 /* Free lock */ 863 /* Free lock */
864 sync
861 stw %r20, 0(%sr2,%r20) 865 stw %r20, 0(%sr2,%r20)
862 ssm PSW_SM_I, %r0 866 ssm PSW_SM_I, %r0
863 ldo 1(%r0),%r28 867 ldo 1(%r0),%r28