[PATCH v8 3/3] thunderbolt: Add device links for Apple systems with Icelake thunderbolt
From: Atharva Tiwari
Date: Mon Aug 17 2026 - 06:14:26 EST
Ice Lake Thunderbolt NHI That are on some Macs. The NHI and its
associated PCIe Root Ports all sit directly on the Root Complex
with no upstream port. Identify the tunneled PCIe Root Ports by
their PCI IDs and create device links back to the NHI so that
PCIe tunnels can be re-established after sleep.
Tested-by: Alexander Fischer <alexander.fischer@xxxxxxxxxxx>
Co-developed-by: Andre Eikmeyer <andre@xxxxxxxxxxxxx>
Signed-off-by: Andre Eikmeyer <andre@xxxxxxxxxxxxx>
Signed-off-by: Atharva Tiwari <atharvatiwarilinuxdev@xxxxxxxxx>
---
drivers/thunderbolt/pci.c | 44 +++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/drivers/thunderbolt/pci.c b/drivers/thunderbolt/pci.c
index af3a7a9ba..8c0e40fb9 100644
--- a/drivers/thunderbolt/pci.c
+++ b/drivers/thunderbolt/pci.c
@@ -492,6 +492,47 @@ static const struct tb_nhi_ops icl_nhi_ops = {
.init_interrupts = nhi_pci_init_msi,
};
+static bool tb_pci_add_links_icl(struct pci_dev *nhi_pdev)
+{
+ struct pci_dev *pdev;
+ const struct device_link *link;
+ bool ret = false;
+
+ pci_lock_rescan_remove();
+ for_each_pci_bridge(pdev, nhi_pdev->bus) {
+ if (!pci_is_pcie(pdev) ||
+ pci_pcie_type(pdev) != PCI_EXP_TYPE_ROOT_PORT)
+ continue;
+
+ switch (pdev->device) {
+ /* Ice Lake Thunderbolt 3 PCIe Root Ports */
+ case 0x8a1d:
+ case 0x8a1f:
+ case 0x8a21:
+ case 0x8a23:
+ break;
+ default:
+ continue;
+ }
+
+ link = device_link_add(&pdev->dev, &nhi_pdev->dev,
+ DL_FLAG_AUTOREMOVE_SUPPLIER |
+ DL_FLAG_PM_RUNTIME);
+ if (link) {
+ dev_dbg(&nhi_pdev->dev, "created link from %s\n",
+ dev_name(&pdev->dev));
+ ret = true;
+ } else {
+ dev_warn(&nhi_pdev->dev,
+ "device link creation from %s failed\n",
+ dev_name(&pdev->dev));
+ }
+ }
+ pci_unlock_rescan_remove();
+
+ return ret;
+}
+
/*
* During suspend the Thunderbolt controller is reset and all PCIe
* tunnels are lost. The NHI driver will try to reestablish all tunnels
@@ -514,6 +555,9 @@ bool tb_pci_add_links(struct tb_nhi *nhi)
case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_NHI:
case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_NHI:
return tb_pci_add_links_discrete(nhi_pdev);
+ case PCI_DEVICE_ID_INTEL_ICL_NHI0:
+ case PCI_DEVICE_ID_INTEL_ICL_NHI1:
+ return tb_pci_add_links_icl(nhi_pdev);
default:
return false;
}
--
2.43.0