92
93
* This structure is used to group all of the individual registers which are
93
94
* modeled using the RegisterInfo structure.
95
* @r is an aray containing of all the relevent RegisterInfo structures.
96
* @r is an array containing of all the relevant RegisterInfo structures.
97
98
* @num_elements is the number of elements in the array r
207
208
void register_finalize_block(RegisterInfoArray *r_array);
209
/* Define constants for a 32 bit register */
211
/* This macro will define A_FOO, for the byte address of a register
212
* as well as R_FOO for the uint32_t[] register number (A_FOO / 4).
214
#define REG32(reg, addr) \
215
enum { A_ ## reg = (addr) }; \
216
enum { R_ ## reg = (addr) / 4 };
218
/* Define SHIFT, LENGTH and MASK constants for a field within a register */
220
/* This macro will define FOO_BAR_MASK, FOO_BAR_SHIFT and FOO_BAR_LENGTH
221
* constants for field BAR in register FOO.
223
#define FIELD(reg, field, shift, length) \
224
enum { R_ ## reg ## _ ## field ## _SHIFT = (shift)}; \
225
enum { R_ ## reg ## _ ## field ## _LENGTH = (length)}; \
226
enum { R_ ## reg ## _ ## field ## _MASK = \
227
MAKE_64BIT_MASK(shift, length)};
229
/* Extract a field from a register */
230
#define FIELD_EX32(storage, reg, field) \
231
extract32((storage), R_ ## reg ## _ ## field ## _SHIFT, \
232
R_ ## reg ## _ ## field ## _LENGTH)
234
/* Extract a field from an array of registers */
235
#define ARRAY_FIELD_EX32(regs, reg, field) \
236
FIELD_EX32((regs)[R_ ## reg], reg, field)
238
/* Deposit a register field.
239
* Assigning values larger then the target field will result in
240
* compilation warnings.
242
#define FIELD_DP32(storage, reg, field, val) ({ \
244
unsigned int v:R_ ## reg ## _ ## field ## _LENGTH; \
245
} v = { .v = val }; \
247
d = deposit32((storage), R_ ## reg ## _ ## field ## _SHIFT, \
248
R_ ## reg ## _ ## field ## _LENGTH, v.v); \
251
/* Deposit a field to array of registers. */
252
#define ARRAY_FIELD_DP32(regs, reg, field, val) \
253
(regs)[R_ ## reg] = FIELD_DP32((regs)[R_ ## reg], reg, field, val);