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