1*242ab49aSJani Nikula /* SPDX-License-Identifier: MIT */ 2*242ab49aSJani Nikula /* Copyright © 2026 Intel Corporation */ 3*242ab49aSJani Nikula 4*242ab49aSJani Nikula #ifndef _REG_BITS_H_ 5*242ab49aSJani Nikula #define _REG_BITS_H_ 6*242ab49aSJani Nikula 7*242ab49aSJani Nikula #include <linux/bitfield.h> 8*242ab49aSJani Nikula #include <linux/bits.h> 9*242ab49aSJani Nikula 10*242ab49aSJani Nikula /* 11*242ab49aSJani Nikula * Wrappers over the generic fixed width BIT_U*() and GENMASK_U*() 12*242ab49aSJani Nikula * implementations, for compatibility reasons with previous implementation. 13*242ab49aSJani Nikula */ 14*242ab49aSJani Nikula #define REG_GENMASK(high, low) GENMASK_U32(high, low) 15*242ab49aSJani Nikula #define REG_GENMASK64(high, low) GENMASK_U64(high, low) 16*242ab49aSJani Nikula #define REG_GENMASK16(high, low) GENMASK_U16(high, low) 17*242ab49aSJani Nikula #define REG_GENMASK8(high, low) GENMASK_U8(high, low) 18*242ab49aSJani Nikula 19*242ab49aSJani Nikula #define REG_BIT(n) BIT_U32(n) 20*242ab49aSJani Nikula #define REG_BIT64(n) BIT_U64(n) 21*242ab49aSJani Nikula #define REG_BIT16(n) BIT_U16(n) 22*242ab49aSJani Nikula #define REG_BIT8(n) BIT_U8(n) 23*242ab49aSJani Nikula 24*242ab49aSJani Nikula /* 25*242ab49aSJani Nikula * Local integer constant expression version of is_power_of_2(). 26*242ab49aSJani Nikula */ 27*242ab49aSJani Nikula #define IS_POWER_OF_2(__x) ((__x) && (((__x) & ((__x) - 1)) == 0)) 28*242ab49aSJani Nikula 29*242ab49aSJani Nikula /** 30*242ab49aSJani Nikula * REG_FIELD_PREP8() - Prepare a u8 bitfield value 31*242ab49aSJani Nikula * @__mask: shifted mask defining the field's length and position 32*242ab49aSJani Nikula * @__val: value to put in the field 33*242ab49aSJani Nikula * 34*242ab49aSJani Nikula * Local copy of FIELD_PREP() to generate an integer constant expression, force 35*242ab49aSJani Nikula * u8 and for consistency with REG_FIELD_GET8(), REG_BIT8() and REG_GENMASK8(). 36*242ab49aSJani Nikula * 37*242ab49aSJani Nikula * @return: @__val masked and shifted into the field defined by @__mask. 38*242ab49aSJani Nikula */ 39*242ab49aSJani Nikula #define REG_FIELD_PREP8(__mask, __val) \ 40*242ab49aSJani Nikula ((u8)((((typeof(__mask))(__val) << __bf_shf(__mask)) & (__mask)) + \ 41*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(!__is_constexpr(__mask)) + \ 42*242ab49aSJani Nikula BUILD_BUG_ON_ZERO((__mask) == 0 || (__mask) > U8_MAX) + \ 43*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(!IS_POWER_OF_2((__mask) + (1ULL << __bf_shf(__mask)))) + \ 44*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(__builtin_choose_expr(__is_constexpr(__val), (~((__mask) >> __bf_shf(__mask)) & (__val)), 0)))) 45*242ab49aSJani Nikula 46*242ab49aSJani Nikula /** 47*242ab49aSJani Nikula * REG_FIELD_PREP16() - Prepare a u16 bitfield value 48*242ab49aSJani Nikula * @__mask: shifted mask defining the field's length and position 49*242ab49aSJani Nikula * @__val: value to put in the field 50*242ab49aSJani Nikula * 51*242ab49aSJani Nikula * Local copy of FIELD_PREP16() to generate an integer constant 52*242ab49aSJani Nikula * expression, force u8 and for consistency with 53*242ab49aSJani Nikula * REG_FIELD_GET16(), REG_BIT16() and REG_GENMASK16(). 54*242ab49aSJani Nikula * 55*242ab49aSJani Nikula * @return: @__val masked and shifted into the field defined by @__mask. 56*242ab49aSJani Nikula */ 57*242ab49aSJani Nikula #define REG_FIELD_PREP16(__mask, __val) \ 58*242ab49aSJani Nikula ((u16)((((typeof(__mask))(__val) << __bf_shf(__mask)) & (__mask)) + \ 59*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(!__is_constexpr(__mask)) + \ 60*242ab49aSJani Nikula BUILD_BUG_ON_ZERO((__mask) == 0 || (__mask) > U16_MAX) + \ 61*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(!IS_POWER_OF_2((__mask) + (1ULL << __bf_shf(__mask)))) + \ 62*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(__builtin_choose_expr(__is_constexpr(__val), (~((__mask) >> __bf_shf(__mask)) & (__val)), 0)))) 63*242ab49aSJani Nikula 64*242ab49aSJani Nikula /** 65*242ab49aSJani Nikula * REG_FIELD_PREP() - Prepare a u32 bitfield value 66*242ab49aSJani Nikula * @__mask: shifted mask defining the field's length and position 67*242ab49aSJani Nikula * @__val: value to put in the field 68*242ab49aSJani Nikula * 69*242ab49aSJani Nikula * Local copy of FIELD_PREP() to generate an integer constant expression, force 70*242ab49aSJani Nikula * u32 and for consistency with REG_FIELD_GET(), REG_BIT() and REG_GENMASK(). 71*242ab49aSJani Nikula * 72*242ab49aSJani Nikula * @return: @__val masked and shifted into the field defined by @__mask. 73*242ab49aSJani Nikula */ 74*242ab49aSJani Nikula #define REG_FIELD_PREP(__mask, __val) \ 75*242ab49aSJani Nikula ((u32)((((typeof(__mask))(__val) << __bf_shf(__mask)) & (__mask)) + \ 76*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(!__is_constexpr(__mask)) + \ 77*242ab49aSJani Nikula BUILD_BUG_ON_ZERO((__mask) == 0 || (__mask) > U32_MAX) + \ 78*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(!IS_POWER_OF_2((__mask) + (1ULL << __bf_shf(__mask)))) + \ 79*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(__builtin_choose_expr(__is_constexpr(__val), (~((__mask) >> __bf_shf(__mask)) & (__val)), 0)))) 80*242ab49aSJani Nikula 81*242ab49aSJani Nikula /** 82*242ab49aSJani Nikula * REG_FIELD_GET8() - Extract a u8 bitfield value 83*242ab49aSJani Nikula * @__mask: shifted mask defining the field's length and position 84*242ab49aSJani Nikula * @__val: value to extract the bitfield value from 85*242ab49aSJani Nikula * 86*242ab49aSJani Nikula * Local wrapper for FIELD_GET() to force u8 and for consistency with 87*242ab49aSJani Nikula * REG_FIELD_PREP(), REG_BIT() and REG_GENMASK(). 88*242ab49aSJani Nikula * 89*242ab49aSJani Nikula * @return: Masked and shifted value of the field defined by @__mask in @__val. 90*242ab49aSJani Nikula */ 91*242ab49aSJani Nikula #define REG_FIELD_GET8(__mask, __val) ((u8)FIELD_GET(__mask, __val)) 92*242ab49aSJani Nikula 93*242ab49aSJani Nikula /** 94*242ab49aSJani Nikula * REG_FIELD_GET() - Extract a u32 bitfield value 95*242ab49aSJani Nikula * @__mask: shifted mask defining the field's length and position 96*242ab49aSJani Nikula * @__val: value to extract the bitfield value from 97*242ab49aSJani Nikula * 98*242ab49aSJani Nikula * Local wrapper for FIELD_GET() to force u32 and for consistency with 99*242ab49aSJani Nikula * REG_FIELD_PREP(), REG_BIT() and REG_GENMASK(). 100*242ab49aSJani Nikula * 101*242ab49aSJani Nikula * @return: Masked and shifted value of the field defined by @__mask in @__val. 102*242ab49aSJani Nikula */ 103*242ab49aSJani Nikula #define REG_FIELD_GET(__mask, __val) ((u32)FIELD_GET(__mask, __val)) 104*242ab49aSJani Nikula 105*242ab49aSJani Nikula /** 106*242ab49aSJani Nikula * REG_FIELD_GET64() - Extract a u64 bitfield value 107*242ab49aSJani Nikula * @__mask: shifted mask defining the field's length and position 108*242ab49aSJani Nikula * @__val: value to extract the bitfield value from 109*242ab49aSJani Nikula * 110*242ab49aSJani Nikula * Local wrapper for FIELD_GET() to force u64 and for consistency with 111*242ab49aSJani Nikula * REG_GENMASK64(). 112*242ab49aSJani Nikula * 113*242ab49aSJani Nikula * @return: Masked and shifted value of the field defined by @__mask in @__val. 114*242ab49aSJani Nikula */ 115*242ab49aSJani Nikula #define REG_FIELD_GET64(__mask, __val) ((u64)FIELD_GET(__mask, __val)) 116*242ab49aSJani Nikula 117*242ab49aSJani Nikula /** 118*242ab49aSJani Nikula * REG_FIELD_MAX() - produce the maximum value representable by a field 119*242ab49aSJani Nikula * @__mask: shifted mask defining the field's length and position 120*242ab49aSJani Nikula * 121*242ab49aSJani Nikula * Local wrapper for FIELD_MAX() to return the maximum bit value that can 122*242ab49aSJani Nikula * be held in the field specified by @_mask, cast to u32 for consistency 123*242ab49aSJani Nikula * with other macros. 124*242ab49aSJani Nikula */ 125*242ab49aSJani Nikula #define REG_FIELD_MAX(__mask) ((u32)FIELD_MAX(__mask)) 126*242ab49aSJani Nikula 127*242ab49aSJani Nikula #define REG_MASKED_FIELD(mask, value) \ 128*242ab49aSJani Nikula (BUILD_BUG_ON_ZERO(__builtin_choose_expr(__builtin_constant_p(mask), (mask) & 0xffff0000, 0)) + \ 129*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(__builtin_choose_expr(__builtin_constant_p(value), (value) & 0xffff0000, 0)) + \ 130*242ab49aSJani Nikula BUILD_BUG_ON_ZERO(__builtin_choose_expr(__builtin_constant_p(mask) && __builtin_constant_p(value), (value) & ~(mask), 0)) + \ 131*242ab49aSJani Nikula ((mask) << 16 | (value))) 132*242ab49aSJani Nikula 133*242ab49aSJani Nikula #define REG_MASKED_FIELD_ENABLE(a) \ 134*242ab49aSJani Nikula (__builtin_choose_expr(__builtin_constant_p(a), REG_MASKED_FIELD((a), (a)), ({ typeof(a) _a = (a); REG_MASKED_FIELD(_a, _a); }))) 135*242ab49aSJani Nikula 136*242ab49aSJani Nikula #define REG_MASKED_FIELD_DISABLE(a) \ 137*242ab49aSJani Nikula (REG_MASKED_FIELD((a), 0)) 138*242ab49aSJani Nikula 139*242ab49aSJani Nikula #endif 140