xref: /openbsd-src/sys/dev/pci/drm/include/linux/bitmap.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
1 /*	$OpenBSD: bitmap.h,v 1.6 2024/01/06 09:33:08 kettenis 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/align.h>
22 #include <linux/bitops.h>
23 #include <linux/string.h>
24 
25 #define bitmap_empty(p, n)	(find_first_bit(p, n) == n)
26 
27 static inline void
28 bitmap_set(void *p, int b, u_int n)
29 {
30 	u_int end = b + n;
31 
32 	for (; b < end; b++)
33 		__set_bit(b, p);
34 }
35 
36 static inline void
37 bitmap_clear(void *p, int b, u_int n)
38 {
39 	u_int end = b + n;
40 
41 	for (; b < end; b++)
42 		__clear_bit(b, p);
43 }
44 
45 static inline void
46 bitmap_zero(void *p, u_int n)
47 {
48 	u_int *ptr = p;
49 	u_int b;
50 
51 	for (b = 0; b < n; b += 32)
52 		ptr[b >> 5] = 0;
53 }
54 
55 static inline void
56 bitmap_fill(void *p, u_int n)
57 {
58 	u_int *ptr = p;
59 	u_int b;
60 
61 	for (b = 0; b < n; b += 32)
62 		ptr[b >> 5] = 0xffffffff;
63 }
64 
65 static inline void
66 bitmap_or(void *d, void *s1, void *s2, u_int n)
67 {
68 	u_int *dst = d;
69 	u_int *src1 = s1;
70 	u_int *src2 = s2;
71 	u_int b;
72 
73 	for (b = 0; b < n; b += 32)
74 		dst[b >> 5] = src1[b >> 5] | src2[b >> 5];
75 }
76 
77 static inline void
78 bitmap_andnot(void *d, void *s1, void *s2, u_int n)
79 {
80 	u_int *dst = d;
81 	u_int *src1 = s1;
82 	u_int *src2 = s2;
83 	u_int b;
84 
85 	for (b = 0; b < n; b += 32)
86 		dst[b >> 5] = src1[b >> 5] & ~src2[b >> 5];
87 }
88 
89 static inline void
90 bitmap_complement(void *d, void *s, u_int n)
91 {
92 	u_int *dst = d;
93 	u_int *src = s;
94 	u_int b;
95 
96 	for (b = 0; b < n; b += 32)
97 		dst[b >> 5] = ~src[b >> 5];
98 }
99 
100 static inline void
101 bitmap_copy(void *d, void *s, u_int n)
102 {
103 	u_int *dst = d;
104 	u_int *src = s;
105 	u_int b;
106 
107 	for (b = 0; b < n; b += 32)
108 		dst[b >> 5] = src[b >> 5];
109 }
110 
111 static inline void
112 bitmap_to_arr32(void *d, unsigned long *src, u_int n)
113 {
114 	u_int *dst = d;
115 	u_int b;
116 
117 #ifdef __LP64__
118 	for (b = 0; b < n; b += 32) {
119 		dst[b >> 5] = src[b >> 6] & 0xffffffff;
120 		b += 32;
121 		if (b < n)
122 			dst[b >> 5] = src[b >> 6] >> 32;
123 	}
124 #else
125 	bitmap_copy(d, src, n);
126 #endif
127 	if ((n % 32) != 0)
128 		dst[n >> 5] &= (0xffffffff >> (32 - (n % 32)));
129 }
130 
131 
132 static inline int
133 bitmap_weight(const void *p, u_int n)
134 {
135 	const u_int *ptr = p;
136 	u_int b;
137 	int sum = 0;
138 
139 	for (b = 0; b < n; b += 32)
140 		sum += hweight32(ptr[b >> 5]);
141 	return sum;
142 }
143 
144 static inline int
145 bitmap_find_free_region(void *p, u_int n, int o)
146 {
147 	int b;
148 
149 	KASSERT(o == 0);
150 	b = find_first_zero_bit(p, n);
151 	if (b == n)
152 		return -ENOMEM;
153 	__set_bit(b, p);
154 	return b;
155 }
156 
157 static inline void
158 bitmap_release_region(void *p, u_int b, int o)
159 {
160 	KASSERT(o == 0);
161 	__clear_bit(b, p);
162 }
163 
164 void *bitmap_zalloc(u_int, gfp_t);
165 void bitmap_free(void *);
166 
167 #endif
168