Commit 40f78232 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pci-v5.11-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci

Pull PCI fixes from Bjorn Helgaas:

 - Fix a tegra enumeration regression (Rob Herring)

 - Fix a designware-host check that warned on *success*, not failure
   (Alexander Lobakin)

* tag 'pci-v5.11-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci:
  PCI: dwc: Fix inverted condition of DMA mask setup warning
  PCI: tegra: Fix host link initialization
parents c9a3c4e6 99e629f1
...@@ -397,12 +397,8 @@ int dw_pcie_host_init(struct pcie_port *pp) ...@@ -397,12 +397,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
pp); pp);
ret = dma_set_mask(pci->dev, DMA_BIT_MASK(32)); ret = dma_set_mask(pci->dev, DMA_BIT_MASK(32));
if (!ret) { if (ret)
dev_warn(pci->dev, dev_warn(pci->dev, "Failed to set DMA mask to 32-bit. Devices with only 32-bit MSI support may not work properly\n");
"Failed to set DMA mask to 32-bit. "
"Devices with only 32-bit MSI support"
" may not work properly\n");
}
pp->msi_data = dma_map_single_attrs(pci->dev, &pp->msi_msg, pp->msi_data = dma_map_single_attrs(pci->dev, &pp->msi_msg,
sizeof(pp->msi_msg), sizeof(pp->msi_msg),
......
...@@ -853,12 +853,14 @@ static void config_gen3_gen4_eq_presets(struct tegra_pcie_dw *pcie) ...@@ -853,12 +853,14 @@ static void config_gen3_gen4_eq_presets(struct tegra_pcie_dw *pcie)
dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val); dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
} }
static void tegra_pcie_prepare_host(struct pcie_port *pp) static int tegra_pcie_dw_host_init(struct pcie_port *pp)
{ {
struct dw_pcie *pci = to_dw_pcie_from_pp(pp); struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
u32 val; u32 val;
pp->bridge->ops = &tegra_pci_ops;
if (!pcie->pcie_cap_base) if (!pcie->pcie_cap_base)
pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci, pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci,
PCI_CAP_ID_EXP); PCI_CAP_ID_EXP);
...@@ -907,10 +909,24 @@ static void tegra_pcie_prepare_host(struct pcie_port *pp) ...@@ -907,10 +909,24 @@ static void tegra_pcie_prepare_host(struct pcie_port *pp)
dw_pcie_writel_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF, val); dw_pcie_writel_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF, val);
} }
dw_pcie_setup_rc(pp);
clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ); clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ);
return 0;
}
static int tegra_pcie_dw_start_link(struct dw_pcie *pci)
{
u32 val, offset, speed, tmp;
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
struct pcie_port *pp = &pci->pp;
bool retry = true;
if (pcie->mode == DW_PCIE_EP_TYPE) {
enable_irq(pcie->pex_rst_irq);
return 0;
}
retry_link:
/* Assert RST */ /* Assert RST */
val = appl_readl(pcie, APPL_PINMUX); val = appl_readl(pcie, APPL_PINMUX);
val &= ~APPL_PINMUX_PEX_RST; val &= ~APPL_PINMUX_PEX_RST;
...@@ -929,19 +945,10 @@ static void tegra_pcie_prepare_host(struct pcie_port *pp) ...@@ -929,19 +945,10 @@ static void tegra_pcie_prepare_host(struct pcie_port *pp)
appl_writel(pcie, val, APPL_PINMUX); appl_writel(pcie, val, APPL_PINMUX);
msleep(100); msleep(100);
}
static int tegra_pcie_dw_host_init(struct pcie_port *pp)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
u32 val, tmp, offset, speed;
pp->bridge->ops = &tegra_pci_ops;
tegra_pcie_prepare_host(pp);
if (dw_pcie_wait_for_link(pci)) { if (dw_pcie_wait_for_link(pci)) {
if (!retry)
return 0;
/* /*
* There are some endpoints which can't get the link up if * There are some endpoints which can't get the link up if
* root port has Data Link Feature (DLF) enabled. * root port has Data Link Feature (DLF) enabled.
...@@ -975,10 +982,11 @@ static int tegra_pcie_dw_host_init(struct pcie_port *pp) ...@@ -975,10 +982,11 @@ static int tegra_pcie_dw_host_init(struct pcie_port *pp)
val &= ~PCI_DLF_EXCHANGE_ENABLE; val &= ~PCI_DLF_EXCHANGE_ENABLE;
dw_pcie_writel_dbi(pci, offset, val); dw_pcie_writel_dbi(pci, offset, val);
tegra_pcie_prepare_host(pp); tegra_pcie_dw_host_init(pp);
dw_pcie_setup_rc(pp);
if (dw_pcie_wait_for_link(pci)) retry = false;
return 0; goto retry_link;
} }
speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) & speed = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA) &
...@@ -998,15 +1006,6 @@ static int tegra_pcie_dw_link_up(struct dw_pcie *pci) ...@@ -998,15 +1006,6 @@ static int tegra_pcie_dw_link_up(struct dw_pcie *pci)
return !!(val & PCI_EXP_LNKSTA_DLLLA); return !!(val & PCI_EXP_LNKSTA_DLLLA);
} }
static int tegra_pcie_dw_start_link(struct dw_pcie *pci)
{
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
enable_irq(pcie->pex_rst_irq);
return 0;
}
static void tegra_pcie_dw_stop_link(struct dw_pcie *pci) static void tegra_pcie_dw_stop_link(struct dw_pcie *pci)
{ {
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci); struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
...@@ -2215,6 +2214,10 @@ static int tegra_pcie_dw_resume_noirq(struct device *dev) ...@@ -2215,6 +2214,10 @@ static int tegra_pcie_dw_resume_noirq(struct device *dev)
goto fail_host_init; goto fail_host_init;
} }
ret = tegra_pcie_dw_start_link(&pcie->pci);
if (ret < 0)
goto fail_host_init;
/* Restore MSI interrupt vector */ /* Restore MSI interrupt vector */
dw_pcie_writel_dbi(&pcie->pci, PORT_LOGIC_MSI_CTRL_INT_0_EN, dw_pcie_writel_dbi(&pcie->pci, PORT_LOGIC_MSI_CTRL_INT_0_EN,
pcie->msi_ctrl_int); pcie->msi_ctrl_int);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment