Added support for mlx4_en on RHEL7.6
[compat-rdma/compat.git] / compat / bitmap.c
1 #include <linux/export.h>
2 #include <linux/thread_info.h>
3 #include <linux/ctype.h>
4 #include <linux/errno.h>
5 #include <linux/bitmap.h>
6 #include <linux/bitops.h>
7 #include <linux/bug.h>
8 #include <linux/kernel.h>
9 #include <linux/mm.h>
10 #include <linux/slab.h>
11 #include <linux/string.h>
12 #include <linux/uaccess.h>
13
14 #include <asm/page.h>
15
16 #ifndef HAVE_BITMAP_KZALLOC
17 unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags)
18 {
19         return kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long),
20                              flags);
21 }
22 EXPORT_SYMBOL(bitmap_alloc);
23
24 unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags)
25 {
26         return bitmap_alloc(nbits, flags | __GFP_ZERO);
27 }
28 EXPORT_SYMBOL(bitmap_zalloc);
29 #endif
30
31 #ifndef HAVE_BITMAP_FREE
32 #define bitmap_free LINUX_BACKPORT(bitmap_free)
33 void bitmap_free(const unsigned long *bitmap)
34 {
35         kfree(bitmap);
36 }
37 EXPORT_SYMBOL(bitmap_free);
38 #endif
39
40 #ifndef HAVE_BITMAP_FROM_ARR32
41 #if BITS_PER_LONG == 64
42 void bitmap_from_arr32(unsigned long *bitmap, const u32 *buf,
43                        unsigned int nbits)
44 {
45         unsigned int i, halfwords;
46
47         halfwords = DIV_ROUND_UP(nbits, 32);
48         for (i = 0; i < halfwords; i++) {
49                 bitmap[i/2] = (unsigned long) buf[i];
50                 if (++i < halfwords)
51                         bitmap[i/2] |= ((unsigned long) buf[i]) << 32;
52         }
53
54         /* Clear tail bits in last word beyond nbits. */
55         if (nbits % BITS_PER_LONG)
56                 bitmap[(halfwords - 1) / 2] &= BITMAP_LAST_WORD_MASK(nbits);
57 }
58 EXPORT_SYMBOL(bitmap_from_arr32);
59 #endif
60 #endif