aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/log2.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/include/linux/log2.h b/include/linux/log2.h
index 1b8a2c1cb0e3..c8cf5e8ef171 100644
--- a/include/linux/log2.h
+++ b/include/linux/log2.h
@@ -63,6 +63,15 @@ unsigned long __roundup_pow_of_two(unsigned long n)
63 return 1UL << fls_long(n - 1); 63 return 1UL << fls_long(n - 1);
64} 64}
65 65
66/*
67 * round down to nearest power of two
68 */
69static inline __attribute__((const))
70unsigned long __rounddown_pow_of_two(unsigned long n)
71{
72 return 1UL << (fls_long(n) - 1);
73}
74
66/** 75/**
67 * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value 76 * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
68 * @n - parameter 77 * @n - parameter
@@ -165,4 +174,20 @@ unsigned long __roundup_pow_of_two(unsigned long n)
165 __roundup_pow_of_two(n) \ 174 __roundup_pow_of_two(n) \
166 ) 175 )
167 176
177/**
178 * rounddown_pow_of_two - round the given value down to nearest power of two
179 * @n - parameter
180 *
181 * round the given value down to the nearest power of two
182 * - the result is undefined when n == 0
183 * - this can be used to initialise global variables from constant data
184 */
185#define rounddown_pow_of_two(n) \
186( \
187 __builtin_constant_p(n) ? ( \
188 (n == 1) ? 0 : \
189 (1UL << ilog2(n))) : \
190 __rounddown_pow_of_two(n) \
191 )
192
168#endif /* _LINUX_LOG2_H */ 193#endif /* _LINUX_LOG2_H */