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