]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/reg: make masked field helpers constexpr
authorJani Nikula <jani.nikula@intel.com>
Wed, 25 Feb 2026 17:57:03 +0000 (19:57 +0200)
committerJani Nikula <jani.nikula@intel.com>
Wed, 4 Mar 2026 11:04:20 +0000 (13:04 +0200)
Make it possible to use _MASKED_FIELD(), _MASKED_BIT_ENABLE() and
_MASKED_BIT_DISABLE() in contexts that require integer constant
expressions. This increases their usefulness at the small cost of making
the warnings from build time checks less helpful.

Reviewed-by: MichaƂ Grzelak <michal.grzelak@intel.com>
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patch.msgid.link/788f538cc71dec0db25e0c768e8945bef6f9701c.1772042022.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/i915_reg_defs.h

index e81fac8ab51b508136526f7c5d9fcf0240afddbe..c39b3a5dafe6946c1ecf98471b63349e1a7c216b 100644 (file)
               BUILD_BUG_ON_ZERO(__builtin_choose_expr(__is_constexpr(__val), (~((__mask) >> __bf_shf(__mask)) & (__val)), 0))))
 
 #define __MASKED_FIELD(mask, value) ((mask) << 16 | (value))
-#define _MASKED_FIELD(mask, value) ({                                     \
-       if (__builtin_constant_p(mask))                                    \
-               BUILD_BUG_ON_MSG(((mask) & 0xffff0000), "Incorrect mask"); \
-       if (__builtin_constant_p(value))                                   \
-               BUILD_BUG_ON_MSG((value) & 0xffff0000, "Incorrect value"); \
-       if (__builtin_constant_p(mask) && __builtin_constant_p(value))     \
-               BUILD_BUG_ON_MSG((value) & ~(mask),                        \
-                                "Incorrect value for mask");              \
-       __MASKED_FIELD(mask, value); })
-#define _MASKED_BIT_ENABLE(a)  ({ typeof(a) _a = (a); _MASKED_FIELD(_a, _a); })
-#define _MASKED_BIT_DISABLE(a) (_MASKED_FIELD((a), 0))
+#define _MASKED_FIELD(mask, value) \
+       (BUILD_BUG_ON_ZERO(__builtin_choose_expr(__builtin_constant_p(mask), (mask) & 0xffff0000, 0)) + \
+        BUILD_BUG_ON_ZERO(__builtin_choose_expr(__builtin_constant_p(value), (value) & 0xffff0000, 0)) + \
+        BUILD_BUG_ON_ZERO(__builtin_choose_expr(__builtin_constant_p(mask) && __builtin_constant_p(value), (value) & ~(mask), 0)) + \
+        __MASKED_FIELD(mask, value))
+
+#define _MASKED_BIT_ENABLE(a) \
+       (__builtin_choose_expr(__builtin_constant_p(a), _MASKED_FIELD((a), (a)), ({ typeof(a) _a = (a); _MASKED_FIELD(_a, _a); })))
+
+#define _MASKED_BIT_DISABLE(a) \
+       (_MASKED_FIELD((a), 0))
 
 /*
  * Given the first two numbers __a and __b of arbitrarily many evenly spaced