From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f169.google.com (mail-pg1-f169.google.com [209.85.215.169]) (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 336FD2E0B5C for ; Fri, 31 Jul 2026 16:18:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.169 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785514734; cv=none; b=CcYwG1X6SvkudfO/0TXQDhBxGFe8kDc0abtx1oKX7b3anac6cTWJ24OpPqC0yMjB2MBOvCcCzRuaPjEZrJOJX96dGyx6CNGwKUr//OO+bvAP8mfZIXBKRcOxSn2zs17RxYCigsTsh0Xfncarekb4HLI9BDW2S6Q0xhYihp//Ur0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785514734; c=relaxed/simple; bh=x0XfJfYYmm0lZckHiSTrULL19u0GEKu1sJMJbH7EwyY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=QjKWH0+opKVL++TyYUq1h0NACoKSq9yxst0dtj7tdKDITtl41TaeZzVQ3PJF1/IALzhZqlGf3z1sgt3TXvx8ZFf8QzdNVpi6sGA2s1zsECAZV45FuqqOv4DO9o/TDtOY1Qk32pZmilMbERdUpg74jPDeM7MnlfBWWy/eQtU1rQ0= 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=DHNd5rsL; arc=none smtp.client-ip=209.85.215.169 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="DHNd5rsL" Received: by mail-pg1-f169.google.com with SMTP id 41be03b00d2f7-ca766c1c9ccso683441a12.0 for ; Fri, 31 Jul 2026 09:18:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785514732; x=1786119532; 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=fzIk5I7OqDCOAhpxa2DhuDUN9BeeRjYb7EQC4Ahia0I=; b=DHNd5rsLK3ZgbPHPbbPElaE2Oh3UZbKzL9BQNpigBmC5O6dKgVOzmH3U89iOFF6c53 8Ako3Sy6O8Jvp6dA2BGCfre51P0g4QT8JnOfnerKZWah7d1VRLeHHU2Fy+m9/p4BW45v 4KSrfHVlDELCRKJBSojFM5awB98feN4i/PwKH/3Jd4MXG7atEggW6NokqU9OoyOPmFlC 0zmqoe1zuxrPupnu3OvW9L61wKoFfVJBvWcZQfPEcC9enCibqtzp5C9AgndpFa3vlqD9 ShXgmrF88dCqawaBZV5i5SsAFyFxgjjIJuoUlcEYFkDAv4hkHVZC9K9runR4+WfXz1e/ fXRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785514732; x=1786119532; 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=fzIk5I7OqDCOAhpxa2DhuDUN9BeeRjYb7EQC4Ahia0I=; b=XE4PGeFXlu5w/1B2ej6HvMBHQagF99MqrQFJ7qcrikYtQk9Tmr9UiVPPZL02Ojq2Cj 56OBt/v3PId8x//ufvHZSB0Hpi64QjQws/xv/0N8ZGp2uJ96Repgf6tETM2whoGDgBOo W0kKEr0cY+SERd9hDLTNg3lKEcFg8cXIIEmSKlzH/+UXzxUVtz73NpvX4fW5/Xc0YU8T Men9nnurpw47h7FpMa2xxCtUvkAxW+OJcG+iUPu+v43FTir+m0xehzJQHxUnuwB+9r7d QzyG7XQx1HXsJquSo4DgAQ8tloBcRj9+n+3mA0veTfTkZZWIqekpv473MxFmarYCH/tp tpyQ== X-Forwarded-Encrypted: i=1; AHgh+RqidKTNY7K8hTbW7tKdnQp9mjyKaM27IB9NcN5Z6826iscPpRDVvCK1hIg8bEkuaVOd3trlcAAtd1b4WDg=@vger.kernel.org X-Gm-Message-State: AOJu0YzuRnJPFCYPjBGtSr4vjHsNeDTGxDg7Rkj16UvFA2JeHiO6Zca6 lWDqwfzfPfwgJw5gbT7KMpRqUdL+NM46suA0O7n5uXtI54OGIYO767I= X-Gm-Gg: AR+sD11daxonqjw0Uymx0P3kBpDOR2IU1/6c3jWSKPhs5b6dqJBMKSXXkHZSXJY9zSs +NgxnNfb0UURWbiOBMRHiU/BCA3B64193pfbUhp3B3vkmIJ0BvN3siB9qTIY2gWeA7yQQBvPXj/ x/1QDFIYJT/U09V8WreT5EDiO4jUke2fJ4uwiosme+lUrGI8dtjjC3OZ2Fsd3TQDh6AUgm0B5OX UYKoE4DQNGHRBjRvzD4i4AULZT90ZRw9MydlkBj27MzfHKxjwhHNx68UR8FN9I7AePa6lrKxLPp hjuisRWfRXlboGI89NvlkaMDxtAEDWYNVJ3yXt4CYLOmN684Kc1/J1MXj3/0cUUue9uqXs14ngI bHdHSsrvW7WHMZDb3+7wGhHdxUrzac58Sf3hmTveIYRJARC9EDvDJrzpgK62e3i0JD5RvFain6+ wp+6Fw2zj9OPVsnGCs/AkvhIYRmbHJQxBLuCLtUtniWvG5SXSkBMPIr7RKT8/zUTRh9+wyTBW1M WsdpQ14qHYoaZpiq7a57CpjvYts X-Received: by 2002:a05:6a21:9098:b0:3b4:e4f6:4f15 with SMTP id adf61e73a8af0-3c92a51aef2mr413430637.5.1785514732276; Fri, 31 Jul 2026 09:18:52 -0700 (PDT) Received: from at-Standard-PC-Q35-ICH9-2009.. ([106.202.118.213]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3153e18e107sm8486940eec.27.2026.07.31.09.18.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2026 09:18:51 -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 v7] thunderbolt: Add device links for Apple T2 NHI Date: Fri, 31 Jul 2026 12:18:40 -0400 Message-ID: <20260731161842.12636-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 v7: - Used pci_lock_rescan_remove to prevent race conditons. - Fixed patch format. 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 v6: https://lore.kernel.org/all/20260730223435.2874-1-atharvatiwarilinuxdev@gmail.com/ 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 | 49 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/drivers/thunderbolt/tb.c b/drivers/thunderbolt/tb.c index c69c323e6952..2534c6378000 100644 --- a/drivers/thunderbolt/tb.c +++ b/drivers/thunderbolt/tb.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -3305,16 +3306,62 @@ 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; + + 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; + } + 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