diff options
| -rw-r--r-- | arch/parisc/include/asm/barrier.h | 32 | ||||
| -rw-r--r-- | arch/parisc/kernel/entry.S | 2 | ||||
| -rw-r--r-- | arch/parisc/kernel/pacache.S | 1 | ||||
| -rw-r--r-- | arch/parisc/kernel/syscall.S | 4 |
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 |
| 634 | 2: stw,ma %r24, 0(%r26) | 634 | 2: 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: | |||
| 647 | 3: | 648 | 3: |
| 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 | ||
| 849 | cas2_end: | 851 | cas2_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: | |||
| 858 | 22: | 861 | 22: |
| 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 |
