Is this a problem in Linux upstream? or specific to U-Boot, and is it a regression?
refrerence https://lore.kernel.org/u-boot/20240504183354.GL2568172@bill-the-cat/ and reference https://lore.kernel.org/u-boot/bjxpr01mb0855813dd38ef86cca6dd5c8e6...@bjxpr01mb0855.chnpr01.prod.partner.outlook.cn/ On Fri, Jul 26, 2024 at 5:44 AM Maxim Kochetkov <[email protected]> wrote: > > These seem to be missing, and trying to build fastboot cmd without > them is causing errors due to these being missing. > > Signed-off-by: Maxim Kochetkov <[email protected]> > --- > arch/riscv/include/asm/bitops.h | 40 +++++++++++++++++++++++++++++++++ > 1 file changed, 40 insertions(+) > > diff --git a/arch/riscv/include/asm/bitops.h b/arch/riscv/include/asm/bitops.h > index 35f1368b83..2f2994c4dd 100644 > --- a/arch/riscv/include/asm/bitops.h > +++ b/arch/riscv/include/asm/bitops.h > @@ -138,6 +138,43 @@ static inline unsigned long ffz(unsigned long word) > return k; > } > > +static inline int find_next_zero_bit(void *addr, int size, int offset) > +{ > + unsigned long *p = ((unsigned long *)addr) + (offset / BITS_PER_LONG); > + unsigned long result = offset & ~(BITS_PER_LONG - 1); > + unsigned long tmp; > + > + if (offset >= size) > + return size; > + size -= result; > + offset &= (BITS_PER_LONG - 1); > + if (offset) { > + tmp = *(p++); > + tmp |= ~0UL >> (BITS_PER_LONG - offset); > + if (size < BITS_PER_LONG) > + goto found_first; > + if (~tmp) > + goto found_middle; > + size -= BITS_PER_LONG; > + result += BITS_PER_LONG; > + } > + while (size & ~(BITS_PER_LONG - 1)) { > + tmp = *(p++); > + if (~tmp) > + goto found_middle; > + result += BITS_PER_LONG; > + size -= BITS_PER_LONG; > + } > + if (!size) > + return result; > + tmp = *p; > + > +found_first: > + tmp |= ~0UL << size; > +found_middle: > + return result + ffz(tmp); > +} > + > /* > * ffs: find first bit set. This is defined the same way as > * the libc and compiler builtin ffs routines, therefore > @@ -158,6 +195,9 @@ static inline unsigned long ffz(unsigned long word) > #define hweight16(x) generic_hweight16(x) > #define hweight8(x) generic_hweight8(x) > > +#define find_first_zero_bit(addr, size) \ > + find_next_zero_bit((addr), (size), 0) > + > #define test_and_set_bit __test_and_set_bit > #define test_and_clear_bit __test_and_clear_bit > > -- > 2.45.2 > -E

