Annotation of qemu/roms/ipxe/src/drivers/infiniband/mlx_bitops.h, revision 1.1.1.1

1.1       root        1: #ifndef _MLX_BITOPS_H
                      2: #define _MLX_BITOPS_H
                      3: 
                      4: /*
                      5:  * Copyright (C) 2007 Michael Brown <[email protected]>.
                      6:  *
                      7:  * This program is free software; you can redistribute it and/or
                      8:  * modify it under the terms of the GNU General Public License as
                      9:  * published by the Free Software Foundation; either version 2 of the
                     10:  * License, or any later version.
                     11:  *
                     12:  * This program is distributed in the hope that it will be useful, but
                     13:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     15:  * General Public License for more details.
                     16:  *
                     17:  * You should have received a copy of the GNU General Public License
                     18:  * along with this program; if not, write to the Free Software
                     19:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     20:  */
                     21: 
                     22: FILE_LICENCE ( GPL2_OR_LATER );
                     23: 
                     24: /**
                     25:  * @file
                     26:  *
                     27:  * Mellanox bit operations
                     28:  *
                     29:  */
                     30: 
                     31: /* Datatype used to represent a bit in the Mellanox autogenerated headers */
                     32: typedef unsigned char pseudo_bit_t;
                     33: 
                     34: /**
                     35:  * Wrapper structure for pseudo_bit_t structures
                     36:  *
                     37:  * This structure provides a wrapper around the autogenerated
                     38:  * pseudo_bit_t structures.  It has the correct size, and also
                     39:  * encapsulates type information about the underlying pseudo_bit_t
                     40:  * structure, which allows the MLX_FILL etc. macros to work without
                     41:  * requiring explicit type information.
                     42:  */
                     43: #define MLX_DECLARE_STRUCT( _structure )                                    \
                     44:        _structure {                                                         \
                     45:            union {                                                          \
                     46:                uint8_t bytes[ sizeof ( struct _structure ## _st ) / 8 ];    \
                     47:                uint32_t dwords[ sizeof ( struct _structure ## _st ) / 32 ]; \
                     48:                struct _structure ## _st *dummy[0];                          \
                     49:            } __attribute__ (( packed )) u;                                  \
                     50:        } __attribute__ (( packed ))
                     51: 
                     52: /** Get pseudo_bit_t structure type from wrapper structure pointer */
                     53: #define MLX_PSEUDO_STRUCT( _ptr )                                           \
                     54:        typeof ( *((_ptr)->u.dummy[0]) )
                     55: 
                     56: /** Bit offset of a field within a pseudo_bit_t structure */
                     57: #define MLX_BIT_OFFSET( _structure_st, _field )                                     \
                     58:        offsetof ( _structure_st, _field )
                     59: 
                     60: /** Dword offset of a field within a pseudo_bit_t structure */
                     61: #define MLX_DWORD_OFFSET( _structure_st, _field )                           \
                     62:        ( MLX_BIT_OFFSET ( _structure_st, _field ) / 32 )
                     63: 
                     64: /** Dword bit offset of a field within a pseudo_bit_t structure
                     65:  *
                     66:  * Yes, using mod-32 would work, but would lose the check for the
                     67:  * error of specifying a mismatched field name and dword index.
                     68:  */
                     69: #define MLX_DWORD_BIT_OFFSET( _structure_st, _index, _field )               \
                     70:        ( MLX_BIT_OFFSET ( _structure_st, _field ) - ( 32 * (_index) ) )
                     71: 
                     72: /** Bit width of a field within a pseudo_bit_t structure */
                     73: #define MLX_BIT_WIDTH( _structure_st, _field )                              \
                     74:        sizeof ( ( ( _structure_st * ) NULL )->_field )
                     75: 
                     76: /** Bit mask for a field within a pseudo_bit_t structure */
                     77: #define MLX_BIT_MASK( _structure_st, _field )                               \
                     78:        ( ( ~( ( uint32_t ) 0 ) ) >>                                         \
                     79:          ( 32 - MLX_BIT_WIDTH ( _structure_st, _field ) ) )
                     80: 
                     81: /*
                     82:  * Assemble native-endian dword from named fields and values
                     83:  *
                     84:  */
                     85: 
                     86: #define MLX_ASSEMBLE_1( _structure_st, _index, _field, _value )                     \
                     87:        ( (_value) << MLX_DWORD_BIT_OFFSET ( _structure_st, _index, _field ) )
                     88: 
                     89: #define MLX_ASSEMBLE_2( _structure_st, _index, _field, _value, ... )        \
                     90:        ( MLX_ASSEMBLE_1 ( _structure_st, _index, _field, _value ) |         \
                     91:          MLX_ASSEMBLE_1 ( _structure_st, _index, __VA_ARGS__ ) )
                     92: 
                     93: #define MLX_ASSEMBLE_3( _structure_st, _index, _field, _value, ... )        \
                     94:        ( MLX_ASSEMBLE_1 ( _structure_st, _index, _field, _value ) |         \
                     95:          MLX_ASSEMBLE_2 ( _structure_st, _index, __VA_ARGS__ ) )
                     96: 
                     97: #define MLX_ASSEMBLE_4( _structure_st, _index, _field, _value, ... )        \
                     98:        ( MLX_ASSEMBLE_1 ( _structure_st, _index, _field, _value ) |         \
                     99:          MLX_ASSEMBLE_3 ( _structure_st, _index, __VA_ARGS__ ) )
                    100: 
                    101: #define MLX_ASSEMBLE_5( _structure_st, _index, _field, _value, ... )        \
                    102:        ( MLX_ASSEMBLE_1 ( _structure_st, _index, _field, _value ) |         \
                    103:          MLX_ASSEMBLE_4 ( _structure_st, _index, __VA_ARGS__ ) )
                    104: 
                    105: #define MLX_ASSEMBLE_6( _structure_st, _index, _field, _value, ... )        \
                    106:        ( MLX_ASSEMBLE_1 ( _structure_st, _index, _field, _value ) |         \
                    107:          MLX_ASSEMBLE_5 ( _structure_st, _index, __VA_ARGS__ ) )
                    108: 
                    109: #define MLX_ASSEMBLE_7( _structure_st, _index, _field, _value, ... )        \
                    110:        ( MLX_ASSEMBLE_1 ( _structure_st, _index, _field, _value ) |         \
                    111:          MLX_ASSEMBLE_6 ( _structure_st, _index, __VA_ARGS__ ) )
                    112: 
                    113: #define MLX_ASSEMBLE_8( _structure_st, _index, _field, _value, ... )        \
                    114:        ( MLX_ASSEMBLE_1 ( _structure_st, _index, _field, _value ) |         \
                    115:          MLX_ASSEMBLE_7 ( _structure_st, _index, __VA_ARGS__ ) )
                    116: 
                    117: /*
                    118:  * Build native-endian (positive) dword bitmasks from named fields
                    119:  *
                    120:  */
                    121: 
                    122: #define MLX_MASK_1( _structure_st, _index, _field )                         \
                    123:        ( MLX_BIT_MASK ( _structure_st, _field ) <<                          \
                    124:          MLX_DWORD_BIT_OFFSET ( _structure_st, _index, _field ) )
                    125: 
                    126: #define MLX_MASK_2( _structure_st, _index, _field, ... )                    \
                    127:        ( MLX_MASK_1 ( _structure_st, _index, _field ) |                     \
                    128:          MLX_MASK_1 ( _structure_st, _index, __VA_ARGS__ ) )
                    129: 
                    130: #define MLX_MASK_3( _structure_st, _index, _field, ... )                    \
                    131:        ( MLX_MASK_1 ( _structure_st, _index, _field ) |                     \
                    132:          MLX_MASK_2 ( _structure_st, _index, __VA_ARGS__ ) )
                    133: 
                    134: #define MLX_MASK_4( _structure_st, _index, _field, ... )                    \
                    135:        ( MLX_MASK_1 ( _structure_st, _index, _field ) |                     \
                    136:          MLX_MASK_3 ( _structure_st, _index, __VA_ARGS__ ) )
                    137: 
                    138: #define MLX_MASK_5( _structure_st, _index, _field, ... )                    \
                    139:        ( MLX_MASK_1 ( _structure_st, _index, _field ) |                     \
                    140:          MLX_MASK_4 ( _structure_st, _index, __VA_ARGS__ ) )
                    141: 
                    142: #define MLX_MASK_6( _structure_st, _index, _field, ... )                    \
                    143:        ( MLX_MASK_1 ( _structure_st, _index, _field ) |                     \
                    144:          MLX_MASK_5 ( _structure_st, _index, __VA_ARGS__ ) )
                    145: 
                    146: #define MLX_MASK_7( _structure_st, _index, _field, ... )                    \
                    147:        ( MLX_MASK_1 ( _structure_st, _index, _field ) |                     \
                    148:          MLX_MASK_6 ( _structure_st, _index, __VA_ARGS__ ) )
                    149: 
                    150: #define MLX_MASK_8( _structure_st, _index, _field, ... )                    \
                    151:        ( MLX_MASK_1 ( _structure_st, _index, _field ) |                     \
                    152:          MLX_MASK_7 ( _structure_st, _index, __VA_ARGS__ ) )
                    153: 
                    154: /*
                    155:  * Populate big-endian dwords from named fields and values
                    156:  *
                    157:  */
                    158: 
                    159: #define MLX_FILL( _ptr, _index, _assembled )                                \
                    160:        do {                                                                 \
                    161:                uint32_t *__ptr = &(_ptr)->u.dwords[(_index)];               \
                    162:                uint32_t __assembled = (_assembled);                         \
                    163:                *__ptr = cpu_to_be32 ( __assembled );                        \
                    164:        } while ( 0 )
                    165: 
                    166: #define MLX_FILL_1( _ptr, _index, ... )                                             \
                    167:        MLX_FILL ( _ptr, _index, MLX_ASSEMBLE_1 ( MLX_PSEUDO_STRUCT ( _ptr ),\
                    168:                                                  _index, __VA_ARGS__ ) )
                    169: 
                    170: #define MLX_FILL_2( _ptr, _index, ... )                                             \
                    171:        MLX_FILL ( _ptr, _index, MLX_ASSEMBLE_2 ( MLX_PSEUDO_STRUCT ( _ptr ),\
                    172:                                                  _index, __VA_ARGS__ ) )
                    173: 
                    174: #define MLX_FILL_3( _ptr, _index, ... )                                             \
                    175:        MLX_FILL ( _ptr, _index, MLX_ASSEMBLE_3 ( MLX_PSEUDO_STRUCT ( _ptr ),\
                    176:                                                  _index, __VA_ARGS__ ) )
                    177: 
                    178: #define MLX_FILL_4( _ptr, _index, ... )                                             \
                    179:        MLX_FILL ( _ptr, _index, MLX_ASSEMBLE_4 ( MLX_PSEUDO_STRUCT ( _ptr ),\
                    180:                                                  _index, __VA_ARGS__ ) )
                    181: 
                    182: #define MLX_FILL_5( _ptr, _index, ... )                                             \
                    183:        MLX_FILL ( _ptr, _index, MLX_ASSEMBLE_5 ( MLX_PSEUDO_STRUCT ( _ptr ),\
                    184:                                                  _index, __VA_ARGS__ ) )
                    185: 
                    186: #define MLX_FILL_6( _ptr, _index, ... )                                             \
                    187:        MLX_FILL ( _ptr, _index, MLX_ASSEMBLE_6 ( MLX_PSEUDO_STRUCT ( _ptr ),\
                    188:                                                  _index, __VA_ARGS__ ) )
                    189: 
                    190: #define MLX_FILL_7( _ptr, _index, ... )                                             \
                    191:        MLX_FILL ( _ptr, _index, MLX_ASSEMBLE_7 ( MLX_PSEUDO_STRUCT ( _ptr ),\
                    192:                                                  _index, __VA_ARGS__ ) )
                    193: 
                    194: #define MLX_FILL_8( _ptr, _index, ... )                                             \
                    195:        MLX_FILL ( _ptr, _index, MLX_ASSEMBLE_8 ( MLX_PSEUDO_STRUCT ( _ptr ),\
                    196:                                                  _index, __VA_ARGS__ ) )
                    197: 
                    198: /*
                    199:  * Modify big-endian dword using named field and value
                    200:  *
                    201:  */
                    202: 
                    203: #define MLX_SET( _ptr, _field, _value )                                             \
                    204:        do {                                                                 \
                    205:                unsigned int __index =                                       \
                    206:                    MLX_DWORD_OFFSET ( MLX_PSEUDO_STRUCT ( _ptr ), _field ); \
                    207:                uint32_t *__ptr = &(_ptr)->u.dwords[__index];                \
                    208:                uint32_t __value = be32_to_cpu ( *__ptr );                   \
                    209:                __value &= ~( MLX_MASK_1 ( MLX_PSEUDO_STRUCT ( _ptr ),       \
                    210:                                           __index, _field ) );              \
                    211:                __value |= MLX_ASSEMBLE_1 ( MLX_PSEUDO_STRUCT ( _ptr ),      \
                    212:                                            __index, _field, _value );       \
                    213:                *__ptr = cpu_to_be32 ( __value );                            \
                    214:        } while ( 0 )
                    215: 
                    216: /*
                    217:  * Extract value of named field
                    218:  *
                    219:  */
                    220: 
                    221: #define MLX_GET( _ptr, _field )                                                     \
                    222:        ( {                                                                  \
                    223:                unsigned int __index =                                       \
                    224:                    MLX_DWORD_OFFSET ( MLX_PSEUDO_STRUCT ( _ptr ), _field ); \
                    225:                uint32_t *__ptr = &(_ptr)->u.dwords[__index];                \
                    226:                uint32_t __value = be32_to_cpu ( *__ptr );                   \
                    227:                __value >>=                                                  \
                    228:                    MLX_DWORD_BIT_OFFSET ( MLX_PSEUDO_STRUCT ( _ptr ),       \
                    229:                                            __index, _field );               \
                    230:                __value &=                                                   \
                    231:                    MLX_BIT_MASK ( MLX_PSEUDO_STRUCT ( _ptr ), _field );     \
                    232:                __value;                                                     \
                    233:        } )
                    234: 
                    235: /*
                    236:  * Fill high dword of physical address, if necessary
                    237:  *
                    238:  */
                    239: #define MLX_FILL_H( _structure_st, _index, _field, _address ) do {          \
                    240:        if ( sizeof ( physaddr_t ) > sizeof ( uint32_t ) ) {                 \
                    241:                MLX_FILL_1 ( _structure_st, _index, _field,                  \
                    242:                             ( ( ( uint64_t ) (_address) ) >> 32 ) );        \
                    243:        } } while ( 0 )
                    244: 
                    245: #endif /* _MLX_BITOPS_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.