Skip to content

Commit df27c03

Browse files
committed
PCI: meson: Report that link is up while in ASPM L0s and L1 states
Previously meson_pcie_link_up() only returned true if the link was in the L0 state. This was incorrect because hardware autonomously manages transitions between L0, L0s, and L1 while both components on the link stay in D0. Those states should all be treated as "link is active". Returning false when the device was in L0s or L1 broke config accesses because dw_pcie_other_conf_map_bus() fails if the link is down, which caused errors like this: meson-pcie fc000000.pcie: error: wait linkup timeout pci 0000:01:00.0: BAR 0: error updating (0xfc700004 != 0xffffffff) Remove the LTSSM state check, timeout, speed check, and error message from meson_pcie_link_up(), the dw_pcie_ops.link_up() method, so it is a simple boolean check of whether the link is active. Timeouts and error messages are handled at a higher level, e.g., dw_pcie_wait_for_link(). Fixes: 9c0ef6d ("PCI: amlogic: Add the Amlogic Meson PCIe controller driver") Reported-by: Linnaea Lavia <linnaea-von-lavia@live.com> Closes: https://lore.kernel.org/r/DM4PR05MB102707B8CDF84D776C39F22F2C7F0A@DM4PR05MB10270.namprd05.prod.outlook.com [bhelgaas: squash removal of unused WAIT_LINKUP_TIMEOUT by Martin Blumenstingl <martin.blumenstingl@googlemail.com>: https://patch.msgid.link/20260105125625.239497-1-martin.blumenstingl@googlemail.com] Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Tested-by: Linnaea Lavia <linnaea-von-lavia@live.com> Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on BananaPi M2S Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20251103221930.1831376-1-helgaas@kernel.org Link: https://patch.msgid.link/20260105125625.239497-1-martin.blumenstingl@googlemail.com
1 parent 0cc1325 commit df27c03

1 file changed

Lines changed: 4 additions & 35 deletions

File tree

drivers/pci/controller/dwc/pci-meson.c

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
#define PCIE_CFG_STATUS17 0x44
3838
#define PM_CURRENT_STATE(x) (((x) >> 7) & 0x1)
3939

40-
#define WAIT_LINKUP_TIMEOUT 4000
4140
#define PORT_CLK_RATE 100000000UL
4241
#define MAX_PAYLOAD_SIZE 256
4342
#define MAX_READ_REQ_SIZE 256
@@ -350,40 +349,10 @@ static struct pci_ops meson_pci_ops = {
350349
static bool meson_pcie_link_up(struct dw_pcie *pci)
351350
{
352351
struct meson_pcie *mp = to_meson_pcie(pci);
353-
struct device *dev = pci->dev;
354-
u32 speed_okay = 0;
355-
u32 cnt = 0;
356-
u32 state12, state17, smlh_up, ltssm_up, rdlh_up;
357-
358-
do {
359-
state12 = meson_cfg_readl(mp, PCIE_CFG_STATUS12);
360-
state17 = meson_cfg_readl(mp, PCIE_CFG_STATUS17);
361-
smlh_up = IS_SMLH_LINK_UP(state12);
362-
rdlh_up = IS_RDLH_LINK_UP(state12);
363-
ltssm_up = IS_LTSSM_UP(state12);
364-
365-
if (PM_CURRENT_STATE(state17) < PCIE_GEN3)
366-
speed_okay = 1;
367-
368-
if (smlh_up)
369-
dev_dbg(dev, "smlh_link_up is on\n");
370-
if (rdlh_up)
371-
dev_dbg(dev, "rdlh_link_up is on\n");
372-
if (ltssm_up)
373-
dev_dbg(dev, "ltssm_up is on\n");
374-
if (speed_okay)
375-
dev_dbg(dev, "speed_okay\n");
376-
377-
if (smlh_up && rdlh_up && ltssm_up && speed_okay)
378-
return true;
379-
380-
cnt++;
381-
382-
udelay(10);
383-
} while (cnt < WAIT_LINKUP_TIMEOUT);
384-
385-
dev_err(dev, "error: wait linkup timeout\n");
386-
return false;
352+
u32 state12;
353+
354+
state12 = meson_cfg_readl(mp, PCIE_CFG_STATUS12);
355+
return IS_SMLH_LINK_UP(state12) && IS_RDLH_LINK_UP(state12);
387356
}
388357

389358
static int meson_pcie_host_init(struct dw_pcie_rp *pp)

0 commit comments

Comments
 (0)