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