find.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _TOOLS_LINUX_FIND_H_
  3. #define _TOOLS_LINUX_FIND_H_
  4. #ifndef _TOOLS_LINUX_BITMAP_H
  5. #error tools: only <linux/bitmap.h> can be included directly
  6. #endif
  7. #include <linux/bitops.h>
  8. unsigned long _find_next_bit(const unsigned long *addr1, unsigned long nbits,
  9. unsigned long start);
  10. unsigned long _find_next_and_bit(const unsigned long *addr1, const unsigned long *addr2,
  11. unsigned long nbits, unsigned long start);
  12. unsigned long _find_next_zero_bit(const unsigned long *addr, unsigned long nbits,
  13. unsigned long start);
  14. extern unsigned long _find_first_bit(const unsigned long *addr, unsigned long size);
  15. extern unsigned long _find_first_and_bit(const unsigned long *addr1,
  16. const unsigned long *addr2, unsigned long size);
  17. extern unsigned long _find_first_zero_bit(const unsigned long *addr, unsigned long size);
  18. #ifndef find_next_bit
  19. /**
  20. * find_next_bit - find the next set bit in a memory region
  21. * @addr: The address to base the search on
  22. * @size: The bitmap size in bits
  23. * @offset: The bitnumber to start searching at
  24. *
  25. * Returns the bit number for the next set bit
  26. * If no bits are set, returns @size.
  27. */
  28. static inline
  29. unsigned long find_next_bit(const unsigned long *addr, unsigned long size,
  30. unsigned long offset)
  31. {
  32. if (small_const_nbits(size)) {
  33. unsigned long val;
  34. if (unlikely(offset >= size))
  35. return size;
  36. val = *addr & GENMASK(size - 1, offset);
  37. return val ? __ffs(val) : size;
  38. }
  39. return _find_next_bit(addr, size, offset);
  40. }
  41. #endif
  42. #ifndef find_next_and_bit
  43. /**
  44. * find_next_and_bit - find the next set bit in both memory regions
  45. * @addr1: The first address to base the search on
  46. * @addr2: The second address to base the search on
  47. * @size: The bitmap size in bits
  48. * @offset: The bitnumber to start searching at
  49. *
  50. * Returns the bit number for the next set bit
  51. * If no bits are set, returns @size.
  52. */
  53. static inline
  54. unsigned long find_next_and_bit(const unsigned long *addr1,
  55. const unsigned long *addr2, unsigned long size,
  56. unsigned long offset)
  57. {
  58. if (small_const_nbits(size)) {
  59. unsigned long val;
  60. if (unlikely(offset >= size))
  61. return size;
  62. val = *addr1 & *addr2 & GENMASK(size - 1, offset);
  63. return val ? __ffs(val) : size;
  64. }
  65. return _find_next_and_bit(addr1, addr2, size, offset);
  66. }
  67. #endif
  68. #ifndef find_next_zero_bit
  69. /**
  70. * find_next_zero_bit - find the next cleared bit in a memory region
  71. * @addr: The address to base the search on
  72. * @size: The bitmap size in bits
  73. * @offset: The bitnumber to start searching at
  74. *
  75. * Returns the bit number of the next zero bit
  76. * If no bits are zero, returns @size.
  77. */
  78. static inline
  79. unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
  80. unsigned long offset)
  81. {
  82. if (small_const_nbits(size)) {
  83. unsigned long val;
  84. if (unlikely(offset >= size))
  85. return size;
  86. val = *addr | ~GENMASK(size - 1, offset);
  87. return val == ~0UL ? size : ffz(val);
  88. }
  89. return _find_next_zero_bit(addr, size, offset);
  90. }
  91. #endif
  92. #ifndef find_first_bit
  93. /**
  94. * find_first_bit - find the first set bit in a memory region
  95. * @addr: The address to start the search at
  96. * @size: The maximum number of bits to search
  97. *
  98. * Returns the bit number of the first set bit.
  99. * If no bits are set, returns @size.
  100. */
  101. static inline
  102. unsigned long find_first_bit(const unsigned long *addr, unsigned long size)
  103. {
  104. if (small_const_nbits(size)) {
  105. unsigned long val = *addr & GENMASK(size - 1, 0);
  106. return val ? __ffs(val) : size;
  107. }
  108. return _find_first_bit(addr, size);
  109. }
  110. #endif
  111. #ifndef find_first_and_bit
  112. /**
  113. * find_first_and_bit - find the first set bit in both memory regions
  114. * @addr1: The first address to base the search on
  115. * @addr2: The second address to base the search on
  116. * @size: The bitmap size in bits
  117. *
  118. * Returns the bit number for the next set bit
  119. * If no bits are set, returns @size.
  120. */
  121. static inline
  122. unsigned long find_first_and_bit(const unsigned long *addr1,
  123. const unsigned long *addr2,
  124. unsigned long size)
  125. {
  126. if (small_const_nbits(size)) {
  127. unsigned long val = *addr1 & *addr2 & GENMASK(size - 1, 0);
  128. return val ? __ffs(val) : size;
  129. }
  130. return _find_first_and_bit(addr1, addr2, size);
  131. }
  132. #endif
  133. #ifndef find_first_zero_bit
  134. /**
  135. * find_first_zero_bit - find the first cleared bit in a memory region
  136. * @addr: The address to start the search at
  137. * @size: The maximum number of bits to search
  138. *
  139. * Returns the bit number of the first cleared bit.
  140. * If no bits are zero, returns @size.
  141. */
  142. static inline
  143. unsigned long find_first_zero_bit(const unsigned long *addr, unsigned long size)
  144. {
  145. if (small_const_nbits(size)) {
  146. unsigned long val = *addr | ~GENMASK(size - 1, 0);
  147. return val == ~0UL ? size : ffz(val);
  148. }
  149. return _find_first_zero_bit(addr, size);
  150. }
  151. #endif
  152. #endif /*__LINUX_FIND_H_ */