efx_types.h revision 310926
1/*-
2 * Copyright (c) 2007-2016 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: stable/11/sys/dev/sfxge/common/efx_types.h 310926 2016-12-31 11:07:44Z arybchik $
33 */
34
35#ifndef	_SYS_EFX_TYPES_H
36#define	_SYS_EFX_TYPES_H
37
38#include "efsys.h"
39
40#ifdef	__cplusplus
41extern "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 */
181typedef 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 */
190typedef 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 */
201typedef 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 */
214typedef 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 */
231typedef 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
350extern 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]) == ~((uint64_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