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