Home | History | Annotate | Download | only in hwdefs
      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)
     80 extern "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