1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Thunderbolt driver - Tunneling support 4 * 5 * Copyright (c) 2014 Andreas Noever <andreas.noever@gmail.com> 6 * Copyright (C) 2019, Intel Corporation 7 */ 8 9 #include <linux/delay.h> 10 #include <linux/slab.h> 11 #include <linux/list.h> 12 #include <linux/ktime.h> 13 #include <linux/string_helpers.h> 14 15 #include "tunnel.h" 16 #include "tb.h" 17 18 /* PCIe adapters use always HopID of 8 for both directions */ 19 #define TB_PCI_HOPID 8 20 21 #define TB_PCI_PATH_DOWN 0 22 #define TB_PCI_PATH_UP 1 23 24 #define TB_PCI_PRIORITY 3 25 #define TB_PCI_WEIGHT 1 26 27 /* USB3 adapters use always HopID of 8 for both directions */ 28 #define TB_USB3_HOPID 8 29 30 #define TB_USB3_PATH_DOWN 0 31 #define TB_USB3_PATH_UP 1 32 33 #define TB_USB3_PRIORITY 3 34 #define TB_USB3_WEIGHT 2 35 36 /* DP adapters use HopID 8 for AUX and 9 for Video */ 37 #define TB_DP_AUX_TX_HOPID 8 38 #define TB_DP_AUX_RX_HOPID 8 39 #define TB_DP_VIDEO_HOPID 9 40 41 #define TB_DP_VIDEO_PATH_OUT 0 42 #define TB_DP_AUX_PATH_OUT 1 43 #define TB_DP_AUX_PATH_IN 2 44 45 #define TB_DP_VIDEO_PRIORITY 1 46 #define TB_DP_VIDEO_WEIGHT 1 47 48 #define TB_DP_AUX_PRIORITY 2 49 #define TB_DP_AUX_WEIGHT 1 50 51 /* struct tb_regs_hop::initial_credits is 7 bits wide */ 52 #define TB_MAX_CREDITS 127 53 54 /* Minimum number of credits needed for PCIe path */ 55 #define TB_MIN_PCIE_CREDITS 6U 56 /* 57 * Number of credits we try to allocate for each DMA path if not limited 58 * by the host router baMaxHI. 59 */ 60 #define TB_DMA_CREDITS 14 61 /* Minimum number of credits for DMA path */ 62 #define TB_MIN_DMA_CREDITS 1 63 64 #define TB_DMA_PRIORITY 5 65 #define TB_DMA_WEIGHT 1 66 67 /* 68 * Reserve additional bandwidth for USB 3.x and PCIe bulk traffic 69 * according to USB4 v2 Connection Manager guide. This ends up reserving 70 * 1500 Mb/s for PCIe and 3000 Mb/s for USB 3.x taking weights into 71 * account. 72 */ 73 #define USB4_V2_PCI_MIN_BANDWIDTH (1500 * TB_PCI_WEIGHT) 74 #define USB4_V2_USB3_MIN_BANDWIDTH (1500 * TB_USB3_WEIGHT) 75 76 /* 77 * According to VESA spec, the DPRX negotiation shall compete in 5 78 * seconds after tunnel is established. Since at least i915 can runtime 79 * suspend if there is nothing connected, and that it polls any new 80 * connections every 10 seconds, we use 12 seconds here. 81 * 82 * These are in ms. 83 */ 84 #define TB_DPRX_TIMEOUT 12000 85 #define TB_DPRX_WAIT_TIMEOUT 25 86 #define TB_DPRX_POLL_DELAY 50 87 88 static int dprx_timeout = TB_DPRX_TIMEOUT; 89 module_param(dprx_timeout, int, 0444); 90 MODULE_PARM_DESC(dprx_timeout, 91 "DPRX capability read timeout in ms, -1 waits forever (default: " 92 __MODULE_STRING(TB_DPRX_TIMEOUT) ")"); 93 94 static unsigned int dma_credits = TB_DMA_CREDITS; 95 module_param(dma_credits, uint, 0444); 96 MODULE_PARM_DESC(dma_credits, "specify custom credits for DMA tunnels (default: " 97 __MODULE_STRING(TB_DMA_CREDITS) ")"); 98 99 static bool bw_alloc_mode = true; 100 module_param(bw_alloc_mode, bool, 0444); 101 MODULE_PARM_DESC(bw_alloc_mode, 102 "enable bandwidth allocation mode if supported (default: true)"); 103 104 static const char * const tb_tunnel_names[] = { "PCI", "DP", "DMA", "USB3" }; 105 106 static const char * const tb_event_names[] = { 107 [TB_TUNNEL_ACTIVATED] = "activated", 108 [TB_TUNNEL_CHANGED] = "changed", 109 [TB_TUNNEL_DEACTIVATED] = "deactivated", 110 [TB_TUNNEL_LOW_BANDWIDTH] = "low bandwidth", 111 [TB_TUNNEL_NO_BANDWIDTH] = "insufficient bandwidth", 112 }; 113 114 /* Synchronizes kref_get()/put() of struct tb_tunnel */ 115 static DEFINE_MUTEX(tb_tunnel_lock); 116 117 static inline unsigned int tb_usable_credits(const struct tb_port *port) 118 { 119 return port->total_credits - port->ctl_credits; 120 } 121 122 /** 123 * tb_available_credits() - Available credits for PCIe and DMA 124 * @port: Lane adapter to check 125 * @max_dp_streams: If non-%NULL stores maximum number of simultaneous DP 126 * streams possible through this lane adapter 127 * 128 * Return: Number of available credits. 129 */ 130 static unsigned int tb_available_credits(const struct tb_port *port, 131 size_t *max_dp_streams) 132 { 133 const struct tb_switch *sw = port->sw; 134 int credits, usb3, pcie, spare; 135 size_t ndp; 136 137 usb3 = tb_acpi_may_tunnel_usb3() ? sw->max_usb3_credits : 0; 138 pcie = tb_acpi_may_tunnel_pcie() ? sw->max_pcie_credits : 0; 139 140 if (tb_acpi_is_xdomain_allowed()) { 141 spare = min_not_zero(sw->max_dma_credits, dma_credits); 142 /* Add some credits for potential second DMA tunnel */ 143 spare += TB_MIN_DMA_CREDITS; 144 } else { 145 spare = 0; 146 } 147 148 credits = tb_usable_credits(port); 149 if (tb_acpi_may_tunnel_dp()) { 150 /* 151 * Maximum number of DP streams possible through the 152 * lane adapter. 153 */ 154 if (sw->min_dp_aux_credits + sw->min_dp_main_credits) 155 ndp = (credits - (usb3 + pcie + spare)) / 156 (sw->min_dp_aux_credits + sw->min_dp_main_credits); 157 else 158 ndp = 0; 159 } else { 160 ndp = 0; 161 } 162 credits -= ndp * (sw->min_dp_aux_credits + sw->min_dp_main_credits); 163 credits -= usb3; 164 165 if (max_dp_streams) 166 *max_dp_streams = ndp; 167 168 return credits > 0 ? credits : 0; 169 } 170 171 static void tb_init_pm_support(struct tb_path_hop *hop) 172 { 173 struct tb_port *out_port = hop->out_port; 174 struct tb_port *in_port = hop->in_port; 175 176 if (tb_port_is_null(in_port) && tb_port_is_null(out_port) && 177 usb4_switch_version(in_port->sw) >= 2) 178 hop->pm_support = true; 179 } 180 181 static struct tb_tunnel *tb_tunnel_alloc(struct tb *tb, size_t npaths, 182 enum tb_tunnel_type type) 183 { 184 struct tb_tunnel *tunnel; 185 186 tunnel = kzalloc_flex(*tunnel, paths, npaths); 187 if (!tunnel) 188 return NULL; 189 190 tunnel->npaths = npaths; 191 192 INIT_LIST_HEAD(&tunnel->list); 193 tunnel->tb = tb; 194 tunnel->type = type; 195 kref_init(&tunnel->kref); 196 197 return tunnel; 198 } 199 200 static void tb_tunnel_get(struct tb_tunnel *tunnel) 201 { 202 mutex_lock(&tb_tunnel_lock); 203 kref_get(&tunnel->kref); 204 mutex_unlock(&tb_tunnel_lock); 205 } 206 207 static void tb_tunnel_destroy(struct kref *kref) 208 { 209 struct tb_tunnel *tunnel = container_of(kref, typeof(*tunnel), kref); 210 int i; 211 212 if (tunnel->destroy) 213 tunnel->destroy(tunnel); 214 215 for (i = 0; i < tunnel->npaths; i++) { 216 if (tunnel->paths[i]) 217 tb_path_free(tunnel->paths[i]); 218 } 219 220 kfree(tunnel); 221 } 222 223 void tb_tunnel_put(struct tb_tunnel *tunnel) 224 { 225 mutex_lock(&tb_tunnel_lock); 226 kref_put(&tunnel->kref, tb_tunnel_destroy); 227 mutex_unlock(&tb_tunnel_lock); 228 } 229 230 /** 231 * tb_tunnel_event() - Notify userspace about tunneling event 232 * @tb: Domain where the event occurred 233 * @event: Event that happened 234 * @type: Type of the tunnel in question 235 * @src_port: Tunnel source port (can be %NULL) 236 * @dst_port: Tunnel destination port (can be %NULL) 237 * 238 * Notifies userspace about tunneling @event in the domain. The tunnel 239 * does not need to exist (e.g the tunnel was not activated because 240 * there is not enough bandwidth). If the @src_port and @dst_port are 241 * given fill in full %TUNNEL_DETAILS environment variable. Otherwise 242 * uses the shorter one (just the tunnel type). 243 */ 244 void tb_tunnel_event(struct tb *tb, enum tb_tunnel_event event, 245 enum tb_tunnel_type type, 246 const struct tb_port *src_port, 247 const struct tb_port *dst_port) 248 { 249 char *envp[3] = { NULL }; 250 251 if (WARN_ON_ONCE(event >= ARRAY_SIZE(tb_event_names))) 252 return; 253 if (WARN_ON_ONCE(type >= ARRAY_SIZE(tb_tunnel_names))) 254 return; 255 256 envp[0] = kasprintf(GFP_KERNEL, "TUNNEL_EVENT=%s", tb_event_names[event]); 257 if (!envp[0]) 258 return; 259 260 if (src_port != NULL && dst_port != NULL) { 261 envp[1] = kasprintf(GFP_KERNEL, "TUNNEL_DETAILS=%llx:%u <-> %llx:%u (%s)", 262 tb_route(src_port->sw), src_port->port, 263 tb_route(dst_port->sw), dst_port->port, 264 tb_tunnel_names[type]); 265 } else { 266 envp[1] = kasprintf(GFP_KERNEL, "TUNNEL_DETAILS=(%s)", 267 tb_tunnel_names[type]); 268 } 269 270 if (envp[1]) 271 tb_domain_event(tb, envp); 272 273 kfree(envp[1]); 274 kfree(envp[0]); 275 } 276 277 static inline void tb_tunnel_set_active(struct tb_tunnel *tunnel, bool active) 278 { 279 if (active) { 280 tunnel->state = TB_TUNNEL_ACTIVE; 281 tb_tunnel_event(tunnel->tb, TB_TUNNEL_ACTIVATED, tunnel->type, 282 tunnel->src_port, tunnel->dst_port); 283 } else { 284 tunnel->state = TB_TUNNEL_INACTIVE; 285 tb_tunnel_event(tunnel->tb, TB_TUNNEL_DEACTIVATED, tunnel->type, 286 tunnel->src_port, tunnel->dst_port); 287 } 288 } 289 290 static inline void tb_tunnel_changed(struct tb_tunnel *tunnel) 291 { 292 tb_tunnel_event(tunnel->tb, TB_TUNNEL_CHANGED, tunnel->type, 293 tunnel->src_port, tunnel->dst_port); 294 } 295 296 static int tb_pci_port_ltssm_state_detect(struct tb_port *port) 297 { 298 ktime_t timeout = ktime_add_ms(ktime_get(), 500); 299 300 do { 301 int ret; 302 303 ret = usb4_pci_port_ltssm_state(port); 304 if (ret < 0) 305 return ret; 306 if (ret == USB4_PCIE_LTSSM_DETECT) 307 return 0; 308 309 fsleep(50); 310 } while (ktime_before(ktime_get(), timeout)); 311 312 return -ETIMEDOUT; 313 } 314 315 static int tb_pci_pre_activate(struct tb_tunnel *tunnel) 316 { 317 struct tb_port *down = tunnel->src_port; 318 struct tb_port *up = tunnel->dst_port; 319 int ret; 320 321 ret = tb_switch_is_usb4(down->sw) ? 322 tb_pci_port_ltssm_state_detect(down) : 0; 323 if (ret) 324 return ret; 325 326 return tb_switch_is_usb4(up->sw) ? 327 tb_pci_port_ltssm_state_detect(up) : 0; 328 } 329 330 static int tb_pci_set_ext_encapsulation(struct tb_tunnel *tunnel, bool enable) 331 { 332 struct tb_port *port = tb_upstream_port(tunnel->dst_port->sw); 333 int ret; 334 335 /* Only supported if both routers are at least USB4 v2 */ 336 if ((usb4_switch_version(tunnel->src_port->sw) < 2) || 337 (usb4_switch_version(tunnel->dst_port->sw) < 2)) 338 return 0; 339 340 if (enable && tb_port_get_link_generation(port) < 4) 341 return 0; 342 343 ret = usb4_pci_port_set_ext_encapsulation(tunnel->src_port, enable); 344 if (ret) 345 return ret; 346 347 /* 348 * Downstream router could be unplugged so disable of encapsulation 349 * in upstream router is still possible. 350 */ 351 ret = usb4_pci_port_set_ext_encapsulation(tunnel->dst_port, enable); 352 if (ret) { 353 if (enable) 354 return ret; 355 if (ret != -ENODEV) 356 return ret; 357 } 358 359 tb_tunnel_dbg(tunnel, "extended encapsulation %s\n", 360 str_enabled_disabled(enable)); 361 return 0; 362 } 363 364 static int tb_pci_activate(struct tb_tunnel *tunnel, bool activate) 365 { 366 int res; 367 368 if (activate) { 369 res = tb_pci_set_ext_encapsulation(tunnel, activate); 370 if (res) 371 return res; 372 } 373 374 if (activate) 375 res = tb_pci_port_enable(tunnel->dst_port, activate); 376 else 377 res = tb_pci_port_enable(tunnel->src_port, activate); 378 if (res) 379 return res; 380 381 382 if (activate) { 383 res = tb_pci_port_enable(tunnel->src_port, activate); 384 if (res) 385 return res; 386 } else { 387 /* Downstream router could be unplugged */ 388 tb_pci_port_enable(tunnel->dst_port, activate); 389 } 390 391 return activate ? 0 : tb_pci_set_ext_encapsulation(tunnel, activate); 392 } 393 394 static int tb_pci_init_credits(struct tb_path_hop *hop) 395 { 396 struct tb_port *port = hop->in_port; 397 struct tb_switch *sw = port->sw; 398 unsigned int credits; 399 400 if (tb_port_use_credit_allocation(port)) { 401 unsigned int available; 402 403 available = tb_available_credits(port, NULL); 404 credits = min(sw->max_pcie_credits, available); 405 406 if (credits < TB_MIN_PCIE_CREDITS) 407 return -ENOSPC; 408 409 credits = max(TB_MIN_PCIE_CREDITS, credits); 410 } else { 411 if (tb_port_is_null(port)) 412 credits = port->bonded ? 32 : 16; 413 else 414 credits = 7; 415 } 416 417 hop->initial_credits = credits; 418 return 0; 419 } 420 421 static int tb_pci_init_path(struct tb_path *path) 422 { 423 struct tb_path_hop *hop; 424 425 path->egress_fc_enable = TB_PATH_SOURCE | TB_PATH_INTERNAL; 426 path->egress_shared_buffer = TB_PATH_NONE; 427 path->ingress_fc_enable = TB_PATH_ALL; 428 path->ingress_shared_buffer = TB_PATH_NONE; 429 path->priority = TB_PCI_PRIORITY; 430 path->weight = TB_PCI_WEIGHT; 431 path->drop_packages = 0; 432 433 tb_path_for_each_hop(path, hop) { 434 int ret; 435 436 ret = tb_pci_init_credits(hop); 437 if (ret) 438 return ret; 439 } 440 441 return 0; 442 } 443 444 /** 445 * tb_tunnel_discover_pci() - Discover existing PCIe tunnels 446 * @tb: Pointer to the domain structure 447 * @down: PCIe downstream adapter 448 * @alloc_hopid: Allocate HopIDs from visited ports 449 * 450 * If @down adapter is active, follows the tunnel to the PCIe upstream 451 * adapter and back. 452 * 453 * Return: Pointer to &struct tb_tunnel or %NULL if there was no tunnel. 454 */ 455 struct tb_tunnel *tb_tunnel_discover_pci(struct tb *tb, struct tb_port *down, 456 bool alloc_hopid) 457 { 458 struct tb_tunnel *tunnel; 459 struct tb_path *path; 460 461 if (!tb_pci_port_is_enabled(down)) 462 return NULL; 463 464 tunnel = tb_tunnel_alloc(tb, 2, TB_TUNNEL_PCI); 465 if (!tunnel) 466 return NULL; 467 468 tunnel->activate = tb_pci_activate; 469 tunnel->src_port = down; 470 471 /* 472 * Discover both paths even if they are not complete. We will 473 * clean them up by calling tb_tunnel_deactivate() below in that 474 * case. 475 */ 476 path = tb_path_discover(down, TB_PCI_HOPID, NULL, -1, 477 &tunnel->dst_port, "PCIe Up", alloc_hopid); 478 if (!path) { 479 /* Just disable the downstream port */ 480 tb_pci_port_enable(down, false); 481 goto err_free; 482 } 483 tunnel->paths[TB_PCI_PATH_UP] = path; 484 if (tb_pci_init_path(tunnel->paths[TB_PCI_PATH_UP])) 485 goto err_free; 486 487 path = tb_path_discover(tunnel->dst_port, -1, down, TB_PCI_HOPID, NULL, 488 "PCIe Down", alloc_hopid); 489 if (!path) 490 goto err_deactivate; 491 tunnel->paths[TB_PCI_PATH_DOWN] = path; 492 if (tb_pci_init_path(tunnel->paths[TB_PCI_PATH_DOWN])) 493 goto err_deactivate; 494 495 /* Validate that the tunnel is complete */ 496 if (!tb_port_is_pcie_up(tunnel->dst_port)) { 497 tb_port_warn(tunnel->dst_port, 498 "path does not end on a PCIe adapter, cleaning up\n"); 499 goto err_deactivate; 500 } 501 502 if (down != tunnel->src_port) { 503 tb_tunnel_warn(tunnel, "path is not complete, cleaning up\n"); 504 goto err_deactivate; 505 } 506 507 if (!tb_pci_port_is_enabled(tunnel->dst_port)) { 508 tb_tunnel_warn(tunnel, 509 "tunnel is not fully activated, cleaning up\n"); 510 goto err_deactivate; 511 } 512 513 tb_tunnel_set_active(tunnel, true); 514 tb_tunnel_dbg(tunnel, "discovered\n"); 515 return tunnel; 516 517 err_deactivate: 518 tb_tunnel_deactivate(tunnel); 519 err_free: 520 tb_tunnel_put(tunnel); 521 522 return NULL; 523 } 524 525 /** 526 * tb_tunnel_alloc_pci() - allocate a pci tunnel 527 * @tb: Pointer to the domain structure 528 * @up: PCIe upstream adapter port 529 * @down: PCIe downstream adapter port 530 * 531 * Allocate a PCI tunnel. The ports must be of type TB_TYPE_PCIE_UP and 532 * TB_TYPE_PCIE_DOWN. 533 * 534 * Return: Pointer to @struct tb_tunnel or %NULL on failure. 535 */ 536 struct tb_tunnel *tb_tunnel_alloc_pci(struct tb *tb, struct tb_port *up, 537 struct tb_port *down) 538 { 539 struct tb_tunnel *tunnel; 540 struct tb_path *path; 541 542 tunnel = tb_tunnel_alloc(tb, 2, TB_TUNNEL_PCI); 543 if (!tunnel) 544 return NULL; 545 546 tunnel->pre_activate = tb_pci_pre_activate; 547 tunnel->activate = tb_pci_activate; 548 tunnel->src_port = down; 549 tunnel->dst_port = up; 550 551 path = tb_path_alloc(tb, down, TB_PCI_HOPID, up, TB_PCI_HOPID, 0, 552 "PCIe Down"); 553 if (!path) 554 goto err_free; 555 tunnel->paths[TB_PCI_PATH_DOWN] = path; 556 if (tb_pci_init_path(path)) 557 goto err_free; 558 559 path = tb_path_alloc(tb, up, TB_PCI_HOPID, down, TB_PCI_HOPID, 0, 560 "PCIe Up"); 561 if (!path) 562 goto err_free; 563 tunnel->paths[TB_PCI_PATH_UP] = path; 564 if (tb_pci_init_path(path)) 565 goto err_free; 566 567 return tunnel; 568 569 err_free: 570 tb_tunnel_put(tunnel); 571 return NULL; 572 } 573 574 /** 575 * tb_tunnel_reserved_pci() - Amount of bandwidth to reserve for PCIe 576 * @port: Lane 0 adapter 577 * @reserved_up: Upstream bandwidth in Mb/s to reserve 578 * @reserved_down: Downstream bandwidth in Mb/s to reserve 579 * 580 * Can be called to any connected lane 0 adapter to find out how much 581 * bandwidth needs to be left in reserve for possible PCIe bulk traffic. 582 * 583 * Return: 584 * * %true - If there is something to be reserved. Writes the amount to 585 * @reserved_down/@reserved_up. 586 * * %false - Nothing to be reserved. Leaves @reserved_down/@reserved_up 587 * unmodified. 588 */ 589 bool tb_tunnel_reserved_pci(struct tb_port *port, int *reserved_up, 590 int *reserved_down) 591 { 592 if (WARN_ON_ONCE(!port->remote)) 593 return false; 594 595 if (!tb_acpi_may_tunnel_pcie()) 596 return false; 597 598 if (tb_port_get_link_generation(port) < 4) 599 return false; 600 601 /* Must have PCIe adapters */ 602 if (tb_is_upstream_port(port)) { 603 if (!tb_switch_find_port(port->sw, TB_TYPE_PCIE_UP)) 604 return false; 605 if (!tb_switch_find_port(port->remote->sw, TB_TYPE_PCIE_DOWN)) 606 return false; 607 } else { 608 if (!tb_switch_find_port(port->sw, TB_TYPE_PCIE_DOWN)) 609 return false; 610 if (!tb_switch_find_port(port->remote->sw, TB_TYPE_PCIE_UP)) 611 return false; 612 } 613 614 *reserved_up = USB4_V2_PCI_MIN_BANDWIDTH; 615 *reserved_down = USB4_V2_PCI_MIN_BANDWIDTH; 616 617 tb_port_dbg(port, "reserving %u/%u Mb/s for PCIe\n", *reserved_up, 618 *reserved_down); 619 return true; 620 } 621 622 static bool tb_dp_is_usb4(const struct tb_switch *sw) 623 { 624 /* Titan Ridge DP adapters need the same treatment as USB4 */ 625 return tb_switch_is_usb4(sw) || tb_switch_is_titan_ridge(sw); 626 } 627 628 static int tb_dp_cm_handshake(struct tb_port *in, struct tb_port *out, 629 int timeout_msec) 630 { 631 ktime_t timeout = ktime_add_ms(ktime_get(), timeout_msec); 632 u32 val; 633 int ret; 634 635 /* Both ends need to support this */ 636 if (!tb_dp_is_usb4(in->sw) || !tb_dp_is_usb4(out->sw)) 637 return 0; 638 639 ret = tb_port_read(out, &val, TB_CFG_PORT, 640 out->cap_adap + DP_STATUS_CTRL, 1); 641 if (ret) 642 return ret; 643 644 val |= DP_STATUS_CTRL_UF | DP_STATUS_CTRL_CMHS; 645 646 ret = tb_port_write(out, &val, TB_CFG_PORT, 647 out->cap_adap + DP_STATUS_CTRL, 1); 648 if (ret) 649 return ret; 650 651 do { 652 ret = tb_port_read(out, &val, TB_CFG_PORT, 653 out->cap_adap + DP_STATUS_CTRL, 1); 654 if (ret) 655 return ret; 656 if (!(val & DP_STATUS_CTRL_CMHS)) 657 return 0; 658 usleep_range(100, 150); 659 } while (ktime_before(ktime_get(), timeout)); 660 661 return -ETIMEDOUT; 662 } 663 664 /* 665 * Returns maximum possible rate from capability supporting only DP 2.0 666 * and below. Used when DP BW allocation mode is not enabled. 667 */ 668 static inline u32 tb_dp_cap_get_rate(u32 val) 669 { 670 u32 rate = (val & DP_COMMON_CAP_RATE_MASK) >> DP_COMMON_CAP_RATE_SHIFT; 671 672 switch (rate) { 673 case DP_COMMON_CAP_RATE_RBR: 674 return 1620; 675 case DP_COMMON_CAP_RATE_HBR: 676 return 2700; 677 case DP_COMMON_CAP_RATE_HBR2: 678 return 5400; 679 case DP_COMMON_CAP_RATE_HBR3: 680 return 8100; 681 default: 682 return 0; 683 } 684 } 685 686 /* 687 * Returns maximum possible rate from capability supporting DP 2.1 688 * UHBR20, 13.5 and 10 rates as well. Use only when DP BW allocation 689 * mode is enabled. 690 */ 691 static inline u32 tb_dp_cap_get_rate_ext(u32 val) 692 { 693 if (val & DP_COMMON_CAP_UHBR20) 694 return 20000; 695 else if (val & DP_COMMON_CAP_UHBR13_5) 696 return 13500; 697 else if (val & DP_COMMON_CAP_UHBR10) 698 return 10000; 699 700 return tb_dp_cap_get_rate(val); 701 } 702 703 static inline bool tb_dp_is_uhbr_rate(unsigned int rate) 704 { 705 return rate >= 10000; 706 } 707 708 static inline u32 tb_dp_cap_set_rate(u32 val, u32 rate) 709 { 710 val &= ~DP_COMMON_CAP_RATE_MASK; 711 switch (rate) { 712 default: 713 WARN(1, "invalid rate %u passed, defaulting to 1620 MB/s\n", rate); 714 fallthrough; 715 case 1620: 716 val |= DP_COMMON_CAP_RATE_RBR << DP_COMMON_CAP_RATE_SHIFT; 717 break; 718 case 2700: 719 val |= DP_COMMON_CAP_RATE_HBR << DP_COMMON_CAP_RATE_SHIFT; 720 break; 721 case 5400: 722 val |= DP_COMMON_CAP_RATE_HBR2 << DP_COMMON_CAP_RATE_SHIFT; 723 break; 724 case 8100: 725 val |= DP_COMMON_CAP_RATE_HBR3 << DP_COMMON_CAP_RATE_SHIFT; 726 break; 727 } 728 return val; 729 } 730 731 static inline u32 tb_dp_cap_get_lanes(u32 val) 732 { 733 u32 lanes = (val & DP_COMMON_CAP_LANES_MASK) >> DP_COMMON_CAP_LANES_SHIFT; 734 735 switch (lanes) { 736 case DP_COMMON_CAP_1_LANE: 737 return 1; 738 case DP_COMMON_CAP_2_LANES: 739 return 2; 740 case DP_COMMON_CAP_4_LANES: 741 return 4; 742 default: 743 return 0; 744 } 745 } 746 747 static inline u32 tb_dp_cap_set_lanes(u32 val, u32 lanes) 748 { 749 val &= ~DP_COMMON_CAP_LANES_MASK; 750 switch (lanes) { 751 default: 752 WARN(1, "invalid number of lanes %u passed, defaulting to 1\n", 753 lanes); 754 fallthrough; 755 case 1: 756 val |= DP_COMMON_CAP_1_LANE << DP_COMMON_CAP_LANES_SHIFT; 757 break; 758 case 2: 759 val |= DP_COMMON_CAP_2_LANES << DP_COMMON_CAP_LANES_SHIFT; 760 break; 761 case 4: 762 val |= DP_COMMON_CAP_4_LANES << DP_COMMON_CAP_LANES_SHIFT; 763 break; 764 } 765 return val; 766 } 767 768 static unsigned int tb_dp_bandwidth(unsigned int rate, unsigned int lanes) 769 { 770 /* Tunneling removes the DP 8b/10b 128/132b encoding */ 771 if (tb_dp_is_uhbr_rate(rate)) 772 return rate * lanes * 128 / 132; 773 return rate * lanes * 8 / 10; 774 } 775 776 static int tb_dp_reduce_bandwidth(int max_bw, u32 in_rate, u32 in_lanes, 777 u32 out_rate, u32 out_lanes, u32 *new_rate, 778 u32 *new_lanes) 779 { 780 static const u32 dp_bw[][2] = { 781 /* Mb/s, lanes */ 782 { 8100, 4 }, /* 25920 Mb/s */ 783 { 5400, 4 }, /* 17280 Mb/s */ 784 { 8100, 2 }, /* 12960 Mb/s */ 785 { 2700, 4 }, /* 8640 Mb/s */ 786 { 5400, 2 }, /* 8640 Mb/s */ 787 { 8100, 1 }, /* 6480 Mb/s */ 788 { 1620, 4 }, /* 5184 Mb/s */ 789 { 5400, 1 }, /* 4320 Mb/s */ 790 { 2700, 2 }, /* 4320 Mb/s */ 791 { 1620, 2 }, /* 2592 Mb/s */ 792 { 2700, 1 }, /* 2160 Mb/s */ 793 { 1620, 1 }, /* 1296 Mb/s */ 794 }; 795 unsigned int i; 796 797 /* 798 * Find a combination that can fit into max_bw and does not 799 * exceed the maximum rate and lanes supported by the DP OUT and 800 * DP IN adapters. 801 */ 802 for (i = 0; i < ARRAY_SIZE(dp_bw); i++) { 803 if (dp_bw[i][0] > out_rate || dp_bw[i][1] > out_lanes) 804 continue; 805 806 if (dp_bw[i][0] > in_rate || dp_bw[i][1] > in_lanes) 807 continue; 808 809 if (tb_dp_bandwidth(dp_bw[i][0], dp_bw[i][1]) <= max_bw) { 810 *new_rate = dp_bw[i][0]; 811 *new_lanes = dp_bw[i][1]; 812 return 0; 813 } 814 } 815 816 return -ENOSR; 817 } 818 819 static int tb_dp_xchg_caps(struct tb_tunnel *tunnel) 820 { 821 u32 out_dp_cap, out_rate, out_lanes, in_dp_cap, in_rate, in_lanes, bw; 822 struct tb_port *out = tunnel->dst_port; 823 struct tb_port *in = tunnel->src_port; 824 int ret, max_bw; 825 826 /* 827 * Copy DP_LOCAL_CAP register to DP_REMOTE_CAP register for 828 * newer generation hardware. 829 */ 830 if (in->sw->generation < 2 || out->sw->generation < 2) 831 return 0; 832 833 /* 834 * Perform connection manager handshake between IN and OUT ports 835 * before capabilities exchange can take place. 836 */ 837 ret = tb_dp_cm_handshake(in, out, 3000); 838 if (ret) 839 return ret; 840 841 /* Read both DP_LOCAL_CAP registers */ 842 ret = tb_port_read(in, &in_dp_cap, TB_CFG_PORT, 843 in->cap_adap + DP_LOCAL_CAP, 1); 844 if (ret) 845 return ret; 846 847 ret = tb_port_read(out, &out_dp_cap, TB_CFG_PORT, 848 out->cap_adap + DP_LOCAL_CAP, 1); 849 if (ret) 850 return ret; 851 852 /* Write IN local caps to OUT remote caps */ 853 ret = tb_port_write(out, &in_dp_cap, TB_CFG_PORT, 854 out->cap_adap + DP_REMOTE_CAP, 1); 855 if (ret) 856 return ret; 857 858 in_rate = tb_dp_cap_get_rate(in_dp_cap); 859 in_lanes = tb_dp_cap_get_lanes(in_dp_cap); 860 tb_tunnel_dbg(tunnel, 861 "DP IN maximum supported bandwidth %u Mb/s x%u = %u Mb/s\n", 862 in_rate, in_lanes, tb_dp_bandwidth(in_rate, in_lanes)); 863 864 /* 865 * If the tunnel bandwidth is limited (max_bw is set) then see 866 * if we need to reduce bandwidth to fit there. 867 */ 868 out_rate = tb_dp_cap_get_rate(out_dp_cap); 869 out_lanes = tb_dp_cap_get_lanes(out_dp_cap); 870 bw = tb_dp_bandwidth(out_rate, out_lanes); 871 tb_tunnel_dbg(tunnel, 872 "DP OUT maximum supported bandwidth %u Mb/s x%u = %u Mb/s\n", 873 out_rate, out_lanes, bw); 874 875 if (tb_tunnel_direction_downstream(tunnel)) 876 max_bw = tunnel->max_down; 877 else 878 max_bw = tunnel->max_up; 879 880 if (max_bw && bw > max_bw) { 881 u32 new_rate, new_lanes, new_bw; 882 883 ret = tb_dp_reduce_bandwidth(max_bw, in_rate, in_lanes, 884 out_rate, out_lanes, &new_rate, 885 &new_lanes); 886 if (ret) { 887 tb_tunnel_info(tunnel, "not enough bandwidth\n"); 888 return ret; 889 } 890 891 new_bw = tb_dp_bandwidth(new_rate, new_lanes); 892 tb_tunnel_dbg(tunnel, 893 "bandwidth reduced to %u Mb/s x%u = %u Mb/s\n", 894 new_rate, new_lanes, new_bw); 895 896 /* 897 * Set new rate and number of lanes before writing it to 898 * the IN port remote caps. 899 */ 900 out_dp_cap = tb_dp_cap_set_rate(out_dp_cap, new_rate); 901 out_dp_cap = tb_dp_cap_set_lanes(out_dp_cap, new_lanes); 902 } 903 904 /* 905 * Titan Ridge does not disable AUX timers when it gets 906 * SET_CONFIG with SET_LTTPR_MODE set. This causes problems with 907 * DP tunneling. 908 */ 909 if (tb_route(out->sw) && tb_switch_is_titan_ridge(out->sw)) { 910 out_dp_cap |= DP_COMMON_CAP_LTTPR_NS; 911 tb_tunnel_dbg(tunnel, "disabling LTTPR\n"); 912 } 913 914 return tb_port_write(in, &out_dp_cap, TB_CFG_PORT, 915 in->cap_adap + DP_REMOTE_CAP, 1); 916 } 917 918 static int tb_dp_bandwidth_alloc_mode_enable(struct tb_tunnel *tunnel) 919 { 920 int ret, estimated_bw, granularity, tmp; 921 struct tb_port *out = tunnel->dst_port; 922 struct tb_port *in = tunnel->src_port; 923 u32 out_dp_cap, out_rate, out_lanes; 924 u32 in_dp_cap, in_rate, in_lanes; 925 u32 rate, lanes; 926 927 if (!bw_alloc_mode) 928 return 0; 929 930 ret = usb4_dp_port_set_cm_bandwidth_mode_supported(in, true); 931 if (ret) 932 return ret; 933 934 ret = usb4_dp_port_set_group_id(in, in->group->index); 935 if (ret) 936 return ret; 937 938 /* 939 * Get the non-reduced rate and lanes based on the lowest 940 * capability of both adapters. 941 */ 942 ret = tb_port_read(in, &in_dp_cap, TB_CFG_PORT, 943 in->cap_adap + DP_LOCAL_CAP, 1); 944 if (ret) 945 return ret; 946 947 ret = tb_port_read(out, &out_dp_cap, TB_CFG_PORT, 948 out->cap_adap + DP_LOCAL_CAP, 1); 949 if (ret) 950 return ret; 951 952 in_rate = tb_dp_cap_get_rate(in_dp_cap); 953 in_lanes = tb_dp_cap_get_lanes(in_dp_cap); 954 out_rate = tb_dp_cap_get_rate(out_dp_cap); 955 out_lanes = tb_dp_cap_get_lanes(out_dp_cap); 956 957 rate = min(in_rate, out_rate); 958 lanes = min(in_lanes, out_lanes); 959 tmp = tb_dp_bandwidth(rate, lanes); 960 961 tb_tunnel_dbg(tunnel, "non-reduced bandwidth %u Mb/s x%u = %u Mb/s\n", 962 rate, lanes, tmp); 963 964 ret = usb4_dp_port_set_nrd(in, rate, lanes); 965 if (ret) 966 return ret; 967 968 /* 969 * Pick up granularity that supports maximum possible bandwidth. 970 * For that we use the UHBR rates too. 971 */ 972 in_rate = tb_dp_cap_get_rate_ext(in_dp_cap); 973 out_rate = tb_dp_cap_get_rate_ext(out_dp_cap); 974 rate = min(in_rate, out_rate); 975 tmp = tb_dp_bandwidth(rate, lanes); 976 977 tb_tunnel_dbg(tunnel, 978 "maximum bandwidth through allocation mode %u Mb/s x%u = %u Mb/s\n", 979 rate, lanes, tmp); 980 981 for (granularity = 250; tmp / granularity > 255 && granularity <= 1000; 982 granularity *= 2) 983 ; 984 985 tb_tunnel_dbg(tunnel, "granularity %d Mb/s\n", granularity); 986 987 /* 988 * Returns -EINVAL if granularity above is outside of the 989 * accepted ranges. 990 */ 991 ret = usb4_dp_port_set_granularity(in, granularity); 992 if (ret) 993 return ret; 994 995 /* 996 * Bandwidth estimation is pretty much what we have in 997 * max_up/down fields. For discovery we just read what the 998 * estimation was set to. 999 */ 1000 if (tb_tunnel_direction_downstream(tunnel)) 1001 estimated_bw = tunnel->max_down; 1002 else 1003 estimated_bw = tunnel->max_up; 1004 1005 tb_tunnel_dbg(tunnel, "estimated bandwidth %d Mb/s\n", estimated_bw); 1006 1007 ret = usb4_dp_port_set_estimated_bandwidth(in, estimated_bw); 1008 if (ret) 1009 return ret; 1010 1011 /* Initial allocation should be 0 according the spec */ 1012 ret = usb4_dp_port_allocate_bandwidth(in, 0); 1013 if (ret) 1014 return ret; 1015 1016 tb_tunnel_dbg(tunnel, "bandwidth allocation mode enabled\n"); 1017 return 0; 1018 } 1019 1020 static int tb_dp_pre_activate(struct tb_tunnel *tunnel) 1021 { 1022 struct tb_port *in = tunnel->src_port; 1023 struct tb_switch *sw = in->sw; 1024 struct tb *tb = in->sw->tb; 1025 int ret; 1026 1027 ret = tb_dp_xchg_caps(tunnel); 1028 if (ret) 1029 return ret; 1030 1031 if (!tb_switch_is_usb4(sw)) 1032 return 0; 1033 1034 if (!usb4_dp_port_bandwidth_mode_supported(in)) 1035 return 0; 1036 1037 tb_tunnel_dbg(tunnel, "bandwidth allocation mode supported\n"); 1038 1039 ret = usb4_dp_port_set_cm_id(in, tb->index); 1040 if (ret) 1041 return ret; 1042 1043 return tb_dp_bandwidth_alloc_mode_enable(tunnel); 1044 } 1045 1046 static void tb_dp_post_deactivate(struct tb_tunnel *tunnel) 1047 { 1048 struct tb_port *in = tunnel->src_port; 1049 1050 if (!usb4_dp_port_bandwidth_mode_supported(in)) 1051 return; 1052 if (usb4_dp_port_bandwidth_mode_enabled(in)) { 1053 usb4_dp_port_set_cm_bandwidth_mode_supported(in, false); 1054 tb_tunnel_dbg(tunnel, "bandwidth allocation mode disabled\n"); 1055 } 1056 } 1057 1058 static ktime_t dprx_timeout_to_ktime(int timeout_msec) 1059 { 1060 return timeout_msec >= 0 ? 1061 ktime_add_ms(ktime_get(), timeout_msec) : KTIME_MAX; 1062 } 1063 1064 static int tb_dp_wait_dprx(struct tb_tunnel *tunnel, int timeout_msec) 1065 { 1066 ktime_t timeout = dprx_timeout_to_ktime(timeout_msec); 1067 struct tb_port *in = tunnel->src_port; 1068 1069 /* 1070 * Wait for DPRX done. Normally it should be already set for 1071 * active tunnel. 1072 */ 1073 do { 1074 u32 val; 1075 int ret; 1076 1077 ret = tb_port_read(in, &val, TB_CFG_PORT, 1078 in->cap_adap + DP_COMMON_CAP, 1); 1079 if (ret) 1080 return ret; 1081 1082 if (val & DP_COMMON_CAP_DPRX_DONE) 1083 return 0; 1084 1085 usleep_range(100, 150); 1086 } while (ktime_before(ktime_get(), timeout)); 1087 1088 tb_tunnel_dbg(tunnel, "DPRX read timeout\n"); 1089 return -ETIMEDOUT; 1090 } 1091 1092 static void tb_dp_dprx_work(struct work_struct *work) 1093 { 1094 struct tb_tunnel *tunnel = container_of(work, typeof(*tunnel), dprx_work.work); 1095 struct tb *tb = tunnel->tb; 1096 1097 /* 1098 * The DPRX read can be canceled while this work is waiting for 1099 * tb->lock. Check the flag only once it is held: while the lock is 1100 * held the tunnel cannot be torn down under us and the adapters are 1101 * safe to access. 1102 */ 1103 mutex_lock(&tb->lock); 1104 if (!tunnel->dprx_canceled) { 1105 if (tb_dp_is_usb4(tunnel->src_port->sw) && 1106 tb_dp_wait_dprx(tunnel, TB_DPRX_WAIT_TIMEOUT)) { 1107 if (ktime_before(ktime_get(), tunnel->dprx_timeout)) { 1108 queue_delayed_work(tb->wq, &tunnel->dprx_work, 1109 msecs_to_jiffies(TB_DPRX_POLL_DELAY)); 1110 mutex_unlock(&tb->lock); 1111 return; 1112 } 1113 } else { 1114 tb_tunnel_set_active(tunnel, true); 1115 } 1116 } 1117 mutex_unlock(&tb->lock); 1118 1119 tunnel->callback(tunnel, tunnel->callback_data); 1120 tb_tunnel_put(tunnel); 1121 tb_domain_put(tb); 1122 } 1123 1124 static int tb_dp_dprx_start(struct tb_tunnel *tunnel) 1125 { 1126 /* 1127 * Bump up the references to keep the tunnel and the domain around 1128 * until the work has run or has been canceled. 1129 */ 1130 tb_tunnel_get(tunnel); 1131 tb_domain_get(tunnel->tb); 1132 1133 tunnel->dprx_started = true; 1134 tunnel->dprx_canceled = false; 1135 tunnel->dprx_timeout = dprx_timeout_to_ktime(dprx_timeout); 1136 queue_delayed_work(tunnel->tb->wq, &tunnel->dprx_work, 0); 1137 1138 return -EINPROGRESS; 1139 } 1140 1141 static void tb_dp_dprx_stop(struct tb_tunnel *tunnel) 1142 { 1143 struct tb *tb = tunnel->tb; 1144 1145 if (tunnel->dprx_started) { 1146 tunnel->dprx_started = false; 1147 tunnel->dprx_canceled = true; 1148 if (cancel_delayed_work(&tunnel->dprx_work)) { 1149 tb_tunnel_put(tunnel); 1150 tb_domain_put(tb); 1151 } 1152 } 1153 } 1154 1155 static int tb_dp_activate(struct tb_tunnel *tunnel, bool active) 1156 { 1157 int ret; 1158 1159 if (active) { 1160 struct tb_path **paths; 1161 int last; 1162 1163 paths = tunnel->paths; 1164 last = paths[TB_DP_VIDEO_PATH_OUT]->path_length - 1; 1165 1166 tb_dp_port_set_hops(tunnel->src_port, 1167 paths[TB_DP_VIDEO_PATH_OUT]->hops[0].in_hop_index, 1168 paths[TB_DP_AUX_PATH_OUT]->hops[0].in_hop_index, 1169 paths[TB_DP_AUX_PATH_IN]->hops[last].next_hop_index); 1170 1171 tb_dp_port_set_hops(tunnel->dst_port, 1172 paths[TB_DP_VIDEO_PATH_OUT]->hops[last].next_hop_index, 1173 paths[TB_DP_AUX_PATH_IN]->hops[0].in_hop_index, 1174 paths[TB_DP_AUX_PATH_OUT]->hops[last].next_hop_index); 1175 } else { 1176 tb_dp_dprx_stop(tunnel); 1177 tb_dp_port_hpd_clear(tunnel->src_port); 1178 tb_dp_port_set_hops(tunnel->src_port, 0, 0, 0); 1179 if (tb_port_is_dpout(tunnel->dst_port)) 1180 tb_dp_port_set_hops(tunnel->dst_port, 0, 0, 0); 1181 } 1182 1183 ret = tb_dp_port_enable(tunnel->src_port, active); 1184 if (ret) 1185 return ret; 1186 1187 if (tb_port_is_dpout(tunnel->dst_port)) { 1188 ret = tb_dp_port_enable(tunnel->dst_port, active); 1189 if (ret) 1190 return ret; 1191 } 1192 1193 return active ? tb_dp_dprx_start(tunnel) : 0; 1194 } 1195 1196 /** 1197 * tb_dp_bandwidth_mode_maximum_bandwidth() - Maximum possible bandwidth 1198 * @tunnel: DP tunnel to check 1199 * @max_bw_rounded: Maximum bandwidth in Mb/s rounded up to the next granularity 1200 * 1201 * Return: Maximum possible bandwidth for this tunnel in Mb/s, negative errno 1202 * in case of failure. 1203 */ 1204 static int tb_dp_bandwidth_mode_maximum_bandwidth(struct tb_tunnel *tunnel, 1205 int *max_bw_rounded) 1206 { 1207 struct tb_port *in = tunnel->src_port; 1208 int ret, rate, lanes, max_bw; 1209 u32 cap; 1210 1211 /* 1212 * DP IN adapter DP_LOCAL_CAP gets updated to the lowest AUX 1213 * read parameter values so we can use this to determine the 1214 * maximum possible bandwidth over this link. 1215 * 1216 * See USB4 v2 spec 1.0 10.4.4.5. 1217 */ 1218 ret = tb_port_read(in, &cap, TB_CFG_PORT, 1219 in->cap_adap + DP_LOCAL_CAP, 1); 1220 if (ret) 1221 return ret; 1222 1223 rate = tb_dp_cap_get_rate_ext(cap); 1224 lanes = tb_dp_cap_get_lanes(cap); 1225 1226 max_bw = tb_dp_bandwidth(rate, lanes); 1227 1228 if (max_bw_rounded) { 1229 ret = usb4_dp_port_granularity(in); 1230 if (ret < 0) 1231 return ret; 1232 *max_bw_rounded = roundup(max_bw, ret); 1233 } 1234 1235 return max_bw; 1236 } 1237 1238 static int tb_dp_bandwidth_mode_consumed_bandwidth(struct tb_tunnel *tunnel, 1239 int *consumed_up, 1240 int *consumed_down) 1241 { 1242 struct tb_port *in = tunnel->src_port; 1243 int ret, allocated_bw, max_bw_rounded; 1244 1245 if (!usb4_dp_port_bandwidth_mode_enabled(in)) 1246 return -EOPNOTSUPP; 1247 1248 if (!tunnel->bw_mode) 1249 return -EOPNOTSUPP; 1250 1251 /* Read what was allocated previously if any */ 1252 ret = usb4_dp_port_allocated_bandwidth(in); 1253 if (ret < 0) 1254 return ret; 1255 allocated_bw = ret; 1256 1257 ret = tb_dp_bandwidth_mode_maximum_bandwidth(tunnel, &max_bw_rounded); 1258 if (ret < 0) 1259 return ret; 1260 if (allocated_bw == max_bw_rounded) 1261 allocated_bw = ret; 1262 1263 if (tb_tunnel_direction_downstream(tunnel)) { 1264 *consumed_up = 0; 1265 *consumed_down = allocated_bw; 1266 } else { 1267 *consumed_up = allocated_bw; 1268 *consumed_down = 0; 1269 } 1270 1271 return 0; 1272 } 1273 1274 static int tb_dp_allocated_bandwidth(struct tb_tunnel *tunnel, int *allocated_up, 1275 int *allocated_down) 1276 { 1277 struct tb_port *in = tunnel->src_port; 1278 1279 /* 1280 * If we have already set the allocated bandwidth then use that. 1281 * Otherwise we read it from the DPRX. 1282 */ 1283 if (usb4_dp_port_bandwidth_mode_enabled(in) && tunnel->bw_mode) { 1284 int ret, allocated_bw, max_bw_rounded; 1285 1286 ret = usb4_dp_port_allocated_bandwidth(in); 1287 if (ret < 0) 1288 return ret; 1289 allocated_bw = ret; 1290 1291 ret = tb_dp_bandwidth_mode_maximum_bandwidth(tunnel, 1292 &max_bw_rounded); 1293 if (ret < 0) 1294 return ret; 1295 if (allocated_bw == max_bw_rounded) 1296 allocated_bw = ret; 1297 1298 if (tb_tunnel_direction_downstream(tunnel)) { 1299 *allocated_up = 0; 1300 *allocated_down = allocated_bw; 1301 } else { 1302 *allocated_up = allocated_bw; 1303 *allocated_down = 0; 1304 } 1305 return 0; 1306 } 1307 1308 return tunnel->consumed_bandwidth(tunnel, allocated_up, 1309 allocated_down); 1310 } 1311 1312 static int tb_dp_alloc_bandwidth(struct tb_tunnel *tunnel, int *alloc_up, 1313 int *alloc_down) 1314 { 1315 struct tb_port *in = tunnel->src_port; 1316 int max_bw_rounded, ret, tmp; 1317 1318 if (!usb4_dp_port_bandwidth_mode_enabled(in)) 1319 return -EOPNOTSUPP; 1320 1321 ret = tb_dp_bandwidth_mode_maximum_bandwidth(tunnel, &max_bw_rounded); 1322 if (ret < 0) 1323 return ret; 1324 1325 if (tb_tunnel_direction_downstream(tunnel)) { 1326 tmp = min(*alloc_down, max_bw_rounded); 1327 ret = usb4_dp_port_allocate_bandwidth(in, tmp); 1328 if (ret) 1329 return ret; 1330 *alloc_down = tmp; 1331 *alloc_up = 0; 1332 } else { 1333 tmp = min(*alloc_up, max_bw_rounded); 1334 ret = usb4_dp_port_allocate_bandwidth(in, tmp); 1335 if (ret) 1336 return ret; 1337 *alloc_down = 0; 1338 *alloc_up = tmp; 1339 } 1340 1341 /* Now we can use BW mode registers to figure out the bandwidth */ 1342 /* TODO: need to handle discovery too */ 1343 tunnel->bw_mode = true; 1344 return 0; 1345 } 1346 1347 /* Read cap from tunnel DP IN */ 1348 static int tb_dp_read_cap(struct tb_tunnel *tunnel, unsigned int cap, u32 *rate, 1349 u32 *lanes) 1350 { 1351 struct tb_port *in = tunnel->src_port; 1352 u32 val; 1353 int ret; 1354 1355 switch (cap) { 1356 case DP_LOCAL_CAP: 1357 case DP_REMOTE_CAP: 1358 case DP_COMMON_CAP: 1359 break; 1360 1361 default: 1362 tb_tunnel_WARN(tunnel, "invalid capability index %#x\n", cap); 1363 return -EINVAL; 1364 } 1365 1366 /* 1367 * Read from the copied remote cap so that we take into account 1368 * if capabilities were reduced during exchange. 1369 */ 1370 ret = tb_port_read(in, &val, TB_CFG_PORT, in->cap_adap + cap, 1); 1371 if (ret) 1372 return ret; 1373 1374 *rate = tb_dp_cap_get_rate(val); 1375 *lanes = tb_dp_cap_get_lanes(val); 1376 return 0; 1377 } 1378 1379 static int tb_dp_maximum_bandwidth(struct tb_tunnel *tunnel, int *max_up, 1380 int *max_down) 1381 { 1382 int ret; 1383 1384 if (!usb4_dp_port_bandwidth_mode_enabled(tunnel->src_port)) 1385 return -EOPNOTSUPP; 1386 1387 ret = tb_dp_bandwidth_mode_maximum_bandwidth(tunnel, NULL); 1388 if (ret < 0) 1389 return ret; 1390 1391 if (tb_tunnel_direction_downstream(tunnel)) { 1392 *max_up = 0; 1393 *max_down = ret; 1394 } else { 1395 *max_up = ret; 1396 *max_down = 0; 1397 } 1398 1399 return 0; 1400 } 1401 1402 static int tb_dp_consumed_bandwidth(struct tb_tunnel *tunnel, int *consumed_up, 1403 int *consumed_down) 1404 { 1405 const struct tb_switch *sw = tunnel->src_port->sw; 1406 u32 rate = 0, lanes = 0; 1407 int ret; 1408 1409 if (tb_dp_is_usb4(sw)) { 1410 ret = tb_dp_wait_dprx(tunnel, 0); 1411 if (ret) { 1412 if (ret == -ETIMEDOUT) { 1413 /* 1414 * While we wait for DPRX complete the 1415 * tunnel consumes as much as it had 1416 * been reserved initially. 1417 */ 1418 ret = tb_dp_read_cap(tunnel, DP_REMOTE_CAP, 1419 &rate, &lanes); 1420 if (ret) 1421 return ret; 1422 } else { 1423 return ret; 1424 } 1425 } else { 1426 /* 1427 * On USB4 routers check if the bandwidth allocation 1428 * mode is enabled first and then read the bandwidth 1429 * through those registers. 1430 */ 1431 ret = tb_dp_bandwidth_mode_consumed_bandwidth(tunnel, consumed_up, 1432 consumed_down); 1433 if (ret < 0) { 1434 if (ret != -EOPNOTSUPP) 1435 return ret; 1436 } else if (!ret) { 1437 return 0; 1438 } 1439 ret = tb_dp_read_cap(tunnel, DP_COMMON_CAP, &rate, &lanes); 1440 if (ret) 1441 return ret; 1442 } 1443 } else if (sw->generation >= 2) { 1444 ret = tb_dp_read_cap(tunnel, DP_REMOTE_CAP, &rate, &lanes); 1445 if (ret) 1446 return ret; 1447 } else { 1448 /* No bandwidth management for legacy devices */ 1449 *consumed_up = 0; 1450 *consumed_down = 0; 1451 return 0; 1452 } 1453 1454 if (tb_tunnel_direction_downstream(tunnel)) { 1455 *consumed_up = 0; 1456 *consumed_down = tb_dp_bandwidth(rate, lanes); 1457 } else { 1458 *consumed_up = tb_dp_bandwidth(rate, lanes); 1459 *consumed_down = 0; 1460 } 1461 1462 return 0; 1463 } 1464 1465 static void tb_dp_init_aux_credits(struct tb_path_hop *hop) 1466 { 1467 struct tb_port *port = hop->in_port; 1468 struct tb_switch *sw = port->sw; 1469 1470 if (tb_port_use_credit_allocation(port)) 1471 hop->initial_credits = sw->min_dp_aux_credits; 1472 else 1473 hop->initial_credits = 1; 1474 } 1475 1476 static void tb_dp_init_aux_path(struct tb_path *path, bool pm_support) 1477 { 1478 struct tb_path_hop *hop; 1479 1480 path->egress_fc_enable = TB_PATH_SOURCE | TB_PATH_INTERNAL; 1481 path->egress_shared_buffer = TB_PATH_NONE; 1482 path->ingress_fc_enable = TB_PATH_ALL; 1483 path->ingress_shared_buffer = TB_PATH_NONE; 1484 path->priority = TB_DP_AUX_PRIORITY; 1485 path->weight = TB_DP_AUX_WEIGHT; 1486 1487 tb_path_for_each_hop(path, hop) { 1488 tb_dp_init_aux_credits(hop); 1489 if (pm_support) 1490 tb_init_pm_support(hop); 1491 } 1492 } 1493 1494 static int tb_dp_init_video_credits(struct tb_path_hop *hop) 1495 { 1496 struct tb_port *port = hop->in_port; 1497 struct tb_switch *sw = port->sw; 1498 1499 if (tb_port_use_credit_allocation(port)) { 1500 unsigned int nfc_credits; 1501 size_t max_dp_streams; 1502 1503 tb_available_credits(port, &max_dp_streams); 1504 /* 1505 * Read the number of currently allocated NFC credits 1506 * from the lane adapter. Since we only use them for DP 1507 * tunneling we can use that to figure out how many DP 1508 * tunnels already go through the lane adapter. 1509 */ 1510 nfc_credits = port->config.nfc_credits & 1511 ADP_CS_4_NFC_BUFFERS_MASK; 1512 if (nfc_credits / sw->min_dp_main_credits > max_dp_streams) 1513 return -ENOSPC; 1514 1515 hop->nfc_credits = sw->min_dp_main_credits; 1516 } else { 1517 hop->nfc_credits = min(port->total_credits - 2, 12U); 1518 } 1519 1520 return 0; 1521 } 1522 1523 static int tb_dp_init_video_path(struct tb_path *path, bool pm_support) 1524 { 1525 struct tb_path_hop *hop; 1526 1527 path->egress_fc_enable = TB_PATH_NONE; 1528 path->egress_shared_buffer = TB_PATH_NONE; 1529 path->ingress_fc_enable = TB_PATH_NONE; 1530 path->ingress_shared_buffer = TB_PATH_NONE; 1531 path->priority = TB_DP_VIDEO_PRIORITY; 1532 path->weight = TB_DP_VIDEO_WEIGHT; 1533 1534 tb_path_for_each_hop(path, hop) { 1535 int ret; 1536 1537 ret = tb_dp_init_video_credits(hop); 1538 if (ret) 1539 return ret; 1540 if (pm_support) 1541 tb_init_pm_support(hop); 1542 } 1543 1544 return 0; 1545 } 1546 1547 static void tb_dp_dump(struct tb_tunnel *tunnel) 1548 { 1549 struct tb_port *in, *out; 1550 u32 dp_cap, rate, lanes; 1551 1552 in = tunnel->src_port; 1553 out = tunnel->dst_port; 1554 1555 if (tb_port_read(in, &dp_cap, TB_CFG_PORT, 1556 in->cap_adap + DP_LOCAL_CAP, 1)) 1557 return; 1558 1559 rate = tb_dp_cap_get_rate(dp_cap); 1560 lanes = tb_dp_cap_get_lanes(dp_cap); 1561 1562 tb_tunnel_dbg(tunnel, 1563 "DP IN maximum supported bandwidth %u Mb/s x%u = %u Mb/s\n", 1564 rate, lanes, tb_dp_bandwidth(rate, lanes)); 1565 1566 if (tb_port_read(out, &dp_cap, TB_CFG_PORT, 1567 out->cap_adap + DP_LOCAL_CAP, 1)) 1568 return; 1569 1570 rate = tb_dp_cap_get_rate(dp_cap); 1571 lanes = tb_dp_cap_get_lanes(dp_cap); 1572 1573 tb_tunnel_dbg(tunnel, 1574 "DP OUT maximum supported bandwidth %u Mb/s x%u = %u Mb/s\n", 1575 rate, lanes, tb_dp_bandwidth(rate, lanes)); 1576 1577 if (tb_port_read(in, &dp_cap, TB_CFG_PORT, 1578 in->cap_adap + DP_REMOTE_CAP, 1)) 1579 return; 1580 1581 rate = tb_dp_cap_get_rate(dp_cap); 1582 lanes = tb_dp_cap_get_lanes(dp_cap); 1583 1584 tb_tunnel_dbg(tunnel, "reduced bandwidth %u Mb/s x%u = %u Mb/s\n", 1585 rate, lanes, tb_dp_bandwidth(rate, lanes)); 1586 } 1587 1588 /** 1589 * tb_tunnel_discover_dp() - Discover existing Display Port tunnels 1590 * @tb: Pointer to the domain structure 1591 * @in: DP in adapter 1592 * @alloc_hopid: Allocate HopIDs from visited ports 1593 * @callback: Callback that is called when the DP tunnel is fully 1594 * activated (or there is an error) 1595 * @callback_data: Data for @callback 1596 * 1597 * If @in adapter is active, follows the tunnel to the DP out adapter 1598 * and back. Returns the discovered tunnel or %NULL if there was no 1599 * tunnel. See tb_tunnel_alloc_dp() for @callback. 1600 * 1601 * Return: Pointer to &struct tb_tunnel or %NULL if no tunnel found. 1602 */ 1603 struct tb_tunnel *tb_tunnel_discover_dp(struct tb *tb, struct tb_port *in, 1604 bool alloc_hopid, 1605 void (*callback)(struct tb_tunnel *, void *), 1606 void *callback_data) 1607 { 1608 struct tb_tunnel *tunnel; 1609 struct tb_port *port; 1610 struct tb_path *path; 1611 1612 if (WARN_ON(!callback)) 1613 return NULL; 1614 1615 if (!tb_dp_port_is_enabled(in)) 1616 return NULL; 1617 1618 tunnel = tb_tunnel_alloc(tb, 3, TB_TUNNEL_DP); 1619 if (!tunnel) 1620 return NULL; 1621 1622 tunnel->pre_activate = tb_dp_pre_activate; 1623 tunnel->activate = tb_dp_activate; 1624 tunnel->post_deactivate = tb_dp_post_deactivate; 1625 tunnel->maximum_bandwidth = tb_dp_maximum_bandwidth; 1626 tunnel->allocated_bandwidth = tb_dp_allocated_bandwidth; 1627 tunnel->alloc_bandwidth = tb_dp_alloc_bandwidth; 1628 tunnel->consumed_bandwidth = tb_dp_consumed_bandwidth; 1629 tunnel->src_port = in; 1630 tunnel->callback = callback; 1631 tunnel->callback_data = callback_data; 1632 INIT_DELAYED_WORK(&tunnel->dprx_work, tb_dp_dprx_work); 1633 1634 path = tb_path_discover(in, TB_DP_VIDEO_HOPID, NULL, -1, 1635 &tunnel->dst_port, "Video", alloc_hopid); 1636 if (!path) { 1637 /* Just disable the DP IN port */ 1638 tb_dp_port_enable(in, false); 1639 goto err_free; 1640 } 1641 tunnel->paths[TB_DP_VIDEO_PATH_OUT] = path; 1642 if (tb_dp_init_video_path(tunnel->paths[TB_DP_VIDEO_PATH_OUT], false)) 1643 goto err_free; 1644 1645 path = tb_path_discover(in, TB_DP_AUX_TX_HOPID, NULL, -1, NULL, "AUX TX", 1646 alloc_hopid); 1647 if (!path) 1648 goto err_deactivate; 1649 tunnel->paths[TB_DP_AUX_PATH_OUT] = path; 1650 tb_dp_init_aux_path(tunnel->paths[TB_DP_AUX_PATH_OUT], false); 1651 1652 path = tb_path_discover(tunnel->dst_port, -1, in, TB_DP_AUX_RX_HOPID, 1653 &port, "AUX RX", alloc_hopid); 1654 if (!path) 1655 goto err_deactivate; 1656 tunnel->paths[TB_DP_AUX_PATH_IN] = path; 1657 tb_dp_init_aux_path(tunnel->paths[TB_DP_AUX_PATH_IN], false); 1658 1659 /* Validate that the tunnel is complete */ 1660 if (!tb_port_is_dpout(tunnel->dst_port)) { 1661 tb_port_warn(in, "path does not end on a DP adapter, cleaning up\n"); 1662 goto err_deactivate; 1663 } 1664 1665 if (!tb_dp_port_is_enabled(tunnel->dst_port)) 1666 goto err_deactivate; 1667 1668 if (!tb_dp_port_hpd_is_active(tunnel->dst_port)) 1669 goto err_deactivate; 1670 1671 if (port != tunnel->src_port) { 1672 tb_tunnel_warn(tunnel, "path is not complete, cleaning up\n"); 1673 goto err_deactivate; 1674 } 1675 1676 tb_dp_dump(tunnel); 1677 1678 tb_tunnel_set_active(tunnel, true); 1679 tb_tunnel_dbg(tunnel, "discovered\n"); 1680 return tunnel; 1681 1682 err_deactivate: 1683 tb_tunnel_deactivate(tunnel); 1684 err_free: 1685 tb_tunnel_put(tunnel); 1686 1687 return NULL; 1688 } 1689 1690 /** 1691 * tb_tunnel_alloc_dp() - allocate a Display Port tunnel 1692 * @tb: Pointer to the domain structure 1693 * @in: DP in adapter port 1694 * @out: DP out adapter port 1695 * @link_nr: Preferred lane adapter when the link is not bonded 1696 * @max_up: Maximum available upstream bandwidth for the DP tunnel. 1697 * %0 if no available bandwidth. 1698 * @max_down: Maximum available downstream bandwidth for the DP tunnel. 1699 * %0 if no available bandwidth. 1700 * @callback: Callback that is called when the DP tunnel is fully 1701 * activated (or there is an error) 1702 * @callback_data: Data for @callback 1703 * 1704 * Allocates a tunnel between @in and @out that is capable of tunneling 1705 * Display Port traffic. The @callback is called after tb_tunnel_activate() 1706 * once the tunnel has been fully activated. It can call 1707 * tb_tunnel_is_active() to check if activation was successful (or if it 1708 * returns %false there was some sort of issue). The @callback is called 1709 * without @tb->lock held. 1710 * 1711 * Return: Pointer to @struct tb_tunnel or %NULL in case of failure. 1712 */ 1713 struct tb_tunnel *tb_tunnel_alloc_dp(struct tb *tb, struct tb_port *in, 1714 struct tb_port *out, int link_nr, 1715 int max_up, int max_down, 1716 void (*callback)(struct tb_tunnel *, void *), 1717 void *callback_data) 1718 { 1719 struct tb_tunnel *tunnel; 1720 struct tb_path **paths; 1721 struct tb_path *path; 1722 bool pm_support; 1723 1724 if (WARN_ON(!in->cap_adap || !out->cap_adap || !callback)) 1725 return NULL; 1726 1727 tunnel = tb_tunnel_alloc(tb, 3, TB_TUNNEL_DP); 1728 if (!tunnel) 1729 return NULL; 1730 1731 tunnel->pre_activate = tb_dp_pre_activate; 1732 tunnel->activate = tb_dp_activate; 1733 tunnel->post_deactivate = tb_dp_post_deactivate; 1734 tunnel->maximum_bandwidth = tb_dp_maximum_bandwidth; 1735 tunnel->allocated_bandwidth = tb_dp_allocated_bandwidth; 1736 tunnel->alloc_bandwidth = tb_dp_alloc_bandwidth; 1737 tunnel->consumed_bandwidth = tb_dp_consumed_bandwidth; 1738 tunnel->src_port = in; 1739 tunnel->dst_port = out; 1740 tunnel->max_up = max_up; 1741 tunnel->max_down = max_down; 1742 tunnel->callback = callback; 1743 tunnel->callback_data = callback_data; 1744 INIT_DELAYED_WORK(&tunnel->dprx_work, tb_dp_dprx_work); 1745 1746 paths = tunnel->paths; 1747 pm_support = usb4_switch_version(in->sw) >= 2; 1748 1749 path = tb_path_alloc(tb, in, TB_DP_VIDEO_HOPID, out, TB_DP_VIDEO_HOPID, 1750 link_nr, "Video"); 1751 if (!path) 1752 goto err_free; 1753 tb_dp_init_video_path(path, pm_support); 1754 paths[TB_DP_VIDEO_PATH_OUT] = path; 1755 1756 path = tb_path_alloc(tb, in, TB_DP_AUX_TX_HOPID, out, 1757 TB_DP_AUX_TX_HOPID, link_nr, "AUX TX"); 1758 if (!path) 1759 goto err_free; 1760 tb_dp_init_aux_path(path, pm_support); 1761 paths[TB_DP_AUX_PATH_OUT] = path; 1762 1763 path = tb_path_alloc(tb, out, TB_DP_AUX_RX_HOPID, in, 1764 TB_DP_AUX_RX_HOPID, link_nr, "AUX RX"); 1765 if (!path) 1766 goto err_free; 1767 tb_dp_init_aux_path(path, pm_support); 1768 paths[TB_DP_AUX_PATH_IN] = path; 1769 1770 return tunnel; 1771 1772 err_free: 1773 tb_tunnel_put(tunnel); 1774 return NULL; 1775 } 1776 1777 static unsigned int tb_dma_available_credits(const struct tb_port *port) 1778 { 1779 const struct tb_switch *sw = port->sw; 1780 int credits; 1781 1782 credits = tb_available_credits(port, NULL); 1783 if (tb_acpi_may_tunnel_pcie()) 1784 credits -= sw->max_pcie_credits; 1785 credits -= port->dma_credits; 1786 1787 return credits > 0 ? credits : 0; 1788 } 1789 1790 static int tb_dma_reserve_credits(struct tb_path_hop *hop, unsigned int credits) 1791 { 1792 struct tb_port *port = hop->in_port; 1793 1794 if (tb_port_use_credit_allocation(port)) { 1795 unsigned int available = tb_dma_available_credits(port); 1796 1797 /* 1798 * Need to have at least TB_MIN_DMA_CREDITS, otherwise 1799 * DMA path cannot be established. 1800 */ 1801 if (available < TB_MIN_DMA_CREDITS) 1802 return -ENOSPC; 1803 1804 credits = min(credits, available); 1805 1806 tb_port_dbg(port, "reserving %u credits for DMA path\n", 1807 credits); 1808 1809 port->dma_credits += credits; 1810 } else { 1811 if (tb_port_is_null(port)) 1812 credits = port->bonded ? 14 : 6; 1813 else 1814 credits = min(port->total_credits, credits); 1815 } 1816 1817 hop->initial_credits = credits; 1818 return 0; 1819 } 1820 1821 /* Path from lane adapter to NHI */ 1822 static int tb_dma_init_rx_path(struct tb_path *path, unsigned int credits) 1823 { 1824 struct tb_path_hop *hop; 1825 unsigned int i, tmp; 1826 1827 path->egress_fc_enable = TB_PATH_SOURCE | TB_PATH_INTERNAL; 1828 path->ingress_fc_enable = TB_PATH_ALL; 1829 path->egress_shared_buffer = TB_PATH_NONE; 1830 path->ingress_shared_buffer = TB_PATH_NONE; 1831 path->priority = TB_DMA_PRIORITY; 1832 path->weight = TB_DMA_WEIGHT; 1833 path->clear_fc = true; 1834 1835 /* 1836 * First lane adapter is the one connected to the remote host. 1837 * We don't tunnel other traffic over this link so we can use 1838 * all the credits (except the ones reserved for control traffic). 1839 */ 1840 hop = &path->hops[0]; 1841 tmp = min(tb_usable_credits(hop->in_port), credits); 1842 hop->initial_credits = tmp; 1843 hop->in_port->dma_credits += tmp; 1844 1845 for (i = 1; i < path->path_length; i++) { 1846 int ret; 1847 1848 ret = tb_dma_reserve_credits(&path->hops[i], credits); 1849 if (ret) 1850 return ret; 1851 } 1852 1853 return 0; 1854 } 1855 1856 /* Path from NHI to lane adapter */ 1857 static int tb_dma_init_tx_path(struct tb_path *path, unsigned int credits) 1858 { 1859 struct tb_path_hop *hop; 1860 1861 path->egress_fc_enable = TB_PATH_ALL; 1862 path->ingress_fc_enable = TB_PATH_ALL; 1863 path->egress_shared_buffer = TB_PATH_NONE; 1864 path->ingress_shared_buffer = TB_PATH_NONE; 1865 path->priority = TB_DMA_PRIORITY; 1866 path->weight = TB_DMA_WEIGHT; 1867 path->clear_fc = true; 1868 1869 tb_path_for_each_hop(path, hop) { 1870 int ret; 1871 1872 ret = tb_dma_reserve_credits(hop, credits); 1873 if (ret) 1874 return ret; 1875 } 1876 1877 return 0; 1878 } 1879 1880 static void tb_dma_release_credits(struct tb_path_hop *hop) 1881 { 1882 struct tb_port *port = hop->in_port; 1883 1884 if (tb_port_use_credit_allocation(port)) { 1885 port->dma_credits -= hop->initial_credits; 1886 1887 tb_port_dbg(port, "released %u DMA path credits\n", 1888 hop->initial_credits); 1889 } 1890 } 1891 1892 static void tb_dma_destroy_path(struct tb_path *path) 1893 { 1894 struct tb_path_hop *hop; 1895 1896 tb_path_for_each_hop(path, hop) 1897 tb_dma_release_credits(hop); 1898 } 1899 1900 static void tb_dma_destroy(struct tb_tunnel *tunnel) 1901 { 1902 int i; 1903 1904 for (i = 0; i < tunnel->npaths; i++) { 1905 if (!tunnel->paths[i]) 1906 continue; 1907 tb_dma_destroy_path(tunnel->paths[i]); 1908 } 1909 } 1910 1911 /** 1912 * tb_tunnel_alloc_dma() - allocate a DMA tunnel 1913 * @tb: Pointer to the domain structure 1914 * @nhi: Host controller port 1915 * @dst: Destination null port which the other domain is connected to 1916 * @transmit_path: HopID used for transmitting packets 1917 * @transmit_ring: NHI ring number used to send packets towards the 1918 * other domain. Set to %-1 if TX path is not needed. 1919 * @receive_path: HopID used for receiving packets 1920 * @receive_ring: NHI ring number used to receive packets from the 1921 * other domain. Set to %-1 if RX path is not needed. 1922 * 1923 * Return: Pointer to @struct tb_tunnel or %NULL in case of failure. 1924 */ 1925 struct tb_tunnel *tb_tunnel_alloc_dma(struct tb *tb, struct tb_port *nhi, 1926 struct tb_port *dst, int transmit_path, 1927 int transmit_ring, int receive_path, 1928 int receive_ring) 1929 { 1930 struct tb_tunnel *tunnel; 1931 size_t npaths = 0, i = 0; 1932 struct tb_path *path; 1933 unsigned int credits; 1934 1935 /* Ring 0 is reserved for control channel */ 1936 if (WARN_ON(!receive_ring || !transmit_ring)) 1937 return NULL; 1938 1939 if (receive_ring > 0) 1940 npaths++; 1941 if (transmit_ring > 0) 1942 npaths++; 1943 1944 if (WARN_ON(!npaths)) 1945 return NULL; 1946 1947 tunnel = tb_tunnel_alloc(tb, npaths, TB_TUNNEL_DMA); 1948 if (!tunnel) 1949 return NULL; 1950 1951 tunnel->src_port = nhi; 1952 tunnel->dst_port = dst; 1953 tunnel->destroy = tb_dma_destroy; 1954 1955 credits = min_not_zero(dma_credits, nhi->sw->max_dma_credits); 1956 if (credits > TB_MAX_CREDITS) { 1957 tb_tunnel_dbg(tunnel, "%u credits do not fit a hop, using %u\n", 1958 credits, TB_MAX_CREDITS); 1959 credits = TB_MAX_CREDITS; 1960 } 1961 1962 if (receive_ring > 0) { 1963 path = tb_path_alloc(tb, dst, receive_path, nhi, receive_ring, 0, 1964 "DMA RX"); 1965 if (!path) 1966 goto err_free; 1967 tunnel->paths[i++] = path; 1968 if (tb_dma_init_rx_path(path, credits)) { 1969 tb_tunnel_dbg(tunnel, "not enough buffers for RX path\n"); 1970 goto err_free; 1971 } 1972 } 1973 1974 if (transmit_ring > 0) { 1975 path = tb_path_alloc(tb, nhi, transmit_ring, dst, transmit_path, 0, 1976 "DMA TX"); 1977 if (!path) 1978 goto err_free; 1979 tunnel->paths[i++] = path; 1980 if (tb_dma_init_tx_path(path, credits)) { 1981 tb_tunnel_dbg(tunnel, "not enough buffers for TX path\n"); 1982 goto err_free; 1983 } 1984 } 1985 1986 return tunnel; 1987 1988 err_free: 1989 tb_tunnel_put(tunnel); 1990 return NULL; 1991 } 1992 1993 /** 1994 * tb_tunnel_match_dma() - Match DMA tunnel 1995 * @tunnel: Tunnel to match 1996 * @transmit_path: HopID used for transmitting packets. Pass %-1 to ignore. 1997 * @transmit_ring: NHI ring number used to send packets towards the 1998 * other domain. Pass %-1 to ignore. 1999 * @receive_path: HopID used for receiving packets. Pass %-1 to ignore. 2000 * @receive_ring: NHI ring number used to receive packets from the 2001 * other domain. Pass %-1 to ignore. 2002 * 2003 * This function can be used to match specific DMA tunnel, if there are 2004 * multiple DMA tunnels going through the same XDomain connection. 2005 * 2006 * Return: %true if there is a match, %false otherwise. 2007 */ 2008 bool tb_tunnel_match_dma(const struct tb_tunnel *tunnel, int transmit_path, 2009 int transmit_ring, int receive_path, int receive_ring) 2010 { 2011 const struct tb_path *tx_path = NULL, *rx_path = NULL; 2012 int i; 2013 2014 if (!receive_ring || !transmit_ring) 2015 return false; 2016 2017 for (i = 0; i < tunnel->npaths; i++) { 2018 const struct tb_path *path = tunnel->paths[i]; 2019 2020 if (!path) 2021 continue; 2022 2023 if (tb_port_is_nhi(path->hops[0].in_port)) 2024 tx_path = path; 2025 else if (tb_port_is_nhi(path->hops[path->path_length - 1].out_port)) 2026 rx_path = path; 2027 } 2028 2029 if (transmit_ring > 0 || transmit_path > 0) { 2030 if (!tx_path) 2031 return false; 2032 if (transmit_ring > 0 && 2033 (tx_path->hops[0].in_hop_index != transmit_ring)) 2034 return false; 2035 if (transmit_path > 0 && 2036 (tx_path->hops[tx_path->path_length - 1].next_hop_index != transmit_path)) 2037 return false; 2038 } 2039 2040 if (receive_ring > 0 || receive_path > 0) { 2041 if (!rx_path) 2042 return false; 2043 if (receive_path > 0 && 2044 (rx_path->hops[0].in_hop_index != receive_path)) 2045 return false; 2046 if (receive_ring > 0 && 2047 (rx_path->hops[rx_path->path_length - 1].next_hop_index != receive_ring)) 2048 return false; 2049 } 2050 2051 return true; 2052 } 2053 2054 static int tb_usb3_max_link_rate(struct tb_port *up, struct tb_port *down) 2055 { 2056 int ret, up_max_rate, down_max_rate; 2057 2058 ret = usb4_usb3_port_max_link_rate(up); 2059 if (ret < 0) 2060 return ret; 2061 up_max_rate = ret; 2062 2063 ret = usb4_usb3_port_max_link_rate(down); 2064 if (ret < 0) 2065 return ret; 2066 down_max_rate = ret; 2067 2068 return min(up_max_rate, down_max_rate); 2069 } 2070 2071 static int tb_usb3_pre_activate(struct tb_tunnel *tunnel) 2072 { 2073 tb_tunnel_dbg(tunnel, "allocating initial bandwidth %d/%d Mb/s\n", 2074 tunnel->allocated_up, tunnel->allocated_down); 2075 2076 return usb4_usb3_port_allocate_bandwidth(tunnel->src_port, 2077 &tunnel->allocated_up, 2078 &tunnel->allocated_down); 2079 } 2080 2081 static int tb_usb3_activate(struct tb_tunnel *tunnel, bool activate) 2082 { 2083 int res; 2084 2085 res = tb_usb3_port_enable(tunnel->src_port, activate); 2086 if (res) 2087 return res; 2088 2089 if (tb_port_is_usb3_up(tunnel->dst_port)) 2090 return tb_usb3_port_enable(tunnel->dst_port, activate); 2091 2092 return 0; 2093 } 2094 2095 static int tb_usb3_consumed_bandwidth(struct tb_tunnel *tunnel, 2096 int *consumed_up, int *consumed_down) 2097 { 2098 struct tb_port *port = tb_upstream_port(tunnel->dst_port->sw); 2099 int pcie_weight = tb_acpi_may_tunnel_pcie() ? TB_PCI_WEIGHT : 0; 2100 2101 /* 2102 * PCIe tunneling, if enabled, affects the USB3 bandwidth so 2103 * take that into account here. 2104 */ 2105 *consumed_up = tunnel->allocated_up * 2106 (TB_USB3_WEIGHT + pcie_weight) / TB_USB3_WEIGHT; 2107 *consumed_down = tunnel->allocated_down * 2108 (TB_USB3_WEIGHT + pcie_weight) / TB_USB3_WEIGHT; 2109 2110 if (tb_port_get_link_generation(port) >= 4) { 2111 *consumed_up = max(*consumed_up, USB4_V2_USB3_MIN_BANDWIDTH); 2112 *consumed_down = max(*consumed_down, USB4_V2_USB3_MIN_BANDWIDTH); 2113 } 2114 2115 return 0; 2116 } 2117 2118 static int tb_usb3_release_unused_bandwidth(struct tb_tunnel *tunnel) 2119 { 2120 int ret; 2121 2122 ret = usb4_usb3_port_release_bandwidth(tunnel->src_port, 2123 &tunnel->allocated_up, 2124 &tunnel->allocated_down); 2125 if (ret) 2126 return ret; 2127 2128 tb_tunnel_dbg(tunnel, "decreased bandwidth allocation to %d/%d Mb/s\n", 2129 tunnel->allocated_up, tunnel->allocated_down); 2130 return 0; 2131 } 2132 2133 static void tb_usb3_reclaim_available_bandwidth(struct tb_tunnel *tunnel, 2134 int *available_up, 2135 int *available_down) 2136 { 2137 int ret, max_rate, allocate_up, allocate_down; 2138 2139 ret = tb_usb3_max_link_rate(tunnel->dst_port, tunnel->src_port); 2140 if (ret < 0) { 2141 tb_tunnel_warn(tunnel, "failed to read maximum link rate\n"); 2142 return; 2143 } 2144 2145 /* 2146 * 90% of the max rate can be allocated for isochronous 2147 * transfers. 2148 */ 2149 max_rate = ret * 90 / 100; 2150 2151 /* No need to reclaim if already at maximum */ 2152 if (tunnel->allocated_up >= max_rate && 2153 tunnel->allocated_down >= max_rate) 2154 return; 2155 2156 /* Don't go lower than what is already allocated */ 2157 allocate_up = min(max_rate, *available_up); 2158 if (allocate_up < tunnel->allocated_up) 2159 allocate_up = tunnel->allocated_up; 2160 2161 allocate_down = min(max_rate, *available_down); 2162 if (allocate_down < tunnel->allocated_down) 2163 allocate_down = tunnel->allocated_down; 2164 2165 /* If no changes no need to do more */ 2166 if (allocate_up == tunnel->allocated_up && 2167 allocate_down == tunnel->allocated_down) 2168 return; 2169 2170 ret = usb4_usb3_port_allocate_bandwidth(tunnel->src_port, &allocate_up, 2171 &allocate_down); 2172 if (ret) { 2173 tb_tunnel_info(tunnel, "failed to allocate bandwidth\n"); 2174 return; 2175 } 2176 2177 tunnel->allocated_up = allocate_up; 2178 *available_up -= tunnel->allocated_up; 2179 2180 tunnel->allocated_down = allocate_down; 2181 *available_down -= tunnel->allocated_down; 2182 2183 tb_tunnel_dbg(tunnel, "increased bandwidth allocation to %d/%d Mb/s\n", 2184 tunnel->allocated_up, tunnel->allocated_down); 2185 } 2186 2187 static void tb_usb3_init_credits(struct tb_path_hop *hop) 2188 { 2189 struct tb_port *port = hop->in_port; 2190 struct tb_switch *sw = port->sw; 2191 unsigned int credits; 2192 2193 if (tb_port_use_credit_allocation(port)) { 2194 credits = sw->max_usb3_credits; 2195 } else { 2196 if (tb_port_is_null(port)) 2197 credits = port->bonded ? 32 : 16; 2198 else 2199 credits = 7; 2200 } 2201 2202 hop->initial_credits = credits; 2203 } 2204 2205 static void tb_usb3_init_path(struct tb_path *path) 2206 { 2207 struct tb_path_hop *hop; 2208 2209 path->egress_fc_enable = TB_PATH_SOURCE | TB_PATH_INTERNAL; 2210 path->egress_shared_buffer = TB_PATH_NONE; 2211 path->ingress_fc_enable = TB_PATH_ALL; 2212 path->ingress_shared_buffer = TB_PATH_NONE; 2213 path->priority = TB_USB3_PRIORITY; 2214 path->weight = TB_USB3_WEIGHT; 2215 path->drop_packages = 0; 2216 2217 tb_path_for_each_hop(path, hop) 2218 tb_usb3_init_credits(hop); 2219 } 2220 2221 /** 2222 * tb_tunnel_discover_usb3() - Discover existing USB3 tunnels 2223 * @tb: Pointer to the domain structure 2224 * @down: USB3 downstream adapter 2225 * @alloc_hopid: Allocate HopIDs from visited ports 2226 * 2227 * If @down adapter is active, follows the tunnel to the USB3 upstream 2228 * adapter and back. 2229 * 2230 * Return: Pointer to &struct tb_tunnel or %NULL if there was no tunnel. 2231 */ 2232 struct tb_tunnel *tb_tunnel_discover_usb3(struct tb *tb, struct tb_port *down, 2233 bool alloc_hopid) 2234 { 2235 struct tb_tunnel *tunnel; 2236 struct tb_path *path; 2237 2238 if (!tb_usb3_port_is_enabled(down)) 2239 return NULL; 2240 2241 tunnel = tb_tunnel_alloc(tb, 2, TB_TUNNEL_USB3); 2242 if (!tunnel) 2243 return NULL; 2244 2245 tunnel->activate = tb_usb3_activate; 2246 tunnel->src_port = down; 2247 2248 /* 2249 * Discover both paths even if they are not complete. We will 2250 * clean them up by calling tb_tunnel_deactivate() below in that 2251 * case. 2252 */ 2253 path = tb_path_discover(down, TB_USB3_HOPID, NULL, -1, 2254 &tunnel->dst_port, "USB3 Down", alloc_hopid); 2255 if (!path) { 2256 /* Just disable the downstream port */ 2257 tb_usb3_port_enable(down, false); 2258 goto err_free; 2259 } 2260 tunnel->paths[TB_USB3_PATH_DOWN] = path; 2261 tb_usb3_init_path(tunnel->paths[TB_USB3_PATH_DOWN]); 2262 2263 path = tb_path_discover(tunnel->dst_port, -1, down, TB_USB3_HOPID, NULL, 2264 "USB3 Up", alloc_hopid); 2265 if (!path) 2266 goto err_deactivate; 2267 tunnel->paths[TB_USB3_PATH_UP] = path; 2268 tb_usb3_init_path(tunnel->paths[TB_USB3_PATH_UP]); 2269 2270 /* Validate that the tunnel is complete */ 2271 if (!tb_port_is_usb3_up(tunnel->dst_port)) { 2272 tb_port_warn(tunnel->dst_port, 2273 "path does not end on an USB3 adapter, cleaning up\n"); 2274 goto err_deactivate; 2275 } 2276 2277 if (down != tunnel->src_port) { 2278 tb_tunnel_warn(tunnel, "path is not complete, cleaning up\n"); 2279 goto err_deactivate; 2280 } 2281 2282 if (!tb_usb3_port_is_enabled(tunnel->dst_port)) { 2283 tb_tunnel_warn(tunnel, 2284 "tunnel is not fully activated, cleaning up\n"); 2285 goto err_deactivate; 2286 } 2287 2288 if (!tb_route(down->sw)) { 2289 int ret; 2290 2291 /* 2292 * Read the initial bandwidth allocation for the first 2293 * hop tunnel. 2294 */ 2295 ret = usb4_usb3_port_allocated_bandwidth(down, 2296 &tunnel->allocated_up, &tunnel->allocated_down); 2297 if (ret) 2298 goto err_deactivate; 2299 2300 tb_tunnel_dbg(tunnel, "currently allocated bandwidth %d/%d Mb/s\n", 2301 tunnel->allocated_up, tunnel->allocated_down); 2302 2303 tunnel->pre_activate = tb_usb3_pre_activate; 2304 tunnel->consumed_bandwidth = tb_usb3_consumed_bandwidth; 2305 tunnel->release_unused_bandwidth = 2306 tb_usb3_release_unused_bandwidth; 2307 tunnel->reclaim_available_bandwidth = 2308 tb_usb3_reclaim_available_bandwidth; 2309 } 2310 2311 tb_tunnel_set_active(tunnel, true); 2312 tb_tunnel_dbg(tunnel, "discovered\n"); 2313 return tunnel; 2314 2315 err_deactivate: 2316 tb_tunnel_deactivate(tunnel); 2317 err_free: 2318 tb_tunnel_put(tunnel); 2319 2320 return NULL; 2321 } 2322 2323 /** 2324 * tb_tunnel_alloc_usb3() - allocate a USB3 tunnel 2325 * @tb: Pointer to the domain structure 2326 * @up: USB3 upstream adapter port 2327 * @down: USB3 downstream adapter port 2328 * @max_up: Maximum available upstream bandwidth for the USB3 tunnel. 2329 * %0 if no available bandwidth. 2330 * @max_down: Maximum available downstream bandwidth for the USB3 tunnel. 2331 * %0 if no available bandwidth. 2332 * 2333 * Allocate an USB3 tunnel. The ports must be of type @TB_TYPE_USB3_UP and 2334 * @TB_TYPE_USB3_DOWN. 2335 * 2336 * Return: Pointer to @struct tb_tunnel or %NULL in case of failure. 2337 */ 2338 struct tb_tunnel *tb_tunnel_alloc_usb3(struct tb *tb, struct tb_port *up, 2339 struct tb_port *down, int max_up, 2340 int max_down) 2341 { 2342 struct tb_tunnel *tunnel; 2343 struct tb_path *path; 2344 int max_rate = 0; 2345 2346 if (!tb_route(down->sw) && (max_up > 0 || max_down > 0)) { 2347 /* 2348 * For USB3 isochronous transfers, we allow bandwidth which is 2349 * not higher than 90% of maximum supported bandwidth by USB3 2350 * adapters. 2351 */ 2352 max_rate = tb_usb3_max_link_rate(down, up); 2353 if (max_rate < 0) 2354 return NULL; 2355 2356 max_rate = max_rate * 90 / 100; 2357 tb_port_dbg(up, "maximum required bandwidth for USB3 tunnel %d Mb/s\n", 2358 max_rate); 2359 } 2360 2361 tunnel = tb_tunnel_alloc(tb, 2, TB_TUNNEL_USB3); 2362 if (!tunnel) 2363 return NULL; 2364 2365 tunnel->activate = tb_usb3_activate; 2366 tunnel->src_port = down; 2367 tunnel->dst_port = up; 2368 tunnel->max_up = max_up; 2369 tunnel->max_down = max_down; 2370 2371 path = tb_path_alloc(tb, down, TB_USB3_HOPID, up, TB_USB3_HOPID, 0, 2372 "USB3 Down"); 2373 if (!path) 2374 goto err_free; 2375 tb_usb3_init_path(path); 2376 tunnel->paths[TB_USB3_PATH_DOWN] = path; 2377 2378 path = tb_path_alloc(tb, up, TB_USB3_HOPID, down, TB_USB3_HOPID, 0, 2379 "USB3 Up"); 2380 if (!path) 2381 goto err_free; 2382 tb_usb3_init_path(path); 2383 tunnel->paths[TB_USB3_PATH_UP] = path; 2384 2385 if (!tb_route(down->sw)) { 2386 tunnel->allocated_up = min(max_rate, max_up); 2387 tunnel->allocated_down = min(max_rate, max_down); 2388 2389 tunnel->pre_activate = tb_usb3_pre_activate; 2390 tunnel->consumed_bandwidth = tb_usb3_consumed_bandwidth; 2391 tunnel->release_unused_bandwidth = 2392 tb_usb3_release_unused_bandwidth; 2393 tunnel->reclaim_available_bandwidth = 2394 tb_usb3_reclaim_available_bandwidth; 2395 } 2396 2397 return tunnel; 2398 2399 err_free: 2400 tb_tunnel_put(tunnel); 2401 return NULL; 2402 } 2403 2404 /** 2405 * tb_tunnel_is_invalid - check whether an activated path is still valid 2406 * @tunnel: Tunnel to check 2407 * 2408 * Return: %true if path is valid, %false otherwise. 2409 */ 2410 bool tb_tunnel_is_invalid(struct tb_tunnel *tunnel) 2411 { 2412 int i; 2413 2414 for (i = 0; i < tunnel->npaths; i++) { 2415 WARN_ON(!tunnel->paths[i]->activated); 2416 if (tb_path_is_invalid(tunnel->paths[i])) 2417 return true; 2418 } 2419 2420 return false; 2421 } 2422 2423 /** 2424 * tb_tunnel_activate() - activate a tunnel 2425 * @tunnel: Tunnel to activate 2426 * 2427 * Return: 2428 * * %0 - On success. 2429 * * %-EINPROGRESS - If the tunnel activation is still in progress (that's 2430 * for DP tunnels to complete DPRX capabilities read). 2431 * * Negative errno - Another error occurred. 2432 */ 2433 int tb_tunnel_activate(struct tb_tunnel *tunnel) 2434 { 2435 int res, i; 2436 2437 tb_tunnel_dbg(tunnel, "activating\n"); 2438 2439 /* 2440 * Make sure all paths are properly disabled before enabling 2441 * them again. 2442 */ 2443 for (i = 0; i < tunnel->npaths; i++) { 2444 if (tunnel->paths[i]->activated) { 2445 tb_path_deactivate(tunnel->paths[i]); 2446 tunnel->paths[i]->activated = false; 2447 } 2448 } 2449 2450 tunnel->state = TB_TUNNEL_ACTIVATING; 2451 2452 if (tunnel->pre_activate) { 2453 res = tunnel->pre_activate(tunnel); 2454 if (res) 2455 return res; 2456 } 2457 2458 for (i = 0; i < tunnel->npaths; i++) { 2459 res = tb_path_activate(tunnel->paths[i]); 2460 if (res) 2461 goto err; 2462 } 2463 2464 if (tunnel->activate) { 2465 res = tunnel->activate(tunnel, true); 2466 if (res) { 2467 if (res == -EINPROGRESS) 2468 return res; 2469 goto err; 2470 } 2471 } 2472 2473 tb_tunnel_set_active(tunnel, true); 2474 return 0; 2475 2476 err: 2477 tb_tunnel_warn(tunnel, "activation failed\n"); 2478 tb_tunnel_deactivate(tunnel); 2479 return res; 2480 } 2481 2482 /** 2483 * tb_tunnel_deactivate() - deactivate a tunnel 2484 * @tunnel: Tunnel to deactivate 2485 */ 2486 void tb_tunnel_deactivate(struct tb_tunnel *tunnel) 2487 { 2488 int i; 2489 2490 tb_tunnel_dbg(tunnel, "deactivating\n"); 2491 2492 if (tunnel->activate) 2493 tunnel->activate(tunnel, false); 2494 2495 for (i = 0; i < tunnel->npaths; i++) { 2496 if (tunnel->paths[i] && tunnel->paths[i]->activated) 2497 tb_path_deactivate(tunnel->paths[i]); 2498 } 2499 2500 if (tunnel->post_deactivate) 2501 tunnel->post_deactivate(tunnel); 2502 2503 tb_tunnel_set_active(tunnel, false); 2504 } 2505 2506 /** 2507 * tb_tunnel_port_on_path() - Does the tunnel go through port 2508 * @tunnel: Tunnel to check 2509 * @port: Port to check 2510 * 2511 * Return: %true if @tunnel goes through @port (direction does not matter), 2512 * %false otherwise. 2513 */ 2514 bool tb_tunnel_port_on_path(const struct tb_tunnel *tunnel, 2515 const struct tb_port *port) 2516 { 2517 int i; 2518 2519 for (i = 0; i < tunnel->npaths; i++) { 2520 if (!tunnel->paths[i]) 2521 continue; 2522 2523 if (tb_path_port_on_path(tunnel->paths[i], port)) 2524 return true; 2525 } 2526 2527 return false; 2528 } 2529 2530 // Is tb_tunnel_activate() called for the tunnel 2531 static bool tb_tunnel_is_activated(const struct tb_tunnel *tunnel) 2532 { 2533 return tunnel->state == TB_TUNNEL_ACTIVATING || tb_tunnel_is_active(tunnel); 2534 } 2535 2536 /** 2537 * tb_tunnel_maximum_bandwidth() - Return maximum possible bandwidth 2538 * @tunnel: Tunnel to check 2539 * @max_up: Maximum upstream bandwidth in Mb/s 2540 * @max_down: Maximum downstream bandwidth in Mb/s 2541 * 2542 * Return: 2543 * * Maximum possible bandwidth this tunnel can support if not 2544 * limited by other bandwidth clients. 2545 * * %-EOPNOTSUPP - If the tunnel does not support this function. 2546 * * %-ENOTCONN - If the tunnel is not active. 2547 */ 2548 int tb_tunnel_maximum_bandwidth(struct tb_tunnel *tunnel, int *max_up, 2549 int *max_down) 2550 { 2551 if (!tb_tunnel_is_active(tunnel)) 2552 return -ENOTCONN; 2553 2554 if (tunnel->maximum_bandwidth) 2555 return tunnel->maximum_bandwidth(tunnel, max_up, max_down); 2556 return -EOPNOTSUPP; 2557 } 2558 2559 /** 2560 * tb_tunnel_allocated_bandwidth() - Return bandwidth allocated for the tunnel 2561 * @tunnel: Tunnel to check 2562 * @allocated_up: Currently allocated upstream bandwidth in Mb/s is stored here 2563 * @allocated_down: Currently allocated downstream bandwidth in Mb/s is 2564 * stored here 2565 * 2566 * Return: 2567 * * Bandwidth allocated for the tunnel. This may be higher than what the 2568 * tunnel actually consumes. 2569 * * %-EOPNOTSUPP - If the tunnel does not support this function. 2570 * * %-ENOTCONN - If the tunnel is not active. 2571 * * Negative errno - Another error occurred. 2572 */ 2573 int tb_tunnel_allocated_bandwidth(struct tb_tunnel *tunnel, int *allocated_up, 2574 int *allocated_down) 2575 { 2576 if (!tb_tunnel_is_active(tunnel)) 2577 return -ENOTCONN; 2578 2579 if (tunnel->allocated_bandwidth) 2580 return tunnel->allocated_bandwidth(tunnel, allocated_up, 2581 allocated_down); 2582 return -EOPNOTSUPP; 2583 } 2584 2585 /** 2586 * tb_tunnel_alloc_bandwidth() - Change tunnel bandwidth allocation 2587 * @tunnel: Tunnel whose bandwidth allocation to change 2588 * @alloc_up: New upstream bandwidth in Mb/s 2589 * @alloc_down: New downstream bandwidth in Mb/s 2590 * 2591 * Tries to change tunnel bandwidth allocation. 2592 * 2593 * Return: 2594 * * %0 - On success. Updates @alloc_up and @alloc_down to values that were 2595 * actually allocated (it may not be the same as passed originally). 2596 * * Negative errno - In case of failure. 2597 */ 2598 int tb_tunnel_alloc_bandwidth(struct tb_tunnel *tunnel, int *alloc_up, 2599 int *alloc_down) 2600 { 2601 if (!tb_tunnel_is_active(tunnel)) 2602 return -ENOTCONN; 2603 2604 if (tunnel->alloc_bandwidth) { 2605 int ret; 2606 2607 ret = tunnel->alloc_bandwidth(tunnel, alloc_up, alloc_down); 2608 if (ret) 2609 return ret; 2610 2611 tb_tunnel_changed(tunnel); 2612 return 0; 2613 } 2614 2615 return -EOPNOTSUPP; 2616 } 2617 2618 /** 2619 * tb_tunnel_consumed_bandwidth() - Return bandwidth consumed by the tunnel 2620 * @tunnel: Tunnel to check 2621 * @consumed_up: Consumed bandwidth in Mb/s from @dst_port to @src_port. 2622 * Can be %NULL. 2623 * @consumed_down: Consumed bandwidth in Mb/s from @src_port to @dst_port. 2624 * Can be %NULL. 2625 * 2626 * Stores the amount of isochronous bandwidth @tunnel consumes in 2627 * @consumed_up and @consumed_down. 2628 * 2629 * Return: %0 on success, negative errno otherwise. 2630 */ 2631 int tb_tunnel_consumed_bandwidth(struct tb_tunnel *tunnel, int *consumed_up, 2632 int *consumed_down) 2633 { 2634 int up_bw = 0, down_bw = 0; 2635 2636 /* 2637 * Here we need to distinguish between not active tunnel from 2638 * tunnels that are either fully active or activation started. 2639 * The latter is true for DP tunnels where we must report the 2640 * consumed to be the maximum we gave it until DPRX capabilities 2641 * read is done by the graphics driver. 2642 */ 2643 if (tb_tunnel_is_activated(tunnel) && tunnel->consumed_bandwidth) { 2644 int ret; 2645 2646 ret = tunnel->consumed_bandwidth(tunnel, &up_bw, &down_bw); 2647 if (ret) 2648 return ret; 2649 } 2650 2651 if (consumed_up) 2652 *consumed_up = up_bw; 2653 if (consumed_down) 2654 *consumed_down = down_bw; 2655 2656 tb_tunnel_dbg(tunnel, "consumed bandwidth %d/%d Mb/s\n", up_bw, down_bw); 2657 return 0; 2658 } 2659 2660 /** 2661 * tb_tunnel_release_unused_bandwidth() - Release unused bandwidth 2662 * @tunnel: Tunnel whose unused bandwidth to release 2663 * 2664 * If tunnel supports dynamic bandwidth management (USB3 tunnels at the 2665 * moment) this function makes it release all the unused bandwidth. 2666 * 2667 * Return: %0 on success, negative errno otherwise. 2668 */ 2669 int tb_tunnel_release_unused_bandwidth(struct tb_tunnel *tunnel) 2670 { 2671 if (!tb_tunnel_is_active(tunnel)) 2672 return -ENOTCONN; 2673 2674 if (tunnel->release_unused_bandwidth) { 2675 int ret; 2676 2677 ret = tunnel->release_unused_bandwidth(tunnel); 2678 if (ret) 2679 return ret; 2680 } 2681 2682 return 0; 2683 } 2684 2685 /** 2686 * tb_tunnel_reclaim_available_bandwidth() - Reclaim available bandwidth 2687 * @tunnel: Tunnel reclaiming available bandwidth 2688 * @available_up: Available upstream bandwidth (in Mb/s) 2689 * @available_down: Available downstream bandwidth (in Mb/s) 2690 * 2691 * Reclaims bandwidth from @available_up and @available_down and updates 2692 * the variables accordingly (e.g decreases both according to what was 2693 * reclaimed by the tunnel). If nothing was reclaimed the values are 2694 * kept as is. 2695 */ 2696 void tb_tunnel_reclaim_available_bandwidth(struct tb_tunnel *tunnel, 2697 int *available_up, 2698 int *available_down) 2699 { 2700 if (!tb_tunnel_is_active(tunnel)) 2701 return; 2702 2703 if (tunnel->reclaim_available_bandwidth) 2704 tunnel->reclaim_available_bandwidth(tunnel, available_up, 2705 available_down); 2706 } 2707 2708 const char *tb_tunnel_type_name(const struct tb_tunnel *tunnel) 2709 { 2710 return tb_tunnel_names[tunnel->type]; 2711 } 2712