1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Thunderbolt Time Management Unit (TMU) support 4 * 5 * Copyright (C) 2019, Intel Corporation 6 * Authors: Mika Westerberg <mika.westerberg@linux.intel.com> 7 * Rajmohan Mani <rajmohan.mani@intel.com> 8 */ 9 10 #include <linux/delay.h> 11 12 #include "tb.h" 13 14 static const unsigned int tmu_rates[] = { 15 [TB_SWITCH_TMU_MODE_OFF] = 0, 16 [TB_SWITCH_TMU_MODE_LOWRES] = 1000, 17 [TB_SWITCH_TMU_MODE_HIFI_UNI] = 16, 18 [TB_SWITCH_TMU_MODE_HIFI_BI] = 16, 19 [TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI] = 16, 20 }; 21 22 static const struct { 23 unsigned int freq_meas_window; 24 unsigned int avg_const; 25 unsigned int delta_avg_const; 26 unsigned int repl_timeout; 27 unsigned int repl_threshold; 28 unsigned int repl_n; 29 unsigned int dirswitch_n; 30 } tmu_params[] = { 31 [TB_SWITCH_TMU_MODE_OFF] = { }, 32 [TB_SWITCH_TMU_MODE_LOWRES] = { 30, 4, }, 33 [TB_SWITCH_TMU_MODE_HIFI_UNI] = { 800, 8, }, 34 [TB_SWITCH_TMU_MODE_HIFI_BI] = { 800, 8, }, 35 [TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI] = { 36 800, 4, 0, 3125, 25, 128, 255, 37 }, 38 }; 39 40 static const char *tmu_mode_name(enum tb_switch_tmu_mode mode) 41 { 42 switch (mode) { 43 case TB_SWITCH_TMU_MODE_OFF: 44 return "off"; 45 case TB_SWITCH_TMU_MODE_LOWRES: 46 return "uni-directional, LowRes"; 47 case TB_SWITCH_TMU_MODE_HIFI_UNI: 48 return "uni-directional, HiFi"; 49 case TB_SWITCH_TMU_MODE_HIFI_BI: 50 return "bi-directional, HiFi"; 51 case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI: 52 return "enhanced uni-directional, MedRes"; 53 default: 54 return "unknown"; 55 } 56 } 57 58 static bool tb_switch_tmu_enhanced_is_supported(const struct tb_switch *sw) 59 { 60 return usb4_switch_version(sw) > 1; 61 } 62 63 static int tb_switch_set_tmu_mode_params(struct tb_switch *sw, 64 enum tb_switch_tmu_mode mode) 65 { 66 u32 freq, avg, val; 67 int ret; 68 69 freq = tmu_params[mode].freq_meas_window; 70 avg = tmu_params[mode].avg_const; 71 72 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, 73 sw->tmu.cap + TMU_RTR_CS_0, 1); 74 if (ret) 75 return ret; 76 77 val &= ~TMU_RTR_CS_0_FREQ_WIND_MASK; 78 val |= FIELD_PREP(TMU_RTR_CS_0_FREQ_WIND_MASK, freq); 79 80 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, 81 sw->tmu.cap + TMU_RTR_CS_0, 1); 82 if (ret) 83 return ret; 84 85 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, 86 sw->tmu.cap + TMU_RTR_CS_15, 1); 87 if (ret) 88 return ret; 89 90 val &= ~TMU_RTR_CS_15_FREQ_AVG_MASK & 91 ~TMU_RTR_CS_15_DELAY_AVG_MASK & 92 ~TMU_RTR_CS_15_OFFSET_AVG_MASK & 93 ~TMU_RTR_CS_15_ERROR_AVG_MASK; 94 val |= FIELD_PREP(TMU_RTR_CS_15_FREQ_AVG_MASK, avg) | 95 FIELD_PREP(TMU_RTR_CS_15_DELAY_AVG_MASK, avg) | 96 FIELD_PREP(TMU_RTR_CS_15_OFFSET_AVG_MASK, avg) | 97 FIELD_PREP(TMU_RTR_CS_15_ERROR_AVG_MASK, avg); 98 99 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, 100 sw->tmu.cap + TMU_RTR_CS_15, 1); 101 if (ret) 102 return ret; 103 104 if (tb_switch_tmu_enhanced_is_supported(sw)) { 105 u32 delta_avg = tmu_params[mode].delta_avg_const; 106 107 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, 108 sw->tmu.cap + TMU_RTR_CS_18, 1); 109 if (ret) 110 return ret; 111 112 val &= ~TMU_RTR_CS_18_DELTA_AVG_CONST_MASK; 113 val |= FIELD_PREP(TMU_RTR_CS_18_DELTA_AVG_CONST_MASK, delta_avg); 114 115 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, 116 sw->tmu.cap + TMU_RTR_CS_18, 1); 117 } 118 119 return ret; 120 } 121 122 static bool tb_switch_tmu_ucap_is_supported(struct tb_switch *sw) 123 { 124 int ret; 125 u32 val; 126 127 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, 128 sw->tmu.cap + TMU_RTR_CS_0, 1); 129 if (ret) 130 return false; 131 132 return !!(val & TMU_RTR_CS_0_UCAP); 133 } 134 135 static int tb_switch_tmu_rate_read(struct tb_switch *sw) 136 { 137 int ret; 138 u32 val; 139 140 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, 141 sw->tmu.cap + TMU_RTR_CS_3, 1); 142 if (ret) 143 return ret; 144 145 val >>= TMU_RTR_CS_3_TS_PACKET_INTERVAL_SHIFT; 146 return val; 147 } 148 149 static int tb_switch_tmu_rate_write(struct tb_switch *sw, int rate) 150 { 151 int ret; 152 u32 val; 153 154 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, 155 sw->tmu.cap + TMU_RTR_CS_3, 1); 156 if (ret) 157 return ret; 158 159 val &= ~TMU_RTR_CS_3_TS_PACKET_INTERVAL_MASK; 160 val |= rate << TMU_RTR_CS_3_TS_PACKET_INTERVAL_SHIFT; 161 162 return tb_sw_write(sw, &val, TB_CFG_SWITCH, 163 sw->tmu.cap + TMU_RTR_CS_3, 1); 164 } 165 166 static int tb_port_tmu_write(struct tb_port *port, u8 offset, u32 mask, 167 u32 value) 168 { 169 u32 data; 170 int ret; 171 172 ret = tb_port_read(port, &data, TB_CFG_PORT, port->cap_tmu + offset, 1); 173 if (ret) 174 return ret; 175 176 data &= ~mask; 177 data |= value; 178 179 return tb_port_write(port, &data, TB_CFG_PORT, 180 port->cap_tmu + offset, 1); 181 } 182 183 static int tb_port_tmu_set_unidirectional(struct tb_port *port, 184 bool unidirectional) 185 { 186 u32 val; 187 188 if (!port->sw->tmu.has_ucap) 189 return 0; 190 191 val = unidirectional ? TMU_ADP_CS_3_UDM : 0; 192 return tb_port_tmu_write(port, TMU_ADP_CS_3, TMU_ADP_CS_3_UDM, val); 193 } 194 195 static inline int tb_port_tmu_unidirectional_disable(struct tb_port *port) 196 { 197 return tb_port_tmu_set_unidirectional(port, false); 198 } 199 200 static inline int tb_port_tmu_unidirectional_enable(struct tb_port *port) 201 { 202 return tb_port_tmu_set_unidirectional(port, true); 203 } 204 205 static bool tb_port_tmu_is_unidirectional(struct tb_port *port) 206 { 207 int ret; 208 u32 val; 209 210 ret = tb_port_read(port, &val, TB_CFG_PORT, 211 port->cap_tmu + TMU_ADP_CS_3, 1); 212 if (ret) 213 return false; 214 215 return val & TMU_ADP_CS_3_UDM; 216 } 217 218 static bool tb_port_tmu_is_enhanced(struct tb_port *port) 219 { 220 int ret; 221 u32 val; 222 223 ret = tb_port_read(port, &val, TB_CFG_PORT, 224 port->cap_tmu + TMU_ADP_CS_8, 1); 225 if (ret) 226 return false; 227 228 return val & TMU_ADP_CS_8_EUDM; 229 } 230 231 /* Can be called to non-v2 lane adapters too */ 232 static int tb_port_tmu_enhanced_enable(struct tb_port *port, bool enable) 233 { 234 int ret; 235 u32 val; 236 237 if (!tb_switch_tmu_enhanced_is_supported(port->sw)) 238 return 0; 239 240 ret = tb_port_read(port, &val, TB_CFG_PORT, 241 port->cap_tmu + TMU_ADP_CS_8, 1); 242 if (ret) 243 return ret; 244 245 if (enable) 246 val |= TMU_ADP_CS_8_EUDM; 247 else 248 val &= ~TMU_ADP_CS_8_EUDM; 249 250 return tb_port_write(port, &val, TB_CFG_PORT, 251 port->cap_tmu + TMU_ADP_CS_8, 1); 252 } 253 254 static int tb_port_set_tmu_mode_params(struct tb_port *port, 255 enum tb_switch_tmu_mode mode) 256 { 257 u32 repl_timeout, repl_threshold, repl_n, dirswitch_n, val; 258 int ret; 259 260 repl_timeout = tmu_params[mode].repl_timeout; 261 repl_threshold = tmu_params[mode].repl_threshold; 262 repl_n = tmu_params[mode].repl_n; 263 dirswitch_n = tmu_params[mode].dirswitch_n; 264 265 ret = tb_port_read(port, &val, TB_CFG_PORT, 266 port->cap_tmu + TMU_ADP_CS_8, 1); 267 if (ret) 268 return ret; 269 270 val &= ~TMU_ADP_CS_8_REPL_TIMEOUT_MASK; 271 val &= ~TMU_ADP_CS_8_REPL_THRESHOLD_MASK; 272 val |= FIELD_PREP(TMU_ADP_CS_8_REPL_TIMEOUT_MASK, repl_timeout); 273 val |= FIELD_PREP(TMU_ADP_CS_8_REPL_THRESHOLD_MASK, repl_threshold); 274 275 ret = tb_port_write(port, &val, TB_CFG_PORT, 276 port->cap_tmu + TMU_ADP_CS_8, 1); 277 if (ret) 278 return ret; 279 280 ret = tb_port_read(port, &val, TB_CFG_PORT, 281 port->cap_tmu + TMU_ADP_CS_9, 1); 282 if (ret) 283 return ret; 284 285 val &= ~TMU_ADP_CS_9_REPL_N_MASK; 286 val &= ~TMU_ADP_CS_9_DIRSWITCH_N_MASK; 287 val |= FIELD_PREP(TMU_ADP_CS_9_REPL_N_MASK, repl_n); 288 val |= FIELD_PREP(TMU_ADP_CS_9_DIRSWITCH_N_MASK, dirswitch_n); 289 290 return tb_port_write(port, &val, TB_CFG_PORT, 291 port->cap_tmu + TMU_ADP_CS_9, 1); 292 } 293 294 /* Can be called to non-v2 lane adapters too */ 295 static int tb_port_tmu_rate_write(struct tb_port *port, int rate) 296 { 297 int ret; 298 u32 val; 299 300 if (!tb_switch_tmu_enhanced_is_supported(port->sw)) 301 return 0; 302 303 ret = tb_port_read(port, &val, TB_CFG_PORT, 304 port->cap_tmu + TMU_ADP_CS_9, 1); 305 if (ret) 306 return ret; 307 308 val &= ~TMU_ADP_CS_9_ADP_TS_INTERVAL_MASK; 309 val |= FIELD_PREP(TMU_ADP_CS_9_ADP_TS_INTERVAL_MASK, rate); 310 311 return tb_port_write(port, &val, TB_CFG_PORT, 312 port->cap_tmu + TMU_ADP_CS_9, 1); 313 } 314 315 static int tb_port_tmu_time_sync(struct tb_port *port, bool time_sync) 316 { 317 u32 val = time_sync ? TMU_ADP_CS_6_DTS : 0; 318 319 return tb_port_tmu_write(port, TMU_ADP_CS_6, TMU_ADP_CS_6_DTS, val); 320 } 321 322 static int tb_port_tmu_time_sync_disable(struct tb_port *port) 323 { 324 return tb_port_tmu_time_sync(port, true); 325 } 326 327 static int tb_port_tmu_time_sync_enable(struct tb_port *port) 328 { 329 return tb_port_tmu_time_sync(port, false); 330 } 331 332 static int tb_switch_tmu_set_time_disruption(struct tb_switch *sw, bool set) 333 { 334 u32 val, offset, bit; 335 int ret; 336 337 if (tb_switch_is_usb4(sw)) { 338 offset = sw->tmu.cap + TMU_RTR_CS_0; 339 bit = TMU_RTR_CS_0_TD; 340 } else { 341 offset = sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_26; 342 bit = TB_TIME_VSEC_3_CS_26_TD; 343 } 344 345 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, offset, 1); 346 if (ret) 347 return ret; 348 349 if (set) 350 val |= bit; 351 else 352 val &= ~bit; 353 354 return tb_sw_write(sw, &val, TB_CFG_SWITCH, offset, 1); 355 } 356 357 static int tmu_mode_init(struct tb_switch *sw) 358 { 359 bool enhanced, ucap; 360 int ret, rate; 361 362 ucap = tb_switch_tmu_ucap_is_supported(sw); 363 if (ucap) 364 tb_sw_dbg(sw, "TMU: supports uni-directional mode\n"); 365 enhanced = tb_switch_tmu_enhanced_is_supported(sw); 366 if (enhanced) 367 tb_sw_dbg(sw, "TMU: supports enhanced uni-directional mode\n"); 368 369 ret = tb_switch_tmu_rate_read(sw); 370 if (ret < 0) 371 return ret; 372 rate = ret; 373 374 /* Off by default */ 375 sw->tmu.mode = TB_SWITCH_TMU_MODE_OFF; 376 377 if (tb_route(sw)) { 378 struct tb_port *up = tb_upstream_port(sw); 379 380 if (enhanced && tb_port_tmu_is_enhanced(up)) { 381 sw->tmu.mode = TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI; 382 } else if (ucap && tb_port_tmu_is_unidirectional(up)) { 383 if (tmu_rates[TB_SWITCH_TMU_MODE_LOWRES] == rate) 384 sw->tmu.mode = TB_SWITCH_TMU_MODE_LOWRES; 385 else if (tmu_rates[TB_SWITCH_TMU_MODE_LOWRES] == rate) 386 sw->tmu.mode = TB_SWITCH_TMU_MODE_HIFI_UNI; 387 } else if (rate) { 388 sw->tmu.mode = TB_SWITCH_TMU_MODE_HIFI_BI; 389 } 390 } else if (rate) { 391 sw->tmu.mode = TB_SWITCH_TMU_MODE_HIFI_BI; 392 } 393 394 /* Update the initial request to match the current mode */ 395 sw->tmu.mode_request = sw->tmu.mode; 396 sw->tmu.has_ucap = ucap; 397 398 return 0; 399 } 400 401 /** 402 * tb_switch_tmu_init() - Initialize switch TMU structures 403 * @sw: Switch to initialized 404 * 405 * This function must be called before other TMU related functions to 406 * makes the internal structures are filled in correctly. Does not 407 * change any hardware configuration. 408 */ 409 int tb_switch_tmu_init(struct tb_switch *sw) 410 { 411 struct tb_port *port; 412 int ret; 413 414 if (tb_switch_is_icm(sw)) 415 return 0; 416 417 ret = tb_switch_find_cap(sw, TB_SWITCH_CAP_TMU); 418 if (ret > 0) 419 sw->tmu.cap = ret; 420 421 tb_switch_for_each_port(sw, port) { 422 int cap; 423 424 cap = tb_port_find_cap(port, TB_PORT_CAP_TIME1); 425 if (cap > 0) 426 port->cap_tmu = cap; 427 } 428 429 ret = tmu_mode_init(sw); 430 if (ret) 431 return ret; 432 433 tb_sw_dbg(sw, "TMU: current mode: %s\n", tmu_mode_name(sw->tmu.mode)); 434 return 0; 435 } 436 437 /** 438 * tb_switch_tmu_post_time() - Update switch local time 439 * @sw: Switch whose time to update 440 * 441 * Updates switch local time using time posting procedure. 442 */ 443 int tb_switch_tmu_post_time(struct tb_switch *sw) 444 { 445 unsigned int post_time_high_offset, post_time_high = 0; 446 unsigned int post_local_time_offset, post_time_offset; 447 struct tb_switch *root_switch = sw->tb->root_switch; 448 u64 hi, mid, lo, local_time, post_time; 449 int i, ret, retries = 100; 450 u32 gm_local_time[3]; 451 452 if (!tb_route(sw)) 453 return 0; 454 455 if (!tb_switch_is_usb4(sw)) 456 return 0; 457 458 /* Need to be able to read the grand master time */ 459 if (!root_switch->tmu.cap) 460 return 0; 461 462 ret = tb_sw_read(root_switch, gm_local_time, TB_CFG_SWITCH, 463 root_switch->tmu.cap + TMU_RTR_CS_1, 464 ARRAY_SIZE(gm_local_time)); 465 if (ret) 466 return ret; 467 468 for (i = 0; i < ARRAY_SIZE(gm_local_time); i++) 469 tb_sw_dbg(root_switch, "TMU: local_time[%d]=0x%08x\n", i, 470 gm_local_time[i]); 471 472 /* Convert to nanoseconds (drop fractional part) */ 473 hi = gm_local_time[2] & TMU_RTR_CS_3_LOCAL_TIME_NS_MASK; 474 mid = gm_local_time[1]; 475 lo = (gm_local_time[0] & TMU_RTR_CS_1_LOCAL_TIME_NS_MASK) >> 476 TMU_RTR_CS_1_LOCAL_TIME_NS_SHIFT; 477 local_time = hi << 48 | mid << 16 | lo; 478 479 /* Tell the switch that time sync is disrupted for a while */ 480 ret = tb_switch_tmu_set_time_disruption(sw, true); 481 if (ret) 482 return ret; 483 484 post_local_time_offset = sw->tmu.cap + TMU_RTR_CS_22; 485 post_time_offset = sw->tmu.cap + TMU_RTR_CS_24; 486 post_time_high_offset = sw->tmu.cap + TMU_RTR_CS_25; 487 488 /* 489 * Write the Grandmaster time to the Post Local Time registers 490 * of the new switch. 491 */ 492 ret = tb_sw_write(sw, &local_time, TB_CFG_SWITCH, 493 post_local_time_offset, 2); 494 if (ret) 495 goto out; 496 497 /* 498 * Have the new switch update its local time by: 499 * 1) writing 0x1 to the Post Time Low register and 0xffffffff to 500 * Post Time High register. 501 * 2) write 0 to Post Time High register and then wait for 502 * the completion of the post_time register becomes 0. 503 * This means the time has been converged properly. 504 */ 505 post_time = 0xffffffff00000001ULL; 506 507 ret = tb_sw_write(sw, &post_time, TB_CFG_SWITCH, post_time_offset, 2); 508 if (ret) 509 goto out; 510 511 ret = tb_sw_write(sw, &post_time_high, TB_CFG_SWITCH, 512 post_time_high_offset, 1); 513 if (ret) 514 goto out; 515 516 do { 517 usleep_range(5, 10); 518 ret = tb_sw_read(sw, &post_time, TB_CFG_SWITCH, 519 post_time_offset, 2); 520 if (ret) 521 goto out; 522 } while (--retries && post_time); 523 524 if (!retries) { 525 ret = -ETIMEDOUT; 526 goto out; 527 } 528 529 tb_sw_dbg(sw, "TMU: updated local time to %#llx\n", local_time); 530 531 out: 532 tb_switch_tmu_set_time_disruption(sw, false); 533 return ret; 534 } 535 536 static int disable_enhanced(struct tb_port *up, struct tb_port *down) 537 { 538 int ret; 539 540 /* 541 * Router may already been disconnected so ignore errors on the 542 * upstream port. 543 */ 544 tb_port_tmu_rate_write(up, 0); 545 tb_port_tmu_enhanced_enable(up, false); 546 547 ret = tb_port_tmu_rate_write(down, 0); 548 if (ret) 549 return ret; 550 return tb_port_tmu_enhanced_enable(down, false); 551 } 552 553 /** 554 * tb_switch_tmu_disable() - Disable TMU of a switch 555 * @sw: Switch whose TMU to disable 556 * 557 * Turns off TMU of @sw if it is enabled. If not enabled does nothing. 558 */ 559 int tb_switch_tmu_disable(struct tb_switch *sw) 560 { 561 /* Already disabled? */ 562 if (sw->tmu.mode == TB_SWITCH_TMU_MODE_OFF) 563 return 0; 564 565 if (tb_route(sw)) { 566 struct tb_port *down, *up; 567 int ret; 568 569 down = tb_switch_downstream_port(sw); 570 up = tb_upstream_port(sw); 571 /* 572 * In case of uni-directional time sync, TMU handshake is 573 * initiated by upstream router. In case of bi-directional 574 * time sync, TMU handshake is initiated by downstream router. 575 * We change downstream router's rate to off for both uni/bidir 576 * cases although it is needed only for the bi-directional mode. 577 * We avoid changing upstream router's mode since it might 578 * have another downstream router plugged, that is set to 579 * uni-directional mode and we don't want to change it's TMU 580 * mode. 581 */ 582 ret = tb_switch_tmu_rate_write(sw, tmu_rates[TB_SWITCH_TMU_MODE_OFF]); 583 if (ret) 584 return ret; 585 586 tb_port_tmu_time_sync_disable(up); 587 ret = tb_port_tmu_time_sync_disable(down); 588 if (ret) 589 return ret; 590 591 switch (sw->tmu.mode) { 592 case TB_SWITCH_TMU_MODE_LOWRES: 593 case TB_SWITCH_TMU_MODE_HIFI_UNI: 594 /* The switch may be unplugged so ignore any errors */ 595 tb_port_tmu_unidirectional_disable(up); 596 ret = tb_port_tmu_unidirectional_disable(down); 597 if (ret) 598 return ret; 599 break; 600 601 case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI: 602 ret = disable_enhanced(up, down); 603 if (ret) 604 return ret; 605 break; 606 607 default: 608 break; 609 } 610 } else { 611 tb_switch_tmu_rate_write(sw, tmu_rates[TB_SWITCH_TMU_MODE_OFF]); 612 } 613 614 sw->tmu.mode = TB_SWITCH_TMU_MODE_OFF; 615 616 tb_sw_dbg(sw, "TMU: disabled\n"); 617 return 0; 618 } 619 620 /* Called only when there is failure enabling requested mode */ 621 static void tb_switch_tmu_off(struct tb_switch *sw) 622 { 623 unsigned int rate = tmu_rates[TB_SWITCH_TMU_MODE_OFF]; 624 struct tb_port *down, *up; 625 626 down = tb_switch_downstream_port(sw); 627 up = tb_upstream_port(sw); 628 /* 629 * In case of any failure in one of the steps when setting 630 * bi-directional or uni-directional TMU mode, get back to the TMU 631 * configurations in off mode. In case of additional failures in 632 * the functions below, ignore them since the caller shall already 633 * report a failure. 634 */ 635 tb_port_tmu_time_sync_disable(down); 636 tb_port_tmu_time_sync_disable(up); 637 638 switch (sw->tmu.mode_request) { 639 case TB_SWITCH_TMU_MODE_LOWRES: 640 case TB_SWITCH_TMU_MODE_HIFI_UNI: 641 tb_switch_tmu_rate_write(tb_switch_parent(sw), rate); 642 break; 643 case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI: 644 disable_enhanced(up, down); 645 break; 646 default: 647 break; 648 } 649 650 /* Always set the rate to 0 */ 651 tb_switch_tmu_rate_write(sw, rate); 652 653 tb_switch_set_tmu_mode_params(sw, sw->tmu.mode); 654 tb_port_tmu_unidirectional_disable(down); 655 tb_port_tmu_unidirectional_disable(up); 656 } 657 658 /* 659 * This function is called when the previous TMU mode was 660 * TB_SWITCH_TMU_MODE_OFF. 661 */ 662 static int tb_switch_tmu_enable_bidirectional(struct tb_switch *sw) 663 { 664 struct tb_port *up, *down; 665 int ret; 666 667 up = tb_upstream_port(sw); 668 down = tb_switch_downstream_port(sw); 669 670 ret = tb_port_tmu_unidirectional_disable(up); 671 if (ret) 672 return ret; 673 674 ret = tb_port_tmu_unidirectional_disable(down); 675 if (ret) 676 goto out; 677 678 ret = tb_switch_tmu_rate_write(sw, tmu_rates[TB_SWITCH_TMU_MODE_HIFI_BI]); 679 if (ret) 680 goto out; 681 682 ret = tb_port_tmu_time_sync_enable(up); 683 if (ret) 684 goto out; 685 686 ret = tb_port_tmu_time_sync_enable(down); 687 if (ret) 688 goto out; 689 690 return 0; 691 692 out: 693 tb_switch_tmu_off(sw); 694 return ret; 695 } 696 697 /* Only needed for Titan Ridge */ 698 static int tb_switch_tmu_disable_objections(struct tb_switch *sw) 699 { 700 struct tb_port *up = tb_upstream_port(sw); 701 u32 val; 702 int ret; 703 704 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, 705 sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_9, 1); 706 if (ret) 707 return ret; 708 709 val &= ~TB_TIME_VSEC_3_CS_9_TMU_OBJ_MASK; 710 711 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, 712 sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_9, 1); 713 if (ret) 714 return ret; 715 716 return tb_port_tmu_write(up, TMU_ADP_CS_6, 717 TMU_ADP_CS_6_DISABLE_TMU_OBJ_MASK, 718 TMU_ADP_CS_6_DISABLE_TMU_OBJ_CL1 | 719 TMU_ADP_CS_6_DISABLE_TMU_OBJ_CL2); 720 } 721 722 /* 723 * This function is called when the previous TMU mode was 724 * TB_SWITCH_TMU_MODE_OFF. 725 */ 726 static int tb_switch_tmu_enable_unidirectional(struct tb_switch *sw) 727 { 728 struct tb_port *up, *down; 729 int ret; 730 731 up = tb_upstream_port(sw); 732 down = tb_switch_downstream_port(sw); 733 ret = tb_switch_tmu_rate_write(tb_switch_parent(sw), 734 tmu_rates[sw->tmu.mode_request]); 735 if (ret) 736 return ret; 737 738 ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request); 739 if (ret) 740 return ret; 741 742 ret = tb_port_tmu_unidirectional_enable(up); 743 if (ret) 744 goto out; 745 746 ret = tb_port_tmu_time_sync_enable(up); 747 if (ret) 748 goto out; 749 750 ret = tb_port_tmu_unidirectional_enable(down); 751 if (ret) 752 goto out; 753 754 ret = tb_port_tmu_time_sync_enable(down); 755 if (ret) 756 goto out; 757 758 return 0; 759 760 out: 761 tb_switch_tmu_off(sw); 762 return ret; 763 } 764 765 /* 766 * This function is called when the previous TMU mode was 767 * TB_SWITCH_TMU_RATE_OFF. 768 */ 769 static int tb_switch_tmu_enable_enhanced(struct tb_switch *sw) 770 { 771 unsigned int rate = tmu_rates[sw->tmu.mode_request]; 772 struct tb_port *up, *down; 773 int ret; 774 775 /* Router specific parameters first */ 776 ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request); 777 if (ret) 778 return ret; 779 780 up = tb_upstream_port(sw); 781 down = tb_switch_downstream_port(sw); 782 783 ret = tb_port_set_tmu_mode_params(up, sw->tmu.mode_request); 784 if (ret) 785 goto out; 786 787 ret = tb_port_tmu_rate_write(up, rate); 788 if (ret) 789 goto out; 790 791 ret = tb_port_tmu_enhanced_enable(up, true); 792 if (ret) 793 goto out; 794 795 ret = tb_port_set_tmu_mode_params(down, sw->tmu.mode_request); 796 if (ret) 797 goto out; 798 799 ret = tb_port_tmu_rate_write(down, rate); 800 if (ret) 801 goto out; 802 803 ret = tb_port_tmu_enhanced_enable(down, true); 804 if (ret) 805 goto out; 806 807 return 0; 808 809 out: 810 tb_switch_tmu_off(sw); 811 return ret; 812 } 813 814 static void tb_switch_tmu_change_mode_prev(struct tb_switch *sw) 815 { 816 unsigned int rate = tmu_rates[sw->tmu.mode]; 817 struct tb_port *down, *up; 818 819 down = tb_switch_downstream_port(sw); 820 up = tb_upstream_port(sw); 821 /* 822 * In case of any failure in one of the steps when change mode, 823 * get back to the TMU configurations in previous mode. 824 * In case of additional failures in the functions below, 825 * ignore them since the caller shall already report a failure. 826 */ 827 switch (sw->tmu.mode) { 828 case TB_SWITCH_TMU_MODE_LOWRES: 829 case TB_SWITCH_TMU_MODE_HIFI_UNI: 830 tb_port_tmu_set_unidirectional(down, true); 831 tb_switch_tmu_rate_write(tb_switch_parent(sw), rate); 832 break; 833 834 case TB_SWITCH_TMU_MODE_HIFI_BI: 835 tb_port_tmu_set_unidirectional(down, false); 836 tb_switch_tmu_rate_write(sw, rate); 837 break; 838 839 default: 840 break; 841 } 842 843 tb_switch_set_tmu_mode_params(sw, sw->tmu.mode); 844 845 switch (sw->tmu.mode) { 846 case TB_SWITCH_TMU_MODE_LOWRES: 847 case TB_SWITCH_TMU_MODE_HIFI_UNI: 848 tb_port_tmu_set_unidirectional(up, true); 849 break; 850 851 case TB_SWITCH_TMU_MODE_HIFI_BI: 852 tb_port_tmu_set_unidirectional(up, false); 853 break; 854 855 default: 856 break; 857 } 858 } 859 860 static int tb_switch_tmu_change_mode(struct tb_switch *sw) 861 { 862 unsigned int rate = tmu_rates[sw->tmu.mode_request]; 863 struct tb_port *up, *down; 864 int ret; 865 866 up = tb_upstream_port(sw); 867 down = tb_switch_downstream_port(sw); 868 869 /* Program the upstream router downstream facing lane adapter */ 870 switch (sw->tmu.mode_request) { 871 case TB_SWITCH_TMU_MODE_LOWRES: 872 case TB_SWITCH_TMU_MODE_HIFI_UNI: 873 ret = tb_port_tmu_set_unidirectional(down, true); 874 if (ret) 875 goto out; 876 ret = tb_switch_tmu_rate_write(tb_switch_parent(sw), rate); 877 if (ret) 878 goto out; 879 break; 880 881 case TB_SWITCH_TMU_MODE_HIFI_BI: 882 ret = tb_port_tmu_set_unidirectional(down, false); 883 if (ret) 884 goto out; 885 ret = tb_switch_tmu_rate_write(sw, rate); 886 if (ret) 887 goto out; 888 break; 889 890 default: 891 /* Not allowed to change modes from other than above */ 892 return -EINVAL; 893 } 894 895 ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request); 896 if (ret) 897 return ret; 898 899 /* Program the new mode and the downstream router lane adapter */ 900 switch (sw->tmu.mode_request) { 901 case TB_SWITCH_TMU_MODE_LOWRES: 902 case TB_SWITCH_TMU_MODE_HIFI_UNI: 903 ret = tb_port_tmu_set_unidirectional(up, true); 904 if (ret) 905 goto out; 906 break; 907 908 case TB_SWITCH_TMU_MODE_HIFI_BI: 909 ret = tb_port_tmu_set_unidirectional(up, false); 910 if (ret) 911 goto out; 912 break; 913 914 default: 915 /* Not allowed to change modes from other than above */ 916 return -EINVAL; 917 } 918 919 ret = tb_port_tmu_time_sync_enable(down); 920 if (ret) 921 goto out; 922 923 ret = tb_port_tmu_time_sync_enable(up); 924 if (ret) 925 goto out; 926 927 return 0; 928 929 out: 930 tb_switch_tmu_change_mode_prev(sw); 931 return ret; 932 } 933 934 /** 935 * tb_switch_tmu_enable() - Enable TMU on a router 936 * @sw: Router whose TMU to enable 937 * 938 * Enables TMU of a router to be in uni-directional Normal/HiFi or 939 * bi-directional HiFi mode. Calling tb_switch_tmu_configure() is 940 * required before calling this function. 941 */ 942 int tb_switch_tmu_enable(struct tb_switch *sw) 943 { 944 int ret; 945 946 if (tb_switch_tmu_is_enabled(sw)) 947 return 0; 948 949 if (tb_switch_is_titan_ridge(sw) && 950 (sw->tmu.mode_request == TB_SWITCH_TMU_MODE_LOWRES || 951 sw->tmu.mode_request == TB_SWITCH_TMU_MODE_HIFI_UNI)) { 952 ret = tb_switch_tmu_disable_objections(sw); 953 if (ret) 954 return ret; 955 } 956 957 ret = tb_switch_tmu_set_time_disruption(sw, true); 958 if (ret) 959 return ret; 960 961 if (tb_route(sw)) { 962 /* 963 * The used mode changes are from OFF to 964 * HiFi-Uni/HiFi-BiDir/Normal-Uni or from Normal-Uni to 965 * HiFi-Uni. 966 */ 967 if (sw->tmu.mode == TB_SWITCH_TMU_MODE_OFF) { 968 switch (sw->tmu.mode_request) { 969 case TB_SWITCH_TMU_MODE_LOWRES: 970 case TB_SWITCH_TMU_MODE_HIFI_UNI: 971 ret = tb_switch_tmu_enable_unidirectional(sw); 972 break; 973 974 case TB_SWITCH_TMU_MODE_HIFI_BI: 975 ret = tb_switch_tmu_enable_bidirectional(sw); 976 break; 977 case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI: 978 ret = tb_switch_tmu_enable_enhanced(sw); 979 break; 980 default: 981 ret = -EINVAL; 982 break; 983 } 984 } else if (sw->tmu.mode == TB_SWITCH_TMU_MODE_LOWRES || 985 sw->tmu.mode == TB_SWITCH_TMU_MODE_HIFI_UNI || 986 sw->tmu.mode == TB_SWITCH_TMU_MODE_HIFI_BI) { 987 ret = tb_switch_tmu_change_mode(sw); 988 } else { 989 ret = -EINVAL; 990 } 991 } else { 992 /* 993 * Host router port configurations are written as 994 * part of configurations for downstream port of the parent 995 * of the child node - see above. 996 * Here only the host router' rate configuration is written. 997 */ 998 ret = tb_switch_tmu_rate_write(sw, tmu_rates[sw->tmu.mode_request]); 999 } 1000 1001 if (ret) { 1002 tb_sw_warn(sw, "TMU: failed to enable mode %s: %d\n", 1003 tmu_mode_name(sw->tmu.mode_request), ret); 1004 } else { 1005 sw->tmu.mode = sw->tmu.mode_request; 1006 tb_sw_dbg(sw, "TMU: mode set to: %s\n", tmu_mode_name(sw->tmu.mode)); 1007 } 1008 1009 return tb_switch_tmu_set_time_disruption(sw, false); 1010 } 1011 1012 /** 1013 * tb_switch_tmu_configure() - Configure the TMU mode 1014 * @sw: Router whose mode to change 1015 * @mode: Mode to configure 1016 * 1017 * Selects the TMU mode that is enabled when tb_switch_tmu_enable() is 1018 * next called. 1019 * 1020 * Returns %0 in success and negative errno otherwise. Specifically 1021 * returns %-EOPNOTSUPP if the requested mode is not possible (not 1022 * supported by the router and/or topology). 1023 */ 1024 int tb_switch_tmu_configure(struct tb_switch *sw, enum tb_switch_tmu_mode mode) 1025 { 1026 switch (mode) { 1027 case TB_SWITCH_TMU_MODE_OFF: 1028 break; 1029 1030 case TB_SWITCH_TMU_MODE_LOWRES: 1031 case TB_SWITCH_TMU_MODE_HIFI_UNI: 1032 if (!sw->tmu.has_ucap) 1033 return -EOPNOTSUPP; 1034 break; 1035 1036 case TB_SWITCH_TMU_MODE_HIFI_BI: 1037 break; 1038 1039 case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI: { 1040 const struct tb_switch *parent_sw = tb_switch_parent(sw); 1041 1042 if (!parent_sw || !tb_switch_tmu_enhanced_is_supported(parent_sw)) 1043 return -EOPNOTSUPP; 1044 if (!tb_switch_tmu_enhanced_is_supported(sw)) 1045 return -EOPNOTSUPP; 1046 1047 break; 1048 } 1049 1050 default: 1051 tb_sw_warn(sw, "TMU: unsupported mode %u\n", mode); 1052 return -EINVAL; 1053 } 1054 1055 if (sw->tmu.mode_request != mode) { 1056 tb_sw_dbg(sw, "TMU: mode change %s -> %s requested\n", 1057 tmu_mode_name(sw->tmu.mode), tmu_mode_name(mode)); 1058 sw->tmu.mode_request = mode; 1059 } 1060 1061 return 0; 1062 } 1063