0001
0002 #ifndef __LINUX_FIND_H_
0003 #define __LINUX_FIND_H_
0004
0005 #ifndef __LINUX_BITMAP_H
0006 #error only <linux/bitmap.h> can be included directly
0007 #endif
0008
0009 #include <linux/bitops.h>
0010
0011 extern unsigned long _find_next_bit(const unsigned long *addr1,
0012 const unsigned long *addr2, unsigned long nbits,
0013 unsigned long start, unsigned long invert, unsigned long le);
0014 extern unsigned long _find_first_bit(const unsigned long *addr, unsigned long size);
0015 extern unsigned long _find_first_and_bit(const unsigned long *addr1,
0016 const unsigned long *addr2, unsigned long size);
0017 extern unsigned long _find_first_zero_bit(const unsigned long *addr, unsigned long size);
0018 extern unsigned long _find_last_bit(const unsigned long *addr, unsigned long size);
0019
0020 #ifndef find_next_bit
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 static inline
0031 unsigned long find_next_bit(const unsigned long *addr, unsigned long size,
0032 unsigned long offset)
0033 {
0034 if (small_const_nbits(size)) {
0035 unsigned long val;
0036
0037 if (unlikely(offset >= size))
0038 return size;
0039
0040 val = *addr & GENMASK(size - 1, offset);
0041 return val ? __ffs(val) : size;
0042 }
0043
0044 return _find_next_bit(addr, NULL, size, offset, 0UL, 0);
0045 }
0046 #endif
0047
0048 #ifndef find_next_and_bit
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 static inline
0060 unsigned long find_next_and_bit(const unsigned long *addr1,
0061 const unsigned long *addr2, unsigned long size,
0062 unsigned long offset)
0063 {
0064 if (small_const_nbits(size)) {
0065 unsigned long val;
0066
0067 if (unlikely(offset >= size))
0068 return size;
0069
0070 val = *addr1 & *addr2 & GENMASK(size - 1, offset);
0071 return val ? __ffs(val) : size;
0072 }
0073
0074 return _find_next_bit(addr1, addr2, size, offset, 0UL, 0);
0075 }
0076 #endif
0077
0078 #ifndef find_next_zero_bit
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088 static inline
0089 unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
0090 unsigned long offset)
0091 {
0092 if (small_const_nbits(size)) {
0093 unsigned long val;
0094
0095 if (unlikely(offset >= size))
0096 return size;
0097
0098 val = *addr | ~GENMASK(size - 1, offset);
0099 return val == ~0UL ? size : ffz(val);
0100 }
0101
0102 return _find_next_bit(addr, NULL, size, offset, ~0UL, 0);
0103 }
0104 #endif
0105
0106 #ifndef find_first_bit
0107
0108
0109
0110
0111
0112
0113
0114
0115 static inline
0116 unsigned long find_first_bit(const unsigned long *addr, unsigned long size)
0117 {
0118 if (small_const_nbits(size)) {
0119 unsigned long val = *addr & GENMASK(size - 1, 0);
0120
0121 return val ? __ffs(val) : size;
0122 }
0123
0124 return _find_first_bit(addr, size);
0125 }
0126 #endif
0127
0128 #ifndef find_first_and_bit
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138 static inline
0139 unsigned long find_first_and_bit(const unsigned long *addr1,
0140 const unsigned long *addr2,
0141 unsigned long size)
0142 {
0143 if (small_const_nbits(size)) {
0144 unsigned long val = *addr1 & *addr2 & GENMASK(size - 1, 0);
0145
0146 return val ? __ffs(val) : size;
0147 }
0148
0149 return _find_first_and_bit(addr1, addr2, size);
0150 }
0151 #endif
0152
0153 #ifndef find_first_zero_bit
0154
0155
0156
0157
0158
0159
0160
0161
0162 static inline
0163 unsigned long find_first_zero_bit(const unsigned long *addr, unsigned long size)
0164 {
0165 if (small_const_nbits(size)) {
0166 unsigned long val = *addr | ~GENMASK(size - 1, 0);
0167
0168 return val == ~0UL ? size : ffz(val);
0169 }
0170
0171 return _find_first_zero_bit(addr, size);
0172 }
0173 #endif
0174
0175 #ifndef find_last_bit
0176
0177
0178
0179
0180
0181
0182
0183 static inline
0184 unsigned long find_last_bit(const unsigned long *addr, unsigned long size)
0185 {
0186 if (small_const_nbits(size)) {
0187 unsigned long val = *addr & GENMASK(size - 1, 0);
0188
0189 return val ? __fls(val) : size;
0190 }
0191
0192 return _find_last_bit(addr, size);
0193 }
0194 #endif
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206 extern unsigned long find_next_clump8(unsigned long *clump,
0207 const unsigned long *addr,
0208 unsigned long size, unsigned long offset);
0209
0210 #define find_first_clump8(clump, bits, size) \
0211 find_next_clump8((clump), (bits), (size), 0)
0212
0213 #if defined(__LITTLE_ENDIAN)
0214
0215 static inline unsigned long find_next_zero_bit_le(const void *addr,
0216 unsigned long size, unsigned long offset)
0217 {
0218 return find_next_zero_bit(addr, size, offset);
0219 }
0220
0221 static inline unsigned long find_next_bit_le(const void *addr,
0222 unsigned long size, unsigned long offset)
0223 {
0224 return find_next_bit(addr, size, offset);
0225 }
0226
0227 static inline unsigned long find_first_zero_bit_le(const void *addr,
0228 unsigned long size)
0229 {
0230 return find_first_zero_bit(addr, size);
0231 }
0232
0233 #elif defined(__BIG_ENDIAN)
0234
0235 #ifndef find_next_zero_bit_le
0236 static inline
0237 unsigned long find_next_zero_bit_le(const void *addr, unsigned
0238 long size, unsigned long offset)
0239 {
0240 if (small_const_nbits(size)) {
0241 unsigned long val = *(const unsigned long *)addr;
0242
0243 if (unlikely(offset >= size))
0244 return size;
0245
0246 val = swab(val) | ~GENMASK(size - 1, offset);
0247 return val == ~0UL ? size : ffz(val);
0248 }
0249
0250 return _find_next_bit(addr, NULL, size, offset, ~0UL, 1);
0251 }
0252 #endif
0253
0254 #ifndef find_next_bit_le
0255 static inline
0256 unsigned long find_next_bit_le(const void *addr, unsigned
0257 long size, unsigned long offset)
0258 {
0259 if (small_const_nbits(size)) {
0260 unsigned long val = *(const unsigned long *)addr;
0261
0262 if (unlikely(offset >= size))
0263 return size;
0264
0265 val = swab(val) & GENMASK(size - 1, offset);
0266 return val ? __ffs(val) : size;
0267 }
0268
0269 return _find_next_bit(addr, NULL, size, offset, 0UL, 1);
0270 }
0271 #endif
0272
0273 #ifndef find_first_zero_bit_le
0274 #define find_first_zero_bit_le(addr, size) \
0275 find_next_zero_bit_le((addr), (size), 0)
0276 #endif
0277
0278 #else
0279 #error "Please fix <asm/byteorder.h>"
0280 #endif
0281
0282 #define for_each_set_bit(bit, addr, size) \
0283 for ((bit) = find_next_bit((addr), (size), 0); \
0284 (bit) < (size); \
0285 (bit) = find_next_bit((addr), (size), (bit) + 1))
0286
0287
0288 #define for_each_set_bit_from(bit, addr, size) \
0289 for ((bit) = find_next_bit((addr), (size), (bit)); \
0290 (bit) < (size); \
0291 (bit) = find_next_bit((addr), (size), (bit) + 1))
0292
0293 #define for_each_clear_bit(bit, addr, size) \
0294 for ((bit) = find_next_zero_bit((addr), (size), 0); \
0295 (bit) < (size); \
0296 (bit) = find_next_zero_bit((addr), (size), (bit) + 1))
0297
0298
0299 #define for_each_clear_bit_from(bit, addr, size) \
0300 for ((bit) = find_next_zero_bit((addr), (size), (bit)); \
0301 (bit) < (size); \
0302 (bit) = find_next_zero_bit((addr), (size), (bit) + 1))
0303
0304
0305
0306
0307
0308
0309
0310
0311 #define for_each_set_bitrange(b, e, addr, size) \
0312 for ((b) = find_next_bit((addr), (size), 0), \
0313 (e) = find_next_zero_bit((addr), (size), (b) + 1); \
0314 (b) < (size); \
0315 (b) = find_next_bit((addr), (size), (e) + 1), \
0316 (e) = find_next_zero_bit((addr), (size), (b) + 1))
0317
0318
0319
0320
0321
0322
0323
0324
0325 #define for_each_set_bitrange_from(b, e, addr, size) \
0326 for ((b) = find_next_bit((addr), (size), (b)), \
0327 (e) = find_next_zero_bit((addr), (size), (b) + 1); \
0328 (b) < (size); \
0329 (b) = find_next_bit((addr), (size), (e) + 1), \
0330 (e) = find_next_zero_bit((addr), (size), (b) + 1))
0331
0332
0333
0334
0335
0336
0337
0338
0339 #define for_each_clear_bitrange(b, e, addr, size) \
0340 for ((b) = find_next_zero_bit((addr), (size), 0), \
0341 (e) = find_next_bit((addr), (size), (b) + 1); \
0342 (b) < (size); \
0343 (b) = find_next_zero_bit((addr), (size), (e) + 1), \
0344 (e) = find_next_bit((addr), (size), (b) + 1))
0345
0346
0347
0348
0349
0350
0351
0352
0353 #define for_each_clear_bitrange_from(b, e, addr, size) \
0354 for ((b) = find_next_zero_bit((addr), (size), (b)), \
0355 (e) = find_next_bit((addr), (size), (b) + 1); \
0356 (b) < (size); \
0357 (b) = find_next_zero_bit((addr), (size), (e) + 1), \
0358 (e) = find_next_bit((addr), (size), (b) + 1))
0359
0360
0361
0362
0363
0364
0365
0366
0367 #define for_each_set_clump8(start, clump, bits, size) \
0368 for ((start) = find_first_clump8(&(clump), (bits), (size)); \
0369 (start) < (size); \
0370 (start) = find_next_clump8(&(clump), (bits), (size), (start) + 8))
0371
0372 #endif