Skip to content

Commit d08c30d

Browse files
committed
Revert "PCI/PM: Assume ports without DLL Link Active train links in 100 ms"
This reverts commit ec411e0. Patrick reported that this commit broke hybrid graphics on a ThinkPad X1 Extreme 2nd with Intel UHD Graphics 630 and NVIDIA GeForce GTX 1650 Mobile: nouveau 0000:01:00.0: fifo: PBDMA0: 01000000 [] ch 0 [00ff992000 DRM] subc 0 mthd 0008 data 00000000 Karol reported that this commit broke Nouveau firmware loading on a Lenovo P1G2 with Intel UHD Graphics 630 and NVIDIA TU117GLM [Quadro T1000 Mobile]: nouveau 0000:01:00.0: acr: AHESASC binary failed In both cases, reverting ec411e0 solved the problem. Unfortunately, this revert will reintroduce the "Thunderbolt bridges take long time to resume from D3cold" problem: https://bugzilla.kernel.org/show_bug.cgi?id=206837 Link: https://lore.kernel.org/r/CAErSpo5sTeK_my1dEhWp7aHD0xOp87+oHYWkTjbL7ALgDbXo-Q@mail.gmail.com Link: https://lore.kernel.org/r/CACO55tsAEa5GXw5oeJPG=mcn+qxNvspXreJYWDJGZBy5v82JDA@mail.gmail.com Link: https://bugzilla.kernel.org/show_bug.cgi?id=208597 Reported-by: Patrick Volkerding <[email protected]> Reported-by: Karol Herbst <[email protected]> Fixes: ec411e0 ("PCI/PM: Assume ports without DLL Link Active train links in 100 ms") Signed-off-by: Bjorn Helgaas <[email protected]>
1 parent 62ca18a commit d08c30d

File tree

1 file changed

+9
-21
lines changed

1 file changed

+9
-21
lines changed

drivers/pci/pci.c

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4638,8 +4638,7 @@ static int pci_pm_reset(struct pci_dev *dev, int probe)
46384638
* pcie_wait_for_link_delay - Wait until link is active or inactive
46394639
* @pdev: Bridge device
46404640
* @active: waiting for active or inactive?
4641-
* @delay: Delay to wait after link has become active (in ms). Specify %0
4642-
* for no delay.
4641+
* @delay: Delay to wait after link has become active (in ms)
46434642
*
46444643
* Use this to wait till link becomes active or inactive.
46454644
*/
@@ -4680,7 +4679,7 @@ static bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active,
46804679
msleep(10);
46814680
timeout -= 10;
46824681
}
4683-
if (active && ret && delay)
4682+
if (active && ret)
46844683
msleep(delay);
46854684
else if (ret != active)
46864685
pci_info(pdev, "Data Link Layer Link Active not %s in 1000 msec\n",
@@ -4801,28 +4800,17 @@ void pci_bridge_wait_for_secondary_bus(struct pci_dev *dev)
48014800
if (!pcie_downstream_port(dev))
48024801
return;
48034802

4804-
/*
4805-
* Per PCIe r5.0, sec 6.6.1, for downstream ports that support
4806-
* speeds > 5 GT/s, we must wait for link training to complete
4807-
* before the mandatory delay.
4808-
*
4809-
* We can only tell when link training completes via DLL Link
4810-
* Active, which is required for downstream ports that support
4811-
* speeds > 5 GT/s (sec 7.5.3.6). Unfortunately some common
4812-
* devices do not implement Link Active reporting even when it's
4813-
* required, so we'll check for that directly instead of checking
4814-
* the supported link speed. We assume devices without Link Active
4815-
* reporting can train in 100 ms regardless of speed.
4816-
*/
4817-
if (dev->link_active_reporting) {
4818-
pci_dbg(dev, "waiting for link to train\n");
4819-
if (!pcie_wait_for_link_delay(dev, true, 0)) {
4803+
if (pcie_get_speed_cap(dev) <= PCIE_SPEED_5_0GT) {
4804+
pci_dbg(dev, "waiting %d ms for downstream link\n", delay);
4805+
msleep(delay);
4806+
} else {
4807+
pci_dbg(dev, "waiting %d ms for downstream link, after activation\n",
4808+
delay);
4809+
if (!pcie_wait_for_link_delay(dev, true, delay)) {
48204810
/* Did not train, no need to wait any further */
48214811
return;
48224812
}
48234813
}
4824-
pci_dbg(child, "waiting %d ms to become accessible\n", delay);
4825-
msleep(delay);
48264814

48274815
if (!pci_device_is_present(child)) {
48284816
pci_dbg(child, "waiting additional %d ms to become accessible\n", delay);

0 commit comments

Comments
 (0)