1
2
3
4
5
6
7
8
9#include <linux/acpi.h>
10
11#include "tb.h"
12
13static acpi_status tb_acpi_add_link(acpi_handle handle, u32 level, void *data,
14 void **return_value)
15{
16 struct fwnode_reference_args args;
17 struct fwnode_handle *fwnode;
18 struct tb_nhi *nhi = data;
19 struct acpi_device *adev;
20 struct pci_dev *pdev;
21 struct device *dev;
22 int ret;
23
24 if (acpi_bus_get_device(handle, &adev))
25 return AE_OK;
26
27 fwnode = acpi_fwnode_handle(adev);
28 ret = fwnode_property_get_reference_args(fwnode, "usb4-host-interface",
29 NULL, 0, 0, &args);
30 if (ret)
31 return AE_OK;
32
33
34 if (nhi->pdev->dev.fwnode != args.fwnode)
35 goto out_put;
36
37
38
39
40
41
42 dev = acpi_get_first_physical_node(adev);
43 while (!dev) {
44 adev = adev->parent;
45 if (!adev)
46 break;
47 dev = acpi_get_first_physical_node(adev);
48 }
49
50 if (!dev)
51 goto out_put;
52
53
54
55
56
57
58
59 while (!dev_is_pci(dev))
60 dev = dev->parent;
61
62 if (!dev)
63 goto out_put;
64
65
66
67
68
69
70 pdev = to_pci_dev(dev);
71 if (pdev->class == PCI_CLASS_SERIAL_USB_XHCI ||
72 (pci_is_pcie(pdev) &&
73 (pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT ||
74 pci_pcie_type(pdev) == PCI_EXP_TYPE_DOWNSTREAM))) {
75 const struct device_link *link;
76
77 link = device_link_add(&pdev->dev, &nhi->pdev->dev,
78 DL_FLAG_AUTOREMOVE_SUPPLIER |
79 DL_FLAG_PM_RUNTIME);
80 if (link) {
81 dev_dbg(&nhi->pdev->dev, "created link from %s\n",
82 dev_name(&pdev->dev));
83 } else {
84 dev_warn(&nhi->pdev->dev, "device link creation from %s failed\n",
85 dev_name(&pdev->dev));
86 }
87 }
88
89out_put:
90 fwnode_handle_put(args.fwnode);
91 return AE_OK;
92}
93
94
95
96
97
98
99
100
101
102void tb_acpi_add_links(struct tb_nhi *nhi)
103{
104 acpi_status status;
105
106 if (!has_acpi_companion(&nhi->pdev->dev))
107 return;
108
109
110
111
112
113 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 32,
114 tb_acpi_add_link, NULL, nhi, NULL);
115 if (ACPI_FAILURE(status))
116 dev_warn(&nhi->pdev->dev, "failed to enumerate tunneled ports\n");
117}
118