1/*
2 * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3 * Copyright (c) Imagination Technologies Limited, UK
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sub license, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial portions
15 * of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26
27/******************************************************************************
28
29 @File         reg_io2.h
30
31 @Title        MSVDX Offsets
32
33 @Platform     Independent
34
35 @Description  </b>\n
36
37******************************************************************************/
38#if !defined (__REG_IO2_H__)
39#define __REG_IO2_H__
40
41#if (__cplusplus)
42extern "C" {
43#endif
44
45#include "img_types.h"
46
47#ifdef DOXYGEN_WILL_SEE_THIS
48    /*!
49    ******************************************************************************
50
51     @Function  REGIO_READ_FIELD
52
53     @Description
54
55     This macro is used to extract a field from a register.
56
57     @Input             ui32RegValue:           The register value.
58
59     @Input             group:          The name of the group containing the register from which
60                                                the field is to be extracted.
61
62     @Input             reg:            The name of the register from which the field is to
63                                                be extracted.
64
65     @Input             field:          The name of the field to be extracted.
66
67     @Return    IMG_UINT32:     The value of the field - right aligned.
68
69    ******************************************************************************/
70    IMG_UINT32 REGIO_READ_FIELD(IMG_UINT32      ui32RegValue, group, reg, field);
71
72    /*!
73    ******************************************************************************
74
75     @Function  REGIO_READ_REPEATED_FIELD
76
77     @Description
78
79     This macro is used to extract the value of a repeated from a register.
80
81     @Input             ui32RegValue:           The register value.
82
83     @Input             group:          The name of the group containing the register from which
84                                                the field is to be extracted.
85
86     @Input             reg:            The name of the register from which the field is to
87                                                be extracted.
88
89     @Input             field:          The name of the field to be extracted.
90
91     @Input             ui32RepIndex:           The repeat index of the field to be extracted.
92
93     @Return    IMG_UINT32:     The value of the field - right aligned.
94
95    ******************************************************************************/
96    IMG_UINT32 REGIO_READ_REPEATED_FIELD(IMG_UINT32     ui32RegValue, group, reg, field, IMG_UINT32 ui32RepIndex);
97
98    /*!
99    ******************************************************************************
100
101     @Function  REGIO_READ_REGISTER
102
103     @Description
104
105     This macro is used to read a register.
106
107     @Input             ui32DevId:              The device Id within the group.
108
109     @Input             group:          The name of the group containing the register to be
110                                                read.
111
112     @Input             reg:            The name of the register to be read.
113
114     @Return    IMG_UINT32:     The value of the register.
115
116    ******************************************************************************/
117    IMG_UINT32 REGIO_READ_REGISTER(IMG_UINT32   ui32DevId, group, reg);
118
119    /*!
120    ******************************************************************************
121
122     @Function  REGIO_READ_TABLE_REGISTER
123
124     @Description
125
126     This macro is used to read a register from a table.
127
128     @Input             ui32DevId:              The device Id within the group.
129
130     @Input             group:          The name of the group containing the register to be
131                                                read.
132
133     @Input             reg:            The name of the register to be read.
134
135     @Input             ui32TabIndex:   The index of the table entry to be read.
136
137     @Return    IMG_UINT32:     The value of the register.
138
139    ******************************************************************************/
140    IMG_UINT32 REGIO_READ_TABLE_REGISTER(IMG_UINT32     ui32DevId, group, reg, IMG_UINT32 ui32TabIndex);
141
142    /*!
143    ******************************************************************************
144
145     @Function  REGIO_WRITE_FIELD
146
147     @Description
148
149     This macro is used to update the value of a field in a register.
150
151     @Input             ui32RegValue:   The register value - which gets updated.
152
153     @Input             group:          The name of the group containing the register into which
154                                                the field is to be written.
155
156     @Input             reg:            The name of the register into which the field is to
157                                                be written.
158
159     @Input             field:          The name of the field to be updated.
160
161     @Input             ui32Value:      The value to be written to the field - right aligned.
162
163     @Return    None.
164
165    ******************************************************************************/
166    IMG_VOID REGIO_WRITE_FIELD(IMG_UINT32       ui32RegValue, group, reg, field, IMG_UINT32     ui32Value);
167
168    /*!
169    ******************************************************************************
170
171     @Function  REGIO_WRITE_REPEATED_FIELD
172
173     @Description
174
175     This macro is used to update a repeated field in a packed memory
176     based structure.
177
178     @Input             ui32RegValue:   The register value - which gets updated.
179
180     @Input             group:          The name of the group containing the register into which
181                                                the field is to be written.
182
183     @Input             reg:            The name of the register into which the field is to
184                                                be written.
185
186     @Input             field:          The name of the field to be updated.
187
188     @Input             ui32Value:      The value to be written to the field - right aligned.
189
190     @Return    None.
191
192    ******************************************************************************/
193    IMG_VOID REGIO_WRITE_REPEATED_FIELD(IMG_UINT32      ui32RegValue, group, reg, field, IMG_UINT32 ui32RepIndex, IMG_UINT32    ui32Value);
194
195
196    /*!
197    ******************************************************************************
198
199     @Function  REGIO_WRITE_REGISTER
200
201     @Description
202
203     This macro is used to write a register.
204
205     @Input             ui32DevId:              The device Id within the group.
206
207     @Input             group:          The name of the group containing the register to be
208                                                written.
209
210     @Input             reg:            The name of the register to be written.
211
212     @Input             ui32RegValue:   The value to be written to the register.
213
214     @Return    None.
215
216    ******************************************************************************/
217    IMG_VOID REGIO_WRITE_REGISTER(IMG_UINT32    ui32DevId, group, reg, IMG_UINT32 ui32RegValue);
218
219    /*!
220    ******************************************************************************
221
222     @Function  REGIO_WRITE_TABLE_REGISTER
223
224     @Description
225
226     This macro is used to wrirte a register in a table.
227
228     @Input             ui32DevId:              The device Id within the group.
229
230     @Input             group:          The name of the group containing the register to be
231                                                written.
232
233     @Input             reg:            The name of the register to be written.
234
235     @Input             ui32TabIndex:   The index of the table entry to be written.
236
237     @Input             ui32RegValue:   The value to be written to the register.
238
239     @Return    None.
240
241    ******************************************************************************/
242    IMG_VOID REGIO_WRITE_TABLE_REGISTER(IMG_UINT32      ui32DevId, group, reg, IMG_UINT32 ui32TabIndex, IMG_UINT32 ui32RegValue);
243
244    /*!
245    ******************************************************************************
246
247     @Function  REGIO_WRITE_OFFSET_REGISTER
248
249     @Description
250
251     This macro is used to write a register at an offset from a given register.
252
253     @Input             ui32DevId:              The device Id within the group.
254
255     @Input             group:          The name of the group containing the register to be
256                                                written.
257
258     @Input             reg:            The name of the base register to be written.
259
260     @Input             ui32Offset:     The offset (eg. 0,1,2,...) of the register to be written.
261
262     @Input             ui32RegValue:   The value to be written to the register.
263
264     @Return    None.
265
266    ******************************************************************************/
267    IMG_VOID REGIO_WRITE_TABLE_REGISTER(IMG_UINT32      ui32DevId, group, reg, IMG_UINT32 ui32Offset, IMG_UINT32 ui32RegValue);
268
269#else
270
271    /*!
272    ******************************************************************************
273
274     @Function  REGIO_READ_FIELD
275
276    ******************************************************************************/
277#if 1
278#define REGIO_READ_FIELD(ui32RegValue, group, reg, field)                                                       \
279        ((ui32RegValue & group##_##reg##_##field##_MASK) >> group##_##reg##_##field##_SHIFT)
280
281#else
282
283#define REGIO_READ_FIELD(ui32RegValue, group, reg, field)                                                       \
284        ((ui32RegValue >> group##_##reg##_##field##_SHIFT) & group##_##reg##_##field##_LSBMASK)
285
286#endif
287
288    /*!
289    ******************************************************************************
290
291     @Function  REGIO_READ_REPEATED_FIELD
292
293    ******************************************************************************/
294#define REGIO_READ_REPEATED_FIELD(ui32RegValue, group, reg, field, ui32RepIndex)                                                                                                                                                                                                        \
295        ( IMG_ASSERT(ui32RepIndex < group##_##reg##_##field##_NO_REPS),                                                                                                                                                                                                                                                                 \
296        ((ui32RegValue & (group##_##reg##_##field##_MASK >> (ui32RepIndex * group##_##reg##_##field##_SIZE)))   \
297        >> (group##_##reg##_##field##_SHIFT - (ui32RepIndex * group##_##reg##_##field##_SIZE))) )
298
299    /*!
300    ******************************************************************************
301
302     @Function  REGIO_READ_REGISTER
303
304    ******************************************************************************/
305#define REGIO_READ_REGISTER(ui32DevId, group, reg)                      \
306        group##_ReadRegister(ui32DevId, group##_##reg##_OFFSET)
307
308    /*!
309    ******************************************************************************
310
311     @Function  REGIO_READ_TABLE_REGISTER
312
313     ******************************************************************************/
314#define REGIO_READ_TABLE_REGISTER(ui32DevId, group, reg, ui32TabIndex)  \
315        ( IMG_ASSERT(ui32TabIndex < group##_##reg##_NO_ENTRIES),                                \
316          group##_ReadRegister(ui32DevId, (group##_##reg##_OFFSET+(ui32TabIndex*group##_##reg##_STRIDE))) )
317
318    /*!
319    ******************************************************************************
320
321     @Function  REGIO_WRITE_FIELD
322
323    ******************************************************************************/
324#define REGIO_WRITE_FIELD(ui32RegValue, group, reg, field, ui32Value)                                       \
325        (ui32RegValue) =                                                                                                                                                \
326        ((ui32RegValue) & ~(group##_##reg##_##field##_MASK)) |                                                                  \
327                (((ui32Value) << (group##_##reg##_##field##_SHIFT)) & (group##_##reg##_##field##_MASK));
328
329#ifndef DEBUG
330#define REGIO_ASSERT( x ) ((void)0)
331#else
332#define REGIO_ASSERT( x ) IMG_ASSERT( x )
333#endif
334
335#define REGIO_WRITE_FIELD_MASKEDLITE(ui32RegValue, group, reg, field, ui32Value)                                                                                        \
336        do {    \
337                REGIO_ASSERT( ((ui32RegValue) & (group##_##reg##_##field##_MASK) ) == 0 );                                                                                      \
338                (ui32RegValue) |= (((ui32Value) << (group##_##reg##_##field##_SHIFT)) & (group##_##reg##_##field##_MASK));                      \
339        } while(0)
340
341#define REGIO_WRITE_FIELD_LITE(ui32RegValue, group, reg, field, ui32Value)                                                                                              \
342        do { \
343                REGIO_ASSERT( ((ui32RegValue) & (group##_##reg##_##field##_MASK) ) == 0 );                                                                                      \
344                REGIO_ASSERT( ( ( (ui32Value) << (group##_##reg##_##field##_SHIFT) ) & (~(group##_##reg##_##field##_MASK))) == 0);      \
345                (ui32RegValue) |=  ( (ui32Value) << (group##_##reg##_##field##_SHIFT) ) ;       \
346        } while(0)
347
348    /*!
349    ******************************************************************************
350
351     @Function  REGIO_WRITE_REPEATED_FIELD
352
353    ******************************************************************************/
354#define REGIO_WRITE_REPEATED_FIELD(ui32RegValue, group, reg, field, ui32RepIndex, ui32Value)                                                                                            \
355        IMG_ASSERT(ui32RepIndex < group##_##reg##_##field##_NO_REPS);                                                                                                                                                           \
356        ui32RegValue =                                                                                                                                                                                                                                                  \
357        (ui32RegValue & ~(group##_##reg##_##field##_MASK >> (ui32RepIndex * group##_##reg##_##field##_SIZE))) |         \
358                (ui32Value << (group##_##reg##_##field##_SHIFT - (ui32RepIndex * group##_##reg##_##field##_SIZE)) & (group##_##reg##_##field##_MASK >> (ui32RepIndex * group##_##reg##_##field##_SIZE)));
359
360    /*!
361    ******************************************************************************
362
363     @Function  REGIO_WRITE_REGISTER
364
365    ******************************************************************************/
366#define REGIO_WRITE_REGISTER(ui32DevId, group, reg, ui32RegValue)       \
367        group##_WriteRegister(ui32DevId, (group##_##reg##_OFFSET), (ui32RegValue))
368
369    /*!
370    ******************************************************************************
371
372     @Function  REGIO_WRITE_TABLE_REGISTER
373
374    ******************************************************************************/
375#define REGIO_WRITE_TABLE_REGISTER(ui32DevId, group, reg, ui32TabIndex, ui32RegValue)           \
376                group##_WriteRegister(ui32DevId, (group##_##reg##_OFFSET+(ui32TabIndex*group##_##reg##_STRIDE)), ui32RegValue)
377
378
379    /*!
380    ******************************************************************************
381
382     @Function  REGIO_WRITE_OFFSET_REGISTER
383
384    ******************************************************************************/
385#define REGIO_WRITE_OFFSET_REGISTER(ui32DevId, group, reg, ui32Offset, ui32RegValue)            \
386          group##_WriteRegister(ui32DevId, (group##_##reg##_OFFSET+(ui32Offset*4)), ui32RegValue)
387
388
389#endif
390
391
392#if (__cplusplus)
393}
394#endif
395
396#endif
397
398