include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
#ifndef _LINUX_KERNEL_H
|
|
|
|
#define _LINUX_KERNEL_H
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
2019-11-13 00:44:51 +00:00
|
|
|
#include <linux/printk.h> /* for printf/pr_* utilities */
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
|
2014-11-06 18:03:29 +00:00
|
|
|
#define USHRT_MAX ((u16)(~0U))
|
|
|
|
#define SHRT_MAX ((s16)(USHRT_MAX>>1))
|
|
|
|
#define SHRT_MIN ((s16)(-SHRT_MAX - 1))
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
#define INT_MAX ((int)(~0U>>1))
|
|
|
|
#define INT_MIN (-INT_MAX - 1)
|
2014-11-06 18:03:29 +00:00
|
|
|
#define UINT_MAX (~0U)
|
|
|
|
#define LONG_MAX ((long)(~0UL>>1))
|
|
|
|
#define LONG_MIN (-LONG_MAX - 1)
|
|
|
|
#define ULONG_MAX (~0UL)
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
#define LLONG_MAX ((long long)(~0ULL>>1))
|
2014-11-06 18:03:29 +00:00
|
|
|
#define LLONG_MIN (-LLONG_MAX - 1)
|
|
|
|
#define ULLONG_MAX (~0ULL)
|
2014-11-25 04:18:21 +00:00
|
|
|
#ifndef SIZE_MAX
|
2014-11-06 18:03:29 +00:00
|
|
|
#define SIZE_MAX (~(size_t)0)
|
2014-11-25 04:18:21 +00:00
|
|
|
#endif
|
2020-08-23 07:54:44 +00:00
|
|
|
#ifndef SSIZE_MAX
|
|
|
|
#define SSIZE_MAX ((ssize_t)(SIZE_MAX >> 1))
|
|
|
|
#endif
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
|
|
|
|
#define U8_MAX ((u8)~0U)
|
2014-11-06 18:03:29 +00:00
|
|
|
#define S8_MAX ((s8)(U8_MAX>>1))
|
|
|
|
#define S8_MIN ((s8)(-S8_MAX - 1))
|
|
|
|
#define U16_MAX ((u16)~0U)
|
|
|
|
#define S16_MAX ((s16)(U16_MAX>>1))
|
|
|
|
#define S16_MIN ((s16)(-S16_MAX - 1))
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
#define U32_MAX ((u32)~0U)
|
2014-11-06 18:03:29 +00:00
|
|
|
#define S32_MAX ((s32)(U32_MAX>>1))
|
|
|
|
#define S32_MIN ((s32)(-S32_MAX - 1))
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
#define U64_MAX ((u64)~0ULL)
|
2014-11-06 18:03:29 +00:00
|
|
|
#define S64_MAX ((s64)(U64_MAX>>1))
|
|
|
|
#define S64_MIN ((s64)(-S64_MAX - 1))
|
|
|
|
|
2018-11-24 04:29:42 +00:00
|
|
|
/* Aliases defined by stdint.h */
|
|
|
|
#define UINT32_MAX U32_MAX
|
|
|
|
#define UINT64_MAX U64_MAX
|
|
|
|
|
2019-10-27 15:47:39 +00:00
|
|
|
#define INT32_MAX S32_MAX
|
|
|
|
|
2014-11-06 18:03:29 +00:00
|
|
|
#define STACK_MAGIC 0xdeadbeef
|
|
|
|
|
|
|
|
#define REPEAT_BYTE(x) ((~0ul / 0xff) * (x))
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
|
|
|
|
#define ALIGN(x,a) __ALIGN_MASK((x),(typeof(x))(a)-1)
|
2017-12-21 04:51:46 +00:00
|
|
|
#define ALIGN_DOWN(x, a) ALIGN((x) - ((a) - 1), (a))
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
|
2014-11-06 18:03:29 +00:00
|
|
|
#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a)))
|
|
|
|
#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0)
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
|
|
|
|
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This looks more complex than it should be. But we need to
|
|
|
|
* get the type for the ~ right in round_down (it needs to be
|
|
|
|
* as wide as the result!), and we want to evaluate the macro
|
|
|
|
* arguments just once each.
|
|
|
|
*/
|
|
|
|
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
|
|
|
|
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
|
|
|
|
#define round_down(x, y) ((x) & ~__round_mask(x, y))
|
|
|
|
|
2014-11-06 18:03:29 +00:00
|
|
|
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
|
|
|
|
|
2017-09-13 10:16:44 +00:00
|
|
|
#define DIV_ROUND_DOWN_ULL(ll, d) \
|
|
|
|
({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; })
|
|
|
|
|
|
|
|
#define DIV_ROUND_UP_ULL(ll, d) DIV_ROUND_DOWN_ULL((ll) + (d) - 1, (d))
|
|
|
|
|
2019-12-28 17:45:09 +00:00
|
|
|
#define ROUND(a, b) (((a) + (b) - 1) & ~((b) - 1))
|
|
|
|
|
2014-11-06 18:03:29 +00:00
|
|
|
#if BITS_PER_LONG == 32
|
|
|
|
# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d)
|
|
|
|
#else
|
|
|
|
# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d)
|
|
|
|
#endif
|
|
|
|
|
2014-11-06 18:03:30 +00:00
|
|
|
/* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */
|
|
|
|
#define roundup(x, y) ( \
|
|
|
|
{ \
|
|
|
|
const typeof(y) __y = y; \
|
|
|
|
(((x) + (__y - 1)) / __y) * __y; \
|
|
|
|
} \
|
|
|
|
)
|
2014-11-06 18:03:29 +00:00
|
|
|
#define rounddown(x, y) ( \
|
|
|
|
{ \
|
|
|
|
typeof(x) __x = (x); \
|
|
|
|
__x - (__x % (y)); \
|
|
|
|
} \
|
|
|
|
)
|
|
|
|
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
/*
|
|
|
|
* Divide positive or negative dividend by positive divisor and round
|
|
|
|
* to closest integer. Result is undefined for negative divisors and
|
|
|
|
* for negative dividends if the divisor variable type is unsigned.
|
|
|
|
*/
|
|
|
|
#define DIV_ROUND_CLOSEST(x, divisor)( \
|
|
|
|
{ \
|
|
|
|
typeof(x) __x = x; \
|
|
|
|
typeof(divisor) __d = divisor; \
|
|
|
|
(((typeof(x))-1) > 0 || \
|
|
|
|
((typeof(divisor))-1) > 0 || (__x) > 0) ? \
|
|
|
|
(((__x) + ((__d) / 2)) / (__d)) : \
|
|
|
|
(((__x) - ((__d) / 2)) / (__d)); \
|
|
|
|
} \
|
|
|
|
)
|
2018-12-19 11:03:16 +00:00
|
|
|
/*
|
|
|
|
* Same as above but for u64 dividends. divisor must be a 32-bit
|
|
|
|
* number.
|
|
|
|
*/
|
|
|
|
#define DIV_ROUND_CLOSEST_ULL(x, divisor)( \
|
|
|
|
{ \
|
|
|
|
typeof(divisor) __d = divisor; \
|
|
|
|
unsigned long long _tmp = (x) + (__d) / 2; \
|
|
|
|
do_div(_tmp, __d); \
|
|
|
|
_tmp; \
|
|
|
|
} \
|
|
|
|
)
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Multiplies an integer by a fraction, while avoiding unnecessary
|
|
|
|
* overflow or loss of precision.
|
|
|
|
*/
|
|
|
|
#define mult_frac(x, numer, denom)( \
|
|
|
|
{ \
|
|
|
|
typeof(x) quot = (x) / (denom); \
|
|
|
|
typeof(x) rem = (x) % (denom); \
|
|
|
|
(quot * (numer)) + ((rem * (numer)) / (denom)); \
|
|
|
|
} \
|
|
|
|
)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* upper_32_bits - return bits 32-63 of a number
|
|
|
|
* @n: the number we're accessing
|
|
|
|
*
|
|
|
|
* A basic shift-right of a 64- or 32-bit quantity. Use this to suppress
|
|
|
|
* the "right shift count >= width of type" warning when that quantity is
|
|
|
|
* 32-bits.
|
|
|
|
*/
|
|
|
|
#define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
|
|
|
|
|
|
|
|
/**
|
|
|
|
* lower_32_bits - return bits 0-31 of a number
|
|
|
|
* @n: the number we're accessing
|
|
|
|
*/
|
|
|
|
#define lower_32_bits(n) ((u32)(n))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* abs() handles unsigned and signed longs, ints, shorts and chars. For all
|
|
|
|
* input types abs() returns a signed long.
|
|
|
|
* abs() should not be used for 64-bit types (s64, u64, long long) - use abs64()
|
|
|
|
* for those.
|
|
|
|
*/
|
|
|
|
#define abs(x) ({ \
|
|
|
|
long ret; \
|
|
|
|
if (sizeof(x) == sizeof(long)) { \
|
|
|
|
long __x = (x); \
|
|
|
|
ret = (__x < 0) ? -__x : __x; \
|
|
|
|
} else { \
|
|
|
|
int __x = (x); \
|
|
|
|
ret = (__x < 0) ? -__x : __x; \
|
|
|
|
} \
|
|
|
|
ret; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define abs64(x) ({ \
|
|
|
|
s64 __x = (x); \
|
|
|
|
(__x < 0) ? -__x : __x; \
|
|
|
|
})
|
|
|
|
|
|
|
|
/*
|
|
|
|
* min()/max()/clamp() macros that also do
|
|
|
|
* strict type-checking.. See the
|
|
|
|
* "unnecessary" pointer comparison.
|
|
|
|
*/
|
|
|
|
#define min(x, y) ({ \
|
|
|
|
typeof(x) _min1 = (x); \
|
|
|
|
typeof(y) _min2 = (y); \
|
linux/kernel.h: sync min, max, min3, max3 macros with Linux
U-Boot has never cared about the type when we get max/min of two
values, but Linux Kernel does. This commit gets min, max, min3, max3
macros synced with the kernel introducing type checks.
Many of references of those macros must be fixed to suppress warnings.
We have two options:
- Use min, max, min3, max3 only when the arguments have the same type
(or add casts to the arguments)
- Use min_t/max_t instead with the appropriate type for the first
argument
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
Acked-by: Pavel Machek <pavel@denx.de>
Acked-by: Lukasz Majewski <l.majewski@samsung.com>
Tested-by: Lukasz Majewski <l.majewski@samsung.com>
[trini: Fixup arch/blackfin/lib/string.c]
Signed-off-by: Tom Rini <trini@ti.com>
2014-11-06 18:03:31 +00:00
|
|
|
(void) (&_min1 == &_min2); \
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
_min1 < _min2 ? _min1 : _min2; })
|
|
|
|
|
|
|
|
#define max(x, y) ({ \
|
|
|
|
typeof(x) _max1 = (x); \
|
|
|
|
typeof(y) _max2 = (y); \
|
linux/kernel.h: sync min, max, min3, max3 macros with Linux
U-Boot has never cared about the type when we get max/min of two
values, but Linux Kernel does. This commit gets min, max, min3, max3
macros synced with the kernel introducing type checks.
Many of references of those macros must be fixed to suppress warnings.
We have two options:
- Use min, max, min3, max3 only when the arguments have the same type
(or add casts to the arguments)
- Use min_t/max_t instead with the appropriate type for the first
argument
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
Acked-by: Pavel Machek <pavel@denx.de>
Acked-by: Lukasz Majewski <l.majewski@samsung.com>
Tested-by: Lukasz Majewski <l.majewski@samsung.com>
[trini: Fixup arch/blackfin/lib/string.c]
Signed-off-by: Tom Rini <trini@ti.com>
2014-11-06 18:03:31 +00:00
|
|
|
(void) (&_max1 == &_max2); \
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
_max1 > _max2 ? _max1 : _max2; })
|
|
|
|
|
linux/kernel.h: sync min, max, min3, max3 macros with Linux
U-Boot has never cared about the type when we get max/min of two
values, but Linux Kernel does. This commit gets min, max, min3, max3
macros synced with the kernel introducing type checks.
Many of references of those macros must be fixed to suppress warnings.
We have two options:
- Use min, max, min3, max3 only when the arguments have the same type
(or add casts to the arguments)
- Use min_t/max_t instead with the appropriate type for the first
argument
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
Acked-by: Pavel Machek <pavel@denx.de>
Acked-by: Lukasz Majewski <l.majewski@samsung.com>
Tested-by: Lukasz Majewski <l.majewski@samsung.com>
[trini: Fixup arch/blackfin/lib/string.c]
Signed-off-by: Tom Rini <trini@ti.com>
2014-11-06 18:03:31 +00:00
|
|
|
#define min3(x, y, z) min((typeof(x))min(x, y), z)
|
|
|
|
#define max3(x, y, z) max((typeof(x))max(x, y), z)
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
|
2014-11-06 18:03:29 +00:00
|
|
|
/**
|
|
|
|
* min_not_zero - return the minimum that is _not_ zero, unless both are zero
|
|
|
|
* @x: value1
|
|
|
|
* @y: value2
|
|
|
|
*/
|
|
|
|
#define min_not_zero(x, y) ({ \
|
|
|
|
typeof(x) __x = (x); \
|
|
|
|
typeof(y) __y = (y); \
|
|
|
|
__x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); })
|
|
|
|
|
|
|
|
/**
|
|
|
|
* clamp - return a value clamped to a given range with strict typechecking
|
|
|
|
* @val: current value
|
|
|
|
* @lo: lowest allowable value
|
|
|
|
* @hi: highest allowable value
|
|
|
|
*
|
|
|
|
* This macro does strict typechecking of lo/hi to make sure they are of the
|
|
|
|
* same type as val. See the unnecessary pointer comparisons.
|
|
|
|
*/
|
|
|
|
#define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
|
|
|
|
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
/*
|
|
|
|
* ..and if you can't take the strict
|
|
|
|
* types, you can specify one yourself.
|
|
|
|
*
|
|
|
|
* Or not use min/max/clamp at all, of course.
|
|
|
|
*/
|
|
|
|
#define min_t(type, x, y) ({ \
|
|
|
|
type __min1 = (x); \
|
|
|
|
type __min2 = (y); \
|
|
|
|
__min1 < __min2 ? __min1: __min2; })
|
|
|
|
|
|
|
|
#define max_t(type, x, y) ({ \
|
|
|
|
type __max1 = (x); \
|
|
|
|
type __max2 = (y); \
|
|
|
|
__max1 > __max2 ? __max1: __max2; })
|
|
|
|
|
2014-11-06 18:03:29 +00:00
|
|
|
/**
|
|
|
|
* clamp_t - return a value clamped to a given range using a given type
|
|
|
|
* @type: the type of variable to use
|
|
|
|
* @val: current value
|
|
|
|
* @lo: minimum allowable value
|
|
|
|
* @hi: maximum allowable value
|
|
|
|
*
|
|
|
|
* This macro does no typechecking and uses temporary variables of type
|
|
|
|
* 'type' to make all the comparisons.
|
|
|
|
*/
|
|
|
|
#define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* clamp_val - return a value clamped to a given range using val's type
|
|
|
|
* @val: current value
|
|
|
|
* @lo: minimum allowable value
|
|
|
|
* @hi: maximum allowable value
|
|
|
|
*
|
|
|
|
* This macro does no typechecking and uses temporary variables of whatever
|
|
|
|
* type the input argument 'val' is. This is useful when val is an unsigned
|
|
|
|
* type and min and max are literals that will otherwise be assigned a signed
|
|
|
|
* integer type.
|
|
|
|
*/
|
|
|
|
#define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi)
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* swap - swap value of @a and @b
|
|
|
|
*/
|
|
|
|
#define swap(a, b) \
|
|
|
|
do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
|
|
|
|
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
/**
|
|
|
|
* container_of - cast a member of a structure out to the containing structure
|
|
|
|
* @ptr: the pointer to the member.
|
|
|
|
* @type: the type of the container struct this is embedded in.
|
|
|
|
* @member: the name of the member within the struct.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
#define container_of(ptr, type, member) ({ \
|
|
|
|
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
|
|
|
(type *)( (char *)__mptr - offsetof(type,member) );})
|
|
|
|
|
2019-12-28 17:45:08 +00:00
|
|
|
/*
|
|
|
|
* check_member() - Check the offset of a structure member
|
|
|
|
*
|
|
|
|
* @structure: Name of structure (e.g. global_data)
|
|
|
|
* @member: Name of member (e.g. baudrate)
|
|
|
|
* @offset: Expected offset in bytes
|
|
|
|
*/
|
|
|
|
#define check_member(structure, member, offset) _Static_assert( \
|
|
|
|
offsetof(struct structure, member) == (offset), \
|
|
|
|
"`struct " #structure "` offset for `" #member "` is not " #offset)
|
|
|
|
|
2023-03-19 21:23:43 +00:00
|
|
|
#define __find_closest(x, a, as, op) \
|
|
|
|
({ \
|
|
|
|
typeof(as) __fc_i, __fc_as = (as) - 1; \
|
|
|
|
typeof(x) __fc_x = (x); \
|
|
|
|
typeof(*a) const *__fc_a = (a); \
|
|
|
|
for (__fc_i = 0; __fc_i < __fc_as; __fc_i++) { \
|
|
|
|
if (__fc_x op DIV_ROUND_CLOSEST(__fc_a[__fc_i] + \
|
|
|
|
__fc_a[__fc_i + 1], 2)) \
|
|
|
|
break; \
|
|
|
|
} \
|
|
|
|
(__fc_i); \
|
|
|
|
})
|
|
|
|
|
|
|
|
/**
|
|
|
|
* find_closest - locate the closest element in a sorted array
|
|
|
|
* @x: The reference value.
|
|
|
|
* @a: The array in which to look for the closest element. Must be sorted
|
|
|
|
* in ascending order.
|
|
|
|
* @as: Size of 'a'.
|
|
|
|
*
|
|
|
|
* Returns the index of the element closest to 'x'.
|
|
|
|
*/
|
|
|
|
#define find_closest(x, a, as) __find_closest(x, a, as, <=)
|
|
|
|
|
include: move various macros to include/linux/kernel.h
U-Boot has imported various utility macros from Linux
scattering them to various places without consistency.
In include/common.h are min, max, min3, max3, ARRAY_SIZE, ALIGN,
container_of, DIV_ROUND_UP, etc.
In include/linux/compat.h are min_t, max_t, round_up, round_down,
etc.
We also have duplicated defines of min_t in some *.c files.
Moreover, we are suffering from too cluttered include/common.h.
This commit moves various macros that originate in
include/linux/kernel.h of Linux to their original position.
Note:
This commit simply moves the macros; the macros roundup,
min, max, min2, max3, ARRAY_SIZE are different
from those of Linux at this point.
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
2014-11-06 18:03:28 +00:00
|
|
|
#endif
|