platform.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
  2. /*
  3. * Copyright(c) 2015, 2016 Intel Corporation.
  4. */
  5. #ifndef __PLATFORM_H
  6. #define __PLATFORM_H
  7. #define METADATA_TABLE_FIELD_START_SHIFT 0
  8. #define METADATA_TABLE_FIELD_START_LEN_BITS 15
  9. #define METADATA_TABLE_FIELD_LEN_SHIFT 16
  10. #define METADATA_TABLE_FIELD_LEN_LEN_BITS 16
  11. /* Header structure */
  12. #define PLATFORM_CONFIG_HEADER_RECORD_IDX_SHIFT 0
  13. #define PLATFORM_CONFIG_HEADER_RECORD_IDX_LEN_BITS 6
  14. #define PLATFORM_CONFIG_HEADER_TABLE_LENGTH_SHIFT 16
  15. #define PLATFORM_CONFIG_HEADER_TABLE_LENGTH_LEN_BITS 12
  16. #define PLATFORM_CONFIG_HEADER_TABLE_TYPE_SHIFT 28
  17. #define PLATFORM_CONFIG_HEADER_TABLE_TYPE_LEN_BITS 4
  18. enum platform_config_table_type_encoding {
  19. PLATFORM_CONFIG_TABLE_RESERVED,
  20. PLATFORM_CONFIG_SYSTEM_TABLE,
  21. PLATFORM_CONFIG_PORT_TABLE,
  22. PLATFORM_CONFIG_RX_PRESET_TABLE,
  23. PLATFORM_CONFIG_TX_PRESET_TABLE,
  24. PLATFORM_CONFIG_QSFP_ATTEN_TABLE,
  25. PLATFORM_CONFIG_VARIABLE_SETTINGS_TABLE,
  26. PLATFORM_CONFIG_TABLE_MAX
  27. };
  28. enum platform_config_system_table_fields {
  29. SYSTEM_TABLE_RESERVED,
  30. SYSTEM_TABLE_NODE_STRING,
  31. SYSTEM_TABLE_SYSTEM_IMAGE_GUID,
  32. SYSTEM_TABLE_NODE_GUID,
  33. SYSTEM_TABLE_REVISION,
  34. SYSTEM_TABLE_VENDOR_OUI,
  35. SYSTEM_TABLE_META_VERSION,
  36. SYSTEM_TABLE_DEVICE_ID,
  37. SYSTEM_TABLE_PARTITION_ENFORCEMENT_CAP,
  38. SYSTEM_TABLE_QSFP_POWER_CLASS_MAX,
  39. SYSTEM_TABLE_QSFP_ATTENUATION_DEFAULT_12G,
  40. SYSTEM_TABLE_QSFP_ATTENUATION_DEFAULT_25G,
  41. SYSTEM_TABLE_VARIABLE_TABLE_ENTRIES_PER_PORT,
  42. SYSTEM_TABLE_MAX
  43. };
  44. enum platform_config_port_table_fields {
  45. PORT_TABLE_RESERVED,
  46. PORT_TABLE_PORT_TYPE,
  47. PORT_TABLE_LOCAL_ATTEN_12G,
  48. PORT_TABLE_LOCAL_ATTEN_25G,
  49. PORT_TABLE_LINK_SPEED_SUPPORTED,
  50. PORT_TABLE_LINK_WIDTH_SUPPORTED,
  51. PORT_TABLE_AUTO_LANE_SHEDDING_ENABLED,
  52. PORT_TABLE_EXTERNAL_LOOPBACK_ALLOWED,
  53. PORT_TABLE_VL_CAP,
  54. PORT_TABLE_MTU_CAP,
  55. PORT_TABLE_TX_LANE_ENABLE_MASK,
  56. PORT_TABLE_LOCAL_MAX_TIMEOUT,
  57. PORT_TABLE_REMOTE_ATTEN_12G,
  58. PORT_TABLE_REMOTE_ATTEN_25G,
  59. PORT_TABLE_TX_PRESET_IDX_ACTIVE_NO_EQ,
  60. PORT_TABLE_TX_PRESET_IDX_ACTIVE_EQ,
  61. PORT_TABLE_RX_PRESET_IDX,
  62. PORT_TABLE_CABLE_REACH_CLASS,
  63. PORT_TABLE_MAX
  64. };
  65. enum platform_config_rx_preset_table_fields {
  66. RX_PRESET_TABLE_RESERVED,
  67. RX_PRESET_TABLE_QSFP_RX_CDR_APPLY,
  68. RX_PRESET_TABLE_QSFP_RX_EMP_APPLY,
  69. RX_PRESET_TABLE_QSFP_RX_AMP_APPLY,
  70. RX_PRESET_TABLE_QSFP_RX_CDR,
  71. RX_PRESET_TABLE_QSFP_RX_EMP,
  72. RX_PRESET_TABLE_QSFP_RX_AMP,
  73. RX_PRESET_TABLE_MAX
  74. };
  75. enum platform_config_tx_preset_table_fields {
  76. TX_PRESET_TABLE_RESERVED,
  77. TX_PRESET_TABLE_PRECUR,
  78. TX_PRESET_TABLE_ATTN,
  79. TX_PRESET_TABLE_POSTCUR,
  80. TX_PRESET_TABLE_QSFP_TX_CDR_APPLY,
  81. TX_PRESET_TABLE_QSFP_TX_EQ_APPLY,
  82. TX_PRESET_TABLE_QSFP_TX_CDR,
  83. TX_PRESET_TABLE_QSFP_TX_EQ,
  84. TX_PRESET_TABLE_MAX
  85. };
  86. enum platform_config_qsfp_attn_table_fields {
  87. QSFP_ATTEN_TABLE_RESERVED,
  88. QSFP_ATTEN_TABLE_TX_PRESET_IDX,
  89. QSFP_ATTEN_TABLE_RX_PRESET_IDX,
  90. QSFP_ATTEN_TABLE_MAX
  91. };
  92. enum platform_config_variable_settings_table_fields {
  93. VARIABLE_SETTINGS_TABLE_RESERVED,
  94. VARIABLE_SETTINGS_TABLE_TX_PRESET_IDX,
  95. VARIABLE_SETTINGS_TABLE_RX_PRESET_IDX,
  96. VARIABLE_SETTINGS_TABLE_MAX
  97. };
  98. struct platform_config {
  99. size_t size;
  100. const u8 *data;
  101. };
  102. struct platform_config_data {
  103. u32 *table;
  104. u32 *table_metadata;
  105. u32 num_table;
  106. };
  107. /*
  108. * This struct acts as a quick reference into the platform_data binary image
  109. * and is populated by parse_platform_config(...) depending on the specific
  110. * META_VERSION
  111. */
  112. struct platform_config_cache {
  113. u8 cache_valid;
  114. struct platform_config_data config_tables[PLATFORM_CONFIG_TABLE_MAX];
  115. };
  116. /* This section defines default values and encodings for the
  117. * fields defined for each table above
  118. */
  119. /*
  120. * =====================================================
  121. * System table encodings
  122. * =====================================================
  123. */
  124. #define PLATFORM_CONFIG_MAGIC_NUM 0x3d4f5041
  125. #define PLATFORM_CONFIG_MAGIC_NUMBER_LEN 4
  126. /*
  127. * These power classes are the same as defined in SFF 8636 spec rev 2.4
  128. * describing byte 129 in table 6-16, except enumerated in a different order
  129. */
  130. enum platform_config_qsfp_power_class_encoding {
  131. QSFP_POWER_CLASS_1 = 1,
  132. QSFP_POWER_CLASS_2,
  133. QSFP_POWER_CLASS_3,
  134. QSFP_POWER_CLASS_4,
  135. QSFP_POWER_CLASS_5,
  136. QSFP_POWER_CLASS_6,
  137. QSFP_POWER_CLASS_7
  138. };
  139. /*
  140. * ====================================================
  141. * Port table encodings
  142. * ====================================================
  143. */
  144. enum platform_config_port_type_encoding {
  145. PORT_TYPE_UNKNOWN,
  146. PORT_TYPE_DISCONNECTED,
  147. PORT_TYPE_FIXED,
  148. PORT_TYPE_VARIABLE,
  149. PORT_TYPE_QSFP,
  150. PORT_TYPE_MAX
  151. };
  152. enum platform_config_link_speed_supported_encoding {
  153. LINK_SPEED_SUPP_12G = 1,
  154. LINK_SPEED_SUPP_25G,
  155. LINK_SPEED_SUPP_12G_25G,
  156. LINK_SPEED_SUPP_MAX
  157. };
  158. /*
  159. * This is a subset (not strict) of the link downgrades
  160. * supported. The link downgrades supported are expected
  161. * to be supplied to the driver by another entity such as
  162. * the fabric manager
  163. */
  164. enum platform_config_link_width_supported_encoding {
  165. LINK_WIDTH_SUPP_1X = 1,
  166. LINK_WIDTH_SUPP_2X,
  167. LINK_WIDTH_SUPP_2X_1X,
  168. LINK_WIDTH_SUPP_3X,
  169. LINK_WIDTH_SUPP_3X_1X,
  170. LINK_WIDTH_SUPP_3X_2X,
  171. LINK_WIDTH_SUPP_3X_2X_1X,
  172. LINK_WIDTH_SUPP_4X,
  173. LINK_WIDTH_SUPP_4X_1X,
  174. LINK_WIDTH_SUPP_4X_2X,
  175. LINK_WIDTH_SUPP_4X_2X_1X,
  176. LINK_WIDTH_SUPP_4X_3X,
  177. LINK_WIDTH_SUPP_4X_3X_1X,
  178. LINK_WIDTH_SUPP_4X_3X_2X,
  179. LINK_WIDTH_SUPP_4X_3X_2X_1X,
  180. LINK_WIDTH_SUPP_MAX
  181. };
  182. enum platform_config_virtual_lane_capability_encoding {
  183. VL_CAP_VL0 = 1,
  184. VL_CAP_VL0_1,
  185. VL_CAP_VL0_2,
  186. VL_CAP_VL0_3,
  187. VL_CAP_VL0_4,
  188. VL_CAP_VL0_5,
  189. VL_CAP_VL0_6,
  190. VL_CAP_VL0_7,
  191. VL_CAP_VL0_8,
  192. VL_CAP_VL0_9,
  193. VL_CAP_VL0_10,
  194. VL_CAP_VL0_11,
  195. VL_CAP_VL0_12,
  196. VL_CAP_VL0_13,
  197. VL_CAP_VL0_14,
  198. VL_CAP_MAX
  199. };
  200. /* Max MTU */
  201. enum platform_config_mtu_capability_encoding {
  202. MTU_CAP_256 = 1,
  203. MTU_CAP_512 = 2,
  204. MTU_CAP_1024 = 3,
  205. MTU_CAP_2048 = 4,
  206. MTU_CAP_4096 = 5,
  207. MTU_CAP_8192 = 6,
  208. MTU_CAP_10240 = 7
  209. };
  210. enum platform_config_local_max_timeout_encoding {
  211. LOCAL_MAX_TIMEOUT_10_MS = 1,
  212. LOCAL_MAX_TIMEOUT_100_MS,
  213. LOCAL_MAX_TIMEOUT_1_S,
  214. LOCAL_MAX_TIMEOUT_10_S,
  215. LOCAL_MAX_TIMEOUT_100_S,
  216. LOCAL_MAX_TIMEOUT_1000_S
  217. };
  218. enum link_tuning_encoding {
  219. OPA_PASSIVE_TUNING,
  220. OPA_ACTIVE_TUNING,
  221. OPA_UNKNOWN_TUNING
  222. };
  223. /*
  224. * Shifts and masks for the link SI tuning values stuffed into the ASIC scratch
  225. * registers for integrated platforms
  226. */
  227. #define PORT0_PORT_TYPE_SHIFT 0
  228. #define PORT0_LOCAL_ATTEN_SHIFT 4
  229. #define PORT0_REMOTE_ATTEN_SHIFT 10
  230. #define PORT0_DEFAULT_ATTEN_SHIFT 32
  231. #define PORT1_PORT_TYPE_SHIFT 16
  232. #define PORT1_LOCAL_ATTEN_SHIFT 20
  233. #define PORT1_REMOTE_ATTEN_SHIFT 26
  234. #define PORT1_DEFAULT_ATTEN_SHIFT 40
  235. #define PORT0_PORT_TYPE_MASK 0xFUL
  236. #define PORT0_LOCAL_ATTEN_MASK 0x3FUL
  237. #define PORT0_REMOTE_ATTEN_MASK 0x3FUL
  238. #define PORT0_DEFAULT_ATTEN_MASK 0xFFUL
  239. #define PORT1_PORT_TYPE_MASK 0xFUL
  240. #define PORT1_LOCAL_ATTEN_MASK 0x3FUL
  241. #define PORT1_REMOTE_ATTEN_MASK 0x3FUL
  242. #define PORT1_DEFAULT_ATTEN_MASK 0xFFUL
  243. #define PORT0_PORT_TYPE_SMASK (PORT0_PORT_TYPE_MASK << \
  244. PORT0_PORT_TYPE_SHIFT)
  245. #define PORT0_LOCAL_ATTEN_SMASK (PORT0_LOCAL_ATTEN_MASK << \
  246. PORT0_LOCAL_ATTEN_SHIFT)
  247. #define PORT0_REMOTE_ATTEN_SMASK (PORT0_REMOTE_ATTEN_MASK << \
  248. PORT0_REMOTE_ATTEN_SHIFT)
  249. #define PORT0_DEFAULT_ATTEN_SMASK (PORT0_DEFAULT_ATTEN_MASK << \
  250. PORT0_DEFAULT_ATTEN_SHIFT)
  251. #define PORT1_PORT_TYPE_SMASK (PORT1_PORT_TYPE_MASK << \
  252. PORT1_PORT_TYPE_SHIFT)
  253. #define PORT1_LOCAL_ATTEN_SMASK (PORT1_LOCAL_ATTEN_MASK << \
  254. PORT1_LOCAL_ATTEN_SHIFT)
  255. #define PORT1_REMOTE_ATTEN_SMASK (PORT1_REMOTE_ATTEN_MASK << \
  256. PORT1_REMOTE_ATTEN_SHIFT)
  257. #define PORT1_DEFAULT_ATTEN_SMASK (PORT1_DEFAULT_ATTEN_MASK << \
  258. PORT1_DEFAULT_ATTEN_SHIFT)
  259. #define QSFP_MAX_POWER_SHIFT 0
  260. #define TX_NO_EQ_SHIFT 4
  261. #define TX_EQ_SHIFT 25
  262. #define RX_SHIFT 46
  263. #define QSFP_MAX_POWER_MASK 0xFUL
  264. #define TX_NO_EQ_MASK 0x1FFFFFUL
  265. #define TX_EQ_MASK 0x1FFFFFUL
  266. #define RX_MASK 0xFFFFUL
  267. #define QSFP_MAX_POWER_SMASK (QSFP_MAX_POWER_MASK << \
  268. QSFP_MAX_POWER_SHIFT)
  269. #define TX_NO_EQ_SMASK (TX_NO_EQ_MASK << TX_NO_EQ_SHIFT)
  270. #define TX_EQ_SMASK (TX_EQ_MASK << TX_EQ_SHIFT)
  271. #define RX_SMASK (RX_MASK << RX_SHIFT)
  272. #define TX_PRECUR_SHIFT 0
  273. #define TX_ATTN_SHIFT 4
  274. #define QSFP_TX_CDR_APPLY_SHIFT 9
  275. #define QSFP_TX_EQ_APPLY_SHIFT 10
  276. #define QSFP_TX_CDR_SHIFT 11
  277. #define QSFP_TX_EQ_SHIFT 12
  278. #define TX_POSTCUR_SHIFT 16
  279. #define TX_PRECUR_MASK 0xFUL
  280. #define TX_ATTN_MASK 0x1FUL
  281. #define QSFP_TX_CDR_APPLY_MASK 0x1UL
  282. #define QSFP_TX_EQ_APPLY_MASK 0x1UL
  283. #define QSFP_TX_CDR_MASK 0x1UL
  284. #define QSFP_TX_EQ_MASK 0xFUL
  285. #define TX_POSTCUR_MASK 0x1FUL
  286. #define TX_PRECUR_SMASK (TX_PRECUR_MASK << TX_PRECUR_SHIFT)
  287. #define TX_ATTN_SMASK (TX_ATTN_MASK << TX_ATTN_SHIFT)
  288. #define QSFP_TX_CDR_APPLY_SMASK (QSFP_TX_CDR_APPLY_MASK << \
  289. QSFP_TX_CDR_APPLY_SHIFT)
  290. #define QSFP_TX_EQ_APPLY_SMASK (QSFP_TX_EQ_APPLY_MASK << \
  291. QSFP_TX_EQ_APPLY_SHIFT)
  292. #define QSFP_TX_CDR_SMASK (QSFP_TX_CDR_MASK << QSFP_TX_CDR_SHIFT)
  293. #define QSFP_TX_EQ_SMASK (QSFP_TX_EQ_MASK << QSFP_TX_EQ_SHIFT)
  294. #define TX_POSTCUR_SMASK (TX_POSTCUR_MASK << TX_POSTCUR_SHIFT)
  295. #define QSFP_RX_CDR_APPLY_SHIFT 0
  296. #define QSFP_RX_EMP_APPLY_SHIFT 1
  297. #define QSFP_RX_AMP_APPLY_SHIFT 2
  298. #define QSFP_RX_CDR_SHIFT 3
  299. #define QSFP_RX_EMP_SHIFT 4
  300. #define QSFP_RX_AMP_SHIFT 8
  301. #define QSFP_RX_CDR_APPLY_MASK 0x1UL
  302. #define QSFP_RX_EMP_APPLY_MASK 0x1UL
  303. #define QSFP_RX_AMP_APPLY_MASK 0x1UL
  304. #define QSFP_RX_CDR_MASK 0x1UL
  305. #define QSFP_RX_EMP_MASK 0xFUL
  306. #define QSFP_RX_AMP_MASK 0x3UL
  307. #define QSFP_RX_CDR_APPLY_SMASK (QSFP_RX_CDR_APPLY_MASK << \
  308. QSFP_RX_CDR_APPLY_SHIFT)
  309. #define QSFP_RX_EMP_APPLY_SMASK (QSFP_RX_EMP_APPLY_MASK << \
  310. QSFP_RX_EMP_APPLY_SHIFT)
  311. #define QSFP_RX_AMP_APPLY_SMASK (QSFP_RX_AMP_APPLY_MASK << \
  312. QSFP_RX_AMP_APPLY_SHIFT)
  313. #define QSFP_RX_CDR_SMASK (QSFP_RX_CDR_MASK << QSFP_RX_CDR_SHIFT)
  314. #define QSFP_RX_EMP_SMASK (QSFP_RX_EMP_MASK << QSFP_RX_EMP_SHIFT)
  315. #define QSFP_RX_AMP_SMASK (QSFP_RX_AMP_MASK << QSFP_RX_AMP_SHIFT)
  316. #define BITMAP_VERSION 1
  317. #define BITMAP_VERSION_SHIFT 44
  318. #define BITMAP_VERSION_MASK 0xFUL
  319. #define BITMAP_VERSION_SMASK (BITMAP_VERSION_MASK << \
  320. BITMAP_VERSION_SHIFT)
  321. #define CHECKSUM_SHIFT 48
  322. #define CHECKSUM_MASK 0xFFFFUL
  323. #define CHECKSUM_SMASK (CHECKSUM_MASK << CHECKSUM_SHIFT)
  324. /* platform.c */
  325. void get_platform_config(struct hfi1_devdata *dd);
  326. void free_platform_config(struct hfi1_devdata *dd);
  327. void get_port_type(struct hfi1_pportdata *ppd);
  328. int set_qsfp_tx(struct hfi1_pportdata *ppd, int on);
  329. void tune_serdes(struct hfi1_pportdata *ppd);
  330. #endif /*__PLATFORM_H*/