]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/sfxge/common/efx_types.h
Merge OpenSSL 1.0.2n.
[FreeBSD/FreeBSD.git] / sys / dev / sfxge / common / efx_types.h
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2007-2016 Solarflare Communications Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
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.
15  *
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.
27  *
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.
31  *
32  * Ackowledgement to Fen Systems Ltd.
33  *
34  * $FreeBSD$
35  */
36
37 #ifndef _SYS_EFX_TYPES_H
38 #define _SYS_EFX_TYPES_H
39
40 #include "efsys.h"
41
42 #ifdef  __cplusplus
43 extern "C" {
44 #endif
45
46 /*
47  * Bitfield access
48  *
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
53  * datatype.
54  *
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.
59  *
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.)
65  */
66
67 /*
68  * NOTE: Field definitions here and elsewhere are done in terms of a lowest
69  *       bit number (LBN) and a width.
70  */
71
72 #define EFX_DUMMY_FIELD_LBN 0
73 #define EFX_DUMMY_FIELD_WIDTH 0
74
75 #define EFX_BYTE_0_LBN 0
76 #define EFX_BYTE_0_WIDTH 8
77
78 #define EFX_BYTE_1_LBN 8
79 #define EFX_BYTE_1_WIDTH 8
80
81 #define EFX_BYTE_2_LBN 16
82 #define EFX_BYTE_2_WIDTH 8
83
84 #define EFX_BYTE_3_LBN 24
85 #define EFX_BYTE_3_WIDTH 8
86
87 #define EFX_BYTE_4_LBN 32
88 #define EFX_BYTE_4_WIDTH 8
89
90 #define EFX_BYTE_5_LBN 40
91 #define EFX_BYTE_5_WIDTH 8
92
93 #define EFX_BYTE_6_LBN 48
94 #define EFX_BYTE_6_WIDTH 8
95
96 #define EFX_BYTE_7_LBN 56
97 #define EFX_BYTE_7_WIDTH 8
98
99 #define EFX_WORD_0_LBN 0
100 #define EFX_WORD_0_WIDTH 16
101
102 #define EFX_WORD_1_LBN 16
103 #define EFX_WORD_1_WIDTH 16
104
105 #define EFX_WORD_2_LBN 32
106 #define EFX_WORD_2_WIDTH 16
107
108 #define EFX_WORD_3_LBN 48
109 #define EFX_WORD_3_WIDTH 16
110
111 #define EFX_DWORD_0_LBN 0
112 #define EFX_DWORD_0_WIDTH 32
113
114 #define EFX_DWORD_1_LBN 32
115 #define EFX_DWORD_1_WIDTH 32
116
117 #define EFX_DWORD_2_LBN 64
118 #define EFX_DWORD_2_WIDTH 32
119
120 #define EFX_DWORD_3_LBN 96
121 #define EFX_DWORD_3_WIDTH 32
122
123 /* There are intentionally no EFX_QWORD_0 or EFX_QWORD_1 field definitions
124  * here as the implementaion of EFX_QWORD_FIELD and EFX_OWORD_FIELD do not
125  * support field widths larger than 32 bits.
126  */
127
128 /* Specified attribute (i.e. LBN ow WIDTH) of the specified field */
129 #define EFX_VAL(_field, _attribute)                                     \
130         _field ## _ ## _attribute
131
132 /* Lowest bit number of the specified field */
133 #define EFX_LOW_BIT(_field)                                             \
134         EFX_VAL(_field, LBN)
135
136 /* Width of the specified field */
137 #define EFX_WIDTH(_field)                                               \
138         EFX_VAL(_field, WIDTH)
139
140 /* Highest bit number of the specified field */
141 #define EFX_HIGH_BIT(_field)                                            \
142         (EFX_LOW_BIT(_field) + EFX_WIDTH(_field) - 1)
143
144 /*
145  * 64-bit mask equal in width to the specified field.
146  *
147  * For example, a field with width 5 would have a mask of 0x000000000000001f.
148  */
149 #define EFX_MASK64(_field)                                              \
150         ((EFX_WIDTH(_field) == 64) ? ~((uint64_t)0) :                   \
151             (((((uint64_t)1) << EFX_WIDTH(_field))) - 1))
152 /*
153  * 32-bit mask equal in width to the specified field.
154  *
155  * For example, a field with width 5 would have a mask of 0x0000001f.
156  */
157 #define EFX_MASK32(_field)                                              \
158         ((EFX_WIDTH(_field) == 32) ? ~((uint32_t)0) :                   \
159             (((((uint32_t)1) << EFX_WIDTH(_field))) - 1))
160
161 /*
162  * 16-bit mask equal in width to the specified field.
163  *
164  * For example, a field with width 5 would have a mask of 0x001f.
165  */
166 #define EFX_MASK16(_field)                                              \
167         ((EFX_WIDTH(_field) == 16) ? 0xffffu :                          \
168             (uint16_t)((1 << EFX_WIDTH(_field)) - 1))
169
170 /*
171  * 8-bit mask equal in width to the specified field.
172  *
173  * For example, a field with width 5 would have a mask of 0x1f.
174  */
175 #define EFX_MASK8(_field)                                               \
176         ((uint8_t)((1 << EFX_WIDTH(_field)) - 1))
177
178 #pragma pack(1)
179
180 /*
181  * A byte (i.e. 8-bit) datatype
182  */
183 typedef union efx_byte_u {
184         uint8_t eb_u8[1];
185 } efx_byte_t;
186
187 /*
188  * A word (i.e. 16-bit) datatype
189  *
190  * This datatype is defined to be little-endian.
191  */
192 typedef union efx_word_u {
193         efx_byte_t ew_byte[2];
194         uint16_t ew_u16[1];
195         uint8_t ew_u8[2];
196 } efx_word_t;
197
198 /*
199  * A doubleword (i.e. 32-bit) datatype
200  *
201  * This datatype is defined to be little-endian.
202  */
203 typedef union efx_dword_u {
204         efx_byte_t ed_byte[4];
205         efx_word_t ed_word[2];
206         uint32_t ed_u32[1];
207         uint16_t ed_u16[2];
208         uint8_t ed_u8[4];
209 } efx_dword_t;
210
211 /*
212  * A quadword (i.e. 64-bit) datatype
213  *
214  * This datatype is defined to be little-endian.
215  */
216 typedef union efx_qword_u {
217         efx_byte_t eq_byte[8];
218         efx_word_t eq_word[4];
219         efx_dword_t eq_dword[2];
220 #if EFSYS_HAS_UINT64
221         uint64_t eq_u64[1];
222 #endif
223         uint32_t eq_u32[2];
224         uint16_t eq_u16[4];
225         uint8_t eq_u8[8];
226 } efx_qword_t;
227
228 /*
229  * An octword (i.e. 128-bit) datatype
230  *
231  * This datatype is defined to be little-endian.
232  */
233 typedef union efx_oword_u {
234         efx_byte_t eo_byte[16];
235         efx_word_t eo_word[8];
236         efx_dword_t eo_dword[4];
237         efx_qword_t eo_qword[2];
238 #if EFSYS_HAS_SSE2_M128
239         __m128i eo_u128[1];
240 #endif
241 #if EFSYS_HAS_UINT64
242         uint64_t eo_u64[2];
243 #endif
244         uint32_t eo_u32[4];
245         uint16_t eo_u16[8];
246         uint8_t eo_u8[16];
247 } efx_oword_t;
248
249 #pragma pack()
250
251 #define __SWAP16(_x)                            \
252         ((((_x) & 0xff) << 8) |                 \
253         (((_x) >> 8) & 0xff))
254
255 #define __SWAP32(_x)                            \
256         ((__SWAP16((_x) & 0xffff) << 16) |      \
257         __SWAP16(((_x) >> 16) & 0xffff))
258
259 #define __SWAP64(_x)                            \
260         ((__SWAP32((_x) & 0xffffffff) << 32) |  \
261         __SWAP32(((_x) >> 32) & 0xffffffff))
262
263 #define __NOSWAP16(_x)          (_x)
264 #define __NOSWAP32(_x)          (_x)
265 #define __NOSWAP64(_x)          (_x)
266
267 #if EFSYS_IS_BIG_ENDIAN
268
269 #define __CPU_TO_LE_16(_x)      ((uint16_t)__SWAP16(_x))
270 #define __LE_TO_CPU_16(_x)      ((uint16_t)__SWAP16(_x))
271 #define __CPU_TO_BE_16(_x)      ((uint16_t)__NOSWAP16(_x))
272 #define __BE_TO_CPU_16(_x)      ((uint16_t)__NOSWAP16(_x))
273
274 #define __CPU_TO_LE_32(_x)      ((uint32_t)__SWAP32(_x))
275 #define __LE_TO_CPU_32(_x)      ((uint32_t)__SWAP32(_x))
276 #define __CPU_TO_BE_32(_x)      ((uint32_t)__NOSWAP32(_x))
277 #define __BE_TO_CPU_32(_x)      ((uint32_t)__NOSWAP32(_x))
278
279 #define __CPU_TO_LE_64(_x)      ((uint64_t)__SWAP64(_x))
280 #define __LE_TO_CPU_64(_x)      ((uint64_t)__SWAP64(_x))
281 #define __CPU_TO_BE_64(_x)      ((uint64_t)__NOSWAP64(_x))
282 #define __BE_TO_CPU_64(_x)      ((uint64_t)__NOSWAP64(_x))
283
284 #elif EFSYS_IS_LITTLE_ENDIAN
285
286 #define __CPU_TO_LE_16(_x)      ((uint16_t)__NOSWAP16(_x))
287 #define __LE_TO_CPU_16(_x)      ((uint16_t)__NOSWAP16(_x))
288 #define __CPU_TO_BE_16(_x)      ((uint16_t)__SWAP16(_x))
289 #define __BE_TO_CPU_16(_x)      ((uint16_t)__SWAP16(_x))
290
291 #define __CPU_TO_LE_32(_x)      ((uint32_t)__NOSWAP32(_x))
292 #define __LE_TO_CPU_32(_x)      ((uint32_t)__NOSWAP32(_x))
293 #define __CPU_TO_BE_32(_x)      ((uint32_t)__SWAP32(_x))
294 #define __BE_TO_CPU_32(_x)      ((uint32_t)__SWAP32(_x))
295
296 #define __CPU_TO_LE_64(_x)      ((uint64_t)__NOSWAP64(_x))
297 #define __LE_TO_CPU_64(_x)      ((uint64_t)__NOSWAP64(_x))
298 #define __CPU_TO_BE_64(_x)      ((uint64_t)__SWAP64(_x))
299 #define __BE_TO_CPU_64(_x)      ((uint64_t)__SWAP64(_x))
300
301 #else
302
303 #error "Neither of EFSYS_IS_{BIG,LITTLE}_ENDIAN is set"
304
305 #endif
306
307 #define __NATIVE_8(_x)  (uint8_t)(_x)
308
309 /* Format string for printing an efx_byte_t */
310 #define EFX_BYTE_FMT "0x%02x"
311
312 /* Format string for printing an efx_word_t */
313 #define EFX_WORD_FMT "0x%04x"
314
315 /* Format string for printing an efx_dword_t */
316 #define EFX_DWORD_FMT "0x%08x"
317
318 /* Format string for printing an efx_qword_t */
319 #define EFX_QWORD_FMT "0x%08x:%08x"
320
321 /* Format string for printing an efx_oword_t */
322 #define EFX_OWORD_FMT "0x%08x:%08x:%08x:%08x"
323
324 /* Parameters for printing an efx_byte_t */
325 #define EFX_BYTE_VAL(_byte)                                     \
326         ((unsigned int)__NATIVE_8((_byte).eb_u8[0]))
327
328 /* Parameters for printing an efx_word_t */
329 #define EFX_WORD_VAL(_word)                                     \
330         ((unsigned int)__LE_TO_CPU_16((_word).ew_u16[0]))
331
332 /* Parameters for printing an efx_dword_t */
333 #define EFX_DWORD_VAL(_dword)                                   \
334         ((unsigned int)__LE_TO_CPU_32((_dword).ed_u32[0]))
335
336 /* Parameters for printing an efx_qword_t */
337 #define EFX_QWORD_VAL(_qword)                                   \
338         ((unsigned int)__LE_TO_CPU_32((_qword).eq_u32[1])),     \
339         ((unsigned int)__LE_TO_CPU_32((_qword).eq_u32[0]))
340
341 /* Parameters for printing an efx_oword_t */
342 #define EFX_OWORD_VAL(_oword)                                   \
343         ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[3])),     \
344         ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[2])),     \
345         ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[1])),     \
346         ((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[0]))
347
348 /*
349  * Stop lint complaining about some shifts.
350  */
351 #ifdef  __lint
352 extern int fix_lint;
353 #define FIX_LINT(_x)    (_x + fix_lint)
354 #else
355 #define FIX_LINT(_x)    (_x)
356 #endif
357
358 /*
359  * Extract bit field portion [low,high) from the native-endian element
360  * which contains bits [min,max).
361  *
362  * For example, suppose "element" represents the high 32 bits of a
363  * 64-bit value, and we wish to extract the bits belonging to the bit
364  * field occupying bits 28-45 of this 64-bit value.
365  *
366  * Then EFX_EXTRACT(_element, 32, 63, 28, 45) would give
367  *
368  *   (_element) << 4
369  *
370  * The result will contain the relevant bits filled in in the range
371  * [0,high-low), with garbage in bits [high-low+1,...).
372  */
373 #define EFX_EXTRACT_NATIVE(_element, _min, _max, _low, _high)           \
374         ((FIX_LINT(_low > _max) || FIX_LINT(_high < _min)) ?            \
375                 0U :                                                    \
376                 ((_low > _min) ?                                        \
377                         ((_element) >> (_low - _min)) :                 \
378                         ((_element) << (_min - _low))))
379
380 /*
381  * Extract bit field portion [low,high) from the 64-bit little-endian
382  * element which contains bits [min,max)
383  */
384 #define EFX_EXTRACT64(_element, _min, _max, _low, _high)                \
385         EFX_EXTRACT_NATIVE(__LE_TO_CPU_64(_element), _min, _max, _low, _high)
386
387 /*
388  * Extract bit field portion [low,high) from the 32-bit little-endian
389  * element which contains bits [min,max)
390  */
391 #define EFX_EXTRACT32(_element, _min, _max, _low, _high)                \
392         EFX_EXTRACT_NATIVE(__LE_TO_CPU_32(_element), _min, _max, _low, _high)
393
394 /*
395  * Extract bit field portion [low,high) from the 16-bit little-endian
396  * element which contains bits [min,max)
397  */
398 #define EFX_EXTRACT16(_element, _min, _max, _low, _high)                \
399         EFX_EXTRACT_NATIVE(__LE_TO_CPU_16(_element), _min, _max, _low, _high)
400
401 /*
402  * Extract bit field portion [low,high) from the 8-bit
403  * element which contains bits [min,max)
404  */
405 #define EFX_EXTRACT8(_element, _min, _max, _low, _high)                 \
406         EFX_EXTRACT_NATIVE(__NATIVE_8(_element), _min, _max, _low, _high)
407
408 #define EFX_EXTRACT_OWORD64(_oword, _low, _high)                        \
409         (EFX_EXTRACT64((_oword).eo_u64[0], FIX_LINT(0), FIX_LINT(63),   \
410             _low, _high) |                                              \
411         EFX_EXTRACT64((_oword).eo_u64[1], FIX_LINT(64), FIX_LINT(127),  \
412             _low, _high))
413
414 #define EFX_EXTRACT_OWORD32(_oword, _low, _high)                        \
415         (EFX_EXTRACT32((_oword).eo_u32[0], FIX_LINT(0), FIX_LINT(31),   \
416             _low, _high) |                                              \
417         EFX_EXTRACT32((_oword).eo_u32[1], FIX_LINT(32), FIX_LINT(63),   \
418             _low, _high) |                                              \
419         EFX_EXTRACT32((_oword).eo_u32[2], FIX_LINT(64), FIX_LINT(95),   \
420             _low, _high) |                                              \
421         EFX_EXTRACT32((_oword).eo_u32[3], FIX_LINT(96), FIX_LINT(127),  \
422             _low, _high))
423
424 #define EFX_EXTRACT_QWORD64(_qword, _low, _high)                        \
425         (EFX_EXTRACT64((_qword).eq_u64[0], FIX_LINT(0), FIX_LINT(63),   \
426             _low, _high))
427
428 #define EFX_EXTRACT_QWORD32(_qword, _low, _high)                        \
429         (EFX_EXTRACT32((_qword).eq_u32[0], FIX_LINT(0), FIX_LINT(31),   \
430             _low, _high) |                                              \
431         EFX_EXTRACT32((_qword).eq_u32[1], FIX_LINT(32), FIX_LINT(63),   \
432             _low, _high))
433
434 #define EFX_EXTRACT_DWORD(_dword, _low, _high)                          \
435         (EFX_EXTRACT32((_dword).ed_u32[0], FIX_LINT(0), FIX_LINT(31),   \
436             _low, _high))
437
438 #define EFX_EXTRACT_WORD(_word, _low, _high)                            \
439         (EFX_EXTRACT16((_word).ew_u16[0], FIX_LINT(0), FIX_LINT(15),    \
440             _low, _high))
441
442 #define EFX_EXTRACT_BYTE(_byte, _low, _high)                            \
443         (EFX_EXTRACT8((_byte).eb_u8[0], FIX_LINT(0), FIX_LINT(7),       \
444             _low, _high))
445
446
447 #define EFX_OWORD_FIELD64(_oword, _field)                               \
448         ((uint32_t)EFX_EXTRACT_OWORD64(_oword, EFX_LOW_BIT(_field),     \
449             EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
450
451 #define EFX_OWORD_FIELD32(_oword, _field)                               \
452         (EFX_EXTRACT_OWORD32(_oword, EFX_LOW_BIT(_field),               \
453             EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
454
455 #define EFX_QWORD_FIELD64(_qword, _field)                               \
456         ((uint32_t)EFX_EXTRACT_QWORD64(_qword, EFX_LOW_BIT(_field),     \
457             EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
458
459 #define EFX_QWORD_FIELD32(_qword, _field)                               \
460         (EFX_EXTRACT_QWORD32(_qword, EFX_LOW_BIT(_field),               \
461             EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
462
463 #define EFX_DWORD_FIELD(_dword, _field)                                 \
464         (EFX_EXTRACT_DWORD(_dword, EFX_LOW_BIT(_field),                 \
465             EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
466
467 #define EFX_WORD_FIELD(_word, _field)                                   \
468         (EFX_EXTRACT_WORD(_word, EFX_LOW_BIT(_field),                   \
469             EFX_HIGH_BIT(_field)) & EFX_MASK16(_field))
470
471 #define EFX_BYTE_FIELD(_byte, _field)                                   \
472         (EFX_EXTRACT_BYTE(_byte, EFX_LOW_BIT(_field),                   \
473             EFX_HIGH_BIT(_field)) & EFX_MASK8(_field))
474
475
476 #define EFX_OWORD_IS_EQUAL64(_oword_a, _oword_b)                        \
477         ((_oword_a).eo_u64[0] == (_oword_b).eo_u64[0] &&                \
478             (_oword_a).eo_u64[1] == (_oword_b).eo_u64[1])
479
480 #define EFX_OWORD_IS_EQUAL32(_oword_a, _oword_b)                        \
481         ((_oword_a).eo_u32[0] == (_oword_b).eo_u32[0] &&                \
482             (_oword_a).eo_u32[1] == (_oword_b).eo_u32[1] &&             \
483             (_oword_a).eo_u32[2] == (_oword_b).eo_u32[2] &&             \
484             (_oword_a).eo_u32[3] == (_oword_b).eo_u32[3])
485
486 #define EFX_QWORD_IS_EQUAL64(_qword_a, _qword_b)                        \
487         ((_qword_a).eq_u64[0] == (_qword_b).eq_u64[0])
488
489 #define EFX_QWORD_IS_EQUAL32(_qword_a, _qword_b)                        \
490         ((_qword_a).eq_u32[0] == (_qword_b).eq_u32[0] &&                \
491             (_qword_a).eq_u32[1] == (_qword_b).eq_u32[1])
492
493 #define EFX_DWORD_IS_EQUAL(_dword_a, _dword_b)                          \
494         ((_dword_a).ed_u32[0] == (_dword_b).ed_u32[0])
495
496 #define EFX_WORD_IS_EQUAL(_word_a, _word_b)                             \
497         ((_word_a).ew_u16[0] == (_word_b).ew_u16[0])
498
499 #define EFX_BYTE_IS_EQUAL(_byte_a, _byte_b)                             \
500         ((_byte_a).eb_u8[0] == (_byte_b).eb_u8[0])
501
502
503 #define EFX_OWORD_IS_ZERO64(_oword)                                     \
504         (((_oword).eo_u64[0] |                                          \
505             (_oword).eo_u64[1]) == 0)
506
507 #define EFX_OWORD_IS_ZERO32(_oword)                                     \
508         (((_oword).eo_u32[0] |                                          \
509             (_oword).eo_u32[1] |                                        \
510             (_oword).eo_u32[2] |                                        \
511             (_oword).eo_u32[3]) == 0)
512
513 #define EFX_QWORD_IS_ZERO64(_qword)                                     \
514         (((_qword).eq_u64[0]) == 0)
515
516 #define EFX_QWORD_IS_ZERO32(_qword)                                     \
517         (((_qword).eq_u32[0] |                                          \
518             (_qword).eq_u32[1]) == 0)
519
520 #define EFX_DWORD_IS_ZERO(_dword)                                       \
521         (((_dword).ed_u32[0]) == 0)
522
523 #define EFX_WORD_IS_ZERO(_word)                                         \
524         (((_word).ew_u16[0]) == 0)
525
526 #define EFX_BYTE_IS_ZERO(_byte)                                         \
527         (((_byte).eb_u8[0]) == 0)
528
529
530 #define EFX_OWORD_IS_SET64(_oword)                                      \
531         (((_oword).eo_u64[0] &                                          \
532             (_oword).eo_u64[1]) == ~((uint64_t)0))
533
534 #define EFX_OWORD_IS_SET32(_oword)                                      \
535         (((_oword).eo_u32[0] &                                          \
536             (_oword).eo_u32[1] &                                        \
537             (_oword).eo_u32[2] &                                        \
538             (_oword).eo_u32[3]) == ~((uint32_t)0))
539
540 #define EFX_QWORD_IS_SET64(_qword)                                      \
541         (((_qword).eq_u64[0]) == ~((uint64_t)0))
542
543 #define EFX_QWORD_IS_SET32(_qword)                                      \
544         (((_qword).eq_u32[0] &                                          \
545             (_qword).eq_u32[1]) == ~((uint32_t)0))
546
547 #define EFX_DWORD_IS_SET(_dword)                                        \
548         ((_dword).ed_u32[0] == ~((uint32_t)0))
549
550 #define EFX_WORD_IS_SET(_word)                                          \
551         ((_word).ew_u16[0] == ~((uint16_t)0))
552
553 #define EFX_BYTE_IS_SET(_byte)                                          \
554         ((_byte).eb_u8[0] == ~((uint8_t)0))
555
556 /*
557  * Construct bit field portion
558  *
559  * Creates the portion of the bit field [low,high) that lies within
560  * the range [min,max).
561  */
562
563 #define EFX_INSERT_NATIVE64(_min, _max, _low, _high, _value)            \
564         (((_low > _max) || (_high < _min)) ?                            \
565                 0U :                                                    \
566                 ((_low > _min) ?                                        \
567                         (((uint64_t)(_value)) << (_low - _min)) :       \
568                         (((uint64_t)(_value)) >> (_min - _low))))
569
570 #define EFX_INSERT_NATIVE32(_min, _max, _low, _high, _value)            \
571         (((_low > _max) || (_high < _min)) ?                            \
572                 0U :                                                    \
573                 ((_low > _min) ?                                        \
574                         (((uint32_t)(_value)) << (_low - _min)) :       \
575                         (((uint32_t)(_value)) >> (_min - _low))))
576
577 #define EFX_INSERT_NATIVE16(_min, _max, _low, _high, _value)            \
578         (((_low > _max) || (_high < _min)) ?                            \
579                 0U :                                                    \
580                 (uint16_t)((_low > _min) ?                              \
581                                 ((_value) << (_low - _min)) :           \
582                                 ((_value) >> (_min - _low))))
583
584 #define EFX_INSERT_NATIVE8(_min, _max, _low, _high, _value)             \
585         (((_low > _max) || (_high < _min)) ?                            \
586                 0U :                                                    \
587                 (uint8_t)((_low > _min) ?                               \
588                                 ((_value) << (_low - _min)) :   \
589                                 ((_value) >> (_min - _low))))
590
591 /*
592  * Construct bit field portion
593  *
594  * Creates the portion of the named bit field that lies within the
595  * range [min,max).
596  */
597 #define EFX_INSERT_FIELD_NATIVE64(_min, _max, _field, _value)           \
598         EFX_INSERT_NATIVE64(_min, _max, EFX_LOW_BIT(_field),            \
599             EFX_HIGH_BIT(_field), _value)
600
601 #define EFX_INSERT_FIELD_NATIVE32(_min, _max, _field, _value)           \
602         EFX_INSERT_NATIVE32(_min, _max, EFX_LOW_BIT(_field),            \
603             EFX_HIGH_BIT(_field), _value)
604
605 #define EFX_INSERT_FIELD_NATIVE16(_min, _max, _field, _value)           \
606         EFX_INSERT_NATIVE16(_min, _max, EFX_LOW_BIT(_field),            \
607             EFX_HIGH_BIT(_field), _value)
608
609 #define EFX_INSERT_FIELD_NATIVE8(_min, _max, _field, _value)            \
610         EFX_INSERT_NATIVE8(_min, _max, EFX_LOW_BIT(_field),             \
611             EFX_HIGH_BIT(_field), _value)
612
613 /*
614  * Construct bit field
615  *
616  * Creates the portion of the named bit fields that lie within the
617  * range [min,max).
618  */
619 #define EFX_INSERT_FIELDS64(_min, _max,                                 \
620             _field1, _value1, _field2, _value2, _field3, _value3,       \
621             _field4, _value4, _field5, _value5, _field6, _value6,       \
622             _field7, _value7, _field8, _value8, _field9, _value9,       \
623             _field10, _value10)                                         \
624         __CPU_TO_LE_64(                                                 \
625             EFX_INSERT_FIELD_NATIVE64(_min, _max, _field1, _value1) |   \
626             EFX_INSERT_FIELD_NATIVE64(_min, _max, _field2, _value2) |   \
627             EFX_INSERT_FIELD_NATIVE64(_min, _max, _field3, _value3) |   \
628             EFX_INSERT_FIELD_NATIVE64(_min, _max, _field4, _value4) |   \
629             EFX_INSERT_FIELD_NATIVE64(_min, _max, _field5, _value5) |   \
630             EFX_INSERT_FIELD_NATIVE64(_min, _max, _field6, _value6) |   \
631             EFX_INSERT_FIELD_NATIVE64(_min, _max, _field7, _value7) |   \
632             EFX_INSERT_FIELD_NATIVE64(_min, _max, _field8, _value8) |   \
633             EFX_INSERT_FIELD_NATIVE64(_min, _max, _field9, _value9) |   \
634             EFX_INSERT_FIELD_NATIVE64(_min, _max, _field10, _value10))
635
636 #define EFX_INSERT_FIELDS32(_min, _max,                                 \
637             _field1, _value1, _field2, _value2, _field3, _value3,       \
638             _field4, _value4, _field5, _value5, _field6, _value6,       \
639             _field7, _value7, _field8, _value8, _field9, _value9,       \
640             _field10, _value10)                                         \
641         __CPU_TO_LE_32(                                                 \
642             EFX_INSERT_FIELD_NATIVE32(_min, _max, _field1, _value1) |   \
643             EFX_INSERT_FIELD_NATIVE32(_min, _max, _field2, _value2) |   \
644             EFX_INSERT_FIELD_NATIVE32(_min, _max, _field3, _value3) |   \
645             EFX_INSERT_FIELD_NATIVE32(_min, _max, _field4, _value4) |   \
646             EFX_INSERT_FIELD_NATIVE32(_min, _max, _field5, _value5) |   \
647             EFX_INSERT_FIELD_NATIVE32(_min, _max, _field6, _value6) |   \
648             EFX_INSERT_FIELD_NATIVE32(_min, _max, _field7, _value7) |   \
649             EFX_INSERT_FIELD_NATIVE32(_min, _max, _field8, _value8) |   \
650             EFX_INSERT_FIELD_NATIVE32(_min, _max, _field9, _value9) |   \
651             EFX_INSERT_FIELD_NATIVE32(_min, _max, _field10, _value10))
652
653 #define EFX_INSERT_FIELDS16(_min, _max,                                 \
654             _field1, _value1, _field2, _value2, _field3, _value3,       \
655             _field4, _value4, _field5, _value5, _field6, _value6,       \
656             _field7, _value7, _field8, _value8, _field9, _value9,       \
657             _field10, _value10)                                         \
658         __CPU_TO_LE_16(                                                 \
659             EFX_INSERT_FIELD_NATIVE16(_min, _max, _field1, _value1) |   \
660             EFX_INSERT_FIELD_NATIVE16(_min, _max, _field2, _value2) |   \
661             EFX_INSERT_FIELD_NATIVE16(_min, _max, _field3, _value3) |   \
662             EFX_INSERT_FIELD_NATIVE16(_min, _max, _field4, _value4) |   \
663             EFX_INSERT_FIELD_NATIVE16(_min, _max, _field5, _value5) |   \
664             EFX_INSERT_FIELD_NATIVE16(_min, _max, _field6, _value6) |   \
665             EFX_INSERT_FIELD_NATIVE16(_min, _max, _field7, _value7) |   \
666             EFX_INSERT_FIELD_NATIVE16(_min, _max, _field8, _value8) |   \
667             EFX_INSERT_FIELD_NATIVE16(_min, _max, _field9, _value9) |   \
668             EFX_INSERT_FIELD_NATIVE16(_min, _max, _field10, _value10))
669
670 #define EFX_INSERT_FIELDS8(_min, _max,                                  \
671             _field1, _value1, _field2, _value2, _field3, _value3,       \
672             _field4, _value4, _field5, _value5, _field6, _value6,       \
673             _field7, _value7, _field8, _value8, _field9, _value9,       \
674             _field10, _value10)                                         \
675         __NATIVE_8(                                                     \
676             EFX_INSERT_FIELD_NATIVE8(_min, _max, _field1, _value1) |    \
677             EFX_INSERT_FIELD_NATIVE8(_min, _max, _field2, _value2) |    \
678             EFX_INSERT_FIELD_NATIVE8(_min, _max, _field3, _value3) |    \
679             EFX_INSERT_FIELD_NATIVE8(_min, _max, _field4, _value4) |    \
680             EFX_INSERT_FIELD_NATIVE8(_min, _max, _field5, _value5) |    \
681             EFX_INSERT_FIELD_NATIVE8(_min, _max, _field6, _value6) |    \
682             EFX_INSERT_FIELD_NATIVE8(_min, _max, _field7, _value7) |    \
683             EFX_INSERT_FIELD_NATIVE8(_min, _max, _field8, _value8) |    \
684             EFX_INSERT_FIELD_NATIVE8(_min, _max, _field9, _value9) |    \
685             EFX_INSERT_FIELD_NATIVE8(_min, _max, _field10, _value10))
686
687 #define EFX_POPULATE_OWORD64(_oword,                                    \
688             _field1, _value1, _field2, _value2, _field3, _value3,       \
689             _field4, _value4, _field5, _value5, _field6, _value6,       \
690             _field7, _value7, _field8, _value8, _field9, _value9,       \
691             _field10, _value10)                                         \
692         do {                                                            \
693                 _NOTE(CONSTANTCONDITION)                                \
694                 (_oword).eo_u64[0] = EFX_INSERT_FIELDS64(0, 63,         \
695                     _field1, _value1, _field2, _value2,                 \
696                     _field3, _value3, _field4, _value4,                 \
697                     _field5, _value5, _field6, _value6,                 \
698                     _field7, _value7, _field8, _value8,                 \
699                     _field9, _value9, _field10, _value10);              \
700                 _NOTE(CONSTANTCONDITION)                                \
701                 (_oword).eo_u64[1] = EFX_INSERT_FIELDS64(64, 127,       \
702                     _field1, _value1, _field2, _value2,                 \
703                     _field3, _value3, _field4, _value4,                 \
704                     _field5, _value5, _field6, _value6,                 \
705                     _field7, _value7, _field8, _value8,                 \
706                     _field9, _value9, _field10, _value10);              \
707         _NOTE(CONSTANTCONDITION)                                        \
708         } while (B_FALSE)
709
710 #define EFX_POPULATE_OWORD32(_oword,                                    \
711             _field1, _value1, _field2, _value2, _field3, _value3,       \
712             _field4, _value4, _field5, _value5, _field6, _value6,       \
713             _field7, _value7, _field8, _value8, _field9, _value9,       \
714             _field10, _value10)                                         \
715         do {                                                            \
716                 _NOTE(CONSTANTCONDITION)                                \
717                 (_oword).eo_u32[0] = EFX_INSERT_FIELDS32(0, 31,         \
718                     _field1, _value1, _field2, _value2,                 \
719                     _field3, _value3, _field4, _value4,                 \
720                     _field5, _value5, _field6, _value6,                 \
721                     _field7, _value7, _field8, _value8,                 \
722                     _field9, _value9, _field10, _value10);              \
723                 _NOTE(CONSTANTCONDITION)                                \
724                 (_oword).eo_u32[1] = EFX_INSERT_FIELDS32(32, 63,        \
725                     _field1, _value1, _field2, _value2,                 \
726                     _field3, _value3, _field4, _value4,                 \
727                     _field5, _value5, _field6, _value6,                 \
728                     _field7, _value7, _field8, _value8,                 \
729                     _field9, _value9, _field10, _value10);              \
730                 _NOTE(CONSTANTCONDITION)                                \
731                 (_oword).eo_u32[2] = EFX_INSERT_FIELDS32(64, 95,        \
732                     _field1, _value1, _field2, _value2,                 \
733                     _field3, _value3, _field4, _value4,                 \
734                     _field5, _value5, _field6, _value6,                 \
735                     _field7, _value7, _field8, _value8,                 \
736                     _field9, _value9, _field10, _value10);              \
737                 _NOTE(CONSTANTCONDITION)                                \
738                 (_oword).eo_u32[3] = EFX_INSERT_FIELDS32(96, 127,       \
739                     _field1, _value1, _field2, _value2,                 \
740                     _field3, _value3, _field4, _value4,                 \
741                     _field5, _value5, _field6, _value6,                 \
742                     _field7, _value7, _field8, _value8,                 \
743                     _field9, _value9, _field10, _value10);              \
744         _NOTE(CONSTANTCONDITION)                                        \
745         } while (B_FALSE)
746
747 #define EFX_POPULATE_QWORD64(_qword,                                    \
748             _field1, _value1, _field2, _value2, _field3, _value3,       \
749             _field4, _value4, _field5, _value5, _field6, _value6,       \
750             _field7, _value7, _field8, _value8, _field9, _value9,       \
751             _field10, _value10)                                         \
752         do {                                                            \
753                 _NOTE(CONSTANTCONDITION)                                \
754                 (_qword).eq_u64[0] = EFX_INSERT_FIELDS64(0, 63,         \
755                     _field1, _value1, _field2, _value2,                 \
756                     _field3, _value3, _field4, _value4,                 \
757                     _field5, _value5, _field6, _value6,                 \
758                     _field7, _value7, _field8, _value8,                 \
759                     _field9, _value9, _field10, _value10);              \
760         _NOTE(CONSTANTCONDITION)                                        \
761         } while (B_FALSE)
762
763 #define EFX_POPULATE_QWORD32(_qword,                                    \
764             _field1, _value1, _field2, _value2, _field3, _value3,       \
765             _field4, _value4, _field5, _value5, _field6, _value6,       \
766             _field7, _value7, _field8, _value8, _field9, _value9,       \
767             _field10, _value10)                                         \
768         do {                                                            \
769                 _NOTE(CONSTANTCONDITION)                                \
770                 (_qword).eq_u32[0] = EFX_INSERT_FIELDS32(0, 31,         \
771                     _field1, _value1, _field2, _value2,                 \
772                     _field3, _value3, _field4, _value4,                 \
773                     _field5, _value5, _field6, _value6,                 \
774                     _field7, _value7, _field8, _value8,                 \
775                     _field9, _value9, _field10, _value10);              \
776                 _NOTE(CONSTANTCONDITION)                                \
777                 (_qword).eq_u32[1] = EFX_INSERT_FIELDS32(32, 63,        \
778                     _field1, _value1, _field2, _value2,                 \
779                     _field3, _value3, _field4, _value4,                 \
780                     _field5, _value5, _field6, _value6,                 \
781                     _field7, _value7, _field8, _value8,                 \
782                     _field9, _value9, _field10, _value10);              \
783         _NOTE(CONSTANTCONDITION)                                        \
784         } while (B_FALSE)
785
786 #define EFX_POPULATE_DWORD(_dword,                                      \
787             _field1, _value1, _field2, _value2, _field3, _value3,       \
788             _field4, _value4, _field5, _value5, _field6, _value6,       \
789             _field7, _value7, _field8, _value8, _field9, _value9,       \
790             _field10, _value10)                                         \
791         do {                                                            \
792                 _NOTE(CONSTANTCONDITION)                                \
793                 (_dword).ed_u32[0] = EFX_INSERT_FIELDS32(0, 31,         \
794                     _field1, _value1, _field2, _value2,                 \
795                     _field3, _value3, _field4, _value4,                 \
796                     _field5, _value5, _field6, _value6,                 \
797                     _field7, _value7, _field8, _value8,                 \
798                     _field9, _value9, _field10, _value10);              \
799         _NOTE(CONSTANTCONDITION)                                        \
800         } while (B_FALSE)
801
802 #define EFX_POPULATE_WORD(_word,                                        \
803             _field1, _value1, _field2, _value2, _field3, _value3,       \
804             _field4, _value4, _field5, _value5, _field6, _value6,       \
805             _field7, _value7, _field8, _value8, _field9, _value9,       \
806             _field10, _value10)                                         \
807         do {                                                            \
808                 _NOTE(CONSTANTCONDITION)                                \
809                 (_word).ew_u16[0] = EFX_INSERT_FIELDS16(0, 15,          \
810                     _field1, _value1, _field2, _value2,                 \
811                     _field3, _value3, _field4, _value4,                 \
812                     _field5, _value5, _field6, _value6,                 \
813                     _field7, _value7, _field8, _value8,                 \
814                     _field9, _value9, _field10, _value10);              \
815         _NOTE(CONSTANTCONDITION)                                        \
816         } while (B_FALSE)
817
818 #define EFX_POPULATE_BYTE(_byte,                                        \
819             _field1, _value1, _field2, _value2, _field3, _value3,       \
820             _field4, _value4, _field5, _value5, _field6, _value6,       \
821             _field7, _value7, _field8, _value8, _field9, _value9,       \
822             _field10, _value10)                                         \
823         do {                                                            \
824                 _NOTE(CONSTANTCONDITION)                                \
825                 (_byte).eb_u8[0] = EFX_INSERT_FIELDS8(0, 7,             \
826                     _field1, _value1, _field2, _value2,                 \
827                     _field3, _value3, _field4, _value4,                 \
828                     _field5, _value5, _field6, _value6,                 \
829                     _field7, _value7, _field8, _value8,                 \
830                     _field9, _value9, _field10, _value10);              \
831         _NOTE(CONSTANTCONDITION)                                        \
832         } while (B_FALSE)
833
834 /* Populate an octword field with various numbers of arguments */
835 #define EFX_POPULATE_OWORD_10 EFX_POPULATE_OWORD
836
837 #define EFX_POPULATE_OWORD_9(_oword,                                    \
838             _field1, _value1, _field2, _value2, _field3, _value3,       \
839             _field4, _value4, _field5, _value5, _field6, _value6,       \
840             _field7, _value7, _field8, _value8, _field9, _value9)       \
841         EFX_POPULATE_OWORD_10(_oword, EFX_DUMMY_FIELD, 0,               \
842             _field1, _value1, _field2, _value2, _field3, _value3,       \
843             _field4, _value4, _field5, _value5, _field6, _value6,       \
844             _field7, _value7, _field8, _value8, _field9, _value9)
845
846 #define EFX_POPULATE_OWORD_8(_oword,                                    \
847             _field1, _value1, _field2, _value2, _field3, _value3,       \
848             _field4, _value4, _field5, _value5, _field6, _value6,       \
849             _field7, _value7, _field8, _value8)                         \
850         EFX_POPULATE_OWORD_9(_oword, EFX_DUMMY_FIELD, 0,                \
851             _field1, _value1, _field2, _value2, _field3, _value3,       \
852             _field4, _value4, _field5, _value5, _field6, _value6,       \
853             _field7, _value7, _field8, _value8)
854
855 #define EFX_POPULATE_OWORD_7(_oword,                                    \
856             _field1, _value1, _field2, _value2, _field3, _value3,       \
857             _field4, _value4, _field5, _value5, _field6, _value6,       \
858             _field7, _value7)                                           \
859         EFX_POPULATE_OWORD_8(_oword, EFX_DUMMY_FIELD, 0,                \
860             _field1, _value1, _field2, _value2, _field3, _value3,       \
861             _field4, _value4, _field5, _value5, _field6, _value6,       \
862             _field7, _value7)
863
864 #define EFX_POPULATE_OWORD_6(_oword,                                    \
865             _field1, _value1, _field2, _value2, _field3, _value3,       \
866             _field4, _value4, _field5, _value5, _field6, _value6)       \
867         EFX_POPULATE_OWORD_7(_oword, EFX_DUMMY_FIELD, 0,                \
868             _field1, _value1, _field2, _value2, _field3, _value3,       \
869             _field4, _value4, _field5, _value5, _field6, _value6)
870
871 #define EFX_POPULATE_OWORD_5(_oword,                                    \
872             _field1, _value1, _field2, _value2, _field3, _value3,       \
873             _field4, _value4, _field5, _value5)                         \
874         EFX_POPULATE_OWORD_6(_oword, EFX_DUMMY_FIELD, 0,                \
875             _field1, _value1, _field2, _value2, _field3, _value3,       \
876             _field4, _value4, _field5, _value5)
877
878 #define EFX_POPULATE_OWORD_4(_oword,                                    \
879             _field1, _value1, _field2, _value2, _field3, _value3,       \
880             _field4, _value4)                                           \
881         EFX_POPULATE_OWORD_5(_oword, EFX_DUMMY_FIELD, 0,                \
882             _field1, _value1, _field2, _value2, _field3, _value3,       \
883             _field4, _value4)
884
885 #define EFX_POPULATE_OWORD_3(_oword,                                    \
886             _field1, _value1, _field2, _value2, _field3, _value3)       \
887         EFX_POPULATE_OWORD_4(_oword, EFX_DUMMY_FIELD, 0,                \
888             _field1, _value1, _field2, _value2, _field3, _value3)
889
890 #define EFX_POPULATE_OWORD_2(_oword,                                    \
891             _field1, _value1, _field2, _value2)                         \
892         EFX_POPULATE_OWORD_3(_oword, EFX_DUMMY_FIELD, 0,                \
893             _field1, _value1, _field2, _value2)
894
895 #define EFX_POPULATE_OWORD_1(_oword,                                    \
896             _field1, _value1)                                           \
897         EFX_POPULATE_OWORD_2(_oword, EFX_DUMMY_FIELD, 0,                \
898             _field1, _value1)
899
900 #define EFX_ZERO_OWORD(_oword)                                          \
901         EFX_POPULATE_OWORD_1(_oword, EFX_DUMMY_FIELD, 0)
902
903 #define EFX_SET_OWORD(_oword)                                           \
904         EFX_POPULATE_OWORD_4(_oword,                                    \
905             EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff,           \
906             EFX_DWORD_2, 0xffffffff, EFX_DWORD_3, 0xffffffff)
907
908 /* Populate a quadword field with various numbers of arguments */
909 #define EFX_POPULATE_QWORD_10 EFX_POPULATE_QWORD
910
911 #define EFX_POPULATE_QWORD_9(_qword,                                    \
912             _field1, _value1, _field2, _value2, _field3, _value3,       \
913             _field4, _value4, _field5, _value5, _field6, _value6,       \
914             _field7, _value7, _field8, _value8, _field9, _value9)       \
915         EFX_POPULATE_QWORD_10(_qword, EFX_DUMMY_FIELD, 0,               \
916             _field1, _value1, _field2, _value2, _field3, _value3,       \
917             _field4, _value4, _field5, _value5, _field6, _value6,       \
918             _field7, _value7, _field8, _value8, _field9, _value9)
919
920 #define EFX_POPULATE_QWORD_8(_qword,                                    \
921             _field1, _value1, _field2, _value2, _field3, _value3,       \
922             _field4, _value4, _field5, _value5, _field6, _value6,       \
923             _field7, _value7, _field8, _value8)                         \
924         EFX_POPULATE_QWORD_9(_qword, EFX_DUMMY_FIELD, 0,                \
925             _field1, _value1, _field2, _value2, _field3, _value3,       \
926             _field4, _value4, _field5, _value5, _field6, _value6,       \
927             _field7, _value7, _field8, _value8)
928
929 #define EFX_POPULATE_QWORD_7(_qword,                                    \
930             _field1, _value1, _field2, _value2, _field3, _value3,       \
931             _field4, _value4, _field5, _value5, _field6, _value6,       \
932             _field7, _value7)                                           \
933         EFX_POPULATE_QWORD_8(_qword, EFX_DUMMY_FIELD, 0,                \
934             _field1, _value1, _field2, _value2, _field3, _value3,       \
935             _field4, _value4, _field5, _value5, _field6, _value6,       \
936             _field7, _value7)
937
938 #define EFX_POPULATE_QWORD_6(_qword,                                    \
939             _field1, _value1, _field2, _value2, _field3, _value3,       \
940             _field4, _value4, _field5, _value5, _field6, _value6)       \
941         EFX_POPULATE_QWORD_7(_qword, EFX_DUMMY_FIELD, 0,                \
942             _field1, _value1, _field2, _value2, _field3, _value3,       \
943             _field4, _value4, _field5, _value5, _field6, _value6)
944
945 #define EFX_POPULATE_QWORD_5(_qword,                                    \
946             _field1, _value1, _field2, _value2, _field3, _value3,       \
947             _field4, _value4, _field5, _value5)                         \
948         EFX_POPULATE_QWORD_6(_qword, EFX_DUMMY_FIELD, 0,                \
949             _field1, _value1, _field2, _value2, _field3, _value3,       \
950             _field4, _value4, _field5, _value5)
951
952 #define EFX_POPULATE_QWORD_4(_qword,                                    \
953             _field1, _value1, _field2, _value2, _field3, _value3,       \
954             _field4, _value4)                                           \
955         EFX_POPULATE_QWORD_5(_qword, EFX_DUMMY_FIELD, 0,                \
956             _field1, _value1, _field2, _value2, _field3, _value3,       \
957             _field4, _value4)
958
959 #define EFX_POPULATE_QWORD_3(_qword,                                    \
960             _field1, _value1, _field2, _value2, _field3, _value3)       \
961         EFX_POPULATE_QWORD_4(_qword, EFX_DUMMY_FIELD, 0,                \
962             _field1, _value1, _field2, _value2, _field3, _value3)
963
964 #define EFX_POPULATE_QWORD_2(_qword,                                    \
965             _field1, _value1, _field2, _value2)                         \
966         EFX_POPULATE_QWORD_3(_qword, EFX_DUMMY_FIELD, 0,                \
967             _field1, _value1, _field2, _value2)
968
969 #define EFX_POPULATE_QWORD_1(_qword,                                    \
970             _field1, _value1)                                           \
971         EFX_POPULATE_QWORD_2(_qword, EFX_DUMMY_FIELD, 0,                \
972             _field1, _value1)
973
974 #define EFX_ZERO_QWORD(_qword)                                          \
975         EFX_POPULATE_QWORD_1(_qword, EFX_DUMMY_FIELD, 0)
976
977 #define EFX_SET_QWORD(_qword)                                           \
978         EFX_POPULATE_QWORD_2(_qword,                                    \
979             EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff)
980
981 /* Populate a dword field with various numbers of arguments */
982 #define EFX_POPULATE_DWORD_10 EFX_POPULATE_DWORD
983
984 #define EFX_POPULATE_DWORD_9(_dword,                                    \
985             _field1, _value1, _field2, _value2, _field3, _value3,       \
986             _field4, _value4, _field5, _value5, _field6, _value6,       \
987             _field7, _value7, _field8, _value8, _field9, _value9)       \
988         EFX_POPULATE_DWORD_10(_dword, EFX_DUMMY_FIELD, 0,               \
989             _field1, _value1, _field2, _value2, _field3, _value3,       \
990             _field4, _value4, _field5, _value5, _field6, _value6,       \
991             _field7, _value7, _field8, _value8, _field9, _value9)
992
993 #define EFX_POPULATE_DWORD_8(_dword,                                    \
994             _field1, _value1, _field2, _value2, _field3, _value3,       \
995             _field4, _value4, _field5, _value5, _field6, _value6,       \
996             _field7, _value7, _field8, _value8)                         \
997         EFX_POPULATE_DWORD_9(_dword, EFX_DUMMY_FIELD, 0,                \
998             _field1, _value1, _field2, _value2, _field3, _value3,       \
999             _field4, _value4, _field5, _value5, _field6, _value6,       \
1000             _field7, _value7, _field8, _value8)
1001
1002 #define EFX_POPULATE_DWORD_7(_dword,                                    \
1003             _field1, _value1, _field2, _value2, _field3, _value3,       \
1004             _field4, _value4, _field5, _value5, _field6, _value6,       \
1005             _field7, _value7)                                           \
1006         EFX_POPULATE_DWORD_8(_dword, EFX_DUMMY_FIELD, 0,                \
1007             _field1, _value1, _field2, _value2, _field3, _value3,       \
1008             _field4, _value4, _field5, _value5, _field6, _value6,       \
1009             _field7, _value7)
1010
1011 #define EFX_POPULATE_DWORD_6(_dword,                                    \
1012             _field1, _value1, _field2, _value2, _field3, _value3,       \
1013             _field4, _value4, _field5, _value5, _field6, _value6)       \
1014         EFX_POPULATE_DWORD_7(_dword, EFX_DUMMY_FIELD, 0,                \
1015             _field1, _value1, _field2, _value2, _field3, _value3,       \
1016             _field4, _value4, _field5, _value5, _field6, _value6)
1017
1018 #define EFX_POPULATE_DWORD_5(_dword,                                    \
1019             _field1, _value1, _field2, _value2, _field3, _value3,       \
1020             _field4, _value4, _field5, _value5)                         \
1021         EFX_POPULATE_DWORD_6(_dword, EFX_DUMMY_FIELD, 0,                \
1022             _field1, _value1, _field2, _value2, _field3, _value3,       \
1023             _field4, _value4, _field5, _value5)
1024
1025 #define EFX_POPULATE_DWORD_4(_dword,                                    \
1026             _field1, _value1, _field2, _value2, _field3, _value3,       \
1027             _field4, _value4)                                           \
1028         EFX_POPULATE_DWORD_5(_dword, EFX_DUMMY_FIELD, 0,                \
1029             _field1, _value1, _field2, _value2, _field3, _value3,       \
1030             _field4, _value4)
1031
1032 #define EFX_POPULATE_DWORD_3(_dword,                                    \
1033             _field1, _value1, _field2, _value2, _field3, _value3)       \
1034         EFX_POPULATE_DWORD_4(_dword, EFX_DUMMY_FIELD, 0,                \
1035             _field1, _value1, _field2, _value2, _field3, _value3)
1036
1037 #define EFX_POPULATE_DWORD_2(_dword,                                    \
1038             _field1, _value1, _field2, _value2)                         \
1039         EFX_POPULATE_DWORD_3(_dword, EFX_DUMMY_FIELD, 0,                \
1040             _field1, _value1, _field2, _value2)
1041
1042 #define EFX_POPULATE_DWORD_1(_dword,                                    \
1043             _field1, _value1)                                           \
1044         EFX_POPULATE_DWORD_2(_dword, EFX_DUMMY_FIELD, 0,                \
1045             _field1, _value1)
1046
1047 #define EFX_ZERO_DWORD(_dword)                                          \
1048         EFX_POPULATE_DWORD_1(_dword, EFX_DUMMY_FIELD, 0)
1049
1050 #define EFX_SET_DWORD(_dword)                                           \
1051         EFX_POPULATE_DWORD_1(_dword,                                    \
1052             EFX_DWORD_0, 0xffffffff)
1053
1054 /* Populate a word field with various numbers of arguments */
1055 #define EFX_POPULATE_WORD_10 EFX_POPULATE_WORD
1056
1057 #define EFX_POPULATE_WORD_9(_word,                                      \
1058             _field1, _value1, _field2, _value2, _field3, _value3,       \
1059             _field4, _value4, _field5, _value5, _field6, _value6,       \
1060             _field7, _value7, _field8, _value8, _field9, _value9)       \
1061         EFX_POPULATE_WORD_10(_word, EFX_DUMMY_FIELD, 0,                 \
1062             _field1, _value1, _field2, _value2, _field3, _value3,       \
1063             _field4, _value4, _field5, _value5, _field6, _value6,       \
1064             _field7, _value7, _field8, _value8, _field9, _value9)
1065
1066 #define EFX_POPULATE_WORD_8(_word,                                      \
1067             _field1, _value1, _field2, _value2, _field3, _value3,       \
1068             _field4, _value4, _field5, _value5, _field6, _value6,       \
1069             _field7, _value7, _field8, _value8)                         \
1070         EFX_POPULATE_WORD_9(_word, EFX_DUMMY_FIELD, 0,                  \
1071             _field1, _value1, _field2, _value2, _field3, _value3,       \
1072             _field4, _value4, _field5, _value5, _field6, _value6,       \
1073             _field7, _value7, _field8, _value8)
1074
1075 #define EFX_POPULATE_WORD_7(_word,                                      \
1076             _field1, _value1, _field2, _value2, _field3, _value3,       \
1077             _field4, _value4, _field5, _value5, _field6, _value6,       \
1078             _field7, _value7)                                           \
1079         EFX_POPULATE_WORD_8(_word, EFX_DUMMY_FIELD, 0,                  \
1080             _field1, _value1, _field2, _value2, _field3, _value3,       \
1081             _field4, _value4, _field5, _value5, _field6, _value6,       \
1082             _field7, _value7)
1083
1084 #define EFX_POPULATE_WORD_6(_word,                                      \
1085             _field1, _value1, _field2, _value2, _field3, _value3,       \
1086             _field4, _value4, _field5, _value5, _field6, _value6)       \
1087         EFX_POPULATE_WORD_7(_word, EFX_DUMMY_FIELD, 0,                  \
1088             _field1, _value1, _field2, _value2, _field3, _value3,       \
1089             _field4, _value4, _field5, _value5, _field6, _value6)
1090
1091 #define EFX_POPULATE_WORD_5(_word,                                      \
1092             _field1, _value1, _field2, _value2, _field3, _value3,       \
1093             _field4, _value4, _field5, _value5)                         \
1094         EFX_POPULATE_WORD_6(_word, EFX_DUMMY_FIELD, 0,                  \
1095             _field1, _value1, _field2, _value2, _field3, _value3,       \
1096             _field4, _value4, _field5, _value5)
1097
1098 #define EFX_POPULATE_WORD_4(_word,                                      \
1099             _field1, _value1, _field2, _value2, _field3, _value3,       \
1100             _field4, _value4)                                           \
1101         EFX_POPULATE_WORD_5(_word, EFX_DUMMY_FIELD, 0,                  \
1102             _field1, _value1, _field2, _value2, _field3, _value3,       \
1103             _field4, _value4)
1104
1105 #define EFX_POPULATE_WORD_3(_word,                                      \
1106             _field1, _value1, _field2, _value2, _field3, _value3)       \
1107         EFX_POPULATE_WORD_4(_word, EFX_DUMMY_FIELD, 0,                  \
1108             _field1, _value1, _field2, _value2, _field3, _value3)
1109
1110 #define EFX_POPULATE_WORD_2(_word,                                      \
1111             _field1, _value1, _field2, _value2)                         \
1112         EFX_POPULATE_WORD_3(_word, EFX_DUMMY_FIELD, 0,                  \
1113             _field1, _value1, _field2, _value2)
1114
1115 #define EFX_POPULATE_WORD_1(_word,                                      \
1116             _field1, _value1)                                           \
1117         EFX_POPULATE_WORD_2(_word, EFX_DUMMY_FIELD, 0,                  \
1118             _field1, _value1)
1119
1120 #define EFX_ZERO_WORD(_word)                                            \
1121         EFX_POPULATE_WORD_1(_word, EFX_DUMMY_FIELD, 0)
1122
1123 #define EFX_SET_WORD(_word)                                             \
1124         EFX_POPULATE_WORD_1(_word,                                      \
1125             EFX_WORD_0, 0xffff)
1126
1127 /* Populate a byte field with various numbers of arguments */
1128 #define EFX_POPULATE_BYTE_10 EFX_POPULATE_BYTE
1129
1130 #define EFX_POPULATE_BYTE_9(_byte,                                      \
1131             _field1, _value1, _field2, _value2, _field3, _value3,       \
1132             _field4, _value4, _field5, _value5, _field6, _value6,       \
1133             _field7, _value7, _field8, _value8, _field9, _value9)       \
1134         EFX_POPULATE_BYTE_10(_byte, EFX_DUMMY_FIELD, 0,                 \
1135             _field1, _value1, _field2, _value2, _field3, _value3,       \
1136             _field4, _value4, _field5, _value5, _field6, _value6,       \
1137             _field7, _value7, _field8, _value8, _field9, _value9)
1138
1139 #define EFX_POPULATE_BYTE_8(_byte,                                      \
1140             _field1, _value1, _field2, _value2, _field3, _value3,       \
1141             _field4, _value4, _field5, _value5, _field6, _value6,       \
1142             _field7, _value7, _field8, _value8)                         \
1143         EFX_POPULATE_BYTE_9(_byte, EFX_DUMMY_FIELD, 0,                  \
1144             _field1, _value1, _field2, _value2, _field3, _value3,       \
1145             _field4, _value4, _field5, _value5, _field6, _value6,       \
1146             _field7, _value7, _field8, _value8)
1147
1148 #define EFX_POPULATE_BYTE_7(_byte,                                      \
1149             _field1, _value1, _field2, _value2, _field3, _value3,       \
1150             _field4, _value4, _field5, _value5, _field6, _value6,       \
1151             _field7, _value7)                                           \
1152         EFX_POPULATE_BYTE_8(_byte, EFX_DUMMY_FIELD, 0,                  \
1153             _field1, _value1, _field2, _value2, _field3, _value3,       \
1154             _field4, _value4, _field5, _value5, _field6, _value6,       \
1155             _field7, _value7)
1156
1157 #define EFX_POPULATE_BYTE_6(_byte,                                      \
1158             _field1, _value1, _field2, _value2, _field3, _value3,       \
1159             _field4, _value4, _field5, _value5, _field6, _value6)       \
1160         EFX_POPULATE_BYTE_7(_byte, EFX_DUMMY_FIELD, 0,                  \
1161             _field1, _value1, _field2, _value2, _field3, _value3,       \
1162             _field4, _value4, _field5, _value5, _field6, _value6)
1163
1164 #define EFX_POPULATE_BYTE_5(_byte,                                      \
1165             _field1, _value1, _field2, _value2, _field3, _value3,       \
1166             _field4, _value4, _field5, _value5)                         \
1167         EFX_POPULATE_BYTE_6(_byte, EFX_DUMMY_FIELD, 0,                  \
1168             _field1, _value1, _field2, _value2, _field3, _value3,       \
1169             _field4, _value4, _field5, _value5)
1170
1171 #define EFX_POPULATE_BYTE_4(_byte,                                      \
1172             _field1, _value1, _field2, _value2, _field3, _value3,       \
1173             _field4, _value4)                                           \
1174         EFX_POPULATE_BYTE_5(_byte, EFX_DUMMY_FIELD, 0,                  \
1175             _field1, _value1, _field2, _value2, _field3, _value3,       \
1176             _field4, _value4)
1177
1178 #define EFX_POPULATE_BYTE_3(_byte,                                      \
1179             _field1, _value1, _field2, _value2, _field3, _value3)       \
1180         EFX_POPULATE_BYTE_4(_byte, EFX_DUMMY_FIELD, 0,                  \
1181             _field1, _value1, _field2, _value2, _field3, _value3)
1182
1183 #define EFX_POPULATE_BYTE_2(_byte,                                      \
1184             _field1, _value1, _field2, _value2)                         \
1185         EFX_POPULATE_BYTE_3(_byte, EFX_DUMMY_FIELD, 0,                  \
1186             _field1, _value1, _field2, _value2)
1187
1188 #define EFX_POPULATE_BYTE_1(_byte,                                      \
1189             _field1, _value1)                                           \
1190         EFX_POPULATE_BYTE_2(_byte, EFX_DUMMY_FIELD, 0,                  \
1191             _field1, _value1)
1192
1193 #define EFX_ZERO_BYTE(_byte)                                            \
1194         EFX_POPULATE_BYTE_1(_byte, EFX_DUMMY_FIELD, 0)
1195
1196 #define EFX_SET_BYTE(_byte)                                             \
1197         EFX_POPULATE_BYTE_1(_byte,                                      \
1198             EFX_BYTE_0, 0xff)
1199
1200 /*
1201  * Modify a named field within an already-populated structure.  Used
1202  * for read-modify-write operations.
1203  */
1204
1205 #define EFX_INSERT_FIELD64(_min, _max, _field, _value)                  \
1206         __CPU_TO_LE_64(EFX_INSERT_FIELD_NATIVE64(_min, _max, _field, _value))
1207
1208 #define EFX_INSERT_FIELD32(_min, _max, _field, _value)                  \
1209         __CPU_TO_LE_32(EFX_INSERT_FIELD_NATIVE32(_min, _max, _field, _value))
1210
1211 #define EFX_INSERT_FIELD16(_min, _max, _field, _value)                  \
1212         __CPU_TO_LE_16(EFX_INSERT_FIELD_NATIVE16(_min, _max, _field, _value))
1213
1214 #define EFX_INSERT_FIELD8(_min, _max, _field, _value)                   \
1215         __NATIVE_8(EFX_INSERT_FIELD_NATIVE8(_min, _max, _field, _value))
1216
1217 #define EFX_INPLACE_MASK64(_min, _max, _field)                          \
1218         EFX_INSERT_FIELD64(_min, _max, _field, EFX_MASK64(_field))
1219
1220 #define EFX_INPLACE_MASK32(_min, _max, _field)                          \
1221         EFX_INSERT_FIELD32(_min, _max, _field, EFX_MASK32(_field))
1222
1223 #define EFX_INPLACE_MASK16(_min, _max, _field)                          \
1224         EFX_INSERT_FIELD16(_min, _max, _field, EFX_MASK16(_field))
1225
1226 #define EFX_INPLACE_MASK8(_min, _max, _field)                           \
1227         EFX_INSERT_FIELD8(_min, _max, _field, EFX_MASK8(_field))
1228
1229 #define EFX_SET_OWORD_FIELD64(_oword, _field, _value)                   \
1230         do {                                                            \
1231                 _NOTE(CONSTANTCONDITION)                                \
1232                 (_oword).eo_u64[0] = (((_oword).eo_u64[0] &             \
1233                     ~EFX_INPLACE_MASK64(0, 63, _field)) |               \
1234                     EFX_INSERT_FIELD64(0, 63, _field, _value));         \
1235                 _NOTE(CONSTANTCONDITION)                                \
1236                 (_oword).eo_u64[1] = (((_oword).eo_u64[1] &             \
1237                     ~EFX_INPLACE_MASK64(64, 127, _field)) |             \
1238                     EFX_INSERT_FIELD64(64, 127, _field, _value));       \
1239         _NOTE(CONSTANTCONDITION)                                        \
1240         } while (B_FALSE)
1241
1242 #define EFX_SET_OWORD_FIELD32(_oword, _field, _value)                   \
1243         do {                                                            \
1244                 _NOTE(CONSTANTCONDITION)                                \
1245                 (_oword).eo_u32[0] = (((_oword).eo_u32[0] &             \
1246                     ~EFX_INPLACE_MASK32(0, 31, _field)) |               \
1247                     EFX_INSERT_FIELD32(0, 31, _field, _value));         \
1248                 _NOTE(CONSTANTCONDITION)                                \
1249                 (_oword).eo_u32[1] = (((_oword).eo_u32[1] &             \
1250                     ~EFX_INPLACE_MASK32(32, 63, _field)) |              \
1251                     EFX_INSERT_FIELD32(32, 63, _field, _value));        \
1252                 _NOTE(CONSTANTCONDITION)                                \
1253                 (_oword).eo_u32[2] = (((_oword).eo_u32[2] &             \
1254                     ~EFX_INPLACE_MASK32(64, 95, _field)) |              \
1255                     EFX_INSERT_FIELD32(64, 95, _field, _value));        \
1256                 _NOTE(CONSTANTCONDITION)                                \
1257                 (_oword).eo_u32[3] = (((_oword).eo_u32[3] &             \
1258                     ~EFX_INPLACE_MASK32(96, 127, _field)) |             \
1259                     EFX_INSERT_FIELD32(96, 127, _field, _value));       \
1260         _NOTE(CONSTANTCONDITION)                                        \
1261         } while (B_FALSE)
1262
1263 #define EFX_SET_QWORD_FIELD64(_qword, _field, _value)                   \
1264         do {                                                            \
1265                 _NOTE(CONSTANTCONDITION)                                \
1266                 (_qword).eq_u64[0] = (((_qword).eq_u64[0] &             \
1267                     ~EFX_INPLACE_MASK64(0, 63, _field)) |               \
1268                     EFX_INSERT_FIELD64(0, 63, _field, _value));         \
1269         _NOTE(CONSTANTCONDITION)                                        \
1270         } while (B_FALSE)
1271
1272 #define EFX_SET_QWORD_FIELD32(_qword, _field, _value)                   \
1273         do {                                                            \
1274                 _NOTE(CONSTANTCONDITION)                                \
1275                 (_qword).eq_u32[0] = (((_qword).eq_u32[0] &             \
1276                     ~EFX_INPLACE_MASK32(0, 31, _field)) |               \
1277                     EFX_INSERT_FIELD32(0, 31, _field, _value));         \
1278                 _NOTE(CONSTANTCONDITION)                                \
1279                 (_qword).eq_u32[1] = (((_qword).eq_u32[1] &             \
1280                     ~EFX_INPLACE_MASK32(32, 63, _field)) |              \
1281                     EFX_INSERT_FIELD32(32, 63, _field, _value));        \
1282         _NOTE(CONSTANTCONDITION)                                        \
1283         } while (B_FALSE)
1284
1285 #define EFX_SET_DWORD_FIELD(_dword, _field, _value)                     \
1286         do {                                                            \
1287                 _NOTE(CONSTANTCONDITION)                                \
1288                 (_dword).ed_u32[0] = (((_dword).ed_u32[0] &             \
1289                     ~EFX_INPLACE_MASK32(0, 31, _field)) |               \
1290                     EFX_INSERT_FIELD32(0, 31, _field, _value));         \
1291         _NOTE(CONSTANTCONDITION)                                        \
1292         } while (B_FALSE)
1293
1294 #define EFX_SET_WORD_FIELD(_word, _field, _value)                       \
1295         do {                                                            \
1296                 _NOTE(CONSTANTCONDITION)                                \
1297                 (_word).ew_u16[0] = (((_word).ew_u16[0] &               \
1298                     ~EFX_INPLACE_MASK16(0, 15, _field)) |               \
1299                     EFX_INSERT_FIELD16(0, 15, _field, _value));         \
1300         _NOTE(CONSTANTCONDITION)                                        \
1301         } while (B_FALSE)
1302
1303 #define EFX_SET_BYTE_FIELD(_byte, _field, _value)                       \
1304         do {                                                            \
1305                 _NOTE(CONSTANTCONDITION)                                \
1306                 (_byte).eb_u8[0] = (((_byte).eb_u8[0] &                 \
1307                     ~EFX_INPLACE_MASK8(0, 7, _field)) |                 \
1308                     EFX_INSERT_FIELD8(0, 7, _field, _value));           \
1309         _NOTE(CONSTANTCONDITION)                                        \
1310         } while (B_FALSE)
1311
1312 /*
1313  * Set or clear a numbered bit within an octword.
1314  */
1315
1316 #define EFX_SHIFT64(_bit, _base)                                        \
1317         (((_bit) >= (_base) && (_bit) < (_base) + 64) ?                 \
1318                 ((uint64_t)1 << ((_bit) - (_base))) :                   \
1319                 0U)
1320
1321 #define EFX_SHIFT32(_bit, _base)                                        \
1322         (((_bit) >= (_base) && (_bit) < (_base) + 32) ?                 \
1323                 ((uint32_t)1 << ((_bit) - (_base))) :                   \
1324                 0U)
1325
1326 #define EFX_SHIFT16(_bit, _base)                                        \
1327         (((_bit) >= (_base) && (_bit) < (_base) + 16) ?                 \
1328                 (uint16_t)(1 << ((_bit) - (_base))) :                   \
1329                 0U)
1330
1331 #define EFX_SHIFT8(_bit, _base)                                         \
1332         (((_bit) >= (_base) && (_bit) < (_base) + 8) ?                  \
1333                 (uint8_t)(1 << ((_bit) - (_base))) :                    \
1334                 0U)
1335
1336 #define EFX_SET_OWORD_BIT64(_oword, _bit)                               \
1337         do {                                                            \
1338                 _NOTE(CONSTANTCONDITION)                                \
1339                 (_oword).eo_u64[0] |=                                   \
1340                     __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)));     \
1341                 (_oword).eo_u64[1] |=                                   \
1342                     __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)));    \
1343         _NOTE(CONSTANTCONDITION)                                        \
1344         } while (B_FALSE)
1345
1346 #define EFX_SET_OWORD_BIT32(_oword, _bit)                               \
1347         do {                                                            \
1348                 _NOTE(CONSTANTCONDITION)                                \
1349                 (_oword).eo_u32[0] |=                                   \
1350                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)));     \
1351                 (_oword).eo_u32[1] |=                                   \
1352                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)));    \
1353                 (_oword).eo_u32[2] |=                                   \
1354                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)));    \
1355                 (_oword).eo_u32[3] |=                                   \
1356                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)));    \
1357         _NOTE(CONSTANTCONDITION)                                        \
1358         } while (B_FALSE)
1359
1360 #define EFX_CLEAR_OWORD_BIT64(_oword, _bit)                             \
1361         do {                                                            \
1362                 _NOTE(CONSTANTCONDITION)                                \
1363                 (_oword).eo_u64[0] &=                                   \
1364                     __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0)));    \
1365                 (_oword).eo_u64[1] &=                                   \
1366                     __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(64)));   \
1367         _NOTE(CONSTANTCONDITION)                                        \
1368         } while (B_FALSE)
1369
1370 #define EFX_CLEAR_OWORD_BIT32(_oword, _bit)                             \
1371         do {                                                            \
1372                 _NOTE(CONSTANTCONDITION)                                \
1373                 (_oword).eo_u32[0] &=                                   \
1374                     __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0)));    \
1375                 (_oword).eo_u32[1] &=                                   \
1376                     __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32)));   \
1377                 (_oword).eo_u32[2] &=                                   \
1378                     __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(64)));   \
1379                 (_oword).eo_u32[3] &=                                   \
1380                     __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(96)));   \
1381         _NOTE(CONSTANTCONDITION)                                        \
1382         } while (B_FALSE)
1383
1384 #define EFX_TEST_OWORD_BIT64(_oword, _bit)                              \
1385         (((_oword).eo_u64[0] &                                          \
1386                     __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) ||  \
1387         ((_oword).eo_u64[1] &                                           \
1388                     __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)))))
1389
1390 #define EFX_TEST_OWORD_BIT32(_oword, _bit)                              \
1391         (((_oword).eo_u32[0] &                                          \
1392                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) ||  \
1393         ((_oword).eo_u32[1] &                                           \
1394                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))) || \
1395         ((_oword).eo_u32[2] &                                           \
1396                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)))) || \
1397         ((_oword).eo_u32[3] &                                           \
1398                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)))))
1399
1400
1401 #define EFX_SET_QWORD_BIT64(_qword, _bit)                               \
1402         do {                                                            \
1403                 _NOTE(CONSTANTCONDITION)                                \
1404                 (_qword).eq_u64[0] |=                                   \
1405                     __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)));     \
1406         _NOTE(CONSTANTCONDITION)                                        \
1407         } while (B_FALSE)
1408
1409 #define EFX_SET_QWORD_BIT32(_qword, _bit)                               \
1410         do {                                                            \
1411                 _NOTE(CONSTANTCONDITION)                                \
1412                 (_qword).eq_u32[0] |=                                   \
1413                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)));     \
1414                 (_qword).eq_u32[1] |=                                   \
1415                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)));    \
1416         _NOTE(CONSTANTCONDITION)                                        \
1417         } while (B_FALSE)
1418
1419 #define EFX_CLEAR_QWORD_BIT64(_qword, _bit)                             \
1420         do {                                                            \
1421                 _NOTE(CONSTANTCONDITION)                                \
1422                 (_qword).eq_u64[0] &=                                   \
1423                     __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0)));    \
1424         _NOTE(CONSTANTCONDITION)                                        \
1425         } while (B_FALSE)
1426
1427 #define EFX_CLEAR_QWORD_BIT32(_qword, _bit)                             \
1428         do {                                                            \
1429                 _NOTE(CONSTANTCONDITION)                                \
1430                 (_qword).eq_u32[0] &=                                   \
1431                     __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0)));    \
1432                 (_qword).eq_u32[1] &=                                   \
1433                     __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32)));   \
1434         _NOTE(CONSTANTCONDITION)                                        \
1435         } while (B_FALSE)
1436
1437 #define EFX_TEST_QWORD_BIT64(_qword, _bit)                              \
1438         (((_qword).eq_u64[0] &                                          \
1439                     __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) != 0)
1440
1441 #define EFX_TEST_QWORD_BIT32(_qword, _bit)                              \
1442         (((_qword).eq_u32[0] &                                          \
1443                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) ||  \
1444         ((_qword).eq_u32[1] &                                           \
1445                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))))
1446
1447
1448 #define EFX_SET_DWORD_BIT(_dword, _bit)                                 \
1449         do {                                                            \
1450                 (_dword).ed_u32[0] |=                                   \
1451                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)));     \
1452         _NOTE(CONSTANTCONDITION)                                        \
1453         } while (B_FALSE)
1454
1455 #define EFX_CLEAR_DWORD_BIT(_dword, _bit)                               \
1456         do {                                                            \
1457                 (_dword).ed_u32[0] &=                                   \
1458                     __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0)));    \
1459         _NOTE(CONSTANTCONDITION)                                        \
1460         } while (B_FALSE)
1461
1462 #define EFX_TEST_DWORD_BIT(_dword, _bit)                                \
1463         (((_dword).ed_u32[0] &                                          \
1464                     __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) != 0)
1465
1466
1467 #define EFX_SET_WORD_BIT(_word, _bit)                                   \
1468         do {                                                            \
1469                 (_word).ew_u16[0] |=                                    \
1470                     __CPU_TO_LE_16(EFX_SHIFT16(_bit, FIX_LINT(0)));     \
1471         _NOTE(CONSTANTCONDITION)                                        \
1472         } while (B_FALSE)
1473
1474 #define EFX_CLEAR_WORD_BIT(_word, _bit)                                 \
1475         do {                                                            \
1476                 (_word).ew_u32[0] &=                                    \
1477                     __CPU_TO_LE_16(~EFX_SHIFT16(_bit, FIX_LINT(0)));    \
1478         _NOTE(CONSTANTCONDITION)                                        \
1479         } while (B_FALSE)
1480
1481 #define EFX_TEST_WORD_BIT(_word, _bit)                                  \
1482         (((_word).ew_u16[0] &                                           \
1483                     __CPU_TO_LE_16(EFX_SHIFT16(_bit, FIX_LINT(0)))) != 0)
1484
1485
1486 #define EFX_SET_BYTE_BIT(_byte, _bit)                                   \
1487         do {                                                            \
1488                 (_byte).eb_u8[0] |=                                     \
1489                     __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0)));          \
1490         _NOTE(CONSTANTCONDITION)                                        \
1491         } while (B_FALSE)
1492
1493 #define EFX_CLEAR_BYTE_BIT(_byte, _bit)                                 \
1494         do {                                                            \
1495                 (_byte).eb_u8[0] &=                                     \
1496                     __NATIVE_8(~EFX_SHIFT8(_bit, FIX_LINT(0)));         \
1497         _NOTE(CONSTANTCONDITION)                                        \
1498         } while (B_FALSE)
1499
1500 #define EFX_TEST_BYTE_BIT(_byte, _bit)                                  \
1501         (((_byte).eb_u8[0] &                                            \
1502                     __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0)))) != 0)
1503
1504
1505 #define EFX_OR_OWORD64(_oword1, _oword2)                                \
1506         do {                                                            \
1507                 (_oword1).eo_u64[0] |= (_oword2).eo_u64[0];             \
1508                 (_oword1).eo_u64[1] |= (_oword2).eo_u64[1];             \
1509         _NOTE(CONSTANTCONDITION)                                        \
1510         } while (B_FALSE)
1511
1512 #define EFX_OR_OWORD32(_oword1, _oword2)                                \
1513         do {                                                            \
1514                 (_oword1).eo_u32[0] |= (_oword2).eo_u32[0];             \
1515                 (_oword1).eo_u32[1] |= (_oword2).eo_u32[1];             \
1516                 (_oword1).eo_u32[2] |= (_oword2).eo_u32[2];             \
1517                 (_oword1).eo_u32[3] |= (_oword2).eo_u32[3];             \
1518         _NOTE(CONSTANTCONDITION)                                        \
1519         } while (B_FALSE)
1520
1521 #define EFX_AND_OWORD64(_oword1, _oword2)                               \
1522         do {                                                            \
1523                 (_oword1).eo_u64[0] &= (_oword2).eo_u64[0];             \
1524                 (_oword1).eo_u64[1] &= (_oword2).eo_u64[1];             \
1525         _NOTE(CONSTANTCONDITION)                                        \
1526         } while (B_FALSE)
1527
1528 #define EFX_AND_OWORD32(_oword1, _oword2)                               \
1529         do {                                                            \
1530                 (_oword1).eo_u32[0] &= (_oword2).eo_u32[0];             \
1531                 (_oword1).eo_u32[1] &= (_oword2).eo_u32[1];             \
1532                 (_oword1).eo_u32[2] &= (_oword2).eo_u32[2];             \
1533                 (_oword1).eo_u32[3] &= (_oword2).eo_u32[3];             \
1534         _NOTE(CONSTANTCONDITION)                                        \
1535         } while (B_FALSE)
1536
1537 #define EFX_OR_QWORD64(_qword1, _qword2)                                \
1538         do {                                                            \
1539                 (_qword1).eq_u64[0] |= (_qword2).eq_u64[0];             \
1540         _NOTE(CONSTANTCONDITION)                                        \
1541         } while (B_FALSE)
1542
1543 #define EFX_OR_QWORD32(_qword1, _qword2)                                \
1544         do {                                                            \
1545                 (_qword1).eq_u32[0] |= (_qword2).eq_u32[0];             \
1546                 (_qword1).eq_u32[1] |= (_qword2).eq_u32[1];             \
1547         _NOTE(CONSTANTCONDITION)                                        \
1548         } while (B_FALSE)
1549
1550 #define EFX_AND_QWORD64(_qword1, _qword2)                               \
1551         do {                                                            \
1552                 (_qword1).eq_u64[0] &= (_qword2).eq_u64[0];             \
1553         _NOTE(CONSTANTCONDITION)                                        \
1554         } while (B_FALSE)
1555
1556 #define EFX_AND_QWORD32(_qword1, _qword2)                               \
1557         do {                                                            \
1558                 (_qword1).eq_u32[0] &= (_qword2).eq_u32[0];             \
1559                 (_qword1).eq_u32[1] &= (_qword2).eq_u32[1];             \
1560         _NOTE(CONSTANTCONDITION)                                        \
1561         } while (B_FALSE)
1562
1563 #define EFX_OR_DWORD(_dword1, _dword2)                                  \
1564         do {                                                            \
1565                 (_dword1).ed_u32[0] |= (_dword2).ed_u32[0];             \
1566         _NOTE(CONSTANTCONDITION)                                        \
1567         } while (B_FALSE)
1568
1569 #define EFX_AND_DWORD(_dword1, _dword2)                                 \
1570         do {                                                            \
1571                 (_dword1).ed_u32[0] &= (_dword2).ed_u32[0];             \
1572         _NOTE(CONSTANTCONDITION)                                        \
1573         } while (B_FALSE)
1574
1575 #define EFX_OR_WORD(_word1, _word2)                                     \
1576         do {                                                            \
1577                 (_word1).ew_u16[0] |= (_word2).ew_u16[0];               \
1578         _NOTE(CONSTANTCONDITION)                                        \
1579         } while (B_FALSE)
1580
1581 #define EFX_AND_WORD(_word1, _word2)                                    \
1582         do {                                                            \
1583                 (_word1).ew_u16[0] &= (_word2).ew_u16[0];               \
1584         _NOTE(CONSTANTCONDITION)                                        \
1585         } while (B_FALSE)
1586
1587 #define EFX_OR_BYTE(_byte1, _byte2)                                     \
1588         do {                                                            \
1589                 (_byte1).eb_u8[0] |= (_byte2).eb_u8[0];                 \
1590         _NOTE(CONSTANTCONDITION)                                        \
1591         } while (B_FALSE)
1592
1593 #define EFX_AND_BYTE(_byte1, _byte2)                                    \
1594         do {                                                            \
1595                 (_byte1).eb_u8[0] &= (_byte2).eb_u8[0];                 \
1596         _NOTE(CONSTANTCONDITION)                                        \
1597         } while (B_FALSE)
1598
1599 #if EFSYS_USE_UINT64
1600 #define EFX_OWORD_FIELD         EFX_OWORD_FIELD64
1601 #define EFX_QWORD_FIELD         EFX_QWORD_FIELD64
1602 #define EFX_OWORD_IS_EQUAL      EFX_OWORD_IS_EQUAL64
1603 #define EFX_QWORD_IS_EQUAL      EFX_QWORD_IS_EQUAL64
1604 #define EFX_OWORD_IS_ZERO       EFX_OWORD_IS_ZERO64
1605 #define EFX_QWORD_IS_ZERO       EFX_QWORD_IS_ZERO64
1606 #define EFX_OWORD_IS_SET        EFX_OWORD_IS_SET64
1607 #define EFX_QWORD_IS_SET        EFX_QWORD_IS_SET64
1608 #define EFX_POPULATE_OWORD      EFX_POPULATE_OWORD64
1609 #define EFX_POPULATE_QWORD      EFX_POPULATE_QWORD64
1610 #define EFX_SET_OWORD_FIELD     EFX_SET_OWORD_FIELD64
1611 #define EFX_SET_QWORD_FIELD     EFX_SET_QWORD_FIELD64
1612 #define EFX_SET_OWORD_BIT       EFX_SET_OWORD_BIT64
1613 #define EFX_CLEAR_OWORD_BIT     EFX_CLEAR_OWORD_BIT64
1614 #define EFX_TEST_OWORD_BIT      EFX_TEST_OWORD_BIT64
1615 #define EFX_SET_QWORD_BIT       EFX_SET_QWORD_BIT64
1616 #define EFX_CLEAR_QWORD_BIT     EFX_CLEAR_QWORD_BIT64
1617 #define EFX_TEST_QWORD_BIT      EFX_TEST_QWORD_BIT64
1618 #define EFX_OR_OWORD            EFX_OR_OWORD64
1619 #define EFX_AND_OWORD           EFX_AND_OWORD64
1620 #define EFX_OR_QWORD            EFX_OR_QWORD64
1621 #define EFX_AND_QWORD           EFX_AND_QWORD64
1622 #else
1623 #define EFX_OWORD_FIELD         EFX_OWORD_FIELD32
1624 #define EFX_QWORD_FIELD         EFX_QWORD_FIELD32
1625 #define EFX_OWORD_IS_EQUAL      EFX_OWORD_IS_EQUAL32
1626 #define EFX_QWORD_IS_EQUAL      EFX_QWORD_IS_EQUAL32
1627 #define EFX_OWORD_IS_ZERO       EFX_OWORD_IS_ZERO32
1628 #define EFX_QWORD_IS_ZERO       EFX_QWORD_IS_ZERO32
1629 #define EFX_OWORD_IS_SET        EFX_OWORD_IS_SET32
1630 #define EFX_QWORD_IS_SET        EFX_QWORD_IS_SET32
1631 #define EFX_POPULATE_OWORD      EFX_POPULATE_OWORD32
1632 #define EFX_POPULATE_QWORD      EFX_POPULATE_QWORD32
1633 #define EFX_SET_OWORD_FIELD     EFX_SET_OWORD_FIELD32
1634 #define EFX_SET_QWORD_FIELD     EFX_SET_QWORD_FIELD32
1635 #define EFX_SET_OWORD_BIT       EFX_SET_OWORD_BIT32
1636 #define EFX_CLEAR_OWORD_BIT     EFX_CLEAR_OWORD_BIT32
1637 #define EFX_TEST_OWORD_BIT      EFX_TEST_OWORD_BIT32
1638 #define EFX_SET_QWORD_BIT       EFX_SET_QWORD_BIT32
1639 #define EFX_CLEAR_QWORD_BIT     EFX_CLEAR_QWORD_BIT32
1640 #define EFX_TEST_QWORD_BIT      EFX_TEST_QWORD_BIT32
1641 #define EFX_OR_OWORD            EFX_OR_OWORD32
1642 #define EFX_AND_OWORD           EFX_AND_OWORD32
1643 #define EFX_OR_QWORD            EFX_OR_QWORD32
1644 #define EFX_AND_QWORD           EFX_AND_QWORD32
1645 #endif
1646
1647 #ifdef  __cplusplus
1648 }
1649 #endif
1650
1651 #endif  /* _SYS_EFX_TYPES_H */