You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

etherfabric.h 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. /**************************************************************************
  2. *
  3. * GPL net driver for Level 5 Etherfabric network cards
  4. *
  5. * Written by Michael Brown <mbrown@fensystems.co.uk>
  6. *
  7. * Copyright Fen Systems Ltd. 2005
  8. * Copyright Level 5 Networks Inc. 2005
  9. *
  10. * This software may be used and distributed according to the terms of
  11. * the GNU General Public License (GPL), incorporated herein by
  12. * reference. Drivers based on or derived from this code fall under
  13. * the GPL and must retain the authorship, copyright and license
  14. * notice. This file is not a complete program and may only be used
  15. * when the entire operating system is licensed under the GPL.
  16. *
  17. **************************************************************************
  18. */
  19. #ifndef EFAB_BITFIELD_H
  20. #define EFAB_BITFIELD_H
  21. /** @file
  22. *
  23. * Etherfabric bitfield access
  24. *
  25. * Etherfabric NICs make extensive use of bitfields up to 128 bits
  26. * wide. Since there is no native 128-bit datatype on most systems,
  27. * and since 64-bit datatypes are inefficient on 32-bit systems and
  28. * vice versa, we wrap accesses in a way that uses the most efficient
  29. * datatype.
  30. *
  31. * The NICs are PCI devices and therefore little-endian. Since most
  32. * of the quantities that we deal with are DMAed to/from host memory,
  33. * we define our datatypes (efab_oword_t, efab_qword_t and
  34. * efab_dword_t) to be little-endian.
  35. *
  36. * In the less common case of using PIO for individual register
  37. * writes, we construct the little-endian datatype in host memory and
  38. * then use non-swapping equivalents of writel/writeq, rather than
  39. * constructing a native-endian datatype and relying on the implicit
  40. * byte-swapping done by writel/writeq. (We use a similar strategy
  41. * for register reads.)
  42. */
  43. /** Dummy field low bit number */
  44. #define EFAB_DUMMY_FIELD_LBN 0
  45. /** Dummy field width */
  46. #define EFAB_DUMMY_FIELD_WIDTH 0
  47. /** Dword 0 low bit number */
  48. #define EFAB_DWORD_0_LBN 0
  49. /** Dword 0 width */
  50. #define EFAB_DWORD_0_WIDTH 32
  51. /** Dword 1 low bit number */
  52. #define EFAB_DWORD_1_LBN 32
  53. /** Dword 1 width */
  54. #define EFAB_DWORD_1_WIDTH 32
  55. /** Dword 2 low bit number */
  56. #define EFAB_DWORD_2_LBN 64
  57. /** Dword 2 width */
  58. #define EFAB_DWORD_2_WIDTH 32
  59. /** Dword 3 low bit number */
  60. #define EFAB_DWORD_3_LBN 96
  61. /** Dword 3 width */
  62. #define EFAB_DWORD_3_WIDTH 32
  63. /** Specified attribute (e.g. LBN) of the specified field */
  64. #define EFAB_VAL(field,attribute) field ## _ ## attribute
  65. /** Low bit number of the specified field */
  66. #define EFAB_LOW_BIT( field ) EFAB_VAL ( field, LBN )
  67. /** Bit width of the specified field */
  68. #define EFAB_WIDTH( field ) EFAB_VAL ( field, WIDTH )
  69. /** High bit number of the specified field */
  70. #define EFAB_HIGH_BIT(field) ( EFAB_LOW_BIT(field) + EFAB_WIDTH(field) - 1 )
  71. /** Mask equal in width to the specified field.
  72. *
  73. * For example, a field with width 5 would have a mask of 0x1f.
  74. *
  75. * The maximum width mask that can be generated is 64 bits.
  76. */
  77. #define EFAB_MASK64( field ) \
  78. ( EFAB_WIDTH(field) == 64 ? ~( ( uint64_t ) 0 ) : \
  79. ( ( ( ( ( uint64_t ) 1 ) << EFAB_WIDTH(field) ) ) - 1 ) )
  80. /** Mask equal in width to the specified field.
  81. *
  82. * For example, a field with width 5 would have a mask of 0x1f.
  83. *
  84. * The maximum width mask that can be generated is 32 bits. Use
  85. * EFAB_MASK64 for higher width fields.
  86. */
  87. #define EFAB_MASK32( field ) \
  88. ( EFAB_WIDTH(field) == 32 ? ~( ( uint32_t ) 0 ) : \
  89. ( ( ( ( ( uint32_t ) 1 ) << EFAB_WIDTH(field) ) ) - 1 ) )
  90. /** A doubleword (i.e. 4 byte) datatype
  91. *
  92. * This datatype is defined to be little-endian.
  93. */
  94. typedef union efab_dword {
  95. uint32_t u32[1];
  96. uint32_t opaque; /* For bitwise operations between two efab_dwords */
  97. } efab_dword_t;
  98. /** A quadword (i.e. 8 byte) datatype
  99. *
  100. * This datatype is defined to be little-endian.
  101. */
  102. typedef union efab_qword {
  103. uint64_t u64[1];
  104. uint32_t u32[2];
  105. efab_dword_t dword[2];
  106. } efab_qword_t;
  107. /**
  108. * An octword (eight-word, i.e. 16 byte) datatype
  109. *
  110. * This datatype is defined to be little-endian.
  111. */
  112. typedef union efab_oword {
  113. uint64_t u64[2];
  114. efab_qword_t qword[2];
  115. uint32_t u32[4];
  116. efab_dword_t dword[4];
  117. } efab_oword_t;
  118. /** Format string for printing an efab_dword_t */
  119. #define EFAB_DWORD_FMT "%08x"
  120. /** Format string for printing an efab_qword_t */
  121. #define EFAB_QWORD_FMT "%08x:%08x"
  122. /** Format string for printing an efab_oword_t */
  123. #define EFAB_OWORD_FMT "%08x:%08x:%08x:%08x"
  124. /** printk parameters for printing an efab_dword_t */
  125. #define EFAB_DWORD_VAL(dword) \
  126. ( ( unsigned int ) le32_to_cpu ( (dword).u32[0] ) )
  127. /** printk parameters for printing an efab_qword_t */
  128. #define EFAB_QWORD_VAL(qword) \
  129. ( ( unsigned int ) le32_to_cpu ( (qword).u32[1] ) ), \
  130. ( ( unsigned int ) le32_to_cpu ( (qword).u32[0] ) )
  131. /** printk parameters for printing an efab_oword_t */
  132. #define EFAB_OWORD_VAL(oword) \
  133. ( ( unsigned int ) le32_to_cpu ( (oword).u32[3] ) ), \
  134. ( ( unsigned int ) le32_to_cpu ( (oword).u32[2] ) ), \
  135. ( ( unsigned int ) le32_to_cpu ( (oword).u32[1] ) ), \
  136. ( ( unsigned int ) le32_to_cpu ( (oword).u32[0] ) )
  137. /**
  138. * Extract bit field portion [low,high) from the native-endian element
  139. * which contains bits [min,max).
  140. *
  141. * For example, suppose "element" represents the high 32 bits of a
  142. * 64-bit value, and we wish to extract the bits belonging to the bit
  143. * field occupying bits 28-45 of this 64-bit value.
  144. *
  145. * Then EFAB_EXTRACT ( element, 32, 63, 28, 45 ) would give
  146. *
  147. * ( element ) << 4
  148. *
  149. * The result will contain the relevant bits filled in in the range
  150. * [0,high-low), with garbage in bits [high-low+1,...).
  151. */
  152. #define EFAB_EXTRACT_NATIVE( native_element, min ,max ,low ,high ) \
  153. ( ( ( low > max ) || ( high < min ) ) ? 0 : \
  154. ( ( low > min ) ? \
  155. ( (native_element) >> ( low - min ) ) : \
  156. ( (native_element) << ( min - low ) ) ) )
  157. /**
  158. * Extract bit field portion [low,high) from the 64-bit little-endian
  159. * element which contains bits [min,max)
  160. */
  161. #define EFAB_EXTRACT64( element, min, max, low, high ) \
  162. EFAB_EXTRACT_NATIVE ( le64_to_cpu(element), min, max, low, high )
  163. /**
  164. * Extract bit field portion [low,high) from the 32-bit little-endian
  165. * element which contains bits [min,max)
  166. */
  167. #define EFAB_EXTRACT32( element, min, max, low, high ) \
  168. EFAB_EXTRACT_NATIVE ( le32_to_cpu(element), min, max, low, high )
  169. #define EFAB_EXTRACT_OWORD64( oword, low, high ) \
  170. ( EFAB_EXTRACT64 ( (oword).u64[0], 0, 63, low, high ) | \
  171. EFAB_EXTRACT64 ( (oword).u64[1], 64, 127, low, high ) )
  172. #define EFAB_EXTRACT_QWORD64( qword, low, high ) \
  173. ( EFAB_EXTRACT64 ( (qword).u64[0], 0, 63, low, high ) )
  174. #define EFAB_EXTRACT_OWORD32( oword, low, high ) \
  175. ( EFAB_EXTRACT32 ( (oword).u32[0], 0, 31, low, high ) | \
  176. EFAB_EXTRACT32 ( (oword).u32[1], 32, 63, low, high ) | \
  177. EFAB_EXTRACT32 ( (oword).u32[2], 64, 95, low, high ) | \
  178. EFAB_EXTRACT32 ( (oword).u32[3], 96, 127, low, high ) )
  179. #define EFAB_EXTRACT_QWORD32( qword, low, high ) \
  180. ( EFAB_EXTRACT32 ( (qword).u32[0], 0, 31, low, high ) | \
  181. EFAB_EXTRACT32 ( (qword).u32[1], 32, 63, low, high ) )
  182. #define EFAB_EXTRACT_DWORD( dword, low, high ) \
  183. ( EFAB_EXTRACT32 ( (dword).u32[0], 0, 31, low, high ) )
  184. #define EFAB_OWORD_FIELD64( oword, field ) \
  185. ( EFAB_EXTRACT_OWORD64 ( oword, EFAB_LOW_BIT ( field ), \
  186. EFAB_HIGH_BIT ( field ) ) & \
  187. EFAB_MASK64 ( field ) )
  188. #define EFAB_QWORD_FIELD64( qword, field ) \
  189. ( EFAB_EXTRACT_QWORD64 ( qword, EFAB_LOW_BIT ( field ), \
  190. EFAB_HIGH_BIT ( field ) ) & \
  191. EFAB_MASK64 ( field ) )
  192. #define EFAB_OWORD_FIELD32( oword, field ) \
  193. ( EFAB_EXTRACT_OWORD32 ( oword, EFAB_LOW_BIT ( field ), \
  194. EFAB_HIGH_BIT ( field ) ) & \
  195. EFAB_MASK32 ( field ) )
  196. #define EFAB_QWORD_FIELD32( qword, field ) \
  197. ( EFAB_EXTRACT_QWORD32 ( qword, EFAB_LOW_BIT ( field ), \
  198. EFAB_HIGH_BIT ( field ) ) & \
  199. EFAB_MASK32 ( field ) )
  200. #define EFAB_DWORD_FIELD( dword, field ) \
  201. ( EFAB_EXTRACT_DWORD ( dword, EFAB_LOW_BIT ( field ), \
  202. EFAB_HIGH_BIT ( field ) ) & \
  203. EFAB_MASK32 ( field ) )
  204. #define EFAB_OWORD_IS_ZERO64( oword ) \
  205. ( ! ( (oword).u64[0] || (oword).u64[1] ) )
  206. #define EFAB_QWORD_IS_ZERO64( qword ) \
  207. ( ! ( (qword).u64[0] ) )
  208. #define EFAB_OWORD_IS_ZERO32( oword ) \
  209. ( ! ( (oword).u32[0] || (oword).u32[1] || \
  210. (oword).u32[2] || (oword).u32[3] ) )
  211. #define EFAB_QWORD_IS_ZERO32( qword ) \
  212. ( ! ( (qword).u32[0] || (qword).u32[1] ) )
  213. #define EFAB_DWORD_IS_ZERO( dword ) \
  214. ( ! ( (dword).u32[0] ) )
  215. #define EFAB_OWORD_IS_ALL_ONES64( oword ) \
  216. ( ( (oword).u64[0] & (oword).u64[1] ) == ~( ( uint64_t ) 0 ) )
  217. #define EFAB_QWORD_IS_ALL_ONES64( qword ) \
  218. ( (qword).u64[0] == ~( ( uint64_t ) 0 ) )
  219. #define EFAB_OWORD_IS_ALL_ONES32( oword ) \
  220. ( ( (oword).u32[0] & (oword).u32[1] & \
  221. (oword).u32[2] & (oword).u32[3] ) == ~( ( uint32_t ) 0 ) )
  222. #define EFAB_QWORD_IS_ALL_ONES32( qword ) \
  223. ( ( (qword).u32[0] & (qword).u32[1] ) == ~( ( uint32_t ) 0 ) )
  224. #define EFAB_DWORD_IS_ALL_ONES( dword ) \
  225. ( (dword).u32[0] == ~( ( uint32_t ) 0 ) )
  226. #if ( BITS_PER_LONG == 64 )
  227. #define EFAB_OWORD_FIELD EFAB_OWORD_FIELD64
  228. #define EFAB_QWORD_FIELD EFAB_QWORD_FIELD64
  229. #define EFAB_OWORD_IS_ZERO EFAB_OWORD_IS_ZERO64
  230. #define EFAB_QWORD_IS_ZERO EFAB_QWORD_IS_ZERO64
  231. #define EFAB_OWORD_IS_ALL_ONES EFAB_OWORD_IS_ALL_ONES64
  232. #define EFAB_QWORD_IS_ALL_ONES EFAB_QWORD_IS_ALL_ONES64
  233. #else
  234. #define EFAB_OWORD_FIELD EFAB_OWORD_FIELD32
  235. #define EFAB_QWORD_FIELD EFAB_QWORD_FIELD32
  236. #define EFAB_OWORD_IS_ZERO EFAB_OWORD_IS_ZERO32
  237. #define EFAB_QWORD_IS_ZERO EFAB_QWORD_IS_ZERO32
  238. #define EFAB_OWORD_IS_ALL_ONES EFAB_OWORD_IS_ALL_ONES32
  239. #define EFAB_QWORD_IS_ALL_ONES EFAB_QWORD_IS_ALL_ONES32
  240. #endif
  241. /**
  242. * Construct bit field portion
  243. *
  244. * Creates the portion of the bit field [low,high) that lies within
  245. * the range [min,max).
  246. */
  247. #define EFAB_INSERT_NATIVE64( min, max, low, high, value ) \
  248. ( ( ( low > max ) || ( high < min ) ) ? 0 : \
  249. ( ( low > min ) ? \
  250. ( ( ( uint64_t ) (value) ) << ( low - min ) ) : \
  251. ( ( ( uint64_t ) (value) ) >> ( min - low ) ) ) )
  252. #define EFAB_INSERT_NATIVE32( min, max, low, high, value ) \
  253. ( ( ( low > max ) || ( high < min ) ) ? 0 : \
  254. ( ( low > min ) ? \
  255. ( ( ( uint32_t ) (value) ) << ( low - min ) ) : \
  256. ( ( ( uint32_t ) (value) ) >> ( min - low ) ) ) )
  257. #define EFAB_INSERT_NATIVE( min, max, low, high, value ) \
  258. ( ( ( ( max - min ) >= 32 ) || \
  259. ( ( high - low ) >= 32 ) ) \
  260. ? EFAB_INSERT_NATIVE64 ( min, max, low, high, value ) \
  261. : EFAB_INSERT_NATIVE32 ( min, max, low, high, value ) )
  262. /**
  263. * Construct bit field portion
  264. *
  265. * Creates the portion of the named bit field that lies within the
  266. * range [min,max).
  267. */
  268. #define EFAB_INSERT_FIELD_NATIVE( min, max, field, value ) \
  269. EFAB_INSERT_NATIVE ( min, max, EFAB_LOW_BIT ( field ), \
  270. EFAB_HIGH_BIT ( field ), value )
  271. /**
  272. * Construct bit field
  273. *
  274. * Creates the portion of the named bit fields that lie within the
  275. * range [min,max).
  276. */
  277. #define EFAB_INSERT_FIELDS_NATIVE( min, max, \
  278. field1, value1, \
  279. field2, value2, \
  280. field3, value3, \
  281. field4, value4, \
  282. field5, value5, \
  283. field6, value6, \
  284. field7, value7, \
  285. field8, value8, \
  286. field9, value9, \
  287. field10, value10 ) \
  288. ( EFAB_INSERT_FIELD_NATIVE ( min, max, field1, value1 ) | \
  289. EFAB_INSERT_FIELD_NATIVE ( min, max, field2, value2 ) | \
  290. EFAB_INSERT_FIELD_NATIVE ( min, max, field3, value3 ) | \
  291. EFAB_INSERT_FIELD_NATIVE ( min, max, field4, value4 ) | \
  292. EFAB_INSERT_FIELD_NATIVE ( min, max, field5, value5 ) | \
  293. EFAB_INSERT_FIELD_NATIVE ( min, max, field6, value6 ) | \
  294. EFAB_INSERT_FIELD_NATIVE ( min, max, field7, value7 ) | \
  295. EFAB_INSERT_FIELD_NATIVE ( min, max, field8, value8 ) | \
  296. EFAB_INSERT_FIELD_NATIVE ( min, max, field9, value9 ) | \
  297. EFAB_INSERT_FIELD_NATIVE ( min, max, field10, value10 ) )
  298. #define EFAB_INSERT_FIELDS64( ... ) \
  299. cpu_to_le64 ( EFAB_INSERT_FIELDS_NATIVE ( __VA_ARGS__ ) )
  300. #define EFAB_INSERT_FIELDS32( ... ) \
  301. cpu_to_le32 ( EFAB_INSERT_FIELDS_NATIVE ( __VA_ARGS__ ) )
  302. #define EFAB_POPULATE_OWORD64( oword, ... ) do { \
  303. (oword).u64[0] = EFAB_INSERT_FIELDS64 ( 0, 63, __VA_ARGS__ );\
  304. (oword).u64[1] = EFAB_INSERT_FIELDS64 ( 64, 127, __VA_ARGS__ );\
  305. } while ( 0 )
  306. #define EFAB_POPULATE_QWORD64( qword, ... ) do { \
  307. (qword).u64[0] = EFAB_INSERT_FIELDS64 ( 0, 63, __VA_ARGS__ );\
  308. } while ( 0 )
  309. #define EFAB_POPULATE_OWORD32( oword, ... ) do { \
  310. (oword).u32[0] = EFAB_INSERT_FIELDS32 ( 0, 31, __VA_ARGS__ );\
  311. (oword).u32[1] = EFAB_INSERT_FIELDS32 ( 32, 63, __VA_ARGS__ );\
  312. (oword).u32[2] = EFAB_INSERT_FIELDS32 ( 64, 95, __VA_ARGS__ );\
  313. (oword).u32[3] = EFAB_INSERT_FIELDS32 ( 96, 127, __VA_ARGS__ );\
  314. } while ( 0 )
  315. #define EFAB_POPULATE_QWORD32( qword, ... ) do { \
  316. (qword).u32[0] = EFAB_INSERT_FIELDS32 ( 0, 31, __VA_ARGS__ );\
  317. (qword).u32[1] = EFAB_INSERT_FIELDS32 ( 32, 63, __VA_ARGS__ );\
  318. } while ( 0 )
  319. #define EFAB_POPULATE_DWORD( dword, ... ) do { \
  320. (dword).u32[0] = EFAB_INSERT_FIELDS32 ( 0, 31, __VA_ARGS__ );\
  321. } while ( 0 )
  322. #if ( BITS_PER_LONG == 64 )
  323. #define EFAB_POPULATE_OWORD EFAB_POPULATE_OWORD64
  324. #define EFAB_POPULATE_QWORD EFAB_POPULATE_QWORD64
  325. #else
  326. #define EFAB_POPULATE_OWORD EFAB_POPULATE_OWORD32
  327. #define EFAB_POPULATE_QWORD EFAB_POPULATE_QWORD32
  328. #endif
  329. /* Populate an octword field with various numbers of arguments */
  330. #define EFAB_POPULATE_OWORD_10 EFAB_POPULATE_OWORD
  331. #define EFAB_POPULATE_OWORD_9( oword, ... ) \
  332. EFAB_POPULATE_OWORD_10 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  333. #define EFAB_POPULATE_OWORD_8( oword, ... ) \
  334. EFAB_POPULATE_OWORD_9 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  335. #define EFAB_POPULATE_OWORD_7( oword, ... ) \
  336. EFAB_POPULATE_OWORD_8 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  337. #define EFAB_POPULATE_OWORD_6( oword, ... ) \
  338. EFAB_POPULATE_OWORD_7 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  339. #define EFAB_POPULATE_OWORD_5( oword, ... ) \
  340. EFAB_POPULATE_OWORD_6 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  341. #define EFAB_POPULATE_OWORD_4( oword, ... ) \
  342. EFAB_POPULATE_OWORD_5 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  343. #define EFAB_POPULATE_OWORD_3( oword, ... ) \
  344. EFAB_POPULATE_OWORD_4 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  345. #define EFAB_POPULATE_OWORD_2( oword, ... ) \
  346. EFAB_POPULATE_OWORD_3 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  347. #define EFAB_POPULATE_OWORD_1( oword, ... ) \
  348. EFAB_POPULATE_OWORD_2 ( oword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  349. #define EFAB_ZERO_OWORD( oword ) \
  350. EFAB_POPULATE_OWORD_1 ( oword, EFAB_DUMMY_FIELD, 0 )
  351. #define EFAB_SET_OWORD( oword ) \
  352. EFAB_POPULATE_OWORD_4 ( oword, \
  353. EFAB_DWORD_0, 0xffffffff, \
  354. EFAB_DWORD_1, 0xffffffff, \
  355. EFAB_DWORD_2, 0xffffffff, \
  356. EFAB_DWORD_3, 0xffffffff )
  357. /* Populate a quadword field with various numbers of arguments */
  358. #define EFAB_POPULATE_QWORD_10 EFAB_POPULATE_QWORD
  359. #define EFAB_POPULATE_QWORD_9( qword, ... ) \
  360. EFAB_POPULATE_QWORD_10 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  361. #define EFAB_POPULATE_QWORD_8( qword, ... ) \
  362. EFAB_POPULATE_QWORD_9 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  363. #define EFAB_POPULATE_QWORD_7( qword, ... ) \
  364. EFAB_POPULATE_QWORD_8 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  365. #define EFAB_POPULATE_QWORD_6( qword, ... ) \
  366. EFAB_POPULATE_QWORD_7 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  367. #define EFAB_POPULATE_QWORD_5( qword, ... ) \
  368. EFAB_POPULATE_QWORD_6 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  369. #define EFAB_POPULATE_QWORD_4( qword, ... ) \
  370. EFAB_POPULATE_QWORD_5 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  371. #define EFAB_POPULATE_QWORD_3( qword, ... ) \
  372. EFAB_POPULATE_QWORD_4 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  373. #define EFAB_POPULATE_QWORD_2( qword, ... ) \
  374. EFAB_POPULATE_QWORD_3 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  375. #define EFAB_POPULATE_QWORD_1( qword, ... ) \
  376. EFAB_POPULATE_QWORD_2 ( qword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  377. #define EFAB_ZERO_QWORD( qword ) \
  378. EFAB_POPULATE_QWORD_1 ( qword, EFAB_DUMMY_FIELD, 0 )
  379. #define EFAB_SET_QWORD( qword ) \
  380. EFAB_POPULATE_QWORD_2 ( qword, \
  381. EFAB_DWORD_0, 0xffffffff, \
  382. EFAB_DWORD_1, 0xffffffff )
  383. /* Populate a dword field with various numbers of arguments */
  384. #define EFAB_POPULATE_DWORD_10 EFAB_POPULATE_DWORD
  385. #define EFAB_POPULATE_DWORD_9( dword, ... ) \
  386. EFAB_POPULATE_DWORD_10 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  387. #define EFAB_POPULATE_DWORD_8( dword, ... ) \
  388. EFAB_POPULATE_DWORD_9 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  389. #define EFAB_POPULATE_DWORD_7( dword, ... ) \
  390. EFAB_POPULATE_DWORD_8 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  391. #define EFAB_POPULATE_DWORD_6( dword, ... ) \
  392. EFAB_POPULATE_DWORD_7 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  393. #define EFAB_POPULATE_DWORD_5( dword, ... ) \
  394. EFAB_POPULATE_DWORD_6 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  395. #define EFAB_POPULATE_DWORD_4( dword, ... ) \
  396. EFAB_POPULATE_DWORD_5 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  397. #define EFAB_POPULATE_DWORD_3( dword, ... ) \
  398. EFAB_POPULATE_DWORD_4 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  399. #define EFAB_POPULATE_DWORD_2( dword, ... ) \
  400. EFAB_POPULATE_DWORD_3 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  401. #define EFAB_POPULATE_DWORD_1( dword, ... ) \
  402. EFAB_POPULATE_DWORD_2 ( dword, EFAB_DUMMY_FIELD, 0, __VA_ARGS__ )
  403. #define EFAB_ZERO_DWORD( dword ) \
  404. EFAB_POPULATE_DWORD_1 ( dword, EFAB_DUMMY_FIELD, 0 )
  405. #define EFAB_SET_DWORD( dword ) \
  406. EFAB_POPULATE_DWORD_1 ( dword, EFAB_DWORD_0, 0xffffffff )
  407. /*
  408. * Modify a named field within an already-populated structure. Used
  409. * for read-modify-write operations.
  410. *
  411. */
  412. #define EFAB_INSERT_FIELD64( ... ) \
  413. cpu_to_le64 ( EFAB_INSERT_FIELD_NATIVE ( __VA_ARGS__ ) )
  414. #define EFAB_INSERT_FIELD32( ... ) \
  415. cpu_to_le32 ( EFAB_INSERT_FIELD_NATIVE ( __VA_ARGS__ ) )
  416. #define EFAB_INPLACE_MASK64( min, max, field ) \
  417. EFAB_INSERT_FIELD64 ( min, max, field, EFAB_MASK64 ( field ) )
  418. #define EFAB_INPLACE_MASK32( min, max, field ) \
  419. EFAB_INSERT_FIELD32 ( min, max, field, EFAB_MASK32 ( field ) )
  420. #define EFAB_SET_OWORD_FIELD64( oword, field, value ) do { \
  421. (oword).u64[0] = ( ( (oword).u64[0] \
  422. & ~EFAB_INPLACE_MASK64 ( 0, 63, field ) ) \
  423. | EFAB_INSERT_FIELD64 ( 0, 63, field, value ) ); \
  424. (oword).u64[1] = ( ( (oword).u64[1] \
  425. & ~EFAB_INPLACE_MASK64 ( 64, 127, field ) ) \
  426. | EFAB_INSERT_FIELD64 ( 64, 127, field, value ) ); \
  427. } while ( 0 )
  428. #define EFAB_SET_QWORD_FIELD64( qword, field, value ) do { \
  429. (qword).u64[0] = ( ( (qword).u64[0] \
  430. & ~EFAB_INPLACE_MASK64 ( 0, 63, field ) ) \
  431. | EFAB_INSERT_FIELD64 ( 0, 63, field, value ) ); \
  432. } while ( 0 )
  433. #define EFAB_SET_OWORD_FIELD32( oword, field, value ) do { \
  434. (oword).u32[0] = ( ( (oword).u32[0] \
  435. & ~EFAB_INPLACE_MASK32 ( 0, 31, field ) ) \
  436. | EFAB_INSERT_FIELD32 ( 0, 31, field, value ) ); \
  437. (oword).u32[1] = ( ( (oword).u32[1] \
  438. & ~EFAB_INPLACE_MASK32 ( 32, 63, field ) ) \
  439. | EFAB_INSERT_FIELD32 ( 32, 63, field, value ) ); \
  440. (oword).u32[2] = ( ( (oword).u32[2] \
  441. & ~EFAB_INPLACE_MASK32 ( 64, 95, field ) ) \
  442. | EFAB_INSERT_FIELD32 ( 64, 95, field, value ) ); \
  443. (oword).u32[3] = ( ( (oword).u32[3] \
  444. & ~EFAB_INPLACE_MASK32 ( 96, 127, field ) ) \
  445. | EFAB_INSERT_FIELD32 ( 96, 127, field, value ) ); \
  446. } while ( 0 )
  447. #define EFAB_SET_QWORD_FIELD32( qword, field, value ) do { \
  448. (qword).u32[0] = ( ( (qword).u32[0] \
  449. & ~EFAB_INPLACE_MASK32 ( 0, 31, field ) ) \
  450. | EFAB_INSERT_FIELD32 ( 0, 31, field, value ) ); \
  451. (qword).u32[1] = ( ( (qword).u32[1] \
  452. & ~EFAB_INPLACE_MASK32 ( 32, 63, field ) ) \
  453. | EFAB_INSERT_FIELD32 ( 32, 63, field, value ) ); \
  454. } while ( 0 )
  455. #define EFAB_SET_DWORD_FIELD( dword, field, value ) do { \
  456. (dword).u32[0] = ( ( (dword).u32[0] \
  457. & ~EFAB_INPLACE_MASK32 ( 0, 31, field ) ) \
  458. | EFAB_INSERT_FIELD32 ( 0, 31, field, value ) ); \
  459. } while ( 0 )
  460. #if ( BITS_PER_LONG == 64 )
  461. #define EFAB_SET_OWORD_FIELD EFAB_SET_OWORD_FIELD64
  462. #define EFAB_SET_QWORD_FIELD EFAB_SET_QWORD_FIELD64
  463. #else
  464. #define EFAB_SET_OWORD_FIELD EFAB_SET_OWORD_FIELD32
  465. #define EFAB_SET_QWORD_FIELD EFAB_SET_QWORD_FIELD32
  466. #endif
  467. /* Used to avoid compiler warnings about shift range exceeding width
  468. * of the data types when dma_addr_t is only 32 bits wide.
  469. */
  470. #define DMA_ADDR_T_WIDTH ( 8 * sizeof ( dma_addr_t ) )
  471. #define EFAB_DMA_TYPE_WIDTH( width ) \
  472. ( ( (width) < DMA_ADDR_T_WIDTH ) ? (width) : DMA_ADDR_T_WIDTH )
  473. #define EFAB_DMA_MAX_MASK ( ( DMA_ADDR_T_WIDTH == 64 ) ? \
  474. ~( ( uint64_t ) 0 ) : ~( ( uint32_t ) 0 ) )
  475. #define EFAB_DMA_MASK(mask) ( (mask) & EFAB_DMA_MAX_MASK )
  476. #endif /* EFAB_BITFIELD_H */
  477. /*
  478. * Local variables:
  479. * c-basic-offset: 8
  480. * c-indent-level: 8
  481. * tab-width: 8
  482. * End:
  483. */