[coreboot-gerrit] New patch to review for coreboot: 9b35406 arm64: add spinlock implementation
Patrick Georgi (pgeorgi@google.com)
gerrit at coreboot.org
Thu Mar 26 11:19:18 CET 2015
Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/9040
-gerrit
commit 9b354063e82d9de021b7ec1e4be42d87c6e1c315
Author: Aaron Durbin <adurbin at chromium.org>
Date: Sat Sep 6 01:24:38 2014 -0500
arm64: add spinlock implementation
Provide a simple spinlock implentation for arm64. A value
of 0 is unlocked and a value of 1 is locked.
BUG=chrome-os-partner:31761
BRANCH=None
TEST=Built and ran SMP bringup on ryu.
Change-Id: Ie88a715a6b51cd38a5fdd830583dae528cc49d67
Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
Original-Commit-Id: 14dab94610c96d6b1530c64d661833f8e613101c
Original-Change-Id: I3bf2d80b91112d04442455ff0fa3f16900b7327f
Original-Signed-off-by: Aaron Durbin <adurbin at chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/216923
Original-Reviewed-by: Furquan Shaikh <furquan at chromium.org>
---
src/arch/arm64/include/armv8/arch/smp/spinlock.h | 25 +++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/src/arch/arm64/include/armv8/arch/smp/spinlock.h b/src/arch/arm64/include/armv8/arch/smp/spinlock.h
index 8a89d1f..10278e7 100644
--- a/src/arch/arm64/include/armv8/arch/smp/spinlock.h
+++ b/src/arch/arm64/include/armv8/arch/smp/spinlock.h
@@ -1,6 +1,29 @@
#ifndef ARCH_SMP_SPINLOCK_H
#define ARCH_SMP_SPINLOCK_H
-#error "spinlocks: implement this for ARM64"
+#include <arch/barrier.h>
+#include <stdint.h>
+
+typedef struct {
+ volatile uint32_t lock;
+} spinlock_t;
+
+#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
+#define DECLARE_SPIN_LOCK(x) static spinlock_t x = SPIN_LOCK_UNLOCKED;
+
+static inline void spin_lock(spinlock_t *spin)
+{
+ while (1) {
+ if (load_acquire_exclusive(&spin->lock) != 0)
+ continue;
+ if (store_release_exclusive(&spin->lock, 1))
+ break;
+ }
+}
+
+static inline void spin_unlock(spinlock_t *spin)
+{
+ store_release(&spin->lock, 0);
+}
#endif
More information about the coreboot-gerrit
mailing list