Skip to content

Commit 4cf1713

Browse files
committed
Merge branch 'pci/controller/dw-rockchip'
- Prevent race between link training and register update via DBI by inhibiting link training after hot reset and link down (Wilfred Mallawa) * pci/controller/dw-rockchip: PCI: dw-rockchip: Delay link training after hot reset in EP mode
2 parents f623d50 + c0b9375 commit 4cf1713

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

drivers/pci/controller/dwc/pcie-dw-rockchip.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@
5858

5959
/* Hot Reset Control Register */
6060
#define PCIE_CLIENT_HOT_RESET_CTRL 0x180
61+
#define PCIE_LTSSM_APP_DLY2_EN BIT(1)
62+
#define PCIE_LTSSM_APP_DLY2_DONE BIT(3)
6163
#define PCIE_LTSSM_ENABLE_ENHANCE BIT(4)
6264

6365
/* LTSSM Status Register */
@@ -475,7 +477,7 @@ static irqreturn_t rockchip_pcie_ep_sys_irq_thread(int irq, void *arg)
475477
struct rockchip_pcie *rockchip = arg;
476478
struct dw_pcie *pci = &rockchip->pci;
477479
struct device *dev = pci->dev;
478-
u32 reg;
480+
u32 reg, val;
479481

480482
reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC);
481483
rockchip_pcie_writel_apb(rockchip, reg, PCIE_CLIENT_INTR_STATUS_MISC);
@@ -486,6 +488,10 @@ static irqreturn_t rockchip_pcie_ep_sys_irq_thread(int irq, void *arg)
486488
if (reg & PCIE_LINK_REQ_RST_NOT_INT) {
487489
dev_dbg(dev, "hot reset or link-down reset\n");
488490
dw_pcie_ep_linkdown(&pci->ep);
491+
/* Stop delaying link training. */
492+
val = HIWORD_UPDATE_BIT(PCIE_LTSSM_APP_DLY2_DONE);
493+
rockchip_pcie_writel_apb(rockchip, val,
494+
PCIE_CLIENT_HOT_RESET_CTRL);
489495
}
490496

491497
if (reg & PCIE_RDLH_LINK_UP_CHGED) {
@@ -567,8 +573,11 @@ static int rockchip_pcie_configure_ep(struct platform_device *pdev,
567573
return ret;
568574
}
569575

570-
/* LTSSM enable control mode */
571-
val = HIWORD_UPDATE_BIT(PCIE_LTSSM_ENABLE_ENHANCE);
576+
/*
577+
* LTSSM enable control mode, and automatically delay link training on
578+
* hot reset/link-down reset.
579+
*/
580+
val = HIWORD_UPDATE_BIT(PCIE_LTSSM_ENABLE_ENHANCE | PCIE_LTSSM_APP_DLY2_EN);
572581
rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL);
573582

574583
rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_EP_MODE,

0 commit comments

Comments
 (0)