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