199a2dd95SBruce Richardson /* 299a2dd95SBruce Richardson * SPDX-License-Identifier: BSD-3-Clause 399a2dd95SBruce Richardson * Copyright (C) IBM Corporation 2014. 499a2dd95SBruce Richardson */ 599a2dd95SBruce Richardson 699a2dd95SBruce Richardson #ifndef _RTE_SPINLOCK_PPC_64_H_ 799a2dd95SBruce Richardson #define _RTE_SPINLOCK_PPC_64_H_ 899a2dd95SBruce Richardson 999a2dd95SBruce Richardson #include <rte_common.h> 1099a2dd95SBruce Richardson #include <rte_pause.h> 1199a2dd95SBruce Richardson #include "generic/rte_spinlock.h" 1299a2dd95SBruce Richardson 13*719834a6SMattias Rönnblom #ifdef __cplusplus 14*719834a6SMattias Rönnblom extern "C" { 15*719834a6SMattias Rönnblom #endif 16*719834a6SMattias Rönnblom 1799a2dd95SBruce Richardson /* Fixme: Use intrinsics to implement the spinlock on Power architecture */ 1899a2dd95SBruce Richardson 1999a2dd95SBruce Richardson #ifndef RTE_FORCE_INTRINSICS 2099a2dd95SBruce Richardson 2199a2dd95SBruce Richardson static inline void 2299a2dd95SBruce Richardson rte_spinlock_lock(rte_spinlock_t *sl) 23657a98f3SDavid Marchand __rte_no_thread_safety_analysis 2499a2dd95SBruce Richardson { 2599a2dd95SBruce Richardson while (__sync_lock_test_and_set(&sl->locked, 1)) 2699a2dd95SBruce Richardson while (sl->locked) 2799a2dd95SBruce Richardson rte_pause(); 2899a2dd95SBruce Richardson } 2999a2dd95SBruce Richardson 3099a2dd95SBruce Richardson static inline void 3199a2dd95SBruce Richardson rte_spinlock_unlock(rte_spinlock_t *sl) 32657a98f3SDavid Marchand __rte_no_thread_safety_analysis 3399a2dd95SBruce Richardson { 3499a2dd95SBruce Richardson __sync_lock_release(&sl->locked); 3599a2dd95SBruce Richardson } 3699a2dd95SBruce Richardson 3799a2dd95SBruce Richardson static inline int 3899a2dd95SBruce Richardson rte_spinlock_trylock(rte_spinlock_t *sl) 39657a98f3SDavid Marchand __rte_no_thread_safety_analysis 4099a2dd95SBruce Richardson { 4199a2dd95SBruce Richardson return __sync_lock_test_and_set(&sl->locked, 1) == 0; 4299a2dd95SBruce Richardson } 4399a2dd95SBruce Richardson 4499a2dd95SBruce Richardson #endif 4599a2dd95SBruce Richardson 4699a2dd95SBruce Richardson static inline int rte_tm_supported(void) 4799a2dd95SBruce Richardson { 4899a2dd95SBruce Richardson return 0; 4999a2dd95SBruce Richardson } 5099a2dd95SBruce Richardson 5199a2dd95SBruce Richardson static inline void 5299a2dd95SBruce Richardson rte_spinlock_lock_tm(rte_spinlock_t *sl) 5399a2dd95SBruce Richardson { 5499a2dd95SBruce Richardson rte_spinlock_lock(sl); /* fall-back */ 5599a2dd95SBruce Richardson } 5699a2dd95SBruce Richardson 5799a2dd95SBruce Richardson static inline int 5899a2dd95SBruce Richardson rte_spinlock_trylock_tm(rte_spinlock_t *sl) 5999a2dd95SBruce Richardson { 6099a2dd95SBruce Richardson return rte_spinlock_trylock(sl); 6199a2dd95SBruce Richardson } 6299a2dd95SBruce Richardson 6399a2dd95SBruce Richardson static inline void 6499a2dd95SBruce Richardson rte_spinlock_unlock_tm(rte_spinlock_t *sl) 6599a2dd95SBruce Richardson { 6699a2dd95SBruce Richardson rte_spinlock_unlock(sl); 6799a2dd95SBruce Richardson } 6899a2dd95SBruce Richardson 6999a2dd95SBruce Richardson static inline void 7099a2dd95SBruce Richardson rte_spinlock_recursive_lock_tm(rte_spinlock_recursive_t *slr) 7199a2dd95SBruce Richardson { 7299a2dd95SBruce Richardson rte_spinlock_recursive_lock(slr); /* fall-back */ 7399a2dd95SBruce Richardson } 7499a2dd95SBruce Richardson 7599a2dd95SBruce Richardson static inline void 7699a2dd95SBruce Richardson rte_spinlock_recursive_unlock_tm(rte_spinlock_recursive_t *slr) 7799a2dd95SBruce Richardson { 7899a2dd95SBruce Richardson rte_spinlock_recursive_unlock(slr); 7999a2dd95SBruce Richardson } 8099a2dd95SBruce Richardson 8199a2dd95SBruce Richardson static inline int 8299a2dd95SBruce Richardson rte_spinlock_recursive_trylock_tm(rte_spinlock_recursive_t *slr) 8399a2dd95SBruce Richardson { 8499a2dd95SBruce Richardson return rte_spinlock_recursive_trylock(slr); 8599a2dd95SBruce Richardson } 8699a2dd95SBruce Richardson 8799a2dd95SBruce Richardson #ifdef __cplusplus 8899a2dd95SBruce Richardson } 8999a2dd95SBruce Richardson #endif 9099a2dd95SBruce Richardson 9199a2dd95SBruce Richardson #endif /* _RTE_SPINLOCK_PPC_64_H_ */ 92