Skip to content

Commit 40f7823

Browse files
committed
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
2 parents c9a3c4e + 99e629f commit 40f7823

2 files changed

Lines changed: 31 additions & 32 deletions

File tree

drivers/pci/controller/dwc/pcie-designware-host.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -397,12 +397,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
397397
pp);
398398

399399
ret = dma_set_mask(pci->dev, DMA_BIT_MASK(32));
400-
if (!ret) {
401-
dev_warn(pci->dev,
402-
"Failed to set DMA mask to 32-bit. "
403-
"Devices with only 32-bit MSI support"
404-
" may not work properly\n");
405-
}
400+
if (ret)
401+
dev_warn(pci->dev, "Failed to set DMA mask to 32-bit. Devices with only 32-bit MSI support may not work properly\n");
406402

407403
pp->msi_data = dma_map_single_attrs(pci->dev, &pp->msi_msg,
408404
sizeof(pp->msi_msg),

drivers/pci/controller/dwc/pcie-tegra194.c

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -853,12 +853,14 @@ static void config_gen3_gen4_eq_presets(struct tegra_pcie_dw *pcie)
853853
dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, val);
854854
}
855855

856-
static void tegra_pcie_prepare_host(struct pcie_port *pp)
856+
static int tegra_pcie_dw_host_init(struct pcie_port *pp)
857857
{
858858
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
859859
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
860860
u32 val;
861861

862+
pp->bridge->ops = &tegra_pci_ops;
863+
862864
if (!pcie->pcie_cap_base)
863865
pcie->pcie_cap_base = dw_pcie_find_capability(&pcie->pci,
864866
PCI_CAP_ID_EXP);
@@ -907,10 +909,24 @@ static void tegra_pcie_prepare_host(struct pcie_port *pp)
907909
dw_pcie_writel_dbi(pci, CFG_TIMER_CTRL_MAX_FUNC_NUM_OFF, val);
908910
}
909911

910-
dw_pcie_setup_rc(pp);
911-
912912
clk_set_rate(pcie->core_clk, GEN4_CORE_CLK_FREQ);
913913

914+
return 0;
915+
}
916+
917+
static int tegra_pcie_dw_start_link(struct dw_pcie *pci)
918+
{
919+
u32 val, offset, speed, tmp;
920+
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
921+
struct pcie_port *pp = &pci->pp;
922+
bool retry = true;
923+
924+
if (pcie->mode == DW_PCIE_EP_TYPE) {
925+
enable_irq(pcie->pex_rst_irq);
926+
return 0;
927+
}
928+
929+
retry_link:
914930
/* Assert RST */
915931
val = appl_readl(pcie, APPL_PINMUX);
916932
val &= ~APPL_PINMUX_PEX_RST;
@@ -929,19 +945,10 @@ static void tegra_pcie_prepare_host(struct pcie_port *pp)
929945
appl_writel(pcie, val, APPL_PINMUX);
930946

931947
msleep(100);
932-
}
933-
934-
static int tegra_pcie_dw_host_init(struct pcie_port *pp)
935-
{
936-
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
937-
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
938-
u32 val, tmp, offset, speed;
939-
940-
pp->bridge->ops = &tegra_pci_ops;
941-
942-
tegra_pcie_prepare_host(pp);
943948

944949
if (dw_pcie_wait_for_link(pci)) {
950+
if (!retry)
951+
return 0;
945952
/*
946953
* There are some endpoints which can't get the link up if
947954
* root port has Data Link Feature (DLF) enabled.
@@ -975,10 +982,11 @@ static int tegra_pcie_dw_host_init(struct pcie_port *pp)
975982
val &= ~PCI_DLF_EXCHANGE_ENABLE;
976983
dw_pcie_writel_dbi(pci, offset, val);
977984

978-
tegra_pcie_prepare_host(pp);
985+
tegra_pcie_dw_host_init(pp);
986+
dw_pcie_setup_rc(pp);
979987

980-
if (dw_pcie_wait_for_link(pci))
981-
return 0;
988+
retry = false;
989+
goto retry_link;
982990
}
983991

984992
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)
9981006
return !!(val & PCI_EXP_LNKSTA_DLLLA);
9991007
}
10001008

1001-
static int tegra_pcie_dw_start_link(struct dw_pcie *pci)
1002-
{
1003-
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
1004-
1005-
enable_irq(pcie->pex_rst_irq);
1006-
1007-
return 0;
1008-
}
1009-
10101009
static void tegra_pcie_dw_stop_link(struct dw_pcie *pci)
10111010
{
10121011
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
@@ -2215,6 +2214,10 @@ static int tegra_pcie_dw_resume_noirq(struct device *dev)
22152214
goto fail_host_init;
22162215
}
22172216

2217+
ret = tegra_pcie_dw_start_link(&pcie->pci);
2218+
if (ret < 0)
2219+
goto fail_host_init;
2220+
22182221
/* Restore MSI interrupt vector */
22192222
dw_pcie_writel_dbi(&pcie->pci, PORT_LOGIC_MSI_CTRL_INT_0_EN,
22202223
pcie->msi_ctrl_int);

0 commit comments

Comments
 (0)