xref: /linux-6.15/tools/include/uapi/linux/const.h (revision 0312e94a)
1aaa6ef8aSArnaldo Carvalho de Melo /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2aaa6ef8aSArnaldo Carvalho de Melo /* const.h: Macros for dealing with constants.  */
3aaa6ef8aSArnaldo Carvalho de Melo 
4aaa6ef8aSArnaldo Carvalho de Melo #ifndef _UAPI_LINUX_CONST_H
5aaa6ef8aSArnaldo Carvalho de Melo #define _UAPI_LINUX_CONST_H
6aaa6ef8aSArnaldo Carvalho de Melo 
7aaa6ef8aSArnaldo Carvalho de Melo /* Some constant macros are used in both assembler and
8aaa6ef8aSArnaldo Carvalho de Melo  * C code.  Therefore we cannot annotate them always with
9aaa6ef8aSArnaldo Carvalho de Melo  * 'UL' and other type specifiers unilaterally.  We
10aaa6ef8aSArnaldo Carvalho de Melo  * use the following macros to deal with this.
11aaa6ef8aSArnaldo Carvalho de Melo  *
12aaa6ef8aSArnaldo Carvalho de Melo  * Similarly, _AT() will cast an expression with a type in C, but
13aaa6ef8aSArnaldo Carvalho de Melo  * leave it unchanged in asm.
14aaa6ef8aSArnaldo Carvalho de Melo  */
15aaa6ef8aSArnaldo Carvalho de Melo 
16aaa6ef8aSArnaldo Carvalho de Melo #ifdef __ASSEMBLY__
17aaa6ef8aSArnaldo Carvalho de Melo #define _AC(X,Y)	X
18aaa6ef8aSArnaldo Carvalho de Melo #define _AT(T,X)	X
19aaa6ef8aSArnaldo Carvalho de Melo #else
20aaa6ef8aSArnaldo Carvalho de Melo #define __AC(X,Y)	(X##Y)
21aaa6ef8aSArnaldo Carvalho de Melo #define _AC(X,Y)	__AC(X,Y)
22aaa6ef8aSArnaldo Carvalho de Melo #define _AT(T,X)	((T)(X))
23aaa6ef8aSArnaldo Carvalho de Melo #endif
24aaa6ef8aSArnaldo Carvalho de Melo 
25aaa6ef8aSArnaldo Carvalho de Melo #define _UL(x)		(_AC(x, UL))
26aaa6ef8aSArnaldo Carvalho de Melo #define _ULL(x)		(_AC(x, ULL))
27aaa6ef8aSArnaldo Carvalho de Melo 
28aaa6ef8aSArnaldo Carvalho de Melo #define _BITUL(x)	(_UL(1) << (x))
29aaa6ef8aSArnaldo Carvalho de Melo #define _BITULL(x)	(_ULL(1) << (x))
30aaa6ef8aSArnaldo Carvalho de Melo 
31ab8aaab8SArnaldo Carvalho de Melo #if !defined(__ASSEMBLY__)
32ab8aaab8SArnaldo Carvalho de Melo /*
33ab8aaab8SArnaldo Carvalho de Melo  * Missing asm support
34ab8aaab8SArnaldo Carvalho de Melo  *
35ab8aaab8SArnaldo Carvalho de Melo  * __BIT128() would not work in the asm code, as it shifts an
36*0312e94aSVincent Mailhol  * 'unsigned __int128' data type as direct representation of
37ab8aaab8SArnaldo Carvalho de Melo  * 128 bit constants is not supported in the gcc compiler, as
38ab8aaab8SArnaldo Carvalho de Melo  * they get silently truncated.
39ab8aaab8SArnaldo Carvalho de Melo  *
40ab8aaab8SArnaldo Carvalho de Melo  * TODO: Please revisit this implementation when gcc compiler
41ab8aaab8SArnaldo Carvalho de Melo  * starts representing 128 bit constants directly like long
42ab8aaab8SArnaldo Carvalho de Melo  * and unsigned long etc. Subsequently drop the comment for
43ab8aaab8SArnaldo Carvalho de Melo  * GENMASK_U128() which would then start supporting asm code.
44ab8aaab8SArnaldo Carvalho de Melo  */
45ab8aaab8SArnaldo Carvalho de Melo #define _BIT128(x)	((unsigned __int128)(1) << (x))
46ab8aaab8SArnaldo Carvalho de Melo #endif
47ab8aaab8SArnaldo Carvalho de Melo 
4892b8e61eSYanteng Si #define __ALIGN_KERNEL(x, a)		__ALIGN_KERNEL_MASK(x, (__typeof__(x))(a) - 1)
497ddcdea5SArnaldo Carvalho de Melo #define __ALIGN_KERNEL_MASK(x, mask)	(((x) + (mask)) & ~(mask))
507ddcdea5SArnaldo Carvalho de Melo 
517ddcdea5SArnaldo Carvalho de Melo #define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
527ddcdea5SArnaldo Carvalho de Melo 
53aaa6ef8aSArnaldo Carvalho de Melo #endif /* _UAPI_LINUX_CONST_H */
54