[Intel-gfx] [PATCH 1/2] drm/i915: Add 16bit register/mask operators
Gustavo Sousa
gustavo.sousa at intel.com
Mon May 8 13:16:26 UTC 2023
Quoting Clint Taylor (2023-05-05 15:46:39)
>Add the support macros to define/extract bits as 16bits.
>
>Signed-off-by: Clint Taylor <clinton.a.taylor at intel.com>
>---
> drivers/gpu/drm/i915/i915_reg_defs.h | 49 ++++++++++++++++++++++++++++
> 1 file changed, 49 insertions(+)
>
>diff --git a/drivers/gpu/drm/i915/i915_reg_defs.h b/drivers/gpu/drm/i915/i915_reg_defs.h
>index 622d603080f9..eb273f3ce3eb 100644
>--- a/drivers/gpu/drm/i915/i915_reg_defs.h
>+++ b/drivers/gpu/drm/i915/i915_reg_defs.h
>@@ -143,6 +143,55 @@
> */
> #define REG_FIELD_GET64(__mask, __val) ((u64)FIELD_GET(__mask, __val))
>
>+/**
>+ * REG_BIT16() - Prepare a u16 bit value
>+ * @__n: 0-based bit number
>+ *
>+ * Local wrapper for BIT() to force u16, with compile time
>+ * checks.
>+ *
>+ * @return: Value with bit @__n set.
>+ */
>+#define REG_BIT16(__n) \
>+ ((u16)(BIT(__n) + \
>+ BUILD_BUG_ON_ZERO(__is_constexpr(__n) && \
>+ ((__n) < 0 || (__n) > 15))))
>+
>+/**
>+ * REG_GENMASK16() - Prepare a continuous u8 bitmask
>+ * @__high: 0-based high bit
>+ * @__low: 0-based low bit
>+ *
>+ * Local wrapper for GENMASK() to force u16, with compile time
>+ * checks.
>+ *
>+ * @return: Continuous bitmask from @__high to @__low, inclusive.
>+ */
>+#define REG_GENMASK16(__high, __low) \
>+ ((u16)(GENMASK(__high, __low) + \
>+ BUILD_BUG_ON_ZERO(__is_constexpr(__high) && \
>+ __is_constexpr(__low) && \
>+ ((__low) < 0 || (__high) > 15 || (__low) > (__high)))))
>+
>+/**
>+ * REG_FIELD_PREP16() - Prepare a u16 bitfield value
>+ * @__mask: shifted mask defining the field's length and position
>+ * @__val: value to put in the field
>+ *
>+ * Local copy of FIELD_PREP16() to generate an integer constant
>+ * expression, force u8 and for consistency with
>+ * REG_FIELD_GET16(), REG_BIT16() and REG_GENMASK16().
>+ *
>+ * @return: @__val masked and shifted into the field defined by @__mask.
>+ */
>+#define REG_FIELD_PREP16(__mask, __val) \
>+ ((u16)((((typeof(__mask))(__val) << __bf_shf(__mask)) & (__mask)) + \
>+ BUILD_BUG_ON_ZERO(!__is_constexpr(__mask)) + \
>+ BUILD_BUG_ON_ZERO((__mask) == 0 || (__mask) > U16_MAX) + \
>+ BUILD_BUG_ON_ZERO(!IS_POWER_OF_2((__mask) + (1ULL << __bf_shf(__mask)))) + \
>+ BUILD_BUG_ON_ZERO(__builtin_choose_expr(__is_constexpr(__val), (~((__mask) >> __bf_shf(__mask)) & (__val)), 0))))
>+
>+
Nitpick: There is an extra blank line here.
Reviewed-by: Gustavo Sousa <gustavo.sousa at intel.com>
> #define __MASKED_FIELD(mask, value) ((mask) << 16 | (value))
> #define _MASKED_FIELD(mask, value) ({ \
> if (__builtin_constant_p(mask)) \
>--
>2.25.1
>
More information about the Intel-gfx
mailing list