~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/arch/mips/include/asm/bitops.h

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * This file is subject to the terms and conditions of the GNU General Public
 
3
 * License.  See the file "COPYING" in the main directory of this archive
 
4
 * for more details.
 
5
 *
 
6
 * Copyright (c) 1994 - 1997, 1999, 2000  Ralf Baechle (ralf@gnu.org)
 
7
 * Copyright (c) 2000  Silicon Graphics, Inc.
 
8
 */
 
9
#ifndef _ASM_BITOPS_H
 
10
#define _ASM_BITOPS_H
 
11
 
 
12
#include <linux/types.h>
 
13
#include <asm/byteorder.h>              /* sigh ... */
 
14
 
 
15
#ifdef __KERNEL__
 
16
 
 
17
#include <asm/sgidefs.h>
 
18
#include <asm/system.h>
 
19
 
 
20
/*
 
21
 * clear_bit() doesn't provide any barrier for the compiler.
 
22
 */
 
23
#define smp_mb__before_clear_bit()      barrier()
 
24
#define smp_mb__after_clear_bit()       barrier()
 
25
 
 
26
/*
 
27
 * Only disable interrupt for kernel mode stuff to keep usermode stuff
 
28
 * that dares to use kernel include files alive.
 
29
 */
 
30
#define __bi_flags unsigned long flags
 
31
#define __bi_cli() __cli()
 
32
#define __bi_save_flags(x) __save_flags(x)
 
33
#define __bi_save_and_cli(x) __save_and_cli(x)
 
34
#define __bi_restore_flags(x) __restore_flags(x)
 
35
#else
 
36
#define __bi_flags
 
37
#define __bi_cli()
 
38
#define __bi_save_flags(x)
 
39
#define __bi_save_and_cli(x)
 
40
#define __bi_restore_flags(x)
 
41
#endif /* __KERNEL__ */
 
42
 
 
43
#ifdef CONFIG_CPU_HAS_LLSC
 
44
 
 
45
#include <asm/mipsregs.h>
 
46
 
 
47
/*
 
48
 * These functions for MIPS ISA > 1 are interrupt and SMP proof and
 
49
 * interrupt friendly
 
50
 */
 
51
 
 
52
/*
 
53
 * set_bit - Atomically set a bit in memory
 
54
 * @nr: the bit to set
 
55
 * @addr: the address to start counting from
 
56
 *
 
57
 * This function is atomic and may not be reordered.  See __set_bit()
 
58
 * if you do not require the atomic guarantees.
 
59
 * Note that @nr may be almost arbitrarily large; this function is not
 
60
 * restricted to acting on a single-word quantity.
 
61
 */
 
62
static __inline__ void
 
63
set_bit(int nr, volatile void *addr)
 
64
{
 
65
        unsigned long *m = ((unsigned long *) addr) + (nr >> 5);
 
66
        unsigned long temp;
 
67
 
 
68
        __asm__ __volatile__(
 
69
                "1:\tll\t%0, %1\t\t# set_bit\n\t"
 
70
                "or\t%0, %2\n\t"
 
71
                "sc\t%0, %1\n\t"
 
72
                "beqz\t%0, 1b"
 
73
                : "=&r" (temp), "=m" (*m)
 
74
                : "ir" (1UL << (nr & 0x1f)), "m" (*m));
 
75
}
 
76
 
 
77
/*
 
78
 * __set_bit - Set a bit in memory
 
79
 * @nr: the bit to set
 
80
 * @addr: the address to start counting from
 
81
 *
 
82
 * Unlike set_bit(), this function is non-atomic and may be reordered.
 
83
 * If it's called on the same region of memory simultaneously, the effect
 
84
 * may be that only one operation succeeds.
 
85
 */
 
86
static __inline__ void __set_bit(int nr, volatile void * addr)
 
87
{
 
88
        unsigned long * m = ((unsigned long *) addr) + (nr >> 5);
 
89
 
 
90
        *m |= 1UL << (nr & 31);
 
91
}
 
92
#define PLATFORM__SET_BIT
 
93
 
 
94
/*
 
95
 * clear_bit - Clears a bit in memory
 
96
 * @nr: Bit to clear
 
97
 * @addr: Address to start counting from
 
98
 *
 
99
 * clear_bit() is atomic and may not be reordered.  However, it does
 
100
 * not contain a memory barrier, so if it is used for locking purposes,
 
101
 * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit()
 
102
 * in order to ensure changes are visible on other processors.
 
103
 */
 
104
static __inline__ void
 
105
clear_bit(int nr, volatile void *addr)
 
106
{
 
107
        unsigned long *m = ((unsigned long *) addr) + (nr >> 5);
 
108
        unsigned long temp;
 
109
 
 
110
        __asm__ __volatile__(
 
111
                "1:\tll\t%0, %1\t\t# clear_bit\n\t"
 
112
                "and\t%0, %2\n\t"
 
113
                "sc\t%0, %1\n\t"
 
114
                "beqz\t%0, 1b\n\t"
 
115
                : "=&r" (temp), "=m" (*m)
 
116
                : "ir" (~(1UL << (nr & 0x1f))), "m" (*m));
 
117
}
 
118
 
 
119
/*
 
120
 * change_bit - Toggle a bit in memory
 
121
 * @nr: Bit to clear
 
122
 * @addr: Address to start counting from
 
123
 *
 
124
 * change_bit() is atomic and may not be reordered.
 
125
 * Note that @nr may be almost arbitrarily large; this function is not
 
126
 * restricted to acting on a single-word quantity.
 
127
 */
 
128
static __inline__ void
 
129
change_bit(int nr, volatile void *addr)
 
130
{
 
131
        unsigned long *m = ((unsigned long *) addr) + (nr >> 5);
 
132
        unsigned long temp;
 
133
 
 
134
        __asm__ __volatile__(
 
135
                "1:\tll\t%0, %1\t\t# change_bit\n\t"
 
136
                "xor\t%0, %2\n\t"
 
137
                "sc\t%0, %1\n\t"
 
138
                "beqz\t%0, 1b"
 
139
                : "=&r" (temp), "=m" (*m)
 
140
                : "ir" (1UL << (nr & 0x1f)), "m" (*m));
 
141
}
 
142
 
 
143
/*
 
144
 * __change_bit - Toggle a bit in memory
 
145
 * @nr: the bit to set
 
146
 * @addr: the address to start counting from
 
147
 *
 
148
 * Unlike change_bit(), this function is non-atomic and may be reordered.
 
149
 * If it's called on the same region of memory simultaneously, the effect
 
150
 * may be that only one operation succeeds.
 
151
 */
 
152
static __inline__ void __change_bit(int nr, volatile void * addr)
 
153
{
 
154
        unsigned long * m = ((unsigned long *) addr) + (nr >> 5);
 
155
 
 
156
        *m ^= 1UL << (nr & 31);
 
157
}
 
158
 
 
159
/*
 
160
 * test_and_set_bit - Set a bit and return its old value
 
161
 * @nr: Bit to set
 
162
 * @addr: Address to count from
 
163
 *
 
164
 * This operation is atomic and cannot be reordered.
 
165
 * It also implies a memory barrier.
 
166
 */
 
167
static __inline__ int
 
168
test_and_set_bit(int nr, volatile void *addr)
 
169
{
 
170
        unsigned long *m = ((unsigned long *) addr) + (nr >> 5);
 
171
        unsigned long temp, res;
 
172
 
 
173
        __asm__ __volatile__(
 
174
                ".set\tnoreorder\t\t# test_and_set_bit\n"
 
175
                "1:\tll\t%0, %1\n\t"
 
176
                "or\t%2, %0, %3\n\t"
 
177
                "sc\t%2, %1\n\t"
 
178
                "beqz\t%2, 1b\n\t"
 
179
                " and\t%2, %0, %3\n\t"
 
180
                ".set\treorder"
 
181
                : "=&r" (temp), "=m" (*m), "=&r" (res)
 
182
                : "r" (1UL << (nr & 0x1f)), "m" (*m)
 
183
                : "memory");
 
184
 
 
185
        return res != 0;
 
186
}
 
187
 
 
188
/*
 
189
 * __test_and_set_bit - Set a bit and return its old value
 
190
 * @nr: Bit to set
 
191
 * @addr: Address to count from
 
192
 *
 
193
 * This operation is non-atomic and can be reordered.
 
194
 * If two examples of this operation race, one can appear to succeed
 
195
 * but actually fail.  You must protect multiple accesses with a lock.
 
196
 */
 
197
static __inline__ int __test_and_set_bit(int nr, volatile void * addr)
 
198
{
 
199
        int mask, retval;
 
200
        volatile int *a = addr;
 
201
 
 
202
        a += nr >> 5;
 
203
        mask = 1 << (nr & 0x1f);
 
204
        retval = (mask & *a) != 0;
 
205
        *a |= mask;
 
206
 
 
207
        return retval;
 
208
}
 
209
 
 
210
/*
 
211
 * test_and_clear_bit - Clear a bit and return its old value
 
212
 * @nr: Bit to set
 
213
 * @addr: Address to count from
 
214
 *
 
215
 * This operation is atomic and cannot be reordered.
 
216
 * It also implies a memory barrier.
 
217
 */
 
218
static __inline__ int
 
219
test_and_clear_bit(int nr, volatile void *addr)
 
220
{
 
221
        unsigned long *m = ((unsigned long *) addr) + (nr >> 5);
 
222
        unsigned long temp, res;
 
223
 
 
224
        __asm__ __volatile__(
 
225
                ".set\tnoreorder\t\t# test_and_clear_bit\n"
 
226
                "1:\tll\t%0, %1\n\t"
 
227
                "or\t%2, %0, %3\n\t"
 
228
                "xor\t%2, %3\n\t"
 
229
                "sc\t%2, %1\n\t"
 
230
                "beqz\t%2, 1b\n\t"
 
231
                " and\t%2, %0, %3\n\t"
 
232
                ".set\treorder"
 
233
                : "=&r" (temp), "=m" (*m), "=&r" (res)
 
234
                : "r" (1UL << (nr & 0x1f)), "m" (*m)
 
235
                : "memory");
 
236
 
 
237
        return res != 0;
 
238
}
 
239
 
 
240
/*
 
241
 * __test_and_clear_bit - Clear a bit and return its old value
 
242
 * @nr: Bit to set
 
243
 * @addr: Address to count from
 
244
 *
 
245
 * This operation is non-atomic and can be reordered.
 
246
 * If two examples of this operation race, one can appear to succeed
 
247
 * but actually fail.  You must protect multiple accesses with a lock.
 
248
 */
 
249
static __inline__ int __test_and_clear_bit(int nr, volatile void * addr)
 
250
{
 
251
        int     mask, retval;
 
252
        volatile int    *a = addr;
 
253
 
 
254
        a += nr >> 5;
 
255
        mask = 1 << (nr & 0x1f);
 
256
        retval = (mask & *a) != 0;
 
257
        *a &= ~mask;
 
258
 
 
259
        return retval;
 
260
}
 
261
 
 
262
/*
 
263
 * test_and_change_bit - Change a bit and return its new value
 
264
 * @nr: Bit to set
 
265
 * @addr: Address to count from
 
266
 *
 
267
 * This operation is atomic and cannot be reordered.
 
268
 * It also implies a memory barrier.
 
269
 */
 
270
static __inline__ int
 
271
test_and_change_bit(int nr, volatile void *addr)
 
272
{
 
273
        unsigned long *m = ((unsigned long *) addr) + (nr >> 5);
 
274
        unsigned long temp, res;
 
275
 
 
276
        __asm__ __volatile__(
 
277
                ".set\tnoreorder\t\t# test_and_change_bit\n"
 
278
                "1:\tll\t%0, %1\n\t"
 
279
                "xor\t%2, %0, %3\n\t"
 
280
                "sc\t%2, %1\n\t"
 
281
                "beqz\t%2, 1b\n\t"
 
282
                " and\t%2, %0, %3\n\t"
 
283
                ".set\treorder"
 
284
                : "=&r" (temp), "=m" (*m), "=&r" (res)
 
285
                : "r" (1UL << (nr & 0x1f)), "m" (*m)
 
286
                : "memory");
 
287
 
 
288
        return res != 0;
 
289
}
 
290
 
 
291
/*
 
292
 * __test_and_change_bit - Change a bit and return its old value
 
293
 * @nr: Bit to set
 
294
 * @addr: Address to count from
 
295
 *
 
296
 * This operation is non-atomic and can be reordered.
 
297
 * If two examples of this operation race, one can appear to succeed
 
298
 * but actually fail.  You must protect multiple accesses with a lock.
 
299
 */
 
300
static __inline__ int __test_and_change_bit(int nr, volatile void * addr)
 
301
{
 
302
        int     mask, retval;
 
303
        volatile int    *a = addr;
 
304
 
 
305
        a += nr >> 5;
 
306
        mask = 1 << (nr & 0x1f);
 
307
        retval = (mask & *a) != 0;
 
308
        *a ^= mask;
 
309
 
 
310
        return retval;
 
311
}
 
312
 
 
313
#else /* MIPS I */
 
314
 
 
315
/*
 
316
 * set_bit - Atomically set a bit in memory
 
317
 * @nr: the bit to set
 
318
 * @addr: the address to start counting from
 
319
 *
 
320
 * This function is atomic and may not be reordered.  See __set_bit()
 
321
 * if you do not require the atomic guarantees.
 
322
 * Note that @nr may be almost arbitrarily large; this function is not
 
323
 * restricted to acting on a single-word quantity.
 
324
 */
 
325
static __inline__ void set_bit(int nr, volatile void * addr)
 
326
{
 
327
        int     mask;
 
328
        volatile int    *a = addr;
 
329
        __bi_flags;
 
330
 
 
331
        a += nr >> 5;
 
332
        mask = 1 << (nr & 0x1f);
 
333
        __bi_save_and_cli(flags);
 
334
        *a |= mask;
 
335
        __bi_restore_flags(flags);
 
336
}
 
337
 
 
338
/*
 
339
 * __set_bit - Set a bit in memory
 
340
 * @nr: the bit to set
 
341
 * @addr: the address to start counting from
 
342
 *
 
343
 * Unlike set_bit(), this function is non-atomic and may be reordered.
 
344
 * If it's called on the same region of memory simultaneously, the effect
 
345
 * may be that only one operation succeeds.
 
346
 */
 
347
static __inline__ void __set_bit(int nr, volatile void * addr)
 
348
{
 
349
        int     mask;
 
350
        volatile int    *a = addr;
 
351
 
 
352
        a += nr >> 5;
 
353
        mask = 1 << (nr & 0x1f);
 
354
        *a |= mask;
 
355
}
 
356
 
 
357
/*
 
358
 * clear_bit - Clears a bit in memory
 
359
 * @nr: Bit to clear
 
360
 * @addr: Address to start counting from
 
361
 *
 
362
 * clear_bit() is atomic and may not be reordered.  However, it does
 
363
 * not contain a memory barrier, so if it is used for locking purposes,
 
364
 * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit()
 
365
 * in order to ensure changes are visible on other processors.
 
366
 */
 
367
static __inline__ void clear_bit(int nr, volatile void * addr)
 
368
{
 
369
        int     mask;
 
370
        volatile int    *a = addr;
 
371
        __bi_flags;
 
372
 
 
373
        a += nr >> 5;
 
374
        mask = 1 << (nr & 0x1f);
 
375
        __bi_save_and_cli(flags);
 
376
        *a &= ~mask;
 
377
        __bi_restore_flags(flags);
 
378
}
 
379
 
 
380
/*
 
381
 * change_bit - Toggle a bit in memory
 
382
 * @nr: Bit to clear
 
383
 * @addr: Address to start counting from
 
384
 *
 
385
 * change_bit() is atomic and may not be reordered.
 
386
 * Note that @nr may be almost arbitrarily large; this function is not
 
387
 * restricted to acting on a single-word quantity.
 
388
 */
 
389
static __inline__ void change_bit(int nr, volatile void * addr)
 
390
{
 
391
        int     mask;
 
392
        volatile int    *a = addr;
 
393
        __bi_flags;
 
394
 
 
395
        a += nr >> 5;
 
396
        mask = 1 << (nr & 0x1f);
 
397
        __bi_save_and_cli(flags);
 
398
        *a ^= mask;
 
399
        __bi_restore_flags(flags);
 
400
}
 
401
 
 
402
/*
 
403
 * __change_bit - Toggle a bit in memory
 
404
 * @nr: the bit to set
 
405
 * @addr: the address to start counting from
 
406
 *
 
407
 * Unlike change_bit(), this function is non-atomic and may be reordered.
 
408
 * If it's called on the same region of memory simultaneously, the effect
 
409
 * may be that only one operation succeeds.
 
410
 */
 
411
static __inline__ void __change_bit(int nr, volatile void * addr)
 
412
{
 
413
        unsigned long * m = ((unsigned long *) addr) + (nr >> 5);
 
414
 
 
415
        *m ^= 1UL << (nr & 31);
 
416
}
 
417
 
 
418
/*
 
419
 * test_and_set_bit - Set a bit and return its old value
 
420
 * @nr: Bit to set
 
421
 * @addr: Address to count from
 
422
 *
 
423
 * This operation is atomic and cannot be reordered.
 
424
 * It also implies a memory barrier.
 
425
 */
 
426
static __inline__ int test_and_set_bit(int nr, volatile void * addr)
 
427
{
 
428
        int     mask, retval;
 
429
        volatile int    *a = addr;
 
430
        __bi_flags;
 
431
 
 
432
        a += nr >> 5;
 
433
        mask = 1 << (nr & 0x1f);
 
434
        __bi_save_and_cli(flags);
 
435
        retval = (mask & *a) != 0;
 
436
        *a |= mask;
 
437
        __bi_restore_flags(flags);
 
438
 
 
439
        return retval;
 
440
}
 
441
 
 
442
/*
 
443
 * __test_and_set_bit - Set a bit and return its old value
 
444
 * @nr: Bit to set
 
445
 * @addr: Address to count from
 
446
 *
 
447
 * This operation is non-atomic and can be reordered.
 
448
 * If two examples of this operation race, one can appear to succeed
 
449
 * but actually fail.  You must protect multiple accesses with a lock.
 
450
 */
 
451
static __inline__ int __test_and_set_bit(int nr, volatile void * addr)
 
452
{
 
453
        int     mask, retval;
 
454
        volatile int    *a = addr;
 
455
 
 
456
        a += nr >> 5;
 
457
        mask = 1 << (nr & 0x1f);
 
458
        retval = (mask & *a) != 0;
 
459
        *a |= mask;
 
460
 
 
461
        return retval;
 
462
}
 
463
 
 
464
/*
 
465
 * test_and_clear_bit - Clear a bit and return its old value
 
466
 * @nr: Bit to set
 
467
 * @addr: Address to count from
 
468
 *
 
469
 * This operation is atomic and cannot be reordered.
 
470
 * It also implies a memory barrier.
 
471
 */
 
472
static __inline__ int test_and_clear_bit(int nr, volatile void * addr)
 
473
{
 
474
        int     mask, retval;
 
475
        volatile int    *a = addr;
 
476
        __bi_flags;
 
477
 
 
478
        a += nr >> 5;
 
479
        mask = 1 << (nr & 0x1f);
 
480
        __bi_save_and_cli(flags);
 
481
        retval = (mask & *a) != 0;
 
482
        *a &= ~mask;
 
483
        __bi_restore_flags(flags);
 
484
 
 
485
        return retval;
 
486
}
 
487
 
 
488
/*
 
489
 * __test_and_clear_bit - Clear a bit and return its old value
 
490
 * @nr: Bit to set
 
491
 * @addr: Address to count from
 
492
 *
 
493
 * This operation is non-atomic and can be reordered.
 
494
 * If two examples of this operation race, one can appear to succeed
 
495
 * but actually fail.  You must protect multiple accesses with a lock.
 
496
 */
 
497
static __inline__ int __test_and_clear_bit(int nr, volatile void * addr)
 
498
{
 
499
        int     mask, retval;
 
500
        volatile int    *a = addr;
 
501
 
 
502
        a += nr >> 5;
 
503
        mask = 1 << (nr & 0x1f);
 
504
        retval = (mask & *a) != 0;
 
505
        *a &= ~mask;
 
506
 
 
507
        return retval;
 
508
}
 
509
 
 
510
/*
 
511
 * test_and_change_bit - Change a bit and return its new value
 
512
 * @nr: Bit to set
 
513
 * @addr: Address to count from
 
514
 *
 
515
 * This operation is atomic and cannot be reordered.
 
516
 * It also implies a memory barrier.
 
517
 */
 
518
static __inline__ int test_and_change_bit(int nr, volatile void * addr)
 
519
{
 
520
        int     mask, retval;
 
521
        volatile int    *a = addr;
 
522
        __bi_flags;
 
523
 
 
524
        a += nr >> 5;
 
525
        mask = 1 << (nr & 0x1f);
 
526
        __bi_save_and_cli(flags);
 
527
        retval = (mask & *a) != 0;
 
528
        *a ^= mask;
 
529
        __bi_restore_flags(flags);
 
530
 
 
531
        return retval;
 
532
}
 
533
 
 
534
/*
 
535
 * __test_and_change_bit - Change a bit and return its old value
 
536
 * @nr: Bit to set
 
537
 * @addr: Address to count from
 
538
 *
 
539
 * This operation is non-atomic and can be reordered.
 
540
 * If two examples of this operation race, one can appear to succeed
 
541
 * but actually fail.  You must protect multiple accesses with a lock.
 
542
 */
 
543
static __inline__ int __test_and_change_bit(int nr, volatile void * addr)
 
544
{
 
545
        int     mask, retval;
 
546
        volatile int    *a = addr;
 
547
 
 
548
        a += nr >> 5;
 
549
        mask = 1 << (nr & 0x1f);
 
550
        retval = (mask & *a) != 0;
 
551
        *a ^= mask;
 
552
 
 
553
        return retval;
 
554
}
 
555
 
 
556
#undef __bi_flags
 
557
#undef __bi_cli
 
558
#undef __bi_save_flags
 
559
#undef __bi_restore_flags
 
560
 
 
561
#endif /* MIPS I */
 
562
 
 
563
/*
 
564
 * test_bit - Determine whether a bit is set
 
565
 * @nr: bit number to test
 
566
 * @addr: Address to start counting from
 
567
 */
 
568
static __inline__ int test_bit(int nr, const volatile void *addr)
 
569
{
 
570
        return ((1UL << (nr & 31)) & (((const unsigned int *) addr)[nr >> 5])) != 0;
 
571
}
 
572
 
 
573
#ifndef __MIPSEB__
 
574
 
 
575
/* Little endian versions. */
 
576
 
 
577
/*
 
578
 * find_first_zero_bit - find the first zero bit in a memory region
 
579
 * @addr: The address to start the search at
 
580
 * @size: The maximum size to search
 
581
 *
 
582
 * Returns the bit-number of the first zero bit, not the number of the byte
 
583
 * containing a bit.
 
584
 */
 
585
static __inline__ int find_first_zero_bit (void *addr, unsigned size)
 
586
{
 
587
        unsigned long dummy;
 
588
        int res;
 
589
 
 
590
        if (!size)
 
591
                return 0;
 
592
 
 
593
        __asm__ (".set\tnoreorder\n\t"
 
594
                ".set\tnoat\n"
 
595
                "1:\tsubu\t$1,%6,%0\n\t"
 
596
                "blez\t$1,2f\n\t"
 
597
                "lw\t$1,(%5)\n\t"
 
598
                "addiu\t%5,4\n\t"
 
599
#if (_MIPS_ISA == _MIPS_ISA_MIPS2 ) || (_MIPS_ISA == _MIPS_ISA_MIPS3 ) || \
 
600
    (_MIPS_ISA == _MIPS_ISA_MIPS4 ) || (_MIPS_ISA == _MIPS_ISA_MIPS5 ) || \
 
601
    (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
 
602
                "beql\t%1,$1,1b\n\t"
 
603
                "addiu\t%0,32\n\t"
 
604
#else
 
605
                "addiu\t%0,32\n\t"
 
606
                "beq\t%1,$1,1b\n\t"
 
607
                "nop\n\t"
 
608
                "subu\t%0,32\n\t"
 
609
#endif
 
610
#ifdef __MIPSEB__
 
611
#error "Fix this for big endian"
 
612
#endif /* __MIPSEB__ */
 
613
                "li\t%1,1\n"
 
614
                "1:\tand\t%2,$1,%1\n\t"
 
615
                "beqz\t%2,2f\n\t"
 
616
                "sll\t%1,%1,1\n\t"
 
617
                "bnez\t%1,1b\n\t"
 
618
                "add\t%0,%0,1\n\t"
 
619
                ".set\tat\n\t"
 
620
                ".set\treorder\n"
 
621
                "2:"
 
622
                : "=r" (res), "=r" (dummy), "=r" (addr)
 
623
                : "0" ((signed int) 0), "1" ((unsigned int) 0xffffffff),
 
624
                  "2" (addr), "r" (size)
 
625
                : "$1");
 
626
 
 
627
        return res;
 
628
}
 
629
 
 
630
/*
 
631
 * find_next_zero_bit - find the first zero bit in a memory region
 
632
 * @addr: The address to base the search on
 
633
 * @offset: The bitnumber to start searching at
 
634
 * @size: The maximum size to search
 
635
 */
 
636
static __inline__ int find_next_zero_bit (void * addr, int size, int offset)
 
637
{
 
638
        unsigned int *p = ((unsigned int *) addr) + (offset >> 5);
 
639
        int set = 0, bit = offset & 31, res;
 
640
        unsigned long dummy;
 
641
 
 
642
        if (bit) {
 
643
                /*
 
644
                 * Look for zero in first byte
 
645
                 */
 
646
#ifdef __MIPSEB__
 
647
#error "Fix this for big endian byte order"
 
648
#endif
 
649
                __asm__(".set\tnoreorder\n\t"
 
650
                        ".set\tnoat\n"
 
651
                        "1:\tand\t$1,%4,%1\n\t"
 
652
                        "beqz\t$1,1f\n\t"
 
653
                        "sll\t%1,%1,1\n\t"
 
654
                        "bnez\t%1,1b\n\t"
 
655
                        "addiu\t%0,1\n\t"
 
656
                        ".set\tat\n\t"
 
657
                        ".set\treorder\n"
 
658
                        "1:"
 
659
                        : "=r" (set), "=r" (dummy)
 
660
                        : "0" (0), "1" (1 << bit), "r" (*p)
 
661
                        : "$1");
 
662
                if (set < (32 - bit))
 
663
                        return set + offset;
 
664
                set = 32 - bit;
 
665
                p++;
 
666
        }
 
667
        /*
 
668
         * No zero yet, search remaining full bytes for a zero
 
669
         */
 
670
        res = find_first_zero_bit(p, size - 32 * (p - (unsigned int *) addr));
 
671
        return offset + set + res;
 
672
}
 
673
 
 
674
#endif /* !(__MIPSEB__) */
 
675
 
 
676
/*
 
677
 * ffz - find first zero in word.
 
678
 * @word: The word to search
 
679
 *
 
680
 * Undefined if no zero exists, so code should check against ~0UL first.
 
681
 */
 
682
static __inline__ unsigned long ffz(unsigned long word)
 
683
{
 
684
        unsigned int    __res;
 
685
        unsigned int    mask = 1;
 
686
 
 
687
        __asm__ (
 
688
                ".set\tnoreorder\n\t"
 
689
                ".set\tnoat\n\t"
 
690
                "move\t%0,$0\n"
 
691
                "1:\tand\t$1,%2,%1\n\t"
 
692
                "beqz\t$1,2f\n\t"
 
693
                "sll\t%1,1\n\t"
 
694
                "bnez\t%1,1b\n\t"
 
695
                "addiu\t%0,1\n\t"
 
696
                ".set\tat\n\t"
 
697
                ".set\treorder\n"
 
698
                "2:\n\t"
 
699
                : "=&r" (__res), "=r" (mask)
 
700
                : "r" (word), "1" (mask)
 
701
                : "$1");
 
702
 
 
703
        return __res;
 
704
}
 
705
 
 
706
#ifdef __KERNEL__
 
707
 
 
708
/*
 
709
 * hweightN - returns the hamming weight of a N-bit word
 
710
 * @x: the word to weigh
 
711
 *
 
712
 * The Hamming Weight of a number is the total number of bits set in it.
 
713
 */
 
714
 
 
715
#define hweight32(x) generic_hweight32(x)
 
716
#define hweight16(x) generic_hweight16(x)
 
717
#define hweight8(x) generic_hweight8(x)
 
718
 
 
719
#endif /* __KERNEL__ */
 
720
 
 
721
#ifdef __MIPSEB__
 
722
/*
 
723
 * find_next_zero_bit - find the first zero bit in a memory region
 
724
 * @addr: The address to base the search on
 
725
 * @offset: The bitnumber to start searching at
 
726
 * @size: The maximum size to search
 
727
 */
 
728
static __inline__ int find_next_zero_bit(void *addr, int size, int offset)
 
729
{
 
730
        unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
 
731
        unsigned long result = offset & ~31UL;
 
732
        unsigned long tmp;
 
733
 
 
734
        if (offset >= size)
 
735
                return size;
 
736
        size -= result;
 
737
        offset &= 31UL;
 
738
        if (offset) {
 
739
                tmp = *(p++);
 
740
                tmp |= ~0UL >> (32-offset);
 
741
                if (size < 32)
 
742
                        goto found_first;
 
743
                if (~tmp)
 
744
                        goto found_middle;
 
745
                size -= 32;
 
746
                result += 32;
 
747
        }
 
748
        while (size & ~31UL) {
 
749
                if (~(tmp = *(p++)))
 
750
                        goto found_middle;
 
751
                result += 32;
 
752
                size -= 32;
 
753
        }
 
754
        if (!size)
 
755
                return result;
 
756
        tmp = *p;
 
757
 
 
758
found_first:
 
759
        tmp |= ~0UL << size;
 
760
found_middle:
 
761
        return result + ffz(tmp);
 
762
}
 
763
 
 
764
/* Linus sez that gcc can optimize the following correctly, we'll see if this
 
765
 * holds on the Sparc as it does for the ALPHA.
 
766
 */
 
767
 
 
768
#if 0 /* Fool kernel-doc since it doesn't do macros yet */
 
769
/*
 
770
 * find_first_zero_bit - find the first zero bit in a memory region
 
771
 * @addr: The address to start the search at
 
772
 * @size: The maximum size to search
 
773
 *
 
774
 * Returns the bit-number of the first zero bit, not the number of the byte
 
775
 * containing a bit.
 
776
 */
 
777
static int find_first_zero_bit (void *addr, unsigned size);
 
778
#endif
 
779
 
 
780
#define find_first_zero_bit(addr, size) \
 
781
        find_next_zero_bit((addr), (size), 0)
 
782
 
 
783
#endif /* (__MIPSEB__) */
 
784
 
 
785
/* Now for the ext2 filesystem bit operations and helper routines. */
 
786
 
 
787
#ifdef __MIPSEB__
 
788
static __inline__ int ext2_set_bit(int nr, void * addr)
 
789
{
 
790
        int             mask, retval, flags;
 
791
        unsigned char   *ADDR = (unsigned char *) addr;
 
792
 
 
793
        ADDR += nr >> 3;
 
794
        mask = 1 << (nr & 0x07);
 
795
        save_and_cli(flags);
 
796
        retval = (mask & *ADDR) != 0;
 
797
        *ADDR |= mask;
 
798
        restore_flags(flags);
 
799
        return retval;
 
800
}
 
801
 
 
802
static __inline__ int ext2_clear_bit(int nr, void * addr)
 
803
{
 
804
        int             mask, retval, flags;
 
805
        unsigned char   *ADDR = (unsigned char *) addr;
 
806
 
 
807
        ADDR += nr >> 3;
 
808
        mask = 1 << (nr & 0x07);
 
809
        save_and_cli(flags);
 
810
        retval = (mask & *ADDR) != 0;
 
811
        *ADDR &= ~mask;
 
812
        restore_flags(flags);
 
813
        return retval;
 
814
}
 
815
 
 
816
static __inline__ int ext2_test_bit(int nr, const void * addr)
 
817
{
 
818
        int                     mask;
 
819
        const unsigned char     *ADDR = (const unsigned char *) addr;
 
820
 
 
821
        ADDR += nr >> 3;
 
822
        mask = 1 << (nr & 0x07);
 
823
        return ((mask & *ADDR) != 0);
 
824
}
 
825
 
 
826
#define ext2_find_first_zero_bit(addr, size) \
 
827
        ext2_find_next_zero_bit((addr), (size), 0)
 
828
 
 
829
static __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset)
 
830
{
 
831
        unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
 
832
        unsigned long result = offset & ~31UL;
 
833
        unsigned long tmp;
 
834
 
 
835
        if (offset >= size)
 
836
                return size;
 
837
        size -= result;
 
838
        offset &= 31UL;
 
839
        if(offset) {
 
840
                /* We hold the little endian value in tmp, but then the
 
841
                 * shift is illegal. So we could keep a big endian value
 
842
                 * in tmp, like this:
 
843
                 *
 
844
                 * tmp = __swab32(*(p++));
 
845
                 * tmp |= ~0UL >> (32-offset);
 
846
                 *
 
847
                 * but this would decrease preformance, so we change the
 
848
                 * shift:
 
849
                 */
 
850
                tmp = *(p++);
 
851
                tmp |= __swab32(~0UL >> (32-offset));
 
852
                if(size < 32)
 
853
                        goto found_first;
 
854
                if(~tmp)
 
855
                        goto found_middle;
 
856
                size -= 32;
 
857
                result += 32;
 
858
        }
 
859
        while(size & ~31UL) {
 
860
                if(~(tmp = *(p++)))
 
861
                        goto found_middle;
 
862
                result += 32;
 
863
                size -= 32;
 
864
        }
 
865
        if(!size)
 
866
                return result;
 
867
        tmp = *p;
 
868
 
 
869
found_first:
 
870
        /* tmp is little endian, so we would have to swab the shift,
 
871
         * see above. But then we have to swab tmp below for ffz, so
 
872
         * we might as well do this here.
 
873
         */
 
874
        return result + ffz(__swab32(tmp) | (~0UL << size));
 
875
found_middle:
 
876
        return result + ffz(__swab32(tmp));
 
877
}
 
878
#else /* !(__MIPSEB__) */
 
879
 
 
880
/* Native ext2 byte ordering, just collapse using defines. */
 
881
#define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr))
 
882
#define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr))
 
883
#define ext2_test_bit(nr, addr) test_bit((nr), (addr))
 
884
#define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr), (size))
 
885
#define ext2_find_next_zero_bit(addr, size, offset) \
 
886
                find_next_zero_bit((addr), (size), (offset))
 
887
 
 
888
#endif /* !(__MIPSEB__) */
 
889
 
 
890
/*
 
891
 * Bitmap functions for the minix filesystem.
 
892
 * FIXME: These assume that Minix uses the native byte/bitorder.
 
893
 * This limits the Minix filesystem's value for data exchange very much.
 
894
 */
 
895
#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
 
896
#define minix_set_bit(nr,addr) set_bit(nr,addr)
 
897
#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
 
898
#define minix_test_bit(nr,addr) test_bit(nr,addr)
 
899
#define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
 
900
 
 
901
#endif /* _ASM_BITOPS_H */