2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright (c) 2007-2016 Solarflare Communications Inc.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 * The views and conclusions contained in the software and documentation are
29 * those of the authors and should not be interpreted as representing official
30 * policies, either expressed or implied, of the FreeBSD Project.
32 * Ackowledgement to Fen Systems Ltd.
37 #ifndef _SYS_EFX_TYPES_H
38 #define _SYS_EFX_TYPES_H
49 * Solarflare NICs make extensive use of bitfields up to 128 bits
50 * wide. Since there is no native 128-bit datatype on most systems,
51 * and since 64-bit datatypes are inefficient on 32-bit systems and
52 * vice versa, we wrap accesses in a way that uses the most efficient
55 * The NICs are PCI devices and therefore little-endian. Since most
56 * of the quantities that we deal with are DMAed to/from host memory,
57 * we define our datatypes (efx_oword_t, efx_qword_t and efx_dword_t)
58 * to be little-endian.
60 * In the less common case of using PIO for individual register
61 * writes, we construct the little-endian datatype in host memory and
62 * then use non-swapping register access primitives, rather than
63 * constructing a native-endian datatype and relying on implicit
64 * byte-swapping. (We use a similar strategy for register reads.)
68 * NOTE: Field definitions here and elsewhere are done in terms of a lowest
69 * bit number (LBN) and a width.
72 #define EFX_DUMMY_FIELD_LBN 0
73 #define EFX_DUMMY_FIELD_WIDTH 0
75 #define EFX_BYTE_0_LBN 0
76 #define EFX_BYTE_0_WIDTH 8
78 #define EFX_BYTE_1_LBN 8
79 #define EFX_BYTE_1_WIDTH 8
81 #define EFX_BYTE_2_LBN 16
82 #define EFX_BYTE_2_WIDTH 8
84 #define EFX_BYTE_3_LBN 24
85 #define EFX_BYTE_3_WIDTH 8
87 #define EFX_BYTE_4_LBN 32
88 #define EFX_BYTE_4_WIDTH 8
90 #define EFX_BYTE_5_LBN 40
91 #define EFX_BYTE_5_WIDTH 8
93 #define EFX_BYTE_6_LBN 48
94 #define EFX_BYTE_6_WIDTH 8
96 #define EFX_BYTE_7_LBN 56
97 #define EFX_BYTE_7_WIDTH 8
99 #define EFX_WORD_0_LBN 0
100 #define EFX_WORD_0_WIDTH 16
102 #define EFX_WORD_1_LBN 16
103 #define EFX_WORD_1_WIDTH 16
105 #define EFX_WORD_2_LBN 32
106 #define EFX_WORD_2_WIDTH 16
108 #define EFX_WORD_3_LBN 48
109 #define EFX_WORD_3_WIDTH 16
111 #define EFX_DWORD_0_LBN 0
112 #define EFX_DWORD_0_WIDTH 32
114 #define EFX_DWORD_1_LBN 32
115 #define EFX_DWORD_1_WIDTH 32
117 #define EFX_DWORD_2_LBN 64
118 #define EFX_DWORD_2_WIDTH 32
120 #define EFX_DWORD_3_LBN 96
121 #define EFX_DWORD_3_WIDTH 32
124 * There are intentionally no EFX_QWORD_0 or EFX_QWORD_1 field definitions
125 * here as the implementaion of EFX_QWORD_FIELD and EFX_OWORD_FIELD do not
126 * support field widths larger than 32 bits.
129 /* Specified attribute (i.e. LBN ow WIDTH) of the specified field */
130 #define EFX_VAL(_field, _attribute) \
131 _field ## _ ## _attribute
133 /* Lowest bit number of the specified field */
134 #define EFX_LOW_BIT(_field) \
137 /* Width of the specified field */
138 #define EFX_WIDTH(_field) \
139 EFX_VAL(_field, WIDTH)
141 /* Highest bit number of the specified field */
142 #define EFX_HIGH_BIT(_field) \
143 (EFX_LOW_BIT(_field) + EFX_WIDTH(_field) - 1)
146 * 64-bit mask equal in width to the specified field.
148 * For example, a field with width 5 would have a mask of 0x000000000000001f.
150 #define EFX_MASK64(_field) \
151 ((EFX_WIDTH(_field) == 64) ? ~((uint64_t)0) : \
152 (((((uint64_t)1) << EFX_WIDTH(_field))) - 1))
154 * 32-bit mask equal in width to the specified field.
156 * For example, a field with width 5 would have a mask of 0x0000001f.
158 #define EFX_MASK32(_field) \
159 ((EFX_WIDTH(_field) == 32) ? ~((uint32_t)0) : \
160 (((((uint32_t)1) << EFX_WIDTH(_field))) - 1))
163 * 16-bit mask equal in width to the specified field.
165 * For example, a field with width 5 would have a mask of 0x001f.
167 #define EFX_MASK16(_field) \
168 ((EFX_WIDTH(_field) == 16) ? 0xffffu : \
169 (uint16_t)((1 << EFX_WIDTH(_field)) - 1))
172 * 8-bit mask equal in width to the specified field.
174 * For example, a field with width 5 would have a mask of 0x1f.
176 #define EFX_MASK8(_field) \
177 ((uint8_t)((1 << EFX_WIDTH(_field)) - 1))
182 * A byte (i.e. 8-bit) datatype
184 typedef union efx_byte_u {
189 * A word (i.e. 16-bit) datatype
191 * This datatype is defined to be little-endian.
193 typedef union efx_word_u {
194 efx_byte_t ew_byte[2];
200 * A doubleword (i.e. 32-bit) datatype
202 * This datatype is defined to be little-endian.
204 typedef union efx_dword_u {
205 efx_byte_t ed_byte[4];
206 efx_word_t ed_word[2];
213 * A quadword (i.e. 64-bit) datatype
215 * This datatype is defined to be little-endian.
217 typedef union efx_qword_u {
218 efx_byte_t eq_byte[8];
219 efx_word_t eq_word[4];
220 efx_dword_t eq_dword[2];
230 * An octword (i.e. 128-bit) datatype
232 * This datatype is defined to be little-endian.
234 typedef union efx_oword_u {
235 efx_byte_t eo_byte[16];
236 efx_word_t eo_word[8];
237 efx_dword_t eo_dword[4];
238 efx_qword_t eo_qword[2];
239 #if EFSYS_HAS_SSE2_M128
252 #define __SWAP16(_x) \
253 ((((_x) & 0xff) << 8) | \
254 (((_x) >> 8) & 0xff))
256 #define __SWAP32(_x) \
257 ((__SWAP16((_x) & 0xffff) << 16) | \
258 __SWAP16(((_x) >> 16) & 0xffff))
260 #define __SWAP64(_x) \
261 ((__SWAP32((_x) & 0xffffffff) << 32) | \
262 __SWAP32(((_x) >> 32) & 0xffffffff))
264 #define __NOSWAP16(_x) (_x)
265 #define __NOSWAP32(_x) (_x)
266 #define __NOSWAP64(_x) (_x)
268 #if EFSYS_IS_BIG_ENDIAN
270 #define __CPU_TO_LE_16(_x) ((uint16_t)__SWAP16(_x))
271 #define __LE_TO_CPU_16(_x) ((uint16_t)__SWAP16(_x))
272 #define __CPU_TO_BE_16(_x) ((uint16_t)__NOSWAP16(_x))
273 #define __BE_TO_CPU_16(_x) ((uint16_t)__NOSWAP16(_x))
275 #define __CPU_TO_LE_32(_x) ((uint32_t)__SWAP32(_x))
276 #define __LE_TO_CPU_32(_x) ((uint32_t)__SWAP32(_x))
277 #define __CPU_TO_BE_32(_x) ((uint32_t)__NOSWAP32(_x))
278 #define __BE_TO_CPU_32(_x) ((uint32_t)__NOSWAP32(_x))
280 #define __CPU_TO_LE_64(_x) ((uint64_t)__SWAP64(_x))
281 #define __LE_TO_CPU_64(_x) ((uint64_t)__SWAP64(_x))
282 #define __CPU_TO_BE_64(_x) ((uint64_t)__NOSWAP64(_x))
283 #define __BE_TO_CPU_64(_x) ((uint64_t)__NOSWAP64(_x))
285 #elif EFSYS_IS_LITTLE_ENDIAN
287 #define __CPU_TO_LE_16(_x) ((uint16_t)__NOSWAP16(_x))
288 #define __LE_TO_CPU_16(_x) ((uint16_t)__NOSWAP16(_x))
289 #define __CPU_TO_BE_16(_x) ((uint16_t)__SWAP16(_x))
290 #define __BE_TO_CPU_16(_x) ((uint16_t)__SWAP16(_x))
292 #define __CPU_TO_LE_32(_x) ((uint32_t)__NOSWAP32(_x))
293 #define __LE_TO_CPU_32(_x) ((uint32_t)__NOSWAP32(_x))
294 #define __CPU_TO_BE_32(_x) ((uint32_t)__SWAP32(_x))
295 #define __BE_TO_CPU_32(_x) ((uint32_t)__SWAP32(_x))
297 #define __CPU_TO_LE_64(_x) ((uint64_t)__NOSWAP64(_x))
298 #define __LE_TO_CPU_64(_x) ((uint64_t)__NOSWAP64(_x))
299 #define __CPU_TO_BE_64(_x) ((uint64_t)__SWAP64(_x))
300 #define __BE_TO_CPU_64(_x) ((uint64_t)__SWAP64(_x))
304 #error "Neither of EFSYS_IS_{BIG,LITTLE}_ENDIAN is set"
308 #define __NATIVE_8(_x) (uint8_t)(_x)
310 /* Format string for printing an efx_byte_t */
311 #define EFX_BYTE_FMT "0x%02x"
313 /* Format string for printing an efx_word_t */
314 #define EFX_WORD_FMT "0x%04x"
316 /* Format string for printing an efx_dword_t */
317 #define EFX_DWORD_FMT "0x%08x"
319 /* Format string for printing an efx_qword_t */
320 #define EFX_QWORD_FMT "0x%08x:%08x"
322 /* Format string for printing an efx_oword_t */
323 #define EFX_OWORD_FMT "0x%08x:%08x:%08x:%08x"
325 /* Parameters for printing an efx_byte_t */
326 #define EFX_BYTE_VAL(_byte) \
327 ((unsigned int)__NATIVE_8((_byte).eb_u8[0]))
329 /* Parameters for printing an efx_word_t */
330 #define EFX_WORD_VAL(_word) \
331 ((unsigned int)__LE_TO_CPU_16((_word).ew_u16[0]))
333 /* Parameters for printing an efx_dword_t */
334 #define EFX_DWORD_VAL(_dword) \
335 ((unsigned int)__LE_TO_CPU_32((_dword).ed_u32[0]))
337 /* Parameters for printing an efx_qword_t */
338 #define EFX_QWORD_VAL(_qword) \
339 ((unsigned int)__LE_TO_CPU_32((_qword).eq_u32[1])), \
340 ((unsigned int)__LE_TO_CPU_32((_qword).eq_u32[0]))
342 /* Parameters for printing an efx_oword_t */
343 #define EFX_OWORD_VAL(_oword) \
344 ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[3])), \
345 ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[2])), \
346 ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[1])), \
347 ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[0]))
350 * Stop lint complaining about some shifts.
354 #define FIX_LINT(_x) (_x + fix_lint)
356 #define FIX_LINT(_x) (_x)
360 * Saturation arithmetic subtract with minimum equal to zero.
362 * Use saturating arithmetic to ensure a non-negative result. This
363 * avoids undefined behaviour (and compiler warnings) when used as a
366 #define EFX_SSUB(_val, _sub) \
367 ((_val) > (_sub) ? ((_val) - (_sub)) : 0)
370 * Extract bit field portion [low,high) from the native-endian element
371 * which contains bits [min,max).
373 * For example, suppose "element" represents the high 32 bits of a
374 * 64-bit value, and we wish to extract the bits belonging to the bit
375 * field occupying bits 28-45 of this 64-bit value.
377 * Then EFX_EXTRACT(_element, 32, 63, 28, 45) would give
381 * The result will contain the relevant bits filled in in the range
382 * [0,high-low), with garbage in bits [high-low+1,...).
384 #define EFX_EXTRACT_NATIVE(_element, _min, _max, _low, _high) \
385 ((FIX_LINT(_low > _max) || FIX_LINT(_high < _min)) ? \
388 ((_element) >> EFX_SSUB(_low, _min)) : \
389 ((_element) << EFX_SSUB(_min, _low))))
392 * Extract bit field portion [low,high) from the 64-bit little-endian
393 * element which contains bits [min,max)
395 #define EFX_EXTRACT64(_element, _min, _max, _low, _high) \
396 EFX_EXTRACT_NATIVE(__LE_TO_CPU_64(_element), _min, _max, _low, _high)
399 * Extract bit field portion [low,high) from the 32-bit little-endian
400 * element which contains bits [min,max)
402 #define EFX_EXTRACT32(_element, _min, _max, _low, _high) \
403 EFX_EXTRACT_NATIVE(__LE_TO_CPU_32(_element), _min, _max, _low, _high)
406 * Extract bit field portion [low,high) from the 16-bit little-endian
407 * element which contains bits [min,max)
409 #define EFX_EXTRACT16(_element, _min, _max, _low, _high) \
410 EFX_EXTRACT_NATIVE(__LE_TO_CPU_16(_element), _min, _max, _low, _high)
413 * Extract bit field portion [low,high) from the 8-bit
414 * element which contains bits [min,max)
416 #define EFX_EXTRACT8(_element, _min, _max, _low, _high) \
417 EFX_EXTRACT_NATIVE(__NATIVE_8(_element), _min, _max, _low, _high)
419 #define EFX_EXTRACT_OWORD64(_oword, _low, _high) \
420 (EFX_EXTRACT64((_oword).eo_u64[0], FIX_LINT(0), FIX_LINT(63), \
422 EFX_EXTRACT64((_oword).eo_u64[1], FIX_LINT(64), FIX_LINT(127), \
425 #define EFX_EXTRACT_OWORD32(_oword, _low, _high) \
426 (EFX_EXTRACT32((_oword).eo_u32[0], FIX_LINT(0), FIX_LINT(31), \
428 EFX_EXTRACT32((_oword).eo_u32[1], FIX_LINT(32), FIX_LINT(63), \
430 EFX_EXTRACT32((_oword).eo_u32[2], FIX_LINT(64), FIX_LINT(95), \
432 EFX_EXTRACT32((_oword).eo_u32[3], FIX_LINT(96), FIX_LINT(127), \
435 #define EFX_EXTRACT_QWORD64(_qword, _low, _high) \
436 (EFX_EXTRACT64((_qword).eq_u64[0], FIX_LINT(0), FIX_LINT(63), \
439 #define EFX_EXTRACT_QWORD32(_qword, _low, _high) \
440 (EFX_EXTRACT32((_qword).eq_u32[0], FIX_LINT(0), FIX_LINT(31), \
442 EFX_EXTRACT32((_qword).eq_u32[1], FIX_LINT(32), FIX_LINT(63), \
445 #define EFX_EXTRACT_DWORD(_dword, _low, _high) \
446 (EFX_EXTRACT32((_dword).ed_u32[0], FIX_LINT(0), FIX_LINT(31), \
449 #define EFX_EXTRACT_WORD(_word, _low, _high) \
450 (EFX_EXTRACT16((_word).ew_u16[0], FIX_LINT(0), FIX_LINT(15), \
453 #define EFX_EXTRACT_BYTE(_byte, _low, _high) \
454 (EFX_EXTRACT8((_byte).eb_u8[0], FIX_LINT(0), FIX_LINT(7), \
458 #define EFX_OWORD_FIELD64(_oword, _field) \
459 ((uint32_t)EFX_EXTRACT_OWORD64(_oword, EFX_LOW_BIT(_field), \
460 EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
462 #define EFX_OWORD_FIELD32(_oword, _field) \
463 (EFX_EXTRACT_OWORD32(_oword, EFX_LOW_BIT(_field), \
464 EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
466 #define EFX_QWORD_FIELD64(_qword, _field) \
467 ((uint32_t)EFX_EXTRACT_QWORD64(_qword, EFX_LOW_BIT(_field), \
468 EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
470 #define EFX_QWORD_FIELD32(_qword, _field) \
471 (EFX_EXTRACT_QWORD32(_qword, EFX_LOW_BIT(_field), \
472 EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
474 #define EFX_DWORD_FIELD(_dword, _field) \
475 (EFX_EXTRACT_DWORD(_dword, EFX_LOW_BIT(_field), \
476 EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
478 #define EFX_WORD_FIELD(_word, _field) \
479 (EFX_EXTRACT_WORD(_word, EFX_LOW_BIT(_field), \
480 EFX_HIGH_BIT(_field)) & EFX_MASK16(_field))
482 #define EFX_BYTE_FIELD(_byte, _field) \
483 (EFX_EXTRACT_BYTE(_byte, EFX_LOW_BIT(_field), \
484 EFX_HIGH_BIT(_field)) & EFX_MASK8(_field))
487 #define EFX_OWORD_IS_EQUAL64(_oword_a, _oword_b) \
488 ((_oword_a).eo_u64[0] == (_oword_b).eo_u64[0] && \
489 (_oword_a).eo_u64[1] == (_oword_b).eo_u64[1])
491 #define EFX_OWORD_IS_EQUAL32(_oword_a, _oword_b) \
492 ((_oword_a).eo_u32[0] == (_oword_b).eo_u32[0] && \
493 (_oword_a).eo_u32[1] == (_oword_b).eo_u32[1] && \
494 (_oword_a).eo_u32[2] == (_oword_b).eo_u32[2] && \
495 (_oword_a).eo_u32[3] == (_oword_b).eo_u32[3])
497 #define EFX_QWORD_IS_EQUAL64(_qword_a, _qword_b) \
498 ((_qword_a).eq_u64[0] == (_qword_b).eq_u64[0])
500 #define EFX_QWORD_IS_EQUAL32(_qword_a, _qword_b) \
501 ((_qword_a).eq_u32[0] == (_qword_b).eq_u32[0] && \
502 (_qword_a).eq_u32[1] == (_qword_b).eq_u32[1])
504 #define EFX_DWORD_IS_EQUAL(_dword_a, _dword_b) \
505 ((_dword_a).ed_u32[0] == (_dword_b).ed_u32[0])
507 #define EFX_WORD_IS_EQUAL(_word_a, _word_b) \
508 ((_word_a).ew_u16[0] == (_word_b).ew_u16[0])
510 #define EFX_BYTE_IS_EQUAL(_byte_a, _byte_b) \
511 ((_byte_a).eb_u8[0] == (_byte_b).eb_u8[0])
514 #define EFX_OWORD_IS_ZERO64(_oword) \
515 (((_oword).eo_u64[0] | \
516 (_oword).eo_u64[1]) == 0)
518 #define EFX_OWORD_IS_ZERO32(_oword) \
519 (((_oword).eo_u32[0] | \
520 (_oword).eo_u32[1] | \
521 (_oword).eo_u32[2] | \
522 (_oword).eo_u32[3]) == 0)
524 #define EFX_QWORD_IS_ZERO64(_qword) \
525 (((_qword).eq_u64[0]) == 0)
527 #define EFX_QWORD_IS_ZERO32(_qword) \
528 (((_qword).eq_u32[0] | \
529 (_qword).eq_u32[1]) == 0)
531 #define EFX_DWORD_IS_ZERO(_dword) \
532 (((_dword).ed_u32[0]) == 0)
534 #define EFX_WORD_IS_ZERO(_word) \
535 (((_word).ew_u16[0]) == 0)
537 #define EFX_BYTE_IS_ZERO(_byte) \
538 (((_byte).eb_u8[0]) == 0)
541 #define EFX_OWORD_IS_SET64(_oword) \
542 (((_oword).eo_u64[0] & \
543 (_oword).eo_u64[1]) == ~((uint64_t)0))
545 #define EFX_OWORD_IS_SET32(_oword) \
546 (((_oword).eo_u32[0] & \
547 (_oword).eo_u32[1] & \
548 (_oword).eo_u32[2] & \
549 (_oword).eo_u32[3]) == ~((uint32_t)0))
551 #define EFX_QWORD_IS_SET64(_qword) \
552 (((_qword).eq_u64[0]) == ~((uint64_t)0))
554 #define EFX_QWORD_IS_SET32(_qword) \
555 (((_qword).eq_u32[0] & \
556 (_qword).eq_u32[1]) == ~((uint32_t)0))
558 #define EFX_DWORD_IS_SET(_dword) \
559 ((_dword).ed_u32[0] == ~((uint32_t)0))
561 #define EFX_WORD_IS_SET(_word) \
562 ((_word).ew_u16[0] == ~((uint16_t)0))
564 #define EFX_BYTE_IS_SET(_byte) \
565 ((_byte).eb_u8[0] == ~((uint8_t)0))
568 * Construct bit field portion
570 * Creates the portion of the bit field [low,high) that lies within
571 * the range [min,max).
574 #define EFX_INSERT_NATIVE64(_min, _max, _low, _high, _value) \
575 (((_low > _max) || (_high < _min)) ? \
578 (((uint64_t)(_value)) << EFX_SSUB(_low, _min)) :\
579 (((uint64_t)(_value)) >> EFX_SSUB(_min, _low))))
581 #define EFX_INSERT_NATIVE32(_min, _max, _low, _high, _value) \
582 (((_low > _max) || (_high < _min)) ? \
585 (((uint32_t)(_value)) << EFX_SSUB(_low, _min)) :\
586 (((uint32_t)(_value)) >> EFX_SSUB(_min, _low))))
588 #define EFX_INSERT_NATIVE16(_min, _max, _low, _high, _value) \
589 (((_low > _max) || (_high < _min)) ? \
591 (uint16_t)((_low > _min) ? \
592 ((_value) << EFX_SSUB(_low, _min)) : \
593 ((_value) >> EFX_SSUB(_min, _low))))
595 #define EFX_INSERT_NATIVE8(_min, _max, _low, _high, _value) \
596 (((_low > _max) || (_high < _min)) ? \
598 (uint8_t)((_low > _min) ? \
599 ((_value) << EFX_SSUB(_low, _min)) : \
600 ((_value) >> EFX_SSUB(_min, _low))))
603 * Construct bit field portion
605 * Creates the portion of the named bit field that lies within the
608 #define EFX_INSERT_FIELD_NATIVE64(_min, _max, _field, _value) \
609 EFX_INSERT_NATIVE64(_min, _max, EFX_LOW_BIT(_field), \
610 EFX_HIGH_BIT(_field), _value)
612 #define EFX_INSERT_FIELD_NATIVE32(_min, _max, _field, _value) \
613 EFX_INSERT_NATIVE32(_min, _max, EFX_LOW_BIT(_field), \
614 EFX_HIGH_BIT(_field), _value)
616 #define EFX_INSERT_FIELD_NATIVE16(_min, _max, _field, _value) \
617 EFX_INSERT_NATIVE16(_min, _max, EFX_LOW_BIT(_field), \
618 EFX_HIGH_BIT(_field), _value)
620 #define EFX_INSERT_FIELD_NATIVE8(_min, _max, _field, _value) \
621 EFX_INSERT_NATIVE8(_min, _max, EFX_LOW_BIT(_field), \
622 EFX_HIGH_BIT(_field), _value)
625 * Construct bit field
627 * Creates the portion of the named bit fields that lie within the
630 #define EFX_INSERT_FIELDS64(_min, _max, \
631 _field1, _value1, _field2, _value2, _field3, _value3, \
632 _field4, _value4, _field5, _value5, _field6, _value6, \
633 _field7, _value7, _field8, _value8, _field9, _value9, \
634 _field10, _value10) \
636 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field1, _value1) | \
637 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field2, _value2) | \
638 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field3, _value3) | \
639 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field4, _value4) | \
640 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field5, _value5) | \
641 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field6, _value6) | \
642 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field7, _value7) | \
643 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field8, _value8) | \
644 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field9, _value9) | \
645 EFX_INSERT_FIELD_NATIVE64(_min, _max, _field10, _value10))
647 #define EFX_INSERT_FIELDS32(_min, _max, \
648 _field1, _value1, _field2, _value2, _field3, _value3, \
649 _field4, _value4, _field5, _value5, _field6, _value6, \
650 _field7, _value7, _field8, _value8, _field9, _value9, \
651 _field10, _value10) \
653 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field1, _value1) | \
654 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field2, _value2) | \
655 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field3, _value3) | \
656 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field4, _value4) | \
657 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field5, _value5) | \
658 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field6, _value6) | \
659 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field7, _value7) | \
660 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field8, _value8) | \
661 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field9, _value9) | \
662 EFX_INSERT_FIELD_NATIVE32(_min, _max, _field10, _value10))
664 #define EFX_INSERT_FIELDS16(_min, _max, \
665 _field1, _value1, _field2, _value2, _field3, _value3, \
666 _field4, _value4, _field5, _value5, _field6, _value6, \
667 _field7, _value7, _field8, _value8, _field9, _value9, \
668 _field10, _value10) \
670 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field1, _value1) | \
671 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field2, _value2) | \
672 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field3, _value3) | \
673 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field4, _value4) | \
674 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field5, _value5) | \
675 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field6, _value6) | \
676 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field7, _value7) | \
677 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field8, _value8) | \
678 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field9, _value9) | \
679 EFX_INSERT_FIELD_NATIVE16(_min, _max, _field10, _value10))
681 #define EFX_INSERT_FIELDS8(_min, _max, \
682 _field1, _value1, _field2, _value2, _field3, _value3, \
683 _field4, _value4, _field5, _value5, _field6, _value6, \
684 _field7, _value7, _field8, _value8, _field9, _value9, \
685 _field10, _value10) \
687 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field1, _value1) | \
688 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field2, _value2) | \
689 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field3, _value3) | \
690 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field4, _value4) | \
691 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field5, _value5) | \
692 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field6, _value6) | \
693 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field7, _value7) | \
694 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field8, _value8) | \
695 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field9, _value9) | \
696 EFX_INSERT_FIELD_NATIVE8(_min, _max, _field10, _value10))
698 #define EFX_POPULATE_OWORD64(_oword, \
699 _field1, _value1, _field2, _value2, _field3, _value3, \
700 _field4, _value4, _field5, _value5, _field6, _value6, \
701 _field7, _value7, _field8, _value8, _field9, _value9, \
702 _field10, _value10) \
704 _NOTE(CONSTANTCONDITION) \
705 (_oword).eo_u64[0] = EFX_INSERT_FIELDS64(0, 63, \
706 _field1, _value1, _field2, _value2, \
707 _field3, _value3, _field4, _value4, \
708 _field5, _value5, _field6, _value6, \
709 _field7, _value7, _field8, _value8, \
710 _field9, _value9, _field10, _value10); \
711 _NOTE(CONSTANTCONDITION) \
712 (_oword).eo_u64[1] = EFX_INSERT_FIELDS64(64, 127, \
713 _field1, _value1, _field2, _value2, \
714 _field3, _value3, _field4, _value4, \
715 _field5, _value5, _field6, _value6, \
716 _field7, _value7, _field8, _value8, \
717 _field9, _value9, _field10, _value10); \
718 _NOTE(CONSTANTCONDITION) \
721 #define EFX_POPULATE_OWORD32(_oword, \
722 _field1, _value1, _field2, _value2, _field3, _value3, \
723 _field4, _value4, _field5, _value5, _field6, _value6, \
724 _field7, _value7, _field8, _value8, _field9, _value9, \
725 _field10, _value10) \
727 _NOTE(CONSTANTCONDITION) \
728 (_oword).eo_u32[0] = EFX_INSERT_FIELDS32(0, 31, \
729 _field1, _value1, _field2, _value2, \
730 _field3, _value3, _field4, _value4, \
731 _field5, _value5, _field6, _value6, \
732 _field7, _value7, _field8, _value8, \
733 _field9, _value9, _field10, _value10); \
734 _NOTE(CONSTANTCONDITION) \
735 (_oword).eo_u32[1] = EFX_INSERT_FIELDS32(32, 63, \
736 _field1, _value1, _field2, _value2, \
737 _field3, _value3, _field4, _value4, \
738 _field5, _value5, _field6, _value6, \
739 _field7, _value7, _field8, _value8, \
740 _field9, _value9, _field10, _value10); \
741 _NOTE(CONSTANTCONDITION) \
742 (_oword).eo_u32[2] = EFX_INSERT_FIELDS32(64, 95, \
743 _field1, _value1, _field2, _value2, \
744 _field3, _value3, _field4, _value4, \
745 _field5, _value5, _field6, _value6, \
746 _field7, _value7, _field8, _value8, \
747 _field9, _value9, _field10, _value10); \
748 _NOTE(CONSTANTCONDITION) \
749 (_oword).eo_u32[3] = EFX_INSERT_FIELDS32(96, 127, \
750 _field1, _value1, _field2, _value2, \
751 _field3, _value3, _field4, _value4, \
752 _field5, _value5, _field6, _value6, \
753 _field7, _value7, _field8, _value8, \
754 _field9, _value9, _field10, _value10); \
755 _NOTE(CONSTANTCONDITION) \
758 #define EFX_POPULATE_QWORD64(_qword, \
759 _field1, _value1, _field2, _value2, _field3, _value3, \
760 _field4, _value4, _field5, _value5, _field6, _value6, \
761 _field7, _value7, _field8, _value8, _field9, _value9, \
762 _field10, _value10) \
764 _NOTE(CONSTANTCONDITION) \
765 (_qword).eq_u64[0] = EFX_INSERT_FIELDS64(0, 63, \
766 _field1, _value1, _field2, _value2, \
767 _field3, _value3, _field4, _value4, \
768 _field5, _value5, _field6, _value6, \
769 _field7, _value7, _field8, _value8, \
770 _field9, _value9, _field10, _value10); \
771 _NOTE(CONSTANTCONDITION) \
774 #define EFX_POPULATE_QWORD32(_qword, \
775 _field1, _value1, _field2, _value2, _field3, _value3, \
776 _field4, _value4, _field5, _value5, _field6, _value6, \
777 _field7, _value7, _field8, _value8, _field9, _value9, \
778 _field10, _value10) \
780 _NOTE(CONSTANTCONDITION) \
781 (_qword).eq_u32[0] = EFX_INSERT_FIELDS32(0, 31, \
782 _field1, _value1, _field2, _value2, \
783 _field3, _value3, _field4, _value4, \
784 _field5, _value5, _field6, _value6, \
785 _field7, _value7, _field8, _value8, \
786 _field9, _value9, _field10, _value10); \
787 _NOTE(CONSTANTCONDITION) \
788 (_qword).eq_u32[1] = EFX_INSERT_FIELDS32(32, 63, \
789 _field1, _value1, _field2, _value2, \
790 _field3, _value3, _field4, _value4, \
791 _field5, _value5, _field6, _value6, \
792 _field7, _value7, _field8, _value8, \
793 _field9, _value9, _field10, _value10); \
794 _NOTE(CONSTANTCONDITION) \
797 #define EFX_POPULATE_DWORD(_dword, \
798 _field1, _value1, _field2, _value2, _field3, _value3, \
799 _field4, _value4, _field5, _value5, _field6, _value6, \
800 _field7, _value7, _field8, _value8, _field9, _value9, \
801 _field10, _value10) \
803 _NOTE(CONSTANTCONDITION) \
804 (_dword).ed_u32[0] = EFX_INSERT_FIELDS32(0, 31, \
805 _field1, _value1, _field2, _value2, \
806 _field3, _value3, _field4, _value4, \
807 _field5, _value5, _field6, _value6, \
808 _field7, _value7, _field8, _value8, \
809 _field9, _value9, _field10, _value10); \
810 _NOTE(CONSTANTCONDITION) \
813 #define EFX_POPULATE_WORD(_word, \
814 _field1, _value1, _field2, _value2, _field3, _value3, \
815 _field4, _value4, _field5, _value5, _field6, _value6, \
816 _field7, _value7, _field8, _value8, _field9, _value9, \
817 _field10, _value10) \
819 _NOTE(CONSTANTCONDITION) \
820 (_word).ew_u16[0] = EFX_INSERT_FIELDS16(0, 15, \
821 _field1, _value1, _field2, _value2, \
822 _field3, _value3, _field4, _value4, \
823 _field5, _value5, _field6, _value6, \
824 _field7, _value7, _field8, _value8, \
825 _field9, _value9, _field10, _value10); \
826 _NOTE(CONSTANTCONDITION) \
829 #define EFX_POPULATE_BYTE(_byte, \
830 _field1, _value1, _field2, _value2, _field3, _value3, \
831 _field4, _value4, _field5, _value5, _field6, _value6, \
832 _field7, _value7, _field8, _value8, _field9, _value9, \
833 _field10, _value10) \
835 _NOTE(CONSTANTCONDITION) \
836 (_byte).eb_u8[0] = EFX_INSERT_FIELDS8(0, 7, \
837 _field1, _value1, _field2, _value2, \
838 _field3, _value3, _field4, _value4, \
839 _field5, _value5, _field6, _value6, \
840 _field7, _value7, _field8, _value8, \
841 _field9, _value9, _field10, _value10); \
842 _NOTE(CONSTANTCONDITION) \
845 /* Populate an octword field with various numbers of arguments */
846 #define EFX_POPULATE_OWORD_10 EFX_POPULATE_OWORD
848 #define EFX_POPULATE_OWORD_9(_oword, \
849 _field1, _value1, _field2, _value2, _field3, _value3, \
850 _field4, _value4, _field5, _value5, _field6, _value6, \
851 _field7, _value7, _field8, _value8, _field9, _value9) \
852 EFX_POPULATE_OWORD_10(_oword, EFX_DUMMY_FIELD, 0, \
853 _field1, _value1, _field2, _value2, _field3, _value3, \
854 _field4, _value4, _field5, _value5, _field6, _value6, \
855 _field7, _value7, _field8, _value8, _field9, _value9)
857 #define EFX_POPULATE_OWORD_8(_oword, \
858 _field1, _value1, _field2, _value2, _field3, _value3, \
859 _field4, _value4, _field5, _value5, _field6, _value6, \
860 _field7, _value7, _field8, _value8) \
861 EFX_POPULATE_OWORD_9(_oword, EFX_DUMMY_FIELD, 0, \
862 _field1, _value1, _field2, _value2, _field3, _value3, \
863 _field4, _value4, _field5, _value5, _field6, _value6, \
864 _field7, _value7, _field8, _value8)
866 #define EFX_POPULATE_OWORD_7(_oword, \
867 _field1, _value1, _field2, _value2, _field3, _value3, \
868 _field4, _value4, _field5, _value5, _field6, _value6, \
870 EFX_POPULATE_OWORD_8(_oword, EFX_DUMMY_FIELD, 0, \
871 _field1, _value1, _field2, _value2, _field3, _value3, \
872 _field4, _value4, _field5, _value5, _field6, _value6, \
875 #define EFX_POPULATE_OWORD_6(_oword, \
876 _field1, _value1, _field2, _value2, _field3, _value3, \
877 _field4, _value4, _field5, _value5, _field6, _value6) \
878 EFX_POPULATE_OWORD_7(_oword, EFX_DUMMY_FIELD, 0, \
879 _field1, _value1, _field2, _value2, _field3, _value3, \
880 _field4, _value4, _field5, _value5, _field6, _value6)
882 #define EFX_POPULATE_OWORD_5(_oword, \
883 _field1, _value1, _field2, _value2, _field3, _value3, \
884 _field4, _value4, _field5, _value5) \
885 EFX_POPULATE_OWORD_6(_oword, EFX_DUMMY_FIELD, 0, \
886 _field1, _value1, _field2, _value2, _field3, _value3, \
887 _field4, _value4, _field5, _value5)
889 #define EFX_POPULATE_OWORD_4(_oword, \
890 _field1, _value1, _field2, _value2, _field3, _value3, \
892 EFX_POPULATE_OWORD_5(_oword, EFX_DUMMY_FIELD, 0, \
893 _field1, _value1, _field2, _value2, _field3, _value3, \
896 #define EFX_POPULATE_OWORD_3(_oword, \
897 _field1, _value1, _field2, _value2, _field3, _value3) \
898 EFX_POPULATE_OWORD_4(_oword, EFX_DUMMY_FIELD, 0, \
899 _field1, _value1, _field2, _value2, _field3, _value3)
901 #define EFX_POPULATE_OWORD_2(_oword, \
902 _field1, _value1, _field2, _value2) \
903 EFX_POPULATE_OWORD_3(_oword, EFX_DUMMY_FIELD, 0, \
904 _field1, _value1, _field2, _value2)
906 #define EFX_POPULATE_OWORD_1(_oword, \
908 EFX_POPULATE_OWORD_2(_oword, EFX_DUMMY_FIELD, 0, \
911 #define EFX_ZERO_OWORD(_oword) \
912 EFX_POPULATE_OWORD_1(_oword, EFX_DUMMY_FIELD, 0)
914 #define EFX_SET_OWORD(_oword) \
915 EFX_POPULATE_OWORD_4(_oword, \
916 EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff, \
917 EFX_DWORD_2, 0xffffffff, EFX_DWORD_3, 0xffffffff)
919 /* Populate a quadword field with various numbers of arguments */
920 #define EFX_POPULATE_QWORD_10 EFX_POPULATE_QWORD
922 #define EFX_POPULATE_QWORD_9(_qword, \
923 _field1, _value1, _field2, _value2, _field3, _value3, \
924 _field4, _value4, _field5, _value5, _field6, _value6, \
925 _field7, _value7, _field8, _value8, _field9, _value9) \
926 EFX_POPULATE_QWORD_10(_qword, EFX_DUMMY_FIELD, 0, \
927 _field1, _value1, _field2, _value2, _field3, _value3, \
928 _field4, _value4, _field5, _value5, _field6, _value6, \
929 _field7, _value7, _field8, _value8, _field9, _value9)
931 #define EFX_POPULATE_QWORD_8(_qword, \
932 _field1, _value1, _field2, _value2, _field3, _value3, \
933 _field4, _value4, _field5, _value5, _field6, _value6, \
934 _field7, _value7, _field8, _value8) \
935 EFX_POPULATE_QWORD_9(_qword, EFX_DUMMY_FIELD, 0, \
936 _field1, _value1, _field2, _value2, _field3, _value3, \
937 _field4, _value4, _field5, _value5, _field6, _value6, \
938 _field7, _value7, _field8, _value8)
940 #define EFX_POPULATE_QWORD_7(_qword, \
941 _field1, _value1, _field2, _value2, _field3, _value3, \
942 _field4, _value4, _field5, _value5, _field6, _value6, \
944 EFX_POPULATE_QWORD_8(_qword, EFX_DUMMY_FIELD, 0, \
945 _field1, _value1, _field2, _value2, _field3, _value3, \
946 _field4, _value4, _field5, _value5, _field6, _value6, \
949 #define EFX_POPULATE_QWORD_6(_qword, \
950 _field1, _value1, _field2, _value2, _field3, _value3, \
951 _field4, _value4, _field5, _value5, _field6, _value6) \
952 EFX_POPULATE_QWORD_7(_qword, EFX_DUMMY_FIELD, 0, \
953 _field1, _value1, _field2, _value2, _field3, _value3, \
954 _field4, _value4, _field5, _value5, _field6, _value6)
956 #define EFX_POPULATE_QWORD_5(_qword, \
957 _field1, _value1, _field2, _value2, _field3, _value3, \
958 _field4, _value4, _field5, _value5) \
959 EFX_POPULATE_QWORD_6(_qword, EFX_DUMMY_FIELD, 0, \
960 _field1, _value1, _field2, _value2, _field3, _value3, \
961 _field4, _value4, _field5, _value5)
963 #define EFX_POPULATE_QWORD_4(_qword, \
964 _field1, _value1, _field2, _value2, _field3, _value3, \
966 EFX_POPULATE_QWORD_5(_qword, EFX_DUMMY_FIELD, 0, \
967 _field1, _value1, _field2, _value2, _field3, _value3, \
970 #define EFX_POPULATE_QWORD_3(_qword, \
971 _field1, _value1, _field2, _value2, _field3, _value3) \
972 EFX_POPULATE_QWORD_4(_qword, EFX_DUMMY_FIELD, 0, \
973 _field1, _value1, _field2, _value2, _field3, _value3)
975 #define EFX_POPULATE_QWORD_2(_qword, \
976 _field1, _value1, _field2, _value2) \
977 EFX_POPULATE_QWORD_3(_qword, EFX_DUMMY_FIELD, 0, \
978 _field1, _value1, _field2, _value2)
980 #define EFX_POPULATE_QWORD_1(_qword, \
982 EFX_POPULATE_QWORD_2(_qword, EFX_DUMMY_FIELD, 0, \
985 #define EFX_ZERO_QWORD(_qword) \
986 EFX_POPULATE_QWORD_1(_qword, EFX_DUMMY_FIELD, 0)
988 #define EFX_SET_QWORD(_qword) \
989 EFX_POPULATE_QWORD_2(_qword, \
990 EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff)
992 /* Populate a dword field with various numbers of arguments */
993 #define EFX_POPULATE_DWORD_10 EFX_POPULATE_DWORD
995 #define EFX_POPULATE_DWORD_9(_dword, \
996 _field1, _value1, _field2, _value2, _field3, _value3, \
997 _field4, _value4, _field5, _value5, _field6, _value6, \
998 _field7, _value7, _field8, _value8, _field9, _value9) \
999 EFX_POPULATE_DWORD_10(_dword, EFX_DUMMY_FIELD, 0, \
1000 _field1, _value1, _field2, _value2, _field3, _value3, \
1001 _field4, _value4, _field5, _value5, _field6, _value6, \
1002 _field7, _value7, _field8, _value8, _field9, _value9)
1004 #define EFX_POPULATE_DWORD_8(_dword, \
1005 _field1, _value1, _field2, _value2, _field3, _value3, \
1006 _field4, _value4, _field5, _value5, _field6, _value6, \
1007 _field7, _value7, _field8, _value8) \
1008 EFX_POPULATE_DWORD_9(_dword, EFX_DUMMY_FIELD, 0, \
1009 _field1, _value1, _field2, _value2, _field3, _value3, \
1010 _field4, _value4, _field5, _value5, _field6, _value6, \
1011 _field7, _value7, _field8, _value8)
1013 #define EFX_POPULATE_DWORD_7(_dword, \
1014 _field1, _value1, _field2, _value2, _field3, _value3, \
1015 _field4, _value4, _field5, _value5, _field6, _value6, \
1017 EFX_POPULATE_DWORD_8(_dword, EFX_DUMMY_FIELD, 0, \
1018 _field1, _value1, _field2, _value2, _field3, _value3, \
1019 _field4, _value4, _field5, _value5, _field6, _value6, \
1022 #define EFX_POPULATE_DWORD_6(_dword, \
1023 _field1, _value1, _field2, _value2, _field3, _value3, \
1024 _field4, _value4, _field5, _value5, _field6, _value6) \
1025 EFX_POPULATE_DWORD_7(_dword, EFX_DUMMY_FIELD, 0, \
1026 _field1, _value1, _field2, _value2, _field3, _value3, \
1027 _field4, _value4, _field5, _value5, _field6, _value6)
1029 #define EFX_POPULATE_DWORD_5(_dword, \
1030 _field1, _value1, _field2, _value2, _field3, _value3, \
1031 _field4, _value4, _field5, _value5) \
1032 EFX_POPULATE_DWORD_6(_dword, EFX_DUMMY_FIELD, 0, \
1033 _field1, _value1, _field2, _value2, _field3, _value3, \
1034 _field4, _value4, _field5, _value5)
1036 #define EFX_POPULATE_DWORD_4(_dword, \
1037 _field1, _value1, _field2, _value2, _field3, _value3, \
1039 EFX_POPULATE_DWORD_5(_dword, EFX_DUMMY_FIELD, 0, \
1040 _field1, _value1, _field2, _value2, _field3, _value3, \
1043 #define EFX_POPULATE_DWORD_3(_dword, \
1044 _field1, _value1, _field2, _value2, _field3, _value3) \
1045 EFX_POPULATE_DWORD_4(_dword, EFX_DUMMY_FIELD, 0, \
1046 _field1, _value1, _field2, _value2, _field3, _value3)
1048 #define EFX_POPULATE_DWORD_2(_dword, \
1049 _field1, _value1, _field2, _value2) \
1050 EFX_POPULATE_DWORD_3(_dword, EFX_DUMMY_FIELD, 0, \
1051 _field1, _value1, _field2, _value2)
1053 #define EFX_POPULATE_DWORD_1(_dword, \
1055 EFX_POPULATE_DWORD_2(_dword, EFX_DUMMY_FIELD, 0, \
1058 #define EFX_ZERO_DWORD(_dword) \
1059 EFX_POPULATE_DWORD_1(_dword, EFX_DUMMY_FIELD, 0)
1061 #define EFX_SET_DWORD(_dword) \
1062 EFX_POPULATE_DWORD_1(_dword, \
1063 EFX_DWORD_0, 0xffffffff)
1065 /* Populate a word field with various numbers of arguments */
1066 #define EFX_POPULATE_WORD_10 EFX_POPULATE_WORD
1068 #define EFX_POPULATE_WORD_9(_word, \
1069 _field1, _value1, _field2, _value2, _field3, _value3, \
1070 _field4, _value4, _field5, _value5, _field6, _value6, \
1071 _field7, _value7, _field8, _value8, _field9, _value9) \
1072 EFX_POPULATE_WORD_10(_word, EFX_DUMMY_FIELD, 0, \
1073 _field1, _value1, _field2, _value2, _field3, _value3, \
1074 _field4, _value4, _field5, _value5, _field6, _value6, \
1075 _field7, _value7, _field8, _value8, _field9, _value9)
1077 #define EFX_POPULATE_WORD_8(_word, \
1078 _field1, _value1, _field2, _value2, _field3, _value3, \
1079 _field4, _value4, _field5, _value5, _field6, _value6, \
1080 _field7, _value7, _field8, _value8) \
1081 EFX_POPULATE_WORD_9(_word, EFX_DUMMY_FIELD, 0, \
1082 _field1, _value1, _field2, _value2, _field3, _value3, \
1083 _field4, _value4, _field5, _value5, _field6, _value6, \
1084 _field7, _value7, _field8, _value8)
1086 #define EFX_POPULATE_WORD_7(_word, \
1087 _field1, _value1, _field2, _value2, _field3, _value3, \
1088 _field4, _value4, _field5, _value5, _field6, _value6, \
1090 EFX_POPULATE_WORD_8(_word, EFX_DUMMY_FIELD, 0, \
1091 _field1, _value1, _field2, _value2, _field3, _value3, \
1092 _field4, _value4, _field5, _value5, _field6, _value6, \
1095 #define EFX_POPULATE_WORD_6(_word, \
1096 _field1, _value1, _field2, _value2, _field3, _value3, \
1097 _field4, _value4, _field5, _value5, _field6, _value6) \
1098 EFX_POPULATE_WORD_7(_word, EFX_DUMMY_FIELD, 0, \
1099 _field1, _value1, _field2, _value2, _field3, _value3, \
1100 _field4, _value4, _field5, _value5, _field6, _value6)
1102 #define EFX_POPULATE_WORD_5(_word, \
1103 _field1, _value1, _field2, _value2, _field3, _value3, \
1104 _field4, _value4, _field5, _value5) \
1105 EFX_POPULATE_WORD_6(_word, EFX_DUMMY_FIELD, 0, \
1106 _field1, _value1, _field2, _value2, _field3, _value3, \
1107 _field4, _value4, _field5, _value5)
1109 #define EFX_POPULATE_WORD_4(_word, \
1110 _field1, _value1, _field2, _value2, _field3, _value3, \
1112 EFX_POPULATE_WORD_5(_word, EFX_DUMMY_FIELD, 0, \
1113 _field1, _value1, _field2, _value2, _field3, _value3, \
1116 #define EFX_POPULATE_WORD_3(_word, \
1117 _field1, _value1, _field2, _value2, _field3, _value3) \
1118 EFX_POPULATE_WORD_4(_word, EFX_DUMMY_FIELD, 0, \
1119 _field1, _value1, _field2, _value2, _field3, _value3)
1121 #define EFX_POPULATE_WORD_2(_word, \
1122 _field1, _value1, _field2, _value2) \
1123 EFX_POPULATE_WORD_3(_word, EFX_DUMMY_FIELD, 0, \
1124 _field1, _value1, _field2, _value2)
1126 #define EFX_POPULATE_WORD_1(_word, \
1128 EFX_POPULATE_WORD_2(_word, EFX_DUMMY_FIELD, 0, \
1131 #define EFX_ZERO_WORD(_word) \
1132 EFX_POPULATE_WORD_1(_word, EFX_DUMMY_FIELD, 0)
1134 #define EFX_SET_WORD(_word) \
1135 EFX_POPULATE_WORD_1(_word, \
1138 /* Populate a byte field with various numbers of arguments */
1139 #define EFX_POPULATE_BYTE_10 EFX_POPULATE_BYTE
1141 #define EFX_POPULATE_BYTE_9(_byte, \
1142 _field1, _value1, _field2, _value2, _field3, _value3, \
1143 _field4, _value4, _field5, _value5, _field6, _value6, \
1144 _field7, _value7, _field8, _value8, _field9, _value9) \
1145 EFX_POPULATE_BYTE_10(_byte, EFX_DUMMY_FIELD, 0, \
1146 _field1, _value1, _field2, _value2, _field3, _value3, \
1147 _field4, _value4, _field5, _value5, _field6, _value6, \
1148 _field7, _value7, _field8, _value8, _field9, _value9)
1150 #define EFX_POPULATE_BYTE_8(_byte, \
1151 _field1, _value1, _field2, _value2, _field3, _value3, \
1152 _field4, _value4, _field5, _value5, _field6, _value6, \
1153 _field7, _value7, _field8, _value8) \
1154 EFX_POPULATE_BYTE_9(_byte, EFX_DUMMY_FIELD, 0, \
1155 _field1, _value1, _field2, _value2, _field3, _value3, \
1156 _field4, _value4, _field5, _value5, _field6, _value6, \
1157 _field7, _value7, _field8, _value8)
1159 #define EFX_POPULATE_BYTE_7(_byte, \
1160 _field1, _value1, _field2, _value2, _field3, _value3, \
1161 _field4, _value4, _field5, _value5, _field6, _value6, \
1163 EFX_POPULATE_BYTE_8(_byte, EFX_DUMMY_FIELD, 0, \
1164 _field1, _value1, _field2, _value2, _field3, _value3, \
1165 _field4, _value4, _field5, _value5, _field6, _value6, \
1168 #define EFX_POPULATE_BYTE_6(_byte, \
1169 _field1, _value1, _field2, _value2, _field3, _value3, \
1170 _field4, _value4, _field5, _value5, _field6, _value6) \
1171 EFX_POPULATE_BYTE_7(_byte, EFX_DUMMY_FIELD, 0, \
1172 _field1, _value1, _field2, _value2, _field3, _value3, \
1173 _field4, _value4, _field5, _value5, _field6, _value6)
1175 #define EFX_POPULATE_BYTE_5(_byte, \
1176 _field1, _value1, _field2, _value2, _field3, _value3, \
1177 _field4, _value4, _field5, _value5) \
1178 EFX_POPULATE_BYTE_6(_byte, EFX_DUMMY_FIELD, 0, \
1179 _field1, _value1, _field2, _value2, _field3, _value3, \
1180 _field4, _value4, _field5, _value5)
1182 #define EFX_POPULATE_BYTE_4(_byte, \
1183 _field1, _value1, _field2, _value2, _field3, _value3, \
1185 EFX_POPULATE_BYTE_5(_byte, EFX_DUMMY_FIELD, 0, \
1186 _field1, _value1, _field2, _value2, _field3, _value3, \
1189 #define EFX_POPULATE_BYTE_3(_byte, \
1190 _field1, _value1, _field2, _value2, _field3, _value3) \
1191 EFX_POPULATE_BYTE_4(_byte, EFX_DUMMY_FIELD, 0, \
1192 _field1, _value1, _field2, _value2, _field3, _value3)
1194 #define EFX_POPULATE_BYTE_2(_byte, \
1195 _field1, _value1, _field2, _value2) \
1196 EFX_POPULATE_BYTE_3(_byte, EFX_DUMMY_FIELD, 0, \
1197 _field1, _value1, _field2, _value2)
1199 #define EFX_POPULATE_BYTE_1(_byte, \
1201 EFX_POPULATE_BYTE_2(_byte, EFX_DUMMY_FIELD, 0, \
1204 #define EFX_ZERO_BYTE(_byte) \
1205 EFX_POPULATE_BYTE_1(_byte, EFX_DUMMY_FIELD, 0)
1207 #define EFX_SET_BYTE(_byte) \
1208 EFX_POPULATE_BYTE_1(_byte, \
1212 * Modify a named field within an already-populated structure. Used
1213 * for read-modify-write operations.
1216 #define EFX_INSERT_FIELD64(_min, _max, _field, _value) \
1217 __CPU_TO_LE_64(EFX_INSERT_FIELD_NATIVE64(_min, _max, _field, _value))
1219 #define EFX_INSERT_FIELD32(_min, _max, _field, _value) \
1220 __CPU_TO_LE_32(EFX_INSERT_FIELD_NATIVE32(_min, _max, _field, _value))
1222 #define EFX_INSERT_FIELD16(_min, _max, _field, _value) \
1223 __CPU_TO_LE_16(EFX_INSERT_FIELD_NATIVE16(_min, _max, _field, _value))
1225 #define EFX_INSERT_FIELD8(_min, _max, _field, _value) \
1226 __NATIVE_8(EFX_INSERT_FIELD_NATIVE8(_min, _max, _field, _value))
1228 #define EFX_INPLACE_MASK64(_min, _max, _field) \
1229 EFX_INSERT_FIELD64(_min, _max, _field, EFX_MASK64(_field))
1231 #define EFX_INPLACE_MASK32(_min, _max, _field) \
1232 EFX_INSERT_FIELD32(_min, _max, _field, EFX_MASK32(_field))
1234 #define EFX_INPLACE_MASK16(_min, _max, _field) \
1235 EFX_INSERT_FIELD16(_min, _max, _field, EFX_MASK16(_field))
1237 #define EFX_INPLACE_MASK8(_min, _max, _field) \
1238 EFX_INSERT_FIELD8(_min, _max, _field, EFX_MASK8(_field))
1240 #define EFX_SET_OWORD_FIELD64(_oword, _field, _value) \
1242 _NOTE(CONSTANTCONDITION) \
1243 (_oword).eo_u64[0] = (((_oword).eo_u64[0] & \
1244 ~EFX_INPLACE_MASK64(0, 63, _field)) | \
1245 EFX_INSERT_FIELD64(0, 63, _field, _value)); \
1246 _NOTE(CONSTANTCONDITION) \
1247 (_oword).eo_u64[1] = (((_oword).eo_u64[1] & \
1248 ~EFX_INPLACE_MASK64(64, 127, _field)) | \
1249 EFX_INSERT_FIELD64(64, 127, _field, _value)); \
1250 _NOTE(CONSTANTCONDITION) \
1253 #define EFX_SET_OWORD_FIELD32(_oword, _field, _value) \
1255 _NOTE(CONSTANTCONDITION) \
1256 (_oword).eo_u32[0] = (((_oword).eo_u32[0] & \
1257 ~EFX_INPLACE_MASK32(0, 31, _field)) | \
1258 EFX_INSERT_FIELD32(0, 31, _field, _value)); \
1259 _NOTE(CONSTANTCONDITION) \
1260 (_oword).eo_u32[1] = (((_oword).eo_u32[1] & \
1261 ~EFX_INPLACE_MASK32(32, 63, _field)) | \
1262 EFX_INSERT_FIELD32(32, 63, _field, _value)); \
1263 _NOTE(CONSTANTCONDITION) \
1264 (_oword).eo_u32[2] = (((_oword).eo_u32[2] & \
1265 ~EFX_INPLACE_MASK32(64, 95, _field)) | \
1266 EFX_INSERT_FIELD32(64, 95, _field, _value)); \
1267 _NOTE(CONSTANTCONDITION) \
1268 (_oword).eo_u32[3] = (((_oword).eo_u32[3] & \
1269 ~EFX_INPLACE_MASK32(96, 127, _field)) | \
1270 EFX_INSERT_FIELD32(96, 127, _field, _value)); \
1271 _NOTE(CONSTANTCONDITION) \
1274 #define EFX_SET_QWORD_FIELD64(_qword, _field, _value) \
1276 _NOTE(CONSTANTCONDITION) \
1277 (_qword).eq_u64[0] = (((_qword).eq_u64[0] & \
1278 ~EFX_INPLACE_MASK64(0, 63, _field)) | \
1279 EFX_INSERT_FIELD64(0, 63, _field, _value)); \
1280 _NOTE(CONSTANTCONDITION) \
1283 #define EFX_SET_QWORD_FIELD32(_qword, _field, _value) \
1285 _NOTE(CONSTANTCONDITION) \
1286 (_qword).eq_u32[0] = (((_qword).eq_u32[0] & \
1287 ~EFX_INPLACE_MASK32(0, 31, _field)) | \
1288 EFX_INSERT_FIELD32(0, 31, _field, _value)); \
1289 _NOTE(CONSTANTCONDITION) \
1290 (_qword).eq_u32[1] = (((_qword).eq_u32[1] & \
1291 ~EFX_INPLACE_MASK32(32, 63, _field)) | \
1292 EFX_INSERT_FIELD32(32, 63, _field, _value)); \
1293 _NOTE(CONSTANTCONDITION) \
1296 #define EFX_SET_DWORD_FIELD(_dword, _field, _value) \
1298 _NOTE(CONSTANTCONDITION) \
1299 (_dword).ed_u32[0] = (((_dword).ed_u32[0] & \
1300 ~EFX_INPLACE_MASK32(0, 31, _field)) | \
1301 EFX_INSERT_FIELD32(0, 31, _field, _value)); \
1302 _NOTE(CONSTANTCONDITION) \
1305 #define EFX_SET_WORD_FIELD(_word, _field, _value) \
1307 _NOTE(CONSTANTCONDITION) \
1308 (_word).ew_u16[0] = (((_word).ew_u16[0] & \
1309 ~EFX_INPLACE_MASK16(0, 15, _field)) | \
1310 EFX_INSERT_FIELD16(0, 15, _field, _value)); \
1311 _NOTE(CONSTANTCONDITION) \
1314 #define EFX_SET_BYTE_FIELD(_byte, _field, _value) \
1316 _NOTE(CONSTANTCONDITION) \
1317 (_byte).eb_u8[0] = (((_byte).eb_u8[0] & \
1318 ~EFX_INPLACE_MASK8(0, 7, _field)) | \
1319 EFX_INSERT_FIELD8(0, 7, _field, _value)); \
1320 _NOTE(CONSTANTCONDITION) \
1324 * Set or clear a numbered bit within an octword.
1327 #define EFX_SHIFT64(_bit, _base) \
1328 (((_bit) >= (_base) && (_bit) < (_base) + 64) ? \
1329 ((uint64_t)1 << EFX_SSUB((_bit), (_base))) : \
1332 #define EFX_SHIFT32(_bit, _base) \
1333 (((_bit) >= (_base) && (_bit) < (_base) + 32) ? \
1334 ((uint32_t)1 << EFX_SSUB((_bit),(_base))) : \
1337 #define EFX_SHIFT16(_bit, _base) \
1338 (((_bit) >= (_base) && (_bit) < (_base) + 16) ? \
1339 (uint16_t)(1 << EFX_SSUB((_bit), (_base))) : \
1342 #define EFX_SHIFT8(_bit, _base) \
1343 (((_bit) >= (_base) && (_bit) < (_base) + 8) ? \
1344 (uint8_t)(1 << EFX_SSUB((_bit), (_base))) : \
1347 #define EFX_SET_OWORD_BIT64(_oword, _bit) \
1349 _NOTE(CONSTANTCONDITION) \
1350 (_oword).eo_u64[0] |= \
1351 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0))); \
1352 (_oword).eo_u64[1] |= \
1353 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64))); \
1354 _NOTE(CONSTANTCONDITION) \
1357 #define EFX_SET_OWORD_BIT32(_oword, _bit) \
1359 _NOTE(CONSTANTCONDITION) \
1360 (_oword).eo_u32[0] |= \
1361 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0))); \
1362 (_oword).eo_u32[1] |= \
1363 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32))); \
1364 (_oword).eo_u32[2] |= \
1365 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64))); \
1366 (_oword).eo_u32[3] |= \
1367 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96))); \
1368 _NOTE(CONSTANTCONDITION) \
1371 #define EFX_CLEAR_OWORD_BIT64(_oword, _bit) \
1373 _NOTE(CONSTANTCONDITION) \
1374 (_oword).eo_u64[0] &= \
1375 __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0))); \
1376 (_oword).eo_u64[1] &= \
1377 __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(64))); \
1378 _NOTE(CONSTANTCONDITION) \
1381 #define EFX_CLEAR_OWORD_BIT32(_oword, _bit) \
1383 _NOTE(CONSTANTCONDITION) \
1384 (_oword).eo_u32[0] &= \
1385 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0))); \
1386 (_oword).eo_u32[1] &= \
1387 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32))); \
1388 (_oword).eo_u32[2] &= \
1389 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(64))); \
1390 (_oword).eo_u32[3] &= \
1391 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(96))); \
1392 _NOTE(CONSTANTCONDITION) \
1395 #define EFX_TEST_OWORD_BIT64(_oword, _bit) \
1396 (((_oword).eo_u64[0] & \
1397 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) || \
1398 ((_oword).eo_u64[1] & \
1399 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)))))
1401 #define EFX_TEST_OWORD_BIT32(_oword, _bit) \
1402 (((_oword).eo_u32[0] & \
1403 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) || \
1404 ((_oword).eo_u32[1] & \
1405 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))) || \
1406 ((_oword).eo_u32[2] & \
1407 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)))) || \
1408 ((_oword).eo_u32[3] & \
1409 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)))))
1412 #define EFX_SET_QWORD_BIT64(_qword, _bit) \
1414 _NOTE(CONSTANTCONDITION) \
1415 (_qword).eq_u64[0] |= \
1416 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0))); \
1417 _NOTE(CONSTANTCONDITION) \
1420 #define EFX_SET_QWORD_BIT32(_qword, _bit) \
1422 _NOTE(CONSTANTCONDITION) \
1423 (_qword).eq_u32[0] |= \
1424 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0))); \
1425 (_qword).eq_u32[1] |= \
1426 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32))); \
1427 _NOTE(CONSTANTCONDITION) \
1430 #define EFX_CLEAR_QWORD_BIT64(_qword, _bit) \
1432 _NOTE(CONSTANTCONDITION) \
1433 (_qword).eq_u64[0] &= \
1434 __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0))); \
1435 _NOTE(CONSTANTCONDITION) \
1438 #define EFX_CLEAR_QWORD_BIT32(_qword, _bit) \
1440 _NOTE(CONSTANTCONDITION) \
1441 (_qword).eq_u32[0] &= \
1442 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0))); \
1443 (_qword).eq_u32[1] &= \
1444 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32))); \
1445 _NOTE(CONSTANTCONDITION) \
1448 #define EFX_TEST_QWORD_BIT64(_qword, _bit) \
1449 (((_qword).eq_u64[0] & \
1450 __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) != 0)
1452 #define EFX_TEST_QWORD_BIT32(_qword, _bit) \
1453 (((_qword).eq_u32[0] & \
1454 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) || \
1455 ((_qword).eq_u32[1] & \
1456 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))))
1459 #define EFX_SET_DWORD_BIT(_dword, _bit) \
1461 (_dword).ed_u32[0] |= \
1462 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0))); \
1463 _NOTE(CONSTANTCONDITION) \
1466 #define EFX_CLEAR_DWORD_BIT(_dword, _bit) \
1468 (_dword).ed_u32[0] &= \
1469 __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0))); \
1470 _NOTE(CONSTANTCONDITION) \
1473 #define EFX_TEST_DWORD_BIT(_dword, _bit) \
1474 (((_dword).ed_u32[0] & \
1475 __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) != 0)
1478 #define EFX_SET_WORD_BIT(_word, _bit) \
1480 (_word).ew_u16[0] |= \
1481 __CPU_TO_LE_16(EFX_SHIFT16(_bit, FIX_LINT(0))); \
1482 _NOTE(CONSTANTCONDITION) \
1485 #define EFX_CLEAR_WORD_BIT(_word, _bit) \
1487 (_word).ew_u32[0] &= \
1488 __CPU_TO_LE_16(~EFX_SHIFT16(_bit, FIX_LINT(0))); \
1489 _NOTE(CONSTANTCONDITION) \
1492 #define EFX_TEST_WORD_BIT(_word, _bit) \
1493 (((_word).ew_u16[0] & \
1494 __CPU_TO_LE_16(EFX_SHIFT16(_bit, FIX_LINT(0)))) != 0)
1497 #define EFX_SET_BYTE_BIT(_byte, _bit) \
1499 (_byte).eb_u8[0] |= \
1500 __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0))); \
1501 _NOTE(CONSTANTCONDITION) \
1504 #define EFX_CLEAR_BYTE_BIT(_byte, _bit) \
1506 (_byte).eb_u8[0] &= \
1507 __NATIVE_8(~EFX_SHIFT8(_bit, FIX_LINT(0))); \
1508 _NOTE(CONSTANTCONDITION) \
1511 #define EFX_TEST_BYTE_BIT(_byte, _bit) \
1512 (((_byte).eb_u8[0] & \
1513 __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0)))) != 0)
1516 #define EFX_OR_OWORD64(_oword1, _oword2) \
1518 (_oword1).eo_u64[0] |= (_oword2).eo_u64[0]; \
1519 (_oword1).eo_u64[1] |= (_oword2).eo_u64[1]; \
1520 _NOTE(CONSTANTCONDITION) \
1523 #define EFX_OR_OWORD32(_oword1, _oword2) \
1525 (_oword1).eo_u32[0] |= (_oword2).eo_u32[0]; \
1526 (_oword1).eo_u32[1] |= (_oword2).eo_u32[1]; \
1527 (_oword1).eo_u32[2] |= (_oword2).eo_u32[2]; \
1528 (_oword1).eo_u32[3] |= (_oword2).eo_u32[3]; \
1529 _NOTE(CONSTANTCONDITION) \
1532 #define EFX_AND_OWORD64(_oword1, _oword2) \
1534 (_oword1).eo_u64[0] &= (_oword2).eo_u64[0]; \
1535 (_oword1).eo_u64[1] &= (_oword2).eo_u64[1]; \
1536 _NOTE(CONSTANTCONDITION) \
1539 #define EFX_AND_OWORD32(_oword1, _oword2) \
1541 (_oword1).eo_u32[0] &= (_oword2).eo_u32[0]; \
1542 (_oword1).eo_u32[1] &= (_oword2).eo_u32[1]; \
1543 (_oword1).eo_u32[2] &= (_oword2).eo_u32[2]; \
1544 (_oword1).eo_u32[3] &= (_oword2).eo_u32[3]; \
1545 _NOTE(CONSTANTCONDITION) \
1548 #define EFX_OR_QWORD64(_qword1, _qword2) \
1550 (_qword1).eq_u64[0] |= (_qword2).eq_u64[0]; \
1551 _NOTE(CONSTANTCONDITION) \
1554 #define EFX_OR_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_AND_QWORD64(_qword1, _qword2) \
1563 (_qword1).eq_u64[0] &= (_qword2).eq_u64[0]; \
1564 _NOTE(CONSTANTCONDITION) \
1567 #define EFX_AND_QWORD32(_qword1, _qword2) \
1569 (_qword1).eq_u32[0] &= (_qword2).eq_u32[0]; \
1570 (_qword1).eq_u32[1] &= (_qword2).eq_u32[1]; \
1571 _NOTE(CONSTANTCONDITION) \
1574 #define EFX_OR_DWORD(_dword1, _dword2) \
1576 (_dword1).ed_u32[0] |= (_dword2).ed_u32[0]; \
1577 _NOTE(CONSTANTCONDITION) \
1580 #define EFX_AND_DWORD(_dword1, _dword2) \
1582 (_dword1).ed_u32[0] &= (_dword2).ed_u32[0]; \
1583 _NOTE(CONSTANTCONDITION) \
1586 #define EFX_OR_WORD(_word1, _word2) \
1588 (_word1).ew_u16[0] |= (_word2).ew_u16[0]; \
1589 _NOTE(CONSTANTCONDITION) \
1592 #define EFX_AND_WORD(_word1, _word2) \
1594 (_word1).ew_u16[0] &= (_word2).ew_u16[0]; \
1595 _NOTE(CONSTANTCONDITION) \
1598 #define EFX_OR_BYTE(_byte1, _byte2) \
1600 (_byte1).eb_u8[0] |= (_byte2).eb_u8[0]; \
1601 _NOTE(CONSTANTCONDITION) \
1604 #define EFX_AND_BYTE(_byte1, _byte2) \
1606 (_byte1).eb_u8[0] &= (_byte2).eb_u8[0]; \
1607 _NOTE(CONSTANTCONDITION) \
1610 #if EFSYS_USE_UINT64
1611 #define EFX_OWORD_FIELD EFX_OWORD_FIELD64
1612 #define EFX_QWORD_FIELD EFX_QWORD_FIELD64
1613 #define EFX_OWORD_IS_EQUAL EFX_OWORD_IS_EQUAL64
1614 #define EFX_QWORD_IS_EQUAL EFX_QWORD_IS_EQUAL64
1615 #define EFX_OWORD_IS_ZERO EFX_OWORD_IS_ZERO64
1616 #define EFX_QWORD_IS_ZERO EFX_QWORD_IS_ZERO64
1617 #define EFX_OWORD_IS_SET EFX_OWORD_IS_SET64
1618 #define EFX_QWORD_IS_SET EFX_QWORD_IS_SET64
1619 #define EFX_POPULATE_OWORD EFX_POPULATE_OWORD64
1620 #define EFX_POPULATE_QWORD EFX_POPULATE_QWORD64
1621 #define EFX_SET_OWORD_FIELD EFX_SET_OWORD_FIELD64
1622 #define EFX_SET_QWORD_FIELD EFX_SET_QWORD_FIELD64
1623 #define EFX_SET_OWORD_BIT EFX_SET_OWORD_BIT64
1624 #define EFX_CLEAR_OWORD_BIT EFX_CLEAR_OWORD_BIT64
1625 #define EFX_TEST_OWORD_BIT EFX_TEST_OWORD_BIT64
1626 #define EFX_SET_QWORD_BIT EFX_SET_QWORD_BIT64
1627 #define EFX_CLEAR_QWORD_BIT EFX_CLEAR_QWORD_BIT64
1628 #define EFX_TEST_QWORD_BIT EFX_TEST_QWORD_BIT64
1629 #define EFX_OR_OWORD EFX_OR_OWORD64
1630 #define EFX_AND_OWORD EFX_AND_OWORD64
1631 #define EFX_OR_QWORD EFX_OR_QWORD64
1632 #define EFX_AND_QWORD EFX_AND_QWORD64
1634 #define EFX_OWORD_FIELD EFX_OWORD_FIELD32
1635 #define EFX_QWORD_FIELD EFX_QWORD_FIELD32
1636 #define EFX_OWORD_IS_EQUAL EFX_OWORD_IS_EQUAL32
1637 #define EFX_QWORD_IS_EQUAL EFX_QWORD_IS_EQUAL32
1638 #define EFX_OWORD_IS_ZERO EFX_OWORD_IS_ZERO32
1639 #define EFX_QWORD_IS_ZERO EFX_QWORD_IS_ZERO32
1640 #define EFX_OWORD_IS_SET EFX_OWORD_IS_SET32
1641 #define EFX_QWORD_IS_SET EFX_QWORD_IS_SET32
1642 #define EFX_POPULATE_OWORD EFX_POPULATE_OWORD32
1643 #define EFX_POPULATE_QWORD EFX_POPULATE_QWORD32
1644 #define EFX_SET_OWORD_FIELD EFX_SET_OWORD_FIELD32
1645 #define EFX_SET_QWORD_FIELD EFX_SET_QWORD_FIELD32
1646 #define EFX_SET_OWORD_BIT EFX_SET_OWORD_BIT32
1647 #define EFX_CLEAR_OWORD_BIT EFX_CLEAR_OWORD_BIT32
1648 #define EFX_TEST_OWORD_BIT EFX_TEST_OWORD_BIT32
1649 #define EFX_SET_QWORD_BIT EFX_SET_QWORD_BIT32
1650 #define EFX_CLEAR_QWORD_BIT EFX_CLEAR_QWORD_BIT32
1651 #define EFX_TEST_QWORD_BIT EFX_TEST_QWORD_BIT32
1652 #define EFX_OR_OWORD EFX_OR_OWORD32
1653 #define EFX_AND_OWORD EFX_AND_OWORD32
1654 #define EFX_OR_QWORD EFX_OR_QWORD32
1655 #define EFX_AND_QWORD EFX_AND_QWORD32
1662 #endif /* _SYS_EFX_TYPES_H */