Skip to content

Commit 8626b64

Browse files
Manikanta Maddireddygregkh
authored andcommitted
PCI: tegra194: Increase LTSSM poll time on surprise link down
[ Upstream commit 74dd8ef ] On surprise link down, LTSSM state transits from L0 -> Recovery.RcvrLock -> Recovery.RcvrSpeed -> Gen1 Recovery.RcvrLock -> Detect. Recovery.RcvrLock and Recovery.RcvrSpeed transit times are 24 ms and 48 ms respectively, so the total time from L0 to Detect is ~96 ms. Increase the poll timeout to 120 ms to account for this. While at it, add LTSSM state defines for Detect-related states and use them in the poll condition. Use readl_poll_timeout() instead of readl_poll_timeout_atomic() in tegra_pcie_dw_pme_turnoff() since that path runs in non-atomic context. Fixes: 56e15a2 ("PCI: tegra: Add Tegra194 PCIe support") Signed-off-by: Vidya Sagar <vidyas@nvidia.com> Signed-off-by: Manikanta Maddireddy <mmaddireddy@nvidia.com> Signed-off-by: Manivannan Sadhasivam <mani@kernel.org> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Reviewed-by: Jon Hunter <jonathanh@nvidia.com> Link: https://patch.msgid.link/20260324190755.1094879-3-mmaddireddy@nvidia.com Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent f38e0c5 commit 8626b64

1 file changed

Lines changed: 21 additions & 15 deletions

File tree

drivers/pci/controller/dwc/pcie-tegra194.c

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@
137137
#define APPL_DEBUG_PM_LINKST_IN_L0 0x11
138138
#define APPL_DEBUG_LTSSM_STATE_MASK GENMASK(8, 3)
139139
#define APPL_DEBUG_LTSSM_STATE_SHIFT 3
140-
#define LTSSM_STATE_PRE_DETECT 5
140+
#define LTSSM_STATE_DETECT_QUIET 0x00
141+
#define LTSSM_STATE_DETECT_ACT 0x08
142+
#define LTSSM_STATE_PRE_DETECT_QUIET 0x28
143+
#define LTSSM_STATE_DETECT_WAIT 0x30
144+
#define LTSSM_STATE_L2_IDLE 0xa8
141145

142146
#define APPL_RADM_STATUS 0xE4
143147
#define APPL_PM_XMT_TURNOFF_STATE BIT(0)
@@ -198,7 +202,8 @@
198202
#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_MASK GENMASK(11, 8)
199203
#define CAP_SPCIE_CAP_OFF_USP_TX_PRESET0_SHIFT 8
200204

201-
#define LTSSM_TIMEOUT 50000 /* 50ms */
205+
#define LTSSM_DELAY_US 10000 /* 10 ms */
206+
#define LTSSM_TIMEOUT_US 120000 /* 120 ms */
202207

203208
#define GEN3_GEN4_EQ_PRESET_INIT 5
204209

@@ -1626,15 +1631,14 @@ static void tegra_pcie_dw_pme_turnoff(struct tegra_pcie_dw *pcie)
16261631
data &= ~APPL_CTRL_LTSSM_EN;
16271632
writel(data, pcie->appl_base + APPL_CTRL);
16281633

1629-
err = readl_poll_timeout_atomic(pcie->appl_base + APPL_DEBUG,
1630-
data,
1631-
((data &
1632-
APPL_DEBUG_LTSSM_STATE_MASK) >>
1633-
APPL_DEBUG_LTSSM_STATE_SHIFT) ==
1634-
LTSSM_STATE_PRE_DETECT,
1635-
1, LTSSM_TIMEOUT);
1634+
err = readl_poll_timeout(pcie->appl_base + APPL_DEBUG, data,
1635+
((data & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_DETECT_QUIET) ||
1636+
((data & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_DETECT_ACT) ||
1637+
((data & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_PRE_DETECT_QUIET) ||
1638+
((data & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_DETECT_WAIT),
1639+
LTSSM_DELAY_US, LTSSM_TIMEOUT_US);
16361640
if (err)
1637-
dev_info(pcie->dev, "Link didn't go to detect state\n");
1641+
dev_info(pcie->dev, "LTSSM state: 0x%x detect timeout: %d\n", data, err);
16381642
}
16391643
/*
16401644
* DBI registers may not be accessible after this as PLL-E would be
@@ -1714,12 +1718,14 @@ static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie)
17141718
appl_writel(pcie, val, APPL_CTRL);
17151719

17161720
ret = readl_poll_timeout(pcie->appl_base + APPL_DEBUG, val,
1717-
((val & APPL_DEBUG_LTSSM_STATE_MASK) >>
1718-
APPL_DEBUG_LTSSM_STATE_SHIFT) ==
1719-
LTSSM_STATE_PRE_DETECT,
1720-
1, LTSSM_TIMEOUT);
1721+
((val & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_DETECT_QUIET) ||
1722+
((val & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_DETECT_ACT) ||
1723+
((val & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_PRE_DETECT_QUIET) ||
1724+
((val & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_DETECT_WAIT) ||
1725+
((val & APPL_DEBUG_LTSSM_STATE_MASK) == LTSSM_STATE_L2_IDLE),
1726+
LTSSM_DELAY_US, LTSSM_TIMEOUT_US);
17211727
if (ret)
1722-
dev_err(pcie->dev, "Failed to go Detect state: %d\n", ret);
1728+
dev_info(pcie->dev, "LTSSM state: 0x%x detect timeout: %d\n", val, ret);
17231729

17241730
reset_control_assert(pcie->core_rst);
17251731

0 commit comments

Comments
 (0)