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