1aa6159abSAndy Shevchenko /* SPDX-License-Identifier: GPL-2.0 */
2aa6159abSAndy Shevchenko #ifndef _LINUX_MATH_H
3aa6159abSAndy Shevchenko #define _LINUX_MATH_H
4aa6159abSAndy Shevchenko
5e820a337SAndy Shevchenko #include <linux/types.h>
6aa6159abSAndy Shevchenko #include <asm/div64.h>
7aa6159abSAndy Shevchenko #include <uapi/linux/kernel.h>
8aa6159abSAndy Shevchenko
9aa6159abSAndy Shevchenko /*
10aa6159abSAndy Shevchenko * This looks more complex than it should be. But we need to
11aa6159abSAndy Shevchenko * get the type for the ~ right in round_down (it needs to be
12aa6159abSAndy Shevchenko * as wide as the result!), and we want to evaluate the macro
13aa6159abSAndy Shevchenko * arguments just once each.
14aa6159abSAndy Shevchenko */
15aa6159abSAndy Shevchenko #define __round_mask(x, y) ((__typeof__(x))((y)-1))
16aa6159abSAndy Shevchenko
17aa6159abSAndy Shevchenko /**
18aa6159abSAndy Shevchenko * round_up - round up to next specified power of 2
19aa6159abSAndy Shevchenko * @x: the value to round
20aa6159abSAndy Shevchenko * @y: multiple to round up to (must be a power of 2)
21aa6159abSAndy Shevchenko *
22aa6159abSAndy Shevchenko * Rounds @x up to next multiple of @y (which must be a power of 2).
23aa6159abSAndy Shevchenko * To perform arbitrary rounding up, use roundup() below.
24aa6159abSAndy Shevchenko */
25aa6159abSAndy Shevchenko #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
26aa6159abSAndy Shevchenko
27aa6159abSAndy Shevchenko /**
28aa6159abSAndy Shevchenko * round_down - round down to next specified power of 2
29aa6159abSAndy Shevchenko * @x: the value to round
30aa6159abSAndy Shevchenko * @y: multiple to round down to (must be a power of 2)
31aa6159abSAndy Shevchenko *
32aa6159abSAndy Shevchenko * Rounds @x down to next multiple of @y (which must be a power of 2).
33aa6159abSAndy Shevchenko * To perform arbitrary rounding down, use rounddown() below.
34aa6159abSAndy Shevchenko */
35aa6159abSAndy Shevchenko #define round_down(x, y) ((x) & ~__round_mask(x, y))
36aa6159abSAndy Shevchenko
37*b16510a5SLukas Wunner /**
38*b16510a5SLukas Wunner * DIV_ROUND_UP_POW2 - divide and round up
39*b16510a5SLukas Wunner * @n: numerator
40*b16510a5SLukas Wunner * @d: denominator (must be a power of 2)
41*b16510a5SLukas Wunner *
42*b16510a5SLukas Wunner * Divides @n by @d and rounds up to next multiple of @d (which must be a power
43*b16510a5SLukas Wunner * of 2). Avoids integer overflows that may occur with __KERNEL_DIV_ROUND_UP().
44*b16510a5SLukas Wunner * Performance is roughly equivalent to __KERNEL_DIV_ROUND_UP().
45*b16510a5SLukas Wunner */
46*b16510a5SLukas Wunner #define DIV_ROUND_UP_POW2(n, d) \
47*b16510a5SLukas Wunner ((n) / (d) + !!((n) & ((d) - 1)))
48*b16510a5SLukas Wunner
49aa6159abSAndy Shevchenko #define DIV_ROUND_UP __KERNEL_DIV_ROUND_UP
50aa6159abSAndy Shevchenko
51aa6159abSAndy Shevchenko #define DIV_ROUND_DOWN_ULL(ll, d) \
52aa6159abSAndy Shevchenko ({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; })
53aa6159abSAndy Shevchenko
54aa6159abSAndy Shevchenko #define DIV_ROUND_UP_ULL(ll, d) \
55aa6159abSAndy Shevchenko DIV_ROUND_DOWN_ULL((unsigned long long)(ll) + (d) - 1, (d))
56aa6159abSAndy Shevchenko
57aa6159abSAndy Shevchenko #if BITS_PER_LONG == 32
58aa6159abSAndy Shevchenko # define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d)
59aa6159abSAndy Shevchenko #else
60aa6159abSAndy Shevchenko # define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d)
61aa6159abSAndy Shevchenko #endif
62aa6159abSAndy Shevchenko
63aa6159abSAndy Shevchenko /**
64aa6159abSAndy Shevchenko * roundup - round up to the next specified multiple
65aa6159abSAndy Shevchenko * @x: the value to up
66aa6159abSAndy Shevchenko * @y: multiple to round up to
67aa6159abSAndy Shevchenko *
68aa6159abSAndy Shevchenko * Rounds @x up to next multiple of @y. If @y will always be a power
69aa6159abSAndy Shevchenko * of 2, consider using the faster round_up().
70aa6159abSAndy Shevchenko */
71aa6159abSAndy Shevchenko #define roundup(x, y) ( \
72aa6159abSAndy Shevchenko { \
73aa6159abSAndy Shevchenko typeof(y) __y = y; \
74aa6159abSAndy Shevchenko (((x) + (__y - 1)) / __y) * __y; \
75aa6159abSAndy Shevchenko } \
76aa6159abSAndy Shevchenko )
77aa6159abSAndy Shevchenko /**
78aa6159abSAndy Shevchenko * rounddown - round down to next specified multiple
79aa6159abSAndy Shevchenko * @x: the value to round
80aa6159abSAndy Shevchenko * @y: multiple to round down to
81aa6159abSAndy Shevchenko *
82aa6159abSAndy Shevchenko * Rounds @x down to next multiple of @y. If @y will always be a power
83aa6159abSAndy Shevchenko * of 2, consider using the faster round_down().
84aa6159abSAndy Shevchenko */
85aa6159abSAndy Shevchenko #define rounddown(x, y) ( \
86aa6159abSAndy Shevchenko { \
87aa6159abSAndy Shevchenko typeof(x) __x = (x); \
88aa6159abSAndy Shevchenko __x - (__x % (y)); \
89aa6159abSAndy Shevchenko } \
90aa6159abSAndy Shevchenko )
91aa6159abSAndy Shevchenko
92aa6159abSAndy Shevchenko /*
93aa6159abSAndy Shevchenko * Divide positive or negative dividend by positive or negative divisor
94aa6159abSAndy Shevchenko * and round to closest integer. Result is undefined for negative
95aa6159abSAndy Shevchenko * divisors if the dividend variable type is unsigned and for negative
96aa6159abSAndy Shevchenko * dividends if the divisor variable type is unsigned.
97aa6159abSAndy Shevchenko */
98aa6159abSAndy Shevchenko #define DIV_ROUND_CLOSEST(x, divisor)( \
99aa6159abSAndy Shevchenko { \
100aa6159abSAndy Shevchenko typeof(x) __x = x; \
101aa6159abSAndy Shevchenko typeof(divisor) __d = divisor; \
102aa6159abSAndy Shevchenko (((typeof(x))-1) > 0 || \
103aa6159abSAndy Shevchenko ((typeof(divisor))-1) > 0 || \
104aa6159abSAndy Shevchenko (((__x) > 0) == ((__d) > 0))) ? \
105aa6159abSAndy Shevchenko (((__x) + ((__d) / 2)) / (__d)) : \
106aa6159abSAndy Shevchenko (((__x) - ((__d) / 2)) / (__d)); \
107aa6159abSAndy Shevchenko } \
108aa6159abSAndy Shevchenko )
109aa6159abSAndy Shevchenko /*
110aa6159abSAndy Shevchenko * Same as above but for u64 dividends. divisor must be a 32-bit
111aa6159abSAndy Shevchenko * number.
112aa6159abSAndy Shevchenko */
113aa6159abSAndy Shevchenko #define DIV_ROUND_CLOSEST_ULL(x, divisor)( \
114aa6159abSAndy Shevchenko { \
115aa6159abSAndy Shevchenko typeof(divisor) __d = divisor; \
116aa6159abSAndy Shevchenko unsigned long long _tmp = (x) + (__d) / 2; \
117aa6159abSAndy Shevchenko do_div(_tmp, __d); \
118aa6159abSAndy Shevchenko _tmp; \
119aa6159abSAndy Shevchenko } \
120aa6159abSAndy Shevchenko )
121aa6159abSAndy Shevchenko
122e820a337SAndy Shevchenko #define __STRUCT_FRACT(type) \
123e820a337SAndy Shevchenko struct type##_fract { \
124e820a337SAndy Shevchenko __##type numerator; \
125e820a337SAndy Shevchenko __##type denominator; \
126e820a337SAndy Shevchenko };
127e38a82dfSAngeloGioacchino Del Regno __STRUCT_FRACT(s8)
__STRUCT_FRACT(u8)128e38a82dfSAngeloGioacchino Del Regno __STRUCT_FRACT(u8)
129e820a337SAndy Shevchenko __STRUCT_FRACT(s16)
130e820a337SAndy Shevchenko __STRUCT_FRACT(u16)
131e820a337SAndy Shevchenko __STRUCT_FRACT(s32)
132e820a337SAndy Shevchenko __STRUCT_FRACT(u32)
133e820a337SAndy Shevchenko #undef __STRUCT_FRACT
134e820a337SAndy Shevchenko
135048a9883SAlexey Dobriyan /* Calculate "x * n / d" without unnecessary overflow or loss of precision. */
136048a9883SAlexey Dobriyan #define mult_frac(x, n, d) \
137048a9883SAlexey Dobriyan ({ \
138048a9883SAlexey Dobriyan typeof(x) x_ = (x); \
139048a9883SAlexey Dobriyan typeof(n) n_ = (n); \
140048a9883SAlexey Dobriyan typeof(d) d_ = (d); \
141048a9883SAlexey Dobriyan \
142048a9883SAlexey Dobriyan typeof(x_) q = x_ / d_; \
143048a9883SAlexey Dobriyan typeof(x_) r = x_ % d_; \
144048a9883SAlexey Dobriyan q * n_ + r * n_ / d_; \
145048a9883SAlexey Dobriyan })
146aa6159abSAndy Shevchenko
147aa6159abSAndy Shevchenko #define sector_div(a, b) do_div(a, b)
148aa6159abSAndy Shevchenko
149aa6159abSAndy Shevchenko /**
150aa6159abSAndy Shevchenko * abs - return absolute value of an argument
151aa6159abSAndy Shevchenko * @x: the value. If it is unsigned type, it is converted to signed type first.
152aa6159abSAndy Shevchenko * char is treated as if it was signed (regardless of whether it really is)
153aa6159abSAndy Shevchenko * but the macro's return type is preserved as char.
154aa6159abSAndy Shevchenko *
155aa6159abSAndy Shevchenko * Return: an absolute value of x.
156aa6159abSAndy Shevchenko */
157aa6159abSAndy Shevchenko #define abs(x) __abs_choose_expr(x, long long, \
158aa6159abSAndy Shevchenko __abs_choose_expr(x, long, \
159aa6159abSAndy Shevchenko __abs_choose_expr(x, int, \
160aa6159abSAndy Shevchenko __abs_choose_expr(x, short, \
161aa6159abSAndy Shevchenko __abs_choose_expr(x, char, \
162aa6159abSAndy Shevchenko __builtin_choose_expr( \
163aa6159abSAndy Shevchenko __builtin_types_compatible_p(typeof(x), char), \
164aa6159abSAndy Shevchenko (char)({ signed char __x = (x); __x<0?-__x:__x; }), \
165aa6159abSAndy Shevchenko ((void)0)))))))
166aa6159abSAndy Shevchenko
167aa6159abSAndy Shevchenko #define __abs_choose_expr(x, type, other) __builtin_choose_expr( \
168aa6159abSAndy Shevchenko __builtin_types_compatible_p(typeof(x), signed type) || \
169aa6159abSAndy Shevchenko __builtin_types_compatible_p(typeof(x), unsigned type), \
170aa6159abSAndy Shevchenko ({ signed type __x = (x); __x < 0 ? -__x : __x; }), other)
171aa6159abSAndy Shevchenko
172aa6159abSAndy Shevchenko /**
17346f12960SAndy Shevchenko * abs_diff - return absolute value of the difference between the arguments
17446f12960SAndy Shevchenko * @a: the first argument
17546f12960SAndy Shevchenko * @b: the second argument
17646f12960SAndy Shevchenko *
17746f12960SAndy Shevchenko * @a and @b have to be of the same type. With this restriction we compare
17846f12960SAndy Shevchenko * signed to signed and unsigned to unsigned. The result is the subtraction
17946f12960SAndy Shevchenko * the smaller of the two from the bigger, hence result is always a positive
18046f12960SAndy Shevchenko * value.
18146f12960SAndy Shevchenko *
18246f12960SAndy Shevchenko * Return: an absolute value of the difference between the @a and @b.
18346f12960SAndy Shevchenko */
18446f12960SAndy Shevchenko #define abs_diff(a, b) ({ \
18546f12960SAndy Shevchenko typeof(a) __a = (a); \
18646f12960SAndy Shevchenko typeof(b) __b = (b); \
18746f12960SAndy Shevchenko (void)(&__a == &__b); \
18846f12960SAndy Shevchenko __a > __b ? (__a - __b) : (__b - __a); \
18946f12960SAndy Shevchenko })
19046f12960SAndy Shevchenko
19146f12960SAndy Shevchenko /**
192aa6159abSAndy Shevchenko * reciprocal_scale - "scale" a value into range [0, ep_ro)
193aa6159abSAndy Shevchenko * @val: value
194aa6159abSAndy Shevchenko * @ep_ro: right open interval endpoint
195aa6159abSAndy Shevchenko *
196aa6159abSAndy Shevchenko * Perform a "reciprocal multiplication" in order to "scale" a value into
197aa6159abSAndy Shevchenko * range [0, @ep_ro), where the upper interval endpoint is right-open.
198aa6159abSAndy Shevchenko * This is useful, e.g. for accessing a index of an array containing
199aa6159abSAndy Shevchenko * @ep_ro elements, for example. Think of it as sort of modulus, only that
200aa6159abSAndy Shevchenko * the result isn't that of modulo. ;) Note that if initial input is a
201aa6159abSAndy Shevchenko * small value, then result will return 0.
202aa6159abSAndy Shevchenko *
203aa6159abSAndy Shevchenko * Return: a result based on @val in interval [0, @ep_ro).
204aa6159abSAndy Shevchenko */
205aa6159abSAndy Shevchenko static inline u32 reciprocal_scale(u32 val, u32 ep_ro)
206aa6159abSAndy Shevchenko {
207aa6159abSAndy Shevchenko return (u32)(((u64) val * ep_ro) >> 32);
208aa6159abSAndy Shevchenko }
209aa6159abSAndy Shevchenko
210aa6159abSAndy Shevchenko u64 int_pow(u64 base, unsigned int exp);
211aa6159abSAndy Shevchenko unsigned long int_sqrt(unsigned long);
212aa6159abSAndy Shevchenko
213aa6159abSAndy Shevchenko #if BITS_PER_LONG < 64
214aa6159abSAndy Shevchenko u32 int_sqrt64(u64 x);
215aa6159abSAndy Shevchenko #else
int_sqrt64(u64 x)216aa6159abSAndy Shevchenko static inline u32 int_sqrt64(u64 x)
217aa6159abSAndy Shevchenko {
218aa6159abSAndy Shevchenko return (u32)int_sqrt(x);
219aa6159abSAndy Shevchenko }
220aa6159abSAndy Shevchenko #endif
221aa6159abSAndy Shevchenko
222aa6159abSAndy Shevchenko #endif /* _LINUX_MATH_H */
223