[Sound-open-firmware] [PATCH] locks: Add try_lock API to attempt lock access without spinning
Liam Girdwood
liam.r.girdwood at linux.intel.com
Wed Dec 13 22:58:24 CET 2017
Add a try version to acquire a spin lock.
Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
src/arch/xtensa/include/arch/spinlock.h | 18 ++++++++++++++++++
src/include/reef/lock.h | 4 ++++
2 files changed, 22 insertions(+)
diff --git a/src/arch/xtensa/include/arch/spinlock.h b/src/arch/xtensa/include/arch/spinlock.h
index acb1b8e..13bf4c1 100644
--- a/src/arch/xtensa/include/arch/spinlock.h
+++ b/src/arch/xtensa/include/arch/spinlock.h
@@ -62,6 +62,24 @@ static inline void arch_spin_lock(spinlock_t *lock)
: "memory");
}
+static inline int arch_try_lock(spinlock_t *lock)
+{
+ uint32_t result;
+
+ __asm__ __volatile__(
+ " movi %0, 0\n"
+ " wsr %0, scompare1\n"
+ " movi %0, 1\n"
+ " s32c1i %0, %1, 0\n"
+ : "=&a" (result)
+ : "a" (&lock->lock)
+ : "memory");
+
+ if (result)
+ return 0; /* lock failed */
+ return 1; /* lock acquired */
+}
+
static inline void arch_spin_unlock(spinlock_t *lock)
{
uint32_t result;
diff --git a/src/include/reef/lock.h b/src/include/reef/lock.h
index eef2a3a..deb0fb7 100644
--- a/src/include/reef/lock.h
+++ b/src/include/reef/lock.h
@@ -149,6 +149,10 @@ extern uint32_t lock_dbg_user[DBG_LOCK_USERS];
spin_lock_dbg(); \
arch_spin_lock(lock);
+#define spin_try_lock(lock) \
+ spin_lock_dbg(); \
+ arch_try_lock(lock);
+
#define spin_unlock(lock) \
arch_spin_unlock(lock); \
spin_unlock_dbg();
--
2.14.1
More information about the Sound-open-firmware
mailing list