1588064e6SVladimir Kondratyev /*-
2588064e6SVladimir Kondratyev * SPDX-License-Identifier: BSD-2-Clause
3588064e6SVladimir Kondratyev *
4588064e6SVladimir Kondratyev * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
5588064e6SVladimir Kondratyev * Copyright (c) 2014-2015 François Tigeot
6588064e6SVladimir Kondratyev * Copyright (c) 2016 Matt Macy <mmacy@FreeBSD.org>
7588064e6SVladimir Kondratyev * Copyright (c) 2019 Johannes Lundberg <johalun@FreeBSD.org>
8*afc450faSVladimir Kondratyev * Copyright (c) 2023 Serenity Cyber Security, LLC.
9588064e6SVladimir Kondratyev *
10588064e6SVladimir Kondratyev * Redistribution and use in source and binary forms, with or without
11588064e6SVladimir Kondratyev * modification, are permitted provided that the following conditions
12588064e6SVladimir Kondratyev * are met:
13588064e6SVladimir Kondratyev * 1. Redistributions of source code must retain the above copyright
14588064e6SVladimir Kondratyev * notice, this list of conditions and the following disclaimer.
15588064e6SVladimir Kondratyev * 2. Redistributions in binary form must reproduce the above copyright
16588064e6SVladimir Kondratyev * notice, this list of conditions and the following disclaimer in the
17588064e6SVladimir Kondratyev * documentation and/or other materials provided with the distribution.
18588064e6SVladimir Kondratyev *
19588064e6SVladimir Kondratyev * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20588064e6SVladimir Kondratyev * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21588064e6SVladimir Kondratyev * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22588064e6SVladimir Kondratyev * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23588064e6SVladimir Kondratyev * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24588064e6SVladimir Kondratyev * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25588064e6SVladimir Kondratyev * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26588064e6SVladimir Kondratyev * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27588064e6SVladimir Kondratyev * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28588064e6SVladimir Kondratyev * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29588064e6SVladimir Kondratyev * SUCH DAMAGE.
30588064e6SVladimir Kondratyev */
31588064e6SVladimir Kondratyev
32588064e6SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_MATH_H_
33588064e6SVladimir Kondratyev #define _LINUXKPI_LINUX_MATH_H_
34588064e6SVladimir Kondratyev
35588064e6SVladimir Kondratyev #include <linux/types.h>
36588064e6SVladimir Kondratyev
37588064e6SVladimir Kondratyev /*
38588064e6SVladimir Kondratyev * This looks more complex than it should be. But we need to
39588064e6SVladimir Kondratyev * get the type for the ~ right in round_down (it needs to be
40588064e6SVladimir Kondratyev * as wide as the result!), and we want to evaluate the macro
41588064e6SVladimir Kondratyev * arguments just once each.
42588064e6SVladimir Kondratyev */
43588064e6SVladimir Kondratyev #define __round_mask(x, y) ((__typeof__(x))((y)-1))
44588064e6SVladimir Kondratyev #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
45588064e6SVladimir Kondratyev #define round_down(x, y) ((x) & ~__round_mask(x, y))
46588064e6SVladimir Kondratyev
47588064e6SVladimir Kondratyev #define DIV_ROUND_UP(x, n) howmany(x, n)
48588064e6SVladimir Kondratyev #define DIV_ROUND_UP_ULL(x, n) DIV_ROUND_UP((unsigned long long)(x), (n))
49588064e6SVladimir Kondratyev #define DIV_ROUND_DOWN_ULL(x, n) (((unsigned long long)(x) / (n)) * (n))
50588064e6SVladimir Kondratyev
51588064e6SVladimir Kondratyev #define DIV_ROUND_CLOSEST(x, divisor) (((x) + ((divisor) / 2)) / (divisor))
52588064e6SVladimir Kondratyev #define DIV_ROUND_CLOSEST_ULL(x, divisor) ({ \
53588064e6SVladimir Kondratyev __typeof(divisor) __d = (divisor); \
54588064e6SVladimir Kondratyev unsigned long long __ret = (x) + (__d) / 2; \
55588064e6SVladimir Kondratyev __ret /= __d; \
56588064e6SVladimir Kondratyev __ret; \
57588064e6SVladimir Kondratyev })
58588064e6SVladimir Kondratyev
59*afc450faSVladimir Kondratyev #if defined(LINUXKPI_VERSION) && LINUXKPI_VERSION >= 60600
60*afc450faSVladimir Kondratyev #define abs_diff(x, y) ({ \
61*afc450faSVladimir Kondratyev __typeof(x) _x = (x); \
62*afc450faSVladimir Kondratyev __typeof(y) _y = (y); \
63*afc450faSVladimir Kondratyev _x > _y ? _x - _y : _y - _x; \
64*afc450faSVladimir Kondratyev })
65*afc450faSVladimir Kondratyev #endif
66*afc450faSVladimir Kondratyev
67588064e6SVladimir Kondratyev static inline uintmax_t
mult_frac(uintmax_t x,uintmax_t multiplier,uintmax_t divisor)68588064e6SVladimir Kondratyev mult_frac(uintmax_t x, uintmax_t multiplier, uintmax_t divisor)
69588064e6SVladimir Kondratyev {
70588064e6SVladimir Kondratyev uintmax_t q = (x / divisor);
71588064e6SVladimir Kondratyev uintmax_t r = (x % divisor);
72588064e6SVladimir Kondratyev
73588064e6SVladimir Kondratyev return ((q * multiplier) + ((r * multiplier) / divisor));
74588064e6SVladimir Kondratyev }
75588064e6SVladimir Kondratyev
76588064e6SVladimir Kondratyev #endif /* _LINUXKPI_LINUX_MATH_H_ */
77