[U-Boot] [PATCH v7 02/21] include: Add generic bitops headers

York Sun yorksun at freescale.com
Tue Dec 1 18:26:59 CET 2015



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 <fabio.estevam at freescale.com>
> ---
> 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
> 

<snip>

> 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 <asm/types.h>
> +
> +/**
> + * __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



More information about the U-Boot mailing list