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   : mem_io.h
30
31 @brief         Memory structure access macros.
32
33 @date          12/09/05
34
35 <b>Description:</b>\n
36
37 This file contains a set of memory access macros for accessing packed memory
38 structures.
39
40 <b>Platform:</b>\n
41 Platform Independent
42
43 @Version       1.0
44
45******************************************************************************/
46
47/*
48******************************************************************************
49 Modifications :-
50
51 $Log: mem_io.h $
52
53  --- Revision Logs Removed ---
54
55  --- Revision Logs Removed ---
56
57  --- Revision Logs Removed ---
58
59  --- Revision Logs Removed ---
60
61  --- Revision Logs Removed ---
62
63  --- Revision Logs Removed ---
64
65  --- Revision Logs Removed ---
66
67  --- Revision Logs Removed ---
68
69  --- Revision Logs Removed ---
70
71  --- Revision Logs Removed ---
72
73
74*****************************************************************************/
75
76#if !defined (__MEM_IO_H__)
77#define __MEM_IO_H__
78
79#if (__cplusplus)
80extern "C" {
81#endif
82
83#include "img_types.h"
84
85#ifdef DOXYGEN_WILL_SEE_THIS
86    /*!
87    ******************************************************************************
88
89     @Function  MEMIO_READ_FIELD
90
91     @Description
92
93     This macro is used to extract a field from a packed memory based structure.
94
95     @Input             vpMem:          A pointer to the memory structure.
96
97     @Input             field:          The name of the field to be extracted.
98
99     @Return    IMG_UINT32:     The value of the field - right aligned.
100
101    ******************************************************************************/
102    IMG_UINT32 MEMIO_READ_FIELD(IMG_VOID *      vpMem, field);
103
104    /*!
105    ******************************************************************************
106
107     @Function  MEMIO_READ_TABLE_FIELD
108
109     @Description
110
111     This macro is used to extract the value of a field in a table in a packed
112     memory based structure.
113
114     @Input             vpMem:          A pointer to the memory structure.
115
116     @Input             field:          The name of the field to be extracted.
117
118     @Input             ui32TabIndex:           The table index of the field to be extracted.
119
120     @Return    IMG_UINT32:     The value of the field - right aligned.
121
122    ******************************************************************************/
123    IMG_UINT32 MEMIO_READ_TABLE_FIELD(IMG_VOID *        vpMem, field, IMG_UINT32 ui32TabIndex);
124
125    /*!
126    ******************************************************************************
127
128     @Function  MEMIO_READ_REPEATED_FIELD
129
130     @Description
131
132     This macro is used to extract the value of a repeated field in a packed
133     memory based structure.
134
135     @Input             vpMem:          A pointer to the memory structure.
136
137     @Input             field:          The name of the field to be extracted.
138
139     @Input             ui32RepIndex:           The repeat index of the field to be extracted.
140
141     @Return    IMG_UINT32:     The value of the field - right aligned.
142
143    ******************************************************************************/
144    IMG_UINT32 MEMIO_READ_REPEATED_FIELD(IMG_VOID *     vpMem, field, IMG_UINT32 ui32RepIndex);
145
146    /*!
147    ******************************************************************************
148
149     @Function  MEMIO_READ_TABLE_REPEATED_FIELD
150
151     @Description
152
153     This macro is used to extract the value of a repeated field in a table
154     in a packed memory based structure.
155
156     @Input             vpMem:          A pointer to the memory structure.
157
158     @Input             field:          The name of the field to be extracted.
159
160     @Input             ui32TabIndex:           The table index of the field to be extracted.
161
162     @Input             ui32RepIndex:           The repeat index of the field to be extracted.
163
164     @Return    IMG_UINT32:     The value of the field - right aligned.
165
166    ******************************************************************************/
167    IMG_UINT32 MEMIO_READ_TABLE_REPEATED_FIELD(IMG_VOID *       vpMem, field, IMG_UINT32 ui32TabIndex, IMG_UINT32 ui32RepIndex);
168
169    /*!
170    ******************************************************************************
171
172     @Function  MEMIO_WRITE_FIELD
173
174     @Description
175
176     This macro is used to update the value of a field in a packed memory based
177     structure.
178
179     @Input             vpMem:          A pointer to the memory structure.
180
181     @Input             field:          The name of the field to be updated.
182
183     @Input             ui32Value:      The value to be writtem to the field - right aligned.
184
185     @Return    None.
186
187    ******************************************************************************/
188    IMG_VOID MEMIO_WRITE_FIELD(IMG_VOID *       vpMem, field, IMG_UINT32        ui32Value);
189
190    /*!
191    ******************************************************************************
192
193     @Function  MEMIO_WRITE_TABLE_FIELD
194
195     @Description
196
197     This macro is used to update the field in a table in a packed memory
198     based structure.
199
200     @Input             vpMem:          A pointer to the memory structure.
201
202     @Input             field:          The name of the field to be updated.
203
204     @Input             ui32TabIndex:           The table index of the field to be updated.
205
206     @Input             ui32Value:      The value to be writtem to the field - right aligned.
207
208     @Return    None.
209
210    ******************************************************************************/
211    IMG_VOID MEMIO_WRITE_TABLE_FIELD(IMG_VOID * vpMem, field, IMG_UINT32 ui32TabIndex, IMG_UINT32       ui32Value);
212
213    /*!
214    ******************************************************************************
215
216     @Function  MEMIO_WRITE_REPEATED_FIELD
217
218     @Description
219
220     This macro is used to update a repeated field in a packed memory
221     based structure.
222
223     @Input             vpMem:          A pointer to the memory structure.
224
225     @Input             field:          The name of the field to be updated.
226
227     @Input             ui32RepIndex:           The repeat index of the field to be updated.
228
229     @Input             ui32Value:      The value to be writtem to the field - right aligned.
230
231     @Return    None.
232
233    ******************************************************************************/
234    IMG_VOID MEMIO_WRITE_REPEATED_FIELD(IMG_VOID *      vpMem, field, IMG_UINT32 ui32RepIndex, IMG_UINT32       ui32Value);
235
236
237    /*!
238    ******************************************************************************
239
240     @Function  MEMIO_WRITE_TABLE_REPEATED_FIELD
241
242     @Description
243
244     This macro is used to update a repeated field in a table in a packed memory
245     based structure.
246
247     @Input             vpMem:          A pointer to the memory structure.
248
249     @Input             field:          The name of the field to be updated.
250
251     @Input             ui32TabIndex:           The table index of the field to be updated.
252
253     @Input             ui32RepIndex:           The repeat index of the field to be updated.
254
255     @Input             ui32Value:      The value to be writtem to the field - right aligned.
256
257     @Return    None.
258
259    ******************************************************************************/
260    IMG_VOID MEMIO_WRITE_TABLE_REPEATED_FIELD(IMG_VOID *        vpMem, field, IMG_UINT32 ui32TabIndex, IMG_UINT32 ui32RepIndex, IMG_UINT32      ui32Value);
261
262#else
263
264#if WIN32
265#define MEMIO_CHECK_ALIGNMENT(vpMem)
266
267#else
268#define MEMIO_CHECK_ALIGNMENT(vpMem)            \
269        IMG_ASSERT(((IMG_UINTPTR_T)vpMem & 0x3) == 0)
270#endif
271
272    /*!
273    ******************************************************************************
274
275     @Function  MEMIO_READ_FIELD
276
277    ******************************************************************************/
278
279
280#if defined __RELEASE_DEBUG__
281
282#define MEMIO_READ_FIELD(vpMem, field)                                                                                                                                                          \
283        ( MEMIO_CHECK_ALIGNMENT(vpMem),                                                                                                                                                                 \
284        ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & field##_MASK) >> field##_SHIFT)) )
285
286#else
287
288#if 1
289#define MEMIO_READ_FIELD(vpMem, field)                                                                                                                                                              \
290            ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & field##_MASK) >> field##_SHIFT))
291
292#else
293
294#define MEMIO_READ_FIELD(vpMem, field)                                                                                                                                                              \
295            ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) >> field##_SHIFT) & field##_LSBMASK) )
296
297#endif
298
299#endif
300
301
302
303    /*!
304    ******************************************************************************
305
306     @Function  MEMIO_READ_TABLE_FIELD
307
308    ******************************************************************************/
309#if defined __RELEASE_DEBUG__
310
311#define MEMIO_READ_TABLE_FIELD(vpMem, field, ui32TabIndex)                                                                                                                                                                                              \
312        ( MEMIO_CHECK_ALIGNMENT(vpMem), IMG_ASSERT((ui32TabIndex < field##_NO_ENTRIES) || (field##_NO_ENTRIES == 0)),                                                                           \
313        ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * ui32TabIndex)))) & field##_MASK) >> field##_SHIFT)) )       \
314
315#else
316
317#define MEMIO_READ_TABLE_FIELD(vpMem, field, ui32TabIndex)                                                                                                                                                                                              \
318        ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * ui32TabIndex)))) & field##_MASK) >> field##_SHIFT))         \
319
320#endif
321
322
323    /*!
324    ******************************************************************************
325
326     @Function  MEMIO_READ_REPEATED_FIELD
327
328    ******************************************************************************/
329#if defined __RELEASE_DEBUG__
330
331#define MEMIO_READ_REPEATED_FIELD(vpMem, field, ui32RepIndex)                                                                                                                                                                                                                                                           \
332        ( MEMIO_CHECK_ALIGNMENT(vpMem), IMG_ASSERT(ui32RepIndex < field##_NO_REPS),                                                                                                                                                                                                                     \
333        ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & (field##_MASK >> (ui32RepIndex * field##_SIZE))) >> (field##_SHIFT - (ui32RepIndex * field##_SIZE)))) )    \
334
335#else
336
337#define MEMIO_READ_REPEATED_FIELD(vpMem, field, ui32RepIndex)                                                                                                                                                                                                                                                           \
338        ( (IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & (field##_MASK >> (ui32RepIndex * field##_SIZE))) >> (field##_SHIFT - (ui32RepIndex * field##_SIZE))) )    \
339
340#endif
341    /*!
342    ******************************************************************************
343
344     @Function  MEMIO_READ_TABLE_REPEATED_FIELD
345
346    ******************************************************************************/
347#if defined __RELEASE_DEBUG__
348
349#define MEMIO_READ_TABLE_REPEATED_FIELD(vpMem, field, ui32TabIndex, ui32RepIndex)                                                                                                                                                                                                                                                                               \
350    ( MEMIO_CHECK_ALIGNMENT(vpMem), IMG_ASSERT((ui32TabIndex < field##_NO_ENTRIES) || (field##_NO_ENTRIES == 0)), IMG_ASSERT(ui32RepIndex < field##_NO_REPS), \
351    ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * ui32TabIndex)))) & (field##_MASK >> (ui32RepIndex * field##_SIZE))) >> (field##_SHIFT - (ui32RepIndex * field##_SIZE)))) )      \
352
353#else
354
355#define MEMIO_READ_TABLE_REPEATED_FIELD(vpMem, field, ui32TabIndex, ui32RepIndex)                                                                                                                                                                                                                                                                               \
356    ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * ui32TabIndex)))) & (field##_MASK >> (ui32RepIndex * field##_SIZE))) >> (field##_SHIFT - (ui32RepIndex * field##_SIZE))))        \
357
358#endif
359
360    /*!
361    ******************************************************************************
362
363     @Function  MEMIO_WRITE_FIELD
364
365    ******************************************************************************/
366#define MEMIO_WRITE_FIELD(vpMem, field, ui32Value)                                                                                                              \
367        MEMIO_CHECK_ALIGNMENT(vpMem);                                                                                                                                           \
368        (*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) =                                                                           \
369        ((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & (field##_TYPE)~field##_MASK) |           \
370                (field##_TYPE)(( (IMG_UINT32) (ui32Value) << field##_SHIFT) & field##_MASK);
371
372#define MEMIO_WRITE_FIELD_LITE(vpMem, field, ui32Value)                                                                                                 \
373        MEMIO_CHECK_ALIGNMENT(vpMem);                                                                                                                                           \
374         (*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) =                                                                          \
375        ((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) |                                          \
376                (field##_TYPE) (( (IMG_UINT32) (ui32Value) << field##_SHIFT)) );
377
378    /*!
379    ******************************************************************************
380
381     @Function  MEMIO_WRITE_TABLE_FIELD
382    ******************************************************************************/
383#define MEMIO_WRITE_TABLE_FIELD(vpMem, field, ui32TabIndex, ui32Value)                                                                                                                                          \
384        MEMIO_CHECK_ALIGNMENT(vpMem); IMG_ASSERT(((ui32TabIndex) < field##_NO_ENTRIES) || (field##_NO_ENTRIES == 0));                                                   \
385        (*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * (ui32TabIndex))))) =                                                                               \
386                ((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * (ui32TabIndex))))) & (field##_TYPE)~field##_MASK) |       \
387                (field##_TYPE)(( (IMG_UINT32) (ui32Value) << field##_SHIFT) & field##_MASK);
388
389    /*!
390    ******************************************************************************
391
392     @Function  MEMIO_WRITE_REPEATED_FIELD
393
394    ******************************************************************************/
395#define MEMIO_WRITE_REPEATED_FIELD(vpMem, field, ui32RepIndex, ui32Value)                                                                                                                                       \
396        MEMIO_CHECK_ALIGNMENT(vpMem); IMG_ASSERT((ui32RepIndex) < field##_NO_REPS);                                                                                                                             \
397        (*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) =                                                                                                                                                   \
398        ((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & (field##_TYPE)~(field##_MASK >> ((ui32RepIndex) * field##_SIZE)) |                       \
399                (field##_TYPE)(( (IMG_UINT32) (ui32Value) << (field##_SHIFT - ((ui32RepIndex) * field##_SIZE))) & (field##_MASK >> ((ui32RepIndex) * field##_SIZE))));
400
401    /*!
402    ******************************************************************************
403
404     @Function  MEMIO_WRITE_TABLE_REPEATED_FIELD
405
406    ******************************************************************************/
407#define MEMIO_WRITE_TABLE_REPEATED_FIELD(vpMem, field, ui32TabIndex, ui32RepIndex, ui32Value)                                                                                                                                                                           \
408        MEMIO_CHECK_ALIGNMENT(vpMem); IMG_ASSERT(((ui32TabIndex) < field##_NO_ENTRIES) || (field##_NO_ENTRIES == 0)); IMG_ASSERT((ui32RepIndex) < field##_NO_REPS);                                             \
409        (*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * (ui32TabIndex))))) =                                                                                                                                                               \
410                ((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * (ui32TabIndex))))) & (field##_TYPE)~(field##_MASK >> ((ui32RepIndex) * field##_SIZE))) |          \
411                (field##_TYPE)(( (IMG_UINT32) (ui32Value) << (field##_SHIFT - ((ui32RepIndex) * field##_SIZE))) & (field##_MASK >> ((ui32RepIndex) * field##_SIZE)));
412
413#endif
414
415
416#if (__cplusplus)
417}
418#endif
419
420#endif
421
422