1227569Sphilip/*-
2284555Sarybchik * Copyright (c) 2007-2015 Solarflare Communications Inc.
3284555Sarybchik * All rights reserved.
4227569Sphilip *
5227569Sphilip * Redistribution and use in source and binary forms, with or without
6284555Sarybchik * modification, are permitted provided that the following conditions are met:
7227569Sphilip *
8284555Sarybchik * 1. Redistributions of source code must retain the above copyright notice,
9284555Sarybchik *    this list of conditions and the following disclaimer.
10284555Sarybchik * 2. Redistributions in binary form must reproduce the above copyright notice,
11284555Sarybchik *    this list of conditions and the following disclaimer in the documentation
12284555Sarybchik *    and/or other materials provided with the distribution.
13227569Sphilip *
14284555Sarybchik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15284555Sarybchik * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16284555Sarybchik * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17284555Sarybchik * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18284555Sarybchik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19284555Sarybchik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20284555Sarybchik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21284555Sarybchik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22284555Sarybchik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23284555Sarybchik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24284555Sarybchik * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25284555Sarybchik *
26284555Sarybchik * The views and conclusions contained in the software and documentation are
27284555Sarybchik * those of the authors and should not be interpreted as representing official
28284555Sarybchik * policies, either expressed or implied, of the FreeBSD Project.
29284555Sarybchik *
30227569Sphilip * Ackowledgement to Fen Systems Ltd.
31228078Sphilip *
32228078Sphilip * $FreeBSD: releng/10.3/sys/dev/sfxge/common/efx_types.h 294018 2016-01-14 16:29:33Z arybchik $
33227569Sphilip */
34227569Sphilip
35227569Sphilip#ifndef	_SYS_EFX_TYPES_H
36227569Sphilip#define	_SYS_EFX_TYPES_H
37227569Sphilip
38227569Sphilip#include "efsys.h"
39227569Sphilip
40227569Sphilip#ifdef	__cplusplus
41227569Sphilipextern "C" {
42227569Sphilip#endif
43227569Sphilip
44227569Sphilip/*
45227569Sphilip * Bitfield access
46227569Sphilip *
47227569Sphilip * Solarflare NICs make extensive use of bitfields up to 128 bits
48227569Sphilip * wide.  Since there is no native 128-bit datatype on most systems,
49227569Sphilip * and since 64-bit datatypes are inefficient on 32-bit systems and
50227569Sphilip * vice versa, we wrap accesses in a way that uses the most efficient
51227569Sphilip * datatype.
52227569Sphilip *
53227569Sphilip * The NICs are PCI devices and therefore little-endian.  Since most
54227569Sphilip * of the quantities that we deal with are DMAed to/from host memory,
55227569Sphilip * we define	our datatypes (efx_oword_t, efx_qword_t and efx_dword_t)
56227569Sphilip * to be little-endian.
57227569Sphilip *
58227569Sphilip * In the less common case of using PIO for individual register
59227569Sphilip * writes, we construct the little-endian datatype in host memory and
60227569Sphilip * then use non-swapping register access primitives, rather than
61227569Sphilip * constructing a native-endian datatype and relying on implicit
62227569Sphilip * byte-swapping.  (We use a similar strategy for register reads.)
63227569Sphilip */
64227569Sphilip
65227569Sphilip/*
66227569Sphilip * NOTE: Field definitions here and elsewhere are done in terms of a lowest
67227569Sphilip *       bit number (LBN) and a width.
68227569Sphilip */
69227569Sphilip
70227569Sphilip#define	EFX_DUMMY_FIELD_LBN 0
71227569Sphilip#define	EFX_DUMMY_FIELD_WIDTH 0
72227569Sphilip
73227569Sphilip#define	EFX_BYTE_0_LBN 0
74227569Sphilip#define	EFX_BYTE_0_WIDTH 8
75227569Sphilip
76227569Sphilip#define	EFX_BYTE_1_LBN 8
77227569Sphilip#define	EFX_BYTE_1_WIDTH 8
78227569Sphilip
79227569Sphilip#define	EFX_BYTE_2_LBN 16
80227569Sphilip#define	EFX_BYTE_2_WIDTH 8
81227569Sphilip
82227569Sphilip#define	EFX_BYTE_3_LBN 24
83227569Sphilip#define	EFX_BYTE_3_WIDTH 8
84227569Sphilip
85227569Sphilip#define	EFX_BYTE_4_LBN 32
86227569Sphilip#define	EFX_BYTE_4_WIDTH 8
87227569Sphilip
88227569Sphilip#define	EFX_BYTE_5_LBN 40
89227569Sphilip#define	EFX_BYTE_5_WIDTH 8
90227569Sphilip
91227569Sphilip#define	EFX_BYTE_6_LBN 48
92227569Sphilip#define	EFX_BYTE_6_WIDTH 8
93227569Sphilip
94227569Sphilip#define	EFX_BYTE_7_LBN 56
95227569Sphilip#define	EFX_BYTE_7_WIDTH 8
96227569Sphilip
97227569Sphilip#define	EFX_WORD_0_LBN 0
98227569Sphilip#define	EFX_WORD_0_WIDTH 16
99227569Sphilip
100227569Sphilip#define	EFX_WORD_1_LBN 16
101227569Sphilip#define	EFX_WORD_1_WIDTH 16
102227569Sphilip
103227569Sphilip#define	EFX_WORD_2_LBN 32
104227569Sphilip#define	EFX_WORD_2_WIDTH 16
105227569Sphilip
106227569Sphilip#define	EFX_WORD_3_LBN 48
107227569Sphilip#define	EFX_WORD_3_WIDTH 16
108227569Sphilip
109227569Sphilip#define	EFX_DWORD_0_LBN 0
110227569Sphilip#define	EFX_DWORD_0_WIDTH 32
111227569Sphilip
112227569Sphilip#define	EFX_DWORD_1_LBN 32
113227569Sphilip#define	EFX_DWORD_1_WIDTH 32
114227569Sphilip
115227569Sphilip#define	EFX_DWORD_2_LBN 64
116227569Sphilip#define	EFX_DWORD_2_WIDTH 32
117227569Sphilip
118227569Sphilip#define	EFX_DWORD_3_LBN 96
119227569Sphilip#define	EFX_DWORD_3_WIDTH 32
120227569Sphilip
121284555Sarybchik/* There are intentionally no EFX_QWORD_0 or EFX_QWORD_1 field definitions
122284555Sarybchik * here as the implementaion of EFX_QWORD_FIELD and EFX_OWORD_FIELD do not
123284555Sarybchik * support field widths larger than 32 bits.
124284555Sarybchik */
125227569Sphilip
126227569Sphilip/* Specified attribute (i.e. LBN ow WIDTH) of the specified field */
127227569Sphilip#define	EFX_VAL(_field, _attribute)					\
128227569Sphilip	_field ## _ ## _attribute
129227569Sphilip
130227569Sphilip/* Lowest bit number of the specified field */
131227569Sphilip#define	EFX_LOW_BIT(_field)						\
132227569Sphilip	EFX_VAL(_field, LBN)
133227569Sphilip
134227569Sphilip/* Width of the specified field */
135227569Sphilip#define	EFX_WIDTH(_field)						\
136227569Sphilip	EFX_VAL(_field, WIDTH)
137227569Sphilip
138227569Sphilip/* Highest bit number of the specified field */
139227569Sphilip#define	EFX_HIGH_BIT(_field)						\
140227569Sphilip	(EFX_LOW_BIT(_field) + EFX_WIDTH(_field) - 1)
141227569Sphilip
142227569Sphilip/*
143227569Sphilip * 64-bit mask equal in width to the specified field.
144227569Sphilip *
145227569Sphilip * For example, a field with width 5 would have a mask of 0x000000000000001f.
146227569Sphilip */
147227569Sphilip#define	EFX_MASK64(_field)						\
148227569Sphilip	((EFX_WIDTH(_field) == 64) ? ~((uint64_t)0) :			\
149227569Sphilip	    (((((uint64_t)1) << EFX_WIDTH(_field))) - 1))
150227569Sphilip/*
151227569Sphilip * 32-bit mask equal in width to the specified field.
152227569Sphilip *
153227569Sphilip * For example, a field with width 5 would have a mask of 0x0000001f.
154227569Sphilip */
155227569Sphilip#define	EFX_MASK32(_field)						\
156227569Sphilip	((EFX_WIDTH(_field) == 32) ? ~((uint32_t)0) :			\
157227569Sphilip	    (((((uint32_t)1) << EFX_WIDTH(_field))) - 1))
158227569Sphilip
159227569Sphilip/*
160227569Sphilip * 16-bit mask equal in width to the specified field.
161227569Sphilip *
162227569Sphilip * For example, a field with width 5 would have a mask of 0x001f.
163227569Sphilip */
164227569Sphilip#define	EFX_MASK16(_field)						\
165227569Sphilip	((EFX_WIDTH(_field) == 16) ? 0xffffu :				\
166227569Sphilip	    (uint16_t)((1 << EFX_WIDTH(_field)) - 1))
167227569Sphilip
168227569Sphilip/*
169227569Sphilip * 8-bit mask equal in width to the specified field.
170227569Sphilip *
171227569Sphilip * For example, a field with width 5 would have a mask of 0x1f.
172227569Sphilip */
173227569Sphilip#define	EFX_MASK8(_field)						\
174227569Sphilip	((uint8_t)((1 << EFX_WIDTH(_field)) - 1))
175227569Sphilip
176227569Sphilip#pragma pack(1)
177227569Sphilip
178227569Sphilip/*
179227569Sphilip * A byte (i.e. 8-bit) datatype
180227569Sphilip */
181227569Sphiliptypedef union efx_byte_u {
182227569Sphilip	uint8_t eb_u8[1];
183227569Sphilip} efx_byte_t;
184227569Sphilip
185227569Sphilip/*
186227569Sphilip * A word (i.e. 16-bit) datatype
187227569Sphilip *
188227569Sphilip * This datatype is defined to be little-endian.
189227569Sphilip */
190227569Sphiliptypedef union efx_word_u {
191227569Sphilip	efx_byte_t ew_byte[2];
192227569Sphilip	uint16_t ew_u16[1];
193227569Sphilip	uint8_t ew_u8[2];
194227569Sphilip} efx_word_t;
195227569Sphilip
196227569Sphilip/*
197227569Sphilip * A doubleword (i.e. 32-bit) datatype
198227569Sphilip *
199227569Sphilip * This datatype is defined to be little-endian.
200227569Sphilip */
201227569Sphiliptypedef union efx_dword_u {
202227569Sphilip	efx_byte_t ed_byte[4];
203227569Sphilip	efx_word_t ed_word[2];
204227569Sphilip	uint32_t ed_u32[1];
205227569Sphilip	uint16_t ed_u16[2];
206227569Sphilip	uint8_t ed_u8[4];
207227569Sphilip} efx_dword_t;
208227569Sphilip
209227569Sphilip/*
210227569Sphilip * A quadword (i.e. 64-bit) datatype
211227569Sphilip *
212227569Sphilip * This datatype is defined to be little-endian.
213227569Sphilip */
214227569Sphiliptypedef union efx_qword_u {
215227569Sphilip	efx_byte_t eq_byte[8];
216227569Sphilip	efx_word_t eq_word[4];
217227569Sphilip	efx_dword_t eq_dword[2];
218227569Sphilip#if EFSYS_HAS_UINT64
219227569Sphilip	uint64_t eq_u64[1];
220227569Sphilip#endif
221227569Sphilip	uint32_t eq_u32[2];
222227569Sphilip	uint16_t eq_u16[4];
223227569Sphilip	uint8_t eq_u8[8];
224227569Sphilip} efx_qword_t;
225227569Sphilip
226227569Sphilip/*
227227569Sphilip * An octword (i.e. 128-bit) datatype
228227569Sphilip *
229227569Sphilip * This datatype is defined to be little-endian.
230227569Sphilip */
231227569Sphiliptypedef union efx_oword_u {
232227569Sphilip	efx_byte_t eo_byte[16];
233227569Sphilip	efx_word_t eo_word[8];
234227569Sphilip	efx_dword_t eo_dword[4];
235227569Sphilip	efx_qword_t eo_qword[2];
236284555Sarybchik#if EFSYS_HAS_SSE2_M128
237284555Sarybchik	__m128i eo_u128[1];
238284555Sarybchik#endif
239227569Sphilip#if EFSYS_HAS_UINT64
240227569Sphilip	uint64_t eo_u64[2];
241227569Sphilip#endif
242227569Sphilip	uint32_t eo_u32[4];
243227569Sphilip	uint16_t eo_u16[8];
244227569Sphilip	uint8_t eo_u8[16];
245227569Sphilip} efx_oword_t;
246227569Sphilip
247227569Sphilip#pragma pack()
248227569Sphilip
249227569Sphilip#define	__SWAP16(_x) 				\
250227569Sphilip	((((_x) & 0xff) << 8) |			\
251227569Sphilip	(((_x) >> 8) & 0xff))
252227569Sphilip
253227569Sphilip#define	__SWAP32(_x)				\
254227569Sphilip	((__SWAP16((_x) & 0xffff) << 16) |	\
255227569Sphilip	__SWAP16(((_x) >> 16) & 0xffff))
256227569Sphilip
257227569Sphilip#define	__SWAP64(_x)				\
258227569Sphilip	((__SWAP32((_x) & 0xffffffff) << 32) |	\
259227569Sphilip	__SWAP32(((_x) >> 32) & 0xffffffff))
260227569Sphilip
261227569Sphilip#define	__NOSWAP16(_x)		(_x)
262227569Sphilip#define	__NOSWAP32(_x)		(_x)
263227569Sphilip#define	__NOSWAP64(_x)		(_x)
264227569Sphilip
265227569Sphilip#if EFSYS_IS_BIG_ENDIAN
266227569Sphilip
267227569Sphilip#define	__CPU_TO_LE_16(_x)	(uint16_t)__SWAP16(_x)
268227569Sphilip#define	__LE_TO_CPU_16(_x)	(uint16_t)__SWAP16(_x)
269227569Sphilip#define	__CPU_TO_BE_16(_x)	(uint16_t)__NOSWAP16(_x)
270227569Sphilip#define	__BE_TO_CPU_16(_x)	(uint16_t)__NOSWAP16(_x)
271227569Sphilip
272227569Sphilip#define	__CPU_TO_LE_32(_x)	(uint32_t)__SWAP32(_x)
273227569Sphilip#define	__LE_TO_CPU_32(_x)	(uint32_t)__SWAP32(_x)
274227569Sphilip#define	__CPU_TO_BE_32(_x)	(uint32_t)__NOSWAP32(_x)
275227569Sphilip#define	__BE_TO_CPU_32(_x)	(uint32_t)__NOSWAP32(_x)
276227569Sphilip
277227569Sphilip#define	__CPU_TO_LE_64(_x)	(uint64_t)__SWAP64(_x)
278227569Sphilip#define	__LE_TO_CPU_64(_x)	(uint64_t)__SWAP64(_x)
279227569Sphilip#define	__CPU_TO_BE_64(_x)	(uint64_t)__NOSWAP64(_x)
280227569Sphilip#define	__BE_TO_CPU_64(_x)	(uint64_t)__NOSWAP64(_x)
281227569Sphilip
282227569Sphilip#elif EFSYS_IS_LITTLE_ENDIAN
283227569Sphilip
284227569Sphilip#define	__CPU_TO_LE_16(_x)	(uint16_t)__NOSWAP16(_x)
285227569Sphilip#define	__LE_TO_CPU_16(_x)	(uint16_t)__NOSWAP16(_x)
286227569Sphilip#define	__CPU_TO_BE_16(_x)	(uint16_t)__SWAP16(_x)
287227569Sphilip#define	__BE_TO_CPU_16(_x)	(uint16_t)__SWAP16(_x)
288227569Sphilip
289227569Sphilip#define	__CPU_TO_LE_32(_x)	(uint32_t)__NOSWAP32(_x)
290227569Sphilip#define	__LE_TO_CPU_32(_x)	(uint32_t)__NOSWAP32(_x)
291227569Sphilip#define	__CPU_TO_BE_32(_x)	(uint32_t)__SWAP32(_x)
292227569Sphilip#define	__BE_TO_CPU_32(_x)	(uint32_t)__SWAP32(_x)
293227569Sphilip
294227569Sphilip#define	__CPU_TO_LE_64(_x)	(uint64_t)__NOSWAP64(_x)
295227569Sphilip#define	__LE_TO_CPU_64(_x)	(uint64_t)__NOSWAP64(_x)
296227569Sphilip#define	__CPU_TO_BE_64(_x)	(uint64_t)__SWAP64(_x)
297227569Sphilip#define	__BE_TO_CPU_64(_x)	(uint64_t)__SWAP64(_x)
298227569Sphilip
299227569Sphilip#else
300227569Sphilip
301227569Sphilip#error "Neither of EFSYS_IS_{BIG,LITTLE}_ENDIAN is set"
302227569Sphilip
303227569Sphilip#endif
304227569Sphilip
305227569Sphilip#define	__NATIVE_8(_x)	(uint8_t)(_x)
306227569Sphilip
307227569Sphilip/* Format string for printing an efx_byte_t */
308227569Sphilip#define	EFX_BYTE_FMT "0x%02x"
309227569Sphilip
310227569Sphilip/* Format string for printing an efx_word_t */
311227569Sphilip#define	EFX_WORD_FMT "0x%04x"
312227569Sphilip
313227569Sphilip/* Format string for printing an efx_dword_t */
314227569Sphilip#define	EFX_DWORD_FMT "0x%08x"
315227569Sphilip
316227569Sphilip/* Format string for printing an efx_qword_t */
317227569Sphilip#define	EFX_QWORD_FMT "0x%08x:%08x"
318227569Sphilip
319227569Sphilip/* Format string for printing an efx_oword_t */
320227569Sphilip#define	EFX_OWORD_FMT "0x%08x:%08x:%08x:%08x"
321227569Sphilip
322227569Sphilip/* Parameters for printing an efx_byte_t */
323227569Sphilip#define	EFX_BYTE_VAL(_byte)					\
324227569Sphilip	((unsigned int)__NATIVE_8((_byte).eb_u8[0]))
325227569Sphilip
326227569Sphilip/* Parameters for printing an efx_word_t */
327227569Sphilip#define	EFX_WORD_VAL(_word)					\
328227569Sphilip	((unsigned int)__LE_TO_CPU_16((_word).ew_u16[0]))
329227569Sphilip
330227569Sphilip/* Parameters for printing an efx_dword_t */
331227569Sphilip#define	EFX_DWORD_VAL(_dword)					\
332227569Sphilip	((unsigned int)__LE_TO_CPU_32((_dword).ed_u32[0]))
333227569Sphilip
334227569Sphilip/* Parameters for printing an efx_qword_t */
335227569Sphilip#define	EFX_QWORD_VAL(_qword)					\
336227569Sphilip	((unsigned int)__LE_TO_CPU_32((_qword).eq_u32[1])),	\
337227569Sphilip	((unsigned int)__LE_TO_CPU_32((_qword).eq_u32[0]))
338227569Sphilip
339227569Sphilip/* Parameters for printing an efx_oword_t */
340227569Sphilip#define	EFX_OWORD_VAL(_oword)					\
341227569Sphilip	((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[3])),	\
342227569Sphilip	((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[2])),	\
343227569Sphilip	((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[1])),	\
344227569Sphilip	((unsigned int)__LE_TO_CPU_32((_oword).eo_u32[0]))
345227569Sphilip
346227569Sphilip/*
347227569Sphilip * Stop lint complaining about some shifts.
348227569Sphilip */
349227569Sphilip#ifdef	__lint
350227569Sphilipextern int fix_lint;
351227569Sphilip#define	FIX_LINT(_x)	(_x + fix_lint)
352227569Sphilip#else
353227569Sphilip#define	FIX_LINT(_x)	(_x)
354227569Sphilip#endif
355227569Sphilip
356227569Sphilip/*
357227569Sphilip * Extract bit field portion [low,high) from the native-endian element
358227569Sphilip * which contains bits [min,max).
359227569Sphilip *
360227569Sphilip * For example, suppose "element" represents the high 32 bits of a
361227569Sphilip * 64-bit value, and we wish to extract the bits belonging to the bit
362227569Sphilip * field occupying bits 28-45 of this 64-bit value.
363227569Sphilip *
364227569Sphilip * Then EFX_EXTRACT(_element, 32, 63, 28, 45) would give
365227569Sphilip *
366227569Sphilip *   (_element) << 4
367227569Sphilip *
368227569Sphilip * The result will contain the relevant bits filled in in the range
369227569Sphilip * [0,high-low), with garbage in bits [high-low+1,...).
370227569Sphilip */
371227569Sphilip#define	EFX_EXTRACT_NATIVE(_element, _min, _max, _low, _high)		\
372227569Sphilip	((FIX_LINT(_low > _max) || FIX_LINT(_high < _min)) ?		\
373227569Sphilip		0U :							\
374227569Sphilip		((_low > _min) ?					\
375227569Sphilip			((_element) >> (_low - _min)) :			\
376227569Sphilip			((_element) << (_min - _low))))
377227569Sphilip
378227569Sphilip/*
379227569Sphilip * Extract bit field portion [low,high) from the 64-bit little-endian
380227569Sphilip * element which contains bits [min,max)
381227569Sphilip */
382227569Sphilip#define	EFX_EXTRACT64(_element, _min, _max, _low, _high)		\
383227569Sphilip	EFX_EXTRACT_NATIVE(__LE_TO_CPU_64(_element), _min, _max, _low, _high)
384227569Sphilip
385227569Sphilip/*
386227569Sphilip * Extract bit field portion [low,high) from the 32-bit little-endian
387227569Sphilip * element which contains bits [min,max)
388227569Sphilip */
389227569Sphilip#define	EFX_EXTRACT32(_element, _min, _max, _low, _high)		\
390227569Sphilip	EFX_EXTRACT_NATIVE(__LE_TO_CPU_32(_element), _min, _max, _low, _high)
391227569Sphilip
392227569Sphilip/*
393227569Sphilip * Extract bit field portion [low,high) from the 16-bit little-endian
394227569Sphilip * element which contains bits [min,max)
395227569Sphilip */
396227569Sphilip#define	EFX_EXTRACT16(_element, _min, _max, _low, _high)		\
397227569Sphilip	EFX_EXTRACT_NATIVE(__LE_TO_CPU_16(_element), _min, _max, _low, _high)
398227569Sphilip
399227569Sphilip/*
400227569Sphilip * Extract bit field portion [low,high) from the 8-bit
401227569Sphilip * element which contains bits [min,max)
402227569Sphilip */
403227569Sphilip#define	EFX_EXTRACT8(_element, _min, _max, _low, _high)			\
404227569Sphilip	EFX_EXTRACT_NATIVE(__NATIVE_8(_element), _min, _max, _low, _high)
405227569Sphilip
406227569Sphilip#define	EFX_EXTRACT_OWORD64(_oword, _low, _high)			\
407227569Sphilip	(EFX_EXTRACT64((_oword).eo_u64[0], FIX_LINT(0), FIX_LINT(63),	\
408227569Sphilip	    _low, _high) |						\
409227569Sphilip	EFX_EXTRACT64((_oword).eo_u64[1], FIX_LINT(64), FIX_LINT(127),	\
410227569Sphilip	    _low, _high))
411227569Sphilip
412227569Sphilip#define	EFX_EXTRACT_OWORD32(_oword, _low, _high)			\
413227569Sphilip	(EFX_EXTRACT32((_oword).eo_u32[0], FIX_LINT(0), FIX_LINT(31),	\
414227569Sphilip	    _low, _high) |						\
415227569Sphilip	EFX_EXTRACT32((_oword).eo_u32[1], FIX_LINT(32), FIX_LINT(63),	\
416227569Sphilip	    _low, _high) |						\
417227569Sphilip	EFX_EXTRACT32((_oword).eo_u32[2], FIX_LINT(64), FIX_LINT(95),	\
418227569Sphilip	    _low, _high) |						\
419227569Sphilip	EFX_EXTRACT32((_oword).eo_u32[3], FIX_LINT(96), FIX_LINT(127),	\
420227569Sphilip	    _low, _high))
421227569Sphilip
422227569Sphilip#define	EFX_EXTRACT_QWORD64(_qword, _low, _high)			\
423227569Sphilip	(EFX_EXTRACT64((_qword).eq_u64[0], FIX_LINT(0), FIX_LINT(63),	\
424227569Sphilip	    _low, _high))
425227569Sphilip
426227569Sphilip#define	EFX_EXTRACT_QWORD32(_qword, _low, _high)			\
427227569Sphilip	(EFX_EXTRACT32((_qword).eq_u32[0], FIX_LINT(0), FIX_LINT(31),	\
428227569Sphilip	    _low, _high) |						\
429227569Sphilip	EFX_EXTRACT32((_qword).eq_u32[1], FIX_LINT(32), FIX_LINT(63),	\
430227569Sphilip	    _low, _high))
431227569Sphilip
432227569Sphilip#define	EFX_EXTRACT_DWORD(_dword, _low, _high)				\
433227569Sphilip	(EFX_EXTRACT32((_dword).ed_u32[0], FIX_LINT(0), FIX_LINT(31),	\
434227569Sphilip	    _low, _high))
435227569Sphilip
436227569Sphilip#define	EFX_EXTRACT_WORD(_word, _low, _high)				\
437227569Sphilip	(EFX_EXTRACT16((_word).ew_u16[0], FIX_LINT(0), FIX_LINT(15),	\
438227569Sphilip	    _low, _high))
439227569Sphilip
440227569Sphilip#define	EFX_EXTRACT_BYTE(_byte, _low, _high)				\
441227569Sphilip	(EFX_EXTRACT8((_byte).eb_u8[0], FIX_LINT(0), FIX_LINT(7),	\
442227569Sphilip	    _low, _high))
443227569Sphilip
444227569Sphilip
445227569Sphilip#define	EFX_OWORD_FIELD64(_oword, _field)				\
446227569Sphilip	((uint32_t)EFX_EXTRACT_OWORD64(_oword, EFX_LOW_BIT(_field),	\
447227569Sphilip	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
448227569Sphilip
449227569Sphilip#define	EFX_OWORD_FIELD32(_oword, _field)				\
450227569Sphilip	(EFX_EXTRACT_OWORD32(_oword, EFX_LOW_BIT(_field),		\
451227569Sphilip	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
452227569Sphilip
453227569Sphilip#define	EFX_QWORD_FIELD64(_qword, _field)				\
454227569Sphilip	((uint32_t)EFX_EXTRACT_QWORD64(_qword, EFX_LOW_BIT(_field),	\
455227569Sphilip	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
456227569Sphilip
457227569Sphilip#define	EFX_QWORD_FIELD32(_qword, _field)				\
458227569Sphilip	(EFX_EXTRACT_QWORD32(_qword, EFX_LOW_BIT(_field),		\
459227569Sphilip	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
460227569Sphilip
461227569Sphilip#define	EFX_DWORD_FIELD(_dword, _field)					\
462227569Sphilip	(EFX_EXTRACT_DWORD(_dword, EFX_LOW_BIT(_field),			\
463227569Sphilip	    EFX_HIGH_BIT(_field)) & EFX_MASK32(_field))
464227569Sphilip
465227569Sphilip#define	EFX_WORD_FIELD(_word, _field)					\
466227569Sphilip	(EFX_EXTRACT_WORD(_word, EFX_LOW_BIT(_field),			\
467227569Sphilip	    EFX_HIGH_BIT(_field)) & EFX_MASK16(_field))
468227569Sphilip
469227569Sphilip#define	EFX_BYTE_FIELD(_byte, _field)					\
470227569Sphilip	(EFX_EXTRACT_BYTE(_byte, EFX_LOW_BIT(_field),			\
471227569Sphilip	    EFX_HIGH_BIT(_field)) & EFX_MASK8(_field))
472227569Sphilip
473227569Sphilip
474227569Sphilip#define	EFX_OWORD_IS_EQUAL64(_oword_a, _oword_b)			\
475227569Sphilip	((_oword_a).eo_u64[0] == (_oword_b).eo_u64[0] &&		\
476227569Sphilip	    (_oword_a).eo_u64[1] == (_oword_b).eo_u64[1])
477227569Sphilip
478227569Sphilip#define	EFX_OWORD_IS_EQUAL32(_oword_a, _oword_b)			\
479227569Sphilip	((_oword_a).eo_u32[0] == (_oword_b).eo_u32[0] &&		\
480227569Sphilip	    (_oword_a).eo_u32[1] == (_oword_b).eo_u32[1] &&		\
481227569Sphilip	    (_oword_a).eo_u32[2] == (_oword_b).eo_u32[2] &&		\
482227569Sphilip	    (_oword_a).eo_u32[3] == (_oword_b).eo_u32[3])
483227569Sphilip
484227569Sphilip#define	EFX_QWORD_IS_EQUAL64(_qword_a, _qword_b)			\
485227569Sphilip	((_qword_a).eq_u64[0] == (_qword_b).eq_u64[0])
486227569Sphilip
487227569Sphilip#define	EFX_QWORD_IS_EQUAL32(_qword_a, _qword_b)			\
488227569Sphilip	((_qword_a).eq_u32[0] == (_qword_b).eq_u32[0] &&		\
489227569Sphilip	    (_qword_a).eq_u32[1] == (_qword_b).eq_u32[1])
490227569Sphilip
491227569Sphilip#define	EFX_DWORD_IS_EQUAL(_dword_a, _dword_b)				\
492227569Sphilip	((_dword_a).ed_u32[0] == (_dword_b).ed_u32[0])
493227569Sphilip
494227569Sphilip#define	EFX_WORD_IS_EQUAL(_word_a, _word_b)				\
495227569Sphilip	((_word_a).ew_u16[0] == (_word_b).ew_u16[0])
496227569Sphilip
497227569Sphilip#define	EFX_BYTE_IS_EQUAL(_byte_a, _byte_b)				\
498227569Sphilip	((_byte_a).eb_u8[0] == (_byte_b).eb_u8[0])
499227569Sphilip
500227569Sphilip
501227569Sphilip#define	EFX_OWORD_IS_ZERO64(_oword)					\
502227569Sphilip	(((_oword).eo_u64[0] |						\
503227569Sphilip	    (_oword).eo_u64[1]) == 0)
504227569Sphilip
505227569Sphilip#define	EFX_OWORD_IS_ZERO32(_oword)					\
506227569Sphilip	(((_oword).eo_u32[0] |						\
507227569Sphilip	    (_oword).eo_u32[1] |					\
508227569Sphilip	    (_oword).eo_u32[2] |					\
509227569Sphilip	    (_oword).eo_u32[3]) == 0)
510227569Sphilip
511227569Sphilip#define	EFX_QWORD_IS_ZERO64(_qword)					\
512227569Sphilip	(((_qword).eq_u64[0]) == 0)
513227569Sphilip
514227569Sphilip#define	EFX_QWORD_IS_ZERO32(_qword)					\
515227569Sphilip	(((_qword).eq_u32[0] |						\
516227569Sphilip	    (_qword).eq_u32[1]) == 0)
517227569Sphilip
518227569Sphilip#define	EFX_DWORD_IS_ZERO(_dword)					\
519227569Sphilip	(((_dword).ed_u32[0]) == 0)
520227569Sphilip
521227569Sphilip#define	EFX_WORD_IS_ZERO(_word)						\
522227569Sphilip	(((_word).ew_u16[0]) == 0)
523227569Sphilip
524227569Sphilip#define	EFX_BYTE_IS_ZERO(_byte)						\
525227569Sphilip	(((_byte).eb_u8[0]) == 0)
526227569Sphilip
527227569Sphilip
528227569Sphilip#define	EFX_OWORD_IS_SET64(_oword)					\
529227569Sphilip	(((_oword).eo_u64[0] &						\
530227569Sphilip	    (_oword).eo_u64[1]) == ~((uint64_t)0))
531227569Sphilip
532227569Sphilip#define	EFX_OWORD_IS_SET32(_oword)					\
533227569Sphilip	(((_oword).eo_u32[0] &						\
534227569Sphilip	    (_oword).eo_u32[1] &					\
535227569Sphilip	    (_oword).eo_u32[2] &					\
536227569Sphilip	    (_oword).eo_u32[3]) == ~((uint32_t)0))
537227569Sphilip
538227569Sphilip#define	EFX_QWORD_IS_SET64(_qword)					\
539294018Sarybchik	(((_qword).eq_u64[0]) == ~((uint64_t)0))
540227569Sphilip
541227569Sphilip#define	EFX_QWORD_IS_SET32(_qword)					\
542227569Sphilip	(((_qword).eq_u32[0] &						\
543227569Sphilip	    (_qword).eq_u32[1]) == ~((uint32_t)0))
544227569Sphilip
545227569Sphilip#define	EFX_DWORD_IS_SET(_dword)					\
546227569Sphilip	((_dword).ed_u32[0] == ~((uint32_t)0))
547227569Sphilip
548227569Sphilip#define	EFX_WORD_IS_SET(_word)						\
549227569Sphilip	((_word).ew_u16[0] == ~((uint16_t)0))
550227569Sphilip
551227569Sphilip#define	EFX_BYTE_IS_SET(_byte)						\
552227569Sphilip	((_byte).eb_u8[0] == ~((uint8_t)0))
553227569Sphilip
554227569Sphilip/*
555227569Sphilip * Construct bit field portion
556227569Sphilip *
557227569Sphilip * Creates the portion of the bit field [low,high) that lies within
558227569Sphilip * the range [min,max).
559227569Sphilip */
560227569Sphilip
561227569Sphilip#define	EFX_INSERT_NATIVE64(_min, _max, _low, _high, _value)		\
562227569Sphilip	(((_low > _max) || (_high < _min)) ?				\
563227569Sphilip		0U :							\
564227569Sphilip		((_low > _min) ?					\
565227569Sphilip			(((uint64_t)(_value)) << (_low - _min)) :	\
566227569Sphilip			(((uint64_t)(_value)) >> (_min - _low))))
567227569Sphilip
568227569Sphilip#define	EFX_INSERT_NATIVE32(_min, _max, _low, _high, _value)		\
569227569Sphilip	(((_low > _max) || (_high < _min)) ?				\
570227569Sphilip		0U :							\
571227569Sphilip		((_low > _min) ?					\
572227569Sphilip			(((uint32_t)(_value)) << (_low - _min)) :	\
573227569Sphilip			(((uint32_t)(_value)) >> (_min - _low))))
574227569Sphilip
575227569Sphilip#define	EFX_INSERT_NATIVE16(_min, _max, _low, _high, _value)		\
576227569Sphilip	(((_low > _max) || (_high < _min)) ?				\
577227569Sphilip		0U :							\
578227569Sphilip		(uint16_t)((_low > _min) ?				\
579227569Sphilip				((_value) << (_low - _min)) :		\
580227569Sphilip				((_value) >> (_min - _low))))
581227569Sphilip
582227569Sphilip#define	EFX_INSERT_NATIVE8(_min, _max, _low, _high, _value)		\
583227569Sphilip	(((_low > _max) || (_high < _min)) ?				\
584227569Sphilip		0U :							\
585227569Sphilip		(uint8_t)((_low > _min) ?				\
586227569Sphilip				((_value) << (_low - _min)) :	\
587227569Sphilip				((_value) >> (_min - _low))))
588227569Sphilip
589227569Sphilip/*
590227569Sphilip * Construct bit field portion
591227569Sphilip *
592227569Sphilip * Creates the portion of the named bit field that lies within the
593227569Sphilip * range [min,max).
594227569Sphilip */
595227569Sphilip#define	EFX_INSERT_FIELD_NATIVE64(_min, _max, _field, _value)		\
596227569Sphilip	EFX_INSERT_NATIVE64(_min, _max, EFX_LOW_BIT(_field),		\
597227569Sphilip	    EFX_HIGH_BIT(_field), _value)
598227569Sphilip
599227569Sphilip#define	EFX_INSERT_FIELD_NATIVE32(_min, _max, _field, _value)		\
600227569Sphilip	EFX_INSERT_NATIVE32(_min, _max, EFX_LOW_BIT(_field),		\
601227569Sphilip	    EFX_HIGH_BIT(_field), _value)
602227569Sphilip
603227569Sphilip#define	EFX_INSERT_FIELD_NATIVE16(_min, _max, _field, _value)		\
604227569Sphilip	EFX_INSERT_NATIVE16(_min, _max, EFX_LOW_BIT(_field),		\
605227569Sphilip	    EFX_HIGH_BIT(_field), _value)
606227569Sphilip
607227569Sphilip#define	EFX_INSERT_FIELD_NATIVE8(_min, _max, _field, _value)		\
608227569Sphilip	EFX_INSERT_NATIVE8(_min, _max, EFX_LOW_BIT(_field),		\
609227569Sphilip	    EFX_HIGH_BIT(_field), _value)
610227569Sphilip
611227569Sphilip/*
612227569Sphilip * Construct bit field
613227569Sphilip *
614227569Sphilip * Creates the portion of the named bit fields that lie within the
615227569Sphilip * range [min,max).
616227569Sphilip */
617227569Sphilip#define	EFX_INSERT_FIELDS64(_min, _max,					\
618227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
619227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
620227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
621227569Sphilip	    _field10, _value10)						\
622227569Sphilip	__CPU_TO_LE_64(							\
623227569Sphilip	    EFX_INSERT_FIELD_NATIVE64(_min, _max, _field1, _value1) |	\
624227569Sphilip	    EFX_INSERT_FIELD_NATIVE64(_min, _max, _field2, _value2) |	\
625227569Sphilip	    EFX_INSERT_FIELD_NATIVE64(_min, _max, _field3, _value3) |	\
626227569Sphilip	    EFX_INSERT_FIELD_NATIVE64(_min, _max, _field4, _value4) |	\
627227569Sphilip	    EFX_INSERT_FIELD_NATIVE64(_min, _max, _field5, _value5) |	\
628227569Sphilip	    EFX_INSERT_FIELD_NATIVE64(_min, _max, _field6, _value6) |	\
629227569Sphilip	    EFX_INSERT_FIELD_NATIVE64(_min, _max, _field7, _value7) |	\
630227569Sphilip	    EFX_INSERT_FIELD_NATIVE64(_min, _max, _field8, _value8) |	\
631227569Sphilip	    EFX_INSERT_FIELD_NATIVE64(_min, _max, _field9, _value9) |	\
632227569Sphilip	    EFX_INSERT_FIELD_NATIVE64(_min, _max, _field10, _value10))
633227569Sphilip
634227569Sphilip#define	EFX_INSERT_FIELDS32(_min, _max,					\
635227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
636227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
637227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
638227569Sphilip	    _field10, _value10)						\
639227569Sphilip	__CPU_TO_LE_32(							\
640227569Sphilip	    EFX_INSERT_FIELD_NATIVE32(_min, _max, _field1, _value1) |	\
641227569Sphilip	    EFX_INSERT_FIELD_NATIVE32(_min, _max, _field2, _value2) |	\
642227569Sphilip	    EFX_INSERT_FIELD_NATIVE32(_min, _max, _field3, _value3) |	\
643227569Sphilip	    EFX_INSERT_FIELD_NATIVE32(_min, _max, _field4, _value4) |	\
644227569Sphilip	    EFX_INSERT_FIELD_NATIVE32(_min, _max, _field5, _value5) |	\
645227569Sphilip	    EFX_INSERT_FIELD_NATIVE32(_min, _max, _field6, _value6) |	\
646227569Sphilip	    EFX_INSERT_FIELD_NATIVE32(_min, _max, _field7, _value7) |	\
647227569Sphilip	    EFX_INSERT_FIELD_NATIVE32(_min, _max, _field8, _value8) |	\
648227569Sphilip	    EFX_INSERT_FIELD_NATIVE32(_min, _max, _field9, _value9) |	\
649227569Sphilip	    EFX_INSERT_FIELD_NATIVE32(_min, _max, _field10, _value10))
650227569Sphilip
651227569Sphilip#define	EFX_INSERT_FIELDS16(_min, _max,					\
652227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
653227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
654227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
655227569Sphilip	    _field10, _value10)						\
656227569Sphilip	__CPU_TO_LE_16(							\
657227569Sphilip	    EFX_INSERT_FIELD_NATIVE16(_min, _max, _field1, _value1) |	\
658227569Sphilip	    EFX_INSERT_FIELD_NATIVE16(_min, _max, _field2, _value2) |	\
659227569Sphilip	    EFX_INSERT_FIELD_NATIVE16(_min, _max, _field3, _value3) |	\
660227569Sphilip	    EFX_INSERT_FIELD_NATIVE16(_min, _max, _field4, _value4) |	\
661227569Sphilip	    EFX_INSERT_FIELD_NATIVE16(_min, _max, _field5, _value5) |	\
662227569Sphilip	    EFX_INSERT_FIELD_NATIVE16(_min, _max, _field6, _value6) |	\
663227569Sphilip	    EFX_INSERT_FIELD_NATIVE16(_min, _max, _field7, _value7) |	\
664227569Sphilip	    EFX_INSERT_FIELD_NATIVE16(_min, _max, _field8, _value8) |	\
665227569Sphilip	    EFX_INSERT_FIELD_NATIVE16(_min, _max, _field9, _value9) |	\
666227569Sphilip	    EFX_INSERT_FIELD_NATIVE16(_min, _max, _field10, _value10))
667227569Sphilip
668227569Sphilip#define	EFX_INSERT_FIELDS8(_min, _max,					\
669227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
670227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
671227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
672227569Sphilip	    _field10, _value10)						\
673227569Sphilip	__NATIVE_8(							\
674227569Sphilip	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field1, _value1) |	\
675227569Sphilip	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field2, _value2) |	\
676227569Sphilip	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field3, _value3) |	\
677227569Sphilip	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field4, _value4) |	\
678227569Sphilip	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field5, _value5) |	\
679227569Sphilip	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field6, _value6) |	\
680227569Sphilip	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field7, _value7) |	\
681227569Sphilip	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field8, _value8) |	\
682227569Sphilip	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field9, _value9) |	\
683227569Sphilip	    EFX_INSERT_FIELD_NATIVE8(_min, _max, _field10, _value10))
684227569Sphilip
685227569Sphilip#define	EFX_POPULATE_OWORD64(_oword,					\
686227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
687227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
688227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
689227569Sphilip	    _field10, _value10)						\
690227569Sphilip	do {								\
691227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
692227569Sphilip		(_oword).eo_u64[0] = EFX_INSERT_FIELDS64(0, 63,		\
693227569Sphilip		    _field1, _value1, _field2, _value2,			\
694227569Sphilip		    _field3, _value3, _field4, _value4,			\
695227569Sphilip		    _field5, _value5, _field6, _value6,			\
696227569Sphilip		    _field7, _value7, _field8, _value8,			\
697227569Sphilip		    _field9, _value9, _field10, _value10);		\
698227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
699227569Sphilip		(_oword).eo_u64[1] = EFX_INSERT_FIELDS64(64, 127,	\
700227569Sphilip		    _field1, _value1, _field2, _value2,			\
701227569Sphilip		    _field3, _value3, _field4, _value4,			\
702227569Sphilip		    _field5, _value5, _field6, _value6,			\
703227569Sphilip		    _field7, _value7, _field8, _value8,			\
704227569Sphilip		    _field9, _value9, _field10, _value10);		\
705227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
706227569Sphilip	} while (B_FALSE)
707227569Sphilip
708227569Sphilip#define	EFX_POPULATE_OWORD32(_oword,					\
709227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
710227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
711227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
712227569Sphilip	    _field10, _value10)						\
713227569Sphilip	do {								\
714227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
715227569Sphilip		(_oword).eo_u32[0] = EFX_INSERT_FIELDS32(0, 31,		\
716227569Sphilip		    _field1, _value1, _field2, _value2,			\
717227569Sphilip		    _field3, _value3, _field4, _value4,			\
718227569Sphilip		    _field5, _value5, _field6, _value6,			\
719227569Sphilip		    _field7, _value7, _field8, _value8,			\
720227569Sphilip		    _field9, _value9, _field10, _value10);		\
721227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
722227569Sphilip		(_oword).eo_u32[1] = EFX_INSERT_FIELDS32(32, 63,	\
723227569Sphilip		    _field1, _value1, _field2, _value2,			\
724227569Sphilip		    _field3, _value3, _field4, _value4,			\
725227569Sphilip		    _field5, _value5, _field6, _value6,			\
726227569Sphilip		    _field7, _value7, _field8, _value8,			\
727227569Sphilip		    _field9, _value9, _field10, _value10);		\
728227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
729227569Sphilip		(_oword).eo_u32[2] = EFX_INSERT_FIELDS32(64, 95,	\
730227569Sphilip		    _field1, _value1, _field2, _value2,			\
731227569Sphilip		    _field3, _value3, _field4, _value4,			\
732227569Sphilip		    _field5, _value5, _field6, _value6,			\
733227569Sphilip		    _field7, _value7, _field8, _value8,			\
734227569Sphilip		    _field9, _value9, _field10, _value10);		\
735227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
736227569Sphilip		(_oword).eo_u32[3] = EFX_INSERT_FIELDS32(96, 127,	\
737227569Sphilip		    _field1, _value1, _field2, _value2,			\
738227569Sphilip		    _field3, _value3, _field4, _value4,			\
739227569Sphilip		    _field5, _value5, _field6, _value6,			\
740227569Sphilip		    _field7, _value7, _field8, _value8,			\
741227569Sphilip		    _field9, _value9, _field10, _value10);		\
742227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
743227569Sphilip	} while (B_FALSE)
744227569Sphilip
745227569Sphilip#define	EFX_POPULATE_QWORD64(_qword,					\
746227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
747227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
748227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
749227569Sphilip	    _field10, _value10)						\
750227569Sphilip	do {								\
751227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
752227569Sphilip		(_qword).eq_u64[0] = EFX_INSERT_FIELDS64(0, 63,		\
753227569Sphilip		    _field1, _value1, _field2, _value2,			\
754227569Sphilip		    _field3, _value3, _field4, _value4,			\
755227569Sphilip		    _field5, _value5, _field6, _value6,			\
756227569Sphilip		    _field7, _value7, _field8, _value8,			\
757227569Sphilip		    _field9, _value9, _field10, _value10);		\
758227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
759227569Sphilip	} while (B_FALSE)
760227569Sphilip
761227569Sphilip#define	EFX_POPULATE_QWORD32(_qword,					\
762227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
763227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
764227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
765227569Sphilip	    _field10, _value10)						\
766227569Sphilip	do {								\
767227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
768227569Sphilip		(_qword).eq_u32[0] = EFX_INSERT_FIELDS32(0, 31,		\
769227569Sphilip		    _field1, _value1, _field2, _value2,			\
770227569Sphilip		    _field3, _value3, _field4, _value4,			\
771227569Sphilip		    _field5, _value5, _field6, _value6,			\
772227569Sphilip		    _field7, _value7, _field8, _value8,			\
773227569Sphilip		    _field9, _value9, _field10, _value10);		\
774227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
775227569Sphilip		(_qword).eq_u32[1] = EFX_INSERT_FIELDS32(32, 63,	\
776227569Sphilip		    _field1, _value1, _field2, _value2,			\
777227569Sphilip		    _field3, _value3, _field4, _value4,			\
778227569Sphilip		    _field5, _value5, _field6, _value6,			\
779227569Sphilip		    _field7, _value7, _field8, _value8,			\
780227569Sphilip		    _field9, _value9, _field10, _value10);		\
781227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
782227569Sphilip	} while (B_FALSE)
783227569Sphilip
784227569Sphilip#define	EFX_POPULATE_DWORD(_dword,					\
785227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
786227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
787227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
788227569Sphilip	    _field10, _value10)						\
789227569Sphilip	do {								\
790227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
791227569Sphilip		(_dword).ed_u32[0] = EFX_INSERT_FIELDS32(0, 31,		\
792227569Sphilip		    _field1, _value1, _field2, _value2,			\
793227569Sphilip		    _field3, _value3, _field4, _value4,			\
794227569Sphilip		    _field5, _value5, _field6, _value6,			\
795227569Sphilip		    _field7, _value7, _field8, _value8,			\
796227569Sphilip		    _field9, _value9, _field10, _value10);		\
797227569Sphilip	_NOTE(CONSTANTCONDITION)					\
798227569Sphilip	} while (B_FALSE)
799227569Sphilip
800227569Sphilip#define	EFX_POPULATE_WORD(_word,					\
801227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
802227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
803227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
804227569Sphilip	    _field10, _value10)						\
805227569Sphilip	do {								\
806227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
807227569Sphilip		(_word).ew_u16[0] = EFX_INSERT_FIELDS16(0, 15,		\
808227569Sphilip		    _field1, _value1, _field2, _value2,			\
809227569Sphilip		    _field3, _value3, _field4, _value4,			\
810227569Sphilip		    _field5, _value5, _field6, _value6,			\
811227569Sphilip		    _field7, _value7, _field8, _value8,			\
812227569Sphilip		    _field9, _value9, _field10, _value10);		\
813227569Sphilip	_NOTE(CONSTANTCONDITION)					\
814227569Sphilip	} while (B_FALSE)
815227569Sphilip
816227569Sphilip#define	EFX_POPULATE_BYTE(_byte,					\
817227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
818227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
819227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9,	\
820227569Sphilip	    _field10, _value10)						\
821227569Sphilip	do {								\
822227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
823227569Sphilip		(_byte).eb_u8[0] = EFX_INSERT_FIELDS8(0, 7,		\
824227569Sphilip		    _field1, _value1, _field2, _value2,			\
825227569Sphilip		    _field3, _value3, _field4, _value4,			\
826227569Sphilip		    _field5, _value5, _field6, _value6,			\
827227569Sphilip		    _field7, _value7, _field8, _value8,			\
828227569Sphilip		    _field9, _value9, _field10, _value10);		\
829227569Sphilip	_NOTE(CONSTANTCONDITION)					\
830227569Sphilip	} while (B_FALSE)
831227569Sphilip
832227569Sphilip/* Populate an octword field with various numbers of arguments */
833227569Sphilip#define	EFX_POPULATE_OWORD_10 EFX_POPULATE_OWORD
834227569Sphilip
835227569Sphilip#define	EFX_POPULATE_OWORD_9(_oword,					\
836227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
837227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
838227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9)	\
839227569Sphilip	EFX_POPULATE_OWORD_10(_oword, EFX_DUMMY_FIELD, 0,		\
840227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
841227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
842227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9)
843227569Sphilip
844227569Sphilip#define	EFX_POPULATE_OWORD_8(_oword,					\
845227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
846227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
847227569Sphilip	    _field7, _value7, _field8, _value8)				\
848227569Sphilip	EFX_POPULATE_OWORD_9(_oword, EFX_DUMMY_FIELD, 0,		\
849227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
850227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
851227569Sphilip	    _field7, _value7, _field8, _value8)
852227569Sphilip
853227569Sphilip#define	EFX_POPULATE_OWORD_7(_oword,					\
854227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
855227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
856227569Sphilip	    _field7, _value7)						\
857227569Sphilip	EFX_POPULATE_OWORD_8(_oword, EFX_DUMMY_FIELD, 0,		\
858227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
859227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
860227569Sphilip	    _field7, _value7)
861227569Sphilip
862227569Sphilip#define	EFX_POPULATE_OWORD_6(_oword,					\
863227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
864227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6)	\
865227569Sphilip	EFX_POPULATE_OWORD_7(_oword, EFX_DUMMY_FIELD, 0,		\
866227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
867227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6)
868227569Sphilip
869227569Sphilip#define	EFX_POPULATE_OWORD_5(_oword,					\
870227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
871227569Sphilip	    _field4, _value4, _field5, _value5)				\
872227569Sphilip	EFX_POPULATE_OWORD_6(_oword, EFX_DUMMY_FIELD, 0,		\
873227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
874227569Sphilip	    _field4, _value4, _field5, _value5)
875227569Sphilip
876227569Sphilip#define	EFX_POPULATE_OWORD_4(_oword,					\
877227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
878227569Sphilip	    _field4, _value4)						\
879227569Sphilip	EFX_POPULATE_OWORD_5(_oword, EFX_DUMMY_FIELD, 0,		\
880227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
881227569Sphilip	    _field4, _value4)
882227569Sphilip
883227569Sphilip#define	EFX_POPULATE_OWORD_3(_oword,					\
884227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3)	\
885227569Sphilip	EFX_POPULATE_OWORD_4(_oword, EFX_DUMMY_FIELD, 0,		\
886227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3)
887227569Sphilip
888227569Sphilip#define	EFX_POPULATE_OWORD_2(_oword,					\
889227569Sphilip	    _field1, _value1, _field2, _value2)				\
890227569Sphilip	EFX_POPULATE_OWORD_3(_oword, EFX_DUMMY_FIELD, 0,		\
891227569Sphilip	    _field1, _value1, _field2, _value2)
892227569Sphilip
893227569Sphilip#define	EFX_POPULATE_OWORD_1(_oword,					\
894227569Sphilip	    _field1, _value1)						\
895227569Sphilip	EFX_POPULATE_OWORD_2(_oword, EFX_DUMMY_FIELD, 0,		\
896227569Sphilip	    _field1, _value1)
897227569Sphilip
898227569Sphilip#define	EFX_ZERO_OWORD(_oword)						\
899227569Sphilip	EFX_POPULATE_OWORD_1(_oword, EFX_DUMMY_FIELD, 0)
900227569Sphilip
901284555Sarybchik#define	EFX_SET_OWORD(_oword)						\
902227569Sphilip	EFX_POPULATE_OWORD_4(_oword,					\
903227569Sphilip	    EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff,		\
904227569Sphilip	    EFX_DWORD_2, 0xffffffff, EFX_DWORD_3, 0xffffffff)
905227569Sphilip
906227569Sphilip/* Populate a quadword field with various numbers of arguments */
907227569Sphilip#define	EFX_POPULATE_QWORD_10 EFX_POPULATE_QWORD
908227569Sphilip
909227569Sphilip#define	EFX_POPULATE_QWORD_9(_qword,					\
910227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
911227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
912227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9)	\
913227569Sphilip	EFX_POPULATE_QWORD_10(_qword, EFX_DUMMY_FIELD, 0,		\
914227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
915227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
916227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9)
917227569Sphilip
918227569Sphilip#define	EFX_POPULATE_QWORD_8(_qword,					\
919227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
920227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
921227569Sphilip	    _field7, _value7, _field8, _value8)				\
922227569Sphilip	EFX_POPULATE_QWORD_9(_qword, EFX_DUMMY_FIELD, 0,		\
923227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
924227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
925227569Sphilip	    _field7, _value7, _field8, _value8)
926227569Sphilip
927227569Sphilip#define	EFX_POPULATE_QWORD_7(_qword,					\
928227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
929227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
930227569Sphilip	    _field7, _value7)						\
931227569Sphilip	EFX_POPULATE_QWORD_8(_qword, EFX_DUMMY_FIELD, 0,		\
932227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
933227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
934227569Sphilip	    _field7, _value7)
935227569Sphilip
936227569Sphilip#define	EFX_POPULATE_QWORD_6(_qword,					\
937227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
938227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6)	\
939227569Sphilip	EFX_POPULATE_QWORD_7(_qword, EFX_DUMMY_FIELD, 0,		\
940227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
941227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6)
942227569Sphilip
943227569Sphilip#define	EFX_POPULATE_QWORD_5(_qword,					\
944227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
945227569Sphilip	    _field4, _value4, _field5, _value5)				\
946227569Sphilip	EFX_POPULATE_QWORD_6(_qword, EFX_DUMMY_FIELD, 0,		\
947227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
948227569Sphilip	    _field4, _value4, _field5, _value5)
949227569Sphilip
950227569Sphilip#define	EFX_POPULATE_QWORD_4(_qword,					\
951227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
952227569Sphilip	    _field4, _value4)						\
953227569Sphilip	EFX_POPULATE_QWORD_5(_qword, EFX_DUMMY_FIELD, 0,		\
954227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
955227569Sphilip	    _field4, _value4)
956227569Sphilip
957227569Sphilip#define	EFX_POPULATE_QWORD_3(_qword,					\
958227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3)	\
959227569Sphilip	EFX_POPULATE_QWORD_4(_qword, EFX_DUMMY_FIELD, 0,		\
960227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3)
961227569Sphilip
962227569Sphilip#define	EFX_POPULATE_QWORD_2(_qword,					\
963227569Sphilip	    _field1, _value1, _field2, _value2)				\
964227569Sphilip	EFX_POPULATE_QWORD_3(_qword, EFX_DUMMY_FIELD, 0,		\
965227569Sphilip	    _field1, _value1, _field2, _value2)
966227569Sphilip
967227569Sphilip#define	EFX_POPULATE_QWORD_1(_qword,					\
968227569Sphilip	    _field1, _value1)						\
969227569Sphilip	EFX_POPULATE_QWORD_2(_qword, EFX_DUMMY_FIELD, 0,		\
970227569Sphilip	    _field1, _value1)
971227569Sphilip
972227569Sphilip#define	EFX_ZERO_QWORD(_qword)						\
973227569Sphilip	EFX_POPULATE_QWORD_1(_qword, EFX_DUMMY_FIELD, 0)
974227569Sphilip
975284555Sarybchik#define	EFX_SET_QWORD(_qword)						\
976227569Sphilip	EFX_POPULATE_QWORD_2(_qword,					\
977227569Sphilip	    EFX_DWORD_0, 0xffffffff, EFX_DWORD_1, 0xffffffff)
978227569Sphilip
979227569Sphilip/* Populate a dword field with various numbers of arguments */
980227569Sphilip#define	EFX_POPULATE_DWORD_10 EFX_POPULATE_DWORD
981227569Sphilip
982227569Sphilip#define	EFX_POPULATE_DWORD_9(_dword,					\
983227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
984227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
985227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9)	\
986227569Sphilip	EFX_POPULATE_DWORD_10(_dword, EFX_DUMMY_FIELD, 0,		\
987227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
988227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
989227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9)
990227569Sphilip
991227569Sphilip#define	EFX_POPULATE_DWORD_8(_dword,					\
992227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
993227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
994227569Sphilip	    _field7, _value7, _field8, _value8)				\
995227569Sphilip	EFX_POPULATE_DWORD_9(_dword, EFX_DUMMY_FIELD, 0,		\
996227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
997227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
998227569Sphilip	    _field7, _value7, _field8, _value8)
999227569Sphilip
1000227569Sphilip#define	EFX_POPULATE_DWORD_7(_dword,					\
1001227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1002227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1003227569Sphilip	    _field7, _value7)						\
1004227569Sphilip	EFX_POPULATE_DWORD_8(_dword, EFX_DUMMY_FIELD, 0,		\
1005227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1006227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1007227569Sphilip	    _field7, _value7)
1008227569Sphilip
1009227569Sphilip#define	EFX_POPULATE_DWORD_6(_dword,					\
1010227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1011227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6)	\
1012227569Sphilip	EFX_POPULATE_DWORD_7(_dword, EFX_DUMMY_FIELD, 0,		\
1013227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1014227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6)
1015227569Sphilip
1016227569Sphilip#define	EFX_POPULATE_DWORD_5(_dword,					\
1017227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1018227569Sphilip	    _field4, _value4, _field5, _value5)				\
1019227569Sphilip	EFX_POPULATE_DWORD_6(_dword, EFX_DUMMY_FIELD, 0,		\
1020227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1021227569Sphilip	    _field4, _value4, _field5, _value5)
1022227569Sphilip
1023227569Sphilip#define	EFX_POPULATE_DWORD_4(_dword,					\
1024227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1025227569Sphilip	    _field4, _value4)						\
1026227569Sphilip	EFX_POPULATE_DWORD_5(_dword, EFX_DUMMY_FIELD, 0,		\
1027227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1028227569Sphilip	    _field4, _value4)
1029227569Sphilip
1030227569Sphilip#define	EFX_POPULATE_DWORD_3(_dword,					\
1031227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3)	\
1032227569Sphilip	EFX_POPULATE_DWORD_4(_dword, EFX_DUMMY_FIELD, 0,		\
1033227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3)
1034227569Sphilip
1035227569Sphilip#define	EFX_POPULATE_DWORD_2(_dword,					\
1036227569Sphilip	    _field1, _value1, _field2, _value2)				\
1037227569Sphilip	EFX_POPULATE_DWORD_3(_dword, EFX_DUMMY_FIELD, 0,		\
1038227569Sphilip	    _field1, _value1, _field2, _value2)
1039227569Sphilip
1040227569Sphilip#define	EFX_POPULATE_DWORD_1(_dword,					\
1041227569Sphilip	    _field1, _value1)						\
1042227569Sphilip	EFX_POPULATE_DWORD_2(_dword, EFX_DUMMY_FIELD, 0,		\
1043227569Sphilip	    _field1, _value1)
1044227569Sphilip
1045227569Sphilip#define	EFX_ZERO_DWORD(_dword)						\
1046227569Sphilip	EFX_POPULATE_DWORD_1(_dword, EFX_DUMMY_FIELD, 0)
1047227569Sphilip
1048227569Sphilip#define	EFX_SET_DWORD(_dword)						\
1049227569Sphilip	EFX_POPULATE_DWORD_1(_dword,					\
1050227569Sphilip	    EFX_DWORD_0, 0xffffffff)
1051227569Sphilip
1052227569Sphilip/* Populate a word field with various numbers of arguments */
1053227569Sphilip#define	EFX_POPULATE_WORD_10 EFX_POPULATE_WORD
1054227569Sphilip
1055227569Sphilip#define	EFX_POPULATE_WORD_9(_word,					\
1056227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1057227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1058227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9)	\
1059227569Sphilip	EFX_POPULATE_WORD_10(_word, EFX_DUMMY_FIELD, 0,			\
1060227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1061227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1062227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9)
1063227569Sphilip
1064227569Sphilip#define	EFX_POPULATE_WORD_8(_word,					\
1065227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1066227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1067227569Sphilip	    _field7, _value7, _field8, _value8)				\
1068227569Sphilip	EFX_POPULATE_WORD_9(_word, EFX_DUMMY_FIELD, 0,			\
1069227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1070227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1071227569Sphilip	    _field7, _value7, _field8, _value8)
1072227569Sphilip
1073227569Sphilip#define	EFX_POPULATE_WORD_7(_word,					\
1074227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1075227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1076227569Sphilip	    _field7, _value7)						\
1077227569Sphilip	EFX_POPULATE_WORD_8(_word, EFX_DUMMY_FIELD, 0,			\
1078227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1079227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1080227569Sphilip	    _field7, _value7)
1081227569Sphilip
1082227569Sphilip#define	EFX_POPULATE_WORD_6(_word,					\
1083227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1084227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6)	\
1085227569Sphilip	EFX_POPULATE_WORD_7(_word, EFX_DUMMY_FIELD, 0,			\
1086227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1087227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6)
1088227569Sphilip
1089227569Sphilip#define	EFX_POPULATE_WORD_5(_word,					\
1090227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1091227569Sphilip	    _field4, _value4, _field5, _value5)				\
1092227569Sphilip	EFX_POPULATE_WORD_6(_word, EFX_DUMMY_FIELD, 0,			\
1093227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1094227569Sphilip	    _field4, _value4, _field5, _value5)
1095227569Sphilip
1096227569Sphilip#define	EFX_POPULATE_WORD_4(_word,					\
1097227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1098227569Sphilip	    _field4, _value4)						\
1099227569Sphilip	EFX_POPULATE_WORD_5(_word, EFX_DUMMY_FIELD, 0,			\
1100227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1101227569Sphilip	    _field4, _value4)
1102227569Sphilip
1103227569Sphilip#define	EFX_POPULATE_WORD_3(_word,					\
1104227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3)	\
1105227569Sphilip	EFX_POPULATE_WORD_4(_word, EFX_DUMMY_FIELD, 0,			\
1106227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3)
1107227569Sphilip
1108227569Sphilip#define	EFX_POPULATE_WORD_2(_word,					\
1109227569Sphilip	    _field1, _value1, _field2, _value2)				\
1110227569Sphilip	EFX_POPULATE_WORD_3(_word, EFX_DUMMY_FIELD, 0,			\
1111227569Sphilip	    _field1, _value1, _field2, _value2)
1112227569Sphilip
1113227569Sphilip#define	EFX_POPULATE_WORD_1(_word,					\
1114227569Sphilip	    _field1, _value1)						\
1115227569Sphilip	EFX_POPULATE_WORD_2(_word, EFX_DUMMY_FIELD, 0,			\
1116227569Sphilip	    _field1, _value1)
1117227569Sphilip
1118227569Sphilip#define	EFX_ZERO_WORD(_word)						\
1119227569Sphilip	EFX_POPULATE_WORD_1(_word, EFX_DUMMY_FIELD, 0)
1120227569Sphilip
1121227569Sphilip#define	EFX_SET_WORD(_word)						\
1122227569Sphilip	EFX_POPULATE_WORD_1(_word,					\
1123227569Sphilip	    EFX_WORD_0, 0xffff)
1124227569Sphilip
1125227569Sphilip/* Populate a byte field with various numbers of arguments */
1126227569Sphilip#define	EFX_POPULATE_BYTE_10 EFX_POPULATE_BYTE
1127227569Sphilip
1128227569Sphilip#define	EFX_POPULATE_BYTE_9(_byte,					\
1129227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1130227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1131227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9)	\
1132227569Sphilip	EFX_POPULATE_BYTE_10(_byte, EFX_DUMMY_FIELD, 0,			\
1133227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1134227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1135227569Sphilip	    _field7, _value7, _field8, _value8,	_field9, _value9)
1136227569Sphilip
1137227569Sphilip#define	EFX_POPULATE_BYTE_8(_byte,					\
1138227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1139227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1140227569Sphilip	    _field7, _value7, _field8, _value8)				\
1141227569Sphilip	EFX_POPULATE_BYTE_9(_byte, EFX_DUMMY_FIELD, 0,			\
1142227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1143227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1144227569Sphilip	    _field7, _value7, _field8, _value8)
1145227569Sphilip
1146227569Sphilip#define	EFX_POPULATE_BYTE_7(_byte,					\
1147227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1148227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1149227569Sphilip	    _field7, _value7)						\
1150227569Sphilip	EFX_POPULATE_BYTE_8(_byte, EFX_DUMMY_FIELD, 0,			\
1151227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1152227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6,	\
1153227569Sphilip	    _field7, _value7)
1154227569Sphilip
1155227569Sphilip#define	EFX_POPULATE_BYTE_6(_byte,					\
1156227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1157227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6)	\
1158227569Sphilip	EFX_POPULATE_BYTE_7(_byte, EFX_DUMMY_FIELD, 0,			\
1159227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1160227569Sphilip	    _field4, _value4, _field5, _value5,	_field6, _value6)
1161227569Sphilip
1162227569Sphilip#define	EFX_POPULATE_BYTE_5(_byte,					\
1163227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1164227569Sphilip	    _field4, _value4, _field5, _value5)				\
1165227569Sphilip	EFX_POPULATE_BYTE_6(_byte, EFX_DUMMY_FIELD, 0,			\
1166227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1167227569Sphilip	    _field4, _value4, _field5, _value5)
1168227569Sphilip
1169227569Sphilip#define	EFX_POPULATE_BYTE_4(_byte,					\
1170227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1171227569Sphilip	    _field4, _value4)						\
1172227569Sphilip	EFX_POPULATE_BYTE_5(_byte, EFX_DUMMY_FIELD, 0,			\
1173227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3,	\
1174227569Sphilip	    _field4, _value4)
1175227569Sphilip
1176227569Sphilip#define	EFX_POPULATE_BYTE_3(_byte,					\
1177227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3)	\
1178227569Sphilip	EFX_POPULATE_BYTE_4(_byte, EFX_DUMMY_FIELD, 0,			\
1179227569Sphilip	    _field1, _value1, _field2, _value2, _field3, _value3)
1180227569Sphilip
1181227569Sphilip#define	EFX_POPULATE_BYTE_2(_byte,					\
1182227569Sphilip	    _field1, _value1, _field2, _value2)				\
1183227569Sphilip	EFX_POPULATE_BYTE_3(_byte, EFX_DUMMY_FIELD, 0,			\
1184227569Sphilip	    _field1, _value1, _field2, _value2)
1185227569Sphilip
1186227569Sphilip#define	EFX_POPULATE_BYTE_1(_byte,					\
1187227569Sphilip	    _field1, _value1)						\
1188227569Sphilip	EFX_POPULATE_BYTE_2(_byte, EFX_DUMMY_FIELD, 0,			\
1189227569Sphilip	    _field1, _value1)
1190227569Sphilip
1191227569Sphilip#define	EFX_ZERO_BYTE(_byte)						\
1192227569Sphilip	EFX_POPULATE_BYTE_1(_byte, EFX_DUMMY_FIELD, 0)
1193227569Sphilip
1194227569Sphilip#define	EFX_SET_BYTE(_byte)						\
1195227569Sphilip	EFX_POPULATE_BYTE_1(_byte,					\
1196227569Sphilip	    EFX_BYTE_0, 0xff)
1197227569Sphilip
1198227569Sphilip/*
1199227569Sphilip * Modify a named field within an already-populated structure.  Used
1200227569Sphilip * for read-modify-write operations.
1201227569Sphilip */
1202227569Sphilip
1203227569Sphilip#define	EFX_INSERT_FIELD64(_min, _max, _field, _value)			\
1204227569Sphilip	__CPU_TO_LE_64(EFX_INSERT_FIELD_NATIVE64(_min, _max, _field, _value))
1205227569Sphilip
1206227569Sphilip#define	EFX_INSERT_FIELD32(_min, _max, _field, _value)			\
1207227569Sphilip	__CPU_TO_LE_32(EFX_INSERT_FIELD_NATIVE32(_min, _max, _field, _value))
1208227569Sphilip
1209227569Sphilip#define	EFX_INSERT_FIELD16(_min, _max, _field, _value)			\
1210227569Sphilip	__CPU_TO_LE_16(EFX_INSERT_FIELD_NATIVE16(_min, _max, _field, _value))
1211227569Sphilip
1212227569Sphilip#define	EFX_INSERT_FIELD8(_min, _max, _field, _value)			\
1213227569Sphilip	__NATIVE_8(EFX_INSERT_FIELD_NATIVE8(_min, _max, _field, _value))
1214227569Sphilip
1215227569Sphilip#define	EFX_INPLACE_MASK64(_min, _max, _field)			       	\
1216227569Sphilip	EFX_INSERT_FIELD64(_min, _max, _field, EFX_MASK64(_field))
1217227569Sphilip
1218227569Sphilip#define	EFX_INPLACE_MASK32(_min, _max, _field)			       	\
1219227569Sphilip	EFX_INSERT_FIELD32(_min, _max, _field, EFX_MASK32(_field))
1220227569Sphilip
1221227569Sphilip#define	EFX_INPLACE_MASK16(_min, _max, _field)			       	\
1222227569Sphilip	EFX_INSERT_FIELD16(_min, _max, _field, EFX_MASK16(_field))
1223227569Sphilip
1224227569Sphilip#define	EFX_INPLACE_MASK8(_min, _max, _field)			       	\
1225227569Sphilip	EFX_INSERT_FIELD8(_min, _max, _field, EFX_MASK8(_field))
1226227569Sphilip
1227227569Sphilip#define	EFX_SET_OWORD_FIELD64(_oword, _field, _value)			\
1228227569Sphilip	do {								\
1229227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1230227569Sphilip		(_oword).eo_u64[0] = (((_oword).eo_u64[0] &		\
1231227569Sphilip		    ~EFX_INPLACE_MASK64(0, 63, _field)) |		\
1232227569Sphilip		    EFX_INSERT_FIELD64(0, 63, _field, _value));		\
1233227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1234227569Sphilip		(_oword).eo_u64[1] = (((_oword).eo_u64[1] &		\
1235227569Sphilip		    ~EFX_INPLACE_MASK64(64, 127, _field)) |		\
1236227569Sphilip		    EFX_INSERT_FIELD64(64, 127, _field, _value));	\
1237227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1238227569Sphilip	} while (B_FALSE)
1239227569Sphilip
1240227569Sphilip#define	EFX_SET_OWORD_FIELD32(_oword, _field, _value)			\
1241227569Sphilip	do {								\
1242227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1243227569Sphilip		(_oword).eo_u32[0] = (((_oword).eo_u32[0] &		\
1244227569Sphilip		    ~EFX_INPLACE_MASK32(0, 31, _field)) |		\
1245227569Sphilip		    EFX_INSERT_FIELD32(0, 31, _field, _value));		\
1246227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1247227569Sphilip		(_oword).eo_u32[1] = (((_oword).eo_u32[1] &		\
1248227569Sphilip		    ~EFX_INPLACE_MASK32(32, 63, _field)) |		\
1249227569Sphilip		    EFX_INSERT_FIELD32(32, 63, _field, _value));	\
1250227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1251227569Sphilip		(_oword).eo_u32[2] = (((_oword).eo_u32[2] &		\
1252227569Sphilip		    ~EFX_INPLACE_MASK32(64, 95, _field)) |		\
1253227569Sphilip		    EFX_INSERT_FIELD32(64, 95, _field, _value));	\
1254227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1255227569Sphilip		(_oword).eo_u32[3] = (((_oword).eo_u32[3] &		\
1256227569Sphilip		    ~EFX_INPLACE_MASK32(96, 127, _field)) |		\
1257227569Sphilip		    EFX_INSERT_FIELD32(96, 127, _field, _value));	\
1258227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1259227569Sphilip	} while (B_FALSE)
1260227569Sphilip
1261227569Sphilip#define	EFX_SET_QWORD_FIELD64(_qword, _field, _value)			\
1262227569Sphilip	do {								\
1263227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1264227569Sphilip		(_qword).eq_u64[0] = (((_qword).eq_u64[0] &		\
1265227569Sphilip		    ~EFX_INPLACE_MASK64(0, 63, _field)) |		\
1266227569Sphilip		    EFX_INSERT_FIELD64(0, 63, _field, _value));		\
1267227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1268227569Sphilip	} while (B_FALSE)
1269227569Sphilip
1270227569Sphilip#define	EFX_SET_QWORD_FIELD32(_qword, _field, _value)			\
1271227569Sphilip	do {								\
1272227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1273227569Sphilip		(_qword).eq_u32[0] = (((_qword).eq_u32[0] &		\
1274227569Sphilip		    ~EFX_INPLACE_MASK32(0, 31, _field)) |		\
1275227569Sphilip		    EFX_INSERT_FIELD32(0, 31, _field, _value));		\
1276227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1277227569Sphilip		(_qword).eq_u32[1] = (((_qword).eq_u32[1] &		\
1278227569Sphilip		    ~EFX_INPLACE_MASK32(32, 63, _field)) |		\
1279227569Sphilip		    EFX_INSERT_FIELD32(32, 63, _field, _value));	\
1280227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1281227569Sphilip	} while (B_FALSE)
1282227569Sphilip
1283227569Sphilip#define	EFX_SET_DWORD_FIELD(_dword, _field, _value)			\
1284227569Sphilip	do {								\
1285227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1286227569Sphilip		(_dword).ed_u32[0] = (((_dword).ed_u32[0] &		\
1287227569Sphilip		    ~EFX_INPLACE_MASK32(0, 31, _field)) |		\
1288227569Sphilip		    EFX_INSERT_FIELD32(0, 31, _field, _value));		\
1289227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1290227569Sphilip	} while (B_FALSE)
1291227569Sphilip
1292227569Sphilip#define	EFX_SET_WORD_FIELD(_word, _field, _value)			\
1293227569Sphilip	do {								\
1294227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1295227569Sphilip		(_word).ew_u16[0] = (((_word).ew_u16[0] &		\
1296227569Sphilip		    ~EFX_INPLACE_MASK16(0, 15, _field)) |		\
1297227569Sphilip		    EFX_INSERT_FIELD16(0, 15, _field, _value));		\
1298227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1299227569Sphilip	} while (B_FALSE)
1300227569Sphilip
1301227569Sphilip#define	EFX_SET_BYTE_FIELD(_byte, _field, _value)			\
1302227569Sphilip	do {								\
1303227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1304227569Sphilip		(_byte).eb_u8[0] = (((_byte).eb_u8[0] &			\
1305227569Sphilip		    ~EFX_INPLACE_MASK8(0, 7, _field)) |			\
1306227569Sphilip		    EFX_INSERT_FIELD8(0, 7, _field, _value));		\
1307227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1308227569Sphilip	} while (B_FALSE)
1309227569Sphilip
1310227569Sphilip/*
1311227569Sphilip * Set or clear a numbered bit within an octword.
1312227569Sphilip */
1313227569Sphilip
1314227569Sphilip#define	EFX_SHIFT64(_bit, _base)					\
1315227569Sphilip	(((_bit) >= (_base) && (_bit) < (_base) + 64) ?			\
1316227569Sphilip		((uint64_t)1 << ((_bit) - (_base))) :			\
1317227569Sphilip		0U)
1318227569Sphilip
1319227569Sphilip#define	EFX_SHIFT32(_bit, _base)					\
1320227569Sphilip	(((_bit) >= (_base) && (_bit) < (_base) + 32) ?			\
1321227569Sphilip		((uint32_t)1 << ((_bit) - (_base))) :			\
1322227569Sphilip		0U)
1323227569Sphilip
1324227569Sphilip#define	EFX_SHIFT16(_bit, _base)					\
1325227569Sphilip	(((_bit) >= (_base) && (_bit) < (_base) + 16) ?			\
1326227569Sphilip		(uint16_t)(1 << ((_bit) - (_base))) :			\
1327227569Sphilip		0U)
1328227569Sphilip
1329227569Sphilip#define	EFX_SHIFT8(_bit, _base)						\
1330227569Sphilip	(((_bit) >= (_base) && (_bit) < (_base) + 8) ?			\
1331227569Sphilip		(uint8_t)(1 << ((_bit) - (_base))) :			\
1332227569Sphilip		0U)
1333227569Sphilip
1334227569Sphilip#define	EFX_SET_OWORD_BIT64(_oword, _bit)				\
1335227569Sphilip	do {								\
1336227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1337227569Sphilip		(_oword).eo_u64[0] |=					\
1338227569Sphilip		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)));	\
1339227569Sphilip		(_oword).eo_u64[1] |=					\
1340227569Sphilip		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)));	\
1341227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1342227569Sphilip	} while (B_FALSE)
1343227569Sphilip
1344227569Sphilip#define	EFX_SET_OWORD_BIT32(_oword, _bit)				\
1345227569Sphilip	do {								\
1346227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1347227569Sphilip		(_oword).eo_u32[0] |=					\
1348227569Sphilip		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)));	\
1349227569Sphilip		(_oword).eo_u32[1] |=					\
1350227569Sphilip		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)));	\
1351227569Sphilip		(_oword).eo_u32[2] |=					\
1352227569Sphilip		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)));	\
1353227569Sphilip		(_oword).eo_u32[3] |=					\
1354227569Sphilip		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)));	\
1355227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1356227569Sphilip	} while (B_FALSE)
1357227569Sphilip
1358227569Sphilip#define	EFX_CLEAR_OWORD_BIT64(_oword, _bit)				\
1359227569Sphilip	do {								\
1360227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1361227569Sphilip		(_oword).eo_u64[0] &=					\
1362227569Sphilip		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0)));	\
1363227569Sphilip		(_oword).eo_u64[1] &=					\
1364227569Sphilip		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(64)));	\
1365227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1366227569Sphilip	} while (B_FALSE)
1367227569Sphilip
1368227569Sphilip#define	EFX_CLEAR_OWORD_BIT32(_oword, _bit)				\
1369227569Sphilip	do {								\
1370227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1371227569Sphilip		(_oword).eo_u32[0] &=					\
1372227569Sphilip		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0)));	\
1373227569Sphilip		(_oword).eo_u32[1] &=					\
1374227569Sphilip		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32)));	\
1375227569Sphilip		(_oword).eo_u32[2] &=					\
1376227569Sphilip		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(64)));	\
1377227569Sphilip		(_oword).eo_u32[3] &=					\
1378227569Sphilip		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(96)));	\
1379227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1380227569Sphilip	} while (B_FALSE)
1381227569Sphilip
1382284555Sarybchik#define	EFX_TEST_OWORD_BIT64(_oword, _bit)				\
1383284555Sarybchik	(((_oword).eo_u64[0] &						\
1384284555Sarybchik		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) ||	\
1385284555Sarybchik	((_oword).eo_u64[1] &						\
1386284555Sarybchik		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(64)))))
1387284555Sarybchik
1388284555Sarybchik#define	EFX_TEST_OWORD_BIT32(_oword, _bit)				\
1389284555Sarybchik	(((_oword).eo_u32[0] &						\
1390284555Sarybchik		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) ||	\
1391284555Sarybchik	((_oword).eo_u32[1] &						\
1392284555Sarybchik		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))) ||	\
1393284555Sarybchik	((_oword).eo_u32[2] &						\
1394284555Sarybchik		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(64)))) ||	\
1395284555Sarybchik	((_oword).eo_u32[3] &						\
1396284555Sarybchik		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(96)))))
1397284555Sarybchik
1398284555Sarybchik
1399227569Sphilip#define	EFX_SET_QWORD_BIT64(_qword, _bit)				\
1400227569Sphilip	do {								\
1401227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1402227569Sphilip		(_qword).eq_u64[0] |=					\
1403227569Sphilip		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)));	\
1404227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1405227569Sphilip	} while (B_FALSE)
1406227569Sphilip
1407227569Sphilip#define	EFX_SET_QWORD_BIT32(_qword, _bit)				\
1408227569Sphilip	do {								\
1409227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1410227569Sphilip		(_qword).eq_u32[0] |=					\
1411227569Sphilip		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)));	\
1412227569Sphilip		(_qword).eq_u32[1] |=					\
1413227569Sphilip		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)));	\
1414227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1415227569Sphilip	} while (B_FALSE)
1416227569Sphilip
1417227569Sphilip#define	EFX_CLEAR_QWORD_BIT64(_qword, _bit)				\
1418227569Sphilip	do {								\
1419227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1420227569Sphilip		(_qword).eq_u64[0] &=					\
1421227569Sphilip		    __CPU_TO_LE_64(~EFX_SHIFT64(_bit, FIX_LINT(0)));	\
1422227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1423227569Sphilip	} while (B_FALSE)
1424227569Sphilip
1425227569Sphilip#define	EFX_CLEAR_QWORD_BIT32(_qword, _bit)				\
1426227569Sphilip	do {								\
1427227569Sphilip		_NOTE(CONSTANTCONDITION) 				\
1428227569Sphilip		(_qword).eq_u32[0] &=					\
1429227569Sphilip		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0)));	\
1430227569Sphilip		(_qword).eq_u32[1] &=					\
1431227569Sphilip		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(32)));	\
1432227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1433227569Sphilip	} while (B_FALSE)
1434227569Sphilip
1435284555Sarybchik#define	EFX_TEST_QWORD_BIT64(_qword, _bit)				\
1436284555Sarybchik	(((_qword).eq_u64[0] &						\
1437284555Sarybchik		    __CPU_TO_LE_64(EFX_SHIFT64(_bit, FIX_LINT(0)))) != 0)
1438284555Sarybchik
1439284555Sarybchik#define	EFX_TEST_QWORD_BIT32(_qword, _bit)				\
1440284555Sarybchik	(((_qword).eq_u32[0] &						\
1441284555Sarybchik		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) ||	\
1442284555Sarybchik	((_qword).eq_u32[1] &						\
1443284555Sarybchik		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(32)))))
1444284555Sarybchik
1445284555Sarybchik
1446227569Sphilip#define	EFX_SET_DWORD_BIT(_dword, _bit)					\
1447227569Sphilip	do {								\
1448227569Sphilip		(_dword).ed_u32[0] |=					\
1449227569Sphilip		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)));	\
1450227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1451227569Sphilip	} while (B_FALSE)
1452227569Sphilip
1453227569Sphilip#define	EFX_CLEAR_DWORD_BIT(_dword, _bit)				\
1454227569Sphilip	do {								\
1455227569Sphilip		(_dword).ed_u32[0] &=					\
1456227569Sphilip		    __CPU_TO_LE_32(~EFX_SHIFT32(_bit, FIX_LINT(0)));	\
1457227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1458227569Sphilip	} while (B_FALSE)
1459227569Sphilip
1460284555Sarybchik#define	EFX_TEST_DWORD_BIT(_dword, _bit)				\
1461284555Sarybchik	(((_dword).ed_u32[0] &						\
1462284555Sarybchik		    __CPU_TO_LE_32(EFX_SHIFT32(_bit, FIX_LINT(0)))) != 0)
1463284555Sarybchik
1464284555Sarybchik
1465227569Sphilip#define	EFX_SET_WORD_BIT(_word, _bit)					\
1466227569Sphilip	do {								\
1467227569Sphilip		(_word).ew_u16[0] |=					\
1468227569Sphilip		    __CPU_TO_LE_16(EFX_SHIFT16(_bit, FIX_LINT(0)));	\
1469227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1470227569Sphilip	} while (B_FALSE)
1471227569Sphilip
1472227569Sphilip#define	EFX_CLEAR_WORD_BIT(_word, _bit)					\
1473227569Sphilip	do {								\
1474227569Sphilip		(_word).ew_u32[0] &=					\
1475227569Sphilip		    __CPU_TO_LE_16(~EFX_SHIFT16(_bit, FIX_LINT(0)));	\
1476227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1477227569Sphilip	} while (B_FALSE)
1478227569Sphilip
1479284555Sarybchik#define	EFX_TEST_WORD_BIT(_word, _bit)					\
1480284555Sarybchik	(((_word).ew_u16[0] &						\
1481284555Sarybchik		    __CPU_TO_LE_16(EFX_SHIFT16(_bit, FIX_LINT(0)))) != 0)
1482284555Sarybchik
1483284555Sarybchik
1484227569Sphilip#define	EFX_SET_BYTE_BIT(_byte, _bit)					\
1485227569Sphilip	do {								\
1486227569Sphilip		(_byte).eb_u8[0] |=					\
1487227569Sphilip		    __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0)));		\
1488227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1489227569Sphilip	} while (B_FALSE)
1490227569Sphilip
1491227569Sphilip#define	EFX_CLEAR_BYTE_BIT(_byte, _bit)					\
1492227569Sphilip	do {								\
1493227569Sphilip		(_byte).eb_u8[0] &=					\
1494227569Sphilip		    __NATIVE_8(~EFX_SHIFT8(_bit, FIX_LINT(0)));		\
1495227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1496227569Sphilip	} while (B_FALSE)
1497227569Sphilip
1498284555Sarybchik#define	EFX_TEST_BYTE_BIT(_byte, _bit)					\
1499284555Sarybchik	(((_byte).eb_u8[0] &						\
1500284555Sarybchik		    __NATIVE_8(EFX_SHIFT8(_bit, FIX_LINT(0)))) != 0)
1501284555Sarybchik
1502284555Sarybchik
1503227569Sphilip#define	EFX_OR_OWORD64(_oword1, _oword2)				\
1504227569Sphilip	do {								\
1505227569Sphilip		(_oword1).eo_u64[0] |= (_oword2).eo_u64[0];		\
1506227569Sphilip		(_oword1).eo_u64[1] |= (_oword2).eo_u64[1];		\
1507227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1508227569Sphilip	} while (B_FALSE)
1509227569Sphilip
1510227569Sphilip#define	EFX_OR_OWORD32(_oword1, _oword2)				\
1511227569Sphilip	do {								\
1512227569Sphilip		(_oword1).eo_u32[0] |= (_oword2).eo_u32[0];		\
1513227569Sphilip		(_oword1).eo_u32[1] |= (_oword2).eo_u32[1];		\
1514227569Sphilip		(_oword1).eo_u32[2] |= (_oword2).eo_u32[2];		\
1515227569Sphilip		(_oword1).eo_u32[3] |= (_oword2).eo_u32[3];		\
1516227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1517227569Sphilip	} while (B_FALSE)
1518227569Sphilip
1519227569Sphilip#define	EFX_AND_OWORD64(_oword1, _oword2)				\
1520227569Sphilip	do {								\
1521227569Sphilip		(_oword1).eo_u64[0] &= (_oword2).eo_u64[0];		\
1522227569Sphilip		(_oword1).eo_u64[1] &= (_oword2).eo_u64[1];		\
1523227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1524227569Sphilip	} while (B_FALSE)
1525227569Sphilip
1526227569Sphilip#define	EFX_AND_OWORD32(_oword1, _oword2)				\
1527227569Sphilip	do {								\
1528227569Sphilip		(_oword1).eo_u32[0] &= (_oword2).eo_u32[0];		\
1529227569Sphilip		(_oword1).eo_u32[1] &= (_oword2).eo_u32[1];		\
1530227569Sphilip		(_oword1).eo_u32[2] &= (_oword2).eo_u32[2];		\
1531227569Sphilip		(_oword1).eo_u32[3] &= (_oword2).eo_u32[3];		\
1532227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1533227569Sphilip	} while (B_FALSE)
1534227569Sphilip
1535227569Sphilip#define	EFX_OR_QWORD64(_qword1, _qword2)				\
1536227569Sphilip	do {								\
1537227569Sphilip		(_qword1).eq_u64[0] |= (_qword2).eq_u64[0];		\
1538227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1539227569Sphilip	} while (B_FALSE)
1540227569Sphilip
1541227569Sphilip#define	EFX_OR_QWORD32(_qword1, _qword2)				\
1542227569Sphilip	do {								\
1543227569Sphilip		(_qword1).eq_u32[0] |= (_qword2).eq_u32[0];		\
1544227569Sphilip		(_qword1).eq_u32[1] |= (_qword2).eq_u32[1];		\
1545227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1546227569Sphilip	} while (B_FALSE)
1547227569Sphilip
1548227569Sphilip#define	EFX_AND_QWORD64(_qword1, _qword2)				\
1549227569Sphilip	do {								\
1550227569Sphilip		(_qword1).eq_u64[0] &= (_qword2).eq_u64[0];		\
1551227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1552227569Sphilip	} while (B_FALSE)
1553227569Sphilip
1554227569Sphilip#define	EFX_AND_QWORD32(_qword1, _qword2)				\
1555227569Sphilip	do {								\
1556227569Sphilip		(_qword1).eq_u32[0] &= (_qword2).eq_u32[0];		\
1557227569Sphilip		(_qword1).eq_u32[1] &= (_qword2).eq_u32[1];		\
1558227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1559227569Sphilip	} while (B_FALSE)
1560227569Sphilip
1561227569Sphilip#define	EFX_OR_DWORD(_dword1, _dword2)					\
1562227569Sphilip	do {								\
1563227569Sphilip		(_dword1).ed_u32[0] |= (_dword2).ed_u32[0];		\
1564227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1565227569Sphilip	} while (B_FALSE)
1566227569Sphilip
1567227569Sphilip#define	EFX_AND_DWORD(_dword1, _dword2)					\
1568227569Sphilip	do {								\
1569227569Sphilip		(_dword1).ed_u32[0] &= (_dword2).ed_u32[0];		\
1570227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1571227569Sphilip	} while (B_FALSE)
1572227569Sphilip
1573227569Sphilip#define	EFX_OR_WORD(_word1, _word2)					\
1574227569Sphilip	do {								\
1575227569Sphilip		(_word1).ew_u16[0] |= (_word2).ew_u16[0];		\
1576227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1577227569Sphilip	} while (B_FALSE)
1578227569Sphilip
1579227569Sphilip#define	EFX_AND_WORD(_word1, _word2)					\
1580227569Sphilip	do {								\
1581227569Sphilip		(_word1).ew_u16[0] &= (_word2).ew_u16[0];		\
1582227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1583227569Sphilip	} while (B_FALSE)
1584227569Sphilip
1585227569Sphilip#define	EFX_OR_BYTE(_byte1, _byte2)					\
1586227569Sphilip	do {								\
1587293965Sarybchik		(_byte1).eb_u8[0] |= (_byte2).eb_u8[0];			\
1588227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1589227569Sphilip	} while (B_FALSE)
1590227569Sphilip
1591227569Sphilip#define	EFX_AND_BYTE(_byte1, _byte2)					\
1592227569Sphilip	do {								\
1593227569Sphilip		(_byte1).eb_u8[0] &= (_byte2).eb_u8[0];			\
1594227569Sphilip	_NOTE(CONSTANTCONDITION) 					\
1595227569Sphilip	} while (B_FALSE)
1596227569Sphilip
1597227569Sphilip#if EFSYS_USE_UINT64
1598227569Sphilip#define	EFX_OWORD_FIELD		EFX_OWORD_FIELD64
1599227569Sphilip#define	EFX_QWORD_FIELD		EFX_QWORD_FIELD64
1600227569Sphilip#define	EFX_OWORD_IS_EQUAL	EFX_OWORD_IS_EQUAL64
1601227569Sphilip#define	EFX_QWORD_IS_EQUAL	EFX_QWORD_IS_EQUAL64
1602227569Sphilip#define	EFX_OWORD_IS_ZERO	EFX_OWORD_IS_ZERO64
1603227569Sphilip#define	EFX_QWORD_IS_ZERO	EFX_QWORD_IS_ZERO64
1604227569Sphilip#define	EFX_OWORD_IS_SET	EFX_OWORD_IS_SET64
1605227569Sphilip#define	EFX_QWORD_IS_SET	EFX_QWORD_IS_SET64
1606227569Sphilip#define	EFX_POPULATE_OWORD	EFX_POPULATE_OWORD64
1607227569Sphilip#define	EFX_POPULATE_QWORD	EFX_POPULATE_QWORD64
1608227569Sphilip#define	EFX_SET_OWORD_FIELD	EFX_SET_OWORD_FIELD64
1609227569Sphilip#define	EFX_SET_QWORD_FIELD	EFX_SET_QWORD_FIELD64
1610227569Sphilip#define	EFX_SET_OWORD_BIT	EFX_SET_OWORD_BIT64
1611227569Sphilip#define	EFX_CLEAR_OWORD_BIT	EFX_CLEAR_OWORD_BIT64
1612284555Sarybchik#define	EFX_TEST_OWORD_BIT	EFX_TEST_OWORD_BIT64
1613227569Sphilip#define	EFX_SET_QWORD_BIT	EFX_SET_QWORD_BIT64
1614227569Sphilip#define	EFX_CLEAR_QWORD_BIT	EFX_CLEAR_QWORD_BIT64
1615284555Sarybchik#define	EFX_TEST_QWORD_BIT	EFX_TEST_QWORD_BIT64
1616227569Sphilip#define	EFX_OR_OWORD		EFX_OR_OWORD64
1617227569Sphilip#define	EFX_AND_OWORD		EFX_AND_OWORD64
1618227569Sphilip#define	EFX_OR_QWORD		EFX_OR_QWORD64
1619284555Sarybchik#define	EFX_AND_QWORD		EFX_AND_QWORD64
1620227569Sphilip#else
1621227569Sphilip#define	EFX_OWORD_FIELD		EFX_OWORD_FIELD32
1622227569Sphilip#define	EFX_QWORD_FIELD		EFX_QWORD_FIELD32
1623227569Sphilip#define	EFX_OWORD_IS_EQUAL	EFX_OWORD_IS_EQUAL32
1624227569Sphilip#define	EFX_QWORD_IS_EQUAL	EFX_QWORD_IS_EQUAL32
1625227569Sphilip#define	EFX_OWORD_IS_ZERO	EFX_OWORD_IS_ZERO32
1626227569Sphilip#define	EFX_QWORD_IS_ZERO	EFX_QWORD_IS_ZERO32
1627227569Sphilip#define	EFX_OWORD_IS_SET	EFX_OWORD_IS_SET32
1628227569Sphilip#define	EFX_QWORD_IS_SET	EFX_QWORD_IS_SET32
1629227569Sphilip#define	EFX_POPULATE_OWORD	EFX_POPULATE_OWORD32
1630227569Sphilip#define	EFX_POPULATE_QWORD	EFX_POPULATE_QWORD32
1631227569Sphilip#define	EFX_SET_OWORD_FIELD	EFX_SET_OWORD_FIELD32
1632227569Sphilip#define	EFX_SET_QWORD_FIELD	EFX_SET_QWORD_FIELD32
1633227569Sphilip#define	EFX_SET_OWORD_BIT	EFX_SET_OWORD_BIT32
1634227569Sphilip#define	EFX_CLEAR_OWORD_BIT	EFX_CLEAR_OWORD_BIT32
1635284555Sarybchik#define	EFX_TEST_OWORD_BIT	EFX_TEST_OWORD_BIT32
1636227569Sphilip#define	EFX_SET_QWORD_BIT	EFX_SET_QWORD_BIT32
1637227569Sphilip#define	EFX_CLEAR_QWORD_BIT	EFX_CLEAR_QWORD_BIT32
1638284555Sarybchik#define	EFX_TEST_QWORD_BIT	EFX_TEST_QWORD_BIT32
1639227569Sphilip#define	EFX_OR_OWORD		EFX_OR_OWORD32
1640227569Sphilip#define	EFX_AND_OWORD		EFX_AND_OWORD32
1641227569Sphilip#define	EFX_OR_QWORD		EFX_OR_QWORD32
1642284555Sarybchik#define	EFX_AND_QWORD		EFX_AND_QWORD32
1643227569Sphilip#endif
1644227569Sphilip
1645227569Sphilip#ifdef	__cplusplus
1646227569Sphilip}
1647227569Sphilip#endif
1648227569Sphilip
1649227569Sphilip#endif	/* _SYS_EFX_TYPES_H */
1650