1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __ASM_MCS_LOCK_H 3*4882a593Smuzhiyun #define __ASM_MCS_LOCK_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifdef CONFIG_SMP 6*4882a593Smuzhiyun #include <asm/spinlock.h> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* MCS spin-locking. */ 9*4882a593Smuzhiyun #define arch_mcs_spin_lock_contended(lock) \ 10*4882a593Smuzhiyun do { \ 11*4882a593Smuzhiyun /* Ensure prior stores are observed before we enter wfe. */ \ 12*4882a593Smuzhiyun smp_mb(); \ 13*4882a593Smuzhiyun while (!(smp_load_acquire(lock))) \ 14*4882a593Smuzhiyun wfe(); \ 15*4882a593Smuzhiyun } while (0) \ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define arch_mcs_spin_unlock_contended(lock) \ 18*4882a593Smuzhiyun do { \ 19*4882a593Smuzhiyun smp_store_release(lock, 1); \ 20*4882a593Smuzhiyun dsb_sev(); \ 21*4882a593Smuzhiyun } while (0) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #endif /* CONFIG_SMP */ 24*4882a593Smuzhiyun #endif /* __ASM_MCS_LOCK_H */ 25