Lines Matching +full:retimer +full:- +full:switch
1 // SPDX-License-Identifier: GPL-2.0
90 /* Sideband registers for retimer */
107 return single_open(file, __space ## _show, inode->i_private); \
134 return ERR_PTR(-EINVAL); in validate_and_copy_from_user()
137 return ERR_PTR(-EFAULT); in validate_and_copy_from_user()
141 return ERR_PTR(-ENOMEM); in validate_and_copy_from_user()
146 return ERR_PTR(-EFAULT); in validate_and_copy_from_user()
190 *val = v[short_fmt_len - 1]; in parse_line()
194 *val = v[long_fmt_len - 1]; in parse_line()
210 u32 offs = offset - index; in path_write_one()
226 struct tb *tb = sw->tb; in regs_write()
234 pm_runtime_get_sync(&sw->dev); in regs_write()
236 if (mutex_lock_interruptible(&tb->lock)) { in regs_write()
237 ret = -ERESTARTSYS; in regs_write()
263 mutex_unlock(&tb->lock); in regs_write()
266 pm_runtime_mark_last_busy(&sw->dev); in regs_write()
267 pm_runtime_put_autosuspend(&sw->dev); in regs_write()
276 struct seq_file *s = file->private_data; in port_regs_write()
277 struct tb_port *port = s->private; in port_regs_write()
279 return regs_write(port->sw, port, TB_CFG_PORT, user_buf, count, ppos); in port_regs_write()
285 struct seq_file *s = file->private_data; in path_write()
286 struct tb_port *port = s->private; in path_write()
288 return regs_write(port->sw, port, TB_CFG_HOPS, user_buf, count, ppos); in path_write()
294 struct seq_file *s = file->private_data; in switch_regs_write()
295 struct tb_switch *sw = s->private; in switch_regs_write()
355 return -EINVAL; in sb_regs_write()
367 return -EINVAL; in sb_regs_write()
369 if (bytes_read > sb_regs->size) in sb_regs_write()
370 return -E2BIG; in sb_regs_write()
372 ret = usb4_port_sb_write(port, target, index, sb_reg->reg, data, in sb_regs_write()
384 struct seq_file *s = file->private_data; in port_sb_regs_write()
385 struct tb_port *port = s->private; in port_sb_regs_write()
386 struct tb_switch *sw = port->sw; in port_sb_regs_write()
387 struct tb *tb = sw->tb; in port_sb_regs_write()
395 pm_runtime_get_sync(&sw->dev); in port_sb_regs_write()
397 if (mutex_lock_interruptible(&tb->lock)) { in port_sb_regs_write()
398 ret = -ERESTARTSYS; in port_sb_regs_write()
405 mutex_unlock(&tb->lock); in port_sb_regs_write()
407 pm_runtime_mark_last_busy(&sw->dev); in port_sb_regs_write()
408 pm_runtime_put_autosuspend(&sw->dev); in port_sb_regs_write()
418 struct seq_file *s = file->private_data; in retimer_sb_regs_write()
419 struct tb_retimer *rt = s->private; in retimer_sb_regs_write()
420 struct tb *tb = rt->tb; in retimer_sb_regs_write()
428 pm_runtime_get_sync(&rt->dev); in retimer_sb_regs_write()
430 if (mutex_lock_interruptible(&tb->lock)) { in retimer_sb_regs_write()
431 ret = -ERESTARTSYS; in retimer_sb_regs_write()
435 ret = sb_regs_write(rt->port, retimer_sb_regs, ARRAY_SIZE(retimer_sb_regs), in retimer_sb_regs_write()
436 USB4_SB_TARGET_RETIMER, rt->index, buf, count, ppos); in retimer_sb_regs_write()
438 mutex_unlock(&tb->lock); in retimer_sb_regs_write()
440 pm_runtime_mark_last_busy(&rt->dev); in retimer_sb_regs_write()
441 pm_runtime_put_autosuspend(&rt->dev); in retimer_sb_regs_write()
458 * struct tb_margining - Lane margining support
461 * @index: Retimer index if taget is %USB4_SB_TARGET_RETIMER
462 * @dev: Pointer to the device that is the target (USB4 port or retimer)
522 struct tb_port *port = margining->port; in margining_modify_error_counter()
527 return -EOPNOTSUPP; in margining_modify_error_counter()
532 return usb4_port_sw_margin(port, margining->target, margining->index, in margining_modify_error_counter()
538 if (margining->gen < 4) in supports_software()
539 return margining->caps[0] & USB4_MARGIN_CAP_0_MODES_SW; in supports_software()
540 return margining->caps[2] & USB4_MARGIN_CAP_2_MODES_SW; in supports_software()
545 if (margining->gen < 4) in supports_hardware()
546 return margining->caps[0] & USB4_MARGIN_CAP_0_MODES_HW; in supports_hardware()
547 return margining->caps[2] & USB4_MARGIN_CAP_2_MODES_HW; in supports_hardware()
552 return margining->caps[0] & USB4_MARGIN_CAP_0_ALL_LANES; in all_lanes()
558 if (margining->gen < 4) { in independent_voltage_margins()
559 switch (FIELD_GET(USB4_MARGIN_CAP_0_VOLTAGE_INDP_MASK, margining->caps[0])) { in independent_voltage_margins()
568 switch (FIELD_GET(USB4_MARGIN_CAP_2_VOLTAGE_INDP_MASK, margining->caps[2])) { in independent_voltage_margins()
580 if (margining->gen < 4) in supports_time()
581 return margining->caps[0] & USB4_MARGIN_CAP_0_TIME; in supports_time()
582 return margining->caps[2] & USB4_MARGIN_CAP_2_TIME; in supports_time()
589 if (margining->gen < 4) { in independent_time_margins()
590 switch (FIELD_GET(USB4_MARGIN_CAP_1_TIME_INDP_MASK, margining->caps[1])) { in independent_time_margins()
599 switch (FIELD_GET(USB4_MARGIN_CAP_2_TIME_INDP_MASK, margining->caps[2])) { in independent_time_margins()
612 return margining->caps[0] & USB4_MARGIN_CAP_0_OPT_VOLTAGE_SUPPORT; in supports_optional_voltage_offset_range()
619 struct seq_file *s = file->private_data; in margining_ber_level_write()
620 struct tb_margining *margining = s->private; in margining_ber_level_write()
621 struct tb *tb = margining->port->sw->tb; in margining_ber_level_write()
626 if (mutex_lock_interruptible(&tb->lock)) in margining_ber_level_write()
627 return -ERESTARTSYS; in margining_ber_level_write()
629 if (margining->software) { in margining_ber_level_write()
630 ret = -EINVAL; in margining_ber_level_write()
640 buf[count - 1] = '\0'; in margining_ber_level_write()
646 if (val < margining->min_ber_level || in margining_ber_level_write()
647 val > margining->max_ber_level) { in margining_ber_level_write()
648 ret = -EINVAL; in margining_ber_level_write()
652 margining->ber_level = val; in margining_ber_level_write()
657 mutex_unlock(&tb->lock); in margining_ber_level_write()
665 seq_printf(s, "3 * 1e%d (%u)\n", -12 + (val + 1) / 2, val); in ber_level_show()
667 seq_printf(s, "1e%d (%u)\n", -12 + val / 2, val); in ber_level_show()
672 const struct tb_margining *margining = s->private; in margining_ber_level_show()
674 if (margining->software) in margining_ber_level_show()
675 return -EINVAL; in margining_ber_level_show()
676 ber_level_show(s, margining->ber_level); in margining_ber_level_show()
683 struct tb_margining *margining = s->private; in margining_caps_show()
684 struct tb *tb = margining->port->sw->tb; in margining_caps_show()
687 if (mutex_lock_interruptible(&tb->lock)) in margining_caps_show()
688 return -ERESTARTSYS; in margining_caps_show()
691 for (int i = 0; i < ARRAY_SIZE(margining->caps); i++) in margining_caps_show()
692 seq_printf(s, "0x%08x\n", margining->caps[i]); in margining_caps_show()
699 ber_level_show(s, margining->min_ber_level); in margining_caps_show()
701 ber_level_show(s, margining->max_ber_level); in margining_caps_show()
709 margining->voltage_steps); in margining_caps_show()
711 margining->max_voltage_offset); in margining_caps_show()
716 margining->voltage_steps_optional_range); in margining_caps_show()
718 margining->max_voltage_offset_optional_range); in margining_caps_show()
721 switch (independent_voltage_margins(margining)) { in margining_caps_show()
738 tb_port_warn(margining->port, in margining_caps_show()
740 ret = -EIO; in margining_caps_show()
747 str_yes_no(margining->caps[1] & USB4_MARGIN_CAP_1_TIME_DESTR)); in margining_caps_show()
749 switch (independent_time_margins(margining)) { in margining_caps_show()
766 tb_port_warn(margining->port, in margining_caps_show()
768 ret = -EIO; in margining_caps_show()
773 margining->time_steps); in margining_caps_show()
775 margining->max_time_offset); in margining_caps_show()
781 mutex_unlock(&tb->lock); in margining_caps_show()
812 struct seq_file *s = file->private_data; in margining_lanes_write()
813 struct tb_margining *margining = s->private; in margining_lanes_write()
814 struct tb_port *port = margining->port; in margining_lanes_write()
815 struct tb *tb = port->sw->tb; in margining_lanes_write()
816 int lane = -1; in margining_lanes_write()
823 buf[count - 1] = '\0'; in margining_lanes_write()
834 if (lane == -1) in margining_lanes_write()
835 return -EINVAL; in margining_lanes_write()
837 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_lanes_write()
839 return -EINVAL; in margining_lanes_write()
844 if (lane == USB4_MARGINING_LANE_RX2 && !margining->asym_rx) in margining_lanes_write()
845 return -EINVAL; in margining_lanes_write()
847 margining->lanes = lane; in margining_lanes_write()
855 struct tb_margining *margining = s->private; in margining_lanes_show()
856 struct tb_port *port = margining->port; in margining_lanes_show()
857 struct tb *tb = port->sw->tb; in margining_lanes_show()
859 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_lanes_show()
865 !margining->asym_rx) in margining_lanes_show()
871 if (lane_names[i].lane == margining->lanes) in margining_lanes_show()
888 struct seq_file *s = file->private_data; in margining_voltage_time_offset_write()
889 struct tb_margining *margining = s->private; in margining_voltage_time_offset_write()
890 struct tb *tb = margining->port->sw->tb; in margining_voltage_time_offset_write()
899 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_voltage_time_offset_write()
900 if (!margining->software) in margining_voltage_time_offset_write()
901 return -EOPNOTSUPP; in margining_voltage_time_offset_write()
903 if (margining->time) in margining_voltage_time_offset_write()
904 max_margin = margining->time_steps; in margining_voltage_time_offset_write()
906 if (margining->optional_voltage_offset_range) in margining_voltage_time_offset_write()
907 max_margin = margining->voltage_steps_optional_range; in margining_voltage_time_offset_write()
909 max_margin = margining->voltage_steps; in margining_voltage_time_offset_write()
911 margining->voltage_time_offset = clamp(val, 0, max_margin); in margining_voltage_time_offset_write()
920 const struct tb_margining *margining = s->private; in margining_voltage_time_offset_show()
921 struct tb *tb = margining->port->sw->tb; in margining_voltage_time_offset_show()
923 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_voltage_time_offset_show()
924 if (!margining->software) in margining_voltage_time_offset_show()
925 return -EOPNOTSUPP; in margining_voltage_time_offset_show()
927 seq_printf(s, "%d\n", margining->voltage_time_offset); in margining_voltage_time_offset_show()
939 struct seq_file *s = file->private_data; in margining_error_counter_write()
940 struct tb_margining *margining = s->private; in margining_error_counter_write()
941 struct tb *tb = margining->port->sw->tb; in margining_error_counter_write()
948 buf[count - 1] = '\0'; in margining_error_counter_write()
959 return -EINVAL; in margining_error_counter_write()
961 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_error_counter_write()
962 if (!margining->software) in margining_error_counter_write()
963 return -EOPNOTSUPP; in margining_error_counter_write()
965 margining->error_counter = error_counter; in margining_error_counter_write()
973 const struct tb_margining *margining = s->private; in margining_error_counter_show()
974 struct tb *tb = margining->port->sw->tb; in margining_error_counter_show()
976 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_error_counter_show()
977 if (!margining->software) in margining_error_counter_show()
978 return -EOPNOTSUPP; in margining_error_counter_show()
980 switch (margining->error_counter) { in margining_error_counter_show()
1004 struct seq_file *s = file->private_data; in margining_dwell_time_write()
1005 struct tb_margining *margining = s->private; in margining_dwell_time_write()
1006 struct tb *tb = margining->port->sw->tb; in margining_dwell_time_write()
1014 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_dwell_time_write()
1015 if (!margining->software) in margining_dwell_time_write()
1016 return -EOPNOTSUPP; in margining_dwell_time_write()
1018 margining->dwell_time = clamp(val, MIN_DWELL_TIME, MAX_DWELL_TIME); in margining_dwell_time_write()
1026 struct tb_margining *margining = s->private; in margining_dwell_time_show()
1027 struct tb *tb = margining->port->sw->tb; in margining_dwell_time_show()
1029 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_dwell_time_show()
1030 if (!margining->software) in margining_dwell_time_show()
1031 return -EOPNOTSUPP; in margining_dwell_time_show()
1033 seq_printf(s, "%d\n", margining->dwell_time); in margining_dwell_time_show()
1044 struct seq_file *s = file->private_data; in margining_optional_voltage_offset_write()
1045 struct tb_margining *margining = s->private; in margining_optional_voltage_offset_write()
1046 struct tb *tb = margining->port->sw->tb; in margining_optional_voltage_offset_write()
1054 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_optional_voltage_offset_write()
1055 margining->optional_voltage_offset_range = val; in margining_optional_voltage_offset_write()
1064 struct tb_margining *margining = s->private; in margining_optional_voltage_offset_show()
1065 struct tb *tb = margining->port->sw->tb; in margining_optional_voltage_offset_show()
1067 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_optional_voltage_offset_show()
1068 seq_printf(s, "%u\n", margining->optional_voltage_offset_range); in margining_optional_voltage_offset_show()
1079 struct seq_file *s = file->private_data; in margining_mode_write()
1080 struct tb_margining *margining = s->private; in margining_mode_write()
1081 struct tb *tb = margining->port->sw->tb; in margining_mode_write()
1089 buf[count - 1] = '\0'; in margining_mode_write()
1091 if (mutex_lock_interruptible(&tb->lock)) { in margining_mode_write()
1092 ret = -ERESTARTSYS; in margining_mode_write()
1098 margining->software = true; in margining_mode_write()
1100 ret = -EINVAL; in margining_mode_write()
1103 margining->software = false; in margining_mode_write()
1105 ret = -EINVAL; in margining_mode_write()
1107 ret = -EINVAL; in margining_mode_write()
1110 mutex_unlock(&tb->lock); in margining_mode_write()
1119 struct tb_margining *margining = s->private; in margining_mode_show()
1120 struct tb *tb = margining->port->sw->tb; in margining_mode_show()
1123 if (mutex_lock_interruptible(&tb->lock)) in margining_mode_show()
1124 return -ERESTARTSYS; in margining_mode_show()
1127 if (margining->software) in margining_mode_show()
1134 if (margining->software) in margining_mode_show()
1140 mutex_unlock(&tb->lock); in margining_mode_show()
1150 u32 nsamples = margining->dwell_time / DWELL_SAMPLE_INTERVAL; in margining_run_sw()
1153 ret = usb4_port_sw_margin(margining->port, margining->target, margining->index, in margining_run_sw()
1154 params, margining->results); in margining_run_sw()
1161 ret = usb4_port_sw_margin_errors(margining->port, margining->target, in margining_run_sw()
1162 margining->index, &margining->results[1]); in margining_run_sw()
1166 if (margining->lanes == USB4_MARGINING_LANE_RX0) in margining_run_sw()
1168 margining->results[1]); in margining_run_sw()
1169 else if (margining->lanes == USB4_MARGINING_LANE_RX1) in margining_run_sw()
1171 margining->results[1]); in margining_run_sw()
1172 else if (margining->lanes == USB4_MARGINING_LANE_RX2) in margining_run_sw()
1174 margining->results[1]); in margining_run_sw()
1175 else if (margining->lanes == USB4_MARGINING_LANE_ALL) in margining_run_sw()
1176 errors = margining->results[1]; in margining_run_sw()
1190 margining_modify_error_counter(margining, margining->lanes, in margining_run_sw()
1203 if (margining->lanes == USB4_MARGINING_LANE_RX2) { in validate_margining()
1206 ret = tb_port_get_link_width(margining->port); in validate_margining()
1210 tb_port_warn(margining->port, "link is %s expected %s", in validate_margining()
1213 return -EINVAL; in validate_margining()
1223 struct tb_port *port = margining->port; in margining_run_write()
1224 struct device *dev = margining->dev; in margining_run_write()
1225 struct tb_switch *sw = port->sw; in margining_run_write()
1227 struct tb *tb = sw->tb; in margining_run_write()
1231 return -EINVAL; in margining_run_write()
1235 if (mutex_lock_interruptible(&tb->lock)) { in margining_run_write()
1236 ret = -ERESTARTSYS; in margining_run_write()
1246 else if (port->remote) in margining_run_write()
1247 down_sw = port->remote->sw; in margining_run_write()
1265 memset(margining->results, 0, sizeof(margining->results)); in margining_run_write()
1267 if (margining->software) { in margining_run_write()
1270 .lanes = margining->lanes, in margining_run_write()
1271 .time = margining->time, in margining_run_write()
1272 .voltage_time_offset = margining->voltage_time_offset, in margining_run_write()
1273 .right_high = margining->right_high, in margining_run_write()
1274 .upper_eye = margining->upper_eye, in margining_run_write()
1275 .optional_voltage_offset_range = margining->optional_voltage_offset_range, in margining_run_write()
1280 margining->time ? "time" : "voltage", dev_name(dev), in margining_run_write()
1281 margining->lanes); in margining_run_write()
1286 .ber_level = margining->ber_level, in margining_run_write()
1287 .lanes = margining->lanes, in margining_run_write()
1288 .time = margining->time, in margining_run_write()
1289 .right_high = margining->right_high, in margining_run_write()
1290 .upper_eye = margining->upper_eye, in margining_run_write()
1291 .optional_voltage_offset_range = margining->optional_voltage_offset_range, in margining_run_write()
1296 margining->time ? "time" : "voltage", dev_name(dev), in margining_run_write()
1297 margining->lanes); in margining_run_write()
1299 ret = usb4_port_hw_margin(port, margining->target, margining->index, ¶ms, in margining_run_write()
1300 margining->results, ARRAY_SIZE(margining->results)); in margining_run_write()
1306 mutex_unlock(&tb->lock); in margining_run_write()
1320 struct seq_file *s = file->private_data; in margining_results_write()
1321 struct tb_margining *margining = s->private; in margining_results_write()
1322 struct tb *tb = margining->port->sw->tb; in margining_results_write()
1324 if (mutex_lock_interruptible(&tb->lock)) in margining_results_write()
1325 return -ERESTARTSYS; in margining_results_write()
1328 memset(margining->results, 0, sizeof(margining->results)); in margining_results_write()
1330 if (margining->software) { in margining_results_write()
1337 mutex_unlock(&tb->lock); in margining_results_write()
1347 voltage = tmp * margining->max_voltage_offset / margining->voltage_steps; in voltage_margin_show()
1352 if (margining->optional_voltage_offset_range) in voltage_margin_show()
1362 interval = tmp * margining->max_time_offset / margining->time_steps; in time_margin_show()
1393 if (margining->time) { in margining_hw_result_format()
1394 val = margining_hw_result_val(margining->results, lane, true); in margining_hw_result_format()
1397 val = margining_hw_result_val(margining->results, lane, false); in margining_hw_result_format()
1401 val = margining_hw_result_val(margining->results, lane, true); in margining_hw_result_format()
1404 val = margining_hw_result_val(margining->results, lane, false); in margining_hw_result_format()
1412 struct tb_margining *margining = s->private; in margining_results_show()
1413 struct tb *tb = margining->port->sw->tb; in margining_results_show()
1415 if (mutex_lock_interruptible(&tb->lock)) in margining_results_show()
1416 return -ERESTARTSYS; in margining_results_show()
1419 seq_printf(s, "0x%08x\n", margining->results[0]); in margining_results_show()
1421 if (!margining->software) { in margining_results_show()
1422 for (int i = 1; i < ARRAY_SIZE(margining->results); i++) in margining_results_show()
1423 seq_printf(s, "0x%08x\n", margining->results[i]); in margining_results_show()
1425 if (margining->lanes == USB4_MARGINING_LANE_ALL) { in margining_results_show()
1430 if (margining->asym_rx) in margining_results_show()
1435 margining->lanes); in margining_results_show()
1440 seq_printf(s, "0x%08x\n", margining->results[1]); in margining_results_show()
1442 result = FIELD_GET(USB4_MARGIN_SW_LANES_MASK, margining->results[0]); in margining_results_show()
1446 margining->results[1]); in margining_results_show()
1452 margining->results[1]); in margining_results_show()
1455 if (margining->asym_rx && in margining_results_show()
1459 margining->results[1]); in margining_results_show()
1464 mutex_unlock(&tb->lock); in margining_results_show()
1473 struct seq_file *s = file->private_data; in margining_test_write()
1474 struct tb_margining *margining = s->private; in margining_test_write()
1475 struct tb *tb = margining->port->sw->tb; in margining_test_write()
1483 buf[count - 1] = '\0'; in margining_test_write()
1485 if (mutex_lock_interruptible(&tb->lock)) { in margining_test_write()
1486 ret = -ERESTARTSYS; in margining_test_write()
1491 margining->time = true; in margining_test_write()
1493 margining->time = false; in margining_test_write()
1495 ret = -EINVAL; in margining_test_write()
1497 mutex_unlock(&tb->lock); in margining_test_write()
1506 struct tb_margining *margining = s->private; in margining_test_show()
1507 struct tb *tb = margining->port->sw->tb; in margining_test_show()
1509 if (mutex_lock_interruptible(&tb->lock)) in margining_test_show()
1510 return -ERESTARTSYS; in margining_test_show()
1513 if (margining->time) in margining_test_show()
1521 mutex_unlock(&tb->lock); in margining_test_show()
1530 struct seq_file *s = file->private_data; in margining_margin_write()
1531 struct tb_margining *margining = s->private; in margining_margin_write()
1532 struct tb *tb = margining->port->sw->tb; in margining_margin_write()
1540 buf[count - 1] = '\0'; in margining_margin_write()
1542 if (mutex_lock_interruptible(&tb->lock)) { in margining_margin_write()
1543 ret = -ERESTARTSYS; in margining_margin_write()
1547 if (margining->time) { in margining_margin_write()
1549 margining->right_high = false; in margining_margin_write()
1551 margining->right_high = true; in margining_margin_write()
1553 ret = -EINVAL; in margining_margin_write()
1556 margining->right_high = false; in margining_margin_write()
1558 margining->right_high = true; in margining_margin_write()
1560 ret = -EINVAL; in margining_margin_write()
1563 mutex_unlock(&tb->lock); in margining_margin_write()
1572 struct tb_margining *margining = s->private; in margining_margin_show()
1573 struct tb *tb = margining->port->sw->tb; in margining_margin_show()
1575 if (mutex_lock_interruptible(&tb->lock)) in margining_margin_show()
1576 return -ERESTARTSYS; in margining_margin_show()
1578 if (margining->time) { in margining_margin_show()
1579 if (margining->right_high) in margining_margin_show()
1584 if (margining->right_high) in margining_margin_show()
1590 mutex_unlock(&tb->lock); in margining_margin_show()
1599 struct seq_file *s = file->private_data; in margining_eye_write()
1600 struct tb_port *port = s->private; in margining_eye_write()
1601 struct usb4_port *usb4 = port->usb4; in margining_eye_write()
1602 struct tb *tb = port->sw->tb; in margining_eye_write()
1610 buf[count - 1] = '\0'; in margining_eye_write()
1612 scoped_cond_guard(mutex_intr, ret = -ERESTARTSYS, &tb->lock) { in margining_eye_write()
1614 usb4->margining->upper_eye = false; in margining_eye_write()
1616 usb4->margining->upper_eye = true; in margining_eye_write()
1618 ret = -EINVAL; in margining_eye_write()
1627 struct tb_port *port = s->private; in margining_eye_show()
1628 struct usb4_port *usb4 = port->usb4; in margining_eye_show()
1629 struct tb *tb = port->sw->tb; in margining_eye_show()
1631 scoped_guard(mutex_intr, &tb->lock) { in margining_eye_show()
1632 if (usb4->margining->upper_eye) in margining_eye_show()
1640 return -ERESTARTSYS; in margining_eye_show()
1664 margining->port = port; in margining_alloc()
1665 margining->target = target; in margining_alloc()
1666 margining->index = index; in margining_alloc()
1667 margining->dev = dev; in margining_alloc()
1668 margining->gen = ret; in margining_alloc()
1669 margining->asym_rx = tb_port_width_supported(port, TB_LINK_WIDTH_ASYM_RX); in margining_alloc()
1671 ret = usb4_port_margining_caps(port, target, index, margining->caps, in margining_alloc()
1672 ARRAY_SIZE(margining->caps)); in margining_alloc()
1680 margining->software = true; in margining_alloc()
1682 if (margining->gen < 4) { in margining_alloc()
1683 val = FIELD_GET(USB4_MARGIN_CAP_0_VOLTAGE_STEPS_MASK, margining->caps[0]); in margining_alloc()
1684 margining->voltage_steps = val; in margining_alloc()
1685 val = FIELD_GET(USB4_MARGIN_CAP_0_MAX_VOLTAGE_OFFSET_MASK, margining->caps[0]); in margining_alloc()
1686 margining->max_voltage_offset = 74 + val * 2; in margining_alloc()
1688 val = FIELD_GET(USB4_MARGIN_CAP_2_VOLTAGE_STEPS_MASK, margining->caps[2]); in margining_alloc()
1689 margining->voltage_steps = val; in margining_alloc()
1690 val = FIELD_GET(USB4_MARGIN_CAP_2_MAX_VOLTAGE_OFFSET_MASK, margining->caps[2]); in margining_alloc()
1691 margining->max_voltage_offset = 74 + val * 2; in margining_alloc()
1696 margining->caps[0]); in margining_alloc()
1697 margining->voltage_steps_optional_range = val; in margining_alloc()
1699 margining->caps[1]); in margining_alloc()
1700 margining->max_voltage_offset_optional_range = 74 + val * 2; in margining_alloc()
1704 val = FIELD_GET(USB4_MARGIN_CAP_1_TIME_STEPS_MASK, margining->caps[1]); in margining_alloc()
1705 margining->time_steps = val; in margining_alloc()
1706 val = FIELD_GET(USB4_MARGIN_CAP_1_TIME_OFFSET_MASK, margining->caps[1]); in margining_alloc()
1711 margining->max_time_offset = 200 + 10 * val; in margining_alloc()
1716 val = FIELD_GET(USB4_MARGIN_CAP_1_MIN_BER_MASK, margining->caps[1]); in margining_alloc()
1717 margining->min_ber_level = val; in margining_alloc()
1718 val = FIELD_GET(USB4_MARGIN_CAP_1_MAX_BER_MASK, margining->caps[1]); in margining_alloc()
1719 margining->max_ber_level = val; in margining_alloc()
1722 margining->ber_level = margining->min_ber_level; in margining_alloc()
1739 margining->error_counter = USB4_MARGIN_SW_ERROR_COUNTER_CLEAR; in margining_alloc()
1740 margining->dwell_time = MIN_DWELL_TIME; in margining_alloc()
1755 if (margining->gen >= 4) in margining_alloc()
1766 if (!port->usb4) in margining_port_init()
1769 snprintf(dir_name, sizeof(dir_name), "port%d", port->port); in margining_port_init()
1770 parent = debugfs_lookup(dir_name, port->sw->debugfs_dir); in margining_port_init()
1771 port->usb4->margining = margining_alloc(port, &port->usb4->dev, in margining_port_init()
1781 if (!port->usb4) in margining_port_remove()
1784 snprintf(dir_name, sizeof(dir_name), "port%d", port->port); in margining_port_remove()
1785 parent = debugfs_lookup(dir_name, port->sw->debugfs_dir); in margining_port_remove()
1789 kfree(port->usb4->margining); in margining_port_remove()
1790 port->usb4->margining = NULL; in margining_port_remove()
1833 downstream = tb_port_at(xd->route, parent_sw); in margining_xdomain_init()
1844 downstream = tb_port_at(xd->route, parent_sw); in margining_xdomain_remove()
1850 rt->margining = margining_alloc(rt->port, &rt->dev, in margining_retimer_init()
1851 USB4_SB_TARGET_RETIMER, rt->index, in margining_retimer_init()
1857 kfree(rt->margining); in margining_retimer_remove()
1858 rt->margining = NULL; in margining_retimer_remove()
1875 buf = kcalloc(COUNTER_SET_LEN * port->config.max_counters, sizeof(u32), in port_clear_all_counters()
1878 return -ENOMEM; in port_clear_all_counters()
1881 COUNTER_SET_LEN * port->config.max_counters); in port_clear_all_counters()
1890 struct seq_file *s = file->private_data; in counters_write()
1891 struct tb_port *port = s->private; in counters_write()
1892 struct tb_switch *sw = port->sw; in counters_write()
1893 struct tb *tb = port->sw->tb; in counters_write()
1901 pm_runtime_get_sync(&sw->dev); in counters_write()
1903 if (mutex_lock_interruptible(&tb->lock)) { in counters_write()
1904 ret = -ERESTARTSYS; in counters_write()
1915 ret = -EINVAL; in counters_write()
1924 mutex_unlock(&tb->lock); in counters_write()
1927 pm_runtime_mark_last_busy(&sw->dev); in counters_write()
1928 pm_runtime_put_autosuspend(&sw->dev); in counters_write()
1983 length -= dwords; in cap_show()
2002 switch (header.basic.cap) { in port_cap_show()
2008 if (usb4_switch_version(port->sw) < 2) in port_cap_show()
2020 if (usb4_switch_version(port->sw) < 2) in port_cap_show()
2025 if (usb4_switch_version(port->sw) < 2) in port_cap_show()
2099 struct tb_port *port = s->private; in port_regs_show()
2100 struct tb_switch *sw = port->sw; in port_regs_show()
2101 struct tb *tb = sw->tb; in port_regs_show()
2104 pm_runtime_get_sync(&sw->dev); in port_regs_show()
2106 if (mutex_lock_interruptible(&tb->lock)) { in port_regs_show()
2107 ret = -ERESTARTSYS; in port_regs_show()
2120 mutex_unlock(&tb->lock); in port_regs_show()
2122 pm_runtime_mark_last_busy(&sw->dev); in port_regs_show()
2123 pm_runtime_put_autosuspend(&sw->dev); in port_regs_show()
2204 struct tb_switch *sw = s->private; in switch_regs_show()
2205 struct tb *tb = sw->tb; in switch_regs_show()
2208 pm_runtime_get_sync(&sw->dev); in switch_regs_show()
2210 if (mutex_lock_interruptible(&tb->lock)) { in switch_regs_show()
2211 ret = -ERESTARTSYS; in switch_regs_show()
2224 mutex_unlock(&tb->lock); in switch_regs_show()
2226 pm_runtime_mark_last_busy(&sw->dev); in switch_regs_show()
2227 pm_runtime_put_autosuspend(&sw->dev); in switch_regs_show()
2255 struct tb_port *port = s->private; in path_show()
2256 struct tb_switch *sw = port->sw; in path_show()
2257 struct tb *tb = sw->tb; in path_show()
2260 pm_runtime_get_sync(&sw->dev); in path_show()
2262 if (mutex_lock_interruptible(&tb->lock)) { in path_show()
2263 ret = -ERESTARTSYS; in path_show()
2278 for (i = start; i <= port->config.max_in_hop_id; i++) { in path_show()
2285 mutex_unlock(&tb->lock); in path_show()
2287 pm_runtime_mark_last_busy(&sw->dev); in path_show()
2288 pm_runtime_put_autosuspend(&sw->dev); in path_show()
2318 struct tb_port *port = s->private; in counters_show()
2319 struct tb_switch *sw = port->sw; in counters_show()
2320 struct tb *tb = sw->tb; in counters_show()
2323 pm_runtime_get_sync(&sw->dev); in counters_show()
2325 if (mutex_lock_interruptible(&tb->lock)) { in counters_show()
2326 ret = -ERESTARTSYS; in counters_show()
2332 for (i = 0; i < port->config.max_counters; i++) { in counters_show()
2338 mutex_unlock(&tb->lock); in counters_show()
2341 pm_runtime_mark_last_busy(&sw->dev); in counters_show()
2342 pm_runtime_put_autosuspend(&sw->dev); in counters_show()
2362 ret = usb4_port_sb_read(port, target, index, regs->reg, data, in sb_regs_show()
2363 regs->size); in sb_regs_show()
2367 seq_printf(s, "0x%02x", regs->reg); in sb_regs_show()
2368 for (j = 0; j < regs->size; j++) in sb_regs_show()
2378 struct tb_port *port = s->private; in port_sb_regs_show()
2379 struct tb_switch *sw = port->sw; in port_sb_regs_show()
2380 struct tb *tb = sw->tb; in port_sb_regs_show()
2383 pm_runtime_get_sync(&sw->dev); in port_sb_regs_show()
2385 if (mutex_lock_interruptible(&tb->lock)) { in port_sb_regs_show()
2386 ret = -ERESTARTSYS; in port_sb_regs_show()
2393 mutex_unlock(&tb->lock); in port_sb_regs_show()
2395 pm_runtime_mark_last_busy(&sw->dev); in port_sb_regs_show()
2396 pm_runtime_put_autosuspend(&sw->dev); in port_sb_regs_show()
2403 * tb_switch_debugfs_init() - Add debugfs entries for router
2413 debugfs_dir = debugfs_create_dir(dev_name(&sw->dev), tb_debugfs_root); in tb_switch_debugfs_init()
2414 sw->debugfs_dir = debugfs_dir; in tb_switch_debugfs_init()
2417 if (sw->drom) in tb_switch_debugfs_init()
2418 debugfs_create_blob("drom", 0400, debugfs_dir, &sw->drom_blob); in tb_switch_debugfs_init()
2424 if (port->disabled) in tb_switch_debugfs_init()
2426 if (port->config.type == TB_TYPE_INACTIVE) in tb_switch_debugfs_init()
2429 snprintf(dir_name, sizeof(dir_name), "port%d", port->port); in tb_switch_debugfs_init()
2430 debugfs_dir = debugfs_create_dir(dir_name, sw->debugfs_dir); in tb_switch_debugfs_init()
2435 if (port->config.counters_support) in tb_switch_debugfs_init()
2438 if (port->usb4) in tb_switch_debugfs_init()
2447 * tb_switch_debugfs_remove() - Remove all router debugfs entries
2455 debugfs_remove_recursive(sw->debugfs_dir); in tb_switch_debugfs_remove()
2469 * tb_service_debugfs_init() - Add debugfs directory for service
2476 svc->debugfs_dir = debugfs_create_dir(dev_name(&svc->dev), in tb_service_debugfs_init()
2481 * tb_service_debugfs_remove() - Remove service debugfs directory
2488 debugfs_remove_recursive(svc->debugfs_dir); in tb_service_debugfs_remove()
2489 svc->debugfs_dir = NULL; in tb_service_debugfs_remove()
2494 struct tb_retimer *rt = s->private; in retimer_sb_regs_show()
2495 struct tb *tb = rt->tb; in retimer_sb_regs_show()
2498 pm_runtime_get_sync(&rt->dev); in retimer_sb_regs_show()
2500 if (mutex_lock_interruptible(&tb->lock)) { in retimer_sb_regs_show()
2501 ret = -ERESTARTSYS; in retimer_sb_regs_show()
2505 ret = sb_regs_show(rt->port, retimer_sb_regs, ARRAY_SIZE(retimer_sb_regs), in retimer_sb_regs_show()
2506 USB4_SB_TARGET_RETIMER, rt->index, s); in retimer_sb_regs_show()
2508 mutex_unlock(&tb->lock); in retimer_sb_regs_show()
2510 pm_runtime_mark_last_busy(&rt->dev); in retimer_sb_regs_show()
2511 pm_runtime_put_autosuspend(&rt->dev); in retimer_sb_regs_show()
2518 * tb_retimer_debugfs_init() - Add debugfs directory for retimer
2519 * @rt: Pointer to retimer structure
2521 * Adds and populates retimer debugfs directory.
2527 debugfs_dir = debugfs_create_dir(dev_name(&rt->dev), tb_debugfs_root); in tb_retimer_debugfs_init()
2534 * tb_retimer_debugfs_remove() - Remove retimer debugfs directory
2535 * @rt: Pointer to retimer structure
2537 * Removes the retimer debugfs directory along with its contents.
2541 debugfs_lookup_and_remove(dev_name(&rt->dev), tb_debugfs_root); in tb_retimer_debugfs_remove()