Lines Matching +full:retimer +full:- +full:switch
1 // SPDX-License-Identifier: GPL-2.0
89 /* Sideband registers for retimer */
106 return single_open(file, __space ## _show, inode->i_private); \
133 return ERR_PTR(-EINVAL); in validate_and_copy_from_user()
136 return ERR_PTR(-EFAULT); in validate_and_copy_from_user()
140 return ERR_PTR(-ENOMEM); in validate_and_copy_from_user()
145 return ERR_PTR(-EFAULT); in validate_and_copy_from_user()
189 *val = v[short_fmt_len - 1]; in parse_line()
193 *val = v[long_fmt_len - 1]; in parse_line()
209 u32 offs = offset - index; in path_write_one()
225 struct tb *tb = sw->tb; in regs_write()
233 pm_runtime_get_sync(&sw->dev); in regs_write()
235 if (mutex_lock_interruptible(&tb->lock)) { in regs_write()
236 ret = -ERESTARTSYS; in regs_write()
262 mutex_unlock(&tb->lock); in regs_write()
265 pm_runtime_mark_last_busy(&sw->dev); in regs_write()
266 pm_runtime_put_autosuspend(&sw->dev); in regs_write()
275 struct seq_file *s = file->private_data; in port_regs_write()
276 struct tb_port *port = s->private; in port_regs_write()
278 return regs_write(port->sw, port, TB_CFG_PORT, user_buf, count, ppos); in port_regs_write()
284 struct seq_file *s = file->private_data; in path_write()
285 struct tb_port *port = s->private; in path_write()
287 return regs_write(port->sw, port, TB_CFG_HOPS, user_buf, count, ppos); in path_write()
293 struct seq_file *s = file->private_data; in switch_regs_write()
294 struct tb_switch *sw = s->private; in switch_regs_write()
354 return -EINVAL; in sb_regs_write()
366 return -EINVAL; in sb_regs_write()
368 if (bytes_read > sb_regs->size) in sb_regs_write()
369 return -E2BIG; in sb_regs_write()
371 ret = usb4_port_sb_write(port, target, index, sb_reg->reg, data, in sb_regs_write()
383 struct seq_file *s = file->private_data; in port_sb_regs_write()
384 struct tb_port *port = s->private; in port_sb_regs_write()
385 struct tb_switch *sw = port->sw; in port_sb_regs_write()
386 struct tb *tb = sw->tb; in port_sb_regs_write()
394 pm_runtime_get_sync(&sw->dev); in port_sb_regs_write()
396 if (mutex_lock_interruptible(&tb->lock)) { in port_sb_regs_write()
397 ret = -ERESTARTSYS; in port_sb_regs_write()
404 mutex_unlock(&tb->lock); in port_sb_regs_write()
406 pm_runtime_mark_last_busy(&sw->dev); in port_sb_regs_write()
407 pm_runtime_put_autosuspend(&sw->dev); in port_sb_regs_write()
417 struct seq_file *s = file->private_data; in retimer_sb_regs_write()
418 struct tb_retimer *rt = s->private; in retimer_sb_regs_write()
419 struct tb *tb = rt->tb; in retimer_sb_regs_write()
427 pm_runtime_get_sync(&rt->dev); in retimer_sb_regs_write()
429 if (mutex_lock_interruptible(&tb->lock)) { in retimer_sb_regs_write()
430 ret = -ERESTARTSYS; in retimer_sb_regs_write()
434 ret = sb_regs_write(rt->port, retimer_sb_regs, ARRAY_SIZE(retimer_sb_regs), in retimer_sb_regs_write()
435 USB4_SB_TARGET_RETIMER, rt->index, buf, count, ppos); in retimer_sb_regs_write()
437 mutex_unlock(&tb->lock); in retimer_sb_regs_write()
439 pm_runtime_mark_last_busy(&rt->dev); in retimer_sb_regs_write()
440 pm_runtime_put_autosuspend(&rt->dev); in retimer_sb_regs_write()
457 * struct tb_margining - Lane margining support
460 * @index: Retimer index if taget is %USB4_SB_TARGET_RETIMER
461 * @dev: Pointer to the device that is the target (USB4 port or retimer)
521 struct tb_port *port = margining->port; in margining_modify_error_counter()
526 return -EOPNOTSUPP; in margining_modify_error_counter()
531 return usb4_port_sw_margin(port, margining->target, margining->index, in margining_modify_error_counter()
537 if (margining->gen < 4) in supports_software()
538 return margining->caps[0] & USB4_MARGIN_CAP_0_MODES_SW; in supports_software()
539 return margining->caps[2] & USB4_MARGIN_CAP_2_MODES_SW; in supports_software()
544 if (margining->gen < 4) in supports_hardware()
545 return margining->caps[0] & USB4_MARGIN_CAP_0_MODES_HW; in supports_hardware()
546 return margining->caps[2] & USB4_MARGIN_CAP_2_MODES_HW; in supports_hardware()
551 return margining->caps[0] & USB4_MARGIN_CAP_0_ALL_LANES; in all_lanes()
557 if (margining->gen < 4) { in independent_voltage_margins()
558 switch (FIELD_GET(USB4_MARGIN_CAP_0_VOLTAGE_INDP_MASK, margining->caps[0])) { in independent_voltage_margins()
567 switch (FIELD_GET(USB4_MARGIN_CAP_2_VOLTAGE_INDP_MASK, margining->caps[2])) { in independent_voltage_margins()
579 if (margining->gen < 4) in supports_time()
580 return margining->caps[0] & USB4_MARGIN_CAP_0_TIME; in supports_time()
581 return margining->caps[2] & USB4_MARGIN_CAP_2_TIME; in supports_time()
588 if (margining->gen < 4) { in independent_time_margins()
589 switch (FIELD_GET(USB4_MARGIN_CAP_1_TIME_INDP_MASK, margining->caps[1])) { in independent_time_margins()
598 switch (FIELD_GET(USB4_MARGIN_CAP_2_TIME_INDP_MASK, margining->caps[2])) { in independent_time_margins()
611 return margining->caps[0] & USB4_MARGIN_CAP_0_OPT_VOLTAGE_SUPPORT; in supports_optional_voltage_offset_range()
618 struct seq_file *s = file->private_data; in margining_ber_level_write()
619 struct tb_margining *margining = s->private; in margining_ber_level_write()
620 struct tb *tb = margining->port->sw->tb; in margining_ber_level_write()
625 if (mutex_lock_interruptible(&tb->lock)) in margining_ber_level_write()
626 return -ERESTARTSYS; in margining_ber_level_write()
628 if (margining->software) { in margining_ber_level_write()
629 ret = -EINVAL; in margining_ber_level_write()
639 buf[count - 1] = '\0'; in margining_ber_level_write()
645 if (val < margining->min_ber_level || in margining_ber_level_write()
646 val > margining->max_ber_level) { in margining_ber_level_write()
647 ret = -EINVAL; in margining_ber_level_write()
651 margining->ber_level = val; in margining_ber_level_write()
656 mutex_unlock(&tb->lock); in margining_ber_level_write()
664 seq_printf(s, "3 * 1e%d (%u)\n", -12 + (val + 1) / 2, val); in ber_level_show()
666 seq_printf(s, "1e%d (%u)\n", -12 + val / 2, val); in ber_level_show()
671 const struct tb_margining *margining = s->private; in margining_ber_level_show()
673 if (margining->software) in margining_ber_level_show()
674 return -EINVAL; in margining_ber_level_show()
675 ber_level_show(s, margining->ber_level); in margining_ber_level_show()
682 struct tb_margining *margining = s->private; in margining_caps_show()
683 struct tb *tb = margining->port->sw->tb; in margining_caps_show()
686 if (mutex_lock_interruptible(&tb->lock)) in margining_caps_show()
687 return -ERESTARTSYS; in margining_caps_show()
690 for (int i = 0; i < ARRAY_SIZE(margining->caps); i++) in margining_caps_show()
691 seq_printf(s, "0x%08x\n", margining->caps[i]); in margining_caps_show()
698 ber_level_show(s, margining->min_ber_level); in margining_caps_show()
700 ber_level_show(s, margining->max_ber_level); in margining_caps_show()
708 margining->voltage_steps); in margining_caps_show()
710 margining->max_voltage_offset); in margining_caps_show()
715 margining->voltage_steps_optional_range); in margining_caps_show()
717 margining->max_voltage_offset_optional_range); in margining_caps_show()
720 switch (independent_voltage_margins(margining)) { in margining_caps_show()
737 tb_port_warn(margining->port, in margining_caps_show()
739 ret = -EIO; in margining_caps_show()
746 str_yes_no(margining->caps[1] & USB4_MARGIN_CAP_1_TIME_DESTR)); in margining_caps_show()
748 switch (independent_time_margins(margining)) { in margining_caps_show()
765 tb_port_warn(margining->port, in margining_caps_show()
767 ret = -EIO; in margining_caps_show()
772 margining->time_steps); in margining_caps_show()
774 margining->max_time_offset); in margining_caps_show()
780 mutex_unlock(&tb->lock); in margining_caps_show()
811 struct seq_file *s = file->private_data; in margining_lanes_write()
812 struct tb_margining *margining = s->private; in margining_lanes_write()
813 struct tb_port *port = margining->port; in margining_lanes_write()
814 struct tb *tb = port->sw->tb; in margining_lanes_write()
815 int lane = -1; in margining_lanes_write()
822 buf[count - 1] = '\0'; in margining_lanes_write()
833 if (lane == -1) in margining_lanes_write()
834 return -EINVAL; in margining_lanes_write()
836 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_lanes_write()
838 return -EINVAL; in margining_lanes_write()
843 if (lane == USB4_MARGINING_LANE_RX2 && !margining->asym_rx) in margining_lanes_write()
844 return -EINVAL; in margining_lanes_write()
846 margining->lanes = lane; in margining_lanes_write()
854 struct tb_margining *margining = s->private; in margining_lanes_show()
855 struct tb_port *port = margining->port; in margining_lanes_show()
856 struct tb *tb = port->sw->tb; in margining_lanes_show()
858 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_lanes_show()
864 !margining->asym_rx) in margining_lanes_show()
870 if (lane_names[i].lane == margining->lanes) in margining_lanes_show()
887 struct seq_file *s = file->private_data; in margining_voltage_time_offset_write()
888 struct tb_margining *margining = s->private; in margining_voltage_time_offset_write()
889 struct tb *tb = margining->port->sw->tb; in margining_voltage_time_offset_write()
898 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_voltage_time_offset_write()
899 if (!margining->software) in margining_voltage_time_offset_write()
900 return -EOPNOTSUPP; in margining_voltage_time_offset_write()
902 if (margining->time) in margining_voltage_time_offset_write()
903 max_margin = margining->time_steps; in margining_voltage_time_offset_write()
905 if (margining->optional_voltage_offset_range) in margining_voltage_time_offset_write()
906 max_margin = margining->voltage_steps_optional_range; in margining_voltage_time_offset_write()
908 max_margin = margining->voltage_steps; in margining_voltage_time_offset_write()
910 margining->voltage_time_offset = clamp(val, 0, max_margin); in margining_voltage_time_offset_write()
919 const struct tb_margining *margining = s->private; in margining_voltage_time_offset_show()
920 struct tb *tb = margining->port->sw->tb; in margining_voltage_time_offset_show()
922 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_voltage_time_offset_show()
923 if (!margining->software) in margining_voltage_time_offset_show()
924 return -EOPNOTSUPP; in margining_voltage_time_offset_show()
926 seq_printf(s, "%d\n", margining->voltage_time_offset); in margining_voltage_time_offset_show()
938 struct seq_file *s = file->private_data; in margining_error_counter_write()
939 struct tb_margining *margining = s->private; in margining_error_counter_write()
940 struct tb *tb = margining->port->sw->tb; in margining_error_counter_write()
947 buf[count - 1] = '\0'; in margining_error_counter_write()
958 return -EINVAL; in margining_error_counter_write()
960 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_error_counter_write()
961 if (!margining->software) in margining_error_counter_write()
962 return -EOPNOTSUPP; in margining_error_counter_write()
964 margining->error_counter = error_counter; in margining_error_counter_write()
972 const struct tb_margining *margining = s->private; in margining_error_counter_show()
973 struct tb *tb = margining->port->sw->tb; in margining_error_counter_show()
975 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_error_counter_show()
976 if (!margining->software) in margining_error_counter_show()
977 return -EOPNOTSUPP; in margining_error_counter_show()
979 switch (margining->error_counter) { in margining_error_counter_show()
1003 struct seq_file *s = file->private_data; in margining_dwell_time_write()
1004 struct tb_margining *margining = s->private; in margining_dwell_time_write()
1005 struct tb *tb = margining->port->sw->tb; in margining_dwell_time_write()
1013 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_dwell_time_write()
1014 if (!margining->software) in margining_dwell_time_write()
1015 return -EOPNOTSUPP; in margining_dwell_time_write()
1017 margining->dwell_time = clamp(val, MIN_DWELL_TIME, MAX_DWELL_TIME); in margining_dwell_time_write()
1025 struct tb_margining *margining = s->private; in margining_dwell_time_show()
1026 struct tb *tb = margining->port->sw->tb; in margining_dwell_time_show()
1028 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_dwell_time_show()
1029 if (!margining->software) in margining_dwell_time_show()
1030 return -EOPNOTSUPP; in margining_dwell_time_show()
1032 seq_printf(s, "%d\n", margining->dwell_time); in margining_dwell_time_show()
1043 struct seq_file *s = file->private_data; in margining_optional_voltage_offset_write()
1044 struct tb_margining *margining = s->private; in margining_optional_voltage_offset_write()
1045 struct tb *tb = margining->port->sw->tb; in margining_optional_voltage_offset_write()
1053 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_optional_voltage_offset_write()
1054 margining->optional_voltage_offset_range = val; in margining_optional_voltage_offset_write()
1063 struct tb_margining *margining = s->private; in margining_optional_voltage_offset_show()
1064 struct tb *tb = margining->port->sw->tb; in margining_optional_voltage_offset_show()
1066 scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &tb->lock) { in margining_optional_voltage_offset_show()
1067 seq_printf(s, "%u\n", margining->optional_voltage_offset_range); in margining_optional_voltage_offset_show()
1078 struct seq_file *s = file->private_data; in margining_mode_write()
1079 struct tb_margining *margining = s->private; in margining_mode_write()
1080 struct tb *tb = margining->port->sw->tb; in margining_mode_write()
1088 buf[count - 1] = '\0'; in margining_mode_write()
1090 if (mutex_lock_interruptible(&tb->lock)) { in margining_mode_write()
1091 ret = -ERESTARTSYS; in margining_mode_write()
1097 margining->software = true; in margining_mode_write()
1099 ret = -EINVAL; in margining_mode_write()
1102 margining->software = false; in margining_mode_write()
1104 ret = -EINVAL; in margining_mode_write()
1106 ret = -EINVAL; in margining_mode_write()
1109 mutex_unlock(&tb->lock); in margining_mode_write()
1118 struct tb_margining *margining = s->private; in margining_mode_show()
1119 struct tb *tb = margining->port->sw->tb; in margining_mode_show()
1122 if (mutex_lock_interruptible(&tb->lock)) in margining_mode_show()
1123 return -ERESTARTSYS; in margining_mode_show()
1126 if (margining->software) in margining_mode_show()
1133 if (margining->software) in margining_mode_show()
1139 mutex_unlock(&tb->lock); in margining_mode_show()
1149 u32 nsamples = margining->dwell_time / DWELL_SAMPLE_INTERVAL; in margining_run_sw()
1152 ret = usb4_port_sw_margin(margining->port, margining->target, margining->index, in margining_run_sw()
1153 params, margining->results); in margining_run_sw()
1160 ret = usb4_port_sw_margin_errors(margining->port, margining->target, in margining_run_sw()
1161 margining->index, &margining->results[1]); in margining_run_sw()
1165 if (margining->lanes == USB4_MARGINING_LANE_RX0) in margining_run_sw()
1167 margining->results[1]); in margining_run_sw()
1168 else if (margining->lanes == USB4_MARGINING_LANE_RX1) in margining_run_sw()
1170 margining->results[1]); in margining_run_sw()
1171 else if (margining->lanes == USB4_MARGINING_LANE_RX2) in margining_run_sw()
1173 margining->results[1]); in margining_run_sw()
1174 else if (margining->lanes == USB4_MARGINING_LANE_ALL) in margining_run_sw()
1175 errors = margining->results[1]; in margining_run_sw()
1189 margining_modify_error_counter(margining, margining->lanes, in margining_run_sw()
1202 if (margining->lanes == USB4_MARGINING_LANE_RX2) { in validate_margining()
1205 ret = tb_port_get_link_width(margining->port); in validate_margining()
1209 tb_port_warn(margining->port, "link is %s expected %s", in validate_margining()
1212 return -EINVAL; in validate_margining()
1222 struct tb_port *port = margining->port; in margining_run_write()
1223 struct device *dev = margining->dev; in margining_run_write()
1224 struct tb_switch *sw = port->sw; in margining_run_write()
1226 struct tb *tb = sw->tb; in margining_run_write()
1230 return -EINVAL; in margining_run_write()
1234 if (mutex_lock_interruptible(&tb->lock)) { in margining_run_write()
1235 ret = -ERESTARTSYS; in margining_run_write()
1245 else if (port->remote) in margining_run_write()
1246 down_sw = port->remote->sw; in margining_run_write()
1264 memset(margining->results, 0, sizeof(margining->results)); in margining_run_write()
1266 if (margining->software) { in margining_run_write()
1269 .lanes = margining->lanes, in margining_run_write()
1270 .time = margining->time, in margining_run_write()
1271 .voltage_time_offset = margining->voltage_time_offset, in margining_run_write()
1272 .right_high = margining->right_high, in margining_run_write()
1273 .upper_eye = margining->upper_eye, in margining_run_write()
1274 .optional_voltage_offset_range = margining->optional_voltage_offset_range, in margining_run_write()
1279 margining->time ? "time" : "voltage", dev_name(dev), in margining_run_write()
1280 margining->lanes); in margining_run_write()
1285 .ber_level = margining->ber_level, in margining_run_write()
1286 .lanes = margining->lanes, in margining_run_write()
1287 .time = margining->time, in margining_run_write()
1288 .right_high = margining->right_high, in margining_run_write()
1289 .upper_eye = margining->upper_eye, in margining_run_write()
1290 .optional_voltage_offset_range = margining->optional_voltage_offset_range, in margining_run_write()
1295 margining->time ? "time" : "voltage", dev_name(dev), in margining_run_write()
1296 margining->lanes); in margining_run_write()
1298 ret = usb4_port_hw_margin(port, margining->target, margining->index, ¶ms, in margining_run_write()
1299 margining->results, ARRAY_SIZE(margining->results)); in margining_run_write()
1305 mutex_unlock(&tb->lock); in margining_run_write()
1319 struct seq_file *s = file->private_data; in margining_results_write()
1320 struct tb_margining *margining = s->private; in margining_results_write()
1321 struct tb *tb = margining->port->sw->tb; in margining_results_write()
1323 if (mutex_lock_interruptible(&tb->lock)) in margining_results_write()
1324 return -ERESTARTSYS; in margining_results_write()
1327 memset(margining->results, 0, sizeof(margining->results)); in margining_results_write()
1329 if (margining->software) { in margining_results_write()
1336 mutex_unlock(&tb->lock); in margining_results_write()
1346 voltage = tmp * margining->max_voltage_offset / margining->voltage_steps; in voltage_margin_show()
1351 if (margining->optional_voltage_offset_range) in voltage_margin_show()
1361 interval = tmp * margining->max_time_offset / margining->time_steps; in time_margin_show()
1392 if (margining->time) { in margining_hw_result_format()
1393 val = margining_hw_result_val(margining->results, lane, true); in margining_hw_result_format()
1396 val = margining_hw_result_val(margining->results, lane, false); in margining_hw_result_format()
1400 val = margining_hw_result_val(margining->results, lane, true); in margining_hw_result_format()
1403 val = margining_hw_result_val(margining->results, lane, false); in margining_hw_result_format()
1411 struct tb_margining *margining = s->private; in margining_results_show()
1412 struct tb *tb = margining->port->sw->tb; in margining_results_show()
1414 if (mutex_lock_interruptible(&tb->lock)) in margining_results_show()
1415 return -ERESTARTSYS; in margining_results_show()
1418 seq_printf(s, "0x%08x\n", margining->results[0]); in margining_results_show()
1420 if (!margining->software) { in margining_results_show()
1421 for (int i = 1; i < ARRAY_SIZE(margining->results); i++) in margining_results_show()
1422 seq_printf(s, "0x%08x\n", margining->results[i]); in margining_results_show()
1424 if (margining->lanes == USB4_MARGINING_LANE_ALL) { in margining_results_show()
1429 if (margining->asym_rx) in margining_results_show()
1434 margining->lanes); in margining_results_show()
1439 seq_printf(s, "0x%08x\n", margining->results[1]); in margining_results_show()
1441 result = FIELD_GET(USB4_MARGIN_SW_LANES_MASK, margining->results[0]); in margining_results_show()
1445 margining->results[1]); in margining_results_show()
1451 margining->results[1]); in margining_results_show()
1454 if (margining->asym_rx && in margining_results_show()
1458 margining->results[1]); in margining_results_show()
1463 mutex_unlock(&tb->lock); in margining_results_show()
1472 struct seq_file *s = file->private_data; in margining_test_write()
1473 struct tb_margining *margining = s->private; in margining_test_write()
1474 struct tb *tb = margining->port->sw->tb; in margining_test_write()
1482 buf[count - 1] = '\0'; in margining_test_write()
1484 if (mutex_lock_interruptible(&tb->lock)) { in margining_test_write()
1485 ret = -ERESTARTSYS; in margining_test_write()
1490 margining->time = true; in margining_test_write()
1492 margining->time = false; in margining_test_write()
1494 ret = -EINVAL; in margining_test_write()
1496 mutex_unlock(&tb->lock); in margining_test_write()
1505 struct tb_margining *margining = s->private; in margining_test_show()
1506 struct tb *tb = margining->port->sw->tb; in margining_test_show()
1508 if (mutex_lock_interruptible(&tb->lock)) in margining_test_show()
1509 return -ERESTARTSYS; in margining_test_show()
1512 if (margining->time) in margining_test_show()
1520 mutex_unlock(&tb->lock); in margining_test_show()
1529 struct seq_file *s = file->private_data; in margining_margin_write()
1530 struct tb_margining *margining = s->private; in margining_margin_write()
1531 struct tb *tb = margining->port->sw->tb; in margining_margin_write()
1539 buf[count - 1] = '\0'; in margining_margin_write()
1541 if (mutex_lock_interruptible(&tb->lock)) { in margining_margin_write()
1542 ret = -ERESTARTSYS; in margining_margin_write()
1546 if (margining->time) { in margining_margin_write()
1548 margining->right_high = false; in margining_margin_write()
1550 margining->right_high = true; in margining_margin_write()
1552 ret = -EINVAL; in margining_margin_write()
1555 margining->right_high = false; in margining_margin_write()
1557 margining->right_high = true; in margining_margin_write()
1559 ret = -EINVAL; in margining_margin_write()
1562 mutex_unlock(&tb->lock); in margining_margin_write()
1571 struct tb_margining *margining = s->private; in margining_margin_show()
1572 struct tb *tb = margining->port->sw->tb; in margining_margin_show()
1574 if (mutex_lock_interruptible(&tb->lock)) in margining_margin_show()
1575 return -ERESTARTSYS; in margining_margin_show()
1577 if (margining->time) { in margining_margin_show()
1578 if (margining->right_high) in margining_margin_show()
1583 if (margining->right_high) in margining_margin_show()
1589 mutex_unlock(&tb->lock); in margining_margin_show()
1598 struct seq_file *s = file->private_data; in margining_eye_write()
1599 struct tb_port *port = s->private; in margining_eye_write()
1600 struct usb4_port *usb4 = port->usb4; in margining_eye_write()
1601 struct tb *tb = port->sw->tb; in margining_eye_write()
1609 buf[count - 1] = '\0'; in margining_eye_write()
1611 scoped_cond_guard(mutex_intr, ret = -ERESTARTSYS, &tb->lock) { in margining_eye_write()
1613 usb4->margining->upper_eye = false; in margining_eye_write()
1615 usb4->margining->upper_eye = true; in margining_eye_write()
1617 ret = -EINVAL; in margining_eye_write()
1626 struct tb_port *port = s->private; in margining_eye_show()
1627 struct usb4_port *usb4 = port->usb4; in margining_eye_show()
1628 struct tb *tb = port->sw->tb; in margining_eye_show()
1630 scoped_guard(mutex_intr, &tb->lock) { in margining_eye_show()
1631 if (usb4->margining->upper_eye) in margining_eye_show()
1639 return -ERESTARTSYS; in margining_eye_show()
1663 margining->port = port; in margining_alloc()
1664 margining->target = target; in margining_alloc()
1665 margining->index = index; in margining_alloc()
1666 margining->dev = dev; in margining_alloc()
1667 margining->gen = ret; in margining_alloc()
1668 margining->asym_rx = tb_port_width_supported(port, TB_LINK_WIDTH_ASYM_RX); in margining_alloc()
1670 ret = usb4_port_margining_caps(port, target, index, margining->caps, in margining_alloc()
1671 ARRAY_SIZE(margining->caps)); in margining_alloc()
1679 margining->software = true; in margining_alloc()
1681 if (margining->gen < 4) { in margining_alloc()
1682 val = FIELD_GET(USB4_MARGIN_CAP_0_VOLTAGE_STEPS_MASK, margining->caps[0]); in margining_alloc()
1683 margining->voltage_steps = val; in margining_alloc()
1684 val = FIELD_GET(USB4_MARGIN_CAP_0_MAX_VOLTAGE_OFFSET_MASK, margining->caps[0]); in margining_alloc()
1685 margining->max_voltage_offset = 74 + val * 2; in margining_alloc()
1687 val = FIELD_GET(USB4_MARGIN_CAP_2_VOLTAGE_STEPS_MASK, margining->caps[2]); in margining_alloc()
1688 margining->voltage_steps = val; in margining_alloc()
1689 val = FIELD_GET(USB4_MARGIN_CAP_2_MAX_VOLTAGE_OFFSET_MASK, margining->caps[2]); in margining_alloc()
1690 margining->max_voltage_offset = 74 + val * 2; in margining_alloc()
1695 margining->caps[0]); in margining_alloc()
1696 margining->voltage_steps_optional_range = val; in margining_alloc()
1698 margining->caps[1]); in margining_alloc()
1699 margining->max_voltage_offset_optional_range = 74 + val * 2; in margining_alloc()
1703 val = FIELD_GET(USB4_MARGIN_CAP_1_TIME_STEPS_MASK, margining->caps[1]); in margining_alloc()
1704 margining->time_steps = val; in margining_alloc()
1705 val = FIELD_GET(USB4_MARGIN_CAP_1_TIME_OFFSET_MASK, margining->caps[1]); in margining_alloc()
1710 margining->max_time_offset = 200 + 10 * val; in margining_alloc()
1715 val = FIELD_GET(USB4_MARGIN_CAP_1_MIN_BER_MASK, margining->caps[1]); in margining_alloc()
1716 margining->min_ber_level = val; in margining_alloc()
1717 val = FIELD_GET(USB4_MARGIN_CAP_1_MAX_BER_MASK, margining->caps[1]); in margining_alloc()
1718 margining->max_ber_level = val; in margining_alloc()
1721 margining->ber_level = margining->min_ber_level; in margining_alloc()
1738 margining->error_counter = USB4_MARGIN_SW_ERROR_COUNTER_CLEAR; in margining_alloc()
1739 margining->dwell_time = MIN_DWELL_TIME; in margining_alloc()
1754 if (margining->gen >= 4) in margining_alloc()
1765 if (!port->usb4) in margining_port_init()
1768 snprintf(dir_name, sizeof(dir_name), "port%d", port->port); in margining_port_init()
1769 parent = debugfs_lookup(dir_name, port->sw->debugfs_dir); in margining_port_init()
1770 port->usb4->margining = margining_alloc(port, &port->usb4->dev, in margining_port_init()
1780 if (!port->usb4) in margining_port_remove()
1783 snprintf(dir_name, sizeof(dir_name), "port%d", port->port); in margining_port_remove()
1784 parent = debugfs_lookup(dir_name, port->sw->debugfs_dir); in margining_port_remove()
1788 kfree(port->usb4->margining); in margining_port_remove()
1789 port->usb4->margining = NULL; in margining_port_remove()
1832 downstream = tb_port_at(xd->route, parent_sw); in margining_xdomain_init()
1843 downstream = tb_port_at(xd->route, parent_sw); in margining_xdomain_remove()
1849 rt->margining = margining_alloc(rt->port, &rt->dev, in margining_retimer_init()
1850 USB4_SB_TARGET_RETIMER, rt->index, in margining_retimer_init()
1856 kfree(rt->margining); in margining_retimer_remove()
1857 rt->margining = NULL; in margining_retimer_remove()
1874 buf = kcalloc(COUNTER_SET_LEN * port->config.max_counters, sizeof(u32), in port_clear_all_counters()
1877 return -ENOMEM; in port_clear_all_counters()
1880 COUNTER_SET_LEN * port->config.max_counters); in port_clear_all_counters()
1889 struct seq_file *s = file->private_data; in counters_write()
1890 struct tb_port *port = s->private; in counters_write()
1891 struct tb_switch *sw = port->sw; in counters_write()
1892 struct tb *tb = port->sw->tb; in counters_write()
1900 pm_runtime_get_sync(&sw->dev); in counters_write()
1902 if (mutex_lock_interruptible(&tb->lock)) { in counters_write()
1903 ret = -ERESTARTSYS; in counters_write()
1914 ret = -EINVAL; in counters_write()
1923 mutex_unlock(&tb->lock); in counters_write()
1926 pm_runtime_mark_last_busy(&sw->dev); in counters_write()
1927 pm_runtime_put_autosuspend(&sw->dev); in counters_write()
1982 length -= dwords; in cap_show()
2001 switch (header.basic.cap) { in port_cap_show()
2007 if (usb4_switch_version(port->sw) < 2) in port_cap_show()
2019 if (usb4_switch_version(port->sw) < 2) in port_cap_show()
2024 if (usb4_switch_version(port->sw) < 2) in port_cap_show()
2098 struct tb_port *port = s->private; in port_regs_show()
2099 struct tb_switch *sw = port->sw; in port_regs_show()
2100 struct tb *tb = sw->tb; in port_regs_show()
2103 pm_runtime_get_sync(&sw->dev); in port_regs_show()
2105 if (mutex_lock_interruptible(&tb->lock)) { in port_regs_show()
2106 ret = -ERESTARTSYS; in port_regs_show()
2119 mutex_unlock(&tb->lock); in port_regs_show()
2121 pm_runtime_mark_last_busy(&sw->dev); in port_regs_show()
2122 pm_runtime_put_autosuspend(&sw->dev); in port_regs_show()
2203 struct tb_switch *sw = s->private; in switch_regs_show()
2204 struct tb *tb = sw->tb; in switch_regs_show()
2207 pm_runtime_get_sync(&sw->dev); in switch_regs_show()
2209 if (mutex_lock_interruptible(&tb->lock)) { in switch_regs_show()
2210 ret = -ERESTARTSYS; in switch_regs_show()
2223 mutex_unlock(&tb->lock); in switch_regs_show()
2225 pm_runtime_mark_last_busy(&sw->dev); in switch_regs_show()
2226 pm_runtime_put_autosuspend(&sw->dev); in switch_regs_show()
2254 struct tb_port *port = s->private; in path_show()
2255 struct tb_switch *sw = port->sw; in path_show()
2256 struct tb *tb = sw->tb; in path_show()
2259 pm_runtime_get_sync(&sw->dev); in path_show()
2261 if (mutex_lock_interruptible(&tb->lock)) { in path_show()
2262 ret = -ERESTARTSYS; in path_show()
2277 for (i = start; i <= port->config.max_in_hop_id; i++) { in path_show()
2284 mutex_unlock(&tb->lock); in path_show()
2286 pm_runtime_mark_last_busy(&sw->dev); in path_show()
2287 pm_runtime_put_autosuspend(&sw->dev); in path_show()
2317 struct tb_port *port = s->private; in counters_show()
2318 struct tb_switch *sw = port->sw; in counters_show()
2319 struct tb *tb = sw->tb; in counters_show()
2322 pm_runtime_get_sync(&sw->dev); in counters_show()
2324 if (mutex_lock_interruptible(&tb->lock)) { in counters_show()
2325 ret = -ERESTARTSYS; in counters_show()
2331 for (i = 0; i < port->config.max_counters; i++) { in counters_show()
2337 mutex_unlock(&tb->lock); in counters_show()
2340 pm_runtime_mark_last_busy(&sw->dev); in counters_show()
2341 pm_runtime_put_autosuspend(&sw->dev); in counters_show()
2361 ret = usb4_port_sb_read(port, target, index, regs->reg, data, in sb_regs_show()
2362 regs->size); in sb_regs_show()
2366 seq_printf(s, "0x%02x", regs->reg); in sb_regs_show()
2367 for (j = 0; j < regs->size; j++) in sb_regs_show()
2377 struct tb_port *port = s->private; in port_sb_regs_show()
2378 struct tb_switch *sw = port->sw; in port_sb_regs_show()
2379 struct tb *tb = sw->tb; in port_sb_regs_show()
2382 pm_runtime_get_sync(&sw->dev); in port_sb_regs_show()
2384 if (mutex_lock_interruptible(&tb->lock)) { in port_sb_regs_show()
2385 ret = -ERESTARTSYS; in port_sb_regs_show()
2392 mutex_unlock(&tb->lock); in port_sb_regs_show()
2394 pm_runtime_mark_last_busy(&sw->dev); in port_sb_regs_show()
2395 pm_runtime_put_autosuspend(&sw->dev); in port_sb_regs_show()
2402 * tb_switch_debugfs_init() - Add debugfs entries for router
2412 debugfs_dir = debugfs_create_dir(dev_name(&sw->dev), tb_debugfs_root); in tb_switch_debugfs_init()
2413 sw->debugfs_dir = debugfs_dir; in tb_switch_debugfs_init()
2416 if (sw->drom) in tb_switch_debugfs_init()
2417 debugfs_create_blob("drom", 0400, debugfs_dir, &sw->drom_blob); in tb_switch_debugfs_init()
2423 if (port->disabled) in tb_switch_debugfs_init()
2425 if (port->config.type == TB_TYPE_INACTIVE) in tb_switch_debugfs_init()
2428 snprintf(dir_name, sizeof(dir_name), "port%d", port->port); in tb_switch_debugfs_init()
2429 debugfs_dir = debugfs_create_dir(dir_name, sw->debugfs_dir); in tb_switch_debugfs_init()
2434 if (port->config.counters_support) in tb_switch_debugfs_init()
2437 if (port->usb4) in tb_switch_debugfs_init()
2446 * tb_switch_debugfs_remove() - Remove all router debugfs entries
2454 debugfs_remove_recursive(sw->debugfs_dir); in tb_switch_debugfs_remove()
2468 * tb_service_debugfs_init() - Add debugfs directory for service
2475 svc->debugfs_dir = debugfs_create_dir(dev_name(&svc->dev), in tb_service_debugfs_init()
2480 * tb_service_debugfs_remove() - Remove service debugfs directory
2487 debugfs_remove_recursive(svc->debugfs_dir); in tb_service_debugfs_remove()
2488 svc->debugfs_dir = NULL; in tb_service_debugfs_remove()
2493 struct tb_retimer *rt = s->private; in retimer_sb_regs_show()
2494 struct tb *tb = rt->tb; in retimer_sb_regs_show()
2497 pm_runtime_get_sync(&rt->dev); in retimer_sb_regs_show()
2499 if (mutex_lock_interruptible(&tb->lock)) { in retimer_sb_regs_show()
2500 ret = -ERESTARTSYS; in retimer_sb_regs_show()
2504 ret = sb_regs_show(rt->port, retimer_sb_regs, ARRAY_SIZE(retimer_sb_regs), in retimer_sb_regs_show()
2505 USB4_SB_TARGET_RETIMER, rt->index, s); in retimer_sb_regs_show()
2507 mutex_unlock(&tb->lock); in retimer_sb_regs_show()
2509 pm_runtime_mark_last_busy(&rt->dev); in retimer_sb_regs_show()
2510 pm_runtime_put_autosuspend(&rt->dev); in retimer_sb_regs_show()
2517 * tb_retimer_debugfs_init() - Add debugfs directory for retimer
2518 * @rt: Pointer to retimer structure
2520 * Adds and populates retimer debugfs directory.
2526 debugfs_dir = debugfs_create_dir(dev_name(&rt->dev), tb_debugfs_root); in tb_retimer_debugfs_init()
2533 * tb_retimer_debugfs_remove() - Remove retimer debugfs directory
2534 * @rt: Pointer to retimer structure
2536 * Removes the retimer debugfs directory along with its contents.
2540 debugfs_lookup_and_remove(dev_name(&rt->dev), tb_debugfs_root); in tb_retimer_debugfs_remove()