xref: /openbsd-src/sys/dev/pci/drm/include/linux/bitmap.h (revision 3374c67d44f9b75b98444cbf63020f777792342e)
1 /*	$OpenBSD: bitmap.h,v 1.5 2023/01/01 01:34:58 jsg Exp $	*/
2 /*
3  * Copyright (c) 2013, 2014, 2015 Mark Kettenis
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #ifndef _LINUX_BITMAP_H
19 #define _LINUX_BITMAP_H
20 
21 #include <linux/bitops.h>
22 #include <linux/string.h>
23 
24 #define bitmap_empty(p, n)	(find_first_bit(p, n) == n)
25 
26 static inline void
27 bitmap_set(void *p, int b, u_int n)
28 {
29 	u_int end = b + n;
30 
31 	for (; b < end; b++)
32 		__set_bit(b, p);
33 }
34 
35 static inline void
36 bitmap_clear(void *p, int b, u_int n)
37 {
38 	u_int end = b + n;
39 
40 	for (; b < end; b++)
41 		__clear_bit(b, p);
42 }
43 
44 static inline void
45 bitmap_zero(void *p, u_int n)
46 {
47 	u_int *ptr = p;
48 	u_int b;
49 
50 	for (b = 0; b < n; b += 32)
51 		ptr[b >> 5] = 0;
52 }
53 
54 static inline void
55 bitmap_fill(void *p, u_int n)
56 {
57 	u_int *ptr = p;
58 	u_int b;
59 
60 	for (b = 0; b < n; b += 32)
61 		ptr[b >> 5] = 0xffffffff;
62 }
63 
64 static inline void
65 bitmap_or(void *d, void *s1, void *s2, u_int n)
66 {
67 	u_int *dst = d;
68 	u_int *src1 = s1;
69 	u_int *src2 = s2;
70 	u_int b;
71 
72 	for (b = 0; b < n; b += 32)
73 		dst[b >> 5] = src1[b >> 5] | src2[b >> 5];
74 }
75 
76 static inline void
77 bitmap_andnot(void *d, void *s1, void *s2, u_int n)
78 {
79 	u_int *dst = d;
80 	u_int *src1 = s1;
81 	u_int *src2 = s2;
82 	u_int b;
83 
84 	for (b = 0; b < n; b += 32)
85 		dst[b >> 5] = src1[b >> 5] & ~src2[b >> 5];
86 }
87 
88 static inline void
89 bitmap_complement(void *d, void *s, u_int n)
90 {
91 	u_int *dst = d;
92 	u_int *src = s;
93 	u_int b;
94 
95 	for (b = 0; b < n; b += 32)
96 		dst[b >> 5] = ~src[b >> 5];
97 }
98 
99 static inline void
100 bitmap_copy(void *d, void *s, u_int n)
101 {
102 	u_int *dst = d;
103 	u_int *src = s;
104 	u_int b;
105 
106 	for (b = 0; b < n; b += 32)
107 		dst[b >> 5] = src[b >> 5];
108 }
109 
110 static inline void
111 bitmap_to_arr32(void *d, unsigned long *src, u_int n)
112 {
113 	u_int *dst = d;
114 	u_int b;
115 
116 #ifdef __LP64__
117 	for (b = 0; b < n; b += 32) {
118 		dst[b >> 5] = src[b >> 6] & 0xffffffff;
119 		b += 32;
120 		if (b < n)
121 			dst[b >> 5] = src[b >> 6] >> 32;
122 	}
123 #else
124 	bitmap_copy(d, src, n);
125 #endif
126 	if ((n % 32) != 0)
127 		dst[n >> 5] &= (0xffffffff >> (32 - (n % 32)));
128 }
129 
130 
131 static inline int
132 bitmap_weight(const void *p, u_int n)
133 {
134 	const u_int *ptr = p;
135 	u_int b;
136 	int sum = 0;
137 
138 	for (b = 0; b < n; b += 32)
139 		sum += hweight32(ptr[b >> 5]);
140 	return sum;
141 }
142 
143 void *bitmap_zalloc(u_int, gfp_t);
144 void bitmap_free(void *);
145 
146 #endif
147