diff --git a/quantum/bits.h b/quantum/bits.h new file mode 100644 index 000000000000..7e0e58570b5f --- /dev/null +++ b/quantum/bits.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#pragma once + +#define BITS_PER_BYTE 8 +#define BITS_PER_LONG 32 +#define BITS_PER_LONG_LONG 64 + +#define BIT(nr) (UL(1) << (nr)) +#define BIT_ULL(nr) (ULL(1) << (nr)) +#define BIT_MASK(nr) (UL(1) << ((nr) % BITS_PER_LONG)) +#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) +#define BIT_ULL_MASK(nr) (ULL(1) << ((nr) % BITS_PER_LONG_LONG)) +#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) + +/* + * Create a contiguous bitmask starting at bit position @l and ending at + * position @h. For example + * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000. + */ +#define GENMASK(h, l) (((~UL(0)) - (UL(1) << (l)) + 1) & (~UL(0) >> (BITS_PER_LONG - 1 - (h)))) + +#define GENMASK_ULL(h, l) (((~ULL(0)) - (ULL(1) << (l)) + 1) & (~ULL(0) >> (BITS_PER_LONG_LONG - 1 - (h)))) diff --git a/quantum/util.h b/quantum/util.h index 94d9f2231796..61ec7ac153f7 100644 --- a/quantum/util.h +++ b/quantum/util.h @@ -4,6 +4,7 @@ #pragma once +#include "bits.h" #include "bitwise.h" // convert to string