1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Thunderbolt driver - bus logic (NHI independent) 4 * 5 * Copyright (c) 2014 Andreas Noever <andreas.noever@gmail.com> 6 * Copyright (C) 2019, Intel Corporation 7 */ 8 9 #include <linux/slab.h> 10 #include <linux/errno.h> 11 #include <linux/delay.h> 12 #include <linux/platform_data/x86/apple.h> 13 14 #include "tb.h" 15 #include "tb_regs.h" 16 #include "tunnel.h" 17 18 /** 19 * struct tb_cm - Simple Thunderbolt connection manager 20 * @tunnel_list: List of active tunnels 21 * @hotplug_active: tb_handle_hotplug will stop progressing plug 22 * events and exit if this is not set (it needs to 23 * acquire the lock one more time). Used to drain wq 24 * after cfg has been paused. 25 */ 26 struct tb_cm { 27 struct list_head tunnel_list; 28 bool hotplug_active; 29 }; 30 31 struct tb_hotplug_event { 32 struct work_struct work; 33 struct tb *tb; 34 u64 route; 35 u8 port; 36 bool unplug; 37 }; 38 39 static void tb_handle_hotplug(struct work_struct *work); 40 41 static void tb_queue_hotplug(struct tb *tb, u64 route, u8 port, bool unplug) 42 { 43 struct tb_hotplug_event *ev; 44 45 ev = kmalloc(sizeof(*ev), GFP_KERNEL); 46 if (!ev) 47 return; 48 49 ev->tb = tb; 50 ev->route = route; 51 ev->port = port; 52 ev->unplug = unplug; 53 INIT_WORK(&ev->work, tb_handle_hotplug); 54 queue_work(tb->wq, &ev->work); 55 } 56 57 /* enumeration & hot plug handling */ 58 59 static void tb_discover_tunnels(struct tb_switch *sw) 60 { 61 struct tb *tb = sw->tb; 62 struct tb_cm *tcm = tb_priv(tb); 63 struct tb_port *port; 64 int i; 65 66 for (i = 1; i <= sw->config.max_port_number; i++) { 67 struct tb_tunnel *tunnel = NULL; 68 69 port = &sw->ports[i]; 70 switch (port->config.type) { 71 case TB_TYPE_DP_HDMI_IN: 72 tunnel = tb_tunnel_discover_dp(tb, port); 73 break; 74 75 case TB_TYPE_PCIE_DOWN: 76 tunnel = tb_tunnel_discover_pci(tb, port); 77 break; 78 79 default: 80 break; 81 } 82 83 if (!tunnel) 84 continue; 85 86 if (tb_tunnel_is_pci(tunnel)) { 87 struct tb_switch *parent = tunnel->dst_port->sw; 88 89 while (parent != tunnel->src_port->sw) { 90 parent->boot = true; 91 parent = tb_switch_parent(parent); 92 } 93 } 94 95 list_add_tail(&tunnel->list, &tcm->tunnel_list); 96 } 97 98 for (i = 1; i <= sw->config.max_port_number; i++) { 99 if (tb_port_has_remote(&sw->ports[i])) 100 tb_discover_tunnels(sw->ports[i].remote->sw); 101 } 102 } 103 104 static void tb_scan_xdomain(struct tb_port *port) 105 { 106 struct tb_switch *sw = port->sw; 107 struct tb *tb = sw->tb; 108 struct tb_xdomain *xd; 109 u64 route; 110 111 route = tb_downstream_route(port); 112 xd = tb_xdomain_find_by_route(tb, route); 113 if (xd) { 114 tb_xdomain_put(xd); 115 return; 116 } 117 118 xd = tb_xdomain_alloc(tb, &sw->dev, route, tb->root_switch->uuid, 119 NULL); 120 if (xd) { 121 tb_port_at(route, sw)->xdomain = xd; 122 tb_xdomain_add(xd); 123 } 124 } 125 126 static void tb_scan_port(struct tb_port *port); 127 128 /** 129 * tb_scan_switch() - scan for and initialize downstream switches 130 */ 131 static void tb_scan_switch(struct tb_switch *sw) 132 { 133 int i; 134 for (i = 1; i <= sw->config.max_port_number; i++) 135 tb_scan_port(&sw->ports[i]); 136 } 137 138 /** 139 * tb_scan_port() - check for and initialize switches below port 140 */ 141 static void tb_scan_port(struct tb_port *port) 142 { 143 struct tb_cm *tcm = tb_priv(port->sw->tb); 144 struct tb_port *upstream_port; 145 struct tb_switch *sw; 146 147 if (tb_is_upstream_port(port)) 148 return; 149 150 if (tb_port_is_dpout(port) && tb_dp_port_hpd_is_active(port) == 1 && 151 !tb_dp_port_is_enabled(port)) { 152 tb_port_dbg(port, "DP adapter HPD set, queuing hotplug\n"); 153 tb_queue_hotplug(port->sw->tb, tb_route(port->sw), port->port, 154 false); 155 return; 156 } 157 158 if (port->config.type != TB_TYPE_PORT) 159 return; 160 if (port->dual_link_port && port->link_nr) 161 return; /* 162 * Downstream switch is reachable through two ports. 163 * Only scan on the primary port (link_nr == 0). 164 */ 165 if (tb_wait_for_port(port, false) <= 0) 166 return; 167 if (port->remote) { 168 tb_port_dbg(port, "port already has a remote\n"); 169 return; 170 } 171 sw = tb_switch_alloc(port->sw->tb, &port->sw->dev, 172 tb_downstream_route(port)); 173 if (IS_ERR(sw)) { 174 /* 175 * If there is an error accessing the connected switch 176 * it may be connected to another domain. Also we allow 177 * the other domain to be connected to a max depth switch. 178 */ 179 if (PTR_ERR(sw) == -EIO || PTR_ERR(sw) == -EADDRNOTAVAIL) 180 tb_scan_xdomain(port); 181 return; 182 } 183 184 if (tb_switch_configure(sw)) { 185 tb_switch_put(sw); 186 return; 187 } 188 189 /* 190 * If there was previously another domain connected remove it 191 * first. 192 */ 193 if (port->xdomain) { 194 tb_xdomain_remove(port->xdomain); 195 port->xdomain = NULL; 196 } 197 198 /* 199 * Do not send uevents until we have discovered all existing 200 * tunnels and know which switches were authorized already by 201 * the boot firmware. 202 */ 203 if (!tcm->hotplug_active) 204 dev_set_uevent_suppress(&sw->dev, true); 205 206 if (tb_switch_add(sw)) { 207 tb_switch_put(sw); 208 return; 209 } 210 211 /* Link the switches using both links if available */ 212 upstream_port = tb_upstream_port(sw); 213 port->remote = upstream_port; 214 upstream_port->remote = port; 215 if (port->dual_link_port && upstream_port->dual_link_port) { 216 port->dual_link_port->remote = upstream_port->dual_link_port; 217 upstream_port->dual_link_port->remote = port->dual_link_port; 218 } 219 220 tb_scan_switch(sw); 221 } 222 223 static int tb_free_tunnel(struct tb *tb, enum tb_tunnel_type type, 224 struct tb_port *src_port, struct tb_port *dst_port) 225 { 226 struct tb_cm *tcm = tb_priv(tb); 227 struct tb_tunnel *tunnel; 228 229 list_for_each_entry(tunnel, &tcm->tunnel_list, list) { 230 if (tunnel->type == type && 231 ((src_port && src_port == tunnel->src_port) || 232 (dst_port && dst_port == tunnel->dst_port))) { 233 tb_tunnel_deactivate(tunnel); 234 list_del(&tunnel->list); 235 tb_tunnel_free(tunnel); 236 return 0; 237 } 238 } 239 240 return -ENODEV; 241 } 242 243 /** 244 * tb_free_invalid_tunnels() - destroy tunnels of devices that have gone away 245 */ 246 static void tb_free_invalid_tunnels(struct tb *tb) 247 { 248 struct tb_cm *tcm = tb_priv(tb); 249 struct tb_tunnel *tunnel; 250 struct tb_tunnel *n; 251 252 list_for_each_entry_safe(tunnel, n, &tcm->tunnel_list, list) { 253 if (tb_tunnel_is_invalid(tunnel)) { 254 tb_tunnel_deactivate(tunnel); 255 list_del(&tunnel->list); 256 tb_tunnel_free(tunnel); 257 } 258 } 259 } 260 261 /** 262 * tb_free_unplugged_children() - traverse hierarchy and free unplugged switches 263 */ 264 static void tb_free_unplugged_children(struct tb_switch *sw) 265 { 266 int i; 267 for (i = 1; i <= sw->config.max_port_number; i++) { 268 struct tb_port *port = &sw->ports[i]; 269 270 if (!tb_port_has_remote(port)) 271 continue; 272 273 if (port->remote->sw->is_unplugged) { 274 tb_switch_remove(port->remote->sw); 275 port->remote = NULL; 276 if (port->dual_link_port) 277 port->dual_link_port->remote = NULL; 278 } else { 279 tb_free_unplugged_children(port->remote->sw); 280 } 281 } 282 } 283 284 /** 285 * tb_find_port() - return the first port of @type on @sw or NULL 286 * @sw: Switch to find the port from 287 * @type: Port type to look for 288 */ 289 static struct tb_port *tb_find_port(struct tb_switch *sw, 290 enum tb_port_type type) 291 { 292 int i; 293 for (i = 1; i <= sw->config.max_port_number; i++) 294 if (sw->ports[i].config.type == type) 295 return &sw->ports[i]; 296 return NULL; 297 } 298 299 /** 300 * tb_find_unused_port() - return the first inactive port on @sw 301 * @sw: Switch to find the port on 302 * @type: Port type to look for 303 */ 304 static struct tb_port *tb_find_unused_port(struct tb_switch *sw, 305 enum tb_port_type type) 306 { 307 int i; 308 309 for (i = 1; i <= sw->config.max_port_number; i++) { 310 if (tb_is_upstream_port(&sw->ports[i])) 311 continue; 312 if (sw->ports[i].config.type != type) 313 continue; 314 if (!sw->ports[i].cap_adap) 315 continue; 316 if (tb_port_is_enabled(&sw->ports[i])) 317 continue; 318 return &sw->ports[i]; 319 } 320 return NULL; 321 } 322 323 static struct tb_port *tb_find_pcie_down(struct tb_switch *sw, 324 const struct tb_port *port) 325 { 326 /* 327 * To keep plugging devices consistently in the same PCIe 328 * hierarchy, do mapping here for root switch downstream PCIe 329 * ports. 330 */ 331 if (!tb_route(sw)) { 332 int phy_port = tb_phy_port_from_link(port->port); 333 int index; 334 335 /* 336 * Hard-coded Thunderbolt port to PCIe down port mapping 337 * per controller. 338 */ 339 if (tb_switch_is_cr(sw)) 340 index = !phy_port ? 6 : 7; 341 else if (tb_switch_is_fr(sw)) 342 index = !phy_port ? 6 : 8; 343 else 344 goto out; 345 346 /* Validate the hard-coding */ 347 if (WARN_ON(index > sw->config.max_port_number)) 348 goto out; 349 if (WARN_ON(!tb_port_is_pcie_down(&sw->ports[index]))) 350 goto out; 351 if (WARN_ON(tb_pci_port_is_enabled(&sw->ports[index]))) 352 goto out; 353 354 return &sw->ports[index]; 355 } 356 357 out: 358 return tb_find_unused_port(sw, TB_TYPE_PCIE_DOWN); 359 } 360 361 static int tb_tunnel_dp(struct tb *tb, struct tb_port *out) 362 { 363 struct tb_cm *tcm = tb_priv(tb); 364 struct tb_switch *sw = out->sw; 365 struct tb_tunnel *tunnel; 366 struct tb_port *in; 367 368 if (tb_port_is_enabled(out)) 369 return 0; 370 371 do { 372 sw = tb_to_switch(sw->dev.parent); 373 if (!sw) 374 return 0; 375 in = tb_find_unused_port(sw, TB_TYPE_DP_HDMI_IN); 376 } while (!in); 377 378 tunnel = tb_tunnel_alloc_dp(tb, in, out); 379 if (!tunnel) { 380 tb_port_dbg(out, "DP tunnel allocation failed\n"); 381 return -ENOMEM; 382 } 383 384 if (tb_tunnel_activate(tunnel)) { 385 tb_port_info(out, "DP tunnel activation failed, aborting\n"); 386 tb_tunnel_free(tunnel); 387 return -EIO; 388 } 389 390 list_add_tail(&tunnel->list, &tcm->tunnel_list); 391 return 0; 392 } 393 394 static void tb_teardown_dp(struct tb *tb, struct tb_port *out) 395 { 396 tb_free_tunnel(tb, TB_TUNNEL_DP, NULL, out); 397 } 398 399 static int tb_tunnel_pci(struct tb *tb, struct tb_switch *sw) 400 { 401 struct tb_port *up, *down, *port; 402 struct tb_cm *tcm = tb_priv(tb); 403 struct tb_switch *parent_sw; 404 struct tb_tunnel *tunnel; 405 406 up = tb_find_port(sw, TB_TYPE_PCIE_UP); 407 if (!up) 408 return 0; 409 410 /* 411 * Look up available down port. Since we are chaining it should 412 * be found right above this switch. 413 */ 414 parent_sw = tb_to_switch(sw->dev.parent); 415 port = tb_port_at(tb_route(sw), parent_sw); 416 down = tb_find_pcie_down(parent_sw, port); 417 if (!down) 418 return 0; 419 420 tunnel = tb_tunnel_alloc_pci(tb, up, down); 421 if (!tunnel) 422 return -ENOMEM; 423 424 if (tb_tunnel_activate(tunnel)) { 425 tb_port_info(up, 426 "PCIe tunnel activation failed, aborting\n"); 427 tb_tunnel_free(tunnel); 428 return -EIO; 429 } 430 431 list_add_tail(&tunnel->list, &tcm->tunnel_list); 432 return 0; 433 } 434 435 static int tb_approve_xdomain_paths(struct tb *tb, struct tb_xdomain *xd) 436 { 437 struct tb_cm *tcm = tb_priv(tb); 438 struct tb_port *nhi_port, *dst_port; 439 struct tb_tunnel *tunnel; 440 struct tb_switch *sw; 441 442 sw = tb_to_switch(xd->dev.parent); 443 dst_port = tb_port_at(xd->route, sw); 444 nhi_port = tb_find_port(tb->root_switch, TB_TYPE_NHI); 445 446 mutex_lock(&tb->lock); 447 tunnel = tb_tunnel_alloc_dma(tb, nhi_port, dst_port, xd->transmit_ring, 448 xd->transmit_path, xd->receive_ring, 449 xd->receive_path); 450 if (!tunnel) { 451 mutex_unlock(&tb->lock); 452 return -ENOMEM; 453 } 454 455 if (tb_tunnel_activate(tunnel)) { 456 tb_port_info(nhi_port, 457 "DMA tunnel activation failed, aborting\n"); 458 tb_tunnel_free(tunnel); 459 mutex_unlock(&tb->lock); 460 return -EIO; 461 } 462 463 list_add_tail(&tunnel->list, &tcm->tunnel_list); 464 mutex_unlock(&tb->lock); 465 return 0; 466 } 467 468 static void __tb_disconnect_xdomain_paths(struct tb *tb, struct tb_xdomain *xd) 469 { 470 struct tb_port *dst_port; 471 struct tb_switch *sw; 472 473 sw = tb_to_switch(xd->dev.parent); 474 dst_port = tb_port_at(xd->route, sw); 475 476 /* 477 * It is possible that the tunnel was already teared down (in 478 * case of cable disconnect) so it is fine if we cannot find it 479 * here anymore. 480 */ 481 tb_free_tunnel(tb, TB_TUNNEL_DMA, NULL, dst_port); 482 } 483 484 static int tb_disconnect_xdomain_paths(struct tb *tb, struct tb_xdomain *xd) 485 { 486 if (!xd->is_unplugged) { 487 mutex_lock(&tb->lock); 488 __tb_disconnect_xdomain_paths(tb, xd); 489 mutex_unlock(&tb->lock); 490 } 491 return 0; 492 } 493 494 /* hotplug handling */ 495 496 /** 497 * tb_handle_hotplug() - handle hotplug event 498 * 499 * Executes on tb->wq. 500 */ 501 static void tb_handle_hotplug(struct work_struct *work) 502 { 503 struct tb_hotplug_event *ev = container_of(work, typeof(*ev), work); 504 struct tb *tb = ev->tb; 505 struct tb_cm *tcm = tb_priv(tb); 506 struct tb_switch *sw; 507 struct tb_port *port; 508 mutex_lock(&tb->lock); 509 if (!tcm->hotplug_active) 510 goto out; /* during init, suspend or shutdown */ 511 512 sw = tb_switch_find_by_route(tb, ev->route); 513 if (!sw) { 514 tb_warn(tb, 515 "hotplug event from non existent switch %llx:%x (unplug: %d)\n", 516 ev->route, ev->port, ev->unplug); 517 goto out; 518 } 519 if (ev->port > sw->config.max_port_number) { 520 tb_warn(tb, 521 "hotplug event from non existent port %llx:%x (unplug: %d)\n", 522 ev->route, ev->port, ev->unplug); 523 goto put_sw; 524 } 525 port = &sw->ports[ev->port]; 526 if (tb_is_upstream_port(port)) { 527 tb_dbg(tb, "hotplug event for upstream port %llx:%x (unplug: %d)\n", 528 ev->route, ev->port, ev->unplug); 529 goto put_sw; 530 } 531 if (ev->unplug) { 532 if (tb_port_has_remote(port)) { 533 tb_port_dbg(port, "switch unplugged\n"); 534 tb_sw_set_unplugged(port->remote->sw); 535 tb_free_invalid_tunnels(tb); 536 tb_switch_remove(port->remote->sw); 537 port->remote = NULL; 538 if (port->dual_link_port) 539 port->dual_link_port->remote = NULL; 540 } else if (port->xdomain) { 541 struct tb_xdomain *xd = tb_xdomain_get(port->xdomain); 542 543 tb_port_dbg(port, "xdomain unplugged\n"); 544 /* 545 * Service drivers are unbound during 546 * tb_xdomain_remove() so setting XDomain as 547 * unplugged here prevents deadlock if they call 548 * tb_xdomain_disable_paths(). We will tear down 549 * the path below. 550 */ 551 xd->is_unplugged = true; 552 tb_xdomain_remove(xd); 553 port->xdomain = NULL; 554 __tb_disconnect_xdomain_paths(tb, xd); 555 tb_xdomain_put(xd); 556 } else if (tb_port_is_dpout(port)) { 557 tb_teardown_dp(tb, port); 558 } else { 559 tb_port_dbg(port, 560 "got unplug event for disconnected port, ignoring\n"); 561 } 562 } else if (port->remote) { 563 tb_port_dbg(port, "got plug event for connected port, ignoring\n"); 564 } else { 565 if (tb_port_is_null(port)) { 566 tb_port_dbg(port, "hotplug: scanning\n"); 567 tb_scan_port(port); 568 if (!port->remote) 569 tb_port_dbg(port, "hotplug: no switch found\n"); 570 } else if (tb_port_is_dpout(port)) { 571 tb_tunnel_dp(tb, port); 572 } 573 } 574 575 put_sw: 576 tb_switch_put(sw); 577 out: 578 mutex_unlock(&tb->lock); 579 kfree(ev); 580 } 581 582 /** 583 * tb_schedule_hotplug_handler() - callback function for the control channel 584 * 585 * Delegates to tb_handle_hotplug. 586 */ 587 static void tb_handle_event(struct tb *tb, enum tb_cfg_pkg_type type, 588 const void *buf, size_t size) 589 { 590 const struct cfg_event_pkg *pkg = buf; 591 u64 route; 592 593 if (type != TB_CFG_PKG_EVENT) { 594 tb_warn(tb, "unexpected event %#x, ignoring\n", type); 595 return; 596 } 597 598 route = tb_cfg_get_route(&pkg->header); 599 600 if (tb_cfg_error(tb->ctl, route, pkg->port, 601 TB_CFG_ERROR_ACK_PLUG_EVENT)) { 602 tb_warn(tb, "could not ack plug event on %llx:%x\n", route, 603 pkg->port); 604 } 605 606 tb_queue_hotplug(tb, route, pkg->port, pkg->unplug); 607 } 608 609 static void tb_stop(struct tb *tb) 610 { 611 struct tb_cm *tcm = tb_priv(tb); 612 struct tb_tunnel *tunnel; 613 struct tb_tunnel *n; 614 615 /* tunnels are only present after everything has been initialized */ 616 list_for_each_entry_safe(tunnel, n, &tcm->tunnel_list, list) { 617 /* 618 * DMA tunnels require the driver to be functional so we 619 * tear them down. Other protocol tunnels can be left 620 * intact. 621 */ 622 if (tb_tunnel_is_dma(tunnel)) 623 tb_tunnel_deactivate(tunnel); 624 tb_tunnel_free(tunnel); 625 } 626 tb_switch_remove(tb->root_switch); 627 tcm->hotplug_active = false; /* signal tb_handle_hotplug to quit */ 628 } 629 630 static int tb_scan_finalize_switch(struct device *dev, void *data) 631 { 632 if (tb_is_switch(dev)) { 633 struct tb_switch *sw = tb_to_switch(dev); 634 635 /* 636 * If we found that the switch was already setup by the 637 * boot firmware, mark it as authorized now before we 638 * send uevent to userspace. 639 */ 640 if (sw->boot) 641 sw->authorized = 1; 642 643 dev_set_uevent_suppress(dev, false); 644 kobject_uevent(&dev->kobj, KOBJ_ADD); 645 device_for_each_child(dev, NULL, tb_scan_finalize_switch); 646 } 647 648 return 0; 649 } 650 651 static int tb_start(struct tb *tb) 652 { 653 struct tb_cm *tcm = tb_priv(tb); 654 int ret; 655 656 tb->root_switch = tb_switch_alloc(tb, &tb->dev, 0); 657 if (IS_ERR(tb->root_switch)) 658 return PTR_ERR(tb->root_switch); 659 660 /* 661 * ICM firmware upgrade needs running firmware and in native 662 * mode that is not available so disable firmware upgrade of the 663 * root switch. 664 */ 665 tb->root_switch->no_nvm_upgrade = true; 666 667 ret = tb_switch_configure(tb->root_switch); 668 if (ret) { 669 tb_switch_put(tb->root_switch); 670 return ret; 671 } 672 673 /* Announce the switch to the world */ 674 ret = tb_switch_add(tb->root_switch); 675 if (ret) { 676 tb_switch_put(tb->root_switch); 677 return ret; 678 } 679 680 /* Full scan to discover devices added before the driver was loaded. */ 681 tb_scan_switch(tb->root_switch); 682 /* Find out tunnels created by the boot firmware */ 683 tb_discover_tunnels(tb->root_switch); 684 /* Make the discovered switches available to the userspace */ 685 device_for_each_child(&tb->root_switch->dev, NULL, 686 tb_scan_finalize_switch); 687 688 /* Allow tb_handle_hotplug to progress events */ 689 tcm->hotplug_active = true; 690 return 0; 691 } 692 693 static int tb_suspend_noirq(struct tb *tb) 694 { 695 struct tb_cm *tcm = tb_priv(tb); 696 697 tb_dbg(tb, "suspending...\n"); 698 tb_switch_suspend(tb->root_switch); 699 tcm->hotplug_active = false; /* signal tb_handle_hotplug to quit */ 700 tb_dbg(tb, "suspend finished\n"); 701 702 return 0; 703 } 704 705 static int tb_resume_noirq(struct tb *tb) 706 { 707 struct tb_cm *tcm = tb_priv(tb); 708 struct tb_tunnel *tunnel, *n; 709 710 tb_dbg(tb, "resuming...\n"); 711 712 /* remove any pci devices the firmware might have setup */ 713 tb_switch_reset(tb, 0); 714 715 tb_switch_resume(tb->root_switch); 716 tb_free_invalid_tunnels(tb); 717 tb_free_unplugged_children(tb->root_switch); 718 list_for_each_entry_safe(tunnel, n, &tcm->tunnel_list, list) 719 tb_tunnel_restart(tunnel); 720 if (!list_empty(&tcm->tunnel_list)) { 721 /* 722 * the pcie links need some time to get going. 723 * 100ms works for me... 724 */ 725 tb_dbg(tb, "tunnels restarted, sleeping for 100ms\n"); 726 msleep(100); 727 } 728 /* Allow tb_handle_hotplug to progress events */ 729 tcm->hotplug_active = true; 730 tb_dbg(tb, "resume finished\n"); 731 732 return 0; 733 } 734 735 static int tb_free_unplugged_xdomains(struct tb_switch *sw) 736 { 737 int i, ret = 0; 738 739 for (i = 1; i <= sw->config.max_port_number; i++) { 740 struct tb_port *port = &sw->ports[i]; 741 742 if (tb_is_upstream_port(port)) 743 continue; 744 if (port->xdomain && port->xdomain->is_unplugged) { 745 tb_xdomain_remove(port->xdomain); 746 port->xdomain = NULL; 747 ret++; 748 } else if (port->remote) { 749 ret += tb_free_unplugged_xdomains(port->remote->sw); 750 } 751 } 752 753 return ret; 754 } 755 756 static void tb_complete(struct tb *tb) 757 { 758 /* 759 * Release any unplugged XDomains and if there is a case where 760 * another domain is swapped in place of unplugged XDomain we 761 * need to run another rescan. 762 */ 763 mutex_lock(&tb->lock); 764 if (tb_free_unplugged_xdomains(tb->root_switch)) 765 tb_scan_switch(tb->root_switch); 766 mutex_unlock(&tb->lock); 767 } 768 769 static const struct tb_cm_ops tb_cm_ops = { 770 .start = tb_start, 771 .stop = tb_stop, 772 .suspend_noirq = tb_suspend_noirq, 773 .resume_noirq = tb_resume_noirq, 774 .complete = tb_complete, 775 .handle_event = tb_handle_event, 776 .approve_switch = tb_tunnel_pci, 777 .approve_xdomain_paths = tb_approve_xdomain_paths, 778 .disconnect_xdomain_paths = tb_disconnect_xdomain_paths, 779 }; 780 781 struct tb *tb_probe(struct tb_nhi *nhi) 782 { 783 struct tb_cm *tcm; 784 struct tb *tb; 785 786 if (!x86_apple_machine) 787 return NULL; 788 789 tb = tb_domain_alloc(nhi, sizeof(*tcm)); 790 if (!tb) 791 return NULL; 792 793 tb->security_level = TB_SECURITY_USER; 794 tb->cm_ops = &tb_cm_ops; 795 796 tcm = tb_priv(tb); 797 INIT_LIST_HEAD(&tcm->tunnel_list); 798 799 return tb; 800 } 801