Skip to content

Commit 86a3f3d

Browse files
committed
Merge branch 'pci/controller/rcar-gen4'
- Fix a typo that prevented correct PHY initialization (Marek Vasut) - Add a missing 1ms delay after PWR reset assertion as required by the V4H manual (Marek Vasut) - Assure reset has completed before DBI access to avoid SError (Marek Vasut) - Fix inverted PHY initialization check, which sometimes led to timeouts and failure to start the controller (Marek Vasut) * pci/controller/rcar-gen4: PCI: rcar-gen4: Fix inverted break condition in PHY initialization PCI: rcar-gen4: Assure reset occurs before DBI access PCI: rcar-gen4: Add missing 1ms delay after PWR reset assertion PCI: rcar-gen4: Fix PHY initialization
2 parents 531abff + 2bdf1d4 commit 86a3f3d

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

drivers/pci/controller/dwc/pcie-rcar-gen4.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,17 @@ static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar)
182182
return ret;
183183
}
184184

185-
if (!reset_control_status(dw->core_rsts[DW_PCIE_PWR_RST].rstc))
185+
if (!reset_control_status(dw->core_rsts[DW_PCIE_PWR_RST].rstc)) {
186186
reset_control_assert(dw->core_rsts[DW_PCIE_PWR_RST].rstc);
187+
/*
188+
* R-Car V4H Reference Manual R19UH0186EJ0130 Rev.1.30 Apr.
189+
* 21, 2025 page 585 Figure 9.3.2 Software Reset flow (B)
190+
* indicates that for peripherals in HSC domain, after
191+
* reset has been asserted by writing a matching reset bit
192+
* into register SRCR, it is mandatory to wait 1ms.
193+
*/
194+
fsleep(1000);
195+
}
187196

188197
val = readl(rcar->base + PCIEMSR0);
189198
if (rcar->drvdata->mode == DW_PCIE_RC_TYPE) {
@@ -204,6 +213,19 @@ static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar)
204213
if (ret)
205214
goto err_unprepare;
206215

216+
/*
217+
* Assure the reset is latched and the core is ready for DBI access.
218+
* On R-Car V4H, the PCIe reset is asynchronous and does not take
219+
* effect immediately, but needs a short time to complete. In case
220+
* DBI access happens in that short time, that access generates an
221+
* SError. To make sure that condition can never happen, read back the
222+
* state of the reset, which should turn the asynchronous reset into
223+
* synchronous one, and wait a little over 1ms to add additional
224+
* safety margin.
225+
*/
226+
reset_control_status(dw->core_rsts[DW_PCIE_PWR_RST].rstc);
227+
fsleep(1000);
228+
207229
if (rcar->drvdata->additional_common_init)
208230
rcar->drvdata->additional_common_init(rcar);
209231

@@ -699,7 +721,7 @@ static int rcar_gen4_pcie_ltssm_control(struct rcar_gen4_pcie *rcar, bool enable
699721
rcar_gen4_pcie_phy_reg_update_bits(rcar, 0x148, GENMASK(23, 22), BIT(22));
700722
rcar_gen4_pcie_phy_reg_update_bits(rcar, 0x148, GENMASK(18, 16), GENMASK(17, 16));
701723
rcar_gen4_pcie_phy_reg_update_bits(rcar, 0x148, GENMASK(7, 6), BIT(6));
702-
rcar_gen4_pcie_phy_reg_update_bits(rcar, 0x148, GENMASK(2, 0), GENMASK(11, 0));
724+
rcar_gen4_pcie_phy_reg_update_bits(rcar, 0x148, GENMASK(2, 0), GENMASK(1, 0));
703725
rcar_gen4_pcie_phy_reg_update_bits(rcar, 0x1d4, GENMASK(16, 15), GENMASK(16, 15));
704726
rcar_gen4_pcie_phy_reg_update_bits(rcar, 0x514, BIT(26), BIT(26));
705727
rcar_gen4_pcie_phy_reg_update_bits(rcar, 0x0f8, BIT(16), 0);
@@ -709,7 +731,7 @@ static int rcar_gen4_pcie_ltssm_control(struct rcar_gen4_pcie *rcar, bool enable
709731
val &= ~APP_HOLD_PHY_RST;
710732
writel(val, rcar->base + PCIERSTCTRL1);
711733

712-
ret = readl_poll_timeout(rcar->phy_base + 0x0f8, val, !(val & BIT(18)), 100, 10000);
734+
ret = readl_poll_timeout(rcar->phy_base + 0x0f8, val, val & BIT(18), 100, 10000);
713735
if (ret < 0)
714736
return ret;
715737

0 commit comments

Comments
 (0)