Blame view
include/asm-xtensa/bitops.h
2.67 KB
9a8fd5589 [PATCH] xtensa: A... |
1 2 3 4 5 6 7 8 9 |
/* * include/asm-xtensa/bitops.h * * Atomic operations that C can't guarantee us.Useful for resource counting etc. * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * |
ef6051a90 [XTENSA] fix bit ... |
10 |
* Copyright (C) 2001 - 2007 Tensilica Inc. |
9a8fd5589 [PATCH] xtensa: A... |
11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
*/ #ifndef _XTENSA_BITOPS_H #define _XTENSA_BITOPS_H #ifdef __KERNEL__ #include <asm/processor.h> #include <asm/byteorder.h> #include <asm/system.h> #ifdef CONFIG_SMP # error SMP not supported on this architecture #endif |
9a8fd5589 [PATCH] xtensa: A... |
25 26 |
#define smp_mb__before_clear_bit() barrier() #define smp_mb__after_clear_bit() barrier() |
d4337aa52 [PATCH] bitops: x... |
27 28 |
#include <asm-generic/bitops/atomic.h> #include <asm-generic/bitops/non-atomic.h> |
9a8fd5589 [PATCH] xtensa: A... |
29 |
|
288a60cf4 [PATCH] xtensa: r... |
30 |
#if XCHAL_HAVE_NSA |
9a8fd5589 [PATCH] xtensa: A... |
31 |
|
ef6051a90 [XTENSA] fix bit ... |
32 |
static inline unsigned long __cntlz (unsigned long x) |
9a8fd5589 [PATCH] xtensa: A... |
33 34 35 |
{ int lz; asm ("nsau %0, %1" : "=r" (lz) : "r" (x)); |
ef6051a90 [XTENSA] fix bit ... |
36 |
return lz; |
9a8fd5589 [PATCH] xtensa: A... |
37 |
} |
9a8fd5589 [PATCH] xtensa: A... |
38 39 40 41 |
/* * ffz: Find first zero in word. Undefined if no zero exists. * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). */ |
ef6051a90 [XTENSA] fix bit ... |
42 |
static inline int ffz(unsigned long x) |
9a8fd5589 [PATCH] xtensa: A... |
43 |
{ |
ef6051a90 [XTENSA] fix bit ... |
44 |
return 31 - __cntlz(~x & -~x); |
9a8fd5589 [PATCH] xtensa: A... |
45 46 47 48 49 |
} /* * __ffs: Find first bit set in word. Return 0 for bit 0 */ |
ef6051a90 [XTENSA] fix bit ... |
50 |
static inline int __ffs(unsigned long x) |
9a8fd5589 [PATCH] xtensa: A... |
51 |
{ |
ef6051a90 [XTENSA] fix bit ... |
52 |
return 31 - __cntlz(x & -x); |
9a8fd5589 [PATCH] xtensa: A... |
53 54 55 56 57 58 59 |
} /* * ffs: Find first bit set in word. This is defined the same way as * the libc and compiler builtin ffs routines, therefore * differs in spirit from the above ffz (man ffs). */ |
ef6051a90 [XTENSA] fix bit ... |
60 |
static inline int ffs(unsigned long x) |
9a8fd5589 [PATCH] xtensa: A... |
61 |
{ |
ef6051a90 [XTENSA] fix bit ... |
62 |
return 32 - __cntlz(x & -x); |
9a8fd5589 [PATCH] xtensa: A... |
63 64 65 66 67 68 |
} /* * fls: Find last (most-significant) bit set in word. * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. */ |
ef6051a90 [XTENSA] fix bit ... |
69 |
static inline int fls (unsigned int x) |
9a8fd5589 [PATCH] xtensa: A... |
70 |
{ |
ef6051a90 [XTENSA] fix bit ... |
71 |
return 32 - __cntlz(x); |
9a8fd5589 [PATCH] xtensa: A... |
72 |
} |
ef6051a90 [XTENSA] fix bit ... |
73 74 75 76 77 78 79 80 81 82 83 |
#else /* Use the generic implementation if we don't have the nsa/nsau instructions. */ # include <asm-generic/bitops/ffs.h> # include <asm-generic/bitops/__ffs.h> # include <asm-generic/bitops/ffz.h> # include <asm-generic/bitops/fls.h> #endif |
d4337aa52 [PATCH] bitops: x... |
84 85 86 |
#include <asm-generic/bitops/fls64.h> #include <asm-generic/bitops/find.h> #include <asm-generic/bitops/ext2-non-atomic.h> |
9a8fd5589 [PATCH] xtensa: A... |
87 88 |
#ifdef __XTENSA_EL__ |
de4f6e5b4 [XTENSA] clean-up... |
89 90 91 92 |
# define ext2_set_bit_atomic(lock,nr,addr) \ test_and_set_bit((nr), (unsigned long*)(addr)) # define ext2_clear_bit_atomic(lock,nr,addr) \ test_and_clear_bit((nr), (unsigned long*)(addr)) |
9a8fd5589 [PATCH] xtensa: A... |
93 |
#elif defined(__XTENSA_EB__) |
de4f6e5b4 [XTENSA] clean-up... |
94 95 96 97 |
# define ext2_set_bit_atomic(lock,nr,addr) \ test_and_set_bit((nr) ^ 0x18, (unsigned long*)(addr)) # define ext2_clear_bit_atomic(lock,nr,addr) \ test_and_clear_bit((nr) ^ 0x18, (unsigned long*)(addr)) |
9a8fd5589 [PATCH] xtensa: A... |
98 99 100 |
#else # error processor byte order undefined! #endif |
d4337aa52 [PATCH] bitops: x... |
101 102 103 |
#include <asm-generic/bitops/hweight.h> #include <asm-generic/bitops/sched.h> #include <asm-generic/bitops/minix.h> |
9a8fd5589 [PATCH] xtensa: A... |
104 105 106 107 |
#endif /* __KERNEL__ */ #endif /* _XTENSA_BITOPS_H */ |