Lines Matching refs:ppd
103 struct hfi1_pportdata *ppd = dd->pport;
111 ppd->port_type = temp_dest >>
118 ppd->local_atten = temp_dest >>
125 ppd->remote_atten = temp_dest >>
132 ppd->default_atten = temp_dest >>
139 ppd->tx_preset_eq = (temp_scratch & TX_EQ_SMASK) >> TX_EQ_SHIFT;
140 ppd->tx_preset_noeq = (temp_scratch & TX_NO_EQ_SMASK) >> TX_NO_EQ_SHIFT;
141 ppd->rx_preset = (temp_scratch & RX_SMASK) >> RX_SHIFT;
143 ppd->max_power_class = (temp_scratch & QSFP_MAX_POWER_SMASK) >>
146 ppd->config_from_scratch = true;
205 void get_port_type(struct hfi1_pportdata *ppd)
210 ret = get_platform_config_field(ppd->dd, PLATFORM_CONFIG_PORT_TABLE, 0,
214 ppd->port_type = PORT_TYPE_UNKNOWN;
217 ppd->port_type = temp;
220 int set_qsfp_tx(struct hfi1_pportdata *ppd, int on)
225 ret = qsfp_write(ppd, ppd->dd->hfi1_id, QSFP_TX_CTRL_BYTE_OFFS,
235 static int qual_power(struct hfi1_pportdata *ppd)
238 u8 *cache = ppd->qsfp_info.cache;
242 ppd->dd, PLATFORM_CONFIG_SYSTEM_TABLE, 0,
250 ppd->offline_disabled_reason =
253 if (ppd->offline_disabled_reason ==
256 ppd->dd,
264 static int qual_bitrate(struct hfi1_pportdata *ppd)
266 u16 lss = ppd->link_speed_supported, lse = ppd->link_speed_enabled;
267 u8 *cache = ppd->qsfp_info.cache;
271 ppd->offline_disabled_reason =
276 ppd->offline_disabled_reason =
279 if (ppd->offline_disabled_reason ==
282 ppd->dd,
290 static int set_qsfp_high_power(struct hfi1_pportdata *ppd)
293 u8 *cache = ppd->qsfp_info.cache;
304 ret = qsfp_write(ppd, ppd->dd->hfi1_id,
312 ret = qsfp_write(ppd, ppd->dd->hfi1_id,
325 static void apply_rx_cdr(struct hfi1_pportdata *ppd,
330 u8 *cache = ppd->qsfp_info.cache;
347 ppd->dd, PLATFORM_CONFIG_RX_PRESET_TABLE,
353 ppd->dd,
359 ppd->dd, PLATFORM_CONFIG_RX_PRESET_TABLE,
376 static void apply_tx_cdr(struct hfi1_pportdata *ppd,
381 u8 *cache = ppd->qsfp_info.cache;
398 ppd->dd,
404 ppd->dd,
410 ppd->dd,
427 struct hfi1_pportdata *ppd, u32 rx_preset_index,
430 u8 *cache = ppd->qsfp_info.cache;
433 apply_rx_cdr(ppd, rx_preset_index, &cdr_ctrl_byte);
435 apply_tx_cdr(ppd, tx_preset_index, &cdr_ctrl_byte);
437 qsfp_write(ppd, ppd->dd->hfi1_id, QSFP_CDR_CTRL_BYTE_OFFS,
441 static void apply_tx_eq_auto(struct hfi1_pportdata *ppd)
443 u8 *cache = ppd->qsfp_info.cache;
451 qsfp_write(ppd, ppd->dd->hfi1_id, (256 * 3) + 241, &tx_eq, 1);
454 static void apply_tx_eq_prog(struct hfi1_pportdata *ppd, u32 tx_preset_index)
456 u8 *cache = ppd->qsfp_info.cache;
464 ppd->dd, PLATFORM_CONFIG_TX_PRESET_TABLE,
469 ppd->dd,
475 ppd->dd, PLATFORM_CONFIG_TX_PRESET_TABLE,
481 ppd->dd,
486 ppd->dd,
494 qsfp_write(ppd, ppd->dd->hfi1_id, (256 * 3) + 234, &tx_eq, 1);
495 qsfp_write(ppd, ppd->dd->hfi1_id, (256 * 3) + 235, &tx_eq, 1);
498 static void apply_rx_eq_emp(struct hfi1_pportdata *ppd, u32 rx_preset_index)
501 u8 rx_eq, *cache = ppd->qsfp_info.cache;
506 ppd->dd, PLATFORM_CONFIG_RX_PRESET_TABLE,
512 ppd->dd,
518 ppd->dd, PLATFORM_CONFIG_RX_PRESET_TABLE,
524 ppd->dd,
529 ppd->dd,
538 qsfp_write(ppd, ppd->dd->hfi1_id, (256 * 3) + 236, &rx_eq, 1);
539 qsfp_write(ppd, ppd->dd->hfi1_id, (256 * 3) + 237, &rx_eq, 1);
542 static void apply_eq_settings(struct hfi1_pportdata *ppd,
545 u8 *cache = ppd->qsfp_info.cache;
549 dd_dev_info(ppd->dd,
555 apply_tx_eq_auto(ppd);
557 apply_tx_eq_prog(ppd, tx_preset_index);
559 apply_rx_eq_emp(ppd, rx_preset_index);
563 struct hfi1_pportdata *ppd, u32 rx_preset_index,
567 u8 rx_amp = 0, i = 0, preferred = 0, *cache = ppd->qsfp_info.cache;
571 dd_dev_info(ppd->dd,
577 dd_dev_info(ppd->dd,
583 get_platform_config_field(ppd->dd,
590 dd_dev_info(ppd->dd,
595 get_platform_config_field(ppd->dd,
601 dd_dev_info(ppd->dd,
619 dd_dev_info(ppd->dd, "No supported RX AMP, not applying\n");
623 dd_dev_info(ppd->dd,
627 qsfp_write(ppd, ppd->dd->hfi1_id, (256 * 3) + 238, &rx_amp, 1);
628 qsfp_write(ppd, ppd->dd->hfi1_id, (256 * 3) + 239, &rx_amp, 1);
633 static void apply_tx_lanes(struct hfi1_pportdata *ppd, u8 field_id,
640 ret = load_8051_config(ppd->dd, field_id, i, config_data);
643 ppd->dd,
660 static u8 aoc_low_power_setting(struct hfi1_pportdata *ppd)
662 u8 *cache = ppd->qsfp_info.cache;
666 if (ppd->port_type != PORT_TYPE_QSFP)
683 struct hfi1_pportdata *ppd, u32 tx_preset_index,
689 u8 *cache = ppd->qsfp_info.cache;
692 read_8051_config(ppd->dd, LINK_TUNING_PARAMETERS, GENERAL_CONFIG,
696 ret = load_8051_config(ppd->dd, LINK_TUNING_PARAMETERS, GENERAL_CONFIG,
699 dd_dev_err(ppd->dd, "%s: Failed to set tuning method\n",
704 apply_tx_lanes(ppd, CHANNEL_LOSS_SETTINGS, config_data,
708 if (ppd->qsfp_info.cache_valid) {
714 ret = read_8051_config(ppd->dd, DC_HOST_COMM_SETTINGS,
719 ret = load_8051_config(ppd->dd, DC_HOST_COMM_SETTINGS,
722 dd_dev_err(ppd->dd,
728 if (ppd->port_type == PORT_TYPE_QSFP && limiting_active)
729 dd_dev_err(ppd->dd, "%s: Invalid Tx preset index\n",
736 ppd->dd, PLATFORM_CONFIG_TX_PRESET_TABLE, tx_preset_index,
741 ppd->dd, PLATFORM_CONFIG_TX_PRESET_TABLE,
746 ppd->dd, PLATFORM_CONFIG_TX_PRESET_TABLE,
760 (aoc_low_power_setting(ppd) << 24);
762 apply_tx_lanes(ppd, TX_EQ_SETTINGS, config_data,
767 static int tune_active_qsfp(struct hfi1_pportdata *ppd, u32 *ptr_tx_preset,
771 u16 lss = ppd->link_speed_supported, lse = ppd->link_speed_enabled;
772 u8 *cache = ppd->qsfp_info.cache;
774 ppd->qsfp_info.limiting_active = 1;
776 ret = set_qsfp_tx(ppd, 0);
780 ret = qual_power(ppd);
784 ret = qual_bitrate(ppd);
793 if (ppd->qsfp_info.reset_needed) {
794 ret = reset_qsfp(ppd);
797 refresh_qsfp_cache(ppd, &ppd->qsfp_info);
799 ppd->qsfp_info.reset_needed = 1;
802 ret = set_qsfp_high_power(ppd);
808 ppd->dd,
818 ppd->dd,
829 ppd->dd, PLATFORM_CONFIG_PORT_TABLE, 0,
838 ppd->dd, PLATFORM_CONFIG_PORT_TABLE, 0,
842 ppd->dd, PLATFORM_CONFIG_PORT_TABLE, 0,
845 apply_cdr_settings(ppd, *ptr_rx_preset, *ptr_tx_preset);
847 apply_eq_settings(ppd, *ptr_rx_preset, *ptr_tx_preset);
849 apply_rx_amplitude_settings(ppd, *ptr_rx_preset, *ptr_tx_preset);
851 ret = set_qsfp_tx(ppd, 1);
856 static int tune_qsfp(struct hfi1_pportdata *ppd,
861 u16 lss = ppd->link_speed_supported, lse = ppd->link_speed_enabled;
863 u8 *cache = ppd->qsfp_info.cache;
868 ppd->dd,
884 ppd->dd,
893 ppd->dd, PLATFORM_CONFIG_PORT_TABLE, 0,
905 ret = tune_active_qsfp(ppd, ptr_tx_preset, ptr_rx_preset,
915 dd_dev_warn(ppd->dd, "%s: Unknown/unsupported cable\n",
923 * This function communicates its success or failure via ppd->driver_link_ready
928 void tune_serdes(struct hfi1_pportdata *ppd)
935 struct hfi1_devdata *dd = ppd->dd;
941 ppd->link_enabled = 1;
943 ppd->driver_link_ready = 0;
944 ppd->offline_disabled_reason = HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NONE);
948 ppd->dd->icode == ICODE_FUNCTIONAL_SIMULATOR) {
949 ppd->driver_link_ready = 1;
951 if (qsfp_mod_present(ppd)) {
952 ret = acquire_chip_resource(ppd->dd,
953 qsfp_resource(ppd->dd),
956 dd_dev_err(ppd->dd, "%s: hfi%d: cannot lock i2c chain\n",
957 __func__, (int)ppd->dd->hfi1_id);
961 refresh_qsfp_cache(ppd, &ppd->qsfp_info);
962 release_chip_resource(ppd->dd, qsfp_resource(ppd->dd));
968 switch (ppd->port_type) {
970 ppd->offline_disabled_reason =
978 ppd->dd, PLATFORM_CONFIG_PORT_TABLE, 0,
982 ppd->dd, PLATFORM_CONFIG_PORT_TABLE, 0,
990 if (qsfp_mod_present(ppd)) {
996 ppd->dd, PLATFORM_CONFIG_PORT_TABLE, 0,
1001 ppd->dd, PLATFORM_CONFIG_PORT_TABLE, 0,
1009 ppd->offline_disabled_reason =
1015 if (qsfp_mod_present(ppd)) {
1016 ret = acquire_chip_resource(ppd->dd,
1017 qsfp_resource(ppd->dd),
1020 dd_dev_err(ppd->dd, "%s: hfi%d: cannot lock i2c chain\n",
1021 __func__, (int)ppd->dd->hfi1_id);
1024 refresh_qsfp_cache(ppd, &ppd->qsfp_info);
1026 if (ppd->qsfp_info.cache_valid) {
1027 ret = tune_qsfp(ppd,
1037 refresh_qsfp_cache(ppd, &ppd->qsfp_info);
1039 ppd->qsfp_info.limiting_active;
1046 release_chip_resource(ppd->dd, qsfp_resource(ppd->dd));
1050 ppd->offline_disabled_reason =
1057 dd_dev_warn(ppd->dd, "%s: Unknown port type\n", __func__);
1058 ppd->port_type = PORT_TYPE_UNKNOWN;
1066 if (ppd->offline_disabled_reason ==
1068 apply_tunings(ppd, tx_preset_index, tuning_method,
1072 ppd->driver_link_ready = 1;
1076 ppd->driver_link_ready = 0;