xref: /freebsd/sys/dev/sfxge/common/efx_types.h (revision 780fb4a2)
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 */
1652