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