1 /* SPDX-License-Identifier: GPL-2.0 */
2 
3 #ifndef _LINUX_WORDPART_H
4 #define _LINUX_WORDPART_H
5 
6 /**
7  * upper_32_bits - return bits 32-63 of a number
8  * @n: the number we're accessing
9  *
10  * A basic shift-right of a 64- or 32-bit quantity.  Use this to suppress
11  * the "right shift count >= width of type" warning when that quantity is
12  * 32-bits.
13  */
14 #define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
15 
16 /**
17  * lower_32_bits - return bits 0-31 of a number
18  * @n: the number we're accessing
19  */
20 #define lower_32_bits(n) ((u32)((n) & 0xffffffff))
21 
22 /**
23  * upper_16_bits - return bits 16-31 of a number
24  * @n: the number we're accessing
25  */
26 #define upper_16_bits(n) ((u16)((n) >> 16))
27 
28 /**
29  * lower_16_bits - return bits 0-15 of a number
30  * @n: the number we're accessing
31  */
32 #define lower_16_bits(n) ((u16)((n) & 0xffff))
33 
34 /**
35  * REPEAT_BYTE - repeat the value @x multiple times as an unsigned long value
36  * @x: value to repeat
37  *
38  * NOTE: @x is not checked for > 0xff; larger values produce odd results.
39  */
40 #define REPEAT_BYTE(x)	((~0ul / 0xff) * (x))
41 
42 /**
43  * REPEAT_BYTE_U32 - repeat the value @x multiple times as a u32 value
44  * @x: value to repeat
45  *
46  * NOTE: @x is not checked for > 0xff; larger values produce odd results.
47  */
48 #define REPEAT_BYTE_U32(x)	lower_32_bits(REPEAT_BYTE(x))
49 
50 /* Set bits in the first 'n' bytes when loaded from memory */
51 #ifdef __LITTLE_ENDIAN
52 #  define aligned_byte_mask(n) ((1UL << 8*(n))-1)
53 #else
54 #  define aligned_byte_mask(n) (~0xffUL << (BITS_PER_LONG - 8 - 8*(n)))
55 #endif
56 
57 #endif // _LINUX_WORDPART_H
58