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)
42 extern "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