Annotation of qemu/roms/ipxe/src/drivers/net/etherfabric.h, revision 1.1

1.1     ! root        1: /**************************************************************************
        !             2:  *
        !             3:  * GPL net driver for Level 5 Etherfabric network cards
        !             4:  *
        !             5:  * Written by Michael Brown <[email protected]>
        !             6:  *
        !             7:  * Copyright Fen Systems Ltd. 2005
        !             8:  * Copyright Level 5 Networks Inc. 2005
        !             9:  *
        !            10:  * This software may be used and distributed according to the terms of
        !            11:  * the GNU General Public License (GPL), incorporated herein by
        !            12:  * reference.  Drivers based on or derived from this code fall under
        !            13:  * the GPL and must retain the authorship, copyright and license
        !            14:  * notice.  This file is not a complete program and may only be used
        !            15:  * when the entire operating system is licensed under the GPL.
        !            16:  *
        !            17:  **************************************************************************
        !            18:  */
        !            19: 
        !            20: FILE_LICENCE ( GPL_ANY );
        !            21: 
        !            22: #ifndef EFAB_BITFIELD_H
        !            23: #define EFAB_BITFIELD_H
        !            24: 
        !            25: /** @file
        !            26:  *
        !            27:  * Etherfabric bitfield access
        !            28:  *
        !            29:  * Etherfabric NICs make extensive use of bitfields up to 128 bits
        !            30:  * wide.  Since there is no native 128-bit datatype on most systems,
        !            31:  * and since 64-bit datatypes are inefficient on 32-bit systems and
        !            32:  * vice versa, we wrap accesses in a way that uses the most efficient
        !            33:  * datatype.
        !            34:  *
        !            35:  * The NICs are PCI devices and therefore little-endian.  Since most
        !            36:  * of the quantities that we deal with are DMAed to/from host memory,
        !            37:  * we define our datatypes (efab_oword_t, efab_qword_t and
        !            38:  * efab_dword_t) to be little-endian.
        !            39:  *
        !            40:  * In the less common case of using PIO for individual register
        !            41:  * writes, we construct the little-endian datatype in host memory and
        !            42:  * then use non-swapping equivalents of writel/writeq, rather than
        !            43:  * constructing a native-endian datatype and relying on the implicit
        !            44:  * byte-swapping done by writel/writeq.  (We use a similar strategy
        !            45:  * for register reads.)
        !            46:  */
        !            47: 
        !            48: /** Dummy field low bit number */
        !            49: #define EFAB_DUMMY_FIELD_LBN 0
        !            50: /** Dummy field width */
        !            51: #define EFAB_DUMMY_FIELD_WIDTH 0
        !            52: /** Dword 0 low bit number */
        !            53: #define EFAB_DWORD_0_LBN 0
        !            54: /** Dword 0 width */
        !            55: #define EFAB_DWORD_0_WIDTH 32
        !            56: /** Dword 1 low bit number */
        !            57: #define EFAB_DWORD_1_LBN 32
        !            58: /** Dword 1 width */
        !            59: #define EFAB_DWORD_1_WIDTH 32
        !            60: /** Dword 2 low bit number */
        !            61: #define EFAB_DWORD_2_LBN 64
        !            62: /** Dword 2 width */
        !            63: #define EFAB_DWORD_2_WIDTH 32
        !            64: /** Dword 3 low bit number */
        !            65: #define EFAB_DWORD_3_LBN 96
        !            66: /** Dword 3 width */
        !            67: #define EFAB_DWORD_3_WIDTH 32
        !            68: 
        !            69: /** Specified attribute (e.g. LBN) of the specified field */
        !            70: #define EFAB_VAL(field,attribute) field ## _ ## attribute
        !            71: /** Low bit number of the specified field */
        !            72: #define EFAB_LOW_BIT( field ) EFAB_VAL ( field, LBN )
        !            73: /** Bit width of the specified field */
        !            74: #define EFAB_WIDTH( field ) EFAB_VAL ( field, WIDTH )
        !            75: /** High bit number of the specified field */
        !            76: #define EFAB_HIGH_BIT(field) ( EFAB_LOW_BIT(field) + EFAB_WIDTH(field) - 1 )
        !            77: /** Mask equal in width to the specified field.
        !            78:  *
        !            79:  * For example, a field with width 5 would have a mask of 0x1f.
        !            80:  *
        !            81:  * The maximum width mask that can be generated is 64 bits.
        !            82:  */
        !            83: #define EFAB_MASK64( field )                                           \
        !            84:        ( EFAB_WIDTH(field) == 64 ? ~( ( uint64_t ) 0 ) :               \
        !            85:          ( ( ( ( ( uint64_t ) 1 ) << EFAB_WIDTH(field) ) ) - 1 ) )
        !            86: 
        !            87: /** Mask equal in width to the specified field.
        !            88:  *
        !            89:  * For example, a field with width 5 would have a mask of 0x1f.
        !            90:  *
        !            91:  * The maximum width mask that can be generated is 32 bits.  Use
        !            92:  * EFAB_MASK64 for higher width fields.
        !            93:  */
        !            94: #define EFAB_MASK32( field )                                           \
        !            95:        ( EFAB_WIDTH(field) == 32 ? ~( ( uint32_t ) 0 ) :               \
        !            96:          ( ( ( ( ( uint32_t ) 1 ) << EFAB_WIDTH(field) ) ) - 1 ) )
        !            97: 
        !            98: /** A doubleword (i.e. 4 byte) datatype
        !            99:  *
        !           100:  * This datatype is defined to be little-endian.
        !           101:  */
        !           102: typedef union efab_dword {
        !           103:        uint32_t u32[1];
        !           104:        uint32_t opaque; /* For bitwise operations between two efab_dwords */
        !           105: } efab_dword_t;
        !           106: 
        !           107: /** A quadword (i.e. 8 byte) datatype
        !           108:  *
        !           109:  * This datatype is defined to be little-endian.
        !           110:  */
        !           111: typedef union efab_qword {
        !           112:        uint64_t u64[1];
        !           113:        uint32_t u32[2];
        !           114:        efab_dword_t dword[2];
        !           115: } efab_qword_t;
        !           116: 
        !           117: /**
        !           118:  * An octword (eight-word, i.e. 16 byte) datatype
        !           119:  *
        !           120:  * This datatype is defined to be little-endian.
        !           121:  */
        !           122: typedef union efab_oword {
        !           123:        uint64_t u64[2];
        !           124:        efab_qword_t qword[2];
        !           125:        uint32_t u32[4];
        !           126:        efab_dword_t dword[4];
        !           127: } efab_oword_t;
        !           128: 
        !           129: /** Format string for printing an efab_dword_t */
        !           130: #define EFAB_DWORD_FMT "%08x"
        !           131: 
        !           132: /** Format string for printing an efab_qword_t */
        !           133: #define EFAB_QWORD_FMT "%08x:%08x"
        !           134: 
        !           135: /** Format string for printing an efab_oword_t */
        !           136: #define EFAB_OWORD_FMT "%08x:%08x:%08x:%08x"
        !           137: 
        !           138: /** printk parameters for printing an efab_dword_t */
        !           139: #define EFAB_DWORD_VAL(dword)                                  \
        !           140:        ( ( unsigned int ) le32_to_cpu ( (dword).u32[0] ) )
        !           141: 
        !           142: /** printk parameters for printing an efab_qword_t */
        !           143: #define EFAB_QWORD_VAL(qword)                                  \
        !           144:        ( ( unsigned int ) le32_to_cpu ( (qword).u32[1] ) ),    \
        !           145:        ( ( unsigned int ) le32_to_cpu ( (qword).u32[0] ) )
        !           146: 
        !           147: /** printk parameters for printing an efab_oword_t */
        !           148: #define EFAB_OWORD_VAL(oword)                                  \
        !           149:        ( ( unsigned int ) le32_to_cpu ( (oword).u32[3] ) ),    \
        !           150:        ( ( unsigned int ) le32_to_cpu ( (oword).u32[2] ) ),    \
        !           151:        ( ( unsigned int ) le32_to_cpu ( (oword).u32[1] ) ),    \
        !           152:        ( ( unsigned int ) le32_to_cpu ( (oword).u32[0] ) )
        !           153: 
        !           154: /**
        !           155:  * Extract bit field portion [low,high) from the native-endian element
        !           156:  * which contains bits [min,max).
        !           157:  *
        !           158:  * For example, suppose "element" represents the high 32 bits of a
        !           159:  * 64-bit value, and we wish to extract the bits belonging to the bit
        !           160:  * field occupying bits 28-45 of this 64-bit value.
        !           161:  *
        !           162:  * Then EFAB_EXTRACT ( element, 32, 63, 28, 45 ) would give
        !           163:  *
        !           164:  *   ( element ) << 4
        !           165:  *
        !           166:  * The result will contain the relevant bits filled in in the range
        !           167:  * [0,high-low), with garbage in bits [high-low+1,...).
        !           168:  */
        !           169: #define EFAB_EXTRACT_NATIVE( native_element, min ,max ,low ,high )     \
        !           170:        ( ( ( low > max ) || ( high < min ) ) ? 0 :                     \
        !           171:          ( ( low > min ) ?                                             \
        !           172:            ( (native_element) >> ( low - min ) ) :                     \
        !           173:            ( (native_element) << ( min - low ) ) ) )
        !           174: 
        !           175: /**
        !           176:  * Extract bit field portion [low,high) from the 64-bit little-endian
        !           177:  * element which contains bits [min,max)
        !           178:  */
        !           179: #define EFAB_EXTRACT64( element, min, max, low, high )                 \
        !           180:        EFAB_EXTRACT_NATIVE ( le64_to_cpu(element), min, max, low, high )
        !           181: 
        !           182: /**
        !           183:  * Extract bit field portion [low,high) from the 32-bit little-endian
        !           184:  * element which contains bits [min,max)
        !           185:  */
        !           186: #define EFAB_EXTRACT32( element, min, max, low, high )                 \
        !           187:        EFAB_EXTRACT_NATIVE ( le32_to_cpu(element), min, max, low, high )
        !           188: 
        !           189: #define EFAB_EXTRACT_OWORD64( oword, low, high )                       \
        !           190:        ( EFAB_EXTRACT64 ( (oword).u64[0],   0,  63, low, high ) |      \
        !           191:          EFAB_EXTRACT64 ( (oword).u64[1],  64, 127, low, high ) )
        !           192: 
        !           193: #define EFAB_EXTRACT_QWORD64( qword, low, high )                       \
        !           194:        ( EFAB_EXTRACT64 ( (qword).u64[0],   0,  63, low, high ) )
        !           195: 
        !           196: #define EFAB_EXTRACT_OWORD32( oword, low, high )                       \
        !           197:        ( EFAB_EXTRACT32 ( (oword).u32[0],   0,  31, low, high ) |      \
        !           198:          EFAB_EXTRACT32 ( (oword).u32[1],  32,  63, low, high ) |      \
        !           199:          EFAB_EXTRACT32 ( (oword).u32[2],  64,  95, low, high ) |      \
        !           200:          EFAB_EXTRACT32 ( (oword).u32[3],  96, 127, low, high ) )
        !           201: 
        !           202: #define EFAB_EXTRACT_QWORD32( qword, low, high )                       \
        !           203:        ( EFAB_EXTRACT32 ( (qword).u32[0],   0,  31, low, high ) |      \
        !           204:          EFAB_EXTRACT32 ( (qword).u32[1],  32,  63, low, high ) )
        !           205: 
        !           206: #define EFAB_EXTRACT_DWORD( dword, low, high )                         \
        !           207:        ( EFAB_EXTRACT32 ( (dword).u32[0],   0,  31, low, high ) )
        !           208: 
        !           209: #define EFAB_OWORD_FIELD64( oword, field )                             \
        !           210:        ( EFAB_EXTRACT_OWORD64 ( oword, EFAB_LOW_BIT ( field ),         \
        !           211:                                 EFAB_HIGH_BIT ( field ) ) &            \
        !           212:          EFAB_MASK64 ( field ) )
        !           213: 
        !           214: #define EFAB_QWORD_FIELD64( qword, field )                             \
        !           215:        ( EFAB_EXTRACT_QWORD64 ( qword, EFAB_LOW_BIT ( field ),         \
        !           216:                                 EFAB_HIGH_BIT ( field ) ) &            \
        !           217:          EFAB_MASK64 ( field ) )
        !           218: 
        !           219: #define EFAB_OWORD_FIELD32( oword, field )                             \
        !           220:        ( EFAB_EXTRACT_OWORD32 ( oword, EFAB_LOW_BIT ( field ),         \
        !           221:                                 EFAB_HIGH_BIT ( field ) ) &            \
        !           222:          EFAB_MASK32 ( field ) )
        !           223: 
        !           224: #define EFAB_QWORD_FIELD32( qword, field )                             \
        !           225:        ( EFAB_EXTRACT_QWORD32 ( qword, EFAB_LOW_BIT ( field ),         \
        !           226:                                 EFAB_HIGH_BIT ( field ) ) &            \
        !           227:          EFAB_MASK32 ( field ) )
        !           228: 
        !           229: #define EFAB_DWORD_FIELD( dword, field )                               \
        !           230:        ( EFAB_EXTRACT_DWORD ( dword, EFAB_LOW_BIT ( field ),           \
        !           231:                               EFAB_HIGH_BIT ( field ) ) &              \
        !           232:          EFAB_MASK32 ( field ) )
        !           233: 
        !           234: #define EFAB_OWORD_IS_ZERO64( oword )                                  \
        !           235:        ( ! ( (oword).u64[0] || (oword).u64[1] ) )
        !           236: 
        !           237: #define EFAB_QWORD_IS_ZERO64( qword )                                  \
        !           238:        ( ! ( (qword).u64[0] ) )
        !           239: 
        !           240: #define EFAB_OWORD_IS_ZERO32( oword )                                  \
        !           241:        ( ! ( (oword).u32[0] || (oword).u32[1] ||                       \
        !           242:              (oword).u32[2] || (oword).u32[3] ) )
        !           243: 
        !           244: #define EFAB_QWORD_IS_ZERO32( qword )                                  \
        !           245:        ( ! ( (qword).u32[0] || (qword).u32[1] ) )
        !           246: 
        !           247: #define EFAB_DWORD_IS_ZERO( dword )                                    \
        !           248:        ( ! ( (dword).u32[0] ) )
        !           249: 
        !           250: #define EFAB_OWORD_IS_ALL_ONES64( oword )                              \
        !           251:        ( ( (oword).u64[0] & (oword).u64[1] ) == ~( ( uint64_t ) 0 ) )
        !           252: 
        !           253: #define EFAB_QWORD_IS_ALL_ONES64( qword )                              \
        !           254:        ( (qword).u64[0] == ~( ( uint64_t ) 0 ) )
        !           255: 
        !           256: #define EFAB_OWORD_IS_ALL_ONES32( oword )                              \
        !           257:        ( ( (oword).u32[0] & (oword).u32[1] &                           \
        !           258:            (oword).u32[2] & (oword).u32[3] ) == ~( ( uint32_t ) 0 ) )
        !           259: 
        !           260: #define EFAB_QWORD_IS_ALL_ONES32( qword )                              \
        !           261:        ( ( (qword).u32[0] & (qword).u32[1] ) == ~( ( uint32_t ) 0 ) )
        !           262: 
        !           263: #define EFAB_DWORD_IS_ALL_ONES( dword )                                        \
        !           264:        ( (dword).u32[0] == ~( ( uint32_t ) 0 ) )
        !           265: 
        !           266: #if ( BITS_PER_LONG == 64 )
        !           267: #define EFAB_OWORD_FIELD       EFAB_OWORD_FIELD64
        !           268: #define EFAB_QWORD_FIELD       EFAB_QWORD_FIELD64
        !           269: #define EFAB_OWORD_IS_ZERO     EFAB_OWORD_IS_ZERO64
        !           270: #define EFAB_QWORD_IS_ZERO     EFAB_QWORD_IS_ZERO64
        !           271: #define EFAB_OWORD_IS_ALL_ONES EFAB_OWORD_IS_ALL_ONES64
        !           272: #define EFAB_QWORD_IS_ALL_ONES EFAB_QWORD_IS_ALL_ONES64
        !           273: #else
        !           274: #define EFAB_OWORD_FIELD       EFAB_OWORD_FIELD32
        !           275: #define EFAB_QWORD_FIELD       EFAB_QWORD_FIELD32
        !           276: #define EFAB_OWORD_IS_ZERO     EFAB_OWORD_IS_ZERO32
        !           277: #define EFAB_QWORD_IS_ZERO     EFAB_QWORD_IS_ZERO32
        !           278: #define EFAB_OWORD_IS_ALL_ONES EFAB_OWORD_IS_ALL_ONES32
        !           279: #define EFAB_QWORD_IS_ALL_ONES EFAB_QWORD_IS_ALL_ONES32
        !           280: #endif
        !           281: 
        !           282: /**
        !           283:  * Construct bit field portion
        !           284:  *
        !           285:  * Creates the portion of the bit field [low,high) that lies within
        !           286:  * the range [min,max).
        !           287:  */
        !           288: #define EFAB_INSERT_NATIVE64( min, max, low, high, value )     \
        !           289:        ( ( ( low > max ) || ( high < min ) ) ? 0 :             \
        !           290:          ( ( low > min ) ?                                     \
        !           291:            ( ( ( uint64_t ) (value) ) << ( low - min ) ) :     \
        !           292:            ( ( ( uint64_t ) (value) ) >> ( min - low ) ) ) )
        !           293: 
        !           294: #define EFAB_INSERT_NATIVE32( min, max, low, high, value )     \
        !           295:        ( ( ( low > max ) || ( high < min ) ) ? 0 :             \
        !           296:          ( ( low > min ) ?                                     \
        !           297:            ( ( ( uint32_t ) (value) ) << ( low - min ) ) :     \
        !           298:            ( ( ( uint32_t ) (value) ) >> ( min - low ) ) ) )
        !           299: 
        !           300: #define EFAB_INSERT_NATIVE( min, max, low, high, value )       \
        !           301:        ( ( ( ( max - min ) >= 32 ) ||                          \
        !           302:            ( ( high - low ) >= 32 ) )                          \
        !           303:          ? EFAB_INSERT_NATIVE64 ( min, max, low, high, value ) \
        !           304:          : EFAB_INSERT_NATIVE32 ( min, max, low, high, value ) )
        !           305: 
        !           306: /**
        !           307:  * Construct bit field portion
        !           308:  *
        !           309:  * Creates the portion of the named bit field that lies within the
        !           310:  * range [min,max).
        !           311:  */
        !           312: #define EFAB_INSERT_FIELD_NATIVE( min, max, field, value )     \
        !           313:        EFAB_INSERT_NATIVE ( min, max, EFAB_LOW_BIT ( field ),  \
        !           314:                             EFAB_HIGH_BIT ( field ), value )
        !           315: 
        !           316: /**
        !           317:  * Construct bit field
        !           318:  *
        !           319:  * Creates the portion of the named bit fields that lie within the
        !           320:  * range [min,max).
        !           321:  */
        !           322: #define EFAB_INSERT_FIELDS_NATIVE( min, max,                           \
        !           323:                                   field1, value1,                      \
        !           324:                                   field2, value2,                      \
        !           325:                                   field3, value3,                      \
        !           326:                                   field4, value4,                      \
        !           327:                                   field5, value5,                      \
        !           328:                                   field6, value6,                      \
        !           329:                                   field7, value7,                      \
        !           330:                                   field8, value8,                      \
        !           331:                                   field9, value9,                      \
        !           332:                                   field10, value10 )                   \
        !           333:        ( EFAB_INSERT_FIELD_NATIVE ( min, max, field1, value1 ) |       \
        !           334:          EFAB_INSERT_FIELD_NATIVE ( min, max, field2, value2 ) |       \
        !           335:          EFAB_INSERT_FIELD_NATIVE ( min, max, field3, value3 ) |       \
        !           336:          EFAB_INSERT_FIELD_NATIVE ( min, max, field4, value4 ) |       \
        !           337:          EFAB_INSERT_FIELD_NATIVE ( min, max, field5, value5 ) |       \
        !           338:          EFAB_INSERT_FIELD_NATIVE ( min, max, field6, value6 ) |       \
        !           339:          EFAB_INSERT_FIELD_NATIVE ( min, max, field7, value7 ) |       \
        !           340:          EFAB_INSERT_FIELD_NATIVE ( min, max, field8, value8 ) |       \
        !           341:          EFAB_INSERT_FIELD_NATIVE ( min, max, field9, value9 ) |       \
        !           342:          EFAB_INSERT_FIELD_NATIVE ( min, max, field10, value10 ) )
        !           343: 
        !           344: #define EFAB_INSERT_FIELDS64( ... )                                    \
        !           345:        cpu_to_le64 ( EFAB_INSERT_FIELDS_NATIVE ( __VA_ARGS__ ) )
        !           346: 
        !           347: #define EFAB_INSERT_FIELDS32( ... )                                    \
        !           348:        cpu_to_le32 ( EFAB_INSERT_FIELDS_NATIVE ( __VA_ARGS__ ) )
        !           349: 
        !           350: #define EFAB_POPULATE_OWORD64( oword, ... ) do {                       \
        !           351:        (oword).u64[0] = EFAB_INSERT_FIELDS64 (   0,  63, __VA_ARGS__ );\
        !           352:        (oword).u64[1] = EFAB_INSERT_FIELDS64 (  64, 127, __VA_ARGS__ );\
        !           353:        } while ( 0 )
        !           354: 
        !           355: #define EFAB_POPULATE_QWORD64( qword, ... ) do {                       \
        !           356:        (qword).u64[0] = EFAB_INSERT_FIELDS64 (   0,  63, __VA_ARGS__ );\
        !           357:        } while ( 0 )
        !           358: 
        !           359: #define EFAB_POPULATE_OWORD32( oword, ... ) do {                       \
        !           360:        (oword).u32[0] = EFAB_INSERT_FIELDS32 (   0,  31, __VA_ARGS__ );\
        !           361:        (oword).u32[1] = EFAB_INSERT_FIELDS32 (  32,  63, __VA_ARGS__ );\
        !           362:        (oword).u32[2] = EFAB_INSERT_FIELDS32 (  64,  95, __VA_ARGS__ );\
        !           363:        (oword).u32[3] = EFAB_INSERT_FIELDS32 (  96, 127, __VA_ARGS__ );\
        !           364:        } while ( 0 )
        !           365: 
        !           366: #define EFAB_POPULATE_QWORD32( qword, ... ) do {                       \
        !           367:        (qword).u32[0] = EFAB_INSERT_FIELDS32 (   0,  31, __VA_ARGS__ );\
        !           368:        (qword).u32[1] = EFAB_INSERT_FIELDS32 (  32,  63, __VA_ARGS__ );\
        !           369:        } while ( 0 )
        !           370: 
        !           371: #define EFAB_POPULATE_DWORD( dword, ... ) do {                         \
        !           372:        (dword).u32[0] = EFAB_INSERT_FIELDS32 (   0,  31, __VA_ARGS__ );\
        !           373:        } while ( 0 )
        !           374: 
        !           375: #if ( BITS_PER_LONG == 64 )
        !           376: #define EFAB_POPULATE_OWORD EFAB_POPULATE_OWORD64
        !           377: #define EFAB_POPULATE_QWORD EFAB_POPULATE_QWORD64
        !           378: #else
        !           379: #define EFAB_POPULATE_OWORD EFAB_POPULATE_OWORD32
        !           380: #define EFAB_POPULATE_QWORD EFAB_POPULATE_QWORD32
        !           381: #endif
        !           382: 
        !           383: /* Populate an octword field with various numbers of arguments */
        !           384: #define EFAB_POPULATE_OWORD_10 EFAB_POPULATE_OWORD
        !           385: #define EFAB_POPULATE_OWORD_9( oword, ... ) \
        !           386:        EFAB_POPULATE_OWORD_10 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           387: #define EFAB_POPULATE_OWORD_8( oword, ... ) \
        !           388:        EFAB_POPULATE_OWORD_9 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           389: #define EFAB_POPULATE_OWORD_7( oword, ... ) \
        !           390:        EFAB_POPULATE_OWORD_8 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           391: #define EFAB_POPULATE_OWORD_6( oword, ... ) \
        !           392:        EFAB_POPULATE_OWORD_7 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           393: #define EFAB_POPULATE_OWORD_5( oword, ... ) \
        !           394:        EFAB_POPULATE_OWORD_6 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           395: #define EFAB_POPULATE_OWORD_4( oword, ... ) \
        !           396:        EFAB_POPULATE_OWORD_5 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           397: #define EFAB_POPULATE_OWORD_3( oword, ... ) \
        !           398:        EFAB_POPULATE_OWORD_4 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           399: #define EFAB_POPULATE_OWORD_2( oword, ... ) \
        !           400:        EFAB_POPULATE_OWORD_3 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           401: #define EFAB_POPULATE_OWORD_1( oword, ... ) \
        !           402:        EFAB_POPULATE_OWORD_2 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           403: #define EFAB_ZERO_OWORD( oword ) \
        !           404:        EFAB_POPULATE_OWORD_1 ( oword, EFAB_DUMMY_FIELD, 0 )
        !           405: #define EFAB_SET_OWORD( oword ) \
        !           406:        EFAB_POPULATE_OWORD_4 ( oword, \
        !           407:                                EFAB_DWORD_0, 0xffffffff, \
        !           408:                                EFAB_DWORD_1, 0xffffffff, \
        !           409:                                EFAB_DWORD_2, 0xffffffff, \
        !           410:                                EFAB_DWORD_3, 0xffffffff )
        !           411: 
        !           412: /* Populate a quadword field with various numbers of arguments */
        !           413: #define EFAB_POPULATE_QWORD_10 EFAB_POPULATE_QWORD
        !           414: #define EFAB_POPULATE_QWORD_9( qword, ... ) \
        !           415:        EFAB_POPULATE_QWORD_10 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           416: #define EFAB_POPULATE_QWORD_8( qword, ... ) \
        !           417:        EFAB_POPULATE_QWORD_9 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           418: #define EFAB_POPULATE_QWORD_7( qword, ... ) \
        !           419:        EFAB_POPULATE_QWORD_8 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           420: #define EFAB_POPULATE_QWORD_6( qword, ... ) \
        !           421:        EFAB_POPULATE_QWORD_7 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           422: #define EFAB_POPULATE_QWORD_5( qword, ... ) \
        !           423:        EFAB_POPULATE_QWORD_6 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           424: #define EFAB_POPULATE_QWORD_4( qword, ... ) \
        !           425:        EFAB_POPULATE_QWORD_5 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           426: #define EFAB_POPULATE_QWORD_3( qword, ... ) \
        !           427:        EFAB_POPULATE_QWORD_4 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           428: #define EFAB_POPULATE_QWORD_2( qword, ... ) \
        !           429:        EFAB_POPULATE_QWORD_3 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           430: #define EFAB_POPULATE_QWORD_1( qword, ... ) \
        !           431:        EFAB_POPULATE_QWORD_2 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           432: #define EFAB_ZERO_QWORD( qword ) \
        !           433:        EFAB_POPULATE_QWORD_1 ( qword, EFAB_DUMMY_FIELD, 0 )
        !           434: #define EFAB_SET_QWORD( qword ) \
        !           435:        EFAB_POPULATE_QWORD_2 ( qword, \
        !           436:                                EFAB_DWORD_0, 0xffffffff, \
        !           437:                                EFAB_DWORD_1, 0xffffffff )
        !           438: 
        !           439: /* Populate a dword field with various numbers of arguments */
        !           440: #define EFAB_POPULATE_DWORD_10 EFAB_POPULATE_DWORD
        !           441: #define EFAB_POPULATE_DWORD_9( dword, ... ) \
        !           442:        EFAB_POPULATE_DWORD_10 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           443: #define EFAB_POPULATE_DWORD_8( dword, ... ) \
        !           444:        EFAB_POPULATE_DWORD_9 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           445: #define EFAB_POPULATE_DWORD_7( dword, ... ) \
        !           446:        EFAB_POPULATE_DWORD_8 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           447: #define EFAB_POPULATE_DWORD_6( dword, ... ) \
        !           448:        EFAB_POPULATE_DWORD_7 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           449: #define EFAB_POPULATE_DWORD_5( dword, ... ) \
        !           450:        EFAB_POPULATE_DWORD_6 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           451: #define EFAB_POPULATE_DWORD_4( dword, ... ) \
        !           452:        EFAB_POPULATE_DWORD_5 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           453: #define EFAB_POPULATE_DWORD_3( dword, ... ) \
        !           454:        EFAB_POPULATE_DWORD_4 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           455: #define EFAB_POPULATE_DWORD_2( dword, ... ) \
        !           456:        EFAB_POPULATE_DWORD_3 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           457: #define EFAB_POPULATE_DWORD_1( dword, ... ) \
        !           458:        EFAB_POPULATE_DWORD_2 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
        !           459: #define EFAB_ZERO_DWORD( dword ) \
        !           460:        EFAB_POPULATE_DWORD_1 ( dword, EFAB_DUMMY_FIELD, 0 )
        !           461: #define EFAB_SET_DWORD( dword ) \
        !           462:        EFAB_POPULATE_DWORD_1 ( dword, EFAB_DWORD_0, 0xffffffff )
        !           463: 
        !           464: /*
        !           465:  * Modify a named field within an already-populated structure.  Used
        !           466:  * for read-modify-write operations.
        !           467:  *
        !           468:  */
        !           469: 
        !           470: #define EFAB_INSERT_FIELD64( ... )                                     \
        !           471:        cpu_to_le64 ( EFAB_INSERT_FIELD_NATIVE ( __VA_ARGS__ ) )
        !           472: 
        !           473: #define EFAB_INSERT_FIELD32( ... )                                     \
        !           474:        cpu_to_le32 ( EFAB_INSERT_FIELD_NATIVE ( __VA_ARGS__ ) )
        !           475: 
        !           476: #define EFAB_INPLACE_MASK64( min, max, field )                         \
        !           477:        EFAB_INSERT_FIELD64 ( min, max, field, EFAB_MASK64 ( field ) )
        !           478: 
        !           479: #define EFAB_INPLACE_MASK32( min, max, field )                         \
        !           480:        EFAB_INSERT_FIELD32 ( min, max, field, EFAB_MASK32 ( field ) )
        !           481: 
        !           482: #define EFAB_SET_OWORD_FIELD64( oword, field, value ) do {                   \
        !           483:        (oword).u64[0] = ( ( (oword).u64[0]                                   \
        !           484:                             & ~EFAB_INPLACE_MASK64 (  0,  63, field ) )      \
        !           485:                           | EFAB_INSERT_FIELD64 (  0,  63, field, value ) ); \
        !           486:        (oword).u64[1] = ( ( (oword).u64[1]                                   \
        !           487:                             & ~EFAB_INPLACE_MASK64 ( 64, 127, field ) )      \
        !           488:                           | EFAB_INSERT_FIELD64 ( 64, 127, field, value ) ); \
        !           489:        } while ( 0 )
        !           490: 
        !           491: #define EFAB_SET_QWORD_FIELD64( qword, field, value ) do {                   \
        !           492:        (qword).u64[0] = ( ( (qword).u64[0]                                   \
        !           493:                             & ~EFAB_INPLACE_MASK64 (  0,  63, field ) )      \
        !           494:                           | EFAB_INSERT_FIELD64 (  0,  63, field, value ) ); \
        !           495:        } while ( 0 )
        !           496: 
        !           497: #define EFAB_SET_OWORD_FIELD32( oword, field, value ) do {                   \
        !           498:        (oword).u32[0] = ( ( (oword).u32[0]                                   \
        !           499:                             & ~EFAB_INPLACE_MASK32 (  0,  31, field ) )      \
        !           500:                           | EFAB_INSERT_FIELD32 (  0,  31, field, value ) ); \
        !           501:        (oword).u32[1] = ( ( (oword).u32[1]                                   \
        !           502:                             & ~EFAB_INPLACE_MASK32 ( 32,  63, field ) )      \
        !           503:                           | EFAB_INSERT_FIELD32 ( 32,  63, field, value ) ); \
        !           504:        (oword).u32[2] = ( ( (oword).u32[2]                                   \
        !           505:                             & ~EFAB_INPLACE_MASK32 ( 64,  95, field ) )      \
        !           506:                           | EFAB_INSERT_FIELD32 ( 64,  95, field, value ) ); \
        !           507:        (oword).u32[3] = ( ( (oword).u32[3]                                   \
        !           508:                             & ~EFAB_INPLACE_MASK32 ( 96, 127, field ) )      \
        !           509:                           | EFAB_INSERT_FIELD32 ( 96, 127, field, value ) ); \
        !           510:        } while ( 0 )
        !           511: 
        !           512: #define EFAB_SET_QWORD_FIELD32( qword, field, value ) do {                   \
        !           513:        (qword).u32[0] = ( ( (qword).u32[0]                                   \
        !           514:                             & ~EFAB_INPLACE_MASK32 (  0,  31, field ) )      \
        !           515:                           | EFAB_INSERT_FIELD32 (  0,  31, field, value ) ); \
        !           516:        (qword).u32[1] = ( ( (qword).u32[1]                                   \
        !           517:                             & ~EFAB_INPLACE_MASK32 ( 32,  63, field ) )      \
        !           518:                           | EFAB_INSERT_FIELD32 ( 32,  63, field, value ) ); \
        !           519:        } while ( 0 )
        !           520: 
        !           521: #define EFAB_SET_DWORD_FIELD( dword, field, value ) do {                     \
        !           522:        (dword).u32[0] = ( ( (dword).u32[0]                                   \
        !           523:                             & ~EFAB_INPLACE_MASK32 (  0,  31, field ) )      \
        !           524:                           | EFAB_INSERT_FIELD32 (  0,  31, field, value ) ); \
        !           525:        } while ( 0 )
        !           526: 
        !           527: #if ( BITS_PER_LONG == 64 )
        !           528: #define EFAB_SET_OWORD_FIELD EFAB_SET_OWORD_FIELD64
        !           529: #define EFAB_SET_QWORD_FIELD EFAB_SET_QWORD_FIELD64
        !           530: #else
        !           531: #define EFAB_SET_OWORD_FIELD EFAB_SET_OWORD_FIELD32
        !           532: #define EFAB_SET_QWORD_FIELD EFAB_SET_QWORD_FIELD32
        !           533: #endif
        !           534: 
        !           535: /* Used to avoid compiler warnings about shift range exceeding width
        !           536:  * of the data types when dma_addr_t is only 32 bits wide.
        !           537:  */
        !           538: #define DMA_ADDR_T_WIDTH       ( 8 * sizeof ( dma_addr_t ) )
        !           539: #define EFAB_DMA_TYPE_WIDTH( width ) \
        !           540:        ( ( (width) < DMA_ADDR_T_WIDTH ) ? (width) : DMA_ADDR_T_WIDTH )
        !           541: #define EFAB_DMA_MAX_MASK ( ( DMA_ADDR_T_WIDTH == 64 ) ? \
        !           542:                            ~( ( uint64_t ) 0 ) : ~( ( uint32_t ) 0 ) )
        !           543: #define EFAB_DMA_MASK(mask) ( (mask) & EFAB_DMA_MAX_MASK )
        !           544: 
        !           545: #endif /* EFAB_BITFIELD_H */
        !           546: 
        !           547: /*
        !           548:  * Local variables:
        !           549:  *  c-basic-offset: 8
        !           550:  *  c-indent-level: 8
        !           551:  *  tab-width: 8
        !           552:  * End:
        !           553:  */

unix.superglobalmegacorp.com

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