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