These patches were generated from: https://github.com/raspberrypi/linux/commits/rpi-6.12.y With the following command: git format-patch -N v6.12.27..HEAD (HEAD -> 8d3206ee456a5ecdf9ddbfd8e5e231e4f0cd716e) Exceptions: - (def)configs patches - github workflows patches - applied & reverted patches - readme patches - wireless patches Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
49 lines
1.7 KiB
Diff
49 lines
1.7 KiB
Diff
From 90500343a3eb36d4ed374b2ec2163a5210c38939 Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Bell <jonathan@raspberrypi.com>
|
|
Date: Wed, 12 Feb 2025 15:47:08 +0000
|
|
Subject: [PATCH] PCI: brcmstb: Enable CRS software visibility after linkup
|
|
|
|
It appears that bits in the Root Control Register are reset with
|
|
perst_n, which means the PCI layer's call to enable CRS prior to
|
|
adding/scanning the bus has no effect. Open-code the enable in
|
|
brcm_pcie_start_link as a workaround.
|
|
|
|
Without CRS visibility, configuration reads issued by the CPU don't
|
|
retire if the endpoint returns a CRS response - the RC will poll until a
|
|
(large) timeout is reached. This means the core can stall for a long
|
|
time during boot.
|
|
|
|
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
|
---
|
|
drivers/pci/controller/pcie-brcmstb.c | 13 ++++++++++++-
|
|
1 file changed, 12 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/pci/controller/pcie-brcmstb.c
|
|
+++ b/drivers/pci/controller/pcie-brcmstb.c
|
|
@@ -1358,7 +1358,7 @@ static int brcm_pcie_start_link(struct b
|
|
{
|
|
struct device *dev = pcie->dev;
|
|
void __iomem *base = pcie->base;
|
|
- u16 nlw, cls, lnksta;
|
|
+ u16 nlw, cls, lnksta, tmp16;
|
|
bool ssc_good = false;
|
|
int ret, i;
|
|
|
|
@@ -1407,6 +1407,17 @@ static int brcm_pcie_start_link(struct b
|
|
pci_speed_string(pcie_link_speed[cls]), nlw,
|
|
ssc_good ? "(SSC)" : "(!SSC)");
|
|
|
|
+ /*
|
|
+ * RootCtl bits are reset by perst_n, which undoes pci_enable_crs()
|
|
+ * called prior to pci_add_new_bus() during probe. Re-enable here.
|
|
+ */
|
|
+ tmp16 = readw(base + BRCM_PCIE_CAP_REGS + PCI_EXP_RTCAP);
|
|
+ if (tmp16 & PCI_EXP_RTCAP_CRSVIS) {
|
|
+ tmp16 = readw(base + BRCM_PCIE_CAP_REGS + PCI_EXP_RTCTL);
|
|
+ u16p_replace_bits(&tmp16, 1, PCI_EXP_RTCTL_CRSSVE);
|
|
+ writew(tmp16, base + BRCM_PCIE_CAP_REGS + PCI_EXP_RTCTL);
|
|
+ }
|
|
+
|
|
return 0;
|
|
}
|
|
|