All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v4 01/16] include: Add log2 header from the kernel
@ 2015-10-26 16:11 Fabio Estevam
  2015-10-26 16:11 ` [U-Boot] [PATCH v4 02/16] include: Add generic bitops headers Fabio Estevam
                   ` (15 more replies)
  0 siblings, 16 replies; 37+ messages in thread
From: Fabio Estevam @ 2015-10-26 16:11 UTC (permalink / raw)
  To: u-boot

Use the log2 header files from the kernel.

Imported from kernel 4.2.3.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
Reviewed-by: Heiko Schocher <hs@denx.de>
---
Changes since v3:
- None

 include/linux/log2.h | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 205 insertions(+)
 create mode 100644 include/linux/log2.h

diff --git a/include/linux/log2.h b/include/linux/log2.h
new file mode 100644
index 0000000..aa1de63
--- /dev/null
+++ b/include/linux/log2.h
@@ -0,0 +1,205 @@
+/* Integer base 2 logarithm calculation
+ *
+ * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells at redhat.com)
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _LINUX_LOG2_H
+#define _LINUX_LOG2_H
+
+#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
+ *   more efficiently than using fls() and fls64()
+ * - the arch is not required to handle n==0 if implementing the fallback
+ */
+#ifndef CONFIG_ARCH_HAS_ILOG2_U32
+static inline __attribute__((const))
+int __ilog2_u32(u32 n)
+{
+	return fls(n) - 1;
+}
+#endif
+
+#ifndef CONFIG_ARCH_HAS_ILOG2_U64
+static inline __attribute__((const))
+int __ilog2_u64(u64 n)
+{
+	return fls64(n) - 1;
+}
+#endif
+
+/*
+ *  Determine whether some value is a power of two, where zero is
+ * *not* considered a power of two.
+ */
+
+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
+ */
+static inline __attribute__((const))
+unsigned long __roundup_pow_of_two(unsigned long n)
+{
+	return 1UL << fls_long(n - 1);
+}
+
+/*
+ * round down to nearest power of two
+ */
+static inline __attribute__((const))
+unsigned long __rounddown_pow_of_two(unsigned long n)
+{
+	return 1UL << (fls_long(n) - 1);
+}
+
+/**
+ * ilog2 - log of 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
+ *
+ * selects the appropriately-sized optimised version depending on sizeof(n)
+ */
+#define ilog2(n)				\
+(						\
+	__builtin_constant_p(n) ? (		\
+		(n) < 1 ? ____ilog2_NaN() :	\
+		(n) & (1ULL << 63) ? 63 :	\
+		(n) & (1ULL << 62) ? 62 :	\
+		(n) & (1ULL << 61) ? 61 :	\
+		(n) & (1ULL << 60) ? 60 :	\
+		(n) & (1ULL << 59) ? 59 :	\
+		(n) & (1ULL << 58) ? 58 :	\
+		(n) & (1ULL << 57) ? 57 :	\
+		(n) & (1ULL << 56) ? 56 :	\
+		(n) & (1ULL << 55) ? 55 :	\
+		(n) & (1ULL << 54) ? 54 :	\
+		(n) & (1ULL << 53) ? 53 :	\
+		(n) & (1ULL << 52) ? 52 :	\
+		(n) & (1ULL << 51) ? 51 :	\
+		(n) & (1ULL << 50) ? 50 :	\
+		(n) & (1ULL << 49) ? 49 :	\
+		(n) & (1ULL << 48) ? 48 :	\
+		(n) & (1ULL << 47) ? 47 :	\
+		(n) & (1ULL << 46) ? 46 :	\
+		(n) & (1ULL << 45) ? 45 :	\
+		(n) & (1ULL << 44) ? 44 :	\
+		(n) & (1ULL << 43) ? 43 :	\
+		(n) & (1ULL << 42) ? 42 :	\
+		(n) & (1ULL << 41) ? 41 :	\
+		(n) & (1ULL << 40) ? 40 :	\
+		(n) & (1ULL << 39) ? 39 :	\
+		(n) & (1ULL << 38) ? 38 :	\
+		(n) & (1ULL << 37) ? 37 :	\
+		(n) & (1ULL << 36) ? 36 :	\
+		(n) & (1ULL << 35) ? 35 :	\
+		(n) & (1ULL << 34) ? 34 :	\
+		(n) & (1ULL << 33) ? 33 :	\
+		(n) & (1ULL << 32) ? 32 :	\
+		(n) & (1ULL << 31) ? 31 :	\
+		(n) & (1ULL << 30) ? 30 :	\
+		(n) & (1ULL << 29) ? 29 :	\
+		(n) & (1ULL << 28) ? 28 :	\
+		(n) & (1ULL << 27) ? 27 :	\
+		(n) & (1ULL << 26) ? 26 :	\
+		(n) & (1ULL << 25) ? 25 :	\
+		(n) & (1ULL << 24) ? 24 :	\
+		(n) & (1ULL << 23) ? 23 :	\
+		(n) & (1ULL << 22) ? 22 :	\
+		(n) & (1ULL << 21) ? 21 :	\
+		(n) & (1ULL << 20) ? 20 :	\
+		(n) & (1ULL << 19) ? 19 :	\
+		(n) & (1ULL << 18) ? 18 :	\
+		(n) & (1ULL << 17) ? 17 :	\
+		(n) & (1ULL << 16) ? 16 :	\
+		(n) & (1ULL << 15) ? 15 :	\
+		(n) & (1ULL << 14) ? 14 :	\
+		(n) & (1ULL << 13) ? 13 :	\
+		(n) & (1ULL << 12) ? 12 :	\
+		(n) & (1ULL << 11) ? 11 :	\
+		(n) & (1ULL << 10) ? 10 :	\
+		(n) & (1ULL <<  9) ?  9 :	\
+		(n) & (1ULL <<  8) ?  8 :	\
+		(n) & (1ULL <<  7) ?  7 :	\
+		(n) & (1ULL <<  6) ?  6 :	\
+		(n) & (1ULL <<  5) ?  5 :	\
+		(n) & (1ULL <<  4) ?  4 :	\
+		(n) & (1ULL <<  3) ?  3 :	\
+		(n) & (1ULL <<  2) ?  2 :	\
+		(n) & (1ULL <<  1) ?  1 :	\
+		(n) & (1ULL <<  0) ?  0 :	\
+		____ilog2_NaN()			\
+				   ) :		\
+	(sizeof(n) <= 4) ?			\
+	__ilog2_u32(n) :			\
+	__ilog2_u64(n)				\
+ )
+
+/**
+ * roundup_pow_of_two - round the given value up to nearest power of two
+ * @n - parameter
+ *
+ * round the given value up to the nearest power of two
+ * - the result is undefined when n == 0
+ * - this can be used to initialise global variables from constant data
+ */
+#define roundup_pow_of_two(n)			\
+(						\
+	__builtin_constant_p(n) ? (		\
+		(n == 1) ? 1 :			\
+		(1UL << (ilog2((n) - 1) + 1))	\
+				   ) :		\
+	__roundup_pow_of_two(n)			\
+ )
+
+/**
+ * rounddown_pow_of_two - round the given value down to nearest power of two
+ * @n - parameter
+ *
+ * round the given value down to the nearest power of two
+ * - the result is undefined when n == 0
+ * - this can be used to initialise global variables from constant data
+ */
+#define rounddown_pow_of_two(n)			\
+(						\
+	__builtin_constant_p(n) ? (		\
+		(1UL << ilog2(n))) :		\
+	__rounddown_pow_of_two(n)		\
+ )
+
+/**
+ * order_base_2 - calculate the (rounded up) base 2 order of the argument
+ * @n: parameter
+ *
+ * The first few values calculated by this routine:
+ *  ob2(0) = 0
+ *  ob2(1) = 0
+ *  ob2(2) = 1
+ *  ob2(3) = 2
+ *  ob2(4) = 2
+ *  ob2(5) = 3
+ *  ... and so on.
+ */
+
+#define order_base_2(n) ilog2(roundup_pow_of_two(n))
+
+#endif /* _LINUX_LOG2_H */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 37+ messages in thread

end of thread, other threads:[~2015-11-03  0:28 UTC | newest]

Thread overview: 37+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-26 16:11 [U-Boot] [PATCH v4 01/16] include: Add log2 header from the kernel Fabio Estevam
2015-10-26 16:11 ` [U-Boot] [PATCH v4 02/16] include: Add generic bitops headers Fabio Estevam
2015-10-30  6:10   ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 03/16] ARM: bitops: Use the " Fabio Estevam
2015-10-30  6:11   ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 04/16] x86: " Fabio Estevam
2015-10-30  6:13   ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 05/16] m68k: " Fabio Estevam
2015-10-30  6:15   ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 06/16] blackfin: " Fabio Estevam
2015-10-30  6:16   ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 07/16] sh: " Fabio Estevam
2015-10-30  6:18   ` Jagan Teki
2015-10-30 14:55     ` Fabio Estevam
2015-10-26 16:11 ` [U-Boot] [PATCH v4 08/16] sandbox: " Fabio Estevam
2015-10-30  6:19   ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 09/16] sparc: " Fabio Estevam
2015-10-30  6:20   ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 10/16] openrisc: " Fabio Estevam
2015-10-30  6:23   ` Jagan Teki
2015-10-30 11:35     ` Fabio Estevam
2015-10-26 16:11 ` [U-Boot] [PATCH v4 11/16] nds32: " Fabio Estevam
2015-10-26 16:11 ` [U-Boot] [PATCH v4 12/16] nios2: " Fabio Estevam
2015-10-27  2:52   ` Thomas Chou
2015-10-30  6:24     ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 13/16] compat: Remove is_power_of_2() definition Fabio Estevam
2015-10-30  6:26   ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 14/16] powerpc: Remove __ilog2_u64 and ffs4 from bitops Fabio Estevam
2015-10-30  6:27   ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 15/16] spi: sf_ops: Add SPI protection mechanism from the kernel Fabio Estevam
2015-10-30 16:29   ` Jagan Teki
2015-10-26 16:11 ` [U-Boot] [PATCH v4 16/16] spi: Add SPI NOR protection mechanism Fabio Estevam
2015-10-30 16:28   ` Jagan Teki
2015-10-30 16:51     ` Fabio Estevam
2015-10-30 18:23       ` Jagan Teki
2015-11-03  0:28         ` Fabio Estevam
2015-10-30  6:08 ` [U-Boot] [PATCH v4 01/16] include: Add log2 header from the kernel Jagan Teki

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.