166a5c40fSTanzir Hasan /* SPDX-License-Identifier: GPL-2.0 */
266a5c40fSTanzir Hasan 
366a5c40fSTanzir Hasan #ifndef _LINUX_WORDPART_H
466a5c40fSTanzir Hasan #define _LINUX_WORDPART_H
5adeb0436SAndy Shevchenko 
6adeb0436SAndy Shevchenko /**
7adeb0436SAndy Shevchenko  * upper_32_bits - return bits 32-63 of a number
8adeb0436SAndy Shevchenko  * @n: the number we're accessing
9adeb0436SAndy Shevchenko  *
10adeb0436SAndy Shevchenko  * A basic shift-right of a 64- or 32-bit quantity.  Use this to suppress
11adeb0436SAndy Shevchenko  * the "right shift count >= width of type" warning when that quantity is
12adeb0436SAndy Shevchenko  * 32-bits.
13adeb0436SAndy Shevchenko  */
14adeb0436SAndy Shevchenko #define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
15adeb0436SAndy Shevchenko 
16adeb0436SAndy Shevchenko /**
17adeb0436SAndy Shevchenko  * lower_32_bits - return bits 0-31 of a number
18adeb0436SAndy Shevchenko  * @n: the number we're accessing
19adeb0436SAndy Shevchenko  */
20adeb0436SAndy Shevchenko #define lower_32_bits(n) ((u32)((n) & 0xffffffff))
21adeb0436SAndy Shevchenko 
22adeb0436SAndy Shevchenko /**
23adeb0436SAndy Shevchenko  * upper_16_bits - return bits 16-31 of a number
24adeb0436SAndy Shevchenko  * @n: the number we're accessing
25adeb0436SAndy Shevchenko  */
26adeb0436SAndy Shevchenko #define upper_16_bits(n) ((u16)((n) >> 16))
27adeb0436SAndy Shevchenko 
28adeb0436SAndy Shevchenko /**
29adeb0436SAndy Shevchenko  * lower_16_bits - return bits 0-15 of a number
30adeb0436SAndy Shevchenko  * @n: the number we're accessing
31adeb0436SAndy Shevchenko  */
32adeb0436SAndy Shevchenko #define lower_16_bits(n) ((u16)((n) & 0xffff))
33adeb0436SAndy Shevchenko 
3466a5c40fSTanzir Hasan /**
3566a5c40fSTanzir Hasan  * REPEAT_BYTE - repeat the value @x multiple times as an unsigned long value
3666a5c40fSTanzir Hasan  * @x: value to repeat
3766a5c40fSTanzir Hasan  *
3866a5c40fSTanzir Hasan  * NOTE: @x is not checked for > 0xff; larger values produce odd results.
3966a5c40fSTanzir Hasan  */
4066a5c40fSTanzir Hasan #define REPEAT_BYTE(x)	((~0ul / 0xff) * (x))
4166a5c40fSTanzir Hasan 
42118d777cSMark Rutland /**
43118d777cSMark Rutland  * REPEAT_BYTE_U32 - repeat the value @x multiple times as a u32 value
44118d777cSMark Rutland  * @x: value to repeat
45118d777cSMark Rutland  *
46118d777cSMark Rutland  * NOTE: @x is not checked for > 0xff; larger values produce odd results.
47118d777cSMark Rutland  */
48118d777cSMark Rutland #define REPEAT_BYTE_U32(x)	lower_32_bits(REPEAT_BYTE(x))
49118d777cSMark Rutland 
509f2c2d6bSAndy Shevchenko /* Set bits in the first 'n' bytes when loaded from memory */
519f2c2d6bSAndy Shevchenko #ifdef __LITTLE_ENDIAN
529f2c2d6bSAndy Shevchenko #  define aligned_byte_mask(n) ((1UL << 8*(n))-1)
539f2c2d6bSAndy Shevchenko #else
549f2c2d6bSAndy Shevchenko #  define aligned_byte_mask(n) (~0xffUL << (BITS_PER_LONG - 8 - 8*(n)))
559f2c2d6bSAndy Shevchenko #endif
569f2c2d6bSAndy Shevchenko 
5766a5c40fSTanzir Hasan #endif // _LINUX_WORDPART_H
58