From mboxrd@z Thu Jan 1 00:00:00 1970 From: York Sun Date: Tue, 1 Dec 2015 09:26:59 -0800 Subject: [U-Boot] [PATCH v7 02/21] include: Add generic bitops headers In-Reply-To: <1446734622-5100-2-git-send-email-fabio.estevam@freescale.com> References: <1446734622-5100-1-git-send-email-fabio.estevam@freescale.com> <1446734622-5100-2-git-send-email-fabio.estevam@freescale.com> Message-ID: <565DD863.5010703@freescale.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 11/05/2015 06:43 AM, Fabio Estevam wrote: > Use the generic bitops header files from the kernel. > > Imported from kernel 4.2.3. > > Signed-off-by: Fabio Estevam > --- > Changes since v6: > - Do not touch include/linux/bitops here to avoid build warnings (Daniel) > > include/asm-generic/bitops/__ffs.h | 43 ++++++++++++++++++++++++++++++++++++++ > include/asm-generic/bitops/__fls.h | 43 ++++++++++++++++++++++++++++++++++++++ > include/asm-generic/bitops/fls.h | 41 ++++++++++++++++++++++++++++++++++++ > include/asm-generic/bitops/fls64.h | 36 +++++++++++++++++++++++++++++++ > 4 files changed, 163 insertions(+) > create mode 100644 include/asm-generic/bitops/__ffs.h > create mode 100644 include/asm-generic/bitops/__fls.h > create mode 100644 include/asm-generic/bitops/fls.h > create mode 100644 include/asm-generic/bitops/fls64.h > > diff --git a/include/asm-generic/bitops/__fls.h b/include/asm-generic/bitops/__fls.h > new file mode 100644 > index 0000000..a60a7cc > --- /dev/null > +++ b/include/asm-generic/bitops/__fls.h > @@ -0,0 +1,43 @@ > +#ifndef _ASM_GENERIC_BITOPS___FLS_H_ > +#define _ASM_GENERIC_BITOPS___FLS_H_ > + > +#include > + > +/** > + * __fls - find last (most-significant) set bit in a long word > + * @word: the word to search > + * > + * Undefined if no set bit exists, so code should check against 0 first. > + */ > +static __always_inline unsigned long __fls(unsigned long word) > +{ > + int num = BITS_PER_LONG - 1; > + > +#if BITS_PER_LONG == 64 > + if (!(word & (~0ul << 32))) { > + num -= 32; > + word <<= 32; > + } > +#endif > + if (!(word & (~0ul << (BITS_PER_LONG-16)))) { > + num -= 16; > + word <<= 16; > + } > + if (!(word & (~0ul << (BITS_PER_LONG-8)))) { > + num -= 8; > + word <<= 8; > + } > + if (!(word & (~0ul << (BITS_PER_LONG-4)))) { > + num -= 4; > + word <<= 4; > + } > + if (!(word & (~0ul << (BITS_PER_LONG-2)))) { > + num -= 2; > + word <<= 2; > + } > + if (!(word & (~0ul << (BITS_PER_LONG-1)))) > + num -= 1; > + return num; > +} Sorry for catching this late. All above left shift causes compiling warning on 32-bit host (ubuntu 12.04 with gcc 4.6.3) include/asm-generic/bitops/__fls.h:17:2: warning: left shift count >= width of type [enabled by default] The root cause may be in include/configs/sandbox.h #define CONFIG_SANDBOX_BITS_PER_LONG 64 York