From 4fb20f36db8dd2b41bf624c311f1f2af3870e7c0 Mon Sep 17 00:00:00 2001 From: Ricardo Pardini Date: Wed, 14 Jan 2026 21:26:25 +0100 Subject: [PATCH] meson64-6.18: de-bork PCIe for 6.18.5, again, again - Fixes: 4eac206ecf6b453be2a5318880f81956877c25c4 which over-dropped - meanwhile for increased insanity, patch changed name as it went upstream: - ML was `PCI: meson: Remove meson_pcie_link_up() timeout, message, speed check` - torvalds got `PCI: meson: Report that link is up while in ASPM L0s and L1 states` - Greg KH has already queued for 6.18.6 (coming from 6.19-rc5, so torvalds name), so remove this when that is released --- ...-Report-that-link-i-up-while-in-ASPM.patch | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 patch/kernel/archive/meson64-6.18/x-remove-after-6.18.6-PCI-meson-Report-that-link-i-up-while-in-ASPM.patch diff --git a/patch/kernel/archive/meson64-6.18/x-remove-after-6.18.6-PCI-meson-Report-that-link-i-up-while-in-ASPM.patch b/patch/kernel/archive/meson64-6.18/x-remove-after-6.18.6-PCI-meson-Report-that-link-i-up-while-in-ASPM.patch new file mode 100644 index 0000000000..a572141d65 --- /dev/null +++ b/patch/kernel/archive/meson64-6.18/x-remove-after-6.18.6-PCI-meson-Report-that-link-i-up-while-in-ASPM.patch @@ -0,0 +1,102 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Bjorn Helgaas +Date: Mon, 3 Nov 2025 16:19:26 -0600 +Subject: PCI: meson: Report that link is up while in ASPM L0s and L1 states + +commit df27c03b9e3ef2baa9e9c9f56a771d463a84489d upstream. + +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: 9c0ef6d34fdb ("PCI: amlogic: Add the Amlogic Meson PCIe controller driver") +Reported-by: Linnaea Lavia +Closes: https://lore.kernel.org/r/DM4PR05MB102707B8CDF84D776C39F22F2C7F0A@DM4PR05MB10270.namprd05.prod.outlook.com +[bhelgaas: squash removal of unused WAIT_LINKUP_TIMEOUT by +Martin Blumenstingl : +https://patch.msgid.link/20260105125625.239497-1-martin.blumenstingl@googlemail.com] +Signed-off-by: Bjorn Helgaas +Tested-by: Linnaea Lavia +Tested-by: Neil Armstrong # on BananaPi M2S +Reviewed-by: Neil Armstrong +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 +Signed-off-by: Greg Kroah-Hartman +--- + drivers/pci/controller/dwc/pci-meson.c | 39 +--------- + 1 file changed, 4 insertions(+), 35 deletions(-) + +diff --git a/drivers/pci/controller/dwc/pci-meson.c b/drivers/pci/controller/dwc/pci-meson.c +index 111111111111..222222222222 100644 +--- a/drivers/pci/controller/dwc/pci-meson.c ++++ b/drivers/pci/controller/dwc/pci-meson.c +@@ -37,7 +37,6 @@ + #define PCIE_CFG_STATUS17 0x44 + #define PM_CURRENT_STATE(x) (((x) >> 7) & 0x1) + +-#define WAIT_LINKUP_TIMEOUT 4000 + #define PORT_CLK_RATE 100000000UL + #define MAX_PAYLOAD_SIZE 256 + #define MAX_READ_REQ_SIZE 256 +@@ -334,40 +333,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; +- +- 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; ++ u32 state12; ++ ++ 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) +-- +Armbian +