]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/s390/include/asm/bitops.h
s390/bitops: remove CONFIG_SMP / simplify non-atomic bitops
[karo-tx-linux.git] / arch / s390 / include / asm / bitops.h
1 /*
2  *  S390 version
3  *    Copyright IBM Corp. 1999
4  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
5  *
6  *  Derived from "include/asm-i386/bitops.h"
7  *    Copyright (C) 1992, Linus Torvalds
8  *
9  */
10
11 #ifndef _S390_BITOPS_H
12 #define _S390_BITOPS_H
13
14 #ifndef _LINUX_BITOPS_H
15 #error only <linux/bitops.h> can be included directly
16 #endif
17
18 #include <linux/typecheck.h>
19 #include <linux/compiler.h>
20
21 /*
22  * 32 bit bitops format:
23  * bit 0 is the LSB of *addr; bit 31 is the MSB of *addr;
24  * bit 32 is the LSB of *(addr+4). That combined with the
25  * big endian byte order on S390 give the following bit
26  * order in memory:
27  *    1f 1e 1d 1c 1b 1a 19 18 17 16 15 14 13 12 11 10 \
28  *    0f 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00
29  * after that follows the next long with bit numbers
30  *    3f 3e 3d 3c 3b 3a 39 38 37 36 35 34 33 32 31 30
31  *    2f 2e 2d 2c 2b 2a 29 28 27 26 25 24 23 22 21 20
32  * The reason for this bit ordering is the fact that
33  * in the architecture independent code bits operations
34  * of the form "flags |= (1 << bitnr)" are used INTERMIXED
35  * with operation of the form "set_bit(bitnr, flags)".
36  *
37  * 64 bit bitops format:
38  * bit 0 is the LSB of *addr; bit 63 is the MSB of *addr;
39  * bit 64 is the LSB of *(addr+8). That combined with the
40  * big endian byte order on S390 give the following bit
41  * order in memory:
42  *    3f 3e 3d 3c 3b 3a 39 38 37 36 35 34 33 32 31 30
43  *    2f 2e 2d 2c 2b 2a 29 28 27 26 25 24 23 22 21 20
44  *    1f 1e 1d 1c 1b 1a 19 18 17 16 15 14 13 12 11 10
45  *    0f 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00
46  * after that follows the next long with bit numbers
47  *    7f 7e 7d 7c 7b 7a 79 78 77 76 75 74 73 72 71 70
48  *    6f 6e 6d 6c 6b 6a 69 68 67 66 65 64 63 62 61 60
49  *    5f 5e 5d 5c 5b 5a 59 58 57 56 55 54 53 52 51 50
50  *    4f 4e 4d 4c 4b 4a 49 48 47 46 45 44 43 42 41 40
51  * The reason for this bit ordering is the fact that
52  * in the architecture independent code bits operations
53  * of the form "flags |= (1 << bitnr)" are used INTERMIXED
54  * with operation of the form "set_bit(bitnr, flags)".
55  */
56
57 /* bitmap tables from arch/s390/kernel/bitmap.c */
58 extern const char _zb_findmap[];
59 extern const char _sb_findmap[];
60
61 #ifndef CONFIG_64BIT
62
63 #define __BITOPS_OR             "or"
64 #define __BITOPS_AND            "nr"
65 #define __BITOPS_XOR            "xr"
66
67 #define __BITOPS_LOOP(__addr, __val, __op_string)               \
68 ({                                                              \
69         unsigned long __old, __new;                             \
70                                                                 \
71         typecheck(unsigned long *, (__addr));                   \
72         asm volatile(                                           \
73                 "       l       %0,%2\n"                        \
74                 "0:     lr      %1,%0\n"                        \
75                 __op_string "   %1,%3\n"                        \
76                 "       cs      %0,%1,%2\n"                     \
77                 "       jl      0b"                             \
78                 : "=&d" (__old), "=&d" (__new), "+Q" (*(__addr))\
79                 : "d" (__val)                                   \
80                 : "cc");                                        \
81         __old;                                                  \
82 })
83
84 #else /* CONFIG_64BIT */
85
86 #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
87
88 #define __BITOPS_OR             "laog"
89 #define __BITOPS_AND            "lang"
90 #define __BITOPS_XOR            "laxg"
91
92 #define __BITOPS_LOOP(__addr, __val, __op_string)               \
93 ({                                                              \
94         unsigned long __old;                                    \
95                                                                 \
96         typecheck(unsigned long *, (__addr));                   \
97         asm volatile(                                           \
98                 __op_string "   %0,%2,%1\n"                     \
99                 : "=d" (__old), "+Q" (*(__addr))                \
100                 : "d" (__val)                                   \
101                 : "cc");                                        \
102         __old;                                                  \
103 })
104
105 #else /* CONFIG_HAVE_MARCH_Z196_FEATURES */
106
107 #define __BITOPS_OR             "ogr"
108 #define __BITOPS_AND            "ngr"
109 #define __BITOPS_XOR            "xgr"
110
111 #define __BITOPS_LOOP(__addr, __val, __op_string)               \
112 ({                                                              \
113         unsigned long __old, __new;                             \
114                                                                 \
115         typecheck(unsigned long *, (__addr));                   \
116         asm volatile(                                           \
117                 "       lg      %0,%2\n"                        \
118                 "0:     lgr     %1,%0\n"                        \
119                 __op_string "   %1,%3\n"                        \
120                 "       csg     %0,%1,%2\n"                     \
121                 "       jl      0b"                             \
122                 : "=&d" (__old), "=&d" (__new), "+Q" (*(__addr))\
123                 : "d" (__val)                                   \
124                 : "cc");                                        \
125         __old;                                                  \
126 })
127
128 #endif /* CONFIG_HAVE_MARCH_Z196_FEATURES */
129
130 #endif /* CONFIG_64BIT */
131
132 #define __BITOPS_WORDS(bits) (((bits) + BITS_PER_LONG - 1) / BITS_PER_LONG)
133
134 static inline unsigned long *
135 __bitops_word(unsigned long nr, volatile unsigned long *ptr)
136 {
137         unsigned long addr;
138
139         addr = (unsigned long)ptr + ((nr ^ (nr & (BITS_PER_LONG - 1))) >> 3);
140         return (unsigned long *)addr;
141 }
142
143 static inline unsigned char *
144 __bitops_byte(unsigned long nr, volatile unsigned long *ptr)
145 {
146         return ((unsigned char *)ptr) + ((nr ^ (BITS_PER_LONG - 8)) >> 3);
147 }
148
149 static inline void set_bit(unsigned long nr, volatile unsigned long *ptr)
150 {
151         unsigned long *addr = __bitops_word(nr, ptr);
152         unsigned long mask;
153
154         mask = 1UL << (nr & (BITS_PER_LONG - 1));
155         __BITOPS_LOOP(addr, mask, __BITOPS_OR);
156 }
157
158 static inline void clear_bit(unsigned long nr, volatile unsigned long *ptr)
159 {
160         unsigned long *addr = __bitops_word(nr, ptr);
161         unsigned long mask;
162
163         mask = ~(1UL << (nr & (BITS_PER_LONG - 1)));
164         __BITOPS_LOOP(addr, mask, __BITOPS_AND);
165 }
166
167 static inline void change_bit(unsigned long nr, volatile unsigned long *ptr)
168 {
169         unsigned long *addr = __bitops_word(nr, ptr);
170         unsigned long mask;
171
172         mask = 1UL << (nr & (BITS_PER_LONG - 1));
173         __BITOPS_LOOP(addr, mask, __BITOPS_XOR);
174 }
175
176 static inline int
177 test_and_set_bit(unsigned long nr, volatile unsigned long *ptr)
178 {
179         unsigned long *addr = __bitops_word(nr, ptr);
180         unsigned long old, mask;
181
182         mask = 1UL << (nr & (BITS_PER_LONG - 1));
183         old = __BITOPS_LOOP(addr, mask, __BITOPS_OR);
184         barrier();
185         return (old & mask) != 0;
186 }
187
188 static inline int
189 test_and_clear_bit(unsigned long nr, volatile unsigned long *ptr)
190 {
191         unsigned long *addr = __bitops_word(nr, ptr);
192         unsigned long old, mask;
193
194         mask = ~(1UL << (nr & (BITS_PER_LONG - 1)));
195         old = __BITOPS_LOOP(addr, mask, __BITOPS_AND);
196         barrier();
197         return (old & ~mask) != 0;
198 }
199
200 static inline int
201 test_and_change_bit(unsigned long nr, volatile unsigned long *ptr)
202 {
203         unsigned long *addr = __bitops_word(nr, ptr);
204         unsigned long old, mask;
205
206         mask = 1UL << (nr & (BITS_PER_LONG - 1));
207         old = __BITOPS_LOOP(addr, mask, __BITOPS_XOR);
208         barrier();
209         return (old & mask) != 0;
210 }
211
212 static inline void __set_bit(unsigned long nr, volatile unsigned long *ptr)
213 {
214         unsigned char *addr = __bitops_byte(nr, ptr);
215
216         *addr |= 1 << (nr & 7);
217 }
218
219 static inline void 
220 __clear_bit(unsigned long nr, volatile unsigned long *ptr)
221 {
222         unsigned char *addr = __bitops_byte(nr, ptr);
223
224         *addr &= ~(1 << (nr & 7));
225 }
226
227 static inline void __change_bit(unsigned long nr, volatile unsigned long *ptr)
228 {
229         unsigned char *addr = __bitops_byte(nr, ptr);
230
231         *addr ^= 1 << (nr & 7);
232 }
233
234 static inline int
235 __test_and_set_bit(unsigned long nr, volatile unsigned long *ptr)
236 {
237         unsigned char *addr = __bitops_byte(nr, ptr);
238         unsigned char ch;
239
240         ch = *addr;
241         *addr |= 1 << (nr & 7);
242         return (ch >> (nr & 7)) & 1;
243 }
244
245 static inline int
246 __test_and_clear_bit(unsigned long nr, volatile unsigned long *ptr)
247 {
248         unsigned char *addr = __bitops_byte(nr, ptr);
249         unsigned char ch;
250
251         ch = *addr;
252         *addr &= ~(1 << (nr & 7));
253         return (ch >> (nr & 7)) & 1;
254 }
255
256 static inline int
257 __test_and_change_bit(unsigned long nr, volatile unsigned long *ptr)
258 {
259         unsigned char *addr = __bitops_byte(nr, ptr);
260         unsigned char ch;
261
262         ch = *addr;
263         *addr ^= 1 << (nr & 7);
264         return (ch >> (nr & 7)) & 1;
265 }
266
267 static inline int test_bit(unsigned long nr, const volatile unsigned long *ptr)
268 {
269         const volatile unsigned char *addr;
270
271         addr = ((const volatile unsigned char *)ptr);
272         addr += (nr ^ (BITS_PER_LONG - 8)) >> 3;
273         return (*addr >> (nr & 7)) & 1;
274 }
275
276 /*
277  * Optimized find bit helper functions.
278  */
279
280 /**
281  * __ffz_word_loop - find byte offset of first long != -1UL
282  * @addr: pointer to array of unsigned long
283  * @size: size of the array in bits
284  */
285 static inline unsigned long __ffz_word_loop(const unsigned long *addr,
286                                             unsigned long size)
287 {
288         typedef struct { long _[__BITOPS_WORDS(size)]; } addrtype;
289         unsigned long bytes = 0;
290
291         asm volatile(
292 #ifndef CONFIG_64BIT
293                 "       ahi     %1,-1\n"
294                 "       sra     %1,5\n"
295                 "       jz      1f\n"
296                 "0:     c       %2,0(%0,%3)\n"
297                 "       jne     1f\n"
298                 "       la      %0,4(%0)\n"
299                 "       brct    %1,0b\n"
300                 "1:\n"
301 #else
302                 "       aghi    %1,-1\n"
303                 "       srag    %1,%1,6\n"
304                 "       jz      1f\n"
305                 "0:     cg      %2,0(%0,%3)\n"
306                 "       jne     1f\n"
307                 "       la      %0,8(%0)\n"
308                 "       brct    %1,0b\n"
309                 "1:\n"
310 #endif
311                 : "+&a" (bytes), "+&d" (size)
312                 : "d" (-1UL), "a" (addr), "m" (*(addrtype *) addr)
313                 : "cc" );
314         return bytes;
315 }
316
317 /**
318  * __ffs_word_loop - find byte offset of first long != 0UL
319  * @addr: pointer to array of unsigned long
320  * @size: size of the array in bits
321  */
322 static inline unsigned long __ffs_word_loop(const unsigned long *addr,
323                                             unsigned long size)
324 {
325         typedef struct { long _[__BITOPS_WORDS(size)]; } addrtype;
326         unsigned long bytes = 0;
327
328         asm volatile(
329 #ifndef CONFIG_64BIT
330                 "       ahi     %1,-1\n"
331                 "       sra     %1,5\n"
332                 "       jz      1f\n"
333                 "0:     c       %2,0(%0,%3)\n"
334                 "       jne     1f\n"
335                 "       la      %0,4(%0)\n"
336                 "       brct    %1,0b\n"
337                 "1:\n"
338 #else
339                 "       aghi    %1,-1\n"
340                 "       srag    %1,%1,6\n"
341                 "       jz      1f\n"
342                 "0:     cg      %2,0(%0,%3)\n"
343                 "       jne     1f\n"
344                 "       la      %0,8(%0)\n"
345                 "       brct    %1,0b\n"
346                 "1:\n"
347 #endif
348                 : "+&a" (bytes), "+&a" (size)
349                 : "d" (0UL), "a" (addr), "m" (*(addrtype *) addr)
350                 : "cc" );
351         return bytes;
352 }
353
354 /**
355  * __ffz_word - add number of the first unset bit
356  * @nr: base value the bit number is added to
357  * @word: the word that is searched for unset bits
358  */
359 static inline unsigned long __ffz_word(unsigned long nr, unsigned long word)
360 {
361 #ifdef CONFIG_64BIT
362         if ((word & 0xffffffff) == 0xffffffff) {
363                 word >>= 32;
364                 nr += 32;
365         }
366 #endif
367         if ((word & 0xffff) == 0xffff) {
368                 word >>= 16;
369                 nr += 16;
370         }
371         if ((word & 0xff) == 0xff) {
372                 word >>= 8;
373                 nr += 8;
374         }
375         return nr + _zb_findmap[(unsigned char) word];
376 }
377
378 /**
379  * __ffs_word - add number of the first set bit
380  * @nr: base value the bit number is added to
381  * @word: the word that is searched for set bits
382  */
383 static inline unsigned long __ffs_word(unsigned long nr, unsigned long word)
384 {
385 #ifdef CONFIG_64BIT
386         if ((word & 0xffffffff) == 0) {
387                 word >>= 32;
388                 nr += 32;
389         }
390 #endif
391         if ((word & 0xffff) == 0) {
392                 word >>= 16;
393                 nr += 16;
394         }
395         if ((word & 0xff) == 0) {
396                 word >>= 8;
397                 nr += 8;
398         }
399         return nr + _sb_findmap[(unsigned char) word];
400 }
401
402
403 /**
404  * __load_ulong_be - load big endian unsigned long
405  * @p: pointer to array of unsigned long
406  * @offset: byte offset of source value in the array
407  */
408 static inline unsigned long __load_ulong_be(const unsigned long *p,
409                                             unsigned long offset)
410 {
411         p = (unsigned long *)((unsigned long) p + offset);
412         return *p;
413 }
414
415 /**
416  * __load_ulong_le - load little endian unsigned long
417  * @p: pointer to array of unsigned long
418  * @offset: byte offset of source value in the array
419  */
420 static inline unsigned long __load_ulong_le(const unsigned long *p,
421                                             unsigned long offset)
422 {
423         unsigned long word;
424
425         p = (unsigned long *)((unsigned long) p + offset);
426 #ifndef CONFIG_64BIT
427         asm volatile(
428                 "       ic      %0,%O1(%R1)\n"
429                 "       icm     %0,2,%O1+1(%R1)\n"
430                 "       icm     %0,4,%O1+2(%R1)\n"
431                 "       icm     %0,8,%O1+3(%R1)"
432                 : "=&d" (word) : "Q" (*p) : "cc");
433 #else
434         asm volatile(
435                 "       lrvg    %0,%1"
436                 : "=d" (word) : "m" (*p) );
437 #endif
438         return word;
439 }
440
441 /*
442  * The various find bit functions.
443  */
444
445 /*
446  * ffz - find first zero in word.
447  * @word: The word to search
448  *
449  * Undefined if no zero exists, so code should check against ~0UL first.
450  */
451 static inline unsigned long ffz(unsigned long word)
452 {
453         return __ffz_word(0, word);
454 }
455
456 /**
457  * __ffs - find first bit in word.
458  * @word: The word to search
459  *
460  * Undefined if no bit exists, so code should check against 0 first.
461  */
462 static inline unsigned long __ffs (unsigned long word)
463 {
464         return __ffs_word(0, word);
465 }
466
467 /**
468  * ffs - find first bit set
469  * @x: the word to search
470  *
471  * This is defined the same way as
472  * the libc and compiler builtin ffs routines, therefore
473  * differs in spirit from the above ffz (man ffs).
474  */
475 static inline int ffs(int x)
476 {
477         if (!x)
478                 return 0;
479         return __ffs_word(1, x);
480 }
481
482 /**
483  * find_first_zero_bit - find the first zero bit in a memory region
484  * @addr: The address to start the search at
485  * @size: The maximum size to search
486  *
487  * Returns the bit-number of the first zero bit, not the number of the byte
488  * containing a bit.
489  */
490 static inline unsigned long find_first_zero_bit(const unsigned long *addr,
491                                                 unsigned long size)
492 {
493         unsigned long bytes, bits;
494
495         if (!size)
496                 return 0;
497         bytes = __ffz_word_loop(addr, size);
498         bits = __ffz_word(bytes*8, __load_ulong_be(addr, bytes));
499         return (bits < size) ? bits : size;
500 }
501 #define find_first_zero_bit find_first_zero_bit
502
503 /**
504  * find_first_bit - find the first set bit in a memory region
505  * @addr: The address to start the search at
506  * @size: The maximum size to search
507  *
508  * Returns the bit-number of the first set bit, not the number of the byte
509  * containing a bit.
510  */
511 static inline unsigned long find_first_bit(const unsigned long * addr,
512                                            unsigned long size)
513 {
514         unsigned long bytes, bits;
515
516         if (!size)
517                 return 0;
518         bytes = __ffs_word_loop(addr, size);
519         bits = __ffs_word(bytes*8, __load_ulong_be(addr, bytes));
520         return (bits < size) ? bits : size;
521 }
522 #define find_first_bit find_first_bit
523
524 /*
525  * Big endian variant whichs starts bit counting from left using
526  * the flogr (find leftmost one) instruction.
527  */
528 static inline unsigned long __flo_word(unsigned long nr, unsigned long val)
529 {
530         register unsigned long bit asm("2") = val;
531         register unsigned long out asm("3");
532
533         asm volatile (
534                 "       .insn   rre,0xb9830000,%[bit],%[bit]\n"
535                 : [bit] "+d" (bit), [out] "=d" (out) : : "cc");
536         return nr + bit;
537 }
538
539 /*
540  * 64 bit special left bitops format:
541  * order in memory:
542  *    00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
543  *    10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
544  *    20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
545  *    30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
546  * after that follows the next long with bit numbers
547  *    40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
548  *    50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
549  *    60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
550  *    70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
551  * The reason for this bit ordering is the fact that
552  * the hardware sets bits in a bitmap starting at bit 0
553  * and we don't want to scan the bitmap from the 'wrong
554  * end'.
555  */
556 static inline unsigned long find_first_bit_left(const unsigned long *addr,
557                                                 unsigned long size)
558 {
559         unsigned long bytes, bits;
560
561         if (!size)
562                 return 0;
563         bytes = __ffs_word_loop(addr, size);
564         bits = __flo_word(bytes * 8, __load_ulong_be(addr, bytes));
565         return (bits < size) ? bits : size;
566 }
567
568 static inline int find_next_bit_left(const unsigned long *addr,
569                                      unsigned long size,
570                                      unsigned long offset)
571 {
572         const unsigned long *p;
573         unsigned long bit, set;
574
575         if (offset >= size)
576                 return size;
577         bit = offset & (BITS_PER_LONG - 1);
578         offset -= bit;
579         size -= offset;
580         p = addr + offset / BITS_PER_LONG;
581         if (bit) {
582                 set = __flo_word(0, *p & (~0UL >> bit));
583                 if (set >= size)
584                         return size + offset;
585                 if (set < BITS_PER_LONG)
586                         return set + offset;
587                 offset += BITS_PER_LONG;
588                 size -= BITS_PER_LONG;
589                 p++;
590         }
591         return offset + find_first_bit_left(p, size);
592 }
593
594 #define for_each_set_bit_left(bit, addr, size)                          \
595         for ((bit) = find_first_bit_left((addr), (size));               \
596              (bit) < (size);                                            \
597              (bit) = find_next_bit_left((addr), (size), (bit) + 1))
598
599 /* same as for_each_set_bit() but use bit as value to start with */
600 #define for_each_set_bit_left_cont(bit, addr, size)                     \
601         for ((bit) = find_next_bit_left((addr), (size), (bit));         \
602              (bit) < (size);                                            \
603              (bit) = find_next_bit_left((addr), (size), (bit) + 1))
604
605 /**
606  * find_next_zero_bit - find the first zero bit in a memory region
607  * @addr: The address to base the search on
608  * @offset: The bitnumber to start searching at
609  * @size: The maximum size to search
610  */
611 static inline int find_next_zero_bit (const unsigned long * addr,
612                                       unsigned long size,
613                                       unsigned long offset)
614 {
615         const unsigned long *p;
616         unsigned long bit, set;
617
618         if (offset >= size)
619                 return size;
620         bit = offset & (BITS_PER_LONG - 1);
621         offset -= bit;
622         size -= offset;
623         p = addr + offset / BITS_PER_LONG;
624         if (bit) {
625                 /*
626                  * __ffz_word returns BITS_PER_LONG
627                  * if no zero bit is present in the word.
628                  */
629                 set = __ffz_word(bit, *p >> bit);
630                 if (set >= size)
631                         return size + offset;
632                 if (set < BITS_PER_LONG)
633                         return set + offset;
634                 offset += BITS_PER_LONG;
635                 size -= BITS_PER_LONG;
636                 p++;
637         }
638         return offset + find_first_zero_bit(p, size);
639 }
640 #define find_next_zero_bit find_next_zero_bit
641
642 /**
643  * find_next_bit - find the first set bit in a memory region
644  * @addr: The address to base the search on
645  * @offset: The bitnumber to start searching at
646  * @size: The maximum size to search
647  */
648 static inline int find_next_bit (const unsigned long * addr,
649                                  unsigned long size,
650                                  unsigned long offset)
651 {
652         const unsigned long *p;
653         unsigned long bit, set;
654
655         if (offset >= size)
656                 return size;
657         bit = offset & (BITS_PER_LONG - 1);
658         offset -= bit;
659         size -= offset;
660         p = addr + offset / BITS_PER_LONG;
661         if (bit) {
662                 /*
663                  * __ffs_word returns BITS_PER_LONG
664                  * if no one bit is present in the word.
665                  */
666                 set = __ffs_word(0, *p & (~0UL << bit));
667                 if (set >= size)
668                         return size + offset;
669                 if (set < BITS_PER_LONG)
670                         return set + offset;
671                 offset += BITS_PER_LONG;
672                 size -= BITS_PER_LONG;
673                 p++;
674         }
675         return offset + find_first_bit(p, size);
676 }
677 #define find_next_bit find_next_bit
678
679 /*
680  * Every architecture must define this function. It's the fastest
681  * way of searching a 140-bit bitmap where the first 100 bits are
682  * unlikely to be set. It's guaranteed that at least one of the 140
683  * bits is cleared.
684  */
685 static inline int sched_find_first_bit(unsigned long *b)
686 {
687         return find_first_bit(b, 140);
688 }
689
690 #include <asm-generic/bitops/fls.h>
691 #include <asm-generic/bitops/__fls.h>
692 #include <asm-generic/bitops/fls64.h>
693
694 #include <asm-generic/bitops/hweight.h>
695 #include <asm-generic/bitops/lock.h>
696
697 /*
698  * ATTENTION: intel byte ordering convention for ext2 and minix !!
699  * bit 0 is the LSB of addr; bit 31 is the MSB of addr;
700  * bit 32 is the LSB of (addr+4).
701  * That combined with the little endian byte order of Intel gives the
702  * following bit order in memory:
703  *    07 06 05 04 03 02 01 00 15 14 13 12 11 10 09 08 \
704  *    23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24
705  */
706
707 static inline int find_first_zero_bit_le(void *vaddr, unsigned int size)
708 {
709         unsigned long bytes, bits;
710
711         if (!size)
712                 return 0;
713         bytes = __ffz_word_loop(vaddr, size);
714         bits = __ffz_word(bytes*8, __load_ulong_le(vaddr, bytes));
715         return (bits < size) ? bits : size;
716 }
717 #define find_first_zero_bit_le find_first_zero_bit_le
718
719 static inline int find_next_zero_bit_le(void *vaddr, unsigned long size,
720                                           unsigned long offset)
721 {
722         unsigned long *addr = vaddr, *p;
723         unsigned long bit, set;
724
725         if (offset >= size)
726                 return size;
727         bit = offset & (BITS_PER_LONG - 1);
728         offset -= bit;
729         size -= offset;
730         p = addr + offset / BITS_PER_LONG;
731         if (bit) {
732                 /*
733                  * s390 version of ffz returns BITS_PER_LONG
734                  * if no zero bit is present in the word.
735                  */
736                 set = __ffz_word(bit, __load_ulong_le(p, 0) >> bit);
737                 if (set >= size)
738                         return size + offset;
739                 if (set < BITS_PER_LONG)
740                         return set + offset;
741                 offset += BITS_PER_LONG;
742                 size -= BITS_PER_LONG;
743                 p++;
744         }
745         return offset + find_first_zero_bit_le(p, size);
746 }
747 #define find_next_zero_bit_le find_next_zero_bit_le
748
749 static inline unsigned long find_first_bit_le(void *vaddr, unsigned long size)
750 {
751         unsigned long bytes, bits;
752
753         if (!size)
754                 return 0;
755         bytes = __ffs_word_loop(vaddr, size);
756         bits = __ffs_word(bytes*8, __load_ulong_le(vaddr, bytes));
757         return (bits < size) ? bits : size;
758 }
759 #define find_first_bit_le find_first_bit_le
760
761 static inline int find_next_bit_le(void *vaddr, unsigned long size,
762                                      unsigned long offset)
763 {
764         unsigned long *addr = vaddr, *p;
765         unsigned long bit, set;
766
767         if (offset >= size)
768                 return size;
769         bit = offset & (BITS_PER_LONG - 1);
770         offset -= bit;
771         size -= offset;
772         p = addr + offset / BITS_PER_LONG;
773         if (bit) {
774                 /*
775                  * s390 version of ffz returns BITS_PER_LONG
776                  * if no zero bit is present in the word.
777                  */
778                 set = __ffs_word(0, __load_ulong_le(p, 0) & (~0UL << bit));
779                 if (set >= size)
780                         return size + offset;
781                 if (set < BITS_PER_LONG)
782                         return set + offset;
783                 offset += BITS_PER_LONG;
784                 size -= BITS_PER_LONG;
785                 p++;
786         }
787         return offset + find_first_bit_le(p, size);
788 }
789 #define find_next_bit_le find_next_bit_le
790
791 #include <asm-generic/bitops/le.h>
792
793 #include <asm-generic/bitops/ext2-atomic-setbit.h>
794
795 #endif /* _S390_BITOPS_H */