2020-08-28 22:38:05 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d)-1) / (d))
|
|
|
|
#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a)-1)
|
|
|
|
#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask))
|
|
|
|
|
|
|
|
/* @a is a power of 2 value */
|
|
|
|
#define ALIGN(x, a) __ALIGN_KERNEL((x), (a))
|
|
|
|
#define ALIGN_DOWN(x, a) __ALIGN_KERNEL((x) - ((a)-1), (a))
|
|
|
|
#define __ALIGN_MASK(x, mask) __ALIGN_KERNEL_MASK((x), (mask))
|
|
|
|
#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a)))
|
|
|
|
#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a)-1)) == 0)
|
|
|
|
|
2021-10-03 23:19:00 +02:00
|
|
|
|
|
|
|
#ifdef __CHECKER__
|
|
|
|
#define BUILD_BUG_ON_ZERO(e) (0)
|
|
|
|
#else /* __CHECKER__ */
|
|
|
|
/*
|
|
|
|
* Force a compilation error if condition is true, but also produce a
|
|
|
|
* result (of value 0 and type int), so the expression can be used
|
|
|
|
* e.g. in a structure initializer (or where-ever else comma expressions
|
|
|
|
* aren't permitted).
|
|
|
|
*/
|
|
|
|
#define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { int:(-!!(e)); })))
|
|
|
|
#endif /* __CHECKER__ */
|
|
|
|
/* Are two types/vars the same type (ignoring qualifiers)? */
|
|
|
|
#ifndef __same_type
|
|
|
|
# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
|
|
|
|
#endif
|
|
|
|
/* &a[0] degrades to a pointer: a different type from an array */
|
|
|
|
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
|
|
|
|
2020-08-28 22:38:05 +02:00
|
|
|
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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))
|
|
|
|
/**
|
|
|
|
* round_up - round up to next specified power of 2
|
|
|
|
* @x: the value to round
|
|
|
|
* @y: multiple to round up to (must be a power of 2)
|
|
|
|
*
|
|
|
|
* Rounds @x up to next multiple of @y (which must be a power of 2).
|
|
|
|
* To perform arbitrary rounding up, use roundup() below.
|
|
|
|
*/
|
|
|
|
#define round_up(x, y) ((((x)-1) | __round_mask(x, y)) + 1)
|
|
|
|
/**
|
|
|
|
* round_down - round down to next specified power of 2
|
|
|
|
* @x: the value to round
|
|
|
|
* @y: multiple to round down to (must be a power of 2)
|
|
|
|
*
|
|
|
|
* Rounds @x down to next multiple of @y (which must be a power of 2).
|
|
|
|
* To perform arbitrary rounding down, use rounddown() below.
|
|
|
|
*/
|
|
|
|
#define round_down(x, y) ((x) & ~__round_mask(x, y))
|
|
|
|
|
|
|
|
#define typeof_member(T, m) typeof(((T *)0)->m)
|
|
|
|
|
|
|
|
#define DIV_ROUND_UP __KERNEL_DIV_ROUND_UP
|
|
|
|
/**
|
|
|
|
* roundup - round up to the next specified multiple
|
|
|
|
* @x: the value to up
|
|
|
|
* @y: multiple to round up to
|
|
|
|
*
|
|
|
|
* Rounds @x up to next multiple of @y. If @y will always be a power
|
|
|
|
* of 2, consider using the faster round_up().
|
|
|
|
*/
|
|
|
|
#define roundup(x, y) \
|
|
|
|
({ \
|
|
|
|
typeof(y) __y = y; \
|
|
|
|
(((x) + (__y - 1)) / __y) * __y; \
|
|
|
|
})
|
|
|
|
/**
|
|
|
|
* rounddown - round down to next specified multiple
|
|
|
|
* @x: the value to round
|
|
|
|
* @y: multiple to round down to
|
|
|
|
*
|
|
|
|
* Rounds @x down to next multiple of @y. If @y will always be a power
|
|
|
|
* of 2, consider using the faster round_down().
|
|
|
|
*/
|
|
|
|
#define rounddown(x, y) \
|
|
|
|
({ \
|
|
|
|
typeof(x) __x = (x); \
|
|
|
|
__x - (__x % (y)); \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
|
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|