/* * Copyright (c) 2011 Intel Corporation. All Rights Reserved. * Copyright (c) Imagination Technologies Limited, UK * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*! ****************************************************************************** @file : mem_io.h @brief Memory structure access macros. @date 12/09/05 Description:\n This file contains a set of memory access macros for accessing packed memory structures. Platform:\n Platform Independent @Version 1.0 ******************************************************************************/ /* ****************************************************************************** Modifications :- $Log: mem_io.h $ --- Revision Logs Removed --- --- Revision Logs Removed --- --- Revision Logs Removed --- --- Revision Logs Removed --- --- Revision Logs Removed --- --- Revision Logs Removed --- --- Revision Logs Removed --- --- Revision Logs Removed --- --- Revision Logs Removed --- --- Revision Logs Removed --- *****************************************************************************/ #if !defined (__MEM_IO_H__) #define __MEM_IO_H__ #if (__cplusplus) extern "C" { #endif #include "img_types.h" #ifdef DOXYGEN_WILL_SEE_THIS /*! ****************************************************************************** @Function MEMIO_READ_FIELD @Description This macro is used to extract a field from a packed memory based structure. @Input vpMem: A pointer to the memory structure. @Input field: The name of the field to be extracted. @Return IMG_UINT32: The value of the field - right aligned. ******************************************************************************/ IMG_UINT32 MEMIO_READ_FIELD(IMG_VOID * vpMem, field); /*! ****************************************************************************** @Function MEMIO_READ_TABLE_FIELD @Description This macro is used to extract the value of a field in a table in a packed memory based structure. @Input vpMem: A pointer to the memory structure. @Input field: The name of the field to be extracted. @Input ui32TabIndex: The table index of the field to be extracted. @Return IMG_UINT32: The value of the field - right aligned. ******************************************************************************/ IMG_UINT32 MEMIO_READ_TABLE_FIELD(IMG_VOID * vpMem, field, IMG_UINT32 ui32TabIndex); /*! ****************************************************************************** @Function MEMIO_READ_REPEATED_FIELD @Description This macro is used to extract the value of a repeated field in a packed memory based structure. @Input vpMem: A pointer to the memory structure. @Input field: The name of the field to be extracted. @Input ui32RepIndex: The repeat index of the field to be extracted. @Return IMG_UINT32: The value of the field - right aligned. ******************************************************************************/ IMG_UINT32 MEMIO_READ_REPEATED_FIELD(IMG_VOID * vpMem, field, IMG_UINT32 ui32RepIndex); /*! ****************************************************************************** @Function MEMIO_READ_TABLE_REPEATED_FIELD @Description This macro is used to extract the value of a repeated field in a table in a packed memory based structure. @Input vpMem: A pointer to the memory structure. @Input field: The name of the field to be extracted. @Input ui32TabIndex: The table index of the field to be extracted. @Input ui32RepIndex: The repeat index of the field to be extracted. @Return IMG_UINT32: The value of the field - right aligned. ******************************************************************************/ IMG_UINT32 MEMIO_READ_TABLE_REPEATED_FIELD(IMG_VOID * vpMem, field, IMG_UINT32 ui32TabIndex, IMG_UINT32 ui32RepIndex); /*! ****************************************************************************** @Function MEMIO_WRITE_FIELD @Description This macro is used to update the value of a field in a packed memory based structure. @Input vpMem: A pointer to the memory structure. @Input field: The name of the field to be updated. @Input ui32Value: The value to be writtem to the field - right aligned. @Return None. ******************************************************************************/ IMG_VOID MEMIO_WRITE_FIELD(IMG_VOID * vpMem, field, IMG_UINT32 ui32Value); /*! ****************************************************************************** @Function MEMIO_WRITE_TABLE_FIELD @Description This macro is used to update the field in a table in a packed memory based structure. @Input vpMem: A pointer to the memory structure. @Input field: The name of the field to be updated. @Input ui32TabIndex: The table index of the field to be updated. @Input ui32Value: The value to be writtem to the field - right aligned. @Return None. ******************************************************************************/ IMG_VOID MEMIO_WRITE_TABLE_FIELD(IMG_VOID * vpMem, field, IMG_UINT32 ui32TabIndex, IMG_UINT32 ui32Value); /*! ****************************************************************************** @Function MEMIO_WRITE_REPEATED_FIELD @Description This macro is used to update a repeated field in a packed memory based structure. @Input vpMem: A pointer to the memory structure. @Input field: The name of the field to be updated. @Input ui32RepIndex: The repeat index of the field to be updated. @Input ui32Value: The value to be writtem to the field - right aligned. @Return None. ******************************************************************************/ IMG_VOID MEMIO_WRITE_REPEATED_FIELD(IMG_VOID * vpMem, field, IMG_UINT32 ui32RepIndex, IMG_UINT32 ui32Value); /*! ****************************************************************************** @Function MEMIO_WRITE_TABLE_REPEATED_FIELD @Description This macro is used to update a repeated field in a table in a packed memory based structure. @Input vpMem: A pointer to the memory structure. @Input field: The name of the field to be updated. @Input ui32TabIndex: The table index of the field to be updated. @Input ui32RepIndex: The repeat index of the field to be updated. @Input ui32Value: The value to be writtem to the field - right aligned. @Return None. ******************************************************************************/ IMG_VOID MEMIO_WRITE_TABLE_REPEATED_FIELD(IMG_VOID * vpMem, field, IMG_UINT32 ui32TabIndex, IMG_UINT32 ui32RepIndex, IMG_UINT32 ui32Value); #else #if WIN32 #define MEMIO_CHECK_ALIGNMENT(vpMem) #else #define MEMIO_CHECK_ALIGNMENT(vpMem) \ IMG_ASSERT(((IMG_UINTPTR_T)vpMem & 0x3) == 0) #endif /*! ****************************************************************************** @Function MEMIO_READ_FIELD ******************************************************************************/ #if defined __RELEASE_DEBUG__ #define MEMIO_READ_FIELD(vpMem, field) \ ( MEMIO_CHECK_ALIGNMENT(vpMem), \ ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & field##_MASK) >> field##_SHIFT)) ) #else #if 1 #define MEMIO_READ_FIELD(vpMem, field) \ ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & field##_MASK) >> field##_SHIFT)) #else #define MEMIO_READ_FIELD(vpMem, field) \ ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) >> field##_SHIFT) & field##_LSBMASK) ) #endif #endif /*! ****************************************************************************** @Function MEMIO_READ_TABLE_FIELD ******************************************************************************/ #if defined __RELEASE_DEBUG__ #define MEMIO_READ_TABLE_FIELD(vpMem, field, ui32TabIndex) \ ( MEMIO_CHECK_ALIGNMENT(vpMem), IMG_ASSERT((ui32TabIndex < field##_NO_ENTRIES) || (field##_NO_ENTRIES == 0)), \ ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * ui32TabIndex)))) & field##_MASK) >> field##_SHIFT)) ) \ #else #define MEMIO_READ_TABLE_FIELD(vpMem, field, ui32TabIndex) \ ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * ui32TabIndex)))) & field##_MASK) >> field##_SHIFT)) \ #endif /*! ****************************************************************************** @Function MEMIO_READ_REPEATED_FIELD ******************************************************************************/ #if defined __RELEASE_DEBUG__ #define MEMIO_READ_REPEATED_FIELD(vpMem, field, ui32RepIndex) \ ( MEMIO_CHECK_ALIGNMENT(vpMem), IMG_ASSERT(ui32RepIndex < field##_NO_REPS), \ ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & (field##_MASK >> (ui32RepIndex * field##_SIZE))) >> (field##_SHIFT - (ui32RepIndex * field##_SIZE)))) ) \ #else #define MEMIO_READ_REPEATED_FIELD(vpMem, field, ui32RepIndex) \ ( (IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & (field##_MASK >> (ui32RepIndex * field##_SIZE))) >> (field##_SHIFT - (ui32RepIndex * field##_SIZE))) ) \ #endif /*! ****************************************************************************** @Function MEMIO_READ_TABLE_REPEATED_FIELD ******************************************************************************/ #if defined __RELEASE_DEBUG__ #define MEMIO_READ_TABLE_REPEATED_FIELD(vpMem, field, ui32TabIndex, ui32RepIndex) \ ( MEMIO_CHECK_ALIGNMENT(vpMem), IMG_ASSERT((ui32TabIndex < field##_NO_ENTRIES) || (field##_NO_ENTRIES == 0)), IMG_ASSERT(ui32RepIndex < field##_NO_REPS), \ ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * ui32TabIndex)))) & (field##_MASK >> (ui32RepIndex * field##_SIZE))) >> (field##_SHIFT - (ui32RepIndex * field##_SIZE)))) ) \ #else #define MEMIO_READ_TABLE_REPEATED_FIELD(vpMem, field, ui32TabIndex, ui32RepIndex) \ ((IMG_UINT32)(((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * ui32TabIndex)))) & (field##_MASK >> (ui32RepIndex * field##_SIZE))) >> (field##_SHIFT - (ui32RepIndex * field##_SIZE)))) \ #endif /*! ****************************************************************************** @Function MEMIO_WRITE_FIELD ******************************************************************************/ #define MEMIO_WRITE_FIELD(vpMem, field, ui32Value) \ MEMIO_CHECK_ALIGNMENT(vpMem); \ (*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) = \ ((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & (field##_TYPE)~field##_MASK) | \ (field##_TYPE)(( (IMG_UINT32) (ui32Value) << field##_SHIFT) & field##_MASK); #define MEMIO_WRITE_FIELD_LITE(vpMem, field, ui32Value) \ MEMIO_CHECK_ALIGNMENT(vpMem); \ (*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) = \ ((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) | \ (field##_TYPE) (( (IMG_UINT32) (ui32Value) << field##_SHIFT)) ); /*! ****************************************************************************** @Function MEMIO_WRITE_TABLE_FIELD ******************************************************************************/ #define MEMIO_WRITE_TABLE_FIELD(vpMem, field, ui32TabIndex, ui32Value) \ MEMIO_CHECK_ALIGNMENT(vpMem); IMG_ASSERT(((ui32TabIndex) < field##_NO_ENTRIES) || (field##_NO_ENTRIES == 0)); \ (*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * (ui32TabIndex))))) = \ ((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * (ui32TabIndex))))) & (field##_TYPE)~field##_MASK) | \ (field##_TYPE)(( (IMG_UINT32) (ui32Value) << field##_SHIFT) & field##_MASK); /*! ****************************************************************************** @Function MEMIO_WRITE_REPEATED_FIELD ******************************************************************************/ #define MEMIO_WRITE_REPEATED_FIELD(vpMem, field, ui32RepIndex, ui32Value) \ MEMIO_CHECK_ALIGNMENT(vpMem); IMG_ASSERT((ui32RepIndex) < field##_NO_REPS); \ (*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) = \ ((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET))) & (field##_TYPE)~(field##_MASK >> ((ui32RepIndex) * field##_SIZE)) | \ (field##_TYPE)(( (IMG_UINT32) (ui32Value) << (field##_SHIFT - ((ui32RepIndex) * field##_SIZE))) & (field##_MASK >> ((ui32RepIndex) * field##_SIZE)))); /*! ****************************************************************************** @Function MEMIO_WRITE_TABLE_REPEATED_FIELD ******************************************************************************/ #define MEMIO_WRITE_TABLE_REPEATED_FIELD(vpMem, field, ui32TabIndex, ui32RepIndex, ui32Value) \ MEMIO_CHECK_ALIGNMENT(vpMem); IMG_ASSERT(((ui32TabIndex) < field##_NO_ENTRIES) || (field##_NO_ENTRIES == 0)); IMG_ASSERT((ui32RepIndex) < field##_NO_REPS); \ (*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * (ui32TabIndex))))) = \ ((*((field##_TYPE *)(((IMG_UINTPTR_T)vpMem) + field##_OFFSET + (field##_STRIDE * (ui32TabIndex))))) & (field##_TYPE)~(field##_MASK >> ((ui32RepIndex) * field##_SIZE))) | \ (field##_TYPE)(( (IMG_UINT32) (ui32Value) << (field##_SHIFT - ((ui32RepIndex) * field##_SIZE))) & (field##_MASK >> ((ui32RepIndex) * field##_SIZE))); #endif #if (__cplusplus) } #endif #endif