Lines Matching +full:high +full:- +full:to +full:- +full:low
1 /* SPDX-License-Identifier: GPL-2.0-only */
4 * Copyright 2005-2006 Fen Systems Ltd.
5 * Copyright 2006-2013 Solarflare Communications Inc.
14 * Efx NICs make extensive use of bitfields up to 128 bits
15 * wide. Since there is no native 128-bit datatype on most systems,
16 * and since 64-bit datatypes are inefficient on 32-bit systems and
20 * The NICs are PCI devices and therefore little-endian. Since most
21 * of the quantities that we deal with are DMAed to/from host memory,
23 * ef4_dword_t) to be little-endian.
46 /* Low bit number of the specified field */
50 /* High bit number of the specified field */
51 #define EF4_HIGH_BIT(field) (EF4_LOW_BIT(field) + EF4_WIDTH(field) - 1)
52 /* Mask equal in width to the specified field.
60 (((((u64) 1) << (width))) - 1))
62 /* Mask equal in width to the specified field.
71 (((((u32) 1) << (width))) - 1))
73 /* A doubleword (i.e. 4 byte) datatype - little-endian in HW */
78 /* A quadword (i.e. 8 byte) datatype - little-endian in HW */
85 /* An octword (eight-word, i.e. 16 byte) datatype - little-endian in HW */
109 * Extract bit field portion [low,high) from the native-endian element
112 * For example, suppose "element" represents the high 32 bits of a
113 * 64-bit value, and we wish to extract the bits belonging to the bit
114 * field occupying bits 28-45 of this 64-bit value.
121 * [0,high-low), with garbage in bits [high-low+1,...).
123 #define EF4_EXTRACT_NATIVE(native_element, min, max, low, high) \ argument
124 ((low) > (max) || (high) < (min) ? 0 : \
125 (low) > (min) ? \
126 (native_element) >> ((low) - (min)) : \
127 (native_element) << ((min) - (low)))
130 * Extract bit field portion [low,high) from the 64-bit little-endian
133 #define EF4_EXTRACT64(element, min, max, low, high) \ argument
134 EF4_EXTRACT_NATIVE(le64_to_cpu(element), min, max, low, high)
137 * Extract bit field portion [low,high) from the 32-bit little-endian
140 #define EF4_EXTRACT32(element, min, max, low, high) \ argument
141 EF4_EXTRACT_NATIVE(le32_to_cpu(element), min, max, low, high)
143 #define EF4_EXTRACT_OWORD64(oword, low, high) \ argument
144 ((EF4_EXTRACT64((oword).u64[0], 0, 63, low, high) | \
145 EF4_EXTRACT64((oword).u64[1], 64, 127, low, high)) & \
146 EF4_MASK64((high) + 1 - (low)))
148 #define EF4_EXTRACT_QWORD64(qword, low, high) \ argument
149 (EF4_EXTRACT64((qword).u64[0], 0, 63, low, high) & \
150 EF4_MASK64((high) + 1 - (low)))
152 #define EF4_EXTRACT_OWORD32(oword, low, high) \ argument
153 ((EF4_EXTRACT32((oword).u32[0], 0, 31, low, high) | \
154 EF4_EXTRACT32((oword).u32[1], 32, 63, low, high) | \
155 EF4_EXTRACT32((oword).u32[2], 64, 95, low, high) | \
156 EF4_EXTRACT32((oword).u32[3], 96, 127, low, high)) & \
157 EF4_MASK32((high) + 1 - (low)))
159 #define EF4_EXTRACT_QWORD32(qword, low, high) \ argument
160 ((EF4_EXTRACT32((qword).u32[0], 0, 31, low, high) | \
161 EF4_EXTRACT32((qword).u32[1], 32, 63, low, high)) & \
162 EF4_MASK32((high) + 1 - (low)))
164 #define EF4_EXTRACT_DWORD(dword, low, high) \ argument
165 (EF4_EXTRACT32((dword).u32[0], 0, 31, low, high) & \
166 EF4_MASK32((high) + 1 - (low)))
239 * Creates the portion of the bit field [low,high) that lies within
242 #define EF4_INSERT_NATIVE64(min, max, low, high, value) \ argument
243 (((low > max) || (high < min)) ? 0 : \
244 ((low > min) ? \
245 (((u64) (value)) << (low - min)) : \
246 (((u64) (value)) >> (min - low))))
248 #define EF4_INSERT_NATIVE32(min, max, low, high, value) \ argument
249 (((low > max) || (high < min)) ? 0 : \
250 ((low > min) ? \
251 (((u32) (value)) << (low - min)) : \
252 (((u32) (value)) >> (min - low))))
254 #define EF4_INSERT_NATIVE(min, max, low, high, value) \ argument
255 ((((max - min) >= 32) || ((high - low) >= 32)) ? \
256 EF4_INSERT_NATIVE64(min, max, low, high, value) : \
257 EF4_INSERT_NATIVE32(min, max, low, high, value))
418 * Modify a named field within an already-populated structure. Used
419 * for read-modify-write operations.
439 #define EF4_INSERT64(min, max, low, high, value) \ argument
440 cpu_to_le64(EF4_INSERT_NATIVE(min, max, low, high, value))
442 #define EF4_INSERT32(min, max, low, high, value) \ argument
443 cpu_to_le32(EF4_INSERT_NATIVE(min, max, low, high, value))
445 #define EF4_INPLACE_MASK64(min, max, low, high) \ argument
446 EF4_INSERT64(min, max, low, high, EF4_MASK64((high) + 1 - (low)))
448 #define EF4_INPLACE_MASK32(min, max, low, high) \ argument
449 EF4_INSERT32(min, max, low, high, EF4_MASK32((high) + 1 - (low)))
451 #define EF4_SET_OWORD64(oword, low, high, value) do { \ argument
453 & ~EF4_INPLACE_MASK64(0, 63, low, high)) \
454 | EF4_INSERT64(0, 63, low, high, value)); \
456 & ~EF4_INPLACE_MASK64(64, 127, low, high)) \
457 | EF4_INSERT64(64, 127, low, high, value)); \
460 #define EF4_SET_QWORD64(qword, low, high, value) do { \ argument
462 & ~EF4_INPLACE_MASK64(0, 63, low, high)) \
463 | EF4_INSERT64(0, 63, low, high, value)); \
466 #define EF4_SET_OWORD32(oword, low, high, value) do { \ argument
468 & ~EF4_INPLACE_MASK32(0, 31, low, high)) \
469 | EF4_INSERT32(0, 31, low, high, value)); \
471 & ~EF4_INPLACE_MASK32(32, 63, low, high)) \
472 | EF4_INSERT32(32, 63, low, high, value)); \
474 & ~EF4_INPLACE_MASK32(64, 95, low, high)) \
475 | EF4_INSERT32(64, 95, low, high, value)); \
477 & ~EF4_INPLACE_MASK32(96, 127, low, high)) \
478 | EF4_INSERT32(96, 127, low, high, value)); \
481 #define EF4_SET_QWORD32(qword, low, high, value) do { \ argument
483 & ~EF4_INPLACE_MASK32(0, 31, low, high)) \
484 | EF4_INSERT32(0, 31, low, high, value)); \
486 & ~EF4_INPLACE_MASK32(32, 63, low, high)) \
487 | EF4_INSERT32(32, 63, low, high, value)); \
490 #define EF4_SET_DWORD32(dword, low, high, value) do { \ argument
492 & ~EF4_INPLACE_MASK32(0, 31, low, high)) \
493 | EF4_INSERT32(0, 31, low, high, value)); \
526 /* Used to avoid compiler warnings about shift range exceeding width