blob: 26caa608ccd976fb53e7817b0d66997efedd4756 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef _LINUX_BITOPS_H
2#define _LINUX_BITOPS_H
3#include <asm/types.h>
4
Jiri Slabyd05be132007-10-18 23:40:31 -07005#ifdef __KERNEL__
Jiri Slaby93043ec2007-10-18 23:40:35 -07006#define BIT(nr) (1UL << (nr))
Jiri Slabyd05be132007-10-18 23:40:31 -07007#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
8#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
Jiri Slabyd05be132007-10-18 23:40:31 -07009#define BITS_PER_BYTE 8
Eric Dumazetede9c692008-04-29 00:58:35 -070010#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
Jiri Slabyd05be132007-10-18 23:40:31 -070011#endif
12
Borislav Petkov4677d4a2010-05-03 14:57:11 +020013extern unsigned int __sw_hweight8(unsigned int w);
14extern unsigned int __sw_hweight16(unsigned int w);
15extern unsigned int __sw_hweight32(unsigned int w);
16extern unsigned long __sw_hweight64(__u64 w);
17
Linus Torvalds1da177e2005-04-16 15:20:36 -070018/*
Linus Torvalds1da177e2005-04-16 15:20:36 -070019 * Include this here because some architectures need generic_ffs/fls in
20 * scope
21 */
22#include <asm/bitops.h>
23
Akinobu Mita984b3f52010-03-05 13:41:37 -080024#define for_each_set_bit(bit, addr, size) \
Shannon Nelson3e037452007-10-16 01:27:40 -070025 for ((bit) = find_first_bit((addr), (size)); \
26 (bit) < (size); \
27 (bit) = find_next_bit((addr), (size), (bit) + 1))
28
Akinobu Mita984b3f52010-03-05 13:41:37 -080029/* Temporary */
30#define for_each_bit(bit, addr, size) for_each_set_bit(bit, addr, size)
Shannon Nelson3e037452007-10-16 01:27:40 -070031
Linus Torvalds1da177e2005-04-16 15:20:36 -070032static __inline__ int get_bitmask_order(unsigned int count)
33{
34 int order;
Peter Zijlstra9f416992010-01-22 15:59:29 +010035
Linus Torvalds1da177e2005-04-16 15:20:36 -070036 order = fls(count);
37 return order; /* We could be slightly more clever with -1 here... */
38}
39
Siddha, Suresh B94605ef2005-11-05 17:25:54 +010040static __inline__ int get_count_order(unsigned int count)
41{
42 int order;
Peter Zijlstra9f416992010-01-22 15:59:29 +010043
Siddha, Suresh B94605ef2005-11-05 17:25:54 +010044 order = fls(count) - 1;
45 if (count & (count - 1))
46 order++;
47 return order;
48}
49
Linus Torvalds1da177e2005-04-16 15:20:36 -070050static inline unsigned long hweight_long(unsigned long w)
51{
Akinobu Mitae9bebd62006-03-26 01:39:55 -080052 return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053}
54
Robert P. J. Day45f8bde2007-01-26 00:57:09 -080055/**
Linus Torvalds1da177e2005-04-16 15:20:36 -070056 * rol32 - rotate a 32-bit value left
Linus Torvalds1da177e2005-04-16 15:20:36 -070057 * @word: value to rotate
58 * @shift: bits to roll
59 */
60static inline __u32 rol32(__u32 word, unsigned int shift)
61{
62 return (word << shift) | (word >> (32 - shift));
63}
64
Robert P. J. Day45f8bde2007-01-26 00:57:09 -080065/**
Linus Torvalds1da177e2005-04-16 15:20:36 -070066 * ror32 - rotate a 32-bit value right
Linus Torvalds1da177e2005-04-16 15:20:36 -070067 * @word: value to rotate
68 * @shift: bits to roll
69 */
70static inline __u32 ror32(__u32 word, unsigned int shift)
71{
72 return (word >> shift) | (word << (32 - shift));
73}
74
Harvey Harrison3afe3922008-03-28 14:16:01 -070075/**
76 * rol16 - rotate a 16-bit value left
77 * @word: value to rotate
78 * @shift: bits to roll
79 */
80static inline __u16 rol16(__u16 word, unsigned int shift)
81{
82 return (word << shift) | (word >> (16 - shift));
83}
84
85/**
86 * ror16 - rotate a 16-bit value right
87 * @word: value to rotate
88 * @shift: bits to roll
89 */
90static inline __u16 ror16(__u16 word, unsigned int shift)
91{
92 return (word >> shift) | (word << (16 - shift));
93}
94
95/**
96 * rol8 - rotate an 8-bit value left
97 * @word: value to rotate
98 * @shift: bits to roll
99 */
100static inline __u8 rol8(__u8 word, unsigned int shift)
101{
102 return (word << shift) | (word >> (8 - shift));
103}
104
105/**
106 * ror8 - rotate an 8-bit value right
107 * @word: value to rotate
108 * @shift: bits to roll
109 */
110static inline __u8 ror8(__u8 word, unsigned int shift)
111{
112 return (word >> shift) | (word << (8 - shift));
113}
114
Andrew Morton962749a2006-03-25 03:08:01 -0800115static inline unsigned fls_long(unsigned long l)
116{
117 if (sizeof(l) == 4)
118 return fls(l);
119 return fls64(l);
120}
121
Steven Whitehouse952043a2009-04-23 08:48:15 +0100122/**
123 * __ffs64 - find first set bit in a 64 bit word
124 * @word: The 64 bit word
125 *
126 * On 64 bit arches this is a synomyn for __ffs
127 * The result is not defined if no bits are set, so check that @word
128 * is non-zero before calling this.
129 */
130static inline unsigned long __ffs64(u64 word)
131{
132#if BITS_PER_LONG == 32
133 if (((u32)word) == 0UL)
134 return __ffs((u32)(word >> 32)) + 32;
135#elif BITS_PER_LONG != 64
136#error BITS_PER_LONG not 32 or 64
137#endif
138 return __ffs((unsigned long)word);
139}
140
Alexander van Heukelum64970b62008-03-11 16:17:19 +0100141#ifdef __KERNEL__
Alexander van Heukelum77b9bd92008-04-01 11:46:19 +0200142#ifdef CONFIG_GENERIC_FIND_FIRST_BIT
Alexander van Heukelum77b9bd92008-04-01 11:46:19 +0200143
144/**
145 * find_first_bit - find the first set bit in a memory region
146 * @addr: The address to start the search at
147 * @size: The maximum size to search
148 *
149 * Returns the bit number of the first set bit.
150 */
Thomas Gleixnerfee4b192008-04-29 12:01:02 +0200151extern unsigned long find_first_bit(const unsigned long *addr,
152 unsigned long size);
Alexander van Heukelum77b9bd92008-04-01 11:46:19 +0200153
154/**
155 * find_first_zero_bit - find the first cleared bit in a memory region
156 * @addr: The address to start the search at
157 * @size: The maximum size to search
158 *
159 * Returns the bit number of the first cleared bit.
160 */
Thomas Gleixnerfee4b192008-04-29 12:01:02 +0200161extern unsigned long find_first_zero_bit(const unsigned long *addr,
162 unsigned long size);
Alexander van Heukelum77b9bd92008-04-01 11:46:19 +0200163#endif /* CONFIG_GENERIC_FIND_FIRST_BIT */
164
Rusty Russellab53d472009-01-01 10:12:19 +1030165#ifdef CONFIG_GENERIC_FIND_LAST_BIT
166/**
167 * find_last_bit - find the last set bit in a memory region
168 * @addr: The address to start the search at
169 * @size: The maximum size to search
170 *
171 * Returns the bit number of the first set bit, or size.
172 */
173extern unsigned long find_last_bit(const unsigned long *addr,
174 unsigned long size);
175#endif /* CONFIG_GENERIC_FIND_LAST_BIT */
176
Alexander van Heukelum64970b62008-03-11 16:17:19 +0100177#ifdef CONFIG_GENERIC_FIND_NEXT_BIT
Alexander van Heukelum64970b62008-03-11 16:17:19 +0100178
179/**
180 * find_next_bit - find the next set bit in a memory region
181 * @addr: The address to base the search on
182 * @offset: The bitnumber to start searching at
183 * @size: The bitmap size in bits
184 */
Thomas Gleixnerfee4b192008-04-29 12:01:02 +0200185extern unsigned long find_next_bit(const unsigned long *addr,
186 unsigned long size, unsigned long offset);
Alexander van Heukelum64970b62008-03-11 16:17:19 +0100187
188/**
189 * find_next_zero_bit - find the next cleared bit in a memory region
190 * @addr: The address to base the search on
191 * @offset: The bitnumber to start searching at
192 * @size: The bitmap size in bits
193 */
Alexander van Heukelum64970b62008-03-11 16:17:19 +0100194
Thomas Gleixnerfee4b192008-04-29 12:01:02 +0200195extern unsigned long find_next_zero_bit(const unsigned long *addr,
196 unsigned long size,
197 unsigned long offset);
Alexander van Heukelum64970b62008-03-11 16:17:19 +0100198
Alexander van Heukelum64970b62008-03-11 16:17:19 +0100199#endif /* CONFIG_GENERIC_FIND_NEXT_BIT */
200#endif /* __KERNEL__ */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201#endif