0001
0002
0003
0004
0005
0006 #ifndef __PLATFORM_H
0007 #define __PLATFORM_H
0008
0009 #define METADATA_TABLE_FIELD_START_SHIFT 0
0010 #define METADATA_TABLE_FIELD_START_LEN_BITS 15
0011 #define METADATA_TABLE_FIELD_LEN_SHIFT 16
0012 #define METADATA_TABLE_FIELD_LEN_LEN_BITS 16
0013
0014
0015 #define PLATFORM_CONFIG_HEADER_RECORD_IDX_SHIFT 0
0016 #define PLATFORM_CONFIG_HEADER_RECORD_IDX_LEN_BITS 6
0017 #define PLATFORM_CONFIG_HEADER_TABLE_LENGTH_SHIFT 16
0018 #define PLATFORM_CONFIG_HEADER_TABLE_LENGTH_LEN_BITS 12
0019 #define PLATFORM_CONFIG_HEADER_TABLE_TYPE_SHIFT 28
0020 #define PLATFORM_CONFIG_HEADER_TABLE_TYPE_LEN_BITS 4
0021
0022 enum platform_config_table_type_encoding {
0023 PLATFORM_CONFIG_TABLE_RESERVED,
0024 PLATFORM_CONFIG_SYSTEM_TABLE,
0025 PLATFORM_CONFIG_PORT_TABLE,
0026 PLATFORM_CONFIG_RX_PRESET_TABLE,
0027 PLATFORM_CONFIG_TX_PRESET_TABLE,
0028 PLATFORM_CONFIG_QSFP_ATTEN_TABLE,
0029 PLATFORM_CONFIG_VARIABLE_SETTINGS_TABLE,
0030 PLATFORM_CONFIG_TABLE_MAX
0031 };
0032
0033 enum platform_config_system_table_fields {
0034 SYSTEM_TABLE_RESERVED,
0035 SYSTEM_TABLE_NODE_STRING,
0036 SYSTEM_TABLE_SYSTEM_IMAGE_GUID,
0037 SYSTEM_TABLE_NODE_GUID,
0038 SYSTEM_TABLE_REVISION,
0039 SYSTEM_TABLE_VENDOR_OUI,
0040 SYSTEM_TABLE_META_VERSION,
0041 SYSTEM_TABLE_DEVICE_ID,
0042 SYSTEM_TABLE_PARTITION_ENFORCEMENT_CAP,
0043 SYSTEM_TABLE_QSFP_POWER_CLASS_MAX,
0044 SYSTEM_TABLE_QSFP_ATTENUATION_DEFAULT_12G,
0045 SYSTEM_TABLE_QSFP_ATTENUATION_DEFAULT_25G,
0046 SYSTEM_TABLE_VARIABLE_TABLE_ENTRIES_PER_PORT,
0047 SYSTEM_TABLE_MAX
0048 };
0049
0050 enum platform_config_port_table_fields {
0051 PORT_TABLE_RESERVED,
0052 PORT_TABLE_PORT_TYPE,
0053 PORT_TABLE_LOCAL_ATTEN_12G,
0054 PORT_TABLE_LOCAL_ATTEN_25G,
0055 PORT_TABLE_LINK_SPEED_SUPPORTED,
0056 PORT_TABLE_LINK_WIDTH_SUPPORTED,
0057 PORT_TABLE_AUTO_LANE_SHEDDING_ENABLED,
0058 PORT_TABLE_EXTERNAL_LOOPBACK_ALLOWED,
0059 PORT_TABLE_VL_CAP,
0060 PORT_TABLE_MTU_CAP,
0061 PORT_TABLE_TX_LANE_ENABLE_MASK,
0062 PORT_TABLE_LOCAL_MAX_TIMEOUT,
0063 PORT_TABLE_REMOTE_ATTEN_12G,
0064 PORT_TABLE_REMOTE_ATTEN_25G,
0065 PORT_TABLE_TX_PRESET_IDX_ACTIVE_NO_EQ,
0066 PORT_TABLE_TX_PRESET_IDX_ACTIVE_EQ,
0067 PORT_TABLE_RX_PRESET_IDX,
0068 PORT_TABLE_CABLE_REACH_CLASS,
0069 PORT_TABLE_MAX
0070 };
0071
0072 enum platform_config_rx_preset_table_fields {
0073 RX_PRESET_TABLE_RESERVED,
0074 RX_PRESET_TABLE_QSFP_RX_CDR_APPLY,
0075 RX_PRESET_TABLE_QSFP_RX_EMP_APPLY,
0076 RX_PRESET_TABLE_QSFP_RX_AMP_APPLY,
0077 RX_PRESET_TABLE_QSFP_RX_CDR,
0078 RX_PRESET_TABLE_QSFP_RX_EMP,
0079 RX_PRESET_TABLE_QSFP_RX_AMP,
0080 RX_PRESET_TABLE_MAX
0081 };
0082
0083 enum platform_config_tx_preset_table_fields {
0084 TX_PRESET_TABLE_RESERVED,
0085 TX_PRESET_TABLE_PRECUR,
0086 TX_PRESET_TABLE_ATTN,
0087 TX_PRESET_TABLE_POSTCUR,
0088 TX_PRESET_TABLE_QSFP_TX_CDR_APPLY,
0089 TX_PRESET_TABLE_QSFP_TX_EQ_APPLY,
0090 TX_PRESET_TABLE_QSFP_TX_CDR,
0091 TX_PRESET_TABLE_QSFP_TX_EQ,
0092 TX_PRESET_TABLE_MAX
0093 };
0094
0095 enum platform_config_qsfp_attn_table_fields {
0096 QSFP_ATTEN_TABLE_RESERVED,
0097 QSFP_ATTEN_TABLE_TX_PRESET_IDX,
0098 QSFP_ATTEN_TABLE_RX_PRESET_IDX,
0099 QSFP_ATTEN_TABLE_MAX
0100 };
0101
0102 enum platform_config_variable_settings_table_fields {
0103 VARIABLE_SETTINGS_TABLE_RESERVED,
0104 VARIABLE_SETTINGS_TABLE_TX_PRESET_IDX,
0105 VARIABLE_SETTINGS_TABLE_RX_PRESET_IDX,
0106 VARIABLE_SETTINGS_TABLE_MAX
0107 };
0108
0109 struct platform_config {
0110 size_t size;
0111 const u8 *data;
0112 };
0113
0114 struct platform_config_data {
0115 u32 *table;
0116 u32 *table_metadata;
0117 u32 num_table;
0118 };
0119
0120
0121
0122
0123
0124
0125 struct platform_config_cache {
0126 u8 cache_valid;
0127 struct platform_config_data config_tables[PLATFORM_CONFIG_TABLE_MAX];
0128 };
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139 #define PLATFORM_CONFIG_MAGIC_NUM 0x3d4f5041
0140 #define PLATFORM_CONFIG_MAGIC_NUMBER_LEN 4
0141
0142
0143
0144
0145
0146 enum platform_config_qsfp_power_class_encoding {
0147 QSFP_POWER_CLASS_1 = 1,
0148 QSFP_POWER_CLASS_2,
0149 QSFP_POWER_CLASS_3,
0150 QSFP_POWER_CLASS_4,
0151 QSFP_POWER_CLASS_5,
0152 QSFP_POWER_CLASS_6,
0153 QSFP_POWER_CLASS_7
0154 };
0155
0156
0157
0158
0159
0160
0161 enum platform_config_port_type_encoding {
0162 PORT_TYPE_UNKNOWN,
0163 PORT_TYPE_DISCONNECTED,
0164 PORT_TYPE_FIXED,
0165 PORT_TYPE_VARIABLE,
0166 PORT_TYPE_QSFP,
0167 PORT_TYPE_MAX
0168 };
0169
0170 enum platform_config_link_speed_supported_encoding {
0171 LINK_SPEED_SUPP_12G = 1,
0172 LINK_SPEED_SUPP_25G,
0173 LINK_SPEED_SUPP_12G_25G,
0174 LINK_SPEED_SUPP_MAX
0175 };
0176
0177
0178
0179
0180
0181
0182
0183 enum platform_config_link_width_supported_encoding {
0184 LINK_WIDTH_SUPP_1X = 1,
0185 LINK_WIDTH_SUPP_2X,
0186 LINK_WIDTH_SUPP_2X_1X,
0187 LINK_WIDTH_SUPP_3X,
0188 LINK_WIDTH_SUPP_3X_1X,
0189 LINK_WIDTH_SUPP_3X_2X,
0190 LINK_WIDTH_SUPP_3X_2X_1X,
0191 LINK_WIDTH_SUPP_4X,
0192 LINK_WIDTH_SUPP_4X_1X,
0193 LINK_WIDTH_SUPP_4X_2X,
0194 LINK_WIDTH_SUPP_4X_2X_1X,
0195 LINK_WIDTH_SUPP_4X_3X,
0196 LINK_WIDTH_SUPP_4X_3X_1X,
0197 LINK_WIDTH_SUPP_4X_3X_2X,
0198 LINK_WIDTH_SUPP_4X_3X_2X_1X,
0199 LINK_WIDTH_SUPP_MAX
0200 };
0201
0202 enum platform_config_virtual_lane_capability_encoding {
0203 VL_CAP_VL0 = 1,
0204 VL_CAP_VL0_1,
0205 VL_CAP_VL0_2,
0206 VL_CAP_VL0_3,
0207 VL_CAP_VL0_4,
0208 VL_CAP_VL0_5,
0209 VL_CAP_VL0_6,
0210 VL_CAP_VL0_7,
0211 VL_CAP_VL0_8,
0212 VL_CAP_VL0_9,
0213 VL_CAP_VL0_10,
0214 VL_CAP_VL0_11,
0215 VL_CAP_VL0_12,
0216 VL_CAP_VL0_13,
0217 VL_CAP_VL0_14,
0218 VL_CAP_MAX
0219 };
0220
0221
0222 enum platform_config_mtu_capability_encoding {
0223 MTU_CAP_256 = 1,
0224 MTU_CAP_512 = 2,
0225 MTU_CAP_1024 = 3,
0226 MTU_CAP_2048 = 4,
0227 MTU_CAP_4096 = 5,
0228 MTU_CAP_8192 = 6,
0229 MTU_CAP_10240 = 7
0230 };
0231
0232 enum platform_config_local_max_timeout_encoding {
0233 LOCAL_MAX_TIMEOUT_10_MS = 1,
0234 LOCAL_MAX_TIMEOUT_100_MS,
0235 LOCAL_MAX_TIMEOUT_1_S,
0236 LOCAL_MAX_TIMEOUT_10_S,
0237 LOCAL_MAX_TIMEOUT_100_S,
0238 LOCAL_MAX_TIMEOUT_1000_S
0239 };
0240
0241 enum link_tuning_encoding {
0242 OPA_PASSIVE_TUNING,
0243 OPA_ACTIVE_TUNING,
0244 OPA_UNKNOWN_TUNING
0245 };
0246
0247
0248
0249
0250
0251 #define PORT0_PORT_TYPE_SHIFT 0
0252 #define PORT0_LOCAL_ATTEN_SHIFT 4
0253 #define PORT0_REMOTE_ATTEN_SHIFT 10
0254 #define PORT0_DEFAULT_ATTEN_SHIFT 32
0255
0256 #define PORT1_PORT_TYPE_SHIFT 16
0257 #define PORT1_LOCAL_ATTEN_SHIFT 20
0258 #define PORT1_REMOTE_ATTEN_SHIFT 26
0259 #define PORT1_DEFAULT_ATTEN_SHIFT 40
0260
0261 #define PORT0_PORT_TYPE_MASK 0xFUL
0262 #define PORT0_LOCAL_ATTEN_MASK 0x3FUL
0263 #define PORT0_REMOTE_ATTEN_MASK 0x3FUL
0264 #define PORT0_DEFAULT_ATTEN_MASK 0xFFUL
0265
0266 #define PORT1_PORT_TYPE_MASK 0xFUL
0267 #define PORT1_LOCAL_ATTEN_MASK 0x3FUL
0268 #define PORT1_REMOTE_ATTEN_MASK 0x3FUL
0269 #define PORT1_DEFAULT_ATTEN_MASK 0xFFUL
0270
0271 #define PORT0_PORT_TYPE_SMASK (PORT0_PORT_TYPE_MASK << \
0272 PORT0_PORT_TYPE_SHIFT)
0273 #define PORT0_LOCAL_ATTEN_SMASK (PORT0_LOCAL_ATTEN_MASK << \
0274 PORT0_LOCAL_ATTEN_SHIFT)
0275 #define PORT0_REMOTE_ATTEN_SMASK (PORT0_REMOTE_ATTEN_MASK << \
0276 PORT0_REMOTE_ATTEN_SHIFT)
0277 #define PORT0_DEFAULT_ATTEN_SMASK (PORT0_DEFAULT_ATTEN_MASK << \
0278 PORT0_DEFAULT_ATTEN_SHIFT)
0279
0280 #define PORT1_PORT_TYPE_SMASK (PORT1_PORT_TYPE_MASK << \
0281 PORT1_PORT_TYPE_SHIFT)
0282 #define PORT1_LOCAL_ATTEN_SMASK (PORT1_LOCAL_ATTEN_MASK << \
0283 PORT1_LOCAL_ATTEN_SHIFT)
0284 #define PORT1_REMOTE_ATTEN_SMASK (PORT1_REMOTE_ATTEN_MASK << \
0285 PORT1_REMOTE_ATTEN_SHIFT)
0286 #define PORT1_DEFAULT_ATTEN_SMASK (PORT1_DEFAULT_ATTEN_MASK << \
0287 PORT1_DEFAULT_ATTEN_SHIFT)
0288
0289 #define QSFP_MAX_POWER_SHIFT 0
0290 #define TX_NO_EQ_SHIFT 4
0291 #define TX_EQ_SHIFT 25
0292 #define RX_SHIFT 46
0293
0294 #define QSFP_MAX_POWER_MASK 0xFUL
0295 #define TX_NO_EQ_MASK 0x1FFFFFUL
0296 #define TX_EQ_MASK 0x1FFFFFUL
0297 #define RX_MASK 0xFFFFUL
0298
0299 #define QSFP_MAX_POWER_SMASK (QSFP_MAX_POWER_MASK << \
0300 QSFP_MAX_POWER_SHIFT)
0301 #define TX_NO_EQ_SMASK (TX_NO_EQ_MASK << TX_NO_EQ_SHIFT)
0302 #define TX_EQ_SMASK (TX_EQ_MASK << TX_EQ_SHIFT)
0303 #define RX_SMASK (RX_MASK << RX_SHIFT)
0304
0305 #define TX_PRECUR_SHIFT 0
0306 #define TX_ATTN_SHIFT 4
0307 #define QSFP_TX_CDR_APPLY_SHIFT 9
0308 #define QSFP_TX_EQ_APPLY_SHIFT 10
0309 #define QSFP_TX_CDR_SHIFT 11
0310 #define QSFP_TX_EQ_SHIFT 12
0311 #define TX_POSTCUR_SHIFT 16
0312
0313 #define TX_PRECUR_MASK 0xFUL
0314 #define TX_ATTN_MASK 0x1FUL
0315 #define QSFP_TX_CDR_APPLY_MASK 0x1UL
0316 #define QSFP_TX_EQ_APPLY_MASK 0x1UL
0317 #define QSFP_TX_CDR_MASK 0x1UL
0318 #define QSFP_TX_EQ_MASK 0xFUL
0319 #define TX_POSTCUR_MASK 0x1FUL
0320
0321 #define TX_PRECUR_SMASK (TX_PRECUR_MASK << TX_PRECUR_SHIFT)
0322 #define TX_ATTN_SMASK (TX_ATTN_MASK << TX_ATTN_SHIFT)
0323 #define QSFP_TX_CDR_APPLY_SMASK (QSFP_TX_CDR_APPLY_MASK << \
0324 QSFP_TX_CDR_APPLY_SHIFT)
0325 #define QSFP_TX_EQ_APPLY_SMASK (QSFP_TX_EQ_APPLY_MASK << \
0326 QSFP_TX_EQ_APPLY_SHIFT)
0327 #define QSFP_TX_CDR_SMASK (QSFP_TX_CDR_MASK << QSFP_TX_CDR_SHIFT)
0328 #define QSFP_TX_EQ_SMASK (QSFP_TX_EQ_MASK << QSFP_TX_EQ_SHIFT)
0329 #define TX_POSTCUR_SMASK (TX_POSTCUR_MASK << TX_POSTCUR_SHIFT)
0330
0331 #define QSFP_RX_CDR_APPLY_SHIFT 0
0332 #define QSFP_RX_EMP_APPLY_SHIFT 1
0333 #define QSFP_RX_AMP_APPLY_SHIFT 2
0334 #define QSFP_RX_CDR_SHIFT 3
0335 #define QSFP_RX_EMP_SHIFT 4
0336 #define QSFP_RX_AMP_SHIFT 8
0337
0338 #define QSFP_RX_CDR_APPLY_MASK 0x1UL
0339 #define QSFP_RX_EMP_APPLY_MASK 0x1UL
0340 #define QSFP_RX_AMP_APPLY_MASK 0x1UL
0341 #define QSFP_RX_CDR_MASK 0x1UL
0342 #define QSFP_RX_EMP_MASK 0xFUL
0343 #define QSFP_RX_AMP_MASK 0x3UL
0344
0345 #define QSFP_RX_CDR_APPLY_SMASK (QSFP_RX_CDR_APPLY_MASK << \
0346 QSFP_RX_CDR_APPLY_SHIFT)
0347 #define QSFP_RX_EMP_APPLY_SMASK (QSFP_RX_EMP_APPLY_MASK << \
0348 QSFP_RX_EMP_APPLY_SHIFT)
0349 #define QSFP_RX_AMP_APPLY_SMASK (QSFP_RX_AMP_APPLY_MASK << \
0350 QSFP_RX_AMP_APPLY_SHIFT)
0351 #define QSFP_RX_CDR_SMASK (QSFP_RX_CDR_MASK << QSFP_RX_CDR_SHIFT)
0352 #define QSFP_RX_EMP_SMASK (QSFP_RX_EMP_MASK << QSFP_RX_EMP_SHIFT)
0353 #define QSFP_RX_AMP_SMASK (QSFP_RX_AMP_MASK << QSFP_RX_AMP_SHIFT)
0354
0355 #define BITMAP_VERSION 1
0356 #define BITMAP_VERSION_SHIFT 44
0357 #define BITMAP_VERSION_MASK 0xFUL
0358 #define BITMAP_VERSION_SMASK (BITMAP_VERSION_MASK << \
0359 BITMAP_VERSION_SHIFT)
0360 #define CHECKSUM_SHIFT 48
0361 #define CHECKSUM_MASK 0xFFFFUL
0362 #define CHECKSUM_SMASK (CHECKSUM_MASK << CHECKSUM_SHIFT)
0363
0364
0365 void get_platform_config(struct hfi1_devdata *dd);
0366 void free_platform_config(struct hfi1_devdata *dd);
0367 void get_port_type(struct hfi1_pportdata *ppd);
0368 int set_qsfp_tx(struct hfi1_pportdata *ppd, int on);
0369 void tune_serdes(struct hfi1_pportdata *ppd);
0370
0371 #endif