2 * Copyright (c) 2007-2016 Solarflare Communications Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 * The views and conclusions contained in the software and documentation are
27 * those of the authors and should not be interpreted as representing official
28 * policies, either expressed or implied, of the FreeBSD Project.
30 * Ackowledgement to Fen Systems Ltd.
35 #ifndef _SYS_EFX_TYPES_H
36 #define _SYS_EFX_TYPES_H
47 * Solarflare NICs make extensive use of bitfields up to 128 bits
48 * wide. Since there is no native 128-bit datatype on most systems,
49 * and since 64-bit datatypes are inefficient on 32-bit systems and
50 * vice versa, we wrap accesses in a way that uses the most efficient
53 * The NICs are PCI devices and therefore little-endian. Since most
54 * of the quantities that we deal with are DMAed to/from host memory,
55 * we define our datatypes (efx_oword_t, efx_qword_t and efx_dword_t)
56 * to be little-endian.
58 * In the less common case of using PIO for individual register
59 * writes, we construct the little-endian datatype in host memory and
60 * then use non-swapping register access primitives, rather than
61 * constructing a native-endian datatype and relying on implicit
62 * byte-swapping. (We use a similar strategy for register reads.)
66 * NOTE: Field definitions here and elsewhere are done in terms of a lowest
67 * bit number (LBN) and a width.
70 #define EFX_DUMMY_FIELD_LBN 0
71 #define EFX_DUMMY_FIELD_WIDTH 0
73 #define EFX_BYTE_0_LBN 0
74 #define EFX_BYTE_0_WIDTH 8
76 #define EFX_BYTE_1_LBN 8
77 #define EFX_BYTE_1_WIDTH 8
79 #define EFX_BYTE_2_LBN 16
80 #define EFX_BYTE_2_WIDTH 8
82 #define EFX_BYTE_3_LBN 24
83 #define EFX_BYTE_3_WIDTH 8
85 #define EFX_BYTE_4_LBN 32
86 #define EFX_BYTE_4_WIDTH 8
88 #define EFX_BYTE_5_LBN 40
89 #define EFX_BYTE_5_WIDTH 8
91 #define EFX_BYTE_6_LBN 48
92 #define EFX_BYTE_6_WIDTH 8
94 #define EFX_BYTE_7_LBN 56
95 #define EFX_BYTE_7_WIDTH 8
97 #define EFX_WORD_0_LBN 0
98 #define EFX_WORD_0_WIDTH 16
100 #define EFX_WORD_1_LBN 16
101 #define EFX_WORD_1_WIDTH 16
103 #define EFX_WORD_2_LBN 32
104 #define EFX_WORD_2_WIDTH 16
106 #define EFX_WORD_3_LBN 48
107 #define EFX_WORD_3_WIDTH 16
109 #define EFX_DWORD_0_LBN 0
110 #define EFX_DWORD_0_WIDTH 32
112 #define EFX_DWORD_1_LBN 32
113 #define EFX_DWORD_1_WIDTH 32
115 #define EFX_DWORD_2_LBN 64
116 #define EFX_DWORD_2_WIDTH 32
118 #define EFX_DWORD_3_LBN 96
119 #define EFX_DWORD_3_WIDTH 32
121 /* There are intentionally no EFX_QWORD_0 or EFX_QWORD_1 field definitions
122 * here as the implementaion of EFX_QWORD_FIELD and EFX_OWORD_FIELD do not
123 * support field widths larger than 32 bits.
126 /* Specified attribute (i.e. LBN ow WIDTH) of the specified field */
127 #define EFX_VAL(_field, _attribute) \
128 _field ## _ ## _attribute
130 /* Lowest bit number of the specified field */
131 #define EFX_LOW_BIT(_field) \
134 /* Width of the specified field */
135 #define EFX_WIDTH(_field) \
136 EFX_VAL(_field, WIDTH)
138 /* Highest bit number of the specified field */
139 #define EFX_HIGH_BIT(_field) \
140 (EFX_LOW_BIT(_field) + EFX_WIDTH(_field) - 1)
143 * 64-bit mask equal in width to the specified field.
145 * For example, a field with width 5 would have a mask of 0x000000000000001f.
147 #define EFX_MASK64(_field) \
148 ((EFX_WIDTH(_field) == 64) ? ~((uint64_t)0) : \
149 (((((uint64_t)1) << EFX_WIDTH(_field))) - 1))
151 * 32-bit mask equal in width to the specified field.
153 * For example, a field with width 5 would have a mask of 0x0000001f.
155 #define EFX_MASK32(_field) \
156 ((EFX_WIDTH(_field) == 32) ? ~((uint32_t)0) : \
157 (((((uint32_t)1) << EFX_WIDTH(_field))) - 1))
160 * 16-bit mask equal in width to the specified field.
162 * For example, a field with width 5 would have a mask of 0x001f.
164 #define EFX_MASK16(_field) \
165 ((EFX_WIDTH(_field) == 16) ? 0xffffu : \
166 (uint16_t)((1 << EFX_WIDTH(_field)) - 1))
169 * 8-bit mask equal in width to the specified field.
171 * For example, a field with width 5 would have a mask of 0x1f.
173 #define EFX_MASK8(_field) \
174 ((uint8_t)((1 << EFX_WIDTH(_field)) - 1))
179 * A byte (i.e. 8-bit) datatype
181 typedef union efx_byte_u {
186 * A word (i.e. 16-bit) datatype
188 * This datatype is defined to be little-endian.
190 typedef union efx_word_u {
191 efx_byte_t ew_byte[2];
197 * A doubleword (i.e. 32-bit) datatype
199 * This datatype is defined to be little-endian.
201 typedef union efx_dword_u {
202 efx_byte_t ed_byte[4];
203 efx_word_t ed_word[2];
210 * A quadword (i.e. 64-bit) datatype
212 * This datatype is defined to be little-endian.
214 typedef union efx_qword_u {
215 efx_byte_t eq_byte[8];
216 efx_word_t eq_word[4];
217 efx_dword_t eq_dword[2];
227 * An octword (i.e. 128-bit) datatype
229 * This datatype is defined to be little-endian.
231 typedef union efx_oword_u {
232 efx_byte_t eo_byte[16];
233 efx_word_t eo_word[8];
234 efx_dword_t eo_dword[4];
235 efx_qword_t eo_qword[2];
236 #if EFSYS_HAS_SSE2_M128
249 #define __SWAP16(_x) \
250 ((((_x) & 0xff) << 8) | \
251 (((_x) >> 8) & 0xff))
253 #define __SWAP32(_x) \
254 ((__SWAP16((_x) & 0xffff) << 16) | \
255 __SWAP16(((_x) >> 16) & 0xffff))
257 #define __SWAP64(_x) \
258 ((__SWAP32((_x) & 0xffffffff) << 32) | \
259 __SWAP32(((_x) >> 32) & 0xffffffff))
261 #define __NOSWAP16(_x) (_x)
262 #define __NOSWAP32(_x) (_x)
263 #define __NOSWAP64(_x) (_x)
265 #if EFSYS_IS_BIG_ENDIAN
267 #define __CPU_TO_LE_16(_x) ((uint16_t)__SWAP16(_x))
268 #define __LE_TO_CPU_16(_x) ((uint16_t)__SWAP16(_x))
269 #define __CPU_TO_BE_16(_x) ((uint16_t)__NOSWAP16(_x))
270 #define __BE_TO_CPU_16(_x) ((uint16_t)__NOSWAP16(_x))
272 #define __CPU_TO_LE_32(_x) ((uint32_t)__SWAP32(_x))
273 #define __LE_TO_CPU_32(_x) ((uint32_t)__SWAP32(_x))
274 #define __CPU_TO_BE_32(_x) ((uint32_t)__NOSWAP32(_x))
275 #define __BE_TO_CPU_32(_x) ((uint32_t)__NOSWAP32(_x))
277 #define __CPU_TO_LE_64(_x) ((uint64_t)__SWAP64(_x))
278 #define __LE_TO_CPU_64(_x) ((uint64_t)__SWAP64(_x))
279 #define __CPU_TO_BE_64(_x) ((uint64_t)__NOSWAP64(_x))
280 #define __BE_TO_CPU_64(_x) ((uint64_t)__NOSWAP64(_x))
282 #elif EFSYS_IS_LITTLE_ENDIAN
284 #define __CPU_TO_LE_16(_x) ((uint16_t)__NOSWAP16(_x))
285 #define __LE_TO_CPU_16(_x) ((uint16_t)__NOSWAP16(_x))
286 #define __CPU_TO_BE_16(_x) ((uint16_t)__SWAP16(_x))
287 #define __BE_TO_CPU_16(_x) ((uint16_t)__SWAP16(_x))
289 #define __CPU_TO_LE_32(_x) ((uint32_t)__NOSWAP32(_x))
290 #define __LE_TO_CPU_32(_x) ((uint32_t)__NOSWAP32(_x))
291 #define __CPU_TO_BE_32(_x) ((uint32_t)__SWAP32(_x))
292 #define __BE_TO_CPU_32(_x) ((uint32_t)__SWAP32(_x))
294 #define __CPU_TO_LE_64(_x) ((uint64_t)__NOSWAP64(_x))
295 #define __LE_TO_CPU_64(_x) ((uint64_t)__NOSWAP64(_x))
296 #define __CPU_TO_BE_64(_x) ((uint64_t)__SWAP64(_x))
297 #define __BE_TO_CPU_64(_x) ((uint64_t)__SWAP64(_x))
301 #error "Neither of EFSYS_IS_{BIG,LITTLE}_ENDIAN is set"
305 #define __NATIVE_8(_x) (uint8_t)(_x)
307 /* Format string for printing an efx_byte_t */
308 #define EFX_BYTE_FMT "0x%02x"
310 /* Format string for printing an efx_word_t */
311 #define EFX_WORD_FMT "0x%04x"
313 /* Format string for printing an efx_dword_t */
314 #define EFX_DWORD_FMT "0x%08x"
316 /* Format string for printing an efx_qword_t */
317 #define EFX_QWORD_FMT "0x%08x:%08x"
319 /* Format string for printing an efx_oword_t */
320 #define EFX_OWORD_FMT "0x%08x:%08x:%08x:%08x"
322 /* Parameters for printing an efx_byte_t */
323 #define EFX_BYTE_VAL(_byte) \
324 ((unsigned int)__NATIVE_8((_byte).eb_u8[0]))
326 /* Parameters for printing an efx_word_t */
327 #define EFX_WORD_VAL(_word) \
328 ((unsigned int)__LE_TO_CPU_16((_word).ew_u16[0]))
330 /* Parameters for printing an efx_dword_t */
331 #define EFX_DWORD_VAL(_dword) \
332 ((unsigned int)__LE_TO_CPU_32((_dword).ed_u32[0]))
334 /* Parameters for printing an efx_qword_t */
335 #define EFX_QWORD_VAL(_qword) \
336 ((unsigned int)__LE_TO_CPU_32((_qword).eq_u32[1])), \
337 ((unsigned int)__LE_TO_CPU_32((_qword).eq_u32[0]))
339 /* Parameters for printing an efx_oword_t */
340 #define EFX_OWORD_VAL(_oword) \
341 ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[3])), \
342 ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[2])), \
343 ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[1])), \
344 ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[0]))
347 * Stop lint complaining about some shifts.
351 #define FIX_LINT(_x) (_x + fix_lint)
353 #define FIX_LINT(_x) (_x)
357 * Extract bit field portion [low,high) from the native-endian element
358 * which contains bits [min,max).
360 * For example, suppose "element" represents the high 32 bits of a
361 * 64-bit value, and we wish to extract the bits belonging to the bit
362 * field occupying bits 28-45 of this 64-bit value.
364 * Then EFX_EXTRACT(_element, 32, 63, 28, 45) would give
368 * The result will contain the relevant bits filled in in the range
369 * [0,high-low), with garbage in bits [high-low+1,...).
371 #define EFX_EXTRACT_NATIVE(_element, _min, _max, _low, _high) \
372 ((FIX_LINT(_low > _max) || FIX_LINT(_high < _min)) ? \
375 ((_element) >> (_low - _min)) : \
376 ((_element) << (_min - _low))))
379 * Extract bit field portion [low,high) from the 64-bit little-endian
380 * element which contains bits [min,max)
382 #define EFX_EXTRACT64(_element, _min, _max, _low, _high) \
383 EFX_EXTRACT_NATIVE(__LE_TO_CPU_64(_element), _min, _max, _low, _high)
386 * Extract bit field portion [low,high) from the 32-bit little-endian
387 * element which contains bits [min,max)
389 #define EFX_EXTRACT32(_element, _min, _max, _low, _high) \
390 EFX_EXTRACT_NATIVE(__LE_TO_CPU_32(_element), _min, _max, _low, _high)
393 * Extract bit field portion [low,high) from the 16-bit little-endian
394 * element which contains bits [min,max)
396 #define EFX_EXTRACT16(_element, _min, _max, _low, _high) \
397 EFX_EXTRACT_NATIVE(__LE_TO_CPU_16(_element), _min, _max, _low, _high)
400 * Extract bit field portion [low,high) from the 8-bit
401 * element which contains bits [min,max)
403 #define EFX_EXTRACT8(_element, _min, _max, _low, _high) \
404 EFX_EXTRACT_NATIVE(__NATIVE_8(_element), _min, _max, _low, _high)
406 #define EFX_EXTRACT_OWORD64(_oword, _low, _high) \
407 (EFX_EXTRACT64((_oword).eo_u64[0], FIX_LINT(0), FIX_LINT(63), \
409 EFX_EXTRACT64((_oword).eo_u64[1], FIX_LINT(64), FIX_LINT(127), \
412 #define EFX_EXTRACT_OWORD32(_oword, _low, _high) \
413 (EFX_EXTRACT32((_oword).eo_u32[0], FIX_LINT(0), FIX_LINT(31), \
415 EFX_EXTRACT32((_oword).eo_u32[1], FIX_LINT(32), FIX_LINT(63), \
417 EFX_EXTRACT32((_oword).eo_u32[2], FIX_LINT(64), FIX_LINT(95), \
419 EFX_EXTRACT32((_oword).eo_u32[3], FIX_LINT(96), FIX_LINT(127), \
422 #define EFX_EXTRACT_QWORD64(_qword, _low, _high) \
423 (EFX_EXTRACT64((_qword).eq_u64[0], FIX_LINT(0), FIX_LINT(63), \
426 #define EFX_EXTRACT_QWORD32(_qword, _low, _high) \
427 (EFX_EXTRACT32((_qword).eq_u32[0], FIX_LINT(0), FIX_LINT(31), \
429 EFX_EXTRACT32((_qword).eq_u32[1], FIX_LINT(32), FIX_LINT(63), \
432 #define EFX_EXTRACT_DWORD(_dword, _low, _high) \
433 (EFX_EXTRACT32((_dword).ed_u32[0], FIX_LINT(0), FIX_LINT(31), \
436 #define EFX_EXTRACT_WORD(_word, _low, _high) \
437 (EFX_EXTRACT16((_word).ew_u16[0], FIX_LINT(0), FIX_LINT(15), \
440 #define EFX_EXTRACT_BYTE(_byte, _low, _high) \
441 (EFX_EXTRACT8((_byte).eb_u8[0], FIX_LINT(0), FIX_LINT(7), \
445 #define EFX_OWORD_FIELD64(_oword, _field) \
446 ((uint32_t)EFX_EXTRACT_OWORD64(_oword, EFX_LOW_BIT(_field), \
447 EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
449 #define EFX_OWORD_FIELD32(_oword, _field) \
450 (EFX_EXTRACT_OWORD32(_oword, EFX_LOW_BIT(_field), \
451 EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
453 #define EFX_QWORD_FIELD64(_qword, _field) \
454 ((uint32_t)EFX_EXTRACT_QWORD64(_qword, EFX_LOW_BIT(_field), \
455 EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
457 #define EFX_QWORD_FIELD32(_qword, _field) \
458 (EFX_EXTRACT_QWORD32(_qword, EFX_LOW_BIT(_field), \
459 EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
461 #define EFX_DWORD_FIELD(_dword, _field) \
462 (EFX_EXTRACT_DWORD(_dword, EFX_LOW_BIT(_field), \
463 EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
465 #define EFX_WORD_FIELD(_word, _field) \
466 (EFX_EXTRACT_WORD(_word, EFX_LOW_BIT(_field), \
467 EFX_HIGH_BIT(_field)) & EFX_MASK16(_field))
469 #define EFX_BYTE_FIELD(_byte, _field) \
470 (EFX_EXTRACT_BYTE(_byte, EFX_LOW_BIT(_field), \
471 EFX_HIGH_BIT(_field)) & EFX_MASK8(_field))
474 #define EFX_OWORD_IS_EQUAL64(_oword_a, _oword_b) \
475 ((_oword_a).eo_u64[0] == (_oword_b).eo_u64[0] && \
476 (_oword_a).eo_u64[1] == (_oword_b).eo_u64[1])
478 #define EFX_OWORD_IS_EQUAL32(_oword_a, _oword_b) \
479 ((_oword_a).eo_u32[0] == (_oword_b).eo_u32[0] && \
480 (_oword_a).eo_u32[1] == (_oword_b).eo_u32[1] && \
481 (_oword_a).eo_u32[2] == (_oword_b).eo_u32[2] && \
482 (_oword_a).eo_u32[3] == (_oword_b).eo_u32[3])
484 #define EFX_QWORD_IS_EQUAL64(_qword_a, _qword_b) \
485 ((_qword_a).eq_u64[0] == (_qword_b).eq_u64[0])
487 #define EFX_QWORD_IS_EQUAL32(_qword_a, _qword_b) \
488 ((_qword_a).eq_u32[0] == (_qword_b).eq_u32[0] && \
489 (_qword_a).eq_u32[1] == (_qword_b).eq_u32[1])
491 #define EFX_DWORD_IS_EQUAL(_dword_a, _dword_b) \
492 ((_dword_a).ed_u32[0] == (_dword_b).ed_u32[0])
494 #define EFX_WORD_IS_EQUAL(_word_a, _word_b) \
495 ((_word_a).ew_u16[0] == (_word_b).ew_u16[0])
497 #define EFX_BYTE_IS_EQUAL(_byte_a, _byte_b) \
498 ((_byte_a).eb_u8[0] == (_byte_b).eb_u8[0])
501 #define EFX_OWORD_IS_ZERO64(_oword) \
502 (((_oword).eo_u64[0] | \
503 (_oword).eo_u64[1]) == 0)
505 #define EFX_OWORD_IS_ZERO32(_oword) \
506 (((_oword).eo_u32[0] | \
507 (_oword).eo_u32[1] | \
508 (_oword).eo_u32[2] | \
509 (_oword).eo_u32[3]) == 0)
511 #define EFX_QWORD_IS_ZERO64(_qword) \
512 (((_qword).eq_u64[0]) == 0)
514 #define EFX_QWORD_IS_ZERO32(_qword) \
515 (((_qword).eq_u32[0] | \
516 (_qword).eq_u32[1]) == 0)
518 #define EFX_DWORD_IS_ZERO(_dword) \
519 (((_dword).ed_u32[0]) == 0)
521 #define EFX_WORD_IS_ZERO(_word) \
522 (((_word).ew_u16[0]) == 0)
524 #define EFX_BYTE_IS_ZERO(_byte) \
525 (((_byte).eb_u8[0]) == 0)
528 #define EFX_OWORD_IS_SET64(_oword) \
529 (((_oword).eo_u64[0] & \
530 (_oword).eo_u64[1]) == ~((uint64_t)0))
532 #define EFX_OWORD_IS_SET32(_oword) \
533 (((_oword).eo_u32[0] & \
534 (_oword).eo_u32[1] & \
535 (_oword).eo_u32[2] & \
536 (_oword).eo_u32[3]) == ~((uint32_t)0))
538 #define EFX_QWORD_IS_SET64(_qword) \
539 (((_qword).eq_u64[0]) == ~((uint64_t)0))
541 #define EFX_QWORD_IS_SET32(_qword) \
542 (((_qword).eq_u32[0] & \
543 (_qword).eq_u32[1]) == ~((uint32_t)0))
545 #define EFX_DWORD_IS_SET(_dword) \
546 ((_dword).ed_u32[0] == ~((uint32_t)0))
548 #define EFX_WORD_IS_SET(_word) \
549 ((_word).ew_u16[0] == ~((uint16_t)0))
551 #define EFX_BYTE_IS_SET(_byte) \
552 ((_byte).eb_u8[0] == ~((uint8_t)0))
555 * Construct bit field portion
557 * Creates the portion of the bit field [low,high) that lies within
558 * the range [min,max).
561 #define EFX_INSERT_NATIVE64(_min, _max, _low, _high, _value) \
562 (((_low > _max) || (_high < _min)) ? \
565 (((uint64_t)(_value)) << (_low - _min)) : \
566 (((uint64_t)(_value)) >> (_min - _low))))
568 #define EFX_INSERT_NATIVE32(_min, _max, _low, _high, _value) \
569 (((_low > _max) || (_high < _min)) ? \
572 (((uint32_t)(_value)) << (_low - _min)) : \
573 (((uint32_t)(_value)) >> (_min - _low))))
575 #define EFX_INSERT_NATIVE16(_min, _max, _low, _high, _value) \
576 (((_low > _max) || (_high < _min)) ? \
578 (uint16_t)((_low > _min) ? \
579 ((_value) << (_low - _min)) : \
580 ((_value) >> (_min - _low))))
582 #define EFX_INSERT_NATIVE8(_min, _max, _low, _high, _value) \
583 (((_low > _max) || (_high < _min)) ? \
585 (uint8_t)((_low > _min) ? \
586 ((_value) << (_low - _min)) : \
587 ((_value) >> (_min - _low))))
590 * Construct bit field portion
592 * Creates the portion of the named bit field that lies within the
595 #define EFX_INSERT_FIELD_NATIVE64(_min, _max, _field, _value) \
596 EFX_INSERT_NATIVE64(_min, _max, EFX_LOW_BIT(_field), \
597 EFX_HIGH_BIT(_field), _value)
599 #define EFX_INSERT_FIELD_NATIVE32(_min, _max, _field, _value) \
600 EFX_INSERT_NATIVE32(_min, _max, EFX_LOW_BIT(_field), \
601 EFX_HIGH_BIT(_field), _value)
603 #define EFX_INSERT_FIELD_NATIVE16(_min, _max, _field, _value) \
604 EFX_INSERT_NATIVE16(_min, _max, EFX_LOW_BIT(_field), \
605 EFX_HIGH_BIT(_field), _value)
607 #define EFX_INSERT_FIELD_NATIVE8(_min, _max, _field, _value) \
608 EFX_INSERT_NATIVE8(_min, _max, EFX_LOW_BIT(_field), \
609 EFX_HIGH_BIT(_field), _value)
612 * Construct bit field
614 * Creates the portion of the named bit fields that lie within the
617 #define EFX_INSERT_FIELDS64(_min, _max, \
618 _field1, _value1, _field2, _value2, _field3, _value3, \
619 _field4, _value4, _field5, _value5, _field6, _value6, \
620 _field7, _value7, _field8, _value8, _field9, _value9, \
621 _field10, _value10) \
623 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field1, _value1) | \
624 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field2, _value2) | \
625 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field3, _value3) | \
626 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field4, _value4) | \
627 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field5, _value5) | \
628 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field6, _value6) | \
629 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field7, _value7) | \
630 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field8, _value8) | \
631 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field9, _value9) | \
632 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field10, _value10))
634 #define EFX_INSERT_FIELDS32(_min, _max, \
635 _field1, _value1, _field2, _value2, _field3, _value3, \
636 _field4, _value4, _field5, _value5, _field6, _value6, \
637 _field7, _value7, _field8, _value8, _field9, _value9, \
638 _field10, _value10) \
640 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field1, _value1) | \
641 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field2, _value2) | \
642 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field3, _value3) | \
643 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field4, _value4) | \
644 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field5, _value5) | \
645 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field6, _value6) | \
646 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field7, _value7) | \
647 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field8, _value8) | \
648 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field9, _value9) | \
649 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field10, _value10))
651 #define EFX_INSERT_FIELDS16(_min, _max, \
652 _field1, _value1, _field2, _value2, _field3, _value3, \
653 _field4, _value4, _field5, _value5, _field6, _value6, \
654 _field7, _value7, _field8, _value8, _field9, _value9, \
655 _field10, _value10) \
657 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field1, _value1) | \
658 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field2, _value2) | \
659 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field3, _value3) | \
660 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field4, _value4) | \
661 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field5, _value5) | \
662 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field6, _value6) | \
663 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field7, _value7) | \
664 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field8, _value8) | \
665 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field9, _value9) | \
666 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field10, _value10))
668 #define EFX_INSERT_FIELDS8(_min, _max, \
669 _field1, _value1, _field2, _value2, _field3, _value3, \
670 _field4, _value4, _field5, _value5, _field6, _value6, \
671 _field7, _value7, _field8, _value8, _field9, _value9, \
672 _field10, _value10) \
674 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field1, _value1) | \
675 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field2, _value2) | \
676 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field3, _value3) | \
677 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field4, _value4) | \
678 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field5, _value5) | \
679 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field6, _value6) | \
680 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field7, _value7) | \
681 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field8, _value8) | \
682 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field9, _value9) | \
683 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field10, _value10))
685 #define EFX_POPULATE_OWORD64(_oword, \
686 _field1, _value1, _field2, _value2, _field3, _value3, \
687 _field4, _value4, _field5, _value5, _field6, _value6, \
688 _field7, _value7, _field8, _value8, _field9, _value9, \
689 _field10, _value10) \
691 _NOTE(CONSTANTCONDITION) \
692 (_oword).eo_u64[0] = EFX_INSERT_FIELDS64(0, 63, \
693 _field1, _value1, _field2, _value2, \
694 _field3, _value3, _field4, _value4, \
695 _field5, _value5, _field6, _value6, \
696 _field7, _value7, _field8, _value8, \
697 _field9, _value9, _field10, _value10); \
698 _NOTE(CONSTANTCONDITION) \
699 (_oword).eo_u64[1] = EFX_INSERT_FIELDS64(64, 127, \
700 _field1, _value1, _field2, _value2, \
701 _field3, _value3, _field4, _value4, \
702 _field5, _value5, _field6, _value6, \
703 _field7, _value7, _field8, _value8, \
704 _field9, _value9, _field10, _value10); \
705 _NOTE(CONSTANTCONDITION) \
708 #define EFX_POPULATE_OWORD32(_oword, \
709 _field1, _value1, _field2, _value2, _field3, _value3, \
710 _field4, _value4, _field5, _value5, _field6, _value6, \
711 _field7, _value7, _field8, _value8, _field9, _value9, \
712 _field10, _value10) \
714 _NOTE(CONSTANTCONDITION) \
715 (_oword).eo_u32[0] = EFX_INSERT_FIELDS32(0, 31, \
716 _field1, _value1, _field2, _value2, \
717 _field3, _value3, _field4, _value4, \
718 _field5, _value5, _field6, _value6, \
719 _field7, _value7, _field8, _value8, \
720 _field9, _value9, _field10, _value10); \
721 _NOTE(CONSTANTCONDITION) \
722 (_oword).eo_u32[1] = EFX_INSERT_FIELDS32(32, 63, \
723 _field1, _value1, _field2, _value2, \
724 _field3, _value3, _field4, _value4, \
725 _field5, _value5, _field6, _value6, \
726 _field7, _value7, _field8, _value8, \
727 _field9, _value9, _field10, _value10); \
728 _NOTE(CONSTANTCONDITION) \
729 (_oword).eo_u32[2] = EFX_INSERT_FIELDS32(64, 95, \
730 _field1, _value1, _field2, _value2, \
731 _field3, _value3, _field4, _value4, \
732 _field5, _value5, _field6, _value6, \
733 _field7, _value7, _field8, _value8, \
734 _field9, _value9, _field10, _value10); \
735 _NOTE(CONSTANTCONDITION) \
736 (_oword).eo_u32[3] = EFX_INSERT_FIELDS32(96, 127, \
737 _field1, _value1, _field2, _value2, \
738 _field3, _value3, _field4, _value4, \
739 _field5, _value5, _field6, _value6, \
740 _field7, _value7, _field8, _value8, \
741 _field9, _value9, _field10, _value10); \
742 _NOTE(CONSTANTCONDITION) \
745 #define EFX_POPULATE_QWORD64(_qword, \
746 _field1, _value1, _field2, _value2, _field3, _value3, \
747 _field4, _value4, _field5, _value5, _field6, _value6, \
748 _field7, _value7, _field8, _value8, _field9, _value9, \
749 _field10, _value10) \
751 _NOTE(CONSTANTCONDITION) \
752 (_qword).eq_u64[0] = EFX_INSERT_FIELDS64(0, 63, \
753 _field1, _value1, _field2, _value2, \
754 _field3, _value3, _field4, _value4, \
755 _field5, _value5, _field6, _value6, \
756 _field7, _value7, _field8, _value8, \
757 _field9, _value9, _field10, _value10); \
758 _NOTE(CONSTANTCONDITION) \
761 #define EFX_POPULATE_QWORD32(_qword, \
762 _field1, _value1, _field2, _value2, _field3, _value3, \
763 _field4, _value4, _field5, _value5, _field6, _value6, \
764 _field7, _value7, _field8, _value8, _field9, _value9, \
765 _field10, _value10) \
767 _NOTE(CONSTANTCONDITION) \
768 (_qword).eq_u32[0] = EFX_INSERT_FIELDS32(0, 31, \
769 _field1, _value1, _field2, _value2, \
770 _field3, _value3, _field4, _value4, \
771 _field5, _value5, _field6, _value6, \
772 _field7, _value7, _field8, _value8, \
773 _field9, _value9, _field10, _value10); \
774 _NOTE(CONSTANTCONDITION) \
775 (_qword).eq_u32[1] = EFX_INSERT_FIELDS32(32, 63, \
776 _field1, _value1, _field2, _value2, \
777 _field3, _value3, _field4, _value4, \
778 _field5, _value5, _field6, _value6, \
779 _field7, _value7, _field8, _value8, \
780 _field9, _value9, _field10, _value10); \
781 _NOTE(CONSTANTCONDITION) \
784 #define EFX_POPULATE_DWORD(_dword, \
785 _field1, _value1, _field2, _value2, _field3, _value3, \
786 _field4, _value4, _field5, _value5, _field6, _value6, \
787 _field7, _value7, _field8, _value8, _field9, _value9, \
788 _field10, _value10) \
790 _NOTE(CONSTANTCONDITION) \
791 (_dword).ed_u32[0] = EFX_INSERT_FIELDS32(0, 31, \
792 _field1, _value1, _field2, _value2, \
793 _field3, _value3, _field4, _value4, \
794 _field5, _value5, _field6, _value6, \
795 _field7, _value7, _field8, _value8, \
796 _field9, _value9, _field10, _value10); \
797 _NOTE(CONSTANTCONDITION) \
800 #define EFX_POPULATE_WORD(_word, \
801 _field1, _value1, _field2, _value2, _field3, _value3, \
802 _field4, _value4, _field5, _value5, _field6, _value6, \
803 _field7, _value7, _field8, _value8, _field9, _value9, \
804 _field10, _value10) \
806 _NOTE(CONSTANTCONDITION) \
807 (_word).ew_u16[0] = EFX_INSERT_FIELDS16(0, 15, \
808 _field1, _value1, _field2, _value2, \
809 _field3, _value3, _field4, _value4, \
810 _field5, _value5, _field6, _value6, \
811 _field7, _value7, _field8, _value8, \
812 _field9, _value9, _field10, _value10); \
813 _NOTE(CONSTANTCONDITION) \
816 #define EFX_POPULATE_BYTE(_byte, \
817 _field1, _value1, _field2, _value2, _field3, _value3, \
818 _field4, _value4, _field5, _value5, _field6, _value6, \
819 _field7, _value7, _field8, _value8, _field9, _value9, \
820 _field10, _value10) \
822 _NOTE(CONSTANTCONDITION) \
823 (_byte).eb_u8[0] = EFX_INSERT_FIELDS8(0, 7, \
824 _field1, _value1, _field2, _value2, \
825 _field3, _value3, _field4, _value4, \
826 _field5, _value5, _field6, _value6, \
827 _field7, _value7, _field8, _value8, \
828 _field9, _value9, _field10, _value10); \
829 _NOTE(CONSTANTCONDITION) \
832 /* Populate an octword field with various numbers of arguments */
833 #define EFX_POPULATE_OWORD_10 EFX_POPULATE_OWORD
835 #define EFX_POPULATE_OWORD_9(_oword, \
836 _field1, _value1, _field2, _value2, _field3, _value3, \
837 _field4, _value4, _field5, _value5, _field6, _value6, \
838 _field7, _value7, _field8, _value8, _field9, _value9) \
839 EFX_POPULATE_OWORD_10(_oword, EFX_DUMMY_FIELD, 0, \
840 _field1, _value1, _field2, _value2, _field3, _value3, \
841 _field4, _value4, _field5, _value5, _field6, _value6, \
842 _field7, _value7, _field8, _value8, _field9, _value9)
844 #define EFX_POPULATE_OWORD_8(_oword, \
845 _field1, _value1, _field2, _value2, _field3, _value3, \
846 _field4, _value4, _field5, _value5, _field6, _value6, \
847 _field7, _value7, _field8, _value8) \
848 EFX_POPULATE_OWORD_9(_oword, EFX_DUMMY_FIELD, 0, \
849 _field1, _value1, _field2, _value2, _field3, _value3, \
850 _field4, _value4, _field5, _value5, _field6, _value6, \
851 _field7, _value7, _field8, _value8)
853 #define EFX_POPULATE_OWORD_7(_oword, \
854 _field1, _value1, _field2, _value2, _field3, _value3, \
855 _field4, _value4, _field5, _value5, _field6, _value6, \
857 EFX_POPULATE_OWORD_8(_oword, EFX_DUMMY_FIELD, 0, \
858 _field1, _value1, _field2, _value2, _field3, _value3, \
859 _field4, _value4, _field5, _value5, _field6, _value6, \
862 #define EFX_POPULATE_OWORD_6(_oword, \
863 _field1, _value1, _field2, _value2, _field3, _value3, \
864 _field4, _value4, _field5, _value5, _field6, _value6) \
865 EFX_POPULATE_OWORD_7(_oword, EFX_DUMMY_FIELD, 0, \
866 _field1, _value1, _field2, _value2, _field3, _value3, \
867 _field4, _value4, _field5, _value5, _field6, _value6)
869 #define EFX_POPULATE_OWORD_5(_oword, \
870 _field1, _value1, _field2, _value2, _field3, _value3, \
871 _field4, _value4, _field5, _value5) \
872 EFX_POPULATE_OWORD_6(_oword, EFX_DUMMY_FIELD, 0, \
873 _field1, _value1, _field2, _value2, _field3, _value3, \
874 _field4, _value4, _field5, _value5)
876 #define EFX_POPULATE_OWORD_4(_oword, \
877 _field1, _value1, _field2, _value2, _field3, _value3, \
879 EFX_POPULATE_OWORD_5(_oword, EFX_DUMMY_FIELD, 0, \
880 _field1, _value1, _field2, _value2, _field3, _value3, \
883 #define EFX_POPULATE_OWORD_3(_oword, \
884 _field1, _value1, _field2, _value2, _field3, _value3) \
885 EFX_POPULATE_OWORD_4(_oword, EFX_DUMMY_FIELD, 0, \
886 _field1, _value1, _field2, _value2, _field3, _value3)
888 #define EFX_POPULATE_OWORD_2(_oword, \
889 _field1, _value1, _field2, _value2) \
890 EFX_POPULATE_OWORD_3(_oword, EFX_DUMMY_FIELD, 0, \
891 _field1, _value1, _field2, _value2)
893 #define EFX_POPULATE_OWORD_1(_oword, \
895 EFX_POPULATE_OWORD_2(_oword, EFX_DUMMY_FIELD, 0, \
898 #define EFX_ZERO_OWORD(_oword) \
899 EFX_POPULATE_OWORD_1(_oword, EFX_DUMMY_FIELD, 0)
901 #define EFX_SET_OWORD(_oword) \
902 EFX_POPULATE_OWORD_4(_oword, \
903 EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff, \
904 EFX_DWORD_2, 0xffffffff, EFX_DWORD_3, 0xffffffff)
906 /* Populate a quadword field with various numbers of arguments */
907 #define EFX_POPULATE_QWORD_10 EFX_POPULATE_QWORD
909 #define EFX_POPULATE_QWORD_9(_qword, \
910 _field1, _value1, _field2, _value2, _field3, _value3, \
911 _field4, _value4, _field5, _value5, _field6, _value6, \
912 _field7, _value7, _field8, _value8, _field9, _value9) \
913 EFX_POPULATE_QWORD_10(_qword, EFX_DUMMY_FIELD, 0, \
914 _field1, _value1, _field2, _value2, _field3, _value3, \
915 _field4, _value4, _field5, _value5, _field6, _value6, \
916 _field7, _value7, _field8, _value8, _field9, _value9)
918 #define EFX_POPULATE_QWORD_8(_qword, \
919 _field1, _value1, _field2, _value2, _field3, _value3, \
920 _field4, _value4, _field5, _value5, _field6, _value6, \
921 _field7, _value7, _field8, _value8) \
922 EFX_POPULATE_QWORD_9(_qword, EFX_DUMMY_FIELD, 0, \
923 _field1, _value1, _field2, _value2, _field3, _value3, \
924 _field4, _value4, _field5, _value5, _field6, _value6, \
925 _field7, _value7, _field8, _value8)
927 #define EFX_POPULATE_QWORD_7(_qword, \
928 _field1, _value1, _field2, _value2, _field3, _value3, \
929 _field4, _value4, _field5, _value5, _field6, _value6, \
931 EFX_POPULATE_QWORD_8(_qword, EFX_DUMMY_FIELD, 0, \
932 _field1, _value1, _field2, _value2, _field3, _value3, \
933 _field4, _value4, _field5, _value5, _field6, _value6, \
936 #define EFX_POPULATE_QWORD_6(_qword, \
937 _field1, _value1, _field2, _value2, _field3, _value3, \
938 _field4, _value4, _field5, _value5, _field6, _value6) \
939 EFX_POPULATE_QWORD_7(_qword, EFX_DUMMY_FIELD, 0, \
940 _field1, _value1, _field2, _value2, _field3, _value3, \
941 _field4, _value4, _field5, _value5, _field6, _value6)
943 #define EFX_POPULATE_QWORD_5(_qword, \
944 _field1, _value1, _field2, _value2, _field3, _value3, \
945 _field4, _value4, _field5, _value5) \
946 EFX_POPULATE_QWORD_6(_qword, EFX_DUMMY_FIELD, 0, \
947 _field1, _value1, _field2, _value2, _field3, _value3, \
948 _field4, _value4, _field5, _value5)
950 #define EFX_POPULATE_QWORD_4(_qword, \
951 _field1, _value1, _field2, _value2, _field3, _value3, \
953 EFX_POPULATE_QWORD_5(_qword, EFX_DUMMY_FIELD, 0, \
954 _field1, _value1, _field2, _value2, _field3, _value3, \
957 #define EFX_POPULATE_QWORD_3(_qword, \
958 _field1, _value1, _field2, _value2, _field3, _value3) \
959 EFX_POPULATE_QWORD_4(_qword, EFX_DUMMY_FIELD, 0, \
960 _field1, _value1, _field2, _value2, _field3, _value3)
962 #define EFX_POPULATE_QWORD_2(_qword, \
963 _field1, _value1, _field2, _value2) \
964 EFX_POPULATE_QWORD_3(_qword, EFX_DUMMY_FIELD, 0, \
965 _field1, _value1, _field2, _value2)
967 #define EFX_POPULATE_QWORD_1(_qword, \
969 EFX_POPULATE_QWORD_2(_qword, EFX_DUMMY_FIELD, 0, \
972 #define EFX_ZERO_QWORD(_qword) \
973 EFX_POPULATE_QWORD_1(_qword, EFX_DUMMY_FIELD, 0)
975 #define EFX_SET_QWORD(_qword) \
976 EFX_POPULATE_QWORD_2(_qword, \
977 EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff)
979 /* Populate a dword field with various numbers of arguments */
980 #define EFX_POPULATE_DWORD_10 EFX_POPULATE_DWORD
982 #define EFX_POPULATE_DWORD_9(_dword, \
983 _field1, _value1, _field2, _value2, _field3, _value3, \
984 _field4, _value4, _field5, _value5, _field6, _value6, \
985 _field7, _value7, _field8, _value8, _field9, _value9) \
986 EFX_POPULATE_DWORD_10(_dword, EFX_DUMMY_FIELD, 0, \
987 _field1, _value1, _field2, _value2, _field3, _value3, \
988 _field4, _value4, _field5, _value5, _field6, _value6, \
989 _field7, _value7, _field8, _value8, _field9, _value9)
991 #define EFX_POPULATE_DWORD_8(_dword, \
992 _field1, _value1, _field2, _value2, _field3, _value3, \
993 _field4, _value4, _field5, _value5, _field6, _value6, \
994 _field7, _value7, _field8, _value8) \
995 EFX_POPULATE_DWORD_9(_dword, EFX_DUMMY_FIELD, 0, \
996 _field1, _value1, _field2, _value2, _field3, _value3, \
997 _field4, _value4, _field5, _value5, _field6, _value6, \
998 _field7, _value7, _field8, _value8)
1000 #define EFX_POPULATE_DWORD_7(_dword, \
1001 _field1, _value1, _field2, _value2, _field3, _value3, \
1002 _field4, _value4, _field5, _value5, _field6, _value6, \
1004 EFX_POPULATE_DWORD_8(_dword, EFX_DUMMY_FIELD, 0, \
1005 _field1, _value1, _field2, _value2, _field3, _value3, \
1006 _field4, _value4, _field5, _value5, _field6, _value6, \
1009 #define EFX_POPULATE_DWORD_6(_dword, \
1010 _field1, _value1, _field2, _value2, _field3, _value3, \
1011 _field4, _value4, _field5, _value5, _field6, _value6) \
1012 EFX_POPULATE_DWORD_7(_dword, EFX_DUMMY_FIELD, 0, \
1013 _field1, _value1, _field2, _value2, _field3, _value3, \
1014 _field4, _value4, _field5, _value5, _field6, _value6)
1016 #define EFX_POPULATE_DWORD_5(_dword, \
1017 _field1, _value1, _field2, _value2, _field3, _value3, \
1018 _field4, _value4, _field5, _value5) \
1019 EFX_POPULATE_DWORD_6(_dword, EFX_DUMMY_FIELD, 0, \
1020 _field1, _value1, _field2, _value2, _field3, _value3, \
1021 _field4, _value4, _field5, _value5)
1023 #define EFX_POPULATE_DWORD_4(_dword, \
1024 _field1, _value1, _field2, _value2, _field3, _value3, \
1026 EFX_POPULATE_DWORD_5(_dword, EFX_DUMMY_FIELD, 0, \
1027 _field1, _value1, _field2, _value2, _field3, _value3, \
1030 #define EFX_POPULATE_DWORD_3(_dword, \
1031 _field1, _value1, _field2, _value2, _field3, _value3) \
1032 EFX_POPULATE_DWORD_4(_dword, EFX_DUMMY_FIELD, 0, \
1033 _field1, _value1, _field2, _value2, _field3, _value3)
1035 #define EFX_POPULATE_DWORD_2(_dword, \
1036 _field1, _value1, _field2, _value2) \
1037 EFX_POPULATE_DWORD_3(_dword, EFX_DUMMY_FIELD, 0, \
1038 _field1, _value1, _field2, _value2)
1040 #define EFX_POPULATE_DWORD_1(_dword, \
1042 EFX_POPULATE_DWORD_2(_dword, EFX_DUMMY_FIELD, 0, \
1045 #define EFX_ZERO_DWORD(_dword) \
1046 EFX_POPULATE_DWORD_1(_dword, EFX_DUMMY_FIELD, 0)
1048 #define EFX_SET_DWORD(_dword) \
1049 EFX_POPULATE_DWORD_1(_dword, \
1050 EFX_DWORD_0, 0xffffffff)
1052 /* Populate a word field with various numbers of arguments */
1053 #define EFX_POPULATE_WORD_10 EFX_POPULATE_WORD
1055 #define EFX_POPULATE_WORD_9(_word, \
1056 _field1, _value1, _field2, _value2, _field3, _value3, \
1057 _field4, _value4, _field5, _value5, _field6, _value6, \
1058 _field7, _value7, _field8, _value8, _field9, _value9) \
1059 EFX_POPULATE_WORD_10(_word, EFX_DUMMY_FIELD, 0, \
1060 _field1, _value1, _field2, _value2, _field3, _value3, \
1061 _field4, _value4, _field5, _value5, _field6, _value6, \
1062 _field7, _value7, _field8, _value8, _field9, _value9)
1064 #define EFX_POPULATE_WORD_8(_word, \
1065 _field1, _value1, _field2, _value2, _field3, _value3, \
1066 _field4, _value4, _field5, _value5, _field6, _value6, \
1067 _field7, _value7, _field8, _value8) \
1068 EFX_POPULATE_WORD_9(_word, EFX_DUMMY_FIELD, 0, \
1069 _field1, _value1, _field2, _value2, _field3, _value3, \
1070 _field4, _value4, _field5, _value5, _field6, _value6, \
1071 _field7, _value7, _field8, _value8)
1073 #define EFX_POPULATE_WORD_7(_word, \
1074 _field1, _value1, _field2, _value2, _field3, _value3, \
1075 _field4, _value4, _field5, _value5, _field6, _value6, \
1077 EFX_POPULATE_WORD_8(_word, EFX_DUMMY_FIELD, 0, \
1078 _field1, _value1, _field2, _value2, _field3, _value3, \
1079 _field4, _value4, _field5, _value5, _field6, _value6, \
1082 #define EFX_POPULATE_WORD_6(_word, \
1083 _field1, _value1, _field2, _value2, _field3, _value3, \
1084 _field4, _value4, _field5, _value5, _field6, _value6) \
1085 EFX_POPULATE_WORD_7(_word, EFX_DUMMY_FIELD, 0, \
1086 _field1, _value1, _field2, _value2, _field3, _value3, \
1087 _field4, _value4, _field5, _value5, _field6, _value6)
1089 #define EFX_POPULATE_WORD_5(_word, \
1090 _field1, _value1, _field2, _value2, _field3, _value3, \
1091 _field4, _value4, _field5, _value5) \
1092 EFX_POPULATE_WORD_6(_word, EFX_DUMMY_FIELD, 0, \
1093 _field1, _value1, _field2, _value2, _field3, _value3, \
1094 _field4, _value4, _field5, _value5)
1096 #define EFX_POPULATE_WORD_4(_word, \
1097 _field1, _value1, _field2, _value2, _field3, _value3, \
1099 EFX_POPULATE_WORD_5(_word, EFX_DUMMY_FIELD, 0, \
1100 _field1, _value1, _field2, _value2, _field3, _value3, \
1103 #define EFX_POPULATE_WORD_3(_word, \
1104 _field1, _value1, _field2, _value2, _field3, _value3) \
1105 EFX_POPULATE_WORD_4(_word, EFX_DUMMY_FIELD, 0, \
1106 _field1, _value1, _field2, _value2, _field3, _value3)
1108 #define EFX_POPULATE_WORD_2(_word, \
1109 _field1, _value1, _field2, _value2) \
1110 EFX_POPULATE_WORD_3(_word, EFX_DUMMY_FIELD, 0, \
1111 _field1, _value1, _field2, _value2)
1113 #define EFX_POPULATE_WORD_1(_word, \
1115 EFX_POPULATE_WORD_2(_word, EFX_DUMMY_FIELD, 0, \
1118 #define EFX_ZERO_WORD(_word) \
1119 EFX_POPULATE_WORD_1(_word, EFX_DUMMY_FIELD, 0)
1121 #define EFX_SET_WORD(_word) \
1122 EFX_POPULATE_WORD_1(_word, \
1125 /* Populate a byte field with various numbers of arguments */
1126 #define EFX_POPULATE_BYTE_10 EFX_POPULATE_BYTE
1128 #define EFX_POPULATE_BYTE_9(_byte, \
1129 _field1, _value1, _field2, _value2, _field3, _value3, \
1130 _field4, _value4, _field5, _value5, _field6, _value6, \
1131 _field7, _value7, _field8, _value8, _field9, _value9) \
1132 EFX_POPULATE_BYTE_10(_byte, EFX_DUMMY_FIELD, 0, \
1133 _field1, _value1, _field2, _value2, _field3, _value3, \
1134 _field4, _value4, _field5, _value5, _field6, _value6, \
1135 _field7, _value7, _field8, _value8, _field9, _value9)
1137 #define EFX_POPULATE_BYTE_8(_byte, \
1138 _field1, _value1, _field2, _value2, _field3, _value3, \
1139 _field4, _value4, _field5, _value5, _field6, _value6, \
1140 _field7, _value7, _field8, _value8) \
1141 EFX_POPULATE_BYTE_9(_byte, EFX_DUMMY_FIELD, 0, \
1142 _field1, _value1, _field2, _value2, _field3, _value3, \
1143 _field4, _value4, _field5, _value5, _field6, _value6, \
1144 _field7, _value7, _field8, _value8)
1146 #define EFX_POPULATE_BYTE_7(_byte, \
1147 _field1, _value1, _field2, _value2, _field3, _value3, \
1148 _field4, _value4, _field5, _value5, _field6, _value6, \
1150 EFX_POPULATE_BYTE_8(_byte, EFX_DUMMY_FIELD, 0, \
1151 _field1, _value1, _field2, _value2, _field3, _value3, \
1152 _field4, _value4, _field5, _value5, _field6, _value6, \
1155 #define EFX_POPULATE_BYTE_6(_byte, \
1156 _field1, _value1, _field2, _value2, _field3, _value3, \
1157 _field4, _value4, _field5, _value5, _field6, _value6) \
1158 EFX_POPULATE_BYTE_7(_byte, EFX_DUMMY_FIELD, 0, \
1159 _field1, _value1, _field2, _value2, _field3, _value3, \
1160 _field4, _value4, _field5, _value5, _field6, _value6)
1162 #define EFX_POPULATE_BYTE_5(_byte, \
1163 _field1, _value1, _field2, _value2, _field3, _value3, \
1164 _field4, _value4, _field5, _value5) \
1165 EFX_POPULATE_BYTE_6(_byte, EFX_DUMMY_FIELD, 0, \
1166 _field1, _value1, _field2, _value2, _field3, _value3, \
1167 _field4, _value4, _field5, _value5)
1169 #define EFX_POPULATE_BYTE_4(_byte, \
1170 _field1, _value1, _field2, _value2, _field3, _value3, \
1172 EFX_POPULATE_BYTE_5(_byte, EFX_DUMMY_FIELD, 0, \
1173 _field1, _value1, _field2, _value2, _field3, _value3, \
1176 #define EFX_POPULATE_BYTE_3(_byte, \
1177 _field1, _value1, _field2, _value2, _field3, _value3) \
1178 EFX_POPULATE_BYTE_4(_byte, EFX_DUMMY_FIELD, 0, \
1179 _field1, _value1, _field2, _value2, _field3, _value3)
1181 #define EFX_POPULATE_BYTE_2(_byte, \
1182 _field1, _value1, _field2, _value2) \
1183 EFX_POPULATE_BYTE_3(_byte, EFX_DUMMY_FIELD, 0, \
1184 _field1, _value1, _field2, _value2)
1186 #define EFX_POPULATE_BYTE_1(_byte, \
1188 EFX_POPULATE_BYTE_2(_byte, EFX_DUMMY_FIELD, 0, \
1191 #define EFX_ZERO_BYTE(_byte) \
1192 EFX_POPULATE_BYTE_1(_byte, EFX_DUMMY_FIELD, 0)
1194 #define EFX_SET_BYTE(_byte) \
1195 EFX_POPULATE_BYTE_1(_byte, \
1199 * Modify a named field within an already-populated structure. Used
1200 * for read-modify-write operations.
1203 #define EFX_INSERT_FIELD64(_min, _max, _field, _value) \
1204 __CPU_TO_LE_64(EFX_INSERT_FIELD_NATIVE64(_min, _max, _field, _value))
1206 #define EFX_INSERT_FIELD32(_min, _max, _field, _value) \
1207 __CPU_TO_LE_32(EFX_INSERT_FIELD_NATIVE32(_min, _max, _field, _value))
1209 #define EFX_INSERT_FIELD16(_min, _max, _field, _value) \
1210 __CPU_TO_LE_16(EFX_INSERT_FIELD_NATIVE16(_min, _max, _field, _value))
1212 #define EFX_INSERT_FIELD8(_min, _max, _field, _value) \
1213 __NATIVE_8(EFX_INSERT_FIELD_NATIVE8(_min, _max, _field, _value))
1215 #define EFX_INPLACE_MASK64(_min, _max, _field) \
1216 EFX_INSERT_FIELD64(_min, _max, _field, EFX_MASK64(_field))
1218 #define EFX_INPLACE_MASK32(_min, _max, _field) \
1219 EFX_INSERT_FIELD32(_min, _max, _field, EFX_MASK32(_field))
1221 #define EFX_INPLACE_MASK16(_min, _max, _field) \
1222 EFX_INSERT_FIELD16(_min, _max, _field, EFX_MASK16(_field))
1224 #define EFX_INPLACE_MASK8(_min, _max, _field) \
1225 EFX_INSERT_FIELD8(_min, _max, _field, EFX_MASK8(_field))
1227 #define EFX_SET_OWORD_FIELD64(_oword, _field, _value) \
1229 _NOTE(CONSTANTCONDITION) \
1230 (_oword).eo_u64[0] = (((_oword).eo_u64[0] & \
1231 ~EFX_INPLACE_MASK64(0, 63, _field)) | \
1232 EFX_INSERT_FIELD64(0, 63, _field, _value)); \
1233 _NOTE(CONSTANTCONDITION) \
1234 (_oword).eo_u64[1] = (((_oword).eo_u64[1] & \
1235 ~EFX_INPLACE_MASK64(64, 127, _field)) | \
1236 EFX_INSERT_FIELD64(64, 127, _field, _value)); \
1237 _NOTE(CONSTANTCONDITION) \
1240 #define EFX_SET_OWORD_FIELD32(_oword, _field, _value) \
1242 _NOTE(CONSTANTCONDITION) \
1243 (_oword).eo_u32[0] = (((_oword).eo_u32[0] & \
1244 ~EFX_INPLACE_MASK32(0, 31, _field)) | \
1245 EFX_INSERT_FIELD32(0, 31, _field, _value)); \
1246 _NOTE(CONSTANTCONDITION) \
1247 (_oword).eo_u32[1] = (((_oword).eo_u32[1] & \
1248 ~EFX_INPLACE_MASK32(32, 63, _field)) | \
1249 EFX_INSERT_FIELD32(32, 63, _field, _value)); \
1250 _NOTE(CONSTANTCONDITION) \
1251 (_oword).eo_u32[2] = (((_oword).eo_u32[2] & \
1252 ~EFX_INPLACE_MASK32(64, 95, _field)) | \
1253 EFX_INSERT_FIELD32(64, 95, _field, _value)); \
1254 _NOTE(CONSTANTCONDITION) \
1255 (_oword).eo_u32[3] = (((_oword).eo_u32[3] & \
1256 ~EFX_INPLACE_MASK32(96, 127, _field)) | \
1257 EFX_INSERT_FIELD32(96, 127, _field, _value)); \
1258 _NOTE(CONSTANTCONDITION) \
1261 #define EFX_SET_QWORD_FIELD64(_qword, _field, _value) \
1263 _NOTE(CONSTANTCONDITION) \
1264 (_qword).eq_u64[0] = (((_qword).eq_u64[0] & \
1265 ~EFX_INPLACE_MASK64(0, 63, _field)) | \
1266 EFX_INSERT_FIELD64(0, 63, _field, _value)); \
1267 _NOTE(CONSTANTCONDITION) \
1270 #define EFX_SET_QWORD_FIELD32(_qword, _field, _value) \
1272 _NOTE(CONSTANTCONDITION) \
1273 (_qword).eq_u32[0] = (((_qword).eq_u32[0] & \
1274 ~EFX_INPLACE_MASK32(0, 31, _field)) | \
1275 EFX_INSERT_FIELD32(0, 31, _field, _value)); \
1276 _NOTE(CONSTANTCONDITION) \
1277 (_qword).eq_u32[1] = (((_qword).eq_u32[1] & \
1278 ~EFX_INPLACE_MASK32(32, 63, _field)) | \
1279 EFX_INSERT_FIELD32(32, 63, _field, _value)); \
1280 _NOTE(CONSTANTCONDITION) \
1283 #define EFX_SET_DWORD_FIELD(_dword, _field, _value) \
1285 _NOTE(CONSTANTCONDITION) \
1286 (_dword).ed_u32[0] = (((_dword).ed_u32[0] & \
1287 ~EFX_INPLACE_MASK32(0, 31, _field)) | \
1288 EFX_INSERT_FIELD32(0, 31, _field, _value)); \
1289 _NOTE(CONSTANTCONDITION) \
1292 #define EFX_SET_WORD_FIELD(_word, _field, _value) \
1294 _NOTE(CONSTANTCONDITION) \
1295 (_word).ew_u16[0] = (((_word).ew_u16[0] & \
1296 ~EFX_INPLACE_MASK16(0, 15, _field)) | \
1297 EFX_INSERT_FIELD16(0, 15, _field, _value)); \
1298 _NOTE(CONSTANTCONDITION) \
1301 #define EFX_SET_BYTE_FIELD(_byte, _field, _value) \
1303 _NOTE(CONSTANTCONDITION) \
1304 (_byte).eb_u8[0] = (((_byte).eb_u8[0] & \
1305 ~EFX_INPLACE_MASK8(0, 7, _field)) | \
1306 EFX_INSERT_FIELD8(0, 7, _field, _value)); \
1307 _NOTE(CONSTANTCONDITION) \
1311 * Set or clear a numbered bit within an octword.
1314 #define EFX_SHIFT64(_bit, _base) \
1315 (((_bit) >= (_base) && (_bit) < (_base) + 64) ? \
1316 ((uint64_t)1 << ((_bit) - (_base))) : \
1319 #define EFX_SHIFT32(_bit, _base) \
1320 (((_bit) >= (_base) && (_bit) < (_base) + 32) ? \
1321 ((uint32_t)1 << ((_bit) - (_base))) : \
1324 #define EFX_SHIFT16(_bit, _base) \
1325 (((_bit) >= (_base) && (_bit) < (_base) + 16) ? \
1326 (uint16_t)(1 << ((_bit) - (_base))) : \
1329 #define EFX_SHIFT8(_bit, _base) \
1330 (((_bit) >= (_base) && (_bit) < (_base) + 8) ? \
1331 (uint8_t)(1 << ((_bit) - (_base))) : \
1334 #define EFX_SET_OWORD_BIT64(_oword, _bit) \
1336 _NOTE(CONSTANTCONDITION) \
1337 (_oword).eo_u64[0] |= \
1338 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0))); \
1339 (_oword).eo_u64[1] |= \
1340 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64))); \
1341 _NOTE(CONSTANTCONDITION) \
1344 #define EFX_SET_OWORD_BIT32(_oword, _bit) \
1346 _NOTE(CONSTANTCONDITION) \
1347 (_oword).eo_u32[0] |= \
1348 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0))); \
1349 (_oword).eo_u32[1] |= \
1350 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32))); \
1351 (_oword).eo_u32[2] |= \
1352 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64))); \
1353 (_oword).eo_u32[3] |= \
1354 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96))); \
1355 _NOTE(CONSTANTCONDITION) \
1358 #define EFX_CLEAR_OWORD_BIT64(_oword, _bit) \
1360 _NOTE(CONSTANTCONDITION) \
1361 (_oword).eo_u64[0] &= \
1362 __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0))); \
1363 (_oword).eo_u64[1] &= \
1364 __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(64))); \
1365 _NOTE(CONSTANTCONDITION) \
1368 #define EFX_CLEAR_OWORD_BIT32(_oword, _bit) \
1370 _NOTE(CONSTANTCONDITION) \
1371 (_oword).eo_u32[0] &= \
1372 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0))); \
1373 (_oword).eo_u32[1] &= \
1374 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32))); \
1375 (_oword).eo_u32[2] &= \
1376 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(64))); \
1377 (_oword).eo_u32[3] &= \
1378 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(96))); \
1379 _NOTE(CONSTANTCONDITION) \
1382 #define EFX_TEST_OWORD_BIT64(_oword, _bit) \
1383 (((_oword).eo_u64[0] & \
1384 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) || \
1385 ((_oword).eo_u64[1] & \
1386 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)))))
1388 #define EFX_TEST_OWORD_BIT32(_oword, _bit) \
1389 (((_oword).eo_u32[0] & \
1390 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) || \
1391 ((_oword).eo_u32[1] & \
1392 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))) || \
1393 ((_oword).eo_u32[2] & \
1394 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)))) || \
1395 ((_oword).eo_u32[3] & \
1396 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)))))
1399 #define EFX_SET_QWORD_BIT64(_qword, _bit) \
1401 _NOTE(CONSTANTCONDITION) \
1402 (_qword).eq_u64[0] |= \
1403 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0))); \
1404 _NOTE(CONSTANTCONDITION) \
1407 #define EFX_SET_QWORD_BIT32(_qword, _bit) \
1409 _NOTE(CONSTANTCONDITION) \
1410 (_qword).eq_u32[0] |= \
1411 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0))); \
1412 (_qword).eq_u32[1] |= \
1413 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32))); \
1414 _NOTE(CONSTANTCONDITION) \
1417 #define EFX_CLEAR_QWORD_BIT64(_qword, _bit) \
1419 _NOTE(CONSTANTCONDITION) \
1420 (_qword).eq_u64[0] &= \
1421 __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0))); \
1422 _NOTE(CONSTANTCONDITION) \
1425 #define EFX_CLEAR_QWORD_BIT32(_qword, _bit) \
1427 _NOTE(CONSTANTCONDITION) \
1428 (_qword).eq_u32[0] &= \
1429 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0))); \
1430 (_qword).eq_u32[1] &= \
1431 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32))); \
1432 _NOTE(CONSTANTCONDITION) \
1435 #define EFX_TEST_QWORD_BIT64(_qword, _bit) \
1436 (((_qword).eq_u64[0] & \
1437 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) != 0)
1439 #define EFX_TEST_QWORD_BIT32(_qword, _bit) \
1440 (((_qword).eq_u32[0] & \
1441 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) || \
1442 ((_qword).eq_u32[1] & \
1443 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))))
1446 #define EFX_SET_DWORD_BIT(_dword, _bit) \
1448 (_dword).ed_u32[0] |= \
1449 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0))); \
1450 _NOTE(CONSTANTCONDITION) \
1453 #define EFX_CLEAR_DWORD_BIT(_dword, _bit) \
1455 (_dword).ed_u32[0] &= \
1456 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0))); \
1457 _NOTE(CONSTANTCONDITION) \
1460 #define EFX_TEST_DWORD_BIT(_dword, _bit) \
1461 (((_dword).ed_u32[0] & \
1462 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) != 0)
1465 #define EFX_SET_WORD_BIT(_word, _bit) \
1467 (_word).ew_u16[0] |= \
1468 __CPU_TO_LE_16(EFX_SHIFT16(_bit, FIX_LINT(0))); \
1469 _NOTE(CONSTANTCONDITION) \
1472 #define EFX_CLEAR_WORD_BIT(_word, _bit) \
1474 (_word).ew_u32[0] &= \
1475 __CPU_TO_LE_16(~EFX_SHIFT16(_bit, FIX_LINT(0))); \
1476 _NOTE(CONSTANTCONDITION) \
1479 #define EFX_TEST_WORD_BIT(_word, _bit) \
1480 (((_word).ew_u16[0] & \
1481 __CPU_TO_LE_16(EFX_SHIFT16(_bit, FIX_LINT(0)))) != 0)
1484 #define EFX_SET_BYTE_BIT(_byte, _bit) \
1486 (_byte).eb_u8[0] |= \
1487 __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0))); \
1488 _NOTE(CONSTANTCONDITION) \
1491 #define EFX_CLEAR_BYTE_BIT(_byte, _bit) \
1493 (_byte).eb_u8[0] &= \
1494 __NATIVE_8(~EFX_SHIFT8(_bit, FIX_LINT(0))); \
1495 _NOTE(CONSTANTCONDITION) \
1498 #define EFX_TEST_BYTE_BIT(_byte, _bit) \
1499 (((_byte).eb_u8[0] & \
1500 __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0)))) != 0)
1503 #define EFX_OR_OWORD64(_oword1, _oword2) \
1505 (_oword1).eo_u64[0] |= (_oword2).eo_u64[0]; \
1506 (_oword1).eo_u64[1] |= (_oword2).eo_u64[1]; \
1507 _NOTE(CONSTANTCONDITION) \
1510 #define EFX_OR_OWORD32(_oword1, _oword2) \
1512 (_oword1).eo_u32[0] |= (_oword2).eo_u32[0]; \
1513 (_oword1).eo_u32[1] |= (_oword2).eo_u32[1]; \
1514 (_oword1).eo_u32[2] |= (_oword2).eo_u32[2]; \
1515 (_oword1).eo_u32[3] |= (_oword2).eo_u32[3]; \
1516 _NOTE(CONSTANTCONDITION) \
1519 #define EFX_AND_OWORD64(_oword1, _oword2) \
1521 (_oword1).eo_u64[0] &= (_oword2).eo_u64[0]; \
1522 (_oword1).eo_u64[1] &= (_oword2).eo_u64[1]; \
1523 _NOTE(CONSTANTCONDITION) \
1526 #define EFX_AND_OWORD32(_oword1, _oword2) \
1528 (_oword1).eo_u32[0] &= (_oword2).eo_u32[0]; \
1529 (_oword1).eo_u32[1] &= (_oword2).eo_u32[1]; \
1530 (_oword1).eo_u32[2] &= (_oword2).eo_u32[2]; \
1531 (_oword1).eo_u32[3] &= (_oword2).eo_u32[3]; \
1532 _NOTE(CONSTANTCONDITION) \
1535 #define EFX_OR_QWORD64(_qword1, _qword2) \
1537 (_qword1).eq_u64[0] |= (_qword2).eq_u64[0]; \
1538 _NOTE(CONSTANTCONDITION) \
1541 #define EFX_OR_QWORD32(_qword1, _qword2) \
1543 (_qword1).eq_u32[0] |= (_qword2).eq_u32[0]; \
1544 (_qword1).eq_u32[1] |= (_qword2).eq_u32[1]; \
1545 _NOTE(CONSTANTCONDITION) \
1548 #define EFX_AND_QWORD64(_qword1, _qword2) \
1550 (_qword1).eq_u64[0] &= (_qword2).eq_u64[0]; \
1551 _NOTE(CONSTANTCONDITION) \
1554 #define EFX_AND_QWORD32(_qword1, _qword2) \
1556 (_qword1).eq_u32[0] &= (_qword2).eq_u32[0]; \
1557 (_qword1).eq_u32[1] &= (_qword2).eq_u32[1]; \
1558 _NOTE(CONSTANTCONDITION) \
1561 #define EFX_OR_DWORD(_dword1, _dword2) \
1563 (_dword1).ed_u32[0] |= (_dword2).ed_u32[0]; \
1564 _NOTE(CONSTANTCONDITION) \
1567 #define EFX_AND_DWORD(_dword1, _dword2) \
1569 (_dword1).ed_u32[0] &= (_dword2).ed_u32[0]; \
1570 _NOTE(CONSTANTCONDITION) \
1573 #define EFX_OR_WORD(_word1, _word2) \
1575 (_word1).ew_u16[0] |= (_word2).ew_u16[0]; \
1576 _NOTE(CONSTANTCONDITION) \
1579 #define EFX_AND_WORD(_word1, _word2) \
1581 (_word1).ew_u16[0] &= (_word2).ew_u16[0]; \
1582 _NOTE(CONSTANTCONDITION) \
1585 #define EFX_OR_BYTE(_byte1, _byte2) \
1587 (_byte1).eb_u8[0] |= (_byte2).eb_u8[0]; \
1588 _NOTE(CONSTANTCONDITION) \
1591 #define EFX_AND_BYTE(_byte1, _byte2) \
1593 (_byte1).eb_u8[0] &= (_byte2).eb_u8[0]; \
1594 _NOTE(CONSTANTCONDITION) \
1597 #if EFSYS_USE_UINT64
1598 #define EFX_OWORD_FIELD EFX_OWORD_FIELD64
1599 #define EFX_QWORD_FIELD EFX_QWORD_FIELD64
1600 #define EFX_OWORD_IS_EQUAL EFX_OWORD_IS_EQUAL64
1601 #define EFX_QWORD_IS_EQUAL EFX_QWORD_IS_EQUAL64
1602 #define EFX_OWORD_IS_ZERO EFX_OWORD_IS_ZERO64
1603 #define EFX_QWORD_IS_ZERO EFX_QWORD_IS_ZERO64
1604 #define EFX_OWORD_IS_SET EFX_OWORD_IS_SET64
1605 #define EFX_QWORD_IS_SET EFX_QWORD_IS_SET64
1606 #define EFX_POPULATE_OWORD EFX_POPULATE_OWORD64
1607 #define EFX_POPULATE_QWORD EFX_POPULATE_QWORD64
1608 #define EFX_SET_OWORD_FIELD EFX_SET_OWORD_FIELD64
1609 #define EFX_SET_QWORD_FIELD EFX_SET_QWORD_FIELD64
1610 #define EFX_SET_OWORD_BIT EFX_SET_OWORD_BIT64
1611 #define EFX_CLEAR_OWORD_BIT EFX_CLEAR_OWORD_BIT64
1612 #define EFX_TEST_OWORD_BIT EFX_TEST_OWORD_BIT64
1613 #define EFX_SET_QWORD_BIT EFX_SET_QWORD_BIT64
1614 #define EFX_CLEAR_QWORD_BIT EFX_CLEAR_QWORD_BIT64
1615 #define EFX_TEST_QWORD_BIT EFX_TEST_QWORD_BIT64
1616 #define EFX_OR_OWORD EFX_OR_OWORD64
1617 #define EFX_AND_OWORD EFX_AND_OWORD64
1618 #define EFX_OR_QWORD EFX_OR_QWORD64
1619 #define EFX_AND_QWORD EFX_AND_QWORD64
1621 #define EFX_OWORD_FIELD EFX_OWORD_FIELD32
1622 #define EFX_QWORD_FIELD EFX_QWORD_FIELD32
1623 #define EFX_OWORD_IS_EQUAL EFX_OWORD_IS_EQUAL32
1624 #define EFX_QWORD_IS_EQUAL EFX_QWORD_IS_EQUAL32
1625 #define EFX_OWORD_IS_ZERO EFX_OWORD_IS_ZERO32
1626 #define EFX_QWORD_IS_ZERO EFX_QWORD_IS_ZERO32
1627 #define EFX_OWORD_IS_SET EFX_OWORD_IS_SET32
1628 #define EFX_QWORD_IS_SET EFX_QWORD_IS_SET32
1629 #define EFX_POPULATE_OWORD EFX_POPULATE_OWORD32
1630 #define EFX_POPULATE_QWORD EFX_POPULATE_QWORD32
1631 #define EFX_SET_OWORD_FIELD EFX_SET_OWORD_FIELD32
1632 #define EFX_SET_QWORD_FIELD EFX_SET_QWORD_FIELD32
1633 #define EFX_SET_OWORD_BIT EFX_SET_OWORD_BIT32
1634 #define EFX_CLEAR_OWORD_BIT EFX_CLEAR_OWORD_BIT32
1635 #define EFX_TEST_OWORD_BIT EFX_TEST_OWORD_BIT32
1636 #define EFX_SET_QWORD_BIT EFX_SET_QWORD_BIT32
1637 #define EFX_CLEAR_QWORD_BIT EFX_CLEAR_QWORD_BIT32
1638 #define EFX_TEST_QWORD_BIT EFX_TEST_QWORD_BIT32
1639 #define EFX_OR_OWORD EFX_OR_OWORD32
1640 #define EFX_AND_OWORD EFX_AND_OWORD32
1641 #define EFX_OR_QWORD EFX_OR_QWORD32
1642 #define EFX_AND_QWORD EFX_AND_QWORD32
1649 #endif /* _SYS_EFX_TYPES_H */