xref: /linux/tools/include/linux/bits.h (revision ba4aa02b417f08a0bee5e7b8ed70cac788a7c854)
1*ba4aa02bSArnaldo Carvalho de Melo /* SPDX-License-Identifier: GPL-2.0 */
2*ba4aa02bSArnaldo Carvalho de Melo #ifndef __LINUX_BITS_H
3*ba4aa02bSArnaldo Carvalho de Melo #define __LINUX_BITS_H
4*ba4aa02bSArnaldo Carvalho de Melo #include <asm/bitsperlong.h>
5*ba4aa02bSArnaldo Carvalho de Melo 
6*ba4aa02bSArnaldo Carvalho de Melo #define BIT(nr)			(1UL << (nr))
7*ba4aa02bSArnaldo Carvalho de Melo #define BIT_ULL(nr)		(1ULL << (nr))
8*ba4aa02bSArnaldo Carvalho de Melo #define BIT_MASK(nr)		(1UL << ((nr) % BITS_PER_LONG))
9*ba4aa02bSArnaldo Carvalho de Melo #define BIT_WORD(nr)		((nr) / BITS_PER_LONG)
10*ba4aa02bSArnaldo Carvalho de Melo #define BIT_ULL_MASK(nr)	(1ULL << ((nr) % BITS_PER_LONG_LONG))
11*ba4aa02bSArnaldo Carvalho de Melo #define BIT_ULL_WORD(nr)	((nr) / BITS_PER_LONG_LONG)
12*ba4aa02bSArnaldo Carvalho de Melo #define BITS_PER_BYTE		8
13*ba4aa02bSArnaldo Carvalho de Melo 
14*ba4aa02bSArnaldo Carvalho de Melo /*
15*ba4aa02bSArnaldo Carvalho de Melo  * Create a contiguous bitmask starting at bit position @l and ending at
16*ba4aa02bSArnaldo Carvalho de Melo  * position @h. For example
17*ba4aa02bSArnaldo Carvalho de Melo  * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
18*ba4aa02bSArnaldo Carvalho de Melo  */
19*ba4aa02bSArnaldo Carvalho de Melo #define GENMASK(h, l) \
20*ba4aa02bSArnaldo Carvalho de Melo 	(((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
21*ba4aa02bSArnaldo Carvalho de Melo 
22*ba4aa02bSArnaldo Carvalho de Melo #define GENMASK_ULL(h, l) \
23*ba4aa02bSArnaldo Carvalho de Melo 	(((~0ULL) - (1ULL << (l)) + 1) & \
24*ba4aa02bSArnaldo Carvalho de Melo 	 (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h))))
25*ba4aa02bSArnaldo Carvalho de Melo 
26*ba4aa02bSArnaldo Carvalho de Melo #endif	/* __LINUX_BITS_H */
27