All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heinrich Schuchardt <xypron.glpk@gmx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] Fwd: [PATCH 1/1] include: update log2 header from the Linux kernel
Date: Mon, 30 Apr 2018 11:35:16 +0200	[thread overview]
Message-ID: <b3d835bc-1cc1-81d4-b2a5-79ae4dc2180e@gmx.de> (raw)
In-Reply-To: <20180430070918.4193-1-xypron.glpk@gmx.de>

Cc: Fabio Estevam <fabio.estevam@nxp.com>
(Fabio Estevam <fabio.estevam@freescale.com> is not valid anymore)

On 04/30/2018 09:09 AM, Heinrich Schuchardt wrote:
> Without the patch gcc 8 produces:
> warning: ignoring attribute ‘noreturn’ because it conflicts with
> attribute ‘const’ [-Wattributes]
>  int ____ilog2_NaN(void);
> 
> So let's update the include from Linux kernel v4.16.
> 
> This removes static checks of ilog2() arguments.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
>  include/linux/log2.h | 63 +++++++++++++++++++++++++-------------------
>  1 file changed, 36 insertions(+), 27 deletions(-)
> 
> diff --git a/include/linux/log2.h b/include/linux/log2.h
> index aa1de63090..41a1ae0109 100644
> --- a/include/linux/log2.h
> +++ b/include/linux/log2.h
> @@ -3,7 +3,10 @@
>   * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
>   * Written by David Howells (dhowells at redhat.com)
>   *
> - * SPDX-License-Identifier:	GPL-2.0+
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version
> + * 2 of the License, or (at your option) any later version.
>   */
>  
>  #ifndef _LINUX_LOG2_H
> @@ -12,12 +15,6 @@
>  #include <linux/types.h>
>  #include <linux/bitops.h>
>  
> -/*
> - * deal with unrepresentable constant logarithms
> - */
> -extern __attribute__((const, noreturn))
> -int ____ilog2_NaN(void);
> -
>  /*
>   * non-constant log of base 2 calculators
>   * - the arch may override these in asm/bitops.h if they can be implemented
> @@ -40,19 +37,23 @@ int __ilog2_u64(u64 n)
>  }
>  #endif
>  
> -/*
> - *  Determine whether some value is a power of two, where zero is
> +/**
> + * is_power_of_2() - check if a value is a power of two
> + * @n: the value to check
> + *
> + * Determine whether some value is a power of two, where zero is
>   * *not* considered a power of two.
> + * Return: true if @n is a power of 2, otherwise false.
>   */
> -
>  static inline __attribute__((const))
>  bool is_power_of_2(unsigned long n)
>  {
>  	return (n != 0 && ((n & (n - 1)) == 0));
>  }
>  
> -/*
> - * round up to nearest power of two
> +/**
> + * __roundup_pow_of_two() - round up to nearest power of two
> + * @n: value to round up
>   */
>  static inline __attribute__((const))
>  unsigned long __roundup_pow_of_two(unsigned long n)
> @@ -60,8 +61,9 @@ unsigned long __roundup_pow_of_two(unsigned long n)
>  	return 1UL << fls_long(n - 1);
>  }
>  
> -/*
> - * round down to nearest power of two
> +/**
> + * __rounddown_pow_of_two() - round down to nearest power of two
> + * @n: value to round down
>   */
>  static inline __attribute__((const))
>  unsigned long __rounddown_pow_of_two(unsigned long n)
> @@ -70,19 +72,19 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  }
>  
>  /**
> - * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
> - * @n - parameter
> + * ilog2 - log base 2 of 32-bit or a 64-bit unsigned value
> + * @n: parameter
>   *
>   * constant-capable log of base 2 calculation
>   * - this can be used to initialise global variables from constant data, hence
> - *   the massive ternary operator construction
> + * the massive ternary operator construction
>   *
>   * selects the appropriately-sized optimised version depending on sizeof(n)
>   */
>  #define ilog2(n)				\
>  (						\
>  	__builtin_constant_p(n) ? (		\
> -		(n) < 1 ? ____ilog2_NaN() :	\
> +		(n) < 2 ? 0 :			\
>  		(n) & (1ULL << 63) ? 63 :	\
>  		(n) & (1ULL << 62) ? 62 :	\
>  		(n) & (1ULL << 61) ? 61 :	\
> @@ -145,10 +147,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  		(n) & (1ULL <<  4) ?  4 :	\
>  		(n) & (1ULL <<  3) ?  3 :	\
>  		(n) & (1ULL <<  2) ?  2 :	\
> -		(n) & (1ULL <<  1) ?  1 :	\
> -		(n) & (1ULL <<  0) ?  0 :	\
> -		____ilog2_NaN()			\
> -				   ) :		\
> +		1) :				\
>  	(sizeof(n) <= 4) ?			\
>  	__ilog2_u32(n) :			\
>  	__ilog2_u64(n)				\
> @@ -156,7 +155,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  
>  /**
>   * roundup_pow_of_two - round the given value up to nearest power of two
> - * @n - parameter
> + * @n: parameter
>   *
>   * round the given value up to the nearest power of two
>   * - the result is undefined when n == 0
> @@ -173,7 +172,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  
>  /**
>   * rounddown_pow_of_two - round the given value down to nearest power of two
> - * @n - parameter
> + * @n: parameter
>   *
>   * round the given value down to the nearest power of two
>   * - the result is undefined when n == 0
> @@ -186,6 +185,12 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  	__rounddown_pow_of_two(n)		\
>   )
>  
> +static inline __attribute_const__
> +int __order_base_2(unsigned long n)
> +{
> +	return n > 1 ? ilog2(n - 1) + 1 : 0;
> +}
> +
>  /**
>   * order_base_2 - calculate the (rounded up) base 2 order of the argument
>   * @n: parameter
> @@ -199,7 +204,11 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>   *  ob2(5) = 3
>   *  ... and so on.
>   */
> -
> -#define order_base_2(n) ilog2(roundup_pow_of_two(n))
> -
> +#define order_base_2(n)				\
> +(						\
> +	__builtin_constant_p(n) ? (		\
> +		((n) == 0 || (n) == 1) ? 0 :	\
> +		ilog2((n) - 1) + 1) :		\
> +	__order_base_2(n)			\
> +)
>  #endif /* _LINUX_LOG2_H */
> 

      reply	other threads:[~2018-04-30  9:35 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-30  7:09 [U-Boot] [PATCH 1/1] include: update log2 header from the Linux kernel Heinrich Schuchardt
2018-04-30  9:35 ` Heinrich Schuchardt [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b3d835bc-1cc1-81d4-b2a5-79ae4dc2180e@gmx.de \
    --to=xypron.glpk@gmx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.