public inbox for linux-pci@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check
@ 2025-11-03 22:19 Bjorn Helgaas
  2025-11-10 11:04 ` Neil Armstrong
  2025-12-18  6:06 ` Manivannan Sadhasivam
  0 siblings, 2 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2025-11-03 22:19 UTC (permalink / raw)
  To: Yue Wang, Neil Armstrong, Kevin Hilman
  Cc: Jerome Brunet, Martin Blumenstingl, Linnaea Lavia, FUKAUMI Naoki,
	Krishna Chaitanya Chundru, linux-amlogic, linux-arm-kernel,
	linux-pci, linux-kernel, Bjorn Helgaas, stable

From: Bjorn Helgaas <bhelgaas@google.com>

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 and error
messages are handled at a higher level, e.g., dw_pcie_wait_for_link().

Fixes: 9c0ef6d34fdb ("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
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Linnaea Lavia <linnaea-von-lavia@live.com>
Cc: stable@vger.kernel.org
---
 drivers/pci/controller/dwc/pci-meson.c | 36 +++-----------------------
 1 file changed, 3 insertions(+), 33 deletions(-)

diff --git a/drivers/pci/controller/dwc/pci-meson.c b/drivers/pci/controller/dwc/pci-meson.c
index 787469d1b396..13685d89227a 100644
--- a/drivers/pci/controller/dwc/pci-meson.c
+++ b/drivers/pci/controller/dwc/pci-meson.c
@@ -338,40 +338,10 @@ static struct pci_ops meson_pci_ops = {
 static bool meson_pcie_link_up(struct dw_pcie *pci)
 {
 	struct meson_pcie *mp = to_meson_pcie(pci);
-	struct device *dev = pci->dev;
-	u32 speed_okay = 0;
-	u32 cnt = 0;
-	u32 state12, state17, smlh_up, ltssm_up, rdlh_up;
+	u32 state12;
 
-	do {
-		state12 = meson_cfg_readl(mp, PCIE_CFG_STATUS12);
-		state17 = meson_cfg_readl(mp, PCIE_CFG_STATUS17);
-		smlh_up = IS_SMLH_LINK_UP(state12);
-		rdlh_up = IS_RDLH_LINK_UP(state12);
-		ltssm_up = IS_LTSSM_UP(state12);
-
-		if (PM_CURRENT_STATE(state17) < PCIE_GEN3)
-			speed_okay = 1;
-
-		if (smlh_up)
-			dev_dbg(dev, "smlh_link_up is on\n");
-		if (rdlh_up)
-			dev_dbg(dev, "rdlh_link_up is on\n");
-		if (ltssm_up)
-			dev_dbg(dev, "ltssm_up is on\n");
-		if (speed_okay)
-			dev_dbg(dev, "speed_okay\n");
-
-		if (smlh_up && rdlh_up && ltssm_up && speed_okay)
-			return true;
-
-		cnt++;
-
-		udelay(10);
-	} while (cnt < WAIT_LINKUP_TIMEOUT);
-
-	dev_err(dev, "error: wait linkup timeout\n");
-	return false;
+	state12 = meson_cfg_readl(mp, PCIE_CFG_STATUS12);
+	return IS_SMLH_LINK_UP(state12) && IS_RDLH_LINK_UP(state12);
 }
 
 static int meson_pcie_host_init(struct dw_pcie_rp *pp)
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check
  2025-11-03 22:19 [PATCH] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check Bjorn Helgaas
@ 2025-11-10 11:04 ` Neil Armstrong
  2025-12-18  6:06 ` Manivannan Sadhasivam
  1 sibling, 0 replies; 6+ messages in thread
From: Neil Armstrong @ 2025-11-10 11:04 UTC (permalink / raw)
  To: Bjorn Helgaas, Yue Wang, Kevin Hilman
  Cc: Jerome Brunet, Martin Blumenstingl, Linnaea Lavia, FUKAUMI Naoki,
	Krishna Chaitanya Chundru, linux-amlogic, linux-arm-kernel,
	linux-pci, linux-kernel, Bjorn Helgaas, stable

On 11/3/25 23:19, Bjorn Helgaas wrote:
> From: Bjorn Helgaas <bhelgaas@google.com>
> 
> 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 and error
> messages are handled at a higher level, e.g., dw_pcie_wait_for_link().
> 
> Fixes: 9c0ef6d34fdb ("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
> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> Tested-by: Linnaea Lavia <linnaea-von-lavia@live.com>
> Cc: stable@vger.kernel.org
> ---
>   drivers/pci/controller/dwc/pci-meson.c | 36 +++-----------------------
>   1 file changed, 3 insertions(+), 33 deletions(-)
> 
> diff --git a/drivers/pci/controller/dwc/pci-meson.c b/drivers/pci/controller/dwc/pci-meson.c
> index 787469d1b396..13685d89227a 100644
> --- a/drivers/pci/controller/dwc/pci-meson.c
> +++ b/drivers/pci/controller/dwc/pci-meson.c
> @@ -338,40 +338,10 @@ static struct pci_ops meson_pci_ops = {
>   static bool meson_pcie_link_up(struct dw_pcie *pci)
>   {
>   	struct meson_pcie *mp = to_meson_pcie(pci);
> -	struct device *dev = pci->dev;
> -	u32 speed_okay = 0;
> -	u32 cnt = 0;
> -	u32 state12, state17, smlh_up, ltssm_up, rdlh_up;
> +	u32 state12;
>   
> -	do {
> -		state12 = meson_cfg_readl(mp, PCIE_CFG_STATUS12);
> -		state17 = meson_cfg_readl(mp, PCIE_CFG_STATUS17);
> -		smlh_up = IS_SMLH_LINK_UP(state12);
> -		rdlh_up = IS_RDLH_LINK_UP(state12);
> -		ltssm_up = IS_LTSSM_UP(state12);
> -
> -		if (PM_CURRENT_STATE(state17) < PCIE_GEN3)
> -			speed_okay = 1;
> -
> -		if (smlh_up)
> -			dev_dbg(dev, "smlh_link_up is on\n");
> -		if (rdlh_up)
> -			dev_dbg(dev, "rdlh_link_up is on\n");
> -		if (ltssm_up)
> -			dev_dbg(dev, "ltssm_up is on\n");
> -		if (speed_okay)
> -			dev_dbg(dev, "speed_okay\n");
> -
> -		if (smlh_up && rdlh_up && ltssm_up && speed_okay)
> -			return true;
> -
> -		cnt++;
> -
> -		udelay(10);
> -	} while (cnt < WAIT_LINKUP_TIMEOUT);
> -
> -	dev_err(dev, "error: wait linkup timeout\n");
> -	return false;
> +	state12 = meson_cfg_readl(mp, PCIE_CFG_STATUS12);
> +	return IS_SMLH_LINK_UP(state12) && IS_RDLH_LINK_UP(state12);
>   }
>   
>   static int meson_pcie_host_init(struct dw_pcie_rp *pp)

Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on BananaPi M2S

Thanks !

Neil


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check
  2025-11-03 22:19 [PATCH] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check Bjorn Helgaas
  2025-11-10 11:04 ` Neil Armstrong
@ 2025-12-18  6:06 ` Manivannan Sadhasivam
  2026-01-05 16:49   ` Martin Blumenstingl
  1 sibling, 1 reply; 6+ messages in thread
From: Manivannan Sadhasivam @ 2025-12-18  6:06 UTC (permalink / raw)
  To: Yue Wang, Neil Armstrong, Kevin Hilman, Bjorn Helgaas
  Cc: Jerome Brunet, Martin Blumenstingl, Linnaea Lavia, FUKAUMI Naoki,
	Krishna Chaitanya Chundru, linux-amlogic, linux-arm-kernel,
	linux-pci, linux-kernel, Bjorn Helgaas, stable


On Mon, 03 Nov 2025 16:19:26 -0600, Bjorn Helgaas wrote:
> 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:
> 
> [...]

Applied, thanks!

[1/1] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check
      commit: 11647fc772e977c981259a63c4a2b7e2c312ea22

Best regards,
-- 
Manivannan Sadhasivam <mani@kernel.org>


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check
  2025-12-18  6:06 ` Manivannan Sadhasivam
@ 2026-01-05 16:49   ` Martin Blumenstingl
  2026-01-05 17:15     ` Manivannan Sadhasivam
  2026-01-05 17:25     ` Bjorn Helgaas
  0 siblings, 2 replies; 6+ messages in thread
From: Martin Blumenstingl @ 2026-01-05 16:49 UTC (permalink / raw)
  To: Manivannan Sadhasivam
  Cc: Yue Wang, Neil Armstrong, Kevin Hilman, Bjorn Helgaas,
	Jerome Brunet, Linnaea Lavia, FUKAUMI Naoki,
	Krishna Chaitanya Chundru, linux-amlogic, linux-arm-kernel,
	linux-pci, linux-kernel, Bjorn Helgaas, stable, Ricardo Pardini

Hi Mani,

On Thu, Dec 18, 2025 at 7:06 AM Manivannan Sadhasivam
<manivannan.sadhasivam@oss.qualcomm.com> wrote:
>
>
> On Mon, 03 Nov 2025 16:19:26 -0600, Bjorn Helgaas wrote:
> > 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:
> >
> > [...]
>
> Applied, thanks!
>
> [1/1] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check
>       commit: 11647fc772e977c981259a63c4a2b7e2c312ea22
My understanding is that this is queued for -next.
Ricardo (Cc'ed) reported that this patch fixes PCI link up on his Odroid-HC4.
Is there a chance to get this patch into -fixes, so it can be pulled
by Linus for one of the next -rc?


Best regards,
Martin

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check
  2026-01-05 16:49   ` Martin Blumenstingl
@ 2026-01-05 17:15     ` Manivannan Sadhasivam
  2026-01-05 17:25     ` Bjorn Helgaas
  1 sibling, 0 replies; 6+ messages in thread
From: Manivannan Sadhasivam @ 2026-01-05 17:15 UTC (permalink / raw)
  To: Martin Blumenstingl, Bjorn Helgaas
  Cc: Yue Wang, Neil Armstrong, Kevin Hilman, Jerome Brunet,
	Linnaea Lavia, FUKAUMI Naoki, Krishna Chaitanya Chundru,
	linux-amlogic, linux-arm-kernel, linux-pci, linux-kernel,
	Bjorn Helgaas, stable, Ricardo Pardini

On Mon, Jan 05, 2026 at 05:49:00PM +0100, Martin Blumenstingl wrote:
> Hi Mani,
> 
> On Thu, Dec 18, 2025 at 7:06 AM Manivannan Sadhasivam
> <manivannan.sadhasivam@oss.qualcomm.com> wrote:
> >
> >
> > On Mon, 03 Nov 2025 16:19:26 -0600, Bjorn Helgaas wrote:
> > > 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:
> > >
> > > [...]
> >
> > Applied, thanks!
> >
> > [1/1] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check
> >       commit: 11647fc772e977c981259a63c4a2b7e2c312ea22
> My understanding is that this is queued for -next.
> Ricardo (Cc'ed) reported that this patch fixes PCI link up on his Odroid-HC4.
> Is there a chance to get this patch into -fixes, so it can be pulled
> by Linus for one of the next -rc?
> 

Hmm, I looked at the Fixes tag and mistakenly assumed that the issue existed
from the beginning.

Bjorn, could you please include this patch in the next fixes PR?

- Mani

-- 
மணிவண்ணன் சதாசிவம்

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check
  2026-01-05 16:49   ` Martin Blumenstingl
  2026-01-05 17:15     ` Manivannan Sadhasivam
@ 2026-01-05 17:25     ` Bjorn Helgaas
  1 sibling, 0 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2026-01-05 17:25 UTC (permalink / raw)
  To: Martin Blumenstingl
  Cc: Manivannan Sadhasivam, Yue Wang, Neil Armstrong, Kevin Hilman,
	Jerome Brunet, Linnaea Lavia, FUKAUMI Naoki,
	Krishna Chaitanya Chundru, linux-amlogic, linux-arm-kernel,
	linux-pci, linux-kernel, Bjorn Helgaas, stable, Ricardo Pardini

On Mon, Jan 05, 2026 at 05:49:00PM +0100, Martin Blumenstingl wrote:
> On Thu, Dec 18, 2025 at 7:06 AM Manivannan Sadhasivam
> <manivannan.sadhasivam@oss.qualcomm.com> wrote:
> >
> >
> > On Mon, 03 Nov 2025 16:19:26 -0600, Bjorn Helgaas wrote:
> > > 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:
> > >
> > > [...]
> >
> > Applied, thanks!
> >
> > [1/1] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check
> >       commit: 11647fc772e977c981259a63c4a2b7e2c312ea22
>
> My understanding is that this is queued for -next.
>
> Ricardo (Cc'ed) reported that this patch fixes PCI link up on his
> Odroid-HC4.  Is there a chance to get this patch into -fixes, so it
> can be pulled by Linus for one of the next -rc?

The Fixes tag is for 9c0ef6d34fdb ("PCI: amlogic: Add the Amlogic
Meson PCIe controller driver"), which appeared in v5.0 in 2019, so it
was a latent issue since then.  v5.0 kernels built with
CONFIG_PCIEASPM_POWERSAVE=y or CONFIG_PCIEASPM_POWER_SUPERSAVE=y
should show the same problem.

But I think that latent issue became obvious when the following two
commits essentially made CONFIG_PCIEASPM_POWERSAVE the default for
devicetree platforms:

  f3ac2ff14834 ("PCI/ASPM: Enable all ClockPM and ASPM states for devicetree platforms")
  df5192d9bb0e ("PCI/ASPM: Enable only L0s and L1 for devicetree platforms")

Those two commits appeared in v6.18, so I think we can make a case
that it fixes a recent problem and is thus material for the current
release.

Moved to for-linus for v6.19 and squashed your unused
WAIT_LINKUP_TIMEOUT fix.  Thanks!

Bjorn

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-01-05 17:25 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-03 22:19 [PATCH] PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check Bjorn Helgaas
2025-11-10 11:04 ` Neil Armstrong
2025-12-18  6:06 ` Manivannan Sadhasivam
2026-01-05 16:49   ` Martin Blumenstingl
2026-01-05 17:15     ` Manivannan Sadhasivam
2026-01-05 17:25     ` Bjorn Helgaas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox