[PATCH v2 1/6] sandbox: add generic find_next_zero_bit implementation
lukas.funke-oss at weidmueller.com
lukas.funke-oss at weidmueller.com
Tue Dec 12 09:52:31 CET 2023
From: Lukas Funke <lukas.funke at weidmueller.com>
Add generic 'find_next_zero_bit' implementation in order to enable the
use of the 'for_each_set_bitrange' macro. The implementation is currently
missing for the sandbox-arch and using the function results in a linker
error.
There are more efficient implementations in the architecture specific
implementations. However, for the sandbox the implementation should be
simple and portable.
Signed-off-by: Lukas Funke <lukas.funke at weidmueller.com>
---
(no changes since v1)
arch/sandbox/include/asm/bitops.h | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/arch/sandbox/include/asm/bitops.h b/arch/sandbox/include/asm/bitops.h
index f27d5e98c5..453ff005d2 100644
--- a/arch/sandbox/include/asm/bitops.h
+++ b/arch/sandbox/include/asm/bitops.h
@@ -104,8 +104,20 @@ static inline int __test_and_change_bit(int nr, void *addr)
return (old & mask) != 0;
}
-extern int find_first_zero_bit(void *addr, unsigned size);
-extern int find_next_zero_bit(void *addr, int size, int offset);
+#define find_first_zero_bit(addr, size) \
+ find_next_zero_bit((addr), (size), 0)
+
+static inline int find_next_zero_bit(const unsigned long *addr, int size,
+ int offset) {
+ unsigned long *p = ((unsigned long *)addr) + (offset >> 5);
+
+ while ((~(*p) & 0x1 << offset) == 0x0ll && (offset < size)) {
+ offset++;
+ p = ((unsigned long *)addr) + (offset >> 5);
+ }
+
+ return offset;
+}
/*
* This routine doesn't need to be atomic.
--
2.30.2
More information about the U-Boot
mailing list