1/* SPDX-License-Identifier: MIT */
2/*
3 * Copyright © 2022 Intel Corporation
4 */
5
6#ifndef __I915_REG_DEFS__
7#define __I915_REG_DEFS__
8
9#include <linux/bitfield.h>
10#include <linux/bits.h>
11
12/*
13 * Wrappers over the generic fixed width BIT_U*() and GENMASK_U*()
14 * implementations, for compatibility reasons with previous implementation.
15 */
16#define REG_GENMASK(high, low) GENMASK_U32(high, low)
17#define REG_GENMASK64(high, low) GENMASK_U64(high, low)
18#define REG_GENMASK16(high, low) GENMASK_U16(high, low)
19#define REG_GENMASK8(high, low) GENMASK_U8(high, low)
20
21#define REG_BIT(n) BIT_U32(n)
22#define REG_BIT64(n) BIT_U64(n)
23#define REG_BIT16(n) BIT_U16(n)
24#define REG_BIT8(n) BIT_U8(n)
25
26/*
27 * Local integer constant expression version of is_power_of_2().
28 */
29#define IS_POWER_OF_2(__x) ((__x) && (((__x) & ((__x) - 1)) == 0))
30
31/**
32 * REG_FIELD_PREP() - Prepare a u32 bitfield value
33 * @__mask: shifted mask defining the field's length and position
34 * @__val: value to put in the field
35 *
36 * Local copy of FIELD_PREP() to generate an integer constant expression, force
37 * u32 and for consistency with REG_FIELD_GET(), REG_BIT() and REG_GENMASK().
38 *
39 * @return: @__val masked and shifted into the field defined by @__mask.
40 */
41#define REG_FIELD_PREP(__mask, __val) \
42 ((u32)((((typeof(__mask))(__val) << __bf_shf(__mask)) & (__mask)) + \
43 BUILD_BUG_ON_ZERO(!__is_constexpr(__mask)) + \
44 BUILD_BUG_ON_ZERO((__mask) == 0 || (__mask) > U32_MAX) + \
45 BUILD_BUG_ON_ZERO(!IS_POWER_OF_2((__mask) + (1ULL << __bf_shf(__mask)))) + \
46 BUILD_BUG_ON_ZERO(__builtin_choose_expr(__is_constexpr(__val), (~((__mask) >> __bf_shf(__mask)) & (__val)), 0))))
47
48/**
49 * REG_FIELD_PREP8() - Prepare a u8 bitfield value
50 * @__mask: shifted mask defining the field's length and position
51 * @__val: value to put in the field
52 *
53 * Local copy of FIELD_PREP() to generate an integer constant expression, force
54 * u8 and for consistency with REG_FIELD_GET8(), REG_BIT8() and REG_GENMASK8().
55 *
56 * @return: @__val masked and shifted into the field defined by @__mask.
57 */
58#define REG_FIELD_PREP8(__mask, __val) \
59 ((u8)((((typeof(__mask))(__val) << __bf_shf(__mask)) & (__mask)) + \
60 BUILD_BUG_ON_ZERO(!__is_constexpr(__mask)) + \
61 BUILD_BUG_ON_ZERO((__mask) == 0 || (__mask) > U8_MAX) + \
62 BUILD_BUG_ON_ZERO(!IS_POWER_OF_2((__mask) + (1ULL << __bf_shf(__mask)))) + \
63 BUILD_BUG_ON_ZERO(__builtin_choose_expr(__is_constexpr(__val), (~((__mask) >> __bf_shf(__mask)) & (__val)), 0))))
64
65/**
66 * REG_FIELD_GET() - Extract a u32 bitfield value
67 * @__mask: shifted mask defining the field's length and position
68 * @__val: value to extract the bitfield value from
69 *
70 * Local wrapper for FIELD_GET() to force u32 and for consistency with
71 * REG_FIELD_PREP(), REG_BIT() and REG_GENMASK().
72 *
73 * @return: Masked and shifted value of the field defined by @__mask in @__val.
74 */
75#define REG_FIELD_GET(__mask, __val) ((u32)FIELD_GET(__mask, __val))
76
77/**
78 * REG_FIELD_GET64() - Extract a u64 bitfield value
79 * @__mask: shifted mask defining the field's length and position
80 * @__val: value to extract the bitfield value from
81 *
82 * Local wrapper for FIELD_GET() to force u64 and for consistency with
83 * REG_GENMASK64().
84 *
85 * @return: Masked and shifted value of the field defined by @__mask in @__val.
86 */
87#define REG_FIELD_GET64(__mask, __val) ((u64)FIELD_GET(__mask, __val))
88
89
90/**
91 * REG_FIELD_PREP16() - Prepare a u16 bitfield value
92 * @__mask: shifted mask defining the field's length and position
93 * @__val: value to put in the field
94 *
95 * Local copy of FIELD_PREP16() to generate an integer constant
96 * expression, force u8 and for consistency with
97 * REG_FIELD_GET16(), REG_BIT16() and REG_GENMASK16().
98 *
99 * @return: @__val masked and shifted into the field defined by @__mask.
100 */
101#define REG_FIELD_PREP16(__mask, __val) \
102 ((u16)((((typeof(__mask))(__val) << __bf_shf(__mask)) & (__mask)) + \
103 BUILD_BUG_ON_ZERO(!__is_constexpr(__mask)) + \
104 BUILD_BUG_ON_ZERO((__mask) == 0 || (__mask) > U16_MAX) + \
105 BUILD_BUG_ON_ZERO(!IS_POWER_OF_2((__mask) + (1ULL << __bf_shf(__mask)))) + \
106 BUILD_BUG_ON_ZERO(__builtin_choose_expr(__is_constexpr(__val), (~((__mask) >> __bf_shf(__mask)) & (__val)), 0))))
107
108#define __MASKED_FIELD(mask, value) ((mask) << 16 | (value))
109#define _MASKED_FIELD(mask, value) ({ \
110 if (__builtin_constant_p(mask)) \
111 BUILD_BUG_ON_MSG(((mask) & 0xffff0000), "Incorrect mask"); \
112 if (__builtin_constant_p(value)) \
113 BUILD_BUG_ON_MSG((value) & 0xffff0000, "Incorrect value"); \
114 if (__builtin_constant_p(mask) && __builtin_constant_p(value)) \
115 BUILD_BUG_ON_MSG((value) & ~(mask), \
116 "Incorrect value for mask"); \
117 __MASKED_FIELD(mask, value); })
118#define _MASKED_BIT_ENABLE(a) ({ typeof(a) _a = (a); _MASKED_FIELD(_a, _a); })
119#define _MASKED_BIT_DISABLE(a) (_MASKED_FIELD((a), 0))
120
121/*
122 * Given the first two numbers __a and __b of arbitrarily many evenly spaced
123 * numbers, pick the 0-based __index'th value.
124 *
125 * Always prefer this over _PICK() if the numbers are evenly spaced.
126 */
127#define _PICK_EVEN(__index, __a, __b) ((__a) + (__index) * ((__b) - (__a)))
128
129/*
130 * Like _PICK_EVEN(), but supports 2 ranges of evenly spaced address offsets.
131 * @__c_index corresponds to the index in which the second range starts to be
132 * used. Using math interval notation, the first range is used for indexes [ 0,
133 * @__c_index), while the second range is used for [ @__c_index, ... ). Example:
134 *
135 * #define _FOO_A 0xf000
136 * #define _FOO_B 0xf004
137 * #define _FOO_C 0xf008
138 * #define _SUPER_FOO_A 0xa000
139 * #define _SUPER_FOO_B 0xa100
140 * #define FOO(x) _MMIO(_PICK_EVEN_2RANGES(x, 3, \
141 * _FOO_A, _FOO_B, \
142 * _SUPER_FOO_A, _SUPER_FOO_B))
143 *
144 * This expands to:
145 * 0: 0xf000,
146 * 1: 0xf004,
147 * 2: 0xf008,
148 * 3: 0xa000,
149 * 4: 0xa100,
150 * 5: 0xa200,
151 * ...
152 */
153#define _PICK_EVEN_2RANGES(__index, __c_index, __a, __b, __c, __d) \
154 (BUILD_BUG_ON_ZERO(!__is_constexpr(__c_index)) + \
155 ((__index) < (__c_index) ? _PICK_EVEN(__index, __a, __b) : \
156 _PICK_EVEN((__index) - (__c_index), __c, __d)))
157
158/*
159 * Given the arbitrary numbers in varargs, pick the 0-based __index'th number.
160 *
161 * Always prefer _PICK_EVEN() over this if the numbers are evenly spaced.
162 */
163#define _PICK(__index, ...) (((const u32 []){ __VA_ARGS__ })[__index])
164
165/**
166 * REG_FIELD_GET8() - Extract a u8 bitfield value
167 * @__mask: shifted mask defining the field's length and position
168 * @__val: value to extract the bitfield value from
169 *
170 * Local wrapper for FIELD_GET() to force u8 and for consistency with
171 * REG_FIELD_PREP(), REG_BIT() and REG_GENMASK().
172 *
173 * @return: Masked and shifted value of the field defined by @__mask in @__val.
174 */
175#define REG_FIELD_GET8(__mask, __val) ((u8)FIELD_GET(__mask, __val))
176
177typedef struct {
178 u32 reg;
179} i915_reg_t;
180
181#define _MMIO(r) ((const i915_reg_t){ .reg = (r) })
182
183typedef struct {
184 u32 reg;
185} i915_mcr_reg_t;
186
187#define MCR_REG(offset) ((const i915_mcr_reg_t){ .reg = (offset) })
188
189#define INVALID_MMIO_REG _MMIO(0)
190
191/*
192 * These macros can be used on either i915_reg_t or i915_mcr_reg_t since they're
193 * simply operations on the register's offset and don't care about the MCR vs
194 * non-MCR nature of the register.
195 */
196#define i915_mmio_reg_offset(r) \
197 _Generic((r), i915_reg_t: (r).reg, i915_mcr_reg_t: (r).reg)
198#define i915_mmio_reg_equal(a, b) (i915_mmio_reg_offset(a) == i915_mmio_reg_offset(b))
199#define i915_mmio_reg_valid(r) (!i915_mmio_reg_equal(r, INVALID_MMIO_REG))
200
201/* A triplet for IMR/IER/IIR registers. */
202struct i915_irq_regs {
203 i915_reg_t imr;
204 i915_reg_t ier;
205 i915_reg_t iir;
206};
207
208#define I915_IRQ_REGS(_imr, _ier, _iir) \
209 ((const struct i915_irq_regs){ .imr = (_imr), .ier = (_ier), .iir = (_iir) })
210
211struct i915_error_regs {
212 i915_reg_t emr;
213 i915_reg_t eir;
214};
215
216#define I915_ERROR_REGS(_emr, _eir) \
217 ((const struct i915_error_regs){ .emr = (_emr), .eir = (_eir) })
218
219#endif /* __I915_REG_DEFS__ */
220

Provided by KDAB

Privacy Policy
Improve your Profiling and Debugging skills
Find out more

source code of linux/drivers/gpu/drm/i915/i915_reg_defs.h