From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 32FB51D5CFE for ; Thu, 30 Jul 2026 22:34:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.178 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785450896; cv=none; b=jCWi4hufoRplqyURcBG1JOiz8fByfFWpyueALqrBmraUDzyCoNGMxtFRC1+rwWCWrrY+JLisTqhnZT8//EAV/3zHncSNvQg+s1iZIdd6gnfCWywJxqd97elorirGSKTo1Zmn57vQBoV+1Oa6n6ezNOVnvXpXF0hJ9IE1xcPYvl0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785450896; c=relaxed/simple; bh=fX+6pkMX/W45v5AWJzh/xbfzKLl70LphLmyCsByYtYw=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=q1YW+lc5tujoyZgdSJ90aoOjHPyP4B607N1FjXQji8tz0755ia7TulwpLla0ELPBmS47gnm7U7LpRlKdVaF+bRdy01zBy+hS4ZeXJrOCaw/JOZrLTgGvIGQd4ScpMx7kwhY/z8ncLGHPHUiw7LIZ3nf7+StNXteTf41FaHzt27A= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=kjuBGepS; arc=none smtp.client-ip=209.85.215.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kjuBGepS" Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-c9ef3e1337fso223274a12.2 for ; Thu, 30 Jul 2026 15:34:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785450894; x=1786055694; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=Kmlw9fyosGZdf2BNWt4ws0mLj8YjVKrdloEGzRsMNAk=; b=kjuBGepSIs6f7w04cF2YWo4RRxz+fGsJEnr6/o6pGxBIO4eZHWqbkvT1wUsee5dHfX 8fhSwDkwfsfZtQGv6gizpOSJ4+HVtfE0ooQJdHul/g34BgecFN1gIRHS53AN5v1QWPEO I3VtmkTzlHSxRu3BDCHuwET6Nnzvrzxd2Pf4rBmWNr5HFctc121fZQXP4q6LlZvCugh9 p2PwVH7g/eeVg4V3P99If2whUthws0qsr1nil5wUbVWFrlhZB14vPW9jjCroewEt0JVb 2avhGzZ6YcnvesgK7S5j55i2ZZgSE/ZGs3dm7SVK3/7lsmW0DH/6nibGtS/1AFlGIT+8 oEMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785450894; x=1786055694; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Kmlw9fyosGZdf2BNWt4ws0mLj8YjVKrdloEGzRsMNAk=; b=U35xPOniQDXVft2V6/WMXDuqBItR/mPNtPFFZ/+RJvS7vuAFjVYfqWT5gxeHDPRond zUC1t9PDCdmAQgSyJLZiiuH4IfpTXwCuePFC+q9toZf/0zjIRPArYKMfaSVOry4FTT/R od81lV2Y13npHu9SVvv9PmU9wsEFu6FZm0KFYFwvy3bm6vQ9u5bB48RUUW2dCKh7JYbG zjAlfY+Cam5LhX35JmZLZ7ETp9vQoKzacgf4fBk3qj8+R3hFT9E7/G2OJp3vpSH5YSy6 8S4Mu+5as9TtfxDzA7QIrgpV8UiOkv45ccPY2S1wDaD56NM4XdTJhxZTWj83U7QaD1+f y1zQ== X-Forwarded-Encrypted: i=1; AHgh+Rp3bV7q/0BfxyfroUgx6atRn1onpgUZoAQcXQaZpQhx4AXY4l2d6lv+DTjajv2wq3WnAqZOdmNneGJDW3k=@vger.kernel.org X-Gm-Message-State: AOJu0YzEd0OI9o2cb/sGnkeBbFHzqs5KzGggzbF0EHtkwMwjXSLJggy1 QcTAkRg1S2ShtTN5yKfkYdA+JLEVgpQ3PplJMp0s4O2Fy2Uoc1ZWMhM= X-Gm-Gg: AR+sD12q+qVJh5CpUv9lEn07Ui3qSsfc49ITubxPyzj7CWBzLi78V+5k6sM+dHfBkQB T+ftygnP3TA7AzauM+SwNEP0Tt+fWBN9jYKYnIE83ppPHDrYDaB/IQEPd/rVqKIRYI8UjmbAHPj 2/nLPtvvW9nlkUFpE8tDjXP7EfvfKLo0lNegSrSWCiI88UfqmfFQAyliy+YApi4VE6ZX2lgKcrX GsbNR4dpbcFUDPvI7QMVz9pCGziPtoVf3r8Hec+2Sn1GYYkqO0UZcf1+VLO9ABZdShoqxxidHKC CBb0ERERsflfolU7eOoD/pQn5WXRjw1377Z3/Qa6jYd6DaPD1rWpaAG5B4mDPZJom1Mfo9OF5n/ CZhyIUjyKTcj1zq01wlcBvyWu943XeucENngD5mtxr0nKkxCwFu0VW9GW9PBcrbVhfUV+eZJoIt 4AKy71FhSVFO7DOYfdjKnYGPwtD34TCLFIovAC8Vh8e5Zi7C76YIeP/yIQXQUWQGz5SgZPW/jWs 9lP55ElgFx2zMYpg8Do8cdu2Xs= X-Received: by 2002:a05:6a21:3391:b0:3c4:397a:69b8 with SMTP id adf61e73a8af0-3c90d425340mr2161402637.21.1785450894427; Thu, 30 Jul 2026 15:34:54 -0700 (PDT) Received: from at-Standard-PC-Q35-ICH9-2009.. ([106.221.78.187]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-31504cc6936sm23692181eec.17.2026.07.30.15.34.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 15:34:53 -0700 (PDT) From: Atharva Tiwari To: Cc: Atharva Tiwari , Andre Eikmeyer , Andreas Noever , Mika Westerberg , Yehezkel Bernat , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v6] thunderbolt: Add device links for Apple T2 NHI Date: Thu, 30 Jul 2026 18:34:33 -0400 Message-ID: <20260730223435.2874-1-atharvatiwarilinuxdev@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Ice Lake Thunderbolt NHI That are only on T2 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. And on other Thunderbolt NHI's, like Titan Ridge, the default method is used to add device links. Co-developed-by: Andre Eikmeyer Signed-off-by: Andre Eikmeyer Signed-off-by: Atharva Tiwari Changes in v6: - Used for_each_pci_bridge in Icelake section - Removed has_apple_t2_chip as its not required now Changes in v5: - Used Icelake root PCI IDs for detection of root ports instead of TRP Changes in v4: - Limited TRP check to T2 Icelake systems only - Optimized has_apple_t2_chip check - Included pci.h to drivers/thunderbolt/tb.c - Used __free(pci_dev_put) to avoid label Changes in v3: - Fix build errors with non-x86 machines - Used __initconst for apple_t2_devices - Removed UEFI_QUIRK_SKIP_CERT as its unused now - Used IS_ENABLED(CONFIG_ACPI) in tb_apple_add_links for the T2 part - Removed !bid check to remove warning with -Waddress Changes in v2: - Used a less generic name for has_t2_chip - Used DMI instead of PCI for has_apple_t2_chip to avoid PCI problems - Initialized ret in tb_apple_add_links Link to v5: https://lore.kernel.org/all/20260727211807.1223-1-atharvatiwarilinuxdev@gmail.com/ Link to v4: https://lore.kernel.org/all/20260724164641.2239-1-atharvatiwarilinuxdev@gmail.com/ Link to v3: https://lore.kernel.org/all/20260721063412.11588-1-atharvatiwarilinuxdev@gmail.com/ Link to v2: https://lore.kernel.org/all/20260721054506.11871-1-atharvatiwarilinuxdev@gmail.com/ Link to v1: https://lore.kernel.org/all/20260719180308.1398-1-atharvatiwarilinuxdev@gmail.com/ --- drivers/thunderbolt/tb.c | 44 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/drivers/thunderbolt/tb.c b/drivers/thunderbolt/tb.c index c69c323e6952..d6efc822ebd5 100644 --- a/drivers/thunderbolt/tb.c +++ b/drivers/thunderbolt/tb.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -3305,16 +3306,57 @@ static const struct tb_cm_ops tb_cm_ops = { static bool tb_apple_add_links(struct tb_nhi *nhi) { struct pci_dev *upstream, *pdev; - bool ret; + bool ret = false; if (!x86_apple_machine) return false; + /* Identify the tunneled PCIe Root Ports by their PCI IDs + * on Macs with Icelake NHI's + * and create device links so that + * PCIe tunnels can be re-established after sleep. + */ + if (nhi->pdev->device == PCI_DEVICE_ID_INTEL_ICL_NHI0 || + nhi->pdev->device == PCI_DEVICE_ID_INTEL_ICL_NHI1) { + const struct device_link *link; + + 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) { + case 0x8a1d: + case 0x8a1f: + case 0x8a21: + case 0x8a23: + break; + default: + continue; + } + + link = device_link_add(¤t_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(¤t_pdev->dev)); + ret = true; + } else { + dev_warn(&nhi->pdev->dev, + "device link creation from %s failed\n", + dev_name(¤t_pdev->dev)); + } + } + return ret; + } + switch (nhi->pdev->device) { case PCI_DEVICE_ID_INTEL_LIGHT_RIDGE: case PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C: case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_NHI: case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_NHI: + case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_NHI: + case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_NHI: break; default: return false; -- 2.43.0