Blame view

include/asm-xtensa/bitops.h 2.67 KB
9a8fd5589   Chris Zankel   [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   Chris Zankel   [XTENSA] fix bit ...
10
   * Copyright (C) 2001 - 2007 Tensilica Inc.
9a8fd5589   Chris Zankel   [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   Chris Zankel   [PATCH] xtensa: A...
25
26
  #define smp_mb__before_clear_bit()	barrier()
  #define smp_mb__after_clear_bit()	barrier()
d4337aa52   Akinobu Mita   [PATCH] bitops: x...
27
28
  #include <asm-generic/bitops/atomic.h>
  #include <asm-generic/bitops/non-atomic.h>
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
29

288a60cf4   Chris Zankel   [PATCH] xtensa: r...
30
  #if XCHAL_HAVE_NSA
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
31

ef6051a90   Chris Zankel   [XTENSA] fix bit ...
32
  static inline unsigned long __cntlz (unsigned long x)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
33
34
35
  {
  	int lz;
  	asm ("nsau %0, %1" : "=r" (lz) : "r" (x));
ef6051a90   Chris Zankel   [XTENSA] fix bit ...
36
  	return lz;
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
37
  }
9a8fd5589   Chris Zankel   [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   Chris Zankel   [XTENSA] fix bit ...
42
  static inline int ffz(unsigned long x)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
43
  {
ef6051a90   Chris Zankel   [XTENSA] fix bit ...
44
  	return 31 - __cntlz(~x & -~x);
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
45
46
47
48
49
  }
  
  /*
   * __ffs: Find first bit set in word. Return 0 for bit 0
   */
ef6051a90   Chris Zankel   [XTENSA] fix bit ...
50
  static inline int __ffs(unsigned long x)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
51
  {
ef6051a90   Chris Zankel   [XTENSA] fix bit ...
52
  	return 31 - __cntlz(x & -x);
9a8fd5589   Chris Zankel   [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   Chris Zankel   [XTENSA] fix bit ...
60
  static inline int ffs(unsigned long x)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
61
  {
ef6051a90   Chris Zankel   [XTENSA] fix bit ...
62
  	return 32 - __cntlz(x & -x);
9a8fd5589   Chris Zankel   [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   Chris Zankel   [XTENSA] fix bit ...
69
  static inline int fls (unsigned int x)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
70
  {
ef6051a90   Chris Zankel   [XTENSA] fix bit ...
71
  	return 32 - __cntlz(x);
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
72
  }
ef6051a90   Chris Zankel   [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   Akinobu Mita   [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   Chris Zankel   [PATCH] xtensa: A...
87
88
  
  #ifdef __XTENSA_EL__
de4f6e5b4   Chris Zankel   [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   Chris Zankel   [PATCH] xtensa: A...
93
  #elif defined(__XTENSA_EB__)
de4f6e5b4   Chris Zankel   [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   Chris Zankel   [PATCH] xtensa: A...
98
99
100
  #else
  # error processor byte order undefined!
  #endif
d4337aa52   Akinobu Mita   [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   Chris Zankel   [PATCH] xtensa: A...
104
105
106
107
  
  #endif	/* __KERNEL__ */
  
  #endif	/* _XTENSA_BITOPS_H */