io-mapping: move some code within the include guarded section
[linux-2.6-microblaze.git] / include / linux / find.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __LINUX_FIND_H_
3 #define __LINUX_FIND_H_
4
5 #ifndef __LINUX_BITMAP_H
6 #error only <linux/bitmap.h> can be included directly
7 #endif
8
9 #include <linux/bitops.h>
10
11 unsigned long _find_next_bit(const unsigned long *addr1, unsigned long nbits,
12                                 unsigned long start);
13 unsigned long _find_next_and_bit(const unsigned long *addr1, const unsigned long *addr2,
14                                         unsigned long nbits, unsigned long start);
15 unsigned long _find_next_andnot_bit(const unsigned long *addr1, const unsigned long *addr2,
16                                         unsigned long nbits, unsigned long start);
17 unsigned long _find_next_zero_bit(const unsigned long *addr, unsigned long nbits,
18                                          unsigned long start);
19 extern unsigned long _find_first_bit(const unsigned long *addr, unsigned long size);
20 unsigned long __find_nth_bit(const unsigned long *addr, unsigned long size, unsigned long n);
21 unsigned long __find_nth_and_bit(const unsigned long *addr1, const unsigned long *addr2,
22                                 unsigned long size, unsigned long n);
23 unsigned long __find_nth_andnot_bit(const unsigned long *addr1, const unsigned long *addr2,
24                                         unsigned long size, unsigned long n);
25 extern unsigned long _find_first_and_bit(const unsigned long *addr1,
26                                          const unsigned long *addr2, unsigned long size);
27 extern unsigned long _find_first_zero_bit(const unsigned long *addr, unsigned long size);
28 extern unsigned long _find_last_bit(const unsigned long *addr, unsigned long size);
29
30 #ifdef __BIG_ENDIAN
31 unsigned long _find_first_zero_bit_le(const unsigned long *addr, unsigned long size);
32 unsigned long _find_next_zero_bit_le(const  unsigned long *addr, unsigned
33                                         long size, unsigned long offset);
34 unsigned long _find_next_bit_le(const unsigned long *addr, unsigned
35                                 long size, unsigned long offset);
36 #endif
37
38 #ifndef find_next_bit
39 /**
40  * find_next_bit - find the next set bit in a memory region
41  * @addr: The address to base the search on
42  * @size: The bitmap size in bits
43  * @offset: The bitnumber to start searching at
44  *
45  * Returns the bit number for the next set bit
46  * If no bits are set, returns @size.
47  */
48 static inline
49 unsigned long find_next_bit(const unsigned long *addr, unsigned long size,
50                             unsigned long offset)
51 {
52         if (small_const_nbits(size)) {
53                 unsigned long val;
54
55                 if (unlikely(offset >= size))
56                         return size;
57
58                 val = *addr & GENMASK(size - 1, offset);
59                 return val ? __ffs(val) : size;
60         }
61
62         return _find_next_bit(addr, size, offset);
63 }
64 #endif
65
66 #ifndef find_next_and_bit
67 /**
68  * find_next_and_bit - find the next set bit in both memory regions
69  * @addr1: The first address to base the search on
70  * @addr2: The second address to base the search on
71  * @size: The bitmap size in bits
72  * @offset: The bitnumber to start searching at
73  *
74  * Returns the bit number for the next set bit
75  * If no bits are set, returns @size.
76  */
77 static inline
78 unsigned long find_next_and_bit(const unsigned long *addr1,
79                 const unsigned long *addr2, unsigned long size,
80                 unsigned long offset)
81 {
82         if (small_const_nbits(size)) {
83                 unsigned long val;
84
85                 if (unlikely(offset >= size))
86                         return size;
87
88                 val = *addr1 & *addr2 & GENMASK(size - 1, offset);
89                 return val ? __ffs(val) : size;
90         }
91
92         return _find_next_and_bit(addr1, addr2, size, offset);
93 }
94 #endif
95
96 #ifndef find_next_andnot_bit
97 /**
98  * find_next_andnot_bit - find the next set bit in *addr1 excluding all the bits
99  *                        in *addr2
100  * @addr1: The first address to base the search on
101  * @addr2: The second address to base the search on
102  * @size: The bitmap size in bits
103  * @offset: The bitnumber to start searching at
104  *
105  * Returns the bit number for the next set bit
106  * If no bits are set, returns @size.
107  */
108 static inline
109 unsigned long find_next_andnot_bit(const unsigned long *addr1,
110                 const unsigned long *addr2, unsigned long size,
111                 unsigned long offset)
112 {
113         if (small_const_nbits(size)) {
114                 unsigned long val;
115
116                 if (unlikely(offset >= size))
117                         return size;
118
119                 val = *addr1 & ~*addr2 & GENMASK(size - 1, offset);
120                 return val ? __ffs(val) : size;
121         }
122
123         return _find_next_andnot_bit(addr1, addr2, size, offset);
124 }
125 #endif
126
127 #ifndef find_next_zero_bit
128 /**
129  * find_next_zero_bit - find the next cleared bit in a memory region
130  * @addr: The address to base the search on
131  * @size: The bitmap size in bits
132  * @offset: The bitnumber to start searching at
133  *
134  * Returns the bit number of the next zero bit
135  * If no bits are zero, returns @size.
136  */
137 static inline
138 unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
139                                  unsigned long offset)
140 {
141         if (small_const_nbits(size)) {
142                 unsigned long val;
143
144                 if (unlikely(offset >= size))
145                         return size;
146
147                 val = *addr | ~GENMASK(size - 1, offset);
148                 return val == ~0UL ? size : ffz(val);
149         }
150
151         return _find_next_zero_bit(addr, size, offset);
152 }
153 #endif
154
155 #ifndef find_first_bit
156 /**
157  * find_first_bit - find the first set bit in a memory region
158  * @addr: The address to start the search at
159  * @size: The maximum number of bits to search
160  *
161  * Returns the bit number of the first set bit.
162  * If no bits are set, returns @size.
163  */
164 static inline
165 unsigned long find_first_bit(const unsigned long *addr, unsigned long size)
166 {
167         if (small_const_nbits(size)) {
168                 unsigned long val = *addr & GENMASK(size - 1, 0);
169
170                 return val ? __ffs(val) : size;
171         }
172
173         return _find_first_bit(addr, size);
174 }
175 #endif
176
177 /**
178  * find_nth_bit - find N'th set bit in a memory region
179  * @addr: The address to start the search at
180  * @size: The maximum number of bits to search
181  * @n: The number of set bit, which position is needed, counting from 0
182  *
183  * The following is semantically equivalent:
184  *       idx = find_nth_bit(addr, size, 0);
185  *       idx = find_first_bit(addr, size);
186  *
187  * Returns the bit number of the N'th set bit.
188  * If no such, returns @size.
189  */
190 static inline
191 unsigned long find_nth_bit(const unsigned long *addr, unsigned long size, unsigned long n)
192 {
193         if (n >= size)
194                 return size;
195
196         if (small_const_nbits(size)) {
197                 unsigned long val =  *addr & GENMASK(size - 1, 0);
198
199                 return val ? fns(val, n) : size;
200         }
201
202         return __find_nth_bit(addr, size, n);
203 }
204
205 /**
206  * find_nth_and_bit - find N'th set bit in 2 memory regions
207  * @addr1: The 1st address to start the search at
208  * @addr2: The 2nd address to start the search at
209  * @size: The maximum number of bits to search
210  * @n: The number of set bit, which position is needed, counting from 0
211  *
212  * Returns the bit number of the N'th set bit.
213  * If no such, returns @size.
214  */
215 static inline
216 unsigned long find_nth_and_bit(const unsigned long *addr1, const unsigned long *addr2,
217                                 unsigned long size, unsigned long n)
218 {
219         if (n >= size)
220                 return size;
221
222         if (small_const_nbits(size)) {
223                 unsigned long val =  *addr1 & *addr2 & GENMASK(size - 1, 0);
224
225                 return val ? fns(val, n) : size;
226         }
227
228         return __find_nth_and_bit(addr1, addr2, size, n);
229 }
230
231 /**
232  * find_nth_andnot_bit - find N'th set bit in 2 memory regions,
233  *                       flipping bits in 2nd region
234  * @addr1: The 1st address to start the search at
235  * @addr2: The 2nd address to start the search at
236  * @size: The maximum number of bits to search
237  * @n: The number of set bit, which position is needed, counting from 0
238  *
239  * Returns the bit number of the N'th set bit.
240  * If no such, returns @size.
241  */
242 static inline
243 unsigned long find_nth_andnot_bit(const unsigned long *addr1, const unsigned long *addr2,
244                                 unsigned long size, unsigned long n)
245 {
246         if (n >= size)
247                 return size;
248
249         if (small_const_nbits(size)) {
250                 unsigned long val =  *addr1 & (~*addr2) & GENMASK(size - 1, 0);
251
252                 return val ? fns(val, n) : size;
253         }
254
255         return __find_nth_andnot_bit(addr1, addr2, size, n);
256 }
257
258 #ifndef find_first_and_bit
259 /**
260  * find_first_and_bit - find the first set bit in both memory regions
261  * @addr1: The first address to base the search on
262  * @addr2: The second address to base the search on
263  * @size: The bitmap size in bits
264  *
265  * Returns the bit number for the next set bit
266  * If no bits are set, returns @size.
267  */
268 static inline
269 unsigned long find_first_and_bit(const unsigned long *addr1,
270                                  const unsigned long *addr2,
271                                  unsigned long size)
272 {
273         if (small_const_nbits(size)) {
274                 unsigned long val = *addr1 & *addr2 & GENMASK(size - 1, 0);
275
276                 return val ? __ffs(val) : size;
277         }
278
279         return _find_first_and_bit(addr1, addr2, size);
280 }
281 #endif
282
283 #ifndef find_first_zero_bit
284 /**
285  * find_first_zero_bit - find the first cleared bit in a memory region
286  * @addr: The address to start the search at
287  * @size: The maximum number of bits to search
288  *
289  * Returns the bit number of the first cleared bit.
290  * If no bits are zero, returns @size.
291  */
292 static inline
293 unsigned long find_first_zero_bit(const unsigned long *addr, unsigned long size)
294 {
295         if (small_const_nbits(size)) {
296                 unsigned long val = *addr | ~GENMASK(size - 1, 0);
297
298                 return val == ~0UL ? size : ffz(val);
299         }
300
301         return _find_first_zero_bit(addr, size);
302 }
303 #endif
304
305 #ifndef find_last_bit
306 /**
307  * find_last_bit - find the last set bit in a memory region
308  * @addr: The address to start the search at
309  * @size: The number of bits to search
310  *
311  * Returns the bit number of the last set bit, or size.
312  */
313 static inline
314 unsigned long find_last_bit(const unsigned long *addr, unsigned long size)
315 {
316         if (small_const_nbits(size)) {
317                 unsigned long val = *addr & GENMASK(size - 1, 0);
318
319                 return val ? __fls(val) : size;
320         }
321
322         return _find_last_bit(addr, size);
323 }
324 #endif
325
326 /**
327  * find_next_and_bit_wrap - find the next set bit in both memory regions
328  * @addr1: The first address to base the search on
329  * @addr2: The second address to base the search on
330  * @size: The bitmap size in bits
331  * @offset: The bitnumber to start searching at
332  *
333  * Returns the bit number for the next set bit, or first set bit up to @offset
334  * If no bits are set, returns @size.
335  */
336 static inline
337 unsigned long find_next_and_bit_wrap(const unsigned long *addr1,
338                                         const unsigned long *addr2,
339                                         unsigned long size, unsigned long offset)
340 {
341         unsigned long bit = find_next_and_bit(addr1, addr2, size, offset);
342
343         if (bit < size)
344                 return bit;
345
346         bit = find_first_and_bit(addr1, addr2, offset);
347         return bit < offset ? bit : size;
348 }
349
350 /**
351  * find_next_bit_wrap - find the next set bit in both memory regions
352  * @addr: The first address to base the search on
353  * @size: The bitmap size in bits
354  * @offset: The bitnumber to start searching at
355  *
356  * Returns the bit number for the next set bit, or first set bit up to @offset
357  * If no bits are set, returns @size.
358  */
359 static inline
360 unsigned long find_next_bit_wrap(const unsigned long *addr,
361                                         unsigned long size, unsigned long offset)
362 {
363         unsigned long bit = find_next_bit(addr, size, offset);
364
365         if (bit < size)
366                 return bit;
367
368         bit = find_first_bit(addr, offset);
369         return bit < offset ? bit : size;
370 }
371
372 /*
373  * Helper for for_each_set_bit_wrap(). Make sure you're doing right thing
374  * before using it alone.
375  */
376 static inline
377 unsigned long __for_each_wrap(const unsigned long *bitmap, unsigned long size,
378                                  unsigned long start, unsigned long n)
379 {
380         unsigned long bit;
381
382         /* If not wrapped around */
383         if (n > start) {
384                 /* and have a bit, just return it. */
385                 bit = find_next_bit(bitmap, size, n);
386                 if (bit < size)
387                         return bit;
388
389                 /* Otherwise, wrap around and ... */
390                 n = 0;
391         }
392
393         /* Search the other part. */
394         bit = find_next_bit(bitmap, start, n);
395         return bit < start ? bit : size;
396 }
397
398 /**
399  * find_next_clump8 - find next 8-bit clump with set bits in a memory region
400  * @clump: location to store copy of found clump
401  * @addr: address to base the search on
402  * @size: bitmap size in number of bits
403  * @offset: bit offset at which to start searching
404  *
405  * Returns the bit offset for the next set clump; the found clump value is
406  * copied to the location pointed by @clump. If no bits are set, returns @size.
407  */
408 extern unsigned long find_next_clump8(unsigned long *clump,
409                                       const unsigned long *addr,
410                                       unsigned long size, unsigned long offset);
411
412 #define find_first_clump8(clump, bits, size) \
413         find_next_clump8((clump), (bits), (size), 0)
414
415 #if defined(__LITTLE_ENDIAN)
416
417 static inline unsigned long find_next_zero_bit_le(const void *addr,
418                 unsigned long size, unsigned long offset)
419 {
420         return find_next_zero_bit(addr, size, offset);
421 }
422
423 static inline unsigned long find_next_bit_le(const void *addr,
424                 unsigned long size, unsigned long offset)
425 {
426         return find_next_bit(addr, size, offset);
427 }
428
429 static inline unsigned long find_first_zero_bit_le(const void *addr,
430                 unsigned long size)
431 {
432         return find_first_zero_bit(addr, size);
433 }
434
435 #elif defined(__BIG_ENDIAN)
436
437 #ifndef find_next_zero_bit_le
438 static inline
439 unsigned long find_next_zero_bit_le(const void *addr, unsigned
440                 long size, unsigned long offset)
441 {
442         if (small_const_nbits(size)) {
443                 unsigned long val = *(const unsigned long *)addr;
444
445                 if (unlikely(offset >= size))
446                         return size;
447
448                 val = swab(val) | ~GENMASK(size - 1, offset);
449                 return val == ~0UL ? size : ffz(val);
450         }
451
452         return _find_next_zero_bit_le(addr, size, offset);
453 }
454 #endif
455
456 #ifndef find_first_zero_bit_le
457 static inline
458 unsigned long find_first_zero_bit_le(const void *addr, unsigned long size)
459 {
460         if (small_const_nbits(size)) {
461                 unsigned long val = swab(*(const unsigned long *)addr) | ~GENMASK(size - 1, 0);
462
463                 return val == ~0UL ? size : ffz(val);
464         }
465
466         return _find_first_zero_bit_le(addr, size);
467 }
468 #endif
469
470 #ifndef find_next_bit_le
471 static inline
472 unsigned long find_next_bit_le(const void *addr, unsigned
473                 long size, unsigned long offset)
474 {
475         if (small_const_nbits(size)) {
476                 unsigned long val = *(const unsigned long *)addr;
477
478                 if (unlikely(offset >= size))
479                         return size;
480
481                 val = swab(val) & GENMASK(size - 1, offset);
482                 return val ? __ffs(val) : size;
483         }
484
485         return _find_next_bit_le(addr, size, offset);
486 }
487 #endif
488
489 #else
490 #error "Please fix <asm/byteorder.h>"
491 #endif
492
493 #define for_each_set_bit(bit, addr, size) \
494         for ((bit) = 0; (bit) = find_next_bit((addr), (size), (bit)), (bit) < (size); (bit)++)
495
496 #define for_each_and_bit(bit, addr1, addr2, size) \
497         for ((bit) = 0;                                                                 \
498              (bit) = find_next_and_bit((addr1), (addr2), (size), (bit)), (bit) < (size);\
499              (bit)++)
500
501 #define for_each_andnot_bit(bit, addr1, addr2, size) \
502         for ((bit) = 0;                                                                 \
503              (bit) = find_next_andnot_bit((addr1), (addr2), (size), (bit)), (bit) < (size);\
504              (bit)++)
505
506 /* same as for_each_set_bit() but use bit as value to start with */
507 #define for_each_set_bit_from(bit, addr, size) \
508         for (; (bit) = find_next_bit((addr), (size), (bit)), (bit) < (size); (bit)++)
509
510 #define for_each_clear_bit(bit, addr, size) \
511         for ((bit) = 0;                                                                 \
512              (bit) = find_next_zero_bit((addr), (size), (bit)), (bit) < (size);         \
513              (bit)++)
514
515 /* same as for_each_clear_bit() but use bit as value to start with */
516 #define for_each_clear_bit_from(bit, addr, size) \
517         for (; (bit) = find_next_zero_bit((addr), (size), (bit)), (bit) < (size); (bit)++)
518
519 /**
520  * for_each_set_bitrange - iterate over all set bit ranges [b; e)
521  * @b: bit offset of start of current bitrange (first set bit)
522  * @e: bit offset of end of current bitrange (first unset bit)
523  * @addr: bitmap address to base the search on
524  * @size: bitmap size in number of bits
525  */
526 #define for_each_set_bitrange(b, e, addr, size)                 \
527         for ((b) = 0;                                           \
528              (b) = find_next_bit((addr), (size), b),            \
529              (e) = find_next_zero_bit((addr), (size), (b) + 1), \
530              (b) < (size);                                      \
531              (b) = (e) + 1)
532
533 /**
534  * for_each_set_bitrange_from - iterate over all set bit ranges [b; e)
535  * @b: bit offset of start of current bitrange (first set bit); must be initialized
536  * @e: bit offset of end of current bitrange (first unset bit)
537  * @addr: bitmap address to base the search on
538  * @size: bitmap size in number of bits
539  */
540 #define for_each_set_bitrange_from(b, e, addr, size)            \
541         for (;                                                  \
542              (b) = find_next_bit((addr), (size), (b)),          \
543              (e) = find_next_zero_bit((addr), (size), (b) + 1), \
544              (b) < (size);                                      \
545              (b) = (e) + 1)
546
547 /**
548  * for_each_clear_bitrange - iterate over all unset bit ranges [b; e)
549  * @b: bit offset of start of current bitrange (first unset bit)
550  * @e: bit offset of end of current bitrange (first set bit)
551  * @addr: bitmap address to base the search on
552  * @size: bitmap size in number of bits
553  */
554 #define for_each_clear_bitrange(b, e, addr, size)               \
555         for ((b) = 0;                                           \
556              (b) = find_next_zero_bit((addr), (size), (b)),     \
557              (e) = find_next_bit((addr), (size), (b) + 1),      \
558              (b) < (size);                                      \
559              (b) = (e) + 1)
560
561 /**
562  * for_each_clear_bitrange_from - iterate over all unset bit ranges [b; e)
563  * @b: bit offset of start of current bitrange (first set bit); must be initialized
564  * @e: bit offset of end of current bitrange (first unset bit)
565  * @addr: bitmap address to base the search on
566  * @size: bitmap size in number of bits
567  */
568 #define for_each_clear_bitrange_from(b, e, addr, size)          \
569         for (;                                                  \
570              (b) = find_next_zero_bit((addr), (size), (b)),     \
571              (e) = find_next_bit((addr), (size), (b) + 1),      \
572              (b) < (size);                                      \
573              (b) = (e) + 1)
574
575 /**
576  * for_each_set_bit_wrap - iterate over all set bits starting from @start, and
577  * wrapping around the end of bitmap.
578  * @bit: offset for current iteration
579  * @addr: bitmap address to base the search on
580  * @size: bitmap size in number of bits
581  * @start: Starting bit for bitmap traversing, wrapping around the bitmap end
582  */
583 #define for_each_set_bit_wrap(bit, addr, size, start) \
584         for ((bit) = find_next_bit_wrap((addr), (size), (start));               \
585              (bit) < (size);                                                    \
586              (bit) = __for_each_wrap((addr), (size), (start), (bit) + 1))
587
588 /**
589  * for_each_set_clump8 - iterate over bitmap for each 8-bit clump with set bits
590  * @start: bit offset to start search and to store the current iteration offset
591  * @clump: location to store copy of current 8-bit clump
592  * @bits: bitmap address to base the search on
593  * @size: bitmap size in number of bits
594  */
595 #define for_each_set_clump8(start, clump, bits, size) \
596         for ((start) = find_first_clump8(&(clump), (bits), (size)); \
597              (start) < (size); \
598              (start) = find_next_clump8(&(clump), (bits), (size), (start) + 8))
599
600 #endif /*__LINUX_FIND_H_ */