/*
* Copyright (c) 2007-2015 Solarflare Communications Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are
* those of the authors and should not be interpreted as representing official
* policies, either expressed or implied, of the FreeBSD Project.
*
* Ackowledgement to Fen Systems Ltd.
*/
#ifndef _SYS_EFX_TYPES_H
#define _SYS_EFX_TYPES_H
#include "efsys.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* Bitfield access
*
* Solarflare NICs make extensive use of bitfields up to 128 bits
* wide. Since there is no native 128-bit datatype on most systems,
* and since 64-bit datatypes are inefficient on 32-bit systems and
* vice versa, we wrap accesses in a way that uses the most efficient
* datatype.
*
* The NICs are PCI devices and therefore little-endian. Since most
* we define our datatypes (efx_oword_t, efx_qword_t and efx_dword_t)
* to be little-endian.
*
* In the less common case of using PIO for individual register
* writes, we construct the little-endian datatype in host memory and
* then use non-swapping register access primitives, rather than
* constructing a native-endian datatype and relying on implicit
* byte-swapping. (We use a similar strategy for register reads.)
*/
/*
* NOTE: Field definitions here and elsewhere are done in terms of a lowest
* bit number (LBN) and a width.
*/
#define EFX_DUMMY_FIELD_LBN 0
#define EFX_DUMMY_FIELD_WIDTH 0
#define EFX_BYTE_0_LBN 0
#define EFX_WORD_0_LBN 0
#define EFX_DWORD_0_LBN 0
/* There are intentionally no EFX_QWORD_0 or EFX_QWORD_1 field definitions
* here as the implementaion of EFX_QWORD_FIELD and EFX_OWORD_FIELD do not
* support field widths larger than 32 bits.
*/
/* Specified attribute (i.e. LBN ow WIDTH) of the specified field */
_field ## _ ## _attribute
/* Lowest bit number of the specified field */
/* Width of the specified field */
/* Highest bit number of the specified field */
/*
* 64-bit mask equal in width to the specified field.
*
* For example, a field with width 5 would have a mask of 0x000000000000001f.
*/
/*
* 32-bit mask equal in width to the specified field.
*
* For example, a field with width 5 would have a mask of 0x0000001f.
*/
/*
* 16-bit mask equal in width to the specified field.
*
* For example, a field with width 5 would have a mask of 0x001f.
*/
/*
* 8-bit mask equal in width to the specified field.
*
* For example, a field with width 5 would have a mask of 0x1f.
*/
#pragma pack(1)
/*
* A byte (i.e. 8-bit) datatype
*/
typedef union efx_byte_u {
} efx_byte_t;
/*
* A word (i.e. 16-bit) datatype
*
* This datatype is defined to be little-endian.
*/
typedef union efx_word_u {
} efx_word_t;
/*
* A doubleword (i.e. 32-bit) datatype
*
* This datatype is defined to be little-endian.
*/
typedef union efx_dword_u {
} efx_dword_t;
/*
* A quadword (i.e. 64-bit) datatype
*
* This datatype is defined to be little-endian.
*/
typedef union efx_qword_u {
#if EFSYS_HAS_UINT64
#endif
} efx_qword_t;
/*
* An octword (i.e. 128-bit) datatype
*
* This datatype is defined to be little-endian.
*/
typedef union efx_oword_u {
#endif
#if EFSYS_HAS_UINT64
#endif
} efx_oword_t;
#pragma pack()
#else
#error "Neither of EFSYS_IS_{BIG,LITTLE}_ENDIAN is set"
#endif
/* Format string for printing an efx_byte_t */
/* Format string for printing an efx_word_t */
/* Format string for printing an efx_dword_t */
/* Format string for printing an efx_qword_t */
/* Format string for printing an efx_oword_t */
/* Parameters for printing an efx_byte_t */
/* Parameters for printing an efx_word_t */
/* Parameters for printing an efx_dword_t */
/* Parameters for printing an efx_qword_t */
/* Parameters for printing an efx_oword_t */
/*
* Stop lint complaining about some shifts.
*/
#ifdef __lint
extern int fix_lint;
#else
#endif
/*
* Extract bit field portion [low,high) from the native-endian element
* which contains bits [min,max).
*
* For example, suppose "element" represents the high 32 bits of a
* 64-bit value, and we wish to extract the bits belonging to the bit
* field occupying bits 28-45 of this 64-bit value.
*
* Then EFX_EXTRACT(_element, 32, 63, 28, 45) would give
*
* (_element) << 4
*
* The result will contain the relevant bits filled in in the range
* [0,high-low), with garbage in bits [high-low+1,...).
*/
0U : \
/*
* Extract bit field portion [low,high) from the 64-bit little-endian
* element which contains bits [min,max)
*/
/*
* Extract bit field portion [low,high) from the 32-bit little-endian
* element which contains bits [min,max)
*/
/*
* Extract bit field portion [low,high) from the 16-bit little-endian
* element which contains bits [min,max)
*/
/*
* Extract bit field portion [low,high) from the 8-bit
* element which contains bits [min,max)
*/
/*
* Construct bit field portion
*
* Creates the portion of the bit field [low,high) that lies within
* the range [min,max).
*/
0U : \
0U : \
0U : \
0U : \
/*
* Construct bit field portion
*
* Creates the portion of the named bit field that lies within the
* range [min,max).
*/
/*
* Construct bit field
*
* Creates the portion of the named bit fields that lie within the
* range [min,max).
*/
__NATIVE_8( \
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
/* Populate an octword field with various numbers of arguments */
/* Populate a quadword field with various numbers of arguments */
/* Populate a dword field with various numbers of arguments */
EFX_DWORD_0, 0xffffffff)
/* Populate a word field with various numbers of arguments */
EFX_WORD_0, 0xffff)
/* Populate a byte field with various numbers of arguments */
EFX_BYTE_0, 0xff)
/*
* Modify a named field within an already-populated structure. Used
* for read-modify-write operations.
*/
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
/*
* Set or clear a numbered bit within an octword.
*/
0U)
0U)
0U)
0U)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
do { \
} while (B_FALSE)
#if EFSYS_USE_UINT64
#else
#endif
#ifdef __cplusplus
}
#endif
#endif /* _SYS_EFX_TYPES_H */