acpi_func.h revision 1.1 1 1.1 jmcneill /* $NetBSD: acpi_func.h,v 1.1 2008/05/24 22:16:20 jmcneill Exp $ */
2 1.1 jmcneill
3 1.1 jmcneill #include <machine/cpufunc.h>
4 1.1 jmcneill
5 1.1 jmcneill #include <sys/atomic.h>
6 1.1 jmcneill
7 1.1 jmcneill #define GL_ACQUIRED (-1)
8 1.1 jmcneill #define GL_BUSY 0
9 1.1 jmcneill #define GL_BIT_PENDING 1
10 1.1 jmcneill #define GL_BIT_OWNED 2
11 1.1 jmcneill #define GL_BIT_MASK (GL_BIT_PENDING | GL_BIT_OWNED)
12 1.1 jmcneill
13 1.1 jmcneill #define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
14 1.1 jmcneill do { \
15 1.1 jmcneill (Acq) = acpi_acquire_global_lock(&((GLptr)->GlobalLock)); \
16 1.1 jmcneill } while (0)
17 1.1 jmcneill
18 1.1 jmcneill #define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \
19 1.1 jmcneill do { \
20 1.1 jmcneill (Acq) = acpi_release_global_lock(&((GLptr)->GlobalLock)); \
21 1.1 jmcneill } while (0)
22 1.1 jmcneill
23 1.1 jmcneill static inline int
24 1.1 jmcneill acpi_acquire_global_lock(uint32_t *lock)
25 1.1 jmcneill {
26 1.1 jmcneill uint32_t new, old, val;
27 1.1 jmcneill
28 1.1 jmcneill do {
29 1.1 jmcneill old = *lock;
30 1.1 jmcneill new = ((old & ~GL_BIT_MASK) | GL_BIT_OWNED) |
31 1.1 jmcneill ((old >> 1) & GL_BIT_PENDING);
32 1.1 jmcneill val = atomic_cas_32(lock, old, new);
33 1.1 jmcneill } while (__predict_false(val != old));
34 1.1 jmcneill
35 1.1 jmcneill return ((new < GL_BIT_MASK) ? GL_ACQUIRED : GL_BUSY);
36 1.1 jmcneill }
37 1.1 jmcneill
38 1.1 jmcneill static inline int
39 1.1 jmcneill acpi_release_global_lock(uint32_t *lock)
40 1.1 jmcneill {
41 1.1 jmcneill uint32_t new, old, val;
42 1.1 jmcneill
43 1.1 jmcneill do {
44 1.1 jmcneill old = *lock;
45 1.1 jmcneill new = old & ~GL_BIT_MASK;
46 1.1 jmcneill val = atomic_cas_32(lock, old, new);
47 1.1 jmcneill } while (__predict_false(val != old));
48 1.1 jmcneill
49 1.1 jmcneill return old & GL_BIT_PENDING;
50 1.1 jmcneill }
51 1.1 jmcneill
52 1.1 jmcneill #define ACPI_FLUSH_CPU_CACHE() wbinvd()
53