aboutsummaryrefslogtreecommitdiffstats
path: root/roms/skiboot/core/bitmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'roms/skiboot/core/bitmap.c')
-rw-r--r--roms/skiboot/core/bitmap.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/roms/skiboot/core/bitmap.c b/roms/skiboot/core/bitmap.c
new file mode 100644
index 000000000..8de1356c3
--- /dev/null
+++ b/roms/skiboot/core/bitmap.c
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+/* Copyright 2016 IBM Corp. */
+
+#include "bitmap.h"
+
+static int __bitmap_find_bit(bitmap_t map, unsigned int start, unsigned int count,
+ bool value)
+{
+ unsigned int el, first_bit;
+ unsigned int end = start + count;
+ bitmap_elem_t e, ev;
+ int b;
+
+ ev = value ? -1ul : 0;
+ el = BITMAP_ELEM(start);
+ first_bit = BITMAP_BIT(start);
+
+ while (start < end) {
+ e = map[el] ^ ev;
+ e |= ((1ul << first_bit) - 1);
+ if (~e)
+ break;
+ start = (start + BITMAP_ELSZ) & ~(BITMAP_ELSZ - 1);
+ first_bit = 0;
+ el++;
+ }
+ for (b = first_bit; b < BITMAP_ELSZ && start < end; b++,start++) {
+ if ((e & (1ull << b)) == 0)
+ return start;
+ }
+
+ return -1;
+}
+
+int bitmap_find_zero_bit(bitmap_t map, unsigned int start, unsigned int count)
+{
+ return __bitmap_find_bit(map, start, count, false);
+}
+
+int bitmap_find_one_bit(bitmap_t map, unsigned int start, unsigned int count)
+{
+ return __bitmap_find_bit(map, start, count, true);
+}
+