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