xref: /dpdk/lib/eal/ppc/include/rte_spinlock.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
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