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