Revert "PCI: brcmstb: Split brcm_pcie_setup() into two funcs"
This reverts commit 830aa6f29f07a4e2f1a947dfa72b3ccddb46dd21. This is part of a revert of the following commits: 11ed8b8624b8 ("PCI: brcmstb: Do not turn off WOL regulators on suspend") 93e41f3fca3d ("PCI: brcmstb: Add control of subdevice voltage regulators") 67211aadcb4b ("PCI: brcmstb: Add mechanism to turn on subdev regulators") 830aa6f29f07 ("PCI: brcmstb: Split brcm_pcie_setup() into two funcs") Cyril reported that 830aa6f29f07 ("PCI: brcmstb: Split brcm_pcie_setup() into two funcs"), which appeared in v5.17-rc1, broke booting on the Raspberry Pi Compute Module 4. Apparently 830aa6f29f07 panics with an Asynchronous SError Interrupt, and after further commits here is a black screen on HDMI and no output on the serial console. This does not seem to affect the Raspberry Pi 4 B. Link: https://bugzilla.kernel.org/show_bug.cgi?id=215925 Link: https://lore.kernel.org/r/20220511201856.808690-5-helgaas@kernel.org Reported-by: Cyril Brulebois <kibi@debian.org> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
420be2f7eb
commit
f4fd559de3
@ -926,9 +926,16 @@ static inline int brcm_pcie_get_rc_bar2_size_and_offset(struct brcm_pcie *pcie,
|
|||||||
|
|
||||||
static int brcm_pcie_setup(struct brcm_pcie *pcie)
|
static int brcm_pcie_setup(struct brcm_pcie *pcie)
|
||||||
{
|
{
|
||||||
|
struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
|
||||||
u64 rc_bar2_offset, rc_bar2_size;
|
u64 rc_bar2_offset, rc_bar2_size;
|
||||||
void __iomem *base = pcie->base;
|
void __iomem *base = pcie->base;
|
||||||
int ret, memc;
|
struct device *dev = pcie->dev;
|
||||||
|
struct resource_entry *entry;
|
||||||
|
bool ssc_good = false;
|
||||||
|
struct resource *res;
|
||||||
|
int num_out_wins = 0;
|
||||||
|
u16 nlw, cls, lnksta;
|
||||||
|
int i, ret, memc;
|
||||||
u32 tmp, burst, aspm_support;
|
u32 tmp, burst, aspm_support;
|
||||||
|
|
||||||
/* Reset the bridge */
|
/* Reset the bridge */
|
||||||
@ -1018,40 +1025,6 @@ static int brcm_pcie_setup(struct brcm_pcie *pcie)
|
|||||||
if (pcie->gen)
|
if (pcie->gen)
|
||||||
brcm_pcie_set_gen(pcie, pcie->gen);
|
brcm_pcie_set_gen(pcie, pcie->gen);
|
||||||
|
|
||||||
/* Don't advertise L0s capability if 'aspm-no-l0s' */
|
|
||||||
aspm_support = PCIE_LINK_STATE_L1;
|
|
||||||
if (!of_property_read_bool(pcie->np, "aspm-no-l0s"))
|
|
||||||
aspm_support |= PCIE_LINK_STATE_L0S;
|
|
||||||
tmp = readl(base + PCIE_RC_CFG_PRIV1_LINK_CAPABILITY);
|
|
||||||
u32p_replace_bits(&tmp, aspm_support,
|
|
||||||
PCIE_RC_CFG_PRIV1_LINK_CAPABILITY_ASPM_SUPPORT_MASK);
|
|
||||||
writel(tmp, base + PCIE_RC_CFG_PRIV1_LINK_CAPABILITY);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* For config space accesses on the RC, show the right class for
|
|
||||||
* a PCIe-PCIe bridge (the default setting is to be EP mode).
|
|
||||||
*/
|
|
||||||
tmp = readl(base + PCIE_RC_CFG_PRIV1_ID_VAL3);
|
|
||||||
u32p_replace_bits(&tmp, 0x060400,
|
|
||||||
PCIE_RC_CFG_PRIV1_ID_VAL3_CLASS_CODE_MASK);
|
|
||||||
writel(tmp, base + PCIE_RC_CFG_PRIV1_ID_VAL3);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int brcm_pcie_linkup(struct brcm_pcie *pcie)
|
|
||||||
{
|
|
||||||
struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
|
|
||||||
struct device *dev = pcie->dev;
|
|
||||||
void __iomem *base = pcie->base;
|
|
||||||
struct resource_entry *entry;
|
|
||||||
struct resource *res;
|
|
||||||
int num_out_wins = 0;
|
|
||||||
u16 nlw, cls, lnksta;
|
|
||||||
bool ssc_good = false;
|
|
||||||
u32 tmp;
|
|
||||||
int ret, i;
|
|
||||||
|
|
||||||
/* Unassert the fundamental reset */
|
/* Unassert the fundamental reset */
|
||||||
pcie->perst_set(pcie, 0);
|
pcie->perst_set(pcie, 0);
|
||||||
|
|
||||||
@ -1102,6 +1075,24 @@ static int brcm_pcie_linkup(struct brcm_pcie *pcie)
|
|||||||
num_out_wins++;
|
num_out_wins++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Don't advertise L0s capability if 'aspm-no-l0s' */
|
||||||
|
aspm_support = PCIE_LINK_STATE_L1;
|
||||||
|
if (!of_property_read_bool(pcie->np, "aspm-no-l0s"))
|
||||||
|
aspm_support |= PCIE_LINK_STATE_L0S;
|
||||||
|
tmp = readl(base + PCIE_RC_CFG_PRIV1_LINK_CAPABILITY);
|
||||||
|
u32p_replace_bits(&tmp, aspm_support,
|
||||||
|
PCIE_RC_CFG_PRIV1_LINK_CAPABILITY_ASPM_SUPPORT_MASK);
|
||||||
|
writel(tmp, base + PCIE_RC_CFG_PRIV1_LINK_CAPABILITY);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For config space accesses on the RC, show the right class for
|
||||||
|
* a PCIe-PCIe bridge (the default setting is to be EP mode).
|
||||||
|
*/
|
||||||
|
tmp = readl(base + PCIE_RC_CFG_PRIV1_ID_VAL3);
|
||||||
|
u32p_replace_bits(&tmp, 0x060400,
|
||||||
|
PCIE_RC_CFG_PRIV1_ID_VAL3_CLASS_CODE_MASK);
|
||||||
|
writel(tmp, base + PCIE_RC_CFG_PRIV1_ID_VAL3);
|
||||||
|
|
||||||
if (pcie->ssc) {
|
if (pcie->ssc) {
|
||||||
ret = brcm_pcie_set_ssc(pcie);
|
ret = brcm_pcie_set_ssc(pcie);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
@ -1290,10 +1281,6 @@ static int brcm_pcie_resume(struct device *dev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto err_reset;
|
goto err_reset;
|
||||||
|
|
||||||
ret = brcm_pcie_linkup(pcie);
|
|
||||||
if (ret)
|
|
||||||
goto err_reset;
|
|
||||||
|
|
||||||
if (pcie->msi)
|
if (pcie->msi)
|
||||||
brcm_msi_set_regs(pcie->msi);
|
brcm_msi_set_regs(pcie->msi);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user